136 lines
4.1 KiB
PHP
136 lines
4.1 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Tenant;
|
|
|
|
use App\Http\Controllers\ApiController;
|
|
use App\Http\Requests\Tenant\IndexTenantRequest;
|
|
use App\Http\Requests\Tenant\StoreTenantRequest;
|
|
use App\Http\Requests\Tenant\UpdateTenantRequest;
|
|
use App\Http\Resources\Tenant\TenantResource;
|
|
use App\Models\Tenant;
|
|
use App\Services\Tenant\TenantService;
|
|
use Illuminate\Http\Request;
|
|
use App\Models\TenantInstallationSetting;
|
|
use Illuminate\Validation\Rule;
|
|
|
|
class TenantController extends ApiController
|
|
{
|
|
public function __construct(
|
|
protected TenantService $service
|
|
) {}
|
|
|
|
public function index(IndexTenantRequest $request)
|
|
{
|
|
$data = $this->service->list(
|
|
$request->validated(),
|
|
$request->user()
|
|
);
|
|
|
|
return $this->successPaginated(
|
|
$data,
|
|
TenantResource::class,
|
|
'Data Tenant berhasil diambil'
|
|
);
|
|
}
|
|
|
|
public function store(StoreTenantRequest $request)
|
|
{
|
|
$data = $this->service->create(
|
|
$request->validated()
|
|
);
|
|
|
|
return $this->created(
|
|
new TenantResource($data),
|
|
'Tenant berhasil dibuat'
|
|
);
|
|
}
|
|
|
|
public function show(Request $request, Tenant $tenant)
|
|
{
|
|
$this->authorizeTenantAccess($request, $tenant);
|
|
|
|
return $this->success(
|
|
new TenantResource($tenant),
|
|
'Detail Tenant berhasil diambil'
|
|
);
|
|
}
|
|
|
|
public function update(
|
|
UpdateTenantRequest $request,
|
|
Tenant $tenant
|
|
) {
|
|
$data = $this->service->update(
|
|
$tenant,
|
|
$request->validated()
|
|
);
|
|
|
|
return $this->updated(
|
|
new TenantResource($data),
|
|
'Tenant berhasil diupdate'
|
|
);
|
|
}
|
|
|
|
public function destroy(Tenant $tenant)
|
|
{
|
|
$this->service->delete($tenant);
|
|
|
|
return $this->deleted(
|
|
'Tenant berhasil dihapus'
|
|
);
|
|
}
|
|
|
|
private function authorizeTenantAccess(Request $request, Tenant $tenant): void
|
|
{
|
|
$user = $request->user();
|
|
|
|
if ($user->isMasterAdmin()) {
|
|
return;
|
|
}
|
|
|
|
abort_unless(
|
|
$user->userTenants()->where('tenant_id', $tenant->id)->exists(),
|
|
403
|
|
);
|
|
}
|
|
public function installationSetting(Request $request, Tenant $tenant)
|
|
{
|
|
$this->authorizeTenantAccess($request, $tenant);
|
|
$setting = TenantInstallationSetting::firstOrCreate(['tenant_id' => $tenant->id], ['activation_mode' => 'list_order']);
|
|
|
|
return $this->success([
|
|
...$setting->toArray(),
|
|
'tenant' => new TenantResource($tenant),
|
|
'ocr_api_key_configured' => filled($setting->ocr_api_key),
|
|
'can_manage_ocr' => $request->user()->isMasterAdmin(),
|
|
]);
|
|
}
|
|
|
|
public function updateInstallationSetting(Request $request, Tenant $tenant)
|
|
{
|
|
$this->authorizeTenantAccess($request, $tenant);
|
|
$rules = ['activation_mode' => ['required', Rule::in(['list_order', 'ticket'])]];
|
|
if ($request->user()->isMasterAdmin()) {
|
|
$rules += [
|
|
'ktp_ocr_enabled' => ['required', 'boolean'],
|
|
'ocr_provider' => ['nullable', 'required_if:ktp_ocr_enabled,true', Rule::in(['gemini', 'openai'])],
|
|
'ocr_api_key' => ['nullable', 'string', 'max:4096'],
|
|
'clear_ocr_api_key' => ['nullable', 'boolean'],
|
|
];
|
|
}
|
|
$data = $request->validate($rules);
|
|
$setting = TenantInstallationSetting::firstOrCreate(['tenant_id' => $tenant->id], ['activation_mode' => 'list_order']);
|
|
if ($request->user()->isMasterAdmin()) {
|
|
if (! empty($data['clear_ocr_api_key'])) $data['ocr_api_key'] = null;
|
|
elseif (blank($data['ocr_api_key'] ?? null)) unset($data['ocr_api_key']);
|
|
unset($data['clear_ocr_api_key']);
|
|
}
|
|
$setting->update($data);
|
|
|
|
return $this->updated([
|
|
...$setting->fresh()->toArray(),
|
|
'ocr_api_key_configured' => filled($setting->fresh()->ocr_api_key),
|
|
'can_manage_ocr' => $request->user()->isMasterAdmin(),
|
|
], 'Setting tenant berhasil disimpan');
|
|
}
|
|
}
|