fix: settings typecheck errors

This commit is contained in:
abdou6666 2024-12-20 13:38:41 +01:00
parent e489bc57a7
commit 7a8a8fa151
7 changed files with 44 additions and 21 deletions

View File

@ -23,6 +23,9 @@ import { NlpValueSeeder } from './nlp/seeds/nlp-value.seed';
import { nlpValueModels } from './nlp/seeds/nlp-value.seed-model'; import { nlpValueModels } from './nlp/seeds/nlp-value.seed-model';
import { SettingSeeder } from './setting/seeds/setting.seed'; import { SettingSeeder } from './setting/seeds/setting.seed';
import { DEFAULT_SETTINGS } from './setting/seeds/setting.seed-model'; import { DEFAULT_SETTINGS } from './setting/seeds/setting.seed-model';
import { PermissionCreateDto } from './user/dto/permission.dto';
import { Model } from './user/schemas/model.schema';
import { Role } from './user/schemas/role.schema';
import { ModelSeeder } from './user/seeds/model.seed'; import { ModelSeeder } from './user/seeds/model.seed';
import { modelModels } from './user/seeds/model.seed-model'; import { modelModels } from './user/seeds/model.seed-model';
import { PermissionSeeder } from './user/seeds/permission.seed'; import { PermissionSeeder } from './user/seeds/permission.seed';
@ -69,19 +72,19 @@ export async function seedDatabase(app: INestApplicationContext) {
throw e; throw e;
} }
const models = await modelSeeder.findAll(); const models = (await modelSeeder.findAll()) as Model[];
const roles = await roleSeeder.findAll(); const roles = (await roleSeeder.findAll()) as Role[];
const adminRole = roles.find(({ name }) => name === 'admin'); const adminRole = roles.find(({ name }) => name === 'admin') as Role;
const managerRole = roles.find(({ name }) => name === 'manager'); const managerRole = roles.find(({ name }) => name === 'manager') as Role;
const managerModels = models.filter( const managerModels = models.filter(
(model) => !['Role', 'User', 'Permission'].includes(model.name), (model) => !['Role', 'User', 'Permission'].includes(model.name),
); );
const roleModelsCombinations: [string, string][] = [ const roleModelsCombinations = [
...models.map((model) => [model.id, adminRole.id]), ...models.map((model) => [model.id, adminRole.id]),
...managerModels.map((model) => [model.id, managerRole.id]), ...managerModels.map((model) => [model.id, managerRole.id]),
] as [string, string][]; ] as [string, string][];
const permissionSeeds = roleModelsCombinations.reduce( const permissionSeeds = roleModelsCombinations.reduce<PermissionCreateDto[]>(
(acc, [modelId, roleId]) => { (acc, [modelId, roleId]) => {
return acc.concat(permissionModels(modelId, roleId)); return acc.concat(permissionModels(modelId, roleId));
}, },

View File

@ -23,7 +23,7 @@ import {
} from '@/utils/test/test'; } from '@/utils/test/test';
import { SettingRepository } from '../repositories/setting.repository'; import { SettingRepository } from '../repositories/setting.repository';
import { SettingModel } from '../schemas/setting.schema'; import { Setting, SettingModel } from '../schemas/setting.schema';
import { SettingSeeder } from '../seeds/setting.seed'; import { SettingSeeder } from '../seeds/setting.seed';
import { SettingService } from '../services/setting.service'; import { SettingService } from '../services/setting.service';
@ -100,8 +100,9 @@ describe('SettingController', () => {
const payload = { const payload = {
value: 'updated setting value', value: 'updated setting value',
}; };
const id = (await settingService.findOne({ value: 'admin@example.com' })) const { id } = (await settingService.findOne({
.id; value: 'admin@example.com',
})) as Setting;
const result = await settingController.updateOne(id, payload); const result = await settingController.updateOne(id, payload);
expect(settingService.updateOne).toHaveBeenCalledWith(id, payload); expect(settingService.updateOne).toHaveBeenCalledWith(id, payload);

View File

@ -49,10 +49,15 @@ export class SettingRepository extends BaseRepository<Setting> {
): Promise<void> { ): Promise<void> {
if (!Array.isArray(updates)) { if (!Array.isArray(updates)) {
const payload = updates.$set; const payload = updates.$set;
if (typeof payload.value !== 'undefined') { if (payload && 'value' in payload) {
const { type } = const hasType = 'type' in payload;
'type' in payload ? payload : await this.findOne(criteria); if (hasType) {
this.validateSettingValue(type, payload.value); this.validateSettingValue(payload.type, payload.value);
} else {
const setting = await this.findOne(criteria);
if (setting && 'type' in setting)
this.validateSettingValue(setting.type, payload.value);
}
} }
} }
} }

View File

@ -77,7 +77,7 @@ export interface NumberSetting extends Setting {
type: SettingType.number; type: SettingType.number;
value: number; value: number;
options: never; options: never;
config?: { config: {
min: number; min: number;
max: number; max: number;
step: number; step: number;

View File

@ -35,8 +35,8 @@ describe('SettingService', () => {
const commonAttributes = { const commonAttributes = {
type: SettingType.text, type: SettingType.text,
id: '', id: '',
createdAt: undefined, createdAt: new Date(),
updatedAt: undefined, updatedAt: new Date(),
}; };
beforeAll(async () => { beforeAll(async () => {

View File

@ -414,10 +414,24 @@ export abstract class BaseRepository<
filters: TFilterQuery<T>, filters: TFilterQuery<T>,
{ skip, limit, sort }: PageQueryDto<T>, { skip, limit, sort }: PageQueryDto<T>,
): Query<T[], T, object, T, 'find', object> { ): Query<T[], T, object, T, 'find', object> {
return this.findQuery(filters) if (skip && limit) {
.skip(skip) return this.findQuery(filters)
.limit(limit) .skip(skip)
.sort([sort] as [string, SortOrder][]); .limit(limit)
.sort([sort] as [string, SortOrder][]);
}
if (skip) {
return this.findQuery(filters)
.skip(skip)
.sort([sort] as [string, SortOrder][]);
}
if (limit) {
return this.findQuery(filters)
.limit(limit)
.sort([sort] as [string, SortOrder][]);
}
return this.findQuery(filters).sort([sort] as [string, SortOrder][]);
} }
/** /**

View File

@ -18,5 +18,5 @@ export type QuerySortDto<T> = [
export type PageQueryDto<T> = { export type PageQueryDto<T> = {
skip: number | undefined; skip: number | undefined;
limit: number | undefined; limit: number | undefined;
sort: QuerySortDto<T>; sort?: QuerySortDto<T>;
}; };