diff options
Diffstat (limited to 'Backend/Api')
-rw-r--r-- | Backend/Api/Api/Api.csproj | 1 | ||||
-rw-r--r-- | Backend/Api/Api/Controllers/LocationController.cs | 9 | ||||
-rw-r--r-- | Backend/Api/Api/Controllers/PostController.cs | 68 | ||||
-rw-r--r-- | Backend/Api/Api/Controllers/UserController.cs | 31 | ||||
-rw-r--r-- | Backend/Api/Api/Interfaces/IFileService.cs | 1 | ||||
-rw-r--r-- | Backend/Api/Api/Interfaces/IPostService.cs | 12 | ||||
-rw-r--r-- | Backend/Api/Api/Interfaces/IUserService.cs | 9 | ||||
-rw-r--r-- | Backend/Api/Api/Models/Post.cs | 14 | ||||
-rw-r--r-- | Backend/Api/Api/Services/FileService.cs | 21 | ||||
-rw-r--r-- | Backend/Api/Api/Services/PostService.cs | 186 | ||||
-rw-r--r-- | Backend/Api/Api/Services/UserService.cs | 223 |
11 files changed, 539 insertions, 36 deletions
diff --git a/Backend/Api/Api/Api.csproj b/Backend/Api/Api/Api.csproj index 24c41b7..0e541f9 100644 --- a/Backend/Api/Api/Api.csproj +++ b/Backend/Api/Api/Api.csproj @@ -10,6 +10,7 @@ <PackageReference Include="Geocoding.Core" Version="4.0.1" /> <PackageReference Include="Geocoding.Google" Version="4.0.1" /> <PackageReference Include="Geocoding.MapQuest" Version="4.0.1" /> + <PackageReference Include="Magick.NET-Q16-AnyCPU" Version="12.2.1" /> <PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="6.0.10" /> <PackageReference Include="MongoDB.Driver" Version="2.18.0" /> <PackageReference Include="Swashbuckle.AspNetCore" Version="6.2.3" /> diff --git a/Backend/Api/Api/Controllers/LocationController.cs b/Backend/Api/Api/Controllers/LocationController.cs index c9ef9ba..ba9c9a8 100644 --- a/Backend/Api/Api/Controllers/LocationController.cs +++ b/Backend/Api/Api/Controllers/LocationController.cs @@ -51,10 +51,15 @@ namespace Api.Controllers return BadRequest(); } - [HttpPost("search")] + [HttpGet("search")] [Authorize(Roles = "User")] - public async Task<ActionResult<List<Location>>> searchLocation(int searchtype ,string? query,Coords? coords) + public async Task<ActionResult<List<Location>>> searchLocation(int searchtype ,string? query,double? latitude,double? longitude) { + Coords coords = new Coords(); + if (latitude!=null && longitude!=null) { + coords.latitude = (double)latitude; + coords.longitude = (double)longitude; + } List<Location> ret = new List<Location>(); switch (searchtype) { diff --git a/Backend/Api/Api/Controllers/PostController.cs b/Backend/Api/Api/Controllers/PostController.cs index dc48c73..03c3f81 100644 --- a/Backend/Api/Api/Controllers/PostController.cs +++ b/Backend/Api/Api/Controllers/PostController.cs @@ -56,7 +56,18 @@ namespace Api.Controllers } return BadRequest(); } - + [HttpGet("posts/delete/{id}")] + [Authorize(Roles = "User")] + public async Task<ActionResult<string>> deletePost(string id) + { + var userid = await _userService.UserIdFromJwt(); + var res = await _postService.deletePost(id, userid); + if (res) + { + return Ok(res); + } + return BadRequest("Post ne postoji ili vi niste vlasnik"); + } [HttpGet("image/{id}")] //[Authorize(Roles = "User")] public async Task<ActionResult> getImage(string id) @@ -66,20 +77,30 @@ namespace Api.Controllers return BadRequest("Slika ne postoji"); return File(System.IO.File.ReadAllBytes(f.path), "image/*", Path.GetFileName(f.path)); } + [HttpGet("image/compress/{id}")] + //[Authorize(Roles = "User")] + public async Task<ActionResult> getCompressedImage(string id) + { + Byte[] f = await _fileService.getCompressedImage(id); + if (f == null) + return BadRequest("Slika ne postoji"); + return File(f, "image/*", "tempcompress"); + } [HttpPost("posts/{id}/addrating")] [Authorize(Roles = "User")] public async Task<ActionResult> addRating([FromBody] RatingReceive rating,string id) { var userid = await _userService.UserIdFromJwt(); - if (await _postService.AddOrReplaceRating(rating, userid)) - return Ok(); + var rez = await _postService.AddOrReplaceRating(rating, userid); + if(rez != null) + return Ok(rez); return BadRequest(); } [HttpDelete("posts/{id}/removerating")] [Authorize(Roles = "User")] - public async Task<ActionResult> removeRating(string id) + public async Task<ActionResult<int>> removeRating(string id) { var userid = await _userService.UserIdFromJwt(); if (await _postService.RemoveRating(id,userid)) @@ -89,7 +110,7 @@ namespace Api.Controllers [HttpPost("posts/{id}/addcomment")] [Authorize(Roles = "User")] - public async Task<ActionResult<Comment>> addComment([FromBody] CommentReceive cmnt,string id) + public async Task<ActionResult<CommentSend>> addComment([FromBody] CommentReceive cmnt,string id) { var userid = await _userService.UserIdFromJwt(); var c = await _postService.AddComment(cmnt, userid, id); @@ -128,5 +149,42 @@ namespace Api.Controllers } return BadRequest(); } + + [HttpGet("posts/get10MostViewed")] + [Authorize(Roles = "User")] + public async Task<ActionResult<List<PostSend>>> Get10MostViewed() + { + return Ok(await _postService.Get10MostViewed()); + } + + [HttpGet("posts/get10Newest")] + [Authorize(Roles = "User")] + public async Task<ActionResult<List<PostSend>>> Get10Newest() + { + return Ok(await _postService.Get10Newest()); + } + + [HttpGet("posts/get10Best")] + [Authorize(Roles = "User")] + public async Task<ActionResult<List<PostSend>>> Get10Best() + { + return Ok(await _postService.Get10Best()); + } + + + [HttpGet("posts/{id}/getUserPosts")] + [Authorize(Roles = "User")] + public async Task<ActionResult<List<PostSend>>> GetUsersPosts(string id) + { + return Ok(await _postService.GetUsersPosts(id)); + } + + [HttpGet("posts/recommended")] + [Authorize(Roles = "User")] + public async Task<ActionResult<List<PostSend>>> Recommended() + { + var userid = await _userService.UserIdFromJwt(); + return Ok(await _postService.Recommended(userid)); + } } } diff --git a/Backend/Api/Api/Controllers/UserController.cs b/Backend/Api/Api/Controllers/UserController.cs index 7764af1..4d7905a 100644 --- a/Backend/Api/Api/Controllers/UserController.cs +++ b/Backend/Api/Api/Controllers/UserController.cs @@ -89,14 +89,39 @@ namespace Api.Controllers return Ok(await _userService.GetFollowing(id)); } - [HttpGet("addFollower")] + [HttpGet("{id}/addFollower")] [Authorize(Roles = "User")] - public async Task<ActionResult<List<UserSend>>> AddFollower(string userId, string followerId) + public async Task<ActionResult<Boolean>> AddFollower(string id) { - return Ok(await _userService.AddFollower(userId, followerId)); + return Ok(await _userService.AddFollower(id)); } + [HttpGet("{id}/myFollowings")] + [Authorize(Roles = "User")] + public async Task<ActionResult<List<UserSend>>> GetMyFollowings() + { + return Ok(await _userService.GetMyFollowings()); + } + [HttpGet("{id}/checkIfAlreadyFollow")] + [Authorize(Roles = "User")] + public async Task<ActionResult<Boolean>> CheckIfAlreadyFollow(String id) + { + return Ok(await _userService.CheckIfAlreadyFollow(id)); + } + [HttpGet("{id}/unfollow")] + [Authorize(Roles = "User")] + public async Task<ActionResult<Boolean>> Unfollow(string id) + { + return Ok(await _userService.Unfollow(id)); + } + + [HttpGet("{id}/myFollowers")] + [Authorize(Roles = "User")] + public async Task<ActionResult<List<UserSend>>> GetMyFollowers() + { + return Ok(await _userService.GetMyFollowers()); + } } } diff --git a/Backend/Api/Api/Interfaces/IFileService.cs b/Backend/Api/Api/Interfaces/IFileService.cs index e736305..33ff5d9 100644 --- a/Backend/Api/Api/Interfaces/IFileService.cs +++ b/Backend/Api/Api/Interfaces/IFileService.cs @@ -4,5 +4,6 @@ { Task<Models.File> add(Models.File file); Task<Models.File> getById(string id); + Task<Byte[]> getCompressedImage(string id); } }
\ No newline at end of file diff --git a/Backend/Api/Api/Interfaces/IPostService.cs b/Backend/Api/Api/Interfaces/IPostService.cs index 12a5fe8..96786bd 100644 --- a/Backend/Api/Api/Interfaces/IPostService.cs +++ b/Backend/Api/Api/Interfaces/IPostService.cs @@ -5,12 +5,13 @@ namespace Api.Interfaces public interface IPostService { Task<PostSend> addPost(PostReceive post); + Task<Boolean> deletePost(string postid, string userid); Task<List<PostSend>> getAllPosts(); Task<PostSend> getPostById(string id,string userid); Task<PostSend> postToPostSend(Post post); - Task<Boolean> AddOrReplaceRating(RatingReceive rating, string userid); + Task<RatingSend> AddOrReplaceRating(RatingReceive rating, string userid); Task<Boolean> RemoveRating(string postid, string userid); - Task<Comment> AddComment(CommentReceive cmnt, string userid, string postid); + Task<CommentSend> AddComment(CommentReceive cmnt, string userid, string postid); Task<List<CommentSend>> ListComments(string postid); Task<List<CommentSend>> CascadeComments(string parentid, Post p); Task<Boolean> DeleteComments(string postid, string cmntid,string userid); @@ -19,5 +20,12 @@ namespace Api.Interfaces int DateEnumToDays(int filterdate); Task<List<PostSend>> GetUsersPosts(string id); Task<List<PostSend>> UserHistory(string userid); + + Task<List<PostSend>> Get10Best(); + + Task<List<PostSend>> Get10MostViewed(); + + Task<List<PostSend>> Get10Newest(); + Task<List<PostSend>> Recommended(string userid); } }
\ No newline at end of file diff --git a/Backend/Api/Api/Interfaces/IUserService.cs b/Backend/Api/Api/Interfaces/IUserService.cs index 5770de1..95dd46d 100644 --- a/Backend/Api/Api/Interfaces/IUserService.cs +++ b/Backend/Api/Api/Interfaces/IUserService.cs @@ -27,8 +27,15 @@ namespace Api.Interfaces Task<UserSend> GetUserData(string username); Task<UserSend> GetSelfUserData(string id); - Task<Boolean> AddFollower(string userId,string followerId); + Task<Boolean> AddFollower(string followerId); Task<List<UserSend>> GetFollowers(string id); Task<List<UserSend>> GetFollowing(string id); + Task<List<UserSend>> GetMyFollowings(); + + Task<Boolean> CheckIfAlreadyFollow(string id); + Task<Boolean> Unfollow(string id); + + Task<List<UserSend>> GetMyFollowers(); + } } diff --git a/Backend/Api/Api/Models/Post.cs b/Backend/Api/Api/Models/Post.cs index 1a4129f..dd007ec 100644 --- a/Backend/Api/Api/Models/Post.cs +++ b/Backend/Api/Api/Models/Post.cs @@ -38,15 +38,23 @@ namespace Api.Models public DateTime createdAt { get; set; } public int views { get; set; } public double ratings { get; set; } + public int ratingscount { get; set; } public List<CommentSend> comments { get; set; } public List<File> images { get; set; } public List<string>? tags { get; set; } + public DateTime? lastViewed { get; set; } } public class Rating { public string userId { get; set; } public int rating { get; set; } } + public class RatingSend + { + public int ratingscount { get; set; } + public double ratings { get; set; } + public int myrating { get; set; } + } public class Comment { [BsonId] @@ -100,4 +108,10 @@ namespace Api.Models public int totalposts { get; set; } public List<PostSend> posts { get; set; } } + + public class TagR + { + public int counter { get; set; } + public string tag { get; set; } + } } diff --git a/Backend/Api/Api/Services/FileService.cs b/Backend/Api/Api/Services/FileService.cs index 1937c10..440b24f 100644 --- a/Backend/Api/Api/Services/FileService.cs +++ b/Backend/Api/Api/Services/FileService.cs @@ -1,5 +1,6 @@ using Api.Interfaces; using Api.Models; +using ImageMagick; using MongoDB.Driver; using File = Api.Models.File; @@ -24,5 +25,25 @@ namespace Api.Services { return await _files.Find(file => file._id == id).FirstOrDefaultAsync(); } + public async Task<Byte[]> getCompressedImage(string id) + { + Byte[] res = null; + Models.File f = await getById(id); + if (f == null || !System.IO.File.Exists(f.path)) + return res; + if (System.IO.File.Exists(f.path + "-compress")) + return System.IO.File.ReadAllBytes(f.path + "-compress"); + using (MagickImage image = new MagickImage(f.path)) + { + image.Format = image.Format; + image.Quality = 30; + res= image.ToByteArray(); + image.Write(f.path + "-compress"); + } + + + return res; + + } } } diff --git a/Backend/Api/Api/Services/PostService.cs b/Backend/Api/Api/Services/PostService.cs index bdf150b..855b231 100644 --- a/Backend/Api/Api/Services/PostService.cs +++ b/Backend/Api/Api/Services/PostService.cs @@ -39,7 +39,10 @@ namespace Api.Services p.comments = new List<Comment>(); p.images = new List<Models.File>(); p.createdAt = DateTime.Now.ToUniversalTime(); - var tags = post.tags.Split("|").ToList(); + List<String> tags; + if (post.tags != "none") + tags = post.tags.Remove(post.tags.Length-1,1).Split("|").ToList(); + else tags = null; p.tags = tags; var folderPath = Path.Combine(Directory.GetCurrentDirectory(), "Files", p.ownerId); if (!Directory.Exists(folderPath)) @@ -85,6 +88,7 @@ namespace Api.Services p.views = post.views.Count(); p.createdAt = post.createdAt; p.tags = post.tags; + p.ratingscount = post.ratings.Count(); if (post.ratings.Count() > 0) { List<int> ratings = new List<int>(); @@ -100,6 +104,18 @@ namespace Api.Services return p; } + public async Task<Boolean> deletePost(string postid,string userid) + { + var p = await _posts.Find(x => x._id == postid).FirstOrDefaultAsync(); + if (p == null || p.ownerId != userid) + return false; + foreach (var image in p.images) + System.IO.File.Delete(image.path); + + await _posts.DeleteOneAsync(postid); + return true; + } + public async Task<List<PostSend>> getAllPosts() { List<Post> posts = await _posts.Find(_ => true).ToListAsync(); @@ -116,22 +132,50 @@ namespace Api.Services Post p = await _posts.Find(post => post._id == id).FirstOrDefaultAsync(); if (p != null) { - if (!p.views.Any(x => x == userid)) + if (!p.views.Any(x => x.Split("|")[0] == userid)) { - p.views.Add(userid); + p.views.Add(userid + "|" + DateTime.Now.ToUniversalTime().ToString()); + await _posts.ReplaceOneAsync(x => x._id == id, p); + } + else + { + var v = p.views.Find(x => x.Split("|")[0] == userid); + p.views.Remove(v); + p.views.Add(userid + "|" + DateTime.Now.ToUniversalTime().ToString()); await _posts.ReplaceOneAsync(x => x._id == id, p); } } return await postToPostSend(p); } - public async Task<Boolean> AddOrReplaceRating(RatingReceive rating,string userid) + public async Task<RatingSend> AddOrReplaceRating(RatingReceive rating,string userid) //0 return existing flag , -1 rating failed flag { Post p = await _posts.Find(post => post._id == rating.postId).FirstOrDefaultAsync(); if (p != null) { + var tosend = new RatingSend(); + var ps = await postToPostSend(p); + tosend.ratings = ps.ratings; + tosend.ratingscount = ps.ratingscount; + if (p.ownerId == userid) - return false; + return null; + if(rating.rating == 0)// ako nema rating staviti 0 + { + var r = p.ratings.Find(x => x.userId == userid); + if(r != null) + { + tosend.myrating=r.rating; + return tosend; + } + else + { + tosend.myrating = 0; + return tosend; + } + } + if(rating.rating<1 || rating.rating>5) + return null; if(!p.ratings.Any(x => x.userId == userid)) { Rating r = new Rating(); @@ -139,6 +183,7 @@ namespace Api.Services r.userId = userid; p.ratings.Add(r); await _posts.ReplaceOneAsync(x => x._id == p._id, p); + tosend.myrating=rating.rating; } else { @@ -147,10 +192,15 @@ namespace Api.Services r.rating = rating.rating; p.ratings.Add(r); await _posts.ReplaceOneAsync(x => x._id == p._id, p); + tosend.myrating = rating.rating; } - return true; + p = await _posts.Find(post => post._id == rating.postId).FirstOrDefaultAsync(); + ps = await postToPostSend(p); + tosend.ratings = ps.ratings; + tosend.ratingscount = ps.ratingscount; + return tosend; } - return false; + return null; } public async Task<Boolean> RemoveRating(string postid, string userid) { @@ -167,20 +217,30 @@ namespace Api.Services } return false; } - public async Task<Comment> AddComment(CommentReceive cmnt,string userid,string postid) + public async Task<CommentSend> AddComment(CommentReceive cmnt,string userid,string postid) { Post p = await _posts.Find(post => post._id == postid).FirstOrDefaultAsync(); if (p != null) { - Comment c= new Comment(); + Comment c = new Comment(); + CommentSend c1= new CommentSend(); c.parentId = cmnt.parentId; + c1.parentId = cmnt.parentId; c.userId = userid; + c1.userId = userid; c.comment = cmnt.comment; + c1.comment = cmnt.comment; c.timestamp = DateTime.Now.ToUniversalTime(); + c1.timestamp = c.timestamp; c._id = ObjectId.GenerateNewId().ToString(); + c1._id = c._id; + var user = await _users.Find(x => x._id == c.userId).FirstOrDefaultAsync(); + if (user != null) + c1.username = user.username; + else c1.username = "Deleted user"; p.comments.Add(c); await _posts.ReplaceOneAsync(x => x._id == postid, p); - return c; + return c1; } return null; } @@ -308,7 +368,7 @@ namespace Api.Services xd = ls.OrderByDescending(x => x.createdAt).ToList(); break; default: - + xd = ls.OrderByDescending(x => x.views).ToList(); break; } if(xd != null) @@ -360,13 +420,115 @@ namespace Api.Services var tosend = new List<PostSend>(); foreach (var post in posts) { - if (post.views.Any(x => x.Equals(userid))) + if (post.views.Any(x => x.Split("|")[0] == userid)) { + var t = post.views.Find(x => x.Split("|")[0] == userid); var x = await postToPostSend(post); + x.lastViewed = DateTime.Parse(t.Split("|")[1]).ToUniversalTime(); tosend.Add(x); } } + tosend = tosend.OrderByDescending(x => x.lastViewed).ToList(); return tosend; } + + public async Task<List<PostSend>> Get10Best() + { + List<Post> posts = await _posts.Find(_ => true).ToListAsync(); + List<PostSend> temp = new List<PostSend>(); + foreach (var post in posts) + { + temp.Add(await postToPostSend(post)); + } + List<PostSend> best = temp.OrderByDescending(o => o.ratings).Take(10).ToList(); + return best; + } + + public async Task<List<PostSend>> Get10MostViewed() + { + List<Post> posts = await _posts.Find(_ => true).ToListAsync(); + List<PostSend> temp = new List<PostSend>(); + foreach (var post in posts) + { + temp.Add(await postToPostSend(post)); + } + List<PostSend> mostViewed = temp.OrderByDescending(o => o.views).Take(10).ToList(); + return mostViewed; + } + + public async Task<List<PostSend>> Get10Newest() + { + List<Post> posts = await _posts.Find(_ => true).ToListAsync(); + List<PostSend> temp = new List<PostSend>(); + foreach (var post in posts) + { + temp.Add(await postToPostSend(post)); + } + List<PostSend> newest = temp.OrderByDescending(o => o.createdAt).Take(10).ToList(); + return newest; + } + + public async Task<List<PostSend>> Recommended(string userid) // momgodb bloat bleh + { + List<PostSend> posts = await UserHistory(userid); + //TODO-LIMIT RECOMMENDED FOR POSTS FROM THIS MONTH ONLY + List<TagR> tags = new List<TagR>(); + foreach (var post in posts) + { + if (post.tags != null) + { + + foreach (var tagitem in post.tags) + { + if (!tags.Any(x => x.tag == tagitem)) + { + var newtag = new TagR(); + newtag.tag = tagitem; + newtag.counter = 1; + tags.Add(newtag); + } + else + { + var replace = tags.Find(x => x.tag == tagitem); + tags.Remove(replace); + replace.counter += 1; + tags.Add(replace); + } + } + } + } + var top5tags = tags.OrderByDescending(x => x.counter).Take(5).ToList(); + + var all = await _posts.Find(_ => true).ToListAsync(); + var recent30 = new List<PostSend>(); + var fiveoftop5tags = new List<PostSend>(); + foreach (var elem in all) + { + if ((DateTime.Now - elem.createdAt).TotalDays < 30) + recent30.Add(await postToPostSend(elem)); + } + recent30 = recent30.OrderByDescending(x => x.createdAt).ToList(); + foreach (var tag in top5tags) + { + var five = new List<PostSend>(); + foreach (var elem in recent30) + { + if (elem.tags != null) + { + if (elem.tags.Any(x => x == tag.tag)) + five.Add(elem); + } + } + five = five.Take(5).ToList(); + foreach(var elem in five) + { + fiveoftop5tags.Add(elem); + } + } + + var taggedposts = new List<PostSend>(); + taggedposts = fiveoftop5tags.Distinct().OrderByDescending(x => x.createdAt).ToList(); + return taggedposts; + } } } diff --git a/Backend/Api/Api/Services/UserService.cs b/Backend/Api/Api/Services/UserService.cs index f616d99..ec67729 100644 --- a/Backend/Api/Api/Services/UserService.cs +++ b/Backend/Api/Api/Services/UserService.cs @@ -6,6 +6,7 @@ using System.Security.Claims; using MimeKit; using MailKit.Net.Smtp; using DnsClient; +using MongoDB.Bson; namespace Api.Services { @@ -380,21 +381,60 @@ namespace Api.Services return tosend; } - public async Task<Boolean> AddFollower(string userId,string followerId) + public async Task<Boolean> updateUserFollowerFollowingCount(List<string> followers,List <string> followings,string userId) { - User u = await _users.Find(user => user._id==userId).FirstOrDefaultAsync(); - User f = await _users.Find(user => user._id == followerId).FirstOrDefaultAsync(); + User u = await _users.Find(user => user._id == userId).FirstOrDefaultAsync(); + if(u!= null) + { + u.followersCount = followers.Count(); + u.followingCount = followings.Count(); + return true; + } + return false; + } - if (userId != null && followerId!=null) + public async Task<Boolean> AddFollower(string followerId) + { + + string id = null; + if (_httpContext.HttpContext.User.FindFirstValue("id") != null) + { + id = _httpContext.HttpContext.User.FindFirstValue("id").ToString(); + } + + if (followerId == id) { - if (u.followers == null) - u.followers = new List<string>(); - u.followers.Add(followerId); - if (f.following == null) - f.following = new List<string>(); - f.following.Add(userId); - _users.ReplaceOne(user=>user._id==userId, u); + return false; + } + User f = await _users.Find(user => user._id == followerId).FirstOrDefaultAsync(); + User u = await _users.Find(user => user._id == id).FirstOrDefaultAsync(); + + if (id != null && followerId!=null) + { + if (f.followers == null) + { + f.followers = new List<string>(); + f.followersCount = 0; + } + f.followers.Add(id); + f.followersCount =f.followers.Count(); + _users.ReplaceOne(user => user._id == followerId, f); + + if (u.following == null) + { + u.following = new List<string>(); + u.followingCount = 0; + } + u.following.Add(followerId); + u.followingCount =u.following.Count(); + + _users.ReplaceOne(user=>user._id==id, u); + + + // updateUserFollowerFollowingCount(u.followers, u.following, u._id); + //updateUserFollowerFollowingCount(f.followers, f.following, f._id); + return true; } @@ -419,15 +459,19 @@ namespace Api.Services continue; } UserSend follower = new UserSend(); + follower.creationDate = utemp.creationDate; + follower.name = utemp.name; follower.pfp = utemp.pfp; follower.username = utemp.username; follower.email = utemp.username; + follower.following = utemp.following; follower.followers = utemp.followers; follower._id = utemp._id; followers.Add((UserSend)follower); } } + u.followersCount=followers.Count() ; return followers; } return null; @@ -450,18 +494,175 @@ namespace Api.Services continue; } UserSend follower = new UserSend(); + follower.creationDate = utemp.creationDate; + follower.name = utemp.name; follower.pfp = utemp.pfp; follower.username = utemp.username; follower.email = utemp.username; + follower.following = utemp.following; follower.followers = utemp.followers; follower._id = utemp._id; following.Add((UserSend)follower); } } + u.followersCount = following.Count(); return following; } return null; } + + public async Task<List<UserSend>> GetMyFollowings() + { + string id = null; + + if (_httpContext.HttpContext.User.FindFirstValue("id") != null) + { + id = _httpContext.HttpContext.User.FindFirstValue("id").ToString(); + } + User u = await _users.Find(user => user._id == id).FirstOrDefaultAsync(); + List<UserSend> myFollowings = new List<UserSend>(); + if (u != null) + { + + if (u.following != null && u.following.Count() > 0) + { + foreach (string userid in u.following) + { + User utemp = await _users.Find(user => user._id == userid).FirstOrDefaultAsync(); + if (utemp == null) + { + continue; + } + UserSend following = new UserSend(); + following.creationDate = utemp.creationDate; + following.name = utemp.name; + following.pfp = utemp.pfp; + following.username = utemp.username; + following.email = utemp.username; + following.following = utemp.following; + following.followers = utemp.followers; + following._id = utemp._id; + + myFollowings.Add((UserSend)following); + } + } + return myFollowings; + } + return null; + } + + public async Task<bool> CheckIfAlreadyFollow(string id) + { + string myId = null; + + if (_httpContext.HttpContext.User.FindFirstValue("id") != null) + { + myId = _httpContext.HttpContext.User.FindFirstValue("id").ToString(); + } + + User u = await _users.Find(user => user._id == myId).FirstOrDefaultAsync(); + User f = await _users.Find(user => user._id == id).FirstOrDefaultAsync(); + + if (u != null) + { + + if (u.following != null && u.following.Count() > 0) + { + foreach (string userid in u.following) + { + User utemp = await _users.Find(user => user._id == userid).FirstOrDefaultAsync(); + if (utemp == null) + { + continue; + } + if (utemp._id == f._id) + { + return true; + } + } + } + + } + + return false; + } + + public async Task<bool> Unfollow(string id) + { + string myId = null; + + if (_httpContext.HttpContext.User.FindFirstValue("id") != null) + { + myId = _httpContext.HttpContext.User.FindFirstValue("id").ToString(); + } + + User u = await _users.Find(user => user._id == myId).FirstOrDefaultAsync(); + User f = await _users.Find(user => user._id == id).FirstOrDefaultAsync(); + + if (u != null) + { + if (u.following != null && f.followers!=null) + { + u.following.Remove(f._id); + u.followingCount=u.following.Count(); + u.followersCount = u.followers.Count(); + + + f.followers.Remove(u._id); + f.followersCount =f.followers.Count(); + f.followingCount =f.following.Count(); + + _users.ReplaceOne(user => user._id == myId, u); + _users.ReplaceOne(user => user._id == id, f); + + //updateUserFollowerFollowingCount(u.followers, u.following, u._id); + //updateUserFollowerFollowingCount(f.followers, f.following, f._id); + return true; + } + + } + return false; + } + + public async Task<List<UserSend>> GetMyFollowers() + { + + string id = null; + + if (_httpContext.HttpContext.User.FindFirstValue("id") != null) + { + id = _httpContext.HttpContext.User.FindFirstValue("id").ToString(); + } + User u = await _users.Find(user => user._id == id).FirstOrDefaultAsync(); + List<UserSend> myfollowers = new List<UserSend>(); + + if (u!=null && u.followers != null && u.followers.Count() > 0) + { + foreach (string userid in u.followers) + { + User utemp = await _users.Find(user => user._id == userid).FirstOrDefaultAsync(); + if (utemp == null) + { + continue; + } + UserSend follower = new UserSend(); + follower.creationDate = utemp.creationDate; + follower.name = utemp.name; + follower.pfp = utemp.pfp; + follower.username = utemp.username; + follower.email = utemp.username; + follower.following = utemp.following; + follower.followers = utemp.followers; + follower._id = utemp._id; + + myfollowers.Add((UserSend)follower); + } + return myfollowers; + } + + return null; + } } + } |