Changeset View
Changeset View
Standalone View
Standalone View
src/app/Http/Controllers/API/V4/GroupsController.php
<?php | <?php | ||||
namespace App\Http\Controllers\API\V4; | namespace App\Http\Controllers\API\V4; | ||||
use App\Http\Controllers\Controller; | use App\Http\Controllers\Controller; | ||||
use App\Domain; | use App\Domain; | ||||
use App\Group; | use App\Group; | ||||
use App\Rules\GroupName; | |||||
use App\User; | use App\User; | ||||
use Carbon\Carbon; | use Carbon\Carbon; | ||||
use Illuminate\Http\Request; | use Illuminate\Http\Request; | ||||
use Illuminate\Support\Facades\DB; | use Illuminate\Support\Facades\DB; | ||||
use Illuminate\Support\Facades\Validator; | use Illuminate\Support\Facades\Validator; | ||||
class GroupsController extends Controller | class GroupsController extends Controller | ||||
{ | { | ||||
▲ Show 20 Lines • Show All 52 Lines • ▼ Show 20 Lines | class GroupsController extends Controller | ||||
* The group-entitlements billed to the current user wallet(s) | * The group-entitlements billed to the current user wallet(s) | ||||
* | * | ||||
* @return \Illuminate\Http\JsonResponse | * @return \Illuminate\Http\JsonResponse | ||||
*/ | */ | ||||
public function index() | public function index() | ||||
{ | { | ||||
$user = $this->guard()->user(); | $user = $this->guard()->user(); | ||||
$result = $user->groups()->orderBy('email')->get() | $result = $user->groups()->orderBy('name')->orderBy('email')->get() | ||||
->map(function (Group $group) { | ->map(function (Group $group) { | ||||
$data = [ | $data = [ | ||||
'id' => $group->id, | 'id' => $group->id, | ||||
'email' => $group->email, | 'email' => $group->email, | ||||
'name' => $group->name, | |||||
]; | ]; | ||||
$data = array_merge($data, self::groupStatuses($group)); | $data = array_merge($data, self::groupStatuses($group)); | ||||
return $data; | return $data; | ||||
}); | }); | ||||
return response()->json($result); | return response()->json($result); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 190 Lines • ▼ Show 20 Lines | class GroupsController extends Controller | ||||
{ | { | ||||
$current_user = $this->guard()->user(); | $current_user = $this->guard()->user(); | ||||
$owner = $current_user->wallet()->owner; | $owner = $current_user->wallet()->owner; | ||||
if ($owner->id != $current_user->id) { | if ($owner->id != $current_user->id) { | ||||
return $this->errorResponse(403); | return $this->errorResponse(403); | ||||
} | } | ||||
$email = request()->input('email'); | $email = $request->input('email'); | ||||
$members = request()->input('members'); | $members = $request->input('members'); | ||||
$errors = []; | $errors = []; | ||||
$rules = [ | |||||
'name' => 'required|string|max:191', | |||||
mollekopf: This is overwritten if GroupsController::validateGroupEmail doesn't fail, so it seems… | |||||
]; | |||||
// Validate group address | // Validate group address | ||||
if ($error = GroupsController::validateGroupEmail($email, $owner)) { | if ($error = GroupsController::validateGroupEmail($email, $owner)) { | ||||
$errors['email'] = $error; | $errors['email'] = $error; | ||||
} else { | |||||
list(, $domainName) = explode('@', $email); | |||||
$rules['name'] = ['required', 'string', new GroupName($owner, $domainName)]; | |||||
} | |||||
// Validate the group name | |||||
$v = Validator::make($request->all(), $rules); | |||||
if ($v->fails()) { | |||||
$errors = array_merge($errors, $v->errors()->toArray()); | |||||
Not Done Inline ActionsThis overwrite errors if GroupsController::validateGroupEmail already failed. Either merge the errors or don't further validate after the first error. I would probably just integrate GroupsController::validateGroupEmail via a closure: https://laravel.com/docs/6.x/validation#using-closures mollekopf: This overwrite errors if GroupsController::validateGroupEmail already failed. Either merge the… | |||||
Done Inline ActionsTo fully validate a group name I need a domain. And we get the domain from an email address. So, I first validate the email address, and only if it is valid I do the "full validation". If email address is invalid I still want to do a "basic validation" on the name. machniak: To fully validate a group name I need a domain. And we get the domain from an email address. So… | |||||
Not Done Inline ActionsMakes sense. It seems I have overlooked the array_merge since you're not actually overwriting $errors, so this should work. FWIW, the alternative I suggested wouldn't look much better anyways: $email = $request->input('email'); $members = $request->input('members'); $errors = []; list(, $domainName) = explode('@', $email); $rules = [ 'email' => [ function ($attribute, $value, $fail) { if ($error = GroupsController::validateGroupEmail($value, $owner)) { $fail($error); } }, ] 'name' => [ 'bail', 'required', 'string', //Validate the email for the $domainName below function ($attribute, $value, $fail) { if ($error = GroupsController::validateGroupEmail($email, $owner)) { $fail($error); } }, new GroupName($owner, $domainName), ] ]; $v = Validator::make($request->all(), $rules); if ($v->fails()) { $errors = $v->errors()->toArray(); } mollekopf: Makes sense. It seems I have overlooked the array_merge since you're not actually overwriting… | |||||
} | } | ||||
// Validate members' email addresses | // Validate members' email addresses | ||||
if (empty($members) || !is_array($members)) { | if (empty($members) || !is_array($members)) { | ||||
$errors['members'] = \trans('validation.listmembersrequired'); | $errors['members'] = \trans('validation.listmembersrequired'); | ||||
} else { | } else { | ||||
foreach ($members as $i => $member) { | foreach ($members as $i => $member) { | ||||
if (is_string($member) && !empty($member)) { | if (is_string($member) && !empty($member)) { | ||||
Show All 11 Lines | public function store(Request $request) | ||||
if (!empty($errors)) { | if (!empty($errors)) { | ||||
return response()->json(['status' => 'error', 'errors' => $errors], 422); | return response()->json(['status' => 'error', 'errors' => $errors], 422); | ||||
} | } | ||||
DB::beginTransaction(); | DB::beginTransaction(); | ||||
// Create the group | // Create the group | ||||
$group = new Group(); | $group = new Group(); | ||||
$group->name = $request->input('name'); | |||||
$group->email = $email; | $group->email = $email; | ||||
$group->members = $members; | $group->members = $members; | ||||
$group->save(); | $group->save(); | ||||
$group->assignToWallet($owner->wallets->first()); | $group->assignToWallet($owner->wallets->first()); | ||||
DB::commit(); | DB::commit(); | ||||
Show All 21 Lines | public function update(Request $request, $id) | ||||
$current_user = $this->guard()->user(); | $current_user = $this->guard()->user(); | ||||
if (!$current_user->canUpdate($group)) { | if (!$current_user->canUpdate($group)) { | ||||
return $this->errorResponse(403); | return $this->errorResponse(403); | ||||
} | } | ||||
$owner = $group->wallet()->owner; | $owner = $group->wallet()->owner; | ||||
$name = $request->input('name'); | |||||
// It is possible to update members property only for now | $members = $request->input('members'); | ||||
$members = request()->input('members'); | |||||
$errors = []; | $errors = []; | ||||
// Validate the group name | |||||
if ($name !== null && $name != $group->name) { | |||||
list(, $domainName) = explode('@', $group->email); | |||||
$rules = ['name' => ['required', 'string', new GroupName($owner, $domainName)]]; | |||||
$v = Validator::make($request->all(), $rules); | |||||
if ($v->fails()) { | |||||
$errors = array_merge($errors, $v->errors()->toArray()); | |||||
} else { | |||||
$group->name = $name; | |||||
} | |||||
} | |||||
// Validate members' email addresses | // Validate members' email addresses | ||||
if (empty($members) || !is_array($members)) { | if (empty($members) || !is_array($members)) { | ||||
$errors['members'] = \trans('validation.listmembersrequired'); | $errors['members'] = \trans('validation.listmembersrequired'); | ||||
} else { | } else { | ||||
foreach ((array) $members as $i => $member) { | foreach ((array) $members as $i => $member) { | ||||
if (is_string($member) && !empty($member)) { | if (is_string($member) && !empty($member)) { | ||||
if ($error = GroupsController::validateMemberEmail($member, $owner)) { | if ($error = GroupsController::validateMemberEmail($member, $owner)) { | ||||
$errors['members'][$i] = $error; | $errors['members'][$i] = $error; | ||||
▲ Show 20 Lines • Show All 171 Lines • Show Last 20 Lines |
This is overwritten if GroupsController::validateGroupEmail doesn't fail, so it seems unnecessary.