Lompat ke konten
dokumentasi.id
Commit b472665
v1
Star1,3 rb

7

Database Management

Dashboard Badaso menyediakan pengelolaan tabel langsung dari panel admin. Seluruh operasi tabel bermuara pada BadasoDatabaseController, yang tidak mengeksekusi DDL sendiri melainkan menulis berkas migration lewat FileGenerator, lalu menjalankan php artisan migrate dengan --path tetap database/migrations/badaso/ dan --force bernilai true src/Controllers/BadasoDatabaseController.php:65-70. Pola ini berulang di setiap aksi: add, edit, delete, dan rollback memanggil Artisan::call('migrate', ...) atau Artisan::call('migrate:rollback', ...) dengan path yang sama src/Controllers/BadasoDatabaseController.php:274-278.

Lapisan skema berada di src/Database/Schema/. SchemaManager adalah kelas abstrak yang meneruskan panggilan statis ke Doctrine schema manager melalui __callStatic, sehingga describeTable, listTableDetails, dan getDoctrineForeignKeys semuanya membaca metadata dari Doctrine DBAL src/Database/Schema/SchemaManager.php:14-22. Table memperluas DoctrineTable dan menyusun dirinya dari array columns, indexes, foreign_keys, dan options src/Database/Schema/Table.php:10-39. Perbandingan skema dilakukan Table::diff yang membungkus Comparator::diffTable src/Database/Schema/Table.php:85-88.

Alur pembuatan tabel

Permintaan POST /database/add masuk ke BadasoDatabaseController@add. Validasi menolak nama tabel yang sudah ada di data_types maupun di database, dan menolak tabel yang termasuk protected table src/Controllers/BadasoDatabaseController.php:32-42. Setelah validasi lolos, generateBDOMigrationFile menulis berkas migration, Artisan::call menjalankannya, dan kegagalan memicu deleteMigrationFiles agar berkas yang gagal tidak tertinggal src/Controllers/BadasoDatabaseController.php:72-96.

sequenceDiagram
    participant UI as Dashboard
    participant C as BadasoDatabaseController
    participant FG as FileGenerator
    participant A as Artisan migrate
    participant DB as Database
    UI->>C: POST /database/add
    C->>C: validate table, rows, field_type
    C->>FG: generateBDOMigrationFile(table, create, rows)
    FG-->>C: file_name
    C->>A: migrate --path database/migrations/badaso/ --force
    A->>DB: CREATE TABLE
    alt exitCode 0
        C-->>UI: migration_success
    else gagal atau Exception
        C->>FG: deleteMigrationFiles(file_name)
        C-->>UI: migration_failed
    end
%% fig: Siklus satu request pembuatan tabel
%% desc: Controller menulis berkas migration lebih dulu, menjalankan migrate, lalu membersihkan berkas bila gagal.
Fig. 1: Siklus satu request pembuatan tabelController menulis berkas migration lebih dulu, menjalankan migrate, lalu membersihkan berkas bila gagal.

⚠️ add dan delete sama-sama menjalankan migrate dengan --force pada seluruh isi folder database/migrations/badaso/, bukan hanya berkas yang baru dibuat. Migration lain yang belum dijalankan di folder itu akan ikut berjalan. Mekanisme yang sama dipakai migrate src/Controllers/BadasoDatabaseController.php:334-352.

Mengubah dan menghapus tabel

edit menerima table.current_name, table.modified_name, fields.current_fields, dan fields.modified_fields. Bila ada kolom yang berubah, controller membuat berkas alter; bila nama tabel berubah, ia membuat berkas rename terpisah, sehingga $this->file_name menjadi array src/Controllers/BadasoDatabaseController.php:136-165. Kedua berkas dihapus bila exit code bukan 0 src/Controllers/BadasoDatabaseController.php:184-190.

delete membalik prosesnya: ia membaca SchemaManager::describeTable untuk merekonstruksi daftar kolom menjadi rows, lalu meminta generateBDOMigrationFile dengan prefix drop src/Controllers/BadasoDatabaseController.php:217-233.

DatabaseUpdater menyediakan jalur pembaruan berbasis objek tanpa menulis berkas migration. Konstruktornya mendaftarkan tipe kustom lewat Type::registerCustomPlatformTypes(), membangun Table::make($table_array), dan mengambil detail tabel lama dari SchemaManager::listTableDetails($table_array['old_name']) src/Database/DatabaseUpdater.php:17-24. updateTable menangani tiga hal berurutan: rename tabel (dengan cek tableAlreadyExists), rename kolom lewat getRenamedColumnsDiff, lalu diff sisa perubahan dan SchemaManager::alterTable src/Database/DatabaseUpdater.php:51-87. DatabaseUpdater::update menolak tabel yang tidak ada dengan SchemaException::tableDoesNotExist src/Database/DatabaseUpdater.php:31-44.

