TRF Certest first commit

This commit is contained in:
2025-02-26 08:57:46 +01:00
commit 3ce064a108
2524 changed files with 475404 additions and 0 deletions
@@ -0,0 +1,22 @@
<?php
namespace Vanguard\Repositories\Country;
use Illuminate\Database\Eloquent\Collection as EloquentCollection;
use Illuminate\Support\Collection;
use Vanguard\Country;
interface CountryRepository
{
/**
* Create $key => $value array for all available countries.
*/
public function lists(string $column = 'name', string $key = 'id'): Collection;
/**
* Get all available countries.
*
* @return EloquentCollection<Country>
*/
public function all(): EloquentCollection;
}
@@ -0,0 +1,26 @@
<?php
namespace Vanguard\Repositories\Country;
use Illuminate\Database\Eloquent\Collection as EloquentCollection;
use Illuminate\Support\Collection;
use Vanguard\Country;
class EloquentCountry implements CountryRepository
{
/**
* {@inheritdoc}
*/
public function lists($column = 'name', $key = 'id'): Collection
{
return Country::orderBy('name')->pluck($column, $key);
}
/**
* {@inheritdoc}
*/
public function all(): EloquentCollection
{
return Country::all();
}
}
@@ -0,0 +1,73 @@
<?php
namespace Vanguard\Repositories\Permission;
use Cache;
use Illuminate\Database\Eloquent\Collection;
use Vanguard\Events\Permission\Created;
use Vanguard\Events\Permission\Deleted;
use Vanguard\Events\Permission\Updated;
use Vanguard\Permission;
class EloquentPermission implements PermissionRepository
{
/**
* {@inheritdoc}
*/
public function all(): Collection
{
return Permission::all();
}
/**
* {@inheritdoc}
*/
public function find($id): Permission
{
return Permission::find($id);
}
/**
* {@inheritdoc}
*/
public function create(array $data): Permission
{
$permission = Permission::create($data);
event(new Created($permission));
return $permission;
}
/**
* {@inheritdoc}
*/
public function update($id, array $data): Permission
{
$permission = $this->find($id);
$permission->update($data);
Cache::flush();
event(new Updated($permission));
return $permission;
}
/**
* {@inheritdoc}
*/
public function delete($id): bool
{
$permission = $this->find($id);
event(new Deleted($permission));
$status = $permission->delete();
Cache::flush();
return $status;
}
}
@@ -0,0 +1,36 @@
<?php
namespace Vanguard\Repositories\Permission;
use Illuminate\Database\Eloquent\Collection;
use Vanguard\Permission;
interface PermissionRepository
{
/**
* Get all system permissions.
*
* @return Collection<Permission>
*/
public function all(): Collection;
/**
* Finds the permission by given id.
*/
public function find(int $id): Permission;
/**
* Creates new permission from provided data.
*/
public function create(array $data): Permission;
/**
* Updates specified permission.
*/
public function update(int $id, array $data): Permission;
/**
* Remove specified permission from repository.
*/
public function delete($id): bool;
}
+100
View File
@@ -0,0 +1,100 @@
<?php
namespace Vanguard\Repositories\Role;
use Illuminate\Database\Eloquent\Collection;
use Vanguard\Events\Role\Created;
use Vanguard\Events\Role\Deleted;
use Vanguard\Events\Role\Updated;
use Vanguard\Role;
class EloquentRole implements RoleRepository
{
/**
* {@inheritdoc}
*/
public function all(): Collection
{
return Role::all();
}
/**
* {@inheritdoc}
*/
public function getAllWithUsersCount(): Collection
{
return Role::withCount('users')->get();
}
/**
* {@inheritdoc}
*/
public function find($id): ?Role
{
return Role::find($id);
}
/**
* {@inheritdoc}
*/
public function create(array $data): Role
{
$role = Role::create($data);
event(new Created($role));
return $role;
}
/**
* {@inheritdoc}
*/
public function update($id, array $data): Role
{
$role = $this->find($id);
$role->update($data);
event(new Updated($role));
return $role;
}
/**
* {@inheritdoc}
*/
public function delete($id): void
{
$role = $this->find($id);
event(new Deleted($role));
$role->delete();
}
/**
* {@inheritdoc}
*/
public function updatePermissions($roleId, array $permissions): void
{
$role = $this->find($roleId);
$role->syncPermissions($permissions);
}
/**
* {@inheritdoc}
*/
public function lists(string $column = 'display_name', string $key = 'id'): \Illuminate\Support\Collection
{
return Role::pluck($column, $key);
}
/**
* {@inheritdoc}
*/
public function findByName($name): ?Role
{
return Role::where('name', $name)->first();
}
}
+58
View File
@@ -0,0 +1,58 @@
<?php
namespace Vanguard\Repositories\Role;
use Illuminate\Database\Eloquent\Collection;
use Vanguard\Role;
interface RoleRepository
{
/**
* Get all system roles.
*
* @return Collection<Role>
*/
public function all(): Collection;
/**
* Lists all system roles into $key => $column value pairs.
*/
public function lists(string $column = 'display_name', string $key = 'id'): \Illuminate\Support\Collection;
/**
* Get all system roles with number of users for each role.
*
* @return Collection<Role>
*/
public function getAllWithUsersCount(): Collection;
/**
* Find system role by id.
*/
public function find(int $id): ?Role;
/**
* Find role by name:
*/
public function findByName(string $name): ?Role;
/**
* Create new system role.
*/
public function create(array $data): Role;
/**
* Update specified role.
*/
public function update(int $id, array $data): Role;
/**
* Remove role from repository.
*/
public function delete(int $id): void;
/**
* Update the permissions for given role.
*/
public function updatePermissions($roleId, array $permissions): void;
}
+98
View File
@@ -0,0 +1,98 @@
<?php
namespace Vanguard\Repositories\Session;
use Carbon\Carbon;
use DB;
use Illuminate\Support\Collection;
use Jenssegers\Agent\Agent;
use stdClass;
use Vanguard\Repositories\User\UserRepository;
class DbSession implements SessionRepository
{
public function __construct(private readonly UserRepository $users, private readonly Agent $agent)
{
}
/**
* {@inheritdoc}
*/
public function getUserSessions($userId): Collection
{
$validTimestamp = Carbon::now()->subMinutes(config('session.lifetime'))->timestamp;
return DB::table('sessions')
->where('user_id', $userId)
->where('last_activity', '>=', $validTimestamp)
->get()
->map(function ($session) {
return $this->mapSessionAttributes($session);
});
}
private function mapSessionAttributes($session): stdClass
{
$this->agent->setUserAgent($session->user_agent);
$session->last_activity = Carbon::createFromTimestamp($session->last_activity);
$session->platform = $this->agent->platform();
$session->browser = $this->agent->browser();
$session->device = $this->agent->device();
return $session;
}
/**
* {@inheritdoc}
*/
public function invalidateSession($sessionId): void
{
$user = $this->users->findBySessionId($sessionId);
DB::table('sessions')
->where('id', $sessionId)
->delete();
$this->users->update($user->id, ['remember_token' => null]);
}
/**
* {@inheritdoc}
*/
public function find($sessionId): ?stdClass
{
$session = DB::table('sessions')
->where('id', $sessionId)
->first();
return $session
? $this->mapSessionAttributes($session)
: null;
}
/**
* {@inheritdoc}
*/
public function invalidateAllSessionsForUser($userId): void
{
DB::table('sessions')
->where('user_id', $userId)
->delete();
$this->users->update($userId, ['remember_token' => null]);
}
/**
* {@inheritdoc}
*/
public function getActiveSessionsCount(int $userId): int
{
$validTimestamp = Carbon::now()->subMinutes(config('session.lifetime'))->timestamp;
return DB::table('sessions')
->where('user_id', $userId)
->where('last_activity', '>=', $validTimestamp)
->count();
}
}
@@ -0,0 +1,33 @@
<?php
namespace Vanguard\Repositories\Session;
use Illuminate\Support\Collection;
interface SessionRepository
{
/**
* Find session by id.
*/
public function find(string $sessionId): ?\stdClass;
/**
* Get all active sessions for specified user.
*/
public function getUserSessions(int $userId): Collection;
/**
* Get number of active sessions for the specified user.
*/
public function getActiveSessionsCount(int $userId): int;
/**
* Invalidate specified session for provided user
*/
public function invalidateSession(string $sessionId): void;
/**
* Invalidate all sessions for user with given id.
*/
public function invalidateAllSessionsForUser(int $userId): void;
}
+270
View File
@@ -0,0 +1,270 @@
<?php
namespace Vanguard\Repositories\User;
use Carbon\Carbon;
use DB;
use Illuminate\Contracts\Pagination\LengthAwarePaginator;
use Laravel\Socialite\Contracts\User as SocialUser;
use Vanguard\Http\Filters\UserKeywordSearch;
use Vanguard\Repositories\Role\RoleRepository;
use Vanguard\Role;
use Vanguard\Services\Auth\Social\ManagesSocialAvatarSize;
use Vanguard\Services\Upload\UserAvatarManager;
use Vanguard\Support\Enum\UserStatus;
use Vanguard\User;
class EloquentUser implements UserRepository
{
use ManagesSocialAvatarSize;
public function __construct(
private readonly UserAvatarManager $avatarManager,
private readonly RoleRepository $roles
) {
}
/**
* {@inheritdoc}
*/
public function find(int $id): ?User
{
return User::find($id);
}
/**
* {@inheritdoc}
*/
public function findByEmail(string $email): ?User
{
return User::where('email', $email)->first();
}
/**
* {@inheritdoc}
*/
public function findBySocialId(string $provider, string $providerId): ?User
{
return User::leftJoin('social_logins', 'users.id', '=', 'social_logins.user_id')
->select('users.*')
->where('social_logins.provider', $provider)
->where('social_logins.provider_id', $providerId)
->first();
}
/**
* {@inheritdoc}
*/
public function findBySessionId(string $sessionId): ?User
{
return User::leftJoin('sessions', 'users.id', '=', 'sessions.user_id')
->select('users.*')
->where('sessions.id', $sessionId)
->first();
}
/**
* {@inheritdoc}
*/
public function create(array $data): User
{
return User::create($data);
}
/**
* {@inheritdoc}
*/
public function associateSocialAccountForUser(int $userId, string $provider, SocialUser $user): bool
{
return DB::table('social_logins')->insert([
'user_id' => $userId,
'provider' => $provider,
'provider_id' => $user->getId(),
'avatar' => $this->getAvatarForProvider($provider, $user),
'created_at' => Carbon::now(),
]);
}
/**
* {@inheritdoc}
*/
public function paginate(int $perPage, ?string $search = null, ?string $status = null): LengthAwarePaginator
{
$query = User::query();
if ($status) {
$query->where('status', $status);
}
if ($search) {
(new UserKeywordSearch)($query, $search);
}
$result = $query->orderBy('id', 'desc')
->paginate($perPage);
if ($search) {
$result->appends(['search' => $search]);
}
if ($status) {
$result->appends(['status' => $status]);
}
return $result;
}
/**
* {@inheritdoc}
*/
public function update(int $id, array $data): User
{
if (isset($data['country_id']) && $data['country_id'] == 0) {
$data['country_id'] = null;
}
$user = $this->find($id);
$user->update($data);
return $user;
}
/**
* {@inheritdoc}
*/
public function delete(int $id): bool
{
$user = $this->find($id);
$this->avatarManager->deleteAvatarIfUploaded($user);
return $user->delete();
}
/**
* {@inheritdoc}
*/
public function count(): int
{
return User::count();
}
/**
* {@inheritdoc}
*/
public function newUsersCount(): int
{
return User::whereBetween('created_at', [Carbon::now()->firstOfMonth(), Carbon::now()])
->count();
}
/**
* {@inheritdoc}
*/
public function countByStatus(UserStatus $status): int
{
return User::where('status', $status)->count();
}
/**
* {@inheritdoc}
*/
public function latest($count = 20): \Illuminate\Database\Eloquent\Collection
{
return User::orderBy('created_at', 'DESC')
->limit($count)
->get();
}
/**
* {@inheritdoc}
*/
public function countOfNewUsersPerMonthPerRole(Carbon $from, Carbon $to): array
{
$result = User::whereBetween('created_at', [$from, $to])
->orderBy('created_at')
->get(['created_at'])
->groupBy(function ($user) {
return $user->created_at->format('Y_n');
});
$counts = [];
while ($from->lt($to)) {
$key = $from->format('Y_n');
$counts[$this->parseDate($key)] = count($result->get($key, []));
$from->addMonth();
}
return $counts;
}
/**
* Parse date from "Y_m" format to "{Month Name} {Year}" format.
*/
private function parseDate(string $yearMonth): string
{
[$year, $month] = explode('_', $yearMonth);
$month = trans("app.months.{$month}");
return "{$month} {$year}";
}
/**
* {@inheritdoc}
*/
public function getUsersWithRole(string $roleName): \Illuminate\Database\Eloquent\Collection
{
return Role::where('name', $roleName)
->first()
->users;
}
/**
* {@inheritdoc}
*/
public function getUserSocialLogins(int $userId): \Illuminate\Support\Collection
{
return DB::table('social_logins')
->where('user_id', $userId)
->get();
}
/**
* {@inheritdoc}
*/
public function setRole(int $userId, int $roleId): bool
{
return $this->find($userId)->setRole($roleId);
}
/**
* {@inheritdoc}
*/
public function findByConfirmationToken(string $token): ?User
{
return User::where('confirmation_token', $token)->first();
}
/**
* {@inheritdoc}
*/
public function switchRolesForUsers(int $fromRoleId, int $toRoleId): bool
{
return User::where('role_id', $fromRoleId)->update(['role_id' => $toRoleId]);
}
/**
* {@inheritdoc}
*/
public function findForTwoFactor(string $phone, string $countryCode): ?User
{
return User::where('two_factor_phone', $phone)
->where('two_factor_country_code', $countryCode)
->first();
}
}
+123
View File
@@ -0,0 +1,123 @@
<?php
namespace Vanguard\Repositories\User;
use Carbon\Carbon;
use Illuminate\Contracts\Pagination\LengthAwarePaginator;
use Illuminate\Database\Eloquent\Collection;
use Laravel\Socialite\Contracts\User as SocialUser;
use Vanguard\Support\Enum\UserStatus;
use Vanguard\User;
interface UserRepository
{
/**
* Paginate registered users.
*/
public function paginate(int $perPage, ?string $search = null, ?string $status = null): LengthAwarePaginator;
/**
* Find user by its id.
*/
public function find(int $id): ?User;
/**
* Find user by email.
*/
public function findByEmail(string $email): ?User;
/**
* Find user registered via social network.
*
* @param $provider string Provider used for authentication.
* @param $providerId string Provider's unique identifier for authenticated user.
*/
public function findBySocialId(string $provider, string $providerId): ?User;
/**
* Find user by specified session id.
*/
public function findBySessionId(string $sessionId): ?User;
/**
* Create new user.
*/
public function create(array $data): User;
/**
* Update user specified by its id.
*/
public function update(int $id, array $data): User;
/**
* Delete user with provided id.
*/
public function delete(int $id): bool;
/**
* Associate account details returned from social network
* to user with provided user id.
*/
public function associateSocialAccountForUser(int $userId, string $provider, SocialUser $user): bool;
/**
* Number of users in database.
*/
public function count(): int;
/**
* Number of users registered during current month.
*
* @return mixed
*/
public function newUsersCount(): int;
/**
* Number of users with provided status.
*/
public function countByStatus(UserStatus $status): int;
/**
* Count of registered users for every month within the provided date range.
*/
public function countOfNewUsersPerMonthPerRole(Carbon $from, Carbon $to): array;
/**
* Get latest {$count} users from database.
*
* @return Collection<User>
*/
public function latest(int $count = 20): Collection;
/**
* Set specified role to specified user.
*/
public function setRole(int $userId, int $roleId): bool;
/**
* Change role for all users that have role $fromRoleId to $toRoleId.
*/
public function switchRolesForUsers(int $fromRoleId, int $toRoleId): bool;
/**
* Get all users with provided role.
*
* @return Collection<User>
*/
public function getUsersWithRole(string $roleName): Collection;
/**
* Get all social login records for specified user.
*/
public function getUserSocialLogins(int $userId): \Illuminate\Support\Collection;
/**
* Find user by confirmation token.
*/
public function findByConfirmationToken(string $token): ?User;
/**
* Find user by phone and country code.
*/
public function findForTwoFactor(string $phone, string $countryCode): ?User;
}