Présenté par Maël Sicard-Cras
Qui suis-je?
Qui êtes vous?
Vous & la Clean Architecture?
Alors parlons de ...
const fastify = require('fastify')({ logger: true })
fastify.get('/api/v1/malwares', async (request, reply) => {
return await orm.getRepository(Malware).find();
})
fastify.get('/api/v1/malwares/:id', async (request, reply) => {
return await orm.getRepository(Malware).findOne(request.params.id);
})
const start = async () => {
await fastify.listen({ port: 3000 })
}
start()
const fastify = require('fastify')({ logger: true })
interface MalwareEntity {
actor: string;
malwareName: string;
}
async getAllMalwares(): Promise<MalwareEntity[]> {
return await orm.getRepository(Malware).find();
}
async getMalwareById(id: number): Promise<MalwareEntity> {
return await orm.getRepository(Malware).findOne(id);
}
fastify.get('/api/v1/malwares', async (request, reply) => {
return await getAllMalwares()
})
fastify.get('/api/v1/malwares/:id', async (request, reply) => {
return await getMalwareById(request.params.id)
})
const start = async () => {
await fastify.listen({ port: 3000 })
}
start()
const fastify = require('fastify')({ logger: true })
// Domain
interface MalwareEntity {
actor: string;
malwareName: string;
}
// SPI (Application <---> Database)
async getAllMalwares(): Promise<MalwareEntity[]> {
return await orm.getRepository(Malware).find();
}
async getMalwareById(id: number): Promise<MalwareEntity> {
return await orm.getRepository(Malware).findOne(id);
}
// API (Clients <---> Application)
fastify.get('/api/v1/malwares', async (request, reply) => {
return await getAllMalwares()
})
fastify.get('/api/v1/malwares/:id', async (request, reply) => {
return await getMalwareById(request.params.id)
})
const start = async () => {
await fastify.listen({ port: 3000 })
}
start()
// 1 - EXTERNAL INTERFACES: src/infrastructure/app.ts
const fastify = require('fastify')({ logger: true })
const start = async () => {
await fastify.listen({ port: 3000 })
}
start()
// 2 - ADAPTER (SPI): src/adapter/spi/db/repository.ts
async getAllMalwares(): Promise<MalwareEntity[]> {
return await orm.getRepository(Malware).findOne(id);
}
async getMalwareById(id: number): Promise<MalwareEntity> {
return await orm.getRepository(Malware).find();
}
// 2 - ADAPTER (API): src/adapter/api/controller.ts
fastify.get('/api/v1/malwares', async (request, reply) => {
return await new GetAllMalwaresUseCase().execute()
})
fastify.get('/api/v1/malwares/:id', async (request, reply) => {
return await new GetOneMalwareByIdUseCase(request.params.id).execute()
})
// 3 - USE CASES: src/application/usecases/getAllMalwaresUseCase.ts
class GetAllMalwaresUseCase{
async execute(): Promise<MalwareEntity[]> {
return await repository.getAllMalwares();
}
}
// 3 - USE CASES: src/application/usecases/GetOneMalwareByIdUseCase.ts
class GetOneMalwareByIdUseCase{
async execute(): Promise<MalwareEntity> {
return await repository.getMalwareById(id);
}
}
// 4 - ENTITIES: src/domain/entities.ts
interface MalwareEntity {
actor: string;
malwareName: string;
}
//current path: src/application/usecases/GetOneMalwareByIdUseCase.ts
import {MalwaresMySqlRepository} from "src/adapter/spi/db/malwares_repository";
import {MalwareEntity} from "src/domain/entities/malware_entity";
export class GetAllMalwaresUseCase {
private repository: MalwaresMySqlRepository;
constructor() {
this.repository = new MalwaresMySqlRepository();
}
async execute(): Promise<MalwareEntity[]> {
return await this.repository.getAllMalwares();
}
}
//current path: src/application/usecases/GetOneMalwareByIdUseCase.ts
import {MalwaresRepositoryInterface} from "src/application/repositories/malwares_repository_interface";
import {MalwareEntity} from "src/domain/entities/malware_entity";
export class GetAllMalwaresUseCase {
private repository: MalwaresRepositoryInterface;
constructor(repository: MalwaresRepositoryInterface) {
this.repository = repository;
}
async execute(): Promise<MalwareEntity[]> {
return await this.repository.getAllMalwares();
}
}
Video Typescript
Video Python
const fastify = require('fastify')({ logger: true })
fastify.get('/api/v1/malwares', async (request, reply) => {
return await orm.getRepository(Malware).find();
})
fastify.get('/api/v1/malwares/:id', async (request, reply) => {
return await orm.getRepository(Malware).findOne(request.params.id);
})
const start = async () => {
await fastify.listen({ port: 3000 })
}
start()
“It is not enough for code to work...”Robert C. Martin (Uncle Bob)’s Clean Code: A Handbook of Agile Software Craftsmanship
https://github.com/MSC29
https://dev.to/msc29