Compare commits
23 Commits
cdn-downlo
...
fix-profil
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2ebdd6e0c7 | ||
|
|
2407259769 | ||
| 03af0b853c | |||
|
|
53f663fcbf | ||
|
|
47a94cb79f | ||
| f933b40368 | |||
|
|
b670cb69dd | ||
|
|
50f3b0d644 | ||
|
|
3a6203844e | ||
|
|
80086f6817 | ||
| 7e565ff85e | |||
|
|
b36b1fb8f9 | ||
|
|
707c565ea9 | ||
|
|
6beda853f7 | ||
|
|
23dc6d7ef4 | ||
|
|
f686f7a6da | ||
|
|
280cc2ebbb | ||
|
|
7909850ad5 | ||
|
|
f60994fa58 | ||
|
|
96f230cd21 | ||
| 0fe1a43fb2 | |||
|
|
43b9c6f90e | ||
|
|
59f3739b9c |
2
.gitmodules
vendored
2
.gitmodules
vendored
@@ -1,4 +1,4 @@
|
|||||||
[submodule "LightlessAPI"]
|
[submodule "LightlessAPI"]
|
||||||
path = LightlessAPI
|
path = LightlessAPI
|
||||||
url = https://git.lightless-sync.org/Lightless-Sync/LightlessAPI
|
url = https://git.lightless-sync.org/Lightless-Sync/LightlessAPI
|
||||||
branch = main
|
branch = main
|
||||||
Submodule LightlessAPI updated: 44fbe10458...418e647ef8
@@ -209,7 +209,7 @@ public partial class LightlessHub
|
|||||||
|
|
||||||
if (isOwnerResult.ReferredGroup == null) return (false, null);
|
if (isOwnerResult.ReferredGroup == null) return (false, null);
|
||||||
|
|
||||||
var groupPairSelf = await DbContext.GroupPairs.SingleOrDefaultAsync(g => g.GroupGID == gid && g.GroupUserUID == UserUID).ConfigureAwait(false);
|
var groupPairSelf = await DbContext.GroupPairs.SingleOrDefaultAsync(g => g.GroupGID == gid || g.Group.Alias == gid && g.GroupUserUID == UserUID).ConfigureAwait(false);
|
||||||
if (groupPairSelf == null || !groupPairSelf.IsModerator) return (false, null);
|
if (groupPairSelf == null || !groupPairSelf.IsModerator) return (false, null);
|
||||||
|
|
||||||
return (true, isOwnerResult.ReferredGroup);
|
return (true, isOwnerResult.ReferredGroup);
|
||||||
@@ -217,7 +217,7 @@ public partial class LightlessHub
|
|||||||
|
|
||||||
private async Task<(bool isValid, Group ReferredGroup)> TryValidateOwner(string gid)
|
private async Task<(bool isValid, Group ReferredGroup)> TryValidateOwner(string gid)
|
||||||
{
|
{
|
||||||
var group = await DbContext.Groups.SingleOrDefaultAsync(g => g.GID == gid).ConfigureAwait(false);
|
var group = await DbContext.Groups.SingleOrDefaultAsync(g => g.GID == gid || g.Alias == gid).ConfigureAwait(false);
|
||||||
if (group == null) return (false, null);
|
if (group == null) return (false, null);
|
||||||
|
|
||||||
return (string.Equals(group.OwnerUID, UserUID, StringComparison.Ordinal), group);
|
return (string.Equals(group.OwnerUID, UserUID, StringComparison.Ordinal), group);
|
||||||
|
|||||||
@@ -746,23 +746,14 @@ public partial class LightlessHub
|
|||||||
var cancellationToken = RequestAbortedToken;
|
var cancellationToken = RequestAbortedToken;
|
||||||
|
|
||||||
var data = await DbContext.GroupProfiles
|
var data = await DbContext.GroupProfiles
|
||||||
.FirstOrDefaultAsync(g => g.GroupGID == dto.Group.GID)
|
.FirstOrDefaultAsync(g => g.Group.GID == dto.Group.GID || g.Group.Alias == dto.Group.GID, cancellationToken)
|
||||||
.ConfigureAwait(false);
|
.ConfigureAwait(false);
|
||||||
|
|
||||||
var profileDto = new GroupProfileDto(dto.Group, Description: null, Tags: null, PictureBase64: null);
|
var profileDto = new GroupProfileDto(dto.Group, Description: null, Tags: null, PictureBase64: null, IsNsfw: false, IsDisabled: false);
|
||||||
|
|
||||||
if (data is not null)
|
if (data is not null)
|
||||||
{
|
{
|
||||||
profileDto = profileDto with
|
profileDto = data.ToDTO();
|
||||||
{
|
|
||||||
Description = data.Description,
|
|
||||||
Tags = data.Tags,
|
|
||||||
PictureBase64 = data.Base64GroupProfileImage,
|
|
||||||
};
|
|
||||||
|
|
||||||
await Clients.User(UserUID)
|
|
||||||
.Client_GroupSendProfile(profileDto)
|
|
||||||
.ConfigureAwait(false);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return profileDto;
|
return profileDto;
|
||||||
@@ -779,15 +770,39 @@ public partial class LightlessHub
|
|||||||
if (!hasRights) return;
|
if (!hasRights) return;
|
||||||
|
|
||||||
var groupProfileDb = await DbContext.GroupProfiles
|
var groupProfileDb = await DbContext.GroupProfiles
|
||||||
.FirstOrDefaultAsync(g => g.GroupGID == dto.Group.GID,
|
.FirstOrDefaultAsync(g => g.Group.GID == dto.Group.GID || g.Group.Alias == dto.Group.GID,
|
||||||
RequestAbortedToken)
|
RequestAbortedToken)
|
||||||
.ConfigureAwait(false);
|
.ConfigureAwait(false);
|
||||||
|
|
||||||
if (groupProfileDb != null)
|
if (groupProfileDb != null)
|
||||||
{
|
{
|
||||||
groupProfileDb.Description = dto.Description;
|
var groupPairs = DbContext.GroupPairs.Where(p => p.GroupGID == groupProfileDb.GroupGID).Select(p => p.GroupUserUID).ToList();
|
||||||
groupProfileDb.Tags = dto.Tags;
|
|
||||||
groupProfileDb.Base64GroupProfileImage = dto.PictureBase64;
|
if (string.Equals("", dto.PictureBase64, StringComparison.OrdinalIgnoreCase))
|
||||||
|
{
|
||||||
|
groupProfileDb.Base64GroupProfileImage = null;
|
||||||
|
}
|
||||||
|
else if (dto.PictureBase64 != null)
|
||||||
|
{
|
||||||
|
groupProfileDb.Base64GroupProfileImage = dto.PictureBase64;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dto.Tags != null)
|
||||||
|
{
|
||||||
|
groupProfileDb.Tags = dto.Tags;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dto.Description != null)
|
||||||
|
{
|
||||||
|
groupProfileDb.Description = dto.Description;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dto.IsNsfw != null)
|
||||||
|
{
|
||||||
|
groupProfileDb.IsNSFW = dto.IsNsfw.Value;
|
||||||
|
}
|
||||||
|
|
||||||
|
await Clients.Users(groupPairs).Client_GroupSendProfile(groupProfileDb.ToDTO()).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -797,6 +812,8 @@ public partial class LightlessHub
|
|||||||
Description = dto.Description,
|
Description = dto.Description,
|
||||||
Tags = dto.Tags,
|
Tags = dto.Tags,
|
||||||
Base64GroupProfileImage = dto.PictureBase64,
|
Base64GroupProfileImage = dto.PictureBase64,
|
||||||
|
IsNSFW = false,
|
||||||
|
ProfileDisabled = false,
|
||||||
};
|
};
|
||||||
|
|
||||||
await DbContext.GroupProfiles.AddAsync(groupProfile,
|
await DbContext.GroupProfiles.AddAsync(groupProfile,
|
||||||
@@ -990,6 +1007,4 @@ public partial class LightlessHub
|
|||||||
|
|
||||||
return results;
|
return results;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -72,7 +72,7 @@ public partial class LightlessHub
|
|||||||
var existingData = await GetPairInfo(UserUID, otherUser.UID).ConfigureAwait(false);
|
var existingData = await GetPairInfo(UserUID, otherUser.UID).ConfigureAwait(false);
|
||||||
|
|
||||||
var permissions = existingData?.OwnPermissions;
|
var permissions = existingData?.OwnPermissions;
|
||||||
if (permissions == null || !permissions.Sticky)
|
if (permissions == null || !permissions.Sticky)
|
||||||
{
|
{
|
||||||
var ownDefaultPermissions = await DbContext.UserDefaultPreferredPermissions.AsNoTracking().SingleOrDefaultAsync(f => f.UserUID == UserUID, cancellationToken: RequestAbortedToken).ConfigureAwait(false);
|
var ownDefaultPermissions = await DbContext.UserDefaultPreferredPermissions.AsNoTracking().SingleOrDefaultAsync(f => f.UserUID == UserUID, cancellationToken: RequestAbortedToken).ConfigureAwait(false);
|
||||||
|
|
||||||
@@ -523,6 +523,52 @@ public partial class LightlessHub
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private async Task<(BroadcastRedisEntry? Entry, TimeSpan? Expiry)> TryGetBroadcastEntryAsync(string hashedCid)
|
||||||
|
{
|
||||||
|
var key = _broadcastConfiguration.BuildRedisKey(hashedCid);
|
||||||
|
RedisValueWithExpiry value;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
value = await _redis.Database.StringGetWithExpiryAsync(key).ConfigureAwait(false);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
_logger.LogCallWarning(LightlessHubLogger.Args("LightfinderProfileLookupFailed", "CID", hashedCid, "Error", ex));
|
||||||
|
return (null, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (value.Value.IsNullOrEmpty || value.Expiry is null || value.Expiry <= TimeSpan.Zero)
|
||||||
|
{
|
||||||
|
return (null, value.Expiry);
|
||||||
|
}
|
||||||
|
|
||||||
|
BroadcastRedisEntry? entry;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
entry = JsonSerializer.Deserialize<BroadcastRedisEntry>(value.Value!);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
_logger.LogCallWarning(LightlessHubLogger.Args("LightfinderProfileDeserializeFailed", "CID", hashedCid, "Raw", value.Value.ToString(), "Error", ex));
|
||||||
|
return (null, value.Expiry);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (entry is null || !string.Equals(entry.HashedCID, hashedCid, StringComparison.Ordinal))
|
||||||
|
{
|
||||||
|
_logger.LogCallWarning(LightlessHubLogger.Args("LightfinderProfileEntryMismatch", "CID", hashedCid, "EntryCID", entry?.HashedCID ?? "null"));
|
||||||
|
return (null, value.Expiry);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (entry, value.Expiry);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static bool HasActiveBroadcast(BroadcastRedisEntry? entry, TimeSpan? expiry) =>
|
||||||
|
entry?.HasOwner() == true && expiry.HasValue && expiry.Value > TimeSpan.Zero;
|
||||||
|
|
||||||
|
private static bool IsActiveBroadcastForUser(BroadcastRedisEntry? entry, TimeSpan? expiry, string userUid) =>
|
||||||
|
HasActiveBroadcast(entry, expiry) && entry!.OwnedBy(userUid);
|
||||||
|
|
||||||
private static bool IsValidHashedCid(string? cid)
|
private static bool IsValidHashedCid(string? cid)
|
||||||
{
|
{
|
||||||
if (string.IsNullOrWhiteSpace(cid))
|
if (string.IsNullOrWhiteSpace(cid))
|
||||||
@@ -792,6 +838,97 @@ public partial class LightlessHub
|
|||||||
return new UserProfileDto(user.User, false, data.IsNSFW, data.Base64ProfileImage, data.UserDescription);
|
return new UserProfileDto(user.User, false, data.IsNSFW, data.Base64ProfileImage, data.UserDescription);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Authorize(Policy = "Identified")]
|
||||||
|
public async Task<UserProfileDto?> UserGetLightfinderProfile(string hashedCid)
|
||||||
|
{
|
||||||
|
_logger.LogCallInfo(LightlessHubLogger.Args("LightfinderProfile", hashedCid));
|
||||||
|
|
||||||
|
if (!_broadcastConfiguration.EnableBroadcasting)
|
||||||
|
{
|
||||||
|
await Clients.Caller.Client_ReceiveServerMessage(MessageSeverity.Error, "Lightfinder is currently disabled.").ConfigureAwait(false);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!IsValidHashedCid(hashedCid))
|
||||||
|
{
|
||||||
|
_logger.LogCallWarning(LightlessHubLogger.Args("LightfinderProfileInvalidCid", hashedCid));
|
||||||
|
await Clients.Caller.Client_ReceiveServerMessage(MessageSeverity.Warning, "Invalid Lightfinder target.").ConfigureAwait(false);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
var viewerCid = UserCharaIdent;
|
||||||
|
if (!IsValidHashedCid(viewerCid))
|
||||||
|
{
|
||||||
|
await Clients.Caller.Client_ReceiveServerMessage(MessageSeverity.Warning, "You must be using Lightfinder to open player profiles.").ConfigureAwait(false);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
var (viewerEntry, viewerExpiry) = await TryGetBroadcastEntryAsync(viewerCid).ConfigureAwait(false);
|
||||||
|
if (!IsActiveBroadcastForUser(viewerEntry, viewerExpiry, UserUID))
|
||||||
|
{
|
||||||
|
await Clients.Caller.Client_ReceiveServerMessage(MessageSeverity.Warning, "You must be using Lightfinder to open player profiles.").ConfigureAwait(false);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
var (targetEntry, targetExpiry) = await TryGetBroadcastEntryAsync(hashedCid).ConfigureAwait(false);
|
||||||
|
if (!HasActiveBroadcast(targetEntry, targetExpiry))
|
||||||
|
{
|
||||||
|
await Clients.Caller.Client_ReceiveServerMessage(MessageSeverity.Warning, "That player is not currently using Lightfinder.").ConfigureAwait(false);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (string.IsNullOrEmpty(targetEntry!.OwnerUID))
|
||||||
|
{
|
||||||
|
await Clients.Caller.Client_ReceiveServerMessage(MessageSeverity.Warning, "That player is not currently using Lightfinder.").ConfigureAwait(false);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
var targetUser = await DbContext.Users.AsNoTracking()
|
||||||
|
.SingleOrDefaultAsync(u => u.UID == targetEntry.OwnerUID, cancellationToken: RequestAbortedToken)
|
||||||
|
.ConfigureAwait(false);
|
||||||
|
|
||||||
|
if (targetUser == null)
|
||||||
|
{
|
||||||
|
_logger.LogCallWarning(LightlessHubLogger.Args("LightfinderProfileMissingUser", hashedCid, "OwnerUID", targetEntry.OwnerUID));
|
||||||
|
await Clients.Caller.Client_ReceiveServerMessage(MessageSeverity.Warning, "Unable to load the players profile at this time.").ConfigureAwait(false);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
var displayAlias = string.IsNullOrWhiteSpace(targetUser.Alias)
|
||||||
|
? "LightfinderUser"
|
||||||
|
: targetUser.Alias;
|
||||||
|
|
||||||
|
var userData = new UserData(
|
||||||
|
UID: hashedCid,
|
||||||
|
Alias: displayAlias,
|
||||||
|
IsAdmin: false,
|
||||||
|
IsModerator: false,
|
||||||
|
HasVanity: false,
|
||||||
|
TextColorHex: targetUser.TextColorHex,
|
||||||
|
TextGlowColorHex: targetUser.TextGlowColorHex);
|
||||||
|
|
||||||
|
var profile = await DbContext.UserProfileData.AsNoTracking()
|
||||||
|
.SingleOrDefaultAsync(u => u.UserUID == targetEntry.OwnerUID, cancellationToken: RequestAbortedToken)
|
||||||
|
.ConfigureAwait(false);
|
||||||
|
|
||||||
|
if (profile == null)
|
||||||
|
{
|
||||||
|
return new UserProfileDto(userData, false, null, null, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (profile.FlaggedForReport)
|
||||||
|
{
|
||||||
|
return new UserProfileDto(userData, true, null, null, "This profile is flagged for report and pending evaluation");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (profile.ProfileDisabled)
|
||||||
|
{
|
||||||
|
return new UserProfileDto(userData, true, null, null, "This profile was permanently disabled");
|
||||||
|
}
|
||||||
|
|
||||||
|
return new UserProfileDto(userData, false, profile.IsNSFW, profile.Base64ProfileImage, profile.UserDescription);
|
||||||
|
}
|
||||||
|
|
||||||
[Authorize(Policy = "Identified")]
|
[Authorize(Policy = "Identified")]
|
||||||
public async Task UserPushData(UserCharaDataMessageDto dto)
|
public async Task UserPushData(UserCharaDataMessageDto dto)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -7,7 +7,9 @@ using LightlessSyncShared.Services;
|
|||||||
using LightlessSyncShared.Utils.Configuration;
|
using LightlessSyncShared.Utils.Configuration;
|
||||||
using Microsoft.AspNetCore.SignalR;
|
using Microsoft.AspNetCore.SignalR;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
using StackExchange.Redis;
|
||||||
using StackExchange.Redis.Extensions.Core.Abstractions;
|
using StackExchange.Redis.Extensions.Core.Abstractions;
|
||||||
|
using static LightlessSyncServer.Hubs.LightlessHub;
|
||||||
|
|
||||||
namespace LightlessSyncServer.Services;
|
namespace LightlessSyncServer.Services;
|
||||||
|
|
||||||
@@ -52,6 +54,13 @@ public sealed class SystemInfoService : BackgroundService
|
|||||||
_lightlessMetrics.SetGaugeTo(MetricsAPI.GaugeAvailableIOWorkerThreads, ioThreads);
|
_lightlessMetrics.SetGaugeTo(MetricsAPI.GaugeAvailableIOWorkerThreads, ioThreads);
|
||||||
|
|
||||||
var onlineUsers = (_redis.SearchKeysAsync("UID:*").GetAwaiter().GetResult()).Count();
|
var onlineUsers = (_redis.SearchKeysAsync("UID:*").GetAwaiter().GetResult()).Count();
|
||||||
|
|
||||||
|
var allLightfinderKeys = _redis.SearchKeysAsync("broadcast:*").GetAwaiter().GetResult().Where(c => !c.Contains("owner", StringComparison.Ordinal)).ToHashSet(StringComparer.Ordinal);
|
||||||
|
var allLightfinderItems = _redis.GetAllAsync<BroadcastRedisEntry>(allLightfinderKeys).GetAwaiter().GetResult();
|
||||||
|
|
||||||
|
var countLightFinderUsers = allLightfinderItems.Count;
|
||||||
|
var countLightFinderSyncshells = allLightfinderItems.Count(static l => !string.IsNullOrEmpty(l.Value.GID));
|
||||||
|
|
||||||
SystemInfoDto = new SystemInfoDto()
|
SystemInfoDto = new SystemInfoDto()
|
||||||
{
|
{
|
||||||
OnlineUsers = onlineUsers,
|
OnlineUsers = onlineUsers,
|
||||||
@@ -66,10 +75,12 @@ public sealed class SystemInfoService : BackgroundService
|
|||||||
using var db = await _dbContextFactory.CreateDbContextAsync(ct).ConfigureAwait(false);
|
using var db = await _dbContextFactory.CreateDbContextAsync(ct).ConfigureAwait(false);
|
||||||
|
|
||||||
_lightlessMetrics.SetGaugeTo(MetricsAPI.GaugeAuthorizedConnections, onlineUsers);
|
_lightlessMetrics.SetGaugeTo(MetricsAPI.GaugeAuthorizedConnections, onlineUsers);
|
||||||
|
_lightlessMetrics.SetGaugeTo(MetricsAPI.GaugeLightFinderConnections, countLightFinderUsers);
|
||||||
_lightlessMetrics.SetGaugeTo(MetricsAPI.GaugePairs, db.ClientPairs.AsNoTracking().Count());
|
_lightlessMetrics.SetGaugeTo(MetricsAPI.GaugePairs, db.ClientPairs.AsNoTracking().Count());
|
||||||
_lightlessMetrics.SetGaugeTo(MetricsAPI.GaugePairsPaused, db.Permissions.AsNoTracking().Where(p => p.IsPaused).Count());
|
_lightlessMetrics.SetGaugeTo(MetricsAPI.GaugePairsPaused, db.Permissions.AsNoTracking().Count(p => p.IsPaused));
|
||||||
_lightlessMetrics.SetGaugeTo(MetricsAPI.GaugeGroups, db.Groups.AsNoTracking().Count());
|
_lightlessMetrics.SetGaugeTo(MetricsAPI.GaugeGroups, db.Groups.AsNoTracking().Count());
|
||||||
_lightlessMetrics.SetGaugeTo(MetricsAPI.GaugeGroupPairs, db.GroupPairs.AsNoTracking().Count());
|
_lightlessMetrics.SetGaugeTo(MetricsAPI.GaugeGroupPairs, db.GroupPairs.AsNoTracking().Count());
|
||||||
|
_lightlessMetrics.SetGaugeTo(MetricsAPI.GaugeLightFinderGroups, countLightFinderSyncshells);
|
||||||
_lightlessMetrics.SetGaugeTo(MetricsAPI.GaugeUsersRegistered, db.Users.AsNoTracking().Count());
|
_lightlessMetrics.SetGaugeTo(MetricsAPI.GaugeUsersRegistered, db.Users.AsNoTracking().Count());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -295,6 +295,8 @@ public class Startup
|
|||||||
}, new List<string>
|
}, new List<string>
|
||||||
{
|
{
|
||||||
MetricsAPI.GaugeAuthorizedConnections,
|
MetricsAPI.GaugeAuthorizedConnections,
|
||||||
|
MetricsAPI.GaugeLightFinderConnections,
|
||||||
|
MetricsAPI.GaugeLightFinderGroups,
|
||||||
MetricsAPI.GaugeConnections,
|
MetricsAPI.GaugeConnections,
|
||||||
MetricsAPI.GaugePairs,
|
MetricsAPI.GaugePairs,
|
||||||
MetricsAPI.GaugePairsPaused,
|
MetricsAPI.GaugePairsPaused,
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
using LightlessSync.API.Data;
|
using LightlessSync.API.Data;
|
||||||
using LightlessSync.API.Data.Enum;
|
using LightlessSync.API.Data.Enum;
|
||||||
using LightlessSync.API.Data.Extensions;
|
using LightlessSync.API.Data.Extensions;
|
||||||
|
using LightlessSync.API.Dto.Group;
|
||||||
using LightlessSyncShared.Models;
|
using LightlessSyncShared.Models;
|
||||||
using static LightlessSyncServer.Hubs.LightlessHub;
|
using static LightlessSyncServer.Hubs.LightlessHub;
|
||||||
|
|
||||||
@@ -8,6 +9,11 @@ namespace LightlessSyncServer.Utils;
|
|||||||
|
|
||||||
public static class Extensions
|
public static class Extensions
|
||||||
{
|
{
|
||||||
|
public static GroupProfileDto ToDTO(this GroupProfile groupProfile)
|
||||||
|
{
|
||||||
|
return new GroupProfileDto(groupProfile.Group.ToGroupData(), groupProfile.Description, groupProfile.Tags, groupProfile.Base64GroupProfileImage, groupProfile.IsNSFW, groupProfile.ProfileDisabled);
|
||||||
|
}
|
||||||
|
|
||||||
public static GroupData ToGroupData(this Group group)
|
public static GroupData ToGroupData(this Group group)
|
||||||
{
|
{
|
||||||
return new GroupData(group.GID, group.Alias, group.CreatedDate);
|
return new GroupData(group.GID, group.Alias, group.CreatedDate);
|
||||||
|
|||||||
@@ -9,6 +9,8 @@ public class MetricsAPI
|
|||||||
public const string GaugeAvailableIOWorkerThreads = "lightless_available_threadpool_io";
|
public const string GaugeAvailableIOWorkerThreads = "lightless_available_threadpool_io";
|
||||||
public const string GaugeUsersRegistered = "lightless_users_registered";
|
public const string GaugeUsersRegistered = "lightless_users_registered";
|
||||||
public const string CounterUsersRegisteredDeleted = "lightless_users_registered_deleted";
|
public const string CounterUsersRegisteredDeleted = "lightless_users_registered_deleted";
|
||||||
|
public const string GaugeLightFinderConnections = "lightless_lightfinder_connections";
|
||||||
|
public const string GaugeLightFinderGroups = "lightless_lightfinder_groups";
|
||||||
public const string GaugePairs = "lightless_pairs";
|
public const string GaugePairs = "lightless_pairs";
|
||||||
public const string GaugePairsPaused = "lightless_pairs_paused";
|
public const string GaugePairsPaused = "lightless_pairs_paused";
|
||||||
public const string GaugeFilesTotal = "lightless_files";
|
public const string GaugeFilesTotal = "lightless_files";
|
||||||
|
|||||||
1177
LightlessSyncServer/LightlessSyncShared/Migrations/20251015173920_AddGroupDisabledAndNSFW.Designer.cs
generated
Normal file
1177
LightlessSyncServer/LightlessSyncShared/Migrations/20251015173920_AddGroupDisabledAndNSFW.Designer.cs
generated
Normal file
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,40 @@
|
|||||||
|
using Microsoft.EntityFrameworkCore.Migrations;
|
||||||
|
|
||||||
|
#nullable disable
|
||||||
|
|
||||||
|
namespace LightlessSyncServer.Migrations
|
||||||
|
{
|
||||||
|
/// <inheritdoc />
|
||||||
|
public partial class AddGroupDisabledAndNSFW : Migration
|
||||||
|
{
|
||||||
|
/// <inheritdoc />
|
||||||
|
protected override void Up(MigrationBuilder migrationBuilder)
|
||||||
|
{
|
||||||
|
migrationBuilder.AddColumn<bool>(
|
||||||
|
name: "is_nsfw",
|
||||||
|
table: "group_profiles",
|
||||||
|
type: "boolean",
|
||||||
|
nullable: false,
|
||||||
|
defaultValue: false);
|
||||||
|
|
||||||
|
migrationBuilder.AddColumn<bool>(
|
||||||
|
name: "profile_disabled",
|
||||||
|
table: "group_profiles",
|
||||||
|
type: "boolean",
|
||||||
|
nullable: false,
|
||||||
|
defaultValue: false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
protected override void Down(MigrationBuilder migrationBuilder)
|
||||||
|
{
|
||||||
|
migrationBuilder.DropColumn(
|
||||||
|
name: "is_nsfw",
|
||||||
|
table: "group_profiles");
|
||||||
|
|
||||||
|
migrationBuilder.DropColumn(
|
||||||
|
name: "profile_disabled",
|
||||||
|
table: "group_profiles");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -597,6 +597,14 @@ namespace LightlessSyncServer.Migrations
|
|||||||
.HasColumnType("text")
|
.HasColumnType("text")
|
||||||
.HasColumnName("description");
|
.HasColumnName("description");
|
||||||
|
|
||||||
|
b.Property<bool>("IsNSFW")
|
||||||
|
.HasColumnType("boolean")
|
||||||
|
.HasColumnName("is_nsfw");
|
||||||
|
|
||||||
|
b.Property<bool>("ProfileDisabled")
|
||||||
|
.HasColumnType("boolean")
|
||||||
|
.HasColumnName("profile_disabled");
|
||||||
|
|
||||||
b.Property<string>("Tags")
|
b.Property<string>("Tags")
|
||||||
.HasColumnType("text")
|
.HasColumnType("text")
|
||||||
.HasColumnName("tags");
|
.HasColumnName("tags");
|
||||||
|
|||||||
@@ -15,4 +15,6 @@ public class GroupProfile
|
|||||||
public string Description { get; set; }
|
public string Description { get; set; }
|
||||||
public string Tags { get; set; }
|
public string Tags { get; set; }
|
||||||
public string Base64GroupProfileImage { get; set; }
|
public string Base64GroupProfileImage { get; set; }
|
||||||
|
public bool IsNSFW { get; set; } = false;
|
||||||
|
public bool ProfileDisabled { get; set; } = false;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user