interface BaseRepository<T extends MySqlTable,
S extends SelectedFields<MySqlColumn, T>> {
findAll(): Promise<S[]>;
findById(id: number): Promise<S | null>;
create(data: InferInsertModel<T>): Promise<number>;
delete(id: number): Promise<void>;
findAllPaginated(page: number, limit: number, condition?: SQL<unknown>): Promise<Pagination<S>>;
}
export abstract class CrudRepository<
M extends MySqlTable & { id: SQLWrapper, deletedAt: SQLWrapper },
S extends SelectedFields<MySqlColumn, M>
> implements BaseRepository<M, S> {
// ....implementation
}
export const userTable = mysqlTable("user", {
id: int('id').primaryKey().autoincrement().notNull(),
email: varchar("email", { length: 255 }).notNull(),
password: varchar("password", { length: 255 }).notNull(),
name: varchar("name", { length: 255 }).notNull(),
deletedAt: timestamp("deleted_at"),
});
const userSelect = {
id: userTable.id,
email: userTable.email,
name: userTable.name,
};
export class UserRepository extends CrudRepository<typeof userTable, typeof userSelect> {
constructor(db: DbConnection) {
super(userTable, db, userSelect);
}
}
const userRepository = new UserRepository(db);
const allUsers = userRepository.findAll();
interface BaseRepository<T extends MySqlTable,
S extends SelectedFields<MySqlColumn, T>> {
findAll(): Promise<S[]>;
findById(id: number): Promise<S | null>;
create(data: InferInsertModel<T>): Promise<number>;
delete(id: number): Promise<void>;
findAllPaginated(page: number, limit: number, condition?: SQL<unknown>): Promise<Pagination<S>>;
}
export abstract class CrudRepository<
M extends MySqlTable & { id: SQLWrapper, deletedAt: SQLWrapper },
S extends SelectedFields<MySqlColumn, M>
> implements BaseRepository<M, S> {
// ....implementation
}
export const userTable = mysqlTable("user", {
id: int('id').primaryKey().autoincrement().notNull(),
email: varchar("email", { length: 255 }).notNull(),
password: varchar("password", { length: 255 }).notNull(),
name: varchar("name", { length: 255 }).notNull(),
deletedAt: timestamp("deleted_at"),
});
const userSelect = {
id: userTable.id,
email: userTable.email,
name: userTable.name,
};
export class UserRepository extends CrudRepository<typeof userTable, typeof userSelect> {
constructor(db: DbConnection) {
super(userTable, db, userSelect);
}
}
const userRepository = new UserRepository(db);
const allUsers = userRepository.findAll();