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-701. 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-2782.
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-223. Table memperluas DoctrineTable dan menyusun dirinya dari array columns, indexes, foreign_keys, dan options src/Database/Schema/Table.php:10-394. Perbandingan skema dilakukan Table::diff yang membungkus Comparator::diffTable src/Database/Schema/Table.php:85-885.
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-426. 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-967.
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.⚠️
adddandeletesama-sama menjalankanmigratedengan--forcepada seluruh isi folderdatabase/migrations/badaso/, bukan hanya berkas yang baru dibuat. Migration lain yang belum dijalankan di folder itu akan ikut berjalan. Mekanisme yang sama dipakaimigratesrc/Controllers/BadasoDatabaseController.php:334-3528.
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-1659. Kedua berkas dihapus bila exit code bukan 0 src/Controllers/BadasoDatabaseController.php:184-19010.
delete membalik prosesnya: ia membaca SchemaManager::describeTable untuk merekonstruksi daftar kolom menjadi rows, lalu meminta generateBDOMigrationFile dengan prefix drop src/Controllers/BadasoDatabaseController.php:217-23311.
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-2412. 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-8713. DatabaseUpdater::update menolak tabel yang tidak ada dengan SchemaException::tableDoesNotExist src/Database/DatabaseUpdater.php:31-4414.
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.Protected table
Daftar tabel yang tidak boleh disentuh berasal dari config('badaso-hidden-tables', []) lewat Badaso::getProtectedTables() src/Badaso.php:278-28115. 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-2916. 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-4621.
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-1722. 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-9023. 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-10824.
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-2225.
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.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-4426. Postgresql membuang 14 nama tipe termasuk serial, bigserial, double precision, dan _varchar, sementara registerCustomTypeOptions dibiarkan kosong src/Database/Platforms/Postgresql.php:9-4027. Sqlite hanya membuang decimal dan double, lalu menjalankan unique() pada hasilnya src/Database/Platforms/Sqlite.php:9-1728.
| Platform | Tipe yang dibuang | Opsi khusus | Berkas |
|---|---|---|---|
Mysql | real, int, string, numeric | NOT_SUPPORTED untuk enum/set; NOT_SUPPORT_INDEX untuk *text/*blob; default dimatikan untuk *text, *blob, json | src/Database/Platforms/Mysql.php:10-4426 |
Postgresql | smallint, serial, serial4, int, integer, bigserial, serial8, bigint, decimal, float, real, double, double precision, boolean, _varchar, char, datetime, year | tidak ada | src/Database/Platforms/Postgresql.php:9-4027 |
Sqlite | decimal, double | tidak ada; hasil di-unique() | src/Database/Platforms/Sqlite.php:9-1728 |
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-2129. 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-4930. 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-10231, src/Database/Schema/Table.php:41-8332.
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-11733, src/Badaso.php:298-30134. Endpoint GET /database/type mengembalikan data itu src/Controllers/BadasoDatabaseController.php:379-38635.
Endpoint
| Method | Path | Handler | Permission |
|---|---|---|---|
GET | /database | browse | browse_database |
GET | /database/read | read | read_database |
PUT | /database/edit | edit | edit_database |
POST | /database/add | add | add_database |
DELETE | /database/delete | delete | delete_database |
POST | /database/rollback | rollback | rollback_database |
GET | /database/migration/browse | browseMigration | browse_migration |
GET | /database/migration/status | checkMigrateStatus | tanpa middleware permission |
GET | /database/migration/migrate | migrate | migrate_database |
POST | /database/migration/delete | deleteMigration | delete_migration |
GET | /database/type | getDbmsFieldType | add_database dan edit_database |
Seluruh route berada di grup prefix database src/Routes/api.php:214-22636. 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-33237.
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-37738.
⚠️
deleteMigrationmemakaiunlinklangsung tanpa memeriksa apakah berkas itu sudah tercatat di tabelmigrations. Menghapus berkas yang sudah dijalankan membuat status skema dan isi tabelmigrationstidak lagi cocok.
rollback hanya menerima parameter step bertipe numeric dan menjalankan migrate:rollback dengan --step serta --force src/Controllers/BadasoDatabaseController.php:264-29439. 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-7940, 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.