Skip to content
Back to skills

Collection

ASecurity

Node.js/Express/TypeScript microservices development. Layered architecture (routes → controllers → services → repositories), BaseController, error handling, Sentry monitoring, Prisma, Zod validation, dependency injection. USE WHEN creating routes, controllers, services, repositories, middleware, API endpoints, database access, error tracking.

  • 24 stars
  • 0 votes
  • 0 copies
  • 2 views
  • Added September 8, 2026
developmenttypescriptnodeexpressapidatabasebackendfullstack

Works with

  • api

Security analysis

A100/100

Pro scans all 21 files and shows the line behind each finding

Scanned September 8, 2026

npx -y skills add mattnigh/skills_collection --skill collection --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Collection?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Collection
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/mattnigh-collection-3d6bb993/badge)](https://www.skillsdirectory.com/skills/mattnigh-collection-3d6bb993)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: backend-dev-guidelines
description: Node.js/Express/TypeScript microservices development. Layered architecture (routes → controllers → services → repositories), BaseController, error handling, Sentry monitoring, Prisma, Zod validation, dependency injection. USE WHEN creating routes, controllers, services, repositories, middleware, API endpoints, database access, error tracking.
---
## When to Use

Creating routes, controllers, services, repositories, middleware, APIs, database queries, error handling.

## Quick Checklist

**New API Endpoint:**
- Route in `routes/` with verb naming (`getUser`, `createProduct`)
- Controller extends `BaseController`
- Service in `services/` with business logic
- Repository in `repositories/` with Prisma queries
- Zod validation for request data
- Error handling with `AppError`
- Sentry integration for monitoring

## Layered Architecture

```
Route → Controller → Service → Repository → Database
         ↓            ↓           ↓
     Validation   Business    Data Access
                   Logic
```

**Responsibilities:**
- **Routes**: Define endpoints, attach middleware
- **Controllers**: Handle HTTP (req/res), validation
- **Services**: Business logic, orchestration
- **Repositories**: Database queries only

## BaseController Pattern

```ts
class BaseController {
  ok(res, data?) { return res.status(200).json(data); }
  created(res, data) { return res.status(201).json(data); }
  noContent(res) { return res.status(204).send(); }
  badRequest(res, message) { return res.status(400).json({ error: message }); }
  notFound(res, message) { return res.status(404).json({ error: message }); }
}
```

## Error Handling

```ts
class AppError extends Error {
  constructor(message: string, public statusCode: number = 500) {
    super(message);
  }
}

// Throw in service
throw new AppError('User not found', 404);

// Global handler
app.use((err, req, res, next) => {
  Sentry.captureException(err);
  res.status(err.statusCode || 500).json({
    error: err.message || 'Internal server error',
  });
});
```

## Validation with Zod

```ts
import { z } from 'zod';

const createUserSchema = z.object({
  email: z.string().email(),
  name: z.string().min(2),
  age: z.number().min(18).optional(),
});

// In controller
const data = createUserSchema.parse(req.body); // Throws if invalid
```

## Dependency Injection

```ts
// Container
const userRepo = new UserRepository();
const userService = new UserService(userRepo);
const userController = new UserController(userService);

// Register routes
router.get('/users/:id', asyncHandler((req, res) =>
  userController.getUser(req, res)
));
```

## Async Handler Wrapper

```ts
const asyncHandler = (fn) => (req, res, next) => {
  Promise.resolve(fn(req, res, next)).catch(next);
};

router.get('/users', asyncHandler(async (req, res) => {
  const users = await userService.getAll();
  res.json(users);
}));
```

## Sentry Integration

```ts
import * as Sentry from '@sentry/node';

Sentry.init({ dsn: process.env.SENTRY_DSN });

// Auto-capture errors
app.use(Sentry.Handlers.requestHandler());
app.use(Sentry.Handlers.errorHandler());

// Manual capture
try {
  await riskyOperation();
} catch (error) {
  Sentry.captureException(error);
  throw error;
}
```

## Middleware Pattern

```ts
// Auth middleware
const authMiddleware = async (req, res, next) => {
  const token = req.headers.authorization?.split(' ')[1];
  if (!token) return res.status(401).json({ error: 'Unauthorized' });
  
  try {
    req.user = await verifyToken(token);
    next();
  } catch {
    res.status(401).json({ error: 'Invalid token' });
  }
};

router.use('/protected', authMiddleware);
```

## TypeScript Tips

```ts
// DTOs
interface CreateUserDto {
  email: string;
  name: string;
  age?: number;
}

// Service return types
async getById(id: string): Promise<User | null> {}

// Strict null checks
const user = await repo.findById(id);
if (!user) throw new AppError('Not found', 404);
return user; // TS knows user is not null here
```

## File Organization

```
src/
├── routes/
│   └── user.routes.ts
├── controllers/
│   └── UserController.ts
├── services/
│   └── UserService.ts
├── repositories/
│   └── UserRepository.ts
├── middleware/
│   └── auth.middleware.ts
├── types/
│   └── user.types.ts
└── utils/
    ├── AppError.ts
    └── asyncHandler.ts
```

---

---

## References

**Quick Patterns:** `read .claude/skills/fullstack/backend-dev-guidelines/references/quick-patterns.md`
**Prisma Patterns:** `read .claude/skills/fullstack/backend-dev-guidelines/references/prisma-patterns.md`
**Common Patterns:** `read .claude/skills/fullstack/backend-dev-guidelines/references/common-patterns.md`

Files in this skill

  • 0Chan-smc__claude-code-workflow-lab__claude__skills__frontend-dev-guidelines__SKILL.md15.1 KB
  • 17hz__nextjs-template__claude__skills__example-skill__SKILL.md316 B
  • 1ambda__dataops-platform__claude__skills__context-synthesis__SKILL.md3.5 KB
  • 1natsu172__dotfiles__claude__skills__git-analysis__SKILL.md5.4 KB
  • 1natsu172__dotfiles__claude__skills__github-pr-best-practices__SKILL.md7.7 KB
  • 23Maestro__prospect-pipeline__claude__skills__npid-fastapi-skill.md26.1 KB
  • 360AYA25__ClaudeN8N__claude__skills__n8n-code-javascript__SKILL.md15.7 KB
  • 360AYA25__ClaudeN8N__claude__skills__n8n-code-python__SKILL.md17.5 KB
  • 360AYA25__ClaudeN8N__claude__skills__n8n-expression-syntax__SKILL.md9.4 KB
  • 360AYA25__ClaudeN8N__claude__skills__n8n-mcp-tools-expert__SKILL.md12.5 KB
  • 360AYA25__ClaudeN8N__claude__skills__n8n-node-configuration__SKILL.md16.6 KB
  • 360AYA25__ClaudeN8N__claude__skills__n8n-workflow-patterns__SKILL.md11.2 KB
  • 3x-Projetos__claude-memory-framework__claude__skills__scientist__SKILL.md14.8 KB
  • 5MinFutures__futures-arena__claude__skills__migration-tracker__SKILL.md16.2 KB
  • 5MinFutures__futures-arena__claude__skills__planning-guidelines__SKILL.md11.8 KB
  • 92Bilal26__TaskPilotAI__claude__skills__assessment-builder__SKILL.md17.5 KB
  • 92Bilal26__TaskPilotAI__claude__skills__book-scaffolding__SKILL.md19.1 KB
  • 92Bilal26__TaskPilotAI__claude__skills__code-validation-sandbox__SKILL.md6.2 KB
  • 92Bilal26__TaskPilotAI__claude__skills__exercise-designer__SKILL.md18.1 KB
  • 92Bilal26__TaskPilotAI__claude__skills__learning-objectives__SKILL.md24.5 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…