/// <summary> /// Send a email and notification to the receiver /// </summary> /// <param name="title">The dm conversation</param> /// <param name="caller">The caller of the function</param> private async Task sendMailAndSendNotification(DirectMessageTitle title, User caller) { //If the recv has more than 1 unread messages doesn't need another email _context.Entry(caller).Reference("role").Load(); bool callerIsAdmin = caller.role == RoleManager.getAdmin(_context); if (title.unreadMessagesForUser > 1 && callerIsAdmin) { return; } if (title.unreadMessagesForAdmin > 1 && !callerIsAdmin) { return; } _context.Entry(title).Reference("Sender").Load(); _context.Entry(title).Reference("receiver").Load(); User theUser = title.Sender.id == caller.id ? title.Sender : title.receiver; User notificationReceiver = title.Sender.id == caller.id ? title.receiver : title.Sender; if (callerIsAdmin) { EmailSender.sendDMNotification(theUser.email, theUser.nickname, title.title); } await sendNotification(notificationReceiver); }
/// <summary> /// Load the messages in a dm conversation /// </summary> /// <param name="dmId">The id of the dm conversation</param> /// <returns>IActionResult of the load action</returns> /// See <see cref="Areas.DirectMessages.Models.DMRoom"/> to know the response structure public IActionResult load(string dmId) { User user = TokenUserManager.getUserFromToken(HttpContext, _context); DirectMessageTitle title = new DirectMessageTitle(); if (!user.open) { return(BadRequest(new { error = "YoureBanned" })); } if (!getDMTitle(ref title, dmId, user)) { return(BadRequest()); } try { readMessages(title, AdminPolicy.isAdmin(user, _context)); _context.SaveChanges(); Models.DMRoom room = new Models.DMRoom(title, user, _context); return(Ok(room)); } catch (Exception) { return(StatusCode(500)); } }
/// <summary> /// Add the messages clusters to the private vars /// </summary> /// <param name="title">The dm conversation</param> /// <param name="context">The database context</param> /// <returns>A list of clusters of messages of the dm conversations</returns> private List <DMMessageCluster> addDMClusters(DirectMessageTitle title, ApplicationDBContext context) { context.Entry(title).Collection("messages").Load(); List <DirectMessageMessages> msgs = title.messages.OrderBy(tt => tt.time).ToList(); List <DirectMessageMessages> addMessages = new List <DirectMessageMessages>(); List <DMMessageCluster> retClusters = new List <DMMessageCluster>(); bool last = false; if (msgs.Count() > 0) { last = msgs.First().isAdmin; } msgs.ForEach(m => { if (m.isAdmin != last) { retClusters.Add(new DMMessageCluster(addMessages, last)); addMessages = new List <DirectMessageMessages>(); last = m.isAdmin; } addMessages.Add(m); }); if (addMessages.Count() > 0) { retClusters.Add(new DMMessageCluster(addMessages, last)); } return(retClusters); }
/// <summary> /// Sends the notification to the receiver /// </summary> /// <param name="user">The maker of the dm</param> /// <param name="recv">The receiver of the dm</param> /// <param name="title">The dm just created</param> private async Task sendNotification(User user, User recv, DirectMessageTitle title) { bool isAdmin = user.role == RoleManager.getAdmin(_context); NotificationType type = isAdmin ? NotificationType.OPEN_DM_FROM_ADMIN : NotificationType.OPEN_DM_FROM_USER; String recvName = isAdmin ? "" : recv.nickname; EmailSender.sendOpenCreateDMNotification(recv.email, recv.nickname, title.title); await SendNotification.send(_hub, recvName, recv, type, _context); }
/// <summary> /// Mark as read the messages for the user /// </summary> /// <param name="title">The dm conversation</param> /// <param name="isAdmin">True if the caller is an admin, false otherwise</param> private void readMessages(DirectMessageTitle title, bool isAdmin) { if (isAdmin) { title.unreadMessagesForAdmin = 0; } else { title.unreadMessagesForUser = 0; } }
/// <summary> /// Send a email and a notification to the user /// </summary> /// <param name="title">The dm conversation</param> /// <param name="caller">The user who has open/close the conversation</param> /// <param name="open">True if the conversation has just open, false otherwise</param> /// <returns></returns> private async Task sendMailAndNotification(DirectMessageTitle title, User caller, bool open) { _context.Entry(title).Reference("Sender").Load(); _context.Entry(title).Reference("receiver").Load(); User theUser = title.Sender.id == caller.id ? title.Sender : title.receiver; User notificationReceiver = title.Sender.id == caller.id ? title.receiver : title.Sender; EmailSender.sendOpenCloseDMNotification(theUser.email, theUser.nickname, title.title, open); await sendNotification(notificationReceiver, open); }
/// <summary> /// Add an unread message to the receiver of the message /// </summary> /// <param name="title">The dm conversation</param> /// <param name="isAdmin">True if the sender is an admin, false otherwise</param> private void addUnreadMessages(DirectMessageTitle title, bool isAdmin) { if (isAdmin) { title.unreadMessagesForUser++; } else { title.unreadMessagesForAdmin++; } title.lastUpdate = DateTime.Now; }
/// <summary> /// Send the open/close message to the dm conversation /// </summary> /// <param name="title"></param> /// <param name="open"></param> private void sendClosedMessage(DirectMessageTitle title, bool open) { DirectMessageMessages msg = new DirectMessageMessages { message = open ? "El administrador encargado de la convesación la ha reabierto" : "Esta conversación ha sido cerrada", isAdmin = true, DirectMessageTitle = title }; _context.Add(msg); title.unreadMessagesForAdmin = 0; title.unreadMessagesForUser++; title.lastUpdate = DateTime.Now; }
// // ──────────────────────────────────────────────────────────────────────────────────── // :::::: P R I V A T E F U N C T I O N S : : : : : : : : // ──────────────────────────────────────────────────────────────────────────────────── // /// <summary> /// Get the info of the dm conversation /// </summary> /// <param name="title">A new DirectMessageTitle object to save the dm conversation on it</param> /// <param name="dmId">The id of the dm conversation</param> /// <param name="user">The user who wants to load the conversation</param> /// <returns>true if the dm conversation exists, false otherwise</returns> private bool getDMTitle(ref DirectMessageTitle title, string dmId, User user) { _context.Entry(user).Collection("directMessages").Load(); List <DirectMessageTitle> dms = user.directMessages.Where(dm => dm.id.ToString() == dmId).ToList(); dms.AddRange(_context.DirectMessagesTitle.Where(dm => dm.id.ToString() == dmId && dm.receiver == user).ToList()); if (dms.Count() != 1) { return(false); } title = dms.First(); return(true); }
// // ──────────────────────────────────────────────────────────────────────────────────── // :::::: P R I V A T E F U N C T I O N S : : : : : : : : // ──────────────────────────────────────────────────────────────────────────────────── // /// <summary> /// Checks the open/close request /// </summary> /// <param name="title">A new DirectMessageTitle object, to save the dm conversation object</param> /// <param name="id">The id of the dm conversation</param> /// <param name="openClose">True to open the dm, false to close it</param> /// <returns></returns> private bool checkOrder(ref DirectMessageTitle title, string id, bool openClose) { List <DirectMessageTitle> titles = _context.DirectMessagesTitle.Where(dm => dm.id.ToString() == id).ToList(); if (titles.Count() != 1) { return(false); } title = titles.First(); if (title.closed != openClose) { return(false); } return(true); }
/// <summary> /// Sends a message to a dm conversation /// </summary> /// <param name="order">The info to send the message</param> /// See <see cref="Areas.DirectMessages.Models.SendDMMessage"/> to know the param structure /// <returns>IActionResult of the send message action</returns> /// See <see cref="Areas.DirectMessages.Models.DMRoom"/> to know the response structure public async Task <IActionResult> sendMsg([FromBody] SendDMMessage order) { User user = TokenUserManager.getUserFromToken(HttpContext, _context); DirectMessageTitle title = new DirectMessageTitle(); if (!user.open) { return(BadRequest(new { error = "YoureBanned" })); } if (!checkOrder(ref title, order.dmId, user)) { return(BadRequest()); } try { bool isAdmin = AdminPolicy.isAdmin(user, _context); DirectMessageMessages msg = new DirectMessageMessages { message = order.message, isAdmin = isAdmin, DirectMessageTitle = title }; addUnreadMessages(title, isAdmin); _context.Add(msg); _context.SaveChanges(); await sendMailAndSendNotification(title, user); using (var scope = _scopeFactory.CreateScope()) { var dbContext = scope.ServiceProvider.GetRequiredService <ApplicationDBContext>(); DirectMessageTitle dbTitle = dbContext.DirectMessagesTitle.Where(t => t.id == title.id).First(); User dbuser = dbContext.User.Where(u => u.id == user.id).First(); DMRoom room = new DMRoom(dbTitle, dbuser, dbContext); return(Ok(room)); } } catch (Exception) { return(StatusCode(500)); } }
/// <summary> /// Closes or open a dm conversation /// </summary> /// <param name="id">The id of the dm conversation</param> /// <param name="openOrder">"1" to open de conversation, "0" to clse it</param> /// <returns>The IActionResult of the open/close action</returns> /// See <see cref="Areas.DirectMessages.Models.DMRoom"/> to know the response structure public async Task <IActionResult> close(string id, string openOrder) { User user = TokenUserManager.getUserFromToken(HttpContext, _context); DirectMessageTitle title = new DirectMessageTitle(); if (!user.open) { return(BadRequest(new { error = "YoureBanned" })); } if (!AdminPolicy.isAdmin(user, _context)) { return(BadRequest("notAllowed")); } if (openOrder != "1" && openOrder != "0") { return(BadRequest()); } bool open = openOrder == "1"; if (!checkOrder(ref title, id, open)) { return(BadRequest()); } if (!checkAdminInDM(title, user)) { return(BadRequest()); } try { sendClosedMessage(title, open); title.closed = !open; _context.SaveChanges(); await sendMailAndNotification(title, user, open); DMRoom room = new DMRoom(title, user, _context); return(Ok(room)); } catch (Exception) { return(StatusCode(500)); } }
/// <summary> /// Create a direct conversation /// </summary> /// <param name="order">The info to create the DM</param> /// See <see cref="Areas.DirectMessages.Models.CreateDMTitle"/> to know the param structure /// <returns>IActionResult of the createTitle structure with the id of the dm created</returns> public async Task <IActionResult> createTitle([FromBody] CreateDMTitle order) { User user = TokenUserManager.getUserFromToken(HttpContext, _context); User receiver = new User(); if (!user.open) { return(BadRequest(new { error = "YoureBanned" })); } if (!checkSenderAndReceiver(user, order.emailReceiver)) { return(BadRequest()); } if (!getReceiver(ref receiver, order.emailReceiver)) { return(BadRequest(new { error = "recvNotExist" })); } try { DirectMessageTitle dm = new DirectMessageTitle { Sender = user, receiver = receiver, title = order.title }; _context.Add(dm); _context.SaveChanges(); await sendNotification(user, receiver, dm); return(Ok(dm.id.ToString())); } catch (Exception) { return(StatusCode(500)); } }
// // ──────────────────────────────────────────────────────────────────────────────────── // :::::: P R I V A T E F U N C T I O N S : : : : : : : : // ──────────────────────────────────────────────────────────────────────────────────── // /// <summary> /// Add the dm conversation info to the private vars /// </summary> /// <param name="title">The dm conversation</param> /// <param name="caller">The caller of the function</param> /// <param name="context">The database context</param> /// <returns>The info of the dm conversation</returns> /// See <see cref="Areas.DirectMessages.Models.DMTitle"/> to know the response structure private DMTitle addTitle(DirectMessageTitle title, User caller, ApplicationDBContext context) { bool isAdmin = API.Util.AdminPolicy.isAdmin(caller, context); return(new DMTitle(title, caller.id, isAdmin, context)); }
// // ────────────────────────────────────────────────────────────────────────── // :::::: C O N S T R U C T O R S : : : : : : : : // ────────────────────────────────────────────────────────────────────────── // /// <summary> /// Constructor /// </summary> /// <param name="title">The dm conversation object</param> /// <param name="caller">The caller of the function</param> /// <param name="_context">The database context</param> public DMRoom(DirectMessageTitle title, User caller, ApplicationDBContext _context) { this.title = this.addTitle(title, caller, _context); this.clusters = addDMClusters(title, _context); }
/// <summary> /// Checks if the admin is on the dm conversation /// </summary> /// <param name="title">The dm conversation</param> /// <param name="admin">The admim of the conversation</param> /// <returns></returns> private bool checkAdminInDM(DirectMessageTitle title, User admin) { _context.Entry(title).Reference("receiver").Load(); return(title.senderid == admin.id || title.receiver.id == admin.id); }