Merge pull request 'Fixed some issues with profiles on groups' (#15) from fix-profiles-syncshell into master

Reviewed-on: #15
Reviewed-by: defnotken <defnotken@noreply.git.lightless-sync.org>
This commit was merged in pull request #15.
This commit is contained in:
2025-10-17 00:09:46 +02:00
9 changed files with 1270 additions and 22 deletions

2
.gitmodules vendored
View File

@@ -1,4 +1,4 @@
[submodule "LightlessAPI"]
path = LightlessAPI
url = https://git.lightless-sync.org/Lightless-Sync/LightlessAPI
branch = main
branch = main

View File

@@ -209,7 +209,7 @@ public partial class LightlessHub
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);
return (true, isOwnerResult.ReferredGroup);
@@ -217,7 +217,7 @@ public partial class LightlessHub
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);
return (string.Equals(group.OwnerUID, UserUID, StringComparison.Ordinal), group);

View File

@@ -746,23 +746,14 @@ public partial class LightlessHub
var cancellationToken = RequestAbortedToken;
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);
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)
{
profileDto = profileDto with
{
Description = data.Description,
Tags = data.Tags,
PictureBase64 = data.Base64GroupProfileImage,
};
await Clients.User(UserUID)
.Client_GroupSendProfile(profileDto)
.ConfigureAwait(false);
profileDto = data.ToDTO();
}
return profileDto;
@@ -779,15 +770,39 @@ public partial class LightlessHub
if (!hasRights) return;
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)
.ConfigureAwait(false);
if (groupProfileDb != null)
{
groupProfileDb.Description = dto.Description;
groupProfileDb.Tags = dto.Tags;
groupProfileDb.Base64GroupProfileImage = dto.PictureBase64;
var groupPairs = DbContext.GroupPairs.Where(p => p.GroupGID == groupProfileDb.GroupGID).Select(p => p.GroupUserUID).ToList();
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
{
@@ -797,6 +812,8 @@ public partial class LightlessHub
Description = dto.Description,
Tags = dto.Tags,
Base64GroupProfileImage = dto.PictureBase64,
IsNSFW = false,
ProfileDisabled = false,
};
await DbContext.GroupProfiles.AddAsync(groupProfile,
@@ -990,6 +1007,4 @@ public partial class LightlessHub
return results;
}
}

View File

@@ -1,6 +1,7 @@
using LightlessSync.API.Data;
using LightlessSync.API.Data.Enum;
using LightlessSync.API.Data.Extensions;
using LightlessSync.API.Dto.Group;
using LightlessSyncShared.Models;
using static LightlessSyncServer.Hubs.LightlessHub;
@@ -8,6 +9,11 @@ namespace LightlessSyncServer.Utils;
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)
{
return new GroupData(group.GID, group.Alias, group.CreatedDate);

View File

@@ -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");
}
}
}

View File

@@ -597,6 +597,14 @@ namespace LightlessSyncServer.Migrations
.HasColumnType("text")
.HasColumnName("description");
b.Property<bool>("IsNSFW")
.HasColumnType("boolean")
.HasColumnName("is_nsfw");
b.Property<bool>("ProfileDisabled")
.HasColumnType("boolean")
.HasColumnName("profile_disabled");
b.Property<string>("Tags")
.HasColumnType("text")
.HasColumnName("tags");

View File

@@ -15,4 +15,6 @@ public class GroupProfile
public string Description { get; set; }
public string Tags { get; set; }
public string Base64GroupProfileImage { get; set; }
public bool IsNSFW { get; set; } = false;
public bool ProfileDisabled { get; set; } = false;
}