Skip to content

Commit

Permalink
feat: Merge from dev (#7808)
Browse files Browse the repository at this point in the history
  • Loading branch information
zhengkunwang223 authored Feb 6, 2025
1 parent 6744504 commit 46967db
Show file tree
Hide file tree
Showing 25 changed files with 302 additions and 97 deletions.
6 changes: 3 additions & 3 deletions agent/app/api/v2/app.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ func (b *BaseApi) SearchApp(c *gin.Context) {
if err := helper.CheckBindAndValidate(&req, c); err != nil {
return
}
list, err := appService.PageApp(req)
list, err := appService.PageApp(c, req)
if err != nil {
helper.InternalServer(c, err)
return
Expand Down Expand Up @@ -91,7 +91,7 @@ func (b *BaseApi) GetApp(c *gin.Context) {
helper.BadRequest(c, err)
return
}
appDTO, err := appService.GetApp(appKey)
appDTO, err := appService.GetApp(c, appKey)
if err != nil {
helper.InternalServer(c, err)
return
Expand Down Expand Up @@ -186,7 +186,7 @@ func (b *BaseApi) InstallApp(c *gin.Context) {
}

func (b *BaseApi) GetAppTags(c *gin.Context) {
tags, err := appService.GetAppTags()
tags, err := appService.GetAppTags(c)
if err != nil {
helper.InternalServer(c, err)
return
Expand Down
21 changes: 17 additions & 4 deletions agent/app/dto/app.go
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ type AppDefine struct {
}

type LocalAppAppDefine struct {
AppProperty model.App `json:"additionalProperties" yaml:"additionalProperties"`
AppProperty AppProperty `json:"additionalProperties" yaml:"additionalProperties"`
}

type LocalAppParam struct {
Expand All @@ -86,6 +86,7 @@ type AppProperty struct {
Tags []string `json:"tags"`
ShortDescZh string `json:"shortDescZh"`
ShortDescEn string `json:"shortDescEn"`
Description Locale `json:"description"`
Key string `json:"key"`
Required []string `json:"Required"`
CrossVersionUpdate bool `json:"crossVersionUpdate"`
Expand All @@ -109,9 +110,20 @@ type AppConfigVersion struct {
}

type Tag struct {
Key string `json:"key"`
Name string `json:"name"`
Sort int `json:"sort"`
Key string `json:"key"`
Name string `json:"name"`
Sort int `json:"sort"`
Locales Locale `json:"locales"`
}

type Locale struct {
En string `json:"en"`
Ja string `json:"ja"`
Ms string `json:"ms"`
PtBr string `json:"pt-br" yaml:"pt-br"`
Ru string `json:"ru"`
ZhHant string `json:"zh-hant" yaml:"zh-hant"`
Zh string `json:"zh"`
}

type AppForm struct {
Expand All @@ -123,6 +135,7 @@ type AppFormFields struct {
Type string `json:"type"`
LabelZh string `json:"labelZh"`
LabelEn string `json:"labelEn"`
Label Locale `json:"label"`
Required bool `json:"required"`
Default interface{} `json:"default"`
EnvKey string `json:"envKey"`
Expand Down
53 changes: 27 additions & 26 deletions agent/app/dto/response/app.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@ import (
)

type AppRes struct {
Items []*AppDto `json:"items"`
Total int64 `json:"total"`
Items []*AppItem `json:"items"`
Total int64 `json:"total"`
}

type AppUpdateRes struct {
Expand All @@ -23,33 +23,34 @@ type AppUpdateRes struct {

type AppDTO struct {
model.App
Installed bool `json:"installed"`
Versions []string `json:"versions"`
Tags []model.Tag `json:"tags"`
}

type AppDto struct {
Name string `json:"name"`
Key string `json:"key"`
ID uint `json:"id"`
ShortDescZh string `json:"shortDescZh"`
ShortDescEn string `json:"shortDescEn"`
Icon string `json:"icon"`
Type string `json:"type"`
Status string `json:"status"`
Resource string `json:"resource"`
Installed bool `json:"installed"`
Versions []string `json:"versions"`
Limit int `json:"limit"`
Tags []model.Tag `json:"tags"`
Github string `json:"github"`
Website string `json:"website"`
GpuSupport bool `json:"gpuSupport"`
Recommend int `json:"recommend"`
Installed bool `json:"installed"`
Versions []string `json:"versions"`
Tags []TagDTO `json:"tags"`
}

type AppItem struct {
Name string `json:"name"`
Key string `json:"key"`
ID uint `json:"id"`
Description string `json:"description"`
Icon string `json:"icon"`
Type string `json:"type"`
Status string `json:"status"`
Resource string `json:"resource"`
Installed bool `json:"installed"`
Versions []string `json:"versions"`
Limit int `json:"limit"`
Tags []TagDTO `json:"tags"`
Github string `json:"github"`
Website string `json:"website"`
GpuSupport bool `json:"gpuSupport"`
Recommend int `json:"recommend"`
}

type TagDTO struct {
model.Tag
ID uint `json:"id"`
Key string `json:"key"`
Name string `json:"name"`
}

type AppInstalledCheck struct {
Expand Down
23 changes: 23 additions & 0 deletions agent/app/model/app.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package model

import (
"encoding/json"
"github.com/gin-gonic/gin"
"path/filepath"
"strings"

Expand Down Expand Up @@ -48,3 +50,24 @@ func (i *App) GetAppResourcePath() string {
}
return filepath.Join(global.Dir.RemoteAppResourceDir, i.Key)
}

func getLang(c *gin.Context) string {
lang := c.GetHeader("Accept-Language")
if lang == "" {
lang = "en"
}
return lang
}

func (i *App) GetDescription(ctx *gin.Context) string {
var translations = make(map[string]string)
_ = json.Unmarshal([]byte(i.Description), &translations)
lang := strings.ToLower(getLang(ctx))
if desc, ok := translations[lang]; ok && desc != "" {
return desc
}
if lang == "zh" {
return i.ShortDescZh
}
return i.ShortDescEn
}
7 changes: 4 additions & 3 deletions agent/app/model/tag.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@ package model

type Tag struct {
BaseModel
Key string `json:"key" gorm:"not null"`
Name string `json:"name" gorm:"not null"`
Sort int `json:"sort" gorm:"not null;default:1"`
Key string `json:"key" gorm:"not null"`
Name string `json:"name" gorm:"not null"`
Sort int `json:"sort" gorm:"not null;default:1"`
Translations string `json:"translations"`
}
6 changes: 6 additions & 0 deletions agent/app/repo/common.go
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,12 @@ func WithByName(name string) DBOption {
}
}

func WithByLowerName(name string) DBOption {
return func(g *gorm.DB) *gorm.DB {
return g.Where("LOWER(name) = LOWER(?)", name)
}
}

func WithByLikeName(name string) DBOption {
return func(g *gorm.DB) *gorm.DB {
if len(name) == 0 {
Expand Down
53 changes: 35 additions & 18 deletions agent/app/service/app.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import (
"encoding/base64"
"encoding/json"
"fmt"
"github.com/gin-gonic/gin"
"net/http"
"os"
"path"
Expand Down Expand Up @@ -35,9 +36,9 @@ type AppService struct {
}

type IAppService interface {
PageApp(req request.AppSearch) (interface{}, error)
GetAppTags() ([]response.TagDTO, error)
GetApp(key string) (*response.AppDTO, error)
PageApp(ctx *gin.Context, req request.AppSearch) (interface{}, error)
GetAppTags(ctx *gin.Context) ([]response.TagDTO, error)
GetApp(ctx *gin.Context, key string) (*response.AppDTO, error)
GetAppDetail(appId uint, version, appType string) (response.AppDetailDTO, error)
Install(req request.AppInstallCreate) (*model.AppInstall, error)
SyncAppListFromRemote(taskID string) error
Expand All @@ -54,7 +55,7 @@ func NewIAppService() IAppService {
return &AppService{}
}

func (a AppService) PageApp(req request.AppSearch) (interface{}, error) {
func (a AppService) PageApp(ctx *gin.Context, req request.AppSearch) (interface{}, error) {
var opts []repo.DBOption
opts = append(opts, appRepo.OrderByRecommend())
if req.Name != "" {
Expand Down Expand Up @@ -102,31 +103,31 @@ func (a AppService) PageApp(req request.AppSearch) (interface{}, error) {
if err != nil {
return nil, err
}
var appDTOs []*response.AppDto
var appDTOs []*response.AppItem
info := &dto.SettingInfo{}
if req.Type == "php" {
info, _ = NewISettingService().GetSettingInfo()
}
lang := strings.ToLower(common.GetLang(ctx))
for _, ap := range apps {
if req.Type == "php" {
if ap.RequiredPanelVersion == 0 || !common.CompareAppVersion(fmt.Sprintf("%f", ap.RequiredPanelVersion), info.SystemVersion) {
continue
}
}
appDTO := &response.AppDto{
appDTO := &response.AppItem{
ID: ap.ID,
Name: ap.Name,
Key: ap.Key,
Type: ap.Type,
Icon: ap.Icon,
ShortDescZh: ap.ShortDescZh,
ShortDescEn: ap.ShortDescEn,
Resource: ap.Resource,
Limit: ap.Limit,
Website: ap.Website,
Github: ap.Github,
GpuSupport: ap.GpuSupport,
Recommend: ap.Recommend,
Description: ap.GetDescription(ctx),
}
appDTOs = append(appDTOs, appDTO)
appTags, err := appTagRepo.GetByAppId(ap.ID)
Expand All @@ -137,7 +138,7 @@ func (a AppService) PageApp(req request.AppSearch) (interface{}, error) {
for _, at := range appTags {
tagIds = append(tagIds, at.TagId)
}
tags, err := tagRepo.GetByIds(tagIds)
tags, err := getAppTags(ap.ID, lang)
if err != nil {
continue
}
Expand All @@ -151,21 +152,29 @@ func (a AppService) PageApp(req request.AppSearch) (interface{}, error) {
return res, nil
}

func (a AppService) GetAppTags() ([]response.TagDTO, error) {
func (a AppService) GetAppTags(ctx *gin.Context) ([]response.TagDTO, error) {
tags, err := tagRepo.All()
if err != nil {
return nil, err
}
var res []response.TagDTO
lang := strings.ToLower(common.GetLang(ctx))
for _, tag := range tags {
res = append(res, response.TagDTO{
Tag: tag,
})
tagDTO := response.TagDTO{
ID: tag.ID,
Key: tag.Key,
}
var translations = make(map[string]string)
_ = json.Unmarshal([]byte(tag.Translations), &translations)
if name, ok := translations[lang]; ok {
tagDTO.Name = name
}
res = append(res, tagDTO)
}
return res, nil
}

func (a AppService) GetApp(key string) (*response.AppDTO, error) {
func (a AppService) GetApp(ctx *gin.Context, key string) (*response.AppDTO, error) {
var appDTO response.AppDTO
if key == "postgres" {
key = "postgresql"
Expand All @@ -175,6 +184,7 @@ func (a AppService) GetApp(key string) (*response.AppDTO, error) {
return nil, err
}
appDTO.App = app
appDTO.App.Description = app.GetDescription(ctx)
details, err := appDetailRepo.GetBy(appDetailRepo.WithAppId(app.ID))
if err != nil {
return nil, err
Expand All @@ -192,6 +202,11 @@ func (a AppService) GetApp(key string) (*response.AppDTO, error) {
if hasLatest {
appDTO.Versions = append([]string{"latest"}, appDTO.Versions...)
}
tags, err := getAppTags(app.ID, strings.ToLower(common.GetLang(ctx)))
if err != nil {
return nil, err
}
appDTO.Tags = tags
return &appDTO, nil
}

Expand Down Expand Up @@ -334,7 +349,7 @@ func (a AppService) Install(req request.AppInstallCreate) (appInstall *model.App
err = buserr.WithDetail("Err1PanelNetworkFailed", err.Error(), nil)
return
}
if list, _ := appInstallRepo.ListBy(repo.WithByName(req.Name)); len(list) > 0 {
if list, _ := appInstallRepo.ListBy(repo.WithByLowerName(req.Name)); len(list) > 0 {
err = buserr.New("ErrAppNameExist")
return
}
Expand Down Expand Up @@ -928,10 +943,12 @@ func (a AppService) SyncAppListFromRemote(taskID string) (err error) {
oldAppIds []uint
)
for _, tag := range list.Extra.Tags {
translations, _ := json.Marshal(tag.Locales)
tags = append(tags, &model.Tag{
Key: tag.Key,
Name: tag.Name,
Sort: tag.Sort,
Name: tag.Name,
Translations: string(translations),
Sort: tag.Sort,
Key: tag.Key,
})
}
deleteCustomApp()
Expand Down
Loading

0 comments on commit 46967db

Please sign in to comment.