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); } }); } } }