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 }