diff options
7 files changed, 112 insertions, 28 deletions
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<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)) 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<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<CommentSend> AddComment(CommentReceive cmnt, string userid, string postid); Task<List<CommentSend>> 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<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(); @@ -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<Boolean> 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<ImageButton> = mutableListOf() + fun setRatingListeners() { + val emptyStar = R.drawable.empty_star + val fullStar = R.drawable.full_star + /*var starlist: ArrayList<ImageButton> = 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<CommentSend?> { override fun onResponse(call: Call<CommentSend?>, response: Response<CommentSend?>) { 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<ResponseBody?> { - override fun onResponse(call: Call<ResponseBody?>, response: Response<ResponseBody?>) { + request.enqueue(object : retrofit2.Callback<RatingData?> { + override fun onResponse(call: Call<RatingData?>, response: Response<RatingData?>) { 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<ResponseBody?>, t: Throwable) { + override fun onFailure(call: Call<RatingData?>, 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<PostPreview> @POST("api/Post/posts/{id}/addrating") - fun addRating(@Header("Authorization") authHeader:String,@Path("id") id:String,@Body rating: RatingReceive):Call<ResponseBody> + fun addRating(@Header("Authorization") authHeader:String,@Path("id") id:String,@Body rating: RatingReceive):Call<RatingData> @POST("api/Post/posts/{id}/addcomment") fun addComment(@Header("Authorization") authHeader:String,@Path("id") id:String,@Body rating: CommentReceive):Call<CommentSend> @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 |