public void Create(Notification newEntity)
 {
     if (newEntity.Task is TaskList)
     {
         CreateTaskListNotification(newEntity.User.UniqueId, newEntity.Task.Id, newEntity);
     }
     else
     {
         CreateNoteNotification(newEntity.User.UniqueId, newEntity.Task.Id, newEntity);
     }
 }
        public void CreateNote(User user, string listId, string creatorId, Note noteData)
        {
            noteData.Creator = user;

            var list = _taskListManager.GetTaskList(user.UniqueId, listId, creatorId);
            noteData.ParentList = list;

            _repository.Create(noteData);
            // TODO create specific repo for note shares
            _userNotesRepo.Create(user.UniqueId, noteData.Id, listId);
            _noteUsersRepo.Create(noteData.Id, user.UniqueId, listId);

            foreach (var u in list.Users)
            {
                var notif = new Notification() { Task = noteData, User = u, Type = Notification.NotificationType.Insert };
                _noticationMgr.CreateNotification(user.UniqueId, notif);
            }
        }
        public void CreateTaskListNotification(string userId, string listId, Notification notificationData)
        {
            notificationData.Id = (++_notificationId).ToString();

            var user = _userRepository.GetAll().FirstOrDefault(u => u.UniqueId == userId);
            if (user.Notifications == null)
            {
                user.Notifications = new List<Notification>();
            }
            user.Notifications.Add(notificationData);

            notificationData.User = user;
            if (notificationData.Task == null)
            {
                // this can not be always done, because in delete notifications,
                // at this moment the repository does not have the list anymore
                notificationData.Task = _listRepository.Get(userId, listId);
            }
        }
        public void UpdateTaskList(string userId, string listId, string creatorId, TaskList listData)
        {
            var listUsers = _listUsersRepo.GetAll(listId);
            if (listUsers == null)
            {
                throw new ObjectNotFoundException();
            }
            if (!listUsers.Any(u => u.UniqueId == userId))
            {
                throw new NoPermissionException();
            }

            _repository.Update(creatorId, listId, listData);

            foreach (var user in listUsers)
            {
                var notif = new Notification() { Task = listData, User = user, Type = Notification.NotificationType.Update };
                _noticationMgr.CreateNotification(userId, notif);
            }
        }
        public void CreateNotification(string userId, Notification notificationData)
        {
            // dont notify the user that made the change
            if (userId == notificationData.User.UniqueId)
            {
                return;
            }

            notificationData.At = DateTime.Now;

            if (!_onlineProcessor.Send(notificationData))
            {
                if (ProcessToEmail(notificationData))
                {
                    _queue.SendMessage(notificationData);
                }
                if (ProcessToRepository(notificationData))
                {
                    _repository.Create(notificationData);
                }
            }
        }
        public void DeleteTaskList(string userId, string listId, string creatorId)
        {
            // only let the creator user delete a list
            if (userId != creatorId)
            {
                throw new NoPermissionException();
            }

            var listUsers = _listUsersRepo.GetAll(listId);
            if (!listUsers.Any(u => u.UniqueId == userId))
            {
                throw new NoPermissionException();
            }

            var list = _repository.Get(creatorId, listId);
            if (list == null)
            {
                throw new ObjectNotFoundException();
            }

            _repository.Delete(creatorId, listId);

            foreach (var user in listUsers)
            {
                var notif = new Notification() { User = user, Task = list, Type = Notification.NotificationType.Delete };
                _noticationMgr.CreateNotification(userId, notif);
            }
        }
        public void ShareTaskList(string userId, string listId, string creatorId, string shareUserId)
        {
            var listUsers = _listUsersRepo.GetAll(listId);
            if (!listUsers.Any(u => u.UniqueId == userId))
            {
                throw new NoPermissionException();
            }

            var list = _repository.Get(creatorId, listId);
            if (list == null)
            {
                throw new ObjectNotFoundException();
            }

            _userListsRepo.Create(shareUserId, listId, creatorId);
            _listUsersRepo.Create(listId, shareUserId, ""); // TODO see later, really add name, need to check existance?

            var notif = new Notification() { Type = Notification.NotificationType.Share, Task = list, User = new User() { UniqueId = shareUserId } };
            _noticationMgr.CreateNotification(userId, notif);
        }
        public void UpdateNote(string userId, string listId, string noteId, Note noteData)
        {
            var noteUsers = _noteUsersRepo.GetAll(noteId);
            if (!noteUsers.Any(u => u.UniqueId == userId))
            {
                throw new NoPermissionException();
            }

            _repository.Update(listId, noteId, noteData);

            foreach (var user in noteUsers)
            {
                var notif = new Notification() { Task = noteData, User = user, Type = Notification.NotificationType.Update };
                _noticationMgr.CreateNotification(userId, notif);
            }
        }
        public void ShareNote(string userId, string listId, string noteId, string shareUserId)
        {
            var noteUsers = _noteUsersRepo.GetAll(noteId);
            if (!noteUsers.Any(u => u.UniqueId == userId))
            {
                throw new NoPermissionException();
            }

            var note = _repository.Get(listId, noteId);
            if (note == null)
            {
                throw new ObjectNotFoundException();
            }

            _userNotesRepo.Create(shareUserId, noteId, listId);
            _noteUsersRepo.Create(noteId, shareUserId, listId);

            var notif = new Notification() { Type = Notification.NotificationType.Share, Task = note, User = new User() { UniqueId = shareUserId } };
            _noticationMgr.CreateNotification(userId, notif);
        }
        public void DeleteNote(string userId, string listId, string creatorId, string noteId)
        {
            var noteUsers = _noteUsersRepo.GetAll(noteId);
            if (!noteUsers.Any(u => u.UniqueId == userId))
            {
                throw new NoPermissionException();
            }

            var note = _repository.Get(listId, noteId);
            if (note == null)
            {
                throw new ObjectNotFoundException();
            }

            _repository.Delete(listId, noteId);

            foreach (var user in noteUsers)
            {
                var notif = new Notification() { User = user, Task = note, Type = Notification.NotificationType.Delete };
                _noticationMgr.CreateNotification(userId, notif);
            }

            var list = _taskListManager.GetTaskList(userId, listId, creatorId);
            foreach (var user in list.Users)
            {
                var notif = new Notification() { User = user, Task = list, Type = Notification.NotificationType.Update };
                _noticationMgr.CreateNotification(userId, notif);
            }
        }
 public void Update(string partitionKey, string rowKey, Notification changedEntity)
 {
 }
 private bool ProcessToRepository(Notification notificationData)
 {
     // saving all notifications in database when the user is not online
     return true;
 }
        private bool ProcessToEmail(Notification notificationData)
        {
            // TODO read notifications configurations for user

            return notificationData.Type == Notification.NotificationType.Share;
        }
 public NotificationEntity(Notification n)
     : base(n.User.UniqueId, n.Id)
 {
     TaskId = n.Task.Id;
     IsList = (n.Task is TaskList);
 }