Files
1Panel/agent/app/service/php_extensions.go
Yuki Guoandssongliu d658395188 feat(sync): sync php extended template (#14299)
* feat(sync): sync php extended template

* fix(i18n): complete resource sync translations

---------

Co-authored-by: ssongliu <sloooop1x@gmail.com>
2026-11-05 15:06:12 +08:00

139 lines
3.9 KiB
Go

package service
import (
"errors"
"sync"
"github.com/1Panel-dev/1Panel/agent/app/dto"
"github.com/1Panel-dev/1Panel/agent/app/dto/request"
"github.com/1Panel-dev/1Panel/agent/app/dto/response"
"github.com/1Panel-dev/1Panel/agent/app/model"
"github.com/1Panel-dev/1Panel/agent/app/repo"
"github.com/1Panel-dev/1Panel/agent/buserr"
"github.com/1Panel-dev/1Panel/agent/global"
"github.com/1Panel-dev/1Panel/agent/utils/xpack"
"gorm.io/gorm"
)
var phpExtensionsMu sync.Mutex
type PHPExtensionsService struct {
}
type IPHPExtensionsService interface {
Page(req request.PHPExtensionsSearch) (int64, []response.PHPExtensionsDTO, error)
List() ([]response.PHPExtensionsDTO, error)
Create(req request.PHPExtensionsCreate) error
Update(req request.PHPExtensionsUpdate) error
Delete(req request.PHPExtensionsDelete) error
Get(id uint) (model.PHPExtensions, error)
Import(req request.PHPExtensionsCreate) (string, error)
Push(req dto.PHPExtensionsPush) error
}
func NewIPHPExtensionsService() IPHPExtensionsService {
return &PHPExtensionsService{}
}
func (p PHPExtensionsService) Page(req request.PHPExtensionsSearch) (int64, []response.PHPExtensionsDTO, error) {
var (
total int64
extensions []model.PHPExtensions
err error
result []response.PHPExtensionsDTO
)
total, extensions, err = phpExtensionsRepo.Page(req.Page, req.PageSize, repo.WithByLikeName(req.Name))
if err != nil {
return 0, nil, err
}
for _, extension := range extensions {
result = append(result, response.PHPExtensionsDTO{
PHPExtensions: extension,
})
}
return total, result, nil
}
func (p PHPExtensionsService) List() ([]response.PHPExtensionsDTO, error) {
var (
extensions []model.PHPExtensions
err error
result []response.PHPExtensionsDTO
)
extensions, err = phpExtensionsRepo.List()
if err != nil {
return nil, err
}
for _, extension := range extensions {
result = append(result, response.PHPExtensionsDTO{
PHPExtensions: extension,
})
}
return result, nil
}
func (p PHPExtensionsService) Create(req request.PHPExtensionsCreate) error {
phpExtensionsMu.Lock()
defer phpExtensionsMu.Unlock()
exist, _ := phpExtensionsRepo.GetFirst(repo.WithByName(req.Name))
if exist.ID > 0 {
return buserr.New("ErrNameIsExist")
}
extension := model.PHPExtensions{
Name: req.Name,
Extensions: req.Extensions,
}
return phpExtensionsRepo.Create(&extension)
}
func (p PHPExtensionsService) Update(req request.PHPExtensionsUpdate) error {
phpExtensionsMu.Lock()
defer phpExtensionsMu.Unlock()
exist, err := phpExtensionsRepo.GetFirst(repo.WithByID(req.ID))
if err != nil {
return err
}
exist.Extensions = req.Extensions
return phpExtensionsRepo.Save(&exist)
}
func (p PHPExtensionsService) Delete(req request.PHPExtensionsDelete) error {
phpExtensionsMu.Lock()
defer phpExtensionsMu.Unlock()
return phpExtensionsRepo.DeleteBy(repo.WithByID(req.ID))
}
func (p PHPExtensionsService) Get(id uint) (model.PHPExtensions, error) {
return phpExtensionsRepo.GetFirst(repo.WithByID(id))
}
func (p PHPExtensionsService) Import(req request.PHPExtensionsCreate) (string, error) {
phpExtensionsMu.Lock()
defer phpExtensionsMu.Unlock()
existing, err := phpExtensionsRepo.GetFirst(repo.WithByName(req.Name))
if err == nil {
if existing.Extensions == req.Extensions {
return "skipped", nil
}
return "", buserr.New("ErrPHPExtensionsConflict")
}
if !errors.Is(err, gorm.ErrRecordNotFound) {
return "", err
}
item := model.PHPExtensions{Name: req.Name, Extensions: req.Extensions}
if err := phpExtensionsRepo.Create(&item); err != nil {
return "", err
}
return "created", nil
}
func (p PHPExtensionsService) Push(req dto.PHPExtensionsPush) error {
if !global.IsMaster {
return errors.New("PHP extension template sync must be submitted to the master node")
}
if !xpack.MultiNodeProvider.IsXpack() {
return buserr.New("ErrXpackNotFound")
}
return xpack.MultiNodeProvider.PushPHPExtensionsToNode(req)
}