diff --git a/apps/hcdc-access-service/src/domain/auth/action.ts b/apps/hcdc-access-service/src/domain/auth/action.ts index 08ef26f9..204e1a8f 100644 --- a/apps/hcdc-access-service/src/domain/auth/action.ts +++ b/apps/hcdc-access-service/src/domain/auth/action.ts @@ -4,8 +4,10 @@ import { AuthSubject, AuthSubjectUnionType } from './subject' import { BioProductAction, BranchAction, + DiagnosisAction, DoctorAction, InstrumentAction, + PatientTypeAction, RoleAction, SampleTypeAction, TestCategoryAction, @@ -22,6 +24,8 @@ export const AuthAction = { Instrument: stringEnumValues(InstrumentAction), SampleType: stringEnumValues(SampleTypeAction), Doctor: stringEnumValues(DoctorAction), + PatientType: stringEnumValues(PatientTypeAction), + Diagnosis: stringEnumValues(DiagnosisAction), } satisfies Record export const AuthActionValues = [ diff --git a/apps/hcdc-access-service/src/domain/auth/subject.ts b/apps/hcdc-access-service/src/domain/auth/subject.ts index 0992f7ee..1a7b2d60 100644 --- a/apps/hcdc-access-service/src/domain/auth/subject.ts +++ b/apps/hcdc-access-service/src/domain/auth/subject.ts @@ -3,8 +3,10 @@ import { RecordTypes } from '@casl/mongoose' import { BioProduct, Branch, + Diagnosis, Doctor, Instrument, + PatientType, Role, SampleType, TestCategory, @@ -22,6 +24,8 @@ export const AuthSubject = { Instrument: 'Instrument', SampleType: 'SampleType', Doctor: 'Doctor', + PatientType: 'PatientType', + Diagnosis: 'Diagnosis', } satisfies Record export type AuthSubjectUnionType = keyof typeof AuthSubject @@ -40,4 +44,6 @@ export type SubjectEntityMapping = { Instrument: Instrument SampleType: SampleType Doctor: Doctor + PatientType: PatientType + Diagnosis: Diagnosis } diff --git a/apps/hcdc-access-service/src/domain/entity/diagnosis/auth.ts b/apps/hcdc-access-service/src/domain/entity/diagnosis/auth.ts new file mode 100644 index 00000000..e761b162 --- /dev/null +++ b/apps/hcdc-access-service/src/domain/entity/diagnosis/auth.ts @@ -0,0 +1,14 @@ +import '@casl/mongoose' + +export enum DiagnosisAction { + Create = 'Create', + Read = 'Read', + Update = 'Update', + Delete = 'Delete', +} + +declare module '@casl/mongoose' { + interface RecordTypes { + Diagnosis: true + } +} diff --git a/apps/hcdc-access-service/src/domain/entity/diagnosis/entity.ts b/apps/hcdc-access-service/src/domain/entity/diagnosis/entity.ts new file mode 100644 index 00000000..5d57b76c --- /dev/null +++ b/apps/hcdc-access-service/src/domain/entity/diagnosis/entity.ts @@ -0,0 +1,10 @@ +import { BaseEntity } from '../base-entity' +import { Branch } from '../branch' + +export type Diagnosis = BaseEntity & { + displayIndex: number + name: string + + branchId: string + branch?: Branch | null +} diff --git a/apps/hcdc-access-service/src/domain/entity/diagnosis/example.ts b/apps/hcdc-access-service/src/domain/entity/diagnosis/example.ts new file mode 100644 index 00000000..69bb7b61 --- /dev/null +++ b/apps/hcdc-access-service/src/domain/entity/diagnosis/example.ts @@ -0,0 +1,17 @@ +import { exampleMongoObjectId } from '@diut/nest-core' + +import { EntityDataExample } from '../base-entity' +import { Diagnosis } from './entity' + +export const exampleDiagnosis = { + displayIndex: { + example: 1, + }, + name: { + example: 'CHIV Advia centaur', + }, + branchId: exampleMongoObjectId, + branch: { + required: false, + }, +} satisfies EntityDataExample diff --git a/apps/hcdc-access-service/src/domain/entity/diagnosis/index.ts b/apps/hcdc-access-service/src/domain/entity/diagnosis/index.ts new file mode 100644 index 00000000..3b1b1117 --- /dev/null +++ b/apps/hcdc-access-service/src/domain/entity/diagnosis/index.ts @@ -0,0 +1,3 @@ +export * from './entity' +export * from './example' +export * from './auth' diff --git a/apps/hcdc-access-service/src/domain/entity/index.ts b/apps/hcdc-access-service/src/domain/entity/index.ts index 777f73b6..311b76b0 100644 --- a/apps/hcdc-access-service/src/domain/entity/index.ts +++ b/apps/hcdc-access-service/src/domain/entity/index.ts @@ -1,6 +1,8 @@ export * from './base-entity' export * from './bio-product' +export * from './diagnosis' +export * from './patient-type' export * from './doctor' export * from './instrument' export * from './sample-type' diff --git a/apps/hcdc-access-service/src/domain/entity/patient-type/auth.ts b/apps/hcdc-access-service/src/domain/entity/patient-type/auth.ts new file mode 100644 index 00000000..bf9ae4a8 --- /dev/null +++ b/apps/hcdc-access-service/src/domain/entity/patient-type/auth.ts @@ -0,0 +1,14 @@ +import '@casl/mongoose' + +export enum PatientTypeAction { + Create = 'Create', + Read = 'Read', + Update = 'Update', + Delete = 'Delete', +} + +declare module '@casl/mongoose' { + interface RecordTypes { + PatientType: true + } +} diff --git a/apps/hcdc-access-service/src/domain/entity/patient-type/entity.ts b/apps/hcdc-access-service/src/domain/entity/patient-type/entity.ts new file mode 100644 index 00000000..1af775ec --- /dev/null +++ b/apps/hcdc-access-service/src/domain/entity/patient-type/entity.ts @@ -0,0 +1,10 @@ +import { BaseEntity } from '../base-entity' +import { Branch } from '../branch' + +export type PatientType = BaseEntity & { + displayIndex: number + name: string + + branchId: string + branch?: Branch | null +} diff --git a/apps/hcdc-access-service/src/domain/entity/patient-type/example.ts b/apps/hcdc-access-service/src/domain/entity/patient-type/example.ts new file mode 100644 index 00000000..3fd44fbe --- /dev/null +++ b/apps/hcdc-access-service/src/domain/entity/patient-type/example.ts @@ -0,0 +1,17 @@ +import { exampleMongoObjectId } from '@diut/nest-core' + +import { EntityDataExample } from '../base-entity' +import { PatientType } from './entity' + +export const examplePatientType = { + displayIndex: { + example: 1, + }, + name: { + example: 'CHIV Advia centaur', + }, + branchId: exampleMongoObjectId, + branch: { + required: false, + }, +} satisfies EntityDataExample diff --git a/apps/hcdc-access-service/src/domain/entity/patient-type/index.ts b/apps/hcdc-access-service/src/domain/entity/patient-type/index.ts new file mode 100644 index 00000000..3b1b1117 --- /dev/null +++ b/apps/hcdc-access-service/src/domain/entity/patient-type/index.ts @@ -0,0 +1,3 @@ +export * from './entity' +export * from './example' +export * from './auth' diff --git a/apps/hcdc-access-service/src/domain/interface/repository/diagnosis.ts b/apps/hcdc-access-service/src/domain/interface/repository/diagnosis.ts new file mode 100644 index 00000000..ae0f383d --- /dev/null +++ b/apps/hcdc-access-service/src/domain/interface/repository/diagnosis.ts @@ -0,0 +1,6 @@ +import { Diagnosis } from 'src/domain/entity' +import { IRepository } from './interface' + +export const DiagnosisRepositoryToken = Symbol('DiagnosisRepository') + +export interface IDiagnosisRepository extends IRepository {} diff --git a/apps/hcdc-access-service/src/domain/interface/repository/index.ts b/apps/hcdc-access-service/src/domain/interface/repository/index.ts index 41295fd4..d475aae0 100644 --- a/apps/hcdc-access-service/src/domain/interface/repository/index.ts +++ b/apps/hcdc-access-service/src/domain/interface/repository/index.ts @@ -1,6 +1,8 @@ export * from './interface' export * from './bio-product' +export * from './patient-type' +export * from './diagnosis' export * from './doctor' export * from './test-category' export * from './user' diff --git a/apps/hcdc-access-service/src/domain/interface/repository/patient-type.ts b/apps/hcdc-access-service/src/domain/interface/repository/patient-type.ts new file mode 100644 index 00000000..bf9a1f88 --- /dev/null +++ b/apps/hcdc-access-service/src/domain/interface/repository/patient-type.ts @@ -0,0 +1,6 @@ +import { PatientType } from 'src/domain/entity' +import { IRepository } from './interface' + +export const PatientTypeRepositoryToken = Symbol('PatientTypeRepository') + +export interface IPatientTypeRepository extends IRepository {} diff --git a/apps/hcdc-access-service/src/domain/use-case/diagnosis/assert-exists.ts b/apps/hcdc-access-service/src/domain/use-case/diagnosis/assert-exists.ts new file mode 100644 index 00000000..17bfb162 --- /dev/null +++ b/apps/hcdc-access-service/src/domain/use-case/diagnosis/assert-exists.ts @@ -0,0 +1,27 @@ +import { Inject, Injectable } from '@nestjs/common' + +import { Diagnosis } from 'src/domain/entity' +import { EEntityNotFound } from 'src/domain/exception' +import { + DiagnosisRepositoryToken, + EntityFindOneOptions, + IDiagnosisRepository, +} from 'src/domain/interface' + +@Injectable() +export class DiagnosisAssertExistsUseCase { + constructor( + @Inject(DiagnosisRepositoryToken) + private readonly diagnosisRepository: IDiagnosisRepository, + ) {} + + async execute(input: EntityFindOneOptions['filter']) { + const rv = await this.diagnosisRepository.findOne({ filter: input }) + + if (rv === null) { + throw new EEntityNotFound(`Diagnosis ${JSON.stringify(input)}`) + } + + return rv + } +} diff --git a/apps/hcdc-access-service/src/domain/use-case/diagnosis/authorize-populates.ts b/apps/hcdc-access-service/src/domain/use-case/diagnosis/authorize-populates.ts new file mode 100644 index 00000000..5a11a137 --- /dev/null +++ b/apps/hcdc-access-service/src/domain/use-case/diagnosis/authorize-populates.ts @@ -0,0 +1,30 @@ +import { Inject, Injectable } from '@nestjs/common' + +import { AuthSubject, authorizePopulates } from 'src/domain/auth' +import { BranchAction, Diagnosis } from 'src/domain/entity' +import { EEntityPopulatePathUnknown } from 'src/domain/exception' +import { + AuthContextToken, + EntityFindOneOptions, + IAuthContext, +} from 'src/domain/interface' + +@Injectable() +export class DiagnosisAuthorizePopulatesUseCase { + constructor( + @Inject(AuthContextToken) + private readonly authContext: IAuthContext, + ) {} + execute(input: EntityFindOneOptions['populates']) { + const { ability } = this.authContext.getData() + + return authorizePopulates(ability, input, (path) => { + switch (path) { + case 'branch': + return { subject: AuthSubject.Branch, action: BranchAction.Read } + default: + throw new EEntityPopulatePathUnknown(path) + } + }) + } +} diff --git a/apps/hcdc-access-service/src/domain/use-case/diagnosis/create.ts b/apps/hcdc-access-service/src/domain/use-case/diagnosis/create.ts new file mode 100644 index 00000000..b02bd1e1 --- /dev/null +++ b/apps/hcdc-access-service/src/domain/use-case/diagnosis/create.ts @@ -0,0 +1,37 @@ +import { Inject, Injectable } from '@nestjs/common' + +import { + AuthContextToken, + DiagnosisRepositoryToken, + IAuthContext, + IDiagnosisRepository, +} from 'src/domain/interface' +import { Diagnosis, DiagnosisAction, EntityData } from 'src/domain/entity' +import { AuthSubject, assertPermission } from 'src/domain/auth' +import { DiagnosisValidateUseCase } from './validate' + +@Injectable() +export class DiagnosisCreateUseCase { + constructor( + @Inject(AuthContextToken) + private readonly authContext: IAuthContext, + @Inject(DiagnosisRepositoryToken) + private readonly diagnosisRepository: IDiagnosisRepository, + private readonly diagnosisValidateUseCase: DiagnosisValidateUseCase, + ) {} + + async execute(input: EntityData) { + const { ability } = this.authContext.getData() + assertPermission( + ability, + AuthSubject.Diagnosis, + DiagnosisAction.Create, + input, + ) + await this.diagnosisValidateUseCase.execute(input) + + const entity = await this.diagnosisRepository.create(input) + + return entity + } +} diff --git a/apps/hcdc-access-service/src/domain/use-case/diagnosis/delete.ts b/apps/hcdc-access-service/src/domain/use-case/diagnosis/delete.ts new file mode 100644 index 00000000..faeeec86 --- /dev/null +++ b/apps/hcdc-access-service/src/domain/use-case/diagnosis/delete.ts @@ -0,0 +1,39 @@ +import { Inject, Injectable } from '@nestjs/common' + +import { DiagnosisAction } from 'src/domain/entity' +import { AuthSubject, assertPermission } from 'src/domain/auth' +import { + AuthContextToken, + DiagnosisRepositoryToken, + IAuthContext, + IDiagnosisRepository, +} from 'src/domain/interface' +import { DiagnosisAssertExistsUseCase } from './assert-exists' + +@Injectable() +export class DiagnosisDeleteUseCase { + constructor( + @Inject(AuthContextToken) + private readonly authContext: IAuthContext, + @Inject(DiagnosisRepositoryToken) + private readonly diagnosisRepository: IDiagnosisRepository, + private readonly diagnosisAssertExistsUseCase: DiagnosisAssertExistsUseCase, + ) {} + + async execute(input: { id: string }) { + const entity = await this.diagnosisAssertExistsUseCase.execute({ + _id: input.id, + }) + const { ability } = this.authContext.getData() + assertPermission( + ability, + AuthSubject.Diagnosis, + DiagnosisAction.Delete, + entity, + ) + + await this.diagnosisRepository.deleteById(input.id) + + return entity + } +} diff --git a/apps/hcdc-access-service/src/domain/use-case/diagnosis/find-one.ts b/apps/hcdc-access-service/src/domain/use-case/diagnosis/find-one.ts new file mode 100644 index 00000000..ed29fef6 --- /dev/null +++ b/apps/hcdc-access-service/src/domain/use-case/diagnosis/find-one.ts @@ -0,0 +1,39 @@ +import { Inject, Injectable } from '@nestjs/common' + +import { Diagnosis, DiagnosisAction } from 'src/domain/entity' +import { AuthSubject, assertPermission } from 'src/domain/auth' +import { + AuthContextToken, + DiagnosisRepositoryToken, + EntityFindOneOptions, + IAuthContext, + IDiagnosisRepository, +} from 'src/domain/interface' +import { DiagnosisAuthorizePopulatesUseCase } from './authorize-populates' + +@Injectable() +export class DiagnosisFindOneUseCase { + constructor( + @Inject(DiagnosisRepositoryToken) + private readonly diagnosisRepository: IDiagnosisRepository, + @Inject(AuthContextToken) + private readonly authContext: IAuthContext, + private readonly diagnosisAuthorizePopulatesUseCase: DiagnosisAuthorizePopulatesUseCase, + ) {} + + async execute(input: EntityFindOneOptions) { + input.populates = this.diagnosisAuthorizePopulatesUseCase.execute( + input.populates, + ) + const entity = await this.diagnosisRepository.findOne(input) + const { ability } = this.authContext.getData() + assertPermission( + ability, + AuthSubject.Diagnosis, + DiagnosisAction.Read, + entity, + ) + + return entity + } +} diff --git a/apps/hcdc-access-service/src/domain/use-case/diagnosis/search.ts b/apps/hcdc-access-service/src/domain/use-case/diagnosis/search.ts new file mode 100644 index 00000000..1bf0cb7d --- /dev/null +++ b/apps/hcdc-access-service/src/domain/use-case/diagnosis/search.ts @@ -0,0 +1,44 @@ +import { Inject, Injectable } from '@nestjs/common' +import { accessibleBy } from '@casl/mongoose' + +import { + AuthContextToken, + DiagnosisRepositoryToken, + IAuthContext, + IDiagnosisRepository, + EntitySearchOptions, +} from 'src/domain/interface' +import { Diagnosis, DiagnosisAction } from 'src/domain/entity' +import { AuthSubject, assertPermission } from 'src/domain/auth' +import { DiagnosisAuthorizePopulatesUseCase } from './authorize-populates' + +@Injectable() +export class DiagnosisSearchUseCase { + constructor( + @Inject(DiagnosisRepositoryToken) + private readonly diagnosisRepository: IDiagnosisRepository, + @Inject(AuthContextToken) + private readonly authContext: IAuthContext, + private readonly diagnosisAuthorizePopulatesUseCase: DiagnosisAuthorizePopulatesUseCase, + ) {} + + async execute(input: EntitySearchOptions) { + const { ability } = this.authContext.getData() + assertPermission(ability, AuthSubject.Diagnosis, DiagnosisAction.Read) + input.populates = this.diagnosisAuthorizePopulatesUseCase.execute( + input.populates, + ) + + const paginationResult = await this.diagnosisRepository.search({ + ...input, + filter: { + $and: [ + input.filter ?? {}, + accessibleBy(ability, DiagnosisAction.Read).Diagnosis, + ], + }, + }) + + return paginationResult + } +} diff --git a/apps/hcdc-access-service/src/domain/use-case/diagnosis/update.ts b/apps/hcdc-access-service/src/domain/use-case/diagnosis/update.ts new file mode 100644 index 00000000..db9a48a8 --- /dev/null +++ b/apps/hcdc-access-service/src/domain/use-case/diagnosis/update.ts @@ -0,0 +1,38 @@ +import { Inject, Injectable } from '@nestjs/common' + +import { DiagnosisAction } from 'src/domain/entity' +import { AuthSubject, assertPermission } from 'src/domain/auth' +import { + AuthContextToken, + DiagnosisRepositoryToken, + IAuthContext, + IDiagnosisRepository, +} from 'src/domain/interface' +import { DiagnosisAssertExistsUseCase } from './assert-exists' +import { DiagnosisValidateUseCase } from './validate' + +@Injectable() +export class DiagnosisUpdateUseCase { + constructor( + @Inject(DiagnosisRepositoryToken) + private readonly diagnosisRepository: IDiagnosisRepository, + @Inject(AuthContextToken) + private readonly authContext: IAuthContext, + private readonly diagnosisAssertExistsUseCase: DiagnosisAssertExistsUseCase, + private readonly diagnosisValidateUseCase: DiagnosisValidateUseCase, + ) {} + + async execute(...input: Parameters) { + const entity = await this.diagnosisAssertExistsUseCase.execute(input[0]) + const { ability } = this.authContext.getData() + assertPermission( + ability, + AuthSubject.Diagnosis, + DiagnosisAction.Update, + entity, + ) + await this.diagnosisValidateUseCase.execute(input[1]) + + return this.diagnosisRepository.update(...input) + } +} diff --git a/apps/hcdc-access-service/src/domain/use-case/diagnosis/validate.ts b/apps/hcdc-access-service/src/domain/use-case/diagnosis/validate.ts new file mode 100644 index 00000000..81761359 --- /dev/null +++ b/apps/hcdc-access-service/src/domain/use-case/diagnosis/validate.ts @@ -0,0 +1,32 @@ +import { Inject, Injectable } from '@nestjs/common' + +import { Diagnosis, BranchAction, EntityData } from 'src/domain/entity' +import { BranchAssertExistsUseCase } from '../branch/assert-exists' +import { AuthContextToken, IAuthContext } from 'src/domain/interface' +import { AuthSubject, assertPermission } from 'src/domain/auth' + +@Injectable() +export class DiagnosisValidateUseCase { + constructor( + @Inject(AuthContextToken) + private readonly authContext: IAuthContext, + private readonly branchAssertExistsUseCase: BranchAssertExistsUseCase, + ) {} + + async execute(input: Partial>) { + const { ability } = this.authContext.getData() + const { branchId } = input + + if (branchId !== undefined) { + const branch = await this.branchAssertExistsUseCase.execute({ + _id: branchId, + }) + assertPermission( + ability, + AuthSubject.Branch, + BranchAction.AssignToSubject, + branch, + ) + } + } +} diff --git a/apps/hcdc-access-service/src/domain/use-case/index.ts b/apps/hcdc-access-service/src/domain/use-case/index.ts index 50e2c43a..8de27863 100644 --- a/apps/hcdc-access-service/src/domain/use-case/index.ts +++ b/apps/hcdc-access-service/src/domain/use-case/index.ts @@ -13,6 +13,24 @@ export * from './bio-product/assert-exists' export * from './bio-product/validate' export * from './bio-product/authorize-populates' +export * from './patient-type/create' +export * from './patient-type/find-one' +export * from './patient-type/update' +export * from './patient-type/delete' +export * from './patient-type/search' +export * from './patient-type/assert-exists' +export * from './patient-type/validate' +export * from './patient-type/authorize-populates' + +export * from './diagnosis/create' +export * from './diagnosis/find-one' +export * from './diagnosis/update' +export * from './diagnosis/delete' +export * from './diagnosis/search' +export * from './diagnosis/assert-exists' +export * from './diagnosis/validate' +export * from './diagnosis/authorize-populates' + export * from './doctor/create' export * from './doctor/find-one' export * from './doctor/update' diff --git a/apps/hcdc-access-service/src/domain/use-case/module.ts b/apps/hcdc-access-service/src/domain/use-case/module.ts index 8fdf3e08..72207526 100644 --- a/apps/hcdc-access-service/src/domain/use-case/module.ts +++ b/apps/hcdc-access-service/src/domain/use-case/module.ts @@ -9,6 +9,24 @@ import { BioProductSearchUseCase } from './bio-product/search' import { BioProductAssertExistsUseCase } from './bio-product/assert-exists' import { BioProductAuthorizePopulatesUseCase } from './bio-product/authorize-populates' +import { PatientTypeCreateUseCase } from './patient-type/create' +import { PatientTypeUpdateUseCase } from './patient-type/update' +import { PatientTypeValidateUseCase } from './patient-type/validate' +import { PatientTypeFindOneUseCase } from './patient-type/find-one' +import { PatientTypeDeleteUseCase } from './patient-type/delete' +import { PatientTypeSearchUseCase } from './patient-type/search' +import { PatientTypeAssertExistsUseCase } from './patient-type/assert-exists' +import { PatientTypeAuthorizePopulatesUseCase } from './patient-type/authorize-populates' + +import { DiagnosisCreateUseCase } from './diagnosis/create' +import { DiagnosisUpdateUseCase } from './diagnosis/update' +import { DiagnosisValidateUseCase } from './diagnosis/validate' +import { DiagnosisFindOneUseCase } from './diagnosis/find-one' +import { DiagnosisDeleteUseCase } from './diagnosis/delete' +import { DiagnosisSearchUseCase } from './diagnosis/search' +import { DiagnosisAssertExistsUseCase } from './diagnosis/assert-exists' +import { DiagnosisAuthorizePopulatesUseCase } from './diagnosis/authorize-populates' + import { DoctorCreateUseCase } from './doctor/create' import { DoctorUpdateUseCase } from './doctor/update' import { DoctorValidateUseCase } from './doctor/validate' @@ -94,6 +112,24 @@ export const useCaseMetadata: ModuleMetadata = { BioProductValidateUseCase, BioProductAuthorizePopulatesUseCase, + PatientTypeCreateUseCase, + PatientTypeFindOneUseCase, + PatientTypeUpdateUseCase, + PatientTypeDeleteUseCase, + PatientTypeSearchUseCase, + PatientTypeAssertExistsUseCase, + PatientTypeValidateUseCase, + PatientTypeAuthorizePopulatesUseCase, + + DiagnosisCreateUseCase, + DiagnosisFindOneUseCase, + DiagnosisUpdateUseCase, + DiagnosisDeleteUseCase, + DiagnosisSearchUseCase, + DiagnosisAssertExistsUseCase, + DiagnosisValidateUseCase, + DiagnosisAuthorizePopulatesUseCase, + DoctorCreateUseCase, DoctorFindOneUseCase, DoctorUpdateUseCase, diff --git a/apps/hcdc-access-service/src/domain/use-case/patient-type/assert-exists.ts b/apps/hcdc-access-service/src/domain/use-case/patient-type/assert-exists.ts new file mode 100644 index 00000000..dc82cee4 --- /dev/null +++ b/apps/hcdc-access-service/src/domain/use-case/patient-type/assert-exists.ts @@ -0,0 +1,27 @@ +import { Inject, Injectable } from '@nestjs/common' + +import { PatientType } from 'src/domain/entity' +import { EEntityNotFound } from 'src/domain/exception' +import { + PatientTypeRepositoryToken, + EntityFindOneOptions, + IPatientTypeRepository, +} from 'src/domain/interface' + +@Injectable() +export class PatientTypeAssertExistsUseCase { + constructor( + @Inject(PatientTypeRepositoryToken) + private readonly patientTypeRepository: IPatientTypeRepository, + ) {} + + async execute(input: EntityFindOneOptions['filter']) { + const rv = await this.patientTypeRepository.findOne({ filter: input }) + + if (rv === null) { + throw new EEntityNotFound(`PatientType ${JSON.stringify(input)}`) + } + + return rv + } +} diff --git a/apps/hcdc-access-service/src/domain/use-case/patient-type/authorize-populates.ts b/apps/hcdc-access-service/src/domain/use-case/patient-type/authorize-populates.ts new file mode 100644 index 00000000..2b389b5a --- /dev/null +++ b/apps/hcdc-access-service/src/domain/use-case/patient-type/authorize-populates.ts @@ -0,0 +1,30 @@ +import { Inject, Injectable } from '@nestjs/common' + +import { AuthSubject, authorizePopulates } from 'src/domain/auth' +import { BranchAction, PatientType } from 'src/domain/entity' +import { EEntityPopulatePathUnknown } from 'src/domain/exception' +import { + AuthContextToken, + EntityFindOneOptions, + IAuthContext, +} from 'src/domain/interface' + +@Injectable() +export class PatientTypeAuthorizePopulatesUseCase { + constructor( + @Inject(AuthContextToken) + private readonly authContext: IAuthContext, + ) {} + execute(input: EntityFindOneOptions['populates']) { + const { ability } = this.authContext.getData() + + return authorizePopulates(ability, input, (path) => { + switch (path) { + case 'branch': + return { subject: AuthSubject.Branch, action: BranchAction.Read } + default: + throw new EEntityPopulatePathUnknown(path) + } + }) + } +} diff --git a/apps/hcdc-access-service/src/domain/use-case/patient-type/create.ts b/apps/hcdc-access-service/src/domain/use-case/patient-type/create.ts new file mode 100644 index 00000000..149ecde7 --- /dev/null +++ b/apps/hcdc-access-service/src/domain/use-case/patient-type/create.ts @@ -0,0 +1,37 @@ +import { Inject, Injectable } from '@nestjs/common' + +import { + AuthContextToken, + PatientTypeRepositoryToken, + IAuthContext, + IPatientTypeRepository, +} from 'src/domain/interface' +import { PatientType, PatientTypeAction, EntityData } from 'src/domain/entity' +import { AuthSubject, assertPermission } from 'src/domain/auth' +import { PatientTypeValidateUseCase } from './validate' + +@Injectable() +export class PatientTypeCreateUseCase { + constructor( + @Inject(AuthContextToken) + private readonly authContext: IAuthContext, + @Inject(PatientTypeRepositoryToken) + private readonly patientTypeRepository: IPatientTypeRepository, + private readonly patientTypeValidateUseCase: PatientTypeValidateUseCase, + ) {} + + async execute(input: EntityData) { + const { ability } = this.authContext.getData() + assertPermission( + ability, + AuthSubject.PatientType, + PatientTypeAction.Create, + input, + ) + await this.patientTypeValidateUseCase.execute(input) + + const entity = await this.patientTypeRepository.create(input) + + return entity + } +} diff --git a/apps/hcdc-access-service/src/domain/use-case/patient-type/delete.ts b/apps/hcdc-access-service/src/domain/use-case/patient-type/delete.ts new file mode 100644 index 00000000..bb8fb9c1 --- /dev/null +++ b/apps/hcdc-access-service/src/domain/use-case/patient-type/delete.ts @@ -0,0 +1,39 @@ +import { Inject, Injectable } from '@nestjs/common' + +import { PatientTypeAction } from 'src/domain/entity' +import { AuthSubject, assertPermission } from 'src/domain/auth' +import { + AuthContextToken, + PatientTypeRepositoryToken, + IAuthContext, + IPatientTypeRepository, +} from 'src/domain/interface' +import { PatientTypeAssertExistsUseCase } from './assert-exists' + +@Injectable() +export class PatientTypeDeleteUseCase { + constructor( + @Inject(AuthContextToken) + private readonly authContext: IAuthContext, + @Inject(PatientTypeRepositoryToken) + private readonly patientTypeRepository: IPatientTypeRepository, + private readonly patientTypeAssertExistsUseCase: PatientTypeAssertExistsUseCase, + ) {} + + async execute(input: { id: string }) { + const entity = await this.patientTypeAssertExistsUseCase.execute({ + _id: input.id, + }) + const { ability } = this.authContext.getData() + assertPermission( + ability, + AuthSubject.PatientType, + PatientTypeAction.Delete, + entity, + ) + + await this.patientTypeRepository.deleteById(input.id) + + return entity + } +} diff --git a/apps/hcdc-access-service/src/domain/use-case/patient-type/find-one.ts b/apps/hcdc-access-service/src/domain/use-case/patient-type/find-one.ts new file mode 100644 index 00000000..1cbb8c8e --- /dev/null +++ b/apps/hcdc-access-service/src/domain/use-case/patient-type/find-one.ts @@ -0,0 +1,39 @@ +import { Inject, Injectable } from '@nestjs/common' + +import { PatientType, PatientTypeAction } from 'src/domain/entity' +import { AuthSubject, assertPermission } from 'src/domain/auth' +import { + AuthContextToken, + PatientTypeRepositoryToken, + EntityFindOneOptions, + IAuthContext, + IPatientTypeRepository, +} from 'src/domain/interface' +import { PatientTypeAuthorizePopulatesUseCase } from './authorize-populates' + +@Injectable() +export class PatientTypeFindOneUseCase { + constructor( + @Inject(PatientTypeRepositoryToken) + private readonly patientTypeRepository: IPatientTypeRepository, + @Inject(AuthContextToken) + private readonly authContext: IAuthContext, + private readonly patientTypeAuthorizePopulatesUseCase: PatientTypeAuthorizePopulatesUseCase, + ) {} + + async execute(input: EntityFindOneOptions) { + input.populates = this.patientTypeAuthorizePopulatesUseCase.execute( + input.populates, + ) + const entity = await this.patientTypeRepository.findOne(input) + const { ability } = this.authContext.getData() + assertPermission( + ability, + AuthSubject.PatientType, + PatientTypeAction.Read, + entity, + ) + + return entity + } +} diff --git a/apps/hcdc-access-service/src/domain/use-case/patient-type/search.ts b/apps/hcdc-access-service/src/domain/use-case/patient-type/search.ts new file mode 100644 index 00000000..97da386d --- /dev/null +++ b/apps/hcdc-access-service/src/domain/use-case/patient-type/search.ts @@ -0,0 +1,44 @@ +import { Inject, Injectable } from '@nestjs/common' +import { accessibleBy } from '@casl/mongoose' + +import { + AuthContextToken, + PatientTypeRepositoryToken, + IAuthContext, + IPatientTypeRepository, + EntitySearchOptions, +} from 'src/domain/interface' +import { PatientType, PatientTypeAction } from 'src/domain/entity' +import { AuthSubject, assertPermission } from 'src/domain/auth' +import { PatientTypeAuthorizePopulatesUseCase } from './authorize-populates' + +@Injectable() +export class PatientTypeSearchUseCase { + constructor( + @Inject(PatientTypeRepositoryToken) + private readonly patientTypeRepository: IPatientTypeRepository, + @Inject(AuthContextToken) + private readonly authContext: IAuthContext, + private readonly patientTypeAuthorizePopulatesUseCase: PatientTypeAuthorizePopulatesUseCase, + ) {} + + async execute(input: EntitySearchOptions) { + const { ability } = this.authContext.getData() + assertPermission(ability, AuthSubject.PatientType, PatientTypeAction.Read) + input.populates = this.patientTypeAuthorizePopulatesUseCase.execute( + input.populates, + ) + + const paginationResult = await this.patientTypeRepository.search({ + ...input, + filter: { + $and: [ + input.filter ?? {}, + accessibleBy(ability, PatientTypeAction.Read).PatientType, + ], + }, + }) + + return paginationResult + } +} diff --git a/apps/hcdc-access-service/src/domain/use-case/patient-type/update.ts b/apps/hcdc-access-service/src/domain/use-case/patient-type/update.ts new file mode 100644 index 00000000..82db7026 --- /dev/null +++ b/apps/hcdc-access-service/src/domain/use-case/patient-type/update.ts @@ -0,0 +1,38 @@ +import { Inject, Injectable } from '@nestjs/common' + +import { PatientTypeAction } from 'src/domain/entity' +import { AuthSubject, assertPermission } from 'src/domain/auth' +import { + AuthContextToken, + PatientTypeRepositoryToken, + IAuthContext, + IPatientTypeRepository, +} from 'src/domain/interface' +import { PatientTypeAssertExistsUseCase } from './assert-exists' +import { PatientTypeValidateUseCase } from './validate' + +@Injectable() +export class PatientTypeUpdateUseCase { + constructor( + @Inject(PatientTypeRepositoryToken) + private readonly patientTypeRepository: IPatientTypeRepository, + @Inject(AuthContextToken) + private readonly authContext: IAuthContext, + private readonly patientTypeAssertExistsUseCase: PatientTypeAssertExistsUseCase, + private readonly patientTypeValidateUseCase: PatientTypeValidateUseCase, + ) {} + + async execute(...input: Parameters) { + const entity = await this.patientTypeAssertExistsUseCase.execute(input[0]) + const { ability } = this.authContext.getData() + assertPermission( + ability, + AuthSubject.PatientType, + PatientTypeAction.Update, + entity, + ) + await this.patientTypeValidateUseCase.execute(input[1]) + + return this.patientTypeRepository.update(...input) + } +} diff --git a/apps/hcdc-access-service/src/domain/use-case/patient-type/validate.ts b/apps/hcdc-access-service/src/domain/use-case/patient-type/validate.ts new file mode 100644 index 00000000..596190fa --- /dev/null +++ b/apps/hcdc-access-service/src/domain/use-case/patient-type/validate.ts @@ -0,0 +1,32 @@ +import { Inject, Injectable } from '@nestjs/common' + +import { PatientType, BranchAction, EntityData } from 'src/domain/entity' +import { BranchAssertExistsUseCase } from '../branch/assert-exists' +import { AuthContextToken, IAuthContext } from 'src/domain/interface' +import { AuthSubject, assertPermission } from 'src/domain/auth' + +@Injectable() +export class PatientTypeValidateUseCase { + constructor( + @Inject(AuthContextToken) + private readonly authContext: IAuthContext, + private readonly branchAssertExistsUseCase: BranchAssertExistsUseCase, + ) {} + + async execute(input: Partial>) { + const { ability } = this.authContext.getData() + const { branchId } = input + + if (branchId !== undefined) { + const branch = await this.branchAssertExistsUseCase.execute({ + _id: branchId, + }) + assertPermission( + ability, + AuthSubject.Branch, + BranchAction.AssignToSubject, + branch, + ) + } + } +} diff --git a/apps/hcdc-access-service/src/infrastructure/mongo/collection-classes.ts b/apps/hcdc-access-service/src/infrastructure/mongo/collection-classes.ts index ac75592d..253ae6a3 100644 --- a/apps/hcdc-access-service/src/infrastructure/mongo/collection-classes.ts +++ b/apps/hcdc-access-service/src/infrastructure/mongo/collection-classes.ts @@ -9,15 +9,17 @@ import { RoleSchema } from './role' import { InstrumentSchema } from './instrument' import { SampleTypeSchema } from './sample-type' import { DoctorSchema } from './doctor' +import { PatientTypeSchema } from './patient-type' +import { DiagnosisSchema } from './diagnosis' export const COLLECTION_CLASS: Record = { [COLLECTION.BIO_PRODUCT]: BioProductSchema, [COLLECTION.INSTRUMENT]: InstrumentSchema, [COLLECTION.ROLE]: RoleSchema, [COLLECTION.DOCTOR]: DoctorSchema, - // [COLLECTION.INDICATION]: Indication, + [COLLECTION.DIAGNOSIS]: DiagnosisSchema, // [COLLECTION.PATIENT]: Patient, - // [COLLECTION.PATIENT_TYPE]: PatientType, + [COLLECTION.PATIENT_TYPE]: PatientTypeSchema, // [COLLECTION.SAMPLE]: Sample, [COLLECTION.SAMPLE_TYPE]: SampleTypeSchema, // [COLLECTION.TEST]: Test, diff --git a/apps/hcdc-access-service/src/infrastructure/mongo/collections.ts b/apps/hcdc-access-service/src/infrastructure/mongo/collections.ts index be483e45..5438af4e 100644 --- a/apps/hcdc-access-service/src/infrastructure/mongo/collections.ts +++ b/apps/hcdc-access-service/src/infrastructure/mongo/collections.ts @@ -6,8 +6,8 @@ export enum COLLECTION { TEST_CATEGORY = 'test_category', // TEST = 'test', // TEST_ELEMENT = 'test_element', - // PATIENT_TYPE = 'patient_type', - // INDICATION = 'indication', + PATIENT_TYPE = 'patient_type', + DIAGNOSIS = 'diagnosis', // SAMPLE = 'sample', BIO_PRODUCT = 'bio_product', INSTRUMENT = 'instrument', diff --git a/apps/hcdc-access-service/src/infrastructure/mongo/diagnosis/index.ts b/apps/hcdc-access-service/src/infrastructure/mongo/diagnosis/index.ts new file mode 100644 index 00000000..ea70ac25 --- /dev/null +++ b/apps/hcdc-access-service/src/infrastructure/mongo/diagnosis/index.ts @@ -0,0 +1,2 @@ +export * from './repository' +export * from './schema' diff --git a/apps/hcdc-access-service/src/infrastructure/mongo/diagnosis/repository.ts b/apps/hcdc-access-service/src/infrastructure/mongo/diagnosis/repository.ts new file mode 100644 index 00000000..3d3ccc54 --- /dev/null +++ b/apps/hcdc-access-service/src/infrastructure/mongo/diagnosis/repository.ts @@ -0,0 +1,17 @@ +import { InjectModel } from '@nestjs/mongoose' +import { MongoRepository } from '@diut/nest-core' +import { Model } from 'mongoose' + +import { IDiagnosisRepository } from 'src/domain' +import { DiagnosisSchema } from './schema' + +export class DiagnosisRepository + extends MongoRepository + implements IDiagnosisRepository +{ + constructor( + @InjectModel(DiagnosisSchema.name) model: Model, + ) { + super(model) + } +} diff --git a/apps/hcdc-access-service/src/infrastructure/mongo/diagnosis/schema.ts b/apps/hcdc-access-service/src/infrastructure/mongo/diagnosis/schema.ts new file mode 100644 index 00000000..23536479 --- /dev/null +++ b/apps/hcdc-access-service/src/infrastructure/mongo/diagnosis/schema.ts @@ -0,0 +1,32 @@ +import { Prop, Schema } from '@nestjs/mongoose' +import { BaseSchema, baseSchemaOptions } from '@diut/nest-core' +import { Types } from 'mongoose' + +import { COLLECTION } from '../collections' +import { BranchSchema } from '../branch' + +@Schema({ + ...baseSchemaOptions, + collection: COLLECTION.BIO_PRODUCT, + virtuals: { + branch: { + options: { + ref: BranchSchema.name, + localField: 'branchId', + foreignField: '_id', + justOne: true, + }, + }, + }, +}) +export class DiagnosisSchema extends BaseSchema { + @Prop({ required: true }) + displayIndex: number + + @Prop({ required: true }) + name: string + + @Prop({ required: true, type: Types.ObjectId }) + branchId: string + branch?: BranchSchema | null +} diff --git a/apps/hcdc-access-service/src/infrastructure/mongo/module.ts b/apps/hcdc-access-service/src/infrastructure/mongo/module.ts index 7730f3bd..aaabd4d7 100644 --- a/apps/hcdc-access-service/src/infrastructure/mongo/module.ts +++ b/apps/hcdc-access-service/src/infrastructure/mongo/module.ts @@ -5,8 +5,10 @@ import { MongoConfig, loadMongoConfig } from 'src/config' import { BioProductRepositoryToken, BranchRepositoryToken, + DiagnosisRepositoryToken, DoctorRepositoryToken, InstrumentRepositoryToken, + PatientTypeRepositoryToken, RoleRepositoryToken, SampleTypeRepositoryToken, TestCategoryRepositoryToken, @@ -20,6 +22,8 @@ import { RoleRepository, RoleSchema } from './role' import { InstrumentRepository, InstrumentSchema } from './instrument' import { SampleTypeRepository, SampleTypeSchema } from './sample-type' import { DoctorRepository, DoctorSchema } from './doctor' +import { PatientTypeRepository, PatientTypeSchema } from './patient-type' +import { DiagnosisRepository, DiagnosisSchema } from './diagnosis' export const mongoMetadata: ModuleMetadata = { imports: [ @@ -31,6 +35,8 @@ export const mongoMetadata: ModuleMetadata = { }), }), MongoModule.forFeature(BioProductSchema), + MongoModule.forFeature(PatientTypeSchema), + MongoModule.forFeature(DiagnosisSchema), MongoModule.forFeature(TestCategorySchema), MongoModule.forFeature(UserSchema), MongoModule.forFeature(BranchSchema), @@ -44,6 +50,14 @@ export const mongoMetadata: ModuleMetadata = { provide: BioProductRepositoryToken, useClass: BioProductRepository, }, + { + provide: PatientTypeRepositoryToken, + useClass: PatientTypeRepository, + }, + { + provide: DiagnosisRepositoryToken, + useClass: DiagnosisRepository, + }, { provide: DoctorRepositoryToken, useClass: DoctorRepository, diff --git a/apps/hcdc-access-service/src/infrastructure/mongo/patient-type/index.ts b/apps/hcdc-access-service/src/infrastructure/mongo/patient-type/index.ts new file mode 100644 index 00000000..ea70ac25 --- /dev/null +++ b/apps/hcdc-access-service/src/infrastructure/mongo/patient-type/index.ts @@ -0,0 +1,2 @@ +export * from './repository' +export * from './schema' diff --git a/apps/hcdc-access-service/src/infrastructure/mongo/patient-type/repository.ts b/apps/hcdc-access-service/src/infrastructure/mongo/patient-type/repository.ts new file mode 100644 index 00000000..8ef2e6fc --- /dev/null +++ b/apps/hcdc-access-service/src/infrastructure/mongo/patient-type/repository.ts @@ -0,0 +1,17 @@ +import { InjectModel } from '@nestjs/mongoose' +import { MongoRepository } from '@diut/nest-core' +import { Model } from 'mongoose' + +import { IPatientTypeRepository } from 'src/domain' +import { PatientTypeSchema } from './schema' + +export class PatientTypeRepository + extends MongoRepository + implements IPatientTypeRepository +{ + constructor( + @InjectModel(PatientTypeSchema.name) model: Model, + ) { + super(model) + } +} diff --git a/apps/hcdc-access-service/src/infrastructure/mongo/patient-type/schema.ts b/apps/hcdc-access-service/src/infrastructure/mongo/patient-type/schema.ts new file mode 100644 index 00000000..1230b7cc --- /dev/null +++ b/apps/hcdc-access-service/src/infrastructure/mongo/patient-type/schema.ts @@ -0,0 +1,32 @@ +import { Prop, Schema } from '@nestjs/mongoose' +import { BaseSchema, baseSchemaOptions } from '@diut/nest-core' +import { Types } from 'mongoose' + +import { COLLECTION } from '../collections' +import { BranchSchema } from '../branch' + +@Schema({ + ...baseSchemaOptions, + collection: COLLECTION.PATIENT_TYPE, + virtuals: { + branch: { + options: { + ref: BranchSchema.name, + localField: 'branchId', + foreignField: '_id', + justOne: true, + }, + }, + }, +}) +export class PatientTypeSchema extends BaseSchema { + @Prop({ required: true }) + displayIndex: number + + @Prop({ required: true }) + name: string + + @Prop({ required: true, type: Types.ObjectId }) + branchId: string + branch?: BranchSchema | null +} diff --git a/apps/hcdc-access-service/src/presentation/http/v1/diagnosis/controller.ts b/apps/hcdc-access-service/src/presentation/http/v1/diagnosis/controller.ts new file mode 100644 index 00000000..b0ab75e3 --- /dev/null +++ b/apps/hcdc-access-service/src/presentation/http/v1/diagnosis/controller.ts @@ -0,0 +1,66 @@ +import { Body, Param } from '@nestjs/common' +import { ObjectIdPipe } from '@diut/nest-core' + +import { diagnosisRoutes } from './routes' +import { + DiagnosisCreateUseCase, + DiagnosisDeleteUseCase, + DiagnosisSearchUseCase, + DiagnosisUpdateUseCase, + DiagnosisFindOneUseCase, + EEntityNotFound, +} from 'src/domain' +import { DiagnosisCreateRequestDto } from './dto/create.request-dto' +import { DiagnosisUpdateRequestDto } from './dto/update.request-dto' +import { DiagnosisSearchRequestDto } from './dto/search.request-dto' +import { HttpController, HttpRoute } from '../../common' + +@HttpController({ + basePath: 'v1/diagnoses', +}) +export class DiagnosisController { + constructor( + private readonly diagnosisCreateUseCase: DiagnosisCreateUseCase, + private readonly diagnosisUpdateUseCase: DiagnosisUpdateUseCase, + private readonly diagnosisDeleteUseCase: DiagnosisDeleteUseCase, + private readonly diagnosisSearchUseCase: DiagnosisSearchUseCase, + private readonly diagnosisFindOneUseCase: DiagnosisFindOneUseCase, + ) {} + + @HttpRoute(diagnosisRoutes.search) + search(@Body() body: DiagnosisSearchRequestDto) { + return this.diagnosisSearchUseCase.execute(body) + } + + @HttpRoute(diagnosisRoutes.create) + create(@Body() body: DiagnosisCreateRequestDto) { + return this.diagnosisCreateUseCase.execute(body) + } + + @HttpRoute(diagnosisRoutes.findById) + async findById(@Param('id', ObjectIdPipe) id: string) { + const rv = await this.diagnosisFindOneUseCase.execute({ + filter: { _id: id }, + populates: [{ path: 'branch' }], + }) + + if (rv === null) { + throw new EEntityNotFound(`Diagnosis id=${id}`) + } + + return rv + } + + @HttpRoute(diagnosisRoutes.updateById) + updateById( + @Param('id', ObjectIdPipe) id: string, + @Body() body: DiagnosisUpdateRequestDto, + ) { + return this.diagnosisUpdateUseCase.execute({ _id: id }, body) + } + + @HttpRoute(diagnosisRoutes.deleteById) + deleteById(@Param('id', ObjectIdPipe) id: string) { + return this.diagnosisDeleteUseCase.execute({ id }) + } +} diff --git a/apps/hcdc-access-service/src/presentation/http/v1/diagnosis/dto/create.request-dto.ts b/apps/hcdc-access-service/src/presentation/http/v1/diagnosis/dto/create.request-dto.ts new file mode 100644 index 00000000..e72f4415 --- /dev/null +++ b/apps/hcdc-access-service/src/presentation/http/v1/diagnosis/dto/create.request-dto.ts @@ -0,0 +1,25 @@ +import { IsObjectId } from '@diut/nest-core' +import { ApiProperty } from '@nestjs/swagger' +import { Expose } from 'class-transformer' +import { IsNotEmpty, IsNumber, IsString, Min } from 'class-validator' + +import { exampleDiagnosis } from 'src/domain' + +export class DiagnosisCreateRequestDto { + @Expose() + @ApiProperty(exampleDiagnosis.displayIndex) + @IsNumber() + @Min(1) + displayIndex: number + + @Expose() + @ApiProperty(exampleDiagnosis.name) + @IsString() + @IsNotEmpty() + name: string + + @Expose() + @ApiProperty(exampleDiagnosis.branchId) + @IsObjectId() + branchId: string +} diff --git a/apps/hcdc-access-service/src/presentation/http/v1/diagnosis/dto/response-dto.ts b/apps/hcdc-access-service/src/presentation/http/v1/diagnosis/dto/response-dto.ts new file mode 100644 index 00000000..e9436bd5 --- /dev/null +++ b/apps/hcdc-access-service/src/presentation/http/v1/diagnosis/dto/response-dto.ts @@ -0,0 +1,19 @@ +import { ApiProperty, IntersectionType } from '@nestjs/swagger' +import { BaseResourceResponseDto } from '@diut/nest-core' +import { Expose, Type } from 'class-transformer' +import { ValidateNested } from 'class-validator' + +import { DiagnosisCreateRequestDto } from './create.request-dto' +import { Branch, exampleDiagnosis } from 'src/domain' +import { BranchResponseDto } from '../../branch/dto/response-dto' + +export class DiagnosisResponseDto extends IntersectionType( + BaseResourceResponseDto, + DiagnosisCreateRequestDto, +) { + @Expose() + @ApiProperty({ ...exampleDiagnosis.branch, type: () => BranchResponseDto }) + @ValidateNested({ each: true }) + @Type(() => BranchResponseDto) + branch?: Branch +} diff --git a/apps/hcdc-access-service/src/presentation/http/v1/diagnosis/dto/search.request-dto.ts b/apps/hcdc-access-service/src/presentation/http/v1/diagnosis/dto/search.request-dto.ts new file mode 100644 index 00000000..ef0ec3f7 --- /dev/null +++ b/apps/hcdc-access-service/src/presentation/http/v1/diagnosis/dto/search.request-dto.ts @@ -0,0 +1,5 @@ +import { SearchRequestDto } from '@diut/nest-core' + +import { Diagnosis } from 'src/domain' + +export class DiagnosisSearchRequestDto extends SearchRequestDto {} diff --git a/apps/hcdc-access-service/src/presentation/http/v1/diagnosis/dto/search.response-dto.ts b/apps/hcdc-access-service/src/presentation/http/v1/diagnosis/dto/search.response-dto.ts new file mode 100644 index 00000000..d685eb7b --- /dev/null +++ b/apps/hcdc-access-service/src/presentation/http/v1/diagnosis/dto/search.response-dto.ts @@ -0,0 +1,7 @@ +import { PaginatedResponse } from '@diut/nest-core' + +import { DiagnosisResponseDto } from './response-dto' + +export class DiagnosisSearchResponseDto extends PaginatedResponse( + DiagnosisResponseDto, +) {} diff --git a/apps/hcdc-access-service/src/presentation/http/v1/diagnosis/dto/update.request-dto.ts b/apps/hcdc-access-service/src/presentation/http/v1/diagnosis/dto/update.request-dto.ts new file mode 100644 index 00000000..9923094c --- /dev/null +++ b/apps/hcdc-access-service/src/presentation/http/v1/diagnosis/dto/update.request-dto.ts @@ -0,0 +1,7 @@ +import { PartialType } from '@nestjs/swagger' + +import { DiagnosisCreateRequestDto } from './create.request-dto' + +export class DiagnosisUpdateRequestDto extends PartialType( + DiagnosisCreateRequestDto, +) {} diff --git a/apps/hcdc-access-service/src/presentation/http/v1/diagnosis/routes.ts b/apps/hcdc-access-service/src/presentation/http/v1/diagnosis/routes.ts new file mode 100644 index 00000000..1ded5e86 --- /dev/null +++ b/apps/hcdc-access-service/src/presentation/http/v1/diagnosis/routes.ts @@ -0,0 +1,73 @@ +import { HttpStatus, RequestMethod } from '@nestjs/common' +import { CustomHttpRouteOptions } from '@diut/nest-core' + +import { DiagnosisSearchResponseDto } from './dto/search.response-dto' +import { DiagnosisResponseDto } from './dto/response-dto' + +export const diagnosisRoutes = { + search: { + path: 'search', + method: RequestMethod.POST, + code: HttpStatus.OK, + serialize: DiagnosisSearchResponseDto, + openApi: { + responses: [ + { + type: DiagnosisSearchResponseDto, + }, + ], + }, + }, + + create: { + method: RequestMethod.POST, + serialize: DiagnosisResponseDto, + openApi: { + responses: [ + { + type: DiagnosisResponseDto, + status: HttpStatus.CREATED, + }, + ], + }, + }, + + updateById: { + path: ':id', + method: RequestMethod.PATCH, + serialize: DiagnosisResponseDto, + openApi: { + responses: [ + { + type: DiagnosisResponseDto, + }, + ], + }, + }, + + findById: { + path: ':id', + method: RequestMethod.GET, + serialize: DiagnosisResponseDto, + openApi: { + responses: [ + { + type: DiagnosisResponseDto, + }, + ], + }, + }, + + deleteById: { + path: ':id', + method: RequestMethod.DELETE, + serialize: DiagnosisResponseDto, + openApi: { + responses: [ + { + type: DiagnosisResponseDto, + }, + ], + }, + }, +} satisfies Record diff --git a/apps/hcdc-access-service/src/presentation/http/v1/module.ts b/apps/hcdc-access-service/src/presentation/http/v1/module.ts index cdd29c44..5df9b301 100644 --- a/apps/hcdc-access-service/src/presentation/http/v1/module.ts +++ b/apps/hcdc-access-service/src/presentation/http/v1/module.ts @@ -9,10 +9,14 @@ import { TestCategoryController } from './test-category/controller' import { InstrumentController } from './instrument/controller' import { SampleTypeController } from './sample-type/controller' import { DoctorController } from './doctor/controller' +import { PatientTypeController } from './patient-type/controller' +import { DiagnosisController } from './diagnosis/controller' export const httpControllerV1Metadata: ModuleMetadata = { controllers: [ BioProductController, + PatientTypeController, + DiagnosisController, DoctorController, InstrumentController, SampleTypeController, diff --git a/apps/hcdc-access-service/src/presentation/http/v1/patient-type/controller.ts b/apps/hcdc-access-service/src/presentation/http/v1/patient-type/controller.ts new file mode 100644 index 00000000..3f71696b --- /dev/null +++ b/apps/hcdc-access-service/src/presentation/http/v1/patient-type/controller.ts @@ -0,0 +1,66 @@ +import { Body, Param } from '@nestjs/common' +import { ObjectIdPipe } from '@diut/nest-core' + +import { patientTypeRoutes } from './routes' +import { + PatientTypeCreateUseCase, + PatientTypeDeleteUseCase, + PatientTypeSearchUseCase, + PatientTypeUpdateUseCase, + PatientTypeFindOneUseCase, + EEntityNotFound, +} from 'src/domain' +import { PatientTypeCreateRequestDto } from './dto/create.request-dto' +import { PatientTypeUpdateRequestDto } from './dto/update.request-dto' +import { PatientTypeSearchRequestDto } from './dto/search.request-dto' +import { HttpController, HttpRoute } from '../../common' + +@HttpController({ + basePath: 'v1/patient-types', +}) +export class PatientTypeController { + constructor( + private readonly patientTypeCreateUseCase: PatientTypeCreateUseCase, + private readonly patientTypeUpdateUseCase: PatientTypeUpdateUseCase, + private readonly patientTypeDeleteUseCase: PatientTypeDeleteUseCase, + private readonly patientTypeSearchUseCase: PatientTypeSearchUseCase, + private readonly patientTypeFindOneUseCase: PatientTypeFindOneUseCase, + ) {} + + @HttpRoute(patientTypeRoutes.search) + search(@Body() body: PatientTypeSearchRequestDto) { + return this.patientTypeSearchUseCase.execute(body) + } + + @HttpRoute(patientTypeRoutes.create) + create(@Body() body: PatientTypeCreateRequestDto) { + return this.patientTypeCreateUseCase.execute(body) + } + + @HttpRoute(patientTypeRoutes.findById) + async findById(@Param('id', ObjectIdPipe) id: string) { + const rv = await this.patientTypeFindOneUseCase.execute({ + filter: { _id: id }, + populates: [{ path: 'branch' }], + }) + + if (rv === null) { + throw new EEntityNotFound(`PatientType id=${id}`) + } + + return rv + } + + @HttpRoute(patientTypeRoutes.updateById) + updateById( + @Param('id', ObjectIdPipe) id: string, + @Body() body: PatientTypeUpdateRequestDto, + ) { + return this.patientTypeUpdateUseCase.execute({ _id: id }, body) + } + + @HttpRoute(patientTypeRoutes.deleteById) + deleteById(@Param('id', ObjectIdPipe) id: string) { + return this.patientTypeDeleteUseCase.execute({ id }) + } +} diff --git a/apps/hcdc-access-service/src/presentation/http/v1/patient-type/dto/create.request-dto.ts b/apps/hcdc-access-service/src/presentation/http/v1/patient-type/dto/create.request-dto.ts new file mode 100644 index 00000000..71321b34 --- /dev/null +++ b/apps/hcdc-access-service/src/presentation/http/v1/patient-type/dto/create.request-dto.ts @@ -0,0 +1,25 @@ +import { IsObjectId } from '@diut/nest-core' +import { ApiProperty } from '@nestjs/swagger' +import { Expose } from 'class-transformer' +import { IsNotEmpty, IsNumber, IsString, Min } from 'class-validator' + +import { examplePatientType } from 'src/domain' + +export class PatientTypeCreateRequestDto { + @Expose() + @ApiProperty(examplePatientType.displayIndex) + @IsNumber() + @Min(1) + displayIndex: number + + @Expose() + @ApiProperty(examplePatientType.name) + @IsString() + @IsNotEmpty() + name: string + + @Expose() + @ApiProperty(examplePatientType.branchId) + @IsObjectId() + branchId: string +} diff --git a/apps/hcdc-access-service/src/presentation/http/v1/patient-type/dto/response-dto.ts b/apps/hcdc-access-service/src/presentation/http/v1/patient-type/dto/response-dto.ts new file mode 100644 index 00000000..0fca4335 --- /dev/null +++ b/apps/hcdc-access-service/src/presentation/http/v1/patient-type/dto/response-dto.ts @@ -0,0 +1,19 @@ +import { ApiProperty, IntersectionType } from '@nestjs/swagger' +import { BaseResourceResponseDto } from '@diut/nest-core' +import { Expose, Type } from 'class-transformer' +import { ValidateNested } from 'class-validator' + +import { PatientTypeCreateRequestDto } from './create.request-dto' +import { Branch, examplePatientType } from 'src/domain' +import { BranchResponseDto } from '../../branch/dto/response-dto' + +export class PatientTypeResponseDto extends IntersectionType( + BaseResourceResponseDto, + PatientTypeCreateRequestDto, +) { + @Expose() + @ApiProperty({ ...examplePatientType.branch, type: () => BranchResponseDto }) + @ValidateNested({ each: true }) + @Type(() => BranchResponseDto) + branch?: Branch +} diff --git a/apps/hcdc-access-service/src/presentation/http/v1/patient-type/dto/search.request-dto.ts b/apps/hcdc-access-service/src/presentation/http/v1/patient-type/dto/search.request-dto.ts new file mode 100644 index 00000000..467a394e --- /dev/null +++ b/apps/hcdc-access-service/src/presentation/http/v1/patient-type/dto/search.request-dto.ts @@ -0,0 +1,5 @@ +import { SearchRequestDto } from '@diut/nest-core' + +import { PatientType } from 'src/domain' + +export class PatientTypeSearchRequestDto extends SearchRequestDto {} diff --git a/apps/hcdc-access-service/src/presentation/http/v1/patient-type/dto/search.response-dto.ts b/apps/hcdc-access-service/src/presentation/http/v1/patient-type/dto/search.response-dto.ts new file mode 100644 index 00000000..fc0df83f --- /dev/null +++ b/apps/hcdc-access-service/src/presentation/http/v1/patient-type/dto/search.response-dto.ts @@ -0,0 +1,7 @@ +import { PaginatedResponse } from '@diut/nest-core' + +import { PatientTypeResponseDto } from './response-dto' + +export class PatientTypeSearchResponseDto extends PaginatedResponse( + PatientTypeResponseDto, +) {} diff --git a/apps/hcdc-access-service/src/presentation/http/v1/patient-type/dto/update.request-dto.ts b/apps/hcdc-access-service/src/presentation/http/v1/patient-type/dto/update.request-dto.ts new file mode 100644 index 00000000..650f4f30 --- /dev/null +++ b/apps/hcdc-access-service/src/presentation/http/v1/patient-type/dto/update.request-dto.ts @@ -0,0 +1,7 @@ +import { PartialType } from '@nestjs/swagger' + +import { PatientTypeCreateRequestDto } from './create.request-dto' + +export class PatientTypeUpdateRequestDto extends PartialType( + PatientTypeCreateRequestDto, +) {} diff --git a/resources/patient-types/patient-type.routes.ts b/apps/hcdc-access-service/src/presentation/http/v1/patient-type/routes.ts similarity index 58% rename from resources/patient-types/patient-type.routes.ts rename to apps/hcdc-access-service/src/presentation/http/v1/patient-type/routes.ts index 1d3150f9..9548bb1b 100644 --- a/resources/patient-types/patient-type.routes.ts +++ b/apps/hcdc-access-service/src/presentation/http/v1/patient-type/routes.ts @@ -1,32 +1,25 @@ -import { Permission } from '@diut/hcdc-common' import { HttpStatus, RequestMethod } from '@nestjs/common' +import { CustomHttpRouteOptions } from '@diut/nest-core' -import { AppControllerOptions } from '@diut/nest-core' -import { AppRouteOptions } from 'src/common/route.decorator' -import { SearchPatientTypeResponseDto } from './dtos/search-patient-type.response-dto' -import { PatientTypeResponseDto } from './dtos/patient-type.response-dto' +import { PatientTypeSearchResponseDto } from './dto/search.response-dto' +import { PatientTypeResponseDto } from './dto/response-dto' export const patientTypeRoutes = { - controller: { - basePath: 'patient-types', - }, - - search: { + search: { path: 'search', method: RequestMethod.POST, code: HttpStatus.OK, - serialize: SearchPatientTypeResponseDto, + serialize: PatientTypeSearchResponseDto, openApi: { responses: [ { - type: SearchPatientTypeResponseDto, + type: PatientTypeSearchResponseDto, }, ], }, }, - create: { - permissionAnyOf: [Permission.Admin], + create: { method: RequestMethod.POST, serialize: PatientTypeResponseDto, openApi: { @@ -39,8 +32,7 @@ export const patientTypeRoutes = { }, }, - updateById: { - permissionAnyOf: [Permission.Admin], + updateById: { path: ':id', method: RequestMethod.PATCH, serialize: PatientTypeResponseDto, @@ -53,7 +45,7 @@ export const patientTypeRoutes = { }, }, - findById: { + findById: { path: ':id', method: RequestMethod.GET, serialize: PatientTypeResponseDto, @@ -66,8 +58,7 @@ export const patientTypeRoutes = { }, }, - deleteById: { - permissionAnyOf: [Permission.Admin], + deleteById: { path: ':id', method: RequestMethod.DELETE, serialize: PatientTypeResponseDto, @@ -79,4 +70,4 @@ export const patientTypeRoutes = { ], }, }, -} +} satisfies Record diff --git a/resources/indications/dtos/create-indication.request-dto.ts b/resources/indications/dtos/create-indication.request-dto.ts deleted file mode 100644 index 26180c34..00000000 --- a/resources/indications/dtos/create-indication.request-dto.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { ApiProperty } from '@nestjs/swagger' -import { IsNotEmpty, IsNumber, IsString, Min } from 'class-validator' - -export class CreateIndicationRequestDto { - @ApiProperty({ - example: 'Kiểm tra sức khỏe', - }) - @IsString() - @IsNotEmpty() - name: string - - @ApiProperty({ - example: 2, - }) - @IsNumber() - @Min(1) - index: number -} diff --git a/resources/indications/dtos/indication.response-dto.ts b/resources/indications/dtos/indication.response-dto.ts deleted file mode 100644 index 9b302125..00000000 --- a/resources/indications/dtos/indication.response-dto.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { ApiProperty } from '@nestjs/swagger' -import { Expose } from 'class-transformer' -import { IsNotEmpty, IsNumber, IsString, Min } from 'class-validator' - -import { BaseResourceResponseDto } from '@diut/nest-core' - -export class IndicationResponseDto extends BaseResourceResponseDto { - @Expose() - @ApiProperty({ - example: 'Kiểm tra sức khỏe', - }) - @IsString() - @IsNotEmpty() - name: string - - @Expose() - @ApiProperty({ - example: 2, - }) - @IsNumber() - @Min(1) - index: number -} diff --git a/resources/indications/dtos/search-indication.request-dto.ts b/resources/indications/dtos/search-indication.request-dto.ts deleted file mode 100644 index 67cc97af..00000000 --- a/resources/indications/dtos/search-indication.request-dto.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { SearchRequestDto } from '@diut/nest-core' -import { Indication } from '../indication.schema' - -export class SearchIndicationRequestDto extends SearchRequestDto {} diff --git a/resources/indications/dtos/search-indication.response-dto.ts b/resources/indications/dtos/search-indication.response-dto.ts deleted file mode 100644 index 320112cf..00000000 --- a/resources/indications/dtos/search-indication.response-dto.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { PaginatedResponse } from '@diut/nest-core' -import { IndicationResponseDto } from './indication.response-dto' - -export class SearchIndicationResponseDto extends PaginatedResponse( - IndicationResponseDto, -) {} diff --git a/resources/indications/dtos/update-indication.request-dto.ts b/resources/indications/dtos/update-indication.request-dto.ts deleted file mode 100644 index 18d487f4..00000000 --- a/resources/indications/dtos/update-indication.request-dto.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { PartialType } from '@nestjs/swagger' - -import { CreateIndicationRequestDto } from './create-indication.request-dto' - -export class UpdateIndicationRequestDto extends PartialType( - CreateIndicationRequestDto, -) {} diff --git a/resources/indications/indication.controller.ts b/resources/indications/indication.controller.ts deleted file mode 100644 index 67f6eba8..00000000 --- a/resources/indications/indication.controller.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { Body, Logger, Param } from '@nestjs/common' -import { AppController, ObjectIdPipe } from '@diut/nest-core' - -import { AppRoute } from 'src/common/route.decorator' -import { CreateIndicationRequestDto } from './dtos/create-indication.request-dto' -import { SearchIndicationRequestDto } from './dtos/search-indication.request-dto' -import { UpdateIndicationRequestDto } from './dtos/update-indication.request-dto' -import { indicationRoutes } from './indication.routes' -import { IndicationService } from './indication.service' - -@AppController(indicationRoutes.controller) -export class IndicationController { - private logger: Logger - - constructor(private indicationService: IndicationService) { - this.logger = new Logger(IndicationController.name) - } - - @AppRoute(indicationRoutes.search) - search(@Body() body: SearchIndicationRequestDto) { - return this.indicationService.search(body) - } - - @AppRoute(indicationRoutes.create) - create(@Body() body: CreateIndicationRequestDto) { - return this.indicationService.create(body) - } - - @AppRoute(indicationRoutes.updateById) - updateById( - @Param('id', ObjectIdPipe) id: string, - @Body() body: UpdateIndicationRequestDto, - ) { - return this.indicationService.updateById(id, body) - } - - @AppRoute(indicationRoutes.findById) - findById(@Param('id', ObjectIdPipe) id: string) { - return this.indicationService.findById(id) - } - - @AppRoute(indicationRoutes.deleteById) - deleteById(@Param('id', ObjectIdPipe) id: string) { - return this.indicationService.deleteById(id) - } -} diff --git a/resources/indications/indication.module.ts b/resources/indications/indication.module.ts deleted file mode 100644 index 6d030ddc..00000000 --- a/resources/indications/indication.module.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { Module } from '@nestjs/common' - -import { MongoModule } from '@diut/nest-core' -import { IndicationController } from './indication.controller' -import { Indication } from './indication.schema' -import { IndicationService } from './indication.service' - -@Module({ - imports: [MongoModule.forFeature(Indication)], - providers: [IndicationService], - controllers: [IndicationController], - exports: [IndicationService], -}) -export class IndicationModule {} diff --git a/resources/indications/indication.routes.ts b/resources/indications/indication.routes.ts deleted file mode 100644 index af1b52b3..00000000 --- a/resources/indications/indication.routes.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { Permission } from '@diut/hcdc-common' -import { HttpStatus, RequestMethod } from '@nestjs/common' - -import { AppControllerOptions } from '@diut/nest-core' -import { AppRouteOptions } from 'src/common/route.decorator' -import { SearchIndicationResponseDto } from './dtos/search-indication.response-dto' -import { IndicationResponseDto } from './dtos/indication.response-dto' - -export const indicationRoutes = { - controller: { - basePath: 'indications', - }, - - search: { - path: 'search', - method: RequestMethod.POST, - code: HttpStatus.OK, - serialize: SearchIndicationResponseDto, - openApi: { - responses: [ - { - type: SearchIndicationResponseDto, - }, - ], - }, - }, - - create: { - permissionAnyOf: [Permission.Admin], - method: RequestMethod.POST, - serialize: IndicationResponseDto, - openApi: { - responses: [ - { - type: IndicationResponseDto, - status: HttpStatus.CREATED, - }, - ], - }, - }, - - updateById: { - permissionAnyOf: [Permission.Admin], - path: ':id', - method: RequestMethod.PATCH, - serialize: IndicationResponseDto, - openApi: { - responses: [ - { - type: IndicationResponseDto, - }, - ], - }, - }, - - findById: { - path: ':id', - method: RequestMethod.GET, - serialize: IndicationResponseDto, - openApi: { - responses: [ - { - type: IndicationResponseDto, - }, - ], - }, - }, - - deleteById: { - permissionAnyOf: [Permission.Admin], - path: ':id', - method: RequestMethod.DELETE, - serialize: IndicationResponseDto, - openApi: { - responses: [ - { - type: IndicationResponseDto, - }, - ], - }, - }, -} diff --git a/resources/indications/indication.schema.ts b/resources/indications/indication.schema.ts deleted file mode 100644 index 7acc54f4..00000000 --- a/resources/indications/indication.schema.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { Prop, Schema } from '@nestjs/mongoose' - -import { BaseSchema, baseSchemaOptions } from '@diut/nest-core' -import { COLLECTION } from 'src/infrastructure/mongo/collections' - -@Schema({ - ...baseSchemaOptions, - collection: COLLECTION.INDICATION, -}) -export class Indication extends BaseSchema { - @Prop({ required: true }) - name: string - - @Prop({ required: true }) - index: number -} diff --git a/resources/indications/indication.service.ts b/resources/indications/indication.service.ts deleted file mode 100644 index 03a59d2b..00000000 --- a/resources/indications/indication.service.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { Injectable, Logger } from '@nestjs/common' -import { InjectModel } from '@nestjs/mongoose' -import { Model } from 'mongoose' - -import { MongoRepository } from '@diut/nest-core' -import { Indication } from './indication.schema' - -@Injectable() -export class IndicationService extends MongoRepository { - constructor(@InjectModel(Indication.name) model: Model) { - super(model) - } -} diff --git a/resources/patient-types/dtos/create-patient-type.request-dto.ts b/resources/patient-types/dtos/create-patient-type.request-dto.ts deleted file mode 100644 index b365e40f..00000000 --- a/resources/patient-types/dtos/create-patient-type.request-dto.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { ApiProperty } from '@nestjs/swagger' -import { IsNotEmpty, IsNumber, IsString, Min } from 'class-validator' - -export class CreatePatientTypeRequestDto { - @ApiProperty({ - example: 'Bảo hiểm y tế', - }) - @IsString() - @IsNotEmpty() - name: string - - @ApiProperty({ - example: 2, - }) - @IsNumber() - @Min(1) - index: number -} diff --git a/resources/patient-types/dtos/patient-type.response-dto.ts b/resources/patient-types/dtos/patient-type.response-dto.ts deleted file mode 100644 index b7ccb11b..00000000 --- a/resources/patient-types/dtos/patient-type.response-dto.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { ApiProperty } from '@nestjs/swagger' -import { Expose } from 'class-transformer' -import { IsNotEmpty, IsNumber, IsString, Min } from 'class-validator' - -import { BaseResourceResponseDto } from '@diut/nest-core' - -export class PatientTypeResponseDto extends BaseResourceResponseDto { - @Expose() - @ApiProperty({ - example: 'Bảo hiểm y tế', - }) - @IsString() - @IsNotEmpty() - name: string - - @Expose() - @ApiProperty({ - example: 2, - }) - @IsNumber() - @Min(1) - index: number -} diff --git a/resources/patient-types/dtos/search-patient-type.request-dto.ts b/resources/patient-types/dtos/search-patient-type.request-dto.ts deleted file mode 100644 index 34acd9bd..00000000 --- a/resources/patient-types/dtos/search-patient-type.request-dto.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { SearchRequestDto } from '@diut/nest-core' -import { PatientType } from '../patient-type.schema' - -export class SearchPatientTypeRequestDto extends SearchRequestDto {} diff --git a/resources/patient-types/dtos/search-patient-type.response-dto.ts b/resources/patient-types/dtos/search-patient-type.response-dto.ts deleted file mode 100644 index c364561f..00000000 --- a/resources/patient-types/dtos/search-patient-type.response-dto.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { PaginatedResponse } from '@diut/nest-core' -import { PatientTypeResponseDto } from './patient-type.response-dto' - -export class SearchPatientTypeResponseDto extends PaginatedResponse( - PatientTypeResponseDto, -) {} diff --git a/resources/patient-types/dtos/update-patient-type.request-dto.ts b/resources/patient-types/dtos/update-patient-type.request-dto.ts deleted file mode 100644 index 9305413b..00000000 --- a/resources/patient-types/dtos/update-patient-type.request-dto.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { PartialType } from '@nestjs/swagger' - -import { CreatePatientTypeRequestDto } from './create-patient-type.request-dto' - -export class UpdatePatientTypeRequestDto extends PartialType( - CreatePatientTypeRequestDto, -) {} diff --git a/resources/patient-types/patient-type.controller.ts b/resources/patient-types/patient-type.controller.ts deleted file mode 100644 index 90c9a02f..00000000 --- a/resources/patient-types/patient-type.controller.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { Body, Logger, Param } from '@nestjs/common' -import { AppController, ObjectIdPipe } from '@diut/nest-core' - -import { AppRoute } from 'src/common/route.decorator' -import { CreatePatientTypeRequestDto } from './dtos/create-patient-type.request-dto' -import { SearchPatientTypeRequestDto } from './dtos/search-patient-type.request-dto' -import { UpdatePatientTypeRequestDto } from './dtos/update-patient-type.request-dto' -import { patientTypeRoutes } from './patient-type.routes' -import { PatientTypeService } from './patient-type.service' - -@AppController(patientTypeRoutes.controller) -export class PatientTypeController { - private logger: Logger - - constructor(private patientTypeService: PatientTypeService) { - this.logger = new Logger(PatientTypeController.name) - } - - @AppRoute(patientTypeRoutes.search) - search(@Body() body: SearchPatientTypeRequestDto) { - return this.patientTypeService.search(body) - } - - @AppRoute(patientTypeRoutes.create) - create(@Body() body: CreatePatientTypeRequestDto) { - return this.patientTypeService.create(body) - } - - @AppRoute(patientTypeRoutes.updateById) - updateById( - @Param('id', ObjectIdPipe) id: string, - @Body() body: UpdatePatientTypeRequestDto, - ) { - return this.patientTypeService.updateById(id, body) - } - - @AppRoute(patientTypeRoutes.findById) - findById(@Param('id', ObjectIdPipe) id: string) { - return this.patientTypeService.findById(id) - } - - @AppRoute(patientTypeRoutes.deleteById) - deleteById(@Param('id', ObjectIdPipe) id: string) { - return this.patientTypeService.deleteById(id) - } -} diff --git a/resources/patient-types/patient-type.module.ts b/resources/patient-types/patient-type.module.ts deleted file mode 100644 index 926400ee..00000000 --- a/resources/patient-types/patient-type.module.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { Module } from '@nestjs/common' -import { MongoModule } from '@diut/nest-core' - -import { PatientTypeController } from './patient-type.controller' -import { PatientType } from './patient-type.schema' -import { PatientTypeService } from './patient-type.service' - -@Module({ - imports: [MongoModule.forFeature(PatientType)], - providers: [PatientTypeService], - controllers: [PatientTypeController], - exports: [PatientTypeService], -}) -export class PatientTypeModule {} diff --git a/resources/patient-types/patient-type.schema.ts b/resources/patient-types/patient-type.schema.ts deleted file mode 100644 index 695db51e..00000000 --- a/resources/patient-types/patient-type.schema.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { Prop, Schema } from '@nestjs/mongoose' - -import { BaseSchema, baseSchemaOptions } from '@diut/nest-core' -import { COLLECTION } from 'src/infrastructure/mongo/collections' - -@Schema({ - ...baseSchemaOptions, - collection: COLLECTION.PATIENT_TYPE, -}) -export class PatientType extends BaseSchema { - @Prop({ required: true }) - name: string - - @Prop({ required: true }) - index: number -} diff --git a/resources/patient-types/patient-type.service.ts b/resources/patient-types/patient-type.service.ts deleted file mode 100644 index 0ead6d14..00000000 --- a/resources/patient-types/patient-type.service.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { Injectable } from '@nestjs/common' -import { InjectModel } from '@nestjs/mongoose' -import { Model } from 'mongoose' - -import { MongoRepository } from '@diut/nest-core' -import { PatientType } from './patient-type.schema' - -@Injectable() -export class PatientTypeService extends MongoRepository { - constructor(@InjectModel(PatientType.name) model: Model) { - super(model) - } -}