lifedebugger's picture
Deploy files from GitHub repository
4727a74
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"`
}