Очистка

This commit is contained in:
Халимов Рустам
2026-03-30 11:14:20 +03:00
parent 44d59dab2a
commit 465e84e686
11 changed files with 100 additions and 63 deletions
@@ -7,5 +7,4 @@ public interface IAuthUnitOfWork : IUnitOfWork
{ {
IUserRepository UserRepository { get; } IUserRepository UserRepository { get; }
void Add(UserContract user); void Add(UserContract user);
Task<int> SaveChangesAsync(CancellationToken ct = default);
} }
@@ -24,9 +24,4 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="Carter" Version="10.0.0" /> <PackageReference Include="Carter" Version="10.0.0" />
</ItemGroup> </ItemGroup>
<ItemGroup>
<AssemblyAttribute Include="System.Runtime.CompilerServices.InternalsVisibleToAttribute">
<_Parameter1>Knot.Modules.Admin.UnitTests</_Parameter1>
</AssemblyAttribute>
</ItemGroup>
</Project> </Project>
@@ -1,12 +1,11 @@
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Configuration;
using Microsoft.EntityFrameworkCore;
using Knot.Modules.Auth.Infrastructure.Persistence;
using Knot.Contracts.Auth.Domain;
using Knot.Contracts.Auth.Domain;
using Knot.Contracts.Auth.Application.Abstractions; using Knot.Contracts.Auth.Application.Abstractions;
using Knot.Contracts.Auth.Domain;
using Knot.Modules.Auth.Infrastructure.Authentication; using Knot.Modules.Auth.Infrastructure.Authentication;
using Knot.Modules.Auth.Infrastructure.Persistence;
using Knot.Shared.Kernel; using Knot.Shared.Kernel;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
namespace Knot.Modules.Auth; namespace Knot.Modules.Auth;
+57 -15
View File
@@ -1,36 +1,77 @@
using Knot.Contracts.Auth.Domain;
using Knot.Shared.Kernel; using Knot.Shared.Kernel;
using Knot.Shared.Kernel.Events; using Knot.Shared.Kernel.Events;
using Knot.Contracts.Auth.Domain;
namespace Knot.Modules.Auth.Domain; namespace Knot.Modules.Auth.Domain;
/// <summary> /// <summary>
/// Ñóùíîñòü ïîëüçîâàòåëÿ â êîíòåêñòå èäåíòèôèêàöèè (Identity). /// (Identity).
/// </summary> /// </summary>
public sealed class User : AggregateRoot<Guid> public sealed class User : AggregateRoot<Guid>
{ {
public string Username { get; set; } public string Username { get; private set; }
public string PasswordHash { get; private set; } public string PasswordHash { get; private set; }
public string DisplayName { get; set; } public string DisplayName { get; private set; }
public string? Email { get; private set; } public string? Email { get; private set; }
public string? Bio { get; private set; } public string? Bio { get; private set; }
public string? Avatar { get; set; } public string? Avatar { get; private set; }
public DateTime? Birthday { get; private set; } public DateTime? Birthday { get; private set; }
public DateTime CreatedAt { get; private set; } public DateTime CreatedAt { get; private set; }
public bool HideStoryViews { get; private set; } public bool HideStoryViews { get; private set; }
public bool IsExternal { get; private set; } public bool IsExternal { get; private set; }
public string? Domain { get; private set; } public string? Domain { get; private set; }
public bool IsOnline { get; set; } public bool IsOnline { get; private set; }
public DateTime? LastSeen { get; private set; } public DateTime? LastSeen { get; private set; }
public bool HideStatus { get; private set; } public bool HideStatus { get; private set; }
public bool IsBanned { get; set; } public bool IsBanned { get; private set; }
public string? PhoneNumber { get; set; } public string? PhoneNumber { get; private set; }
public string? RefreshToken { get; set; } public string? RefreshToken { get; private set; }
public DateTime? BannedUntil { get; set; } public DateTime? BannedUntil { get; private set; }
public void Ban() => IsBanned = true; public void Ban() => IsBanned = true;
public void Unban() => IsBanned = false; public void Unban() => IsBanned = false;
public void SetOnline(bool isOnline, DateTime? lastSeen = null)
{
IsOnline = isOnline;
LastSeen = lastSeen ?? DateTime.UtcNow;
}
public void SetPhoneNumber(string? phoneNumber)
{
PhoneNumber = phoneNumber;
}
public void SetRefreshToken(string? refreshToken)
{
RefreshToken = refreshToken;
}
public void SetBannedUntil(DateTime? bannedUntil)
{
BannedUntil = bannedUntil;
}
public void SetAsExternal(string domain)
{
IsExternal = true;
UserDomain = domain;
}
/// <summary>
/// Updates user from contract (used by repository).
/// </summary>
public void UpdateFromContract(UserContract contract)
{
Username = contract.Username;
DisplayName = contract.DisplayName;
PhoneNumber = contract.PhoneNumber;
IsBanned = contract.IsBanned;
BannedUntil = contract.BannedUntil;
SetOnline(contract.IsOnline, contract.LastSeen);
UserDomain = contract.Domain;
}
private User(Guid id, string username, string passwordHash, string displayName, string? email, string? bio = null) private User(Guid id, string username, string passwordHash, string displayName, string? email, string? bio = null)
: base(id) : base(id)
{ {
@@ -44,7 +85,7 @@ public sealed class User : AggregateRoot<Guid>
} }
/// <summary> /// <summary>
/// Ôàáðè÷íûé ìåòîä äëÿ ñîçäàíèÿ íîâîãî ïîëüçîâàòåëÿ. /// .
/// </summary> /// </summary>
public static User Create(string username, string passwordHash, string displayName, string? email = null, string? bio = null) public static User Create(string username, string passwordHash, string displayName, string? email = null, string? bio = null)
{ {
@@ -54,14 +95,14 @@ public sealed class User : AggregateRoot<Guid>
} }
/// <summary> /// <summary>
/// Ñîçäàåò "òåíåâîãî" ïîëüçîâàòåëÿ äëÿ êîíòàêòà ñ äðóãîãî ñåðâåðà. /// "" .
/// </summary> /// </summary>
public static User CreateExternal(Guid id, string username, string displayName, string domain, string? avatar = null) public static User CreateExternal(Guid id, string username, string displayName, string domain, string? avatar = null)
{ {
var user = new User(id, username, "EXTERNAL_USER", displayName, null, null); var user = new User(id, username, "EXTERNAL_USER", displayName, null, null);
user.IsExternal = true; user.SetAsExternal(domain);
user._domain = domain; if (avatar != null)
user.Avatar = avatar; user.UpdateAvatar(avatar);
return user; return user;
} }
@@ -99,6 +140,7 @@ public sealed class User : AggregateRoot<Guid>
IsOnline = isOnline; IsOnline = isOnline;
LastSeen = DateTime.UtcNow; LastSeen = DateTime.UtcNow;
if (!HideStatus) if (!HideStatus)
{ {
RaiseDomainEvent(new UserStatusChangedDomainEvent(Id, IsOnline, LastSeen.Value)); RaiseDomainEvent(new UserStatusChangedDomainEvent(Id, IsOnline, LastSeen.Value));
@@ -1,10 +1,10 @@
using MediatR;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Diagnostics;
using Knot.Contracts.Auth.Application.Abstractions; using Knot.Contracts.Auth.Application.Abstractions;
using Knot.Contracts.Auth.Domain; using Knot.Contracts.Auth.Domain;
using Knot.Shared.Kernel; using Knot.Shared.Kernel;
using Knot.Shared.Kernel.Security; using Knot.Shared.Kernel.Security;
using MediatR;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Diagnostics;
using DomainUser = Knot.Modules.Auth.Domain.User; using DomainUser = Knot.Modules.Auth.Domain.User;
namespace Knot.Modules.Auth.Infrastructure.Persistence; namespace Knot.Modules.Auth.Infrastructure.Persistence;
@@ -76,9 +76,5 @@ public sealed class AuthDbContext : DbContext, IAuthUnitOfWork, IAuthDbContext
return result; return result;
} }
}
async Task<int> IAuthUnitOfWork.SaveChangesAsync(CancellationToken ct)
{
return await SaveChangesAsync(ct);
}
}
@@ -1,6 +1,6 @@
using Microsoft.EntityFrameworkCore;
using Knot.Contracts.Auth.Domain; using Knot.Contracts.Auth.Domain;
using Knot.Modules.Auth.Domain; using Knot.Modules.Auth.Domain;
using Microsoft.EntityFrameworkCore;
namespace Knot.Modules.Auth.Infrastructure.Persistence; namespace Knot.Modules.Auth.Infrastructure.Persistence;
@@ -63,13 +63,7 @@ internal sealed class UserRepository : IUserRepository
var domainUser = await _context.Users.FirstOrDefaultAsync(u => u.Id == user.Id, cancellationToken); var domainUser = await _context.Users.FirstOrDefaultAsync(u => u.Id == user.Id, cancellationToken);
if (domainUser != null) if (domainUser != null)
{ {
domainUser.Username = user.Username; domainUser.UpdateFromContract(user);
domainUser.DisplayName = user.DisplayName;
domainUser.PhoneNumber = user.PhoneNumber;
domainUser.IsBanned = user.IsBanned;
domainUser.BannedUntil = user.BannedUntil;
domainUser.IsOnline = user.IsOnline;
domainUser.UserDomain = user.Domain;
_context.Users.Update(domainUser); _context.Users.Update(domainUser);
} }
} }
@@ -109,13 +103,7 @@ internal sealed class UserRepository : IUserRepository
var domainUser = _context.Users.Find(user.Id); var domainUser = _context.Users.Find(user.Id);
if (domainUser != null) if (domainUser != null)
{ {
domainUser.Username = user.Username; domainUser.UpdateFromContract(user);
domainUser.DisplayName = user.DisplayName;
domainUser.PhoneNumber = user.PhoneNumber;
domainUser.IsBanned = user.IsBanned;
domainUser.BannedUntil = user.BannedUntil;
domainUser.IsOnline = user.IsOnline;
domainUser.UserDomain = user.Domain;
_context.Users.Update(domainUser); _context.Users.Update(domainUser);
} }
} }
@@ -1,6 +1,5 @@
using Knot.Contracts.Auth.Domain;
using Knot.Shared.Kernel; using Knot.Shared.Kernel;
using Knot.Contracts.Auth.Domain;
using Knot.Contracts.Auth.Domain;
namespace Knot.Modules.Auth.Infrastructure.Services; namespace Knot.Modules.Auth.Infrastructure.Services;
@@ -33,7 +33,6 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<InternalsVisibleTo Include="Knot.Modules.Conversations.UnitTests" />
<InternalsVisibleTo Include="DynamicProxyGenAssembly2" /> <InternalsVisibleTo Include="DynamicProxyGenAssembly2" />
</ItemGroup> </ItemGroup>
@@ -22,7 +22,6 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<InternalsVisibleTo Include="Knot.Modules.Profiles.UnitTests" />
<InternalsVisibleTo Include="DynamicProxyGenAssembly2" /> <InternalsVisibleTo Include="DynamicProxyGenAssembly2" />
</ItemGroup> </ItemGroup>
@@ -1,11 +1,34 @@
namespace Knot.Modules.Relations.Domain; namespace Knot.Modules.Relations.Domain;
using System; using System;
public class UserReplica public class UserReplica
{ {
public Guid Id { get; set; } public Guid Id { get; init; }
public string Username { get; set; } public string Username { get; init; } = string.Empty;
public string DisplayName { get; set; } public string DisplayName { get; init; } = string.Empty;
public string Avatar { get; set; } public string Avatar { get; init; } = string.Empty;
public bool IsExternal { get; set; } public bool IsExternal { get; init; }
public string? Domain { get; set; } public string? Domain { get; init; }
private UserReplica() { }
public static UserReplica Create(
Guid id,
string username,
string displayName,
string avatar,
bool isExternal,
string? domain)
{
return new UserReplica
{
Id = id,
Username = username,
DisplayName = displayName,
Avatar = avatar,
IsExternal = isExternal,
Domain = domain
};
}
} }
@@ -1,5 +1,3 @@
using System.Runtime.CompilerServices; using System.Runtime.CompilerServices;
[assembly: InternalsVisibleTo("Knot.Modules.Stories.UnitTests")]
[assembly: InternalsVisibleTo("Knot.IntegrationTests")]
[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")] [assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")]