app/Http/Controllers/Settings/GendersController.php (118 lines of code) (raw):
<?php
namespace App\Http\Controllers\Settings;
use Illuminate\Http\Request;
use App\Helpers\GenderHelper;
use App\Models\Contact\Gender;
use App\Helpers\CollectionHelper;
use App\Http\Controllers\Controller;
use App\Traits\JsonRespondController;
use Illuminate\Support\Facades\Validator;
use App\Http\Requests\Settings\GendersRequest;
use Illuminate\Database\Eloquent\ModelNotFoundException;
class GendersController extends Controller
{
use JsonRespondController;
/**
* Get all the gender types.
*/
public function index()
{
$gendersData = collect([]);
$genders = auth()->user()->account->genders;
foreach ($genders as $gender) {
$gendersData->push($this->formatData($gender));
}
return CollectionHelper::sortByCollator($gendersData, 'name');
}
/**
* Get all the gender sex types.
*/
public function types()
{
$gendersData = collect([]);
$types = [
Gender::MALE,
Gender::FEMALE,
Gender::OTHER,
Gender::UNKNOWN,
Gender::NONE,
];
foreach ($types as $type) {
$gendersData->push([
'id' => $type,
'name' => trans('settings.personalization_genders_'.strtolower($type)),
]);
}
return CollectionHelper::sortByCollator($gendersData, 'name');
}
/**
* Store the gender.
*/
public function store(Request $request)
{
Validator::make($request->all(), [
'name' => 'required|max:255',
])->validate();
$gender = auth()->user()->account->genders()->create(
$request->only([
'name',
'type',
])
+ [
'account_id' => auth()->user()->account_id,
]
);
return $this->formatData($gender);
}
/**
* Update the given gender.
*/
public function update(GendersRequest $request, Gender $gender)
{
$gender->update(
$request->only([
'name',
'type',
])
);
if ($request->input('isDefault')) {
$this->updateDefault($request, $gender);
$gender->refresh();
} elseif ($gender->isDefault()) {
// Case of this gender was the default one previously
$account = auth()->user()->account;
$account->default_gender_id = null;
$account->save();
$gender->refresh();
}
return $this->formatData($gender);
}
/**
* Destroy a gender type.
*/
public function destroyAndReplaceGender(GendersRequest $request, Gender $gender, $genderId)
{
$account = auth()->user()->account;
try {
$genderToReplaceWith = Gender::where('account_id', $account->id)
->findOrFail($genderId);
} catch (ModelNotFoundException $e) {
return response()->json([
'message' => trans('settings.personalization_genders_modal_error'),
], 403);
}
// We get the new gender to associate the contacts with.
GenderHelper::replace($account, $gender, $genderToReplaceWith);
if ($gender->isDefault()) {
$account->default_gender_id = $genderToReplaceWith->id;
$account->save();
}
$gender->delete();
return $this->respondObjectDeleted($gender->id);
}
/**
* Destroy a gender type.
*/
public function destroy(GendersRequest $request, Gender $gender)
{
$gender->delete();
return $this->respondObjectDeleted($gender->id);
}
/**
* Update the given gender to the default gender.
*/
public function updateDefault(GendersRequest $request, Gender $gender)
{
$account = auth()->user()->account;
$account->default_gender_id = $gender->id;
$account->save();
return $this->formatData($gender);
}
/**
* Format data for output.
*
* @param Gender $gender
* @return array
*/
private function formatData($gender)
{
return [
'id' => $gender->id,
'name' => $gender->name,
'type' => $gender->type,
'isDefault' => $gender->isDefault(),
'numberOfContacts' => $gender->contacts->count(),
];
}
}