Error in user YAML: (<unknown>): did not find expected alphabetic or numeric character while scanning an alias at line 2 column 8
---
description: Guidelines for Service Layer
globs: **/services/**/*.ts, **/_services/**/*.ts
alwaysApply: false
---The service layer is responsible for orchestrating business logic and coordinating data access operations. It sits between the UI (components, hooks) and the data access layer, providing a clear separation of concerns. Services should handle:
- Orchestration of multiple data operations
- Business logic implementation
- Data transformation and validation
- Error handling and logging
src/
├── services/ # Shared service layer module
│ └── [entity]
└── [operation-entity-name].ts # Shared service implementations
└── features/
└── [feature-name]/
└── _services/ # Feature-specific services
└── [operation-entity-name].ts # Feature-specific service implementations
[operation][Entity]Service: For service functions (e.g.,getFeatureFlagService,createUserService)
[Operation][Entity]ServiceArgs: Arguments for service functions[Operation][Entity]ServiceDependencies: Dependencies for service functions[Operation][Entity]ServiceResult: Return type for service functions (if needed)
- Services should receive data access functions as dependencies
- Dependencies should be injected with default values
- Services should be pure functions that don't manage state
- Services should handle error cases and transformations
- Services should be testable by allowing dependency injection
import { getUserData } from '@/data/users/get-user';
import { getFeatureFlagData } from '@/data/feature-flags/get-feature-flag';
import { type DbClient } from '@/db/create-db-client';
import { type Session } from '@/types/auth';
export type GetFeatureFlagServiceDependencies = {
getUserData: typeof getUserData;
getFeatureFlagData: typeof getFeatureFlagData;
};
export type GetFeatureFlagServiceArgs = {
dbClient: DbClient;
payload: { session: Session };
dependencies?: GetFeatureFlagServiceDependencies;
};
export async function getFeatureFlagService({
dbClient,
payload,
dependencies = {
getUserData,
getFeatureFlagData,
},
}: GetFeatureFlagServiceArgs) {
const userData = await dependencies.getUserData({
dbClient,
id: payload.session.id,
});
const featureFlagData = await dependencies.getFeatureFlagData({
dbClient,
role: userData.role,
});
return featureFlagData;
}Services should be used when:
- You need to coordinate multiple data access operations
- There is complex business logic to implement
- You need to transform or validate data before returning it
- You need to handle specific error cases or implement retry logic
- You want to make the code more testable through dependency injection
If an operation is simple and only involves a single data access call with minimal transformation, it might not need a service layer.