mirror of
https://github.com/Govor-team/Govor.git
synced 2026-09-17 16:22:49 +00:00
4603be9f71
Introduced message read tracking with a dedicated MessageReadingService, SignalR read request/response contracts, and hub notification flow for read receipts. Added configurable message edit constraints through MessageEditingOptions and a shared INowDateTimeProvider so timestamps are consistent across the app. Also fixed recipient validation in message removal and improved push token upsert behavior by matching the correct user/session record.
140 lines
6.2 KiB
C#
140 lines
6.2 KiB
C#
using Govor.API.Common.Mapping;
|
|
using Govor.API.Common.SignalR.Helpers;
|
|
using Govor.API.Hubs.Infrastructure;
|
|
using Govor.Application.Authentication;
|
|
using Govor.Application.Authentication.JWT;
|
|
using Govor.Application.Friends;
|
|
using Govor.Application.Groups;
|
|
using Govor.Application.Infrastructure.AdminsStuff;
|
|
using Govor.Application.Infrastructure.Common;
|
|
using Govor.Application.Infrastructure.Extensions;
|
|
using Govor.Application.Infrastructure.Validators;
|
|
using Govor.Application.Medias;
|
|
using Govor.Application.Messages;
|
|
using Govor.Application.PingHandler;
|
|
using Govor.Application.PrivateUserChats;
|
|
using Govor.Application.Profiles;
|
|
using Govor.Application.PushNotifications;
|
|
using Govor.Application.PushNotifications.Providers;
|
|
using Govor.Application.Storage;
|
|
using Govor.Application.Synching;
|
|
using Govor.Application.Users;
|
|
using Govor.Application.Users.UserOnlineStatus;
|
|
using Govor.Application.Users.UserSessions;
|
|
using Govor.Application.Users.UserSessions.Crypto;
|
|
using Govor.Domain;
|
|
using Microsoft.EntityFrameworkCore;
|
|
|
|
namespace Govor.API.Common.Extensions;
|
|
|
|
public static class ConfigurationProgramExtensions
|
|
{
|
|
public static void AddServices(this IServiceCollection services)
|
|
{
|
|
services.AddSingleton<IPasswordHasher, PasswordHasher>();
|
|
services.AddSingleton<IUsernameValidator, UsernameValidator>();
|
|
services.AddSingleton<IJwtTokenHasher, JwtTokenHasher>();
|
|
services.AddScoped<IJwtService, JwtService>();
|
|
services.AddScoped<IAccountService, AuthService>();
|
|
services.AddScoped<IUsersAdministration, UsersService>();
|
|
services.AddScoped<IInvitesService, InvitesService>();
|
|
services.AddScoped<IInvitationGetter, InvitationGetter>();
|
|
services.AddScoped<IInvitationGenerator, InvitationGenerator>();
|
|
services.AddScoped<ISynchingService, SynchingService>();
|
|
|
|
services.AddScoped<INowDateTimeProvider, NowDateTimeProvider>();
|
|
|
|
// Friends services
|
|
services.AddScoped<IFriendshipService, FriendshipService>();
|
|
services.AddScoped<IFriendRequestCommandService, FriendRequestCommandService>();
|
|
services.AddScoped<IFriendRequestQueryService, FriendRequestQueryService>();
|
|
services.AddScoped<IFriendsBlockService, FriendsBlockService>();
|
|
|
|
services.AddScoped<IStorageService>(sp =>
|
|
{
|
|
var env = sp.GetRequiredService<IWebHostEnvironment>();
|
|
return new LocalStorageService(env.ContentRootPath);
|
|
});
|
|
|
|
services.AddHttpContextAccessor(); // it's very important for CurrentUserService
|
|
services.AddScoped<ICurrentUserService, CurrentUserService>();
|
|
services.AddScoped<ICurrentUserSessionService, CurrentUserSessionService>();
|
|
|
|
services.AddMemoryCache();
|
|
services.AddScoped<IPingHandlerService, PingHandlerService>();
|
|
|
|
services.AddScoped<IUserGroupsGetterService, UserGroupsGetterService>();
|
|
|
|
//services.AddScoped<IMessageCommandService, MessageCommandService>();
|
|
services.AddScoped<IMessageSendingService, MessageSendingService>();
|
|
services.AddScoped<IMessageReadingService, MessageReadingService>();
|
|
services.AddScoped<IMessageEditingService, MessageEditingService>();
|
|
services.AddScoped<IMessageRemovingService, MessageRemovingService>();
|
|
services.AddScoped<IVerifyFriendship, VerifyFriendship>();
|
|
services.AddScoped<IUserPrivateChatsGetterService, UserPrivateChatsGetter>();
|
|
services.AddScoped<IUserPrivateChatsCreator, UserPrivateChatsCreator>();
|
|
services.AddScoped<IMessagesLoader, MessagesLoader>();
|
|
services.AddScoped<IMediaService, MediaService>();
|
|
services.AddScoped<IAccesserToDownloadMedia, AccesserToDownloadMediaService>();
|
|
|
|
// User
|
|
services.AddScoped<IUserNameExistValidator, UserNameExistValidator>();
|
|
|
|
// UserSession
|
|
services.AddScoped<IUserSessionOpener, UserSessionOpener>();
|
|
services.AddScoped<IUserSessionRefresher, UserSessionRefresher>();
|
|
|
|
services.AddScoped<IUserNotificationScopeService, UserNotificationScopeService>();
|
|
services.AddScoped<IUserPresenceReader, UserPresenceReader>();
|
|
services.AddSingleton<IOnlineUserStore, OnlineUserStore>();
|
|
|
|
// Hubs Infrastructure
|
|
services.AddScoped<IPrivateChatGroupManager, PrivateChatGroupManager>();
|
|
services.AddScoped<IChatNotificationService, ChatNotificationService>();
|
|
services.AddScoped<IConnectionManager, ConnectionManager>();
|
|
|
|
services.AddSingleton<IConnectionStore, ConnectionStore>();
|
|
|
|
// Pushs
|
|
services.AddScoped<IPushTokenService, PushTokenService>();
|
|
services.AddScoped<IPushNotificationService, PushNotificationService>();
|
|
services.AddSingleton<IPushNotificationProvider, FirebasePushProvider>();
|
|
|
|
|
|
// Auto Mapper
|
|
services.AddAutoMapper(op => { }, typeof(MappingProfile));
|
|
|
|
services.AddScoped<IHubUserAccessor, HubUserAccessor>();
|
|
|
|
services.AddScoped<IUserSessionReader, UserSessionReader>();
|
|
services.AddScoped<IUserSessionRevoker, UserSessionRevoker>();
|
|
|
|
services.AddScoped<ISessionKeyAttacher, SessionKeyAttacher>();
|
|
services.AddScoped<ISessionKeysReader, SessionKeysReader>();
|
|
services.AddScoped<IOneTimePreKeysRotator, OneTimePreKeysRotator>();
|
|
|
|
services.AddScoped<IProfileService, ProfileService>();
|
|
}
|
|
|
|
public static void AddGovorDbContext(this IServiceCollection services, IConfiguration configuration)
|
|
{
|
|
services.AddDbContext<GovorDbContext>(options =>
|
|
{
|
|
options.UseNpgsql(
|
|
configuration.GetConnectionString(nameof(GovorDbContext)),
|
|
npgsqlOptions =>
|
|
{
|
|
// retry for transient failures
|
|
npgsqlOptions.EnableRetryOnFailure(
|
|
5,
|
|
TimeSpan.FromSeconds(5),
|
|
null);
|
|
});
|
|
|
|
//options.UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking);
|
|
|
|
options.EnableSensitiveDataLogging();
|
|
options.EnableDetailedErrors();
|
|
});
|
|
}
|
|
} |