Пример #1
0
        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"));
        }