Files
RenewCMS/internal/infrastructure/useCases/CreateSite.go
T

96 lines
2.7 KiB
Go

package useCases
import (
"RenewCMS/internal/domain/audit"
"RenewCMS/internal/domain/image"
"RenewCMS/internal/domain/site"
"context"
)
type CreateSiteUseCase struct {
siteRepository site.Repository
imageRepository image.Repository
recorder audit.Recorder
}
type CreateSiteCommand struct {
Name string
Key string
BaseURL string
DefaultRobots string
Locale *string
DefaultSocialImageID *uint32
IsDefault bool
SiteName string
TitleTemplate *string
DefaultDescription string
}
func NewCreateSiteUseCase(siteRepository site.Repository, imageRepository image.Repository, recorder audit.Recorder) *CreateSiteUseCase {
return &CreateSiteUseCase{siteRepository, imageRepository, recorder}
}
func (u *CreateSiteUseCase) Create(ctx context.Context, command CreateSiteCommand) (site.Site, error) {
event := audit.NewEvent(audit.ActionSiteCreate, audit.CategorySites)
event.Target = audit.Target{Type: audit.TargetSite, Name: command.Name}
created, err := u.create(command)
if err != nil {
recordFailure(ctx, u.recorder, event, err)
return site.Site{}, err
}
event.Target = siteTarget(created)
u.recorder.Record(ctx, event)
return created, nil
}
func (u *CreateSiteUseCase) create(command CreateSiteCommand) (site.Site, error) {
baseURL, err := site.NormalizeBaseURL(command.BaseURL)
if err != nil {
return site.Site{}, err
}
locale, err := site.NormalizeLocale(command.Locale)
if err != nil {
return site.Site{}, err
}
if err := ensureImageExists(u.imageRepository, command.DefaultSocialImageID); err != nil {
return site.Site{}, err
}
titleTemplate, err := resolveTitleTemplate(command.TitleTemplate)
if err != nil {
return site.Site{}, err
}
taken, err := isKeyTaken(u.siteRepository, command.Key)
if err != nil {
return site.Site{}, err
}
if taken {
return site.Site{}, site.ErrSiteKeyTaken
}
robots := command.DefaultRobots
if robots == "" {
robots = site.RobotsIndex
}
return u.siteRepository.Create(site.Site{
Name: command.Name,
Key: command.Key,
BaseURL: baseURL,
DefaultSocialImageID: command.DefaultSocialImageID,
DefaultRobots: robots,
Locale: locale,
IsDefault: command.IsDefault,
SiteName: command.SiteName,
TitleTemplate: titleTemplate,
DefaultDescription: command.DefaultDescription,
})
}
func resolveTitleTemplate(requested *string) (string, error) {
if requested == nil {
return site.DefaultTitleTemplate, nil
}
if err := site.ValidateTitleTemplate(*requested); err != nil {
return "", err
}
return *requested, nil
}