예제 #1
0
        /// <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);
        }
예제 #2
0
        /// <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));
            }
        }
예제 #3
0
        /// <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);
        }
예제 #4
0
        /// <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);
        }
예제 #5
0
 /// <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;
     }
 }
예제 #6
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);
        }
예제 #7
0
 /// <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;
 }
예제 #8
0
        /// <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;
        }
예제 #9
0
        //
        // ────────────────────────────────────────────────────────────────────────────────────
        //   :::::: 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);
        }
예제 #10
0
        //
        // ────────────────────────────────────────────────────────────────────────────────────
        //   :::::: 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);
        }
예제 #11
0
        /// <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));
            }
        }
예제 #12
0
        /// <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));
            }
        }
예제 #13
0
        /// <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));
            }
        }
예제 #14
0
        //
        // ────────────────────────────────────────────────────────────────────────────────────
        //   :::::: 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));
        }
예제 #15
0
        //
        // ──────────────────────────────────────────────────────────────────────────
        //   :::::: 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);
        }
예제 #16
0
        /// <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);
        }