pub/internal/entry/usecase/entry_ucase.go

101 lines
2.4 KiB
Go

package usecase
import (
"context"
"fmt"
"net/url"
"time"
"source.toby3d.me/toby3d/pub/internal/domain"
"source.toby3d.me/toby3d/pub/internal/entry"
)
type entryUseCase struct {
entries entry.Repository
}
// Create implements entry.UseCase.
func (ucase *entryUseCase) Create(ctx context.Context, e domain.Entry) (*domain.Entry, error) {
if err := ucase.entries.Create(ctx, e.URL.RequestURI(), e); err != nil {
return nil, fmt.Errorf("cannot create entry: %w", err)
}
result, err := ucase.entries.Get(ctx, e.URL.RequestURI())
if err != nil {
return nil, fmt.Errorf("cannot source created entry: %w", err)
}
return result, nil
}
// Delete implements entry.UseCase.
func (ucase *entryUseCase) Delete(ctx context.Context, u *url.URL) (bool, error) {
if _, err := ucase.entries.Update(ctx, u.RequestURI(), func(_ context.Context, e *domain.Entry) (
*domain.Entry, error,
) {
now := time.Now().UTC()
e.DeletedAt = now
e.UpdatedAt = now
return nil, nil
}); err != nil {
return false, fmt.Errorf("cannot undelete entry: %w", err)
}
return true, nil
}
// Source implements entry.UseCase.
func (ucase *entryUseCase) Source(ctx context.Context, u *url.URL) (*domain.Entry, error) {
result, err := ucase.entries.Get(ctx, u.RequestURI())
if err != nil {
return nil, fmt.Errorf("cannot source entry: %w", err)
}
return result, nil
}
// Undelete implements entry.UseCase.
func (ucase *entryUseCase) Undelete(ctx context.Context, u *url.URL) (*domain.Entry, error) {
result, err := ucase.entries.Update(ctx, u.RequestURI(), func(_ context.Context, e *domain.Entry) (
*domain.Entry, error,
) {
e.DeletedAt = time.Time{}
e.UpdatedAt = time.Now().UTC()
return nil, nil
})
if err != nil {
return nil, fmt.Errorf("cannot undelete entry: %w", err)
}
return result, nil
}
// Update implements entry.UseCase.
func (ucase *entryUseCase) Update(ctx context.Context, u *url.URL, opts entry.UpdateOptions) (*domain.Entry, error) {
result, err := ucase.entries.Update(ctx, u.RequestURI(), func(_ context.Context, e *domain.Entry) (
*domain.Entry, error,
) {
e.DeletedAt = time.Time{}
e.UpdatedAt = time.Now().UTC()
// TODO(toby3d): add
// TODO(toby3d): update
// TODO(toby3d): delete
return e, nil
})
if err != nil {
return nil, fmt.Errorf("cannot update entry: %w", err)
}
return result, nil
}
func NewEntryUseCase(entries entry.Repository) entry.UseCase {
return &entryUseCase{
entries: entries,
}
}