Claude-skill-registry create-service

Guide for creating services in the backend. Use when asked to create a service layer component. Directs to the appropriate service skill based on the type of service needed.

install
source · Clone the upstream repo
git clone https://github.com/majiayu000/claude-skill-registry
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/majiayu000/claude-skill-registry "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/data/create-service" ~/.claude/skills/majiayu000-claude-skill-registry-create-service && rm -rf "$T"
manifest: skills/data/create-service/SKILL.md
source content

Create Service

Services contain business logic and orchestrate operations between repositories, external APIs, and other services.

Service Types

There are two types of services in this architecture:

TypePurposeSkill
Resource ServiceCRUD operations on entities (notes, users, etc.)
create-resource-service
Utility ServiceCross-cutting concerns (auth, notifications, email)
create-utility-service

Which Skill to Use?

Use
create-resource-service
when:

  • Creating a service for a domain entity (Note, User, Course, etc.)
  • The service will perform CRUD operations via a repository
  • The service needs authorization checks per operation
  • The service should emit events for real-time updates
  • You've already created the schema and repository for this entity

Example:

NoteService
,
UserService
,
CourseService

Use
create-utility-service
when:

  • Creating a service for cross-cutting concerns
  • The service calls external APIs (auth service, payment gateway, etc.)
  • The service provides shared functionality used by other services
  • The service doesn't directly map to a domain entity

Example:

AuthenticationService
,
AuthorizationService
,
EmailService
,
NotificationService

Service Layer Principles

Regardless of type, all services follow these principles:

  1. Business logic lives here - Not in controllers or repositories
  2. Dependency injection - Inject dependencies via constructor
  3. Throw domain errors - Use errors from
    @/errors
    (not HTTP errors)
  4. User context - Accept
    AuthenticatedUserContextType
    where needed
  5. Return domain types - Return schema types, not HTTP responses

File Naming

Location:

src/services/{service-name}.service.ts

TypeExample
Resource
note.service.ts
,
user.service.ts
Utility
authentication.service.ts
,
authorization.service.ts

See Also

  • create-resource-service
    - CRUD services for entities
  • create-utility-service
    - Cross-cutting/specialized services
  • add-resource-events
    - Add real-time events to a resource service