Skip to content

Commit 58ff046

Browse files
fourth commit
1 parent bd9ecc3 commit 58ff046

File tree

14 files changed

+143
-5
lines changed

14 files changed

+143
-5
lines changed
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import { Application, Request, Response } from 'express'
2+
import { UserService } from '../../services/UserService'
3+
import { UserPresenter } from '../presenters/UserPresenter'
4+
5+
export default (app: Application, userService: UserService) => {
6+
app.get('/api/users/:id', async (req: Request, res: Response) => {
7+
const { id } = req.params
8+
try {
9+
const user = await userService.getUserById(Number(id))
10+
if (!user) {
11+
return res.status(404).json({ error: 'User not found' })
12+
}
13+
res.json(UserPresenter.toResponse(user))
14+
} catch (error) {
15+
res.status(500).json({ error: 'Internal Server Error' })
16+
}
17+
})
18+
19+
app.get('/api/users', async (req: Request, res: Response) => {
20+
try {
21+
const users = await userService.getUsers()
22+
if (!users || users.length === 0) {
23+
return res.status(404).json({ error: 'No users found' })
24+
}
25+
res.json(UserPresenter.toResponseArray(users))
26+
} catch (error) {
27+
res.status(500).json({ error: 'Internal Server Error' })
28+
}
29+
})
30+
}

src/adapters/controllers/index.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,17 @@
11
import { Application } from 'express'
22
import { readdirSync } from 'fs'
33
import { join } from 'path'
4+
import { IUserRepository } from '../repositories/UserRepository'
45

5-
export default (app: Application) => {
6+
export default (app: Application, userRepository: IUserRepository) => {
67
const controllersPath = __dirname
78

89
readdirSync(controllersPath)
910
.filter((file) => file.endsWith('.ts') && file !== 'index.ts')
1011
.forEach(async (file) => {
1112
const controller = await import(join(controllersPath, file))
1213
if (typeof controller.default === 'function') {
13-
controller.default(app)
14+
controller.default(app, userRepository)
1415
}
1516
})
1617
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import { User } from '../../entities/User'
2+
3+
export class UserPresenter {
4+
static toResponse(user: User): User {
5+
return {
6+
id: user.id,
7+
name: user.name
8+
}
9+
}
10+
11+
static toResponseArray(users: User[]): User[] {
12+
return users.map((user) => this.toResponse(user))
13+
}
14+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import { User } from '../../entities/User'
2+
3+
const users: User[] = [
4+
{ id: 1, name: 'John Doe' },
5+
{ id: 2, name: 'Jane Smith' }
6+
]
7+
8+
export interface IUserRepository {
9+
getUsers(): User[]
10+
}
11+
12+
export class UserRepository implements IUserRepository {
13+
getUsers(): User[] {
14+
return users
15+
}
16+
17+
getUserById(userId: number): User | null {
18+
return users.find((user) => user.id === userId) || null
19+
}
20+
}

src/entities/User.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
export interface User {
2+
id: number
3+
name: string
4+
}

src/frameworks/express/server.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,13 @@ import cors from 'cors'
33
import swaggerUi from 'swagger-ui-express'
44
import specs from '../../swagger'
55
import registerControllers from '../../adapters/controllers'
6+
import { UserRepository } from '../../adapters/repositories/UserRepository'
67

78
const app: Application = express()
9+
const userRepository = new UserRepository()
810

911
app.use(cors())
10-
1112
app.use(express.json())
12-
1313
app.use('/api-docs', swaggerUi.serve, swaggerUi.setup(specs))
1414

1515
/**
@@ -38,6 +38,6 @@ app.get('/health/ping', (req: Request, res: Response) => {
3838
res.json({ success: true, message: 'Check OK' })
3939
})
4040

41-
registerControllers(app)
41+
registerControllers(app, userRepository)
4242

4343
export default app

src/services/UserService.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import { User } from '../entities/User'
2+
import { GetUserUseCase } from '../useCases/getUser/GetUserUseCase'
3+
import { IGetUserRepository } from '../useCases/getUser/IGetUserRepository'
4+
5+
export class UserService {
6+
constructor(private readonly getUserRepository: IGetUserRepository) {}
7+
8+
async getUserById(userId: number): Promise<User | null> {
9+
const getUserUseCase = new GetUserUseCase(this.getUserRepository)
10+
return getUserUseCase.execute(userId)
11+
}
12+
13+
async getUsers(): Promise<User[] | null> {
14+
return this.getUserRepository.getUsers()
15+
}
16+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import { User } from '../../entities/User'
2+
import { IGetUserRepository } from './IGetUserRepository'
3+
4+
export class GetUserController {
5+
constructor(private readonly userRepository: IGetUserRepository) {}
6+
7+
async execute(): Promise<User[]> {
8+
return this.userRepository.getUsers()
9+
}
10+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import { Application, Request, Response } from 'express'
2+
import { UserRepository } from '../../adapters/repositories/UserRepository'
3+
import { UserPresenter } from '../../adapters/presenters/UserPresenter'
4+
5+
export default (app: Application, userRepository: UserRepository) => {
6+
app.get('/api/users/:id', async (req: Request, res: Response) => {
7+
const { id } = req.params
8+
try {
9+
const user = await userRepository.getUserById(Number(id))
10+
if (!user) {
11+
return res.status(404).json({ error: 'User not found' })
12+
}
13+
res.json(UserPresenter.toResponse(user))
14+
} catch (error) {
15+
res.status(500).json({ error: 'Internal Server Error' })
16+
}
17+
})
18+
19+
app.get('/api/users', async (req: Request, res: Response) => {
20+
try {
21+
const users = userRepository.getUsers()
22+
res.json(UserPresenter.toResponseArray(users))
23+
} catch (error) {
24+
res.status(500).json({ error: 'Internal Server Error' })
25+
}
26+
})
27+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import { User } from '../../entities/User'
2+
import { IGetUserRepository } from './IGetUserRepository'
3+
4+
export class GetUserUseCase {
5+
constructor(private readonly userRepository: IGetUserRepository) {}
6+
7+
async execute(userId: number): Promise<User | null> {
8+
return this.userRepository.getUserById(userId)
9+
}
10+
}

0 commit comments

Comments
 (0)