abstract class User {
abstract login(email: string, password: string): void
abstract sendCode(email: string, code: string): void
}
abstract class Auth {
abstract login(email: string, password: string): void
}
abstract class Email {
abstract send(email: string, message: string): void
}
abstract class Repository<T, K extends keyof T> {
abstract findAll(): T[];
abstract findOne(key: T[K]): T[];
abstract create(entity: Omit<T, K>): void;
abstract update(key: T[K], entity: Partial<T>): void;
abstract remove(key: T[K]): void;
}
abstract class UserRepository extends Repository<User, 'id'> {
abstract findOneByEmail(email: string): User
}