//Sends notification to all friends for shopping
        public async Task SendNotification(UserModel user)
        {
            if (user.Position == (int)UserPosition.HasNotHome)
            {
                CustomException errors = new CustomException((int)HttpStatusCode.BadRequest);
                errors.AddError("Home Not Exist", "User is not member of a home");
                errors.Throw();
            }

            user = await _userRepository.GetByIdAsync(user.Id, true);

            HomeModel home = await _homeRepository.GetByIdAsync(user.Home.Id, true);

            foreach (var f in home.Users)
            {
                if (f.Id == user.Id)
                {
                    continue;
                }

                FCMModel fcm = new FCMModel(f.DeviceId, new Dictionary <string, object>());
                fcm.notification.Add("title", "Alışveriş Talebi");
                fcm.notification.Add("body", "Alışveriş listesindeki ürünlerin alınması isteniyor.");
                await _fcmService.SendFCMAsync(fcm);
            }
        }
        //Send Firebase Cloud Message to given user
        public async Task SendFCMAsync(FCMModel fcmMessage)
        {
            string serverKey  = string.Format("key={0}", _config["FCM:ServerKey"]);
            string senderId   = string.Format("id={0}", _config["FCM:SenderId"]);
            string requestUri = _config["FCM:RequestUri"];

            var jsonMessageBody = JsonConvert.SerializeObject(fcmMessage);

            using (var httpRequest = new HttpRequestMessage(HttpMethod.Post, requestUri))
            {
                httpRequest.Headers.TryAddWithoutValidation("Authorization", serverKey);
                httpRequest.Headers.TryAddWithoutValidation("Sender", senderId);
                httpRequest.Content = new StringContent(jsonMessageBody, Encoding.UTF8, "application/json");

                using (var httpClient = new HttpClient())
                {
                    var result = await httpClient.SendAsync(httpRequest);

                    if (result.IsSuccessStatusCode)
                    {
                        return;
                    }
                    else
                    {
                        CustomException errors = new CustomException();
                        errors.AddError("FCM Error", "Unexpected error occured while FCM sending");
                        errors.Throw();
                    }
                }
            }
        }
Exemplo n.º 3
0
        //User adds meal
        public async Task AddMealAsync(UserModel user, MealModel meal)
        {
            if (user.Position == (int)UserPosition.HasNotHome)
            {
                CustomException errors = new CustomException((int)HttpStatusCode.BadRequest);
                errors.AddError("Home Not Exist", "User is not member of a home");
                errors.Throw();
            }

            user = await _userRepository.GetByIdAsync(user.Id, true);

            HomeModel home = await _homeRepository.GetByIdAsync(user.Home.Id, true);

            MealModel tmp = await _mealRepository.GetHomeMealByNameAsync(home.Id, meal.Name);

            if (tmp != null)
            {
                CustomException errors = new CustomException((int)HttpStatusCode.BadRequest);
                errors.AddError("Meal Already Exist", "This meal has already exist");
                errors.Throw();
            }

            meal.Home = home;

            _mealRepository.Insert(meal);

            foreach (var friend in home.Users)
            {
                FCMModel fcm = new FCMModel(friend.DeviceId, type: "AddMeal");
                fcm.data.Add("Meal", meal);
                await _fcmService.SendFCMAsync(fcm);
            }
        }
        //Updates shopping list
        public async Task UpdateShoppingListAsync(UserModel user, ShoppingListModel shoppingList)
        {
            if (user.Position == (int)UserPosition.HasNotHome)
            {
                CustomException errors = new CustomException((int)HttpStatusCode.BadRequest);
                errors.AddError("Home Not Exist", "User is not member of a home");
                errors.Throw();
            }

            user = await _userRepository.GetByIdAsync(user.Id, true);

            ShoppingListModel old = await _shoppingListRepository.GetShoppingListByHomeIdAsync(user.Home.Id, true);

            if (old == null)
            {
                CustomException errors = new CustomException((int)HttpStatusCode.BadRequest);
                errors.AddError("Shopping List Not Exist", "Shopping list is not exist");
                errors.Throw();
            }

            old.List   = shoppingList.List;
            old.Status = shoppingList.Status;

            _shoppingListRepository.Update(old);

            foreach (var friend in user.Home.Users)
            {
                FCMModel fcm = new FCMModel(friend.DeviceId, type: "ShoppingListUpdate");
                fcm.data.Add("UpdatedShoppingList", old);
                await _fcmService.SendFCMAsync(fcm);
            }
        }
Exemplo n.º 5
0
        //Admin adds a housework assign
        public async Task AddHouseworkAsync(UserModel user, HouseworkModel housework, int friendId)
        {
            if (user.Position != (int)UserPosition.Admin)
            {
                CustomException errors = new CustomException((int)HttpStatusCode.BadRequest);
                errors.AddError("Authorization Error", "You are not authorized for housework assignment");
                errors.Throw();
            }

            if (housework.Day < 1 || housework.Day > 31)
            {
                CustomException errors = new CustomException((int)HttpStatusCode.BadRequest);
                errors.AddError("Housework Day Error", "You can assign a day only  between 1-31");
                errors.Throw();
            }

            user = await _userRepository.GetByIdAsync(user.Id, true);

            HomeModel home = await _homeRepository.GetByIdAsync(user.Home.Id, true);

            UserModel friend = await _userRepository.GetByIdAsync(friendId, true);

            if ((friend == null) || (friend.Home != user.Home))
            {
                CustomException errors = new CustomException((int)HttpStatusCode.BadRequest);
                errors.AddError("Friendship Not Found", "Friendship not found for assignment");
                errors.Throw();
            }

            housework.User = friend;
            housework.Home = home;

            _houseworkRepository.Insert(housework);

            //Sends fcm to assigned friend
            FCMModel fcmFriend = new FCMModel(friend.DeviceId, new Dictionary <string, object>());

            fcmFriend.notification.Add("title", "Yeni Ev İşi");
            fcmFriend.notification.Add("body", String.Format("Ayın {0}. günü {1} yapmanız gerekmektedir.", housework.Day, housework.Work));

            await _fcmService.SendFCMAsync(fcmFriend);

            //Sends fcm to all friends
            foreach (var f in home.Users)
            {
                FCMModel fcm = new FCMModel(f.DeviceId, type: "AddHousework");
                fcm.data.Add("Housework", housework);
                fcm.data.Add("FriendId", friendId);

                await _fcmService.SendFCMAsync(fcm);
            }
        }
        //Admin request to user for inviting home
        public async Task InviteHomeRequestAsync(UserModel user, string invitedUsername)
        {
            Task <InformationModel> firstNameInfo = _informationRepository.GetInformationByInformationNameAsync("FirstName");
            Task <InformationModel> lastNameInfo  = _informationRepository.GetInformationByInformationNameAsync("LastName");

            if (user.Position != (int)UserPosition.Admin)
            {
                CustomException errors = new CustomException((int)HttpStatusCode.BadRequest);
                errors.AddError("Authorisation Constraint", "You are not authorized for this request, you must be administrator of home");
                errors.Throw();
            }

            var home = (await _userRepository.GetByIdAsync(user.Id, true)).Home;

            //Admin waiting for user's accept

            UserModel invitedUser = await _userRepository.GetByUsernameAsync(invitedUsername);

            if (invitedUser == null)
            {
                CustomException errors = new CustomException((int)HttpStatusCode.BadRequest);
                errors.AddError("User Not Exist", "User is not exist");
                errors.Throw();
            }

            if (invitedUser.Position != (int)UserPosition.HasNotHome)
            {
                CustomException errors = new CustomException((int)HttpStatusCode.BadRequest);
                errors.AddError("User Has Home", "You can not invite a user who already has home");
                errors.Throw();
            }

            UserInformationModel firstName = await _userInformationRepository.GetUserInformationByIdAsync(user.Id, (await firstNameInfo).Id);

            UserInformationModel lastName = await _userInformationRepository.GetUserInformationByIdAsync(user.Id, (await lastNameInfo).Id);

            FCMModel fcm = new FCMModel(invitedUser.DeviceId, new Dictionary <string, object>());

            fcm.notification.Add("title", "Eve Katılma Daveti");
            fcm.notification.Add("body", String.Format("{0} {1}({2}) evine katılmanız için davet ediyor.", firstName.Value, lastName.Value, user.Username));

            await _fcmService.SendFCMAsync(fcm);

            fcm = new FCMModel(invitedUser.DeviceId, type: "InviteHomeRequest");

            fcm.data.Add("InvitedHomeId", home.Id);
            fcm.data.Add("InviterUsername", user.Username);
            fcm.data.Add("InviterFirstName", firstName.Value);
            fcm.data.Add("InviterLastName", lastName.Value);

            await _fcmService.SendFCMAsync(fcm);
        }
