Example #1
0
 public function edit($mark_id = 0)
 {
     parent::redirectIfWebView();
     // Figure correct way to handle if no mark id
     if (empty($mark_id) || !is_numeric($mark_id)) {
         header('Location: /');
         exit;
     }
     // Check for CSRF
     if ($this->csrf_valid === true) {
         // Figure what options to send for update
         $options = array();
         // 1.6
         // If title is found, attach it
         if (isset($this->db_clean->title)) {
             $options['mark_title'] = $this->db_clean->title;
         }
         // If label ID is found, attach it
         if (isset($this->clean->label_id) && is_numeric($this->clean->label_id)) {
             $options['label_id'] = $this->clean->label_id;
         }
         // If notes are present set them
         if (isset($this->db_clean->notes)) {
             $options['notes'] = $this->db_clean->notes;
             // Check for hashmarks to tags
             $tags = getTagsFromHash($options['notes']);
         }
         // If tags are present, handle differently
         // Need to add to tags table first
         // Then create association
         // If notes are present set them
         if (isset($tags)) {
             parent::addTags($tags, $mark_id);
         }
         // Update users_to_marks record
         $mark = $this->user_marks->update("users_to_marks.user_id = '" . $this->user_id . "' AND users_to_marks.users_to_mark_id = '" . $mark_id . "'", $options);
         // Check if it was updated
         if ($mark === false) {
             $this->data['errors'] = formatErrors(3);
         } else {
             $this->data['mark'] = $mark;
             // Check if label id was set
             // if so get the parent mark id
             // Then add a smart label for this domain
             if (isset($options['label_id']) && !empty($options['label_id'])) {
                 $this->load->model('labels_model', 'labels');
                 $smart_info = getSmartLabelInfo($mark->url);
                 $total = $this->labels->count("labels.user_id = '" . $this->user_id . "' AND labels.smart_key = '" . $smart_info['key'] . "'");
                 // If not found, create it with label
                 // Else update current
                 if ($total < 1 && $options['label_id'] != '1') {
                     $label = $this->labels->create(array('smart_label_id' => $options['label_id'], 'domain' => $smart_info['domain'], 'smart_key' => $smart_info['key'], 'user_id' => $this->user_id));
                 } else {
                     $active = $options['label_id'] == '1' ? '0' : '1';
                     $label = $this->labels->update("labels.user_id = '" . $this->user_id . "' AND labels.smart_key = '" . $smart_info['key'] . "'", array('smart_label_id' => $options['label_id'], 'active' => $active));
                 }
             }
         }
     } else {
         $this->data['errors'] = formatErrors(600);
     }
     // Figure what to do here (api, redirect or generate view)
     $this->renderJSON();
 }
