init
This commit is contained in:
@@ -0,0 +1,172 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user