TheMathemagicians/sevenkeys/logic/storage.go

121 lines
2.6 KiB
Go
Raw Normal View History

2024-05-30 13:32:04 +00:00
package logic
import (
"database/sql"
"errors"
"sevenkeys/database"
)
2024-05-30 13:32:04 +00:00
var ErrCouldNotGetStorageAreaId error = errors.New("Could not get storage area ID.")
func GetStorageAreaId(db *sql.DB, storageAreaName string) (int, error) {
id, err := database.GetStorageAreaIdByName(db, storageAreaName)
if err == nil {
return id, nil
}
if err == database.ErrStorageAreaDoesNotExist {
storageOptions, err := GetStorageAreaSearchOptions(db)
if err != nil {
return id, err
}
id, _, err := GenericSearch(storageOptions)
if err == nil {
return id, nil
}
return id, ErrCouldNotGetStorageAreaId
}
return id, ErrCouldNotGetStorageAreaId
}
2024-09-17 10:25:51 +00:00
2024-08-20 11:57:36 +00:00
func CreateStorageArea(db *sql.DB, storageArea database.StorageArea) error {
// TODO: Check if there's already a storage are with the same name
// TODO: Check if the type entered is valid
err := database.InsertStorageArea(db, storageArea)
if err != nil {
return err
}
return nil
}
type StorageAreaSearchOptions map[string]int
2024-09-17 10:25:51 +00:00
func GetStorageAreaSearchOptions(db *sql.DB) (StorageAreaSearchOptions, error) {
var options StorageAreaSearchOptions = make(map[string]int)
2024-08-20 17:00:23 +00:00
storageAreas, err := database.GetAllStorageAreas(db)
if err != nil {
2024-09-17 10:25:51 +00:00
return options, err
2024-08-20 17:00:23 +00:00
}
for _, area := range storageAreas {
2024-09-17 10:25:51 +00:00
options[area.Name] = area.Id
2024-08-20 17:00:23 +00:00
}
2024-09-17 10:25:51 +00:00
return options, nil
2024-08-20 17:00:23 +00:00
}
func storeAfterLastCard(db *sql.DB, cardLocation database.CardLocation) error {
lastPosition, err := database.GetLastPositionInStorageArea(db, cardLocation.StorageAreaId)
if err != nil {
return err
}
2024-05-30 13:32:04 +00:00
cardLocation.Position = lastPosition + 1
2024-05-30 13:32:04 +00:00
err = database.InsertCardLocation(db, cardLocation)
if err != nil {
return err
}
return nil
2024-05-30 13:32:04 +00:00
}
func storeInEmptySlot(db *sql.DB, cardLocation database.CardLocation, cardLocationId int) error {
cardLocation.Id = cardLocationId
err := database.InsertCardInExistingLocation(db, cardLocation)
if err != nil {
return err
}
return nil
}
func StoreCard(db *sql.DB, cardLocation database.CardLocation) error {
storageAreaType, err := database.GetStorageAreaTypeById(db, cardLocation.StorageAreaId)
if err != nil {
return err
}
if storageAreaType == database.StorageAreaTypeBinder {
nextEmptySlotId, err := database.GetNextEmptySlotInBinder(db, cardLocation.StorageAreaId)
if err == sql.ErrNoRows {
err = storeAfterLastCard(db, cardLocation)
if err != nil {
return err
}
} else if err != nil {
return err
} else {
err = storeInEmptySlot(db, cardLocation, nextEmptySlotId)
if err != nil {
return err
}
}
return nil
}
err = storeAfterLastCard(db, cardLocation)
if err != nil {
return err
}
return nil
}