146 lines
4.0 KiB
Go
146 lines
4.0 KiB
Go
package repositories
|
||
|
||
import (
|
||
"errors"
|
||
"time"
|
||
|
||
"github.com/niangaodev/art-code/config"
|
||
"github.com/niangaodev/art-code/models"
|
||
)
|
||
|
||
// 内置模板 slug(保留字,自定义上传不可占用)
|
||
const (
|
||
BuiltinTemplateClassic = "classic"
|
||
BuiltinTemplateTerminal = "ubuntu-terminal"
|
||
BuiltinTemplatePixel = "pixel"
|
||
BuiltinTemplateMagazine = "magazine"
|
||
BuiltinTemplateNewspaper = "newspaper"
|
||
BuiltinTemplateBento = "bento"
|
||
BuiltinTemplateGlass = "glass"
|
||
BuiltinTemplateRetro = "retro"
|
||
BuiltinTemplateGuofeng = "guofeng"
|
||
DefaultSiteTemplateSlug = "classic"
|
||
TemplateTypeBuiltin = "builtin"
|
||
TemplateTypeCustom = "custom"
|
||
SettingKeySiteTemplate = "site_template"
|
||
)
|
||
|
||
var ErrTemplateSystemDelete = errors.New("system template cannot be deleted")
|
||
var ErrTemplateInUse = errors.New("template is currently active and cannot be deleted")
|
||
|
||
// GetActiveTemplates 获取所有启用模板(公开)
|
||
func GetActiveTemplates() ([]models.Template, error) {
|
||
var list []models.Template
|
||
err := config.DB.Model(&models.Template{}).
|
||
Where("deleted_at = ? AND is_active = ?", 0, true).
|
||
Order("sort_order ASC, id ASC").
|
||
Find(&list).Error
|
||
return list, err
|
||
}
|
||
|
||
// GetAllTemplates 获取全部模板(后台)
|
||
func GetAllTemplates() ([]models.Template, error) {
|
||
var list []models.Template
|
||
err := config.DB.Model(&models.Template{}).
|
||
Where("deleted_at = ?", 0).
|
||
Order("sort_order ASC, id ASC").
|
||
Find(&list).Error
|
||
return list, err
|
||
}
|
||
|
||
// GetTemplateByID 按 ID 获取模板
|
||
func GetTemplateByID(id uint) (*models.Template, error) {
|
||
var t models.Template
|
||
err := config.DB.Model(&models.Template{}).
|
||
Where("id = ? AND deleted_at = ?", id, 0).
|
||
First(&t).Error
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
return &t, nil
|
||
}
|
||
|
||
// GetTemplateBySlug 按 slug 获取模板(含未启用,内部使用)
|
||
func GetTemplateBySlug(slug string) (*models.Template, error) {
|
||
var t models.Template
|
||
err := config.DB.Model(&models.Template{}).
|
||
Where("slug = ? AND deleted_at = ?", slug, 0).
|
||
First(&t).Error
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
return &t, nil
|
||
}
|
||
|
||
// GetActiveTemplateBySlug 按 slug 获取启用模板(公开接口,未启用返回 404)
|
||
func GetActiveTemplateBySlug(slug string) (*models.Template, error) {
|
||
var t models.Template
|
||
err := config.DB.Model(&models.Template{}).
|
||
Where("slug = ? AND deleted_at = ? AND is_active = ?", slug, 0, true).
|
||
First(&t).Error
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
return &t, nil
|
||
}
|
||
|
||
// CreateTemplate 创建模板
|
||
func CreateTemplate(t *models.Template) error {
|
||
return config.DB.Create(t).Error
|
||
}
|
||
|
||
// UpdateTemplate 更新模板基础信息
|
||
func UpdateTemplate(t *models.Template) error {
|
||
return config.DB.Model(&models.Template{}).
|
||
Where("id = ? AND deleted_at = ?", t.ID, 0).
|
||
Updates(map[string]interface{}{
|
||
"name": t.Name,
|
||
"description": t.Description,
|
||
"is_active": t.IsActive,
|
||
"updated_at": time.Now().Unix(),
|
||
}).Error
|
||
}
|
||
|
||
// DeleteTemplate 物理删除自定义模板(内置模板禁止删除)
|
||
func DeleteTemplate(id uint) error {
|
||
t, err := GetTemplateByID(id)
|
||
if err != nil {
|
||
return err
|
||
}
|
||
if t.IsSystem {
|
||
return ErrTemplateSystemDelete
|
||
}
|
||
if t.Slug == GetCurrentSiteTemplateSlug() {
|
||
return ErrTemplateInUse
|
||
}
|
||
return config.DB.Model(&models.Template{}).
|
||
Where("id = ?", id).
|
||
Delete(&models.Template{}).Error
|
||
}
|
||
|
||
// GetCurrentSiteTemplateSlug 读取当前启用的站点模板 slug(缺省 classic)
|
||
func GetCurrentSiteTemplateSlug() string {
|
||
s, err := GetSettingByKey(SettingKeySiteTemplate)
|
||
if err != nil || s == nil || s.Value == "" {
|
||
return DefaultSiteTemplateSlug
|
||
}
|
||
return s.Value
|
||
}
|
||
|
||
// ActivateTemplate 将模板设为站点当前模板
|
||
func ActivateTemplate(slug string) error {
|
||
s, err := GetSettingByKey(SettingKeySiteTemplate)
|
||
if err != nil {
|
||
return err
|
||
}
|
||
if s == nil {
|
||
return CreateSetting(&models.Setting{
|
||
KeyName: SettingKeySiteTemplate,
|
||
Value: slug,
|
||
Description: "当前启用的前端页面模板 slug",
|
||
})
|
||
}
|
||
s.Value = slug
|
||
return UpdateSetting(s)
|
||
}
|