initialize project

This commit is contained in:
Afrina Alimi
2024-02-08 09:30:14 +08:00
commit 25d85dac75
206 changed files with 50977 additions and 0 deletions
+40
View File
@@ -0,0 +1,40 @@
<?php
namespace App\Console;
use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
class Kernel extends ConsoleKernel
{
/**
* The Artisan commands provided by your application.
*
* @var array
*/
protected $commands = [
//
];
/**
* Define the application's command schedule.
*
* @param \Illuminate\Console\Scheduling\Schedule $schedule
* @return void
*/
protected function schedule(Schedule $schedule)
{
// $schedule->command('inspire')
// ->hourly();
}
/**
* Register the Closure based commands for the application.
*
* @return void
*/
protected function commands()
{
require base_path('routes/console.php');
}
}
+12
View File
@@ -0,0 +1,12 @@
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Election extends Model
{
protected $table = 'election';
protected $fillable = ['status', 'start', 'end', 'name'];
public $timestamps = false;
}
+65
View File
@@ -0,0 +1,65 @@
<?php
namespace App\Exceptions;
use Exception;
use Illuminate\Auth\AuthenticationException;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
class Handler extends ExceptionHandler
{
/**
* A list of the exception types that should not be reported.
*
* @var array
*/
protected $dontReport = [
\Illuminate\Auth\AuthenticationException::class,
\Illuminate\Auth\Access\AuthorizationException::class,
\Symfony\Component\HttpKernel\Exception\HttpException::class,
\Illuminate\Database\Eloquent\ModelNotFoundException::class,
\Illuminate\Session\TokenMismatchException::class,
\Illuminate\Validation\ValidationException::class,
];
/**
* Report or log an exception.
*
* This is a great spot to send exceptions to Sentry, Bugsnag, etc.
*
* @param \Exception $exception
* @return void
*/
public function report(Exception $exception)
{
parent::report($exception);
}
/**
* Render an exception into an HTTP response.
*
* @param \Illuminate\Http\Request $request
* @param \Exception $exception
* @return \Illuminate\Http\Response
*/
public function render($request, Exception $exception)
{
return parent::render($request, $exception);
}
/**
* Convert an authentication exception into an unauthenticated response.
*
* @param \Illuminate\Http\Request $request
* @param \Illuminate\Auth\AuthenticationException $exception
* @return \Illuminate\Http\Response
*/
protected function unauthenticated($request, AuthenticationException $exception)
{
if ($request->expectsJson()) {
return response()->json(['error' => 'Unauthenticated.'], 401);
}
return redirect()->guest(route('login'));
}
}
@@ -0,0 +1,37 @@
<?php
namespace App\Http\Controllers\API\v1\Admin;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\User;
class AddController extends Controller
{
public function __invoke (Request $request)
{
$this->validateRequest($request);
$this->insertAdmin($request);
return response()->json([
'status' => 'success',
'message' => 'Admin added successfully'
]);
}
private function insertAdmin($request)
{
$admin = $request->all();
$admin['password'] = bcrypt($request->password);
User::create($admin);
}
private function validateRequest($request)
{
$this->validate($request, [
'name' => 'required|unique:users',
'email' => 'required|email|unique:users',
'password' => 'required',
'confirm_password' => 'same:password'
]);
}
}
@@ -0,0 +1,24 @@
<?php
namespace App\Http\Controllers\API\v1\Admin;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\User;
class DeleteController extends Controller
{
public function __invoke($id)
{
if ($id == 1)
return response()->json([
'status' => 'failed',
'message' => 'You can\'t delete the main admin.'
]);
User::destroy($id);
return response()->json([
'status' => 'success',
'message' => 'Admin deleted successfully.'
]);
}
}
@@ -0,0 +1,21 @@
<?php
namespace App\Http\Controllers\API\v1\Admin;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\User;
class GetController extends Controller
{
public function __invoke()
{
return User::all();
}
public function show(Request $request, $id)
{
$id = $request->user()->id;
return User::find($id);
}
}
@@ -0,0 +1,20 @@
<?php
namespace App\Http\Controllers\API\v1\Admin;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Http\Controllers\Util;
class InformationController extends Controller
{
public function __invoke(Request $request)
{
return response()->json([
'election' => \App\Election::find(Util::getCurrentElection()),
'user' => $request->user(),
'partylist' => \App\Partylist::where('election_id', Util::getCurrentElection())->get(),
'position' => \App\Position::where('election_id', Util::getCurrentElection())->get()
]);
}
}
@@ -0,0 +1,63 @@
<?php
namespace App\Http\Controllers\API\v1\Admin;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use App\Http\Controllers\Controller;
use App\Http\Controllers\Util;
use App\User;
class LoginController extends Controller
{
/**
* Admin Login
* @param {Request} $request
* @return {Response} result
*/
public function __invoke(Request $request)
{
$this->validateRequest($request);
if ($this->checkLogin($request)) {
$user = Auth::user();
$result['status'] = 'success';
$result['message'] = 'Login Successfully';
$result['user'] = $user;
$result['election_status'] = Util::getElectionStatus();
$result['token'] = $user->createToken('My app', ['admin'])->accessToken;
} else {
$result['status'] = 'failed';
$result['message'] = 'Wrong email or password';
}
return response()->json($result);
}
/**
* Validate Request
* @param {Request} $request
* @return {Boolean} isValid
*/
private function validateRequest($request)
{
$this->validate($request, [
'email' => 'required|email',
'password'=> 'required'
]);
}
/**
* Check Credential
* @param {Request} $request
* @return {Boolean} isLogin
*/
private function checkLogin($request)
{
return Auth::attempt([
'email' => $request->email,
'password' => $request->password
]);
}
}
@@ -0,0 +1,21 @@
<?php
namespace App\Http\Controllers\API\v1\Admin;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use App\Http\Controllers\Controller;
class LogoutController extends Controller
{
public function __invoke()
{
Auth::guard('web')->logout();
Auth::guard('voter')->logout();
return response()->json([
'status' => 'success',
'message' => 'Logout successfully',
'user' => Auth::user()
]);
}
}
@@ -0,0 +1,57 @@
<?php
namespace App\Http\Controllers\API\v1\Admin;
use Illuminate\Http\Request;
use Illuminate\Validation\Rule;
use Illuminate\Support\Facades\Hash;
use App\Http\Controllers\Controller;
use App\User;
class UpdateController extends Controller
{
public function __invoke(Request $request, $id)
{
$id = $request->user()->id;
$this->validateRequest($request, $id);
$this->updateAdmin($request, $id);
return response()->json([
'status' => 'success',
'message' => 'Admin updated successfully'
]);
}
public function updatePassword(Request $request, $id)
{
$id = $request->user()->id;
$this->validatePassword($request, $id);
$password = Hash::make($request->password);
User::find($id)->update(['password'=>$password]);
return response()->json([
'status' => 'success',
'message' => 'Password updated successfully'
]);
}
private function validatePassword($request, $id)
{
$this->validate($request, [
'old_password' => "required|password:users,password,$id",
'password' => 'required',
'confirm_password' => 'required|same:password'
]);
}
private function updateAdmin($request, $id)
{
User::find($id)->update($request->all());
}
private function validateRequest($request, $id)
{
$this->validate($request, [
'name' => ['required', Rule::unique('users')->ignore($id)],
'email' => ['required', Rule::unique('users')->ignore($id), 'email']
]);
}
}
@@ -0,0 +1,13 @@
<?php
namespace App\Http\Controllers\API\v1\Election;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
class GetController extends Controller
{
public function __invoke(){
return \App\Election::where('status', 3)->orderBy('id', 'desc')->get();
}
}
@@ -0,0 +1,23 @@
<?php
namespace App\Http\Controllers\API\v1\Election;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Http\Controllers\Util;
use Illuminate\Support\Facades\Auth;
class InformationController extends Controller
{
public function __invoke()
{
$id = Util::getCurrentElection();
$information['election'] = \App\Election::find($id);
$information['position'] = \App\Position::where('election_id', $id)->get();
$information['partylist'] = \App\Partylist::where('election_id', $id)->get();
$information['nominee'] = \App\Nominee::where('election_id', $id)->get();
$information['result'] = \App\Result::where('voter_id', Auth::id())->get();
$information['voter'] = Auth::user();
return response()->json($information);
}
}
@@ -0,0 +1,43 @@
<?php
namespace App\Http\Controllers\API\v1\Election;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Http\Controllers\Util;
use DB;
class ResultController extends Controller
{
public function __invoke(Request $request)
{
$result = $this->getResult(Util::getCurrentElection());
return response()->json(
$result
);
}
public function finalResult($id)
{
$result = $this->getResult($id);
$position = \App\Position::where('election_id', $id)->get();
$nominee = \App\Nominee::where('election_id', $id)->get();
$partylist = \App\Partylist::where('election_id', $id)->get();
return response()->json([
'result'=>$result,
'position'=>$position,
'nominee'=>$nominee
]);
}
private function getResult($id)
{
return \App\Result::select(DB::raw('position_id,nominee_id,count(*) as votes'))
->groupBy('position_id', 'nominee_id')
->where('election_id', $id)
->orderBy('votes', 'DESC')
->get();
}
}
@@ -0,0 +1,61 @@
<?php
namespace App\Http\Controllers\API\v1\Election;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use App\Http\Controllers\Controller;
use App\Http\Controllers\Util;
use App\Election;
class StartController extends Controller
{
public function __invoke(Request $request)
{
$this->validateRequest($request);
if ($this->hasNoNominee())
return response()->json([
'status' => 'failed',
'message' => 'There is no nominees'
]);
if ($this->isElectionStarted())
return response()->json([
'status' => 'failed',
'message' => 'Election has already started'
]);
$election = Election::find(Util::getCurrentElection())
->update([
'status'=>2,
'start'=>date('Y-m-d H:i:s'),
'name'=>$request->name
]);
return response()->json([
'status' => 'success',
'message' => 'Election has started.',
'election' => Election::find(Util::getCurrentElection())
]);
}
private function hasNoNominee()
{
return \App\Nominee::where('election_id', Util::getCurrentElection())->count() < 1;
}
private function isElectionStarted()
{
return Util::getElectionStatus() == 2;
}
private function validateRequest($request)
{
$id = Auth::id();
$this->validate($request, [
'password' => "required|password:users,password,$id"
]);
}
}
@@ -0,0 +1,56 @@
<?php
namespace App\Http\Controllers\API\v1\Election;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Http\Controllers\Util;
use App\Election;
class StopController extends Controller
{
public function __invoke(Request $request)
{
if (!$this->isElectionStarted())
return response()->json([
'status' => 'failed',
'message' => 'Election hasn\'t started yet.'
]);
$this->validateRequest($request);
$this->stopElection($request);
return response()->json([
'status' => 'success',
'message' => 'Election has finished.',
'election' => Election::find(Util::getCurrentElection())
]);
}
private function stopElection($request)
{
$election = Election::find(Util::getCurrentElection())
->update([
'status'=>3,
'name'=>$request->name,
'end'=>date('Y-m-d H:i:s')
]);
Election::create();
}
private function validateRequest($request)
{
$id = $request->user()->id;
$this->validate($request, [
'password' => "required|password:users,password,$id"
]);
}
private function isElectionStarted()
{
return Util::getElectionStatus() == 2;
}
}
@@ -0,0 +1,108 @@
<?php
namespace App\Http\Controllers\API\v1\Election;
use Illuminate\Http\Request;
use Illuminate\Validation\Rule;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth;
use App\Http\Controllers\Util;
use App\Position;
use App\Nominee;
use App\Result;
class VoteController extends Controller
{
public function __invoke(Request $request)
{
if ($this->validateRequest($request)['status'] == 'failed') {
return response()->json($this->validateRequest($request));
}
$this->insertVote($request);
return response()->json([
'status' => 'success',
'message' => 'Voted successfully',
'result' => Result::where('voter_id', Auth::id())->get()
]);
}
private function insertVote($request)
{
foreach ($request->vote as $key => $value) {
Result::updateOrCreate([
'voter_id' => Auth::id(),
'election_id' => Util::getCurrentElection(),
'position_id' => $value['position_id'],
], ['nominee_id' => $value['nominee_id']]);
}
}
private function validNominee($id, $position_id)
{
return Nominee::where([
['id', '=', $id],
['position_id', '=', $position_id]
])->count();
}
private function isPositionExist($id)
{
return Position::where('id', $id)->count();
}
private function voteAllPosition($request)
{
$total_position = Position::where('election_id', Util::getCurrentElection())->count();
$total_vote = count($request->vote);
return $total_vote >= $total_position;
}
private function validateRequest($request)
{
$result['status'] = 'failed';
$vote = $request->vote;
/**
* Check if the user vote on all position
*/
if (!$this->voteAllPosition($request)) {
$result['message'] = 'You must vote on all position.';
return $result;
}
foreach ($vote as $key => $value) {
/**
* Check if position_id and nominee_id has a value
*/
if (empty($value['position_id']) || empty($value['nominee_id'])) {
$result['message'] = 'You must vote on all position.';
return $result;
}
/**
* Check if the Position you vote exists
*/
if (!$this->isPositionExist($value['position_id'])) {
$result['message'] = 'Invalid Position.';
return $result;
}
/**
* Check if the Nominee you vote on certain position exists
*/
elseif (!$this->validNominee($value['nominee_id'], $value['position_id'])) {
$result['message'] = 'Invalid Nominee for '.Position::find($value['position_id'])->name.' position.';
return $result;
}
}
return ['status'=>'success'];
}
}
@@ -0,0 +1,54 @@
<?php
namespace App\Http\Controllers\API\v1\Nominee;
use Illuminate\Http\Request;
use Illuminate\Validation\Rule;
use App\Http\Controllers\Controller;
use App\Http\Controllers\Util;
use App\Nominee;
class AddController extends Controller
{
public function __invoke (Request $request)
{
$this->validateRequest($request);
$this->insertNominee($request);
return response()->json([
'status' => 'success',
'message'=> 'Nominee added successfully'
]);
}
public function validateRequest ($request)
{
$this->validate($request, [
'name' => [
'required',
Rule::unique('nominee')->where(function($query){
$query->where('election_id', Util::getCurrentElection());
})
],
'student_id' => [
'required',
Rule::unique('nominee')->where(function($query){
$query->where('election_id', Util::getCurrentElection());
})
],
'course' => 'required',
'position_id' => 'required|exists:position,id',
'partylist_id' => 'nullable|exists:partylist,id',
'image' => 'nullable|image'
]);
}
public function insertNominee ($request)
{
$nominee = $request->all();
$default_image = config('app.cloudinary_enabled') ? config('app.cloudinary_image_default') : config('app.nominee_image');
$nominee['image'] = Util::getImagePath($request, config('app.nominee_directory'), $default_image);
$nominee['election_id'] = Util::getCurrentElection();
Nominee::create($nominee);
}
}
@@ -0,0 +1,23 @@
<?php
namespace App\Http\Controllers\API\v1\Nominee;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Http\Controllers\Util;
use App\Nominee;
class DeleteController extends Controller
{
public function __invoke ($id)
{
$nominee = Nominee::find($id);
Util::deleteImage($nominee->image);
$nominee->delete();
return response()->json([
'status' => 'success',
'message'=> 'Nominee deleted successfully'
]);
}
}
@@ -0,0 +1,18 @@
<?php
namespace App\Http\Controllers\API\v1\Nominee;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Http\Controllers\Util;
class GetController extends Controller
{
public function __invoke()
{
$nominee = \App\Nominee::where('election_id', Util::getCurrentElection())
->orderBy('position_id')
->get();
return $nominee;
}
}
@@ -0,0 +1,63 @@
<?php
namespace App\Http\Controllers\API\v1\Nominee;
use Illuminate\Http\Request;
use Illuminate\Validation\Rule;
use App\Http\Controllers\Controller;
use App\Http\Controllers\Util;
use App\Nominee;
class UpdateController extends Controller
{
public function __invoke (Request $request, $id)
{
$this->validateRequest($request, $id);
$this->updateNominee($request, $id);
return response()->json([
'status' => 'success',
'message' => 'Nominee updated successfully'
]);
}
private function validateRequest($request, $id)
{
$this->validate($request, [
'name' => [
'required',
Rule::unique('nominee')->ignore($id)->where(function($query){
$query->where('election_id', Util::getCurrentElection());
})
],
'student_id' => [
'required',
Rule::unique('nominee')->ignore($id)->where(function($query){
$query->where('election_id', Util::getCurrentElection());
})
],
'course' => 'required',
'position_id' => 'required|exists:nominee,position_id',
'partylist_id' => 'nullable|exists:nominee,partylist_id'
]);
}
private function updateNominee ($request, $id)
{
$nominee = Nominee::find($id);
$default_image = $nominee->image;
$nominee->name = $request->name;
$nominee->course = $request->course;
$nominee->student_id = $request->student_id;
$nominee->position_id = $request->position_id;
$nominee->partylist_id = $request->partylist_id;
$nominee->motto = $request->motto;
$nominee->description = $request->description;
$nominee->image = Util::getImagePath($request, config('app.nominee_directory'), $default_image);
$nominee->save();
if (!empty($request->image))
Util::deleteImage($default_image);
}
}
@@ -0,0 +1,42 @@
<?php
namespace App\Http\Controllers\API\v1\Partylist;
use Illuminate\Http\Request;
use Illuminate\Validation\Rule;
use App\Http\Controllers\Controller;
use App\Http\Controllers\Util;
use App\Partylist;
class AddController extends Controller
{
public function __invoke(Request $request)
{
$this->validateRequest($request);
$this->insertPartylist($request);
return response()->json([
'status' => 'success',
'message'=> 'Partylist added successfully'
]);
}
private function validateRequest($request)
{
$this->validate($request, [
'name' => [
'required',
Rule::unique('partylist')->where(function($query){
$query->where('election_id', Util::getCurrentElection());
})
]
]);
}
private function insertPartylist($request)
{
$partylist = $request->all();
$partylist['election_id'] = Util::getCurrentElection();
Partylist::create($partylist);
}
}
@@ -0,0 +1,19 @@
<?php
namespace App\Http\Controllers\API\v1\Partylist;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Partylist;
class DeleteController extends Controller
{
public function __invoke($id)
{
Partylist::find($id)->delete();
return response()->json([
'status' => 'success',
'message' => 'Partylist deleted successfully'
]);
}
}
@@ -0,0 +1,17 @@
<?php
namespace App\Http\Controllers\API\v1\Partylist;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Http\Controllers\Util;
use App\Partylist;
class GetController extends Controller
{
public function __invoke()
{
$election_id = Util::getCurrentElection();
return Partylist::where('election_id', $election_id)->get();
}
}
@@ -0,0 +1,41 @@
<?php
namespace App\Http\Controllers\API\v1\Partylist;
use Illuminate\Http\Request;
use Illuminate\Validation\Rule;
use App\Http\Controllers\Controller;
use App\Http\Controllers\Util;
use App\Partylist;
class UpdateController extends Controller
{
public function __invoke(Request $request, $id)
{
$this->validateRequest($request, $id);
$this->updatePartylist($request, $id);
return response()->json([
'status' => 'success',
'message' => 'Partylist updated successfully'
]);
}
public function validateRequest($request, $id)
{
$this->validate($request, [
'name' => [
'required',
Rule::unique('partylist')->ignore($id)->where(function($query){
$query->where('election_id', Util::getCurrentElection());
})
]
]);
}
public function updatePartylist($request, $id)
{
$partylist = Partylist::find($id);
$partylist->name = $request->name;
$partylist->save();
}
}
@@ -0,0 +1,45 @@
<?php
namespace App\Http\Controllers\API\v1\Position;
use Illuminate\Http\Request;
use Illuminate\Validation\Rule;
use App\Http\Controllers\Controller;
use App\Http\Controllers\Util;
use App\Election;
use App\Position;
class AddPositionController extends Controller
{
public function __invoke(Request $request)
{
$this->validateRequest($request);
$this->insertPosition($request);
$result = [
'status' => 'success',
'message'=> 'Position added successfully'
];
return response()->json($result);
}
private function validateRequest($request)
{
$this->validate($request, [
'name' => [
'required',
Rule::unique('position')->where(function($query){
$query->where('election_id', Util::getCurrentElection());
})
]
]);
}
private function insertPosition($request)
{
$position = $request->all();
$position['election_id'] = Util::getCurrentElection();
Position::create($position);
}
}
@@ -0,0 +1,24 @@
<?php
namespace App\Http\Controllers\API\v1\Position;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Position;
class DeletePositionController extends Controller
{
public function __invoke($id)
{
$position = Position::find($id);
$position->delete();
$result = [
'status' => 'success',
'message'=> 'Position deleted successfully'
];
return response()->json($result);
}
}
@@ -0,0 +1,17 @@
<?php
namespace App\Http\Controllers\API\v1\Position;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Http\Controllers\Util;
use App\Position;
class GetPositionController extends Controller
{
public function __invoke()
{
$election_id = Util::getCurrentElection();
return Position::where('election_id', $election_id)->get();
}
}
@@ -0,0 +1,44 @@
<?php
namespace App\Http\Controllers\API\v1\Position;
use Illuminate\Http\Request;
use Illuminate\Validation\Rule;
use App\Http\Controllers\Controller;
use App\Http\Controllers\Util;
use App\Position;
class UpdatePositionController extends Controller
{
public function __invoke(Request $request, $id)
{
$this->validateRequest($request, $id);
$this->updatePosition($request, $id);
$result = [
'status' => 'success',
'message'=> 'Position updated successfully'
];
return response()->json($result);
}
private function updatePosition($request, $id)
{
$position = Position::find($id);
$position->name = $request->name;
$position->save();
}
private function validateRequest($request, $id)
{
$this->validate($request, [
'name' => [
'required',
Rule::unique('position')->ignore($id)->where(function($query){
$query->where('election_id', Util::getCurrentElection());
})
]
]);
}
}
@@ -0,0 +1,48 @@
<?php
namespace App\Http\Controllers\API\v1\Voter;
use Illuminate\Http\Request;
use Illuminate\Validation\Rule;
use App\Http\Controllers\Controller;
use App\Http\Controllers\Util;
use App\Voter;
class AddController extends Controller
{
public function __invoke(Request $request)
{
$this->validateRequest($request);
$this->insertVoter($request);
return response()->json([
'status' => 'success',
'message' => 'Voter added successfully'
]);
}
private function insertVoter($request)
{
$voter = $request->all();
$voter['election_id'] = Util::getCurrentElection();
Voter::create($voter);
}
private function validateRequest($request)
{
$this->validate($request, [
'name' => [
'required',
Rule::unique('voter')->where(function($query){
$query->where('election_id', Util::getCurrentElection());
})
],
'student_id' => [
'required',
Rule::unique('voter')->where(function($query){
$query->where('election_id', Util::getCurrentElection());
})
],
'course' => 'required'
]);
}
}
@@ -0,0 +1,19 @@
<?php
namespace App\Http\Controllers\API\v1\Voter;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Voter;
class DeleteController extends Controller
{
public function __invoke($id)
{
Voter::destroy($id);
return response()->json([
'status' => 'success',
'message' => 'Voter deleted successgully.'
]);
}
}
@@ -0,0 +1,16 @@
<?php
namespace App\Http\Controllers\API\v1\Voter;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Http\Controllers\Util;
use App\Voter;
class GetController extends Controller
{
public function __invoke()
{
return Voter::where('election_id', Util::getCurrentElection())->paginate(10);
}
}
@@ -0,0 +1,30 @@
<?php
namespace App\Http\Controllers\API\v1\Voter;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Http\Controllers\Util;
use Illuminate\Support\Facades\Auth;
class LoginController extends Controller
{
public function __invoke(Request $request)
{
//return response()->json(Auth::guard('user'));
if (Auth::guard('voter')->attempt(['student_id' => $request->student_id, 'password' => 'admin', 'election_id' => Util::getCurrentElection()])) {
return response()->json([
'status' => 'success',
'message' => 'Login successfully.',
'user' => Auth::guard('voter')->user(),
'election_status' => Util::getElectionStatus(),
'token' => Auth::guard('voter')->user()->createToken('My Token', ['vote'])->accessToken
]);
} else {
return response()->json([
'status' => 'failed',
'message' => 'Invalid ID.'
]);
}
}
}
@@ -0,0 +1,47 @@
<?php
namespace App\Http\Controllers\API\v1\Voter;
use Illuminate\Http\Request;
use Illuminate\Validation\Rule;
use App\Http\Controllers\Controller;
use App\Http\Controllers\Util;
use App\Voter;
class UpdateController extends Controller
{
public function __invoke(Request $request, $id)
{
$this->validateRequest($request, $id);
$this->updateVoter($request, $id);
return response()->json([
'status' => 'success',
'message' => 'Voter updated successfully.'
]);
}
private function validateRequest($request, $id)
{
$this->validate($request, [
'name' => [
'required',
Rule::unique('voter')->ignore($id)->where(function($query){
$query->where('election_id', Util::getCurrentElection());
})
],
'student_id' => [
'required',
Rule::unique('voter')->ignore($id)->where(function($query){
$query->where('election_id', Util::getCurrentElection());
})
],
'course' => 'required'
]);
}
private function updateVoter($request, $id)
{
$voter = $request->all();
Voter::find($id)->update($voter);
}
}
@@ -0,0 +1,32 @@
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\SendsPasswordResetEmails;
class ForgotPasswordController extends Controller
{
/*
|--------------------------------------------------------------------------
| Password Reset Controller
|--------------------------------------------------------------------------
|
| This controller is responsible for handling password reset emails and
| includes a trait which assists in sending these notifications from
| your application to your users. Feel free to explore this trait.
|
*/
use SendsPasswordResetEmails;
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('guest');
}
}
@@ -0,0 +1,39 @@
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
class LoginController extends Controller
{
/*
|--------------------------------------------------------------------------
| Login Controller
|--------------------------------------------------------------------------
|
| This controller handles authenticating users for the application and
| redirecting them to your home screen. The controller uses a trait
| to conveniently provide its functionality to your applications.
|
*/
use AuthenticatesUsers;
/**
* Where to redirect users after login.
*
* @var string
*/
protected $redirectTo = '/home';
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('guest')->except('logout');
}
}
@@ -0,0 +1,71 @@
<?php
namespace App\Http\Controllers\Auth;
use App\User;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Validator;
use Illuminate\Foundation\Auth\RegistersUsers;
class RegisterController extends Controller
{
/*
|--------------------------------------------------------------------------
| Register Controller
|--------------------------------------------------------------------------
|
| This controller handles the registration of new users as well as their
| validation and creation. By default this controller uses a trait to
| provide this functionality without requiring any additional code.
|
*/
use RegistersUsers;
/**
* Where to redirect users after registration.
*
* @var string
*/
protected $redirectTo = '/home';
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('guest');
}
/**
* Get a validator for an incoming registration request.
*
* @param array $data
* @return \Illuminate\Contracts\Validation\Validator
*/
protected function validator(array $data)
{
return Validator::make($data, [
'name' => 'required|string|max:255',
'email' => 'required|string|email|max:255|unique:users',
'password' => 'required|string|min:6|confirmed',
]);
}
/**
* Create a new user instance after a valid registration.
*
* @param array $data
* @return \App\User
*/
protected function create(array $data)
{
return User::create([
'name' => $data['name'],
'email' => $data['email'],
'password' => bcrypt($data['password']),
]);
}
}
@@ -0,0 +1,39 @@
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\ResetsPasswords;
class ResetPasswordController extends Controller
{
/*
|--------------------------------------------------------------------------
| Password Reset Controller
|--------------------------------------------------------------------------
|
| This controller is responsible for handling password reset requests
| and uses a simple trait to include this behavior. You're free to
| explore this trait and override any methods you wish to tweak.
|
*/
use ResetsPasswords;
/**
* Where to redirect users after resetting their password.
*
* @var string
*/
protected $redirectTo = '/home';
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('guest');
}
}
@@ -0,0 +1,14 @@
<?php
namespace App\Http\Controllers\Auth;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
class UserController extends Controller
{
public function index(Request $request)
{
return $request->user();
}
}
+13
View File
@@ -0,0 +1,13 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Foundation\Bus\DispatchesJobs;
use Illuminate\Routing\Controller as BaseController;
use Illuminate\Foundation\Validation\ValidatesRequests;
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
class Controller extends BaseController
{
use AuthorizesRequests, DispatchesJobs, ValidatesRequests;
}
+98
View File
@@ -0,0 +1,98 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;
class Util extends Controller
{
/**
* Delete an Image
* @param {String} $image
*
*/
public static function deleteImage ($image) {
if (Util::isDefaultImage($image)) return;
Storage::delete($image);
}
/**
* Get the id of current election
*
* @return {Int} $id
*/
public static function getCurrentElection ()
{
return \App\Election::where('id', '>', 0)->orderBy('id', 'desc')->first()->id;
}
/**
* Get the status of current Election
*
* @return {Int} $electio_status
*/
public static function getElectionStatus ()
{
return \App\Election::find(Util::getCurrentElection())->status;
}
/**
* Upload image and return it's path
* @param {Request} $request
* @param {String} $directory
* @param {String} $default_image
* @return {String} $image_path
*/
public static function getImagePath(Request $request, $directory, $default_image, $filename=null)
{
if (empty($request->image)){
return $default_image;
}else if (config('app.cloudinary_enabled')) {
return Util::uploadFileToCloudinary($request);
} else {
$filename = $filename ?: time().' .jpg';
return $request->file('image')->storeAs($directory, $filename);
}
}
/**
* Check if image is default
* @param {String} $image
* @return {Boolean} $isDefault
*/
public static function isDefaultImage ($image)
{
return ($image == config('app.nominee_image'));
}
public static function getCloudinaryConfig()
{
$config = new \Cloudinary\Configuration\Configuration();
$config->cloud->cloudName = config('app.cloudinary_cloud_name');
$config->cloud->apiKey = config('app.cloudinary_api_key');
$config->cloud->apiSecret = config('app.cloudinary_api_secret');
$config->url->secure = true;
return $config;
}
public static function uploadFileToCloudinary($request)
{
try{
$config = Util::getCloudinaryConfig();
$cloudinary = new \Cloudinary\Cloudinary($config);
$uploadApi = $cloudinary->uploadApi();
$image = base64_encode(file_get_contents($request->file('image')));
$result = $uploadApi->upload('data:image/gif;base64,'.$image, ['folder' => config('app.cloudinary_folder')]);
return $result["url"];
} catch (\Throwable $exception) {
return config('app.cloudinary_image_error');
}
}
}
+68
View File
@@ -0,0 +1,68 @@
<?php
namespace App\Http;
use Illuminate\Foundation\Http\Kernel as HttpKernel;
class Kernel extends HttpKernel
{
/**
* The application's global HTTP middleware stack.
*
* These middleware are run during every request to your application.
*
* @var array
*/
protected $middleware = [
\Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
\Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
\App\Http\Middleware\TrimStrings::class,
\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
];
/**
* The application's route middleware groups.
*
* @var array
*/
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
// \Illuminate\Session\Middleware\AuthenticateSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
'api' => [
'throttle:60,1',
'bindings',
],
];
/**
* The application's route middleware.
*
* These middleware may be assigned to groups or used individually.
*
* @var array
*/
protected $routeMiddleware = [
'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
'can' => \Illuminate\Auth\Middleware\Authorize::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
'election' => \App\Http\Middleware\ElectionMiddleware::class,
'admin' => \App\Http\Middleware\AdminMiddleware::class,
'voter' => \App\Http\Middleware\VoterMiddleware::class,
'scopes' => \Laravel\Passport\Http\Middleware\CheckScopes::class,
'scope' => \Laravel\Passport\Http\Middleware\CheckForAnyScope::class,
'isvoted' => \App\Http\Middleware\IsVotedMiddleware::class,
'main_admin' => \App\Http\Middleware\MainAdminMiddleware::class,
'has_voted' => \App\Http\Middleware\HasVotedMiddleware::class,
];
}
+27
View File
@@ -0,0 +1,27 @@
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Support\Facades\Auth;
class AdminMiddleware
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if (!$request->user()->tokenCan('admin')) {
return response()->json([
'error' => 'Unauthenticated.'
], 401);
}
return $next($request);
}
}
@@ -0,0 +1,34 @@
<?php
namespace App\Http\Middleware;
use Closure;
use \App\Http\Controllers\Util;
class ElectionMiddleware
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if ($this->isElection($request)) {
return response()->json([
'status' => 'failed',
'message' => 'You can not add, update, or delete during the election.'
]);
}
return $next($request);
}
private function isElection($request)
{
return !$request->isMethod('get') && Util::getElectionStatus() == 2 && !$request->is('api/v1/election/*');
}
}
+17
View File
@@ -0,0 +1,17 @@
<?php
namespace App\Http\Middleware;
use Illuminate\Cookie\Middleware\EncryptCookies as BaseEncrypter;
class EncryptCookies extends BaseEncrypter
{
/**
* The names of the cookies that should not be encrypted.
*
* @var array
*/
protected $except = [
//
];
}
@@ -0,0 +1,32 @@
<?php
namespace App\Http\Middleware;
use Closure;
class HasVotedMiddleware
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if (!$this->hasVoted($request)) {
return response()->json([
'status'=>'failed',
'message'=> 'You must vote first.'
], 500);
}
return $next($request);
}
private function hasVoted($request)
{
$x = \App\Result::where('voter_id', $request->user()->id)->count();
return $x > 0;
}
}
+28
View File
@@ -0,0 +1,28 @@
<?php
namespace App\Http\Middleware;
use Closure;
use App\Result;
use Illuminate\Support\Facades\Auth;
class IsVotedMiddleware
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if (Result::where('voter_id', Auth::id())->count() > 0)
return response()->json([
'status' => 'failed',
'message' => 'You can only vote once.'
]);
return $next($request);
}
}
@@ -0,0 +1,26 @@
<?php
namespace App\Http\Middleware;
use Closure;
class MainAdminMiddleware
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if ($request->user()->id != 1) {
return response()->json([
'status' => 'failed',
'message' => 'This can only be accessed by the main admin'
]);
}
return $next($request);
}
}
@@ -0,0 +1,26 @@
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Support\Facades\Auth;
class RedirectIfAuthenticated
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @param string|null $guard
* @return mixed
*/
public function handle($request, Closure $next, $guard = null)
{
if (Auth::guard($guard)->check()) {
return redirect('/home');
}
return $next($request);
}
}
+18
View File
@@ -0,0 +1,18 @@
<?php
namespace App\Http\Middleware;
use Illuminate\Foundation\Http\Middleware\TrimStrings as BaseTrimmer;
class TrimStrings extends BaseTrimmer
{
/**
* The names of the attributes that should not be trimmed.
*
* @var array
*/
protected $except = [
'password',
'password_confirmation',
];
}
+17
View File
@@ -0,0 +1,17 @@
<?php
namespace App\Http\Middleware;
use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as BaseVerifier;
class VerifyCsrfToken extends BaseVerifier
{
/**
* The URIs that should be excluded from CSRF verification.
*
* @var array
*/
protected $except = [
//
];
}
+25
View File
@@ -0,0 +1,25 @@
<?php
namespace App\Http\Middleware;
use Closure;
class VoterMiddleware
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if (!$request->user()->tokenCan('vote')) {
return response()->json([
'error' => 'Unauthenticated.'
], 401);
}
return $next($request);
}
}
+21
View File
@@ -0,0 +1,21 @@
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Nominee extends Model
{
protected $table = 'nominee';
protected $fillable = [
'name',
'course',
'student_id',
'position_id',
'partylist_id',
'election_id',
'image',
'description',
'motto'
];
}
+11
View File
@@ -0,0 +1,11 @@
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Partylist extends Model
{
protected $table = 'partylist';
protected $fillable = ['name', 'election_id'];
}
+11
View File
@@ -0,0 +1,11 @@
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Position extends Model
{
protected $table = 'position';
protected $fillable = ['name', 'election_id'];
}
+38
View File
@@ -0,0 +1,38 @@
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Facades\Hash;
use DB;
class AppServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
Validator::extend('password', function ($attribute, $value, $parameters, $validator) {
$password = DB::table($parameters[0])->where('id', $parameters[2])->value($parameters[1]);
return Hash::check($value, $password);
});
if(config('app.env') === 'production') {
\URL::forceScheme('https');
}
}
/**
* Register any application services.
*
* @return void
*/
public function register()
{
//
}
}
+36
View File
@@ -0,0 +1,36 @@
<?php
namespace App\Providers;
use Illuminate\Support\Facades\Gate;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
use Laravel\Passport\Passport;
class AuthServiceProvider extends ServiceProvider
{
/**
* The policy mappings for the application.
*
* @var array
*/
protected $policies = [
'App\Model' => 'App\Policies\ModelPolicy',
];
/**
* Register any authentication / authorization services.
*
* @return void
*/
public function boot()
{
$this->registerPolicies();
Passport::tokensCan([
'vote' => 'The user can access voter\'s panel.',
'admin' => 'The user can access admin panel.',
]);
Passport::routes();
}
}
@@ -0,0 +1,21 @@
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Broadcast;
class BroadcastServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
Broadcast::routes();
require base_path('routes/channels.php');
}
}
+32
View File
@@ -0,0 +1,32 @@
<?php
namespace App\Providers;
use Illuminate\Support\Facades\Event;
use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;
class EventServiceProvider extends ServiceProvider
{
/**
* The event listener mappings for the application.
*
* @var array
*/
protected $listen = [
'App\Events\Event' => [
'App\Listeners\EventListener',
],
];
/**
* Register any events for your application.
*
* @return void
*/
public function boot()
{
parent::boot();
//
}
}
+73
View File
@@ -0,0 +1,73 @@
<?php
namespace App\Providers;
use Illuminate\Support\Facades\Route;
use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;
class RouteServiceProvider extends ServiceProvider
{
/**
* This namespace is applied to your controller routes.
*
* In addition, it is set as the URL generator's root namespace.
*
* @var string
*/
protected $namespace = 'App\Http\Controllers';
/**
* Define your route model bindings, pattern filters, etc.
*
* @return void
*/
public function boot()
{
//
parent::boot();
}
/**
* Define the routes for the application.
*
* @return void
*/
public function map()
{
$this->mapApiRoutes();
$this->mapWebRoutes();
//
}
/**
* Define the "web" routes for the application.
*
* These routes all receive session state, CSRF protection, etc.
*
* @return void
*/
protected function mapWebRoutes()
{
Route::middleware('web')
->namespace($this->namespace)
->group(base_path('routes/web.php'));
}
/**
* Define the "api" routes for the application.
*
* These routes are typically stateless.
*
* @return void
*/
protected function mapApiRoutes()
{
Route::prefix('api')
->middleware('api')
->namespace($this->namespace)
->group(base_path('routes/api.php'));
}
}
+11
View File
@@ -0,0 +1,11 @@
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Result extends Model
{
protected $table = 'result';
protected $fillable = ['voter_id', 'nominee_id', 'position_id', 'election_id'];
}
+30
View File
@@ -0,0 +1,30 @@
<?php
namespace App;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Laravel\Passport\HasApiTokens;
class User extends Authenticatable
{
use HasApiTokens, Notifiable;
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'name', 'email', 'password',
];
/**
* The attributes that should be hidden for arrays.
*
* @var array
*/
protected $hidden = [
'password', 'remember_token',
];
}
+14
View File
@@ -0,0 +1,14 @@
<?php
namespace App;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Laravel\Passport\HasApiTokens;
class Voter extends Authenticatable
{
use HasApiTokens;
protected $table = 'voter';
protected $fillable = ['name', 'student_id', 'course', 'election_id'];
}