# Work Service This package manages the core `Work` domain entity in the Tercul platform. It provides the primary application service for all operations related to literary works, including creating, updating, deleting, and retrieving them. ## Architecture Overview The work service is designed following the Command Query Responsibility Segregation (CQRS) pattern. This separation makes the service more maintainable, scalable, and easier to understand. ### Key Components - **`service.go`**: The main entry point for the work service. It composes the `WorkCommands` and `WorkQueries` into a single `Service` struct, which is then used by the rest of the application (e.g., in the GraphQL resolvers). - **`commands.go`**: Contains all the command handlers for mutating `Work` entities. This includes: - `CreateWork`: Creates a new work. - `UpdateWork`: Updates an existing work. - `DeleteWork`: Deletes a work. - `AnalyzeWork`: Triggers a comprehensive linguistic analysis of a work and its translations. - `MergeWork`: Merges two works into one, consolidating their translations and statistics. - **`queries.go`**: Contains all the query handlers for retrieving `Work` data. These handlers return specialized `WorkDTO` read models to ensure a clean separation between the domain and the API layer. - **`dto.go`**: Defines the `WorkDTO` struct, which is the read model used for all query responses. - **`interfaces.go` (external)**: The service depends on the `WorkRepository` interface defined in `internal/domain/interfaces.go` for data persistence. ## Usage The `work.Service` is intended to be injected into the application's top-level layers, such as the GraphQL resolvers, which then call the appropriate command or query handlers. ### Example: Creating a Work ```go // In a GraphQL resolver work, err := workService.Commands.CreateWork(ctx, &domain.Work{...}) ``` ### Example: Retrieving a Work ```go // In a GraphQL resolver workDTO, err := workService.Queries.GetWorkByID(ctx, workID) ``` ## Dependencies - **`internal/domain`**: Uses and returns the core `Work` domain entity and the `WorkDTO` read model. - **`internal/app/authz`**: Relies on the authorization service to perform permission checks before executing commands like `UpdateWork` and `DeleteWork`. - **`internal/app/analytics`**: The `AnalyzeWork` command calls the analytics service to perform and store linguistic analysis. - **`internal/domain/search`**: Uses the `SearchClient` interface to index works in the search engine after they are created or updated. - **Database**: Persists all `Work` data via the `WorkRepository`. - **Logging**: Uses the centralized logger from `internal/platform/log`. - **OpenTelemetry**: All command and query methods are instrumented for distributed tracing.