Library/models/quantity.go

142 lines
3.5 KiB
Go

package models
// Quantity is the quantity for a book
type Quantity struct {
ID int64 `xorm:"int(11) autoincr not null unique pk"`
ItemID int64 `xorm:"int(11) not null"`
Quantity int64 `xorm:"int(11) not null"`
Created int64 `xorm:"created"`
}
// TableName returns the name for the quantites table
func (Quantity) TableName() string {
return "quantities"
}
// Quantityrelations holds information about wherether the quantity we are currently dealing with is one of a book or an item
// We cannot directly link quantites to items and books because they can have the same id... which is why we need this.
type quantityRelation struct {
ID int64 `xorm:"int(11) autoincr not null unique pk"`
ItemID int64 `xorm:"int(11) not null"`
BookID int64 `xorm:"int(11) not null"`
Created int64 `xorm:"created"`
}
// TableName returns the name for the quantites table
func (quantityRelation) TableName() string {
return "quantity_relations"
}
// GetQuantity gets the latest quantity
func GetQuantity(itemID int64) (quantity int64, err error) {
// Return nothing if we dont have an item
if itemID == 0 {
return 0, nil
}
// Get the quanitty
bq := Quantity{ItemID: itemID}
has, err := x.Desc("id").Get(&bq)
if err != nil {
return 0, err
}
if has {
quantity = bq.Quantity
}
return quantity, nil
}
// SetQuantity sets the quantity for an item
func SetQuantity(itemID, quantity int64) (err error) {
// Check if the quantity already exists and only insert it if not
qty, err := GetQuantity(itemID)
if err != nil {
return err
}
if qty != quantity {
q := Quantity{ItemID: itemID, Quantity: quantity}
_, err = x.Insert(q)
return err
}
return nil
}
// ===== ITEMS =====
// Get item quantity with relation
func (item Item) getQuantity() (quantity int64, err error) {
qty := Quantity{}
_, err = x.Table("quantities").
Select("quantities.id, quantity_relations.item_id, quantities.quantity, quantities.created").
Join("INNER", "quantity_relations", "quantities.item_id = quantity_relations.id").
Where("quantity_relations.item_id = ?", item.ID).
Desc("quantities.id").Get(&qty)
return qty.Quantity, err
}
// Set item quantity with relation
func (item Item) setQuantity(quantity int64) (err error) {
// Check if the relation already exists, if not, create a new one
qty := quantityRelation{ItemID: item.ID}
exists, err := x.Get(&qty)
if err != nil {
return
}
if !exists {
rel := quantityRelation{ItemID: item.ID}
_, err := x.Insert(&rel)
if err != nil {
return err
}
qty.ID = rel.ID
}
// Insert the new quantity
return SetQuantity(qty.ID, quantity)
}
// ===== BOOKS =====
// Get book quantity with relation
func (book Book) getQuantity() (quantity int64, err error) {
qty := Quantity{}
_, err = x.Table("quantities").
Select("quantities.id, quantity_relations.item_id, quantities.quantity, quantities.created").
Join("INNER", "quantity_relations", "quantities.item_id = quantity_relations.id").
Where("quantity_relations.book_id = ?", book.ID).
Desc("quantities.id").Get(&qty)
return qty.Quantity, err
}
// Set book quantity with relation
func (book Book) setQuantity(quantity int64) (err error) {
// Check if the relation already exists, if not, create a new one
qty := quantityRelation{BookID: book.ID}
exists, err := x.Get(&qty)
if err != nil {
return
}
if !exists {
rel := quantityRelation{BookID: book.ID}
_, err := x.Insert(&rel)
if err != nil {
return err
}
qty.ID = rel.ID
}
// Insert the new quantity
return SetQuantity(qty.ID, quantity)
}