Beispiel #1
0
        public async Task <SupportMessageListModel> Send(SendSupportMessageModel model, int userId, Language language, string deviceId)
        {
            //User caller = null;
            Guest guest  = null;
            var   caller = await _repository.FilterAsNoTracking <User>(u => u.Id == userId).FirstOrDefaultAsync();

            if (caller == null)
            {
                guest = await _repository.FilterAsNoTracking <Guest>(g => g.DeviceId == deviceId).FirstOrDefaultAsync();

                if (guest == null)
                {
                    throw new Exception(_optionsBinder.Error().UserNotFound);
                }
            }

            var conversation = await _repository.Filter <SupportConversation>(x => x.Id == model.ConversationId)
                               .FirstOrDefaultAsync();

            if (conversation == null)
            {
                throw new Exception("connversation not found");
            }
            var  body            = model.MessageText;
            var  messageBodyType = model.SupportMessageBodyType;
            long length          = 0;

            if (model.File != null)
            {
                messageBodyType = SupportMessageBodyType.Image;
                body            = await _accessor.Upload(model.File, UploadType.SupportConversationFiles, conversation.Id);

                var extension = Path.GetExtension(body);
                if (extension != ".jpg" && extension != ".jpeg" && extension != ".png")
                {
                    messageBodyType = SupportMessageBodyType.Photo;
                }
                length = await _accessor.GetLength(body, UploadType.SupportConversationFiles, conversation.Id);
            }
            int?replayValue    = null;
            var supportMessage = new SupportMessage
            {
                SupportConversationId  = conversation.Id,
                SupportMessageBodyType = messageBodyType,
                MessageText            = body,
                FileLength             = length,
                ReplayMessageId        = model.ReplayMessageId.HasValue ? model.ReplayMessageId.Value : replayValue
            };

            if (caller != null)
            {
                supportMessage.UserSenderId  = caller.Id;
                supportMessage.GuestSenderId = null;
            }
            else
            {
                supportMessage.GuestSenderId = guest.Id;
                supportMessage.UserSenderId  = null;
            }
            _repository.Create(supportMessage);
            await _repository.SaveChangesAsync();

            int receiverId;

            if (caller != null)
            {
                receiverId = conversation.AdminId == caller.Id
                    ? conversation.GuestId ?? conversation.UserId ?? 0
                    : conversation.AdminId;
            }
            else
            {
                receiverId = conversation.AdminId;
            }
            var isGuest  = conversation.GuestId != null;
            var callerId = caller?.Id ?? guest.Id;
            AnnouncementListViewModel announcement = null;

            if (messageBodyType == SupportMessageBodyType.Announcement)
            {
                int.TryParse(model.MessageText, out var id);
                announcement = await _repository.Filter <Announcement>(x => !x.IsDraft && x.Id == id).Select(x =>
                                                                                                             new AnnouncementListViewModel
                {
                    Id            = x.Id,
                    BathroomCount = x.BathroomCount,
                    AnnouncementResidentialType = x.AnnouncementResidentialType,
                    AnnouncementRentType        = x.AnnouncementRentType,
                    IsFavourite            = false,
                    Address                = x.AddressEn.Trim(),
                    AnnouncementEstateType = x.AnnouncementEstateType,
                    AnnouncementType       = x.AnnouncementType,
                    Area         = Convert.ToInt64(x.Area),
                    BedroomCount = x.BedroomCount,
                    Price        = Convert.ToInt64(x.Price),
                    Title        = x.Title,
                    CreateDate   = x.CreatedDt,
                    Photo        = new ImageOptimizer
                    {
                        Photo = Utilities.ReturnFilePath(ConstValues.MediaBaseUrl, ConstValues.MediaResize,
                                                         UploadType.AnnouncementBasePhoto, x.BasePhoto, 300, 300, false, 0),
                        PhotoBlur = Utilities.ReturnFilePath(ConstValues.MediaBaseUrl, ConstValues.MediaResize,
                                                             UploadType.AnnouncementBasePhoto, x.BasePhoto, 100, 100, true, 0)
                    }
                }).FirstOrDefaultAsync();
            }
            var notify = (new SupportMessageListModel
            {
                ConversationId = conversation.Id,
                MessageId = supportMessage.Id,
                MessageText = supportMessage.SupportMessageBodyType == SupportMessageBodyType.Image ?
                              Utilities.ReturnFilePath(ConstValues.MediaBaseUrl, ConstValues.MediaResize,
                                                       UploadType.SupportConversationFiles, supportMessage.MessageText, 1000, 1000, false, conversation.Id) : supportMessage.MessageText,
                MessageBodyType = messageBodyType,
                SenderId = caller?.Id ?? guest.Id,
                FullName = caller != null ? supportMessage.UserSender.FullName : guest.Id.ToString(),
                Photo = caller != null ? new ImageOptimizer
                {
                    Photo = Utilities.ReturnFilePath(ConstValues.MediaBaseUrl, ConstValues.MediaResize,
                                                     UploadType.ProfilePhoto, supportMessage.UserSender.ProfilePhoto, ConstValues.Width, ConstValues.Height, false, 0),
                    PhotoBlur = Utilities.ReturnFilePath(ConstValues.MediaBaseUrl, ConstValues.MediaResize,
                                                         UploadType.ProfilePhoto, supportMessage.UserSender.ProfilePhoto, 100, 100, true, 0)
                } : new ImageOptimizer(),
                CreatedDate = supportMessage.CreatedDt,
                IsSentFromMe = false,
                Announcement = announcement,
                FileSize = length,
                FileUrl = messageBodyType == SupportMessageBodyType.Photo
                    ? Utilities.ReturnFilePath(ConstValues.MediaBaseUrl, ConstValues.MediaDownload,
                                               UploadType.SupportConversationFiles, supportMessage.MessageText, false, conversation.Id) : null,
                ReplayMessage = supportMessage.ReplayMessageId != null ? await _repository.Filter <SupportMessage>(s => s.Id == supportMessage.ReplayMessageId)
                                .Select(s => new SupportMessageListModel
                {
                    MessageBodyType = s.SupportMessageBodyType,
                    MessageId = s.Id,
                    MessageText = s.SupportMessageBodyType == SupportMessageBodyType.Image ?
                                  Utilities.ReturnFilePath(ConstValues.MediaBaseUrl, ConstValues.MediaResize,
                                                           UploadType.SupportConversationFiles, s.MessageText, 1000, 1000, false, conversation.Id) : s.MessageText,
                    CreatedDate = s.CreatedDt,
                    IsSentFromMe = (s.UserSenderId ?? s.GuestSenderId ?? 0) == callerId,
                    Photo = s.UserSender != null ? new ImageOptimizer
                    {
                        Photo = Utilities.ReturnFilePath(ConstValues.MediaBaseUrl, ConstValues.MediaResize,
                                                         UploadType.ProfilePhoto, s.UserSender.ProfilePhoto, ConstValues.Width, ConstValues.Height, false, 0),
                        PhotoBlur = Utilities.ReturnFilePath(ConstValues.MediaBaseUrl, ConstValues.MediaResize,
                                                             UploadType.ProfilePhoto, s.UserSender.ProfilePhoto, 100, 100, true, 0)
                    } : new ImageOptimizer(),
                    SenderId = s.UserSenderId ?? s.GuestSenderId.GetValueOrDefault(),
                    FullName = s.UserSenderId != null ? s.UserSender.FullName : "User",
                    FileUrl = s.SupportMessageBodyType == SupportMessageBodyType.Photo ?
                              Utilities.ReturnFilePath(ConstValues.MediaBaseUrl, ConstValues.MediaDownload,
                                                       UploadType.SupportConversationFiles, s.MessageText, false, conversation.Id) : null,
                    FileSize = s.FileLength
                }).FirstOrDefaultAsync() : null
            });

            if (notify.ReplayMessage != null && notify.ReplayMessage.MessageBodyType == SupportMessageBodyType.Announcement)
            {
                int.TryParse(notify.ReplayMessage.MessageText, out var replayMessage);
                notify.ReplayMessage.Announcement = _repository.Filter <Announcement>(x => !x.IsDraft && x.Id == replayMessage)
                                                    .Select(x => new AnnouncementListViewModel
                {
                    Id            = x.Id,
                    BathroomCount = x.BathroomCount,
                    AnnouncementResidentialType = x.AnnouncementResidentialType,
                    AnnouncementRentType        = x.AnnouncementRentType,
                    IsFavourite            = false,
                    Address                = x.AddressEn.Trim(),
                    AnnouncementEstateType = x.AnnouncementEstateType,
                    AnnouncementType       = x.AnnouncementType,
                    Area         = Convert.ToInt64(x.Area),
                    BedroomCount = x.BedroomCount,
                    Price        = Convert.ToInt64(x.Price),
                    Title        = x.Title,
                    Photo        = new ImageOptimizer
                    {
                        Photo = Utilities.ReturnFilePath(ConstValues.MediaBaseUrl, ConstValues.MediaResize,
                                                         UploadType.AnnouncementBasePhoto, x.BasePhoto, 300, 300, false, 0),
                        PhotoBlur = Utilities.ReturnFilePath(ConstValues.MediaBaseUrl, ConstValues.MediaResize,
                                                             UploadType.AnnouncementBasePhoto, x.BasePhoto, 100, 100, true, 0)
                    }
                }).FirstOrDefault();
            }
            var notifyToString = Utilities.SerializeObject(notify);
            var isSent         = await SupportChatMessageHandler.SendMessageAsync(conversation.Id, receiverId,
                                                                                  notifyToString, receiverId == conversation.GuestId);

            bool enableNotification = true;

            notify.IsSentFromMe = true;
            if (receiverId == conversation.AdminId && !isSent)
            {
                await SupportBaseMessageHandler.SendMessageAsync(conversation.Id, conversation.AdminId);

                return(notify);
            }
            if (!isSent && receiverId != conversation.AdminId)
            {
                if (isGuest && receiverId != conversation.AdminId)
                {
                    enableNotification = _repository.FilterAsNoTracking <PersonSetting>(s => s.GuestId == receiverId)
                                         .Select(s => s.SubscriptionsType).Contains(SubscriptionsType.EnableMessageNotification);
                }
                else if (!isGuest && caller != null && receiverId != conversation.AdminId)
                {
                    enableNotification = _repository.FilterAsNoTracking <PersonSetting>(s => s.UserId == receiverId)
                                         .Select(s => s.SubscriptionsType).Contains(SubscriptionsType.EnableMessageNotification);
                }

                if (enableNotification)
                {
                    await _firebaseRepository.SendIndividualNotification(new NewMessageNotificationModel
                    {
                        SenderId    = caller?.Id ?? guest.Id,
                        Description = messageBodyType == SupportMessageBodyType.Image ? "Image" :
                                      messageBodyType == SupportMessageBodyType.Photo ? "Photo" :
                                      messageBodyType == SupportMessageBodyType.Announcement ? "Announcement" : model.MessageText,
                        GenericId        = conversation.Id,
                        NotificationType = NotificationType.SupportMessage,
                        ReceiverId       = receiverId,
                        Title            = caller != null
                            ? $"{caller.FullName} sent you a message"
                            : $"Guest N {guest.Id} sent you a message"
                    }, isGuest);
                }
            }
            return(notify);
        }
        public static async Task Map(this HttpContext context, IEntityRepository repository)
        {
            var socket = await context.WebSockets.AcceptWebSocketAsync();

            context.Request.Query.TryGetValue("conversationId", out var conversationStringValues);
            if (conversationStringValues.Count == 0)
            {
                context.Request.Headers.TryGetValue("conversationId", out conversationStringValues);
            }
            int.TryParse(conversationStringValues, out var conversationId);
            var path = context.Request.Path.Value;

            if (conversationId == 0 && !path.Contains("supportBaseHub") && !path.Contains("baseHub") && !path.Contains("progressHub"))
            {
                return;
            }
            var userName = context.User.FindFirst(ClaimTypes.NameIdentifier)?.Value;

            // var userId = int.Parse(context.User.Claims.Single(u => u.Type == "userId").Value);//check

            context.Request.Headers.TryGetValue("deviceId", out var deviceIdString);
            if (deviceIdString.Count == 0)
            {
                context.Request.Query.TryGetValue("deviceId", out deviceIdString);
            }
            var  deviceId = deviceIdString.FirstOrDefault();
            User user     = null;

            if (!string.IsNullOrEmpty(userName))
            {
                user = await repository.Filter <User>(x => x.Email == userName || // add verfiedBy
                                                      (x.PhoneCode + x.Phone) == userName).FirstOrDefaultAsync();
            }
            if (path.Contains("supportChatHub", StringComparison.InvariantCulture))
            {
                var guest = await repository.Filter <Guest>(x => x.DeviceId == deviceId).FirstOrDefaultAsync();

                if (user == null && guest == null)
                {
                    return;
                }
                await SupportChatMessageHandler.OnConnected(conversationId, user?.Id ?? guest.Id, socket, user == null, deviceId);

                await WebSocketManagerMapper.Receive(socket, async (result, buffer) =>
                {
                    if (result.MessageType == WebSocketMessageType.Close)
                    {
                        await SupportChatMessageHandler.OnDisconnected(conversationId, user?.Id ?? guest.Id, user == null, deviceId);
                    }
                });
            }
            else
            {
                if (user == null)
                {
                    return;
                }
                if (path.Contains("chatHub", StringComparison.InvariantCulture))
                {
                    await ChatMessageHandler.OnConnected(conversationId, user.Id, socket, deviceId);

                    await WebSocketManagerMapper.Receive(socket, async (result, buffer) =>
                    {
                        if (result.MessageType == WebSocketMessageType.Close)
                        {
                            await ChatMessageHandler.OnDisconnected(conversationId, user.Id, deviceId);
                        }
                    });
                }
                if (path.Contains("supportBaseHub", StringComparison.InvariantCulture))
                {
                    await SupportBaseMessageHandler.OnConnected(user.Id, socket, false, deviceId);

                    await WebSocketManagerMapper.Receive(socket, async (result, buffer) =>
                    {
                        if (result.MessageType == WebSocketMessageType.Close)
                        {
                            await SupportBaseMessageHandler.OnDisconnected(user.Id, false, deviceId);
                        }
                    });
                }
                if (path.Contains("baseHub", StringComparison.InvariantCulture))
                {
                    await BaseMessageHandler.OnConnected(user.Id, socket, false, deviceId);

                    await WebSocketManagerMapper.Receive(socket, async (result, buffer) =>
                    {
                        if (result.MessageType == WebSocketMessageType.Close)
                        {
                            await BaseMessageHandler.OnDisconnected(user.Id, false, deviceId);
                        }
                    });
                }
                if (path.Contains("progressHub", StringComparison.InvariantCulture))
                {
                    await AnnouncementProgressHandler.OnConnected(user.Id, socket, deviceId);

                    await WebSocketManagerMapper.Receive(socket, async (result, buffer) =>
                    {
                        if (result.MessageType == WebSocketMessageType.Close)
                        {
                            await AnnouncementProgressHandler.OnDisconnected(user.Id, deviceId);
                        }
                    });
                }
            }
        }