package repository import ( "context" "github.com/Caknoooo/go-gin-clean-starter/database/entities" "github.com/Caknoooo/go-gin-clean-starter/modules/quarantine/query" "gorm.io/gorm" ) type QuarantineRepository interface { Create(ctx context.Context, tx *gorm.DB, quarantine entities.TInventoryQuarantineEntity) (entities.TInventoryQuarantineEntity, error) GetById(ctx context.Context, tx *gorm.DB, id string) (entities.TInventoryQuarantineEntity, error) GetAll(ctx context.Context, filter query.QuarantineFilter) ([]entities.TInventoryQuarantineEntity, int64, error) Update(ctx context.Context, tx *gorm.DB, quarantine entities.TInventoryQuarantineEntity) (entities.TInventoryQuarantineEntity, error) Delete(ctx context.Context, tx *gorm.DB, id string) error } type quarantineRepository struct { db *gorm.DB } func NewQuarantineRepository(db *gorm.DB) QuarantineRepository { return &quarantineRepository{db: db} } func (r *quarantineRepository) Create(ctx context.Context, tx *gorm.DB, quarantine entities.TInventoryQuarantineEntity) (entities.TInventoryQuarantineEntity, error) { if tx == nil { tx = r.db } if err := tx.WithContext(ctx).Create(&quarantine).Error; err != nil { return quarantine, err } return quarantine, nil } func (r *quarantineRepository) GetById(ctx context.Context, tx *gorm.DB, id string) (entities.TInventoryQuarantineEntity, error) { if tx == nil { tx = r.db } var quarantine entities.TInventoryQuarantineEntity if err := tx.WithContext(ctx). Preload("Client"). Preload("QuarantineLines"). Preload("QuarantineLines.Product"). Preload("QuarantineLines.Storage"). First(&quarantine, "id = ?", id).Error; err != nil { return quarantine, err } // Assignment manual jika ada var assignment entities.TAssignmentEntity if err := tx.WithContext(ctx). Preload("AssignmentUsers"). Preload("AssignmentUsers.User"). Preload("AssignmentUsers.Role"). First(&assignment, "document_id = ? AND document_type = ?", quarantine.ID, "Quarantine").Error; err == nil { quarantine.Assignment = assignment } return quarantine, nil } func (r *quarantineRepository) GetAll(ctx context.Context, filter query.QuarantineFilter) ([]entities.TInventoryQuarantineEntity, int64, error) { var quarantines []entities.TInventoryQuarantineEntity var total int64 db := query.ApplyQuarantineFilters(r.db, filter) db.Model(&entities.TInventoryQuarantineEntity{}).Count(&total) if filter.PerPage > 0 && filter.Page > 0 { db = db.Offset((filter.Page - 1) * filter.PerPage).Limit(filter.PerPage) } if err := db.Preload("Client").Find(&quarantines).Error; err != nil { return quarantines, total, err } return quarantines, total, nil } func (r *quarantineRepository) Update(ctx context.Context, tx *gorm.DB, quarantine entities.TInventoryQuarantineEntity) (entities.TInventoryQuarantineEntity, error) { if tx == nil { tx = r.db } if err := tx.WithContext(ctx).Model(&entities.TInventoryQuarantineEntity{}).Where("id = ?", quarantine.ID).Select("*").Updates(&quarantine).Error; err != nil { return quarantine, err } return quarantine, nil } func (r *quarantineRepository) Delete(ctx context.Context, tx *gorm.DB, id string) error { if tx == nil { tx = r.db } if err := tx.WithContext(ctx).Delete(&entities.TInventoryQuarantineEntity{}, "id = ?", id).Error; err != nil { return err } return nil }