public async Task <IActionResult> RemoveFriend([FromRoute] int userToFriendId) { if (ModelState.IsValid) { var user = await _userManager.GetUserAsync(User); if (user == null) { return(new JsonResult(new Response { Ok = false, StatusCode = 404, Description = "Запрашивающий пользователь не найден" })); } var userToFriend = await _context.UserToFriends.FirstOrDefaultAsync(x => x.Id == userToFriendId); if (userToFriend == null) { return(new JsonResult(new Response { Ok = false, StatusCode = 404, Description = "Не найдено такой дружбы" })); } if (userToFriend.UserId != user.Id) { return(new JsonResult(new Response { Ok = false, StatusCode = 403, Description = "У пользователя нет такой дружбы" })); } if (userToFriend.FriendId == null) { // Если друга уже нет (friendId == null), то и зеркальной записи нет // А значит ее не нужно удалять, подписчика и запрос не нужно добавлять _context.UserToFriends.Remove(userToFriend); await _context.SaveChangesAsync(); return(new JsonResult(new Response { Ok = true, StatusCode = 200, Result = new { Message = "Deleted user removed" } })); } else // Если friendId не null, т.е. существует { int followerId = userToFriend.FriendId.Value; // Id друга, который станет подписчиком var mirrorUserToFriend = await _context.UserToFriends.FirstAsync(u => u.UserId == userToFriend.FriendId && u.FriendId == userToFriend.UserId); _context.UserToFriends.RemoveRange(userToFriend, mirrorUserToFriend); // Удаляем записи о дружбе // Добавляем подписчика и запрос var newUserToFolower = new UserToFollower { UserId = user.Id, FollowerId = followerId }; // Подписчик _context.UserToFollowers.Add(newUserToFolower); var newUserToRequest = new UserToRequest { UserId = followerId, RequestId = user.Id }; // Запрос _context.UserToRequests.Add(newUserToRequest); await _context.SaveChangesAsync(); return(new JsonResult(new Response { Ok = true, StatusCode = 200, Result = new { Message = "Existing user removed", FollowerId = followerId } })); } } return(new JsonResult(new Response { Ok = false, StatusCode = 400, Description = "Заполнены не все (либо неверно) поля запроса" })); }
private async Task <IActionResult> TrySendFriendRequestAsync(int userId, int friendId) { var userToFriend = await _context.UserToFriends.FirstOrDefaultAsync(x => x.UserId == userId && x.FriendId == friendId); if (userToFriend != null) // Уже друзья { return(new JsonResult(new Response { Ok = false, StatusCode = 403, Description = "Пользователи уже в друзьях друг у друга" })); } var userToRequest = await _context.UserToRequests.FirstOrDefaultAsync(x => x.UserId == userId && x.RequestId == friendId); if (userToRequest != null) // Уже имеет запрос пользователю с Id = friendId. Аналогично уже имеется зеркальная запись в подписчиках юзера с Id = friendId { return(new JsonResult(new Response { Ok = false, StatusCode = 403, Description = "Пользователь уже отправил заявку" })); } var mirrorUserToRequest = await _context.UserToRequests.FirstOrDefaultAsync(x => x.UserId == friendId && x.RequestId == userId); if (mirrorUserToRequest != null) // Тот пользователь уже подписан, т.е. взаимная дружба => добавляем в друзья { var newUserToFriend = new UserToFriend { UserId = userId, FriendId = friendId }; var newMirrorUserToFriend = new UserToFriend { UserId = friendId, FriendId = userId }; await _context.UserToFriends.AddRangeAsync(newUserToFriend, newMirrorUserToFriend); // И удаляю запрос _context.UserToRequests.Remove(mirrorUserToRequest); // И удаляю подписчика var userToFollower = await _context.UserToFollowers.FirstAsync(x => x.UserId == userId && x.FollowerId == friendId); _context.UserToFollowers.Remove(userToFollower); await _context.SaveChangesAsync(); return(new JsonResult(new Response { Ok = true, StatusCode = 200, Result = new { Message = "Added", Id = newUserToFriend.Id } })); } else // Тот пользователь не подписан, т.е. отправляется запрос на дружбу => добавляем запрос и подписчика { var newUserToRequest = new UserToRequest { UserId = userId, RequestId = friendId }; // У userId добавляем запрос (кому?) friendId _context.UserToRequests.Add(newUserToRequest); var newUserToFollower = new UserToFollower { UserId = friendId, FollowerId = userId }; // У friendId добавляем подписчика (кого?) userId _context.UserToFollowers.Add(newUserToFollower); await _context.SaveChangesAsync(); return(new JsonResult(new Response { Ok = true, StatusCode = 200, Result = new { Message = "Requested", Id = newUserToRequest.Id } })); } }
public async Task InvokeAsync(HttpContext context) { _db = context.RequestServices.GetService(typeof(ApplicationContext)) as ApplicationContext; _userManager = context.RequestServices.GetService(typeof(UserManager <User>)) as UserManager <User>; if (_db.Users.Count() != 0) { await _next.Invoke(context); return; } var user1 = new User { UserName = "******", NormalizedUserName = "******" }; var user2 = new User { UserName = "******", NormalizedUserName = "******" }; var user3 = new User { UserName = "******", NormalizedUserName = "******" }; await _userManager.CreateAsync(user1, "123456"); await _userManager.CreateAsync(user2, "123456"); await _userManager.CreateAsync(user3, "123456"); var dialog1 = new Dialog { Title = "Первый диалог", CreatingTime = DateTime.Now, LastMessageTime = DateTime.Now }; var dialog2 = new Dialog { Title = "Второй диалог", CreatingTime = DateTime.Now, LastMessageTime = DateTime.Now }; var dialog3 = new Dialog { Title = "Третий диалог", CreatingTime = DateTime.Now, LastMessageTime = DateTime.Now }; await _db.Dialogs.AddRangeAsync(dialog1, dialog2, dialog3); await _db.SaveChangesAsync(); dialog1.Users = new List <UserToDialog> { new UserToDialog { Dialog = dialog1, User = user1 }, new UserToDialog { Dialog = dialog1, User = user2 }, new UserToDialog { Dialog = dialog1, User = user3 }, }; dialog2.Users = new List <UserToDialog> { new UserToDialog { Dialog = dialog2, User = user1 }, new UserToDialog { Dialog = dialog2, User = user3 }, }; dialog3.Users = new List <UserToDialog> { new UserToDialog { Dialog = dialog3, User = user2 }, }; _db.Dialogs.UpdateRange(dialog1, dialog2, dialog3); await _db.SaveChangesAsync(); var message1 = new Message { Text = "Привет", Author = user1, Dialog = dialog1, SendingTime = DateTime.Now }; var message2 = new Message { Text = "Это я!", Author = user1, Dialog = dialog2, SendingTime = DateTime.Now }; var message3 = new Message { Text = "Здравствуй!", Author = user2, Dialog = dialog3, SendingTime = DateTime.Now }; var message4 = new Message { Text = "Как дела?", Author = user1, Dialog = dialog3, SendingTime = DateTime.Now }; var message5 = new Message { Text = "Дурка уже в пути", Author = user2, Dialog = dialog2, SendingTime = DateTime.Now }; await _db.Messages.AddRangeAsync(message1, message2, message3, message4, message5); await _db.SaveChangesAsync(); var uf1 = new UserToFriend { User = user1, FriendId = user2.Id }; var uf2 = new UserToFriend { User = user1, FriendId = user3.Id }; var uf3 = new UserToFriend { User = user2, FriendId = user1.Id }; var uf5 = new UserToFriend { User = user3, FriendId = user1.Id }; _db.UserToFriends.AddRange(uf1, uf2, uf3, uf5); await _db.SaveChangesAsync(); var ufw1 = new UserToFollower { User = user2, FollowerId = user3.Id }; var ur1 = new UserToRequest { User = user3, RequestId = user2.Id }; _db.UserToFollowers.AddRange(ufw1); _db.UserToRequests.AddRange(ur1); await _db.SaveChangesAsync(); await _next.Invoke(context); }