Example #2
0
 public function up()
 {
     set_time_limit(0);
     // Check for all tables required for this migration
     parent::checkForTables(array('marks', 'migrations', 'users', 'users_marks', 'users_smartlabels'));
     // Check all columns need per table are found
     // marks, users and users_marks
     parent::checkForColumns(array('recipe', 'id', 'title', 'url', 'oembed', 'dateadded'), 'marks');
     parent::checkForColumns(array('salt', 'status', 'date_joined', 'admin'), 'users');
     parent::checkForColumns(array('addedby', 'groups', 'status', 'id', 'urlid', 'userid', 'tags', 'note', 'dateadded', 'datearchived'), 'users_marks');
     // Make sure all tables are INNODB, UTF-8
     // Original migration they were not
     // If anyone download that version and ran successfully, some keys may not be created correctly
     $this->db->query("ALTER TABLE `marks` ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci");
     $this->db->query("ALTER TABLE `migrations` ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci");
     $this->db->query("ALTER TABLE `users` ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci");
     $this->db->query("ALTER TABLE `users_marks` ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci");
     $this->db->query("ALTER TABLE `users_smartlabels` ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci");
     // Drop all group releated tables
     $this->db->query("DROP TABLE IF EXISTS `groups`");
     $this->db->query("DROP TABLE IF EXISTS `groups_invites`");
     $this->db->query("DROP TABLE IF EXISTS `users_groups`");
     /*
     - Start updates for labels table
     - Import default system labels
     - Import any user smart labels
     */
     // Create new labels table
     $this->db->query("\n        CREATE TABLE IF NOT EXISTS `labels` (\n          `label_id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'The auto-incremented key.',\n          `smart_label_id` bigint(20) UNSIGNED DEFAULT NULL COMMENT 'If a smart label, the label_id to use if a match is found.',\n          `user_id` bigint(20) UNSIGNED DEFAULT NULL COMMENT 'If a label but owned by a user, place the users.user_id here.',\n          `name` varchar(50) DEFAULT NULL COMMENT 'The name of the label.',\n          `slug` varchar(50) DEFAULT NULL COMMENT 'The slug of the label.',\n          `domain` varchar(255) DEFAULT NULL COMMENT 'The hostname of the domain to match. Keep in all lowercase.',\n          `path` varchar(100) DEFAULT NULL COMMENT 'The path to find to for smartlabels to match. If null, just match host.',\n          `smart_key` varchar(32) DEFAULT NULL COMMENT 'MD5 checksum of domain and path for lookup purposes.',\n          `active` tinyint(1) NOT NULL DEFAULT '1' COMMENT '1 is active, 0 if not. Defaults to 1.',\n          `created_on` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',\n          `last_updated` timestamp NOT NULL ON UPDATE CURRENT_TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT 'The last datetime this record was updated.',\n          PRIMARY KEY (`label_id`),\n          CONSTRAINT `FK_label_smart_label_id` FOREIGN KEY (`smart_label_id`) REFERENCES `labels` (`label_id`)   ON UPDATE CASCADE ON DELETE CASCADE,\n          CONSTRAINT `FK_label_user_id` FOREIGN KEY (`user_id`) REFERENCES `users` (`user_id`)   ON UPDATE CASCADE ON DELETE CASCADE,\n          UNIQUE `slug`(slug),\n          INDEX `smart_label_id`(smart_label_id),\n          INDEX `user_id`(user_id),\n          INDEX `smart_key`(smart_key)\n        ) ENGINE=`InnoDB` DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;\n      ");
     // Add default data to labels
     // Default: Unlabeled, Read, Watch, Listen, Buy, Eat & Drink, Do
     // Then add all the smart labels
     $default_labels = array('unlabeled' => array('label_id' => 1, 'name' => 'Unlabeled'), 'read' => array('label_id' => 2, 'name' => 'Read'), 'watch' => array('label_id' => 3, 'name' => 'Watch'), 'listen' => array('label_id' => 4, 'name' => 'Listen'), 'buy' => array('label_id' => 5, 'name' => 'Buy'), 'eatdrink' => array('label_id' => 6, 'name' => 'Eat & Drink'), 'do' => array('label_id' => 7, 'name' => 'Do'));
     foreach ($default_labels as $label) {
         $slug = generateSlug($label['name']);
         $this->db->query("INSERT INTO `labels` (`label_id`, `name`, `slug`, `created_on`) VALUES ('" . $label['label_id'] . "', '" . $label['name'] . "', '" . $slug . "', '" . date('Y-m-d H:i:s') . "')");
     }
     // Start default system smart labels
     $smart_labels = array('2' => array('php.net', 'api.rubyonrails.org', 'ruby-doc.org', 'docs.jquery.com', 'codeigniter.com', 'css-tricks.com', 'developer.apple.com'), '3' => array('youtube.com', 'viddler.com', 'devour.com', 'ted.com', 'vimeo.com'), '5' => array('svpply.com', 'amazon.com', 'fab.com', 'zappos.com'), '6' => array('simplyrecipes.com', 'allrecipes.com', 'epicurious.com', 'foodnetwork.com', 'food.com'));
     // Loop thru smart labels and add them up
     foreach ($smart_labels as $label_id => $arr) {
         foreach ($arr as $domain) {
             $smart_info = getSmartLabelInfo('http://' . $domain);
             $this->db->query("\n              INSERT INTO `labels`\n              (`smart_label_id`, `domain`, `smart_key`, `created_on`)\n              VALUES ('" . $label_id . "', '" . $smart_info['domain'] . "', '" . $smart_info['key'] . "', '" . date('Y-m-d H:i:s') . "')\n            ");
         }
     }
     // Now open users_smartlabels, import into labels
     $labels = $this->db->query("SELECT userid, domain, path, label FROM users_smartlabels");
     if ($labels->num_rows() >= 1) {
         foreach ($labels->result() as $label) {
             // Proceed only if domain is not empty
             $current_label = strtolower($label->label);
             if (!empty($label->domain) && !empty($label->userid) && is_numeric($label->userid) && !empty($current_label) && array_key_exists($current_label, $default_labels)) {
                 // Standardize label domain, path and smart key
                 $smart_info = getSmartLabelInfo($label->domain . $label->path);
                 $domain = $smart_info['domain'];
                 $path = $smart_info['path'];
                 $md5 = $smart_info['key'];
                 $label_id = $default_labels[$current_label]['label_id'];
                 $path = empty($label->path) ? '' : "'" . $label->path . "', ";
                 $path_c = empty($label->path) ? '' : "`path`, ";
                 // Find an occurences of this record
                 $q = $this->db->query("\n              SELECT COUNT(*) FROM labels\n              WHERE user_id = '" . $label->userid . "'\n              AND domain = '" . $domain . "'\n              AND smart_label_id = '" . $label_id . "'\n            ");
                 $row = $q->row();
                 $total = (int) $row->{'COUNT(*)'};
                 // If not found, add it
                 if ($total < 1) {
                     $res = $this->db->query("\n                INSERT INTO `labels`\n                (`smart_label_id`, `user_id`, `domain`, " . $path_c . "`smart_key`, `created_on`)\n                VALUES ('" . $label_id . "', '" . $label->userid . "', '" . $domain . "', " . $path . "'" . $md5 . "', '" . date('Y-m-d H:i:s') . "')\n              ");
                 }
             }
         }
     }
     /*
     - End labels import
     */
     /*
     - Start updates for marks table
     */
     // Move all recipes to oembed column
     // oembed will be renamed embed for all embeddable content
     $marks = $this->db->query("SELECT id, recipe FROM `marks` WHERE recipe != '' AND LOWER(recipe) != 'none' AND recipe IS NOT NULL");
     if ($marks->num_rows() >= 1) {
         foreach ($marks->result() as $mark) {
             $res = $this->db->query("UPDATE `marks` SET `oembed` = '" . addslashes($mark->recipe) . "' WHERE `id` = '" . $mark->id . "'");
         }
     }
     // Update marks table
     $this->db->query("ALTER TABLE `marks` DROP COLUMN `recipe`");
     $this->db->query("ALTER TABLE `marks` CHANGE COLUMN `id` `mark_id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'The auto-incremented id for marks.'");
     $this->db->query("ALTER TABLE `marks` DROP PRIMARY KEY, ADD PRIMARY KEY (`mark_id`)");
     $this->db->query("ALTER TABLE `marks` CHANGE COLUMN `title` `title` varchar(150) NOT NULL COMMENT 'The title from the page being bookmarked.'");
     $this->db->query("ALTER TABLE `marks` CHANGE COLUMN `url` `url` text NOT NULL COMMENT 'The full url from the page being bookmarked.'");
     $this->db->query("ALTER TABLE `marks` ADD COLUMN `url_key` varchar(32) DEFAULT NULL COMMENT 'The MD5 checksum of the url for lookup purposes.' AFTER `url`");
     $this->db->query("ALTER TABLE `marks` CHANGE COLUMN `oembed` `embed` text DEFAULT NULL COMMENT 'The embedded content that could appear on the mark\\'s info page.'");
     $this->db->query("ALTER TABLE `marks` CHANGE COLUMN `dateadded` `created_on` datetime NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT 'The datetime this record was created.'");
     $this->db->query("ALTER TABLE `marks` ADD COLUMN `embed_processed` tinyint(1) NOT NULL DEFAULT '0' COMMENT '1 = yes, 0 if not. Defaults to 0.' AFTER `embed`");
     $this->db->query("ALTER TABLE `marks` ADD COLUMN `last_updated` timestamp NOT NULL ON UPDATE CURRENT_TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT 'The last datetime this record was updated.' AFTER `created_on`");
     // Update embed column to NULL if 'None'
     $res = $this->db->query("UPDATE `marks` SET embed = NULL WHERE LOWER(embed) = 'none'");
     // Set embed to processed if NOT NULL OR isn't in LAST DAY
     $res = $this->db->query("UPDATE `marks` SET embed_processed = '1' WHERE embed IS NOT NULL OR UNIX_TIMESTAMP(created_on) < '" . strtotime('today') . "'");
     // Get all urls from marks table, create MD5 checksum, update record
     $marks = $this->db->query("SELECT mark_id, url FROM `marks`");
     // If any exists, move on
     if ($marks->num_rows() >= 1) {
         // Set up empty arrays to hold marks that may get deleted or changed
         $deleted = array();
         $changed = array();
         // Loop thru results
         foreach ($marks->result() as $mark) {
             // If no url, remove it from DB and add to deleted list
             if (empty($mark->url)) {
                 $res = $this->db->query("DELETE FROM `marks` WHERE `mark_id` = '" . $mark->mark_id . "'");
                 array_push($deleted, $mark->mark_id);
             } else {
                 $checksum = md5($mark->url);
                 $record = $this->db->query("SELECT mark_id FROM `marks` WHERE `url_key` = '" . $checksum . "' LIMIT 1");
                 if ($record->num_rows() == 1) {
                     $record = $record->row();
                     $changed[$mark->mark_id] = $record->mark_id;
                     $res = $this->db->query("DELETE FROM `marks` WHERE `mark_id` = '" . $mark->mark_id . "'");
                 } else {
                     $res = $this->db->query("UPDATE `marks` SET `url_key` = '" . $checksum . "' WHERE `mark_id` = '" . $mark->mark_id . "'");
                 }
             }
         }
         // If the deleted array is not empty
         // Remove any user marks that are attached to it
         if (!empty($deleted)) {
             foreach ($deleted as $mark_id) {
                 $res = $this->db->query("DELETE FROM `users_marks` WHERE `urlid` = '" . $mark_id . "'");
             }
         }
         // If the changed array is not empty
         // Update any user marks from the old mark id to the new one
         if (!empty($changed)) {
             foreach ($changed as $old_id => $new_id) {
                 $res = $this->db->query("UPDATE `users_marks` SET `urlid` = '" . $new_id . "' WHERE `urlid` = '" . $old_id . "'");
             }
         }
     }
     // Finally, add a unique index for url key
     $this->db->query("ALTER TABLE `marks` ADD UNIQUE `url_key`(url_key)");
     /*
     - End updates for marks table
     */
     // Update users table
     // We are moving to active = 1 or 0 column, before altering table, switch active = 1, inactive = 0
     $res = $this->db->query("UPDATE `users` SET status = '0' WHERE status <> 'active'");
     $res = $this->db->query("UPDATE `users` SET status = '1' WHERE status = 'active'");
     $this->db->query("ALTER TABLE `users` DROP COLUMN `salt`");
     $this->db->query("ALTER TABLE `users` CHANGE COLUMN `status` `active` tinyint(1) NOT NULL DEFAULT '0' COMMENT '1 = active, 0 = inactive' AFTER `password`");
     $this->db->query("ALTER TABLE `users` CHANGE COLUMN `date_joined` `created_on` datetime NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT 'The datetime the account was created'");
     $this->db->query("ALTER TABLE `users` CHANGE COLUMN `admin` `admin` tinyint(1) NOT NULL DEFAULT '0' COMMENT '1 = admin, 0 = admin' AFTER `active`");
     $this->db->query("ALTER TABLE `users` ADD COLUMN `user_token` varchar(30) NOT NULL DEFAULT '0' COMMENT 'Unique user token.' AFTER `password`");
     // Add user tokens
     // Must check if they exist already
     $users = $this->db->query("SELECT user_id FROM `users`");
     if ($users->num_rows() >= 1) {
         foreach ($users->result() as $obj) {
             do {
                 $user_token = generateToken(30);
                 $res = $this->db->query("SELECT user_id FROM `users` WHERE user_token = '" . $user_token . "'");
             } while (isset($res->user_id));
             // Update user record
             $res = $this->db->query("UPDATE `users` SET user_token = '" . $user_token . "' WHERE user_id = '" . $obj->user_id . "'");
         }
     }
     // Update user token column to be no default
     // Add unique index
     $this->db->query("ALTER TABLE `users` CHANGE COLUMN `user_token` `user_token` varchar(30) NOT NULL COMMENT 'Unique user token.'");
     $this->db->query("ALTER TABLE `users` ADD UNIQUE `user_token`(user_token)");
     // Remove the users_smartlabels table
     $this->db->query("DROP TABLE IF EXISTS `users_smartlabels`");
     /*
     - Start users_to_marks transistion
     */
     // Update `tags` field to a single numeric in order to translate to a FK for labels
     // Move group id to user_marks_to_groups table
     $marks = $this->db->query("SELECT id, urlid, tags, groups, status FROM `users_marks`");
     $archived = array();
     $delete = array();
     if ($marks->num_rows() >= 1) {
         // Loop thru results
         foreach ($marks->result() as $mark) {
             $tags = explode(',', $mark->tags);
             $label_id = 1;
             $group_id = $mark->groups;
             $mark_id = $mark->id;
             // Figure if we should delete this mark
             $res = $this->db->query("SELECT mark_id FROM marks WHERE mark_id = '" . $mark->urlid . "' LIMIT 1");
             if ($res->num_rows() < 1) {
                 array_push($delete, $mark_id);
             }
             // If it was archived, save here to update later
             if (strtolower($mark->status) == 'archive') {
                 array_push($archived, $mark_id);
             }
             foreach ($tags as $tag) {
                 $tag = trim(strtolower($tag));
                 if (array_key_exists($tag, $default_labels)) {
                     $label_id = $default_labels[$tag]['label_id'];
                     break;
                 }
             }
             // Update tags
             $res = $this->db->query("UPDATE `users_marks` SET tags = '" . $label_id . "' WHERE id = '" . $mark_id . "'");
         }
     }
     // Remove any urlids in users_marks that do NOT exist in marks table
     // If we skip this step the FK creation will fail
     // Data is a bit dirty because when marks were deleted, it never deleted their children, leaving little orphan annies
     // Fix it!
     if (!empty($delete)) {
         foreach ($delete as $id) {
             $res = $this->db->query("DELETE FROM `users_marks` WHERE id = '" . $id . "'");
         }
     }
     // Update table name & structure
     $this->db->query("RENAME TABLE `users_marks` TO `users_to_marks`");
     $this->db->query("ALTER TABLE `users_to_marks` DROP COLUMN `addedby`");
     $this->db->query("ALTER TABLE `users_to_marks` DROP COLUMN `groups`");
     $this->db->query("ALTER TABLE `users_to_marks` DROP COLUMN `status`");
     $this->db->query("ALTER TABLE `users_to_marks` CHANGE COLUMN `id` `users_to_mark_id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'The auto-incremented key.'");
     $this->db->query("ALTER TABLE `users_to_marks` DROP PRIMARY KEY, ADD PRIMARY KEY (`users_to_mark_id`)");
     $this->db->query("ALTER TABLE `users_to_marks` CHANGE COLUMN `urlid` `mark_id` bigint(20) UNSIGNED NOT NULL COMMENT 'The mark_id from marks.mark_id.' AFTER `users_to_mark_id`");
     $this->db->query("ALTER TABLE `users_to_marks` CHANGE COLUMN `userid` `user_id` bigint(20) UNSIGNED NOT NULL COMMENT 'The user_id from users.user_id' AFTER `mark_id`");
     $this->db->query("ALTER TABLE `users_to_marks` CHANGE COLUMN `tags` `label_id` bigint(20) UNSIGNED NOT NULL DEFAULT '1' COMMENT 'The label_id from labels.label_id.'");
     $this->db->query("ALTER TABLE `users_to_marks` CHANGE COLUMN `note` `notes` text DEFAULT NULL");
     $this->db->query("ALTER TABLE `users_to_marks` CHANGE COLUMN `dateadded` `created_on` datetime NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT 'The datetime this record was created.'");
     $this->db->query("ALTER TABLE `users_to_marks` CHANGE COLUMN `datearchived` `archived_on` datetime DEFAULT NULL COMMENT 'The datetime this mark was archived. NULL = not archived.'");
     $this->db->query("ALTER TABLE `users_to_marks` ADD COLUMN `last_updated` timestamp NOT NULL ON UPDATE CURRENT_TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT 'The last datetime this record was updated.' AFTER `archived_on`");
     $this->db->query("ALTER TABLE `users_to_marks` ADD INDEX `mark_id`(mark_id)");
     $this->db->query("ALTER TABLE `users_to_marks` ADD INDEX `user_id`(user_id)");
     $this->db->query("ALTER TABLE `users_to_marks` ADD INDEX `label_id`(label_id)");
     $this->db->query("ALTER TABLE `users_to_marks` ADD CONSTRAINT `FK_utm_mark_id` FOREIGN KEY (`mark_id`) REFERENCES `marks` (`mark_id`)   ON UPDATE CASCADE ON DELETE CASCADE");
     $this->db->query("ALTER TABLE `users_to_marks` ADD CONSTRAINT `FK_utm_user_id` FOREIGN KEY (`user_id`) REFERENCES `users` (`user_id`)   ON UPDATE CASCADE ON DELETE CASCADE");
     $this->db->query("ALTER TABLE `users_to_marks` ADD CONSTRAINT `FK_utm_label_id` FOREIGN KEY (`label_id`) REFERENCES `labels` (`label_id`)   ON UPDATE CASCADE ON DELETE CASCADE");
     // Fix archived marks
     // First set all date_archived fields to NULL properly
     $res = $this->db->query("UPDATE `users_to_marks` SET archived_on = NULL WHERE archived_on IS NOT NULL");
     if (!empty($archived)) {
         foreach ($archived as $users_to_mark_id) {
             $res = $this->db->query("UPDATE `users_to_marks` SET archived_on = '" . date('Y-m-d H:i:s') . "' WHERE users_to_mark_id = '" . $users_to_mark_id . "'");
         }
     }
     /*
     - End users_to_marks transistion
     */
     // Create new tags table
     $this->db->query("\n        CREATE TABLE `tags` (\n          `tag_id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'The auto-incremented key fro tags.',\n          `name` varchar(100) NOT NULL COMMENT 'The tag name.',\n          `slug` varchar(100) NOT NULL COMMENT 'The tag slug name.',\n          PRIMARY KEY (`tag_id`),\n          INDEX `name`(name),\n          UNIQUE `slug`(slug)\n        ) ENGINE=`InnoDB` DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;\n      ");
     // Create new user_marks_to_tags table
     $this->db->query("\n        CREATE TABLE `user_marks_to_tags` (\n          `user_marks_to_tag_id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'The auto-incremented key.',\n          `tag_id` bigint(20) UNSIGNED NOT NULL COMMENT 'The tag id from tags.tag_id',\n          `user_id` bigint(20) UNSIGNED NOT NULL COMMENT 'The user id from users.user_id',\n          `users_to_mark_id` bigint(20) UNSIGNED NOT NULL COMMENT 'The user mark id from users_to_marks.users_to_mark_id',\n          PRIMARY KEY (`user_marks_to_tag_id`),\n          INDEX `users_to_mark_id`(users_to_mark_id),\n          INDEX `tag_id`(tag_id),\n          INDEX `user_id`(user_id),\n          CONSTRAINT `FK_umtt_tag_id` FOREIGN KEY (`tag_id`) REFERENCES `tags` (`tag_id`)   ON UPDATE CASCADE ON DELETE CASCADE,\n          CONSTRAINT `FK_umtt_user_id` FOREIGN KEY (`user_id`) REFERENCES `users` (`user_id`)   ON UPDATE CASCADE ON DELETE CASCADE,\n          CONSTRAINT `FK_umtt_mark_id` FOREIGN KEY (`users_to_mark_id`) REFERENCES `users_to_marks` (`users_to_mark_id`)   ON UPDATE CASCADE ON DELETE CASCADE\n        ) ENGINE=`InnoDB` DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;\n      ");
 }
