mirror of
https://github.com/SamyRai/tercul-backend.git
synced 2025-12-27 02:51:34 +00:00
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.
52 lines
2.7 KiB
Markdown
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. |