63 lines
1.7 KiB
Go
63 lines
1.7 KiB
Go
package useCases
|
|
|
|
import (
|
|
"RenewCMS/internal/domain/contenttype"
|
|
"RenewCMS/internal/domain/entry"
|
|
"RenewCMS/internal/domain/image"
|
|
"errors"
|
|
)
|
|
|
|
type TypedEntry struct {
|
|
entry.Entry
|
|
ContentTypeKey string
|
|
Media map[string]EntryMedia
|
|
}
|
|
|
|
func typedEntry(owner contenttype.ContentType, record entry.Entry, resolver *mediaResolver) (TypedEntry, error) {
|
|
record.Data = entry.Project(owner.Fields, record.Data)
|
|
media, err := resolver.resolve(owner, record)
|
|
if err != nil {
|
|
return TypedEntry{}, err
|
|
}
|
|
return TypedEntry{Entry: record, ContentTypeKey: owner.Key, Media: media}, nil
|
|
}
|
|
|
|
func ensureMediaExists(images image.Repository, owner contenttype.ContentType, data map[string]any, stored map[string]any) error {
|
|
storedIDs := entry.MediaIDs(owner.Fields, stored)
|
|
for _, ref := range contenttype.MediaRefs(owner.Fields, data) {
|
|
unchanged := stored != nil && storedIDs[ref.Field.Key] == ref.ID
|
|
if unchanged && !ref.Field.Required {
|
|
continue
|
|
}
|
|
exists, err := imageExists(images, ref.ID)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if !exists {
|
|
return entry.MissingMedia(ref.Field, unchanged)
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func imageExists(images image.Repository, id uint32) (bool, error) {
|
|
_, err := images.Get(id)
|
|
if errors.Is(err, image.ErrImageNotFound) {
|
|
return false, nil
|
|
}
|
|
return err == nil, err
|
|
}
|
|
|
|
func ensureUnique(entries entry.Repository, owner contenttype.ContentType, data map[string]any, excludeID uint32) error {
|
|
for _, candidate := range entry.UniqueValues(owner.Fields, data) {
|
|
taken, err := entries.FindByFieldValue(owner.ID, candidate.Key, candidate.Value, excludeID)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if len(taken) > 0 {
|
|
return entry.UniqueViolation(candidate.Key)
|
|
}
|
|
}
|
|
return nil
|
|
}
|