Example #3
0
 protected function addMark($data = array())
 {
     $this->load->helper('http_build_url');
     // Set empty $result
     $result = array();
     // Set default view & redirect
     $view = null;
     $redirect = null;
     // Figure the url and title
     $url = isset($data['url']) ? $data['url'] : null;
     $title = isset($data['title']) ? $data['title'] : null;
     // If url or title are empty
     // error out
     if (empty($url)) {
         return formatErrors(8);
     }
     // 1.6
     // Remove utm_* from URLs before saving
     // Just grab the querystring
     $url_query_parameters = parse_url($url, PHP_URL_QUERY);
     // If utm_ is found, convert to array
     // Notice the _... so that words with utm do not get included
     if (strpos($url_query_parameters, 'utm_') === false) {
         // Whoops! echo '<br>No utm_ found.<br>';
     } else {
         parse_str($url_query_parameters, $url_query_parameters);
         // convert querystring to array
         // Prepare a new query string
         $new_query_string = array();
         // Loop through and reconstruct the querystring, leaving off anything with utm_ in key
         foreach ($url_query_parameters as $key => $value) {
             if (strpos($key, 'utm_') === false) {
                 $new_query_string[] = $key . '=' . $value;
             }
         }
         $new_query_string = implode('&', $new_query_string);
         $url = http_build_url($url, array('query' => $new_query_string));
     }
     // Sometimes browsers will not have a title
     // for things like a PDF or JPG.
     // In these instances, we still want people
     // to be able to save their marks. ;-)
     if (empty($title)) {
         $parsed_url_path = parse_url($url, PHP_URL_PATH);
         // If a path is found at all... use that for title instead
         if (!empty($parsed_url_path)) {
             $title = $parsed_url_path;
         }
     }
     if (empty($title)) {
         return formatErrors(9);
     }
     // Add mark to marks table
     $this->load->model('marks_model', 'mark');
     $mark = $this->mark->create(array('title' => $title, 'url' => $url));
     // Check ish
     if ($mark === false) {
         $user_mark = formatErrors(6);
     } elseif (!isset($mark->mark_id)) {
         $user_mark = $mark;
     } else {
         $this->load->model('users_to_marks_model', 'user_marks');
         $user_mark = $this->user_marks->readComplete("users_to_marks.user_id = '" . $this->user_id . "' AND users_to_marks.mark_id = '" . $mark->mark_id . "' AND users_to_marks.active = '1'");
         // Add
         if (!isset($user_mark->mark_id)) {
             // Set default options
             $options = array('user_id' => $this->user_id, 'mark_id' => $mark->mark_id);
             // Label ID (not required), if set and numeric and greater than 0, use it
             if (isset($data['label_id']) && is_numeric($data['label_id']) && $data['label_id'] > 0) {
                 $options['label_id'] = $data['label_id'];
             }
             // Notes (not required)
             if (isset($data['notes']) && !empty($data['notes'])) {
                 $options['notes'] = $data['notes'];
                 $tags = getTagsFromHash($options['notes']);
             }
             // Figure if any automatic labels should be applied
             $smart_info = getSmartLabelInfo($url);
             if (isset($smart_info['key']) && !empty($smart_info['key']) && !isset($options['label_id'])) {
                 // Load labels model
                 // Sort by user_id DESC (if user has same rule as system, use the user's rule)
                 // Try to extract label
                 $this->load->model('labels_model', 'labels');
                 $this->labels->sort = 'user_id DESC';
                 $label = $this->labels->readComplete("(labels.user_id IS NULL OR labels.user_id = '" . $this->user_id . "') AND labels.smart_key = '" . $smart_info['key'] . "' AND labels.active = '1'", 1);
                 // If a label id is found
                 // Set it to options to save
                 if (isset($label->settings->label->id)) {
                     $options['label_id'] = $label->settings->label->id;
                 }
             }
             // Create the mark
             $user_mark = $this->user_marks->create($options);
         }
         if ($user_mark === false) {
             $user_mark = formatErrors(6);
         } elseif (isset($user_mark->mark_id)) {
             // If tags are present, add them
             // Get updated result
             if (isset($tags)) {
                 $mark_id = $user_mark->mark_id;
                 self::addTags($tags, $mark_id);
                 $user_mark = $this->user_marks->readComplete($mark_id);
             }
         }
     }
     return $user_mark;
 }
