230 lines
4.4 KiB
Go
230 lines
4.4 KiB
Go
package service
|
|
|
|
import (
|
|
"encoding/json"
|
|
"slices"
|
|
"strings"
|
|
"time"
|
|
"yintai-api/app/admin/request"
|
|
"yintai-api/app/common/consts"
|
|
"yintai-api/app/common/dao"
|
|
err2 "yintai-api/app/common/err"
|
|
"yintai-api/app/common/model"
|
|
"yintai-api/base/global"
|
|
|
|
"github.com/smbrave/goutil"
|
|
"github.com/spf13/cast"
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
type News struct{}
|
|
|
|
func (r *News) Create(req request.NewsCreate) int64 {
|
|
images := make(map[string][]string)
|
|
for sourceType, imgs := range req.CoverResource {
|
|
images[sourceType] = Images(imgs)
|
|
}
|
|
|
|
m := new(model.News)
|
|
m.CoverImages = goutil.EncodeJSON(images)
|
|
m.CoverShow = req.CoverShow
|
|
m.Count = 0
|
|
m.CreateTime = time.Now().Unix()
|
|
m.Weight = cast.ToInt64(req.Weight)
|
|
m.Pinned = cast.ToInt64(req.Pinned) % 2
|
|
|
|
ms := make([]*model.NewsTranslations, 0)
|
|
for lang, trans := range req.Trans {
|
|
lang = strings.ToUpper(lang)
|
|
if !slices.Contains(consts.LangSupport, lang) {
|
|
continue
|
|
}
|
|
ms = append(ms, &model.NewsTranslations{
|
|
Lang: lang,
|
|
Title: trans.Title,
|
|
PublishTime: trans.PublishTime,
|
|
Content: trans.Content,
|
|
})
|
|
}
|
|
|
|
err := global.GetDB().Transaction(func(tx *gorm.DB) error {
|
|
if err := dao.NewNews(tx).Create(m); err != nil {
|
|
return err
|
|
}
|
|
|
|
for _, trans := range ms {
|
|
trans.NewsID = m.ID
|
|
if err := dao.NewNewsTranslations(tx).Create(trans); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
if err := BizCateCreate(tx, m.ID, cast.ToInt64(req.CategoryID), model.CateTypeNews); err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
})
|
|
if err != nil {
|
|
err2.DbErr(err)
|
|
}
|
|
|
|
return m.ID
|
|
}
|
|
|
|
func (r *News) Update(req request.NewsUpdate) {
|
|
m, err := dao.NewNews().Get(cast.ToInt64(req.ID))
|
|
if err != nil {
|
|
err2.DbErr(err)
|
|
}
|
|
|
|
if m == nil {
|
|
err2.NotEsxErr()
|
|
return
|
|
}
|
|
|
|
images := make(map[string][]string)
|
|
_ = json.Unmarshal([]byte(m.CoverImages), &images)
|
|
|
|
if req.CoverResource != nil {
|
|
for sourceType, imgs := range req.CoverResource {
|
|
images[sourceType] = Images(imgs)
|
|
}
|
|
m.CoverImages = goutil.EncodeJSON(images)
|
|
}
|
|
|
|
if m.CoverShow != "" {
|
|
m.CoverShow = req.CoverShow
|
|
}
|
|
|
|
if weight := cast.ToInt64(req.Weight); weight != m.Weight {
|
|
m.Weight = weight
|
|
}
|
|
|
|
if pinned := cast.ToInt64(req.Pinned); pinned != m.Pinned {
|
|
m.Pinned = pinned
|
|
}
|
|
|
|
m.UpdateTime = time.Now().Unix()
|
|
|
|
ms := make([]*model.NewsTranslations, 0)
|
|
for lang, trans := range req.Trans {
|
|
lang = strings.ToUpper(lang)
|
|
if !slices.Contains(consts.LangSupport, lang) {
|
|
continue
|
|
}
|
|
t, err := dao.NewNewsTranslations().GetByMaster(m.ID, lang)
|
|
if err != nil {
|
|
err2.DbErr(err)
|
|
}
|
|
|
|
if t == nil {
|
|
t = new(model.NewsTranslations)
|
|
}
|
|
if trans.Title != "" {
|
|
t.Title = trans.Title
|
|
}
|
|
|
|
if trans.PublishTime != "" {
|
|
t.PublishTime = trans.PublishTime
|
|
}
|
|
|
|
if trans.Content != "" {
|
|
t.Content = trans.Content
|
|
}
|
|
|
|
ms = append(ms, t)
|
|
}
|
|
|
|
err = global.GetDB().Transaction(func(tx *gorm.DB) error {
|
|
if err = dao.NewNews(tx).Update(m); err != nil {
|
|
return err
|
|
}
|
|
|
|
for _, trans := range ms {
|
|
trans.NewsID = m.ID
|
|
if err = dao.NewNewsTranslations(tx).Update(trans); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
if cast.ToInt64(req.CategoryID) > 0 {
|
|
if err = BizCateUpdate(tx, m.ID, cast.ToInt64(req.CategoryID), model.CateTypeNews); err != nil {
|
|
return err
|
|
}
|
|
|
|
}
|
|
|
|
return nil
|
|
})
|
|
|
|
if err != nil {
|
|
err2.DbErr(err)
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
func (r *News) Delete(req request.NewsDelete) {
|
|
m, err := dao.NewNews().Get(cast.ToInt64(req.ID))
|
|
if err != nil {
|
|
err2.DbErr(err)
|
|
}
|
|
|
|
if m == nil {
|
|
err2.NotEsxErr()
|
|
return
|
|
}
|
|
|
|
err = global.GetDB().Transaction(func(tx *gorm.DB) error {
|
|
if err = dao.NewNews(tx).Delete(m.ID); err != nil {
|
|
return err
|
|
}
|
|
|
|
if err = dao.NewNewsTranslations(tx).Delete(m.ID); err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
})
|
|
|
|
if err != nil {
|
|
err2.DbErr(err)
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
func (r *News) List(req request.NewsList) (any, int64) {
|
|
req.Pagination()
|
|
lists, count, err := dao.NewNews().List(req.Lang, req.Title, req.Content, req.PublishTime, cast.ToInt64(req.CategoryID), -1, req.Page, req.Size, req.Sort)
|
|
if err != nil {
|
|
err2.DbErr(err)
|
|
}
|
|
|
|
res := make([]map[string]any, 0)
|
|
for _, list := range lists {
|
|
res = append(res, list.Format())
|
|
}
|
|
|
|
return res, count
|
|
}
|
|
|
|
func (r *News) Get(req request.NewsDelete) any {
|
|
res := make(map[string]any)
|
|
for _, lang := range consts.LangSupport {
|
|
x, err := dao.NewNews().GetLang(cast.ToInt64(req.ID), lang)
|
|
if err != nil {
|
|
err2.DbErr(err)
|
|
}
|
|
|
|
if x == nil {
|
|
res[lang] = make(map[string]any)
|
|
continue
|
|
}
|
|
|
|
res[lang] = x.Format()
|
|
}
|
|
|
|
return res
|
|
}
|