mirror of
https://github.com/samiyev/puaros.git
synced 2025-12-28 07:16:53 +05:00
feat: add repository pattern validation (v0.5.0)
Add comprehensive Repository Pattern validation to detect violations and ensure proper domain-infrastructure separation. Features: - ORM type detection in repository interfaces (25+ patterns) - Concrete repository usage detection in use cases - Repository instantiation detection (new Repository()) - Domain language validation for repository methods - Smart violation reporting with fix suggestions Tests: - 31 new tests for repository pattern detection - 292 total tests passing (100% pass rate) - 96.77% statement coverage, 83.82% branch coverage Examples: - 8 example files (4 bad patterns, 4 good patterns) - Demonstrates Clean Architecture and SOLID principles
This commit is contained in:
@@ -0,0 +1,67 @@
|
||||
/**
|
||||
* ❌ BAD EXAMPLE: Concrete repository in use case
|
||||
*
|
||||
* Use case depends on concrete repository implementation instead of interface.
|
||||
* This violates Dependency Inversion Principle.
|
||||
*/
|
||||
|
||||
class CreateUser {
|
||||
constructor(private userRepo: PrismaUserRepository) {}
|
||||
|
||||
async execute(data: CreateUserRequest): Promise<UserResponseDto> {
|
||||
const user = User.create(data.email, data.name)
|
||||
await this.userRepo.save(user)
|
||||
return UserMapper.toDto(user)
|
||||
}
|
||||
}
|
||||
|
||||
class PrismaUserRepository {
|
||||
constructor(private prisma: any) {}
|
||||
|
||||
async save(user: User): Promise<void> {
|
||||
await this.prisma.user.create({
|
||||
data: {
|
||||
email: user.getEmail(),
|
||||
name: user.getName(),
|
||||
},
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
class User {
|
||||
static create(email: string, name: string): User {
|
||||
return new User(email, name)
|
||||
}
|
||||
|
||||
constructor(
|
||||
private email: string,
|
||||
private name: string,
|
||||
) {}
|
||||
|
||||
getEmail(): string {
|
||||
return this.email
|
||||
}
|
||||
|
||||
getName(): string {
|
||||
return this.name
|
||||
}
|
||||
}
|
||||
|
||||
interface CreateUserRequest {
|
||||
email: string
|
||||
name: string
|
||||
}
|
||||
|
||||
interface UserResponseDto {
|
||||
email: string
|
||||
name: string
|
||||
}
|
||||
|
||||
class UserMapper {
|
||||
static toDto(user: User): UserResponseDto {
|
||||
return {
|
||||
email: user.getEmail(),
|
||||
name: user.getName(),
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user