diff --git a/src/application/controllers/pets/load-pet-by-id.ts b/src/application/controllers/pets/load-pet-by-id.ts index 72326059..89994271 100644 --- a/src/application/controllers/pets/load-pet-by-id.ts +++ b/src/application/controllers/pets/load-pet-by-id.ts @@ -14,7 +14,7 @@ export class LoadPetByIdController implements Controller { const { petId } = httpRequest.params const result = await this.loadPet.loadById({ petId }) if (!result.isSuccess) { - return badRequest(result.error as Error) + return badRequest(result.error) } return success(result.data) } catch (error) { diff --git a/src/application/controllers/pets/pet-registry.ts b/src/application/controllers/pets/pet-registry.ts index f5dff47f..1dd524ea 100644 --- a/src/application/controllers/pets/pet-registry.ts +++ b/src/application/controllers/pets/pet-registry.ts @@ -36,21 +36,21 @@ export class PetRegistryController implements Controller { image }) if (!result.isSuccess) { - return notAcceptable(result.error as Error) + return notAcceptable(result.error) } return create({ - id: result.data?.id, - guardian: result.data?.guardian, - specie: result.data?.specie, - specieAlias: result.data?.specieAlias, - petName: result.data?.petName, - gender: result.data?.gender, - breed: result.data?.breed, - breedAlias: result.data?.breedAlias, - size: result.data?.size, - castrated: result.data?.castrated, - dateOfBirth: result.data?.dateOfBirth, - image: result.data?.image + id: result.data.id, + guardian: result.data.guardian, + specie: result.data.specie, + specieAlias: result.data.specieAlias, + petName: result.data.petName, + gender: result.data.gender, + breed: result.data.breed, + breedAlias: result.data.breedAlias, + size: result.data.size, + castrated: result.data.castrated, + dateOfBirth: result.data.dateOfBirth, + image: result.data.image }) } catch (error) { return serverError(error as Error) diff --git a/src/application/controllers/pets/update-pet.ts b/src/application/controllers/pets/update-pet.ts index e148288b..78f482dd 100644 --- a/src/application/controllers/pets/update-pet.ts +++ b/src/application/controllers/pets/update-pet.ts @@ -25,7 +25,7 @@ export class UpdatePetController implements Controller { } const result = await this.updatePet.update(updateData) if (!result.isSuccess) { - return notAcceptable(result.error as Error) + return notAcceptable(result.error) } return success({ id: result.data?.id, diff --git a/src/application/controllers/scheduler/create-scheduler.ts b/src/application/controllers/scheduler/create-scheduler.ts index eaff20ea..16061df9 100644 --- a/src/application/controllers/scheduler/create-scheduler.ts +++ b/src/application/controllers/scheduler/create-scheduler.ts @@ -33,7 +33,7 @@ export class CreateSchedulerController implements Controller { pets }) if (!result.isSuccess) { - return notAcceptable(result.error as Error) + return notAcceptable(result.error) } return create({ id: result.data?.id, diff --git a/src/application/controllers/scheduler/tag/add-tag.ts b/src/application/controllers/scheduler/tag/add-tag.ts index 1f4b5527..5e67d958 100644 --- a/src/application/controllers/scheduler/tag/add-tag.ts +++ b/src/application/controllers/scheduler/tag/add-tag.ts @@ -21,7 +21,7 @@ export class AddTagController implements Controller { const guardianId = httpRequest.userId as string const result = await this.addTag.add({ guardianId, name, color }) if (!result.isSuccess) { - return notAcceptable(result.error as Error) + return notAcceptable(result.error) } return create({ id: result.data?.id, diff --git a/src/application/controllers/scheduler/tag/delete-tag-by-id.ts b/src/application/controllers/scheduler/tag/delete-tag-by-id.ts index 56db7f0d..ac0da576 100644 --- a/src/application/controllers/scheduler/tag/delete-tag-by-id.ts +++ b/src/application/controllers/scheduler/tag/delete-tag-by-id.ts @@ -14,7 +14,7 @@ export class DeleteTagByIdController implements Controller { const { tagId } = httpRequest.params const result = await this.deleteTag.deleteById(tagId) if (!result.isSuccess) { - return notAcceptable(result.error as Error) + return notAcceptable(result.error) } return success({ message: 'Tag deleted', diff --git a/src/application/controllers/scheduler/tag/update-tag.ts b/src/application/controllers/scheduler/tag/update-tag.ts index 1d521d48..3d2d8117 100644 --- a/src/application/controllers/scheduler/tag/update-tag.ts +++ b/src/application/controllers/scheduler/tag/update-tag.ts @@ -21,7 +21,7 @@ export class UpdateTagController implements Controller { const { name } = httpRequest.body const result = await this.updateTag.update({ id: tagId, name }) if (!result.isSuccess) { - return notAcceptable(result.error as Error) + return notAcceptable(result.error) } return success(result) } catch (error) { diff --git a/src/application/controllers/settings/update-settings.ts b/src/application/controllers/settings/update-settings.ts index 805cf8b5..da0d06d1 100644 --- a/src/application/controllers/settings/update-settings.ts +++ b/src/application/controllers/settings/update-settings.ts @@ -21,7 +21,7 @@ export class UpdateSettingsController implements Controller { const updateData = { ...httpRequest.body, guardianId } const result = await this.updateSettings.update(updateData) if (!result.isSuccess) { - return notAcceptable(result.error as Error) + return notAcceptable(result.error) } return success({ guardianId: result.data?.guardianId, diff --git a/src/application/controllers/tasks/load-next-tasks-by-petId-and-tagId-controller.ts b/src/application/controllers/tasks/load-next-tasks-by-petId-and-tagId-controller.ts index a264ebae..350c0109 100644 --- a/src/application/controllers/tasks/load-next-tasks-by-petId-and-tagId-controller.ts +++ b/src/application/controllers/tasks/load-next-tasks-by-petId-and-tagId-controller.ts @@ -32,7 +32,7 @@ export class LoadNextTaskByPetIdAndTagIdController implements Controller { }) if (!result.isSuccess) { - return badRequest(result.error as Error) + return badRequest(result.error) } return success({ diff --git a/src/data/protocols/service/events-generator.ts b/src/data/protocols/service/events-generator.ts index 6e4f8dd2..ae17a514 100644 --- a/src/data/protocols/service/events-generator.ts +++ b/src/data/protocols/service/events-generator.ts @@ -1,3 +1,4 @@ +import { type ResultResponse } from '@/domain/types/result' import { type AddEventRepository, type LoadEventByDateRepository } from '../db' import { type AddManyEventsRepository } from '../db/event/add-many-events-repository' @@ -15,19 +16,13 @@ export namespace EventsGenerator { daily: boolean | undefined } - export type Result = { - isSuccess: boolean - error?: Error - data?: Array<{ - schedulerId: string - start: Date - end: Date - }> | { - schedulerId: string - start: Date - end: Date - } + type Data = { + schedulerId: string + start: Date + end: Date } + + export type Result = ResultResponse export type Dependencies = { eventRepository: AddEventRepository & LoadEventByDateRepository & AddManyEventsRepository } diff --git a/src/data/use-cases/pet/db-add-pet.ts b/src/data/use-cases/pet/db-add-pet.ts index 8b28cca2..8d36c32b 100644 --- a/src/data/use-cases/pet/db-add-pet.ts +++ b/src/data/use-cases/pet/db-add-pet.ts @@ -1,12 +1,5 @@ import { NotAcceptableError } from '@/application/errors' import { type FileStorage, type AddPetRepository, type LoadGuardianByIdRepository, type UpdatePetRepository } from '@/data/protocols' -import { - type PetGender, - type Guardian, - type Specie, - type Breed, - type Size -} from '@/domain/models' import { type AddPet, type AppointPet @@ -58,26 +51,32 @@ export class DbAddPet implements AddPet { const { petName, gender, dateOfBirth } = petData const pet = await this.petRepository.add({ guardianId: guardian.id, - specieId: appointResult.data?.specie.id as string, - specieAlias: appointResult.data?.specieAlias, + specieId: appointResult.data.specie.id, + specieAlias: appointResult.data.specieAlias, petName, gender, - breedId: appointResult.data?.breed.id as string, - breedAlias: appointResult.data?.breedAlias as string, - sizeId: appointResult.data?.size.id as string, - castrated: appointResult.data?.castrated as boolean, + breedId: appointResult.data.breed.id, + breedAlias: appointResult.data.breedAlias, + sizeId: appointResult.data.size.id, + castrated: appointResult.data.castrated, dateOfBirth }) + if (!pet) { + return { + isSuccess: false, + error: new NotAcceptableError('petData') + } + } let imageUrl: string = '' if (petData.image) { - imageUrl = await this.fileStorage.save({ file: petData.image, fileName: `images/pet-${pet?.id as string}` }) + imageUrl = await this.fileStorage.save({ file: petData.image, fileName: `images/pet-${pet.id}` }) } if (imageUrl) { await this.petRepository.update({ guardianId: guardian.id, - petId: pet?.id as string, + petId: pet.id, image: imageUrl }) } @@ -85,17 +84,17 @@ export class DbAddPet implements AddPet { return { isSuccess: true, data: { - id: pet?.id as string, - guardian: pet?.guardian as Guardian & { id: string }, - specie: pet?.specie as Specie & { id: string }, - specieAlias: pet?.specieAlias, - petName: pet?.petName as string, - gender: pet?.gender as PetGender, - breed: pet?.breed as Breed & { id: string }, - breedAlias: pet?.breedAlias as string, - size: pet?.size as Size & { id: string }, - castrated: pet?.castrated as boolean, - dateOfBirth: pet?.dateOfBirth as Date, + id: pet.id, + guardian: pet.guardian, + specie: pet.specie, + specieAlias: pet.specieAlias, + petName: pet.petName, + gender: pet.gender, + breed: pet.breed, + breedAlias: pet.breedAlias, + size: pet.size, + castrated: pet.castrated, + dateOfBirth: pet.dateOfBirth, image: imageUrl || this.defaultImageUrl } } diff --git a/src/data/use-cases/pet/db-appoint-pet.ts b/src/data/use-cases/pet/db-appoint-pet.ts index e91bd0fa..dcdb67fa 100644 --- a/src/data/use-cases/pet/db-appoint-pet.ts +++ b/src/data/use-cases/pet/db-appoint-pet.ts @@ -42,9 +42,9 @@ export class DbAppointPet implements AppointPet { data: { specie: specieResult.specie, specieAlias: specieResult.specieAlias, - breed: breedResult.data?.breed as Breed & { id: string }, - breedAlias: breedResult.data?.breedAlias as string, - size: sizeResult.data?.size as Size & { id: string }, + breed: breedResult.data.breed, + breedAlias: breedResult.data.breedAlias, + size: sizeResult.data.size, castrated } } @@ -146,17 +146,23 @@ type SpecieResult = { } type BreedResult = { - error?: Error - data?: { + error: Error + data?: never +} | { + error?: never + data: { breed: Breed & { id: string } - breedAlias: string | undefined + breedAlias: string specieId: string } } type SizeResult = { - error?: Error - data?: { + error: Error + data?: never +} | { + error?: never + data: { size: Size & { id: string } specieId: string } diff --git a/src/data/use-cases/pet/db-update-pet.ts b/src/data/use-cases/pet/db-update-pet.ts index f5f214bd..20fff40d 100644 --- a/src/data/use-cases/pet/db-update-pet.ts +++ b/src/data/use-cases/pet/db-update-pet.ts @@ -1,16 +1,7 @@ import { NotAcceptableError } from '@/application/errors' import { type UpdatePetRepository, type LoadGuardianByIdRepository, type LoadPetByIdRepository } from '@/data/protocols' -import { - type PetGender, - type Guardian, - type Specie, - type Breed, - type Size -} from '@/domain/models' -import { - type UpdatePet, - type AppointPet -} from '@/domain/use-cases' +import { type PetGender } from '@/domain/models' +import { type UpdatePet, type AppointPet } from '@/domain/use-cases' export class DbUpdatePet implements UpdatePet { private readonly guardianRepository: LoadGuardianByIdRepository @@ -57,31 +48,38 @@ export class DbUpdatePet implements UpdatePet { const petUpdateResult = await this.petRepository.update({ guardianId: guardian.id, petId: pet.id, - specieId: appointResult.data?.specie.id as string, - specieAlias: appointResult.data?.specieAlias, + specieId: appointResult.data.specie.id, + specieAlias: appointResult.data.specieAlias, petName: petData.petName ? petData.petName : pet.petName, gender: petData.gender ? petData.gender : pet.gender as PetGender, - breedId: appointResult.data?.breed.id as string, - breedAlias: appointResult.data?.breedAlias as string, - sizeId: appointResult.data?.size.id as string, - castrated: appointResult.data?.castrated as boolean, + breedId: appointResult.data.breed.id, + breedAlias: appointResult.data.breedAlias, + sizeId: appointResult.data.size.id, + castrated: appointResult.data.castrated, dateOfBirth: petData.dateOfBirth ? petData.dateOfBirth : pet.dateOfBirth }) + if (!petUpdateResult) { + return { + isSuccess: false, + error: new NotAcceptableError('update error') + } + } + return { isSuccess: true, data: { - id: petUpdateResult?.id as string, - guardian: petUpdateResult?.guardian as Guardian & { id: string }, - specie: petUpdateResult?.specie as Specie & { id: string }, - specieAlias: petUpdateResult?.specieAlias, - petName: petUpdateResult?.petName as string, - gender: petUpdateResult?.gender as PetGender, - breed: petUpdateResult?.breed as Breed & { id: string }, - breedAlias: petUpdateResult?.breedAlias as string, - size: petUpdateResult?.size as Size & { id: string }, - castrated: petUpdateResult?.castrated as boolean, - dateOfBirth: petUpdateResult?.dateOfBirth as Date, - image: petUpdateResult?.image as string + id: petUpdateResult.id, + guardian: petUpdateResult.guardian, + specie: petUpdateResult.specie, + specieAlias: petUpdateResult.specieAlias, + petName: petUpdateResult.petName, + gender: petUpdateResult.gender, + breed: petUpdateResult.breed, + breedAlias: petUpdateResult.breedAlias, + size: petUpdateResult.size, + castrated: petUpdateResult.castrated, + dateOfBirth: petUpdateResult.dateOfBirth, + image: petUpdateResult.image } } } diff --git a/src/data/use-cases/scheduler/tag/db-delete-tag-by-id.ts b/src/data/use-cases/scheduler/tag/db-delete-tag-by-id.ts index e12ead18..a18dd2a4 100644 --- a/src/data/use-cases/scheduler/tag/db-delete-tag-by-id.ts +++ b/src/data/use-cases/scheduler/tag/db-delete-tag-by-id.ts @@ -18,7 +18,8 @@ export class DbDeleteTagById implements DeleteTagById { } } return { - isSuccess: true + isSuccess: true, + data: undefined } } } diff --git a/src/domain/types/page-result.ts b/src/domain/types/page-result.ts new file mode 100644 index 00000000..c1365910 --- /dev/null +++ b/src/domain/types/page-result.ts @@ -0,0 +1,11 @@ +import { type ResultResponse } from './result' + +type PageInfo = { + page: number + limit: number + totalPages: number +} + +type PageData = PageInfo & { [key in K]: T[] } + +export type PageResult = ResultResponse> diff --git a/src/domain/types/result.ts b/src/domain/types/result.ts new file mode 100644 index 00000000..bc9788b5 --- /dev/null +++ b/src/domain/types/result.ts @@ -0,0 +1,13 @@ +type Success = { + isSuccess: true + data: T + error?: never +} + +type Failure = { + isSuccess: false + error: Error + data?: never +} + +export type ResultResponse = Success | Failure diff --git a/src/domain/use-cases/pet/add-pet.ts b/src/domain/use-cases/pet/add-pet.ts index 5a5c5fdd..b7ee585c 100644 --- a/src/domain/use-cases/pet/add-pet.ts +++ b/src/domain/use-cases/pet/add-pet.ts @@ -1,6 +1,7 @@ import { type FileStorage, type AddPetRepository, type LoadGuardianByIdRepository, type UpdatePetRepository } from '@/data/protocols' import { type PetGender } from '@/domain/models/pet' import { type AppointPet } from './appoint-pet' +import { type ResultResponse } from '@/domain/types/result' export interface AddPet { add: (petData: AddPet.Params) => Promise @@ -19,40 +20,38 @@ export namespace AddPet { image: Buffer | null } - export interface Result { - isSuccess: boolean - error?: Error - data?: { + interface Data { + id: string + guardian: { id: string - guardian: { - id: string - firstName: string - lastName: string - email: string - phone: string - } - specie: { - id: string - name: string - } - specieAlias?: string | null - petName: string - gender: string - breed: { - id: string - name: string - } - breedAlias: string - size: { - id: string - name: string - } - castrated: boolean - dateOfBirth: Date - image: string + firstName: string + lastName: string + email: string + phone: string } + specie: { + id: string + name: string + } + specieAlias?: string | null + petName: string + gender: string + breed: { + id: string + name: string + } + breedAlias: string + size: { + id: string + name: string + } + castrated: boolean + dateOfBirth: Date + image: string } + export type Result = ResultResponse + export interface Dependencies { guardianRepository: LoadGuardianByIdRepository petRepository: AddPetRepository & UpdatePetRepository diff --git a/src/domain/use-cases/pet/appoint-pet.ts b/src/domain/use-cases/pet/appoint-pet.ts index 3e716e2c..48a415ac 100644 --- a/src/domain/use-cases/pet/appoint-pet.ts +++ b/src/domain/use-cases/pet/appoint-pet.ts @@ -3,6 +3,7 @@ import { type LoadSizeByNameRepository } from '@/data/protocols/db/size' import { type Breed } from '@/domain/models/breed' import { type Size } from '@/domain/models/size' import { type Specie } from '@/domain/models/specie' +import { type ResultResponse } from '@/domain/types/result' export interface AppointPet { appoint: (params: AppointPet.Params) => Promise @@ -16,19 +17,17 @@ export namespace AppointPet { castrated: boolean } - export interface Result { - isSuccess: boolean - error?: Error - data?: { - specie: Specie & { id: string } - specieAlias: string | undefined - breed: Breed & { id: string } - breedAlias: string - size: Size & { id: string } - castrated: boolean - } + interface Data { + specie: Specie & { id: string } + specieAlias: string | undefined + breed: Breed & { id: string } + breedAlias: string + size: Size & { id: string } + castrated: boolean } + export type Result = ResultResponse + export interface Dependencies { specieRepository: LoadSpecieByNameRepository breedRepository: LoadBreedByNameRepository diff --git a/src/domain/use-cases/pet/load-pet-by-id.ts b/src/domain/use-cases/pet/load-pet-by-id.ts index 57dfda0e..f6821866 100644 --- a/src/domain/use-cases/pet/load-pet-by-id.ts +++ b/src/domain/use-cases/pet/load-pet-by-id.ts @@ -1,4 +1,5 @@ import { type LoadPetByIdRepository } from '@/data/protocols/db/pet' +import { type ResultResponse } from '@/domain/types/result' export interface LoadPetById { loadById: (petId: LoadPetById.Params) => Promise @@ -9,34 +10,32 @@ export namespace LoadPetById { petId: string } - export type Result = { - isSuccess: boolean - error?: Error - data?: { + interface Data { + id: string + guardianId: string + specie: { id: string - guardianId: string - specie: { - id: string - name: string - } - specieAlias: string | null - petName: string - gender: string - breedAlias: string - breed: { - id: string - name: string - } - size: { - id: string - name: string - } - castrated: boolean - dateOfBirth: Date - image: string + name: string } + specieAlias: string | null + petName: string + gender: string + breedAlias: string + breed: { + id: string + name: string + } + size: { + id: string + name: string + } + castrated: boolean + dateOfBirth: Date + image: string } + export type Result = ResultResponse + export type Dependencies = { petRepository: LoadPetByIdRepository } diff --git a/src/domain/use-cases/pet/load-pets.ts b/src/domain/use-cases/pet/load-pets.ts index b6a781fa..bead02ad 100644 --- a/src/domain/use-cases/pet/load-pets.ts +++ b/src/domain/use-cases/pet/load-pets.ts @@ -9,7 +9,7 @@ export namespace LoadPets { guardianId: string } - export type Result = Array<{ + interface Data { id: string guardianId: string specie: { @@ -29,7 +29,9 @@ export namespace LoadPets { name: string } castrated: boolean - }> + } + + export type Result = Data[] export type Dependencies = { petRepository: LoadPetByGuardianIdRepository diff --git a/src/domain/use-cases/pet/update-pet.ts b/src/domain/use-cases/pet/update-pet.ts index 7e811992..52b1f44e 100644 --- a/src/domain/use-cases/pet/update-pet.ts +++ b/src/domain/use-cases/pet/update-pet.ts @@ -1,6 +1,8 @@ import { type UpdatePetRepository, type LoadGuardianByIdRepository, type LoadPetByIdRepository } from '@/data/protocols' import { type PetGender } from '@/domain/models/pet' import { type AppointPet } from './appoint-pet' +import { type ResultResponse } from '@/domain/types/result' +import { type Breed, type Guardian, type Size, type Specie } from '@/domain/models' export interface UpdatePet { update: (petData: UpdatePet.Params) => Promise @@ -19,12 +21,31 @@ export namespace UpdatePet { dateOfBirth?: Date } - export interface Result { - isSuccess: boolean - error?: Error - data?: UpdatePetRepository.Result + type Data = { + id: string + guardian: Pick & { + id: string + } + specie: Specie & { + id: string + } + specieAlias?: string | null + petName: string + gender: string + breed: Breed & { + id: string + } + breedAlias: string + size: Size & { + id: string + } + castrated: boolean + dateOfBirth: Date + image: string } + export type Result = ResultResponse + export interface Dependencies { guardianRepository: LoadGuardianByIdRepository petRepository: UpdatePetRepository & LoadPetByIdRepository diff --git a/src/domain/use-cases/scheduler/add-scheduler.ts b/src/domain/use-cases/scheduler/add-scheduler.ts index 68e7730c..c684e1c2 100644 --- a/src/domain/use-cases/scheduler/add-scheduler.ts +++ b/src/domain/use-cases/scheduler/add-scheduler.ts @@ -1,5 +1,6 @@ import { type LoadTagByIdRepository, type AddSchedulerRepository, type AddTagRepository, type LoadPetByIdRepository, type DeleteSchedulerByIdRepository } from '@/data/protocols' import { type EventsGenerator } from '@/data/protocols/service' +import { type ResultResponse } from '@/domain/types/result' import { type Pet } from '@/infra/repos/postgresql/prisma/generated' export interface AddScheduler { @@ -21,25 +22,23 @@ export namespace AddScheduler { pets: string[] } - export type Result = { - isSuccess: boolean - error?: Error - data?: { - id: string - tagId: string - guardianId: string - title: string - description: string - note: string - startAt: Date - endAt: Date - daysOfWeek?: number[] - daysOfMonth?: number[] - daily: boolean - pets: Pet[] - } + interface Data { + id: string + tagId: string + guardianId: string + title: string + description: string + note: string + startAt: Date + endAt: Date + daysOfWeek?: number[] + daysOfMonth?: number[] + daily: boolean + pets: Pet[] } + export type Result = ResultResponse + export type Dependencies = { tagRepository: AddTagRepository & LoadTagByIdRepository petRepository: LoadPetByIdRepository diff --git a/src/domain/use-cases/scheduler/event/add-event.ts b/src/domain/use-cases/scheduler/event/add-event.ts index dd1826d3..6a6a7557 100644 --- a/src/domain/use-cases/scheduler/event/add-event.ts +++ b/src/domain/use-cases/scheduler/event/add-event.ts @@ -12,13 +12,15 @@ export namespace AddEvent { date: Date } - export type Result = { + type Data = { id: string schedulerId: string start: Date end: Date date: Date - } | undefined + } + + export type Result = Data | undefined export type Dependencies = { eventRepository: AddEventRepository diff --git a/src/domain/use-cases/scheduler/tag/add-tag.ts b/src/domain/use-cases/scheduler/tag/add-tag.ts index 4ec37512..7bed5f53 100644 --- a/src/domain/use-cases/scheduler/tag/add-tag.ts +++ b/src/domain/use-cases/scheduler/tag/add-tag.ts @@ -1,4 +1,5 @@ import { type AddTagRepository } from '@/data/protocols' +import { type ResultResponse } from '@/domain/types/result' export interface AddTag { add: (tagData: AddTag.Params) => Promise @@ -11,17 +12,15 @@ export namespace AddTag { color: string } - export type Result = { - isSuccess: boolean - error?: Error - data?: { - id: string - guardianId: string - name: string - color: string - } + interface Data { + id: string + guardianId: string + name: string + color: string } + export type Result = ResultResponse + export type Dependencies = { tagRepository: AddTagRepository } diff --git a/src/domain/use-cases/scheduler/tag/delete-tag-by-id.ts b/src/domain/use-cases/scheduler/tag/delete-tag-by-id.ts index aa09edec..cf20f26f 100644 --- a/src/domain/use-cases/scheduler/tag/delete-tag-by-id.ts +++ b/src/domain/use-cases/scheduler/tag/delete-tag-by-id.ts @@ -1,4 +1,5 @@ import { type DeleteTagRepository } from '@/data/protocols' +import { type ResultResponse } from '@/domain/types/result' export interface DeleteTagById { deleteById: (tagId: DeleteTagById.Param) => Promise @@ -6,10 +7,7 @@ export interface DeleteTagById { export namespace DeleteTagById { export type Param = string - export type Result = { - isSuccess: boolean - error?: Error - } + export type Result = ResultResponse export type Dependencies = { tagRepository: DeleteTagRepository diff --git a/src/domain/use-cases/scheduler/tag/load-tags.ts b/src/domain/use-cases/scheduler/tag/load-tags.ts index 50e6b910..9797ee45 100644 --- a/src/domain/use-cases/scheduler/tag/load-tags.ts +++ b/src/domain/use-cases/scheduler/tag/load-tags.ts @@ -6,12 +6,15 @@ export interface LoadTags { export namespace LoadTags { export type Param = string - export type Result = Array<{ + + type Data = { id: string guardianId: string name: string color: string - }> + } + + export type Result = Data[] export type Dependencies = { tagRepository: LoadTagsRepository diff --git a/src/domain/use-cases/scheduler/tag/update-tag.ts b/src/domain/use-cases/scheduler/tag/update-tag.ts index 9bd4b784..d76d6de9 100644 --- a/src/domain/use-cases/scheduler/tag/update-tag.ts +++ b/src/domain/use-cases/scheduler/tag/update-tag.ts @@ -1,4 +1,5 @@ import { type LoadTagByIdRepository, type UpdateTagRepository } from '@/data/protocols' +import { type ResultResponse } from '@/domain/types/result' export interface UpdateTag { update: (params: UpdateTag.Params) => Promise @@ -10,12 +11,15 @@ export namespace UpdateTag { name: string } - export type Result = { - isSuccess: boolean - error?: Error - data?: UpdateTagRepository.Result + interface Data { + id: string + guardianId: string + name: string + color: string } + export type Result = ResultResponse + export type Dependencies = { tagRepository: UpdateTagRepository & LoadTagByIdRepository } diff --git a/src/domain/use-cases/settings/load-settings.ts b/src/domain/use-cases/settings/load-settings.ts index c57c63c1..4b73c621 100644 --- a/src/domain/use-cases/settings/load-settings.ts +++ b/src/domain/use-cases/settings/load-settings.ts @@ -6,10 +6,13 @@ export interface LoadSettings { export namespace LoadSettings { export type Param = string - export type Result = Array<{ + + type Settings = { notificationEmail: boolean notificationMobile: boolean - }> + } + + export type Result = Settings[] export type Dependencies = { settingsRepository: LoadSettingsRepository diff --git a/src/domain/use-cases/settings/update-settings.ts b/src/domain/use-cases/settings/update-settings.ts index ae25e641..6db9aea0 100644 --- a/src/domain/use-cases/settings/update-settings.ts +++ b/src/domain/use-cases/settings/update-settings.ts @@ -1,4 +1,5 @@ import { type UpdateSettingsRepository, type LoadSettingsRepository, type LoadGuardianByIdRepository } from '@/data/protocols' +import { type ResultResponse } from '@/domain/types/result' export interface UpdateSettings { update: (params: UpdateSettings.Params) => Promise @@ -11,12 +12,14 @@ export namespace UpdateSettings { notificationMobile: boolean } - export type Result = { - isSuccess: boolean - data?: UpdateSettingsRepository.Result - error?: Error + type Data = { + guardianId: string + notificationEmail: boolean + notificationMobile: boolean } + export type Result = ResultResponse + export type Dependencies = { guardianRepository: LoadGuardianByIdRepository settingsRepository: UpdateSettingsRepository & LoadSettingsRepository diff --git a/src/domain/use-cases/tasks/load-current-date-tasks.ts b/src/domain/use-cases/tasks/load-current-date-tasks.ts index 994a802b..1964e33d 100644 --- a/src/domain/use-cases/tasks/load-current-date-tasks.ts +++ b/src/domain/use-cases/tasks/load-current-date-tasks.ts @@ -10,10 +10,12 @@ export namespace LoadCurrentDateTasks { limit?: number } - export type Result = Array<{ + type Task = { id: string schedulerId: string start: Date end: Date - }> + } + + export type Result = Task[] } diff --git a/src/domain/use-cases/tasks/load-current-month-tasks.ts b/src/domain/use-cases/tasks/load-current-month-tasks.ts index ecd0ad4c..bcbf4d0a 100644 --- a/src/domain/use-cases/tasks/load-current-month-tasks.ts +++ b/src/domain/use-cases/tasks/load-current-month-tasks.ts @@ -10,10 +10,12 @@ export namespace LoadCurrentMonthTasks { limit?: number } - export type Result = Array<{ + type Task = { id: string schedulerId: string start: Date end: Date - }> + } + + export type Result = Task[] } diff --git a/src/domain/use-cases/tasks/load-current-week-tasks.ts b/src/domain/use-cases/tasks/load-current-week-tasks.ts index b6110279..8e2c956e 100644 --- a/src/domain/use-cases/tasks/load-current-week-tasks.ts +++ b/src/domain/use-cases/tasks/load-current-week-tasks.ts @@ -10,10 +10,12 @@ export namespace LoadCurrentWeekTasks { limit?: number } - export type Result = Array<{ + type Task = { id: string schedulerId: string start: Date end: Date - }> + } + + export type Result = Task[] } diff --git a/src/domain/use-cases/tasks/load-next-tasks-by-petId-and-tagId.ts b/src/domain/use-cases/tasks/load-next-tasks-by-petId-and-tagId.ts index 7c837822..d43b3df9 100644 --- a/src/domain/use-cases/tasks/load-next-tasks-by-petId-and-tagId.ts +++ b/src/domain/use-cases/tasks/load-next-tasks-by-petId-and-tagId.ts @@ -1,4 +1,5 @@ import { type LoadNextTasksByPetIdAndTagIdRepository, type LoadPetByIdRepository, type LoadTagByIdRepository } from '@/data/protocols' +import { type PageResult } from '@/domain/types/page-result' export interface LoadNextTasksByPetIdAndTagId { load: (params: LoadNextTasksByPetIdAndTagId.Params) => Promise @@ -12,41 +13,34 @@ export namespace LoadNextTasksByPetIdAndTagId { limit?: number } - export type Result = { - isSuccess: boolean - error?: Error - data?: { - page: number - limit: number - totalPages: number - events: Array<{ + type Data = { + id: string + start: Date + end: Date + schedulerId: string + scheduler: { + id: string + title: string + description: string + note: string + startAt: Date + endAt: Date + daysOfWeek: number[] + daysOfMonth: number[] + daily: boolean + tag: { + name: string + color: string + } + pets: Array<{ id: string - start: Date - end: Date - schedulerId: string - scheduler: { - id: string - title: string - description: string - note: string - startAt: Date - endAt: Date - daysOfWeek: number[] - daysOfMonth: number[] - daily: boolean - tag: { - name: string - color: string - } - pets: Array<{ - id: string - image: string - }> - } + image: string }> } } + export type Result = PageResult + export type Dependencies = { eventRepository: LoadNextTasksByPetIdAndTagIdRepository petRepository: LoadPetByIdRepository diff --git a/src/domain/use-cases/tasks/load-next-tasks-by-petId.ts b/src/domain/use-cases/tasks/load-next-tasks-by-petId.ts index 262917a0..959fb57c 100644 --- a/src/domain/use-cases/tasks/load-next-tasks-by-petId.ts +++ b/src/domain/use-cases/tasks/load-next-tasks-by-petId.ts @@ -1,4 +1,5 @@ import { type LoadNextTasksByPetIdRepository } from '@/data/protocols' +import { type PageResult } from '@/domain/types/page-result' export interface LoadNextTasksByPetId { load: (params: LoadNextTasksByPetId.Params) => Promise @@ -11,12 +12,33 @@ export namespace LoadNextTasksByPetId { limit?: number } - export type Result = - { - isSuccess: boolean - data?: LoadNextTasksByPetIdRepository.Result - error?: Error + type Event = { + id: string + start: Date + end: Date + schedulerId: string + scheduler: { + id: string + title: string + description: string + note: string + startAt: Date + endAt: Date + daysOfWeek: number[] + daysOfMonth: number[] + daily: boolean + tag: { + name: string + color: string + } + pets: Array<{ + id: string + image: string + }> } + } + + export type Result = PageResult export type Dependencies = { eventRepository: LoadNextTasksByPetIdRepository diff --git a/src/domain/use-cases/tasks/load-previous-tasks-by-petId.ts b/src/domain/use-cases/tasks/load-previous-tasks-by-petId.ts index db4c6851..ce0c3fb5 100644 --- a/src/domain/use-cases/tasks/load-previous-tasks-by-petId.ts +++ b/src/domain/use-cases/tasks/load-previous-tasks-by-petId.ts @@ -1,4 +1,5 @@ import { type LoadPreviousTasksByPetIdRepository } from '@/data/protocols/db/task/load-previous-task-by-petId-repository' +import { type PageResult } from '@/domain/types/page-result' export interface LoadPreviousTasksByPetId { load: (params: LoadPreviousTasksByPetId.Params) => Promise @@ -11,12 +12,34 @@ export namespace LoadPreviousTasksByPetId { limit?: number } - export type Result = { - isSuccess: boolean - data?: LoadPreviousTasksByPetIdRepository.Result - error?: Error + type Event = { + id: string + start: Date + end: Date + schedulerId: string + scheduler: { + id: string + title: string + description: string + note: string + startAt: Date + endAt: Date + daysOfWeek: number[] + daysOfMonth: number[] + daily: boolean + tag: { + name: string + color: string + } + pets: Array<{ + id: string + image: string + }> + } } + export type Result = PageResult + export type Dependencies = { eventRepository: LoadPreviousTasksByPetIdRepository } diff --git a/src/infra/service/events-generator-service.ts b/src/infra/service/events-generator-service.ts index 82d17ef6..c439c24a 100644 --- a/src/infra/service/events-generator-service.ts +++ b/src/infra/service/events-generator-service.ts @@ -16,12 +16,11 @@ export class EventsGeneratorService implements EventsGenerator { const events = [] while (currentDate <= endAtDateTime) { if (daysOfWeek.includes(currentDate.getDay())) { - const event = await this.eventRepository.loadByDate({ date: currentDate }) - if (event) { + const eventAlready = await this.eventRepository.loadByDate({ date: new Date(currentDate) }) + if (eventAlready) { return { isSuccess: false, - error: new NotAcceptableError('Conflict start event'), - data: event + error: new NotAcceptableError('Conflict start event') } } const start = new Date(currentDate) @@ -49,7 +48,8 @@ export class EventsGeneratorService implements EventsGenerator { } return { - isSuccess: true + isSuccess: true, + data: events } } @@ -57,12 +57,11 @@ export class EventsGeneratorService implements EventsGenerator { const events = [] while (currentDate <= endAtDateTime) { if (daysOfMonth.includes(currentDate.getDate())) { - const event = await this.eventRepository.loadByDate({ date: currentDate }) - if (event) { + const eventAlreadyExists = await this.eventRepository.loadByDate({ date: new Date(currentDate) }) + if (eventAlreadyExists) { return { isSuccess: false, - error: new NotAcceptableError('Conflict start event'), - data: event + error: new NotAcceptableError('Conflict start event') } } const start = new Date(currentDate) @@ -90,19 +89,19 @@ export class EventsGeneratorService implements EventsGenerator { } return { - isSuccess: true + isSuccess: true, + data: events } } if (daily) { const events = [] while (currentDate <= endAtDateTime) { - const event = await this.eventRepository.loadByDate({ date: currentDate }) + const event = await this.eventRepository.loadByDate({ date: new Date(currentDate) }) if (event) { return { isSuccess: false, - error: new NotAcceptableError('Conflict start event'), - data: event + error: new NotAcceptableError('Conflict start event') } } const start = new Date(currentDate) @@ -129,16 +128,16 @@ export class EventsGeneratorService implements EventsGenerator { } return { - isSuccess: true + isSuccess: true, + data: events } } - const event = await this.eventRepository.loadByDate({ date: currentDate }) - if (event) { + const eventAlreadyExists = await this.eventRepository.loadByDate({ date: new Date(currentDate) }) + if (eventAlreadyExists) { return { isSuccess: false, - error: new NotAcceptableError('Conflict start event'), - data: event + error: new NotAcceptableError('Conflict start event') } } diff --git a/tests/src/infra/service/events-generator-service.spec.ts b/tests/src/infra/service/events-generator-service.spec.ts index cc48880b..f04e9c19 100644 --- a/tests/src/infra/service/events-generator-service.spec.ts +++ b/tests/src/infra/service/events-generator-service.spec.ts @@ -32,48 +32,68 @@ const generateDate = (): any => { } describe('Events Generator Service', () => { - const params: EventsGenerator.Params = { + const daysOfWeekParams: EventsGenerator.Params = { schedulerId: 'any_scheduler_id', startAt: generateDate().startAt, endAt: generateDate().endAt, daysOfWeek: [new Date().getDay()], + daysOfMonth: undefined, + daily: false + } + + const daysOfMonthParams: EventsGenerator.Params = { + schedulerId: 'any_scheduler_id', + startAt: generateDate().startAt, + endAt: generateDate().endAt, + daysOfWeek: undefined, daysOfMonth: [new Date().getDate()], + daily: false + } + + const dailyParams: EventsGenerator.Params = { + schedulerId: 'any_scheduler_id', + startAt: generateDate().startAt, + endAt: generateDate().endAt, + daysOfWeek: undefined, + daysOfMonth: undefined, daily: true } + const punctualParams: EventsGenerator.Params = { + schedulerId: 'any_scheduler_id', + startAt: generateDate().startAt, + endAt: generateDate().endAt, + daysOfWeek: undefined, + daysOfMonth: undefined, + daily: false + } + describe('Days of Week', () => { it('Should call loadByDate with the correct value', async () => { const { sut, eventRepositoryStub } = makeSut() const loadSpy = jest.spyOn(eventRepositoryStub, 'loadByDate') - await sut.generate({ ...params, daysOfMonth: undefined, daily: false }) - expect(loadSpy).toHaveBeenCalledWith({ date: params.startAt }) + await sut.generate(daysOfWeekParams) + expect(loadSpy).toHaveBeenCalledWith({ date: daysOfWeekParams.startAt }) }) it('Should throw if loadByDate throws', async () => { const { sut, eventRepositoryStub } = makeSut() jest.spyOn(eventRepositoryStub, 'loadByDate').mockRejectedValue(() => { throw new Error() }) - const promise = sut.generate({ ...params, daysOfMonth: undefined, daily: false }) + const promise = sut.generate(daysOfWeekParams) await expect(promise).rejects.toThrow() }) - it('Should return NotAcceptableError if loadByDate returns null because date conflits', async () => { + it('Should return NotAcceptableError if loadByDate not returns null because date conflits', async () => { const { sut, eventRepositoryStub } = makeSut() jest.spyOn(eventRepositoryStub, 'loadByDate').mockResolvedValueOnce({ schedulerId: 'any_scheduler_id', start: new Date('2025-06-01T10:30:00Z'), end: new Date('2025-07-01T11:30:00Z') - }) - const result = await sut.generate({ ...params, daysOfMonth: undefined, daily: false }) + const result = await sut.generate(daysOfWeekParams) expect(result).toEqual({ isSuccess: false, - error: new NotAcceptableError('Conflict start event'), - data: { - schedulerId: 'any_scheduler_id', - start: new Date('2025-06-01T10:30:00Z'), - end: new Date('2025-07-01T11:30:00Z') - - } + error: new NotAcceptableError('Conflict start event') }) }) @@ -81,7 +101,7 @@ describe('Events Generator Service', () => { const { sut, eventRepositoryStub } = makeSut() jest.spyOn(eventRepositoryStub, 'loadByDate').mockResolvedValueOnce(null) const addSpy = jest.spyOn(eventRepositoryStub, 'addMany') - await sut.generate({ ...params, daysOfMonth: undefined, daily: false }) + await sut.generate(daysOfWeekParams) expect(addSpy).toHaveBeenCalledWith([{ schedulerId: 'any_scheduler_id', start: expect.any(Date), @@ -93,7 +113,7 @@ describe('Events Generator Service', () => { const { sut, eventRepositoryStub } = makeSut() jest.spyOn(eventRepositoryStub, 'loadByDate').mockResolvedValueOnce(null) jest.spyOn(eventRepositoryStub, 'addMany').mockRejectedValue(() => { throw new Error() }) - const promise = sut.generate({ ...params, daysOfMonth: undefined, daily: false }) + const promise = sut.generate(daysOfWeekParams) await expect(promise).rejects.toThrow() }) @@ -101,7 +121,7 @@ describe('Events Generator Service', () => { const { sut, eventRepositoryStub } = makeSut() jest.spyOn(eventRepositoryStub, 'loadByDate').mockResolvedValueOnce(null) jest.spyOn(eventRepositoryStub, 'addMany').mockResolvedValueOnce(false) - const result = await sut.generate({ ...params, daysOfMonth: undefined, daily: false }) + const result = await sut.generate(daysOfWeekParams) expect(result).toEqual({ isSuccess: false, error: new ServerError('Internal Server Error!') @@ -112,8 +132,17 @@ describe('Events Generator Service', () => { const { sut, eventRepositoryStub } = makeSut() jest.spyOn(eventRepositoryStub, 'loadByDate').mockResolvedValueOnce(null) jest.spyOn(eventRepositoryStub, 'addMany').mockResolvedValueOnce(true) - const result = await sut.generate({ ...params, daysOfMonth: undefined, daily: false }) - expect(result).toEqual({ isSuccess: true }) + const result = await sut.generate(daysOfWeekParams) + expect(result).toEqual({ + isSuccess: true, + data: [ + { + schedulerId: 'any_scheduler_id', + start: expect.any(Date), + end: expect.any(Date) + } + ] + }) }) }) @@ -121,18 +150,18 @@ describe('Events Generator Service', () => { it('Should call loadByDate with the correct value', async () => { const { sut, eventRepositoryStub } = makeSut() const loadSpy = jest.spyOn(eventRepositoryStub, 'loadByDate') - await sut.generate({ ...params, daysOfWeek: undefined, daily: false }) - expect(loadSpy).toHaveBeenCalledWith({ date: params.startAt }) + await sut.generate(daysOfMonthParams) + expect(loadSpy).toHaveBeenCalledWith({ date: daysOfMonthParams.startAt }) }) it('Should throw if loadByDate throws', async () => { const { sut, eventRepositoryStub } = makeSut() jest.spyOn(eventRepositoryStub, 'loadByDate').mockRejectedValue(() => { throw new Error() }) - const promise = sut.generate({ ...params, daysOfWeek: undefined, daily: false }) + const promise = sut.generate(daysOfMonthParams) await expect(promise).rejects.toThrow() }) - it('Should return NotAcceptableError if loadByDate returns null because date conflits', async () => { + it('Should return NotAcceptableError if loadByDate not returns null because date conflits', async () => { const { sut, eventRepositoryStub } = makeSut() jest.spyOn(eventRepositoryStub, 'loadByDate').mockResolvedValueOnce({ schedulerId: 'any_scheduler_id', @@ -140,16 +169,10 @@ describe('Events Generator Service', () => { end: new Date('2025-07-01T11:30:00Z') }) - const result = await sut.generate({ ...params, daysOfWeek: undefined, daily: false }) + const result = await sut.generate(daysOfMonthParams) expect(result).toEqual({ isSuccess: false, - error: new NotAcceptableError('Conflict start event'), - data: { - schedulerId: 'any_scheduler_id', - start: new Date('2025-06-01T10:30:00Z'), - end: new Date('2025-07-01T11:30:00Z') - - } + error: new NotAcceptableError('Conflict start event') }) }) @@ -157,7 +180,7 @@ describe('Events Generator Service', () => { const { sut, eventRepositoryStub } = makeSut() jest.spyOn(eventRepositoryStub, 'loadByDate').mockResolvedValueOnce(null) const addSpy = jest.spyOn(eventRepositoryStub, 'addMany') - await sut.generate({ ...params, daysOfMonth: [new Date().getDate()], daysOfWeek: undefined, daily: false }) + await sut.generate(daysOfMonthParams) expect(addSpy).toHaveBeenCalledWith([{ schedulerId: 'any_scheduler_id', start: expect.any(Date), @@ -169,7 +192,7 @@ describe('Events Generator Service', () => { const { sut, eventRepositoryStub } = makeSut() jest.spyOn(eventRepositoryStub, 'loadByDate').mockResolvedValueOnce(null) jest.spyOn(eventRepositoryStub, 'addMany').mockRejectedValue(() => { throw new Error() }) - const promise = sut.generate({ ...params, daysOfWeek: undefined, daily: false }) + const promise = sut.generate(daysOfMonthParams) await expect(promise).rejects.toThrow() }) @@ -177,7 +200,7 @@ describe('Events Generator Service', () => { const { sut, eventRepositoryStub } = makeSut() jest.spyOn(eventRepositoryStub, 'loadByDate').mockResolvedValueOnce(null) jest.spyOn(eventRepositoryStub, 'addMany').mockResolvedValueOnce(false) - const result = await sut.generate({ ...params, daysOfWeek: undefined, daily: false }) + const result = await sut.generate(daysOfMonthParams) expect(result).toEqual({ isSuccess: false, error: new ServerError('Internal Server Error!') @@ -188,8 +211,17 @@ describe('Events Generator Service', () => { const { sut, eventRepositoryStub } = makeSut() jest.spyOn(eventRepositoryStub, 'loadByDate').mockResolvedValueOnce(null) jest.spyOn(eventRepositoryStub, 'addMany').mockResolvedValueOnce(true) - const result = await sut.generate({ ...params, daysOfWeek: undefined, daily: false }) - expect(result).toEqual({ isSuccess: true }) + const result = await sut.generate(daysOfMonthParams) + expect(result).toEqual({ + isSuccess: true, + data: [ + { + schedulerId: 'any_scheduler_id', + start: expect.any(Date), + end: expect.any(Date) + } + ] + }) }) }) @@ -197,14 +229,14 @@ describe('Events Generator Service', () => { it('Should call loadByDate with the correct value', async () => { const { sut, eventRepositoryStub } = makeSut() const loadSpy = jest.spyOn(eventRepositoryStub, 'loadByDate') - await sut.generate({ ...params, daysOfWeek: undefined, daysOfMonth: undefined }) - expect(loadSpy).toHaveBeenCalledWith({ date: params.startAt }) + await sut.generate(dailyParams) + expect(loadSpy).toHaveBeenCalledWith({ date: dailyParams.startAt }) }) it('Should throw if loadByDate throws', async () => { const { sut, eventRepositoryStub } = makeSut() jest.spyOn(eventRepositoryStub, 'loadByDate').mockRejectedValue(() => { throw new Error() }) - const promise = sut.generate({ ...params, daysOfWeek: undefined, daysOfMonth: undefined }) + const promise = sut.generate(dailyParams) await expect(promise).rejects.toThrow() }) @@ -214,18 +246,11 @@ describe('Events Generator Service', () => { schedulerId: 'any_scheduler_id', start: new Date('2025-06-01T10:30:00Z'), end: new Date('2025-07-01T11:30:00Z') - }) - const result = await sut.generate({ ...params, daysOfWeek: undefined, daysOfMonth: undefined }) + const result = await sut.generate(dailyParams) expect(result).toEqual({ isSuccess: false, - error: new NotAcceptableError('Conflict start event'), - data: { - schedulerId: 'any_scheduler_id', - start: new Date('2025-06-01T10:30:00Z'), - end: new Date('2025-07-01T11:30:00Z') - - } + error: new NotAcceptableError('Conflict start event') }) }) @@ -234,7 +259,7 @@ describe('Events Generator Service', () => { jest.spyOn(eventRepositoryStub, 'loadByDate').mockResolvedValueOnce(null) jest.spyOn(eventRepositoryStub, 'loadByDate').mockResolvedValueOnce(null) const addSpy = jest.spyOn(eventRepositoryStub, 'addMany') - await sut.generate({ ...params, daysOfMonth: undefined, daysOfWeek: undefined }) + await sut.generate(dailyParams) expect(addSpy).toHaveBeenCalledWith([ { schedulerId: 'any_scheduler_id', @@ -254,7 +279,7 @@ describe('Events Generator Service', () => { jest.spyOn(eventRepositoryStub, 'loadByDate').mockResolvedValueOnce(null) jest.spyOn(eventRepositoryStub, 'loadByDate').mockResolvedValueOnce(null) jest.spyOn(eventRepositoryStub, 'addMany').mockRejectedValue(() => { throw new Error() }) - const promise = sut.generate({ ...params, daysOfWeek: undefined, daysOfMonth: undefined }) + const promise = sut.generate(dailyParams) await expect(promise).rejects.toThrow() }) @@ -263,7 +288,7 @@ describe('Events Generator Service', () => { jest.spyOn(eventRepositoryStub, 'loadByDate').mockResolvedValueOnce(null) jest.spyOn(eventRepositoryStub, 'loadByDate').mockResolvedValueOnce(null) jest.spyOn(eventRepositoryStub, 'addMany').mockResolvedValueOnce(false) - const result = await sut.generate({ ...params, daysOfWeek: undefined, daysOfMonth: undefined }) + const result = await sut.generate(dailyParams) expect(result).toEqual({ isSuccess: false, error: new ServerError('Internal Server Error!') @@ -275,8 +300,22 @@ describe('Events Generator Service', () => { jest.spyOn(eventRepositoryStub, 'loadByDate').mockResolvedValueOnce(null) jest.spyOn(eventRepositoryStub, 'loadByDate').mockResolvedValueOnce(null) jest.spyOn(eventRepositoryStub, 'addMany').mockResolvedValueOnce(true) - const result = await sut.generate({ ...params, daysOfWeek: undefined, daysOfMonth: undefined }) - expect(result).toEqual({ isSuccess: true }) + const result = await sut.generate(dailyParams) + expect(result).toEqual({ + isSuccess: true, + data: [ + { + schedulerId: 'any_scheduler_id', + start: expect.any(Date), + end: expect.any(Date) + }, + { + schedulerId: 'any_scheduler_id', + start: expect.any(Date), + end: expect.any(Date) + } + ] + }) }) }) @@ -284,18 +323,18 @@ describe('Events Generator Service', () => { it('Should call loadByDate with the correct value', async () => { const { sut, eventRepositoryStub } = makeSut() const loadSpy = jest.spyOn(eventRepositoryStub, 'loadByDate') - await sut.generate({ ...params, daysOfWeek: undefined, daysOfMonth: undefined, daily: false }) - expect(loadSpy).toHaveBeenCalledWith({ date: params.startAt }) + await sut.generate(punctualParams) + expect(loadSpy).toHaveBeenCalledWith({ date: punctualParams.startAt }) }) it('Should throw if loadByDate throws', async () => { const { sut, eventRepositoryStub } = makeSut() jest.spyOn(eventRepositoryStub, 'loadByDate').mockRejectedValue(() => { throw new Error() }) - const promise = sut.generate({ ...params, daysOfWeek: undefined, daysOfMonth: undefined, daily: false }) + const promise = sut.generate(punctualParams) await expect(promise).rejects.toThrow() }) - it('Should return NotAcceptableError if loadByDate returns null because date conflits', async () => { + it('Should return NotAcceptableError if loadByDate not returns null because date conflits', async () => { const { sut, eventRepositoryStub } = makeSut() jest.spyOn(eventRepositoryStub, 'loadByDate').mockResolvedValueOnce({ schedulerId: 'any_scheduler_id', @@ -303,16 +342,10 @@ describe('Events Generator Service', () => { end: new Date('2025-07-01T11:30:00Z') }) - const result = await sut.generate({ ...params, daysOfWeek: undefined, daysOfMonth: undefined, daily: false }) + const result = await sut.generate(punctualParams) expect(result).toEqual({ isSuccess: false, - error: new NotAcceptableError('Conflict start event'), - data: { - schedulerId: 'any_scheduler_id', - start: new Date('2025-06-01T10:30:00Z'), - end: new Date('2025-07-01T11:30:00Z') - - } + error: new NotAcceptableError('Conflict start event') }) }) @@ -320,11 +353,11 @@ describe('Events Generator Service', () => { const { sut, eventRepositoryStub } = makeSut() jest.spyOn(eventRepositoryStub, 'loadByDate').mockResolvedValueOnce(null) const addSpy = jest.spyOn(eventRepositoryStub, 'add') - await sut.generate({ ...params, daysOfMonth: undefined, daysOfWeek: undefined, daily: false }) + await sut.generate(punctualParams) expect(addSpy).toHaveBeenCalledWith({ schedulerId: 'any_scheduler_id', - start: params.startAt, - end: params.endAt + start: punctualParams.startAt, + end: punctualParams.endAt }) }) @@ -332,7 +365,7 @@ describe('Events Generator Service', () => { const { sut, eventRepositoryStub } = makeSut() jest.spyOn(eventRepositoryStub, 'loadByDate').mockResolvedValueOnce(null) jest.spyOn(eventRepositoryStub, 'add').mockRejectedValue(() => { throw new Error() }) - const promise = sut.generate({ ...params, daysOfWeek: undefined, daysOfMonth: undefined, daily: false }) + const promise = sut.generate(punctualParams) await expect(promise).rejects.toThrow() }) @@ -340,7 +373,7 @@ describe('Events Generator Service', () => { const { sut, eventRepositoryStub } = makeSut() jest.spyOn(eventRepositoryStub, 'loadByDate').mockResolvedValueOnce(null) jest.spyOn(eventRepositoryStub, 'add').mockResolvedValueOnce(undefined) - const result = await sut.generate({ ...params, daysOfWeek: undefined, daysOfMonth: undefined, daily: false }) + const result = await sut.generate(punctualParams) expect(result).toEqual({ isSuccess: false, error: new ServerError('Internal Server Error!') @@ -353,17 +386,17 @@ describe('Events Generator Service', () => { jest.spyOn(eventRepositoryStub, 'add').mockResolvedValue({ id: 'any_id', schedulerId: 'any_scheduler_id', - start: params.startAt, - end: params.endAt + start: punctualParams.startAt, + end: punctualParams.endAt }) - const result = await sut.generate({ ...params, daysOfWeek: undefined, daysOfMonth: undefined, daily: false }) + const result = await sut.generate(punctualParams) expect(result).toEqual({ isSuccess: true, data: { id: 'any_id', schedulerId: 'any_scheduler_id', - start: params.startAt, - end: params.endAt + start: punctualParams.startAt, + end: punctualParams.endAt } }) }) diff --git a/tests/src/main/routes/tasks-routes.test.ts b/tests/src/main/routes/tasks-routes.test.ts index 8c1359e6..1321cb95 100644 --- a/tests/src/main/routes/tasks-routes.test.ts +++ b/tests/src/main/routes/tasks-routes.test.ts @@ -110,12 +110,10 @@ describe('LoadTasks Routes', () => { describe('GET - /api/tasks/pet/:petId/tag/:tagId', () => { it('Should return 200 on success', async () => { - const response = await request(app) + await request(app) .get(`/api/tasks/pet/${petId}/tag/${tagId}`) .set('Authorization', `Bearer ${accessToken}`) .expect(200) - - console.log(response) }) it('Should return 400 if an invalid petId or tagId are provided', async () => { diff --git a/tests/utils/stubs/use-case.stub.ts b/tests/utils/stubs/use-case.stub.ts index 801a6169..09b13e52 100644 --- a/tests/utils/stubs/use-case.stub.ts +++ b/tests/utils/stubs/use-case.stub.ts @@ -177,11 +177,10 @@ const makeFakeLoadPetByIdUseCase = (): LoadPetById => { const makeFakeUpdatePetUseCase = (): UpdatePet => { class UpdatePetStub implements UpdatePet { async update (petData: UpdatePet.Params): Promise { - const result = { + return { isSuccess: true, data: mockFakePetUpdated() } - return result } } return new UpdatePetStub() @@ -305,7 +304,8 @@ const makeFakeDeleteTagByIdUseCase = (): DeleteTagById => { class DeleteTagByIdStub implements DeleteTagById { async deleteById (tagId: DeleteTagById.Param): Promise { return { - isSuccess: true + isSuccess: true, + data: undefined } } }