railpage/railpagecore

View on GitHub
lib/Newsletters/Newsletters.php

Summary

Maintainability
B
4 hrs
Test Coverage
<?php
    /**
     * Newsletter
     * @since Version 3.9.1
     * @package Railpage
     * @author Michael Greenhill
     */
    
    namespace Railpage\Newsletters;
    
    use Exception;
    use InvalidArgumentException;
    use DateTime;
    use Railpage\Url;
    use Railpage\AppCore;
    use Railpage\Module;
    use Railpage\Users\User;
    use Railpage\Notifications\Notification;
    use Railpage\Notifications\Transport\Email;
    use ReflectionClass;
    
    /**
     * Newsletters
     */
    
    class Newsletters extends AppCore {
        
        /**
         * Newsletter: daily
         * @since Version 3.10.0
         * @const string NEWSLETTER_DAILY
         */
        
        const NEWSLETTER_DAILY = "daily";
        
        /**
         * Newsletter: weekly
         * @since Version 3.10.0
         * @const string NEWSLETTER_WEEKLY
         */
        
        const NEWSLETTER_WEEKLY = "weekly";
        
        /**
         * Newsletter: monthly
         * @since Version 3.10.0
         * @const string NEWSLETTER_MONTHLY
         */
        
        const NEWSLETTER_MONTHLY = "monthly";
        
        /**
         * Get available templates
         * @since Version 3.9.1
         * @return array
         */
        
        public function getTemplates() {
            return $this->db->fetchAll("SELECT * FROM newsletter_templates");
        }
        
        /**
         * Get a single template
         * @since Version 3.9.1
         * @return array
         */
        
        public function getTemplate($id = false) {
            if (!filter_var($id, FILTER_VALIDATE_INT)) {
                throw new Exception("Cannnot fetch template from the database - invalid template ID specified");
            }
            
            return $this->db->fetchRow("SELECT * FROM newsletter_templates WHERE id = ?", $id);
        }
        
        /**
         * Get newsletters
         * @since Version 3.9.1
         * @return array
         */
        
        public function getNewsletters() {
            $return = array(); 
            
            foreach ($this->db->fetchAll("SELECT * FROM newsletter") as $row) {
                $Newsletter = new Newsletter($row['id']); 
                $return[] = $Newsletter->getArray(); 
            }
            
            return $return;
        }
        
        /**
         * Subscribe a user to a newsletter
         * @since Version 3.10.0
         * @param \Railpage\Users\User $User
         * @param string $newsletter
         * @return \Railpage\Newsletters\Newsletters
         */
        
        public function subscribeUser(User $User, $newsletter) {
            
            $this->changeSubscription($User, $newsletter, 1); 
            
            return $this;
            
        }
        
        /**
         * Unsubscribe a user from a newsletter
         * @since Version 3.10.0
         * @param \Railpage\Users\User $User
         * @param string $newsletter
         * @return \Railpage\Newsletters\Newsletters
         */
        
        public function unSubscribeUser(User $User, $newsletter) {
            
            $this->changeSubscription($User, $newsletter, 0); 
            
            return $this;
            
        }
        
        /**
         * Change the newsleter subscription status
         * @since Version 3.10.0
         * @param \Railpage\Users\User $User
         * @param string $newsletter
         * @return void
         */
        
        private function changeSubscription(User $User, $newsletter, $value) {
            
            if (!filter_var($User->id, FILTER_VALIDATE_INT)) {
                throw new InvalidArgumentException("The provided user is invalid - no user ID"); 
            }
            
            $r = new ReflectionClass(__CLASS__);
            
            if (strpos($newsletter, "newsletter_") === false) {
                $newsletter = "newsletter_" . $newsletter;
            }
            
            $newsletter = strtoupper($newsletter); 
            $column = strtolower($newsletter); 
            
            if (!$r->getConstant($newsletter)) {
                throw new InvalidArgumentException("The provided newsletter " . $newsletter . " is not a valid class constant"); 
            }
            
            $query = "INSERT INTO nuke_users_flags (user_id, " . $column . ") VALUES(" . $User->id . ", " . $value . ") ON DUPLICATE KEY UPDATE " . $column . " = VALUES(" . $column . ")";
            
            $this->db->query($query); 
            
        }
        
        /**
         * Get the subscription statuses for a given user
         * @since Version 3.10.0
         * @param \Railpage\Users\User $User
         * @return array
         */
        
        public static function getSubscriptionFlags(User $User) {
            
            $Database = AppCore::GetDatabase(); 
            
            $query = "SELECT COALESCE(newsletter_daily, 1) AS newsletter_daily,
                             COALESCE(newsletter_weekly, 1) AS newsletter_weekly,
                             COALESCE(newsletter_monthly, 1) AS newsletter_monthly,
                             COALESCE(notify_photocomp, 1) AS notify_photocomp,
                             COALESCE(notify_pm, 1) AS notify_pm,
                             COALESCE(notify_forums, 1) AS notify_forums
                      FROM nuke_users_flags
                      WHERE user_id = ?";
            
            return $Database->fetchRow($query, $User->id); 
            
        }
        
        /**
         * Get last newsletter dispatch date
         * @since Version 3.10.0
         * @param \Railpage\Users\User $User
         * @return \DateTime
         */
        
        public static function lastWeeklyDispatchDate(User $User) {
            
            $query = "SELECT newsletter_weekly_last FROM nuke_users_flags WHERE user_id = ?";
            
            $date = AppCore::getDatabase()->fetchOne($query, $User->id); 
            
            if ($date) {
                return new DateTime($date); 
            }
            
            return false;
            
        }
        
    }