package useCases import ( "RenewCMS/internal/domain/contenttype" "RenewCMS/internal/domain/entry" "time" ) type CreateEntryUseCase struct { contentTypes contenttype.Repository entries entry.Repository now func() time.Time } type CreateEntryCommand struct { ContentTypeKey string Data map[string]any UserID uint32 } func NewCreateEntryUseCase(contentTypes contenttype.Repository, entries entry.Repository, now func() time.Time) *CreateEntryUseCase { return &CreateEntryUseCase{contentTypes, entries, now} } func (u *CreateEntryUseCase) Create(command CreateEntryCommand) (TypedEntry, error) { owner, err := u.contentTypes.GetByKey(command.ContentTypeKey) if err != nil { return TypedEntry{}, err } data := entry.ApplyDefaults(owner.Fields, command.Data) if err := entry.Validate(owner.Fields, data); err != nil { return TypedEntry{}, err } if err := ensureUnique(u.entries, owner, data, 0); err != nil { return TypedEntry{}, err } created := u.now() stored, err := u.entries.Create(entry.Entry{ ContentTypeID: owner.ID, Data: data, CreatedBy: command.UserID, UpdatedBy: command.UserID, CreatedAt: created, UpdatedAt: created, }) if err != nil { return TypedEntry{}, err } return typedEntry(owner, stored), nil }