Submission V2 System Behavior
1. System Behavior
1.1 Tujuan Context
Context submission-v2 menjalankan transisi workflow berbasis action untuk satu submission, meliputi validasi action, pembuatan log, update status submission, dan sinkronisasi ke tabel entity native.
Implementasi utama ada di:
packages/lib/src/service/workflow-action/submission-v2/submission-v2.service.ts
1.2 Scope
Termasuk dalam scope context ini:
- Orkestrasi
setSubmission(...)diSubmissionServiceV2. - Resolusi snapshot workflow (
SubmissionV2SnapshotService). - Persistensi submission + sinkronisasi entity (
SubmissionV2PersistenceService). - Perhitungan approval snapshot + pembentukan log (
SubmissionV2LogService).
Di luar scope context ini:
- Manajemen transaction boundary (caller yang membuat/commit/rollback
QueryRunner). - Publish event/message broker.
- HTTP cache clear Directus (dilakukan caller API, bukan
SubmissionServiceV2).
2. Komponen Utama (kelas/fungsi + peran)
-
SubmissionServiceV2.setSubmission(payload, queryRunner)Peran: orkestrator request-scoped flow submission-v2. Path:packages/lib/src/service/workflow-action/submission-v2/submission-v2.service.ts -
SubmissionV2SnapshotServicePeran: resolve snapshot darisubmission.workflowSnapshotatau load fresh dari tabel master workflow. Path:packages/lib/src/service/workflow-action/submission-v2/submission-v2-snapshot.service.ts -
SubmissionV2PersistenceServicePeran: operasi persistence submission/entity (lock row, create submission, update status, syncsubmission_id, sync native payload/status, resolve entity table). Path:packages/lib/src/service/workflow-action/submission-v2/submission-v2-persistence.service.ts -
SubmissionV2LogServicePeran: hitung snapshot approval dan build payload logwxl_submission_log. Path:packages/lib/src/service/workflow-action/submission-v2/submission-v2-log.service.ts -
WorkflowActionModulePeran: registrasi providerSubmissionServiceV2dan dependency-nya. Path:packages/lib/src/service/workflow-action/workflow-action.module.ts
3. Alur System Behavior (happy path, step-by-step)
- Caller memanggil
SubmissionServiceV2.setSubmission(payload, queryRunner). - Service resolve
actorUserIddari urutan fallback:request.user.id->payload.actor_user_id->payload.actor_id->'system'. - Service validasi guard
override:override=truehanya valid bilasource='CROSS_WORKFLOW'. - Service mencari submission existing dengan lock
pessimistic_writelewatfindSubmissionForUpdate(...). - Service resolve snapshot workflow:
- pakai
submission.workflowSnapshotjika sudah ada, - jika kosong, load dari
wml_workflow,wml_status,wml_action,wml_cross_wf_conn,wml_sla_policy.
- Service validasi snapshot memuat workflow target (
assertSnapshotHasWorkflow). - Service mencari action target di snapshot (
findActionInSnapshotOrThrow) dan validasi action memang milik workflow tersebut. - Service validasi reason jika action mensyaratkan reason (
isNeedReason/isReasonRequired). - Jika submission belum ada, service resolve entity reference (
resolveEntity) lalu create rowwxl_submission. - Service validasi action terhadap status submission saat ini (
action.fromStatusId) kecualioverride=true. - Jika submission existing belum punya
entityId, service backfill entity reference (ensureSubmissionEntityRefIfMissing). - Service sync
submission_idke tabel entity target bila kolomsubmission_idtersedia. - Service persist
workflow_snapshotkewxl_submissionjika sebelumnya kosong. - Service build approval snapshot + log payload, lalu insert
wxl_submission_log. - Service update status submission (
current_status_id,last_action_id) jika approval tidak required atau quorum sudah terpenuhi. - Service sync native entity:
- update
status_idjika kolom ada, - apply
native_document_payload.payloadyang kolomnya valid, - apply
action.entityPatchMapping.
- Service return
SetSubmissionResult(submission_id,status_from,status_to,action_id, snapshot approval, dan payload log).
4. Flowchart (Mermaid) -> minimal 1 diagram
5. Trigger & Input (API/event/scheduler + payload penting)
Trigger utama yang memanggil setSubmission(...):
- API endpoint
POST /api/workflow/submission/v2. Path:
apps/api/src/api/core/workflow/workflow.controller.tsapps/api/src/api/core/workflow/workflow.service.ts(submitDefaultWorkflowV2)
- Internal worker cross-workflow. Path:
apps/worker-workflow/src/cross-workflow/services/cross-workflow.service.ts
- Direct service call dari context lain yang sudah punya
QueryRunner.
5.1 Contoh Pemakaian di Controller (API)
Contoh pemakaian pada endpoint API POST /api/workflow/submission/v2:
Controller:
@Post('submission/v2')
@ApiOperation({ summary: 'Submit workflow transition v2' })
async setSubmiision(@Body() body: SubmitWorkflowDtoV2) {
const data = await this.workflowService.submitDefaultWorkflowV2(body);
return data;
}
Service (transaction boundary + pemanggilan SubmissionServiceV2):
async submitDefaultWorkflowV2(body: any) {
const queryRunner = this.dataSource.createQueryRunner();
await queryRunner.connect();
await queryRunner.startTransaction();
try {
const data = await this.submissionServiceV2.setSubmission(body, queryRunner);
await queryRunner.commitTransaction();
return data;
} catch (error) {
await queryRunner.rollbackTransaction();
throw error;
} finally {
await queryRunner.release();
}
}
Path implementasi:
apps/api/src/api/core/workflow/workflow.controller.tsapps/api/src/api/core/workflow/workflow.service.ts
5.2 Detail Input (tabel)
Definisi source type ada di packages/lib/src/service/workflow-action/submission-v2/submission-v2.types.ts.
| Property | Type | Wajib | Keterangan |
|---|---|---|---|
submission_id | string | null | Tidak | Jika kosong/null/"null"/"undefined", service membuat submission baru. |
workflow_id | string | Ya | Workflow target. |
action_id | string | Ya | Action yang dieksekusi. |
actor_id | string | Ya | Actor workflow. |
actor_user_id | string | Tidak | User executor; fallback ke request user/actor_id. |
reason_text | string | Kondisional | Wajib jika action membutuhkan reason. |
override | boolean | Tidak | Bypass validasi fromStatusId; hanya boleh untuk source='CROSS_WORKFLOW'. |
source | 'ACTION' | 'CROSS_WORKFLOW' | Tidak | Menandai sumber trigger. |
native_document_payload.path | string | Tidak | Harus match wml_workflow.entity bila diisi. |
native_document_payload.payload | Record<string, unknown> | Tidak | Akan difilter sesuai kolom tabel entity yang valid. |
do_not_clear_cache | boolean | Tidak | Dipakai caller API untuk skip clear cache setelah commit transaction. |
Catatan:
- DTO API
SubmitWorkflowDtoV2saat ini mewajibkannative_document_payload. Path:apps/api/src/api/core/workflow/dtos/submit-workflow.payload.dto.ts
6. Output & Side Effects (DB update, publish event, external call)
Side effect DB di transaction caller:
- Insert
wxl_submission(jika submission baru). - Update
wxl_submissionuntuk:
workflow_snapshot(jika masih null),- backfill
entity/entity_id(jika kosong), - update
current_status_id+last_action_id(tergantung quorum approval).
- Insert
wxl_submission_log. - Insert/Update tabel entity native sesuai
wml_workflow.entity:
- insert minimal row untuk generate
entityId(saat create), - update
submission_id(jika kolom ada), - update
status_id(jika kolom ada), - apply native payload valid +
entityPatchMapping.
External call:
- Tidak ada external call langsung di
SubmissionServiceV2saat ini. - Pada jalur API,
WorkflowService.submitDefaultWorkflowV2melakukan best-effortPOST /utils/cache/clearviaRestApiServicesetelah commit, kecualido_not_clear_cache=true. Path:apps/api/src/api/core/workflow/workflow.service.ts
Event publish:
- Tidak ada publish event dari
submission-v2.
6.1 Detail Output (tabel)
Definisi return type ada di packages/lib/src/service/workflow-action/submission-v2/submission-v2.types.ts.
| Property | Type | Keterangan |
|---|---|---|
submission_id | string | ID submission final (existing/new). |
status_from | string | null | Status asal. |
status_to | string | null | Status tujuan; bisa null jika approval belum quorum. |
action_id | string | Action yang diproses. |
approval.required | boolean | Apakah action butuh approval. |
approval.total_count | number | Target quorum. |
approval.approved_count | number | Jumlah approval saat eksekusi ini. |
approval.rejected_count | number | Jumlah reject saat eksekusi ini. |
approval.quorum_met | boolean | Status quorum terpenuhi/tidak. |
submission_log | Partial<WxlSubmissionLog> | Payload log yang diinsert ke wxl_submission_log. |
7. Error Handling
Error utama melempar UnprocessableEntityException, antara lain:
Submission not found(submission id dikirim tapi row tidak ada).override=true is allowed only for source=CROSS_WORKFLOW.Reason is required for this action.Workflow <id> not found in snapshot.Action not foundatauAction does not belong to workflow.Invalid action for current status.- Mapping entity workflow invalid/missing (
wml_workflow.entity). native_document_payload.pathtidak match entity workflow.- Payload native tidak memiliki kolom valid di tabel target.
- Gagal create/sync entity atau sync
submission_id.
Perilaku degradasi:
- Saat
syncEntityStatus(...), jika yang gagal hanya sinkronisasi status tanpa native payload, service tidak throw; service log warning. Path:packages/lib/src/service/workflow-action/submission-v2/submission-v2-persistence.service.ts
8. Edge Cases
submission_idbernilai'null'atau'undefined'diperlakukan sebagai kosong.- Approval config dianggap invalid bila approval required tapi nilai quorum
<= 0atau bukan angka valid. - Approval langsung
quorum_met=truejika target quorum<= 1. - Key native payload yang tidak ada di schema tabel akan di-drop dengan warning.
- Jika semua key native payload tidak valid, service throw error.
- Jika tabel entity tidak punya kolom
submission_id, sinkronisasi link dilewati. - Jika tabel entity tidak punya kolom
status_id, hanya payload/patch yang diupdate. - Jika
entityPatchMappingberisi key yang tidak ada di tabel, potensi error ada di layer update DB.
9. Dependency & Integrasi
Dependency internal context:
- TypeORM
QueryRunner(wajib dari caller). - Entity workflow/submission:
WmlWorkflow,WmlStatus,WmlAction,WmlCrossWfConn,WmlSlaPolicyWxlSubmission,WxlSubmissionLog
- Request context
REQUESTuntuk actor resolution.
Integrasi eksternal context:
- API workflow:
apps/api/src/api/core/workflow/workflow.controller.tsapps/api/src/api/core/workflow/workflow.service.tsapps/api/src/api/core/workflow/dtos/submit-workflow.payload.dto.tsapps/api/src/api/core/workflow/workflow.submission-v2.integration.spec.ts
- Worker cross-workflow:
apps/worker-workflow/src/cross-workflow/services/cross-workflow.service.ts
- Module registration:
packages/lib/src/service/workflow-action/workflow-action.module.ts
10. Data Model yang relevan (ringkas, referensi ke ERD/entitas)
-
wxl_submissionEntity:packages/lib/src/database/entities/wxl-submission.entity.ts -
wxl_submission_logEntity:packages/lib/src/database/entities/wxl-submission-log.entity.ts -
wml_workflowEntity:packages/lib/src/database/entities/wml-workflow.entity.ts -
wml_actionEntity:packages/lib/src/database/entities/wml-action.entity.ts -
wml_statusEntity:packages/lib/src/database/entities/wml-status.entity.ts -
wml_cross_wf_connEntity:packages/lib/src/database/entities/wml-cross-wf-conn.entity.ts -
wml_sla_policyEntity:packages/lib/src/database/entities/wml-sla-policy.entity.ts
Referensi ERD workflow-action:
packages/lib/src/service/workflow-action/docs/erd.md
11. Referensi Kode (path file yang dipakai)
packages/lib/src/service/workflow-action/submission-v2/submission-v2.service.tspackages/lib/src/service/workflow-action/submission-v2/submission-v2-persistence.service.tspackages/lib/src/service/workflow-action/submission-v2/submission-v2-snapshot.service.tspackages/lib/src/service/workflow-action/submission-v2/submission-v2-log.service.tspackages/lib/src/service/workflow-action/submission-v2/submission-v2.types.tspackages/lib/src/service/workflow-action/submission-v2/submission-v2.service.spec.tspackages/lib/src/service/workflow-action/workflow-action.module.tsapps/api/src/api/core/workflow/workflow.controller.tsapps/api/src/api/core/workflow/workflow.service.tsapps/api/src/api/core/workflow/dtos/submit-workflow.payload.dto.tsapps/api/src/api/core/workflow/workflow.submission-v2.integration.spec.tsapps/worker-workflow/src/cross-workflow/services/cross-workflow.service.ts
12. Open Questions
SubmissionServiceV2masih meng-injectCacheService, tetapi clear cache di service ini sudah tidak dieksekusi (kode clear cache di-comment). Perlu diputuskan apakah dependency ini tetap dipertahankan atau dihapus.SubmitWorkflowDtoV2belum memodelkan field service-level sepertireason_text,actor_user_id,override,source, dando_not_clear_cache. Perlu diputuskan apakah field-field ini memang tidak boleh dari API atau DTO perlu diselaraskan.