veza/veza-backend-api/internal/models/hardware.go
2026-03-05 23:03:43 +01:00

162 lines
6.6 KiB
Go

package models
import (
"time"
"gorm.io/gorm"
"github.com/google/uuid"
)
// Equipment équipement musical dans la base de données
type Equipment struct {
ID uuid.UUID `json:"id" gorm:"type:uuid;primaryKey"`
UserID uuid.UUID `json:"user_id" gorm:"type:uuid;not null;index"`
Title string `json:"title" gorm:"not null"`
Description string `json:"description" gorm:"not null"`
EquipmentType string `json:"equipment_type" gorm:"not null;index"`
Brand string `json:"brand" gorm:"not null;index"`
Model string `json:"model" gorm:"not null"`
Year *int `json:"year,omitempty"`
Condition string `json:"condition" gorm:"not null"`
Price float64 `json:"price" gorm:"not null"`
Currency string `json:"currency" gorm:"not null;default:'EUR'"`
Location string `json:"location" gorm:"not null"`
Images []string `json:"images" gorm:"type:jsonb"`
Specifications map[string]interface{} `json:"specifications" gorm:"type:jsonb"`
IsForSale bool `json:"is_for_sale" gorm:"not null;default:false"`
IsForTrade bool `json:"is_for_trade" gorm:"not null;default:false"`
Status string `json:"status" gorm:"not null;default:'active'"`
ShippingInfo *ShippingInfo `json:"shipping_info" gorm:"type:jsonb"`
Warranty *WarrantyInfo `json:"warranty" gorm:"type:jsonb"`
Views int64 `json:"views" gorm:"not null;default:0"`
Favorites int64 `json:"favorites" gorm:"not null;default:0"`
CreatedAt time.Time `json:"created_at" gorm:"autoCreateTime"`
UpdatedAt time.Time `json:"updated_at" gorm:"autoUpdateTime"`
}
// HardwareSale vente d'équipement
type HardwareSale struct {
ID uuid.UUID `json:"id" gorm:"type:uuid;primaryKey"`
EquipmentID uuid.UUID `json:"equipment_id" gorm:"type:uuid;not null;index"`
SellerID uuid.UUID `json:"seller_id" gorm:"type:uuid;not null;index"`
BuyerID uuid.UUID `json:"buyer_id" gorm:"type:uuid;not null;index"`
Price float64 `json:"price" gorm:"not null"`
Currency string `json:"currency" gorm:"not null;default:'EUR'"`
PaymentMethod string `json:"payment_method" gorm:"not null"`
ShippingAddress *Address `json:"shipping_address" gorm:"type:jsonb"`
Status string `json:"status" gorm:"not null;default:'active'"`
Notes string `json:"notes,omitempty"`
TransactionID string `json:"transaction_id,omitempty"`
ProcessedAt *time.Time `json:"processed_at,omitempty"`
CreatedAt time.Time `json:"created_at" gorm:"autoCreateTime"`
UpdatedAt time.Time `json:"updated_at" gorm:"autoUpdateTime"`
}
// EquipmentTrade échange d'équipement
type EquipmentTrade struct {
ID uuid.UUID `json:"id" gorm:"type:uuid;primaryKey"`
OfferedEquipmentID uuid.UUID `json:"offered_equipment_id" gorm:"type:uuid;not null;index"`
RequestedEquipmentID uuid.UUID `json:"requested_equipment_id" gorm:"type:uuid;not null;index"`
OfferedByUserID uuid.UUID `json:"offered_by_user_id" gorm:"type:uuid;not null;index"`
RequestedByUserID uuid.UUID `json:"requested_by_user_id" gorm:"type:uuid;not null;index"`
Message string `json:"message,omitempty"`
CashOffer *float64 `json:"cash_offer,omitempty"`
Status string `json:"status" gorm:"not null;default:'pending'"`
AcceptedAt *time.Time `json:"accepted_at,omitempty"`
RejectedAt *time.Time `json:"rejected_at,omitempty"`
CreatedAt time.Time `json:"created_at" gorm:"autoCreateTime"`
UpdatedAt time.Time `json:"updated_at" gorm:"autoUpdateTime"`
}
// HardwareOffer offre pour un équipement
type HardwareOffer struct {
ID uuid.UUID `json:"id" gorm:"type:uuid;primaryKey"`
EquipmentID uuid.UUID `json:"equipment_id" gorm:"type:uuid;not null;index"`
BuyerID uuid.UUID `json:"buyer_id" gorm:"type:uuid;not null;index"`
OfferAmount float64 `json:"offer_amount" gorm:"not null"`
Currency string `json:"currency" gorm:"not null;default:'EUR'"`
Message string `json:"message,omitempty"`
Status string `json:"status" gorm:"not null;default:'pending'"`
ExpiresAt *time.Time `json:"expires_at,omitempty"`
AcceptedAt *time.Time `json:"accepted_at,omitempty"`
RejectedAt *time.Time `json:"rejected_at,omitempty"`
CreatedAt time.Time `json:"created_at" gorm:"autoCreateTime"`
UpdatedAt time.Time `json:"updated_at" gorm:"autoUpdateTime"`
}
// Structures de données
type ShippingInfo struct {
Method string `json:"method"`
Cost float64 `json:"cost"`
Currency string `json:"currency"`
EstimatedDays int `json:"estimated_days"`
Tracking bool `json:"tracking"`
}
type WarrantyInfo struct {
Type string `json:"type"`
Duration int `json:"duration"` // en mois
Description string `json:"description"`
ExpiresAt *time.Time `json:"expires_at,omitempty"`
}
type Address struct {
Street string `json:"street"`
City string `json:"city"`
State string `json:"state"`
PostalCode string `json:"postal_code"`
Country string `json:"country"`
}
// TableName spécifie le nom de la table pour Equipment
func (Equipment) TableName() string {
return "equipment"
}
// TableName spécifie le nom de la table pour HardwareSale
func (HardwareSale) TableName() string {
return "hardware_sales"
}
// TableName spécifie le nom de la table pour EquipmentTrade
func (EquipmentTrade) TableName() string {
return "equipment_trades"
}
// TableName spécifie le nom de la table pour HardwareOffer
func (HardwareOffer) TableName() string {
return "hardware_offers"
}
// BeforeCreate hook GORM pour générer UUID si non défini
func (m *Equipment) BeforeCreate(tx *gorm.DB) error {
if m.ID == uuid.Nil {
m.ID = uuid.New()
}
return nil
}
// BeforeCreate hook GORM pour générer UUID si non défini
func (m *HardwareSale) BeforeCreate(tx *gorm.DB) error {
if m.ID == uuid.Nil {
m.ID = uuid.New()
}
return nil
}
// BeforeCreate hook GORM pour générer UUID si non défini
func (m *EquipmentTrade) BeforeCreate(tx *gorm.DB) error {
if m.ID == uuid.Nil {
m.ID = uuid.New()
}
return nil
}
// BeforeCreate hook GORM pour générer UUID si non défini
func (m *HardwareOffer) BeforeCreate(tx *gorm.DB) error {
if m.ID == uuid.Nil {
m.ID = uuid.New()
}
return nil
}