package repository import ( "database/sql" "fmt" ) type baseRepository[T any] struct { db *sql.DB tableName string } func NewBaseRepository[T any](db *sql.DB, tableName string) Repository[T] { return &baseRepository[T]{ db: db, tableName: tableName, } } func (r *baseRepository[T]) BuildQuery(baseQuery string) string { return fmt.Sprintf(baseQuery, r.tableName) } func (r *baseRepository[T]) GetDB() *sql.DB { return r.db } func (r *baseRepository[T]) GetByID(id int) (*T, error) { var entity T query := r.BuildQuery("SELECT * FROM %s WHERE id = ?") err := r.db.QueryRow( query, id, ).Scan(entity) if err != nil { if err == sql.ErrNoRows { return nil, nil } return nil, err } return &entity, nil } func (r *baseRepository[T]) GetAll() ([]T, error) { query := r.BuildQuery("SELECT * FROM %s ORDER BY id DESC") rows, err := r.db.Query(query) if err != nil { return nil, err } defer rows.Close() entities := make([]T, 0) for rows.Next() { var entity T if err := rows.Scan(entity); err != nil { return nil, err } entities = append(entities, entity) } if err = rows.Err(); err != nil { return nil, err } return entities, nil } func (r *baseRepository[T]) Delete(id int) error { query := r.BuildQuery("DELETE %s WHERE id = ? LIMIT 1") _, err := r.db.Exec(query, id) return err }