feat: add contact repository and base repository for shared db logic
This commit is contained in:
76
internal/repository/base_repository.go
Normal file
76
internal/repository/base_repository.go
Normal file
@@ -0,0 +1,76 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user