From d9dc582c08c6df2d6951299a45a691a56bdd9075 Mon Sep 17 00:00:00 2001 From: Josef Citrine Date: Sat, 12 Nov 2016 21:57:29 +0000 Subject: [PATCH] Start of announcements admin panel --- app/Commands/CreateAnnouncementCommand.php | 70 +++++++++++++++++++ app/Http/Controllers/AdminController.php | 5 ++ .../Api/Web/AnnouncementsController.php | 32 +++++++++ app/Providers/AuthServiceProvider.php | 4 ++ public/templates/admin/_layout.html | 1 + public/templates/admin/announcements.html | 5 ++ resources/assets/scripts/app/app.coffee | 10 +++ .../controllers/admin-announcements.coffee | 23 ++++++ .../scripts/app/services/announcements.coffee | 6 ++ routes/web.php | 7 ++ 10 files changed, 163 insertions(+) create mode 100644 app/Commands/CreateAnnouncementCommand.php create mode 100644 public/templates/admin/announcements.html create mode 100644 resources/assets/scripts/app/controllers/admin-announcements.coffee diff --git a/app/Commands/CreateAnnouncementCommand.php b/app/Commands/CreateAnnouncementCommand.php new file mode 100644 index 00000000..8ae614ab --- /dev/null +++ b/app/Commands/CreateAnnouncementCommand.php @@ -0,0 +1,70 @@ +. + */ + +namespace Poniverse\Ponyfm\Commands; + +use Gate; +use Poniverse\Ponyfm\Models\Announcement; +use Validator; + +class CreateAnnouncementCommand extends CommandBase +{ + /** @var Announcement */ + private $_announcementName; + + public function __construct($announcementName) + { + $this->_announcementName = $announcementName; + } + + /** + * @return bool + */ + public function authorize() + { + return Gate::allows('create-announcement'); + } + + /** + * @throws \Exception + * @return CommandResponse + */ + public function execute() + { + + $rules = [ + 'name' => 'required|max:50', + ]; + + $validator = Validator::make([ + 'name' => $this->_announcementName, + ], $rules); + + if ($validator->fails()) { + return CommandResponse::fail($validator); + } + + Announcement::create([ + 'title' => $this->_announcementName, + ]); + + return CommandResponse::succeed(['message' => 'Announcement created!']); + } +} diff --git a/app/Http/Controllers/AdminController.php b/app/Http/Controllers/AdminController.php index 821cfef4..c3c70505 100644 --- a/app/Http/Controllers/AdminController.php +++ b/app/Http/Controllers/AdminController.php @@ -53,4 +53,9 @@ class AdminController extends Controller { return View::make('shared.null'); } + + public function getAnnouncements() + { + return View::make('shared.null'); + } } diff --git a/app/Http/Controllers/Api/Web/AnnouncementsController.php b/app/Http/Controllers/Api/Web/AnnouncementsController.php index caf974f4..0ab43b9e 100644 --- a/app/Http/Controllers/Api/Web/AnnouncementsController.php +++ b/app/Http/Controllers/Api/Web/AnnouncementsController.php @@ -21,8 +21,10 @@ namespace Poniverse\Ponyfm\Http\Controllers\Api\Web; use Carbon\Carbon; +use Poniverse\Ponyfm\Commands\CreateAnnouncementCommand; use Poniverse\Ponyfm\Http\Controllers\Controller; use Poniverse\Ponyfm\Models\Announcement; +use Request; use Response; class AnnouncementsController extends Controller { @@ -42,4 +44,34 @@ class AnnouncementsController extends Controller { 200 ); } + + public function getAdminIndex() { + $this->authorize('access-admin-area'); + + $announcements = Announcement::orderBy('start_time', 'desc') + ->get(); + + return Response::json([ + 'announcements' => $announcements->toArray() + ], 200); + } + + public function getItemById($genreId) { + $this->authorize('access-admin-area'); + + $query = Announcement::where('id', '=', $genreId) + ->orderBy('start_time', 'desc'); + + $announcement = $query->first(); + + return Response::json( + ["announcement" => $announcement], + 200 + ); + } + + public function postCreate() { + $command = new CreateAnnouncementCommand(Request::get('name')); + return $this->execute($command); + } } diff --git a/app/Providers/AuthServiceProvider.php b/app/Providers/AuthServiceProvider.php index 3b4b7835..aceaf21b 100644 --- a/app/Providers/AuthServiceProvider.php +++ b/app/Providers/AuthServiceProvider.php @@ -72,6 +72,10 @@ class AuthServiceProvider extends ServiceProvider return $user->hasRole('admin'); }); + Gate::define('create-announcement', function (User $user) { + return $user->hasRole('admin'); + }); + $this->registerPolicies(); } } diff --git a/public/templates/admin/_layout.html b/public/templates/admin/_layout.html index f94c5b84..3ee9d07f 100644 --- a/public/templates/admin/_layout.html +++ b/public/templates/admin/_layout.html @@ -4,6 +4,7 @@
  • Genres
  • Show Songs
  • Users
  • +
  • Announcements
  • diff --git a/public/templates/admin/announcements.html b/public/templates/admin/announcements.html new file mode 100644 index 00000000..abd03e80 --- /dev/null +++ b/public/templates/admin/announcements.html @@ -0,0 +1,5 @@ +
    + +
    diff --git a/resources/assets/scripts/app/app.coffee b/resources/assets/scripts/app/app.coffee index 2ddf4f7e..f828ac90 100644 --- a/resources/assets/scripts/app/app.coffee +++ b/resources/assets/scripts/app/app.coffee @@ -293,6 +293,16 @@ ponyfm.config [ controller: 'admin-users' templateUrl: '/templates/admin/users.html' + state.state 'admin.announcements', + url: '/announcements' + controller: 'admin-announcements' + templateUrl: '/templates/admin/announcements.html' + + state.state 'admin.announcement', + url: '/announcements/{id:[^\-]+}-{slug}' + templateUrl: '/templates/admin/announcement-show.html' + controller: 'admin-announcement-edit' + # Homepage if window.pfm.auth.isLogged diff --git a/resources/assets/scripts/app/controllers/admin-announcements.coffee b/resources/assets/scripts/app/controllers/admin-announcements.coffee new file mode 100644 index 00000000..bd068a5a --- /dev/null +++ b/resources/assets/scripts/app/controllers/admin-announcements.coffee @@ -0,0 +1,23 @@ +# Pony.fm - A community for pony fan music. +# Copyright (C) 2016 Josef Citrine +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . + +module.exports = angular.module('ponyfm').controller "admin-announcements", [ + '$scope', 'announcements' + ($scope, announcements) -> + announcements.getAdminList().done (ann) -> + $scope.announcements = ann + console.log $scope.announcements +] diff --git a/resources/assets/scripts/app/services/announcements.coffee b/resources/assets/scripts/app/services/announcements.coffee index 0a1d4b18..7bd2a3e6 100644 --- a/resources/assets/scripts/app/services/announcements.coffee +++ b/resources/assets/scripts/app/services/announcements.coffee @@ -28,5 +28,11 @@ module.exports = angular.module('ponyfm').factory('announcements', [ def.resolve(announcementResponse.announcement) def.promise() + getAdminList: () -> + def = new $.Deferred() + $http.get('/api/web/admin/announcements').success (announcementResponse) -> + def.resolve(announcementResponse.announcements) + def.promise() + self ]) diff --git a/routes/web.php b/routes/web.php index d56eed27..973653ed 100644 --- a/routes/web.php +++ b/routes/web.php @@ -193,6 +193,12 @@ Route::group(['prefix' => 'api/web'], function () { Route::get('/tracks', 'Api\Web\TracksController@getAllTracks'); Route::get('/tracks/unclassified', 'Api\Web\TracksController@getClassifierQueue'); + + Route::get('/announcements', 'Api\Web\AnnouncementsController@getAdminIndex'); + Route::get('/announcements/{id}', 'Api\Web\AnnouncementsController@getItemById')->where('id', '\d+'); + Route::post('/announcements', 'Api\Web\AnnouncementsController@postCreate'); + Route::put('/announcements/{id}', 'Api\Web\AnnouncementsController@putUpdate')->where('id', '\d+'); + Route::delete('/announcements/{id}', 'Api\Web\AnnouncementsController@deleteItem')->where('id', '\d+'); }); Route::post('/auth/logout', 'Api\Web\AuthController@postLogout'); @@ -205,6 +211,7 @@ Route::group(['prefix' => 'admin', 'middleware' => ['auth', 'can:access-admin-ar Route::get('/tracks/unclassified', 'AdminController@getClassifierQueue'); Route::get('/show-songs', 'AdminController@getShowSongs'); Route::get('/users', 'AdminController@getUsers'); + Route::get('/announcements', 'AdminController@getAnnouncements'); Route::get('/', 'AdminController@getIndex'); });