Skip to content
Snippets Groups Projects
Select Git revision
  • 04c125b0771c18c4a9e20e384be5e54dfd054fa6
  • main default protected
  • master
3 results

APIController.php

Blame
  • Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    APIController.php 46.59 KiB
    <?php
    
    namespace App\Http\Controllers;
    
    use App\DelegationOneVote;
    use App\Election;
    use App\ExtensionDelegationElection;
    use App\MajorityVote;
    use App\Population;
    use App\Voter;
    use Illuminate\Http\Request;
    use Illuminate\Http\Response;
    use Illuminate\Support\Facades\Config;
    use Illuminate\Support\Facades\DB;
    use Illuminate\Validation\ValidationException;
    
    class APIController extends Controller
    {
        public function generatePopulationTemplate(Request $request)
        {
            try {
                $attributes = $request->validate([
                    'name' => 'nullable|string',
                    'size_a' => 'required|integer|min:0|max:1000',
                    'size_b' => 'required|integer|min:0|max:1000',
                    'init_expertise_a' => 'required|integer|min:0|max:100',
                    'init_expertise_b' => 'required|integer|min:0|max:100',
                    'spread_expertise_a' => 'required|integer|min:0|max:100',
                    'spread_expertise_b' => 'required|integer|min:0|max:100',
                    'init_confidence_a' => 'required|integer|min:0|max:100',
                    'init_confidence_b' => 'required|integer|min:0|max:100',
                    'spread_confidence_a' => 'required|integer|min:0|max:100',
                    'spread_confidence_b' => 'required|integer|min:0|max:100',
                    'init_following_a' => 'required|integer|min:0|max:100',
                    'init_following_b' => 'required|integer|min:0|max:100',
                    'spread_following_a' => 'required|integer|min:0|max:100',
                    'spread_following_b' => 'required|integer|min:0|max:100',
                    'init_leadership_a' => 'required|integer|min:0|max:100',
                    'init_leadership_b' => 'required|integer|min:0|max:100',
                    'spread_leadership_a' => 'required|integer|min:0|max:100',
                    'spread_leadership_b' => 'required|integer|min:0|max:100',
                    'forgetting_factor' => 'nullable|int|min:0|max:100',
                    'follower_factor' => 'nullable|min:1'
                ]);
            } catch (ValidationException $e) {
                return response()->json([
                    'message' => 'Incorrect payload',
                    'val_errors' => $e->errors()
                ], Response::HTTP_UNPROCESSABLE_ENTITY);
            }
            $start = microtime(true);
    
            $population = new Population();
    
            $forgettingFactor = Config::get('app.forgetting_factor', 0.99);
            if (isset($attributes['forgetting_factor'])) {
                $forgettingFactor = 1 - 0.01 * $attributes['forgetting_factor'];
            }
            $population->forgetting_factor = $forgettingFactor;
    
            $population->follower_factor = isset($attributes['follower_factor']) ? $attributes['follower_factor'] : Config::get('app.follower_factor', 100);
    
            $population->save();
            $population->name = isset($attributes['name']) ? $attributes['name'] : 'Population Template ' . $population->id;
            $population->update();
    
            $minValue = 1;
            $maxValue = 100;
    
            $minExpertiseValueA = $attributes['init_expertise_a'] - $attributes['spread_expertise_a'];