Skip to content
Snippets Groups Projects
NotificationController.php 2.98 KiB
Newer Older
  • Learn to ignore specific revisions
  • <?php
    
    declare(strict_types=1);
    
    /**
     * @copyright  2020 Ad Aures
     * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
     * @link       https://castopod.org/
     */
    
    namespace Modules\Admin\Controllers;
    
    use App\Entities\Podcast;
    use App\Models\PodcastModel;
    use CodeIgniter\Exceptions\PageNotFoundException;
    use CodeIgniter\HTTP\RedirectResponse;
    use CodeIgniter\I18n\Time;
    
    use Modules\Fediverse\Entities\Notification;
    use Modules\Fediverse\Models\NotificationModel;
    
    use Modules\Fediverse\Models\PostModel;
    
    class NotificationController extends BaseController
    {
        protected Podcast $podcast;
    
        protected Notification $notification;
    
        public function _remap(string $method, string ...$params): mixed
        {
    
            if ($params === []) {
                throw PageNotFoundException::forPageNotFound();
            }
    
    
                ! ($podcast = (new PodcastModel())->getPodcastById((int) $params[0])) instanceof Podcast
    
            ) {
                throw PageNotFoundException::forPageNotFound();
            }
    
    
    
            if (count($params) > 1) {
                if (
    
                    ! ($notification = (new NotificationModel())->find($params[1])) instanceof Notification
    
                ) {
                    throw PageNotFoundException::forPageNotFound();
                }
    
    
            }
    
            return $this->{$method}(...$params);
        }
    
    
        public function list(Podcast $podcast): string
    
            $notifications = (new NotificationModel())->where('target_actor_id', $podcast->actor_id)
    
                ->orderBy('created_at', 'desc');
    
            $data = [
    
                'notifications' => $notifications->paginate(10),
    
                'pager'         => $notifications->pager,
    
            $this->setHtmlHead(lang('Notifications.title'));
    
            replace_breadcrumb_params([
    
            ]);
            return view('podcast/notifications', $data);
        }
    
    
        public function markAllAsReadAction(Podcast $podcast): RedirectResponse
    
            $notifications = (new NotificationModel())->where('target_actor_id', $podcast->actor_id)
    
                ->where('read_at', null)
                ->findAll();
    
            foreach ($notifications as $notification) {
                $notification->read_at = new Time('now');
                (new NotificationModel())->update($notification->id, $notification);
            }
    
            return redirect()->back();
        }
    
    
        public function markAsReadAction(Podcast $podcast, Notification $notification): RedirectResponse
        {
            $notification->read_at = new Time('now');
            $notificationModel = new NotificationModel();
            $notificationModel->update($notification->id, $notification);
    
            if ($notification->post_id === null) {
                return redirect()->route('podcast-activity', [esc($podcast->handle)]);
            }
    
            $post = (new PostModel())->getPostById($notification->post_id);
    
            return redirect()->route('post', [$podcast->handle, $post->id]);
        }