* Fix workflow triggers to use 'main' branch instead of 'master' * Switch to semantic version tags for GitHub Actions instead of SHAs for better maintainability * Fix golangci-lint by adding go mod tidy and specifying paths ./... for linting * feat: Restructure workflows following Single Responsibility Principle - Remove old monolithic workflows (ci.yml, ci-cd.yml, cd.yml) - Add focused workflows: lint.yml, test.yml, build.yml, security.yml, docker-build.yml, deploy.yml - Each workflow has a single, clear responsibility - Follow 2025 best practices with semantic versioning, OIDC auth, build attestations - Add comprehensive README.md with workflow documentation - Configure Dependabot for automated dependency updates Workflows now run independently and can be triggered separately for better CI/CD control. * fix: Resolve CI/CD workflow failures and GraphQL integration test issues - Fix Application struct mismatch in application_builder.go - Add global config.Cfg variable and BleveIndexPath field - Regenerate GraphQL code to fix ProcessArgField errors - Add search.InitBleve() call in main.go - Fix all errcheck issues (12 total) in main.go files and test files - Fix staticcheck issues (deprecated handler.NewDefaultServer, tagged switch) - Remove all unused code (50 unused items including mock implementations) - Fix GraphQL 'transport not supported' error in integration tests - Add comprehensive database cleanup for integration tests - Update GraphQL server setup with proper error presenter * feat: Complete backend CI/CD workflow setup - Add comprehensive GitHub Actions workflows for Go backend - Build workflow with binary compilation and attestation - Test workflow with coverage reporting and race detection - Lint workflow with golangci-lint and security scanning - Docker build workflow with multi-architecture support - Deploy workflow for production deployment - Security workflow with vulnerability scanning - All workflows follow Single Responsibility Principle - Use semantic versioning and latest action versions - Enable security features: OIDC auth, attestations, minimal permissions * fix: correct Go build path to ./cmd/api - Fix build workflow to target ./cmd/api instead of ./cmd - The main.go file is located in cmd/api/ subdirectory * fix: correct Dockerfile build path to ./cmd/api - Fix Docker build to target ./cmd/api instead of root directory - The main.go file is located in cmd/api/ subdirectory |
||
|---|---|---|
| .. | ||
| .keep | ||
| 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.