Submission V2 System Behavior
1. System Behavior
1.1 Tujuan Context
Context submission-v2 menjalankan transisi workflow berbasis action untuk satu submission, meliputi validasi guard, pembuatan log, update status submission, dan sinkronisasi data ke tabel entity native.
Implementasi utama:
packages/lib/src/service/workflow-action/submission-v2/submission-v2.service.ts
1.2 Scope
Termasuk dalam scope context ini:
- Orkestrasi
setSubmission(...)diSubmissionServiceV2. - Resolusi data workflow/action/submission dari tabel live via repository.
- Persistensi submission/entity via command repository.
- Perhitungan approval snapshot + pembentukan payload log.
Di luar scope context ini:
- Boundary transaksi (dibuat oleh caller yang mengelola
QueryRunner). - Publish event/message broker.
- HTTP cache clear di layer API.
2. Komponen Utama (kelas/fungsi + peran)
-
SubmissionServiceV2.setSubmission(payload, queryRunner)Peran: orkestrator flow submission-v2. Path:packages/lib/src/service/workflow-action/submission-v2/submission-v2.service.ts -
SubmissionV2RepositoryPeran: read-query data live (wxl_submission,wml_workflow,wml_action). Path:packages/lib/src/service/workflow-action/submission-v2/submission-v2.repository.ts -
SubmissionV2CommandRepositoryPeran: command/write kewxl_submission,wxl_submission_log, dan tabel entity native. Path:packages/lib/src/service/workflow-action/submission-v2/submission-v2-command.repository.ts -
SubmissionV2LogServicePeran: hitung approval snapshot dan build payload logwxl_submission_log. Path:packages/lib/src/service/workflow-action/submission-v2/submission-v2-log.service.ts -
WorkflowActionModulePeran: registrasi provider submission-v2. 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 fallback:request.user.id -> payload.actor_user_id -> DEFAULT_FALLBACK_USER_ID. - Service validasi guard
override:override=truehanya valid untuksource='CROSS_WORKFLOW'. - Service ambil submission existing via
SubmissionV2Repository.findSubmissionForUpdate(...)(lockpessimistic_write). - Service ambil workflow live via
SubmissionV2Repository.findWorkflowById(...). - Service ambil action live via
SubmissionV2Repository.findActionById(...). - Service validasi:
- workflow ada,
- action ada,
- action milik workflow yang sama,
- submission existing (jika ada) milik workflow yang sama.
- Service validasi reason jika action mensyaratkan reason.
- Jika submission belum ada, service resolve entity (
resolveEntity) lalu create rowwxl_submission. - Service validasi
fromStatusterhadap status submission saat ini (kecualioverride=true). - Jika submission existing belum punya
entityId, service backfill entity reference. - Service sinkronkan
submission_idke tabel entity bila kolom tersedia. - Service hitung approval snapshot + build payload log.
- Service insert
wxl_submission_log. - Service update status submission (
current_status_id,last_action_id) jika approval tidak pending. - Service sinkronkan status/native payload/
entityPatchMappingke tabel entity native. - Service return
SetSubmissionResult.
4. Flowchart (Mermaid)
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
- Worker cross-workflow. Path:
apps/worker-workflow/src/cross-workflow/services/cross-workflow-one-to-many.service.tsapps/worker-workflow/src/cross-workflow/services/cross-workflow-many-to-one.service.ts
5.1 Detail Input (tabel)
Definisi type: 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 create submission baru. |
entity_id | string | null | Tidak | Dipakai untuk pakai row entity existing saat create/backfill. |
workflow_id | string | Ya | Workflow target. |
action_id | string | Ya | Action yang dieksekusi. |
actor_id | string | null | Tidak | Actor workflow (opsional). |
actor_user_id | string | Tidak | User executor; fallback ke request user/default. |
reason_text | string | Kondisional | Wajib jika action mensyaratkan reason. |
override | boolean | Tidak | Bypass validasi status asal; hanya boleh untuk source cross-workflow. |
source | 'ACTION' | 'CROSS_WORKFLOW' | Tidak | Sumber trigger. |
native_document_payload.path | string | Tidak | Harus match wml_workflow.entity jika diisi. |
native_document_payload.payload | Record<string, unknown> | Tidak | Akan difilter sesuai kolom valid tabel entity. |
do_not_clear_cache | boolean | Tidak | Saat ini tidak dipakai di SubmissionServiceV2 (pass-through compatibility). |
6. Output & Side Effects (DB update, publish event, external call)
Side effect DB dalam transaksi caller:
- Insert
wxl_submission(jika create baru). - Update
wxl_submissionuntuk:
- backfill
entity/entity_idjika kosong, - update
current_status_id+last_action_idjika quorum terpenuhi.
- Insert
wxl_submission_log. - Insert/Update tabel entity native:
- create row minimal saat butuh generate entity id,
- update
submission_idjika kolom ada, - update
status_idjika kolom ada, - apply native payload valid dan
entityPatchMapping.
6.1 Detail Output (tabel)
Definisi return type: packages/lib/src/service/workflow-action/submission-v2/submission-v2.types.ts
| Property | Type | Keterangan |
|---|---|---|
submission_id | string | ID submission final. |
status_from | string | null | Status asal. |
status_to | string | null | Status tujuan (bisa null jika approval masih pending). |
action_id | string | Action yang dieksekusi. |
approval.required | boolean | Action butuh approval atau tidak. |
approval.total_count | number | Target quorum approval. |
approval.approved_count | number | Approval count saat eksekusi ini. |
approval.rejected_count | number | Rejected count saat eksekusi ini. |
approval.quorum_met | boolean | Quorum terpenuhi atau tidak. |
submission_log | Partial<WxlSubmissionLog> | Payload log yang disimpan. |
7. Error Handling
Error utama (UnprocessableEntityException):
Submission not found.override=true is allowed only for source=CROSS_WORKFLOW.Workflow <id> not found.Action not found.Action does not belong to workflow.Submission does not belong to workflow.Reason is required for this action.Invalid action for current status.- Validasi entity/native payload gagal.
- Insert/update entity native gagal.
Perilaku degradasi:
syncEntityStatus(...)bisa warning-only jika gagal sinkronisasi status tanpa native payload.
8. Edge Cases
submission_idstring'null'/'undefined'dianggap kosong.- Approval config invalid (required tapi quorum
<= 0) akan throw. ANY_ONEdengan quorum 1 langsungquorum_met=true.- Key native payload yang tidak ada di schema tabel akan di-drop.
- Jika semua key payload ter-drop, service throw error.
- Jika tabel entity tidak punya kolom
submission_id, sinkronisasi link dilewati. - Jika tabel entity tidak punya kolom
status_id, update status dilewati.
9. Dependency & Integrasi
Dependency internal:
QueryRunnerdari caller.SubmissionV2Repository(read).SubmissionV2CommandRepository(write).SubmissionV2LogService.
Integrasi eksternal:
- API workflow (
apps/api/src/api/core/workflow/*). - Worker cross-workflow (
apps/worker-workflow/src/cross-workflow/services/*).
10. Data Model Relevan
wxl_submission->packages/lib/src/database/entities/wxl-submission.entity.tswxl_submission_log->packages/lib/src/database/entities/wxl-submission-log.entity.tswml_workflow->packages/lib/src/database/entities/wml-workflow.entity.tswml_action->packages/lib/src/database/entities/wml-action.entity.ts
Referensi ERD:
packages/lib/src/service/workflow-action/docs/erd.md
11. Referensi Kode
packages/lib/src/service/workflow-action/submission-v2/submission-v2.service.tspackages/lib/src/service/workflow-action/submission-v2/submission-v2.repository.tspackages/lib/src/service/workflow-action/submission-v2/submission-v2-command.repository.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/submission-v2/submission-v2.repository.spec.tspackages/lib/src/service/workflow-action/workflow-action.module.ts
12. Open Questions
do_not_clear_cachemasih ada di kontrak payload, tetapi saat ini tidak dipakai diSubmissionServiceV2. Perlu diputuskan tetap dipertahankan atau didepresiasi.