75 lines
2 KiB
Go
75 lines
2 KiB
Go
package service
|
|
|
|
import (
|
|
"cafe/config"
|
|
"cafe/types"
|
|
"fmt"
|
|
|
|
"gorm.io/plugin/soft_delete"
|
|
)
|
|
|
|
type Table struct {
|
|
ID uint64 `gorm:"primaryKey" json:"id" validate:"optional"`
|
|
OrderCount uint64 `json:"order_count" validate:"required"`
|
|
Total float32 `json:"total" validate:"required"`
|
|
UpdatedAt int64 `json:"updated_at" validate:"optional"`
|
|
IsDeleted soft_delete.DeletedAt `gorm:"softDelete:flag" json:"is_deleted" swaggerignore:"true"`
|
|
}
|
|
|
|
func GetAllTables() []Table {
|
|
var tables []Table
|
|
config.Cafe.Database.ORM.Model(
|
|
&Table{},
|
|
).Joins(
|
|
"left join orders on tables.id = orders.table_id",
|
|
).Joins(
|
|
"left join order_items on orders.order_item_id = order_items.id",
|
|
).Select(
|
|
"tables.id, tables.updated_at, sum(order_items.price) as total, count(orders.id) as order_count",
|
|
).Group(
|
|
"tables.id",
|
|
).Order("tables.id").Find(&tables)
|
|
return tables
|
|
}
|
|
|
|
func CreateNewTable() (Table, error) {
|
|
var table Table
|
|
var err error
|
|
result := config.Cafe.Database.ORM.Unscoped().Where("is_deleted = ?", 1).Limit(1).Find(&table)
|
|
if result.RowsAffected == 0 {
|
|
err = config.Cafe.Database.ORM.Create(&table).Error
|
|
} else {
|
|
table.IsDeleted = 0
|
|
err = config.Cafe.Database.ORM.Unscoped().Save(&table).Error
|
|
}
|
|
if err != nil {
|
|
return table, fmt.Errorf(types.CannotCreate.String())
|
|
}
|
|
return table, nil
|
|
}
|
|
|
|
func DeleteLatestTable() error {
|
|
var table Table
|
|
err := config.Cafe.Database.ORM.Model(
|
|
&Table{},
|
|
).Joins(
|
|
"left join orders on tables.id = orders.table_id",
|
|
).Joins(
|
|
"left join order_items on orders.order_item_id = order_items.id",
|
|
).Select(
|
|
"tables.id, count(orders.id) as order_count",
|
|
).Group(
|
|
"tables.id",
|
|
).Last(&table).Error
|
|
if err != nil {
|
|
return fmt.Errorf(types.CannotFind.String())
|
|
}
|
|
if table.OrderCount != 0 {
|
|
return fmt.Errorf(types.StillInUse.String())
|
|
}
|
|
err = config.Cafe.Database.ORM.Delete(&table).Error
|
|
if err != nil {
|
|
return fmt.Errorf(types.CannotDelete.String())
|
|
}
|
|
return nil
|
|
}
|