Skip to content

Commit ad9439d

Browse files
committed
feat: usecases de todas as funções das services (Client e Document)
1 parent 713289c commit ad9439d

38 files changed

Lines changed: 459 additions & 125 deletions

README.md

Lines changed: 23 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,22 @@ Este projeto é uma API desenvolvida para processar documentos (PDFs e páginas
2323

2424
---
2525

26+
## 🚀 Tecnologias Utilizadas
27+
28+
- **Linguagem**: TypeScript
29+
- **Framework**: NestJS
30+
- **ORM**: Prisma
31+
- **Autenticação**: JWT e Bcrypt
32+
- **Validação de Dados**: Class Validator
33+
- **Tranformação de Dados**: Class Transform
34+
- **Testes**: Jest e Supertest
35+
- **Containerização**: Docker
36+
- **Web Scraping**: Cheerio
37+
- **Processamento de PDFs**: PDF-Parse
38+
- **CI/CD**: Github Actions
39+
40+
---
41+
2642
## 🔥 Stack Utilizada
2743

2844
- **Node.js**: v20.12.2
@@ -32,29 +48,15 @@ Este projeto é uma API desenvolvida para processar documentos (PDFs e páginas
3248
- **JWT**: v11.0.0
3349
- **Class-validator**: v0.14.1
3450
- **Class-transformer**: v0.5.1
35-
- **Bcrypt**: v3.0.2
51+
- **Bcryptjs**: v3.0.2
3652
- **Cheerio**: v1.0.0
3753
- **Axios**: v1.9.0
38-
- **Prettier**: v3.4.2
3954
- **Docker**: v26.1.1
4055
- **Jest**: v29.7.0
4156
- **Supertest**: v7.0.0
4257
- **ESLint**: v9.18.0
4358
- **Prettier**: v3.4.2
44-
45-
---
46-
47-
## 🚀 Tecnologias Utilizadas
48-
49-
- **Linguagem**: TypeScript
50-
- **Framework**: NestJS
51-
- **ORM**: Prisma
52-
- **Autenticação**: JWT e Bcrypt
53-
- **Validação de Dados**: Class Validator
54-
- **Testes**: Jest e Supertest
55-
- **Containerização**: Docker
56-
- **Web Scraping**: Cheerio
57-
- **Processamento de PDFs**: PDF-Parse
59+
- **Rxjs**: v7.8.1
5860

5961
---
6062

@@ -174,13 +176,15 @@ Após iniciar a aplicação, ela estará disponível em **http://localhost:3000/
174176

175177
- Lista todos os documentos associados ao cliente autenticado.
176178
- **Headers**:
177-
- `Authorization`: Token JWT válido.
179+
- `Authorization`: Token JWT válido, usado para autorizar e obter o ID do cliente.
178180
- **Resposta**:
179181
- `documents`: Lista de documentos pertencentes ao cliente autenticado.
180182

181183
- **GET /client/document/:id**:
182184

183185
- Retorna um documento específico do cliente autenticado.
186+
- **Headers**:
187+
- `Authorization`: Token JWT válido, usado para autorizar e obter o ID do cliente.
184188
- **Parâmetros**:
185189
- `id`: ID do documento.
186190
- **Headers**:
@@ -194,7 +198,7 @@ Após iniciar a aplicação, ela estará disponível em **http://localhost:3000/
194198

195199
- Faz upload de um PDF, processa o conteúdo e associa a um cliente.
196200
- **Headers**:
197-
- `Authorization`: Token JWT válido, usado para obter o ID do cliente.
201+
- `Authorization`: Token JWT válido, usado para autorizar e obter o ID do cliente.
198202
- **Body**:
199203
- `file`: Arquivo PDF.
200204
- **Resposta**:
@@ -204,7 +208,7 @@ Após iniciar a aplicação, ela estará disponível em **http://localhost:3000/
204208

205209
- Processa uma página web a partir de uma URL e associa a um cliente.
206210
- **Headers**:
207-
- `Authorization`: Token JWT válido, usado para obter o ID do cliente.
211+
- `Authorization`: Token JWT válido, usado para autorizar e obter o ID do cliente.
208212
- **Body**:
209213
- `url`: URL da página web a ser processada.
210214
- **Resposta**:
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import { ClientEntity } from '@/domain/entities/client.entity'
2+
3+
export class CreateClientInput implements ClientEntity {
4+
constructor(
5+
public email: string,
6+
public name: string,
7+
public password: string,
8+
) {}
9+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import { ClientEntity } from '@/domain/entities/client.entity'
2+
3+
export class UpdateClientInput implements Partial<ClientEntity> {
4+
name?: string
5+
email?: string
6+
password?: string
7+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import { DocumentEntity } from '@/domain/entities/document.entity'
2+
3+
export class CreateDocumentInput implements DocumentEntity {
4+
constructor(
5+
public title: string,
6+
public content: string,
7+
public sourceType: string,
8+
public clientId: string,
9+
) {}
10+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import { DocumentEntity } from '@/domain/entities/document.entity'
2+
3+
export class UpdateDocumentInput implements Partial<DocumentEntity> {
4+
title?: string
5+
content?: string
6+
sourceType?: string
7+
clientId?: string
8+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
export class EmailJaCadastradoError extends Error {
2+
constructor(clientEmail: string) {
3+
super(`Email '${clientEmail}' já cadastrado`)
4+
this.name = 'EmailJaCadastradoException'
5+
}
6+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
export class DocumentoNaoEncontradoError extends Error {
2+
constructor(documentId: string) {
3+
super(`Documento com o id ${documentId} não encontrado`)
4+
this.name = 'DocumentoNaoEncontradoException'
5+
}
6+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import { CreateClientInput } from '@/application/dtos/client/create-client.input'
2+
import { EmailJaCadastradoError } from '@/application/errors/client/email-ja-cadastrado.exception'
3+
import { IUseCase } from '@/application/usecases/use-case.interface'
4+
import { ClientEntity } from '@/domain/entities/client.entity'
5+
import { IClientRepository } from '@/domain/repositories/client.repository'
6+
7+
export class CreateClientUseCase implements IUseCase {
8+
constructor(
9+
private readonly clientRepository: IClientRepository<ClientEntity>,
10+
) {}
11+
async execute(createClientInput: CreateClientInput) {
12+
const emailFounded = await this.clientRepository.client({
13+
email: createClientInput.email,
14+
})
15+
if (emailFounded) {
16+
throw new EmailJaCadastradoError(createClientInput.email)
17+
}
18+
19+
return await this.clientRepository.createClient(createClientInput)
20+
}
21+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import { IUseCase } from '@/application/usecases/use-case.interface'
2+
import { ClientEntity } from '@/domain/entities/client.entity'
3+
import { IClientRepository } from '@/domain/repositories/client.repository'
4+
5+
export class FindAllClientsUseCase implements IUseCase {
6+
constructor(
7+
private readonly clientRepository: IClientRepository<ClientEntity>,
8+
) {}
9+
async execute() {
10+
return await this.clientRepository.clients({})
11+
}
12+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import { ClienteNaoEncontradoError } from '@/application/errors/client/cliente-nao-encontrado.error'
2+
import { IUseCase } from '@/application/usecases/use-case.interface'
3+
import { ClientEntity } from '@/domain/entities/client.entity'
4+
import { IClientRepository } from '@/domain/repositories/client.repository'
5+
6+
export class FindOneClientUseCase implements IUseCase {
7+
constructor(
8+
private readonly clientRepository: IClientRepository<ClientEntity>,
9+
) {}
10+
async execute(clientId: string) {
11+
const clientFounded = await this.clientRepository.client({ id: clientId })
12+
if (!clientFounded) {
13+
throw new ClienteNaoEncontradoError(clientId)
14+
}
15+
16+
return clientFounded
17+
}
18+
}

0 commit comments

Comments
 (0)