summaryrefslogtreecommitdiffstats
path: root/models/Post.php
blob: 58e2487355434b1eb8b405c0c4f3be96072cbae7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
<?php	

namespace app\models;
use app\models\User;

class Post extends \lithium\data\Model {
	protected $_meta = array('key' => '_id');

//Overrides save so we can do some stuff before the data is commited to the database. 

/* Post model $_Schema:
 * _id => MongoID
 * user_id -> mongoID of the user that posted it
 * datetime -> mongodate of when the post was posted
 * body -> the text of the post
 * level -> access level required to see the post
 * comments[] => list of comments 
 * type -> the type of post, IE picture text, chat etc
 */ 

 	/**
 	 * Parses an array of words to find mentions and topic tags then converts them
 	 * @param Entitiy $entity Not used, but otherwise lithium will pass entity into words which makes the program blowup
 	 * @param Mixed $input, either a string, or a spilt array of words (ie an exploded string)
 	 * @return String a string with the topics and mentions converted
 	 */ 
 	public function parse($entity, $input)
 	{
 		$words;
 		if (is_array($input)) {
 			$words = $input;
 		}
 		else {
 			$words = explode(" ", $input);
 		}

 		//Count the number of words 
 		$count = count($words);


 		//For each word in the array
		for ($i = 0; $i < $count; $i++)
		{
			//If the word begins with a '@' convert it to a mention
			if ($words[$i][0] == '@')
			{
				$words[$i] = $this->convertToMention($words[$i]);
			}
			//Else if the word beings with a '#' Convert to topic link
			else if ($words[$i][0] == '#')
			{
				$words[$i] = $this->convertToTopic($words[$i]);
			}
		}
		return implode(" ", $words);	
 	}
	
	//TODO: Some sort of security check to make sure 
			//That the user is ok with receiving message

	public function directMessage($entity, $to)
	{
		//Get the user the message is to
		$user = User::find('first', array('conditions' => array('username' => $to)));

		//If find() returned a user, 
		if ($user)
		{
			//Add the post to their feed,
			return $post->store($user); 
		}
		//If the user wasn't found
		return false;
	}

   /**
	* Converts a string with a topic tag(eg: #madoka) to clickable link to the topic eg <a class="topic" href"/topic/madoka>#madoka</a>
	* @param String $input The string with topic tag
	* @return String the string with href
	*/
	public function convertToTopic($input)
	{
		//Remove the # character from the beginning 
		$output = substr($input, 1);
		
		//Formats the string and returns it.
		return "<a class=\"topic\" href=\"/topics/view/$output\">$input</a>";
	}	

	/**
	* converts a mention (eg: @bob) to a clickable link to the user's profile eg <a class="topic" href"/topic/madoka>#madoka</a>
	* @param String $input The string with topic tag
	* @return String the string with href
	*/
	public function convertToMention($input)
	{
		//Remove the @ character from the beginning 
		$output = substr($input, 1);

		//Formats the string and returns it.
		return "<a class=\"mention\" href=\"/profile/view/$output\">$input</a>";
	}

	/**
	* Stores the post to all the user's friends feed 
	* @param Post $entity The post to be stored
	* @param Array $users an Array of users objects to store the post to
	* @return boolean True if sucsessful, false otherwise 
	*/
	//Store all can take a single param as well, therefore it should replace the store method once we're sure it works properly :TODO:
	public function storeAll($entity, $users)
	{
		$ids; 
		foreach($users as $user)
		{
			$ids[] = $user->_id;
		}

		$updateData = array('$push' => array('feed' =>  $entity['_id']->__toString()));

		$conditions =  array('_id' => array('$in' => $ids));
		$result = User::update($updateData, $conditions, array('atomic' => false));

		return $result; 
	}

	/**
	 * Stores the post to the database
	 * @param Post $entity The post to store.
	 * @param User $user The user to store the post to. 
	 */ 
	public function store($entity, $user)
	{
		$updateData = array('$push' => array('feed' =>  $entity['_id']->__toString()));
		$conditions =  array('_id' => $user['_id']);
		$result = User::update($updateData, $conditions, array('atomic' => false));

		return $result; 
	}
}

?>