Example #4
0
 /**
  * Import mark object into system
  *
  * @param stdObj $markObject
  *            Mark data imported from file
  * @return array Result array
  */
 public function importMark($markObject)
 {
     $result = array();
     $this->CI->load->helper('data_helper');
     // Run in transaction
     $this->CI->db->trans_start();
     if ($this->importData['meta']['export_version'] == 1) {
         $this->CI->load->model('marks_model', 'mark');
         $markArray = array('created_on' => $markObject->created_on, 'title' => empty($markObject->title) ? 'No title' : $markObject->title, 'url' => $markObject->url, 'embed' => $markObject->embed);
         // Import mark object
         $mark = $this->CI->mark->import($markArray);
         // Succesfully created mark
         if ($mark !== false && isset($mark->mark_id)) {
             // Try to create user_mark and other related records
             $this->CI->load->model('users_to_marks_model', 'user_marks');
             $user_mark = $this->CI->user_marks->readComplete("users_to_marks.user_id = '" . $this->importData['user_id'] . "' AND users_to_marks.mark_id = '" . $mark->mark_id . "' AND users_to_marks.active = '1'");
             // User mark does not exist - add one
             if (!isset($user_mark->mark_id)) {
                 // Set default options
                 $options = array('user_id' => $this->importData['user_id'], 'mark_id' => $mark->mark_id, 'active' => $markObject->active, 'archived_on' => $markObject->archived_on, 'created_on' => $markObject->created_on);
                 // Label ID (not required)
                 if (isset($markObject->label_id) && is_numeric($markObject->label_id)) {
                     $this->CI->load->model('labels_model', 'labels');
                     $label = $this->CI->labels->readComplete("(labels.user_id IS NULL OR labels.user_id='" . $this->importData['user_id'] . "') AND labels.active='1' AND labels.name = " . $this->CI->db->escape($markObject->label_name), 1);
                     if (!empty($label) && isset($label->label_id)) {
                         $options['label_id'] = $label->label_id;
                     } else {
                         if (!empty($this->unlabeled_label_id)) {
                             $options['label_id'] = $this->unlabeled_label_id;
                             $result['warnings'][] = 'Label ' . $markObject->label_name . ' not found. Marked as Unlabeled.';
                         } else {
                             if ($this->unlabeled_label_id === false) {
                                 $result['warnings'][] = 'Label ' . $markObject->label_name . ' not found. Stripped label info.';
                             } else {
                                 // Label not found and no unlabeled cache - looking for unlabeled label id
                                 $label = $this->CI->labels->readComplete("(labels.user_id IS NULL OR labels.user_id='" . $this->importData['user_id'] . "') AND labels.active='1' AND labels.name = " . $this->CI->db->escape('Unlabeled'), 1);
                                 if (!empty($label) && isset($label->label_id)) {
                                     $options['label_id'] = $label->label_id;
                                     // Cache the id of unlabeled label id
                                     $this->unlabeled_label_id = $label->label_id;
                                     $result['warnings'][] = 'Label ' . $markObject->label_name . ' not found. Marked as Unlabeled.';
                                 } else {
                                     // There is no unlabeled label - cache invalid value to mark
                                     $this->unlabeled_label_id = false;
                                     $result['warnings'][] = 'Label ' . $markObject->label_name . ' not found. Stripped label info.';
                                 }
                             }
                         }
                     }
                 }
                 // Notes (not required)
                 if (isset($markObject->notes) && !empty($markObject->notes)) {
                     $options['notes'] = $markObject->notes;
                     $tags = getTagsFromHash($options['notes']);
                 }
                 // Figure if any automatic labels should be applied
                 $smart_info = getSmartLabelInfo($markObject->url);
                 if (isset($smart_info['key']) && !empty($smart_info['key']) && !isset($options['label_id'])) {
                     // Load labels model
                     // Sort by user_id DESC (if user has same rule as system, use the user's rule)
                     // Try to extract label
                     $this->CI->load->model('labels_model', 'labels');
                     $this->CI->labels->sort = 'user_id DESC';
                     $label = $this->CI->labels->readComplete("(labels.user_id IS NULL OR labels.user_id = '" . $this->importData['user_id'] . "') AND labels.smart_key = '" . $smart_info['key'] . "' AND labels.active = '1'", 1);
                     // If a label id is found
                     // Set it to options to save
                     if (isset($label->settings->label->id)) {
                         $options['label_id'] = $label->settings->label->id;
                     }
                 }
                 // Create the mark
                 $user_mark = $this->CI->user_marks->import($options);
                 $result['result'] = 'added';
             } else {
                 $result['result'] = 'skipped';
             }
             // Added user mark
             if (isset($user_mark->mark_id)) {
                 // If tags are present, add them
                 // Get updated result
                 if (isset($tags)) {
                     self::addTags($tags, $user_mark->mark_id);
                 }
             }
         } else {
             if ($mark !== false) {
                 foreach ($mark as $errorCode => $errorMessage) {
                     $result['errors'][] = array('error_code' => $errorCode, 'error_message' => $errorMessage);
                 }
             } else {
                 $result['errors'][] = formatErrors(500);
             }
         }
     } else {
         $result['errors'][] = array('error_message' => 'Invalid data format ' . $this->importData['meta']['export_version']);
     }
     $this->CI->db->trans_complete();
     // Check if DB operations succeeded
     if ($this->CI->db->trans_status() === FALSE) {
         // Internal error
         $result['errors'][] = formatErrors(500);
     }
     if (!empty($result['errors'])) {
         $result['result'] = 'failed';
     }
     return $result;
 }
