diff --git a/apps/server-net/src/Modules/Chats/Application/Messages/Delete/DeleteMessagesCommand.cs b/apps/server-net/src/Modules/Chats/Application/Messages/Delete/DeleteMessagesCommand.cs index 2de27b4..8cc7df8 100644 --- a/apps/server-net/src/Modules/Chats/Application/Messages/Delete/DeleteMessagesCommand.cs +++ b/apps/server-net/src/Modules/Chats/Application/Messages/Delete/DeleteMessagesCommand.cs @@ -1,8 +1,9 @@ using MediatR; using Microsoft.AspNetCore.SignalR; -using Vortex.Modules.Chats.Domain; -using Vortex.Modules.Chats.Infrastructure.SignalR; -using Vortex.Shared.Kernel; +using global::Vortex.Modules.Chats.Domain; +using global::Vortex.Modules.Chats.Infrastructure.SignalR; +using global::Vortex.Shared.Kernel; +using global::Vortex.Modules.Chats.Application.Abstractions; namespace Vortex.Modules.Chats.Application.Messages.Delete; @@ -10,17 +11,17 @@ public sealed record DeleteMessagesCommand( Guid ChatId, Guid UserId, List MessageIds, - bool DeleteForAll) : global::Vortex.Shared.Kernel.ICommand; + bool DeleteForAll) : ICommand; -public sealed class DeleteMessagesCommandHandler : global::Vortex.Shared.Kernel.ICommandHandler +public sealed class DeleteMessagesCommandHandler : ICommandHandler { private readonly IMessageRepository _messageRepository; - private readonly Vortex.Modules.Chats.Application.Abstractions.IChatsUnitOfWork _unitOfWork; + private readonly IChatsUnitOfWork _unitOfWork; private readonly IHubContext _hubContext; public DeleteMessagesCommandHandler( IMessageRepository messageRepository, - Vortex.Modules.Chats.Application.Abstractions.IChatsUnitOfWork unitOfWork, + IChatsUnitOfWork unitOfWork, IHubContext hubContext) { _messageRepository = messageRepository; diff --git a/apps/server-net/src/Modules/Chats/Domain/Chat.cs b/apps/server-net/src/Modules/Chats/Domain/Chat.cs index 696206d..4934698 100644 --- a/apps/server-net/src/Modules/Chats/Domain/Chat.cs +++ b/apps/server-net/src/Modules/Chats/Domain/Chat.cs @@ -103,6 +103,7 @@ public sealed class ChatMember : Entity public Guid UserId { get; private set; } public string Role { get; private set; } public DateTime JoinedAt { get; private set; } + public bool IsPinned { get; private set; } public bool IsMuted { get; private set; } // For EF Core @@ -115,4 +116,6 @@ public sealed class ChatMember : Entity Role = role; JoinedAt = DateTime.UtcNow; } + + public void TogglePin() => IsPinned = !IsPinned; } diff --git a/apps/server-net/src/Modules/Chats/Infrastructure/Handlers/ChatCreatedDomainEventHandler.cs b/apps/server-net/src/Modules/Chats/Infrastructure/Handlers/ChatCreatedDomainEventHandler.cs index 6fa3fa1..1eeb68d 100644 --- a/apps/server-net/src/Modules/Chats/Infrastructure/Handlers/ChatCreatedDomainEventHandler.cs +++ b/apps/server-net/src/Modules/Chats/Infrastructure/Handlers/ChatCreatedDomainEventHandler.cs @@ -1,8 +1,8 @@ -using MediatR; -using Microsoft.AspNetCore.SignalR; +using Vortex.Shared.Kernel; using Vortex.Modules.Chats.Domain; using Vortex.Modules.Chats.Infrastructure.SignalR; -using Vortex.Shared.Kernel; +using MediatR; +using Microsoft.AspNetCore.SignalR; namespace Vortex.Modules.Chats.Infrastructure.Handlers; diff --git a/apps/server-net/src/Modules/Chats/Infrastructure/Persistence/ChatsDbContext.cs b/apps/server-net/src/Modules/Chats/Infrastructure/Persistence/ChatsDbContext.cs index a62e771..714e785 100644 --- a/apps/server-net/src/Modules/Chats/Infrastructure/Persistence/ChatsDbContext.cs +++ b/apps/server-net/src/Modules/Chats/Infrastructure/Persistence/ChatsDbContext.cs @@ -61,12 +61,12 @@ public sealed class ChatsDbContext : DbContext, IChatsUnitOfWork mb.WithOwner().HasForeignKey(x => x.MessageId); }).Navigation(m => m.Media).UsePropertyAccessMode(PropertyAccessMode.Field); - builder.OwnsMany(m => m.Reactions, mb => - { - mb.ToTable("MessageReactions"); - mb.HasKey(x => x.Id); - mb.HasIndex(x => new { x.MessageId, x.UserId, x.Emoji }).IsUnique(); - }).Navigation(m => m.Reactions).UsePropertyAccessMode(PropertyAccessMode.Field); + builder.HasMany(m => m.Reactions) + .WithOne() + .HasForeignKey(x => x.MessageId) + .OnDelete(DeleteBehavior.Cascade); + + builder.Navigation(m => m.Reactions).UsePropertyAccessMode(PropertyAccessMode.Field); builder.PrimitiveCollection(m => m.DeletedByUsers) .HasColumnName("DeletedByUsers") @@ -80,6 +80,13 @@ public sealed class ChatsDbContext : DbContext, IChatsUnitOfWork builder.Navigation(m => m.ReadBy).UsePropertyAccessMode(PropertyAccessMode.Field); }); + modelBuilder.Entity(builder => + { + builder.ToTable("MessageReactions"); + builder.HasKey(r => r.Id); + builder.HasIndex(r => new { r.MessageId, r.UserId, r.Emoji }).IsUnique(); + }); + modelBuilder.Entity(builder => { builder.ToTable("ReadReceipts"); diff --git a/apps/server-net/src/Modules/Chats/Infrastructure/Persistence/Migrations/20260312204842_SupportPinningAndMuting.Designer.cs b/apps/server-net/src/Modules/Chats/Infrastructure/Persistence/Migrations/20260312204842_SupportPinningAndMuting.Designer.cs new file mode 100644 index 0000000..75fa886 --- /dev/null +++ b/apps/server-net/src/Modules/Chats/Infrastructure/Persistence/Migrations/20260312204842_SupportPinningAndMuting.Designer.cs @@ -0,0 +1,251 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; +using Vortex.Modules.Chats.Infrastructure.Persistence; + +#nullable disable + +namespace Vortex.Modules.Chats.Infrastructure.Persistence.Migrations +{ + [DbContext(typeof(ChatsDbContext))] + [Migration("20260312204842_SupportPinningAndMuting")] + partial class SupportPinningAndMuting + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasDefaultSchema("chats") + .HasAnnotation("ProductVersion", "10.0.4") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("Vortex.Modules.Chats.Domain.Chat", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("Avatar") + .HasColumnType("text"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Name") + .HasColumnType("text"); + + b.Property("Type") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("Chats", "chats"); + }); + + modelBuilder.Entity("Vortex.Modules.Chats.Domain.Message", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ChatId") + .HasColumnType("uuid"); + + b.Property("Content") + .HasColumnType("text"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.PrimitiveCollection("DeletedByUsers") + .IsRequired() + .HasColumnType("uuid[]") + .HasColumnName("DeletedByUsers"); + + b.Property("ForwardedFromId") + .HasColumnType("uuid"); + + b.Property("IsDeleted") + .HasColumnType("boolean"); + + b.Property("IsEdited") + .HasColumnType("boolean"); + + b.Property("Quote") + .HasColumnType("text"); + + b.Property("ReplyToId") + .HasColumnType("uuid"); + + b.Property("SenderId") + .HasColumnType("uuid"); + + b.Property("Type") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("Messages", "chats"); + }); + + modelBuilder.Entity("Vortex.Modules.Chats.Domain.Reaction", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("Emoji") + .IsRequired() + .HasColumnType("text"); + + b.Property("MessageId") + .HasColumnType("uuid"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("MessageId", "UserId", "Emoji") + .IsUnique(); + + b.ToTable("MessageReactions", "chats"); + }); + + modelBuilder.Entity("Vortex.Modules.Chats.Domain.ReadReceipt", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("MessageId") + .HasColumnType("uuid"); + + b.Property("ReadAt") + .HasColumnType("timestamp with time zone"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("MessageId", "UserId") + .IsUnique(); + + b.ToTable("ReadReceipts", "chats"); + }); + + modelBuilder.Entity("Vortex.Modules.Chats.Domain.Chat", b => + { + b.OwnsMany("Vortex.Modules.Chats.Domain.ChatMember", "Members", b1 => + { + b1.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b1.Property("ChatId") + .HasColumnType("uuid"); + + b1.Property("IsMuted") + .HasColumnType("boolean"); + + b1.Property("IsPinned") + .HasColumnType("boolean"); + + b1.Property("JoinedAt") + .HasColumnType("timestamp with time zone"); + + b1.Property("Role") + .IsRequired() + .HasColumnType("text"); + + b1.Property("UserId") + .HasColumnType("uuid"); + + b1.HasKey("Id"); + + b1.HasIndex("ChatId", "UserId") + .IsUnique(); + + b1.ToTable("ChatMembers", "chats"); + + b1.WithOwner() + .HasForeignKey("ChatId"); + }); + + b.Navigation("Members"); + }); + + modelBuilder.Entity("Vortex.Modules.Chats.Domain.Message", b => + { + b.OwnsMany("Vortex.Modules.Chats.Domain.Media", "Media", b1 => + { + b1.Property("MessageId") + .HasColumnType("uuid"); + + b1.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b1.Property("Filename") + .HasColumnType("text"); + + b1.Property("Size") + .HasColumnType("bigint"); + + b1.Property("Type") + .IsRequired() + .HasColumnType("text"); + + b1.Property("Url") + .IsRequired() + .HasColumnType("text"); + + b1.HasKey("MessageId", "Id"); + + b1.ToTable("MessageMedia", "chats"); + + b1.WithOwner() + .HasForeignKey("MessageId"); + }); + + b.Navigation("Media"); + }); + + modelBuilder.Entity("Vortex.Modules.Chats.Domain.Reaction", b => + { + b.HasOne("Vortex.Modules.Chats.Domain.Message", null) + .WithMany("Reactions") + .HasForeignKey("MessageId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Vortex.Modules.Chats.Domain.ReadReceipt", b => + { + b.HasOne("Vortex.Modules.Chats.Domain.Message", null) + .WithMany("ReadBy") + .HasForeignKey("MessageId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Vortex.Modules.Chats.Domain.Message", b => + { + b.Navigation("Reactions"); + + b.Navigation("ReadBy"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/apps/server-net/src/Modules/Chats/Infrastructure/Persistence/Migrations/20260312204842_SupportPinningAndMuting.cs b/apps/server-net/src/Modules/Chats/Infrastructure/Persistence/Migrations/20260312204842_SupportPinningAndMuting.cs new file mode 100644 index 0000000..a022b63 --- /dev/null +++ b/apps/server-net/src/Modules/Chats/Infrastructure/Persistence/Migrations/20260312204842_SupportPinningAndMuting.cs @@ -0,0 +1,64 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Vortex.Modules.Chats.Infrastructure.Persistence.Migrations +{ + /// + public partial class SupportPinningAndMuting : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropPrimaryKey( + name: "PK_MessageMedia", + schema: "chats", + table: "MessageMedia"); + + migrationBuilder.DropIndex( + name: "IX_MessageMedia_MessageId", + schema: "chats", + table: "MessageMedia"); + + migrationBuilder.AddColumn( + name: "IsPinned", + schema: "chats", + table: "ChatMembers", + type: "boolean", + nullable: false, + defaultValue: false); + + migrationBuilder.AddPrimaryKey( + name: "PK_MessageMedia", + schema: "chats", + table: "MessageMedia", + columns: new[] { "MessageId", "Id" }); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropPrimaryKey( + name: "PK_MessageMedia", + schema: "chats", + table: "MessageMedia"); + + migrationBuilder.DropColumn( + name: "IsPinned", + schema: "chats", + table: "ChatMembers"); + + migrationBuilder.AddPrimaryKey( + name: "PK_MessageMedia", + schema: "chats", + table: "MessageMedia", + column: "Id"); + + migrationBuilder.CreateIndex( + name: "IX_MessageMedia_MessageId", + schema: "chats", + table: "MessageMedia", + column: "MessageId"); + } + } +} diff --git a/apps/server-net/src/Modules/Chats/Infrastructure/Persistence/Migrations/ChatsDbContextModelSnapshot.cs b/apps/server-net/src/Modules/Chats/Infrastructure/Persistence/Migrations/ChatsDbContextModelSnapshot.cs index 46ffaa6..78e469f 100644 --- a/apps/server-net/src/Modules/Chats/Infrastructure/Persistence/Migrations/ChatsDbContextModelSnapshot.cs +++ b/apps/server-net/src/Modules/Chats/Infrastructure/Persistence/Migrations/ChatsDbContextModelSnapshot.cs @@ -94,6 +94,30 @@ namespace Vortex.Modules.Chats.Infrastructure.Persistence.Migrations b.ToTable("Messages", "chats"); }); + modelBuilder.Entity("Vortex.Modules.Chats.Domain.Reaction", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("Emoji") + .IsRequired() + .HasColumnType("text"); + + b.Property("MessageId") + .HasColumnType("uuid"); + + b.Property("UserId") + .HasColumnType("uuid"); + + b.HasKey("Id"); + + b.HasIndex("MessageId", "UserId", "Emoji") + .IsUnique(); + + b.ToTable("MessageReactions", "chats"); + }); + modelBuilder.Entity("Vortex.Modules.Chats.Domain.ReadReceipt", b => { b.Property("Id") @@ -131,6 +155,9 @@ namespace Vortex.Modules.Chats.Infrastructure.Persistence.Migrations b1.Property("IsMuted") .HasColumnType("boolean"); + b1.Property("IsPinned") + .HasColumnType("boolean"); + b1.Property("JoinedAt") .HasColumnType("timestamp with time zone"); @@ -159,6 +186,9 @@ namespace Vortex.Modules.Chats.Infrastructure.Persistence.Migrations { b.OwnsMany("Vortex.Modules.Chats.Domain.Media", "Media", b1 => { + b1.Property("MessageId") + .HasColumnType("uuid"); + b1.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("uuid"); @@ -166,9 +196,6 @@ namespace Vortex.Modules.Chats.Infrastructure.Persistence.Migrations b1.Property("Filename") .HasColumnType("text"); - b1.Property("MessageId") - .HasColumnType("uuid"); - b1.Property("Size") .HasColumnType("bigint"); @@ -180,9 +207,7 @@ namespace Vortex.Modules.Chats.Infrastructure.Persistence.Migrations .IsRequired() .HasColumnType("text"); - b1.HasKey("Id"); - - b1.HasIndex("MessageId"); + b1.HasKey("MessageId", "Id"); b1.ToTable("MessageMedia", "chats"); @@ -190,36 +215,16 @@ namespace Vortex.Modules.Chats.Infrastructure.Persistence.Migrations .HasForeignKey("MessageId"); }); - b.OwnsMany("Vortex.Modules.Chats.Domain.Reaction", "Reactions", b1 => - { - b1.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b1.Property("Emoji") - .IsRequired() - .HasColumnType("text"); - - b1.Property("MessageId") - .HasColumnType("uuid"); - - b1.Property("UserId") - .HasColumnType("uuid"); - - b1.HasKey("Id"); - - b1.HasIndex("MessageId", "UserId", "Emoji") - .IsUnique(); - - b1.ToTable("MessageReactions", "chats"); - - b1.WithOwner() - .HasForeignKey("MessageId"); - }); - b.Navigation("Media"); + }); - b.Navigation("Reactions"); + modelBuilder.Entity("Vortex.Modules.Chats.Domain.Reaction", b => + { + b.HasOne("Vortex.Modules.Chats.Domain.Message", null) + .WithMany("Reactions") + .HasForeignKey("MessageId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); }); modelBuilder.Entity("Vortex.Modules.Chats.Domain.ReadReceipt", b => @@ -233,6 +238,8 @@ namespace Vortex.Modules.Chats.Infrastructure.Persistence.Migrations modelBuilder.Entity("Vortex.Modules.Chats.Domain.Message", b => { + b.Navigation("Reactions"); + b.Navigation("ReadBy"); }); #pragma warning restore 612, 618 diff --git a/apps/server-net/src/Modules/Chats/Infrastructure/SignalR/ChatHub.cs b/apps/server-net/src/Modules/Chats/Infrastructure/SignalR/ChatHub.cs index dc740ec..5e0aa3f 100644 --- a/apps/server-net/src/Modules/Chats/Infrastructure/SignalR/ChatHub.cs +++ b/apps/server-net/src/Modules/Chats/Infrastructure/SignalR/ChatHub.cs @@ -186,6 +186,28 @@ public sealed class ChatHub : Hub } } + // ──────────────────────────────────────────────────────────────── + // Friend signals (Proxy methods for real-time notification) + // ──────────────────────────────────────────────────────────────── + + [HubMethodName("friend_request")] + public async Task FriendRequest(FriendSignalRequest request) + { + await SendToUserAsync(request.FriendId, "friend_request_received", new { userId = _userContext.UserId }); + } + + [HubMethodName("friend_accepted")] + public async Task FriendAccepted(FriendSignalRequest request) + { + await SendToUserAsync(request.FriendId, "friend_request_accepted", new { userId = _userContext.UserId }); + } + + [HubMethodName("friend_removed")] + public async Task FriendRemoved(FriendSignalRequest request) + { + await SendToUserAsync(request.FriendId, "friend_removed_notify", new { userId = _userContext.UserId }); + } + // ──────────────────────────────────────────────────────────────── // WebRTC signaling // ──────────────────────────────────────────────────────────────── @@ -470,4 +492,5 @@ public sealed class ChatHub : Hub public record GroupIceCandidateRequest(string ChatId, string TargetUserId, object Candidate); public record GroupRenegotiateRequest(string ChatId, string TargetUserId, object Offer); public record GroupRenegotiateAnswerRequest(string ChatId, string TargetUserId, object Answer); + public record FriendSignalRequest(string FriendId); } diff --git a/apps/server-net/src/Modules/Chats/bin/Debug/net10.0/Vortex.Modules.Chats.dll b/apps/server-net/src/Modules/Chats/bin/Debug/net10.0/Vortex.Modules.Chats.dll index 0411719..4055ad9 100644 Binary files a/apps/server-net/src/Modules/Chats/bin/Debug/net10.0/Vortex.Modules.Chats.dll and b/apps/server-net/src/Modules/Chats/bin/Debug/net10.0/Vortex.Modules.Chats.dll differ diff --git a/apps/server-net/src/Modules/Chats/bin/Debug/net10.0/Vortex.Modules.Chats.pdb b/apps/server-net/src/Modules/Chats/bin/Debug/net10.0/Vortex.Modules.Chats.pdb index 954bc5b..294411c 100644 Binary files a/apps/server-net/src/Modules/Chats/bin/Debug/net10.0/Vortex.Modules.Chats.pdb and b/apps/server-net/src/Modules/Chats/bin/Debug/net10.0/Vortex.Modules.Chats.pdb differ diff --git a/apps/server-net/src/Modules/Chats/bin/Debug/net10.0/Vortex.Shared.Kernel.dll b/apps/server-net/src/Modules/Chats/bin/Debug/net10.0/Vortex.Shared.Kernel.dll index e19c169..c28b7cf 100644 Binary files a/apps/server-net/src/Modules/Chats/bin/Debug/net10.0/Vortex.Shared.Kernel.dll and b/apps/server-net/src/Modules/Chats/bin/Debug/net10.0/Vortex.Shared.Kernel.dll differ diff --git a/apps/server-net/src/Modules/Chats/bin/Debug/net10.0/Vortex.Shared.Kernel.pdb b/apps/server-net/src/Modules/Chats/bin/Debug/net10.0/Vortex.Shared.Kernel.pdb index 2745893..1300c10 100644 Binary files a/apps/server-net/src/Modules/Chats/bin/Debug/net10.0/Vortex.Shared.Kernel.pdb and b/apps/server-net/src/Modules/Chats/bin/Debug/net10.0/Vortex.Shared.Kernel.pdb differ diff --git a/apps/server-net/src/Modules/Chats/obj/Debug/net10.0/Vortex.Modules.Chats.AssemblyInfo.cs b/apps/server-net/src/Modules/Chats/obj/Debug/net10.0/Vortex.Modules.Chats.AssemblyInfo.cs index f4db4e1..affd176 100644 --- a/apps/server-net/src/Modules/Chats/obj/Debug/net10.0/Vortex.Modules.Chats.AssemblyInfo.cs +++ b/apps/server-net/src/Modules/Chats/obj/Debug/net10.0/Vortex.Modules.Chats.AssemblyInfo.cs @@ -13,7 +13,7 @@ using System.Reflection; [assembly: System.Reflection.AssemblyCompanyAttribute("Vortex.Modules.Chats")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] -[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+1ec6b438d29413482e1393c8ee5717f1211bd2c1")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+9daafae9c5956290dda1c718bb49ff72c77fafb8")] [assembly: System.Reflection.AssemblyProductAttribute("Vortex.Modules.Chats")] [assembly: System.Reflection.AssemblyTitleAttribute("Vortex.Modules.Chats")] [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] diff --git a/apps/server-net/src/Modules/Chats/obj/Debug/net10.0/Vortex.Modules.Chats.AssemblyInfoInputs.cache b/apps/server-net/src/Modules/Chats/obj/Debug/net10.0/Vortex.Modules.Chats.AssemblyInfoInputs.cache index 789fe32..31d4057 100644 --- a/apps/server-net/src/Modules/Chats/obj/Debug/net10.0/Vortex.Modules.Chats.AssemblyInfoInputs.cache +++ b/apps/server-net/src/Modules/Chats/obj/Debug/net10.0/Vortex.Modules.Chats.AssemblyInfoInputs.cache @@ -1 +1 @@ -f9ffb401f31277f8b221e98682e16484fff43d34c6ed6bf8ad0e087ed2774d78 +a2ba88a9d7ac278056acbcb427c11fabed9db58aac98411359499b8b1b34811c diff --git a/apps/server-net/src/Modules/Chats/obj/Debug/net10.0/Vortex.Modules.Chats.csproj.AssemblyReference.cache b/apps/server-net/src/Modules/Chats/obj/Debug/net10.0/Vortex.Modules.Chats.csproj.AssemblyReference.cache index 1c5126f..8e7a9b1 100644 Binary files a/apps/server-net/src/Modules/Chats/obj/Debug/net10.0/Vortex.Modules.Chats.csproj.AssemblyReference.cache and b/apps/server-net/src/Modules/Chats/obj/Debug/net10.0/Vortex.Modules.Chats.csproj.AssemblyReference.cache differ diff --git a/apps/server-net/src/Modules/Chats/obj/Debug/net10.0/Vortex.Modules.Chats.dll b/apps/server-net/src/Modules/Chats/obj/Debug/net10.0/Vortex.Modules.Chats.dll index 0411719..4055ad9 100644 Binary files a/apps/server-net/src/Modules/Chats/obj/Debug/net10.0/Vortex.Modules.Chats.dll and b/apps/server-net/src/Modules/Chats/obj/Debug/net10.0/Vortex.Modules.Chats.dll differ diff --git a/apps/server-net/src/Modules/Chats/obj/Debug/net10.0/Vortex.Modules.Chats.pdb b/apps/server-net/src/Modules/Chats/obj/Debug/net10.0/Vortex.Modules.Chats.pdb index 954bc5b..294411c 100644 Binary files a/apps/server-net/src/Modules/Chats/obj/Debug/net10.0/Vortex.Modules.Chats.pdb and b/apps/server-net/src/Modules/Chats/obj/Debug/net10.0/Vortex.Modules.Chats.pdb differ diff --git a/apps/server-net/src/Modules/Chats/obj/Debug/net10.0/ref/Vortex.Modules.Chats.dll b/apps/server-net/src/Modules/Chats/obj/Debug/net10.0/ref/Vortex.Modules.Chats.dll index 2951389..4550cd8 100644 Binary files a/apps/server-net/src/Modules/Chats/obj/Debug/net10.0/ref/Vortex.Modules.Chats.dll and b/apps/server-net/src/Modules/Chats/obj/Debug/net10.0/ref/Vortex.Modules.Chats.dll differ diff --git a/apps/server-net/src/Modules/Chats/obj/Debug/net10.0/refint/Vortex.Modules.Chats.dll b/apps/server-net/src/Modules/Chats/obj/Debug/net10.0/refint/Vortex.Modules.Chats.dll index 2951389..4550cd8 100644 Binary files a/apps/server-net/src/Modules/Chats/obj/Debug/net10.0/refint/Vortex.Modules.Chats.dll and b/apps/server-net/src/Modules/Chats/obj/Debug/net10.0/refint/Vortex.Modules.Chats.dll differ diff --git a/apps/server-net/src/Modules/Identity/bin/Debug/net10.0/Vortex.Modules.Identity.dll b/apps/server-net/src/Modules/Identity/bin/Debug/net10.0/Vortex.Modules.Identity.dll index 1b639e6..5ea84ed 100644 Binary files a/apps/server-net/src/Modules/Identity/bin/Debug/net10.0/Vortex.Modules.Identity.dll and b/apps/server-net/src/Modules/Identity/bin/Debug/net10.0/Vortex.Modules.Identity.dll differ diff --git a/apps/server-net/src/Modules/Identity/bin/Debug/net10.0/Vortex.Modules.Identity.pdb b/apps/server-net/src/Modules/Identity/bin/Debug/net10.0/Vortex.Modules.Identity.pdb index e2d25cc..6f515cb 100644 Binary files a/apps/server-net/src/Modules/Identity/bin/Debug/net10.0/Vortex.Modules.Identity.pdb and b/apps/server-net/src/Modules/Identity/bin/Debug/net10.0/Vortex.Modules.Identity.pdb differ diff --git a/apps/server-net/src/Modules/Identity/bin/Debug/net10.0/Vortex.Shared.Kernel.dll b/apps/server-net/src/Modules/Identity/bin/Debug/net10.0/Vortex.Shared.Kernel.dll index e19c169..c28b7cf 100644 Binary files a/apps/server-net/src/Modules/Identity/bin/Debug/net10.0/Vortex.Shared.Kernel.dll and b/apps/server-net/src/Modules/Identity/bin/Debug/net10.0/Vortex.Shared.Kernel.dll differ diff --git a/apps/server-net/src/Modules/Identity/bin/Debug/net10.0/Vortex.Shared.Kernel.pdb b/apps/server-net/src/Modules/Identity/bin/Debug/net10.0/Vortex.Shared.Kernel.pdb index 2745893..1300c10 100644 Binary files a/apps/server-net/src/Modules/Identity/bin/Debug/net10.0/Vortex.Shared.Kernel.pdb and b/apps/server-net/src/Modules/Identity/bin/Debug/net10.0/Vortex.Shared.Kernel.pdb differ diff --git a/apps/server-net/src/Modules/Identity/obj/Debug/net10.0/Vortex.Modules.Identity.AssemblyInfo.cs b/apps/server-net/src/Modules/Identity/obj/Debug/net10.0/Vortex.Modules.Identity.AssemblyInfo.cs index 725a22e..7acf0eb 100644 --- a/apps/server-net/src/Modules/Identity/obj/Debug/net10.0/Vortex.Modules.Identity.AssemblyInfo.cs +++ b/apps/server-net/src/Modules/Identity/obj/Debug/net10.0/Vortex.Modules.Identity.AssemblyInfo.cs @@ -13,7 +13,7 @@ using System.Reflection; [assembly: System.Reflection.AssemblyCompanyAttribute("Vortex.Modules.Identity")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] -[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+1ec6b438d29413482e1393c8ee5717f1211bd2c1")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+9daafae9c5956290dda1c718bb49ff72c77fafb8")] [assembly: System.Reflection.AssemblyProductAttribute("Vortex.Modules.Identity")] [assembly: System.Reflection.AssemblyTitleAttribute("Vortex.Modules.Identity")] [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] diff --git a/apps/server-net/src/Modules/Identity/obj/Debug/net10.0/Vortex.Modules.Identity.AssemblyInfoInputs.cache b/apps/server-net/src/Modules/Identity/obj/Debug/net10.0/Vortex.Modules.Identity.AssemblyInfoInputs.cache index cce0710..d5049df 100644 --- a/apps/server-net/src/Modules/Identity/obj/Debug/net10.0/Vortex.Modules.Identity.AssemblyInfoInputs.cache +++ b/apps/server-net/src/Modules/Identity/obj/Debug/net10.0/Vortex.Modules.Identity.AssemblyInfoInputs.cache @@ -1 +1 @@ -9d9ffd258fd1015aa25ef1b7c83a7e79e77e5f90a31d4742aa8a559cc7698555 +2a9c951494821db92633ba9e6d674467f449af4a90ac9fed0ea49175b5b7917b diff --git a/apps/server-net/src/Modules/Identity/obj/Debug/net10.0/Vortex.Modules.Identity.csproj.AssemblyReference.cache b/apps/server-net/src/Modules/Identity/obj/Debug/net10.0/Vortex.Modules.Identity.csproj.AssemblyReference.cache index cd194c2..6c91979 100644 Binary files a/apps/server-net/src/Modules/Identity/obj/Debug/net10.0/Vortex.Modules.Identity.csproj.AssemblyReference.cache and b/apps/server-net/src/Modules/Identity/obj/Debug/net10.0/Vortex.Modules.Identity.csproj.AssemblyReference.cache differ diff --git a/apps/server-net/src/Modules/Identity/obj/Debug/net10.0/Vortex.Modules.Identity.dll b/apps/server-net/src/Modules/Identity/obj/Debug/net10.0/Vortex.Modules.Identity.dll index 1b639e6..5ea84ed 100644 Binary files a/apps/server-net/src/Modules/Identity/obj/Debug/net10.0/Vortex.Modules.Identity.dll and b/apps/server-net/src/Modules/Identity/obj/Debug/net10.0/Vortex.Modules.Identity.dll differ diff --git a/apps/server-net/src/Modules/Identity/obj/Debug/net10.0/Vortex.Modules.Identity.pdb b/apps/server-net/src/Modules/Identity/obj/Debug/net10.0/Vortex.Modules.Identity.pdb index e2d25cc..6f515cb 100644 Binary files a/apps/server-net/src/Modules/Identity/obj/Debug/net10.0/Vortex.Modules.Identity.pdb and b/apps/server-net/src/Modules/Identity/obj/Debug/net10.0/Vortex.Modules.Identity.pdb differ diff --git a/apps/server-net/src/Modules/Identity/obj/Debug/net10.0/ref/Vortex.Modules.Identity.dll b/apps/server-net/src/Modules/Identity/obj/Debug/net10.0/ref/Vortex.Modules.Identity.dll index 7b1a181..61119c4 100644 Binary files a/apps/server-net/src/Modules/Identity/obj/Debug/net10.0/ref/Vortex.Modules.Identity.dll and b/apps/server-net/src/Modules/Identity/obj/Debug/net10.0/ref/Vortex.Modules.Identity.dll differ diff --git a/apps/server-net/src/Modules/Identity/obj/Debug/net10.0/refint/Vortex.Modules.Identity.dll b/apps/server-net/src/Modules/Identity/obj/Debug/net10.0/refint/Vortex.Modules.Identity.dll index 7b1a181..61119c4 100644 Binary files a/apps/server-net/src/Modules/Identity/obj/Debug/net10.0/refint/Vortex.Modules.Identity.dll and b/apps/server-net/src/Modules/Identity/obj/Debug/net10.0/refint/Vortex.Modules.Identity.dll differ diff --git a/apps/server-net/src/Shared/Vortex.Shared.Infrastructure/bin/Debug/net10.0/Vortex.Shared.Infrastructure.dll b/apps/server-net/src/Shared/Vortex.Shared.Infrastructure/bin/Debug/net10.0/Vortex.Shared.Infrastructure.dll index 13409c7..b443b93 100644 Binary files a/apps/server-net/src/Shared/Vortex.Shared.Infrastructure/bin/Debug/net10.0/Vortex.Shared.Infrastructure.dll and b/apps/server-net/src/Shared/Vortex.Shared.Infrastructure/bin/Debug/net10.0/Vortex.Shared.Infrastructure.dll differ diff --git a/apps/server-net/src/Shared/Vortex.Shared.Infrastructure/bin/Debug/net10.0/Vortex.Shared.Infrastructure.pdb b/apps/server-net/src/Shared/Vortex.Shared.Infrastructure/bin/Debug/net10.0/Vortex.Shared.Infrastructure.pdb index d249982..321a293 100644 Binary files a/apps/server-net/src/Shared/Vortex.Shared.Infrastructure/bin/Debug/net10.0/Vortex.Shared.Infrastructure.pdb and b/apps/server-net/src/Shared/Vortex.Shared.Infrastructure/bin/Debug/net10.0/Vortex.Shared.Infrastructure.pdb differ diff --git a/apps/server-net/src/Shared/Vortex.Shared.Infrastructure/bin/Debug/net10.0/Vortex.Shared.Kernel.dll b/apps/server-net/src/Shared/Vortex.Shared.Infrastructure/bin/Debug/net10.0/Vortex.Shared.Kernel.dll index e19c169..c28b7cf 100644 Binary files a/apps/server-net/src/Shared/Vortex.Shared.Infrastructure/bin/Debug/net10.0/Vortex.Shared.Kernel.dll and b/apps/server-net/src/Shared/Vortex.Shared.Infrastructure/bin/Debug/net10.0/Vortex.Shared.Kernel.dll differ diff --git a/apps/server-net/src/Shared/Vortex.Shared.Infrastructure/bin/Debug/net10.0/Vortex.Shared.Kernel.pdb b/apps/server-net/src/Shared/Vortex.Shared.Infrastructure/bin/Debug/net10.0/Vortex.Shared.Kernel.pdb index 2745893..1300c10 100644 Binary files a/apps/server-net/src/Shared/Vortex.Shared.Infrastructure/bin/Debug/net10.0/Vortex.Shared.Kernel.pdb and b/apps/server-net/src/Shared/Vortex.Shared.Infrastructure/bin/Debug/net10.0/Vortex.Shared.Kernel.pdb differ diff --git a/apps/server-net/src/Shared/Vortex.Shared.Infrastructure/obj/Debug/net10.0/Vortex.Shared.Infrastructure.AssemblyInfo.cs b/apps/server-net/src/Shared/Vortex.Shared.Infrastructure/obj/Debug/net10.0/Vortex.Shared.Infrastructure.AssemblyInfo.cs index 4ec9a7d..be1451b 100644 --- a/apps/server-net/src/Shared/Vortex.Shared.Infrastructure/obj/Debug/net10.0/Vortex.Shared.Infrastructure.AssemblyInfo.cs +++ b/apps/server-net/src/Shared/Vortex.Shared.Infrastructure/obj/Debug/net10.0/Vortex.Shared.Infrastructure.AssemblyInfo.cs @@ -13,7 +13,7 @@ using System.Reflection; [assembly: System.Reflection.AssemblyCompanyAttribute("Vortex.Shared.Infrastructure")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] -[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+1ec6b438d29413482e1393c8ee5717f1211bd2c1")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+9daafae9c5956290dda1c718bb49ff72c77fafb8")] [assembly: System.Reflection.AssemblyProductAttribute("Vortex.Shared.Infrastructure")] [assembly: System.Reflection.AssemblyTitleAttribute("Vortex.Shared.Infrastructure")] [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] diff --git a/apps/server-net/src/Shared/Vortex.Shared.Infrastructure/obj/Debug/net10.0/Vortex.Shared.Infrastructure.AssemblyInfoInputs.cache b/apps/server-net/src/Shared/Vortex.Shared.Infrastructure/obj/Debug/net10.0/Vortex.Shared.Infrastructure.AssemblyInfoInputs.cache index 8f8e06e..a2e72b7 100644 --- a/apps/server-net/src/Shared/Vortex.Shared.Infrastructure/obj/Debug/net10.0/Vortex.Shared.Infrastructure.AssemblyInfoInputs.cache +++ b/apps/server-net/src/Shared/Vortex.Shared.Infrastructure/obj/Debug/net10.0/Vortex.Shared.Infrastructure.AssemblyInfoInputs.cache @@ -1 +1 @@ -e0bbb37b072e496f3944a8671d38c2aa23b6d62d5e51acb6547971f52a1ef575 +745538ea2e4bf4b47bee0e7c23a71f34c85ffd4593e17f36ed6617330cf934ed diff --git a/apps/server-net/src/Shared/Vortex.Shared.Infrastructure/obj/Debug/net10.0/Vortex.Shared.Infrastructure.csproj.AssemblyReference.cache b/apps/server-net/src/Shared/Vortex.Shared.Infrastructure/obj/Debug/net10.0/Vortex.Shared.Infrastructure.csproj.AssemblyReference.cache index 77eaa83..72ba938 100644 Binary files a/apps/server-net/src/Shared/Vortex.Shared.Infrastructure/obj/Debug/net10.0/Vortex.Shared.Infrastructure.csproj.AssemblyReference.cache and b/apps/server-net/src/Shared/Vortex.Shared.Infrastructure/obj/Debug/net10.0/Vortex.Shared.Infrastructure.csproj.AssemblyReference.cache differ diff --git a/apps/server-net/src/Shared/Vortex.Shared.Infrastructure/obj/Debug/net10.0/Vortex.Shared.Infrastructure.dll b/apps/server-net/src/Shared/Vortex.Shared.Infrastructure/obj/Debug/net10.0/Vortex.Shared.Infrastructure.dll index 13409c7..b443b93 100644 Binary files a/apps/server-net/src/Shared/Vortex.Shared.Infrastructure/obj/Debug/net10.0/Vortex.Shared.Infrastructure.dll and b/apps/server-net/src/Shared/Vortex.Shared.Infrastructure/obj/Debug/net10.0/Vortex.Shared.Infrastructure.dll differ diff --git a/apps/server-net/src/Shared/Vortex.Shared.Infrastructure/obj/Debug/net10.0/Vortex.Shared.Infrastructure.pdb b/apps/server-net/src/Shared/Vortex.Shared.Infrastructure/obj/Debug/net10.0/Vortex.Shared.Infrastructure.pdb index d249982..321a293 100644 Binary files a/apps/server-net/src/Shared/Vortex.Shared.Infrastructure/obj/Debug/net10.0/Vortex.Shared.Infrastructure.pdb and b/apps/server-net/src/Shared/Vortex.Shared.Infrastructure/obj/Debug/net10.0/Vortex.Shared.Infrastructure.pdb differ diff --git a/apps/server-net/src/Shared/Vortex.Shared.Infrastructure/obj/Debug/net10.0/ref/Vortex.Shared.Infrastructure.dll b/apps/server-net/src/Shared/Vortex.Shared.Infrastructure/obj/Debug/net10.0/ref/Vortex.Shared.Infrastructure.dll index 8fec4a2..e4a4b76 100644 Binary files a/apps/server-net/src/Shared/Vortex.Shared.Infrastructure/obj/Debug/net10.0/ref/Vortex.Shared.Infrastructure.dll and b/apps/server-net/src/Shared/Vortex.Shared.Infrastructure/obj/Debug/net10.0/ref/Vortex.Shared.Infrastructure.dll differ diff --git a/apps/server-net/src/Shared/Vortex.Shared.Infrastructure/obj/Debug/net10.0/refint/Vortex.Shared.Infrastructure.dll b/apps/server-net/src/Shared/Vortex.Shared.Infrastructure/obj/Debug/net10.0/refint/Vortex.Shared.Infrastructure.dll index 8fec4a2..e4a4b76 100644 Binary files a/apps/server-net/src/Shared/Vortex.Shared.Infrastructure/obj/Debug/net10.0/refint/Vortex.Shared.Infrastructure.dll and b/apps/server-net/src/Shared/Vortex.Shared.Infrastructure/obj/Debug/net10.0/refint/Vortex.Shared.Infrastructure.dll differ diff --git a/apps/server-net/src/Shared/Vortex.Shared.Kernel/bin/Debug/net10.0/Vortex.Shared.Kernel.dll b/apps/server-net/src/Shared/Vortex.Shared.Kernel/bin/Debug/net10.0/Vortex.Shared.Kernel.dll index e19c169..c28b7cf 100644 Binary files a/apps/server-net/src/Shared/Vortex.Shared.Kernel/bin/Debug/net10.0/Vortex.Shared.Kernel.dll and b/apps/server-net/src/Shared/Vortex.Shared.Kernel/bin/Debug/net10.0/Vortex.Shared.Kernel.dll differ diff --git a/apps/server-net/src/Shared/Vortex.Shared.Kernel/bin/Debug/net10.0/Vortex.Shared.Kernel.pdb b/apps/server-net/src/Shared/Vortex.Shared.Kernel/bin/Debug/net10.0/Vortex.Shared.Kernel.pdb index 2745893..1300c10 100644 Binary files a/apps/server-net/src/Shared/Vortex.Shared.Kernel/bin/Debug/net10.0/Vortex.Shared.Kernel.pdb and b/apps/server-net/src/Shared/Vortex.Shared.Kernel/bin/Debug/net10.0/Vortex.Shared.Kernel.pdb differ diff --git a/apps/server-net/src/Shared/Vortex.Shared.Kernel/obj/Debug/net10.0/Vortex.Shared.Kernel.AssemblyInfo.cs b/apps/server-net/src/Shared/Vortex.Shared.Kernel/obj/Debug/net10.0/Vortex.Shared.Kernel.AssemblyInfo.cs index 4b3a1f6..e1fe63d 100644 --- a/apps/server-net/src/Shared/Vortex.Shared.Kernel/obj/Debug/net10.0/Vortex.Shared.Kernel.AssemblyInfo.cs +++ b/apps/server-net/src/Shared/Vortex.Shared.Kernel/obj/Debug/net10.0/Vortex.Shared.Kernel.AssemblyInfo.cs @@ -13,7 +13,7 @@ using System.Reflection; [assembly: System.Reflection.AssemblyCompanyAttribute("Vortex.Shared.Kernel")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] -[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+1ec6b438d29413482e1393c8ee5717f1211bd2c1")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+9daafae9c5956290dda1c718bb49ff72c77fafb8")] [assembly: System.Reflection.AssemblyProductAttribute("Vortex.Shared.Kernel")] [assembly: System.Reflection.AssemblyTitleAttribute("Vortex.Shared.Kernel")] [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] diff --git a/apps/server-net/src/Shared/Vortex.Shared.Kernel/obj/Debug/net10.0/Vortex.Shared.Kernel.AssemblyInfoInputs.cache b/apps/server-net/src/Shared/Vortex.Shared.Kernel/obj/Debug/net10.0/Vortex.Shared.Kernel.AssemblyInfoInputs.cache index 2a5a20e..2d6c9c9 100644 --- a/apps/server-net/src/Shared/Vortex.Shared.Kernel/obj/Debug/net10.0/Vortex.Shared.Kernel.AssemblyInfoInputs.cache +++ b/apps/server-net/src/Shared/Vortex.Shared.Kernel/obj/Debug/net10.0/Vortex.Shared.Kernel.AssemblyInfoInputs.cache @@ -1 +1 @@ -b12266e8303643e0701f21b3366bc23363791cc5e63972b801eea2f6405398dc +375a1236f22989deedeec81190d9f49c1e30becc8b5382dbeed7e3232f8c1b05 diff --git a/apps/server-net/src/Shared/Vortex.Shared.Kernel/obj/Debug/net10.0/Vortex.Shared.Kernel.dll b/apps/server-net/src/Shared/Vortex.Shared.Kernel/obj/Debug/net10.0/Vortex.Shared.Kernel.dll index e19c169..c28b7cf 100644 Binary files a/apps/server-net/src/Shared/Vortex.Shared.Kernel/obj/Debug/net10.0/Vortex.Shared.Kernel.dll and b/apps/server-net/src/Shared/Vortex.Shared.Kernel/obj/Debug/net10.0/Vortex.Shared.Kernel.dll differ diff --git a/apps/server-net/src/Shared/Vortex.Shared.Kernel/obj/Debug/net10.0/Vortex.Shared.Kernel.pdb b/apps/server-net/src/Shared/Vortex.Shared.Kernel/obj/Debug/net10.0/Vortex.Shared.Kernel.pdb index 2745893..1300c10 100644 Binary files a/apps/server-net/src/Shared/Vortex.Shared.Kernel/obj/Debug/net10.0/Vortex.Shared.Kernel.pdb and b/apps/server-net/src/Shared/Vortex.Shared.Kernel/obj/Debug/net10.0/Vortex.Shared.Kernel.pdb differ diff --git a/apps/server-net/src/Shared/Vortex.Shared.Kernel/obj/Debug/net10.0/ref/Vortex.Shared.Kernel.dll b/apps/server-net/src/Shared/Vortex.Shared.Kernel/obj/Debug/net10.0/ref/Vortex.Shared.Kernel.dll index 63b9d0e..ff6bea5 100644 Binary files a/apps/server-net/src/Shared/Vortex.Shared.Kernel/obj/Debug/net10.0/ref/Vortex.Shared.Kernel.dll and b/apps/server-net/src/Shared/Vortex.Shared.Kernel/obj/Debug/net10.0/ref/Vortex.Shared.Kernel.dll differ diff --git a/apps/server-net/src/Shared/Vortex.Shared.Kernel/obj/Debug/net10.0/refint/Vortex.Shared.Kernel.dll b/apps/server-net/src/Shared/Vortex.Shared.Kernel/obj/Debug/net10.0/refint/Vortex.Shared.Kernel.dll index 63b9d0e..ff6bea5 100644 Binary files a/apps/server-net/src/Shared/Vortex.Shared.Kernel/obj/Debug/net10.0/refint/Vortex.Shared.Kernel.dll and b/apps/server-net/src/Shared/Vortex.Shared.Kernel/obj/Debug/net10.0/refint/Vortex.Shared.Kernel.dll differ diff --git a/apps/server-net/src/Vortex.Host/Controllers/ChatsController.cs b/apps/server-net/src/Vortex.Host/Controllers/ChatsController.cs index 1359dc8..6af74c7 100644 --- a/apps/server-net/src/Vortex.Host/Controllers/ChatsController.cs +++ b/apps/server-net/src/Vortex.Host/Controllers/ChatsController.cs @@ -56,6 +56,7 @@ public sealed class ChatsController : ControllerBase id = m.Id, userId = m.UserId, role = m.Role, + isPinned = m.IsPinned, user = user != null ? new { id = user.Id, username = user.Username, @@ -226,12 +227,19 @@ public sealed class ChatsController : ControllerBase } [HttpPost("{id:guid}/pin")] - public async Task TogglePin(Guid id, [FromServices] IChatRepository chatRepository, CancellationToken ct) + public async Task TogglePin(Guid id, [FromServices] IChatRepository chatRepository, [FromServices] IChatsUnitOfWork uow, CancellationToken ct) { var chat = await chatRepository.GetByIdAsync(id, ct); - if (chat == null || !chat.Members.Any(m => m.UserId == _userContext.UserId)) return NotFound(); - // Pin logic not stored in domain yet — return stub - return Ok(new { isPinned = false }); + if (chat == null) return NotFound(); + + var member = chat.Members.FirstOrDefault(m => m.UserId == _userContext.UserId); + if (member == null) return NotFound(); + + member.TogglePin(); + chatRepository.Update(chat); + await uow.SaveChangesAsync(ct); + + return Ok(new { isPinned = member.IsPinned }); } [HttpPost("{id:guid}/members")] @@ -314,6 +322,7 @@ public sealed class ChatsController : ControllerBase id = m.Id, userId = m.UserId, role = m.Role, + isPinned = m.IsPinned, user = user != null ? new { id = user.Id, username = user.Username, diff --git a/apps/server-net/src/Vortex.Host/Controllers/StoriesController.cs b/apps/server-net/src/Vortex.Host/Controllers/StoriesController.cs index 01a56d9..c18ad03 100644 --- a/apps/server-net/src/Vortex.Host/Controllers/StoriesController.cs +++ b/apps/server-net/src/Vortex.Host/Controllers/StoriesController.cs @@ -118,33 +118,46 @@ public sealed class StoriesController : ControllerBase [HttpPost("{id}/view")] public async Task ViewStory(Guid id, CancellationToken ct) { - var story = await _context.Stories - .Include(s => s.Viewers) - .FirstOrDefaultAsync(s => s.Id == id, ct); - - if (story == null) return NotFound(); - if (story.UserId == _userContext.UserId) return Ok(new { message = "Owner view" }); - - if (!story.Viewers.Any(v => v.UserId == _userContext.UserId)) + try { - story.AddViewer(_userContext.UserId); - await _context.SaveChangesAsync(ct); + var story = await _context.Stories + .Include(s => s.Viewers) + .FirstOrDefaultAsync(s => s.Id == id, ct); - // Notify owner via SignalR - var viewer = await _userRepository.GetByIdAsync(_userContext.UserId, ct); - await _hubContext.Clients.User(story.UserId.ToString()).SendAsync("story_viewed", new + if (story == null) return NotFound(); + if (story.UserId == _userContext.UserId) return Ok(new { message = "Owner view" }); + + if (!story.Viewers.Any(v => v.UserId == _userContext.UserId)) { - storyId = story.Id, - userId = _userContext.UserId, - username = viewer?.Username, - displayName = viewer?.DisplayName, - avatar = viewer?.Avatar, - viewedAt = DateTime.UtcNow, - viewCount = story.Viewers.Count - }, ct); - } + story.AddViewer(_userContext.UserId); + await _context.SaveChangesAsync(ct); - return Ok(new { message = "Story viewed" }); + // Notify owner via SignalR targetedly + var viewer = await _userRepository.GetByIdAsync(_userContext.UserId, ct); + await _hubContext.Clients.User(story.UserId.ToString()).SendAsync("story_viewed", new + { + storyId = story.Id, + userId = _userContext.UserId, + username = viewer?.Username, + displayName = viewer?.DisplayName, + avatar = viewer?.Avatar, + viewedAt = DateTime.UtcNow, + viewCount = story.Viewers.Count, + ownerId = story.UserId + }, ct); + } + + return Ok(new { message = "Story viewed" }); + } + catch (DbUpdateException) + { + // Likely a unique constraint violation (already viewed) + return Ok(new { message = "Story already viewed" }); + } + catch (Exception ex) + { + return StatusCode(500, ex.Message); + } } [HttpGet("{id}/viewers")] diff --git a/apps/server-net/src/Vortex.Host/Program.cs b/apps/server-net/src/Vortex.Host/Program.cs index c6f0771..024d6e6 100644 --- a/apps/server-net/src/Vortex.Host/Program.cs +++ b/apps/server-net/src/Vortex.Host/Program.cs @@ -12,6 +12,10 @@ using System.IdentityModel.Tokens.Jwt; using System.Text.Json; using System.Text.Json.Serialization; using Microsoft.Extensions.FileProviders; +using Microsoft.AspNetCore.SignalR; +using System.Security.Claims; + + JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear(); @@ -83,6 +87,8 @@ builder.Services.AddSignalR() options.PayloadSerializerOptions.Converters.Add(new JsonStringEnumConverter()); }); +builder.Services.AddSingleton(); + // Настройка JWT Аутентификации builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => @@ -163,3 +169,11 @@ app.MapControllers(); app.MapHub("/hubs/chat"); app.Run(); + +public class CustomUserIdProvider : IUserIdProvider +{ + public string? GetUserId(HubConnectionContext connection) + { + return connection.User?.FindFirstValue("sub") ?? connection.User?.FindFirstValue(ClaimTypes.NameIdentifier); + } +} diff --git a/apps/server-net/src/Vortex.Host/bin/Debug/net10.0/Vortex.Host.dll b/apps/server-net/src/Vortex.Host/bin/Debug/net10.0/Vortex.Host.dll index 0bf8774..caba2dc 100644 Binary files a/apps/server-net/src/Vortex.Host/bin/Debug/net10.0/Vortex.Host.dll and b/apps/server-net/src/Vortex.Host/bin/Debug/net10.0/Vortex.Host.dll differ diff --git a/apps/server-net/src/Vortex.Host/bin/Debug/net10.0/Vortex.Host.exe b/apps/server-net/src/Vortex.Host/bin/Debug/net10.0/Vortex.Host.exe index c643153..d19854b 100644 Binary files a/apps/server-net/src/Vortex.Host/bin/Debug/net10.0/Vortex.Host.exe and b/apps/server-net/src/Vortex.Host/bin/Debug/net10.0/Vortex.Host.exe differ diff --git a/apps/server-net/src/Vortex.Host/bin/Debug/net10.0/Vortex.Host.pdb b/apps/server-net/src/Vortex.Host/bin/Debug/net10.0/Vortex.Host.pdb index 9cb31f5..f00d269 100644 Binary files a/apps/server-net/src/Vortex.Host/bin/Debug/net10.0/Vortex.Host.pdb and b/apps/server-net/src/Vortex.Host/bin/Debug/net10.0/Vortex.Host.pdb differ diff --git a/apps/server-net/src/Vortex.Host/bin/Debug/net10.0/Vortex.Modules.Chats.dll b/apps/server-net/src/Vortex.Host/bin/Debug/net10.0/Vortex.Modules.Chats.dll index 0411719..4055ad9 100644 Binary files a/apps/server-net/src/Vortex.Host/bin/Debug/net10.0/Vortex.Modules.Chats.dll and b/apps/server-net/src/Vortex.Host/bin/Debug/net10.0/Vortex.Modules.Chats.dll differ diff --git a/apps/server-net/src/Vortex.Host/bin/Debug/net10.0/Vortex.Modules.Chats.pdb b/apps/server-net/src/Vortex.Host/bin/Debug/net10.0/Vortex.Modules.Chats.pdb index 954bc5b..294411c 100644 Binary files a/apps/server-net/src/Vortex.Host/bin/Debug/net10.0/Vortex.Modules.Chats.pdb and b/apps/server-net/src/Vortex.Host/bin/Debug/net10.0/Vortex.Modules.Chats.pdb differ diff --git a/apps/server-net/src/Vortex.Host/bin/Debug/net10.0/Vortex.Modules.Identity.dll b/apps/server-net/src/Vortex.Host/bin/Debug/net10.0/Vortex.Modules.Identity.dll index 1b639e6..5ea84ed 100644 Binary files a/apps/server-net/src/Vortex.Host/bin/Debug/net10.0/Vortex.Modules.Identity.dll and b/apps/server-net/src/Vortex.Host/bin/Debug/net10.0/Vortex.Modules.Identity.dll differ diff --git a/apps/server-net/src/Vortex.Host/bin/Debug/net10.0/Vortex.Modules.Identity.pdb b/apps/server-net/src/Vortex.Host/bin/Debug/net10.0/Vortex.Modules.Identity.pdb index e2d25cc..6f515cb 100644 Binary files a/apps/server-net/src/Vortex.Host/bin/Debug/net10.0/Vortex.Modules.Identity.pdb and b/apps/server-net/src/Vortex.Host/bin/Debug/net10.0/Vortex.Modules.Identity.pdb differ diff --git a/apps/server-net/src/Vortex.Host/bin/Debug/net10.0/Vortex.Shared.Infrastructure.dll b/apps/server-net/src/Vortex.Host/bin/Debug/net10.0/Vortex.Shared.Infrastructure.dll index 13409c7..b443b93 100644 Binary files a/apps/server-net/src/Vortex.Host/bin/Debug/net10.0/Vortex.Shared.Infrastructure.dll and b/apps/server-net/src/Vortex.Host/bin/Debug/net10.0/Vortex.Shared.Infrastructure.dll differ diff --git a/apps/server-net/src/Vortex.Host/bin/Debug/net10.0/Vortex.Shared.Infrastructure.pdb b/apps/server-net/src/Vortex.Host/bin/Debug/net10.0/Vortex.Shared.Infrastructure.pdb index d249982..321a293 100644 Binary files a/apps/server-net/src/Vortex.Host/bin/Debug/net10.0/Vortex.Shared.Infrastructure.pdb and b/apps/server-net/src/Vortex.Host/bin/Debug/net10.0/Vortex.Shared.Infrastructure.pdb differ diff --git a/apps/server-net/src/Vortex.Host/bin/Debug/net10.0/Vortex.Shared.Kernel.dll b/apps/server-net/src/Vortex.Host/bin/Debug/net10.0/Vortex.Shared.Kernel.dll index e19c169..c28b7cf 100644 Binary files a/apps/server-net/src/Vortex.Host/bin/Debug/net10.0/Vortex.Shared.Kernel.dll and b/apps/server-net/src/Vortex.Host/bin/Debug/net10.0/Vortex.Shared.Kernel.dll differ diff --git a/apps/server-net/src/Vortex.Host/bin/Debug/net10.0/Vortex.Shared.Kernel.pdb b/apps/server-net/src/Vortex.Host/bin/Debug/net10.0/Vortex.Shared.Kernel.pdb index 2745893..1300c10 100644 Binary files a/apps/server-net/src/Vortex.Host/bin/Debug/net10.0/Vortex.Shared.Kernel.pdb and b/apps/server-net/src/Vortex.Host/bin/Debug/net10.0/Vortex.Shared.Kernel.pdb differ diff --git a/apps/server-net/src/Vortex.Host/obj/Debug/net10.0/Vortex.Host.AssemblyInfo.cs b/apps/server-net/src/Vortex.Host/obj/Debug/net10.0/Vortex.Host.AssemblyInfo.cs index 0bea293..7e23a53 100644 --- a/apps/server-net/src/Vortex.Host/obj/Debug/net10.0/Vortex.Host.AssemblyInfo.cs +++ b/apps/server-net/src/Vortex.Host/obj/Debug/net10.0/Vortex.Host.AssemblyInfo.cs @@ -13,7 +13,7 @@ using System.Reflection; [assembly: System.Reflection.AssemblyCompanyAttribute("Vortex.Host")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] -[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+1ec6b438d29413482e1393c8ee5717f1211bd2c1")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+9daafae9c5956290dda1c718bb49ff72c77fafb8")] [assembly: System.Reflection.AssemblyProductAttribute("Vortex.Host")] [assembly: System.Reflection.AssemblyTitleAttribute("Vortex.Host")] [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] diff --git a/apps/server-net/src/Vortex.Host/obj/Debug/net10.0/Vortex.Host.AssemblyInfoInputs.cache b/apps/server-net/src/Vortex.Host/obj/Debug/net10.0/Vortex.Host.AssemblyInfoInputs.cache index 94fe290..8260d49 100644 --- a/apps/server-net/src/Vortex.Host/obj/Debug/net10.0/Vortex.Host.AssemblyInfoInputs.cache +++ b/apps/server-net/src/Vortex.Host/obj/Debug/net10.0/Vortex.Host.AssemblyInfoInputs.cache @@ -1 +1 @@ -c8308646f5647671185661b28c5c3eabe4dd11328d5c7402bbee505991c08d6d +2503d90bfacb43b23a8199c8a1cb6d660f9b8abff8c009ccb8b71721eacb6d50 diff --git a/apps/server-net/src/Vortex.Host/obj/Debug/net10.0/Vortex.Host.csproj.AssemblyReference.cache b/apps/server-net/src/Vortex.Host/obj/Debug/net10.0/Vortex.Host.csproj.AssemblyReference.cache index ce87ccf..cd9082e 100644 Binary files a/apps/server-net/src/Vortex.Host/obj/Debug/net10.0/Vortex.Host.csproj.AssemblyReference.cache and b/apps/server-net/src/Vortex.Host/obj/Debug/net10.0/Vortex.Host.csproj.AssemblyReference.cache differ diff --git a/apps/server-net/src/Vortex.Host/obj/Debug/net10.0/Vortex.Host.dll b/apps/server-net/src/Vortex.Host/obj/Debug/net10.0/Vortex.Host.dll index 0bf8774..caba2dc 100644 Binary files a/apps/server-net/src/Vortex.Host/obj/Debug/net10.0/Vortex.Host.dll and b/apps/server-net/src/Vortex.Host/obj/Debug/net10.0/Vortex.Host.dll differ diff --git a/apps/server-net/src/Vortex.Host/obj/Debug/net10.0/Vortex.Host.pdb b/apps/server-net/src/Vortex.Host/obj/Debug/net10.0/Vortex.Host.pdb index 9cb31f5..f00d269 100644 Binary files a/apps/server-net/src/Vortex.Host/obj/Debug/net10.0/Vortex.Host.pdb and b/apps/server-net/src/Vortex.Host/obj/Debug/net10.0/Vortex.Host.pdb differ diff --git a/apps/server-net/src/Vortex.Host/obj/Debug/net10.0/apphost.exe b/apps/server-net/src/Vortex.Host/obj/Debug/net10.0/apphost.exe index c643153..d19854b 100644 Binary files a/apps/server-net/src/Vortex.Host/obj/Debug/net10.0/apphost.exe and b/apps/server-net/src/Vortex.Host/obj/Debug/net10.0/apphost.exe differ diff --git a/apps/server-net/src/Vortex.Host/obj/Debug/net10.0/ref/Vortex.Host.dll b/apps/server-net/src/Vortex.Host/obj/Debug/net10.0/ref/Vortex.Host.dll index 8f5a32d..f42ffbb 100644 Binary files a/apps/server-net/src/Vortex.Host/obj/Debug/net10.0/ref/Vortex.Host.dll and b/apps/server-net/src/Vortex.Host/obj/Debug/net10.0/ref/Vortex.Host.dll differ diff --git a/apps/server-net/src/Vortex.Host/obj/Debug/net10.0/refint/Vortex.Host.dll b/apps/server-net/src/Vortex.Host/obj/Debug/net10.0/refint/Vortex.Host.dll index 8f5a32d..f42ffbb 100644 Binary files a/apps/server-net/src/Vortex.Host/obj/Debug/net10.0/refint/Vortex.Host.dll and b/apps/server-net/src/Vortex.Host/obj/Debug/net10.0/refint/Vortex.Host.dll differ diff --git a/apps/server-net/src/Vortex.Host/obj/Debug/net10.0/rjsmcshtml.dswa.cache.json b/apps/server-net/src/Vortex.Host/obj/Debug/net10.0/rjsmcshtml.dswa.cache.json index ca23828..4cc3d41 100644 --- a/apps/server-net/src/Vortex.Host/obj/Debug/net10.0/rjsmcshtml.dswa.cache.json +++ b/apps/server-net/src/Vortex.Host/obj/Debug/net10.0/rjsmcshtml.dswa.cache.json @@ -1 +1 @@ -{"GlobalPropertiesHash":"2XkPbXFkjVRjCUBTJbQq8CDd7pjsUOS1j3gPHS73xDA=","FingerprintPatternsHash":"gq3WsqcKBUGTSNle7RKKyXRIwh7M8ccEqOqYvIzoM04=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["uOUIBvk7jdHp7c93RIuECwNykpOmiZnVmQxETsngeR0=","ToV71GGCtcAptkaGqQYXeNtDQnAJEljvYAkAKnIRZ\u002Bs=","2fjU\u002BjCBiHEuKj2uQgoWti0oZXkpAdICFty/O9cJSyc=","aTLUi985DoL1wb7QmuhiHoO7J3hi30WEVAUbYVkXxss=","HLBqD\u002BLr6lExIdmRzMVhSCOgnqBnWCEhelB/vqt5YM0="],"CachedAssets":{},"CachedCopyCandidates":{}} \ No newline at end of file +{"GlobalPropertiesHash":"2XkPbXFkjVRjCUBTJbQq8CDd7pjsUOS1j3gPHS73xDA=","FingerprintPatternsHash":"gq3WsqcKBUGTSNle7RKKyXRIwh7M8ccEqOqYvIzoM04=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["uOUIBvk7jdHp7c93RIuECwNykpOmiZnVmQxETsngeR0=","ToV71GGCtcAptkaGqQYXeNtDQnAJEljvYAkAKnIRZ\u002Bs=","2fjU\u002BjCBiHEuKj2uQgoWti0oZXkpAdICFty/O9cJSyc=","aTLUi985DoL1wb7QmuhiHoO7J3hi30WEVAUbYVkXxss=","6IHvDihzP7nz2jPiGaen/UwCBL1mH\u002BfY\u002BnUJBq/hoXU="],"CachedAssets":{},"CachedCopyCandidates":{}} \ No newline at end of file diff --git a/apps/server-net/src/Vortex.Host/obj/Debug/net10.0/rjsmrazor.dswa.cache.json b/apps/server-net/src/Vortex.Host/obj/Debug/net10.0/rjsmrazor.dswa.cache.json index f902598..63edb94 100644 --- a/apps/server-net/src/Vortex.Host/obj/Debug/net10.0/rjsmrazor.dswa.cache.json +++ b/apps/server-net/src/Vortex.Host/obj/Debug/net10.0/rjsmrazor.dswa.cache.json @@ -1 +1 @@ -{"GlobalPropertiesHash":"2L4HBRt/ChGO9rohi3wtSDqo95X47fme5m8OHgJIZL0=","FingerprintPatternsHash":"gq3WsqcKBUGTSNle7RKKyXRIwh7M8ccEqOqYvIzoM04=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["uOUIBvk7jdHp7c93RIuECwNykpOmiZnVmQxETsngeR0=","ToV71GGCtcAptkaGqQYXeNtDQnAJEljvYAkAKnIRZ\u002Bs=","2fjU\u002BjCBiHEuKj2uQgoWti0oZXkpAdICFty/O9cJSyc=","aTLUi985DoL1wb7QmuhiHoO7J3hi30WEVAUbYVkXxss=","HLBqD\u002BLr6lExIdmRzMVhSCOgnqBnWCEhelB/vqt5YM0="],"CachedAssets":{},"CachedCopyCandidates":{}} \ No newline at end of file +{"GlobalPropertiesHash":"2L4HBRt/ChGO9rohi3wtSDqo95X47fme5m8OHgJIZL0=","FingerprintPatternsHash":"gq3WsqcKBUGTSNle7RKKyXRIwh7M8ccEqOqYvIzoM04=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["uOUIBvk7jdHp7c93RIuECwNykpOmiZnVmQxETsngeR0=","ToV71GGCtcAptkaGqQYXeNtDQnAJEljvYAkAKnIRZ\u002Bs=","2fjU\u002BjCBiHEuKj2uQgoWti0oZXkpAdICFty/O9cJSyc=","aTLUi985DoL1wb7QmuhiHoO7J3hi30WEVAUbYVkXxss=","6IHvDihzP7nz2jPiGaen/UwCBL1mH\u002BfY\u002BnUJBq/hoXU="],"CachedAssets":{},"CachedCopyCandidates":{}} \ No newline at end of file diff --git a/apps/server-net/uploads/avatars/58b6fdc4-1234-4be8-a774-4992c3ee9cd3.jpg b/apps/server-net/uploads/avatars/58b6fdc4-1234-4be8-a774-4992c3ee9cd3.jpg new file mode 100644 index 0000000..6a4b3eb Binary files /dev/null and b/apps/server-net/uploads/avatars/58b6fdc4-1234-4be8-a774-4992c3ee9cd3.jpg differ diff --git a/apps/server-net/uploads/avatars/c974adfb-e090-44aa-8d85-7d6d902220e7.avif b/apps/server-net/uploads/avatars/c974adfb-e090-44aa-8d85-7d6d902220e7.avif new file mode 100644 index 0000000..99fc293 Binary files /dev/null and b/apps/server-net/uploads/avatars/c974adfb-e090-44aa-8d85-7d6d902220e7.avif differ diff --git a/apps/web/src/components/ChatView.tsx b/apps/web/src/components/ChatView.tsx index d2e9324..23540c9 100644 --- a/apps/web/src/components/ChatView.tsx +++ b/apps/web/src/components/ChatView.tsx @@ -327,7 +327,7 @@ export default function ChatView({ onStartCall, onStartGroupCall }: { onStartCal
-
+
{ loadStories(); const interval = setInterval(loadStories, 30000); // refresh every 30s - return () => clearInterval(interval); - }, []); + + const socket = getSocket(); + const onStoryViewed = (data: any) => { + // Refresh stories if I'm the owner or the viewer + if (data.ownerId === user?.id || data.userId === user?.id) { + loadStories(); + } + }; + + socket?.on('story_viewed', onStoryViewed); + + return () => { + clearInterval(interval); + socket?.off('story_viewed', onStoryViewed); + }; + }, [user?.id]); const filteredChats = chats.filter((chat) => { if (!searchQuery) return true; @@ -62,9 +77,17 @@ export default function Sidebar() { m.user.displayName.toLowerCase().includes(q)) ); }).sort((a, b) => { - // Favorites chat always on top + // 1. Favorites chat always on top if (a.type === 'favorites') return -1; if (b.type === 'favorites') return 1; + + // 2. Pinned chats next + const aPinned = a.members.find(m => m.user.id === user?.id)?.isPinned; + const bPinned = b.members.find(m => m.user.id === user?.id)?.isPinned; + if (aPinned && !bPinned) return -1; + if (!aPinned && bPinned) return 1; + + // 3. Last message timestamp (if available) - though currently we don't have it on top level return 0; }); @@ -85,11 +108,11 @@ export default function Sidebar() { > -
-
- +
+
+
-

SelfHost

+

SelfHost Messenger

@@ -512,8 +551,12 @@ export function CreateStoryModal({ onClose, onCreated }: CreateStoryModalProps) ) : ( <> {imagePreview ? ( -
- preview +
+ {imageFile?.type.startsWith('video/') ? ( +
)} + {isSelf && ( + + )} +
{/* Имя */} @@ -497,6 +553,65 @@ export default function UserProfile({ userId, chatId, onClose, isSelf }: UserPro /> )} + + {/* Avatar Cropper Modal */} + + {isCropping && cropImage && ( + +
+
+

{t('changePhoto')}

+ +
+ +
+
+ {cropFile?.type.startsWith('video/') ? ( +
+ + )} + ); } diff --git a/apps/web/src/lib/api.ts b/apps/web/src/lib/api.ts index 451e782..977531c 100644 --- a/apps/web/src/lib/api.ts +++ b/apps/web/src/lib/api.ts @@ -100,6 +100,26 @@ class ApiClient { return response.json() as Promise; } + async cropAvatar(file: File, cropData: { x: number; y: number; width: number; height: number }) { + const formData = new FormData(); + formData.append('avatar', file); + formData.append('cropX', cropData.x.toString()); + formData.append('cropY', cropData.y.toString()); + formData.append('cropWidth', cropData.width.toString()); + formData.append('cropHeight', cropData.height.toString()); + + const response = await fetch(`${API_BASE}/users/avatar/crop`, { + method: 'POST', + headers: { + ...(this.token ? { Authorization: `Bearer ${this.token}` } : {}), + }, + body: formData, + }); + + if (!response.ok) throw new Error('Ошибка кропа аватара'); + return response.json() as Promise; + } + async removeAvatar() { return this.request('/users/avatar', { method: 'DELETE' }); } @@ -229,6 +249,22 @@ class ApiClient { }); } + async uploadVideoToStory(file: File) { + const formData = new FormData(); + formData.append('file', file); + + const response = await fetch(`${API_BASE}/stories/video`, { + method: 'POST', + headers: { + ...(this.token ? { Authorization: `Bearer ${this.token}` } : {}), + }, + body: formData, + }); + + if (!response.ok) throw new Error('Ошибка загрузки видео истории'); + return response.json() as Promise<{ url: string }>; + } + async viewStory(storyId: string) { return this.request<{ message: string }>(`/stories/${storyId}/view`, { method: 'POST' }); } diff --git a/apps/web/src/lib/i18n.ts b/apps/web/src/lib/i18n.ts index c5c10f6..f226c60 100644 --- a/apps/web/src/lib/i18n.ts +++ b/apps/web/src/lib/i18n.ts @@ -126,6 +126,7 @@ const translations = { newStory: 'Новая история', textStory: 'Текст', imageStory: 'Фото', + mediaStory: 'Медиа', typeYourStory: 'Напишите историю...', publishStory: 'Опубликовать', stories: 'Истории', @@ -382,6 +383,7 @@ const translations = { newStory: 'New story', textStory: 'Text', imageStory: 'Photo', + mediaStory: 'Media', typeYourStory: 'Write your story...', publishStory: 'Publish', stories: 'Stories', diff --git a/apps/web/src/pages/AuthPage.tsx b/apps/web/src/pages/AuthPage.tsx index 8f2e782..ddba1a2 100644 --- a/apps/web/src/pages/AuthPage.tsx +++ b/apps/web/src/pages/AuthPage.tsx @@ -65,12 +65,12 @@ export default function AuthPage() { initial={{ rotate: -180, scale: 0 }} animate={{ rotate: 0, scale: 1 }} transition={{ duration: 0.6, type: 'spring', bounce: 0.4 }} - className="w-20 h-20 rounded-2xl bg-accent flex items-center justify-center text-white shadow-lg shadow-accent/30" + className="w-24 h-24 rounded-[2rem] overflow-hidden shadow-2xl shadow-accent/20 border-2 border-white/10" > - + Logo -

SelfHost

-

+

SelfHost Messenger

+

{isLogin ? t('login') : t('register')}