From 51d976944b663f05803222479cb1792c72ba3b05 Mon Sep 17 00:00:00 2001 From: jesperkha Date: Mon, 21 Jul 2025 20:33:05 +0200 Subject: [PATCH] Move Database to service package --- api/cmd/main.go | 4 +- api/database/database.go | 60 ------------------ api/server/server.go | 10 +-- api/server/server_test.go | 4 +- pkg/service/{api_service.go => api.go} | 0 .../query.go => pkg/service/database.go | 61 ++++++++++++++++++- .../database => pkg/service}/database_test.go | 4 +- 7 files changed, 70 insertions(+), 73 deletions(-) delete mode 100644 api/database/database.go rename pkg/service/{api_service.go => api.go} (100%) rename api/database/query.go => pkg/service/database.go (79%) rename {api/database => pkg/service}/database_test.go (98%) diff --git a/api/cmd/main.go b/api/cmd/main.go index 676bcd6..440cebb 100644 --- a/api/cmd/main.go +++ b/api/cmd/main.go @@ -5,8 +5,8 @@ import ( "syscall" "github.com/echo-webkom/ludo/api/config" - "github.com/echo-webkom/ludo/api/database" "github.com/echo-webkom/ludo/api/server" + "github.com/echo-webkom/ludo/pkg/service" "github.com/jesperkha/notifier" ) @@ -14,7 +14,7 @@ func main() { config := config.Load() notif := notifier.New() // db := database.NewTurso(config.TursoURL, config.TursoToken) - db := database.NewSQLite(config.DatabaseURL) + db := service.NewSQLiteService(config.DatabaseURL) server := server.New(config, db) go server.ListenAndServe(notif) diff --git a/api/database/database.go b/api/database/database.go deleted file mode 100644 index 1eb7b1f..0000000 --- a/api/database/database.go +++ /dev/null @@ -1,60 +0,0 @@ -package database - -import ( - "log" - "strings" - - "github.com/echo-webkom/ludo/pkg/model" - _ "github.com/mattn/go-sqlite3" - _ "github.com/tursodatabase/libsql-client-go/libsql" - "gorm.io/driver/sqlite" - "gorm.io/gorm" - "gorm.io/gorm/logger" -) - -// Implements LudoService -type Database struct { - db *gorm.DB -} - -func newDatabase(db *gorm.DB) *Database { - if err := db.AutoMigrate(&model.Board{}, &model.Item{}, &model.User{}); err != nil { - log.Fatalf("migration: %v", err) - } - return &Database{db} -} - -func NewTurso(url, token string) *Database { - dbUrl := url + token - db, err := gorm.Open(sqlite.Open(dbUrl), &gorm.Config{ - Logger: logger.Default.LogMode(logger.Silent), - }) - if err != nil { - log.Fatalf("failed to connect to database: %v", err) - } - - return newDatabase(db) -} - -func NewSQLite(filename string) *Database { - if !strings.HasPrefix(filename, "file:") { - filename = "file:" + filename - } - - db, err := gorm.Open(sqlite.Open(filename), &gorm.Config{ - Logger: logger.Default.LogMode(logger.Silent), - }) - if err != nil { - log.Fatalf("failed to connect to database: %v", err) - } - - return newDatabase(db) -} - -func (db *Database) Close() error { - raw, err := db.db.DB() - if err != nil { - return err - } - return raw.Close() -} diff --git a/api/server/server.go b/api/server/server.go index fe2dc5f..7e04b23 100644 --- a/api/server/server.go +++ b/api/server/server.go @@ -6,8 +6,8 @@ import ( "net/http" "github.com/echo-webkom/ludo/api/config" - "github.com/echo-webkom/ludo/api/database" "github.com/echo-webkom/ludo/api/server/routes" + "github.com/echo-webkom/ludo/pkg/service" "github.com/go-chi/chi/v5" "github.com/go-chi/chi/v5/middleware" "github.com/jesperkha/notifier" @@ -18,13 +18,13 @@ type Server struct { router http.Handler } -func New(config *config.Config, db *database.Database) *Server { +func New(config *config.Config, service service.LudoService) *Server { r := chi.NewRouter() r.Use(middleware.Logger) - r.Mount("/users", routes.UsersHandler(db)) - r.Mount("/items", routes.ItemsHandler(db)) - r.Mount("/boards", routes.BoardsHandler(db)) + r.Mount("/users", routes.UsersHandler(service)) + r.Mount("/items", routes.ItemsHandler(service)) + r.Mount("/boards", routes.BoardsHandler(service)) return &Server{ router: r, diff --git a/api/server/server_test.go b/api/server/server_test.go index f1254e5..af88c53 100644 --- a/api/server/server_test.go +++ b/api/server/server_test.go @@ -11,9 +11,9 @@ import ( "testing" "github.com/echo-webkom/ludo/api/config" - "github.com/echo-webkom/ludo/api/database" "github.com/echo-webkom/ludo/api/server" "github.com/echo-webkom/ludo/pkg/model" + "github.com/echo-webkom/ludo/pkg/service" ) func setupTestServer(t *testing.T) (*server.Server, func()) { @@ -21,7 +21,7 @@ func setupTestServer(t *testing.T) (*server.Server, func()) { if err != nil { t.Fatalf("failed to create temp file: %v", err) } - db := database.NewSQLite(tempFile.Name()) + db := service.NewSQLiteService(tempFile.Name()) cfg := &config.Config{Port: ":8080"} srv := server.New(cfg, db) diff --git a/pkg/service/api_service.go b/pkg/service/api.go similarity index 100% rename from pkg/service/api_service.go rename to pkg/service/api.go diff --git a/api/database/query.go b/pkg/service/database.go similarity index 79% rename from api/database/query.go rename to pkg/service/database.go index a5ef59b..6563ea8 100644 --- a/api/database/query.go +++ b/pkg/service/database.go @@ -1,6 +1,63 @@ -package database +package service -import "github.com/echo-webkom/ludo/pkg/model" +import ( + "log" + "strings" + + "github.com/echo-webkom/ludo/pkg/model" + _ "github.com/mattn/go-sqlite3" + _ "github.com/tursodatabase/libsql-client-go/libsql" + "gorm.io/driver/sqlite" + "gorm.io/gorm" + "gorm.io/gorm/logger" +) + +// Implements LudoService +type Database struct { + db *gorm.DB +} + +func newDatabase(db *gorm.DB) *Database { + if err := db.AutoMigrate(&model.Board{}, &model.Item{}, &model.User{}); err != nil { + log.Fatalf("migration: %v", err) + } + return &Database{db} +} + +func NewTursoService(url, token string) *Database { + dbUrl := url + token + db, err := gorm.Open(sqlite.Open(dbUrl), &gorm.Config{ + Logger: logger.Default.LogMode(logger.Silent), + }) + if err != nil { + log.Fatalf("failed to connect to database: %v", err) + } + + return newDatabase(db) +} + +func NewSQLiteService(filename string) *Database { + if !strings.HasPrefix(filename, "file:") { + filename = "file:" + filename + } + + db, err := gorm.Open(sqlite.Open(filename), &gorm.Config{ + Logger: logger.Default.LogMode(logger.Silent), + }) + if err != nil { + log.Fatalf("failed to connect to database: %v", err) + } + + return newDatabase(db) +} + +func (db *Database) Close() error { + raw, err := db.db.DB() + if err != nil { + return err + } + return raw.Close() +} func (db *Database) User(id uint) (model.User, error) { var user model.User diff --git a/api/database/database_test.go b/pkg/service/database_test.go similarity index 98% rename from api/database/database_test.go rename to pkg/service/database_test.go index d821143..e9e8c47 100644 --- a/api/database/database_test.go +++ b/pkg/service/database_test.go @@ -1,4 +1,4 @@ -package database +package service import ( "os" @@ -12,7 +12,7 @@ func createTestDB(t *testing.T) *Database { tmpfile, err := os.CreateTemp("", "testdb-*.sqlite") assert.NoError(t, err) - db := NewSQLite(tmpfile.Name()) + db := NewSQLiteService(tmpfile.Name()) t.Cleanup(func() { os.Remove(tmpfile.Name())