mirror of
https://github.com/samiyev/puaros.git
synced 2025-12-27 23:06:54 +05:00
docs: add framework leak examples
- Add UserWithFrameworks.ts example showing framework leaks in domain - Add examples/bad/ directory with anti-pattern demonstrations - Demonstrate common mistakes: Prisma in domain, Express types, etc.
This commit is contained in:
@@ -0,0 +1,23 @@
|
||||
/**
|
||||
* BAD EXAMPLE: Framework Leaks in Domain Layer
|
||||
* This file should be in a domain layer structure to be detected
|
||||
*/
|
||||
|
||||
import { PrismaClient } from "@prisma/client"
|
||||
import { Request, Response } from "express"
|
||||
import axios from "axios"
|
||||
|
||||
export class UserWithFrameworkLeaks {
|
||||
private prisma = new PrismaClient()
|
||||
|
||||
async save(): Promise<void> {
|
||||
await this.prisma.user.create({
|
||||
data: { id: "1", email: "test@example.com" },
|
||||
})
|
||||
}
|
||||
|
||||
async validateEmail(email: string): Promise<boolean> {
|
||||
const response = await axios.post("https://api.validator.com/email", { email })
|
||||
return response.data.valid
|
||||
}
|
||||
}
|
||||
58
packages/guardian/examples/bad/FrameworkLeak.ts
Normal file
58
packages/guardian/examples/bad/FrameworkLeak.ts
Normal file
@@ -0,0 +1,58 @@
|
||||
/**
|
||||
* BAD EXAMPLE: Framework Leak in Domain Layer
|
||||
*
|
||||
* This file violates Clean Architecture by importing framework-specific packages
|
||||
* directly into the domain layer, creating tight coupling.
|
||||
*
|
||||
* Issues:
|
||||
* 1. Direct Prisma dependency in domain (ORM leak)
|
||||
* 2. Express types in domain (web framework leak)
|
||||
* 3. Axios in domain (HTTP client leak)
|
||||
*
|
||||
* Fix: Use interfaces in domain, implement in infrastructure
|
||||
*/
|
||||
|
||||
import { PrismaClient } from "@prisma/client"
|
||||
import { Request, Response } from "express"
|
||||
import axios from "axios"
|
||||
|
||||
// ❌ Bad: Domain entity with database dependency
|
||||
export class UserWithPrisma {
|
||||
private prisma = new PrismaClient()
|
||||
|
||||
constructor(
|
||||
private id: string,
|
||||
private email: string,
|
||||
) {}
|
||||
|
||||
async save(): Promise<void> {
|
||||
await this.prisma.user.create({
|
||||
data: { id: this.id, email: this.email },
|
||||
})
|
||||
}
|
||||
|
||||
async find(id: string): Promise<UserWithPrisma | null> {
|
||||
const user = await this.prisma.user.findUnique({ where: { id } })
|
||||
return user ? new UserWithPrisma(user.id, user.email) : null
|
||||
}
|
||||
}
|
||||
|
||||
// ❌ Bad: Domain service with HTTP dependency
|
||||
export class UserServiceWithAxios {
|
||||
async validateEmail(email: string): Promise<boolean> {
|
||||
const response = await axios.post("https://api.validator.com/email", { email })
|
||||
return response.data.valid
|
||||
}
|
||||
}
|
||||
|
||||
// ❌ Bad: Domain value object with web framework dependency
|
||||
export class EmailRequest {
|
||||
constructor(
|
||||
public req: Request,
|
||||
public res: Response,
|
||||
) {}
|
||||
|
||||
getEmail(): string {
|
||||
return this.req.body.email
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user