DONE: add portal setting endpoint for admin to update
This commit is contained in:
@@ -0,0 +1,28 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\API\v1\Admin\PortalSettings;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Models\PortalSetting;
|
||||
|
||||
class GetController extends Controller
|
||||
{
|
||||
public function __invoke()
|
||||
{
|
||||
$setting = PortalSetting::singleton();
|
||||
$defaults = PortalSetting::defaults();
|
||||
|
||||
return response()->json([
|
||||
'status' => 'success',
|
||||
'data' => [
|
||||
'home_mat_label' => $setting->home_mat_label ?? $defaults['home_mat_label'],
|
||||
'home_banner_image_path' => $setting->home_banner_image_path ?? $defaults['home_banner_image_path'],
|
||||
'zoom_meeting_label' => $setting->zoom_meeting_label ?? $defaults['zoom_meeting_label'],
|
||||
'zoom_subtitle' => $setting->zoom_subtitle ?? $defaults['zoom_subtitle'],
|
||||
'zoom_image_url' => $setting->zoom_image_url ?? $defaults['zoom_image_url'],
|
||||
'zoom_meeting_url' => $setting->zoom_meeting_url ?? $defaults['zoom_meeting_url'],
|
||||
],
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,50 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\API\v1\Admin\PortalSettings;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Models\PortalSetting;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
|
||||
class UpdateController extends Controller
|
||||
{
|
||||
public function __invoke(Request $request)
|
||||
{
|
||||
$setting = PortalSetting::singleton();
|
||||
|
||||
$validated = $request->validate([
|
||||
'home_mat_label' => 'nullable|string|max:255',
|
||||
'zoom_meeting_label' => 'nullable|string|max:255',
|
||||
'zoom_subtitle' => 'nullable|string|max:2000',
|
||||
'zoom_image_url' => 'nullable|string|max:2048',
|
||||
'zoom_meeting_url' => 'nullable|string|max:2048',
|
||||
'home_banner_image' => 'nullable|file|mimes:jpg,jpeg,png,webp|max:5120',
|
||||
]);
|
||||
|
||||
if ($request->hasFile('home_banner_image')) {
|
||||
$file = $request->file('home_banner_image');
|
||||
$ext = strtolower($file->getClientOriginalExtension() ?: 'jpg');
|
||||
$name = 'banner.' . $ext;
|
||||
$relativePath = 'portal/' . $name;
|
||||
Storage::disk('public')->putFileAs('portal', $file, $name);
|
||||
$validated['home_banner_image_path'] = '/storage/' . $relativePath;
|
||||
}
|
||||
|
||||
$setting->fill([
|
||||
'home_mat_label' => $validated['home_mat_label'] ?? $setting->home_mat_label,
|
||||
'home_banner_image_path' => $validated['home_banner_image_path'] ?? $setting->home_banner_image_path,
|
||||
'zoom_meeting_label' => $validated['zoom_meeting_label'] ?? $setting->zoom_meeting_label,
|
||||
'zoom_subtitle' => $validated['zoom_subtitle'] ?? $setting->zoom_subtitle,
|
||||
'zoom_image_url' => $validated['zoom_image_url'] ?? $setting->zoom_image_url,
|
||||
'zoom_meeting_url' => $validated['zoom_meeting_url'] ?? $setting->zoom_meeting_url,
|
||||
]);
|
||||
$setting->save();
|
||||
|
||||
return response()->json([
|
||||
'status' => 'success',
|
||||
'message' => 'Portal settings updated.',
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,28 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\API\v1\PortalSettings;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Models\PortalSetting;
|
||||
|
||||
class GetController extends Controller
|
||||
{
|
||||
public function __invoke()
|
||||
{
|
||||
$setting = PortalSetting::singleton();
|
||||
$defaults = PortalSetting::defaults();
|
||||
|
||||
return response()->json([
|
||||
'status' => 'success',
|
||||
'data' => [
|
||||
'home_mat_label' => $setting->home_mat_label ?? $defaults['home_mat_label'],
|
||||
'home_banner_image_path' => $setting->home_banner_image_path ?? $defaults['home_banner_image_path'],
|
||||
'zoom_meeting_label' => $setting->zoom_meeting_label ?? $defaults['zoom_meeting_label'],
|
||||
'zoom_subtitle' => $setting->zoom_subtitle ?? $defaults['zoom_subtitle'],
|
||||
'zoom_image_url' => $setting->zoom_image_url ?? $defaults['zoom_image_url'],
|
||||
'zoom_meeting_url' => $setting->zoom_meeting_url ?? $defaults['zoom_meeting_url'],
|
||||
],
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,45 @@
|
||||
<?php
|
||||
|
||||
namespace App\Models;
|
||||
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class PortalSetting extends Model
|
||||
{
|
||||
protected $table = 'portal_settings';
|
||||
|
||||
protected $fillable = [
|
||||
'home_mat_label',
|
||||
'home_banner_image_path',
|
||||
'zoom_meeting_label',
|
||||
'zoom_subtitle',
|
||||
'zoom_image_url',
|
||||
'zoom_meeting_url',
|
||||
];
|
||||
|
||||
public static function defaults(): array
|
||||
{
|
||||
return [
|
||||
'home_mat_label' => 'MAT KE-29',
|
||||
'home_banner_image_path' => '/images/banner.jpeg',
|
||||
'zoom_meeting_label' => 'KoPKB KALI KE-29/2025',
|
||||
'zoom_subtitle' => 'Sertai Mesyuarat Agung Tahunan KoPKB kali ke-29/2025 melalui pautan rasmi di bawah.',
|
||||
'zoom_image_url' => 'https://th.bing.com/th/id/OIP.TGLvYXfe4xq5MTZe4UnTDgHaEy?w=255&h=180&c=7&r=0&o=5&dpr=1.8&pid=1.7',
|
||||
'zoom_meeting_url' => 'https://meet.google.com/paa-tpck-ssq',
|
||||
];
|
||||
}
|
||||
|
||||
public static function singleton(): self
|
||||
{
|
||||
$defaults = static::defaults();
|
||||
|
||||
/** @var self $record */
|
||||
$record = static::query()->first();
|
||||
if ($record) {
|
||||
return $record;
|
||||
}
|
||||
|
||||
return static::query()->create($defaults);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user