File manager - Edit - /home/webapp69.cm.in.th/u69319090028/Shop/app/Services/AnnouncementService.php
Back
<?php /** * AnnouncementService * Handles Announcement lifecycle, audience/placement matching, and audit tracking */ require_once __DIR__ . '/../Models/Announcement.php'; require_once __DIR__ . '/../Models/ActivityLog.php'; class AnnouncementService { private Announcement $announcementModel; private ActivityLog $activityLog; public function __construct() { $this->announcementModel = new Announcement(); $this->activityLog = new ActivityLog(); } public function getAdminAnnouncements(array $filters = [], int $page = 1, int $perPage = 20): array { $page = max(1, $page); $offset = ($page - 1) * $perPage; $total = $this->announcementModel->countAdminAnnouncements($filters); $announcements = $this->announcementModel->getAdminAnnouncements($filters, $perPage, $offset); return [ 'announcements' => $announcements, 'total' => $total, 'page' => $page, 'pages' => ceil($total / $perPage), 'filters' => $filters ]; } public function getAnnouncementDetail(int $id): ?array { return $this->announcementModel->findById($id); } public function createAnnouncement(array $data, int $adminId): array { $title = trim($data['title'] ?? ''); $content = trim($data['content'] ?? ''); $targetAudience = in_array($data['target_audience'] ?? '', ['customer', 'seller', 'all']) ? $data['target_audience'] : 'all'; $placement = in_array($data['display_location'] ?? '', ['homepage', 'product_page', 'user_dashboard', 'seller_dashboard', 'seller_product_page', 'global_top_bar']) ? $data['display_location'] : 'global_top_bar'; $priority = in_array($data['priority'] ?? '', ['normal', 'important', 'critical']) ? $data['priority'] : 'normal'; $status = in_array($data['status'] ?? '', ['draft', 'scheduled', 'active', 'disabled']) ? $data['status'] : 'draft'; $startAt = !empty($data['start_at']) ? date('Y-m-d H:i:s', strtotime($data['start_at'])) : null; $endAt = !empty($data['end_at']) ? date('Y-m-d H:i:s', strtotime($data['end_at'])) : null; if (empty($title) || mb_strlen($title) < 3) { return ['success' => false, 'message' => 'หัวข้อประกาศต้องมีความยาวอย่างน้อย 3 ตัวอักษร']; } if (empty($content)) { return ['success' => false, 'message' => 'กรุณากรอกเนื้อหาประกาศ']; } if ($startAt && $endAt && strtotime($startAt) > strtotime($endAt)) { return ['success' => false, 'message' => 'วันเริ่มต้นต้องอยู่ก่อนวันสิ้นสุด']; } // Auto transition to active if start_at is past/now and status is scheduled/active if ($status === 'scheduled' && $startAt && strtotime($startAt) <= time()) { $status = 'active'; } $insertData = [ 'title' => $title, 'content' => $content, 'target_audience' => $targetAudience, 'display_location' => $placement, 'priority' => $priority, 'status' => $status, 'start_at' => $startAt, 'end_at' => $endAt, 'view_count' => 0, 'click_count' => 0 ]; $id = $this->announcementModel->createAnnouncement($insertData, $adminId); $this->activityLog->record($adminId, 'announcement_created', 'announcement', $id, "Created announcement {$title}"); return [ 'success' => true, 'message' => 'สร้างประกาศใหม่เรียบร้อยแล้ว', 'announcement_id' => $id ]; } public function updateAnnouncement(int $id, array $data, int $adminId): array { $ann = $this->announcementModel->findById($id); if (!$ann) { return ['success' => false, 'message' => 'ไม่พบข้อมูลประกาศ']; } $title = trim($data['title'] ?? $ann['title']); $content = trim($data['content'] ?? $ann['content']); $targetAudience = in_array($data['target_audience'] ?? '', ['customer', 'seller', 'all']) ? $data['target_audience'] : $ann['target_audience']; $placement = in_array($data['display_location'] ?? '', ['homepage', 'product_page', 'user_dashboard', 'seller_dashboard', 'seller_product_page', 'global_top_bar']) ? $data['display_location'] : $ann['display_location']; $priority = in_array($data['priority'] ?? '', ['normal', 'important', 'critical']) ? $data['priority'] : $ann['priority']; $status = in_array($data['status'] ?? '', ['draft', 'scheduled', 'active', 'disabled', 'expired']) ? $data['status'] : $ann['status']; $startAt = !empty($data['start_at']) ? date('Y-m-d H:i:s', strtotime($data['start_at'])) : null; $endAt = !empty($data['end_at']) ? date('Y-m-d H:i:s', strtotime($data['end_at'])) : null; if (empty($title) || mb_strlen($title) < 3) { return ['success' => false, 'message' => 'หัวข้อประกาศต้องมีความยาวอย่างน้อย 3 ตัวอักษร']; } if (empty($content)) { return ['success' => false, 'message' => 'กรุณากรอกเนื้อหาประกาศ']; } if ($startAt && $endAt && strtotime($startAt) > strtotime($endAt)) { return ['success' => false, 'message' => 'วันเริ่มต้นต้องอยู่ก่อนวันสิ้นสุด']; } $updateData = [ 'title' => $title, 'content' => $content, 'target_audience' => $targetAudience, 'display_location' => $placement, 'priority' => $priority, 'status' => $status, 'start_at' => $startAt, 'end_at' => $endAt ]; $this->announcementModel->updateAnnouncement($id, $updateData, $adminId); $this->activityLog->record($adminId, 'announcement_updated', 'announcement', $id, "Updated announcement #{$id}"); return [ 'success' => true, 'message' => 'บันทึกการแก้ไขประกาศเรียบร้อยแล้ว' ]; } public function toggleStatus(int $id, int $adminId): array { $newStatus = $this->announcementModel->toggleStatus($id, $adminId); if ($newStatus === 'not_found') { return ['success' => false, 'message' => 'ไม่พบข้อมูลประกาศ']; } $statusLabel = ($newStatus === 'active') ? 'เปิดเผยแพร่ประกาศแล้ว' : 'หยุดเผยแพร่ประกาศชั่วคราวแล้ว'; return [ 'success' => true, 'new_status' => $newStatus, 'message' => $statusLabel ]; } public function deleteAnnouncement(int $id, int $adminId): array { $success = $this->announcementModel->softDeleteAnnouncement($id, $adminId); if (!$success) { return ['success' => false, 'message' => 'ไม่สามารถลบประกาศได้']; } return [ 'success' => true, 'message' => 'ลบประกาศเรียบร้อยแล้ว' ]; } public function getHistory(int $id): array { return $this->announcementModel->getHistory($id); } public function getPlacements(string $location, string $role = 'all'): array { $announcements = $this->announcementModel->getActiveAnnouncements($location, $role); foreach ($announcements as $ann) { $this->announcementModel->incrementViewCount((int)$ann['id']); } return $announcements; } public function trackClick(int $id): void { $this->announcementModel->incrementClickCount($id); } }
| ver. 1.4 |
Github
|
.
| PHP 7.4.33 | Generation time: 0.24 |
proxy
|
phpinfo
|
Settings