railpage/railpagecore

View on GitHub
lib/SiteMessages/SiteMessages.php

Summary

Maintainability
A
2 hrs
Test Coverage
<?php
    /**
     * Messages class
     * @author Michael Greenhill
     * @package Railpage
     * @copyright Copyright (c) 2011, Michael Greenhill
     * @since Version 3.9
     */
     
    namespace Railpage\SiteMessages;
    
    use Railpage\AppCore;
    use Railpage\Users\User;
    use Exception;
    use DateTime;
    
    class SiteMessages extends AppCore {
        
        /**
         * Yield the list of available messages
         * @since Version 3.9
         * @yield \Railpage\SiteMessage\Message
         * @return \Railpage\SiteMessage\Message
         */
        
        public function yieldMessages() {
            $query = "SELECT message_id FROM messages";
            
            foreach ($this->db->fetchAll($query) as $row) {
                yield new SiteMessage($row['message_id']);
            }
        }
        
        /**
         * Get the latest message from the database
         * @return \Railpage\SiteMessages\SiteMessage
         * @since Version 3.9
         */
        
        public function getLatest() {
            $query = "SELECT message_id FROM messages WHERE message_active = 1 AND (date_start = '0000-00-00' OR (date_start <= ? AND date_end >= ?)) %s AND target_user = 0";
            
            $where = array(
                date("Y-m-d"),
                date("Y-m-d")
            );
            
            if ($this->User instanceof User) {
                $user_list = " AND message_id NOT IN (SELECT message_id FROM messages_viewed WHERE user_id = ?)";
                $where[] = $this->User->id;
                
                // Fetch any targeted messages
                $query .= " UNION SELECT message_id FROM messages WHERE target_user = ? AND message_active = 1 AND message_id NOT IN (SELECT message_id FROM messages_viewed WHERE user_id = ?)"; 
                $where[] = $this->User->id;
                $where[] = $this->User->id;
            } else {
                $user_list = "";
            }
            
            $query .= " ORDER BY message_id DESC LIMIT 1";
            
            $query = sprintf($query, $user_list);
            
            $id = $this->db->fetchOne($query, $where);
            
            if (filter_var($id, FILTER_VALIDATE_INT)) {
                return new SiteMessage($id);
            } else {
                return false;
            }
        }
        
        /**
         * Find a site message matching a given object namespace and object ID
         * @since Version 3.9.1
         * @param object $Object
         * @return \Railpgae\SiteMessages\SiteMessage | boolean
         */
        
        public function getMessageForObject($Object = false) {
            if (!is_object($Object)) {
                throw new Exception("You did not provide an object");
            } 
            
            if (!isset($Object->Module) || !isset($Object->Module->namespace)) {
                throw new Exception("Object does not have a namespace to lookup");
            }
            
            if (!isset($Object->id) || !filter_var($Object->id, FILTER_VALIDATE_INT) || $Object->id === 0) {
                throw new Exception("Object does not have a valid ID to lookup");
            }
            
            $params = array(
                $Object->Module->namespace,
                $Object->id
            );
            
            $query = "SELECT message_id FROM messages WHERE object_ns = ? AND object_id = ? LIMIT 1";
            
            if ($id = $this->db->fetchOne($query, $params)) {
                return new SiteMessage($id); 
            } else {
                return false;
            }
        }
    }