diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f81e04a..b8bb75b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1352,7 +1352,7 @@ packages: /@types/jsonwebtoken@9.0.6: resolution: {integrity: sha512-/5hndP5dCjloafCXns6SZyESp3Ldq7YjH3zwzwczYnjxIT0Fqzk5ROSYVGfFyczIue7IUEj8hkvLbPoLQ18vQw==} dependencies: - '@types/node': 20.12.10 + '@types/node': 20.12.12 dev: true /@types/methods@1.1.4: @@ -4510,7 +4510,7 @@ packages: lodash.isstring: 4.0.1 lodash.once: 4.1.1 ms: 2.1.3 - semver: 7.6.1 + semver: 7.6.2 dev: false /jwa@1.4.1: diff --git a/src/features/account/models/account-model.ts b/src/features/account/models/account-model.ts new file mode 100644 index 0000000..696887c --- /dev/null +++ b/src/features/account/models/account-model.ts @@ -0,0 +1,6 @@ +export type AccountModel = { + avatarUrl: string; + id: string; + socialMediaId?: number; + userId?: string; +}; diff --git a/src/features/account/services/delete-user-accounts-service.test.ts b/src/features/account/services/delete-user-accounts-service.test.ts new file mode 100644 index 0000000..b7ab814 --- /dev/null +++ b/src/features/account/services/delete-user-accounts-service.test.ts @@ -0,0 +1,38 @@ +import { describe, expect, it, vi } from 'vitest'; +import { AccountMock } from '@/shared/test-helpers/mocks/account.mock.js'; +import { DeleteUserAccountsService } from './delete-user-accounts-service.js'; +import { BadRequestError } from '@/shared/errors/bad-request-error.js'; + +const makeSut = () => { + const accountRepository = { + deleteAccountsBySocialMediaId: vi.fn(), + getAccounts: vi.fn(), + }; + const deleteUserAccountsService = new DeleteUserAccountsService( + accountRepository + ); + + return { accountRepository, deleteUserAccountsService }; +}; + +describe('DeleteUserAccountsService', () => { + it('deletes accounts by social media id', async () => { + const { accountRepository, deleteUserAccountsService } = makeSut(); + const account = AccountMock.create(); + + await deleteUserAccountsService.execute(account); + + expect( + accountRepository.deleteAccountsBySocialMediaId + ).toHaveBeenCalledWith(account.socialMediaId); + }); + + it('throws BadRequestError if socialMediaId is not provided', async () => { + const { deleteUserAccountsService } = makeSut(); + const account = AccountMock.create({ socialMediaId: undefined }); + + await expect(deleteUserAccountsService.execute(account)).rejects.toThrow( + BadRequestError + ); + }); +}); diff --git a/src/features/account/services/delete-user-accounts-service.ts b/src/features/account/services/delete-user-accounts-service.ts new file mode 100644 index 0000000..d6f3780 --- /dev/null +++ b/src/features/account/services/delete-user-accounts-service.ts @@ -0,0 +1,13 @@ +import type { Service } from '@/shared/protocols/service.js'; +import type { AccountRepository } from '../repositories/account-repository/account-repository.js'; +import type { AccountModel } from '../models/account-model.js'; +import { BadRequestError } from '@/shared/errors/bad-request-error.js'; + +export class DeleteUserAccountsService implements Service { + constructor(private readonly accountRepository: AccountRepository) {} + + async execute({ socialMediaId }: AccountModel) { + if (!socialMediaId) throw new BadRequestError('undefined social media id'); + await this.accountRepository.deleteAccountsBySocialMediaId(socialMediaId); + } +} diff --git a/src/shared/errors/bad-request-error.ts b/src/shared/errors/bad-request-error.ts new file mode 100644 index 0000000..dfb5fd0 --- /dev/null +++ b/src/shared/errors/bad-request-error.ts @@ -0,0 +1,15 @@ +import { HttpStatusCode } from '../protocols/http-client.js'; +import { HttpError } from './http-error.js'; + +export class BadRequestError extends HttpError { + constructor(public readonly message: string) { + super(HttpStatusCode.badRequest, message); + } + + public toJSON() { + return { + code: HttpStatusCode.badRequest, + error: this.message, + }; + } +} diff --git a/src/shared/errors/error.test.ts b/src/shared/errors/error.test.ts index 492f06c..2f82acb 100644 --- a/src/shared/errors/error.test.ts +++ b/src/shared/errors/error.test.ts @@ -1,3 +1,4 @@ +import { BadRequestError } from './bad-request-error.js'; import { HttpError } from './http-error.js'; import { UserNotFound } from './user-not-found-error.js'; import { ValidationError } from './validation-error.js'; @@ -48,4 +49,15 @@ describe('[Errors]', () => { }); }); }); + + describe('bad-request-error', () => { + it('should parse to json correctly', () => { + const error = new BadRequestError('error message'); + + expect(error.toJSON()).toStrictEqual({ + code: 400, + error: 'error message', + }); + }); + }); });