From 7a8a8fa1519f112c85943dbd1782dd36e3846907 Mon Sep 17 00:00:00 2001 From: abdou6666 Date: Fri, 20 Dec 2024 13:38:41 +0100 Subject: [PATCH] fix: settings typecheck errors --- api/src/seeder.ts | 15 ++++++++----- .../controllers/setting.controller.spec.ts | 7 +++--- .../repositories/setting.repository.ts | 13 +++++++---- api/src/setting/schemas/types.ts | 2 +- .../setting/services/setting.service.spec.ts | 4 ++-- api/src/utils/generics/base-repository.ts | 22 +++++++++++++++---- .../utils/pagination/pagination-query.dto.ts | 2 +- 7 files changed, 44 insertions(+), 21 deletions(-) diff --git a/api/src/seeder.ts b/api/src/seeder.ts index 336aed29..92c63e99 100644 --- a/api/src/seeder.ts +++ b/api/src/seeder.ts @@ -23,6 +23,9 @@ import { NlpValueSeeder } from './nlp/seeds/nlp-value.seed'; import { nlpValueModels } from './nlp/seeds/nlp-value.seed-model'; import { SettingSeeder } from './setting/seeds/setting.seed'; 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 { modelModels } from './user/seeds/model.seed-model'; import { PermissionSeeder } from './user/seeds/permission.seed'; @@ -69,19 +72,19 @@ export async function seedDatabase(app: INestApplicationContext) { throw e; } - const models = await modelSeeder.findAll(); - const roles = await roleSeeder.findAll(); - const adminRole = roles.find(({ name }) => name === 'admin'); - const managerRole = roles.find(({ name }) => name === 'manager'); + const models = (await modelSeeder.findAll()) as Model[]; + const roles = (await roleSeeder.findAll()) as Role[]; + const adminRole = roles.find(({ name }) => name === 'admin') as Role; + const managerRole = roles.find(({ name }) => name === 'manager') as Role; const managerModels = models.filter( (model) => !['Role', 'User', 'Permission'].includes(model.name), ); - const roleModelsCombinations: [string, string][] = [ + const roleModelsCombinations = [ ...models.map((model) => [model.id, adminRole.id]), ...managerModels.map((model) => [model.id, managerRole.id]), ] as [string, string][]; - const permissionSeeds = roleModelsCombinations.reduce( + const permissionSeeds = roleModelsCombinations.reduce( (acc, [modelId, roleId]) => { return acc.concat(permissionModels(modelId, roleId)); }, diff --git a/api/src/setting/controllers/setting.controller.spec.ts b/api/src/setting/controllers/setting.controller.spec.ts index 14e36a51..156ed87c 100644 --- a/api/src/setting/controllers/setting.controller.spec.ts +++ b/api/src/setting/controllers/setting.controller.spec.ts @@ -23,7 +23,7 @@ import { } from '@/utils/test/test'; 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 { SettingService } from '../services/setting.service'; @@ -100,8 +100,9 @@ describe('SettingController', () => { const payload = { value: 'updated setting value', }; - const id = (await settingService.findOne({ value: 'admin@example.com' })) - .id; + const { id } = (await settingService.findOne({ + value: 'admin@example.com', + })) as Setting; const result = await settingController.updateOne(id, payload); expect(settingService.updateOne).toHaveBeenCalledWith(id, payload); diff --git a/api/src/setting/repositories/setting.repository.ts b/api/src/setting/repositories/setting.repository.ts index 57117f49..40283b75 100644 --- a/api/src/setting/repositories/setting.repository.ts +++ b/api/src/setting/repositories/setting.repository.ts @@ -49,10 +49,15 @@ export class SettingRepository extends BaseRepository { ): Promise { if (!Array.isArray(updates)) { const payload = updates.$set; - if (typeof payload.value !== 'undefined') { - const { type } = - 'type' in payload ? payload : await this.findOne(criteria); - this.validateSettingValue(type, payload.value); + if (payload && 'value' in payload) { + const hasType = 'type' in payload; + if (hasType) { + this.validateSettingValue(payload.type, payload.value); + } else { + const setting = await this.findOne(criteria); + if (setting && 'type' in setting) + this.validateSettingValue(setting.type, payload.value); + } } } } diff --git a/api/src/setting/schemas/types.ts b/api/src/setting/schemas/types.ts index fbf30493..e4981b82 100644 --- a/api/src/setting/schemas/types.ts +++ b/api/src/setting/schemas/types.ts @@ -77,7 +77,7 @@ export interface NumberSetting extends Setting { type: SettingType.number; value: number; options: never; - config?: { + config: { min: number; max: number; step: number; diff --git a/api/src/setting/services/setting.service.spec.ts b/api/src/setting/services/setting.service.spec.ts index 90070829..cc795c96 100644 --- a/api/src/setting/services/setting.service.spec.ts +++ b/api/src/setting/services/setting.service.spec.ts @@ -35,8 +35,8 @@ describe('SettingService', () => { const commonAttributes = { type: SettingType.text, id: '', - createdAt: undefined, - updatedAt: undefined, + createdAt: new Date(), + updatedAt: new Date(), }; beforeAll(async () => { diff --git a/api/src/utils/generics/base-repository.ts b/api/src/utils/generics/base-repository.ts index 2ca8cfa3..ada5e9a3 100644 --- a/api/src/utils/generics/base-repository.ts +++ b/api/src/utils/generics/base-repository.ts @@ -414,10 +414,24 @@ export abstract class BaseRepository< filters: TFilterQuery, { skip, limit, sort }: PageQueryDto, ): Query { - return this.findQuery(filters) - .skip(skip) - .limit(limit) - .sort([sort] as [string, SortOrder][]); + if (skip && limit) { + return this.findQuery(filters) + .skip(skip) + .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][]); } /** diff --git a/api/src/utils/pagination/pagination-query.dto.ts b/api/src/utils/pagination/pagination-query.dto.ts index 31ac2ecf..8a81298d 100644 --- a/api/src/utils/pagination/pagination-query.dto.ts +++ b/api/src/utils/pagination/pagination-query.dto.ts @@ -18,5 +18,5 @@ export type QuerySortDto = [ export type PageQueryDto = { skip: number | undefined; limit: number | undefined; - sort: QuerySortDto; + sort?: QuerySortDto; };