From fc5cef0efddbb1141b0a371108a23fc7f6e8d860 Mon Sep 17 00:00:00 2001 From: Camil Staps Date: Mon, 5 Sep 2016 22:30:47 +0200 Subject: Vote on verb suggestions --- app/Http/Controllers/VerbController.php | 86 +++++++++++++++++++++++++++++++++ app/Http/Middleware/Login.php | 34 +++++++++++++ app/Http/routes.php | 30 +++++++++--- 3 files changed, 144 insertions(+), 6 deletions(-) create mode 100644 app/Http/Controllers/VerbController.php create mode 100644 app/Http/Middleware/Login.php (limited to 'app/Http') diff --git a/app/Http/Controllers/VerbController.php b/app/Http/Controllers/VerbController.php new file mode 100644 index 0000000..98b0579 --- /dev/null +++ b/app/Http/Controllers/VerbController.php @@ -0,0 +1,86 @@ + + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +namespace App\Http\Controllers; + +use HebrewParseTrainer\Verb; +use HebrewParseTrainer\VerbAction; +use HebrewParseTrainer\RandomLog; +use Illuminate\Http\Request; +use Illuminate\Support\Facades\Input; +use Illuminate\Support\Facades\Auth; +use Laravel\Lumen\Routing\Controller as BaseController; + +class VerbController extends BaseController { + + public function random() { + $verbs = Verb::where('active', 1)->get(); + foreach (Input::get() as $col => $val) { + $val = explode(',', $val); + $verbs = $verbs->filter(function(Verb $item) use ($col, $val) { + return in_array($item->getAttribute($col), $val); + }); + } + $verb = $verbs->random(); + + $log = new RandomLog(); + $log->request = json_encode(Input::get()); + $log->response = $verb->id; + $log->ip = $_SERVER['REMOTE_ADDR']; + $log->save(); + + $obj = ['verb' => $verb, 'answers' => $verb->otherParsings()]; + return response()->json($obj); + } + + public function vote($choice, $verb_id) { + $verb = Verb::findOrFail($verb_id); + $user = Auth::user(); + + if ($verb->active) + return ['success' => false, 'message' => 'This verb has been accepted already.']; + + foreach ($verb->actions()->where('kind', VerbAction::KIND_VOTE)->get() as $vote) { + if ($vote->user->id == $user->id) { + $vote->delete(); + } + } + + $vote = new VerbAction; + $vote->user_id = $user->id; + $vote->verb_id = $verb_id; + $vote->kind = VerbAction::KIND_VOTE; + $vote->vote_weight = ($choice == 1 ? 1 : -1) * $user->voteWeight(); + $vote->save(); + + $message = 'You have voted.'; + + if ($verb->voteCount() >= Verb::ACCEPTED_VOTE_COUNT) { + $verb->active = 1; + $verb->save(); + } + + return [ + 'success' => true, + 'vote_weight' => $user->voteWeight(), + 'accepted' => (bool) $verb->active, + 'new_vote_count' => $verb->voteCount() + ]; + } + +} diff --git a/app/Http/Middleware/Login.php b/app/Http/Middleware/Login.php new file mode 100644 index 0000000..8a71104 --- /dev/null +++ b/app/Http/Middleware/Login.php @@ -0,0 +1,34 @@ +has('login') && !Auth::check()) { + return response('Unauthorized.', 401) + ->header('WWW-Authenticate', 'Basic realm="Please enter your email and password"'); + } + + return $next($request); + } +} diff --git a/app/Http/routes.php b/app/Http/routes.php index 9cf12b4..8313029 100644 --- a/app/Http/routes.php +++ b/app/Http/routes.php @@ -29,7 +29,10 @@ */ $app->group( - ['prefix' => parse_url(env('APP_URL'), PHP_URL_PATH)], + [ + 'prefix' => parse_url(env('APP_URL'), PHP_URL_PATH), + 'middleware' => 'login' + ], function ($app) { $app->get('/', function () use ($app) { @@ -44,15 +47,24 @@ $app->group( return \HebrewParseTrainer\Tense::all(); }); + $app->get('/verb/random', + 'App\Http\Controllers\VerbController@random'); + $app->get('/logout', function () use ($app) { - return response('Unauthorized.', 401) - ->header('WWW-Authenticate', 'Basic realm="Please click OK, then Cancel to logout."'); + return response('You have been logged out.', 401) + ->header( + 'WWW-Authenticate', + 'Basic realm="Please click OK, then Cancel to logout."'); }); - $app->get('/verb/random', 'App\Http\Controllers\RandomVerbController@show'); + $app->get('/contribute', function () use ($app) { + return view('contribute'); + }); - $app->get('/user/create', 'App\Http\Controllers\UserController@createForm'); - $app->post('/user/create', 'App\Http\Controllers\UserController@createForm'); + $app->get('/user/create', + 'App\Http\Controllers\UserController@createForm'); + $app->post('/user/create', + 'App\Http\Controllers\UserController@createForm'); $app->group( ['middleware' => 'auth:basic-http'], @@ -62,6 +74,12 @@ $app->group( return view('stats'); }); + $app->get('/verb/{id}/vote/{choice}', + 'App\Http\Controllers\VerbController@vote'); + + $app->post('/verb/suggest', + 'App\Http\Controllers\VerbController@suggest'); + }); }); -- cgit v1.2.3