96 lines
2.7 KiB
Go
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
|
|
}
|