Exemplo n.º 7
0
        //Admin deletes a housework assign
        public async Task DeleteHouseworkAsync(UserModel user, int houseworkId)
        {
            if (user.Position != (int)UserPosition.Admin)
            {
                CustomException errors = new CustomException((int)HttpStatusCode.BadRequest);
                errors.AddError("Authorization Error", "You are not authorized for housework assignment");
                errors.Throw();
            }

            user = await _userRepository.GetByIdAsync(user.Id, true);

            HomeModel home = await _homeRepository.GetByIdAsync(user.Home.Id, true);

            HouseworkModel housework = await _houseworkRepository.GetHouseworkByIdAsync(houseworkId, true);

            if ((housework == null))
            {
                CustomException errors = new CustomException((int)HttpStatusCode.BadRequest);
                errors.AddError("Housework Not Found", "Housework not found for delete");
                errors.Throw();
            }

            if (housework.Home != user.Home)
            {
                CustomException errors = new CustomException((int)HttpStatusCode.BadRequest);
                errors.AddError("Housework Not Belongs Home", "Housework not belongs for this home");
                errors.Throw();
            }

            //Sends fcm to assigned friend
            FCMModel fcmFriend = new FCMModel(housework.User.DeviceId, new Dictionary <string, object>());

            fcmFriend.notification.Add("title", "Ev İşi İptal Edildi");
            fcmFriend.notification.Add("body", String.Format("Ayın {0}. yapmanız gereken {1} işi iptal edildi.", housework.Day, housework.Work));

            await _fcmService.SendFCMAsync(fcmFriend);

            _houseworkRepository.Delete(housework);


            await _fcmService.SendFCMAsync(fcmFriend);

            //Sends fcm to all friends
            foreach (var f in home.Users)
            {
                FCMModel fcm = new FCMModel(f.DeviceId, type: "DeleteHousework");
                fcm.data.Add("HouseworkId", houseworkId);

                await _fcmService.SendFCMAsync(fcm);
            }
        }
        //User updates note
        public async Task UpdateNoteAsync(UserModel user, NotepadModel note)
        {
            if (user.Position == (int)UserPosition.HasNotHome)
            {
                CustomException errors = new CustomException((int)HttpStatusCode.BadRequest);
                errors.AddError("Home Not Exist", "User is not member of a home");
                errors.Throw();
            }

            if (note.Id == 0)
            {
                CustomException errors = new CustomException((int)HttpStatusCode.BadRequest);
                errors.AddError("Id Not Exist", "Notepad id field is required");
                errors.Throw();
            }

            user = await _userRepository.GetByIdAsync(user.Id, true);

            HomeModel home = await _homeRepository.GetByIdAsync(user.Home.Id, true);

            NotepadModel old = await _notepadRepository.GetNoteByIdAsync(note.Id, true);

            if (old == null)
            {
                CustomException errors = new CustomException((int)HttpStatusCode.BadRequest);
                errors.AddError("Note Not Exist", "Note is not exist");
                errors.Throw();
            }

            if (old.Id != note.Id)
            {
                CustomException errors = new CustomException((int)HttpStatusCode.BadRequest);
                errors.AddError("Note Not Belongs Home", "Note does not belong this home");
                errors.Throw();
            }

            old.Title   = note.Title;
            old.Content = note.Content;

            await _notepadRepository.UpdateAsync(old);

            foreach (var friend in home.Users)
            {
                FCMModel fcm = new FCMModel(friend.DeviceId, type: "NotepadUpdate");
                fcm.data.Add("UpdatedNote", old);
                await _fcmService.SendFCMAsync(fcm);
            }
        }
Exemplo n.º 9
0
        //User deletes meal
        public async Task DeleteMealAsync(UserModel user, int mealId)
        {
            if (user.Position == (int)UserPosition.HasNotHome)
            {
                CustomException errors = new CustomException((int)HttpStatusCode.BadRequest);
                errors.AddError("Home Not Exist", "User is not member of a home");
                errors.Throw();
            }

            user = await _userRepository.GetByIdAsync(user.Id, true);

            HomeModel home = await _homeRepository.GetByIdAsync(user.Home.Id, true);

            MealModel meal = await _mealRepository.GetHomeMealByIdAsync(mealId, true);

            if (meal == null)
            {
                CustomException errors = new CustomException((int)HttpStatusCode.BadRequest);
                errors.AddError("Meal Not Exist", "This meal has not exist");
                errors.Throw();
            }

            if (meal.Home.Id != home.Id)
            {
                CustomException errors = new CustomException((int)HttpStatusCode.BadRequest);
                errors.AddError("Meal Not Related Home", "This meal is not related with user home");
                errors.Throw();
            }

            //Finds and deletes all related menu meals
            List <MenuMealModel> menuMeals = await _menuMealRepository.GetAllMenuMealsByMealIdAsync(mealId);

            foreach (var menuMeal in menuMeals)
            {
                _menuMealRepository.Delete(menuMeal);
            }

            foreach (var friend in home.Users)
            {
                FCMModel fcm = new FCMModel(friend.DeviceId, type: "DeleteMeal");
                fcm.data.Add("MealId", mealId);
                await _fcmService.SendFCMAsync(fcm);
            }

            _mealRepository.Delete(meal);
        }
Exemplo n.º 10
0
        //User requests to admin for joining home
        public async Task JoinHomeRequestAsync(UserModel user, string joinHomeName)
        {
            Task <InformationModel> firstNameInfo = _informationRepository.GetInformationByInformationNameAsync("FirstName");
            Task <InformationModel> lastNameInfo  = _informationRepository.GetInformationByInformationNameAsync("LastName");

            if (user.Position != (int)UserPosition.HasNotHome)
            {
                CustomException errors = new CustomException((int)HttpStatusCode.BadRequest);
                errors.AddError("User Has Home", "User has home already");
                errors.Throw();
            }

            var home = await _homeRepository.GetByHomeNameAsync(joinHomeName, true);

            if (home == null)
            {
                CustomException errors = new CustomException((int)HttpStatusCode.BadRequest);
                errors.AddError("Home Name Not Exist", "Home name has not exist");
                errors.Throw();
            }

            //User waiting for admin's accept

            UserInformationModel firstName = await _userInformationRepository.GetUserInformationByIdAsync(user.Id, (await firstNameInfo).Id);

            UserInformationModel lastName = await _userInformationRepository.GetUserInformationByIdAsync(user.Id, (await lastNameInfo).Id);

            FCMModel fcm = new FCMModel(home.Admin.DeviceId, new Dictionary <string, object>());

            fcm.notification.Add("title", "Eve Katılma İsteği");
            fcm.notification.Add("body", String.Format("{0} {1}({2}) evinize katılmak istiyor.", firstName.Value, lastName.Value, user.Username));

            await _fcmService.SendFCMAsync(fcm);

            fcm = new FCMModel(home.Admin.DeviceId, type: "JoinHomeRequest");

            fcm.data.Add("RequesterId", user.Id);
            fcm.data.Add("RequesterUsername", user.Username);
            fcm.data.Add("RequesterName", firstName.Value);
            fcm.data.Add("RequesterLastName", lastName.Value);

            await _fcmService.SendFCMAsync(fcm);
        }
Exemplo n.º 11
0
        //User updates meal
        public async Task UpdateMealAsync(UserModel user, MealModel meal)
        {
            if (user.Position == (int)UserPosition.HasNotHome)
            {
                CustomException errors = new CustomException((int)HttpStatusCode.BadRequest);
                errors.AddError("Home Not Exist", "User is not member of a home");
                errors.Throw();
            }

            user = await _userRepository.GetByIdAsync(user.Id, true);

            HomeModel home = await _homeRepository.GetByIdAsync(user.Home.Id, true);

            MealModel old = await _mealRepository.GetHomeMealByIdAsync(meal.Id, true);

            if (old == null)
            {
                CustomException errors = new CustomException((int)HttpStatusCode.BadRequest);
                errors.AddError("Meal Not Exist", "This meal has not exist");
                errors.Throw();
            }

            if (old.Home.Id != home.Id)
            {
                CustomException errors = new CustomException((int)HttpStatusCode.BadRequest);
                errors.AddError("Meal Not Related Home", "This meal is not related with user home");
                errors.Throw();
            }

            old.Name        = meal.Name;
            old.Ingredients = meal.Ingredients;
            old.Note        = meal.Note;

            _mealRepository.Update(old);

            foreach (var friend in home.Users)
            {
                FCMModel fcm = new FCMModel(friend.DeviceId, type: "UpdateMeal");
                fcm.data.Add("Meal", meal);
                await _fcmService.SendFCMAsync(fcm);
            }
        }
