apskel-pos-backend/internal/repository/table_repository.go

173 lines
4.5 KiB
Go
Raw Normal View History

2025-07-30 23:18:20 +07:00
package repository
import (
"apskel-pos-be/internal/entities"
"context"
"fmt"
"time"
"github.com/google/uuid"
"gorm.io/gorm"
)
type TableRepository struct {
db *gorm.DB
}
func NewTableRepository(db *gorm.DB) *TableRepository {
return &TableRepository{db: db}
}
func (r *TableRepository) Create(ctx context.Context, table *entities.Table) error {
return r.db.WithContext(ctx).Create(table).Error
}
func (r *TableRepository) GetByID(ctx context.Context, id uuid.UUID) (*entities.Table, error) {
var table entities.Table
err := r.db.WithContext(ctx).
Preload("Organization").
Preload("Outlet").
Preload("Order").
Where("id = ?", id).
First(&table).Error
if err != nil {
return nil, err
}
return &table, nil
}
func (r *TableRepository) GetByOutletID(ctx context.Context, outletID uuid.UUID) ([]entities.Table, error) {
var tables []entities.Table
err := r.db.WithContext(ctx).
Preload("Organization").
Preload("Outlet").
Preload("Order").
Where("outlet_id = ?", outletID).
Order("table_name").
Find(&tables).Error
return tables, err
}
func (r *TableRepository) GetByOrganizationID(ctx context.Context, organizationID uuid.UUID) ([]entities.Table, error) {
var tables []entities.Table
err := r.db.WithContext(ctx).
Preload("Organization").
Preload("Outlet").
Preload("Order").
Where("organization_id = ?", organizationID).
Order("table_name").
Find(&tables).Error
return tables, err
}
func (r *TableRepository) Update(ctx context.Context, table *entities.Table) error {
return r.db.WithContext(ctx).Save(table).Error
}
func (r *TableRepository) Delete(ctx context.Context, id uuid.UUID) error {
return r.db.WithContext(ctx).Delete(&entities.Table{}, id).Error
}
func (r *TableRepository) List(ctx context.Context, organizationID, outletID *uuid.UUID, status *string, isActive *bool, search string, page, limit int) ([]entities.Table, int64, error) {
var tables []entities.Table
var total int64
query := r.db.WithContext(ctx).
Preload("Organization").
Preload("Outlet").
Preload("Order")
if organizationID != nil {
query = query.Where("organization_id = ?", *organizationID)
}
if outletID != nil {
query = query.Where("outlet_id = ?", *outletID)
}
if status != nil {
query = query.Where("status = ?", *status)
}
if isActive != nil {
query = query.Where("is_active = ?", *isActive)
}
if search != "" {
searchTerm := fmt.Sprintf("%%%s%%", search)
query = query.Where("table_name ILIKE ?", searchTerm)
}
// Count total
err := query.Model(&entities.Table{}).Count(&total).Error
if err != nil {
return nil, 0, err
}
// Get paginated results
offset := (page - 1) * limit
err = query.Offset(offset).Limit(limit).Order("table_name").Find(&tables).Error
return tables, total, err
}
func (r *TableRepository) GetAvailableTables(ctx context.Context, outletID uuid.UUID) ([]entities.Table, error) {
var tables []entities.Table
err := r.db.WithContext(ctx).
Preload("Organization").
Preload("Outlet").
Where("outlet_id = ? AND status = ? AND is_active = ?", outletID, "available", true).
Order("table_name").
Find(&tables).Error
return tables, err
}
func (r *TableRepository) GetOccupiedTables(ctx context.Context, outletID uuid.UUID) ([]entities.Table, error) {
var tables []entities.Table
err := r.db.WithContext(ctx).
Preload("Organization").
Preload("Outlet").
Preload("Order").
Where("outlet_id = ? AND status = ? AND is_active = ?", outletID, "occupied", true).
Order("table_name").
Find(&tables).Error
return tables, err
}
func (r *TableRepository) OccupyTable(ctx context.Context, tableID, orderID uuid.UUID, startTime *time.Time) error {
return r.db.WithContext(ctx).
Model(&entities.Table{}).
Where("id = ?", tableID).
Updates(map[string]interface{}{
"status": "occupied",
"order_id": orderID,
"start_time": startTime,
}).Error
}
func (r *TableRepository) ReleaseTable(ctx context.Context, tableID uuid.UUID, paymentAmount float64) error {
return r.db.WithContext(ctx).
Model(&entities.Table{}).
Where("id = ?", tableID).
Updates(map[string]interface{}{
"status": "available",
"order_id": nil,
"start_time": nil,
"payment_amount": paymentAmount,
}).Error
}
func (r *TableRepository) GetByOrderID(ctx context.Context, orderID uuid.UUID) (*entities.Table, error) {
var table entities.Table
err := r.db.WithContext(ctx).
Preload("Organization").
Preload("Outlet").
Preload("Order").
Where("order_id = ?", orderID).
First(&table).Error
if err != nil {
return nil, err
}
return &table, nil
}