%PDF- %PDF-
Direktori : /www/varak.net/paste.varak.net-5.6/app/controllers/ |
Current File : //www/varak.net/paste.varak.net-5.6/app/controllers/ListController.php |
<?php /** * Sticky Notes * * An open source lightweight pastebin application * * @package StickyNotes * @author Sayak Banerjee * @copyright (c) 2014 Sayak Banerjee <mail@sayakbanerjee.com> * @license http://www.opensource.org/licenses/bsd-license.php * @link http://sayakbanerjee.com/sticky-notes * @since Version 1.0 * @filesource */ /** * ShowController * * This controller handles displaying of a paste lists * * @package StickyNotes * @subpackage Controllers * @author Sayak Banerjee */ class ListController extends BaseController { /** * Displays the default list page * * @access public * @return \Illuminate\Support\Facades\View */ public function getAll() { $perPage = Site::config('general')->perPage; // Show all pastes to admins if (Auth::roles()->admin) { $query = Paste::query(); } else { $query = Paste::where('private', '<>', 1); } // Filter by project if ( ! empty($this->project)) { $query = $query->where('project', $this->project); } $pastes = $query->orderBy('id', 'desc')->paginate($perPage); return $this->getList($pastes, TRUE); } /** * Fetches the top N trending pastes, where N = perPage from site config * * @access public * @param string $age * @return \Illuminate\Support\Facades\View */ public function getTrending($age = 'now') { $perPage = Site::config('general')->perPage; $time = time(); $filter = $time - 259200; // Calculate age based on filter switch ($age) { case 'week': $filter = $time - 1814400; break; case 'month': $filter = $time - 7776000; break; case 'year': $filter = $time - 94608000; break; case 'all': $filter = 0; break; } // Get all pastes matching the age filter $query = Paste::where('timestamp', '>=', $filter); // Hide private pastes from non-admins if ( ! Auth::roles()->admin) { $query = $query->where('private', '<>', 1); } // Filter by project if ( ! empty($this->project)) { $query = $query->where('project', $this->project); } // We do not really need paginate() here, however the generic method // we are using here depends on it. $pastes = $query->orderBy('hits', 'desc')->take($perPage)->paginate($perPage); return $this->getList($pastes, FALSE, TRUE); } /** * Gets user's own pastes * * @access public * @param int $userId * @return \Illuminate\Support\Facades\View */ public function getUserPastes($userId) { $perPage = Site::config('general')->perPage; // Remove the leading 'u' from the userId $userId = substr($userId, 1); // Get all pastes for the specific author $query = Paste::where('author_id', $userId); // Apply restrictions to non-admins if ( ! Auth::roles()->admin) { $query = $query->where(function($query) { // Fetch all pastes belonging to the current user $query->where('author_id', Auth::user()->id); // If paste doesn't belong to current user, hide if private $query->orWhere('private', '<>', 1); }); } // Show latest first $pastes = $query->orderBy('id', 'desc')->paginate($perPage); return $this->getList($pastes); } /** * Searches for a paste by its content * * @access public * @param string $term * @return \Illuminate\Support\Facades\View */ public function getSearch() { $term = Input::get('q'); $config = Site::config('general'); // Initialize the antispam filters $antispam = Antispam::make('search', 'q'); if ($config->pasteSearch AND strlen($term) >= 5) { if ($antispam->passes() OR Session::has('search.exempt')) { // Show all pastes to admins if (Auth::roles()->admin) { $query = Paste::query(); } else { $query = Paste::where('private', '<>', 1); } // Append the search term $query = $query->where('data', 'like', "%{$term}%"); // Filter by project if ( ! empty($this->project)) { $query = $query->where('project', $this->project); } // Get number of results to show per page $perPage = $config->perPage; // Query the search results $pastes = $query->orderBy('id', 'desc')->paginate($perPage); // Append the search term to pagination URLs $pastes->appends('q', $term); // We will not run antispam if it passed once and there are // multiple pages. But we exempt it only for the next request. Session::flash('search.exempt', $perPage > $pastes->count()); return $this->getList($pastes, TRUE); } else { Session::flash('messages.error', $antispam->message()); } } return Redirect::to('all')->withInput(); } /** * Searches for a paste by its content * * @access public * @return \Illuminate\Support\Facades\View */ public function postSearch() { // Initialize the validator $validator = Validator::make(Input::all(), array( 'search' => 'required|min:5|max:500' )); // Run the validation rules if ($validator->passes()) { return Redirect::to('search?q='.Input::get('search')); } else { Session::flash('messages.error', $validator->messages()->all('<p>:message</p>')); return Redirect::to('all')->withInput(); } } /** * Displays a list of flagged pastes * * @access public * @return \Illuminate\Support\Facades\View */ public function getFlagged() { $perPage = Site::config('general')->perPage; // Get all flagged pastes $query = Paste::where('flagged', 1); // Filter by project if ( ! empty($this->project)) { $query = $query->where('project', $this->project); } $pastes = $query->orderBy('id', 'desc')->paginate($perPage); return $this->getList($pastes, TRUE); } /** * Parses and displays a list * * @param \Illuminate\Database\Eloquent\Model $pastes * @param bool $showFilters * @param bool $showSearch * @return \Illuminate\Support\Facades\View */ private function getList($pastes, $showSearch = FALSE, $showFilters = FALSE) { // Check if no pastes were found if ($pastes->count() === 0) { App::abort(418); // No pastes found } // Output the view $data = array( 'pastes' => $pastes, 'pages' => $pastes->links(), 'filters' => $showFilters, 'search' => $showSearch AND Site::config('general')->pasteSearch, ); return View::make('site/list', $data); } }