Exemplo n.º 12
0
        //User deletes menu
        public async Task DeleteMenuAsync(UserModel user, int menuId)
        {
            if (user.Position == (int)UserPosition.HasNotHome)
            {
                CustomException errors = new CustomException((int)HttpStatusCode.BadRequest);
                errors.AddError("Home Not Exist", "User is not member of a home");
                errors.Throw();
            }

            user = await _userRepository.GetByIdAsync(user.Id, true);

            HomeModel home = await _homeRepository.GetByIdAsync(user.Home.Id, true);

            MenuModel menu = await _menuRepository.GetHomeMenuByIdAsync(menuId, true);

            if ((menu == null) || (menu.Home.Id != home.Id))
            {
                CustomException errors = new CustomException((int)HttpStatusCode.BadRequest);
                errors.AddError("Menu Id Not Valid", "Menu id not valid, that day has not related menu");
                errors.Throw();
            }

            //Finds and deletes all related menu meals
            List <MenuMealModel> menuMeals = await _menuMealRepository.GetAllMenuMealsByMenuIdAsync(menu.Id);

            foreach (var menuMeal in menuMeals)
            {
                _menuMealRepository.Delete(menuMeal);
            }

            //Sends fcm to all users
            foreach (var friend in home.Users)
            {
                FCMModel fcm = new FCMModel(friend.DeviceId, type: "DeleteMenu");
                fcm.data.Add("MenuId", menuId);
                await _fcmService.SendFCMAsync(fcm);
            }

            _menuRepository.Delete(menu);
        }
        //User deletes note
        public async Task DeleteNoteAsync(UserModel user, int noteId)
        {
            if (user.Position == (int)UserPosition.HasNotHome)
            {
                CustomException errors = new CustomException((int)HttpStatusCode.BadRequest);
                errors.AddError("Home Not Exist", "User is not member of a home");
                errors.Throw();
            }

            user = await _userRepository.GetByIdAsync(user.Id, true);

            HomeModel home = await _homeRepository.GetByIdAsync(user.Home.Id, true);

            NotepadModel note = await _notepadRepository.GetNoteByIdAsync(noteId, true);

            if (note == null)
            {
                CustomException errors = new CustomException((int)HttpStatusCode.BadRequest);
                errors.AddError("Note Not Exist", "Note is not exist");
                errors.Throw();
            }

            if (note.Home != home)
            {
                CustomException errors = new CustomException((int)HttpStatusCode.BadRequest);
                errors.AddError("Note Not Belongs Home", "Note does not belong this home");
                errors.Throw();
            }

            foreach (var friend in home.Users)
            {
                FCMModel fcm = new FCMModel(friend.DeviceId, type: "NotepadDelete");
                fcm.data.Add("DeletedNote", note.Id);
                await _fcmService.SendFCMAsync(fcm);
            }

            await _notepadRepository.DeleteAsync(note);
        }
        //User adds note
        public async Task AddNoteAsync(UserModel user, NotepadModel note)
        {
            if (user.Position == (int)UserPosition.HasNotHome)
            {
                CustomException errors = new CustomException((int)HttpStatusCode.BadRequest);
                errors.AddError("Home Not Exist", "User is not member of a home");
                errors.Throw();
            }

            user = await _userRepository.GetByIdAsync(user.Id, true);

            HomeModel home = await _homeRepository.GetByIdAsync(user.Home.Id, true);

            note.Home = home;

            await _notepadRepository.InsertAsync(note);

            foreach (var friend in home.Users)
            {
                FCMModel fcm = new FCMModel(friend.DeviceId, type: "NotepadAdd");
                fcm.data.Add("NewNote", note);
                await _fcmService.SendFCMAsync(fcm);
            }
        }
Exemplo n.º 15
0
        //User adds menu
        public async Task AddMenuAsync(UserModel user, MenuModel menu, List <int> mealIds)
        {
            if (user.Position == (int)UserPosition.HasNotHome)
            {
                CustomException errors = new CustomException((int)HttpStatusCode.BadRequest);
                errors.AddError("Home Not Exist", "User is not member of a home");
                errors.Throw();
            }

            if (menu.Date.Kind != DateTimeKind.Utc)
            {
                CustomException errors = new CustomException((int)HttpStatusCode.BadRequest);
                errors.AddError("Date Not Valid", "Date is not valid, please convert to UTC");
                errors.Throw();
            }

            menu.Date = menu.Date.AddHours(-menu.Date.Hour);
            menu.Date = menu.Date.AddMinutes(-menu.Date.Minute);
            menu.Date = menu.Date.AddSeconds(-menu.Date.Second);
            menu.Date = menu.Date.AddMilliseconds(-menu.Date.Millisecond);

            user = await _userRepository.GetByIdAsync(user.Id, true);

            HomeModel home = await _homeRepository.GetByIdAsync(user.Home.Id, true);

            MenuModel tmp = await _menuRepository.GetHomeMenuByDateAsync(home.Id, menu.Date);

            if (tmp != null)
            {
                CustomException errors = new CustomException((int)HttpStatusCode.BadRequest);
                errors.AddError("Date Not Valid", "Date is not valid, that day has already menu");
                errors.Throw();
            }

            mealIds = mealIds.Distinct().ToList();

            if (mealIds.Count == 0)
            {
                CustomException errors = new CustomException((int)HttpStatusCode.BadRequest);
                errors.AddError("Menu Has Not Meal", "There is no meals for this menu");
                errors.Throw();
            }

            menu.Home = home;

            //Finds meals that are not related home
            foreach (var mealId in mealIds)
            {
                MealModel meal = await _mealRepository.GetHomeMealByIdAsync(mealId, true);

                if ((meal == null) || (meal.Home.Id != home.Id))
                {
                    CustomException errors = new CustomException((int)HttpStatusCode.BadRequest);
                    errors.AddError("Meal Not Related Home", "This meal is not related with user home");
                    errors.Throw();
                }
            }

            _menuRepository.Insert(menu);

            //Inserts menu meal to database
            foreach (var mealId in mealIds)
            {
                MealModel meal = await _mealRepository.GetHomeMealByIdAsync(mealId, true);

                MenuMealModel menuMeal = new MenuMealModel(menu, meal);

                _menuMealRepository.Insert(menuMeal);
            }

            //Sends fcm to all users
            foreach (var friend in home.Users)
            {
                FCMModel fcm = new FCMModel(friend.DeviceId, type: "AddMenu");
                fcm.data.Add("Menu", menu);
                fcm.data.Add("MealIds", mealIds);

                await _fcmService.SendFCMAsync(fcm);
            }
        }
