merged postgres repository with base repository

This commit is contained in:
Michael Thomson 2025-05-15 15:40:57 -04:00
parent 651bcce12f
commit 26992f9579
Signed by: mthomson
GPG Key ID: B6CA05EE5F436C79
5 changed files with 88 additions and 95 deletions

View File

@ -10,7 +10,7 @@ import (
"gitea.michaelthomson.dev/mthomson/habits/internal/middleware"
"gitea.michaelthomson.dev/mthomson/habits/internal/migrate"
todohandler "gitea.michaelthomson.dev/mthomson/habits/internal/todo/handler"
todorepository "gitea.michaelthomson.dev/mthomson/habits/internal/todo/repository/postgres"
todorepository "gitea.michaelthomson.dev/mthomson/habits/internal/todo/repository"
todoservice "gitea.michaelthomson.dev/mthomson/habits/internal/todo/service"
"github.com/jackc/pgx/v5/pgxpool"
)
@ -41,7 +41,7 @@ func main() {
migrate.Migrate(logger, db)
// create repos
todoRepository := todorepository.NewPostgresTodoRepository(logger, db)
todoRepository := todorepository.NewTodoRepository(logger, db)
// create services
todoService := todoservice.NewTodoService(logger, todoRepository)

View File

@ -1,85 +0,0 @@
package postgres
import (
"context"
"log/slog"
"gitea.michaelthomson.dev/mthomson/habits/internal/todo/repository"
"github.com/jackc/pgx/v5"
"github.com/jackc/pgx/v5/pgxpool"
)
type PostgresTodoRepository struct {
logger *slog.Logger
db *pgxpool.Pool
}
func NewPostgresTodoRepository(logger *slog.Logger, db *pgxpool.Pool) *PostgresTodoRepository {
return &PostgresTodoRepository{
logger: logger,
db: db,
}
}
func (r *PostgresTodoRepository) GetById(ctx context.Context, id int64) (repository.TodoRow, error) {
todo := repository.TodoRow{}
err := r.db.QueryRow(ctx, "SELECT * FROM todo WHERE id = $1;", id).Scan(&todo.Id, &todo.Name, &todo.Done)
if err != nil {
if err == pgx.ErrNoRows {
return todo, repository.ErrNotFound
}
r.logger.ErrorContext(ctx, err.Error())
return todo, err
}
return todo, nil
}
func (r *PostgresTodoRepository) Create(ctx context.Context, todo repository.TodoRow) (repository.TodoRow, error) {
result := r.db.QueryRow(ctx, "INSERT INTO todo (name, done) VALUES ($1, $2) RETURNING id;", todo.Name, todo.Done)
err := result.Scan(&todo.Id)
if err != nil {
r.logger.ErrorContext(ctx, err.Error())
return repository.TodoRow{}, err
}
return todo, nil
}
func (r *PostgresTodoRepository) Update(ctx context.Context, todo repository.TodoRow) error {
result, err := r.db.Exec(ctx, "UPDATE todo SET name = $1, done = $2 WHERE id = $3;", todo.Name, todo.Done, todo.Id)
if err != nil {
r.logger.ErrorContext(ctx, err.Error())
return err
}
rowsAffected := result.RowsAffected()
if rowsAffected == 0 {
return repository.ErrNotFound
}
return nil
}
func (r *PostgresTodoRepository) Delete(ctx context.Context, id int64) error {
result, err := r.db.Exec(ctx, "DELETE FROM todo WHERE id = $1;", id)
if err != nil {
r.logger.ErrorContext(ctx, err.Error())
return err
}
rowsAffected := result.RowsAffected()
if rowsAffected == 0 {
return repository.ErrNotFound
}
return nil
}

View File

@ -1,7 +1,12 @@
package repository
import (
"context"
"errors"
"log/slog"
"github.com/jackc/pgx/v5"
"github.com/jackc/pgx/v5/pgxpool"
)
var (
@ -21,3 +26,78 @@ func NewTodoRow(name string, done bool) TodoRow {
func (t TodoRow) Equal(todo TodoRow) bool {
return t.Id == todo.Id && t.Name == todo.Name && t.Done == todo.Done
}
type TodoRepository struct {
logger *slog.Logger
db *pgxpool.Pool
}
func NewTodoRepository(logger *slog.Logger, db *pgxpool.Pool) *TodoRepository {
return &TodoRepository{
logger: logger,
db: db,
}
}
func (r *TodoRepository) GetById(ctx context.Context, id int64) (TodoRow, error) {
todo := TodoRow{}
err := r.db.QueryRow(ctx, "SELECT * FROM todo WHERE id = $1;", id).Scan(&todo.Id, &todo.Name, &todo.Done)
if err != nil {
if err == pgx.ErrNoRows {
return todo, ErrNotFound
}
r.logger.ErrorContext(ctx, err.Error())
return todo, err
}
return todo, nil
}
func (r *TodoRepository) Create(ctx context.Context, todo TodoRow) (TodoRow, error) {
result := r.db.QueryRow(ctx, "INSERT INTO todo (name, done) VALUES ($1, $2) RETURNING id;", todo.Name, todo.Done)
err := result.Scan(&todo.Id)
if err != nil {
r.logger.ErrorContext(ctx, err.Error())
return TodoRow{}, err
}
return todo, nil
}
func (r *TodoRepository) Update(ctx context.Context, todo TodoRow) error {
result, err := r.db.Exec(ctx, "UPDATE todo SET name = $1, done = $2 WHERE id = $3;", todo.Name, todo.Done, todo.Id)
if err != nil {
r.logger.ErrorContext(ctx, err.Error())
return err
}
rowsAffected := result.RowsAffected()
if rowsAffected == 0 {
return ErrNotFound
}
return nil
}
func (r *TodoRepository) Delete(ctx context.Context, id int64) error {
result, err := r.db.Exec(ctx, "DELETE FROM todo WHERE id = $1;", id)
if err != nil {
r.logger.ErrorContext(ctx, err.Error())
return err
}
rowsAffected := result.RowsAffected()
if rowsAffected == 0 {
return ErrNotFound
}
return nil
}

View File

@ -1,4 +1,4 @@
package postgres
package repository_test
import (
"context"
@ -15,7 +15,7 @@ func TestCRUD(t *testing.T) {
logger := slog.Default()
tdb := test.NewTestDatabase(t)
defer tdb.TearDown()
r := NewPostgresTodoRepository(logger, tdb.Db)
r := repository.NewTodoRepository(logger, tdb.Db)
t.Run("creates new todo", func(t *testing.T) {
want := repository.TodoRow{Id: 1, Name: "clean dishes", Done: false}

View File

@ -7,9 +7,7 @@ import (
"gitea.michaelthomson.dev/mthomson/habits/internal/test"
"gitea.michaelthomson.dev/mthomson/habits/internal/todo/repository"
"gitea.michaelthomson.dev/mthomson/habits/internal/todo/repository/postgres"
"gitea.michaelthomson.dev/mthomson/habits/internal/todo/service"
_ "github.com/jackc/pgx/v5/stdlib"
)
func TestCreateTodo(t *testing.T) {
@ -18,7 +16,7 @@ func TestCreateTodo(t *testing.T) {
logger := slog.Default()
tdb := test.NewTestDatabase(t)
defer tdb.TearDown()
r := postgres.NewPostgresTodoRepository(logger, tdb.Db)
r := repository.NewTodoRepository(logger, tdb.Db)
todoService := service.NewTodoService(logger, r)
@ -37,7 +35,7 @@ func TestGetTodo(t *testing.T) {
logger := slog.Default()
tdb := test.NewTestDatabase(t)
defer tdb.TearDown()
r := postgres.NewPostgresTodoRepository(logger, tdb.Db)
r := repository.NewTodoRepository(logger, tdb.Db)
row := repository.TodoRow{Id: 1, Name: "clean dishes", Done: false}
_, err := r.Create(ctx, row)
@ -64,7 +62,7 @@ func TestDeleteTodo(t *testing.T) {
logger := slog.Default()
tdb := test.NewTestDatabase(t)
defer tdb.TearDown()
r := postgres.NewPostgresTodoRepository(logger, tdb.Db)
r := repository.NewTodoRepository(logger, tdb.Db)
row := repository.TodoRow{Id: 1, Name: "clean dishes", Done: false}
_, err := r.Create(ctx, row)
@ -91,7 +89,7 @@ func TestUpdateTodo(t *testing.T) {
logger := slog.Default()
tdb := test.NewTestDatabase(t)
defer tdb.TearDown()
r := postgres.NewPostgresTodoRepository(logger, tdb.Db)
r := repository.NewTodoRepository(logger, tdb.Db)
row := repository.TodoRow{Id: 1, Name: "clean dishes", Done: false}
_, err := r.Create(ctx, row)