package service import ( "errors" "strings" "wx_service/internal/marketing/model" "wx_service/internal/marketing/repository" ) var ( ErrTemplateTitleRequired = errors.New("模板名称不能为空") ErrTemplateTitleTooLong = errors.New("模板名称不能超过100个字符") ErrTemplateImageRequired = errors.New("模板图片不能为空") ErrTemplateCategoryRequired = errors.New("请选择所属分类") ) type TemplateService struct { repo *repository.TemplateRepository } func NewTemplateService(repo *repository.TemplateRepository) *TemplateService { return &TemplateService{repo: repo} } type TemplateRequest struct { CategoryID uint `json:"category_id"` Title string `json:"title"` ImageURL string `json:"image_url"` ThumbnailURL string `json:"thumbnail_url"` Width int `json:"width"` Height int `json:"height"` SortOrder int `json:"sort_order"` Status *int `json:"status"` } type TemplateListResponse struct { Templates []model.MarketingTemplate `json:"templates"` Total int64 `json:"total"` Page int `json:"page"` PageSize int `json:"page_size"` } func (s *TemplateService) Create(req TemplateRequest) (*model.MarketingTemplate, error) { if err := validateTemplateRequest(req); err != nil { return nil, err } status := 1 if req.Status != nil { status = *req.Status } tpl := &model.MarketingTemplate{ CategoryID: req.CategoryID, Title: strings.TrimSpace(req.Title), ImageURL: strings.TrimSpace(req.ImageURL), ThumbnailURL: strings.TrimSpace(req.ThumbnailURL), Width: req.Width, Height: req.Height, SortOrder: req.SortOrder, Status: status, } if err := s.repo.Create(tpl); err != nil { return nil, err } return tpl, nil } func (s *TemplateService) Update(id uint, req TemplateRequest) (*model.MarketingTemplate, error) { if err := validateTemplateRequest(req); err != nil { return nil, err } tpl, err := s.repo.FindByID(id) if err != nil { return nil, err } tpl.CategoryID = req.CategoryID tpl.Title = strings.TrimSpace(req.Title) tpl.ImageURL = strings.TrimSpace(req.ImageURL) tpl.ThumbnailURL = strings.TrimSpace(req.ThumbnailURL) tpl.Width = req.Width tpl.Height = req.Height tpl.SortOrder = req.SortOrder if req.Status != nil { tpl.Status = *req.Status } if err := s.repo.Update(tpl); err != nil { return nil, err } return tpl, nil } func (s *TemplateService) Delete(id uint) error { return s.repo.Delete(id) } func (s *TemplateService) GetByID(id uint) (*model.MarketingTemplate, error) { return s.repo.FindByID(id) } func (s *TemplateService) List(params repository.TemplateListParams) (*TemplateListResponse, error) { templates, total, err := s.repo.FindList(params) if err != nil { return nil, err } return &TemplateListResponse{ Templates: templates, Total: total, Page: params.Page, PageSize: params.PageSize, }, nil } func validateTemplateRequest(req TemplateRequest) error { title := strings.TrimSpace(req.Title) if title == "" { return ErrTemplateTitleRequired } if len(title) > 100 { return ErrTemplateTitleTooLong } if strings.TrimSpace(req.ImageURL) == "" { return ErrTemplateImageRequired } if req.CategoryID == 0 { return ErrTemplateCategoryRequired } return nil }