From 7d2e70fd3770bf7c8c206f7affa860c06de6b271 Mon Sep 17 00:00:00 2001 From: Ognjen Cirkovic Date: Wed, 7 Dec 2022 21:15:58 +0100 Subject: Prosiren model korisnika sa favourite. Dodavanje favourite objave i kod korisnika i kod objave. --- Backend/Api/Api/Models/User.cs | 4 +++- Backend/Api/Api/Services/PostService.cs | 6 ++++++ Backend/Api/Api/Services/UserService.cs | 10 +++++++--- 3 files changed, 16 insertions(+), 4 deletions(-) (limited to 'Backend') diff --git a/Backend/Api/Api/Models/User.cs b/Backend/Api/Api/Models/User.cs index cf16dbe..52d0f24 100644 --- a/Backend/Api/Api/Models/User.cs +++ b/Backend/Api/Api/Models/User.cs @@ -21,6 +21,7 @@ namespace Api.Models public List following { get; set; } public int followersCount { get; set; } public int followingCount { get; set; } + public List? favourites { get; set; } } public class Login @@ -68,7 +69,8 @@ namespace Api.Models public List following { get; set; } public int followersCount { get; set; } - public int followingCount { get; set; } + public int followingCount { get; set; } + public List? favourites { get; set; } } diff --git a/Backend/Api/Api/Services/PostService.cs b/Backend/Api/Api/Services/PostService.cs index 6d28206..cb59330 100644 --- a/Backend/Api/Api/Services/PostService.cs +++ b/Backend/Api/Api/Services/PostService.cs @@ -557,22 +557,28 @@ namespace Api.Services { string userId = _httpContext.HttpContext.User.FindFirstValue("id"); var result = false; + var user = await _users.Find(x => x._id == userId).FirstOrDefaultAsync(); Post post = await _posts.Find(x => x._id == postId).FirstOrDefaultAsync(); if (userId == null || post==null) return result; if (post.favourites == null) post.favourites = new List(); + if(user.favourites==null) + user.favourites= new List(); if (post.favourites.Contains(userId)) { post.favourites.Remove(userId); + user.favourites.Remove(post._id); result = false; } else { post.favourites.Add(userId); + user.favourites.Add(post._id); result = true; } + await _users.ReplaceOneAsync(x => x._id == user._id, user); await _posts.ReplaceOneAsync(x => x._id == postId, post); return result; diff --git a/Backend/Api/Api/Services/UserService.cs b/Backend/Api/Api/Services/UserService.cs index 781afa8..2b3f0b8 100644 --- a/Backend/Api/Api/Services/UserService.cs +++ b/Backend/Api/Api/Services/UserService.cs @@ -17,9 +17,7 @@ namespace Api.Services private readonly IMongoCollection _posts; private readonly IJwtService _jwtService; private IConfiguration _configuration; - private readonly IFileService _fileService; - - private readonly IMongoCollection _usersSend; + private readonly IFileService _fileService; public UserService(IDatabaseConnection settings, IMongoClient mongoClient, IJwtService jwtService, IHttpContextAccessor httpContextAccessor, IConfiguration configuration, IFileService fileService) { var database = mongoClient.GetDatabase(settings.DatabaseName); @@ -364,6 +362,7 @@ namespace Api.Services tosend.followingCount = user.followingCount; tosend.followers = user.followers; tosend.following = user.following; + tosend.favourites = user.favourites; var userposts = await _posts.Find(x => x.ownerId == user._id).ToListAsync(); tosend.postcount = userposts.Count(); return tosend; @@ -384,6 +383,7 @@ namespace Api.Services tosend.followingCount = user.followingCount; tosend.followers = user.followers; tosend.following = user.following; + tosend.favourites = user.favourites; var userposts = await _posts.Find(x => x.ownerId == user._id).ToListAsync(); tosend.postcount = userposts.Count(); return tosend; @@ -476,6 +476,7 @@ namespace Api.Services follower.followers = utemp.followers; follower.followersCount = utemp.followersCount; follower.followingCount = utemp.followingCount; + follower.favourites = utemp.favourites; follower._id = utemp._id; @@ -515,6 +516,7 @@ namespace Api.Services follower._id = utemp._id; follower.followersCount = utemp.followersCount; follower.followingCount = utemp.followingCount; + follower.favourites = utemp.favourites; following.Add((UserSend)follower); } @@ -558,6 +560,7 @@ namespace Api.Services following._id = utemp._id; following.followersCount = utemp.followersCount; following.followingCount = utemp.followingCount; + following.favourites=utemp.favourites; myFollowings.Add((UserSend)following); } @@ -672,6 +675,7 @@ namespace Api.Services follower.followersCount = utemp.followersCount; follower.followingCount = utemp.followingCount; follower._id = utemp._id; + follower.favourites = utemp.favourites; myfollowers.Add((UserSend)follower); } return myfollowers; -- cgit v1.2.3 From d0f30cf2d8fcd745234b45a3cb450de812da7c61 Mon Sep 17 00:00:00 2001 From: Ognjen Cirkovic Date: Thu, 8 Dec 2022 13:45:26 +0100 Subject: Follow/Unfollow ispravljen. --- Backend/Api/Api/Services/UserService.cs | 22 ++++++++++----- .../Activities/ActivityChangePassword.kt | 1 + .../Activities/ActivitySinglePost.kt | 33 +++++++++++----------- .../Activities/ActivityUserProfile.kt | 32 ++++++++++++--------- 4 files changed, 51 insertions(+), 37 deletions(-) (limited to 'Backend') diff --git a/Backend/Api/Api/Services/UserService.cs b/Backend/Api/Api/Services/UserService.cs index 2b3f0b8..98938c0 100644 --- a/Backend/Api/Api/Services/UserService.cs +++ b/Backend/Api/Api/Services/UserService.cs @@ -416,7 +416,9 @@ namespace Api.Services } User f = await _users.Find(user => user._id == followerId).FirstOrDefaultAsync(); User u = await _users.Find(user => user._id == id).FirstOrDefaultAsync(); - + if(await CheckIfAlreadyFollow(followerId)) + return false; + if (id != null && followerId!=null) { if (f.followers == null) @@ -617,27 +619,33 @@ namespace Api.Services User u = await _users.Find(user => user._id == myId).FirstOrDefaultAsync(); User f = await _users.Find(user => user._id == id).FirstOrDefaultAsync(); - + if(await CheckIfAlreadyFollow(id)) if (u != null) { - if (u.following != null && f.followers!=null) - { u.following.Remove(f._id); + if (u.following == null) + u.following = new List(); u.followingCount=u.following.Count(); + if (u.followers == null) + u.followers = new List(); u.followersCount = u.followers.Count(); f.followers.Remove(u._id); + if (f.followers == null) + f.followers = new List(); f.followersCount =f.followers.Count(); + if (f.following == null) + f.following = new List(); f.followingCount =f.following.Count(); - _users.ReplaceOne(user => user._id == myId, u); - _users.ReplaceOne(user => user._id == id, f); + await _users.ReplaceOneAsync(user => user._id == myId, u); + await _users.ReplaceOneAsync(user => user._id == id, f); //updateUserFollowerFollowingCount(u.followers, u.following, u._id); //updateUserFollowerFollowingCount(f.followers, f.following, f._id); return true; - } + } return false; diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ActivityChangePassword.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ActivityChangePassword.kt index fbe3f4d..08f3e1c 100644 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ActivityChangePassword.kt +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ActivityChangePassword.kt @@ -2,6 +2,7 @@ package com.example.brzodolokacije.Activities import androidx.appcompat.app.AppCompatActivity import android.os.Bundle +import com.example.brzodolokacije.R class ActivityChangePassword : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { 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 2f5b2d2..139d569 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 @@ -184,22 +184,23 @@ class ActivitySinglePost : AppCompatActivity() { } fun loadTags(){ - if(post.tags!=null) - for( item in post.tags!!){ - var newbtn = Button(this) - newbtn.text = item - var layoutParams = LinearLayout.LayoutParams( - LinearLayout.LayoutParams.WRAP_CONTENT, - 50 - ) - layoutParams.setMargins(3) - newbtn.layoutParams=layoutParams - newbtn.setBackgroundColor(Color.parseColor("#1C789A")) - newbtn.setTextColor(Color.WHITE) - newbtn.setTextSize(TypedValue.COMPLEX_UNIT_SP, 10F) - newbtn.setPadding(3,1,3,1) - newbtn.isClickable=false - tagLayout.addView(newbtn) + if(post.tags!=null) { + for (item in post.tags!!) { + var newbtn = Button(this) + newbtn.text = item + var layoutParams = LinearLayout.LayoutParams( + LinearLayout.LayoutParams.WRAP_CONTENT, + 50 + ) + layoutParams.setMargins(3) + newbtn.layoutParams = layoutParams + newbtn.setBackgroundColor(Color.parseColor("#1C789A")) + newbtn.setTextColor(Color.WHITE) + newbtn.setTextSize(TypedValue.COMPLEX_UNIT_SP, 10F) + newbtn.setPadding(3, 1, 3, 1) + newbtn.isClickable = false + tagLayout.addView(newbtn) + } } } 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 4962006..b568d73 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 @@ -92,14 +92,16 @@ class ActivityUserProfile : AppCompatActivity() { call: Call, response: Response ) { - unfollowUser.isVisible=true - unfollowUser.isClickable=true - unfollowUser.isEnabled=true - followUser.isVisible=false - followUser.isClickable=false - followUser.isEnabled=false + if(response.body()==true) { + unfollowUser.isVisible = true + unfollowUser.isClickable = true + unfollowUser.isEnabled = true + followUser.isVisible = false + followUser.isClickable = false + followUser.isEnabled = false - updateUserData() + updateUserData() + } Toast.makeText( this@ActivityUserProfile, "PRATITE KORISNIKA", Toast.LENGTH_LONG @@ -123,13 +125,15 @@ class ActivityUserProfile : AppCompatActivity() { call: Call, response: Response ) { - unfollowUser.isVisible = false - unfollowUser.isClickable = false - unfollowUser.isEnabled = false - followUser.isVisible = true - followUser.isClickable = true - followUser.isEnabled = true - updateUserData() + if(response.body()==true) { + unfollowUser.isVisible = false + unfollowUser.isClickable = false + unfollowUser.isEnabled = false + followUser.isVisible = true + followUser.isClickable = true + followUser.isEnabled = true + updateUserData() + } Toast.makeText( this@ActivityUserProfile, "VIŠE NE PRATITE KORISNIKA", Toast.LENGTH_LONG ).show(); -- cgit v1.2.3 From d77a0e4d7e14251f38d17c5b6c0dc5ff819628a8 Mon Sep 17 00:00:00 2001 From: "branislav.radivojevic" Date: Thu, 8 Dec 2022 13:54:22 +0100 Subject: bugfix zvezdice za ocenjivanje --- Backend/Api/Api/Services/PostService.cs | 6 +- .../Activities/ActivitySinglePost.kt | 32 +++++----- .../Fragments/FragmentSinglePostDescription.kt | 69 ++++++++++++++++------ 3 files changed, 72 insertions(+), 35 deletions(-) (limited to 'Backend') diff --git a/Backend/Api/Api/Services/PostService.cs b/Backend/Api/Api/Services/PostService.cs index cb59330..0799f10 100644 --- a/Backend/Api/Api/Services/PostService.cs +++ b/Backend/Api/Api/Services/PostService.cs @@ -162,7 +162,11 @@ namespace Api.Services tosend.ratingscount = ps.ratingscount; if (p.ownerId == userid) - return null; + { + tosend.myrating = -1; + return tosend; + } + if(rating.rating == 0)// ako nema rating staviti 0 { var r = p.ratings.Find(x => x.userId == 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 2f5b2d2..b7848df 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 @@ -185,22 +185,22 @@ class ActivitySinglePost : AppCompatActivity() { } fun loadTags(){ if(post.tags!=null) - for( item in post.tags!!){ - var newbtn = Button(this) - newbtn.text = item - var layoutParams = LinearLayout.LayoutParams( - LinearLayout.LayoutParams.WRAP_CONTENT, - 50 - ) - layoutParams.setMargins(3) - newbtn.layoutParams=layoutParams - newbtn.setBackgroundColor(Color.parseColor("#1C789A")) - newbtn.setTextColor(Color.WHITE) - newbtn.setTextSize(TypedValue.COMPLEX_UNIT_SP, 10F) - newbtn.setPadding(3,1,3,1) - newbtn.isClickable=false - tagLayout.addView(newbtn) - } + for( item in post.tags!!){ + var newbtn = Button(this) + newbtn.text = item + var layoutParams = LinearLayout.LayoutParams( + LinearLayout.LayoutParams.WRAP_CONTENT, + 50 + ) + layoutParams.setMargins(3) + newbtn.layoutParams=layoutParams + newbtn.setBackgroundColor(Color.parseColor("#1C789A")) + newbtn.setTextColor(Color.WHITE) + newbtn.setTextSize(TypedValue.COMPLEX_UNIT_SP, 10F) + newbtn.setPadding(3,1,3,1) + newbtn.isClickable=false + tagLayout.addView(newbtn) + } } diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentSinglePostDescription.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentSinglePostDescription.kt index 877fbc4..1f17a11 100644 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentSinglePostDescription.kt +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentSinglePostDescription.kt @@ -77,7 +77,7 @@ class FragmentSinglePostDescription : Fragment() { starNumber=1 rate(starNumber) } - star1.setOnClickListener { + star2.setOnClickListener { //Toast.makeText(this,"kliknuta druga zvezdica",Toast.LENGTH_SHORT).show() star1.setImageResource(fullStar) star2.setImageResource(fullStar) @@ -87,7 +87,7 @@ class FragmentSinglePostDescription : Fragment() { starNumber=2 rate(starNumber) } - star1.setOnClickListener { + star3.setOnClickListener { //Toast.makeText(this,"kliknuta treca zvezdica",Toast.LENGTH_SHORT).show() star1.setImageResource(fullStar) star2.setImageResource(fullStar) @@ -97,8 +97,8 @@ class FragmentSinglePostDescription : Fragment() { starNumber=3 rate(starNumber) } - star1.setOnClickListener { - Toast.makeText(requireActivity(),"kliknuta cetvrta zvezdica",Toast.LENGTH_SHORT).show() + star4.setOnClickListener { + //Toast.makeText(requireActivity(),"kliknuta cetvrta zvezdica",Toast.LENGTH_SHORT).show() star1.setImageResource(fullStar) star2.setImageResource(fullStar) star3.setImageResource(fullStar) @@ -107,7 +107,7 @@ class FragmentSinglePostDescription : Fragment() { starNumber=4 rate(starNumber) } - star1.setOnClickListener { + star5.setOnClickListener { //Toast.makeText(this,"kliknuta peta zvezdica",Toast.LENGTH_SHORT).show() star1.setImageResource(fullStar) star2.setImageResource(fullStar) @@ -140,19 +140,52 @@ class FragmentSinglePostDescription : Fragment() { "--------------", data.ratings.toString() + " " + data.ratingscount.toString() ) - when (data.myrating) { - 1 -> star1.performClick() - 2 -> star1.performClick() - 3 -> star3.performClick() - 4 -> star4.performClick() - 5 -> star5.performClick() - else -> { - val emptyStar = R.drawable.empty_star - star1.setImageResource(emptyStar) - star2.setImageResource(emptyStar) - star3.setImageResource(emptyStar) - star4.setImageResource(emptyStar) - star5.setImageResource(emptyStar) + if(rating.rating==0) { + val emptyStar = R.drawable.empty_star + val fullStar = R.drawable.ic_baseline_star_rate_24 + when (data.myrating) { + 1 -> { + star1.setImageResource(fullStar) + star2.setImageResource(emptyStar) + star3.setImageResource(emptyStar) + star4.setImageResource(emptyStar) + star5.setImageResource(emptyStar) + } + 2 -> { + star1.setImageResource(fullStar) + star2.setImageResource(fullStar) + star3.setImageResource(emptyStar) + star4.setImageResource(emptyStar) + star5.setImageResource(emptyStar) + } + 3 -> { + star1.setImageResource(fullStar) + star2.setImageResource(fullStar) + star3.setImageResource(fullStar) + star4.setImageResource(emptyStar) + star5.setImageResource(emptyStar) + } + 4 -> { + star1.setImageResource(fullStar) + star2.setImageResource(fullStar) + star3.setImageResource(fullStar) + star4.setImageResource(fullStar) + star5.setImageResource(emptyStar) + } + 5 -> { + star1.setImageResource(fullStar) + star2.setImageResource(fullStar) + star3.setImageResource(fullStar) + star4.setImageResource(fullStar) + star5.setImageResource(fullStar) + } + else -> { + star1.setImageResource(emptyStar) + star2.setImageResource(emptyStar) + star3.setImageResource(emptyStar) + star4.setImageResource(emptyStar) + star5.setImageResource(emptyStar) + } } } /*Toast.makeText( -- cgit v1.2.3 From 6200ad1b4e30f8e6ed3487b79169862fe4ed0572 Mon Sep 17 00:00:00 2001 From: TAMARA JERINIC Date: Thu, 8 Dec 2022 14:24:23 +0100 Subject: Dodata funkcija za promenu lozinke na back-u. Povezana promena lozinke na front-u. --- Backend/Api/Api/Controllers/UserController.cs | 6 ++ Backend/Api/Api/Interfaces/IUserService.cs | 2 + Backend/Api/Api/Services/UserService.cs | 24 ++++++ .../Activities/ActivityChangePassword.kt | 91 ++++++++++++++++++++++ .../Fragments/FragmentMyProfileInfo.kt | 7 ++ .../brzodolokacije/Interfaces/IBackendApi.kt | 4 + .../main/res/layout/activity_change_password.xml | 1 - 7 files changed, 134 insertions(+), 1 deletion(-) (limited to 'Backend') diff --git a/Backend/Api/Api/Controllers/UserController.cs b/Backend/Api/Api/Controllers/UserController.cs index 73d32ea..30beac4 100644 --- a/Backend/Api/Api/Controllers/UserController.cs +++ b/Backend/Api/Api/Controllers/UserController.cs @@ -162,6 +162,12 @@ namespace Api.Controllers return Ok(await _userService.ChangeMyProfileName(newName)); } + [HttpPost("changePass")] + [Authorize(Roles = "User")] + public async Task> ChangePass(string currentPass, string newPass) + { + return Ok(await _userService.ChangePass(currentPass,newPass)); + } } diff --git a/Backend/Api/Api/Interfaces/IUserService.cs b/Backend/Api/Api/Interfaces/IUserService.cs index f4954e0..855272f 100644 --- a/Backend/Api/Api/Interfaces/IUserService.cs +++ b/Backend/Api/Api/Interfaces/IUserService.cs @@ -40,6 +40,8 @@ namespace Api.Interfaces Task ChangeMyProfileUsername(String newUsername); Task ChangeMyProfileName(String newUsername); + Task ChangePass(string currentPass, string newPass); + } } diff --git a/Backend/Api/Api/Services/UserService.cs b/Backend/Api/Api/Services/UserService.cs index 2b3f0b8..74c0894 100644 --- a/Backend/Api/Api/Services/UserService.cs +++ b/Backend/Api/Api/Services/UserService.cs @@ -733,6 +733,30 @@ namespace Api.Services return false; } + public async Task ChangePass(string currentPass,string newPass) + { + + 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(); + + if (u != null) + { + if (checkPassword(currentPass, u.password)) + { + u.password = hashPassword(newPass); + await _users.ReplaceOneAsync(x => x._id == u._id, u); + return 1; + } + return -1; + } + return -2; + } + } diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ActivityChangePassword.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ActivityChangePassword.kt index fbe3f4d..2501f8a 100644 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ActivityChangePassword.kt +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ActivityChangePassword.kt @@ -1,11 +1,102 @@ package com.example.brzodolokacije.Activities +import android.graphics.Color import androidx.appcompat.app.AppCompatActivity import android.os.Bundle +import android.widget.Button +import android.widget.TextView +import android.widget.Toast +import androidx.core.view.isVisible +import com.exam.DBHelper.Companion.activity +import com.example.brzodolokacije.Models.UserReceive +import com.example.brzodolokacije.R +import com.example.brzodolokacije.Services.RetrofitHelper +import com.example.brzodolokacije.Services.SharedPreferencesHelper +import retrofit2.Call +import retrofit2.Response class ActivityChangePassword : AppCompatActivity() { + + private lateinit var oldPass:TextView + private lateinit var oldPassError:TextView + private lateinit var newPass:TextView + private lateinit var newPassError:TextView + private lateinit var confirmPass:TextView + private lateinit var confirmPassError:TextView + private lateinit var forgotten:TextView + private lateinit var submit:Button + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_change_password) + + oldPass=findViewById(R.id.changeDataOldPassword) + oldPassError=findViewById(R.id.ActivityChangePasswordOldError) + newPass=findViewById(R.id.tvActivityChangePasswordNewPass) + newPassError=findViewById(R.id.btnActivityChangePasswordNewError) + confirmPass=findViewById(R.id.ActivityChangePasswordNewPasswordConfirm) + confirmPassError=findViewById(R.id.btnActivityChangePasswordConfirmError) + forgotten=findViewById(R.id.btnActivityChangePasswordForgottenPass) + submit=findViewById(R.id.ActivityChangePasswordChangePassword) + + oldPassError.isVisible=false + newPassError.isVisible=false + confirmPassError.isVisible=false + + submit.setOnClickListener{ + oldPassError.isVisible=false + newPassError.isVisible=false + confirmPassError.isVisible=false + + if(oldPass.text.toString().trim().isNotEmpty()&&newPass.text.toString().trim().isNotEmpty() + &&confirmPass.text.toString().trim().isNotEmpty()){ + + if(newPass.text.toString().trim() == confirmPass.text.toString().trim()){ + + //PROVERI DA LI JE TRENUTA LOZINKA ISTA KAO TRENUTNI UNOS + + val authApi= RetrofitHelper.getInstance() + val token= SharedPreferencesHelper.getValue("jwt",this@ActivityChangePassword) + val request=authApi.changePass("Bearer "+token) + + request.enqueue(object : retrofit2.Callback { + override fun onResponse(call: Call, response: Response) { + if(response.isSuccessful()){ + var done=response.body()!! + if(done==1){ + Toast.makeText(this@ActivityChangePassword, "Lozinka je uspešno promenjena.", Toast.LENGTH_LONG).show(); + } + else if(done==-1){ + oldPassError.isVisible=true + oldPassError.text="Uneta lozinka nije odgovarajuća, pokušajte ponovo." + oldPassError.setTextColor(Color.RED) + + } + else if(done==-2){ + Toast.makeText(this@ActivityChangePassword, "Lozinka nije promenjena. Pokušajte ponovo", Toast.LENGTH_LONG).show(); + } + }else{ + if(response.errorBody()!=null) + Toast.makeText(this@ActivityChangePassword, response.errorBody()!!.string(), Toast.LENGTH_LONG).show(); + } + } + override fun onFailure(call: Call, t: Throwable) { + Toast.makeText( + activity, t.toString(), Toast.LENGTH_LONG + ).show(); + } + }) + } + else{ + confirmPassError.isVisible=true + confirmPassError.text="Lozinke se ne podudaraju." + confirmPassError.setTextColor(Color.RED) + } + } + } + + + + } } \ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentMyProfileInfo.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentMyProfileInfo.kt index d6e345b..23de46e 100644 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentMyProfileInfo.kt +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentMyProfileInfo.kt @@ -9,6 +9,7 @@ import android.widget.Button import androidx.core.content.ContextCompat.startActivity import androidx.fragment.app.Fragment import com.exam.DBHelper +import com.example.brzodolokacije.Activities.ActivityChangePassword import com.example.brzodolokacije.Activities.ActivityChangeUserData import com.example.brzodolokacije.Activities.ActivityForgottenPassword import com.example.brzodolokacije.Activities.ActivityLoginRegister @@ -19,6 +20,7 @@ import com.example.brzodolokacije.Services.SharedPreferencesHelper class FragmentMyProfileInfo : Fragment() { private lateinit var logout:Button private lateinit var changeAccount:Button + private lateinit var changePassword:Button override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -29,6 +31,7 @@ class FragmentMyProfileInfo : Fragment() { logout=view.findViewById(R.id.buttonLogOut) as Button changeAccount=view.findViewById(R.id.changeAccountData) + changePassword=view.findViewById(R.id.ChangePassword) logout.setOnClickListener{ logOut() @@ -38,6 +41,10 @@ class FragmentMyProfileInfo : Fragment() { val intent = Intent (getActivity(), ActivityChangeUserData::class.java) getActivity()?.startActivity(intent) } + changePassword.setOnClickListener { + val intent = Intent (getActivity(), ActivityChangePassword::class.java) + getActivity()?.startActivity(intent) + } return view } 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 19b1bb5..960c56d 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 @@ -121,4 +121,8 @@ interface IBackendApi { @GET("/api/user/{newName}/changeMyName") fun changeMyName(@Header("Authorization") authHeader:String,@Path("newName") newName:String):Call + + @POST("/api/user/changePass") + fun changePass(@Header("Authorization") authHeader:String):Call + } \ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/res/layout/activity_change_password.xml b/Client/BrzoDoLokacije/app/src/main/res/layout/activity_change_password.xml index a7a1d5f..dc8243e 100644 --- a/Client/BrzoDoLokacije/app/src/main/res/layout/activity_change_password.xml +++ b/Client/BrzoDoLokacije/app/src/main/res/layout/activity_change_password.xml @@ -154,7 +154,6 @@ android:hint="Unesi novu lozinku" android:inputType="textPassword" app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintHorizontal_bias="0.0" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/changeDataNewPasswordConfirmInputt" /> -- cgit v1.2.3 From 5890d30b3bb77175d114e7c0630ec4038154365c Mon Sep 17 00:00:00 2001 From: Ognjen Cirkovic Date: Thu, 8 Dec 2022 14:58:31 +0100 Subject: Dodat broj omiljenih objava na back-u. Napravljen dizajn fragmenta za prikaz statistike --- Backend/Api/Api/Models/User.cs | 1 + Backend/Api/Api/Services/PostService.cs | 3 + .../res/drawable/ic_baseline_calendar_month_24.xml | 5 ++ .../main/res/drawable/ic_baseline_favorite_24.xml | 2 +- .../src/main/res/drawable/ic_baseline_star_24.xml | 5 ++ .../main/res/drawable/ic_baseline_star_half_24.xml | 5 ++ .../res/layout/fragment_profile_statistics.xml | 88 ++++++++++++++++++++-- 7 files changed, 100 insertions(+), 9 deletions(-) create mode 100644 Client/BrzoDoLokacije/app/src/main/res/drawable/ic_baseline_calendar_month_24.xml create mode 100644 Client/BrzoDoLokacije/app/src/main/res/drawable/ic_baseline_star_24.xml create mode 100644 Client/BrzoDoLokacije/app/src/main/res/drawable/ic_baseline_star_half_24.xml (limited to 'Backend') diff --git a/Backend/Api/Api/Models/User.cs b/Backend/Api/Api/Models/User.cs index 52d0f24..620c9c8 100644 --- a/Backend/Api/Api/Models/User.cs +++ b/Backend/Api/Api/Models/User.cs @@ -82,6 +82,7 @@ namespace Api.Models public int numberOfRatingsOnPosts { get; set; } public double averagePostRatingOnPosts {get; set; } public List monthlyViews { get; set; } + public int numberOfFavouritePosts { get; set; } } public class MonthlyViews diff --git a/Backend/Api/Api/Services/PostService.cs b/Backend/Api/Api/Services/PostService.cs index 0799f10..16ebbb7 100644 --- a/Backend/Api/Api/Services/PostService.cs +++ b/Backend/Api/Api/Services/PostService.cs @@ -672,6 +672,7 @@ namespace Api.Services stats.numberOfPosts = 0; stats.totalViews = 0; stats.monthlyViews = new List(); + stats.numberOfFavouritePosts = 0; if(posts != null) @@ -691,6 +692,8 @@ namespace Api.Services stats.totalViews += post.views; stats.numberOfRatingsOnPosts += post.ratingscount; stats.numberOfPosts++; + if(post.favourites!=null) + stats.numberOfFavouritePosts+=post.favourites.Count; ratingsum += post.ratings * post.ratingscount; } if(stats.numberOfRatingsOnPosts > 0) //don't forget to check div by 0 jesus diff --git a/Client/BrzoDoLokacije/app/src/main/res/drawable/ic_baseline_calendar_month_24.xml b/Client/BrzoDoLokacije/app/src/main/res/drawable/ic_baseline_calendar_month_24.xml new file mode 100644 index 0000000..a278444 --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/res/drawable/ic_baseline_calendar_month_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/Client/BrzoDoLokacije/app/src/main/res/drawable/ic_baseline_favorite_24.xml b/Client/BrzoDoLokacije/app/src/main/res/drawable/ic_baseline_favorite_24.xml index 84df34b..2dbc440 100644 --- a/Client/BrzoDoLokacije/app/src/main/res/drawable/ic_baseline_favorite_24.xml +++ b/Client/BrzoDoLokacije/app/src/main/res/drawable/ic_baseline_favorite_24.xml @@ -1,4 +1,4 @@ - diff --git a/Client/BrzoDoLokacije/app/src/main/res/drawable/ic_baseline_star_24.xml b/Client/BrzoDoLokacije/app/src/main/res/drawable/ic_baseline_star_24.xml new file mode 100644 index 0000000..88f8d7a --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/res/drawable/ic_baseline_star_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/Client/BrzoDoLokacije/app/src/main/res/drawable/ic_baseline_star_half_24.xml b/Client/BrzoDoLokacije/app/src/main/res/drawable/ic_baseline_star_half_24.xml new file mode 100644 index 0000000..d532b23 --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/res/drawable/ic_baseline_star_half_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/Client/BrzoDoLokacije/app/src/main/res/layout/fragment_profile_statistics.xml b/Client/BrzoDoLokacije/app/src/main/res/layout/fragment_profile_statistics.xml index d5d72d1..fc1152b 100644 --- a/Client/BrzoDoLokacije/app/src/main/res/layout/fragment_profile_statistics.xml +++ b/Client/BrzoDoLokacije/app/src/main/res/layout/fragment_profile_statistics.xml @@ -23,7 +23,17 @@ + android:layout_height="match_parent" + android:layout_marginRight="5dp" + android:text="Broj pregleda" + android:gravity="center"/> + @@ -39,11 +49,21 @@ + android:src="@drawable/ic_baseline_star_24" /> + android:layout_height="match_parent" + android:layout_marginRight="5dp" + android:text="Broj ocena" + android:gravity="center"/> + @@ -59,11 +79,52 @@ + android:src="@drawable/ic_baseline_star_half_24" /> + + + + + + + + + + android:layout_height="match_parent" + android:layout_marginRight="5dp" + android:text="Broj omiljenih objava" + android:gravity="center"/> + + @@ -74,18 +135,29 @@ android:orientation="horizontal" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/linearLayout5"> + app:layout_constraintTop_toBottomOf="@+id/linearLayout7"> + android:src="@drawable/ic_baseline_calendar_month_24" /> + android:layout_marginRight="5dp" + android:layout_height="match_parent" + android:text="Pregledi po mesecima" + android:gravity="center"/> + + \ No newline at end of file -- cgit v1.2.3 From 1ab59a4b3dc257e5b8bd7dd08eb8eeb043f33dea Mon Sep 17 00:00:00 2001 From: "branislav.radivojevic" Date: Fri, 9 Dec 2022 00:27:43 +0100 Subject: konacne ispravke i feature za Single Post --- Backend/Api/Api/Controllers/AuthController.cs | 10 ++ Backend/Api/Api/Controllers/PostController.cs | 2 +- Backend/Api/Api/Services/PostService.cs | 2 +- .../Activities/ActivitySinglePost.kt | 12 +- .../Fragments/FragmentSinglePostDescription.kt | 125 ++++++++++++++++++++- .../brzodolokacije/Interfaces/IBackendApi.kt | 5 +- .../src/main/res/layout/activity_single_post.xml | 14 ++- .../layout/fragment_single_post_description.xml | 54 ++++++++- 8 files changed, 207 insertions(+), 17 deletions(-) (limited to 'Backend') diff --git a/Backend/Api/Api/Controllers/AuthController.cs b/Backend/Api/Api/Controllers/AuthController.cs index abb7adc..b63665b 100644 --- a/Backend/Api/Api/Controllers/AuthController.cs +++ b/Backend/Api/Api/Controllers/AuthController.cs @@ -120,5 +120,15 @@ namespace Api.Controllers return base.Content(html, "text/html"); } } + [HttpGet("jwttoid")] + [Authorize(Roles = "User")] + public async Task> JwtToUserId() + { + var userid = await _userService.UserIdFromJwt(); + if (userid != null) + return Ok(userid); + return BadRequest(); + } + } } diff --git a/Backend/Api/Api/Controllers/PostController.cs b/Backend/Api/Api/Controllers/PostController.cs index 61a4f48..33c240c 100644 --- a/Backend/Api/Api/Controllers/PostController.cs +++ b/Backend/Api/Api/Controllers/PostController.cs @@ -56,7 +56,7 @@ namespace Api.Controllers } return BadRequest(); } - [HttpGet("posts/delete/{id}")] + [HttpDelete("posts/delete/{id}")] [Authorize(Roles = "User")] public async Task> deletePost(string id) { diff --git a/Backend/Api/Api/Services/PostService.cs b/Backend/Api/Api/Services/PostService.cs index 16ebbb7..07e225e 100644 --- a/Backend/Api/Api/Services/PostService.cs +++ b/Backend/Api/Api/Services/PostService.cs @@ -115,7 +115,7 @@ namespace Api.Services foreach (var image in p.images) System.IO.File.Delete(image.path); - await _posts.DeleteOneAsync(postid); + await _posts.FindOneAndDeleteAsync(x => x._id==postid); return true; } 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 74b5f4c..2aff051 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 @@ -51,8 +51,11 @@ class ActivitySinglePost : AppCompatActivity() { private var recyclerViewComments: RecyclerView?=null private var favouriteImage: ImageView?=null private lateinit var tagLayout: LinearLayout + private lateinit var createdAt:TextView public lateinit var post: PostPreview + public lateinit var ratings:TextView + public lateinit var ratingscount:TextView private var comments:MutableList?=mutableListOf() private var starNumber:Number=0 @@ -140,7 +143,6 @@ class ActivitySinglePost : AppCompatActivity() { recyclerViewImages?.setHasFixedSize(true) recyclerViewImages?.layoutManager = layoutManagerImages recyclerViewImages?.adapter = adapterImages - } btnChangeHeightDown.setOnClickListener { btnChangeHeightDown.isVisible=false @@ -206,7 +208,10 @@ class ActivitySinglePost : AppCompatActivity() { } } - + public fun updateratings(rc:Int,r:Double){ + binding.tvRating.text=r.toString() + binding.tvNumberOfRatings.text=rc.toString() + } fun loadFavourite(){ @@ -282,7 +287,8 @@ class ActivitySinglePost : AppCompatActivity() { tvNumberOfRatings.invalidate() //tvRating.text=String.format("%.2f",data.ratings) //tvNumberOfRatings.text=String.format("%d",data.ratingscount) - + tvDatePosted.text=post.createdAt.toLocaleString() + tvDatePosted.invalidate() } diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentSinglePostDescription.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentSinglePostDescription.kt index 1f17a11..6e37052 100644 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentSinglePostDescription.kt +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentSinglePostDescription.kt @@ -1,21 +1,24 @@ package com.example.brzodolokacije.Fragments +import android.content.Intent import android.os.Bundle import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import android.widget.ImageButton +import android.widget.Button import android.widget.ImageView import android.widget.TextView -import android.widget.Toast +import androidx.core.view.isGone +import androidx.core.view.isVisible import androidx.fragment.app.Fragment +import com.example.brzodolokacije.Activities.ActivitySinglePost +import com.example.brzodolokacije.Activities.NavigationActivity import com.example.brzodolokacije.Models.* import com.example.brzodolokacije.R import com.example.brzodolokacije.Services.RetrofitHelper import com.example.brzodolokacije.Services.SharedPreferencesHelper import com.google.gson.Gson -import org.w3c.dom.Text import retrofit2.Call import retrofit2.Response @@ -30,6 +33,13 @@ class FragmentSinglePostDescription : Fragment() { private lateinit var star5:ImageView private var starNumber:Number=0 private lateinit var post:PostPreview + private lateinit var parentact:ActivitySinglePost + private lateinit var ocenitext:TextView + private lateinit var userid:String + private lateinit var del:TextView + private lateinit var delbtn:Button + private lateinit var delbtnY:Button + private lateinit var delbtnN:Button override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -37,7 +47,7 @@ class FragmentSinglePostDescription : Fragment() { ): View? { var view=inflater.inflate(R.layout.fragment_single_post_description, container, false) - + parentact = activity as ActivitySinglePost //uzmi post prosledjen iz single post @@ -45,10 +55,18 @@ class FragmentSinglePostDescription : Fragment() { var jsonPostObject = args!!.getString("post") post= Gson().fromJson(jsonPostObject, PostPreview::class.java) + //setuj opis descriptionContainer=view.findViewById(R.id.tvDescription) descriptionContainer.text=post.description.toString() + + del=view.findViewById(R.id.tvObrisi) + delbtn=view.findViewById(R.id.btnObrisi) + delbtnY=view.findViewById(R.id.btnObrisiY) + delbtnN=view.findViewById(R.id.btnObrisiN) + userid="" + ocenitext=view.findViewById(R.id.title) //setuj zvezdice star1=view.findViewById(R.id.rateStar1) star2=view.findViewById(R.id.rateStar2) @@ -57,15 +75,17 @@ class FragmentSinglePostDescription : Fragment() { star5=view.findViewById(R.id.rateStar5) setRatingListeners() + val alreadyrated= RatingReceive(starNumber.toInt(),post._id) requestAddRating(alreadyrated) - + toggleStarRatings() return view } fun setRatingListeners() { val emptyStar = R.drawable.ic_round_star_outline_24 val fullStar = R.drawable.ic_baseline_star_rate_24 + val offStar = R.drawable.ic_baseline_star_24 star1.setOnClickListener { //Toast.makeText(this,"kliknuta prva zvezdica",Toast.LENGTH_SHORT).show() @@ -140,9 +160,11 @@ class FragmentSinglePostDescription : Fragment() { "--------------", data.ratings.toString() + " " + data.ratingscount.toString() ) + parentact.updateratings(data.ratingscount,data.ratings) if(rating.rating==0) { val emptyStar = R.drawable.empty_star val fullStar = R.drawable.ic_baseline_star_rate_24 + when (data.myrating) { 1 -> { star1.setImageResource(fullStar) @@ -204,4 +226,97 @@ class FragmentSinglePostDescription : Fragment() { } }) } + fun toggleStarRatings(){ + var token= SharedPreferencesHelper.getValue("jwt", requireActivity()).toString() + val api= RetrofitHelper.getInstance() + val request= api.getUserId("Bearer " + token) + request.enqueue(object : retrofit2.Callback { + override fun onResponse(call: Call, + response: Response + ) { + if (response.body() == null) { + return + } + userid=response.body().toString() + Log.d("UID TEST",userid) + if(post.ownerId==userid){ + //val offStar = R.drawable.ic_baseline_star_24 + ocenitext.text="Vlasnik posta ne moze ocenjivati sebe" + /*star1.setImageResource(offStar) + star2.setImageResource(offStar) + star3.setImageResource(offStar) + star4.setImageResource(offStar) + star5.setImageResource(offStar)*/ + star1.isEnabled=false + star2.isEnabled=false + star3.isEnabled=false + star4.isEnabled=false + star5.isEnabled=false + + ocenitext.isVisible=false + ocenitext.isGone=true + star1.isVisible=false + star1.isGone=true + star2.isVisible=false + star2.isGone=true + star3.isVisible=false + star3.isGone=true + star4.isVisible=false + star4.isGone=true + star5.isVisible=false + star5.isGone=true + + delbtn.isGone=false + delbtn.setOnClickListener{ + del.isGone=false + delbtnY.isGone=false + delbtnN.isGone=false + delbtn.isGone=true + delbtnY.setOnClickListener { + deletePostreq() + } + delbtnN.setOnClickListener { + del.isGone=true + delbtnY.isGone=true + delbtnN.isGone=true + delbtn.isGone=false + } + } + + + } + } + + override fun onFailure(call: Call, t: Throwable) { + + } + }) + + + } + + fun deletePostreq(){ + var token= SharedPreferencesHelper.getValue("jwt", requireActivity()).toString() + val api= RetrofitHelper.getInstance() + val request= api.DeletePost("Bearer " + token,post._id) + request.enqueue(object : retrofit2.Callback { + override fun onResponse( + call: Call, + response: Response + ) { + if(response.isSuccessful){ + SharedPreferencesHelper.addValue("jwt",token,activity!!) + val intent= Intent(activity!!, NavigationActivity::class.java) + startActivity(intent) + activity!!.finish() + } + + } + + override fun onFailure(call: Call, t: Throwable) { + + } + }) + } + } \ 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 f6dfdcf..66a78d3 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 @@ -126,5 +126,8 @@ interface IBackendApi { fun changePass(@Header("Authorization") authHeader:String):Call @GET("/api/user/{username}/profile/stats") fun getUserStatsFromUsername(@Header("Authorization") authHeader:String,@Path("username") username:String):Call - + @GET("/api/auth/jwttoid") + fun getUserId(@Header("Authorization") authHeader:String):Call + @DELETE("api/Post/posts/delete/{id}") + fun DeletePost(@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_single_post.xml b/Client/BrzoDoLokacije/app/src/main/res/layout/activity_single_post.xml index 15e81cf..0f8c527 100644 --- a/Client/BrzoDoLokacije/app/src/main/res/layout/activity_single_post.xml +++ b/Client/BrzoDoLokacije/app/src/main/res/layout/activity_single_post.xml @@ -89,11 +89,23 @@ android:gravity="top|start" android:padding="@dimen/text_padding" android:text="User" - android:textSize="17dp" + android:textSize="20dp" android:textStyle="bold" + android:textColor="#FF03DAC5" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/tvLocationType" /> + + + + + +