D
Engineering

Conventions

Konvensi kode Admin Dazo — UUID primary key, permission gate, duration parsing, dan pola lainnya.

Primary Key: UUID String

Semua model menggunakan UUID string sebagai primary key, di-generate di boot():

php
protected $keyType = 'string';
public $incrementing = false;

protected static function boot()
{
    parent::boot();
    static::creating(function ($model) {
        $model->id = (string) Str::uuid();
    });
}

Permission Gate Pattern

Setiap method di controller dimulai dengan permission check:

php
$user = auth()->guard('admin')->user();
$permission = findPermissionByName($user, '<permission name>');
if (!$permission || !$permission->read) {
    return redirect()->route('accessdenied');
}

Nama permission yang umum: list user, add user, list customer, add customer, list order, list payment, list device, list package, list withdraw, list coupon, list ticketing, list registration link, list covendor, list addon, list crm, list contact, list chat, list analytic, list transaction, list dashboard, list platform setting.

Duration Parsing

Package duration disimpan sebagai string "N Unit" dan di-parse dengan explode(' '):

php
$duration = explode(' ', $package->duration);
$d_value = (int) $duration[0];   // 1, 2, 3, ...
$d_satuan = $duration[1];         // "Month", "Year", "Day"

Env-Switched URLs

Service URLs dihardcode di constructor controller dengan pattern:

php
if (config('app.env') === 'production') {
    $this->url_dazo = 'https://app.dazo.id';
    $this->url_engine = 'https://engine.dazo.id';
} else {
    $this->url_dazo = 'http://localhost:8000';
    $this->url_engine = 'http://localhost:5002';
}

Tidak ada konfigurasi terpusat di .env untuk service URLs.

Date as String

Beberapa field tanggal disimpan sebagai string:

php
$store->expired_at = Carbon::now()->addMonths(1)->format('Y-m-d H:i');

Perbandingan dilakukan secara lexicographic:

php
if ($store->expired_at < now()->format('Y-m-d H:i')) { ... }

Controller Instantiation

Beberapa controller meng-instantiate controller lain secara langsung (bukan DI):

php
// OrderController.php
private $paymentController;

public function __construct()
{
    $this->paymentController = new PaymentController();
}

Ini anti-pattern — seharusnya extract ke service class.

MongoDB Raw Operations

Beberapa operasi menggunakan raw MongoDB:

php
// TicketingFeedbackController — $push
Ticket::raw(function ($collection) use ($id, $message) {
    return $collection->updateOne(
        ['_id' => $id],
        ['$push' => ['chat' => $message]]
    );
});

// AnalyticService — aggregation pipeline
User::raw(function ($collection) {
    return $collection->aggregate([
        ['$lookup' => [...]],
        ['$group' => [...]],
    ]);
});

Export Excel

Menggunakan Maatwebsite/Excel:

php
return Excel::download(new CustomersExport($customers), 'customers.xlsx');

Export classes di app/Exports/.