From f2e816ab9e625b0575f6e81fffb0ee7fceddc84e Mon Sep 17 00:00:00 2001 From: TAMARA JERINIC Date: Mon, 28 Nov 2022 22:26:51 +0100 Subject: Omogućeno praćenje i prestanak praćenja korisnika na front-u i back-u. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Backend/Api/Api/Controllers/UserController.cs | 6 ++ Backend/Api/Api/Interfaces/IUserService.cs | 2 + Backend/Api/Api/Services/UserService.cs | 79 ++++++++++++++++++++++++--- 3 files changed, 80 insertions(+), 7 deletions(-) (limited to 'Backend') diff --git a/Backend/Api/Api/Controllers/UserController.cs b/Backend/Api/Api/Controllers/UserController.cs index ada0f35..cc45737 100644 --- a/Backend/Api/Api/Controllers/UserController.cs +++ b/Backend/Api/Api/Controllers/UserController.cs @@ -110,5 +110,11 @@ namespace Api.Controllers return Ok(await _userService.CheckIfAlreadyFollow(id)); } + [HttpGet("{id}/unfollow")] + [Authorize(Roles = "User")] + public async Task> Unfollow(string id) + { + return Ok(await _userService.Unfollow(id)); + } } } diff --git a/Backend/Api/Api/Interfaces/IUserService.cs b/Backend/Api/Api/Interfaces/IUserService.cs index 21dcdc0..5f99733 100644 --- a/Backend/Api/Api/Interfaces/IUserService.cs +++ b/Backend/Api/Api/Interfaces/IUserService.cs @@ -33,5 +33,7 @@ namespace Api.Interfaces Task> GetMyFollowings(); Task CheckIfAlreadyFollow(string id); + Task Unfollow(string id); + } } diff --git a/Backend/Api/Api/Services/UserService.cs b/Backend/Api/Api/Services/UserService.cs index 7bfc24a..cc75533 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,6 +381,18 @@ namespace Api.Services return tosend; } + public async Task updateUserFollowerFollowingCount(List followers,List followings,string userId) + { + 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; + } + public async Task AddFollower(string followerId) { string id = null; @@ -392,14 +405,29 @@ namespace Api.Services if (id != null && followerId!=null) { - if (u.followers == null) - u.followers = new List(); - u.followers.Add(followerId); - if (f.following == null) - f.following = new List(); - f.following.Add(id); + if (f.followers == null) + { + f.followers = new List(); + f.followersCount = 0; + } + f.followers.Add(id); + f.followersCount =f.followers.Count(); + + + if (u.following == null) + { + u.following = new List(); + u.followingCount = 0; + } + u.following.Add(followerId); + u.followingCount =u.following.Count(); + _users.ReplaceOne(user=>user._id==id, u); _users.ReplaceOne(user => user._id == followerId, f); + + // updateUserFollowerFollowingCount(u.followers, u.following, u._id); + //updateUserFollowerFollowingCount(f.followers, f.following, f._id); + return true; } @@ -543,5 +571,42 @@ namespace Api.Services return false; } - } + + public async Task 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; + } + } } -- cgit v1.2.3 From 68b86d96142eb1f9e42ba2d87a4277d014759c46 Mon Sep 17 00:00:00 2001 From: "branislav.radivojevic" Date: Mon, 28 Nov 2022 22:41:44 +0100 Subject: prikaz prethodne ocene, broj ocena,prikaz --- Backend/Api/Api/Controllers/PostController.cs | 7 +- Backend/Api/Api/Interfaces/IPostService.cs | 2 +- Backend/Api/Api/Models/Post.cs | 6 ++ Backend/Api/Api/Services/PostService.cs | 35 ++++++++-- .../Activities/ActivitySinglePost.kt | 77 ++++++++++++++++------ .../brzodolokacije/Interfaces/IBackendApi.kt | 2 +- .../example/brzodolokacije/Models/RatingData.kt | 11 ++++ 7 files changed, 112 insertions(+), 28 deletions(-) create mode 100644 Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Models/RatingData.kt (limited to 'Backend') diff --git a/Backend/Api/Api/Controllers/PostController.cs b/Backend/Api/Api/Controllers/PostController.cs index 3d7199c..88c1c99 100644 --- a/Backend/Api/Api/Controllers/PostController.cs +++ b/Backend/Api/Api/Controllers/PostController.cs @@ -92,14 +92,15 @@ namespace Api.Controllers public async Task 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 removeRating(string id) + public async Task> removeRating(string id) { var userid = await _userService.UserIdFromJwt(); if (await _postService.RemoveRating(id,userid)) diff --git a/Backend/Api/Api/Interfaces/IPostService.cs b/Backend/Api/Api/Interfaces/IPostService.cs index 60781bb..a9adb05 100644 --- a/Backend/Api/Api/Interfaces/IPostService.cs +++ b/Backend/Api/Api/Interfaces/IPostService.cs @@ -9,7 +9,7 @@ namespace Api.Interfaces Task> getAllPosts(); Task getPostById(string id,string userid); Task postToPostSend(Post post); - Task AddOrReplaceRating(RatingReceive rating, string userid); + Task AddOrReplaceRating(RatingReceive rating, string userid); Task RemoveRating(string postid, string userid); Task AddComment(CommentReceive cmnt, string userid, string postid); Task> ListComments(string postid); diff --git a/Backend/Api/Api/Models/Post.cs b/Backend/Api/Api/Models/Post.cs index 0dc8158..78b4705 100644 --- a/Backend/Api/Api/Models/Post.cs +++ b/Backend/Api/Api/Models/Post.cs @@ -49,6 +49,12 @@ namespace Api.Models 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] diff --git a/Backend/Api/Api/Services/PostService.cs b/Backend/Api/Api/Services/PostService.cs index dcfd5e0..c57cfec 100644 --- a/Backend/Api/Api/Services/PostService.cs +++ b/Backend/Api/Api/Services/PostService.cs @@ -148,13 +148,34 @@ namespace Api.Services return await postToPostSend(p); } - public async Task AddOrReplaceRating(RatingReceive rating,string userid) + public async Task 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(); @@ -162,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 { @@ -170,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 RemoveRating(string postid, string userid) { diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ActivitySinglePost.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ActivitySinglePost.kt index d1ec76b..e1c2f80 100644 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ActivitySinglePost.kt +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ActivitySinglePost.kt @@ -3,9 +3,12 @@ package com.example.brzodolokacije.Activities import android.content.Intent import android.graphics.Color import android.graphics.drawable.ColorDrawable +import android.media.Image import android.os.Bundle import android.preference.PreferenceManager +import android.provider.ContactsContract.CommonDataKinds.Im import android.util.Log +import android.widget.ImageButton import android.widget.TextView import android.widget.Toast import androidx.appcompat.app.AppCompatActivity @@ -66,6 +69,9 @@ class ActivitySinglePost : AppCompatActivity() { setRatingListeners() translateOwnerIdToName(post.ownerId) + val alreadyrated= RatingReceive(starNumber.toInt(),post._id) + requestAddRating(alreadyrated) + binding.tvUser.setOnClickListener { val intent: Intent = Intent(this@ActivitySinglePost,ActivityUserProfile::class.java) var b= Bundle() @@ -115,13 +121,29 @@ class ActivitySinglePost : AppCompatActivity() { recyclerViewComments!!.adapter= adapterComments } - fun setRatingListeners(){ - val emptyStar=R.drawable.empty_star - val fullStar=R.drawable.full_star - //var starlist:List = mutableListOf() + fun setRatingListeners() { + val emptyStar = R.drawable.empty_star + val fullStar = R.drawable.full_star + /*var starlist: ArrayList = arrayListOf() + starlist.add(findViewById(R.id.rateStar1) as ImageButton) + starlist.add(findViewById(R.id.rateStar2) as ImageButton) + starlist.add(findViewById(R.id.rateStar3) as ImageButton) + starlist.add(findViewById(R.id.rateStar4) as ImageButton) + starlist.add(findViewById(R.id.rateStar5) as ImageButton) + for (i in 0..4) { + starlist[i].setOnClickListener { + for (j in 1..i) { + starlist[j].setImageResource(fullStar) + } + for (k in i..5) { + starlist[k].setImageResource(emptyStar) + } + starNumber = i+1; + } + }*/ binding.rateStar1.setOnClickListener { - Toast.makeText(this,"kliknuta prva zvezdica",Toast.LENGTH_SHORT).show() + //Toast.makeText(this,"kliknuta prva zvezdica",Toast.LENGTH_SHORT).show() binding.rateStar1.setImageResource(fullStar) binding.rateStar2.setImageResource(emptyStar) binding.rateStar3.setImageResource(emptyStar) @@ -130,7 +152,7 @@ class ActivitySinglePost : AppCompatActivity() { starNumber=1 } binding.rateStar2.setOnClickListener { - Toast.makeText(this,"kliknuta druga zvezdica",Toast.LENGTH_SHORT).show() + //Toast.makeText(this,"kliknuta druga zvezdica",Toast.LENGTH_SHORT).show() binding.rateStar1.setImageResource(fullStar) binding.rateStar2.setImageResource(fullStar) binding.rateStar3.setImageResource(emptyStar) @@ -139,7 +161,7 @@ class ActivitySinglePost : AppCompatActivity() { starNumber=2 } binding.rateStar3.setOnClickListener { - Toast.makeText(this,"kliknuta treca zvezdica",Toast.LENGTH_SHORT).show() + //Toast.makeText(this,"kliknuta treca zvezdica",Toast.LENGTH_SHORT).show() binding.rateStar1.setImageResource(fullStar) binding.rateStar2.setImageResource(fullStar) binding.rateStar3.setImageResource(fullStar) @@ -148,7 +170,7 @@ class ActivitySinglePost : AppCompatActivity() { starNumber=3 } binding.rateStar4.setOnClickListener { - Toast.makeText(this,"kliknuta cetvrta zvezdica",Toast.LENGTH_SHORT).show() + //Toast.makeText(this,"kliknuta cetvrta zvezdica",Toast.LENGTH_SHORT).show() binding.rateStar1.setImageResource(fullStar) binding.rateStar2.setImageResource(fullStar) binding.rateStar3.setImageResource(fullStar) @@ -157,7 +179,7 @@ class ActivitySinglePost : AppCompatActivity() { starNumber=4 } binding.rateStar5.setOnClickListener { - Toast.makeText(this,"kliknuta peta zvezdica",Toast.LENGTH_SHORT).show() + //Toast.makeText(this,"kliknuta peta zvezdica",Toast.LENGTH_SHORT).show() binding.rateStar1.setImageResource(fullStar) binding.rateStar2.setImageResource(fullStar) binding.rateStar3.setImageResource(fullStar) @@ -194,6 +216,7 @@ class ActivitySinglePost : AppCompatActivity() { request.enqueue(object : retrofit2.Callback { override fun onResponse(call: Call, response: Response) { if(response.isSuccessful){ + var newComment=response.body()!! requestGetComments(newComment) binding.NewComment.text.clear() @@ -251,15 +274,31 @@ class ActivitySinglePost : AppCompatActivity() { val postApi= RetrofitHelper.getInstance() val token= SharedPreferencesHelper.getValue("jwt", this@ActivitySinglePost) val request=postApi.addRating("Bearer "+token,post._id,rating) - request.enqueue(object : retrofit2.Callback { - override fun onResponse(call: Call, response: Response) { + request.enqueue(object : retrofit2.Callback { + override fun onResponse(call: Call, response: Response) { if(response.isSuccessful){ - //zasad hardkodovano, zameniti te vrednosti sa brojem ocena kada se doda - post.ratings=((post.ratings)*10+rating.rating)/11 - binding.tvRating.text=String.format("%.2f",post.ratings) - Toast.makeText( - this@ActivitySinglePost, "prosao zahtev", Toast.LENGTH_LONG - ).show() + var data=response.body()!! + binding.tvRating.text=String.format("%.2f",data.ratings) + binding.tvNumberOfRatings.text=String.format("%d",data.ratingscount) + Log.d("--------------",data.ratings.toString()+" "+data.ratingscount.toString()) + when(data.myrating){ + 1->binding.rateStar1.performClick() + 2->binding.rateStar2.performClick() + 3->binding.rateStar3.performClick() + 4->binding.rateStar4.performClick() + 5->binding.rateStar5.performClick() + else->{ + val emptyStar = R.drawable.empty_star + binding.rateStar1.setImageResource(emptyStar) + binding.rateStar2.setImageResource(emptyStar) + binding.rateStar3.setImageResource(emptyStar) + binding.rateStar4.setImageResource(emptyStar) + binding.rateStar5.setImageResource(emptyStar) + } + } + /*Toast.makeText( + this@ActivitySinglePost, "prosao zahtev", Toast.LENGTH_LONG + ).show()*/ }else{ if(response.errorBody()!=null) Log.d("main1",response.errorBody().toString()) @@ -268,7 +307,7 @@ class ActivitySinglePost : AppCompatActivity() { } - override fun onFailure(call: Call, t: Throwable) { + override fun onFailure(call: Call, t: Throwable) { Log.d("main2",t.message.toString()) } }) @@ -284,7 +323,7 @@ class ActivitySinglePost : AppCompatActivity() { tvLocationParent.invalidate() tvRating.text=post.ratings.toString() tvRating.invalidate() - tvNumberOfRatings.text=post.ratings.toString() + tvNumberOfRatings.text=post.ratingscount.toString() tvNumberOfRatings.invalidate() tvDescription.text=post.description tvDescription.invalidate() diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Interfaces/IBackendApi.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Interfaces/IBackendApi.kt index ce8d7e3..dedd0bf 100644 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Interfaces/IBackendApi.kt +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Interfaces/IBackendApi.kt @@ -38,7 +38,7 @@ interface IBackendApi { ,@Part("tags") tags:RequestBody ):Call @POST("api/Post/posts/{id}/addrating") - fun addRating(@Header("Authorization") authHeader:String,@Path("id") id:String,@Body rating: RatingReceive):Call + fun addRating(@Header("Authorization") authHeader:String,@Path("id") id:String,@Body rating: RatingReceive):Call @POST("api/Post/posts/{id}/addcomment") fun addComment(@Header("Authorization") authHeader:String,@Path("id") id:String,@Body rating: CommentReceive):Call @GET("api/Post/posts/{id}/listcomments") diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Models/RatingData.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Models/RatingData.kt new file mode 100644 index 0000000..630c325 --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Models/RatingData.kt @@ -0,0 +1,11 @@ +package com.example.brzodolokacije.Models + +import android.os.Parcelable +import kotlinx.android.parcel.Parcelize + +@Parcelize +data class RatingData( + var ratings:Double, + var ratingscount:Int, + var myrating:Int +):Parcelable \ No newline at end of file -- cgit v1.2.3 From cf3c3a0f9e3beb73b3d7a8f1f49dfe76b458a60b Mon Sep 17 00:00:00 2001 From: "branislav.radivojevic" Date: Mon, 28 Nov 2022 23:35:55 +0100 Subject: Prva iteracije recommended algoritma --- Backend/Api/Api/Controllers/PostController.cs | 7 +++ Backend/Api/Api/Interfaces/IPostService.cs | 1 + Backend/Api/Api/Models/Post.cs | 6 +++ Backend/Api/Api/Services/PostService.cs | 63 +++++++++++++++++++++++++++ 4 files changed, 77 insertions(+) (limited to 'Backend') diff --git a/Backend/Api/Api/Controllers/PostController.cs b/Backend/Api/Api/Controllers/PostController.cs index 88c1c99..6970d28 100644 --- a/Backend/Api/Api/Controllers/PostController.cs +++ b/Backend/Api/Api/Controllers/PostController.cs @@ -171,5 +171,12 @@ namespace Api.Controllers return Ok(await _postService.Get10Best()); } + [HttpGet("posts/recommended")] + [Authorize(Roles = "User")] + public async Task>> Recommended() + { + var userid = await _userService.UserIdFromJwt(); + return Ok(await _postService.Recommended(userid)); + } } } diff --git a/Backend/Api/Api/Interfaces/IPostService.cs b/Backend/Api/Api/Interfaces/IPostService.cs index a9adb05..96786bd 100644 --- a/Backend/Api/Api/Interfaces/IPostService.cs +++ b/Backend/Api/Api/Interfaces/IPostService.cs @@ -26,5 +26,6 @@ namespace Api.Interfaces Task> Get10MostViewed(); Task> Get10Newest(); + Task> Recommended(string userid); } } \ No newline at end of file diff --git a/Backend/Api/Api/Models/Post.cs b/Backend/Api/Api/Models/Post.cs index 78b4705..dd007ec 100644 --- a/Backend/Api/Api/Models/Post.cs +++ b/Backend/Api/Api/Models/Post.cs @@ -108,4 +108,10 @@ namespace Api.Models public int totalposts { get; set; } public List posts { get; set; } } + + public class TagR + { + public int counter { get; set; } + public string tag { get; set; } + } } diff --git a/Backend/Api/Api/Services/PostService.cs b/Backend/Api/Api/Services/PostService.cs index c57cfec..855b231 100644 --- a/Backend/Api/Api/Services/PostService.cs +++ b/Backend/Api/Api/Services/PostService.cs @@ -467,5 +467,68 @@ namespace Api.Services List newest = temp.OrderByDescending(o => o.createdAt).Take(10).ToList(); return newest; } + + public async Task> Recommended(string userid) // momgodb bloat bleh + { + List posts = await UserHistory(userid); + //TODO-LIMIT RECOMMENDED FOR POSTS FROM THIS MONTH ONLY + List tags = new List(); + 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(); + var fiveoftop5tags = new List(); + 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(); + 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(); + taggedposts = fiveoftop5tags.Distinct().OrderByDescending(x => x.createdAt).ToList(); + return taggedposts; + } } } -- cgit v1.2.3 From 10de5c6aa1baf0eafc2cb60054658709b76a0269 Mon Sep 17 00:00:00 2001 From: TAMARA JERINIC Date: Tue, 29 Nov 2022 00:42:34 +0100 Subject: Povezana funkcija za prikupljanje objava korisnika i prikaz objava na profilu. --- Backend/Api/Api/Controllers/PostController.cs | 6 ++ .../Activities/ActivityUserProfile.kt | 23 ++++---- .../Fragments/FragmentUserPostsProfileActivity.kt | 64 ++++++++++++++++++++++ .../brzodolokacije/Interfaces/IBackendApi.kt | 2 + .../src/main/res/layout/activity_user_profile.xml | 2 +- .../fragment_user_posts_profile_activity.xml | 18 ++++++ 6 files changed, 103 insertions(+), 12 deletions(-) create mode 100644 Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentUserPostsProfileActivity.kt create mode 100644 Client/BrzoDoLokacije/app/src/main/res/layout/fragment_user_posts_profile_activity.xml (limited to 'Backend') diff --git a/Backend/Api/Api/Controllers/PostController.cs b/Backend/Api/Api/Controllers/PostController.cs index 3d7199c..7fe9961 100644 --- a/Backend/Api/Api/Controllers/PostController.cs +++ b/Backend/Api/Api/Controllers/PostController.cs @@ -170,5 +170,11 @@ namespace Api.Controllers return Ok(await _postService.Get10Best()); } + [HttpGet("posts/{id}/getUserPosts")] + [Authorize(Roles = "User")] + public async Task>> GetUsersPosts(string id) + { + return Ok(await _postService.GetUsersPosts(id)); + } } } diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ActivityUserProfile.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ActivityUserProfile.kt index 4f48dc7..5119da9 100644 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ActivityUserProfile.kt +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ActivityUserProfile.kt @@ -6,10 +6,12 @@ import android.util.Log import android.widget.* import androidx.appcompat.app.AppCompatActivity import androidx.core.view.isVisible -import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentTransaction import com.bumptech.glide.Glide -import com.example.brzodolokacije.Fragments.FragmentShowUserPosts +import com.example.brzodolokacije.Fragments.FragmentUserPostsProfileActivity import com.example.brzodolokacije.Models.UserReceive +import com.example.brzodolokacije.R import com.example.brzodolokacije.R.* import com.example.brzodolokacije.Services.RetrofitHelper import com.example.brzodolokacije.Services.SharedPreferencesHelper @@ -31,8 +33,7 @@ class ActivityUserProfile : AppCompatActivity() { private lateinit var userObject:UserReceive private lateinit var openChat:ImageButton private lateinit var unfollowUser:Button - private lateinit var followersList: MutableList - private lateinit var followingList: MutableList + private var follow:Boolean=false override fun onCreate(savedInstanceState: Bundle?) { @@ -137,13 +138,13 @@ class ActivityUserProfile : AppCompatActivity() { } showUserPosts.setOnClickListener { - val bundle = Bundle() - bundle.putString("user", Gson().toJson(userObject)) - val fragment = Fragment() - fragment.arguments = bundle - getSupportFragmentManager().beginTransaction() - .replace(id.flActivityProfileFragmentContainer,FragmentShowUserPosts()).commit() - + var fm: FragmentTransaction =supportFragmentManager.beginTransaction() + val fragment = FragmentUserPostsProfileActivity() + val b = Bundle() + b.putString("userId", userObject._id.toString()) + fragment.arguments = b + fm.replace(R.id.flActivityProfileFragmentContainer, fragment) + fm.commit() } } diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentUserPostsProfileActivity.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentUserPostsProfileActivity.kt new file mode 100644 index 0000000..d841430 --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentUserPostsProfileActivity.kt @@ -0,0 +1,64 @@ +package com.example.brzodolokacije.Fragments + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment +import androidx.recyclerview.widget.GridLayoutManager +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.example.brzodolokacije.Adapters.MyPostsAdapter +import com.example.brzodolokacije.Adapters.ShowPostsHomePageAdapter +import com.example.brzodolokacije.Models.PostPreview +import com.example.brzodolokacije.R +import com.example.brzodolokacije.Services.RetrofitHelper +import com.example.brzodolokacije.Services.SharedPreferencesHelper +import retrofit2.Call +import retrofit2.Callback +import retrofit2.Response + + +class FragmentUserPostsProfileActivity : Fragment() { + private lateinit var recyclerView: RecyclerView + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + // Inflate the layout for this fragment + var view =inflater.inflate(R.layout.fragment_user_posts_profile_activity, container, false) + + recyclerView=view.findViewById(R.id.rvFragmentUserPostsProfileActivity) + + val bundle = arguments + val userId = bundle!!.getString("userId") + + val api = RetrofitHelper.getInstance() + val token = SharedPreferencesHelper.getValue("jwt", requireActivity()) + var data = api.getUsersPosts("Bearer " + token, userId!!); + data.enqueue(object : Callback> { + override fun onResponse( + call: Call>, + response: Response> + ) { + if (response.body() == null) { + return + } + var posts = response.body()!!.toMutableList() + recyclerView.apply { + layoutManager= GridLayoutManager(requireContext(),3, + GridLayoutManager.VERTICAL,false) + adapter= MyPostsAdapter(requireActivity(),posts) + } + } + + override fun onFailure(call: Call>, t: Throwable) { + } + }) + + + return view + } + + +} \ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Interfaces/IBackendApi.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Interfaces/IBackendApi.kt index bc8c7ae..923861f 100644 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Interfaces/IBackendApi.kt +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Interfaces/IBackendApi.kt @@ -104,4 +104,6 @@ interface IBackendApi { @GET("/api/user/{id}/unfollow") fun unfollow(@Header("Authorization") authHeader:String,@Path("id") id:String):Call + @GET("api/Post/posts/{id}/getUserPosts") + fun getUsersPosts(@Header("Authorization") authHeader:String,@Path("id") id:String):Call> } \ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/res/layout/activity_user_profile.xml b/Client/BrzoDoLokacije/app/src/main/res/layout/activity_user_profile.xml index 0e90fc7..bb917cf 100644 --- a/Client/BrzoDoLokacije/app/src/main/res/layout/activity_user_profile.xml +++ b/Client/BrzoDoLokacije/app/src/main/res/layout/activity_user_profile.xml @@ -128,7 +128,7 @@ app:layout_constraintHorizontal_bias="0.0" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="@+id/divider" - app:layout_constraintVertical_bias="1.0"> + app:layout_constraintVertical_bias="0.0"> + + + + + + + + \ No newline at end of file -- cgit v1.2.3