Example #5
0
 public function edit($label_id = 0)
 {
     // Figure correct way to handle if no mark id
     if (empty($label_id) || !is_numeric($label_id)) {
         $this->data['errors'] = formatErrors(30);
     } else {
         // Set the columns that CAN be updated
         $types = array('label', 'smart');
         // Lookup label_id to get type
         $user_where = parent::isAdmin() === true && isset($this->clean->admin) && !empty($this->clean->admin) ? "labels.user_id IS NULL" : "labels.user_id = '" . $this->user_id . "'";
         $where = "(labels.user_id IS NULL AND labels.label_id= '" . $label_id . "' AND labels.smart_label_id IS NULL) OR (" . $user_where . " AND labels.label_id= '" . $label_id . "' AND labels.smart_label_id IS NOT NULL)";
         $label = $this->labels->readComplete($where, 1);
         // If no type found, there was no label for this id/user combo
         if (!isset($label->type)) {
             $this->data['errors'] = formatErrors(31);
         } elseif ($label->type == 'label' && parent::isAdmin() === false) {
             $this->data['errors'] = formatErrors(37);
         } elseif (!array_key_exists($label->type, $types)) {
             $this->data['errors'] = formatErrors(33);
         } else {
             $options = array();
             $total = 0;
             // Figure options per label type
             if ($label->type == 'smart') {
                 if (isset($this->db_clean->url) && !empty($this->db_clean->url)) {
                     $smart_info = getSmartLabelInfo($this->db_clean->url);
                     $options['domain'] = $smart_info['domain'];
                     $options['path'] = $smart_info['path'];
                     $options['smart_key'] = $smart_info['key'];
                     $total = $this->labels->count($user_where . " AND labels.smart_key = '" . $options['smart_key'] . "'");
                 }
                 // If label is sent, add to options
                 if (isset($this->db_clean->label_id) && !is_numeric($this->db_clean->label_id)) {
                     $options['smart_label_id'] = $this->db_clean->label_id;
                 }
             } else {
                 if (isset($this->db_clean->name) && !empty($this->db_clean->name)) {
                     $options['name'] = $this->db_clean->name;
                     $options['slug'] = generateSlug($options['name']);
                     $total = $this->labels->count("labels.user_id IS NULL AND labels.slug = '" . $options['slug'] . "'");
                 }
             }
             // Figure if there was an active state passed
             if (isset($this->db_clean->active) && ($this->db_clean->active == 0 || $this->db_clean->active == 1)) {
                 $options['active'] = $this->db_clean->active;
             }
             // If no options, return error
             if (empty($options)) {
                 $this->data['errors'] = formatErrors(35);
             } elseif ($total > 0) {
                 $this->data['errors'] = formatErrors(34);
             } else {
                 $label = $this->labels->update($where, $options);
                 // If update failed, tell the user
                 if ($label === false) {
                     $this->data['errors'] = formatErrors(39);
                 } else {
                     $this->data['label'] = $label;
                 }
             }
         }
     }
     // Figure view
     $this->figureView();
 }