Changeset View
Changeset View
Standalone View
Standalone View
src/app/Http/Controllers/API/V4/UsersController.php
Show First 20 Lines • Show All 60 Lines • ▼ Show 20 Lines | class UsersController extends Controller | ||||
* Listing of users. | * Listing of users. | ||||
* | * | ||||
* The user-entitlements billed to the current user wallet(s) | * The user-entitlements billed to the current user wallet(s) | ||||
* | * | ||||
* @return \Illuminate\Http\JsonResponse | * @return \Illuminate\Http\JsonResponse | ||||
*/ | */ | ||||
public function index() | public function index() | ||||
{ | { | ||||
\Log::debug("Regular API"); | |||||
$user = $this->guard()->user(); | $user = $this->guard()->user(); | ||||
$result = $user->users()->orderBy('email')->get()->map(function ($user) { | $result = $user->users()->orderBy('email')->get()->map(function ($user) { | ||||
$data = $user->toArray(); | $data = $user->toArray(); | ||||
$data = array_merge($data, self::userStatuses($user)); | $data = array_merge($data, self::userStatuses($user)); | ||||
return $data; | return $data; | ||||
}); | }); | ||||
▲ Show 20 Lines • Show All 269 Lines • ▼ Show 20 Lines | // 'cost' => $ent->cost, | ||||
public function guard() | public function guard() | ||||
{ | { | ||||
return Auth::guard(); | return Auth::guard(); | ||||
} | } | ||||
/** | /** | ||||
* Update user entitlements. | * Update user entitlements. | ||||
* | * | ||||
* @param \App\User $user The user | * @param \App\User $user The user | ||||
* @param array|null $skus Set of SKUs for the user | * @param array $rSkus List of SKU IDs requested for the user in the form [id=>qty] | ||||
*/ | */ | ||||
protected function updateEntitlements(User $user, $skus) | protected function updateEntitlements(User $user, $rSkus) | ||||
{ | { | ||||
if (!is_array($skus)) { | if (!is_array($rSkus)) { | ||||
return; | return; | ||||
} | } | ||||
// Existing SKUs | // list of skus, [id=>obj] | ||||
// FIXME: Is there really no query builder method to get result indexed | $skus = Sku::all()->mapWithKeys( | ||||
// by some column or primary key? | function ($sku) { | ||||
$all_skus = Sku::all()->mapWithKeys(function ($sku) { | |||||
return [$sku->id => $sku]; | return [$sku->id => $sku]; | ||||
}); | } | ||||
); | |||||
// Existing user entitlements | // existing entitlement's SKUs | ||||
// Note: We sort them by cost, so e.g. for storage we get these free first | $eSkus = []; | ||||
$entitlements = $user->entitlements()->orderBy('cost')->get(); | |||||
// Go through existing entitlements and remove those no longer needed | $user->entitlements()->groupBy('sku_id') | ||||
foreach ($entitlements as $ent) { | ->selectRaw('count(*) as total, sku_id')->each( | ||||
$sku_id = $ent->sku_id; | function ($e) use (&$eSkus) { | ||||
$eSkus[$e->sku_id] = $e->total; | |||||
} | |||||
); | |||||
if (array_key_exists($sku_id, $skus)) { | foreach ($skus as $skuID => $sku) { | ||||
// An existing entitlement exists on the requested list | $e = array_key_exists($skuID, $eSkus) ? $eSkus[$skuID] : 0; | ||||
$skus[$sku_id] -= 1; | $r = array_key_exists($skuID, $rSkus) ? $rSkus[$skuID] : 0; | ||||
if ($skus[$sku_id] < 0) { | if ($sku->handler_class == \App\Handlers\Mailbox::class) { | ||||
$ent->delete(); | if ($r != 1) { | ||||
} | throw new \Exception("Invalid quantity of mailboxes"); | ||||
} elseif ($all_skus->get($sku_id)->handler_class != \App\Handlers\Mailbox::class) { | |||||
// An existing entitlement does not exists on the requested list | |||||
// Never delete 'mailbox' SKU | |||||
$ent->delete(); | |||||
} | } | ||||
} | } | ||||
// Add missing entitlements | if ($e > $r) { | ||||
foreach ($skus as $sku_id => $count) { | // remove those entitled more than existing | ||||
if ($count > 0 && $all_skus->has($sku_id)) { | $user->removeSku($sku, ($e - $r)); | ||||
$user->assignSku($all_skus[$sku_id], $count); | } elseif ($e < $r) { | ||||
// add those requested more than entitled | |||||
$user->assignSku($sku, ($r - $e)); | |||||
} | } | ||||
} | } | ||||
} | } | ||||
/** | /** | ||||
* Create a response data array for specified user. | * Create a response data array for specified user. | ||||
* | * | ||||
* @param \App\User $user User object | * @param \App\User $user User object | ||||
▲ Show 20 Lines • Show All 198 Lines • Show Last 20 Lines |