9.5 KiB
Takeover File API
Dokumen ini menjelaskan alur lengkap file pada takeover:
- upload intent file
- finalize upload menjadi file manager file tanpa parent takeover
- create takeover baru sambil menempelkan file pakai
file_id - update takeover dengan mode add, remove, atau replace file
- response takeover dan FM report yang menampilkan file
- SSE yang tetap dipakai dari file manager
Ringkasan Konsep
Ada 3 objek yang perlu dibedakan:
file- file fisik di file manager
attachment- relasi file ke reference bisnis, misalnya
takeover
- relasi file ke reference bisnis, misalnya
takeover_file- relasi khusus takeover ke
file_attachment_id
- relasi khusus takeover ke
Flow yang dipakai di sistem ini:
- FE minta upload intent ke file manager
- FE upload binary file ke storage
- FE finalize file lewat endpoint takeover file dan menerima
file_id - FE kirim
file_idsaat create/update takeover - Backend membuat attachment
ref_type = takeover - Backend menyimpan relasi takeover file
Endpoint Yang Dipakai
File Manager
Request upload intent untuk takeover
POST /api/v1/file-manager/files/upload-takeover-file
Fungsi:
- minta upload intent
- dapat
upload_intent_uuid - dapat
upload_url
Finalize file takeover
POST /api/v1/file-manager/files/create-takeover-file
Fungsi:
- finalize file dari upload intent
- membuat file manager file node
- mengembalikan
file_iduntuk dipakai di takeover create/update
Endpoint ini tidak membuat attachment dan tidak membuat row takeover_files.
Catatan:
takeover_uuidtidak wajib- file boleh sementara tanpa parent takeover
- attachment takeover baru dibuat saat
POST /api/v1/takeovers/createatauPATCH /api/v1/takeovers/update/{id}
Takeover
Create takeover baru
POST /api/v1/takeovers/create
Update takeover
PATCH /api/v1/takeovers/update/{id}
Flow Create Takeover Dengan File
1. FE minta upload intent file
Pakai endpoint:
POST /api/v1/file-manager/files/upload-takeover-file
Contoh payload:
{
"data": [
{
"type": "file_manager_file_upload_intent",
"attributes": {
"name": "takeover-report.pdf",
"content_type": "application/pdf",
"size_bytes": 123456
}
}
]
}
Response akan mengembalikan:
upload_intent_uuidupload_urlmethodrequired_headers
2. FE upload binary ke storage
Gunakan upload_url dan method dari response upload intent.
3. FE finalize upload menjadi file manager file
Pakai endpoint:
POST /api/v1/file-manager/files/create-takeover-file
Contoh payload:
{
"data": [
{
"type": "file_manager_file_create",
"attributes": {
"upload_intent_uuid": "019e8713-aa19-7fb7-a510-a0332dc69697",
"name": "takeover-report.pdf"
}
}
]
}
Response akan mengembalikan file manager resource. Ambil data[0].resource.id sebagai file_id.
Contoh potongan response:
{
"data": [
{
"index": 0,
"success": true,
"resource": {
"type": "file_manager_file",
"id": "019e8714-1111-7aaa-8bbb-222222222222",
"attributes": {
"name": "takeover-report.pdf"
}
}
}
]
}
4. FE kirim takeover create
Pakai endpoint:
POST /api/v1/takeovers/create
Field file yang didukung:
data.attributes.files[]
Struktur item:
{
"file_id": "019e8714-1111-7aaa-8bbb-222222222222"
}
Contoh payload:
{
"data": {
"type": "takeover_create",
"attributes": {
"base_id": "019d6771-5fb5-7337-837f-bc5ed85181a1",
"duty_date": "2026-06-22",
"notes": "Takeover baru dengan file",
"files": [
{
"file_id": "019e8714-1111-7aaa-8bbb-222222222222"
}
]
}
}
}
5. Backend attach file ke takeover
Saat request create takeover diproses, backend akan:
- membuat takeover
- membaca
file_iddaridata.attributes.files[] - create attachment dengan
ref_type = takeover - menyimpan relasi ke
takeover_files
Catatan kompatibilitas:
- item lama dengan
upload_intent_uuidmasih didukung sebagai fallback - flow baru yang disarankan adalah kirim
file_id
Flow Update Takeover Dengan File
Pakai endpoint:
PATCH /api/v1/takeovers/update/{id}
Ada 3 mode yang disarankan.
Mode 1. Add file baru
Gunakan:
files- atau
files_add
Keduanya menerima item yang sama:
{
"file_id": "019e8714-3333-7aaa-8bbb-444444444444"
}
Contoh:
{
"data": {
"type": "takeover_update",
"id": "019eed5d-36c2-72d9-acab-388b4e41a949",
"attributes": {
"notes": "Tambah file baru",
"files_add": [
{
"file_id": "019e8714-3333-7aaa-8bbb-444444444444"
}
]
}
}
}
Mode 2. Remove file tertentu
Gunakan:
files_remove
Isi field ini adalah file_attachment_id, bukan takeover_file.id.
Contoh:
{
"data": {
"type": "takeover_update",
"id": "019eed5d-36c2-72d9-acab-388b4e41a949",
"attributes": {
"files_remove": [
"019d7000-aaaa-7bbb-8ccc-222222222222"
]
}
}
}
Saat remove:
- relasi
takeover_filesdihapus - attachment file-manager juga dihapus
- file lifecycle ikut direconcile oleh file manager
Mode 3. Replace semua file
Gunakan:
files_replace
Mode ini:
- menghapus semua file lama dari takeover
- menambahkan daftar file baru
Aturan:
files_replacetidak boleh digabung denganfilesfiles_replacetidak boleh digabung denganfiles_addfiles_replacetidak boleh digabung denganfiles_remove
Contoh:
{
"data": {
"type": "takeover_update",
"id": "019eed5d-36c2-72d9-acab-388b4e41a949",
"attributes": {
"files_replace": [
{
"file_id": "019e8714-5555-7aaa-8bbb-666666666666"
}
]
}
}
}
Mode campuran: add + remove
Kalau kamu ingin menambah file baru sambil menghapus file lama, pakai:
files_addfiles_remove
Contoh:
{
"data": {
"type": "takeover_update",
"id": "019eed5d-36c2-72d9-acab-388b4e41a949",
"attributes": {
"files_add": [
{
"file_id": "019e8714-7777-7aaa-8bbb-888888888888"
}
],
"files_remove": [
"019d7000-aaaa-7bbb-8ccc-222222222222"
]
}
}
}
Validation Rules
Create takeover
Field yang wajib:
duty_date
Field file:
files[]opsional- untuk flow baru, setiap item file berisi:
file_id
Catatan:
upload_intent_uuid+namemasih bisa dipakai sebagai fallback lama- untuk flow baru, gunakan
file_iddari response/create-takeover-file
Update takeover
Field file yang tersedia:
filesfiles_addfiles_removefiles_replace
Aturan kombinasi:
files_replaceeksklusiffilesdanfiles_adddiperlakukan sebagai add file barufiles_removeharus berisi UUID attachment yang masih terhubung ke takeover
Response Takeover
Response takeover sekarang punya field:
data.attributes.files
Contoh item:
{
"type": "takeover_file",
"id": "019d7000-aaaa-7bbb-8ccc-111111111111",
"attributes": {
"file_attachment_id": "019d7000-aaaa-7bbb-8ccc-222222222222",
"file_name": "takeover-report.pdf",
"download_url": "https://..."
}
}
Arti field:
id- UUID relasi
takeover_file
- UUID relasi
file_attachment_id- UUID attachment file-manager
file_name- nama file yang tersimpan
download_url- URL download file jika storage tersedia
Response FM Report
Response fm report juga menampilkan file takeover melalui:
data.attributes.takeover_files
Isi resource sama seperti response takeover:
idfile_attachment_idfile_namedownload_url
SSE
Flow takeover file tetap memakai SSE file manager yang sudah ada.
Event utama:
file.updated
Artinya saat file berhasil difinalisasi atau status file berubah, FE tetap bisa mendengarkan event realtime dari stream file manager.
Endpoint stream:
GET /api/v1/file-manager/events
Catatan:
- belum ada stream SSE takeover-file khusus
- yang dipakai adalah stream file manager yang sudah eksisting
Migration dan Struktur Database
Tabel baru:
takeover_files
Kolom:
idtakeover_idfile_attachment_id
Migration:
migrations/20260622_create_takeover_files.sql
Best Practice Pemakaian
- Finalize upload dulu lewat
/api/v1/file-manager/files/create-takeover-file - Kalau takeover sudah ada, gunakan
PATCH /api/v1/takeovers/update/{id} - Pakai
files_replacehanya kalau memang ingin mengganti semua file - Pakai
files_adddanfiles_removekalau ingin perubahan parsial yang lebih aman - Untuk menghapus file, gunakan
file_attachment_iddari response takeover
Contoh Alur Yang Disarankan
Create takeover baru dengan 1 file
- request upload intent
- upload binary ke storage
- panggil
POST /api/v1/file-manager/files/create-takeover-file - ambil
file_iddari response - panggil
POST /api/v1/takeovers/createdenganfiles[].file_id
Update takeover dan tambah file baru
- request upload intent
- upload binary ke storage
- panggil
POST /api/v1/file-manager/files/create-takeover-file - ambil
file_iddari response - panggil
PATCH /api/v1/takeovers/update/{id}denganfiles_add[].file_id
Update takeover dan replace semua file
- request upload intent baru untuk file pengganti
- upload binary ke storage
- panggil
POST /api/v1/file-manager/files/create-takeover-file - ambil
file_iddari response - panggil
PATCH /api/v1/takeovers/update/{id}denganfiles_replace[].file_id