51 lines
1.3 KiB
Go
51 lines
1.3 KiB
Go
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
|
|
}
|