|
|
|
|
@@ -137,7 +137,7 @@ public partial class LightlessHub
|
|
|
|
|
|
|
|
|
|
var allUserPairs = await GetAllPairInfo(pair.GroupUserUID).ConfigureAwait(false);
|
|
|
|
|
|
|
|
|
|
var sharedData = await DbContext.CharaDataAllowances.Where(u => u.AllowedGroup != null && u.AllowedGroupGID == dto.GID && u.ParentUploaderUID == pair.GroupUserUID).ToListAsync(cancellationToken: _contextAccessor.HttpContext.RequestAborted).ConfigureAwait(false);
|
|
|
|
|
var sharedData = await DbContext.CharaDataAllowances.Where(u => u.AllowedGroup != null && u.AllowedGroupGID == dto.GID && u.ParentUploaderUID == pair.GroupUserUID).ToListAsync().ConfigureAwait(false);
|
|
|
|
|
DbContext.CharaDataAllowances.RemoveRange(sharedData);
|
|
|
|
|
|
|
|
|
|
foreach (var groupUserPair in groupPairs.Where(p => !string.Equals(p.GroupUserUID, pair.GroupUserUID, StringComparison.Ordinal)))
|
|
|
|
|
@@ -181,7 +181,7 @@ public partial class LightlessHub
|
|
|
|
|
|
|
|
|
|
var allUserPairs = await GetAllPairInfo(pair.GroupUserUID).ConfigureAwait(false);
|
|
|
|
|
|
|
|
|
|
var sharedData = await DbContext.CharaDataAllowances.Where(u => u.AllowedGroup != null && u.AllowedGroupGID == dto.GID && u.ParentUploaderUID == pair.GroupUserUID).ToListAsync(cancellationToken: _contextAccessor.HttpContext.RequestAborted).ConfigureAwait(false);
|
|
|
|
|
var sharedData = await DbContext.CharaDataAllowances.Where(u => u.AllowedGroup != null && u.AllowedGroupGID == dto.GID && u.ParentUploaderUID == pair.GroupUserUID).ToListAsync().ConfigureAwait(false);
|
|
|
|
|
|
|
|
|
|
DbContext.CharaDataAllowances.RemoveRange(sharedData);
|
|
|
|
|
|
|
|
|
|
@@ -199,15 +199,15 @@ public partial class LightlessHub
|
|
|
|
|
public async Task<GroupJoinDto> GroupCreate()
|
|
|
|
|
{
|
|
|
|
|
_logger.LogCallInfo();
|
|
|
|
|
var existingGroupsByUser = await DbContext.Groups.CountAsync(u => u.OwnerUID == UserUID, cancellationToken: _contextAccessor.HttpContext.RequestAborted).ConfigureAwait(false);
|
|
|
|
|
var existingJoinedGroups = await DbContext.GroupPairs.CountAsync(u => u.GroupUserUID == UserUID, cancellationToken: _contextAccessor.HttpContext.RequestAborted).ConfigureAwait(false);
|
|
|
|
|
var existingGroupsByUser = await DbContext.Groups.CountAsync(u => u.OwnerUID == UserUID).ConfigureAwait(false);
|
|
|
|
|
var existingJoinedGroups = await DbContext.GroupPairs.CountAsync(u => u.GroupUserUID == UserUID).ConfigureAwait(false);
|
|
|
|
|
if (existingGroupsByUser >= _maxExistingGroupsByUser || existingJoinedGroups >= _maxJoinedGroupsByUser)
|
|
|
|
|
{
|
|
|
|
|
throw new System.Exception($"Max groups for user is {_maxExistingGroupsByUser}, max joined groups is {_maxJoinedGroupsByUser}.");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var gid = StringUtils.GenerateRandomString(12);
|
|
|
|
|
while (await DbContext.Groups.AnyAsync(g => g.GID == "LLS-" + gid, cancellationToken: _contextAccessor.HttpContext.RequestAborted).ConfigureAwait(false))
|
|
|
|
|
while (await DbContext.Groups.AnyAsync(g => g.GID == "LLS-" + gid).ConfigureAwait(false))
|
|
|
|
|
{
|
|
|
|
|
gid = StringUtils.GenerateRandomString(12);
|
|
|
|
|
}
|
|
|
|
|
@@ -218,7 +218,7 @@ public partial class LightlessHub
|
|
|
|
|
var hashedPw = StringUtils.Sha256String(passwd);
|
|
|
|
|
var currentTime = DateTime.UtcNow;
|
|
|
|
|
|
|
|
|
|
UserDefaultPreferredPermission defaultPermissions = await DbContext.UserDefaultPreferredPermissions.SingleAsync(u => u.UserUID == UserUID, cancellationToken: _contextAccessor.HttpContext.RequestAborted).ConfigureAwait(false);
|
|
|
|
|
UserDefaultPreferredPermission defaultPermissions = await DbContext.UserDefaultPreferredPermissions.SingleAsync(u => u.UserUID == UserUID).ConfigureAwait(false);
|
|
|
|
|
|
|
|
|
|
Group newGroup = new()
|
|
|
|
|
{
|
|
|
|
|
@@ -255,7 +255,7 @@ public partial class LightlessHub
|
|
|
|
|
await DbContext.GroupPairPreferredPermissions.AddAsync(initialPrefPermissions, _contextAccessor.HttpContext.RequestAborted).ConfigureAwait(false);
|
|
|
|
|
await DbContext.SaveChangesAsync(_contextAccessor.HttpContext.RequestAborted).ConfigureAwait(false);
|
|
|
|
|
|
|
|
|
|
var self = await DbContext.Users.SingleAsync(u => u.UID == UserUID, cancellationToken: _contextAccessor.HttpContext.RequestAborted).ConfigureAwait(false);
|
|
|
|
|
var self = await DbContext.Users.SingleAsync(u => u.UID == UserUID).ConfigureAwait(false);
|
|
|
|
|
|
|
|
|
|
await Clients.User(UserUID).Client_GroupSendFullInfo(new GroupFullInfoDto(newGroup.ToGroupData(), self.ToUserData(),
|
|
|
|
|
newGroup.ToEnum(), initialPrefPermissions.ToEnum(), initialPair.ToEnum(), new(StringComparer.Ordinal)))
|
|
|
|
|
@@ -314,7 +314,7 @@ public partial class LightlessHub
|
|
|
|
|
|
|
|
|
|
_logger.LogCallInfo(LightlessHubLogger.Args(dto, "Success"));
|
|
|
|
|
|
|
|
|
|
var groupPairs = await DbContext.GroupPairs.Where(p => p.GroupGID == dto.Group.GID).ToListAsync(cancellationToken: _contextAccessor.HttpContext.RequestAborted).ConfigureAwait(false);
|
|
|
|
|
var groupPairs = await DbContext.GroupPairs.Where(p => p.GroupGID == dto.Group.GID).ToListAsync().ConfigureAwait(false);
|
|
|
|
|
DbContext.RemoveRange(groupPairs);
|
|
|
|
|
DbContext.Remove(group);
|
|
|
|
|
await DbContext.SaveChangesAsync(_contextAccessor.HttpContext.RequestAborted).ConfigureAwait(false);
|
|
|
|
|
@@ -332,7 +332,7 @@ public partial class LightlessHub
|
|
|
|
|
var (userHasRights, group) = await TryValidateGroupModeratorOrOwner(dto.GID).ConfigureAwait(false);
|
|
|
|
|
if (!userHasRights) return [];
|
|
|
|
|
|
|
|
|
|
var banEntries = await DbContext.GroupBans.Include(b => b.BannedUser).Where(g => g.GroupGID == dto.Group.GID).AsNoTracking().ToListAsync(cancellationToken: _contextAccessor.HttpContext.RequestAborted).ConfigureAwait(false);
|
|
|
|
|
var banEntries = await DbContext.GroupBans.Include(b => b.BannedUser).Where(g => g.GroupGID == dto.Group.GID).AsNoTracking().ToListAsync().ConfigureAwait(false);
|
|
|
|
|
|
|
|
|
|
List<BannedGroupUserDto> bannedGroupUsers = banEntries.Select(b =>
|
|
|
|
|
new BannedGroupUserDto(group.ToGroupData(), b.BannedUser.ToUserData(), b.BannedReason, b.BannedOn,
|
|
|
|
|
@@ -350,14 +350,14 @@ public partial class LightlessHub
|
|
|
|
|
|
|
|
|
|
_logger.LogCallInfo(LightlessHubLogger.Args(dto));
|
|
|
|
|
|
|
|
|
|
var group = await DbContext.Groups.Include(g => g.Owner).AsNoTracking().SingleOrDefaultAsync(g => g.GID == aliasOrGid || g.Alias == aliasOrGid, cancellationToken: _contextAccessor.HttpContext.RequestAborted).ConfigureAwait(false);
|
|
|
|
|
var group = await DbContext.Groups.Include(g => g.Owner).AsNoTracking().SingleOrDefaultAsync(g => g.GID == aliasOrGid || g.Alias == aliasOrGid).ConfigureAwait(false);
|
|
|
|
|
var groupGid = group?.GID ?? string.Empty;
|
|
|
|
|
var existingPair = await DbContext.GroupPairs.AsNoTracking().SingleOrDefaultAsync(g => g.GroupGID == groupGid && g.GroupUserUID == UserUID, cancellationToken: _contextAccessor.HttpContext.RequestAborted).ConfigureAwait(false);
|
|
|
|
|
var existingPair = await DbContext.GroupPairs.AsNoTracking().SingleOrDefaultAsync(g => g.GroupGID == groupGid && g.GroupUserUID == UserUID).ConfigureAwait(false);
|
|
|
|
|
var hashedPw = StringUtils.Sha256String(dto.Password);
|
|
|
|
|
var existingUserCount = await DbContext.GroupPairs.AsNoTracking().CountAsync(g => g.GroupGID == groupGid, cancellationToken: _contextAccessor.HttpContext.RequestAborted).ConfigureAwait(false);
|
|
|
|
|
var joinedGroups = await DbContext.GroupPairs.CountAsync(g => g.GroupUserUID == UserUID, cancellationToken: _contextAccessor.HttpContext.RequestAborted).ConfigureAwait(false);
|
|
|
|
|
var isBanned = await DbContext.GroupBans.AnyAsync(g => g.GroupGID == groupGid && g.BannedUserUID == UserUID, cancellationToken: _contextAccessor.HttpContext.RequestAborted).ConfigureAwait(false);
|
|
|
|
|
var oneTimeInvite = await DbContext.GroupTempInvites.SingleOrDefaultAsync(g => g.GroupGID == groupGid && g.Invite == hashedPw, cancellationToken: _contextAccessor.HttpContext.RequestAborted).ConfigureAwait(false);
|
|
|
|
|
var existingUserCount = await DbContext.GroupPairs.AsNoTracking().CountAsync(g => g.GroupGID == groupGid).ConfigureAwait(false);
|
|
|
|
|
var joinedGroups = await DbContext.GroupPairs.CountAsync(g => g.GroupUserUID == UserUID).ConfigureAwait(false);
|
|
|
|
|
var isBanned = await DbContext.GroupBans.AnyAsync(g => g.GroupGID == groupGid && g.BannedUserUID == UserUID).ConfigureAwait(false);
|
|
|
|
|
var oneTimeInvite = await DbContext.GroupTempInvites.SingleOrDefaultAsync(g => g.GroupGID == groupGid && g.Invite == hashedPw).ConfigureAwait(false);
|
|
|
|
|
|
|
|
|
|
if (group == null
|
|
|
|
|
|| (!string.Equals(group.HashedPassword, hashedPw, StringComparison.Ordinal) && oneTimeInvite == null)
|
|
|
|
|
@@ -378,7 +378,7 @@ public partial class LightlessHub
|
|
|
|
|
|
|
|
|
|
_logger.LogCallInfo(LightlessHubLogger.Args(dto));
|
|
|
|
|
|
|
|
|
|
var group = await DbContext.Groups.Include(g => g.Owner).AsNoTracking().SingleOrDefaultAsync(g => g.GID == aliasOrGid || g.Alias == aliasOrGid, cancellationToken: _contextAccessor.HttpContext.RequestAborted).ConfigureAwait(false);
|
|
|
|
|
var group = await DbContext.Groups.Include(g => g.Owner).AsNoTracking().SingleOrDefaultAsync(g => g.GID == aliasOrGid || g.Alias == aliasOrGid).ConfigureAwait(false);
|
|
|
|
|
var groupGid = group?.GID ?? string.Empty;
|
|
|
|
|
var existingPair = await DbContext.GroupPairs.AsNoTracking().SingleOrDefaultAsync(g => g.GroupGID == groupGid && g.GroupUserUID == UserUID).ConfigureAwait(false);
|
|
|
|
|
var isHashedPassword = dto.Password.Length == 64 && dto.Password.All(Uri.IsHexDigit);
|
|
|
|
|
@@ -416,7 +416,7 @@ public partial class LightlessHub
|
|
|
|
|
FromFinder = isHashedPassword
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
var preferredPermissions = await DbContext.GroupPairPreferredPermissions.SingleOrDefaultAsync(u => u.UserUID == UserUID && u.GroupGID == group.GID, cancellationToken: _contextAccessor.HttpContext.RequestAborted).ConfigureAwait(false);
|
|
|
|
|
var preferredPermissions = await DbContext.GroupPairPreferredPermissions.SingleOrDefaultAsync(u => u.UserUID == UserUID && u.GroupGID == group.GID).ConfigureAwait(false);
|
|
|
|
|
if (preferredPermissions == null)
|
|
|
|
|
{
|
|
|
|
|
GroupPairPreferredPermission newPerms = new()
|
|
|
|
|
@@ -447,7 +447,7 @@ public partial class LightlessHub
|
|
|
|
|
|
|
|
|
|
await DbContext.SaveChangesAsync(_contextAccessor.HttpContext.RequestAborted).ConfigureAwait(false);
|
|
|
|
|
|
|
|
|
|
var groupInfos = await DbContext.GroupPairs.Where(u => u.GroupGID == group.GID && (u.IsPinned || u.IsModerator)).ToListAsync(cancellationToken: _contextAccessor.HttpContext.RequestAborted).ConfigureAwait(false);
|
|
|
|
|
var groupInfos = await DbContext.GroupPairs.Where(u => u.GroupGID == group.GID && (u.IsPinned || u.IsModerator)).ToListAsync().ConfigureAwait(false);
|
|
|
|
|
await Clients.User(UserUID).Client_GroupSendFullInfo(new GroupFullInfoDto(group.ToGroupData(), group.Owner.ToUserData(),
|
|
|
|
|
group.ToEnum(), preferredPermissions.ToEnum(), newPair.ToEnum(),
|
|
|
|
|
groupInfos.ToDictionary(u => u.GroupUserUID, u => u.ToEnum(), StringComparer.Ordinal))).ConfigureAwait(false);
|
|
|
|
|
@@ -693,7 +693,7 @@ public partial class LightlessHub
|
|
|
|
|
.Client_GroupPairLeft(new GroupPairDto(dto.Group, pair.GroupUser.ToUserData())).ConfigureAwait(false);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
await DbContext.SaveChangesAsync(_contextAccessor.HttpContext.RequestAborted).ConfigureAwait(false);
|
|
|
|
|
await DbContext.SaveChangesAsync().ConfigureAwait(false);
|
|
|
|
|
|
|
|
|
|
return usersToPrune.Count();
|
|
|
|
|
}
|
|
|
|
|
@@ -717,15 +717,15 @@ public partial class LightlessHub
|
|
|
|
|
var groupPairs = DbContext.GroupPairs.Where(p => p.GroupGID == group.GID).AsNoTracking().ToList();
|
|
|
|
|
await Clients.Users(groupPairs.Select(p => p.GroupUserUID)).Client_GroupPairLeft(dto).ConfigureAwait(false);
|
|
|
|
|
|
|
|
|
|
var sharedData = await DbContext.CharaDataAllowances.Where(u => u.AllowedGroup != null && u.AllowedGroupGID == dto.GID && u.ParentUploaderUID == dto.UID).ToListAsync(cancellationToken: _contextAccessor.HttpContext.RequestAborted).ConfigureAwait(false);
|
|
|
|
|
var sharedData = await DbContext.CharaDataAllowances.Where(u => u.AllowedGroup != null && u.AllowedGroupGID == dto.GID && u.ParentUploaderUID == dto.UID).ToListAsync().ConfigureAwait(false);
|
|
|
|
|
DbContext.CharaDataAllowances.RemoveRange(sharedData);
|
|
|
|
|
|
|
|
|
|
await DbContext.SaveChangesAsync(_contextAccessor.HttpContext.RequestAborted).ConfigureAwait(false);
|
|
|
|
|
await DbContext.SaveChangesAsync().ConfigureAwait(false);
|
|
|
|
|
|
|
|
|
|
var userIdent = await GetUserIdent(dto.User.UID).ConfigureAwait(false);
|
|
|
|
|
if (userIdent == null)
|
|
|
|
|
{
|
|
|
|
|
await DbContext.SaveChangesAsync(_contextAccessor.HttpContext.RequestAborted).ConfigureAwait(false);
|
|
|
|
|
await DbContext.SaveChangesAsync().ConfigureAwait(false);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -743,10 +743,8 @@ public partial class LightlessHub
|
|
|
|
|
{
|
|
|
|
|
_logger.LogCallInfo(LightlessHubLogger.Args(dto));
|
|
|
|
|
|
|
|
|
|
var cancellationToken = _contextAccessor.HttpContext.RequestAborted;
|
|
|
|
|
|
|
|
|
|
var data = await DbContext.GroupProfiles
|
|
|
|
|
.FirstOrDefaultAsync(g => g.GroupGID == dto.Group.GID, cancellationToken)
|
|
|
|
|
.FirstOrDefaultAsync(g => g.GroupGID == dto.Group.GID)
|
|
|
|
|
.ConfigureAwait(false);
|
|
|
|
|
|
|
|
|
|
var profileDto = new GroupProfileDto(dto.Group, Description: null, Tags: null, PictureBase64: null);
|
|
|
|
|
@@ -779,8 +777,7 @@ public partial class LightlessHub
|
|
|
|
|
if (!hasRights) return;
|
|
|
|
|
|
|
|
|
|
var groupProfileDb = await DbContext.GroupProfiles
|
|
|
|
|
.FirstOrDefaultAsync(g => g.GroupGID == dto.Group.GID,
|
|
|
|
|
_contextAccessor.HttpContext.RequestAborted)
|
|
|
|
|
.FirstOrDefaultAsync(g => g.GroupGID == dto.Group.GID)
|
|
|
|
|
.ConfigureAwait(false);
|
|
|
|
|
|
|
|
|
|
if (groupProfileDb != null)
|
|
|
|
|
@@ -838,7 +835,7 @@ public partial class LightlessHub
|
|
|
|
|
|
|
|
|
|
await DbContext.SaveChangesAsync(_contextAccessor.HttpContext.RequestAborted).ConfigureAwait(false);
|
|
|
|
|
|
|
|
|
|
var groupPairs = await DbContext.GroupPairs.AsNoTracking().Where(p => p.GroupGID == dto.Group.GID).Select(p => p.GroupUserUID).ToListAsync(cancellationToken: _contextAccessor.HttpContext.RequestAborted).ConfigureAwait(false);
|
|
|
|
|
var groupPairs = await DbContext.GroupPairs.AsNoTracking().Where(p => p.GroupGID == dto.Group.GID).Select(p => p.GroupUserUID).ToListAsync().ConfigureAwait(false);
|
|
|
|
|
await Clients.Users(groupPairs).Client_GroupPairChangeUserInfo(new GroupPairUserInfoDto(dto.Group, dto.User, userPair.ToEnum())).ConfigureAwait(false);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -847,8 +844,6 @@ public partial class LightlessHub
|
|
|
|
|
{
|
|
|
|
|
_logger.LogCallInfo();
|
|
|
|
|
|
|
|
|
|
var ct = _contextAccessor.HttpContext.RequestAborted;
|
|
|
|
|
|
|
|
|
|
var result = await (
|
|
|
|
|
from gp in DbContext.GroupPairs
|
|
|
|
|
.Include(gp => gp.Group)
|
|
|
|
|
@@ -866,7 +861,7 @@ public partial class LightlessHub
|
|
|
|
|
.ToList(),
|
|
|
|
|
})
|
|
|
|
|
.AsNoTracking()
|
|
|
|
|
.ToListAsync(ct)
|
|
|
|
|
.ToListAsync()
|
|
|
|
|
.ConfigureAwait(false);
|
|
|
|
|
|
|
|
|
|
_logger.LogCallInfo(LightlessHubLogger.Args(result));
|
|
|
|
|
@@ -899,7 +894,7 @@ public partial class LightlessHub
|
|
|
|
|
var (userHasRights, _) = await TryValidateGroupModeratorOrOwner(dto.Group.GID).ConfigureAwait(false);
|
|
|
|
|
if (!userHasRights) return;
|
|
|
|
|
|
|
|
|
|
var banEntry = await DbContext.GroupBans.SingleOrDefaultAsync(g => g.GroupGID == dto.Group.GID && g.BannedUserUID == dto.User.UID, cancellationToken: _contextAccessor.HttpContext.RequestAborted).ConfigureAwait(false);
|
|
|
|
|
var banEntry = await DbContext.GroupBans.SingleOrDefaultAsync(g => g.GroupGID == dto.Group.GID && g.BannedUserUID == dto.User.UID).ConfigureAwait(false);
|
|
|
|
|
if (banEntry == null) return;
|
|
|
|
|
|
|
|
|
|
DbContext.Remove(banEntry);
|
|
|
|
|
@@ -990,6 +985,4 @@ public partial class LightlessHub
|
|
|
|
|
|
|
|
|
|
return results;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|