1
0
mirror of https://github.com/chylex/Minecraft-Phantom-Panel.git synced 2025-08-16 03:31:43 +02:00
Files
.config
.run
.workdir
Agent
Common
Controller
Phantom.Controller
Phantom.Controller.Database
Converters
Entities
Factories
Repositories
AuditLogRepository.Writer.cs
AuditLogRepository.cs
EventLogRepository.cs
PermissionRepository.cs
RoleRepository.cs
UserRepository.cs
UserRoleRepository.cs
ApplicationDbContext.cs
DatabaseMigrator.cs
IDbContextProvider.cs
ILazyDbContext.cs
Phantom.Controller.Database.csproj
Phantom.Controller.Database.Postgres
Phantom.Controller.Minecraft
Phantom.Controller.Services
Docker
Utils
Web
.dockerignore
.gitattributes
.gitignore
AddMigration.bat
AddMigration.sh
Directory.Build.props
Directory.Build.targets
Dockerfile
LICENSE
Packages.props
PhantomPanel.sln
README.md
global.json
2023-12-05 14:27:55 +01:00

73 lines
2.4 KiB
C#

using System.Collections.Immutable;
using Microsoft.EntityFrameworkCore;
using Phantom.Controller.Database.Entities;
using Phantom.Utils.Collections;
namespace Phantom.Controller.Database.Repositories;
public sealed class UserRoleRepository {
private readonly ILazyDbContext db;
public UserRoleRepository(ILazyDbContext db) {
this.db = db;
}
public async Task<ImmutableDictionary<Guid, ImmutableArray<Guid>>> GetRoleGuidsByUserGuid(ImmutableHashSet<Guid> userGuids) {
var result = await db.Ctx.UserRoles
.Where(ur => userGuids.Contains(ur.UserGuid))
.GroupBy(static ur => ur.UserGuid, static ur => ur.RoleGuid)
.AsAsyncEnumerable()
.ToImmutableDictionaryAsync(static group => group.Key, static group => group.ToImmutableArray());
foreach (var userGuid in userGuids) {
if (!result.ContainsKey(userGuid)) {
result = result.Add(userGuid, ImmutableArray<Guid>.Empty);
}
}
return result;
}
public Task<Dictionary<Guid, ImmutableArray<RoleEntity>>> GetAllByUserGuid() {
return db.Ctx.UserRoles
.Include(static ur => ur.Role)
.GroupBy(static ur => ur.UserGuid, static ur => ur.Role)
.ToDictionaryAsync(static group => group.Key, static group => group.ToImmutableArray());
}
public Task<ImmutableArray<RoleEntity>> GetUserRoles(UserEntity user) {
return db.Ctx.UserRoles
.Include(static ur => ur.Role)
.Where(ur => ur.UserGuid == user.UserGuid)
.Select(static ur => ur.Role)
.AsAsyncEnumerable()
.ToImmutableArrayAsync();
}
public Task<ImmutableHashSet<Guid>> GetUserRoleGuids(UserEntity user) {
return db.Ctx.UserRoles
.Where(ur => ur.UserGuid == user.UserGuid)
.Select(static ur => ur.RoleGuid)
.AsAsyncEnumerable()
.ToImmutableSetAsync();
}
public async Task Add(UserEntity user, RoleEntity role) {
var userRole = await db.Ctx.UserRoles.FindAsync(user.UserGuid, role.RoleGuid);
if (userRole == null) {
db.Ctx.UserRoles.Add(new UserRoleEntity(user.UserGuid, role.RoleGuid));
}
}
public async Task<UserRoleEntity?> Remove(UserEntity user, RoleEntity role) {
var userRole = await db.Ctx.UserRoles.FindAsync(user.UserGuid, role.RoleGuid);
if (userRole == null) {
return null;
}
else {
db.Ctx.UserRoles.Remove(userRole);
return userRole;
}
}
}