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
@@ -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'];
}
}