예제 #1
0
        /// <summary>
        /// Создать диалог с пользователем
        /// </summary>
        /// <param name="userId"></param>
        /// <returns></returns>
        public async Task <BaseApiResponse <int> > CreateOrGetExistingDialogWithUser(string userId)
        {
            if (!IsAuthenticated)
            {
                return(new BaseApiResponse <int>(false, ValidationMessages.YouAreNotAuthorized));
            }

            if (!await Query <EccUser>().AnyAsync(x => x.Id == userId))
            {
                return(new BaseApiResponse <int>(false, "Пользователь не найден по указанному идентификатору"));
            }

            var result = await Query <EccChat>()
                         .Where(x => x.IsDialog)
                         .Where(x => x.UserRelations.Any(t => t.UserId == UserId) && x.UserRelations.Any(t => t.UserId == userId))
                         .Select(x => new
            {
                x.Id,
            }).FirstOrDefaultAsync();

            if (result != null)
            {
                return(new BaseApiResponse <int>(true, "Чат с пользователем уже существует", result.Id));
            }

            var chat = new EccChat
            {
                IsDialog = true
            };

            CreateHandled(chat);

            var resp = await TrySaveChangesAndReturnResultAsync("Чат создан");

            if (!resp.IsSucceeded)
            {
                Logger.LogWarning($"ApplicationChatService.CreateOrGetExistingDialogWithUser.CretingChatError ChatCreatorUserId={UserId} userIdParam={userId}");

                return(new BaseApiResponse <int>(false, $"Произошла ошибка при создании чата. {resp.Message}"));
            }

            var relations = GetRelations(chat.Id, userId);

            CreateHandled(relations);

            var saveRelationsResponse = await TrySaveChangesAndReturnResultAsync("Ok");

            if (!saveRelationsResponse.IsSucceeded)
            {
                return(new BaseApiResponse <int>(false, "Произошла ошибка при создании пользователей к чату, но сам чат был создан"));
            }

            await PublishMessageAsync(new ChatCreatedEvent
            {
                ChatId  = chat.Id,
                UserIds = relations.Select(x => x.UserId).ToList()
            });

            return(new BaseApiResponse <int>(true, "Диалог с пользователем создан", chat.Id));
        }
예제 #2
0
        /// <summary>
        /// Создать системный чат
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public async Task <BaseApiResponse <int> > CreateSystemChat(CreateSystemChat model)
        {
            var validation = ValidateModel(model);

            if (!validation.IsSucceeded)
            {
                return(new BaseApiResponse <int>(validation));
            }

            validation = ValidationUtils.CheckIsNullOrEmpty(model.UserIds);

            if (!validation.IsSucceeded)
            {
                return(new BaseApiResponse <int>(validation));
            }

            var ticks = DateTime.UtcNow.Ticks;

            var chat = new EccChat
            {
                ChatName      = model.ChatName,
                Type          = model.ChatType,
                IsDialog      = false,
                IsArchived    = false,
                IsSystem      = true,
                UserRelations = model.UserIds.Select(x => new EccChatUserRelation
                {
                    IsChatCreator     = false,
                    UserId            = x,
                    LastVisitUtcTicks = ticks
                }).ToList()
            };

            CreateHandled(chat);

            var result = await TrySaveChangesAndReturnResultAsync("Ok");

            if (!result.IsSucceeded)
            {
                return(new BaseApiResponse <int>(result));
            }

            return(new BaseApiResponse <int>(true, "Системный чат создан", chat.Id));
        }