Skip to main content

Job Position API - Dokumentasi Teknis

Overview

Dokumentasi teknis untuk developer yang akan maintain atau develop lebih lanjut pada Job Position API module.

Arsitektur

Job Position module menggunakan pola Command & Query:

job-position/
├── commands/
│ ├── create.cmd.ts
│ ├── update.cmd.ts
│ └── soft-delete.cmd.ts
├── queries/
│ ├── get.query.ts
│ └── get-by-id.query.ts
├── dto/
├── helper/
├── validation/
├── job-position.controller.ts
├── job-position.service.ts
├── job-position.module.ts
└── docs/

Tech Stack

  • Framework: NestJS
  • Database: PostgreSQL dengan Prisma ORM
  • Validation: class-validator, class-transformer
  • Auth: AuthGuard (JWT), tenant dari current user
  • RLS: createTenantClient

Database Schema

Table: job_positions

ColumnTypeKeterangan
idUUIDPK
tenant_idUUIDNOT NULL
title_idUUIDNOT NULL, FK → job_titles
codeVARCHAR(50)NULL (unik per tenant)
is_activeBOOLEANDEFAULT true
created_byUUIDNULL
created_by_nameVARCHAR(100)NULL
created_atTIMESTAMPTZDEFAULT now()
updated_byUUIDNULL
updated_by_nameVARCHAR(100)NULL
updated_atTIMESTAMPTZ@updatedAt
deleted_byUUIDNULL
deleted_by_nameVARCHAR(100)NULL
deleted_atTIMESTAMPTZNULL

Relasi:

  • JobPosition.title_idJobTitle.id
  • OrganizationUnitHasPosition.jobPositionIdJobPosition.id
  • OpUnitHasPositionJobPosition
  • EmployeeJobPosition

Module Structure

1. Commands

CreateJobPositionCommand

  • File: commands/create.cmd.ts
  • Alur:
    1. createTenantClient(tenantId)
    2. JobPositionValidation.validateExistence(client, { code: dto.code }) — code harus unik (throw jika sudah ada)
    3. JobTitleValidation.validateNotFound(client, { id: dto.title_id })
    4. Transaction: jobPosition.create({ tenantId, titleId, code, isActive: true })
    5. mapToDetailResponse(result)

UpdateJobPositionCommand

  • File: commands/update.cmd.ts
  • Alur: validateNotFound → validateExistence(code) — bila code diubah, pastikan unik → update

SoftDeleteJobPositionCommand

  • File: commands/soft-delete.cmd.ts

2. Validation

JobPositionValidation

  • validateExistence(client, where) — Throw 400 job-position.is_exist jika record ada (dipakai untuk validasi code unik)
  • validateNotFound(client, where) — Throw 404 job-position.is_not_found jika record tidak ada

3. Create vs Update

  • Create: validateExistence({ code }) = code belum dipakai (jika ada → error)
  • Update: validateExistence({ code }) dipanggil — perhatian: bila code tidak dikirim (undefined), behavior tergantung implementasi

Controller Endpoints

  • Base route: job-positions
  • POST / — create
  • GET / — findAll
  • GET /:id — findOne
  • PATCH /:id — update
  • DELETE /:id — softDelete

Error Codes

  • job-position.is_not_found — Record tidak ditemukan
  • job-position.is_exist — Code sudah dipakai (create) / code bentrok (update)
  • job-title.is_not_found — title_id tidak valid