using StackExchange.Redis; namespace nsszcontactbot; public class FavoriteContactsManager { private readonly IDatabase _redisDb; public FavoriteContactsManager(ConnectionMultiplexer redis) { _redisDb = redis.GetDatabase(); } private static string GetUserKey(long userId) => $"user:favorites:{userId}"; private static string GetContactKey(string contactId) => $"contact:favorites:{contactId}"; /// /// Добавить контакт в избранное. /// public async Task AddFavoriteAsync(long userId, string contactId) { string userKey = GetUserKey(userId); string contactKey = GetContactKey(contactId); await Task.WhenAll( _redisDb.SetAddAsync(userKey, contactId), _redisDb.SetAddAsync(contactKey, userId.ToString()) ); } /// /// Удалить контакт из избранного. /// public async Task RemoveFavoriteAsync(long userId, string contactId) { string userKey = GetUserKey(userId); string contactKey = GetContactKey(contactId); await Task.WhenAll( _redisDb.SetRemoveAsync(userKey, contactId), _redisDb.SetRemoveAsync(contactKey, userId.ToString()) ); } /// /// Проверить, является ли контакт избранным. /// public async Task IsFavoriteAsync(long userId, string contactId) { string key = GetUserKey(userId); return await _redisDb.SetContainsAsync(key, contactId); } /// /// Получить список всех избранных контактов пользователя. /// public async Task> GetAllFavoritesAsync(long userId) { string key = GetUserKey(userId); var members = await _redisDb.SetMembersAsync(key); return [.. members.Select(m => m.ToString())]; } public async Task> GetUsersWithFavoriteAsync(string contactId) { string contactKey = GetContactKey(contactId); var members = await _redisDb.SetMembersAsync(contactKey); return [.. members.Select(m => long.Parse(m.ToString()))]; } }