stateDiagram-v2
    [*] --> Validasi
    Validasi --> Gagal: table_not_found / table_already_exists
    Validasi --> TulisMigration: lolos
    TulisMigration --> Migrate: berkas dibuat
    Migrate --> Sukses: exitCode 0
    Migrate --> Bersihkan: exitCode != 0
    Bersihkan --> Gagal: deleteMigrationFiles
    Sukses --> [*]
    Gagal --> [*]
    style Sukses fill:#2d7d46,color:#fff
    style Gagal fill:#dc2626,color:#fff
    style TulisMigration fill:#f59e0b,color:#000
    style Migrate fill:#336791,color:#fff
%% fig: Keadaan satu operasi skema
%% desc: Setiap aksi melewati validasi, penulisan berkas migration, eksekusi migrate, dan pembersihan berkas saat gagal.
Fig. 2: Keadaan satu operasi skemaSetiap aksi melewati validasi, penulisan berkas migration, eksekusi migrate, dan pembersihan berkas saat gagal.

Protected table

Daftar tabel yang tidak boleh disentuh berasal dari config('badaso-hidden-tables', []) lewat Badaso::getProtectedTables() src/Badaso.php:278-281. Berkas konfigurasinya memuat 16 tabel bawaan Badaso yang memakai prefix env('BADASO_TABLE_PREFIX', 'badaso_') ditambah 6 tabel bawaan Laravel seperti migrations, activity_log, dan users src/Config/badaso-hidden-tables.php:1-29. Aturan Rule::notIn(Badaso::getProtectedTables()) dipasang pada add, read, edit (untuk kedua nama tabel), dan delete src/Controllers/BadasoDatabaseController.php:41, src/Controllers/BadasoDatabaseController.php:110, src/Controllers/BadasoDatabaseController.php:144-148, src/Controllers/BadasoDatabaseController.php:213.

HiddenTableConfig mengubah berkas konfigurasi itu saat runtime: addHiddenTable menambahkan entri bila belum ada, deleteHiddenTable menyaring entri, dan saveHiddenTable menulis ulang berkas dengan VarExporter::export src/Helpers/HiddenTableConfig.php:18-46.

Pemetaan tipe antar platform

Type memperluas DoctrineType dan menyimpan lima properti statis: $custom_type_registered, $platform_type_mapping, $all_types, $platform_types, dan $custom_type_options src/Database/Types/Type.php:10-17. registerCustomPlatformTypes mengambil nama platform dari koneksi, mengubahnya dengan ucfirst, lalu menggabungkan tipe kustom dari folder Common dan folder platform terkait src/Database/Types/Type.php:78-90. Setiap tipe kustom yang belum terdaftar ditambahkan dengan addType, yang sudah ada ditimpa dengan overrideType, lalu dipetakan lewat registerDoctrineTypeMapping src/Database/Types/Type.php:92-108.

Pemilihan implementasi platform dilakukan Platform::getPlatform, yang membentuk nama kelas dari ucfirst($platform_name) dan melempar "Platform {$platform_name} doesn't exist" bila kelasnya tidak ada src/Database/Platforms/Platform.php:13-22.

flowchart TD
    C[Type::registerCustomPlatformTypes] --> P[SchemaManager::getDatabasePlatform]
    P --> N[Platform::getPlatform ucfirst]
    N --> M[Mysql]
    N --> PG[Postgresql]
    N --> S[Sqlite]
    M --> M1["forget: real, int, string, numeric"]
    M --> M2["NOT_SUPPORTED: enum, set"]
    M --> M3["NOT_SUPPORT_INDEX: *text, *blob"]
    PG --> PG1["forget: smallint, serial, bigint, decimal, float, boolean, datetime, year"]
    S --> S1["forget: decimal, double"]
    S --> S2["unique()"]
    M1 --> R[registerDoctrineTypeMapping]
    M2 --> R
    M3 --> R
    PG1 --> R
    S1 --> R
    S2 --> R
    style M fill:#336791,color:#fff
    style PG fill:#336791,color:#fff
    style S fill:#336791,color:#fff
    style R fill:#8b5cf6,color:#fff
    style N fill:#f59e0b,color:#000
%% fig: Cabang pemetaan tipe per platform
%% desc: Setiap platform menyaring type mapping Doctrine dengan aturan berbeda sebelum tipe kustom didaftarkan.
Fig. 3: Cabang pemetaan tipe per platformSetiap platform menyaring type mapping Doctrine dengan aturan berbeda sebelum tipe kustom didaftarkan.

