public static function save($params)
 {
     $item = $params['item'];
     $status = $params['status'];
     $type = $params['type'];
     $transcript = $params['transcript'];
     $user = User::getAuthenticatedUser();
     // Make sure user has access (member of project, item is in queue)
     // TODO: Finish
     // Update it if it exists; add it if it doesn't
     $transcriptObj = $user->loadTranscript($item, $type);
     if ($transcriptObj) {
         $user->updateTranscript($item, $status, $transcript->getText(), $transcript->getFields(), $type);
     } else {
         $user->addTranscript($item, $status, $transcript->getText(), $transcript->getFields(), $type);
     }
     // Load the project
     $project = new Project($item->project_slug);
     $projectOwner = new User($project->owner);
     // TODO: load any users who have admin rights
     // Trigger notifications
     $notify = Settings::getProtected('notify');
     $notify->trigger("user_save_transcript_{$status}", array('user' => $user, 'username' => $user->username, 'item' => $item->title));
     $notify->trigger("admin_save_transcript_{$status}", array('admins' => array($projectOwner), 'username' => $user->username, 'item' => $item->title));
 }
 public static function admin($params)
 {
     $format = Utils::getFormat($params['args'], 0, 2);
     $app_url = Settings::getProtected('app_url');
     $db = Settings::getProtected('db');
     $user = User::getAuthenticatedUser();
     // Make sure the user is at least creator or admin
     RoleController::forceClearance(array('system.creator', 'system.admin'), $user);
     // Get latest work for the user's projects
     $latestWorkList = $db->getAdminProjectsLatestWork($user->username, 5);
     $latestWork = array();
     foreach ($latestWorkList as $work) {
         $qn = $work['queue_name'];
         $type = substr($qn, strpos($qn, '.') + 1, strpos($qn, ':') - strpos($qn, '.') - 1);
         $username = substr($qn, strpos($qn, ':') + 1);
         $item = new Item($work['item_id'], $work['project_slug']);
         $project = new Project($work['project_slug']);
         if ($item->project_type == 'system') {
             $transcriptURL = "{$app_url}/projects/" . $item->project_slug . "/items/" . $item->item_id . "/{$type}/{$username}";
             $editURL = "{$app_url}/projects/" . $item->project_slug . "/items/" . $item->item_id . "/edit";
         } else {
             $transcriptURL = "{$app_url}/" . $item->project_owner . "/projects/" . $item->project_slug . "/items/" . $item->item_id . "/{$type}/{$username}";
             $editURL = "{$app_url}/" . $item->project_owner . "/projects/" . $item->project_slug . "/items/" . $item->item_id . "/edit";
         }
         array_push($latestWork, array('item' => $item->getResponse(), 'project' => $project->getResponse(), 'type' => $type, 'username' => $username, 'date_completed' => $work['date_completed'], 'transcript_url' => $transcriptURL, 'edit_url' => $editURL));
     }
     $newestMembers = $db->getNewestProjectMembers($user->username, 5);
     // Only get list of users if they're a site admin
     $users = array();
     if ($user->role == 'admin') {
         $usernameList = $db->getUsers();
         foreach ($usernameList as $username) {
             $tempUser = new User($username['username']);
             $tempUserArray = $tempUser->getResponse();
             // Get list of projects they're working on
             $projects = $db->getUserProjectsWithStats($username['username']);
             $tempUserArray['projects'] = $projects;
             array_push($users, $tempUserArray);
         }
     }
     $response = array('page_title' => 'Admin Dashboard', 'user' => $user->getResponse(), 'latest_work' => $latestWork, 'newest_members' => $newestMembers, 'users' => $users);
     switch ($format) {
         case 'json':
             echo json_encode($response);
             break;
         case 'html':
             Template::render('admin_dashboard', $response);
             break;
     }
 }
 public static function userDashboard($params)
 {
     $format = $params['args'][1] != '' ? $params['args'][1] : 'html';
     $app_url = Settings::getProtected('app_url');
     $user = User::getAuthenticatedUser();
     // Put it in the settings cache
     Settings::setProtected('username', $user->username);
     // Set up proofing and reviewing objects
     $proofing = array();
     $reviewing = array();
     // Load the user's proofing queue
     $proofQueue = new Queue("user.proof:{$user->username}");
     $proofing['items'] = array();
     foreach ($proofQueue->getItems() as $item) {
         array_push($proofing['items'], array('title' => $item->title, 'status' => $item->status, 'project_slug' => $item->project_slug, 'project_type' => $item->project_type, 'project_owner' => $item->project_owner, 'item_id' => $item->item_id, 'type' => $item->type));
     }
     // Load the user's reviewing queue
     $reviewQueue = new Queue("user.review:{$user->username}");
     $reviewing['items'] = array();
     foreach ($reviewQueue->getItems() as $item) {
         array_push($reviewing['items'], array('title' => $item->title, 'status' => $item->status, 'project_slug' => $item->project_slug, 'project_type' => $item->project_type, 'project_owner' => $item->project_owner, 'item_id' => $item->item_id, 'type' => $item->type));
     }
     // Add extra info (edit link and slug) to each item
     $prooflist = array();
     foreach ($proofing['items'] as &$item) {
         if ($item['project_type'] == 'system') {
             $item['editlink'] = $app_url . '/projects/' . $item['project_slug'] . '/items/' . $item['item_id'] . '/proof';
         } else {
             if ($item['project_type'] == 'user') {
                 $item['editlink'] = $app_url . '/users/' . $item['project_owner'] . '/projects/' . $item['project_slug'] . '/items/' . $item['item_id'] . '/proof';
             }
         }
         if (!in_array($item['project_slug'], $prooflist)) {
             $prooflist[] = $item['project_slug'];
         }
     }
     $reviewlist = array();
     foreach ($reviewing['items'] as &$item) {
         if ($item['project_type'] == 'system') {
             $item['editlink'] = $app_url . '/projects/' . $item['project_slug'] . '/items/' . $item['item_id'] . '/review';
         } else {
             if ($item['project_type'] == 'user') {
                 $item['editlink'] = $app_url . '/users/' . $item['project_owner'] . '/projects/' . $item['project_slug'] . '/items/' . $item['item_id'] . '/review';
             }
         }
         if (!in_array($item['project_slug'], $reviewlist)) {
             $reviewlist[] = $item["project_slug"];
         }
     }
     // Add link and percentages to each project
     $projects = $user->getProjectSummaries();
     $projectInfo = array();
     $proofing['projects'] = array();
     $reviewing['projects'] = array();
     foreach ($projects as &$project) {
         $roles = $user->getRolesForProject($project['slug']);
         // If the project is available for proofing or reviewing (with no items already claimed),
         // then add it to the appropriate list
         if (!in_array($project["slug"], $prooflist) && $project["available_to_proof"] > 0 && in_array('proofer', $roles)) {
             array_push($proofing['projects'], $project['slug']);
         }
         if (!in_array($project["slug"], $reviewlist) && $project["available_to_review"] > 0 && in_array('reviewer', $roles)) {
             array_push($reviewing['projects'], $project['slug']);
         }
         // Set up percentage bars
         if ($project['num_items'] == 0) {
             $project['percent_proofed'] = 0;
             $project['percent_reviewed'] = 0;
         } else {
             $project['percent_proofed'] = round($project['num_proofed'] / $project['num_items'] * 100, 0);
             $project['percent_reviewed'] = round($project['num_reviewed'] / $project['num_items'] * 100, 0);
         }
         // And the project link
         if ($project['type'] == 'system') {
             $project['link'] = $app_url . '/projects/' . $project['slug'];
         } else {
             if ($project['type'] == 'user') {
                 $project['link'] = $app_url . '/users/' . $project['owner'] . '/projects/' . $project['slug'];
             }
         }
         $projectInfo[$project['slug']] = $project;
     }
     // Blank slate condition if there are no items and no projects
     $proofing['blankslate'] = count($proofing['items']) == 0 && count($proofing['projects']) == 0 ? true : false;
     $reviewing['blankslate'] = count($reviewing['items']) == 0 && count($reviewing['projects']) == 0 ? true : false;
     // Get the user's history and the top proofers information
     $history = $user->getHistory();
     $topusers = User::getTopUsers();
     // Prepare user history
     foreach ($history as &$event) {
         if ($event['project_type'] == 'system') {
             $event['editlink'] = "{$app_url}/projects/" . $event['project_slug'] . '/items/' . $event['item_id'] . '/proof';
         } else {
             if ($project['type'] == 'user') {
                 $event['editlink'] = "{$app_url}/users/" . $event['project_owner'] . '/projects/' . $event['project_slug'] . '/items/' . $event['item_id'] . '/proof';
             }
         }
         $event['title'] = $event['item_title'];
     }
     $response = array('page_title' => 'Dashboard', 'user' => $user->getResponse(), 'projects' => $projectInfo, 'proofing' => array('items' => $proofing['items'], 'projects' => $proofing['projects'], 'blankslate' => $proofing['blankslate']), 'reviewing' => array('items' => $reviewing['items'], 'projects' => $reviewing['projects'], 'blankslate' => $reviewing['blankslate']), 'history' => $history, 'history_count' => count($history), 'registered_methods' => array('/users/' . $user->username), 'topusers' => $topusers);
     switch ($params['method']) {
         // GET: Get user dashboard
         case 'GET':
             switch ($format) {
                 case 'json':
                     echo json_encode($response);
                     break;
                 case 'html':
                     Template::render('dashboard', $response);
                     break;
             }
             break;
     }
 }
 public static function getNewItem($params)
 {
     $format = Utils::getFormat($params['args'], 0, 2);
     $projectPage = Utils::getProjectType($params['args']);
     $projectSlugIndex = $projectPage == 'system' ? 0 : 2;
     $projectSlug = $params['args'][$projectSlugIndex];
     $user = User::getAuthenticatedUser();
     switch ($params['method']) {
         // POST: Get next available item
         case 'POST':
             $type = Utils::POST('type');
             // proof or review
             $dispatch = Settings::getProtected('dispatch');
             $dispatch->init(array('username' => $user->username, 'projectSlug' => $projectSlug, 'type' => $type));
             $response = $dispatch->next();
             if ($response['status'] == true) {
                 $itemId = $response['code'];
                 // Load the item to make sure it's real
                 $item = new Item('', $itemId, $projectSlug, $user->username, $type);
                 // Verification check
                 if ($item->status == 'available') {
                     // Put it in the user's queue
                     $queue = new Queue("user.{$type}:{$user->username}", true);
                     $queue->add($item);
                     $queue->save();
                 }
             }
             echo json_encode($response);
             break;
     }
 }
 public static function import($params)
 {
     $appUrl = Settings::getProtected('app_url');
     $themeRoot = Settings::getProtected('theme_root');
     $format = Utils::getFormat($params['args'], 1, 3);
     $projectType = Utils::getProjectType($params['args']);
     $projectSlug = $projectType == 'system' ? $params['args'][0] : $params['args'][2];
     $user = User::getAuthenticatedUser();
     // Load the project
     $project = new Project($projectSlug);
     RoleController::forceClearance(array('project.admin', 'project.owner', 'system.admin'), $user, array('project' => $project));
     if ($project->title == '') {
         Utils::redirectToDashboard('', 'Error loading project.');
     }
     if ($project->type == 'system') {
         $projectUrl = "projects/" . $project->slug;
     } else {
         if ($project->type == 'user') {
             $projectUrl = "users/" . $project->owner . "/projects/" . $project->slug;
         }
     }
     $project->getItems();
     $projectArray = $project->getResponse();
     $projectArray['items'] = $project->items;
     $projectArray['url'] = "{$appUrl}/{$projectUrl}";
     switch ($params['method']) {
         // GET: Get transcript import page
         case 'GET':
             $response = array('page_title' => 'Import Transcript', 'user' => $user->getResponse(), 'project' => $projectArray);
             switch ($format) {
                 case 'json':
                     echo json_encode(array('status' => 'success', 'response' => $response));
                     break;
                 case 'html':
                     Template::render('import', $response);
                     break;
             }
             break;
             // POST: Update transcripts for items
         // POST: Update transcripts for items
         case 'POST':
             $template = Utils::POST('template');
             $transcript = Utils::POST('transcript');
             $items = Utils::POST('items');
             $projectSlug = Utils::POST('projectSlug');
             $status = 'success';
             // Split the transcript
             $splitTranscripts = TranscriptController::splitTranscript($transcript, $template);
             // Make sure the number of items still matches, otherwise return error
             if (count($splitTranscripts) != count($items)) {
                 $status = 'error';
             }
             // Update each item's transcript
             for ($i = 0; $i < count($items); $i++) {
                 $item = new Item($items[$i], $projectSlug);
                 $item->transcript = $splitTranscripts[$i];
                 if (!$item->save()) {
                     $status = 'error';
                     break;
                 }
             }
             echo json_encode(array('status' => $status));
             break;
     }
 }