This commit is contained in:
2025-02-10 12:33:01 -05:00
parent 608f7c36e7
commit 5df204164e
9 changed files with 160 additions and 10 deletions

View File

@@ -22,7 +22,7 @@ func Migrate(db *sql.DB) {
slog.Info("Running migrations...")
migrationTableSql := `
CREATE TABLE IF NOT EXISTS migrations(
version INTEGER PRIMARY KEY,
version SERIAL PRIMARY KEY,
name VARCHAR(50)
);`
@@ -38,7 +38,7 @@ func Migrate(db *sql.DB) {
for _, file := range files {
var migration Migration
row := db.QueryRow("SELECT * FROM migrations WHERE name = ?;", file.Name())
row := db.QueryRow("SELECT * FROM migrations WHERE name = $1;", file.Name())
err = row.Scan(&migration.Version, &migration.Name)
if err == sql.ErrNoRows {
slog.Info(fmt.Sprintf("Running migration: %s", file.Name()))
@@ -52,7 +52,7 @@ func Migrate(db *sql.DB) {
log.Fatal(err)
}
_, err = db.Exec("INSERT INTO migrations(name) VALUES(?);", file.Name())
_, err = db.Exec("INSERT INTO migrations(name) VALUES($1);", file.Name())
if err != nil {
log.Fatal(err)
}

View File

@@ -1,5 +1,5 @@
CREATE TABLE todo(
id INTEGER PRIMARY KEY,
id SERIAL PRIMARY KEY,
name VARCHAR(50),
done INTEGER
done BOOLEAN
);

View File

@@ -0,0 +1,84 @@
package postgres
import (
"database/sql"
"gitea.michaelthomson.dev/mthomson/habits/internal/todo/repository"
)
type PostgresTodoRepository struct {
db *sql.DB
}
func NewPostgresTodoRepository(db *sql.DB) *PostgresTodoRepository {
return &PostgresTodoRepository{
db: db,
}
}
func (r *PostgresTodoRepository) GetById(id int64) (repository.TodoRow, error) {
todo := repository.TodoRow{}
err := r.db.QueryRow("SELECT * FROM todo WHERE id = $1;", id).Scan(&todo.Id, &todo.Name, &todo.Done)
if err != nil {
if err == sql.ErrNoRows {
return todo, repository.ErrNotFound
}
return todo, err
}
return todo, nil
}
func (r *PostgresTodoRepository) Create(todo repository.TodoRow) (repository.TodoRow, error) {
result := r.db.QueryRow("INSERT INTO todo (name, done) VALUES ($1, $2) RETURNING id;", todo.Name, todo.Done)
err := result.Scan(&todo.Id)
if err != nil {
return repository.TodoRow{}, err
}
return todo, nil
}
func (r *PostgresTodoRepository) Update(todo repository.TodoRow) error {
result, err := r.db.Exec("UPDATE todo SET name = $1, done = $2 WHERE id = $3;", todo.Name, todo.Done, todo.Id)
if err != nil {
return err
}
rowsAffected, err := result.RowsAffected()
if err != nil {
return err
}
if rowsAffected == 0 {
return repository.ErrNotFound
}
return nil
}
func (r *PostgresTodoRepository) Delete(id int64) error {
result, err := r.db.Exec("DELETE FROM todo WHERE id = $1;", id)
if err != nil {
return err
}
rowsAffected, err := result.RowsAffected()
if err != nil {
return err
}
if rowsAffected == 0 {
return repository.ErrNotFound
}
return nil
}

View File

@@ -2,6 +2,7 @@ package service
import (
"errors"
"log"
"gitea.michaelthomson.dev/mthomson/habits/internal/todo/repository"
)
@@ -67,6 +68,7 @@ func (s *TodoService) CreateTodo(todo Todo) (Todo, error) {
newTodoRow, err := s.repo.Create(todoRow)
if err != nil {
log.Print(err)
return Todo{}, err
}