Files
BarangaySystem/app/Http/Controllers/Support/AnnouncementController.php
2026-06-06 18:43:00 +08:00

164 lines
5.1 KiB
PHP

<?php
declare(strict_types=1);
namespace App\Http\Controllers\Support;
use App\Enums\UserActions;
use App\Http\Controllers\Helpers\Permissions\UserPermissions;
use App\Http\Controllers\Helpers\ResponseHelper;
use App\Models\Announcement;
use Hypervel\Http\Request;
use Hypervel\Support\Facades\Auth;
use Hypervel\Support\Facades\Validator;
class AnnouncementController
{
/**
* Get active announcements for general use (e.g. home page)
*/
public function latest()
{
$announcements = Announcement::active()
->orderBy('created_at', 'desc')
->get();
return response()->json($announcements);
}
/**
* List all announcements (Admin view)
*/
public function index()
{
if (!UserPermissions::isActionPermitted(Auth::user()->acct_type, UserActions::ViewAllAnnouncements)) {
return ResponseHelper::returnUnauthorized();
}
$announcements = Announcement::orderBy('created_at', 'desc')->get();
return response()->json($announcements);
}
/**
* Store a new announcement
*/
public function store(Request $request)
{
if (!UserPermissions::isActionPermitted(Auth::user()->acct_type, UserActions::CreateAnnouncement)) {
return ResponseHelper::returnUnauthorized();
}
$validator = Validator::make($request->all(), [
'title' => 'required|string|max:255',
'content' => 'required|string',
'photo' => 'nullable|string',
'type' => 'required|string|in:info,success,warning,danger',
'is_active' => 'boolean',
'starts_at' => 'nullable|date',
'ends_at' => 'nullable|date',
]);
if ($validator->fails()) {
return response()->json(['success' => false, 'errors' => $validator->errors()], 422);
}
$data = $validator->validated();
$data['created_by'] = Auth::id();
// Convert boolean to integer for DB
$data['is_active'] = isset($data['is_active']) ? (bool)$data['is_active'] : true;
$announcement = Announcement::create($data);
return response()->json([
'success' => true,
'message' => 'Announcement created successfully',
'announcement' => $announcement
]);
}
/**
* Update an announcement
*/
public function update(Request $request)
{
if (!UserPermissions::isActionPermitted(Auth::user()->acct_type, UserActions::ModifyAnnouncement)) {
return ResponseHelper::returnUnauthorized();
}
$hash = $request->input('target');
$announcement = Announcement::where('hashkey', $hash)->first();
if (!$announcement) {
return response()->json(['success' => false, 'message' => 'Announcement not found'], 404);
}
$validator = Validator::make($request->all(), [
'title' => 'required|string|max:255',
'content' => 'required|string',
'photo' => 'nullable|string',
'type' => 'required|string|in:info,success,warning,danger',
'is_active' => 'boolean',
'starts_at' => 'nullable|date',
'ends_at' => 'nullable|date',
]);
if ($validator->fails()) {
return response()->json(['success' => false, 'errors' => $validator->errors()], 422);
}
$data = $validator->validated();
$data['is_active'] = isset($data['is_active']) ? (bool)$data['is_active'] : $announcement->is_active;
$announcement->update($data);
return response()->json([
'success' => true,
'message' => 'Announcement updated successfully',
'announcement' => $announcement
]);
}
/**
* Delete an announcement
*/
public function destroy(Request $request)
{
if (!UserPermissions::isActionPermitted(Auth::user()->acct_type, UserActions::DeleteAnnouncement)) {
return ResponseHelper::returnUnauthorized();
}
$hash = $request->input('target');
$announcement = Announcement::where('hashkey', $hash)->first();
if ($announcement) {
$announcement->delete();
}
return response()->json(['success' => true, 'message' => 'Announcement deleted']);
}
/**
* Toggle active status
*/
public function toggleStatus(Request $request)
{
if (!UserPermissions::isActionPermitted(Auth::user()->acct_type, UserActions::ModifyAnnouncement)) {
return ResponseHelper::returnUnauthorized();
}
$hash = $request->input('target');
$announcement = Announcement::where('hashkey', $hash)->first();
if (!$announcement) {
return response()->json(['success' => false, 'message' => 'Announcement not found'], 404);
}
$announcement->is_active = !$announcement->is_active;
$announcement->save();
return response()->json([
'success' => true,
'is_active' => $announcement->is_active,
'message' => 'Status updated'
]);
}
}