tercul-backend/internal/app/work/README.md
google-labs-jules[bot] 0a27c84771 This commit introduces a series of significant improvements to bring the codebase closer to a production-ready state.
Key changes include:

- **Architectural Refactoring (CQRS/DTOs):** Refactored the `work` and `translation` application services to use Data Transfer Objects (DTOs) for query responses. This separates the domain layer from the API layer, improving maintainability and performance.

- **Implemented Core Business Logic:** Implemented the `AnalyzeWork` command, which was previously a stub. This command now performs linguistic analysis on works and translations by calling the analytics service.

- **Dependency Injection Improvements:**
    - Refactored the configuration loading in `internal/platform/config/config.go` to use a local `viper` instance, removing the reliance on a global singleton.
    - Injected the `analytics.Service` into the `work.Service` to support the `AnalyzeWork` command.

- **Comprehensive Documentation:**
    - Created a new root `README.md` with a project overview, setup instructions, and architectural principles.
    - Added detailed `README.md` files to key packages (`api`, `analytics`, `auth`, `work`, `db`) to document their purpose and usage.

- **Improved Test Coverage:**
    - Added new unit tests for the refactored `work` and `translation` query handlers.
    - Added a new test suite for the `translation` queries, which were previously untested.
    - Added tests for the new `AnalyzeWork` command.
    - Fixed numerous compilation errors in the test suites caused by the refactoring.
2025-10-08 17:25:02 +00:00

52 lines
2.7 KiB
Markdown

# 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.