Improve preference managment
This commit is contained in:
parent
b769ec9c8e
commit
7dc3a198e4
|
@ -17,8 +17,8 @@ type EnumValue<E> = E[keyof E];
|
|||
type PrefValueTypeType<E extends Enum> = {
|
||||
[key in EnumValue<E>]: PrefValueTypeStrings;
|
||||
};
|
||||
type EncodedPref = {
|
||||
key: string;
|
||||
type EncodedPref<E extends Enum> = {
|
||||
key: EnumValue<E>;
|
||||
value: string;
|
||||
};
|
||||
|
||||
|
@ -32,7 +32,7 @@ export class PreferenceCommonService {
|
|||
// E is either the SysPreference or the UsrPreference enum
|
||||
// the pref value types is the object containing the type of each key in E
|
||||
public DecodePref<E extends Enum>(
|
||||
preference: EncodedPref,
|
||||
preference: EncodedPref<E>,
|
||||
prefType: E,
|
||||
prefValueTypes: PrefValueTypeType<E>,
|
||||
): Failable<DecodedPref> {
|
||||
|
@ -69,7 +69,7 @@ export class PreferenceCommonService {
|
|||
value: PrefValueType,
|
||||
prefType: E,
|
||||
prefValueTypes: PrefValueTypeType<E>,
|
||||
): AsyncFailable<EncodedPref> {
|
||||
): AsyncFailable<EncodedPref<E>> {
|
||||
const validatedKey = this.validatePrefKey(key, prefType);
|
||||
if (HasFailed(validatedKey)) return validatedKey;
|
||||
|
||||
|
|
|
@ -15,14 +15,14 @@ export class PreferenceDefaultsService {
|
|||
|
||||
constructor(private readonly jwtConfigService: EarlyJwtConfigService) {}
|
||||
|
||||
public readonly usrDefaults: {
|
||||
[key in UsrPreference]: () => PrefValueType;
|
||||
private readonly usrDefaults: {
|
||||
[key in UsrPreference]: (() => PrefValueType) | PrefValueType;
|
||||
} = {
|
||||
[UsrPreference.KeepOriginal]: () => false,
|
||||
[UsrPreference.KeepOriginal]: false,
|
||||
};
|
||||
|
||||
public readonly sysDefaults: {
|
||||
[key in SysPreference]: () => PrefValueType;
|
||||
private readonly sysDefaults: {
|
||||
[key in SysPreference]: (() => PrefValueType) | PrefValueType;
|
||||
} = {
|
||||
[SysPreference.JwtSecret]: () => {
|
||||
const envSecret = this.jwtConfigService.getJwtSecret();
|
||||
|
@ -37,16 +37,37 @@ export class PreferenceDefaultsService {
|
|||
},
|
||||
[SysPreference.JwtExpiresIn]: () =>
|
||||
this.jwtConfigService.getJwtExpiresIn() ?? '7d',
|
||||
[SysPreference.BCryptStrength]: () => 12,
|
||||
[SysPreference.BCryptStrength]: 10,
|
||||
|
||||
[SysPreference.RemoveDerivativesAfter]: () => '7d',
|
||||
[SysPreference.SaveDerivatives]: () => true,
|
||||
[SysPreference.AllowEditing]: () => true,
|
||||
[SysPreference.RemoveDerivativesAfter]: '7d',
|
||||
[SysPreference.SaveDerivatives]: true,
|
||||
[SysPreference.AllowEditing]: true,
|
||||
|
||||
[SysPreference.ConversionTimeLimit]: () => '10s',
|
||||
[SysPreference.ConversionMemoryLimit]: () => 512,
|
||||
[SysPreference.ConversionTimeLimit]: '15s',
|
||||
[SysPreference.ConversionMemoryLimit]: 512,
|
||||
|
||||
[SysPreference.TrackingUrl]: () => '',
|
||||
[SysPreference.TrackingId]: () => '',
|
||||
[SysPreference.EnableTracking]: false,
|
||||
[SysPreference.TrackingUrl]: '',
|
||||
[SysPreference.TrackingId]: '',
|
||||
|
||||
[SysPreference.EnableTelemetry]: true,
|
||||
};
|
||||
|
||||
public getSysDefault(pref: SysPreference): PrefValueType {
|
||||
const value = this.sysDefaults[pref];
|
||||
if (typeof value === 'function') {
|
||||
return value();
|
||||
} else {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
|
||||
public getUsrDefault(pref: UsrPreference): PrefValueType {
|
||||
const value = this.usrDefaults[pref];
|
||||
if (typeof value === 'function') {
|
||||
return value();
|
||||
} else {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -5,17 +5,18 @@ import {
|
|||
PrefValueType,
|
||||
PrefValueTypeStrings,
|
||||
} from 'picsur-shared/dist/dto/preferences.dto';
|
||||
import { SysPreference } from 'picsur-shared/dist/dto/sys-preferences.enum';
|
||||
import {
|
||||
SysPreference,
|
||||
SysPreferenceList,
|
||||
SysPreferenceValidators,
|
||||
SysPreferenceValueTypes,
|
||||
} from 'picsur-shared/dist/dto/sys-preferences.enum';
|
||||
import { AsyncFailable, Fail, FT, HasFailed } from 'picsur-shared/dist/types';
|
||||
import { Repository } from 'typeorm';
|
||||
import {
|
||||
ESysPreferenceBackend,
|
||||
ESysPreferenceSchema,
|
||||
} from '../../database/entities/sys-preference.entity';
|
||||
import {
|
||||
SysPreferenceList,
|
||||
SysPreferenceValueTypes,
|
||||
} from '../../models/constants/syspreferences.const';
|
||||
import { MutexFallBack } from '../../util/mutex-fallback';
|
||||
import { PreferenceCommonService } from './preference-common.service';
|
||||
import { PreferenceDefaultsService } from './preference-defaults.service';
|
||||
|
@ -85,7 +86,7 @@ export class SysPreferenceDbService {
|
|||
|
||||
// Return
|
||||
return this.prefCommon.DecodePref(
|
||||
result.data,
|
||||
result.data as any,
|
||||
SysPreference,
|
||||
SysPreferenceValueTypes,
|
||||
);
|
||||
|
@ -136,7 +137,7 @@ export class SysPreferenceDbService {
|
|||
private async saveDefault(
|
||||
key: SysPreference, // Force enum here because we dont validate
|
||||
): AsyncFailable<DecodedSysPref> {
|
||||
return this.setPreference(key, this.defaultsService.sysDefaults[key]());
|
||||
return this.setPreference(key, this.defaultsService.getSysDefault(key));
|
||||
}
|
||||
|
||||
private async encodeSysPref(
|
||||
|
@ -151,6 +152,10 @@ export class SysPreferenceDbService {
|
|||
);
|
||||
if (HasFailed(validated)) return validated;
|
||||
|
||||
const valueValidated = SysPreferenceValidators[key as SysPreference].safeParse(
|
||||
value,
|
||||
);
|
||||
|
||||
let verifySysPreference = new ESysPreferenceBackend();
|
||||
verifySysPreference.key = validated.key;
|
||||
verifySysPreference.value = validated.value;
|
||||
|
|
|
@ -5,17 +5,18 @@ import {
|
|||
PrefValueType,
|
||||
PrefValueTypeStrings,
|
||||
} from 'picsur-shared/dist/dto/preferences.dto';
|
||||
import { UsrPreference } from 'picsur-shared/dist/dto/usr-preferences.enum';
|
||||
import {
|
||||
UsrPreference,
|
||||
UsrPreferenceList,
|
||||
UsrPreferenceValidators,
|
||||
UsrPreferenceValueTypes,
|
||||
} from 'picsur-shared/dist/dto/usr-preferences.enum';
|
||||
import { AsyncFailable, Fail, FT, HasFailed } from 'picsur-shared/dist/types';
|
||||
import { Repository } from 'typeorm';
|
||||
import {
|
||||
EUsrPreferenceBackend,
|
||||
EUsrPreferenceSchema,
|
||||
} from '../../database/entities/usr-preference.entity';
|
||||
import {
|
||||
UsrPreferenceList,
|
||||
UsrPreferenceValueTypes,
|
||||
} from '../../models/constants/usrpreferences.const';
|
||||
import { MutexFallBack } from '../../util/mutex-fallback';
|
||||
import { PreferenceCommonService } from './preference-common.service';
|
||||
import { PreferenceDefaultsService } from './preference-defaults.service';
|
||||
|
@ -91,7 +92,7 @@ export class UsrPreferenceDbService {
|
|||
|
||||
// Return
|
||||
const unpacked = this.prefCommon.DecodePref(
|
||||
result.data,
|
||||
result.data as any,
|
||||
UsrPreference,
|
||||
UsrPreferenceValueTypes,
|
||||
);
|
||||
|
@ -175,7 +176,7 @@ export class UsrPreferenceDbService {
|
|||
return this.setPreference(
|
||||
userid,
|
||||
key,
|
||||
this.defaultsService.usrDefaults[key](),
|
||||
this.defaultsService.getUsrDefault(key),
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -192,6 +193,16 @@ export class UsrPreferenceDbService {
|
|||
);
|
||||
if (HasFailed(validated)) return validated;
|
||||
|
||||
if (!UsrPreferenceValidators[validated.key](validated.value))
|
||||
throw Fail(
|
||||
FT.UsrValidation,
|
||||
undefined,
|
||||
'Preference validator failed for ' +
|
||||
validated.key +
|
||||
' with value ' +
|
||||
validated.value,
|
||||
);
|
||||
|
||||
let verifySysPreference = new EUsrPreferenceBackend();
|
||||
verifySysPreference.key = validated.key;
|
||||
verifySysPreference.value = validated.value;
|
||||
|
|
|
@ -1,24 +0,0 @@
|
|||
import { PrefValueTypeStrings } from 'picsur-shared/dist/dto/preferences.dto';
|
||||
import { SysPreference } from 'picsur-shared/dist/dto/sys-preferences.enum';
|
||||
|
||||
export type SysPreferences = SysPreference[];
|
||||
export const SysPreferenceList: string[] = Object.values(SysPreference);
|
||||
|
||||
// Syspref Value types
|
||||
export const SysPreferenceValueTypes: {
|
||||
[key in SysPreference]: PrefValueTypeStrings;
|
||||
} = {
|
||||
[SysPreference.JwtSecret]: 'string',
|
||||
[SysPreference.JwtExpiresIn]: 'string',
|
||||
[SysPreference.BCryptStrength]: 'number',
|
||||
|
||||
[SysPreference.RemoveDerivativesAfter]: 'string',
|
||||
[SysPreference.SaveDerivatives]: 'boolean',
|
||||
[SysPreference.AllowEditing]: 'boolean',
|
||||
|
||||
[SysPreference.ConversionTimeLimit]: 'string',
|
||||
[SysPreference.ConversionMemoryLimit]: 'number',
|
||||
|
||||
[SysPreference.TrackingUrl]: 'string',
|
||||
[SysPreference.TrackingId]: 'string',
|
||||
};
|
|
@ -1,12 +0,0 @@
|
|||
import { PrefValueTypeStrings } from 'picsur-shared/dist/dto/preferences.dto';
|
||||
import { UsrPreference } from 'picsur-shared/dist/dto/usr-preferences.enum';
|
||||
|
||||
export type UsrPreferences = UsrPreference[];
|
||||
export const UsrPreferenceList: string[] = Object.values(UsrPreference);
|
||||
|
||||
// Syspref Value types
|
||||
export const UsrPreferenceValueTypes: {
|
||||
[key in UsrPreference]: PrefValueTypeStrings;
|
||||
} = {
|
||||
[UsrPreference.KeepOriginal]: 'boolean',
|
||||
};
|
|
@ -39,6 +39,12 @@ export class UsageController {
|
|||
throw Fail(FT.NotFound, undefined, 'Tracking URL not set');
|
||||
}
|
||||
|
||||
await res.from(`${trackingUrl}/api`);
|
||||
await res.from(`${trackingUrl}/api`, {
|
||||
rewriteRequestHeaders(req, headers) {
|
||||
// remove cookies
|
||||
delete headers.cookie;
|
||||
return headers;
|
||||
},
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
|
@ -14,6 +14,9 @@ export const SysPreferenceFriendlyNames: {
|
|||
[SysPreference.ConversionTimeLimit]: 'Transcode/Edit Time Limit',
|
||||
[SysPreference.ConversionMemoryLimit]: 'Transcode/Edit Memory Limit MB',
|
||||
|
||||
[SysPreference.EnableTracking]: 'Enable Ackee Web Tracking',
|
||||
[SysPreference.TrackingUrl]: 'Ackee tracking URL',
|
||||
[SysPreference.TrackingId]: 'Ackee trackign website ID',
|
||||
|
||||
[SysPreference.EnableTelemetry]: 'Enable System Telemetry',
|
||||
};
|
||||
|
|
|
@ -1,3 +1,11 @@
|
|||
import { PrefValueTypeStrings } from './preferences.dto';
|
||||
import ms from 'ms';
|
||||
import { IsValidMS } from '../validators/ms.validator';
|
||||
import { URLRegex, UUIDRegex } from '../util/common-regex';
|
||||
import { z } from 'zod';
|
||||
import { IsPosInt } from '../validators/positive-int.validator';
|
||||
import { IsEntityID } from '../validators/entity-id.validator';
|
||||
|
||||
// This enum is only here to make accessing the values easier, and type checking in the backend
|
||||
export enum SysPreference {
|
||||
JwtSecret = 'jwt_secret',
|
||||
|
@ -11,6 +19,55 @@ export enum SysPreference {
|
|||
ConversionTimeLimit = 'conversion_time_limit',
|
||||
ConversionMemoryLimit = 'conversion_memory_limit',
|
||||
|
||||
EnableTracking = 'enable_tracking',
|
||||
TrackingUrl = 'tracking_url',
|
||||
TrackingId = 'tracking_id',
|
||||
|
||||
EnableTelemetry = 'enable_telemetry',
|
||||
}
|
||||
|
||||
export type SysPreferences = SysPreference[];
|
||||
export const SysPreferenceList: string[] = Object.values(SysPreference);
|
||||
|
||||
// Syspref Value types
|
||||
export const SysPreferenceValueTypes: {
|
||||
[key in SysPreference]: PrefValueTypeStrings;
|
||||
} = {
|
||||
[SysPreference.JwtSecret]: 'string',
|
||||
[SysPreference.JwtExpiresIn]: 'string',
|
||||
[SysPreference.BCryptStrength]: 'number',
|
||||
|
||||
[SysPreference.RemoveDerivativesAfter]: 'string',
|
||||
[SysPreference.SaveDerivatives]: 'boolean',
|
||||
[SysPreference.AllowEditing]: 'boolean',
|
||||
|
||||
[SysPreference.ConversionTimeLimit]: 'string',
|
||||
[SysPreference.ConversionMemoryLimit]: 'number',
|
||||
|
||||
[SysPreference.EnableTracking]: 'boolean',
|
||||
[SysPreference.TrackingUrl]: 'string',
|
||||
[SysPreference.TrackingId]: 'string',
|
||||
|
||||
[SysPreference.EnableTelemetry]: 'boolean',
|
||||
};
|
||||
|
||||
export const SysPreferenceValidators: {
|
||||
[key in SysPreference]: z.ZodTypeAny;
|
||||
} = {
|
||||
[SysPreference.JwtSecret]: z.boolean(),
|
||||
[SysPreference.JwtExpiresIn]: IsValidMS(),
|
||||
|
||||
[SysPreference.BCryptStrength]: IsPosInt(),
|
||||
[SysPreference.RemoveDerivativesAfter]: IsValidMS(),
|
||||
[SysPreference.SaveDerivatives]: z.boolean(),
|
||||
|
||||
[SysPreference.AllowEditing]: z.boolean(),
|
||||
[SysPreference.ConversionTimeLimit]: IsValidMS(),
|
||||
[SysPreference.ConversionMemoryLimit]: IsPosInt(),
|
||||
|
||||
[SysPreference.EnableTracking]: z.boolean(),
|
||||
[SysPreference.TrackingUrl]: z.string().regex(URLRegex),
|
||||
[SysPreference.TrackingId]: IsEntityID(),
|
||||
|
||||
[SysPreference.EnableTelemetry]: z.boolean(),
|
||||
};
|
||||
|
|
|
@ -1,4 +1,22 @@
|
|||
import { PrefValueTypeStrings } from './preferences.dto';
|
||||
|
||||
// This enum is only here to make accessing the values easier, and type checking in the backend
|
||||
export enum UsrPreference {
|
||||
KeepOriginal = 'keep_original',
|
||||
}
|
||||
|
||||
export type UsrPreferences = UsrPreference[];
|
||||
export const UsrPreferenceList: string[] = Object.values(UsrPreference);
|
||||
|
||||
// Syspref Value types
|
||||
export const UsrPreferenceValueTypes: {
|
||||
[key in UsrPreference]: PrefValueTypeStrings;
|
||||
} = {
|
||||
[UsrPreference.KeepOriginal]: 'boolean',
|
||||
};
|
||||
|
||||
export const UsrPreferenceValidators: {
|
||||
[key in UsrPreference]: (value: any) => boolean;
|
||||
} = {
|
||||
[UsrPreference.KeepOriginal]: (value: any) => typeof value === 'boolean',
|
||||
};
|
||||
|
|
|
@ -0,0 +1,5 @@
|
|||
import ms from 'ms';
|
||||
import { z } from 'zod';
|
||||
|
||||
export const IsValidMS = () =>
|
||||
z.preprocess((v) => ms(v as any), z.number().int().min(0));
|
Loading…
Reference in New Issue