feat: implement 8 features across full stack
- Leaderboard: rank-based percentile tiers (champion/gold/silver/bronze),
deterministic tie-breaking (xp DESC, user_id ASC)
- Mentor chat: md: breakpoints, safe-area-inset-bottom padding
- Learning progress: server-side progressPct, curriculum expansion safety
- Physical orders: hard-disabled with 410 Gone
- Certificate approval: pending/issued flow, admin issue/revoke endpoints,
certificate_requires_approval setting (migration 0031)
- Draft/publish: is_published on lessons and chapters, admin publish UI
(migration 0030)
- Video panel: static thumbnails (no preload), client-side pagination
- Rich editor: TipTap + tiptap-markdown for lesson descriptions,
marked + DOMPurify for SafeMarkdown rendering
This commit is contained in:
@@ -107,10 +107,11 @@ func (u *User) ApplyFreezeState(now time.Time) {
|
||||
type Certificate struct {
|
||||
ID int64 `json:"id"`
|
||||
UserID int64 `json:"userId"`
|
||||
PublicID string `json:"publicId"`
|
||||
PublicID string `json:"publicId,omitempty"`
|
||||
FullName string `json:"fullName"`
|
||||
IssuedAt time.Time `json:"issuedAt"`
|
||||
RevokedAt *time.Time `json:"revokedAt,omitempty"`
|
||||
Status string `json:"status"`
|
||||
}
|
||||
|
||||
type PhysicalOrderStatus string
|
||||
@@ -164,6 +165,7 @@ type Chapter struct {
|
||||
Description string `json:"description"`
|
||||
Icon string `json:"icon"`
|
||||
SortOrder int `json:"sortOrder"`
|
||||
IsPublished bool `json:"isPublished"`
|
||||
}
|
||||
|
||||
type Lesson struct {
|
||||
@@ -180,6 +182,7 @@ type Lesson struct {
|
||||
SortOrder int `json:"sortOrder"`
|
||||
XPReward int `json:"xpReward"`
|
||||
IsActive bool `json:"isActive"`
|
||||
IsPublished bool `json:"isPublished"`
|
||||
}
|
||||
|
||||
type MCQQuestion struct {
|
||||
|
||||
Reference in New Issue
Block a user