fin-check-api/db/item.go
2024-11-20 18:19:19 +02:00

112 lines
2.1 KiB
Go

package db
import (
"errors"
"gorm.io/gorm"
)
type Item struct {
gorm.Model
Name string
Comment string
Price uint64
MetricType uint8
MetricValue uint64
//
CategoryID uint
Category *Category
//
Proteins uint64
Carbs uint64
Fats uint64
//
Prices []ItemPrice `gorm:"constraint:OnDelete:CASCADE;"`
CurrentPriceID uint
CurrentPrice *ItemPrice
//
TypeID uint
Type *Type
UserID uint
User *User
}
func (i Item) __internalBelogingToPayment() {}
// Implements db.UserIdentifiable:1
func (i Item) GetID() uint {
return i.ID
}
// Implements db.UserIdentifiable:2
func (i Item) GetUserID() uint {
return i.UserID
}
// Implements db.UserIdentifiable:3
func (i *Item) SetUserID(id uint) {
i.UserID = id
}
func GetItem(id uint, preloadPrices bool) (*Item, error) {
if udb == nil {
return nil, ERROR_DB_NOT_INIT
}
db := udb
if preloadPrices {
db = db.Preload("Prices")
}
var item Item
err := db.Preload("Category").Preload("CurrentPrice").First(&item, id).Error
return &item, err
}
func GetItemToRootCat(id uint, preloadPrices bool) (*Item, error) {
if udb == nil {
return nil, ERROR_DB_NOT_INIT
}
db := udb
if preloadPrices {
db = db.Preload("Prices")
}
var item Item
err := db.Preload("Category.Parent", func(db *gorm.DB) *gorm.DB {
return db.Preload("Parent", func(db *gorm.DB) *gorm.DB {
return db.Preload("Parent")
})
}).Preload("CurrentPrice").First(&item, id).Error
return &item, err
}
var (
ERROR_ITEM_PRICE_ISZERO = errors.New("Item's Price is zero")
ERROR_ITEM_ITEMPRICE_INTERR = errors.New("Item's ItemPrice ID is zero after creating")
)
func (i *Item) BeforeCreate(tx *gorm.DB) error {
if i.Price == 0 {
return ERROR_ITEM_PRICE_ISZERO
}
return nil
}
func (i *Item) AfterCreate(tx *gorm.DB) error {
if i.CurrentPriceID == 0 {
itemPrice := &ItemPrice{
ItemID: i.ID,
Price: i.Price,
}
if err := tx.Create(itemPrice).Error; err != nil {
return err
}
if itemPrice.ID == 0 {
return ERROR_ITEM_ITEMPRICE_INTERR
}
i.CurrentPriceID = itemPrice.ID
if err := tx.Save(i).Error; err != nil {
return err
}
}
return nil
}