tims-todo/application/libraries/Todo.php

845 lines
18 KiB
PHP
Executable File

<?php
/**
* Public Library Todo
*
* Library for general tasks in Todo application
* @package Todo
*/
class Todo {
private $user, $pass, $uid; //For user registration
/**
* @var MY_Controller
*/
protected $CI;
/**
* Constructor
*/
public function __construct()
{
$this->CI =& get_instance();
}
// --------------------------------------------------------------------------
/**
* Get User From Id
*
* Retrieve a user's username from their userid
* @param int $user_id
* @return string
*/
public function get_user_from_id($user_id)
{
$this->CI->db->select('id, username')
->from('todo_user')
->where('id', (int) $user_id);
$res = $this->CI->db->get();
$row = $res->row();
return $row->username;
}
// --------------------------------------------------------------------------
/**
* Crypt Pass
*
* Hashes passwords
* @param string $password
* @return string
*/
public function crypt_pass($password)
{
return password_hash($password, PASSWORD_BCRYPT);
}
// --------------------------------------------------------------------------
/**
* Add Reg
*
* Submits a new user to the database
* @return integer
*/
public function add_reg()
{
$user = $this->CI->input->post('user', TRUE);
$pass = $this->crypt_pass($this->CI->input->post('pass', TRUE));
$email = $this->CI->input->post('email', TRUE);
$this->CI->db->set('username', $user)
->set('password', $pass)
->set('email', $email);
$this->CI->db->insert('user');
//Get affected rows
$affected_rows = $this->CI->db->affected_rows();
//Get the userid of the latest user
$res = $this->CI->db->select('MAX(id) as id')
->from('user')
->get();
$row = $res->row();
$this->uid = $row->id;
//Add a group with the same name as the user
$this->CI->db->set('name', $user)
->insert('group');
//Get the groupid of the latest group
$res2 = $this->CI->db->select('MAX(id) as id')
->from('group')
->get();
$row = $res2->row();
$g_id = $row->id;
//Set that user as the admin of that group
$this->CI->db->set('group_id', $g_id)
->set('user_id', $this->uid)
->set('is_admin', 1)
->insert('group_users_link');
//Return affected rows
return $affected_rows;
}
// --------------------------------------------------------------------------
/**
* Get Categories
*
* Retrieves list of category types from the database
* @return array
*/
public function get_category_list()
{
$user_group_id = $this->get_user_group();
$cat = $this->CI->db->select('id,title,description,group_id')
->from('category')
->where('group_id', $user_group_id)
->or_where('group_id', 0)
->order_by('group_id', 'desc')
->order_by('title', 'asc')
->get();
return $cat->result_array();
}
// --------------------------------------------------------------------------
/**
* Get Group List
*
* An alias for the private get_groups method
* @param int
* @return array
*/
public function get_group_list($user_id)
{
return $this->get_groups($user_id);
}
// --------------------------------------------------------------------------
/**
* Add Category
*
* Submits a new category to the database
* @return bool
*/
public function add_category()
{
if($this->CI->input->post('title') == FALSE || $this->CI->input->post('desc') == FALSE)
{
show_error('You must put a title and description!');
return false;
}
$title = $this->CI->input->post('title', TRUE);
$desc = $this->CI->input->post('desc', TRUE);
//Check for the current category
$this->CI->db->select('title')
->from('category')
->where('title', $title);
$res = $this->CI->db->get();
if($res->num_rows() == 0)
{
//Get the current user's primary group
$group_id = $this->get_user_group();
$this->CI->db->set('title', $title)
->set('description', $desc)
->set('group_id', $group_id);
//Insert the new record
$this->CI->db->insert('category');
$this->CI->session->flashdata('message', 'Successfully added new category.');
return true;
}
else
{
show_error('This category already exists!');
return false;
}
}
// --------------------------------------------------------------------------
/**
* Add Group
*
* Submits a new group to the database
* @return bool
*/
public function add_group()
{
if($this->CI->input->post('name') == FALSE)
{
show_error('You must have a name for your new group!');
return false;
}
$name = $this->CI->input->post('name');
//Add group
$this->CI->db->set("name", $name)->insert('group');
//Get the groupid of the latest group
$res = $this->CI->db->select('MAX(id) as id')
->from('group')
->get();
$row = $res->row();
$g_id = $row->id;
//Set that user as the admin of that group
$this->CI->db->set('group_id', $g_id)
->set('user_id', $this->CI->session->userdata('uid'))
->set('is_admin', 1)
->insert('group_users_link');
}
// --------------------------------------------------------------------------
/**
* Get Category Select
*
* Generates select options for categories when adding a new task
* @return string
*/
public function get_category_select()
{
$select_array = $this->get_category_list();
$html = '';
foreach($select_array as $r)
{
$html .= T4.'<option value="'.$r['id'].'">' . $r['title'] . '</option>'. "\n";
}
return $html;
}
// --------------------------------------------------------------------------
/**
* Get Priority Select
*
* Generates select options for priorities when adding a new task
* @return string
*/
public function get_priority_select()
{
$select_array = $this->get_priorities();
$html = '';
foreach($select_array as $r)
{
$html .= T4.'<option value="'.$r['id'].'" ';
$html .= ($r['id'] == 5) ? 'selected="selected">': '>';
$html .= $r['value'] . '</option>'. "\n";
}
return $html;
}
// --------------------------------------------------------------------------
/**
* Get Group Select
*
* Generates select options for groups when adding a friend
* @param int $user_id
* @return string
*/
public function get_group_select($user_id)
{
$select_array = $this->get_groups($user_id);
$html = '';
foreach($select_array as $r)
{
$html .= T4.'<option value="'.$r['id'].'">' . $r['name'] . '</option>'. "\n";
}
return $html;
}
// --------------------------------------------------------------------------
/**
* Validate Pass
*
* Validate Password Change
* @return mixed
*/
public function validate_pass()
{
$err = array();
$user = (int) $this->CI->session->userdata('uid');
$pass = $this->CI->input->post('pass');
$pass1 = $this->CI->input->post('pass1');
$old_pass = $this->CI->input->post('old_pass');
if($pass != $pass1)
$err[] = "Passwords do not match.";
//Check for current password in the database
$user_check = $this->CI->db->select('password')
->from('user')
->where('id', $user)
->get();
$row = $user_check->row();
if ( ! password_verify($old_pass, $row->password))
{
$err[] = "Wrong password";
}
$res = (empty($err)) ? true : $err;
if($res == TRUE)
{
$this->user = $user;
$this->pass = $pass;
}
return $res;
}
// --------------------------------------------------------------------------
/**
* Update Pass
*
* Updates user's password in the database
*/
public function update_pass()
{
$pass = $this->crypt_pass($this->pass);
$this->CI->db->set('password', $pass)
->where('id', $this->user)
->update('user');
}
// --------------------------------------------------------------------------
/**
* Redirect 303
*
* Shortcut function for 303 redirect
* @param string $url
*/
public function redirect_303($url)
{
if (stripos($url, 'http') === FALSE)
{
$url = site_url($url);
}
$this->CI->output->set_header("HTTP/1.1 303 See Other");
$this->CI->output->set_header("Location:" . $url);
}
// --------------------------------------------------------------------------
/**
* Set Timezone
*
* Sets the timezone based on the user's settings
* @param int $uid
* @param string $timezone
* @return bool
*/
public function set_timezone($uid, $timezone)
{
$this->CI->db->set('timezone', $timezone)
->where('id', $uid)
->update('user');
return ($this->CI->db->affected_rows == 1);
}
// --------------------------------------------------------------------------
/**
* Get Priorities
*
* Retreives list of priority types from the database
* @return array
*/
public function get_priorities()
{
$pri = $this->CI->db->select('id,value')
->from('priority')
->order_by('id', 'asc')
->get();
return $pri->result_array();
}
// --------------------------------------------------------------------------
/**
* Get Groups
*
* Retrieves user's groups from db
* @param int $user_id
* @return array
*/
private function get_groups($user_id)
{
$username = $this->get_user_from_id($user_id);
$groups = $this->CI->db->select("group.id, name")
->from('group')
->join('group_users_link', 'group.id = group_users_link.group_id', 'inner')
->where('user_id', $user_id)
->where('name !=', $username)
->where('is_admin', 1)
->order_by('name')
->get();
return $groups->result_array();
}
// --------------------------------------------------------------------------
/**
* Get User Account By Id
*
* Retrieves user's account info from db
* @param int $user_id
* @return array
*/
public function get_user_account_by_id($user_id)
{
$user_account = array();
//Get the user
$user_query = $this->CI->db->from('user')
->where('id', (int) $user_id)
->get();
$user = $user_query->row();
$user_account['timezone'] = $user->timezone;
$user_account['user'] = $user->username;
$user_account['email'] = $user->email;
$user_account['num_format'] = $user->num_format;
return $user_account;
}
// --------------------------------------------------------------------------
/**
* Get User Group
*
* Gets the current user's primary group
* @return int
*/
public function get_user_group()
{
$user_id = $this->CI->session->userdata('uid');
//Get the username
$uname = $this->get_user_from_id($user_id);
$group_query = $this->CI->db->select('group.id as group_id')
->from('group')
->where('name', $uname)
->limit(1)
->get();
$group = $group_query->row();
$group_id = $group->group_id;
return $group_id;
}
// --------------------------------------------------------------------------
/**
* Get Friend List
*
* Gets the friends of the current user
* @return array
*/
public function get_friend_list()
{
$user_id = $this->CI->session->userdata('uid');
//Get the current user's username
$uname = $this->CI->db->select('username')
->from('user')
->where('id', $user_id)
->get();
$user_n = $uname->row();
$username = $user_n->username;
//Get the list of friends
$friends = $this->CI->db
->select('user_friend_id,user_friend_link.user_id as uid,user.username')
->from('todo_user_friend_link')
->join('user', 'user.id=user_friend_link.user_friend_id OR todo_user.id=todo_user_friend_link.user_id', 'inner')
->where('confirmed', FRIEND_CONFIRMED)
->where('username !=', $username)
->group_start()
->where_in('todo_user_friend_link.user_id', $user_id)
->or_where_in('todo_user_friend_link.user_friend_id', $user_id)
->group_end()
->order_by('username', 'asc')
->get();
return $friends->result_array();
}
// --------------------------------------------------------------------------
/**
* Get Friends in Group
*
* Returns members of a group
* @param int $group_id
* @return array
*/
public function get_friends_in_group($group_id)
{
$friends = $this->CI->db
->select('user_id')
->from('group_users_link')
->where('group_id', $group_id)
->order_by('user_id')
->get();
return $friends->result_array();
}
// --------------------------------------------------------------------------
/**
* Update group
*
* Updates a group's membership
*/
public function update_group()
{
$friends = $this->CI->input->post('friends');
$group_name = $this->CI->input->post('group_name');
$group_id = (int)$this->CI->uri->segment('3');
//Drop members in group except the creator
$this->CI->db->where('group_id', $group_id)
->where('is_admin', 0)
->delete('group_users_link');
//Update the group name
$this->CI->db->set('name', $group_name)
->where('id', $group_id)
->update('group');
foreach ($friends as $friend)
{
//Insert new friends
$this->CI->db->set('group_id', $group_id)
->set('user_id', (int) $friend)
->set('is_admin', 0)
->insert('group_users_link');
}
return 1;
}
// --------------------------------------------------------------------------
/**
* Del group
*
* Deletes a friend group
* @param int $group_id
* @return int
*/
public function del_group($group_id)
{
//Check if the current user is group admin
$is_admin = $this->CI->db->from('group_users_link')
->where('group_id', $group_id)
->where('is_admin', 1)
->get();
//The user is admin
if($is_admin->num_rows() > 0)
{
//Delete the related records
$this->CI->db->where('group_id', $group_id)
->delete('group_users_link');
$this->CI->db->where('group_id', $group_id)
->delete('group_task_link');
//Delete the group
$this->CI->db->where('id', $group_id)
->delete('group');
return 1;
}
else
{
return -1;
}
}
// --------------------------------------------------------------------------
/**
* Del Cat
*
* Deletes a task category
* @param int $cat_id
* @return int
*/
public function del_cat($cat_id)
{
//Get the user group id
$gid = $this->get_user_group();
//Delete the category that matches the cat_id and gid
$this->CI->db->where('group_id', $gid)
->where('id', $cat_id)
->delete('category');
if($this->CI->db->affected_rows() > 0)
{
return $this->CI->db->affected_rows();
}
else
{
return -1;
}
}
// --------------------------------------------------------------------------
/**
* Get group name by id
*
* Gets a group name from the group id
* @param int $group_id
* @return string
*/
public function get_group_name_by_id($group_id)
{
$query = $this->CI->db->select('name')
->from('group')
->where('id', (int) $group_id)
->get();
$qrow = $query->row();
return $qrow->name;
}
// --------------------------------------------------------------------------
/**
* Kanji Num
*
* Converts arabic to chinese number
* @param int $orig_number
* @return string
*/
public function kanji_num($orig_number)
{
$kanji_num = '';
$number = (int) $orig_number;
// Return early on a zero
if ($number === 0) return ZERO;
// Map variables to their values and characters
$meta_map = [
100000000 => HUNDRED_MILLION,
10000 => TEN_THOUSAND,
1000 => THOUSAND,
100 => HUNDRED,
10 => TEN
];
// Map values to their kanji equivalent
$char_map = [
1 => ONE,
2 => TWO,
3 => THREE,
4 => FOUR,
5 => FIVE,
6 => SIX,
7 => SEVEN,
8 => EIGHT,
9 => NINE,
];
// Go through each place value
// to get the kanji equivalent of
foreach($meta_map as $value => $char)
{
if ($number < $value) continue;
// Calculate the place value variable
$place_value = floor($number / $value);
// Get the remainder for the next place value;
$number = $number - ($place_value * $value);
// Recurse if the number is between 11,000
// and 100,000,000 to get the proper prefix,
// which can be up to 9,999
if ($orig_number > 10000 && $place_value > 9)
{
$kanji_num .= $this->kanji_num($place_value);
$place_value = 1;
}
// Add place value character and
// place value to the output string,
// skipping zero and one. A zero value
// hides the place value character, and one
// value is implied if there is no value
// prefixing the place value character
$kanji_num .= ($place_value > 1)
? $char_map[$place_value] . $char
: $char;
}
// Add the smallest place value last, as a
// one value is significant here
$kanji_num .= ($number > 0) ? $char_map[$number] : '';
return $kanji_num;
}
// --------------------------------------------------------------------------
/**
* Get Category
*
* Returns a category from id
* @param int $cat_id
* @return array
*/
public function get_category($cat_id)
{
$cats = $this->CI->db->select('title, description')
->from('category')
->where('id', $cat_id)
->limit('1')
->get();
$cat = $cats->row_array();
return $cat;
}
// --------------------------------------------------------------------------
/**
* Get Friend Requests
*
* Retrieves number of friend requests for the current user
* @return int
*/
public function get_friend_requests()
{
static $requests = NULL;
if (is_null($requests))
{
//Get friend requests for the current user
$requests = $this->CI->db->select('user_id')
->distinct()
->from('user_friend_link')
->where('user_friend_id', $this->CI->session->userdata('uid'))
->where('confirmed', -1)
->get()
->num_rows();
}
return $requests;
}
/**
* Authenticate the user
*
* @return string
*/
public function verify_user()
{
$user = $this->CI->input->post('user');
$pass = $this->CI->input->post('pass');
//Check for the user in the database
$uid_check = $this->CI->db->select('id, username, email, password, timezone, num_format')
->from('user')
->group_start()
->where('email', $user)
->or_where('username', $user)
->group_end()
->get();
$row = $uid_check->row();
if (password_verify($pass, $row->password))
{
$this->CI->session->set_userdata('uid', $row->id);
$this->CI->session->set_userdata('num_format', $row->num_format);
$this->CI->session->set_userdata('username', $row->username);
//Set Timezone
$zone = $row->timezone;
$tz_set = date_default_timezone_set($zone);
if($tz_set == FALSE) display_error('Could not set timezone');
//Redirect to task list
return TRUE;
}
else
{
return "Invalid username or password";
}
}
}
// End of libraries/Todo.php