Setting categorization system

This categorization system aims to prevent mixing different options together.
This commit is contained in:
Miguel Nogueira 2021-01-06 01:29:01 +00:00
parent baddf3fc76
commit abace4e85b
Signed by: miguel456
GPG Key ID: 2CF61B825316C6A0
5 changed files with 91 additions and 31 deletions

View File

@ -22,11 +22,33 @@
namespace App\Helpers; namespace App\Helpers;
use App\Options as Option; use App\Options as Option;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Cache; use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
/**
* The options class. A simple wrapper around the model. Could be a repository, but we're not using that design pattern just yet
*/
class Options class Options
{ {
/**
* Returns an assortment of settings found in the mentioned category
*
* @param $category The category
* @return Collection The settings in this category
*/
public function getCategory(string $category): Collection
{
$options = Option::where('option_category', $category)->get();
if ($options->isEmpty())
{
throw new \Exception('There are no options in category ' . $category);
}
return $options;
}
public function getOption(string $option): string public function getOption(string $option): string
{ {
$value = Cache::get($option); $value = Cache::get($option);
@ -47,12 +69,14 @@ class Options
return $value; return $value;
} }
public function setOption(string $option, string $value, string $description) // Null categories are settings without categories and will appear ungrouped
public function setOption(string $option, string $value, string $description, string $category = null)
{ {
Option::create([ Option::create([
'option_name' => $option, 'option_name' => $option,
'option_value' => $value, 'option_value' => $value,
'friendly_name' => $description, 'friendly_name' => $description,
'option_category' => $category
]); ]);
Cache::put($option, $value, now()->addDay()); Cache::put($option, $value, now()->addDay());

View File

@ -36,17 +36,17 @@ class OptionsController extends Controller
*/ */
public function index() public function index()
{ {
// TODO: Obtain this from the facade
$options = Option::all();
return view('dashboard.administration.settings') return view('dashboard.administration.settings')
->with('options', $options) ->with([
->with('security', [ 'options' => Options::getCategory('notifications'),
'secPolicy' => Options::getOption('pw_security_policy'), 'security' => [ // We could use the method above, but we need to set these names here for greater control in the template. This would nto be feasible for many options, we'd need to use a loop and the category method.
'graceperiod' => Options::getOption('graceperiod'), 'secPolicy' => Options::getOption('pw_security_policy'),
'pwExpiry' => Options::getOption('password_expiry'), 'graceperiod' => Options::getOption('graceperiod'),
'requiresPMC' => Options::getOption('requireGameLicense'), 'pwExpiry' => Options::getOption('password_expiry'),
'enforce2fa' => Options::getOption('force2fa') 'requiresPMC' => Options::getOption('requireGameLicense'),
'enforce2fa' => Options::getOption('force2fa')
]
]); ]);
} }

View File

@ -0,0 +1,32 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class AddCategoryToOptions extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('options', function (Blueprint $table) {
$table->string('option_category')->after('friendly_name')->nullable();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('options', function (Blueprint $table) {
$table->dropColumn('option_category');
});
}
}

View File

@ -33,25 +33,25 @@ class DefaultOptionsSeeder extends Seeder
*/ */
public function run() public function run()
{ {
Options::setOption('notify_new_application_email', true, 'Notify when a new application comes through'); // done Options::setOption('notify_new_application_email', true, 'Notify when a new application comes through', 'notifications'); // done
Options::setOption('notify_application_comment', false, 'Notify when someone comments on an application'); // done Options::setOption('notify_application_comment', false, 'Notify when someone comments on an application' , 'notifications'); // done
Options::setOption('notify_new_user', true, 'Notify when someone signs up'); // done Options::setOption('notify_new_user', true, 'Notify when someone signs up'); // done
Options::setOption('notify_application_status_change', true, 'Notify when an application changes status'); // done Options::setOption('notify_application_status_change', true, 'Notify when an application changes status' , 'notifications'); // done
Options::setOption('notify_applicant_approved', true, 'Notify when an applicant is approved'); // done Options::setOption('notify_applicant_approved', true, 'Notify when an applicant is approved' , 'notifications'); // done
Options::setOption('notify_vacancystatus_change', false, 'Notify when a vacancy\'s status changes'); // done Options::setOption('notify_vacancystatus_change', false, 'Notify when a vacancy\'s status changes' , 'notifications'); // done
Options::setOption('enable_slack_notifications', true, 'Enable slack notifications'); Options::setOption('enable_slack_notifications', true, 'Enable slack notifications' , 'notifications');
Options::setOption('enable_email_notifications', true, 'Enable e-mail notifications'); Options::setOption('enable_email_notifications', true, 'Enable e-mail notifications' , 'notifications');
// added in 0.6.2 // added in 0.6.2
Options::setOption('pw_security_policy', 'low', 'Describes the current password security policy.'); Options::setOption('pw_security_policy', 'low', 'Describes the current password security policy.', 'app_security');
Options::setOption('graceperiod', 7, '2FA Grace Period'); Options::setOption('graceperiod', 7, '2FA Grace Period', 'app_security');
Options::setOption('password_expiry', 'disabled', 'Defines wether passwords must be reset after $value'); Options::setOption('password_expiry', 'disabled', 'Defines wether passwords must be reset after $value', 'app_security');
Options::setOption('force2fa', false, 'Defines whether 2fa is forced upon users'); Options::setOption('force2fa', false, 'Defines whether 2fa is forced upon users', 'app_security');
Options::setOption('force2faRole', 'reviewer', 'Defines which role to force 2fa for'); Options::setOption('force2faRole', 'reviewer', 'Defines which role to force 2fa for', 'app_security');
Options::setOption('requireGameLicense', true, 'Defines whether people need to validate their game license'); Options::setOption('requireGameLicense', true, 'Defines whether people need to validate their game license', 'app_security');
Options::setOption('currentGame', 'MINECRAFT', 'Defines what game we\'re working with'); Options::setOption('currentGame', 'MINECRAFT', 'Defines what game we\'re working with', 'app_integration');
} }
} }

View File

@ -108,13 +108,17 @@
<form name="settings" id="settings" method="post" action="{{route('saveSettings')}}"> <form name="settings" id="settings" method="post" action="{{route('saveSettings')}}">
@csrf @csrf
@foreach($options as $option) @foreach($options as $option)
<div class="form-group form-check">
<!-- Unchecked checkbox hack: This only works for serverside languages that process the last duplicate element, since the browser sends both the hidden and checkbox values. --> @if(!in_array($option->option_name, $ignoreOptions))
<!-- This "hack" is necessary because browsers don't send, by default, unchecked checkboxes to the server, so we would have no way to know if X checkbox was unchecked. -->
<input type="hidden" name="{{$option->option_name}}" value="0"> <div class="form-group form-check">
<input type="checkbox" name="{{$option->option_name}}" value="1" id="{{$option->option_name}}" class="form-check-input" {{ ($option->option_value == 1) ? 'checked' : '' }}> <input type="hidden" name="{{$option->option_name}}" value="0">
<label for="{{$option->option_name}}">{{$option->friendly_name}}</label> <input type="checkbox" name="{{$option->option_name}}" value="1" id="{{$option->option_name}}" class="form-check-input" {{ ($option->option_value == 1) ? 'checked' : '' }}>
</div> <label for="{{$option->option_name}}">{{$option->friendly_name}}</label>
</div>
@endif
@endforeach @endforeach
</form> </form>
</div> </div>