diff --git a/application/models/mahana_model.php b/application/models/mahana_model.php index 0650def..4da086a 100644 --- a/application/models/mahana_model.php +++ b/application/models/mahana_model.php @@ -1,339 +1,510 @@ -db->trans_start(); - function send_new_message($sender_id, $recipients, $subject, $body, $priority){ - - $this->db->trans_start(); + $thread_id = $this->_insert_thread($subject); + $msg_id = $this->_insert_message($thread_id, $sender_id, $body, $priority); - $thread_id = $this->_insert_thread($subject); - if ($this->db->trans_status() === false) - { - $this->db->trans_rollback(); - return false; - } + // Create batch inserts + $participants[] = array('thread_id' => $thread_id,'user_id' => $sender_id); + $statuses[] = array('message_id' => $msg_id, 'user_id' => $sender_id,'status' => MSG_STATUS_READ); - $msg_id = $this->_insert_message($thread_id, $sender_id, $body, $priority); - if ($this->db->trans_status() === false) + if ( ! is_array($recipients)) + { + $participants[] = array('thread_id' => $thread_id,'user_id' => $recipients); + $statuses[] = array('message_id' => $msg_id, 'user_id' => $recipients, 'status' => MSG_STATUS_UNREAD); + } + else + { + foreach ($recipients as $recipient) { - $this->db->trans_rollback(); - return false; + $participants[] = array('thread_id' => $thread_id,'user_id' => $recipient); + $statuses[] = array('message_id' => $msg_id, 'user_id' => $recipient, 'status' => MSG_STATUS_UNREAD); } + } - //create batch inserts - $participants[] = array('thread_id'=>$thread_id,'user_id'=> $sender_id); - $statuses[] = array('message_id'=>$msg_id, 'user_id'=> $sender_id,'status'=> MSG_STATUS_READ); + $this->_insert_participants($participants); + $this->_insert_statuses($statuses); - if (!is_array($recipients)) - { - $participants[] = array('thread_id'=>$thread_id,'user_id'=>$recipients); - $statuses[] = array('message_id'=>$msg_id, 'user_id'=>$recipients, 'status'=>MSG_STATUS_UNREAD); - } - else - { - foreach ($recipients as $recipient) - { - $participants[] = array('thread_id'=>$thread_id,'user_id'=>$recipient); - $statuses[] = array('message_id'=>$msg_id, 'user_id'=>$recipient, 'status'=>MSG_STATUS_UNREAD); - } - } - $this->_insert_participants($participants); - if ($this->db->trans_status() === false) - { - $this->db->trans_rollback(); - return false; - } + $this->db->trans_complete(); - $this->_insert_statuses($statuses); - if ($this->db->trans_status() === false) - { - $this->db->trans_rollback(); - return false; - } + if ($this->db->trans_status() === FALSE) + { + $this->db->trans_rollback(); + return FALSE; + } - $this->db->trans_complete(); - return true; + return $thread_id; } - //reply to message + // ------------------------------------------------------------------------ + + /** + * Reply to Message + * + * @param integer $reply_msg_id + * @param integer $sender_id + * @param string $body + * @param integer $priority + * @return boolean + */ function reply_to_message($reply_msg_id, $sender_id, $body, $priority) { - $this->db->trans_start(); + $this->db->trans_start(); - //get the thread id to keep messages together - if (!($thread_id = $this->_get_thread_id_from_message($reply_msg_id))) - { - return false; - } + // Get the thread id to keep messages together + if ( ! $thread_id = $this->_get_thread_id_from_message($reply_msg_id)) + { + return FALSE; + } - //add this message - $msg_id = $this->_insert_message($thread_id, $sender_id, $body, $priority); - if ($this->db->trans_status() === false) - { - $this->db->trans_rollback(); - return false; - } + // Add this message + $msg_id = $this->_insert_message($thread_id, $sender_id, $body, $priority); + + if ($recipients = $this->_get_thread_participants($thread_id, $sender_id)) + { + $statuses[] = array('message_id' => $msg_id, 'user_id' => $sender_id,'status' => MSG_STATUS_READ); - if ($recipients = $this->_get_thread_participants($thread_id, $sender_id)) + foreach ($recipients as $recipient) { - $statuses[] = array('message_id'=>$msg_id, 'user_id'=> $sender_id,'status'=> MSG_STATUS_READ); - foreach ($recipients as $recipient) - { - $statuses[] = array('message_id'=>$msg_id, 'user_id'=>$recipient['user_id'], 'status'=>MSG_STATUS_UNREAD); - } - $this->_insert_statuses($statuses); - if ($this->db->trans_status() === false) - { - $this->db->trans_rollback(); - return false; - } + $statuses[] = array('message_id' => $msg_id, 'user_id' => $recipient['user_id'], 'status' => MSG_STATUS_UNREAD); } - $this->db->trans_complete(); - return true; + $this->_insert_statuses($statuses); + } + + $this->db->trans_complete(); + + if ($this->db->trans_status() === FALSE) + { + $this->db->trans_rollback(); + return FALSE; + } + + return TRUE; } - //get a single message + // ------------------------------------------------------------------------ + + /** + * Get a Single Message + * + * @param integer $msg_id + * @param integer $user_id + * @return array + */ function get_message($msg_id, $user_id) { - $sql = 'SELECT m.*, s.status, t.subject, '.USER_TABLE_USERNAME . - ' FROM msg_messages m ' . - ' JOIN msg_threads t ON (m.thread_id = t.id) ' . - ' JOIN ' .USER_TABLE_TABLENAME. ' ON ('.USER_TABLE_ID.' = m.sender_id) '. - ' JOIN msg_status s ON (s.message_id = m.id AND s.user_id = ? ) ' . - ' WHERE m.id = ? ' ; - - $query = $this->db->query($sql, array($user_id, $msg_id)); - return $query->result_array(); - } + $sql = 'SELECT m.*, s.status, t.subject, ' . USER_TABLE_USERNAME . + ' FROM ' . $this->db->dbprefix . 'msg_messages m ' . + ' JOIN ' . $this->db->dbprefix . 'msg_threads t ON (m.thread_id = t.id) ' . + ' JOIN ' . $this->db->dbprefix . USER_TABLE_TABLENAME . ' ON (' . USER_TABLE_ID . ' = m.sender_id) '. + ' JOIN ' . $this->db->dbprefix . 'msg_status s ON (s.message_id = m.id AND s.user_id = ? ) ' . + ' WHERE m.id = ? ' ; - //get full thread - function get_full_thread($thread_id, $user_id, $full_thread = false, $order_by='asc'){ - $sql = 'SELECT m.*, s.status, t.subject, '.USER_TABLE_USERNAME . - ' FROM msg_participants p ' . - ' JOIN msg_threads t ON (t.id = p.thread_id) ' . - ' JOIN msg_messages m ON (m.thread_id = t.id) ' . - ' JOIN ' .USER_TABLE_TABLENAME. ' ON ('.USER_TABLE_ID.' = m.sender_id) '. - ' JOIN msg_status s ON (s.message_id = m.id AND s.user_id = ? ) ' . - ' WHERE p.user_id = ? ' . - ' AND p.thread_id = ? '; - if (!$full_thread) - { - $sql .= ' AND m.cdate >= p.cdate'; - } - $sql .= ' ORDER BY m.cdate '.$order_by; + $query = $this->db->query($sql, array($user_id, $msg_id)); - $query = $this->db->query($sql, array($user_id, $user_id, $thread_id)); //echo $this->db->last_query(); - return $query->result_array(); + return $query->result_array(); } - //get all threads - function get_all_threads($user_id, $full_thread = false, $order_by='asc'){ - $sql = 'SELECT m.*, s.status, t.subject, '.USER_TABLE_USERNAME . - ' FROM msg_participants p ' . - ' JOIN msg_threads t ON (t.id = p.thread_id) ' . - ' JOIN msg_messages m ON (m.thread_id = t.id) ' . - ' JOIN ' .USER_TABLE_TABLENAME. ' ON ('.USER_TABLE_ID.' = m.sender_id) '. - ' JOIN msg_status s ON (s.message_id = m.id AND s.user_id = ? ) ' . - ' WHERE p.user_id = ? ' ; - if (!$full_thread) - { - $sql .= ' AND m.cdate >= p.cdate'; - } - $sql .= ' ORDER BY t.id '.$order_by. ', m.cdate '.$order_by; + // ------------------------------------------------------------------------ + + /** + * Get a Full Thread + * + * @param integer $thread_id + * @param integer $user_id + * @param boolean $full_thread + * @param string $order_by + * @return array + */ + function get_full_thread($thread_id, $user_id, $full_thread = FALSE, $order_by = 'asc') + { + $sql = 'SELECT m.*, s.status, t.subject, '.USER_TABLE_USERNAME . + ' FROM ' . $this->db->dbprefix . 'msg_participants p ' . + ' JOIN ' . $this->db->dbprefix . 'msg_threads t ON (t.id = p.thread_id) ' . + ' JOIN ' . $this->db->dbprefix . 'msg_messages m ON (m.thread_id = t.id) ' . + ' JOIN ' . $this->db->dbprefix . USER_TABLE_TABLENAME . ' ON (' . USER_TABLE_ID . ' = m.sender_id) '. + ' JOIN ' . $this->db->dbprefix . 'msg_status s ON (s.message_id = m.id AND s.user_id = ? ) ' . + ' WHERE p.user_id = ? ' . + ' AND p.thread_id = ? '; + + if ( ! $full_thread) + { + $sql .= ' AND m.cdate >= p.cdate'; + } - $query = $this->db->query($sql, array($user_id, $user_id)); - return $query->result_array(); + $sql .= ' ORDER BY m.cdate ' . $order_by; + + $query = $this->db->query($sql, array($user_id, $user_id, $thread_id)); + + return $query->result_array(); } + // ------------------------------------------------------------------------ + + /** + * Get All Threads + * + * @param integer $user_id + * @param boolean $full_thread + * @param string $order_by + * @return array + */ + function get_all_threads($user_id, $full_thread = FALSE, $order_by = 'asc') + { + $sql = 'SELECT m.*, s.status, t.subject, '.USER_TABLE_USERNAME . + ' FROM ' . $this->db->dbprefix . 'msg_participants p ' . + ' JOIN ' . $this->db->dbprefix . 'msg_threads t ON (t.id = p.thread_id) ' . + ' JOIN ' . $this->db->dbprefix . 'msg_messages m ON (m.thread_id = t.id) ' . + ' JOIN ' . $this->db->dbprefix . USER_TABLE_TABLENAME . ' ON (' . USER_TABLE_ID . ' = m.sender_id) '. + ' JOIN ' . $this->db->dbprefix . 'msg_status s ON (s.message_id = m.id AND s.user_id = ? ) ' . + ' WHERE p.user_id = ? ' ; + + if (!$full_thread) + { + $sql .= ' AND m.cdate >= p.cdate'; + } + + $sql .= ' ORDER BY t.id ' . $order_by. ', m.cdate '. $order_by; - //change message status - function update_message_status($msg_id, $user_id, $status_id ) + $query = $this->db->query($sql, array($user_id, $user_id)); + + return $query->result_array(); + } + + // ------------------------------------------------------------------------ + + /** + * Change Message Status + * + * @param integer $msg_id + * @param integer $user_id + * @param integer $status_id + * @return integer + */ + function update_message_status($msg_id, $user_id, $status_id) { - $this->db->where(array('message_id'=>$msg_id, 'user_id'=>$user_id )); - $this->db->update('msg_status', array('status'=>$status_id )); - return $this->db->affected_rows(); + $this->db->where(array('message_id' => $msg_id, 'user_id' => $user_id )); + $this->db->update('msg_status', array('status' => $status_id )); + + return $this->db->affected_rows(); } + // ------------------------------------------------------------------------ - //add participant + /** + * Add a Participant + * + * @param integer $thread_id + * @param integer $user_id + * @return boolean + */ function add_participant($thread_id, $user_id) { - $this->db->trans_start(); + $this->db->trans_start(); - $participants[] = array('thread_id'=>$thread_id,'user_id'=>$user_id); - $this->_insert_participants($participants); - if ($this->db->trans_status() === false) - { - $this->db->trans_rollback(); - return false; - } + $participants[] = array('thread_id' => $thread_id,'user_id' => $user_id); - //get messages by thread - $messages = $this->_get_messages_by_thread_id($thread_id); + $this->_insert_participants($participants); - foreach ($messages as $message) - { - $statuses[] = array('message_id'=>$message['id'], 'user_id'=>$user_id, 'status'=>MSG_STATUS_UNREAD); - } - - $this->_insert_statuses($statuses); - if ($this->db->trans_status() === false) - { - $this->db->trans_rollback(); - return false; - } + // Get Messages by Thread + $messages = $this->_get_messages_by_thread_id($thread_id); - $this->db->trans_complete(); - return true; + foreach ($messages as $message) + { + $statuses[] = array('message_id' => $message['id'], 'user_id' => $user_id, 'status' => MSG_STATUS_UNREAD); + } + + $this->_insert_statuses($statuses); + + $this->db->trans_complete(); + + if ($this->db->trans_status() === FALSE) + { + $this->db->trans_rollback(); + return FALSE; + } + + return TRUE; } + // ------------------------------------------------------------------------ + + /** + * Remove a Participant + * + * @param integer $thread_id + * @param integer $user_id + * @return boolean + */ function remove_participant($thread_id, $user_id) { - $this->db->trans_start(); + $this->db->trans_start(); - $return = $this->_delete_participant($thread_id, $user_id); - if (($return === false) || $this->db->trans_status() === false) - { - $this->db->trans_rollback(); - return false; - } + $this->_delete_participant($thread_id, $user_id); + $this->_delete_statuses($thread_id, $user_id); - $this->_delete_statuses($thread_id, $user_id); - if ($this->db->trans_status() === false) - { - $this->db->trans_rollback(); - return false; - } + $this->db->trans_complete(); + + if ($this->db->trans_status() === FALSE) + { + $this->db->trans_rollback(); + return FALSE; + } - $this->db->trans_complete(); - return true; + return TRUE; } - // because of CodeIgniter's DB Class return style, it is safer to check for uniqueness first + // ------------------------------------------------------------------------ + + /** + * Valid New Participant - because of CodeIgniter's DB Class return style, + * it is safer to check for uniqueness first + * + * @param integer $thread_id + * @param integer $user_id + * @return boolean + */ function valid_new_participant($thread_id, $user_id) { - $sql = 'SELECT COUNT(*) AS count ' . - ' FROM msg_participants p ' . - ' WHERE p.thread_id = ? ' . - ' AND p.user_id = ? '; - $query = $this->db->query($sql, array($thread_id, $user_id)); - if ($query->row()->count) - { - return false; - } - return true; + $sql = 'SELECT COUNT(*) AS count ' . + ' FROM ' . $this->db->dbprefix . 'msg_participants p ' . + ' WHERE p.thread_id = ? ' . + ' AND p.user_id = ? '; + + $query = $this->db->query($sql, array($thread_id, $user_id)); + + if ($query->row()->count) + { + return FALSE; + } + + return TRUE; } + // ------------------------------------------------------------------------ + + /** + * Application User + * + * @param integer $user_id` + * @return boolean + */ function application_user($user_id) { - $sql = 'SELECT COUNT(*) AS count ' . - ' FROM ' . USER_TABLE_TABLENAME . - ' WHERE ' . USER_TABLE_ID . ' = ?' ; - $query = $this->db->query($sql, array($user_id)); - if ($query->row()->count) - { - return true; - } - return false; - } + $sql = 'SELECT COUNT(*) AS count ' . + ' FROM ' . $this->db->dbprefix . USER_TABLE_TABLENAME . + ' WHERE ' . USER_TABLE_ID . ' = ?' ; + + $query = $this->db->query($sql, array($user_id)); + + if ($query->row()->count) + { + return TRUE; + } - function get_participant_list($thread_id, $sender_id =0) + return FALSE; + } + + // ------------------------------------------------------------------------ + + /** + * Get Participant List + * + * @param integer $thread_id + * @param integer $sender_id + * @return mixed + */ + function get_participant_list($thread_id, $sender_id = 0) { - if ($results = $this->_get_thread_participants($thread_id, $sender_id)) { + if ($results = $this->_get_thread_participants($thread_id, $sender_id)) + { return $results; } - return false; + return FALSE; } + // ------------------------------------------------------------------------ + + /** + * Get Message Count + * + * @param integer $user_id + * @param integer $status_id + * @return integer + */ function get_msg_count($user_id, $status_id = MSG_STATUS_UNREAD) { - $query = $this->db->select('COUNT(*) AS msg_count')->where(array('user_id'=>$user_id, 'status'=>$status_id ))->get('msg_status'); + $query = $this->db->select('COUNT(*) AS msg_count')->where(array('user_id' => $user_id, 'status' => $status_id ))->get('msg_status'); + return $query->row()->msg_count; } + // ------------------------------------------------------------------------ + // Private Functions from here out! + // ------------------------------------------------------------------------ - // - //***** private functions *****// - // - + /** + * Insert Thread + * + * @param string $subject + * @return integer + */ private function _insert_thread($subject) { - $insert_id = $this->db->insert('msg_threads', array('subject'=>$subject)); - return $this->db->insert_id(); + $insert_id = $this->db->insert('msg_threads', array('subject' => $subject)); + + return $this->db->insert_id(); } + /** + * Insert Message + * + * @param integer $thread_id + * @param integer $sender_id + * @param string $body + * @param integer $priority + * @return integer + */ private function _insert_message($thread_id, $sender_id, $body, $priority) { - $insert['thread_id'] = $thread_id; - $insert['sender_id'] = $sender_id; - $insert['body'] = $body; - $insert['priority'] = $priority; + $insert['thread_id'] = $thread_id; + $insert['sender_id'] = $sender_id; + $insert['body'] = $body; + $insert['priority'] = $priority; - $insert_id = $this->db->insert('msg_messages', $insert); - return $this->db->insert_id(); + $insert_id = $this->db->insert('msg_messages', $insert); + + return $this->db->insert_id(); } + /** + * Insert Participants + * + * @param array $participants + * @return bool + */ private function _insert_participants($participants) { - return $this->db->insert_batch('msg_participants', $participants); + return $this->db->insert_batch('msg_participants', $participants); } + /** + * Insert Statuses + * + * @param array $statuses + * @return bool + */ private function _insert_statuses($statuses) { - return $this->db->insert_batch('msg_status', $statuses); + return $this->db->insert_batch('msg_status', $statuses); } - private function _get_thread_id_from_message($msg_id){ - $query = $this->db->select('thread_id')->get_where('msg_messages', array('id' => $msg_id)); - if ($query->num_rows()){ - return $query->row()->thread_id; - } - return 0; + /** + * Get Thread ID from Message + * + * @param integer $msg_id + * @return integer + */ + private function _get_thread_id_from_message($msg_id) + { + $query = $this->db->select('thread_id')->get_where('msg_messages', array('id' => $msg_id)); + + if ($query->num_rows()) + { + return $query->row()->thread_id; + } + return 0; } + /** + * Get Messages by Thread + * + * @param integer $thread_id + * @return array + */ private function _get_messages_by_thread_id($thread_id) { - $query = $this->db->get_where('msg_messages', array('thread_id' => $thread_id)); - return $query->result_array(); + $query = $this->db->get_where('msg_messages', array('thread_id' => $thread_id)); + + return $query->result_array(); } - private function _get_thread_participants($thread_id, $sender_id=0) + /** + * Get Thread Particpiants + * + * @param integer $thread_id + * @param integer $sender_id + * @return array + */ + private function _get_thread_participants($thread_id, $sender_id = 0) { - $array['thread_id'] = $thread_id; - if ($sender_id) //if $sender_id 0, no one to exclude - { - $array['msg_participants.user_id != '] = $sender_id; - } - - $this->db->select('msg_participants.user_id, '.USER_TABLE_USERNAME, false); - $this->db->join(USER_TABLE_TABLENAME,'msg_participants.user_id ='.USER_TABLE_ID); - $query = $this->db->get_where('msg_participants', $array); - - return $query->result_array(); + $array['thread_id'] = $thread_id; + + if ($sender_id) // If $sender_id 0, no one to exclude + { + $array['msg_participants.user_id != '] = $sender_id; + } + + $this->db->select('msg_participants.user_id, '.USER_TABLE_USERNAME, FALSE); + $this->db->join(USER_TABLE_TABLENAME, 'msg_participants.user_id = ' . USER_TABLE_ID); + + $query = $this->db->get_where('msg_participants', $array); + + return $query->result_array(); } + /** + * Delete Participant + * + * @param integer $thread_id + * @param integer $user_id + * @return boolean + */ private function _delete_participant($thread_id, $user_id) { - $this->db->delete('msg_participants', array('thread_id'=>$thread_id, 'user_id'=>$user_id)); - if ($this->db->affected_rows() > 0) - { - return true; - } - return false; + $this->db->delete('msg_participants', array('thread_id' => $thread_id, 'user_id' => $user_id)); + + if ($this->db->affected_rows() > 0) + { + return TRUE; + } + return FALSE; } + /** + * Delete Statuses + * + * @param integer $thread_id + * @param integer $user_id + * @return boolean + */ private function _delete_statuses($thread_id, $user_id) { - $sql = 'DELETE s FROM msg_status s ' . - ' JOIN msg_messages m ON (m.id = s.message_id) ' . - ' WHERE m.thread_id = ? ' . - ' AND s.user_id = ? '; - $query = $this->db->query($sql, array($thread_id, $user_id)); - return true; + $sql = 'DELETE s FROM msg_status s ' . + ' JOIN ' . $this->db->dbprefix . 'msg_messages m ON (m.id = s.message_id) ' . + ' WHERE m.thread_id = ? ' . + ' AND s.user_id = ? '; + + $query = $this->db->query($sql, array($thread_id, $user_id)); + + return TRUE; } }