Validation Rules Documentation
Overview
Dokumentasi aturan validasi untuk Job Family API. Sumber implementasi: validation/index.ts, commands, dan query get-by-id.
Validation Rules
CREATE Job Family
Required Fields
name(string) – Nama job family (contoh: Finance, Sales, Engineering)
Optional Fields
description(string) – Deskripsi opsional
Business Rules
1. Key Auto-Generation
Rule: Field key tidak dikirim oleh client. Sistem meng-generate key unik dari name dengan aturan:
- Lowercase, trim
- Karakter selain alphanumeric diganti
- - Leading/trailing
-dihapus - Jika key sudah dipakai di tenant, tambah suffix
-1,-2, … sampai unik
Contoh: name "Finance" → key finance; name "Human Resources" → key human-resources. Jika finance sudah ada → finance-1.
2. Default Values
is_activedi-set true pada create (tidak bisa di-set false dari create DTO).
3. Validasi Lain
- Tidak ada validasi "job family dengan name sama sudah ada" — key dibuat unik sehingga nama sama boleh (menghasilkan key berbeda).
- DTO divalidasi dengan class-validator (name required, string).
Error Responses:
- 400 Bad Request — Validasi DTO gagal (mis. name kosong / bukan string).
UPDATE Job Family
All Fields Optional
Partial update: hanya field yang dikirim yang di-update. Field yang bisa di-update: key, name, description, is_active.
Business Rules
1. Existence Check
Rule: Job family harus ada sebelum update. Menggunakan JobFamilyValidation.validateNotFound(client, { id }).
Error Response:
{
"statusCode": 404,
"message": "Job family is not found",
"reason": "job-family.is_not_found"
}
2. Key Regeneration
Rule: Di implementasi saat ini, key di-regenerate dari dto.name di command update. Jika name tidak dikirim, base untuk slug bisa undefined — disarankan mengirim name saat update bila ingin key tetap konsisten.
3. DTO Validation
- Semua field optional; class-validator untuk tipe (string, boolean).
GET Job Family by ID
Rule: Jika record tidak ditemukan, query melempar NotFoundException.
Error Response:
{
"statusCode": 404,
"message": "Job Family not found",
"reason": "job-family.not-found"
}
SOFT DELETE Job Family
Business Rules
1. Existence Check
Rule: Job family harus ada sebelum soft delete. Menggunakan JobFamilyValidation.validateNotFound(client, { id }).
Error Response:
{
"statusCode": 404,
"message": "Job family is not found",
"reason": "job-family.is_not_found"
}
2. Soft Delete Behavior
- Set
deleted_at,deleted_by,deleted_by_name; record tidak dihapus dari database. - Tidak ada pengecekan "masih ada job title yang memakai job family ini" — soft delete tetap dijalankan.
Validation Module (Reference)
Modul JobFamilyValidation menyediakan:
| Method | Keterangan | Dipakai di |
|---|---|---|
| validateExistence(client, where) | Throw 400 job-family.is_exist jika record ada | Saat ini tidak dipakai di flow |
| validateNotFound(client, where) | Throw 404 job-family.is_not_found jika record tidak ada | Update, Soft Delete |
Validation Flow Diagrams
CREATE Flow
┌─────────────────┐
│ Validate DTO │ (class-validator: name required)
└────────┬────────┘
↓
┌─────────────────────────┐
│ generateUniqueSlug(name)│
└────────┬────────────────┘
↓
┌────────────────────┐
│ CREATE (transaction)│
│ key, name, desc, │
│ isActive: true │
└────────┬───────────┘
↓
┌────────────────────┐
│ mapToDetailResponse│
└────────────────────┘
UPDATE Flow
┌─────────────────┐
│ Validate DTO │ (partial, all optional)
└────────┬────────┘
↓
┌──────────────────────┐
│ validateNotFound(id) │
└────────┬──────────────┘
↓
┌─────────────────────────┐
│ generateUniqueSlug(name)│
└────────┬────────────────┘
↓
┌────────────────────┐
│ UPDATE (transaction)│
└────────┬───────────┘
↓
┌────────────────────┐
│ mapToDetailResponse│
└────────────────────┘
SOFT DELETE Flow
┌──────────────────────┐
│ validateNotFound(id) │
└────────┬──────────────┘
↓
┌────────────────────────┐
│ UPDATE deleted_at, │
│ deleted_by, deleted_by_name
└────────────────────────┘
Error Code Reference
| HTTP | Reason Code | Trigger | Solution / Note |
|---|---|---|---|
| 404 | job-family.is_not_found | Record tidak ada (update/soft delete) | Cek ID valid |
| 404 | job-family.not-found | Record tidak ada (get by id) | Cek ID valid |
| 400 | job-family.is_exist | Record sudah ada (validateExistence) | Saat ini tidak dipakai di flow |
Related Files
- Validation:
src/job-family/validation/index.ts - Commands:
src/job-family/commands/create.cmd.ts,update.cmd.ts,soft-delete.cmd.ts - Query:
src/job-family/queries/get-job-family-by-id.query.ts - DTOs:
dto/create-job-family.dto.ts,dto/update-job-family.dto.ts - PRD:
docs/job-family.md - Technical:
docs/TEKNIS.md