Files
fm_be/docs/takeover-file-api.md
2026-07-16 22:16:45 +07:00

484 lines
9.5 KiB
Markdown

# Takeover File API
Dokumen ini menjelaskan alur lengkap file pada `takeover`:
1. upload intent file
2. finalize upload menjadi file manager file tanpa parent takeover
3. create takeover baru sambil menempelkan file pakai `file_id`
4. update takeover dengan mode add, remove, atau replace file
5. response takeover dan FM report yang menampilkan file
6. SSE yang tetap dipakai dari file manager
## Ringkasan Konsep
Ada 3 objek yang perlu dibedakan:
1. `file`
- file fisik di file manager
2. `attachment`
- relasi file ke reference bisnis, misalnya `takeover`
3. `takeover_file`
- relasi khusus takeover ke `file_attachment_id`
Flow yang dipakai di sistem ini:
1. FE minta upload intent ke file manager
2. FE upload binary file ke storage
3. FE finalize file lewat endpoint takeover file dan menerima `file_id`
4. FE kirim `file_id` saat create/update takeover
5. Backend membuat attachment `ref_type = takeover`
6. 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:
1. minta upload intent
2. dapat `upload_intent_uuid`
3. dapat `upload_url`
#### Finalize file takeover
`POST /api/v1/file-manager/files/create-takeover-file`
Fungsi:
1. finalize file dari upload intent
2. membuat file manager file node
3. mengembalikan `file_id` untuk dipakai di takeover create/update
Endpoint ini tidak membuat `attachment` dan tidak membuat row `takeover_files`.
Catatan:
- `takeover_uuid` tidak wajib
- file boleh sementara tanpa parent takeover
- attachment takeover baru dibuat saat `POST /api/v1/takeovers/create` atau `PATCH /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:
```json
{
"data": [
{
"type": "file_manager_file_upload_intent",
"attributes": {
"name": "takeover-report.pdf",
"content_type": "application/pdf",
"size_bytes": 123456
}
}
]
}
```
Response akan mengembalikan:
1. `upload_intent_uuid`
2. `upload_url`
3. `method`
4. `required_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:
```json
{
"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:
```json
{
"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:
```json
{
"file_id": "019e8714-1111-7aaa-8bbb-222222222222"
}
```
Contoh payload:
```json
{
"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:
1. membuat takeover
2. membaca `file_id` dari `data.attributes.files[]`
3. create attachment dengan `ref_type = takeover`
4. menyimpan relasi ke `takeover_files`
Catatan kompatibilitas:
- item lama dengan `upload_intent_uuid` masih 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:
```json
{
"file_id": "019e8714-3333-7aaa-8bbb-444444444444"
}
```
Contoh:
```json
{
"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:
```json
{
"data": {
"type": "takeover_update",
"id": "019eed5d-36c2-72d9-acab-388b4e41a949",
"attributes": {
"files_remove": [
"019d7000-aaaa-7bbb-8ccc-222222222222"
]
}
}
}
```
Saat remove:
1. relasi `takeover_files` dihapus
2. attachment file-manager juga dihapus
3. file lifecycle ikut direconcile oleh file manager
### Mode 3. Replace semua file
Gunakan:
`files_replace`
Mode ini:
1. menghapus semua file lama dari takeover
2. menambahkan daftar file baru
Aturan:
1. `files_replace` tidak boleh digabung dengan `files`
2. `files_replace` tidak boleh digabung dengan `files_add`
3. `files_replace` tidak boleh digabung dengan `files_remove`
Contoh:
```json
{
"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:
1. `files_add`
2. `files_remove`
Contoh:
```json
{
"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:
1. `duty_date`
Field file:
1. `files[]` opsional
2. untuk flow baru, setiap item file berisi:
- `file_id`
Catatan:
- `upload_intent_uuid` + `name` masih bisa dipakai sebagai fallback lama
- untuk flow baru, gunakan `file_id` dari response `/create-takeover-file`
### Update takeover
Field file yang tersedia:
1. `files`
2. `files_add`
3. `files_remove`
4. `files_replace`
Aturan kombinasi:
1. `files_replace` eksklusif
2. `files` dan `files_add` diperlakukan sebagai add file baru
3. `files_remove` harus berisi UUID attachment yang masih terhubung ke takeover
## Response Takeover
Response takeover sekarang punya field:
`data.attributes.files`
Contoh item:
```json
{
"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:
1. `id`
- UUID relasi `takeover_file`
2. `file_attachment_id`
- UUID attachment file-manager
3. `file_name`
- nama file yang tersimpan
4. `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:
1. `id`
2. `file_attachment_id`
3. `file_name`
4. `download_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:
1. belum ada stream SSE takeover-file khusus
2. yang dipakai adalah stream file manager yang sudah eksisting
## Migration dan Struktur Database
Tabel baru:
`takeover_files`
Kolom:
1. `id`
2. `takeover_id`
3. `file_attachment_id`
Migration:
`migrations/20260622_create_takeover_files.sql`
## Best Practice Pemakaian
1. Finalize upload dulu lewat `/api/v1/file-manager/files/create-takeover-file`
2. Kalau takeover sudah ada, gunakan `PATCH /api/v1/takeovers/update/{id}`
3. Pakai `files_replace` hanya kalau memang ingin mengganti semua file
4. Pakai `files_add` dan `files_remove` kalau ingin perubahan parsial yang lebih aman
5. Untuk menghapus file, gunakan `file_attachment_id` dari response takeover
## Contoh Alur Yang Disarankan
### Create takeover baru dengan 1 file
1. request upload intent
2. upload binary ke storage
3. panggil `POST /api/v1/file-manager/files/create-takeover-file`
4. ambil `file_id` dari response
5. panggil `POST /api/v1/takeovers/create` dengan `files[].file_id`
### Update takeover dan tambah file baru
1. request upload intent
2. upload binary ke storage
3. panggil `POST /api/v1/file-manager/files/create-takeover-file`
4. ambil `file_id` dari response
5. panggil `PATCH /api/v1/takeovers/update/{id}` dengan `files_add[].file_id`
### Update takeover dan replace semua file
1. request upload intent baru untuk file pengganti
2. upload binary ke storage
3. panggil `POST /api/v1/file-manager/files/create-takeover-file`
4. ambil `file_id` dari response
5. panggil `PATCH /api/v1/takeovers/update/{id}` dengan `files_replace[].file_id`