2FAuth/app/Services/GroupService.php

78 lines
2.3 KiB
PHP
Raw Normal View History

<?php
namespace App\Services;
2021-12-02 13:15:53 +01:00
use App\Models\Group;
use App\Models\TwoFAccount;
use App\Models\User;
use Illuminate\Auth\Access\AuthorizationException;
use Illuminate\Database\Eloquent\Collection;
2021-10-15 23:46:21 +02:00
use Illuminate\Support\Facades\Log;
class GroupService
{
/**
* Assign one or more accounts to a group
2022-11-22 15:15:52 +01:00
*
* @param array|int $ids accounts ids to assign
* @param \App\Models\User $user
* @param \App\Models\Group|null $group The group the accounts will be assigned to
* @return void
*
* @throws \Illuminate\Auth\Access\AuthorizationException
*/
public static function assign($ids, User $user, Group $group = null) : void
{
if (!$group) {
$group = self::defaultGroup($user);
}
if ($group) {
$ids = is_array($ids) ? $ids : [$ids];
$twofaccounts = TwoFAccount::find($ids);
if ($user->cannot('updateEach', [(new TwoFAccount), $twofaccounts])) {
throw new AuthorizationException();
}
$group->twofaccounts()->saveMany($twofaccounts);
$group->loadCount('twofaccounts');
2021-10-15 23:46:21 +02:00
Log::info(sprintf('Twofaccounts #%s assigned to group %s (ID #%s)', implode(',', $ids), var_export($group->name, true), $group->id));
}
else Log::info('Cannot find a group to assign the TwoFAccounts to');
}
/**
* Prepends the pseudo group named 'All' to a group collection
*
* @param Collection<int, Group> $groups
* @param \App\Models\User $user
* @return Collection<int, Group>
*/
public static function prependTheAllGroup(Collection $groups, User $user) : Collection
{
$theAllGroup = new Group([
'name' => __('commons.all'),
]);
$theAllGroup->id = 0;
$theAllGroup->twofaccounts_count = $user->twofaccounts->count();
return $groups->prepend($theAllGroup);
}
/**
* Determines the default group of the given user
2022-11-22 15:15:52 +01:00
*
* @param \App\Models\User $user
2021-12-02 13:15:53 +01:00
* @return \App\Models\Group|null The group or null if it does not exist
*/
private static function defaultGroup(User $user)
{
$id = $user->preferences['defaultGroup'] === -1 ? (int) $user->preferences['activeGroup'] : (int) $user->preferences['defaultGroup'];
return Group::find($id);
}
2022-11-22 15:15:52 +01:00
}