Exemplo n.º 16
0
        //User adds expense
        public async Task AddExpenseAsync(UserModel user, ExpenseModel expense, List <int> participants)
        {
            if (user.Position == (int)UserPosition.HasNotHome)
            {
                CustomException errors = new CustomException((int)HttpStatusCode.BadRequest);
                errors.AddError("Home Not Exist", "User is not member of a home");
                errors.Throw();
            }

            if ((expense.EType > (int)ExpenseType.Others) || (expense.EType < 0))
            {
                CustomException errors = new CustomException((int)HttpStatusCode.BadRequest);
                errors.AddError("Expense Type Not Exist", "Expense type number not valid");
                errors.Throw();
            }

            if (expense.Cost <= 0)
            {
                CustomException errors = new CustomException((int)HttpStatusCode.BadRequest);
                errors.AddError("Expense Cost Not Valid", "The expense cost must be bigger than 0");
                errors.Throw();
            }

            participants = participants.Distinct().ToList();

            if (participants.Count == 0)
            {
                CustomException errors = new CustomException((int)HttpStatusCode.BadRequest);
                errors.AddError("Participants Not Exist", "You must add participants for this expense");
                errors.Throw();
            }

            Task <InformationModel> firstNameInfo = _informationRepository.GetInformationByInformationNameAsync("FirstName");
            Task <InformationModel> lastNameInfo  = _informationRepository.GetInformationByInformationNameAsync("LastName");

            user = await _userRepository.GetByIdAsync(user.Id, true);

            HomeModel home = await _homeRepository.GetByIdAsync(user.Home.Id, true);

            //Friend not found
            foreach (var p in participants)
            {
                if (home.Users.SingleOrDefault(u => u.Id == p) == null)
                {
                    CustomException errors = new CustomException((int)HttpStatusCode.BadRequest);
                    errors.AddError("Friendship Not Found", "Friendship not found for lend");
                    errors.Throw();
                }
            }

            expense.LastUpdated = DateTime.UtcNow;
            expense.Home        = home;
            expense.Author      = await _userRepository.GetByIdAsync(user.Id);;

            //Author informations
            UserInformationModel userFirstName = await _userInformationRepository.GetUserInformationByIdAsync(user.Id, (await firstNameInfo).Id);

            UserInformationModel userLastName = await _userInformationRepository.GetUserInformationByIdAsync(user.Id, (await lastNameInfo).Id);

            //Lend
            if (expense.EType == (int)ExpenseType.Lend)
            {
                if (participants.SingleOrDefault(p => p.Equals(user.Id)) != 0)
                {
                    CustomException errors = new CustomException((int)HttpStatusCode.BadRequest);
                    errors.AddError("Lend Error", "You cant lend yourself");
                    errors.Throw();
                }

                ExpenseModel borrowExpense = new ExpenseModel((int)ExpenseType.Borrow,
                                                              expense.Cost / participants.Count,
                                                              expense.Author,
                                                              expense.Home,
                                                              expense.LastUpdated,
                                                              expense.Title,
                                                              expense.Content);

                _expenseRepository.Insert(expense);
                _expenseRepository.Insert(borrowExpense);

                //Borrow for all participants
                foreach (var p in participants)
                {
                    var to = await _userRepository.GetByIdAsync(p);

                    await _homeService.TransferMoneyToFriendAsync(user, to, borrowExpense.Cost);

                    await _userExpenseRepository.InsertAsync(new UserExpenseModel(to, borrowExpense));

                    //Send fcm to other participants
                    FCMModel fcmBorrow = new FCMModel(to.DeviceId, new Dictionary <string, object>());
                    fcmBorrow.notification.Add("title", "Nakit Aktarımı");
                    fcmBorrow.notification.Add("body", String.Format("{0} {1} tarafından {2:c} nakit alındı.",
                                                                     userFirstName.Value,
                                                                     userLastName.Value,
                                                                     borrowExpense.Cost));
                    await _fcmService.SendFCMAsync(fcmBorrow);

                    //Send fcm to other participants
                    fcmBorrow = new FCMModel(to.DeviceId, type: "AddExpense");
                    fcmBorrow.data.Add("Content", borrowExpense);
                    fcmBorrow.data.Add("Author", expense.Author.Username);
                    fcmBorrow.data.Add("Participants", participants);

                    await _fcmService.SendFCMAsync(fcmBorrow);
                }

                Task insertUEL = _userExpenseRepository.InsertAsync(new UserExpenseModel(user, expense));

                //Send fcm to user
                FCMModel fcmLend = new FCMModel(user.DeviceId, type: "AddExpense");
                fcmLend.data.Add("Content", expense);
                fcmLend.data.Add("Author", expense.Author.Username);
                fcmLend.data.Add("Participants", participants);

                await _fcmService.SendFCMAsync(fcmLend);

                await insertUEL;
            }

            else
            {
                expense.Cost = expense.Cost / participants.Count;
                _expenseRepository.Insert(expense);

                foreach (var p in participants)
                {
                    //Paid for friends
                    if (p != user.Id)
                    {
                        var to = await _userRepository.GetByIdAsync(p);

                        await _homeService.TransferMoneyToFriendAsync(user, to, expense.Cost);

                        await _userExpenseRepository.InsertAsync(new UserExpenseModel(to, expense));

                        //Send fcm to other participants
                        FCMModel fcmExpense = new FCMModel(to.DeviceId, new Dictionary <string, object>());
                        fcmExpense.notification.Add("title", String.Format("Yeni Gider : \"{0}\"", expense.Title));
                        fcmExpense.notification.Add("body", String.Format("{0} {1} tarafından {2:c} ödendi.",
                                                                          userFirstName.Value,
                                                                          userLastName.Value,
                                                                          expense.Cost));

                        await _fcmService.SendFCMAsync(fcmExpense);

                        //Send fcm to other participants
                        fcmExpense = new FCMModel(to.DeviceId, type: "AddExpense");

                        fcmExpense.data.Add("Content", expense);
                        fcmExpense.data.Add("Author", expense.Author.Username);
                        fcmExpense.data.Add("Participants", participants);

                        await _fcmService.SendFCMAsync(fcmExpense);
                    }
                    else
                    {
                        Task insertUE = _userExpenseRepository.InsertAsync(new UserExpenseModel(user, expense));

                        //Send fcm to user
                        FCMModel fcmExpense = new FCMModel(user.DeviceId, type: "AddExpense");
                        fcmExpense.data.Add("Content", expense);
                        fcmExpense.data.Add("Author", expense.Author.Username);
                        fcmExpense.data.Add("Participants", participants);

                        await _fcmService.SendFCMAsync(fcmExpense);

                        await insertUE;
                    }
                }
                //Expense author is not exist in participants
                if (participants.SingleOrDefault(pr => pr == user.Id) == 0)
                {
                    //Send fcm to user
                    FCMModel fcmExpense = new FCMModel(user.DeviceId, type: "AddExpense");
                    fcmExpense.data.Add("Content", expense);
                    fcmExpense.data.Add("Author", expense.Author.Username);
                    fcmExpense.data.Add("Participants", participants);

                    await _fcmService.SendFCMAsync(fcmExpense);
                }
            }
        }
Exemplo n.º 17
0
        //User request to quit home
        public async Task LeaveHomeAsync(UserModel user, int newAdminId)
        {
            if (user.Position == (int)UserPosition.HasNotHome)
            {
                CustomException errors = new CustomException((int)HttpStatusCode.BadRequest);
                errors.AddError("Home Not Exist", "User is not member of a home");
                errors.Throw();
            }

            Task <InformationModel> firstNameInfo = _informationRepository.GetInformationByInformationNameAsync("FirstName");
            Task <InformationModel> lastNameInfo  = _informationRepository.GetInformationByInformationNameAsync("LastName");

            user = await _userRepository.GetByIdAsync(user.Id, true);

            HomeModel home = await _homeRepository.GetByIdAsync(user.Home.Id, true);

            UserInformationModel userFirstName = await _userInformationRepository.GetUserInformationByIdAsync(user.Id, (await firstNameInfo).Id);

            UserInformationModel userLastName = await _userInformationRepository.GetUserInformationByIdAsync(user.Id, (await lastNameInfo).Id);

            List <UserExpenseModel> userExpenses = await _userExpenseRepository.GetAllUserExpenseByUserIdAsync(user.Id);

            foreach (var ue in userExpenses)
            {
                _userExpenseRepository.Delete(ue);
            }

            if (home.Users.Count != 1)
            {
                if (user.Position == (int)UserPosition.Admin)
                {
                    UserModel newAdmin = await _userRepository.GetByIdAsync(newAdminId);

                    if (newAdmin == null || newAdmin.Home.Id != user.Home.Id)
                    {
                        CustomException errors = new CustomException((int)HttpStatusCode.BadRequest);
                        errors.AddError("Friendship Not Found", "Friendship not found for admin assignment");
                        errors.Throw();
                    }
                    newAdmin.Position = (int)UserPosition.Admin;
                    home.Admin        = newAdmin;
                }

                home.Users.Remove(user);
                user.Home     = null;
                user.Position = (int)UserPosition.HasNotHome;

                _homeRepository.Update(home);
                _userRepository.Update(user);

                //Home friends notification
                foreach (var u in home.Users)
                {
                    FriendshipModel friendship = await _friendshipRepository.GetFriendshipByIdAsync(user.Id, u.Id);

                    FCMModel fcm = new FCMModel(u.DeviceId, new Dictionary <string, object>());
                    fcm.notification.Add("title", "Evden Ayrılma");

                    if (friendship.User1.Id == user.Id)
                    {
                        if (friendship.Debt > 0)
                        {
                            fcm.notification.Add("body", String.Format("{0} {1} evden ayrılıyor. Alacağınız : {2:c}", userFirstName.Value,
                                                                       userLastName.Value,
                                                                       friendship.Debt));
                        }
                        else if (friendship.Debt == 0)
                        {
                            fcm.notification.Add("body", String.Format("{0} {1} evden ayrılıyor. Borcunuz veya alacağınız bulunmamaktadır.", userFirstName.Value,
                                                                       userLastName.Value));
                        }
                        else
                        {
                            fcm.notification.Add("body", String.Format("{0} {1} evden ayrılıyor. Borcunuz : {2:c}", userFirstName.Value,
                                                                       userLastName.Value,
                                                                       -friendship.Debt));
                        }
                    }
                    else
                    {
                        if (friendship.Debt > 0)
                        {
                            fcm.notification.Add("body", String.Format("{0} {1} evden ayrılıyor. Borcunuz : {2:c}", userFirstName.Value,
                                                                       userLastName.Value,
                                                                       friendship.Debt));
                        }
                        else if (friendship.Debt == 0)
                        {
                            fcm.notification.Add("body", String.Format("{0} {1} evden ayrılıyor. Borcunuz veya alacağınız bulunmamaktadır.", userFirstName.Value,
                                                                       userLastName.Value));
                        }
                        else
                        {
                            fcm.notification.Add("body", String.Format("{0} {1} evden ayrılıyor. Alacağınız : {2:c}", userFirstName.Value,
                                                                       userLastName.Value,
                                                                       -friendship.Debt));
                        }
                    }

                    await _fcmService.SendFCMAsync(fcm);

                    fcm = new FCMModel(u.DeviceId, type: "LeaveHome");

                    fcm.data.Add("LeaverId", user.Id);
                    await _fcmService.SendFCMAsync(fcm);

                    _friendshipRepository.Delete(friendship);
                }
            }
            else
            {
                ShoppingListModel shoppingList = await _shoppingListRepository.GetShoppingListByHomeIdAsync(user.Home.Id);

                List <NotepadModel> notepad = await _notepadRepository.GetAllNoteByHomeIdAsync(user.Home.Id);

                List <ExpenseModel> expenses = await _expenseRepository.GetAllExpensesByHomeIdAsync(user.Home.Id);

                _shoppingListRepository.Delete(shoppingList);

                foreach (var note in notepad)
                {
                    _notepadRepository.Delete(note);
                }

                foreach (var expense in expenses)
                {
                    _expenseRepository.Delete(expense);
                }

                user.Home     = null;
                user.Position = (int)UserPosition.HasNotHome;

                _userRepository.Update(user);
                _homeRepository.Delete(home);
            }
        }
