Files
cmautobuy/admin/service/syb_allowed_shop.go
T

81 lines
2.3 KiB
Go
Raw Normal View History

package service
import (
"database/sql"
"errors"
"fmt"
"strings"
"time"
"cmautobuy/admin/model"
"cmautobuy/admin/repository"
)
const maxSybShopNameLength = 500
func ListSybAllowedShops(db *sql.DB, actor *model.User) ([]model.SybAllowedShop, error) {
if actor == nil || !actor.IsAdmin() {
return nil, ErrAdminRequired
}
return repository.ListSybAllowedShops(db)
}
func CountEnabledSybAllowedShops(db *sql.DB) (int, error) {
names, err := repository.ListEnabledSybShopNames(db)
return len(names), err
}
func EnsureEnabledSybAllowedShops(db *sql.DB) error {
count, err := CountEnabledSybAllowedShops(db)
if err != nil {
return err
}
if count == 0 {
return &validationError{field: "shop_name", message: "没有启用的顺运宝同步店铺,请先由管理员配置并启用至少一个店铺"}
}
return nil
}
func CreateSybAllowedShop(db *sql.DB, actor *model.User, rawName string, now time.Time) error {
if actor == nil || !actor.IsAdmin() {
return ErrAdminRequired
}
name := strings.TrimSpace(rawName)
if name == "" {
return &validationError{field: "shop_name", message: "店铺名称不能为空"}
}
if len([]rune(name)) > maxSybShopNameLength {
return &validationError{field: "shop_name", message: "店铺名称最多 500 个字符"}
}
id, err := randomID("SHOP-", 16)
if err != nil {
return fmt.Errorf("生成店铺编号失败: %w", err)
}
at := now.UTC().Format(model.TimeLayout)
err = repository.InsertSybAllowedShop(db, model.SybAllowedShop{
ShopID: id, ShopName: name, NormalizedName: name, Enabled: true,
CreatedByUserID: actor.UserID, CreatedAt: at, UpdatedAt: at,
})
if errors.Is(err, repository.ErrSybAllowedShopExists) {
return &validationError{field: "shop_name", message: "该店铺已经在允许列表中,可直接重新启用"}
}
return err
}
func SetSybAllowedShopEnabled(db *sql.DB, actor *model.User, shopID string, enabled bool, now time.Time) error {
if actor == nil || !actor.IsAdmin() {
return ErrAdminRequired
}
if strings.TrimSpace(shopID) == "" {
return &validationError{field: "shop_id", message: "店铺编号不能为空"}
}
found, err := repository.SetSybAllowedShopEnabled(db, shopID, enabled, now.UTC().Format(model.TimeLayout))
if err != nil {
return err
}
if !found {
return &validationError{field: "shop_id", message: "店铺不存在,请刷新页面后重试"}
}
return nil
}