From af8323cdb01eaaec5801e7f571310a74c032e525 Mon Sep 17 00:00:00 2001 From: Hazem Krimi Date: Thu, 5 Jun 2025 03:52:48 +0100 Subject: [PATCH] chore: setup some defaults --- cmd/root.go | 15 ++++++++++++--- internal/api/api.go | 16 +++++++++++----- internal/api/routes.go | 5 ++++- internal/api/user.go | 6 ++---- internal/lib/constants.go | 4 ++++ internal/lib/utils.go | 18 ++++++++++++++++++ internal/models/db.go | 5 +++-- 7 files changed, 54 insertions(+), 15 deletions(-) create mode 100644 internal/lib/constants.go create mode 100644 internal/lib/utils.go diff --git a/cmd/root.go b/cmd/root.go index 6f60c0e..c46db8c 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -4,9 +4,11 @@ Copyright © 2025 Hazem Krimi me@hazemkrimi.tech package cmd import ( + "log" "os" "github.com/hazemKrimi/crimson-vault/internal/api" + "github.com/hazemKrimi/crimson-vault/internal/lib" "github.com/spf13/cobra" ) @@ -23,8 +25,17 @@ to quickly create a Cobra application.`, // Uncomment the following line if your bare application // has an action associated with it: Run: func(cmd *cobra.Command, args []string) { - server := api.API{} + dir, err := lib.GetConfigDirectory() + if err != nil { + log.Fatal(err) + } + + if err := os.MkdirAll(dir, os.ModePerm); err != nil { + log.Fatal(err) + } + + server := api.API{ConfigDirectory: dir} server.Initialize() }, } @@ -50,5 +61,3 @@ func init() { // when this action is called directly. rootCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle") } - - diff --git a/internal/api/api.go b/internal/api/api.go index 13d240a..3f67e38 100644 --- a/internal/api/api.go +++ b/internal/api/api.go @@ -1,15 +1,20 @@ package api import ( + "fmt" + "github.com/go-playground/validator/v10" - "github.com/hazemKrimi/crimson-vault/internal/models" "github.com/labstack/echo/v4" "github.com/labstack/echo/v4/middleware" + + "github.com/hazemKrimi/crimson-vault/internal/lib" + "github.com/hazemKrimi/crimson-vault/internal/models" ) type API struct { - instance *echo.Echo - db *models.DB + ConfigDirectory string + instance *echo.Echo + db *models.DB } func (api *API) Initialize() { @@ -20,7 +25,7 @@ func (api *API) Initialize() { ech := echo.New() ech.Validator = &CustomValidator{validator: validator} - db.Connect() + db.Connect(api.ConfigDirectory) db.MigrateClients() db.MigrateUsers() @@ -28,8 +33,9 @@ func (api *API) Initialize() { api.db = db api.ClientRoutes() + api.UserRoutes() api.instance.Use(middleware.CORSWithConfig(middleware.CORSConfig{ AllowOrigins: []string{"*"}, })) - api.instance.Logger.Fatal(api.instance.Start(":5000")) + api.instance.Logger.Fatal(api.instance.Start(fmt.Sprintf(":%d", lib.DEFAULT_PORT))) } diff --git a/internal/api/routes.go b/internal/api/routes.go index c0d901a..ab251a3 100644 --- a/internal/api/routes.go +++ b/internal/api/routes.go @@ -4,13 +4,16 @@ import "github.com/labstack/echo/v4/middleware" func (api *API) ClientRoutes() { clients := api.instance.Group("/clients") - users := api.instance.Group("/users") clients.GET("/", api.GetAllClientsHandler) clients.POST("/", api.CreateClientHandler) clients.GET("/:id", api.GetClientHandler) clients.PUT("/:id", api.UpdateClientHandler) clients.DELETE("/:id", api.DeleteClientHandler) +} + +func (api *API) UserRoutes() { + users := api.instance.Group("/users") users.GET("/", api.GetAllUsersHandler) users.POST("/", api.CreateUserHandler) diff --git a/internal/api/user.go b/internal/api/user.go index f8f8242..83e332d 100644 --- a/internal/api/user.go +++ b/internal/api/user.go @@ -199,14 +199,12 @@ func (api *API) UpdateUserLogoHandler(context echo.Context) error { return context.String(http.StatusBadRequest, "Uploaded file is not a valid image!") } - err = os.MkdirAll(user.Username, os.ModePerm) - - if err != nil { + if err := os.MkdirAll(filepath.Join(api.ConfigDirectory, user.Username), os.ModePerm); err != nil { log.Println(fmt.Sprintf("Error updating logo for User: %v.", err)) return context.String(http.StatusInternalServerError, "Unexpected error while updating logo for User!") } - path, err := filepath.Abs(filepath.Join(user.Username, fmt.Sprintf("logo%s", ext))) + path, err := filepath.Abs(filepath.Join(api.ConfigDirectory, user.Username, fmt.Sprintf("logo%s", ext))) if err != nil { log.Println(fmt.Sprintf("Error updating logo for User: %v.", err)) diff --git a/internal/lib/constants.go b/internal/lib/constants.go new file mode 100644 index 0000000..03ba55c --- /dev/null +++ b/internal/lib/constants.go @@ -0,0 +1,4 @@ +package lib + +const DEFAULT_PORT int = 6900 +const DEFAULT_CONFIG_DIRECTORY string = ".local/state/crimson-vault" diff --git a/internal/lib/utils.go b/internal/lib/utils.go new file mode 100644 index 0000000..b47cc8a --- /dev/null +++ b/internal/lib/utils.go @@ -0,0 +1,18 @@ +package lib + +import ( + "os" + "path/filepath" +) + +func GetConfigDirectory() (string, error) { + home, err := os.UserHomeDir() + + if err != nil { + return "", err + } + + config, err := filepath.Abs(filepath.Join(home, DEFAULT_CONFIG_DIRECTORY)) + + return config, nil +} diff --git a/internal/models/db.go b/internal/models/db.go index 3a99bb1..dc4e8e6 100644 --- a/internal/models/db.go +++ b/internal/models/db.go @@ -2,6 +2,7 @@ package models import ( "log" + "path/filepath" "gorm.io/driver/sqlite" "gorm.io/gorm" @@ -11,8 +12,8 @@ type DB struct { instance *gorm.DB } -func (wrapper *DB) Connect() { - db, err := gorm.Open(sqlite.Open("crimson_vault.db"), &gorm.Config{}) +func (wrapper *DB) Connect(configDir string) { + db, err := gorm.Open(sqlite.Open(filepath.Join(configDir, "crimson_vault.db")), &gorm.Config{}) if err != nil { log.Fatal(err)