Exemplo n.º 18
0
        //User gives money to his/her friend
        public async Task TransferMoneyToFriendAsync(UserModel from, UserModel to, double givenMoney)
        {
            if (to == null)
            {
                CustomException errors = new CustomException((int)HttpStatusCode.BadRequest);
                errors.AddError("Friend Not Found", "Friend not found for lend");
                errors.Throw();
            }

            if (from.Position == (int)UserPosition.HasNotHome || to.Position == (int)UserPosition.HasNotHome)
            {
                CustomException errors = new CustomException((int)HttpStatusCode.BadRequest);
                errors.AddError("Home Not Exist", "User is not member of a home");
                errors.Throw();
            }

            FriendshipModel friendship = await _friendshipRepository.GetFriendshipByIdAsync(from.Id, to.Id);

            if (friendship == null)
            {
                CustomException errors = new CustomException((int)HttpStatusCode.BadRequest);
                errors.AddError("Friendship Not Found", "Friendship not found for lend");
                errors.Throw();
            }

            if (friendship.User1.Id == from.Id)
            {
                friendship.Debt -= givenMoney;
                Task update = _friendshipRepository.UpdateAsync(friendship);

                FCMModel fcmFrom = new FCMModel(from.DeviceId, type: "GiveMoney");
                fcmFrom.data.Add("ToId", to.Id);
                fcmFrom.data.Add("NewDebt", friendship.Debt);
                Task sendFCMFrom = _fcmService.SendFCMAsync(fcmFrom);

                FCMModel fcmTo = new FCMModel(to.DeviceId, type: "TakeMoney");
                fcmTo.data.Add("FromId", from.Id);
                fcmTo.data.Add("NewDebt", -friendship.Debt);

                await _fcmService.SendFCMAsync(fcmTo);

                await sendFCMFrom;
                await update;
            }
            else
            {
                friendship.Debt += givenMoney;
                Task update = _friendshipRepository.UpdateAsync(friendship);

                FCMModel fcmFrom = new FCMModel(from.DeviceId, type: "GiveMoney");
                fcmFrom.data.Add("ToId", to.Id);
                fcmFrom.data.Add("NewDebt", -friendship.Debt);
                Task sendFCMFrom = _fcmService.SendFCMAsync(fcmFrom);

                FCMModel fcmTo = new FCMModel(to.DeviceId, type: "TakeMoney");
                fcmTo.data.Add("FromId", from.Id);
                fcmTo.data.Add("NewDebt", friendship.Debt);

                await _fcmService.SendFCMAsync(fcmTo);

                await sendFCMFrom;
                await update;
            }
        }
