mirror of
https://github.com/Dvorinka/Trackeep.git
synced 2026-06-03 20:12:58 +00:00
231 lines
8.6 KiB
Go
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")
|
|
}
|