diff --git a/backend/api/GetAllCategories.go b/backend/api/GetAllCategories.go index b26bd0e..879766d 100644 --- a/backend/api/GetAllCategories.go +++ b/backend/api/GetAllCategories.go @@ -1,13 +1,13 @@ package api import ( - "backend/internal/category" + "backend/database" "github.com/gofiber/fiber/v2" ) func GetAllCategories(c *fiber.Ctx) error { - categories, err := category.GetAllCategories() + categories, err := database.GetAllCategories() if err != nil { return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{ "error": err.Error(), diff --git a/backend/database/categories.go b/backend/database/categories.go new file mode 100644 index 0000000..e20e0fe --- /dev/null +++ b/backend/database/categories.go @@ -0,0 +1,93 @@ +package database + +import ( + "backend/model" + "encoding/json" + "errors" + "fmt" + "os" + "strings" + + "gorm.io/gorm" +) + +func CreateCategory(category *model.Category) error { + e := Db.Where(model.Category{ + Title: category.Title, + }).FirstOrCreate(&category).Error + if e != nil { + return e + } + return nil +} + +func GetCategoryById(id string) (*model.Category, error) { + var category model.Category + e := Db.First(&category, "id = ?", id).Error + if e != nil { + if errors.Is(e, gorm.ErrRecordNotFound) { + return nil, fmt.Errorf("user not found") + } + return nil, e + } + return &category, nil +} + +func GetCategoryByTitle(title string) (*model.Category, error) { + var category model.Category + e := Db.First(&category, "username = ?", title).Error + if e != nil { + if errors.Is(e, gorm.ErrRecordNotFound) { + return nil, fmt.Errorf("user not found") + } + return nil, e + } + return &category, nil +} + +func DeleteCategory(id string) error { + var category model.Category + e := Db.First(&category, "id = ?", id).Error + if e != nil { + if errors.Is(e, gorm.ErrRecordNotFound) { + return fmt.Errorf("user not found") + } + return e + } + e = Db.Unscoped().Delete(&category).Error + if e != nil { + if errors.Is(e, gorm.ErrRecordNotFound) { + return fmt.Errorf("user not found") + } + return e + } + return nil +} + +func GetCategoriesFromFile(filename string) []model.Category { + data, e := os.ReadFile(filename) + if e != nil { + panic(e) + } + decoder := json.NewDecoder(strings.NewReader(string(data))) + var res []model.Category + decoder.Decode(&res) + return res +} + +func GetAllCategories() ([]model.Category, error) { + var categories []model.Category + e := Db.Find(&categories).Error + if e != nil { + return nil, e + } + for i := range categories { + var subcategories []model.Subcategory + e := Db.Where(model.Subcategory{CategoryID: categories[i].ID}).Find(&subcategories).Error + if e != nil { + return nil, e + } + categories[i].Subcategories = subcategories + } + return categories, nil +} diff --git a/backend/database/db.go b/backend/database/db.go index c1d4726..d2c614f 100644 --- a/backend/database/db.go +++ b/backend/database/db.go @@ -43,4 +43,11 @@ func InitDatabase() { CreateUser(&allusers[i]) } } + + if os.Getenv("DEFAULT_CATEGORIES_FILE") != "" { + default_categories := GetCategoriesFromFile(os.Getenv("DEFAULT_CATEGORIES_FILE")) + for i := range default_categories { + CreateCategory(&default_categories[i]) + } + } } diff --git a/backend/wallet.conf b/backend/wallet.conf index 10b43d1..1b6c9ac 100644 --- a/backend/wallet.conf +++ b/backend/wallet.conf @@ -4,4 +4,5 @@ ENABLE_TLS=true CERT_FILE=/home/tola/certs/localhost/localhost.crt KEY_FILE=/home/tola/certs/localhost/localhost.key USERS_FILE=users.json +DEFAULT_CATEGORIES_FILE=default_categories.json DATABASE=wallet.sqlite