postgres
This commit is contained in:
@@ -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)
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
CREATE TABLE todo(
|
||||
id INTEGER PRIMARY KEY,
|
||||
id SERIAL PRIMARY KEY,
|
||||
name VARCHAR(50),
|
||||
done INTEGER
|
||||
done BOOLEAN
|
||||
);
|
||||
|
||||
84
internal/todo/repository/postgres/postgres.go
Normal file
84
internal/todo/repository/postgres/postgres.go
Normal 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
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user