package entities import ( "time" "gorm.io/datatypes" ) const ( RoleMember = "member" RoleInstructor = "instructor" RoleVenueOwner = "venue_owner" RoleAdmin = "admin" ) type User struct { ID string `gorm:"type:uuid;primaryKey" json:"id,omitempty"` PhoneNumber string `gorm:"uniqueIndex;not null" json:"phone_number,omitempty"` Email *string `json:"email,omitempty"` PasswordHash *string `json:"password_hash,omitempty"` FullName string `json:"full_name,omitempty"` Nickname string `json:"nickname,omitempty"` Gender *string `json:"gender,omitempty"` DanceLevel *string `json:"dance_level,omitempty"` Rank *string `json:"rank,omitempty"` Province *string `json:"province,omitempty"` City *string `json:"city,omitempty"` Description *string `gorm:"type:text" json:"description,omitempty"` Interests datatypes.JSON `swaggertype:"object" json:"interests,omitempty"` OtherInterest *string `json:"other_interest,omitempty"` ProfileMedia *string `json:"profile_media,omitempty"` PrefedLanguage *string `json:"prefed_language,omitempty"` Age *int `json:"age,omitempty"` AdditionalDetails datatypes.JSON `swaggertype:"object" json:"additional_details,omitempty"` IsMember bool `json:"is_member,omitempty"` IsInstructor bool `json:"is_instructor,omitempty"` IsVO bool `json:"is_vo,omitempty"` CreatedAt time.Time `json:"created_at,omitempty"` UpdatedAt time.Time `json:"updated_at,omitempty"` Roles []UserRole `gorm:"foreignKey:UserID" json:"roles,omitempty"` } type UserRole struct { ID string `gorm:"type:uuid;primaryKey" json:"id,omitempty"` UserID string `gorm:"type:uuid;index" json:"user_id,omitempty"` Role string `gorm:"type:varchar(50)" json:"role,omitempty"` CreatedAt time.Time `json:"created_at,omitempty"` User User `gorm:"foreignKey:UserID" json:"user,omitempty"` } type Instructor struct { ID string `gorm:"type:uuid;primaryKey" json:"id,omitempty"` UserID string `gorm:"type:uuid;uniqueIndex" json:"user_id,omitempty"` Rank string `json:"rank,omitempty"` Specialization datatypes.JSON `swaggertype:"object" json:"specialization,omitempty"` Introduction datatypes.JSON `swaggertype:"object" json:"introduction,omitempty"` ProfileMedia datatypes.JSON `swaggertype:"object" json:"profile_media,omitempty"` CreatedAt time.Time `json:"created_at,omitempty"` User User `gorm:"foreignKey:UserID" json:"user,omitempty"` } type VenueOwner struct { ID string `gorm:"type:uuid;primaryKey" json:"id,omitempty"` UserID string `gorm:"type:uuid;uniqueIndex" json:"user_id,omitempty"` CreatedAt time.Time `json:"created_at,omitempty"` User User `gorm:"foreignKey:UserID" json:"user,omitempty"` } type Venue struct { ID string `gorm:"type:uuid;primaryKey" json:"id,omitempty"` OwnerID string `gorm:"type:uuid;index" json:"owner_id,omitempty"` Name string `json:"name,omitempty"` Description datatypes.JSON `swaggertype:"object" json:"description,omitempty"` Province string `json:"province,omitempty"` City string `json:"city,omitempty"` Address string `json:"address,omitempty"` Latitude float64 `json:"latitude,omitempty"` Longitude float64 `json:"longitude,omitempty"` Capacity int `json:"capacity,omitempty"` MinimumConsumption float64 `json:"minimum_consumption,omitempty"` OpeningTime string `json:"opening_time,omitempty"` ClosingTime string `json:"closing_time,omitempty"` VenueMedia datatypes.JSON `swaggertype:"object" json:"venue_media,omitempty"` VerificationStatus string `json:"verification_status,omitempty"` Facilities []Facility `gorm:"many2many:venue_facilities;" json:"facilities,omitempty"` ExtraFacilities datatypes.JSON `swaggertype:"array,string" json:"extra_facilities,omitempty"` RatingFood float64 `json:"rating_food,omitempty"` RatingPrice float64 `json:"rating_price,omitempty"` RatingMusic float64 `json:"rating_music,omitempty"` RatingSound float64 `json:"rating_sound,omitempty"` RatingParking float64 `json:"rating_parking,omitempty"` CreatedAt time.Time `json:"created_at,omitempty"` Owner VenueOwner `gorm:"foreignKey:OwnerID" json:"owner,omitempty"` } type Facility struct { ID string `gorm:"type:uuid;primaryKey" json:"id,omitempty"` Name string `json:"name,omitempty"` Icon string `json:"icon,omitempty"` } type Class struct { ID string `gorm:"type:uuid;primaryKey" json:"id,omitempty"` InstructorID string `gorm:"type:uuid;index" json:"instructor_id,omitempty"` VenueID *string `gorm:"type:uuid" json:"venue_id,omitempty"` Title string `json:"title,omitempty"` Description datatypes.JSON `swaggertype:"object" json:"description,omitempty"` Capacity int `json:"capacity,omitempty"` Price float64 `json:"price,omitempty"` ScheduleType string `json:"schedule_type,omitempty"` StartTime time.Time `json:"start_time,omitempty"` EndTime time.Time `json:"end_time,omitempty"` ClassMedia datatypes.JSON `swaggertype:"object" json:"class_media,omitempty"` AvailableSlots datatypes.JSON `swaggertype:"object" json:"available_slots,omitempty"` AvailableTypes datatypes.JSON `swaggertype:"object" json:"available_types,omitempty"` CustomField datatypes.JSON `swaggertype:"object" json:"custom_field,omitempty"` CreatedAt time.Time `json:"created_at,omitempty"` Instructor Instructor `gorm:"foreignKey:InstructorID" json:"instructor,omitempty"` Venue *Venue `gorm:"foreignKey:VenueID" json:"venue,omitempty"` } type ClassBooking struct { ID string `gorm:"type:uuid;primaryKey" json:"id,omitempty"` ClassID string `gorm:"type:uuid;index" json:"class_id,omitempty"` UserID string `gorm:"type:uuid;index" json:"user_id,omitempty"` BookingStatus string `json:"booking_status,omitempty"` PaymentStatus string `json:"payment_status,omitempty"` PaymentMethod string `json:"payment_method,omitempty"` SlotIDs datatypes.JSON `swaggertype:"array,string" json:"slot_ids,omitempty"` TypeID string `json:"type_id,omitempty"` TotalAmount float64 `json:"total_amount,omitempty"` XenditInvoiceID *string `json:"xendit_invoice_id,omitempty"` CheckoutURL *string `json:"checkout_url,omitempty"` AvailableSlots datatypes.JSON `swaggertype:"object" json:"available_slots,omitempty"` AvailableTypes datatypes.JSON `swaggertype:"object" json:"available_types,omitempty"` PaymentDetails datatypes.JSON `swaggertype:"object" json:"payment_details,omitempty"` CreatedAt time.Time `json:"created_at,omitempty"` Class Class `gorm:"foreignKey:ClassID" json:"class,omitempty"` User User `gorm:"foreignKey:UserID" json:"user,omitempty"` } type Event struct { ID string `gorm:"type:uuid;primaryKey" json:"id,omitempty"` HostUserID string `gorm:"type:uuid;index" json:"host_user_id,omitempty"` VenueID *string `gorm:"type:uuid" json:"venue_id,omitempty"` Title string `json:"title,omitempty"` Description datatypes.JSON `swaggertype:"object" json:"description,omitempty"` ScheduleType string `json:"schedule_type,omitempty"` EventDate time.Time `json:"event_date,omitempty"` StartTime time.Time `json:"start_time,omitempty"` EndTime time.Time `json:"end_time,omitempty"` Capacity int `json:"capacity,omitempty"` EntranceFee float64 `json:"entrance_fee,omitempty"` EventMedia datatypes.JSON `swaggertype:"object" json:"event_media,omitempty"` // Approval workflow ApprovalStatus string `gorm:"type:varchar(50);default:'PENDING_APPROVAL'" json:"approval_status,omitempty"` RejectionReason *string `gorm:"type:text" json:"rejection_reason,omitempty"` CreatedAt time.Time `json:"created_at,omitempty"` UpdatedAt time.Time `json:"updated_at,omitempty"` HostUser User `gorm:"foreignKey:HostUserID" json:"host_user,omitempty"` Venue *Venue `gorm:"foreignKey:VenueID" json:"venue,omitempty"` Packages []EventPackage `gorm:"foreignKey:EventID" json:"packages,omitempty"` Instructors []EventInstructor `gorm:"foreignKey:EventID" json:"instructors,omitempty"` } type EventInstructor struct { ID string `gorm:"type:uuid;primaryKey" json:"id,omitempty"` EventID string `gorm:"type:uuid;index" json:"event_id,omitempty"` InstructorID string `gorm:"type:uuid;index" json:"instructor_id,omitempty"` PartnerCapacity int `json:"partner_capacity,omitempty"` CreatedAt time.Time `json:"created_at,omitempty"` Event Event `gorm:"foreignKey:EventID" json:"event,omitempty"` Instructor Instructor `gorm:"foreignKey:InstructorID" json:"instructor,omitempty"` } type EventPackage struct { ID string `gorm:"type:uuid;primaryKey" json:"id,omitempty"` EventID string `gorm:"type:uuid;index" json:"event_id,omitempty"` Name string `json:"name,omitempty"` Description datatypes.JSON `swaggertype:"object" json:"description,omitempty"` Price float64 `json:"price,omitempty"` PartnerIncluded bool `json:"partner_included,omitempty"` CreatedAt time.Time `json:"created_at,omitempty"` Event Event `gorm:"foreignKey:EventID" json:"event,omitempty"` } type EventBooking struct { ID string `gorm:"type:uuid;primaryKey" json:"id,omitempty"` EventID string `gorm:"type:uuid;index" json:"event_id,omitempty"` PackageID string `gorm:"type:uuid" json:"package_id,omitempty"` UserID string `gorm:"type:uuid" json:"user_id,omitempty"` PartnerInstructorID *string `gorm:"type:uuid" json:"partner_instructor_id,omitempty"` BookingStatus string `json:"booking_status,omitempty"` PaymentStatus string `json:"payment_status,omitempty"` PaymentMethod string `json:"payment_method,omitempty"` // Payment integration TotalAmount float64 `json:"total_amount,omitempty"` XenditInvoiceID *string `json:"xendit_invoice_id,omitempty"` CheckoutURL *string `json:"checkout_url,omitempty"` CreatedAt time.Time `json:"created_at,omitempty"` UpdatedAt time.Time `json:"updated_at,omitempty"` Event Event `gorm:"foreignKey:EventID" json:"event,omitempty"` Package EventPackage `gorm:"foreignKey:PackageID" json:"package,omitempty"` User User `gorm:"foreignKey:UserID" json:"user,omitempty"` } type Payment struct { ID string `gorm:"type:uuid;primaryKey" json:"id,omitempty"` UserID string `gorm:"type:uuid" json:"user_id,omitempty"` EventBookingID *string `gorm:"type:uuid" json:"event_booking_id,omitempty"` ClassBookingID *string `gorm:"type:uuid" json:"class_booking_id,omitempty"` Amount float64 `json:"amount,omitempty"` PaymentMethod string `json:"payment_method,omitempty"` PaymentStatus string `json:"payment_status,omitempty"` XenditInvoiceID *string `json:"xendit_invoice_id,omitempty"` CreatedAt time.Time `json:"created_at,omitempty"` User User `gorm:"foreignKey:UserID" json:"user,omitempty"` } type UserFavorite struct { ID string `gorm:"type:uuid;primaryKey" json:"id,omitempty"` UserID string `gorm:"type:uuid;index:idx_user_class,unique" json:"user_id,omitempty"` ClassID string `gorm:"type:uuid;index:idx_user_class,unique" json:"class_id,omitempty"` CreatedAt time.Time `json:"created_at,omitempty"` User User `gorm:"foreignKey:UserID" json:"user,omitempty"` Class Class `gorm:"foreignKey:ClassID" json:"class,omitempty"` } type OTPVerification struct { ID string `gorm:"type:text;primaryKey" json:"id,omitempty"` PhoneNumber string `json:"phone_number,omitempty"` OTPCode string `json:"otp_code,omitempty"` ExpiredAt time.Time `json:"expired_at,omitempty"` Verified bool `json:"verified,omitempty"` CreatedAt time.Time `json:"created_at,omitempty"` } type UserEventFavorite struct { ID string `gorm:"type:uuid;primaryKey" json:"id,omitempty"` UserID string `gorm:"type:uuid;index:idx_user_event,unique" json:"user_id,omitempty"` EventID string `gorm:"type:uuid;index:idx_user_event,unique" json:"event_id,omitempty"` CreatedAt time.Time `json:"created_at,omitempty"` User User `gorm:"foreignKey:UserID" json:"user,omitempty"` Event Event `gorm:"foreignKey:EventID" json:"event,omitempty"` }