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;
use App\Options as Option;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Cache;
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
{
/**
* 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
{
$value = Cache::get($option);
@ -47,12 +69,14 @@ class Options
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_name' => $option,
'option_value' => $value,
'friendly_name' => $description,
'option_category' => $category
]);
Cache::put($option, $value, now()->addDay());

View File

@ -36,17 +36,17 @@ class OptionsController extends Controller
*/
public function index()
{
// TODO: Obtain this from the facade
$options = Option::all();
return view('dashboard.administration.settings')
->with('options', $options)
->with('security', [
'secPolicy' => Options::getOption('pw_security_policy'),
'graceperiod' => Options::getOption('graceperiod'),
'pwExpiry' => Options::getOption('password_expiry'),
'requiresPMC' => Options::getOption('requireGameLicense'),
'enforce2fa' => Options::getOption('force2fa')
->with([
'options' => Options::getCategory('notifications'),
'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.
'secPolicy' => Options::getOption('pw_security_policy'),
'graceperiod' => Options::getOption('graceperiod'),
'pwExpiry' => Options::getOption('password_expiry'),
'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()
{
Options::setOption('notify_new_application_email', true, 'Notify when a new application comes through'); // done
Options::setOption('notify_application_comment', false, 'Notify when someone comments on an application'); // 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' , 'notifications'); // 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_applicant_approved', true, 'Notify when an applicant is approved'); // done
Options::setOption('notify_vacancystatus_change', false, 'Notify when a vacancy\'s status changes'); // 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' , 'notifications'); // 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_email_notifications', true, 'Enable e-mail notifications');
Options::setOption('enable_slack_notifications', true, 'Enable slack notifications' , 'notifications');
Options::setOption('enable_email_notifications', true, 'Enable e-mail notifications' , 'notifications');
// added in 0.6.2
Options::setOption('pw_security_policy', 'low', 'Describes the current password security policy.');
Options::setOption('graceperiod', 7, '2FA Grace Period');
Options::setOption('password_expiry', 'disabled', 'Defines wether passwords must be reset after $value');
Options::setOption('force2fa', false, 'Defines whether 2fa is forced upon users');
Options::setOption('force2faRole', 'reviewer', 'Defines which role to force 2fa for');
Options::setOption('requireGameLicense', true, 'Defines whether people need to validate their game license');
Options::setOption('pw_security_policy', 'low', 'Describes the current password security policy.', 'app_security');
Options::setOption('graceperiod', 7, '2FA Grace Period', 'app_security');
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', 'app_security');
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', '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')}}">
@csrf
@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. -->
<!-- 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">
<input type="checkbox" name="{{$option->option_name}}" value="1" id="{{$option->option_name}}" class="form-check-input" {{ ($option->option_value == 1) ? 'checked' : '' }}>
<label for="{{$option->option_name}}">{{$option->friendly_name}}</label>
</div>
@if(!in_array($option->option_name, $ignoreOptions))
<div class="form-group form-check">
<input type="hidden" name="{{$option->option_name}}" value="0">
<input type="checkbox" name="{{$option->option_name}}" value="1" id="{{$option->option_name}}" class="form-check-input" {{ ($option->option_value == 1) ? 'checked' : '' }}>
<label for="{{$option->option_name}}">{{$option->friendly_name}}</label>
</div>
@endif
@endforeach
</form>
</div>