Exemplo n.º 19
0
        //User updates expense
        public async Task UpdateExpenseAsync(UserModel user, ExpenseModel expense, List <int> participants)
        {
            if (user.Position == (int)UserPosition.HasNotHome)
            {
                CustomException errors = new CustomException((int)HttpStatusCode.BadRequest);
                errors.AddError("Home Not Exist", "User is not member of a home");
                errors.Throw();
            }

            if ((expense.EType > (int)ExpenseType.Others) || (expense.EType < 0))
            {
                CustomException errors = new CustomException((int)HttpStatusCode.BadRequest);
                errors.AddError("Expense Type Not Exist", "Expense type number not valid");
                errors.Throw();
            }

            if (expense.Cost <= 0)
            {
                CustomException errors = new CustomException((int)HttpStatusCode.BadRequest);
                errors.AddError("Expense Cost Not Valid", "The expense cost must be bigger than 0");
                errors.Throw();
            }

            participants = participants.Distinct().ToList();

            if (participants.Count == 0)
            {
                CustomException errors = new CustomException((int)HttpStatusCode.BadRequest);
                errors.AddError("Participants Not Exist", "You must add participants for this expense");
                errors.Throw();
            }

            Task <InformationModel> firstNameInfo = _informationRepository.GetInformationByInformationNameAsync("FirstName");
            Task <InformationModel> lastNameInfo  = _informationRepository.GetInformationByInformationNameAsync("LastName");

            user = await _userRepository.GetByIdAsync(user.Id, true);

            HomeModel home = await _homeRepository.GetByIdAsync(user.Home.Id, true);

            //Friend not found
            foreach (var p in participants)
            {
                if (home.Users.SingleOrDefault(u => u.Id == p) == null)
                {
                    CustomException errors = new CustomException((int)HttpStatusCode.BadRequest);
                    errors.AddError("Friendship Not Found", "Friendship not found for lend");
                    errors.Throw();
                }
            }

            //Control old expense
            ExpenseModel oldExpense = await _expenseRepository.GetExpenseByIdAsync(expense.Id);

            if (oldExpense == null)
            {
                CustomException errors = new CustomException((int)HttpStatusCode.BadRequest);
                errors.AddError("Expense Not Found", "Expense not found, please check the expense id");
                errors.Throw();
            }

            if (!oldExpense.Author.Equals(user))
            {
                CustomException errors = new CustomException((int)HttpStatusCode.BadRequest);
                errors.AddError("Authorization Error", "User is not author of this expense and can not delete");
                errors.Throw();
            }

            if (oldExpense.EType != expense.EType)
            {
                CustomException errors = new CustomException((int)HttpStatusCode.BadRequest);
                errors.AddError("Expense Type Error", "Old and new expense types are not matched");
                errors.Throw();
            }

            //Author informations
            UserInformationModel userFirstName = await _userInformationRepository.GetUserInformationByIdAsync(user.Id, (await firstNameInfo).Id);

            UserInformationModel userLastName = await _userInformationRepository.GetUserInformationByIdAsync(user.Id, (await lastNameInfo).Id);

            expense.LastUpdated = DateTime.UtcNow;

            if (expense.EType == (int)ExpenseType.Lend)
            {
                if (participants.SingleOrDefault(p => p.Equals(user.Id)) != 0)
                {
                    CustomException errors = new CustomException((int)HttpStatusCode.BadRequest);
                    errors.AddError("Lend Error", "You cant lend yourself");
                    errors.Throw();
                }

                ExpenseModel oldBorrowExpense = await _expenseRepository.GetBorrowExpenseAfterLendExpenseAsync(user.Id, oldExpense.Id);

                List <UserExpenseModel> oldParticipantsUE = await _userExpenseRepository.GetAllUserExpenseByExpenseIdAsync(oldBorrowExpense.Id, true);

                ExpenseModel newBorrowExpense = new ExpenseModel((int)ExpenseType.Borrow,
                                                                 expense.Cost / participants.Count,
                                                                 expense.Author,
                                                                 expense.Home,
                                                                 expense.LastUpdated,
                                                                 expense.Title,
                                                                 expense.Content);

                foreach (var p in oldParticipantsUE)
                {
                    //Old participant is not included in updated expense
                    if (participants.SingleOrDefault(pr => pr == p.User.Id) == 0)
                    {
                        _userExpenseRepository.Delete(p);
                        await _homeService.TransferMoneyToFriendAsync(user, p.User, -oldBorrowExpense.Cost);

                        //Send fcm to participant
                        FCMModel fcmBorrow = new FCMModel(p.User.DeviceId, new Dictionary <string, object>());
                        fcmBorrow.notification.Add("title", String.Format("Gider Iptal Edildi: \"{0}\"", oldBorrowExpense.Title));
                        fcmBorrow.notification.Add("body", String.Format("{0} {1} tarafından verilen {2:c} geri alındı.",
                                                                         userFirstName.Value,
                                                                         userLastName.Value,
                                                                         oldBorrowExpense.Cost));


                        await _fcmService.SendFCMAsync(fcmBorrow);


                        //Send fcm to participant
                        fcmBorrow = new FCMModel(p.User.DeviceId, type: "DeleteExpense");

                        fcmBorrow.data.Add("ExpenseId", oldBorrowExpense.Id);
                        await _fcmService.SendFCMAsync(fcmBorrow);
                    }
                    //Old participant is included in updated expense
                    else
                    {
                        double difference = newBorrowExpense.Cost - oldBorrowExpense.Cost;
                        await _homeService.TransferMoneyToFriendAsync(user, p.User, difference);

                        //Send fcm to other participants
                        FCMModel fcmBorrow = new FCMModel(p.User.DeviceId, new Dictionary <string, object>());
                        fcmBorrow.notification.Add("title", String.Format("Gider Güncellemesi : \"{0}\"", expense.Title));
                        fcmBorrow.notification.Add("body", String.Format("{0} {1} tarafından eklenen gider güncellendi.",
                                                                         userFirstName.Value,
                                                                         userLastName.Value));

                        await _fcmService.SendFCMAsync(fcmBorrow);

                        //Send fcm to other participants
                        fcmBorrow = new FCMModel(p.User.DeviceId, type: "UpdateExpense");

                        fcmBorrow.data.Add("Content", newBorrowExpense);
                        fcmBorrow.data.Add("Author", oldExpense.Author.Username);
                        fcmBorrow.data.Add("Participants", participants);

                        await _fcmService.SendFCMAsync(fcmBorrow);
                    }
                }

                oldBorrowExpense.Cost        = newBorrowExpense.Cost;
                oldBorrowExpense.LastUpdated = newBorrowExpense.LastUpdated;
                oldBorrowExpense.Title       = newBorrowExpense.Title;
                oldBorrowExpense.Content     = newBorrowExpense.Content;

                _expenseRepository.Update(oldBorrowExpense);

                oldExpense.Cost        = expense.Cost;
                oldExpense.LastUpdated = expense.LastUpdated;
                oldExpense.Title       = expense.Title;
                oldExpense.Content     = expense.Content;

                _expenseRepository.Update(oldExpense);

                //Adds new participants to database
                List <UserExpenseModel> newParticipantsUE = await _userExpenseRepository.GetAllUserExpenseByExpenseIdAsync(oldBorrowExpense.Id, true);

                foreach (var p in participants)
                {
                    if (newParticipantsUE.SingleOrDefault(pr => pr.User.Id == p) == null)
                    {
                        var to = await _userRepository.GetByIdAsync(p);

                        await _homeService.TransferMoneyToFriendAsync(user, to, oldBorrowExpense.Cost);

                        await _userExpenseRepository.InsertAsync(new UserExpenseModel(to, oldBorrowExpense));

                        //Send fcm to other participants
                        FCMModel fcmBorrow = new FCMModel(to.DeviceId, new Dictionary <string, object>());
                        fcmBorrow.notification.Add("title", "Nakit Aktarımı");
                        fcmBorrow.notification.Add("body", String.Format("{0} {1} tarafından {2:c} nakit alındı.",
                                                                         userFirstName.Value,
                                                                         userLastName.Value,
                                                                         oldBorrowExpense.Cost));

                        await _fcmService.SendFCMAsync(fcmBorrow);

                        //Send fcm to other participants
                        fcmBorrow = new FCMModel(to.DeviceId, type: "AddExpense");

                        fcmBorrow.data.Add("Content", oldBorrowExpense);
                        fcmBorrow.data.Add("Author", oldBorrowExpense.Author.Username);
                        fcmBorrow.data.Add("Participants", participants);

                        await _fcmService.SendFCMAsync(fcmBorrow);
                    }

                    //Send fcm to other participants
                    FCMModel fcmLend = new FCMModel(user.DeviceId, type: "UpdateExpense");

                    fcmLend.data.Add("Content", oldBorrowExpense);
                    fcmLend.data.Add("Author", oldExpense.Author.Username);
                    fcmLend.data.Add("Participants", participants);

                    await _fcmService.SendFCMAsync(fcmLend);
                }
            }
            else
            {
                List <UserExpenseModel> oldParticipants = await _userExpenseRepository.GetAllUserExpenseByExpenseIdAsync(expense.Id, true);

                expense.Cost = expense.Cost / participants.Count;

                foreach (var p in oldParticipants)
                {
                    //Old participant is not included in updated expense
                    if (participants.SingleOrDefault(pr => pr == p.User.Id) == 0)
                    {
                        _userExpenseRepository.Delete(p);

                        //Other participants
                        if (p.User.Id != user.Id)
                        {
                            await _homeService.TransferMoneyToFriendAsync(user, p.User, -oldExpense.Cost);

                            //Send fcm to participant
                            FCMModel fcmExpense = new FCMModel(p.User.DeviceId, new Dictionary <string, object>());
                            fcmExpense.notification.Add("title", String.Format("Gider Iptal Edildi: \"{0}\"", oldExpense.Title));
                            fcmExpense.notification.Add("body", String.Format("{0} {1} tarafından {2:c} iade edildi.",
                                                                              userFirstName.Value,
                                                                              userLastName.Value,
                                                                              oldExpense.Cost));

                            await _fcmService.SendFCMAsync(fcmExpense);

                            //Send fcm to participant
                            fcmExpense = new FCMModel(p.User.DeviceId, type: "DeleteExpense");

                            fcmExpense.data.Add("ExpenseId", oldExpense.Id);
                            await _fcmService.SendFCMAsync(fcmExpense);
                        }
                    }
                    //Old participant is included in updated expense
                    else
                    {
                        if (p.User.Id != user.Id)
                        {
                            double difference = expense.Cost - oldExpense.Cost;
                            await _homeService.TransferMoneyToFriendAsync(user, p.User, difference);

                            //Send fcm to other participants
                            FCMModel fcmExpense = new FCMModel(p.User.DeviceId, new Dictionary <string, object>());
                            fcmExpense.notification.Add("title", String.Format("Gider Güncellemesi : \"{0}\"", expense.Title));
                            fcmExpense.notification.Add("body", String.Format("{0} {1} tarafından eklenen gider güncellendi.",
                                                                              userFirstName.Value,
                                                                              userLastName.Value));

                            await _fcmService.SendFCMAsync(fcmExpense);

                            //Send fcm to other participants
                            fcmExpense = new FCMModel(p.User.DeviceId, type: "UpdateExpense");

                            fcmExpense.data.Add("Content", expense);
                            fcmExpense.data.Add("Author", oldExpense.Author.Username);
                            fcmExpense.data.Add("Participants", participants);

                            await _fcmService.SendFCMAsync(fcmExpense);
                        }
                        else
                        {
                            FCMModel fcmExpense = new FCMModel(p.User.DeviceId, new Dictionary <string, object>(), "UpdateExpense");
                            fcmExpense.data.Add("Content", expense);
                            fcmExpense.data.Add("Author", oldExpense.Author.Username);
                            fcmExpense.data.Add("Participants", participants);

                            await _fcmService.SendFCMAsync(fcmExpense);
                        }
                    }
                }

                oldExpense.Cost        = expense.Cost;
                oldExpense.LastUpdated = expense.LastUpdated;
                oldExpense.Title       = expense.Title;
                oldExpense.Content     = expense.Content;

                _expenseRepository.Update(oldExpense);

                //Adds new participants to database
                List <UserExpenseModel> newParticipantsUE = await _userExpenseRepository.GetAllUserExpenseByExpenseIdAsync(oldExpense.Id, true);

                foreach (var p in participants)
                {
                    if (newParticipantsUE.SingleOrDefault(pr => pr.User.Id == p) == null)
                    {
                        if (p != user.Id)
                        {
                            var to = await _userRepository.GetByIdAsync(p);

                            await _homeService.TransferMoneyToFriendAsync(user, to, oldExpense.Cost);

                            await _userExpenseRepository.InsertAsync(new UserExpenseModel(to, oldExpense));

                            //Send fcm to other participants
                            FCMModel fcmExpense = new FCMModel(to.DeviceId, new Dictionary <string, object>());
                            fcmExpense.notification.Add("title", String.Format("Yeni Gider : \"{0}\"", oldExpense.Title));
                            fcmExpense.notification.Add("body", String.Format("{0} {1} tarafından {2:c} ödendi.",
                                                                              userFirstName.Value,
                                                                              userLastName.Value,
                                                                              oldExpense.Cost));

                            await _fcmService.SendFCMAsync(fcmExpense);

                            //Send fcm to other participants
                            fcmExpense = new FCMModel(to.DeviceId, type: "AddExpense");

                            fcmExpense.data.Add("Content", oldExpense);
                            fcmExpense.data.Add("Author", oldExpense.Author.Username);
                            fcmExpense.data.Add("Participants", participants);

                            await _fcmService.SendFCMAsync(fcmExpense);
                        }
                        else
                        {
                            Task insertUE = _userExpenseRepository.InsertAsync(new UserExpenseModel(user, oldExpense));

                            //Send fcm to user
                            FCMModel fcmExpense = new FCMModel(user.DeviceId, new Dictionary <string, object>(), "UpdateExpense");
                            fcmExpense.data.Add("Content", oldExpense);
                            fcmExpense.data.Add("Author", oldExpense.Author.Username);
                            fcmExpense.data.Add("Participants", participants);

                            await _fcmService.SendFCMAsync(fcmExpense);

                            await insertUE;
                        }
                    }
                }
                //Expense author is not exist in participants
                if (participants.SingleOrDefault(pr => pr.Equals(user.Id)) == 0)
                {
                    FCMModel fcmExpense = new FCMModel(user.DeviceId, new Dictionary <string, object>(), "UpdateExpense");
                    fcmExpense.data.Add("Content", expense);
                    fcmExpense.data.Add("Author", oldExpense.Author.Username);
                    fcmExpense.data.Add("Participants", participants);

                    await _fcmService.SendFCMAsync(fcmExpense);
                }
            }
        }
