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.
|
||
|---|---|---|
| .. | ||
| .keep | ||
| commands_test.go | ||
| commands.go | ||
| dto.go | ||
| main_test.go | ||
| mock_analytics_service_test.go | ||
| queries_test.go | ||
| queries.go | ||
| README.md | ||
| service.go | ||
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 theWorkCommandsandWorkQueriesinto a singleServicestruct, which is then used by the rest of the application (e.g., in the GraphQL resolvers). -
commands.go: Contains all the command handlers for mutatingWorkentities. 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 retrievingWorkdata. These handlers return specializedWorkDTOread models to ensure a clean separation between the domain and the API layer. -
dto.go: Defines theWorkDTOstruct, which is the read model used for all query responses. -
interfaces.go(external): The service depends on theWorkRepositoryinterface defined ininternal/domain/interfaces.gofor 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
// In a GraphQL resolver
work, err := workService.Commands.CreateWork(ctx, &domain.Work{...})
Example: Retrieving a Work
// In a GraphQL resolver
workDTO, err := workService.Queries.GetWorkByID(ctx, workID)
Dependencies
internal/domain: Uses and returns the coreWorkdomain entity and theWorkDTOread model.internal/app/authz: Relies on the authorization service to perform permission checks before executing commands likeUpdateWorkandDeleteWork.internal/app/analytics: TheAnalyzeWorkcommand calls the analytics service to perform and store linguistic analysis.internal/domain/search: Uses theSearchClientinterface to index works in the search engine after they are created or updated.- Database: Persists all
Workdata via theWorkRepository. - Logging: Uses the centralized logger from
internal/platform/log. - OpenTelemetry: All command and query methods are instrumented for distributed tracing.