Skip to content

Commit e5de294

Browse files
seventh commit
1 parent 9d28018 commit e5de294

File tree

16 files changed

+296
-47
lines changed

16 files changed

+296
-47
lines changed

README.md

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,14 +30,22 @@ src/
3030
│ └── Validation.ts
3131
└── useCases/
3232
└── user/
33-
├── createUser/
33+
├── create/
3434
│ ├── CreateUserController.ts
3535
│ ├── CreateUserUseCase.ts
3636
│ └── ICreateUserRepository.ts
37-
└── getUser/
38-
├── GetUserController.ts
39-
├── GetUserUseCase.ts
40-
└── IGetUserRepository.ts
37+
├── delete/
38+
│ ├── DeleteUserController.ts
39+
│ ├── DeleteUserUseCase.ts
40+
│ └── IDeleteUserRepository.ts
41+
├── get/
42+
│ ├── GetUserController.ts
43+
│ ├── GetUserUseCase.ts
44+
│ └── IGetUserRepository.ts │
45+
└── put/
46+
├── PutUserController.ts
47+
├── PutUserUseCase.ts
48+
└── IPutUserRepository.ts
4149
└── index.ts
4250
4351
```

package-lock.json

Lines changed: 40 additions & 14 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
"nodemon": "^3.1.1",
3636
"prettier": "^3.2.5",
3737
"ts-node": "^10.9.2",
38+
"tsconfig-paths": "^4.2.0",
3839
"typescript": "^5.4.5"
3940
},
4041
"volta": {

src/adapters/controllers/UserController.ts

Lines changed: 119 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,72 @@
11
import { Application, Request, Response } from 'express'
2-
import { UserService } from '../../services/UserService'
2+
import { UserService } from '@/services/UserService'
33
import { UserPresenter } from '../presenters/UserPresenter'
44

55
export default (app: Application, userService: UserService) => {
6+
/**
7+
* @swagger
8+
* /api/users:
9+
* post:
10+
* summary: Cria um novo usuário
11+
* requestBody:
12+
* required: true
13+
* content:
14+
* application/json:
15+
* schema:
16+
* type: object
17+
* properties:
18+
* name:
19+
* type: string
20+
* responses:
21+
* '201':
22+
* description: Mensagem de sucesso
23+
*/
24+
app.post('/api/users', async (req: Request, res: Response) => {
25+
try {
26+
const user = await userService.createUser(req.body)
27+
res.status(201).json(UserPresenter.toResponse(user))
28+
} catch (error) {
29+
res.status(500).json({ error: 'Internal Server Error' })
30+
}
31+
})
32+
33+
/**
34+
* @swagger
35+
* /api/users:
36+
* get:
37+
* summary: Busca todos os usuários cadastrados
38+
* responses:
39+
* '200':
40+
* description: Mensagem de sucesso
41+
*/
42+
app.get('/api/users', async (req: Request, res: Response) => {
43+
try {
44+
const users = await userService.getUsers()
45+
if (!users || users.length === 0) {
46+
return res.status(404).json({ error: 'No users found' })
47+
}
48+
res.json(UserPresenter.toResponseArray(users))
49+
} catch (error) {
50+
res.status(500).json({ error: 'Internal Server Error' })
51+
}
52+
})
53+
54+
/**
55+
* @swagger
56+
* /api/users/{id}:
57+
* get:
58+
* summary: Verifica se existe usuário com o ID informado
59+
* parameters:
60+
* - in: path
61+
* name: id
62+
* required: true
63+
* description: ID do usuário a ser consultado
64+
* schema:
65+
* type: string
66+
* responses:
67+
* '200':
68+
* description: Mensagem de sucesso
69+
*/
670
app.get('/api/users/:id', async (req: Request, res: Response) => {
771
const { id } = req.params
872
try {
@@ -16,22 +80,68 @@ export default (app: Application, userService: UserService) => {
1680
}
1781
})
1882

19-
app.get('/api/users', async (req: Request, res: Response) => {
83+
/**
84+
* @swagger
85+
* /api/users/{id}:
86+
* put:
87+
* summary: Atualiza informações do usuário com o ID informado
88+
* parameters:
89+
* - in: path
90+
* name: id
91+
* required: true
92+
* description: ID do usuário a ser atualizado
93+
* schema:
94+
* type: string
95+
* requestBody:
96+
* required: true
97+
* content:
98+
* application/json:
99+
* schema:
100+
* type: object
101+
* properties:
102+
* name:
103+
* type: string
104+
* responses:
105+
* '200':
106+
* description: Mensagem de sucesso
107+
*/
108+
app.put('/api/users/:id', async (req: Request, res: Response) => {
109+
const { id } = req.params
20110
try {
21-
const users = await userService.getUsers()
22-
if (!users || users.length === 0) {
23-
return res.status(404).json({ error: 'No users found' })
111+
const user = await userService.putUserById(id, req.body)
112+
if (!user) {
113+
return res.status(404).json({ error: 'User not found' })
24114
}
25-
res.json(UserPresenter.toResponseArray(users))
115+
res.json(UserPresenter.toResponse(req.body))
26116
} catch (error) {
27117
res.status(500).json({ error: 'Internal Server Error' })
28118
}
29119
})
30120

31-
app.post('/api/users', async (req: Request, res: Response) => {
121+
/**
122+
* @swagger
123+
* /api/users/{id}:
124+
* delete:
125+
* summary: Deleta usuário com o ID informado
126+
* parameters:
127+
* - in: path
128+
* name: id
129+
* required: true
130+
* description: ID do usuário a ser deletado
131+
* schema:
132+
* type: string
133+
* responses:
134+
* '200':
135+
* description: Mensagem de sucesso
136+
*/
137+
app.delete('/api/users/:id', async (req: Request, res: Response) => {
138+
const { id } = req.params
32139
try {
33-
const user = await userService.createUser(req.body)
34-
res.status(201).json(UserPresenter.toResponse(user))
140+
const user = await userService.deleteUserById(id)
141+
if (!user) {
142+
return res.status(404).json({ error: 'User not found' })
143+
}
144+
res.json(UserPresenter.toResponse(user))
35145
} catch (error) {
36146
res.status(500).json({ error: 'Internal Server Error' })
37147
}

src/adapters/presenters/UserPresenter.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { User } from '../../entities/User'
1+
import { User } from '@/entities/User'
22

33
export class UserPresenter {
44
static toResponse(user: User): User {
Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,19 @@
11
import User, { IUser } from '../../frameworks/typeorm/entities/UserEntity'
22

33
export interface IUserRepository {
4+
createUser(userData: Partial<IUser>): Promise<IUser>
45
getUsers(): Promise<IUser[]>
56
getUserById(userId: string): Promise<IUser | null>
6-
createUser(userData: Partial<IUser>): Promise<IUser>
7+
putUserById(userId: string, userData: Partial<IUser>): Promise<IUser | null>
8+
deleteUserById(userId: string): Promise<IUser | null>
79
}
810

911
export class UserRepository implements IUserRepository {
12+
async createUser(userData: Partial<IUser>): Promise<IUser> {
13+
const user = new User(userData)
14+
return user.save()
15+
}
16+
1017
async getUsers(): Promise<IUser[]> {
1118
return User.find().exec()
1219
}
@@ -15,8 +22,14 @@ export class UserRepository implements IUserRepository {
1522
return User.findById(userId).exec()
1623
}
1724

18-
async createUser(userData: Partial<IUser>): Promise<IUser> {
19-
const user = new User(userData)
20-
return user.save()
25+
async putUserById(
26+
userId: string,
27+
userData: Partial<IUser>
28+
): Promise<IUser | null> {
29+
return User.findByIdAndUpdate(userId, userData).exec()
30+
}
31+
32+
async deleteUserById(userId: string): Promise<IUser | null> {
33+
return User.findByIdAndDelete(userId).exec()
2134
}
2235
}

src/services/UserService.ts

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,37 @@
1-
import { User } from '../entities/User'
2-
import { GetUserUseCase } from '../useCases/User/get/GetUserUseCase'
3-
import { CreateUserUseCase } from '../useCases/User/create/CreateUserUseCase'
4-
import { UserRepository } from '../adapters/repositories/UserRepository'
1+
import { User } from '@/entities/User'
2+
import { CreateUserUseCase } from '@/useCases/User/create/CreateUserUseCase'
3+
import { GetUserUseCase } from '@/useCases/User/get/GetUserUseCase'
4+
import { PutUserUseCase } from '@/useCases/User/put/PutUserUseCase'
5+
import { DeleteUserUseCase } from '@/useCases/User/delete/DeleteUserUseCase'
6+
import { UserRepository } from '@/adapters/repositories/UserRepository'
57

68
export class UserService {
79
constructor(private readonly userRepository: UserRepository) {}
810

9-
async getUserById(userId: string): Promise<User | null> {
10-
const getUserUseCase = new GetUserUseCase(this.userRepository)
11-
return getUserUseCase.execute(userId)
11+
async createUser(userData: Partial<User>): Promise<User> {
12+
const createUserUseCase = new CreateUserUseCase(this.userRepository)
13+
return createUserUseCase.execute(userData)
1214
}
1315

1416
async getUsers(): Promise<User[]> {
1517
return this.userRepository.getUsers()
1618
}
1719

18-
async createUser(userData: Partial<User>): Promise<User> {
19-
const createUserUseCase = new CreateUserUseCase(this.userRepository)
20-
return createUserUseCase.execute(userData)
20+
async getUserById(userId: string): Promise<User | null> {
21+
const getUserUseCaseId = new GetUserUseCase(this.userRepository)
22+
return getUserUseCaseId.execute(userId)
23+
}
24+
25+
async putUserById(
26+
userId: string,
27+
userData: Partial<User>
28+
): Promise<User | null> {
29+
const putUserUseCase = new PutUserUseCase(this.userRepository)
30+
return putUserUseCase.execute(userId, userData)
31+
}
32+
33+
async deleteUserById(userId: string): Promise<User | null> {
34+
const deleteUserUseCase = new DeleteUserUseCase(this.userRepository)
35+
return deleteUserUseCase.execute(userId)
2136
}
2237
}

src/swagger.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,10 @@ const options = {
99
description: 'Documentation for the Clean Architecture API'
1010
}
1111
},
12-
apis: ['./src/frameworks/express/server.ts']
12+
apis: [
13+
'./src/frameworks/express/server.ts',
14+
'./src/adapters/controllers/*.ts'
15+
],
1316
}
1417

1518
const specs = swaggerJsdoc(options)

0 commit comments

Comments
 (0)