# 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`
