Skip to main content

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_active di-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:

MethodKeteranganDipakai di
validateExistence(client, where)Throw 400 job-family.is_exist jika record adaSaat ini tidak dipakai di flow
validateNotFound(client, where)Throw 404 job-family.is_not_found jika record tidak adaUpdate, 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

HTTPReason CodeTriggerSolution / Note
404job-family.is_not_foundRecord tidak ada (update/soft delete)Cek ID valid
404job-family.not-foundRecord tidak ada (get by id)Cek ID valid
400job-family.is_existRecord sudah ada (validateExistence)Saat ini tidak dipakai di flow

  • 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