Ketiga kelas platform memperlakukan type mapping secara berbeda. Mysql membuang real, int, string, dan numeric karena dianggap duplikat, menandai enum dan set sebagai NOT_SUPPORTED, menonaktifkan index untuk semua tipe *text dan *blob, serta mematikan opsi default untuk *text, *blob, dan json src/Database/Platforms/Mysql.php:10-44. Postgresql membuang 14 nama tipe termasuk serial, bigserial, double precision, dan _varchar, sementara registerCustomTypeOptions dibiarkan kosong src/Database/Platforms/Postgresql.php:9-40. Sqlite hanya membuang decimal dan double, lalu menjalankan unique() pada hasilnya src/Database/Platforms/Sqlite.php:9-17.

PlatformTipe yang dibuangOpsi khususBerkas
Mysqlreal, int, string, numericNOT_SUPPORTED untuk enum/set; NOT_SUPPORT_INDEX untuk *text/*blob; default dimatikan untuk *text, *blob, jsonsrc/Database/Platforms/Mysql.php:10-44
Postgresqlsmallint, serial, serial4, int, integer, bigserial, serial8, bigint, decimal, float, real, double, double precision, boolean, _varchar, char, datetime, yeartidak adasrc/Database/Platforms/Postgresql.php:9-40
Sqlitedecimal, doubletidak ada; hasil di-unique()src/Database/Platforms/Sqlite.php:9-17

Bentuk kolom dan daftar tipe di UI

Column::make memvalidasi nama kolom dengan Identifier::validate, mengambil tipe dari DoctrineType::getType(trim($type['name'])), dan memakai array_diff_key untuk memisahkan opsi dari name dan type src/Database/Schema/Column.php:11-21. Column::toArray menormalkan hasilnya: old_name disamakan dengan name, null menjadi string YES/NO dari notnull, dan extra diisi auto_increment bila kolom autoincrement src/Database/Schema/Column.php:26-49. SchemaManager::describeTable menambahkan field, mengubah type menjadi nama tipe saja, lalu mengisi indexes dan key dari tiga huruf pertama tipe index dengan prioritas PRI > UNI > IND src/Database/Schema/SchemaManager.php:73-102, src/Database/Schema/Table.php:41-83.

Daftar tipe yang ditampilkan ke form berasal dari Badaso::getBadasoDbmsFieldType(), yang mengembalikan string JSON berisi grup seperti Frequently used dan Numeric dengan pasangan label/value seperti integer, varchar, text, dan date src/Badaso.php:95-117, src/Badaso.php:298-301. Endpoint GET /database/type mengembalikan data itu src/Controllers/BadasoDatabaseController.php:379-386.

Endpoint

MethodPathHandlerPermission
GET/databasebrowsebrowse_database
GET/database/readreadread_database
PUT/database/editeditedit_database
POST/database/addaddadd_database
DELETE/database/deletedeletedelete_database
POST/database/rollbackrollbackrollback_database
GET/database/migration/browsebrowseMigrationbrowse_migration
GET/database/migration/statuscheckMigrateStatustanpa middleware permission
GET/database/migration/migratemigratemigrate_database
POST/database/migration/deletedeleteMigrationdelete_migration
GET/database/typegetDbmsFieldTypeadd_database dan edit_database

Seluruh route berada di grup prefix database src/Routes/api.php:214-226. Nama permission mengikuti pola config('badaso.middleware.check_permission'), sehingga detail pemeriksaannya dibahas di Manajemen User, Role, dan Permission.

Migration yang belum dijalankan

checkMigrateStatus membaca seluruh baris Migration, mengumpulkan nama berkas database/migrations/badaso/*.php menjadi array tanpa ekstensi .php, lalu menghitung array_diff terhadap nama migration yang tercatat. Hasilnya dikirim sebagai data beserta flag notMigrated src/Controllers/BadasoDatabaseController.php:307-332.

deleteMigration menghapus berkas lewat unlink pada path database_path('migrations/badaso/') yang digabung dengan file_name dari request, lalu mencatat activity deleted src/Controllers/BadasoDatabaseController.php:354-377.

⚠️ deleteMigration memakai unlink langsung tanpa memeriksa apakah berkas itu sudah tercatat di tabel migrations. Menghapus berkas yang sudah dijalankan membuat status skema dan isi tabel migrations tidak lagi cocok.

rollback hanya menerima parameter step bertipe numeric dan menjalankan migrate:rollback dengan --step serta --force src/Controllers/BadasoDatabaseController.php:264-294. Setiap aksi add, edit, delete, rollback, dan deleteMigration menulis activity log dengan event masing-masing created, updated, deleted, rollback, dan deleted src/Controllers/BadasoDatabaseController.php:75-79, src/Controllers/BadasoDatabaseController.php:175-182, src/Controllers/BadasoDatabaseController.php:243-246, src/Controllers/BadasoDatabaseController.php:283-286. Pencatatan activity log dibahas lebih lanjut di Media, Notifikasi, dan Activity Log.

Tabel hasil pembuatan dari halaman ini kemudian dipakai untuk membangun CRUD; lihat CRUD Generator dan Content Manager.