Files
Trackeep/backend/models/marketplace.go
T
Tomas Dvorak d27cf14110 first test
2026-02-08 14:14:55 +01:00

231 lines
8.6 KiB
Go

package models
import (
"time"
"gorm.io/gorm"
)
// MarketplaceItem represents an item in the knowledge marketplace
type MarketplaceItem struct {
ID uint `json:"id" gorm:"primaryKey"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
DeletedAt gorm.DeletedAt `json:"-" gorm:"index"`
// Creator information
SellerID uint `json:"seller_id" gorm:"not null;index"`
Seller User `json:"seller,omitempty" gorm:"foreignKey:SellerID"`
// Basic information
Title string `json:"title" gorm:"not null"`
Description string `json:"description" gorm:"type:text"`
Category string `json:"category" gorm:"not null"` // course, template, tool, guide, resource
// Content type and reference
ContentType string `json:"content_type" gorm:"not null"` // bookmark_collection, note_template, course, learning_path, tool
ContentID *uint `json:"content_id,omitempty"` // Reference to actual content
ContentURL string `json:"content_url"` // Download/access URL
PreviewURL string `json:"preview_url"` // Preview/demo URL
Thumbnail string `json:"thumbnail"` // Item thumbnail
// Pricing
Price float64 `json:"price" gorm:"default:0"` // Price in USD
Currency string `json:"currency" gorm:"default:USD"` // Currency code
IsFree bool `json:"is_free" gorm:"default:false"` // Free item
Subscription bool `json:"subscription" gorm:"default:false"` // Subscription-based
SubscriptionPrice float64 `json:"subscription_price" gorm:"default:0"` // Monthly subscription price
// Ratings and reviews
Rating float64 `json:"rating" gorm:"default:0"` // Average rating (1-5)
ReviewCount int `json:"review_count" gorm:"default:0"` // Number of reviews
DownloadCount int `json:"download_count" gorm:"default:0"` // Number of downloads
// Status and visibility
Status string `json:"status" gorm:"default:draft"` // draft, published, suspended, removed
IsFeatured bool `json:"is_featured" gorm:"default:false"` // Featured item
IsApproved bool `json:"is_approved" gorm:"default:false"` // Admin approved
ApprovedAt *time.Time `json:"approved_at,omitempty"`
ApprovedBy *uint `json:"approved_by,omitempty"`
Approver *User `json:"approver,omitempty" gorm:"foreignKey:ApprovedBy"`
// Tags and metadata
Tags []MarketplaceTag `json:"tags,omitempty" gorm:"many2many:marketplace_item_tags;"`
License string `json:"license" gorm:"default:standard"` // License type
Version string `json:"version" gorm:"default:1.0"` // Version
LastUpdated *time.Time `json:"last_updated,omitempty"`
// Analytics
ViewCount int `json:"view_count" gorm:"default:0"`
LastViewedAt *time.Time `json:"last_viewed_at,omitempty"`
// Relationships
Reviews []MarketplaceReview `json:"reviews,omitempty" gorm:"foreignKey:ItemID"`
Purchases []MarketplacePurchase `json:"purchases,omitempty" gorm:"foreignKey:ItemID"`
}
// MarketplaceTag represents tags for marketplace items
type MarketplaceTag struct {
ID uint `json:"id" gorm:"primaryKey"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
DeletedAt gorm.DeletedAt `json:"-" gorm:"index"`
Name string `json:"name" gorm:"uniqueIndex;not null"`
Description string `json:"description"`
Color string `json:"color" gorm:"default:#6366f1"` // Tag color
UsageCount int `json:"usage_count" gorm:"default:0"`
}
// MarketplaceReview represents a review for a marketplace item
type MarketplaceReview struct {
ID uint `json:"id" gorm:"primaryKey"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
DeletedAt gorm.DeletedAt `json:"-" gorm:"index"`
// Review information
ItemID uint `json:"item_id" gorm:"not null;index"`
Item MarketplaceItem `json:"item,omitempty" gorm:"foreignKey:ItemID"`
ReviewerID uint `json:"reviewer_id" gorm:"not null;index"`
Reviewer User `json:"reviewer,omitempty" gorm:"foreignKey:ReviewerID"`
// Review content
Rating int `json:"rating" gorm:"not null;check:rating >= 1 AND rating <= 5"` // 1-5 stars
Title string `json:"title"`
Content string `json:"content" gorm:"type:text"`
// Review metadata
HelpfulCount int `json:"helpful_count" gorm:"default:0"`
IsVerified bool `json:"is_verified" gorm:"default:false"` // Verified purchase
PurchaseID *uint `json:"purchase_id,omitempty"`
ReviewedAt time.Time `json:"reviewed_at"`
// Status
Status string `json:"status" gorm:"default:published"` // published, hidden, removed
}
// MarketplacePurchase represents a purchase from the marketplace
type MarketplacePurchase struct {
ID uint `json:"id" gorm:"primaryKey"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
DeletedAt gorm.DeletedAt `json:"-" gorm:"index"`
// Purchase information
ItemID uint `json:"item_id" gorm:"not null;index"`
Item MarketplaceItem `json:"item,omitempty" gorm:"foreignKey:ItemID"`
BuyerID uint `json:"buyer_id" gorm:"not null;index"`
Buyer User `json:"buyer,omitempty" gorm:"foreignKey:BuyerID"`
// Purchase details
Price float64 `json:"price" gorm:"not null"`
Currency string `json:"currency" gorm:"default:USD"`
PaymentMethod string `json:"payment_method"` // stripe, paypal, crypto
TransactionID string `json:"transaction_id" gorm:"uniqueIndex"`
// License and access
LicenseType string `json:"license_type" gorm:"default:personal"` // personal, commercial, enterprise
AccessGranted bool `json:"access_granted" gorm:"default:true"`
ExpiresAt *time.Time `json:"expires_at,omitempty"` // For subscriptions
// Status
Status string `json:"status" gorm:"default:completed"` // pending, completed, refunded, cancelled
RefundedAt *time.Time `json:"refunded_at,omitempty"`
RefundReason string `json:"refund_reason,omitempty"`
// Analytics
DownloadCount int `json:"download_count" gorm:"default:0"`
LastDownloadAt *time.Time `json:"last_download_at,omitempty"`
}
// ContentShare represents shared content links
type ContentShare struct {
ID uint `json:"id" gorm:"primaryKey"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
DeletedAt gorm.DeletedAt `json:"-" gorm:"index"`
// Owner information
OwnerID uint `json:"owner_id" gorm:"not null;index"`
Owner User `json:"owner,omitempty" gorm:"foreignKey:OwnerID"`
// Content information
ContentType string `json:"content_type" gorm:"not null"` // bookmark, note, file, task, goal
ContentID uint `json:"content_id" gorm:"not null"`
// Share settings
ShareToken string `json:"share_token" gorm:"uniqueIndex;not null"`
ShareURL string `json:"share_url"`
Title string `json:"title"`
Description string `json:"description"`
Password string `json:"-" gorm:"column:password"` // Optional password protection
ExpiresAt *time.Time `json:"expires_at,omitempty"`
// Access control
AllowDownload bool `json:"allow_download" gorm:"default:true"`
AllowComment bool `json:"allow_comment" gorm:"default:false"`
AllowEdit bool `json:"allow_edit" gorm:"default:false"`
// Analytics
ViewCount int `json:"view_count" gorm:"default:0"`
DownloadCount int `json:"download_count" gorm:"default:0"`
LastAccessedAt *time.Time `json:"last_accessed_at,omitempty"`
// Status
IsActive bool `json:"is_active" gorm:"default:true"`
}
// BeforeCreate hooks
func (m *MarketplaceItem) BeforeCreate(tx *gorm.DB) error {
if m.Status == "" {
m.Status = "draft"
}
if m.Currency == "" {
m.Currency = "USD"
}
if m.Version == "" {
m.Version = "1.0"
}
if m.License == "" {
m.License = "standard"
}
return nil
}
func (r *MarketplaceReview) BeforeCreate(tx *gorm.DB) error {
if r.Status == "" {
r.Status = "published"
}
r.ReviewedAt = time.Now()
return nil
}
func (p *MarketplacePurchase) BeforeCreate(tx *gorm.DB) error {
if p.Status == "" {
p.Status = "completed"
}
if p.Currency == "" {
p.Currency = "USD"
}
if p.LicenseType == "" {
p.LicenseType = "personal"
}
return nil
}
func (s *ContentShare) BeforeCreate(tx *gorm.DB) error {
if s.ShareToken == "" {
// Generate a unique share token
s.ShareToken = generateShareToken()
}
return nil
}
// Helper function to generate share tokens
func generateShareToken() string {
// This should generate a cryptographically secure random token
// For now, using a simple implementation
return "share_" + time.Now().Format("20060102150405")
}