tercul-backend/internal/app/monetization/commands.go
google-labs-jules[bot] 49e2bdd9ac feat: Refactor localization, auth, copyright, and monetization domains
This change introduces a major architectural refactoring of the application, with a focus on improving testability, decoupling, and observability.

The following domains have been successfully refactored:
- `localization`: Wrote a full suite of unit tests and added logging.
- `auth`: Introduced a `JWTManager` interface, wrote comprehensive unit tests, and added logging.
- `copyright`: Separated integration tests, wrote a full suite of unit tests, and added logging.
- `monetization`: Wrote a full suite of unit tests and added logging.
- `search`: Refactored the Weaviate client usage by creating a wrapper to improve testability, and achieved 100% test coverage.

For each of these domains, 100% test coverage has been achieved for the refactored code.

The refactoring of the `work` domain is currently in progress. Unit tests have been written for the commands and queries, but there is a persistent build issue with the query tests that needs to be resolved. The error indicates that the query methods are undefined, despite appearing to be correctly defined and called.
2025-09-06 15:15:10 +00:00

101 lines
4.7 KiB
Go

package monetization
import (
"context"
"errors"
"tercul/internal/domain"
"tercul/internal/platform/log"
)
// MonetizationCommands contains the command handlers for monetization.
type MonetizationCommands struct {
repo domain.MonetizationRepository
}
// NewMonetizationCommands creates a new MonetizationCommands handler.
func NewMonetizationCommands(repo domain.MonetizationRepository) *MonetizationCommands {
return &MonetizationCommands{repo: repo}
}
// AddMonetizationToWork adds a monetization to a work.
func (c *MonetizationCommands) AddMonetizationToWork(ctx context.Context, workID uint, monetizationID uint) error {
if workID == 0 || monetizationID == 0 {
return errors.New("invalid work ID or monetization ID")
}
log.LogDebug("Adding monetization to work", log.F("work_id", workID), log.F("monetization_id", monetizationID))
return c.repo.AddMonetizationToWork(ctx, workID, monetizationID)
}
// RemoveMonetizationFromWork removes a monetization from a work.
func (c *MonetizationCommands) RemoveMonetizationFromWork(ctx context.Context, workID uint, monetizationID uint) error {
if workID == 0 || monetizationID == 0 {
return errors.New("invalid work ID or monetization ID")
}
log.LogDebug("Removing monetization from work", log.F("work_id", workID), log.F("monetization_id", monetizationID))
return c.repo.RemoveMonetizationFromWork(ctx, workID, monetizationID)
}
func (c *MonetizationCommands) AddMonetizationToAuthor(ctx context.Context, authorID uint, monetizationID uint) error {
if authorID == 0 || monetizationID == 0 {
return errors.New("invalid author ID or monetization ID")
}
log.LogDebug("Adding monetization to author", log.F("author_id", authorID), log.F("monetization_id", monetizationID))
return c.repo.AddMonetizationToAuthor(ctx, authorID, monetizationID)
}
func (c *MonetizationCommands) RemoveMonetizationFromAuthor(ctx context.Context, authorID uint, monetizationID uint) error {
if authorID == 0 || monetizationID == 0 {
return errors.New("invalid author ID or monetization ID")
}
log.LogDebug("Removing monetization from author", log.F("author_id", authorID), log.F("monetization_id", monetizationID))
return c.repo.RemoveMonetizationFromAuthor(ctx, authorID, monetizationID)
}
func (c *MonetizationCommands) AddMonetizationToBook(ctx context.Context, bookID uint, monetizationID uint) error {
if bookID == 0 || monetizationID == 0 {
return errors.New("invalid book ID or monetization ID")
}
log.LogDebug("Adding monetization to book", log.F("book_id", bookID), log.F("monetization_id", monetizationID))
return c.repo.AddMonetizationToBook(ctx, bookID, monetizationID)
}
func (c *MonetizationCommands) RemoveMonetizationFromBook(ctx context.Context, bookID uint, monetizationID uint) error {
if bookID == 0 || monetizationID == 0 {
return errors.New("invalid book ID or monetization ID")
}
log.LogDebug("Removing monetization from book", log.F("book_id", bookID), log.F("monetization_id", monetizationID))
return c.repo.RemoveMonetizationFromBook(ctx, bookID, monetizationID)
}
func (c *MonetizationCommands) AddMonetizationToPublisher(ctx context.Context, publisherID uint, monetizationID uint) error {
if publisherID == 0 || monetizationID == 0 {
return errors.New("invalid publisher ID or monetization ID")
}
log.LogDebug("Adding monetization to publisher", log.F("publisher_id", publisherID), log.F("monetization_id", monetizationID))
return c.repo.AddMonetizationToPublisher(ctx, publisherID, monetizationID)
}
func (c *MonetizationCommands) RemoveMonetizationFromPublisher(ctx context.Context, publisherID uint, monetizationID uint) error {
if publisherID == 0 || monetizationID == 0 {
return errors.New("invalid publisher ID or monetization ID")
}
log.LogDebug("Removing monetization from publisher", log.F("publisher_id", publisherID), log.F("monetization_id", monetizationID))
return c.repo.RemoveMonetizationFromPublisher(ctx, publisherID, monetizationID)
}
func (c *MonetizationCommands) AddMonetizationToSource(ctx context.Context, sourceID uint, monetizationID uint) error {
if sourceID == 0 || monetizationID == 0 {
return errors.New("invalid source ID or monetization ID")
}
log.LogDebug("Adding monetization to source", log.F("source_id", sourceID), log.F("monetization_id", monetizationID))
return c.repo.AddMonetizationToSource(ctx, sourceID, monetizationID)
}
func (c *MonetizationCommands) RemoveMonetizationFromSource(ctx context.Context, sourceID uint, monetizationID uint) error {
if sourceID == 0 || monetizationID == 0 {
return errors.New("invalid source ID or monetization ID")
}
log.LogDebug("Removing monetization from source", log.F("source_id", sourceID), log.F("monetization_id", monetizationID))
return c.repo.RemoveMonetizationFromSource(ctx, sourceID, monetizationID)
}