Exemplo n.º 20
0
        //Admin accepts or rejects user's request
        public async Task JoinHomeAcceptAsync(UserModel user, int requesterId, bool isAccepted)
        {
            Task <UserModel>        getAdmin      = _userRepository.GetByIdAsync(user.Id, true);
            Task <InformationModel> firstNameInfo = _informationRepository.GetInformationByInformationNameAsync("FirstName");
            Task <InformationModel> lastNameInfo  = _informationRepository.GetInformationByInformationNameAsync("LastName");

            if (user.Position != (int)UserPosition.Admin)
            {
                CustomException errors = new CustomException((int)HttpStatusCode.BadRequest);
                errors.AddError("Authorisation Constraint", "You are not authorized for this request, you must be administrator of home");
                errors.Throw();
            }

            UserModel requester = await _userRepository.GetByIdAsync(requesterId);

            if (requester == null)
            {
                CustomException errors = new CustomException((int)HttpStatusCode.BadRequest);
                errors.AddError("Invalid User Id", "User not exist");
                errors.Throw();
            }

            if (requester.Position != (int)UserPosition.HasNotHome)
            {
                CustomException errors = new CustomException((int)HttpStatusCode.BadRequest);
                errors.AddError("Requester Has Home", "Requester has already home");
                errors.Throw();
            }

            user = await getAdmin;

            if (isAccepted == true)
            {
                requester.Position = (int)UserPosition.HasHome;

                UserInformationModel requesterFirstName = await _userInformationRepository.GetUserInformationByIdAsync(requester.Id, (await firstNameInfo).Id);

                UserInformationModel requesterLastName = await _userInformationRepository.GetUserInformationByIdAsync(requester.Id, (await lastNameInfo).Id);

                HomeModel home = await _homeRepository.GetByIdAsync(user.Home.Id, true);

                FCMModel fcmRequester = new FCMModel(requester.DeviceId, new Dictionary <string, object>());

                fcmRequester.notification.Add("title", "Eve Katılma İsteği");
                fcmRequester.notification.Add("body", "Eve katılma isteğiniz ev yöneticisi tarafından kabul edildi.");

                await _fcmService.SendFCMAsync(fcmRequester);

                List <UserBaseModel> friendsBaseModels  = new List <UserBaseModel>();
                UserBaseModel        requesterBaseModel = new UserBaseModel(requester.Id, requester.Username, requester.Position, requesterFirstName.Value, requesterLastName.Value, 0);

                foreach (var friend in home.Users)
                {
                    FriendshipModel friendship       = new FriendshipModel(requester, friend, 0);
                    Task            insertFriendship = _friendshipRepository.InsertAsync(friendship);

                    //Sends notification to all friends
                    FCMModel fcmFriend = new FCMModel(friend.DeviceId, new Dictionary <string, object>());

                    fcmFriend.notification.Add("title", "Yeni Ev Arkadaşı");
                    fcmFriend.notification.Add("body", String.Format("{0} {1}({2}) evinize katıldı.", requesterFirstName.Value, requesterLastName.Value, requester.Username));

                    await _fcmService.SendFCMAsync(fcmFriend);

                    //Sends notification to all friends
                    fcmFriend = new FCMModel(friend.DeviceId, type: "NewFriend");
                    fcmFriend.data.Add("Friend", requesterBaseModel);

                    await _fcmService.SendFCMAsync(fcmFriend);

                    //Sends all friends to requester
                    UserInformationModel friendFirstName = await _userInformationRepository.GetUserInformationByIdAsync(friend.Id, (await firstNameInfo).Id);

                    UserInformationModel friendLastName = await _userInformationRepository.GetUserInformationByIdAsync(friend.Id, (await lastNameInfo).Id);

                    friendsBaseModels.Add(new UserBaseModel(friend.Id, friend.Username, friend.Position, friendFirstName.Value, friendLastName.Value, 0));

                    await insertFriendship;
                }

                home.Users.Add(requester);
                _homeRepository.Update(home);

                requester.Home = home;
                _userRepository.Update(requester);

                fcmRequester = new FCMModel(requester.DeviceId, type: "AllFriends");

                fcmRequester.data.Add("NumberOfFriends", home.Users.Count - 1);
                fcmRequester.data.Add("Friends", friendsBaseModels);
                await _fcmService.SendFCMAsync(fcmRequester);
            }
        }
Exemplo n.º 21
0
        //Admin updates a housework assign
        public async Task UpdateHouseworkAsync(UserModel user, HouseworkModel housework, int friendId)
        {
            if (user.Position != (int)UserPosition.Admin)
            {
                CustomException errors = new CustomException((int)HttpStatusCode.BadRequest);
                errors.AddError("Authorization Error", "You are not authorized for housework assignment");
                errors.Throw();
            }

            if (housework.Day < 1 || housework.Day > 31)
            {
                CustomException errors = new CustomException((int)HttpStatusCode.BadRequest);
                errors.AddError("Housework Day Error", "You can assign a day only  between 1-31");
                errors.Throw();
            }

            HouseworkModel oldHousework = await _houseworkRepository.GetHouseworkByIdAsync(housework.Id);

            user = await _userRepository.GetByIdAsync(user.Id, true);

            HomeModel home = await _homeRepository.GetByIdAsync(user.Home.Id, true);

            UserModel newFriend = await _userRepository.GetByIdAsync(friendId, true);

            if (oldHousework == null)
            {
                CustomException errors = new CustomException((int)HttpStatusCode.BadRequest);
                errors.AddError("Housework Not Found", "Housework not found for delete");
                errors.Throw();
            }

            if (oldHousework.Home != user.Home)
            {
                CustomException errors = new CustomException((int)HttpStatusCode.BadRequest);
                errors.AddError("Housework Not Belongs Home", "Housework not belongs for this home");
                errors.Throw();
            }

            if ((newFriend == null) || (newFriend.Home != user.Home))
            {
                CustomException errors = new CustomException((int)HttpStatusCode.BadRequest);
                errors.AddError("Friendship Not Found", "Friendship not found for assignment");
                errors.Throw();
            }

            oldHousework.Day  = housework.Day;
            oldHousework.User = newFriend;
            oldHousework.Work = housework.Work;

            _houseworkRepository.Update(oldHousework);

            //Sends fcm to assigned friend
            FCMModel fcmFriend = new FCMModel(housework.User.DeviceId, new Dictionary <string, object>());

            fcmFriend.notification.Add("title", "Ev İşi Güncellendi");
            fcmFriend.notification.Add("body", "Yapmanız gereken bir ev işi güncellendi.");

            await _fcmService.SendFCMAsync(fcmFriend);

            //Sends fcm to all friends
            foreach (var f in home.Users)
            {
                FCMModel fcm = new FCMModel(f.DeviceId, type: "UpdateHousework");
                fcm.data.Add("Housework", housework);
                fcm.data.Add("FriendId", friendId);

                await _fcmService.SendFCMAsync(fcm);
            }
        }
