Initialize AutoLibrary website with Gitea deployment

This commit is contained in:
KenanZhu committed 2026-11-04 09:59:06 +08:00
commit 18216953e7
101 files changed
+12581

No files matched your search

+100
View File
@@ -0,0 +1,100 @@
package themes_handler
import (
"strconv"
"strings"
"unicode/utf8"
"autolibrary.top/webserver/backend/models/themes_model"
"autolibrary.top/webserver/utils"
"github.com/gin-gonic/gin"
)
func parseThemeID(c *gin.Context) (uint, error) {
id, err := strconv.ParseUint(c.Param("id"), 10, 32)
if err != nil || id == 0 {
return 0, strconv.ErrSyntax
}
return uint(id), nil
}
func (h *Handler) PutThemeByID(c *gin.Context) {
theme, ok := h.ownTheme(c)
if !ok {
return
}
var update struct {
Name string `json:"name"`
Brief string `json:"brief"`
Description string `json:"description"`
NeedTheme string `json:"need_theme"`
Tags []string `json:"tags"`
Version string `json:"version"`
CompatVersion string `json:"compat_version"`
PreviewURL string `json:"preview_url"`
}
if err := c.ShouldBindJSON(&update); err != nil {
fail(c, 400, "Invalid theme metadata")
return
}
if update.Name != "" && strings.TrimSpace(update.Name) != theme.Name {
var count int64
if err := h.DB.Model(&themes_model.Theme{}).Where("user_id = ? AND name = ? AND id != ?", theme.UserID, strings.TrimSpace(update.Name), theme.ID).Count(&count).Error; err != nil {
fail(c, 500, "Unable to check theme name")
return
}
if count > 0 {
fail(c, 409, "You already have a theme with this name")
return
}
theme.Name = strings.TrimSpace(update.Name)
}
if update.NeedTheme != "" && update.NeedTheme != "dark" && update.NeedTheme != "light" && update.NeedTheme != "both" {
fail(c, 400, "Invalid theme mode")
return
}
if utf8.RuneCountInString(update.Brief) > 50 || utf8.RuneCountInString(update.Description) > 100 {
fail(c, 400, "Theme description is too long")
return
}
if strings.TrimSpace(update.Brief) != "" {
theme.Brief = strings.TrimSpace(update.Brief)
}
theme.Description = update.Description
if update.NeedTheme != "" {
theme.NeedTheme = update.NeedTheme
}
if update.Tags != nil {
theme.Tags = update.Tags
}
if update.Version != "" {
theme.Version = update.Version
}
theme.CompatVersion = update.CompatVersion
// Preview changes go through the authenticated image upload endpoint. Preserve
// the legacy field only when it refers to the theme's existing preview.
if update.PreviewURL != "" && update.PreviewURL != theme.PreviewURL {
fail(c, 400, "Use the preview upload endpoint to replace an image")
return
}
theme.Status = themes_model.ThemePending
theme.UpdatedAt = utils.NowInShanghai()
if err := h.Themes.Save(theme, nil); err != nil {
fail(c, 500, "Unable to save theme and archive")
return
}
success(c, 200, "Theme updated; review required", theme)
}
func (h *Handler) DeleteThemeByID(c *gin.Context) {
theme, ok := h.ownTheme(c)
if !ok {
return
}
if err := h.Themes.Delete(theme); err != nil {
fail(c, 500, "Unable to delete theme")
return
}
success(c, 200, "Theme deleted", nil)
}