+ public static function schemaDef()
+ {
+ return array(
+ 'fields' => array(
+ 'notice_id' => array('type' => 'int', 'not null' => true, 'description' => 'notice that is the favorite'),
+ 'user_id' => array('type' => 'int', 'not null' => true, 'description' => 'user who likes this notice'),
+ 'uri' => array('type' => 'varchar', 'length' => 255, 'description' => 'universally unique identifier, usually a tag URI'),
+ 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'),
+ ),
+ 'primary key' => array('notice_id', 'user_id'),
+ 'unique keys' => array(
+ 'fave_uri_key' => array('uri'),
+ ),
+ 'foreign keys' => array(
+ 'fave_notice_id_fkey' => array('notice', array('notice_id' => 'id')),
+ 'fave_user_id_fkey' => array('profile', array('user_id' => 'id')), // note: formerly referenced notice.id, but we can now record remote users' favorites
+ ),
+ 'indexes' => array(
+ 'fave_notice_id_idx' => array('notice_id'),
+ 'fave_user_id_idx' => array('user_id', 'modified'),
+ 'fave_modified_idx' => array('modified'),
+ ),
+ );
+ }
+
+ /**
+ * Save a favorite record.
+ * @fixme post-author notification should be moved here
+ *
+ * @param Profile $profile the local or remote user who likes
+ * @param Notice $notice the notice that is liked
+ * @return mixed false on failure, or Fave record on success
+ */
+ static function addNew(Profile $profile, Notice $notice) {
+
+ $fave = null;
+
+ if (Event::handle('StartFavorNotice', array($profile, $notice, &$fave))) {
+
+ $fave = new Fave();
+
+ $fave->user_id = $profile->id;
+ $fave->notice_id = $notice->id;
+ $fave->modified = common_sql_now();
+ $fave->uri = self::newURI($fave->user_id,
+ $fave->notice_id,
+ $fave->modified);
+ if (!$fave->insert()) {
+ common_log_db_error($fave, 'INSERT', __FILE__);
+ return false;
+ }
+ self::blow('fave:list-ids:notice_id:%d', $fave->notice_id);
+ self::blow('popular');
+
+ Event::handle('EndFavorNotice', array($profile, $notice));