public async Task <IActionResult> UpdateCookie(Guid cookieId, UpdateCookieDto cookieDto) { var emailClaim = User.Claims.Where(t => t.Type == ClaimsIdentity.DefaultNameClaimType).Single(); var user = await _userRepo.GetAsync(emailClaim.Value); if (user == null) { return(BadRequest("Пользователь не найден")); } var cookie = await _cookieRepo.GetByCookieIdAsync(cookieId); if (cookie == null) { return(NotFound()); } if (cookie.Value == cookieDto.Value && cookie.ExpirationDate == cookieDto.ExpirationDate) { return(BadRequest(new { cookieId = cookieId, value = cookieDto.Value, expirationDate = cookieDto.ExpirationDate, errorMessage = "Дублируемое значение" })); } cookie.Value = cookieDto.Value; cookie.ExpirationDate = cookieDto.ExpirationDate; _cookieRepo.UpdateCookie(cookie); await _cookieRepo.SaveChangesAsync(); var template = await _cookieTemplateRepo.GetByTemplateAsync(cookie.CookieTemplateId); var resource = await _resourceRepo.GetAsync(template.ResourceId); var channels = await _clientRepo.GetChannelsAsync(cookie.ClientId); var userIds = channels.Select(t => t.UserId); var users = await _userRepo.GetByUserIdsAsync(userIds); var emails = users.Where(t => t.Email != user.Email).Select(t => t.Email); //var connection = _connectionMapping.GetConnections(user.Email); // получаем список всех пользователей текущего client и кроме текущего пользователя var connectionIds = _connectionMapping.GetConnectionsByKeys(emails); // TODO: а вот и ошибка - отправить всем кроме себя, а нужно отправить только своей подгруппе await _cookieHub.Clients.Clients(connectionIds.ToList()).SendAsync("NewCookie", new { id = cookie.Id, value = cookie.Value, //expirationDate = cookie.ExpirationDate, name = template.Name, url = resource.Url }); return(Ok("Куки обновлены")); }
public async Task <IActionResult> NewCookies(NewCookie newCookie) { var step = 1; try { var client = await _clientRepo.GetByClientAsync(newCookie.ClientId); if (client == null) { return(BadRequest($"Client not found by {nameof(newCookie.ClientId)}: {newCookie.ClientId}")); } step = 2; // TODO: Новые куки ложим в кэш под clientId //var json = JsonConvert.SerializeObject(newCookie); var dic = _cacheService.Get <Dictionary <string, NewCookie> >(newCookie.ClientId.ToString()); if (dic == null) { step = 3; dic = new Dictionary <string, NewCookie>(); dic.Add(newCookie.Name, newCookie); _cacheService.Set(newCookie.ClientId.ToString(), dic); } else { step = 4; if (dic.ContainsKey(newCookie.Name)) { dic[newCookie.Name] = newCookie; } else { dic.Add(newCookie.Name, newCookie); } _cacheService.Set(newCookie.ClientId.ToString(), dic); } //_cacheService.Set<NewCookie>(newCookie.ClientId.ToString(), newCookie); step = 5; var emailClaim = User.Claims.Where(t => t.Type == ClaimsIdentity.DefaultNameClaimType).Single(); var user = await _userRepo.GetAsync(emailClaim.Value); step = 6; // TODO: Раздаем всем куки кто подключен по сокету var channels = await _clientRepo.GetChannelsAsync(newCookie.ClientId); var userIds = channels.Select(t => t.UserId); var users = await _userRepo.GetByUserIdsAsync(userIds); step = 7; var emails = users.Where(t => t.Email != user.Email).Select(t => t.Email); //var connection = _connectionMapping.GetConnections(user.Email); // получаем список всех пользователей текущего client и кроме текущего пользователя var connectionIds = _connectionMapping.GetConnectionsByKeys(emails); step = 8; // TODO: а вот и ошибка - отправить всем кроме себя, а нужно отправить только своей подгруппе await _cookieHub.Clients.Clients(connectionIds.ToList()).SendAsync("NewCookie", new { clientId = newCookie.ClientId, domain = newCookie.Domain, expirationDate = newCookie.ExpirationDate, httpOnly = newCookie.HttpOnly, name = newCookie.Name, path = newCookie.Path, value = newCookie.Value, url = newCookie.Url }); } catch (Exception e) { return(BadRequest($"step: {step} | {e.Message}")); } return(Ok("OK")); }