Exemplo n.º 22
0
        //User accepts or rejects admin's request
        public async Task InviteHomeAcceptAsync(UserModel user, int invitedHomeId, bool isAccepted)
        {
            Task <InformationModel> firstNameInfo = _informationRepository.GetInformationByInformationNameAsync("FirstName");
            Task <InformationModel> lastNameInfo  = _informationRepository.GetInformationByInformationNameAsync("LastName");

            if (user.Position != (int)UserPosition.HasNotHome)
            {
                CustomException errors = new CustomException((int)HttpStatusCode.BadRequest);
                errors.AddError("User Has Home", "User can not accept invite requests while already has home");
                errors.Throw();
            }

            HomeModel home = await _homeRepository.GetByIdAsync(invitedHomeId, true);

            if (home == null)
            {
                CustomException errors = new CustomException((int)HttpStatusCode.BadRequest);
                errors.AddError("Invalid Home Id", "Home not exist");
                errors.Throw();
            }

            if (isAccepted == true)
            {
                user.Position = (int)UserPosition.HasHome;

                UserInformationModel userFirstName = await _userInformationRepository.GetUserInformationByIdAsync(user.Id, (await firstNameInfo).Id);

                UserInformationModel userLastName = await _userInformationRepository.GetUserInformationByIdAsync(user.Id, (await lastNameInfo).Id);

                List <UserBaseModel> friendsBaseModels = new List <UserBaseModel>();
                UserBaseModel        userBaseModel     = new UserBaseModel(user.Id, user.Username, user.Position, userFirstName.Value, userLastName.Value, 0);

                FCMModel fcmUser = new FCMModel(user.DeviceId, type: "AllFriends");

                foreach (var friend in home.Users)
                {
                    FriendshipModel friendship       = new FriendshipModel(user, friend, 0);
                    Task            insertFriendship = _friendshipRepository.InsertAsync(friendship);

                    //Sends notification to all friends
                    FCMModel fcmFriend = new FCMModel(friend.DeviceId, new Dictionary <string, object>());

                    fcmFriend.notification.Add("title", "Yeni Ev Arkadaşı");
                    fcmFriend.notification.Add("body", String.Format("{0} {1}({2}) evinize katıldı", userFirstName.Value, userLastName.Value, user.Username));

                    await _fcmService.SendFCMAsync(fcmFriend);

                    //Sends notification to all friends
                    fcmFriend = new FCMModel(friend.DeviceId, new Dictionary <string, object>(), "NewFriend");
                    fcmFriend.data.Add("Friend", userBaseModel);

                    await _fcmService.SendFCMAsync(fcmFriend);

                    //Sends all friends to requester
                    UserInformationModel friendFirstName = await _userInformationRepository.GetUserInformationByIdAsync(friend.Id, (await firstNameInfo).Id);

                    UserInformationModel friendLastName = await _userInformationRepository.GetUserInformationByIdAsync(friend.Id, (await lastNameInfo).Id);

                    friendsBaseModels.Add(new UserBaseModel(friend.Id, friend.Username, friend.Position, friendFirstName.Value, friendLastName.Value, 0));

                    await insertFriendship;
                }

                home.Users.Add(user);
                _homeRepository.Update(home);

                user.Home = home;
                _userRepository.Update(user);

                fcmUser.data.Add("NumberOfFriends", home.Users.Count - 1);
                fcmUser.data.Add("Friends", friendsBaseModels);
                await _fcmService.SendFCMAsync(fcmUser);
            }
        }
Exemplo n.º 23
0
        //User deletes expense
        public async Task DeleteExpenseAsync(UserModel user, int expenseId)
        {
            if (user.Position == (int)UserPosition.HasNotHome)
            {
                CustomException errors = new CustomException((int)HttpStatusCode.BadRequest);
                errors.AddError("Home Not Exist", "User is not member of a home");
                errors.Throw();
            }

            Task <InformationModel> firstNameInfo = _informationRepository.GetInformationByInformationNameAsync("FirstName");
            Task <InformationModel> lastNameInfo  = _informationRepository.GetInformationByInformationNameAsync("LastName");

            user = await _userRepository.GetByIdAsync(user.Id, true);

            HomeModel home = await _homeRepository.GetByIdAsync(user.Home.Id, true);

            ExpenseModel expense = await _expenseRepository.GetExpenseByIdAsync(expenseId);

            if (expense == null)
            {
                CustomException errors = new CustomException((int)HttpStatusCode.BadRequest);
                errors.AddError("Expense Not Found", "Expense not found, please check the expense id");
                errors.Throw();
            }

            if (!expense.Author.Equals(user))
            {
                CustomException errors = new CustomException((int)HttpStatusCode.BadRequest);
                errors.AddError("Authorization Error", "User is not author of this expense and can not delete");
                errors.Throw();
            }

            if (expense.EType == (int)ExpenseType.Borrow)
            {
                CustomException errors = new CustomException((int)HttpStatusCode.BadRequest);
                errors.AddError("Authorization Error", "User can not delete a borrow expense, please contact with borrower");
                errors.Throw();
            }

            //Author informations
            UserInformationModel userFirstName = await _userInformationRepository.GetUserInformationByIdAsync(user.Id, (await firstNameInfo).Id);

            UserInformationModel userLastName = await _userInformationRepository.GetUserInformationByIdAsync(user.Id, (await lastNameInfo).Id);

            if (expense.EType == (int)ExpenseType.Lend)
            {
                ExpenseModel borrowExpense = await _expenseRepository.GetBorrowExpenseAfterLendExpenseAsync(user.Id, expense.Id);

                List <UserExpenseModel> participantsUE = await _userExpenseRepository.GetAllUserExpenseByExpenseIdAsync(borrowExpense.Id, true);

                foreach (var p in participantsUE)
                {
                    _userExpenseRepository.Delete(p);

                    await _homeService.TransferMoneyToFriendAsync(user, p.User, -borrowExpense.Cost);

                    //Send fcm to other participants
                    FCMModel fcmBorrow = new FCMModel(p.User.DeviceId, new Dictionary <string, object>());
                    fcmBorrow.notification.Add("title", String.Format("Nakit Aktarımı Iptal Edildi: \"{0}\"", borrowExpense.Title));
                    fcmBorrow.notification.Add("body", String.Format("{0} {1} tarafından verilen {2:c} geri alındı.",
                                                                     userFirstName.Value,
                                                                     userLastName.Value,
                                                                     borrowExpense.Cost));

                    await _fcmService.SendFCMAsync(fcmBorrow);

                    //Send fcm to other participants
                    fcmBorrow = new FCMModel(p.User.DeviceId, type: "DeleteExpense");

                    fcmBorrow.data.Add("ExpenseId", borrowExpense.Id);

                    await _fcmService.SendFCMAsync(fcmBorrow);
                }

                _expenseRepository.Delete(borrowExpense);

                //Send fcm to user
                FCMModel fcmLend = new FCMModel(user.DeviceId, type: "DeleteExpense");
                fcmLend.data.Add("ExpenseId", expense.Id);

                await _fcmService.SendFCMAsync(fcmLend);

                List <UserExpenseModel> lendUE = await _userExpenseRepository.GetAllUserExpenseByExpenseIdAsync(expense.Id, true);

                _userExpenseRepository.Delete(lendUE[0]);

                _expenseRepository.Delete(expense);
            }
            else
            {
                List <UserExpenseModel> participants = await _userExpenseRepository.GetAllUserExpenseByExpenseIdAsync(expense.Id, true);

                foreach (var p in participants)
                {
                    _userExpenseRepository.Delete(p);

                    //Refund to friends
                    if (p.User.Id != user.Id)
                    {
                        await _homeService.TransferMoneyToFriendAsync(user, p.User, -expense.Cost);

                        //Send fcm to other participants
                        FCMModel fcmExpense = new FCMModel(p.User.DeviceId, new Dictionary <string, object>());
                        fcmExpense.notification.Add("title", String.Format("Gider Iptal Edildi: \"{0}\"", expense.Title));
                        fcmExpense.notification.Add("body", String.Format("{0} {1} tarafından {2:c} iade edildi.",
                                                                          userFirstName.Value,
                                                                          userLastName.Value,
                                                                          expense.Cost));

                        await _fcmService.SendFCMAsync(fcmExpense);

                        //Send fcm to other participants
                        fcmExpense = new FCMModel(p.User.DeviceId, type: "DeleteExpense");
                        fcmExpense.data.Add("ExpenseId", expense.Id);

                        await _fcmService.SendFCMAsync(fcmExpense);
                    }
                    else
                    {
                        //Send fcm to user
                        FCMModel fcmExpense = new FCMModel(user.DeviceId, type: "DeleteExpense");
                        fcmExpense.data.Add("ExpenseId", expense.Id);

                        await _fcmService.SendFCMAsync(fcmExpense);
                    }
                }
                //Expense author is not exist in participants
                if (participants.SingleOrDefault(pr => pr.User.Id == user.Id) == null)
                {
                    //Send fcm to user
                    FCMModel fcmExpense = new FCMModel(user.DeviceId, type: "DeleteExpense");
                    fcmExpense.data.Add("ExpenseId", expense.Id);

                    await _fcmService.SendFCMAsync(fcmExpense);
                }

                _expenseRepository.Delete(expense);
            }
        }