Basdat/internal/models/lost_item.go
2025-12-20 00:01:08 +07:00

111 lines
3.9 KiB
Go

package models
import (
"time"
"gorm.io/gorm"
)
type LostItem struct {
ID uint `gorm:"primaryKey" json:"id"`
UserID uint `gorm:"not null" json:"user_id"`
User User `gorm:"foreignKey:UserID" json:"user,omitempty"`
Name string `gorm:"type:varchar(100);not null" json:"name"`
CategoryID uint `gorm:"not null" json:"category_id"`
Category Category `gorm:"foreignKey:CategoryID" json:"category,omitempty"`
Color string `gorm:"type:varchar(50)" json:"color"`
Location string `gorm:"type:varchar(200)" json:"location"`
Description string `gorm:"type:text;not null" json:"description"`
DateLost time.Time `gorm:"not null" json:"date_lost"`
Status string `gorm:"type:varchar(50);default:'active'" json:"status"`
MatchedAt *time.Time `json:"matched_at"`
// NEW: Direct claim fields
DirectClaimID *uint `json:"direct_claim_id"`
DirectClaim *Claim `gorm:"foreignKey:DirectClaimID" json:"direct_claim,omitempty"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
DeletedAt gorm.DeletedAt `gorm:"index" json:"-"`
MatchResults []MatchResult `gorm:"foreignKey:LostItemID" json:"match_results,omitempty"`
}
func (LostItem) TableName() string {
return "lost_items"
}
const (
LostItemStatusActive = "active"
LostItemStatusFound = "found"
LostItemStatusExpired = "expired"
LostItemStatusClosed = "closed"
LostItemStatusClaimed = "claimed" // NEW: Status ketika ada yang klaim langsung ke owner
LostItemStatusCompleted = "completed" // NEW: Status ketika owner confirm sudah terima barang
)
func (l *LostItem) BeforeCreate(tx *gorm.DB) error {
if l.Status == "" {
l.Status = LostItemStatusActive
}
return nil
}
func (l *LostItem) IsActive() bool {
return l.Status == LostItemStatusActive
}
func (l *LostItem) IsClaimed() bool {
return l.Status == LostItemStatusClaimed
}
type LostItemResponse struct {
ID uint `json:"id"`
UserID uint `json:"user_id"`
UserName string `json:"user_name"`
Name string `json:"name"`
CategoryID uint `json:"category_id"` // ✅ TAMBAHKAN INI
Category string `json:"category"`
Color string `json:"color"`
Location string `json:"location"`
Description string `json:"description"`
DateLost time.Time `json:"date_lost"`
Status string `json:"status"`
CreatedAt time.Time `json:"created_at"`
DirectClaimID *uint `json:"direct_claim_id,omitempty"`
DirectClaimStatus string `json:"direct_claim_status,omitempty"`
DirectClaim *ClaimResponse `json:"direct_claim,omitempty"`
}
func (l *LostItem) ToResponse() LostItemResponse {
userName := ""
if l.User.ID != 0 {
userName = l.User.Name
}
categoryName := ""
if l.Category.ID != 0 {
categoryName = l.Category.Name
}
directClaimStatus := ""
var directClaimResp *ClaimResponse
if l.DirectClaim != nil {
directClaimStatus = l.DirectClaim.Status
resp := l.DirectClaim.ToResponse()
directClaimResp = &resp
}
return LostItemResponse{
ID: l.ID,
UserID: l.UserID,
UserName: userName,
Name: l.Name,
CategoryID: l.CategoryID, // ✅ TAMBAHKAN INI
Category: categoryName,
Color: l.Color,
Location: l.Location,
Description: l.Description,
DateLost: l.DateLost,
Status: l.Status,
CreatedAt: l.CreatedAt,
DirectClaimID: l.DirectClaimID,
DirectClaimStatus: directClaimStatus,
DirectClaim: directClaimResp,
}
}