package author import ( "context" "tercul/internal/domain" "github.com/google/uuid" ) // AuthorCommands contains the command handlers for the author aggregate. type AuthorCommands struct { repo domain.AuthorRepository } // NewAuthorCommands creates a new AuthorCommands handler. func NewAuthorCommands(repo domain.AuthorRepository) *AuthorCommands { return &AuthorCommands{repo: repo} } // CreateAuthorInput represents the input for creating a new author. type CreateAuthorInput struct { Name string } // CreateAuthor creates a new author. func (c *AuthorCommands) CreateAuthor(ctx context.Context, input CreateAuthorInput) (*domain.Author, error) { author := &domain.Author{ Name: input.Name, } err := c.repo.Create(ctx, author) if err != nil { return nil, err } return author, nil } // UpdateAuthorInput represents the input for updating an existing author. type UpdateAuthorInput struct { ID uuid.UUID Name string } // UpdateAuthor updates an existing author. func (c *AuthorCommands) UpdateAuthor(ctx context.Context, input UpdateAuthorInput) (*domain.Author, error) { author, err := c.repo.GetByID(ctx, input.ID) if err != nil { return nil, err } author.Name = input.Name err = c.repo.Update(ctx, author) if err != nil { return nil, err } return author, nil } // DeleteAuthor deletes an author by ID. func (c *AuthorCommands) DeleteAuthor(ctx context.Context, id uuid.UUID) error { return c.repo.Delete(ctx, id) }