Skip to content

Commit 9d28018

Browse files
sixth commit
1 parent 3804e12 commit 9d28018

File tree

11 files changed

+89
-47
lines changed

11 files changed

+89
-47
lines changed

src/adapters/controllers/UserController.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ export default (app: Application, userService: UserService) => {
66
app.get('/api/users/:id', async (req: Request, res: Response) => {
77
const { id } = req.params
88
try {
9-
const user = await userService.getUserById(Number(id))
9+
const user = await userService.getUserById(id)
1010
if (!user) {
1111
return res.status(404).json({ error: 'User not found' })
1212
}
@@ -27,4 +27,13 @@ export default (app: Application, userService: UserService) => {
2727
res.status(500).json({ error: 'Internal Server Error' })
2828
}
2929
})
30+
31+
app.post('/api/users', async (req: Request, res: Response) => {
32+
try {
33+
const user = await userService.createUser(req.body)
34+
res.status(201).json(UserPresenter.toResponse(user))
35+
} catch (error) {
36+
res.status(500).json({ error: 'Internal Server Error' })
37+
}
38+
})
3039
}
Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,22 @@
1-
import { User } from '../../entities/User'
2-
3-
const users: User[] = [
4-
{ id: 1, name: 'John Doe' },
5-
{ id: 2, name: 'Jane Smith' }
6-
]
1+
import User, { IUser } from '../../frameworks/typeorm/entities/UserEntity'
72

83
export interface IUserRepository {
9-
getUsers(): User[]
4+
getUsers(): Promise<IUser[]>
5+
getUserById(userId: string): Promise<IUser | null>
6+
createUser(userData: Partial<IUser>): Promise<IUser>
107
}
118

129
export class UserRepository implements IUserRepository {
13-
getUsers(): User[] {
14-
return users
10+
async getUsers(): Promise<IUser[]> {
11+
return User.find().exec()
12+
}
13+
14+
async getUserById(userId: string): Promise<IUser | null> {
15+
return User.findById(userId).exec()
1516
}
1617

17-
getUserById(userId: number): User | null {
18-
return users.find((user) => user.id === userId) || null
18+
async createUser(userData: Partial<IUser>): Promise<IUser> {
19+
const user = new User(userData)
20+
return user.save()
1921
}
2022
}

src/entities/User.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
export interface User {
2-
id: number
2+
id?: string
33
name: string
44
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import mongoose, { Schema, Document } from 'mongoose'
2+
3+
export interface IUser extends Document {
4+
name: string
5+
}
6+
7+
const UserSchema: Schema = new Schema({
8+
name: { type: String, required: true }
9+
})
10+
11+
export default mongoose.model<IUser>('User', UserSchema)

src/services/UserService.ts

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,22 @@
11
import { User } from '../entities/User'
22
import { GetUserUseCase } from '../useCases/User/get/GetUserUseCase'
3-
import { IGetUserRepository } from '../useCases/User/get/IGetUserRepository'
3+
import { CreateUserUseCase } from '../useCases/User/create/CreateUserUseCase'
4+
import { UserRepository } from '../adapters/repositories/UserRepository'
45

56
export class UserService {
6-
constructor(private readonly getUserRepository: IGetUserRepository) {}
7+
constructor(private readonly userRepository: UserRepository) {}
78

8-
async getUserById(userId: number): Promise<User | null> {
9-
const getUserUseCase = new GetUserUseCase(this.getUserRepository)
9+
async getUserById(userId: string): Promise<User | null> {
10+
const getUserUseCase = new GetUserUseCase(this.userRepository)
1011
return getUserUseCase.execute(userId)
1112
}
1213

13-
async getUsers(): Promise<User[] | null> {
14-
return this.getUserRepository.getUsers()
14+
async getUsers(): Promise<User[]> {
15+
return this.userRepository.getUsers()
16+
}
17+
18+
async createUser(userData: Partial<User>): Promise<User> {
19+
const createUserUseCase = new CreateUserUseCase(this.userRepository)
20+
return createUserUseCase.execute(userData)
1521
}
1622
}
Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,16 @@
1-
import { User } from '../../../entities/User'
2-
import { IGetUserRepository } from './IGetUserRepository'
1+
import { Request, Response } from 'express'
2+
import { UserService } from '../../../services/UserService'
3+
import { UserPresenter } from '../../../adapters/presenters/UserPresenter'
34

4-
export class GetUserController {
5-
constructor(private readonly userRepository: IGetUserRepository) {}
5+
export class CreateUserController {
6+
constructor(private readonly userService: UserService) {}
67

7-
async execute(): Promise<User[]> {
8-
return this.userRepository.getUsers()
8+
async handle(req: Request, res: Response): Promise<void> {
9+
try {
10+
const user = await this.userService.createUser(req.body)
11+
res.status(201).json(UserPresenter.toResponse(user))
12+
} catch (error) {
13+
res.status(500).json({ error: 'Internal Server Error' })
14+
}
915
}
1016
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import { IUser } from '../../../frameworks/typeorm/entities/UserEntity'
2+
import { UserRepository } from '../../../adapters/repositories/UserRepository'
3+
4+
export class CreateUserUseCase {
5+
constructor(private userRepository: UserRepository) {}
6+
7+
async execute(userData: Partial<IUser>): Promise<IUser> {
8+
return this.userRepository.createUser(userData)
9+
}
10+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import { IUser } from '../../../frameworks/typeorm/entities/UserEntity'
2+
3+
export interface ICreateUserRepository {
4+
createUser(userData: Partial<IUser>): Promise<IUser>
5+
}
Lines changed: 8 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,20 @@
1-
import { Application, Request, Response } from 'express'
2-
import { UserRepository } from '../../../adapters/repositories/UserRepository'
1+
import { Request, Response } from 'express'
2+
import { UserService } from '../../../services/UserService'
33
import { UserPresenter } from '../../../adapters/presenters/UserPresenter'
44

5-
export default (app: Application, userRepository: UserRepository) => {
6-
app.get('/api/users/:id', async (req: Request, res: Response) => {
5+
export class GetUserController {
6+
constructor(private readonly userService: UserService) {}
7+
8+
async handle(req: Request, res: Response): Promise<void> {
79
const { id } = req.params
810
try {
9-
const user = await userRepository.getUserById(Number(id))
11+
const user = await this.userService.getUserById(id)
1012
if (!user) {
1113
return res.status(404).json({ error: 'User not found' })
1214
}
1315
res.json(UserPresenter.toResponse(user))
1416
} catch (error) {
1517
res.status(500).json({ error: 'Internal Server Error' })
1618
}
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-
})
19+
}
2720
}
Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
import { User } from '../../../entities/User'
2-
import { IGetUserRepository } from './IGetUserRepository'
1+
import { IUser } from '../../../frameworks/typeorm/entities/UserEntity'
2+
import { UserRepository } from '../../../adapters/repositories/UserRepository'
33

44
export class GetUserUseCase {
5-
constructor(private readonly userRepository: IGetUserRepository) {}
5+
constructor(private readonly userRepository: UserRepository) {}
66

7-
async execute(userId: number): Promise<User | null> {
7+
async execute(userId: string): Promise<IUser | null> {
88
return this.userRepository.getUserById(userId)
99
}
1010
}

0 commit comments

Comments
 (0)