package useCases import ( "RenewCMS/internal/domain/article" "RenewCMS/internal/domain/audit" "RenewCMS/internal/domain/site" "context" ) type CreateArticleUseCase struct { articleRepository article.Repository bodyRenderer article.BodyRenderer recorder audit.Recorder sites site.Repository } type CreateArticleCommand struct { Title string Body string Format article.BodyFormat } func NewCreateArticleUseCase(articleRepository article.Repository, bodyRenderer article.BodyRenderer, recorder audit.Recorder, sites site.Repository) *CreateArticleUseCase { return &CreateArticleUseCase{articleRepository: articleRepository, bodyRenderer: bodyRenderer, recorder: recorder, sites: sites} } func (g *CreateArticleUseCase) defaultSiteID() (uint32, error) { defaultSite, err := g.sites.GetDefault() if err != nil { return 0, err } return defaultSite.ID, nil } func (g *CreateArticleUseCase) CreateArticle(ctx context.Context, createArticle CreateArticleCommand) (article.Article, error) { event := audit.NewEvent(audit.ActionArticleCreate, audit.CategoryArticles) if err := article.ValidateTitle(createArticle.Title); err != nil { recordFailure(ctx, g.recorder, event, err) return article.Article{}, err } siteID, err := g.defaultSiteID() if err != nil { recordFailure(ctx, g.recorder, event, err) return article.Article{}, err } created, err := g.articleRepository.Create(article.Article{ Title: createArticle.Title, Body: createArticle.Body, IsOnline: false, SiteID: siteID, }) if err != nil { recordFailure(ctx, g.recorder, event, err) return article.Article{}, err } event.Target = articleTarget(created) g.recorder.Record(ctx, event) return renderArticle(g.bodyRenderer, created, createArticle.Format) } func articleTarget(a article.Article) audit.Target { return audit.NewTarget(audit.TargetArticle, a.ID, a.Title) }