merged postgres repository with base repository
This commit is contained in:
parent
651bcce12f
commit
26992f9579
@ -10,7 +10,7 @@ import (
|
|||||||
"gitea.michaelthomson.dev/mthomson/habits/internal/middleware"
|
"gitea.michaelthomson.dev/mthomson/habits/internal/middleware"
|
||||||
"gitea.michaelthomson.dev/mthomson/habits/internal/migrate"
|
"gitea.michaelthomson.dev/mthomson/habits/internal/migrate"
|
||||||
todohandler "gitea.michaelthomson.dev/mthomson/habits/internal/todo/handler"
|
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"
|
todoservice "gitea.michaelthomson.dev/mthomson/habits/internal/todo/service"
|
||||||
"github.com/jackc/pgx/v5/pgxpool"
|
"github.com/jackc/pgx/v5/pgxpool"
|
||||||
)
|
)
|
||||||
@ -41,7 +41,7 @@ func main() {
|
|||||||
migrate.Migrate(logger, db)
|
migrate.Migrate(logger, db)
|
||||||
|
|
||||||
// create repos
|
// create repos
|
||||||
todoRepository := todorepository.NewPostgresTodoRepository(logger, db)
|
todoRepository := todorepository.NewTodoRepository(logger, db)
|
||||||
|
|
||||||
// create services
|
// create services
|
||||||
todoService := todoservice.NewTodoService(logger, todoRepository)
|
todoService := todoservice.NewTodoService(logger, todoRepository)
|
||||||
|
@ -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
|
|
||||||
}
|
|
@ -1,7 +1,12 @@
|
|||||||
package repository
|
package repository
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
"errors"
|
"errors"
|
||||||
|
"log/slog"
|
||||||
|
|
||||||
|
"github.com/jackc/pgx/v5"
|
||||||
|
"github.com/jackc/pgx/v5/pgxpool"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@ -21,3 +26,78 @@ func NewTodoRow(name string, done bool) TodoRow {
|
|||||||
func (t TodoRow) Equal(todo TodoRow) bool {
|
func (t TodoRow) Equal(todo TodoRow) bool {
|
||||||
return t.Id == todo.Id && t.Name == todo.Name && t.Done == todo.Done
|
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
|
||||||
|
}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
package postgres
|
package repository_test
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
@ -15,7 +15,7 @@ func TestCRUD(t *testing.T) {
|
|||||||
logger := slog.Default()
|
logger := slog.Default()
|
||||||
tdb := test.NewTestDatabase(t)
|
tdb := test.NewTestDatabase(t)
|
||||||
defer tdb.TearDown()
|
defer tdb.TearDown()
|
||||||
r := NewPostgresTodoRepository(logger, tdb.Db)
|
r := repository.NewTodoRepository(logger, tdb.Db)
|
||||||
|
|
||||||
t.Run("creates new todo", func(t *testing.T) {
|
t.Run("creates new todo", func(t *testing.T) {
|
||||||
want := repository.TodoRow{Id: 1, Name: "clean dishes", Done: false}
|
want := repository.TodoRow{Id: 1, Name: "clean dishes", Done: false}
|
@ -7,9 +7,7 @@ import (
|
|||||||
|
|
||||||
"gitea.michaelthomson.dev/mthomson/habits/internal/test"
|
"gitea.michaelthomson.dev/mthomson/habits/internal/test"
|
||||||
"gitea.michaelthomson.dev/mthomson/habits/internal/todo/repository"
|
"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"
|
"gitea.michaelthomson.dev/mthomson/habits/internal/todo/service"
|
||||||
_ "github.com/jackc/pgx/v5/stdlib"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestCreateTodo(t *testing.T) {
|
func TestCreateTodo(t *testing.T) {
|
||||||
@ -18,7 +16,7 @@ func TestCreateTodo(t *testing.T) {
|
|||||||
logger := slog.Default()
|
logger := slog.Default()
|
||||||
tdb := test.NewTestDatabase(t)
|
tdb := test.NewTestDatabase(t)
|
||||||
defer tdb.TearDown()
|
defer tdb.TearDown()
|
||||||
r := postgres.NewPostgresTodoRepository(logger, tdb.Db)
|
r := repository.NewTodoRepository(logger, tdb.Db)
|
||||||
|
|
||||||
todoService := service.NewTodoService(logger, r)
|
todoService := service.NewTodoService(logger, r)
|
||||||
|
|
||||||
@ -37,7 +35,7 @@ func TestGetTodo(t *testing.T) {
|
|||||||
logger := slog.Default()
|
logger := slog.Default()
|
||||||
tdb := test.NewTestDatabase(t)
|
tdb := test.NewTestDatabase(t)
|
||||||
defer tdb.TearDown()
|
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}
|
row := repository.TodoRow{Id: 1, Name: "clean dishes", Done: false}
|
||||||
_, err := r.Create(ctx, row)
|
_, err := r.Create(ctx, row)
|
||||||
@ -64,7 +62,7 @@ func TestDeleteTodo(t *testing.T) {
|
|||||||
logger := slog.Default()
|
logger := slog.Default()
|
||||||
tdb := test.NewTestDatabase(t)
|
tdb := test.NewTestDatabase(t)
|
||||||
defer tdb.TearDown()
|
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}
|
row := repository.TodoRow{Id: 1, Name: "clean dishes", Done: false}
|
||||||
_, err := r.Create(ctx, row)
|
_, err := r.Create(ctx, row)
|
||||||
@ -91,7 +89,7 @@ func TestUpdateTodo(t *testing.T) {
|
|||||||
logger := slog.Default()
|
logger := slog.Default()
|
||||||
tdb := test.NewTestDatabase(t)
|
tdb := test.NewTestDatabase(t)
|
||||||
defer tdb.TearDown()
|
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}
|
row := repository.TodoRow{Id: 1, Name: "clean dishes", Done: false}
|
||||||
_, err := r.Create(ctx, row)
|
_, err := r.Create(ctx, row)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user