diff options
12 files changed, 233 insertions, 58 deletions
diff --git a/Backend/Api/Api/Controllers/UserController.cs b/Backend/Api/Api/Controllers/UserController.cs index 7764af1..ada0f35 100644 --- a/Backend/Api/Api/Controllers/UserController.cs +++ b/Backend/Api/Api/Controllers/UserController.cs @@ -89,14 +89,26 @@ 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)); + } } } diff --git a/Backend/Api/Api/Interfaces/IUserService.cs b/Backend/Api/Api/Interfaces/IUserService.cs index 5770de1..21dcdc0 100644 --- a/Backend/Api/Api/Interfaces/IUserService.cs +++ b/Backend/Api/Api/Interfaces/IUserService.cs @@ -27,8 +27,11 @@ 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); } } diff --git a/Backend/Api/Api/Services/UserService.cs b/Backend/Api/Api/Services/UserService.cs index f616d99..7bfc24a 100644 --- a/Backend/Api/Api/Services/UserService.cs +++ b/Backend/Api/Api/Services/UserService.cs @@ -380,20 +380,25 @@ namespace Api.Services return tosend; } - public async Task<Boolean> AddFollower(string userId,string followerId) + public async Task<Boolean> AddFollower(string followerId) { - User u = await _users.Find(user => user._id==userId).FirstOrDefaultAsync(); + string id = null; + if (_httpContext.HttpContext.User.FindFirstValue("id") != null) + { + id = _httpContext.HttpContext.User.FindFirstValue("id").ToString(); + } User f = await _users.Find(user => user._id == followerId).FirstOrDefaultAsync(); - - if (userId != null && followerId!=null) + User u = await _users.Find(user => user._id == id).FirstOrDefaultAsync(); + + if (id != null && followerId!=null) { 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); + f.following.Add(id); + _users.ReplaceOne(user=>user._id==id, u); _users.ReplaceOne(user => user._id == followerId, f); return true; } @@ -428,6 +433,7 @@ namespace Api.Services followers.Add((UserSend)follower); } } + u.followersCount=followers.Count() ; return followers; } return null; @@ -459,9 +465,83 @@ namespace Api.Services 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.pfp = utemp.pfp; + following.username = utemp.username; + following.email = utemp.username; + 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; + } } } diff --git a/Client/BrzoDoLokacije/.idea/deploymentTargetDropDown.xml b/Client/BrzoDoLokacije/.idea/deploymentTargetDropDown.xml index 6d9839f..394c76a 100644 --- a/Client/BrzoDoLokacije/.idea/deploymentTargetDropDown.xml +++ b/Client/BrzoDoLokacije/.idea/deploymentTargetDropDown.xml @@ -12,6 +12,6 @@ </deviceKey> </Target> </targetSelectedWithDropDown> - <timeTargetWasSelectedWithDropDown value="2022-11-27T22:12:40.688602400Z" /> + <timeTargetWasSelectedWithDropDown value="2022-11-28T13:21:51.009462400Z" /> </component> </project>
\ No newline at end of file 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 0e9c9da..e925984 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 @@ -303,6 +303,7 @@ class ActivitySinglePost : AppCompatActivity() { } fun translateOwnerIdToName(id:String) { + //binding.tvUser.text="proba" var token= SharedPreferencesHelper.getValue("jwt", this).toString() val api= RetrofitHelper.getInstance() val request= api.getProfileFromId("Bearer " + token, id) @@ -313,6 +314,7 @@ class ActivitySinglePost : AppCompatActivity() { return } userData = response.body()!! + binding.tvUser.text= userData!!.username.toString() } @@ -322,4 +324,5 @@ class ActivitySinglePost : AppCompatActivity() { }) } + } 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 2d290db..c03dbd3 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 @@ -1,26 +1,28 @@ package com.example.brzodolokacije.Activities +import android.annotation.SuppressLint +import android.graphics.Color +import android.graphics.PorterDuff +import android.graphics.drawable.Drawable import android.os.Bundle -import android.widget.Button -import android.widget.FrameLayout -import android.widget.ImageButton -import android.widget.ImageView -import android.widget.TextView -import androidx.annotation.DrawableRes +import android.util.Log +import android.widget.* import androidx.appcompat.app.AppCompatActivity +import androidx.core.content.ContextCompat import androidx.fragment.app.Fragment import com.bumptech.glide.Glide import com.example.brzodolokacije.Fragments.FragmentShowUserPosts -import com.example.brzodolokacije.Models.PostPreview -import com.example.brzodolokacije.Models.User 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 import com.google.gson.Gson import retrofit2.Call import retrofit2.Callback import retrofit2.Response +import java.security.AccessController.getContext + class ActivityUserProfile : AppCompatActivity() { private lateinit var name:TextView @@ -28,58 +30,125 @@ class ActivityUserProfile : AppCompatActivity() { private lateinit var followersNumber:TextView private lateinit var followingNumber:TextView private lateinit var profilePicture:ImageView - private lateinit var followUser: ImageButton + private lateinit var followUser: Button private lateinit var showUserPosts: Button private lateinit var fragmentContainer: FrameLayout - private lateinit var myObject:UserReceive + private lateinit var userObject:UserReceive + private lateinit var openChat:ImageButton + + private lateinit var followersList: MutableList<UserReceive> + private lateinit var followingList: MutableList<UserReceive> + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setContentView(R.layout.activity_user_profile) + setContentView(layout.activity_user_profile) - name=findViewById(R.id.tvActivityUserProfileName) - postsNumber=findViewById(R.id.tvActivityUserProfilePostsNo) - followersNumber=findViewById(R.id.tvActivityUserProfileFollowersNo) - followingNumber=findViewById(R.id.tvActivityUserProfileFollowNo) - profilePicture=findViewById(R.id.tvActivityProfileProfilePicture) - followUser=findViewById(R.id.btnActivityUserProfileFollow) - showUserPosts=findViewById(R.id.btnActivityUserProfileShowPosts) - fragmentContainer=findViewById(R.id.flActivityProfileFragmentContainer) + name=findViewById(id.tvActivityUserProfileName) + postsNumber=findViewById(id.tvActivityUserProfilePostsNo) + followersNumber=findViewById(id.tvActivityUserProfileFollowersNo) + followingNumber=findViewById(id.tvActivityUserProfileFollowNo) + profilePicture=findViewById(id.tvActivityProfileProfilePicture) + followUser=findViewById(id.btnActivityUserProfileFollow) + showUserPosts=findViewById(id.btnActivityUserProfileShowPosts) + fragmentContainer=findViewById(id.flActivityProfileFragmentContainer) + openChat=findViewById(id.activityUserProfileOpenChat) val jsonMyObject: String val extras = intent.extras if (extras != null) { jsonMyObject = extras.getString("user")!! - myObject= Gson().fromJson(jsonMyObject, UserReceive::class.java) + //val myObject: UserReceive = Gson().fromJson(jsonMyObject, UserReceive::class.java) - name.text=myObject.name - postsNumber.text=myObject.postNumber.toString() - followersNumber.text=myObject.followers.toString() - followingNumber.text=myObject.following.toString() + userObject= Gson().fromJson(jsonMyObject, UserReceive::class.java) - if(myObject.pfp!=null) { + name.text=userObject.name + postsNumber.text=userObject.postNumber.toString() + followersNumber.text=userObject?.followersCount.toString() + followingNumber.text=userObject?.followingCount.toString() + + if(userObject.pfp!=null) { Glide.with(this) - .load(RetrofitHelper.baseUrl + "/api/post/image/" + myObject.pfp!!._id) + .load(RetrofitHelper.baseUrl + "/api/post/image/" + userObject.pfp!!._id) .circleCrop()//Round image .into(profilePicture) } } + checkIfAlreadyFollow() + followUser.setOnClickListener{ + + checkIfAlreadyFollow() + + val api = RetrofitHelper.getInstance() val token= SharedPreferencesHelper.getValue("jwt", this@ActivityUserProfile) - api.addFollower("Bearer "+token,myObject._id); + var data=api.addFollower("Bearer "+token,userObject._id); + data.enqueue(object : Callback<Boolean> { + override fun onResponse( + call: Call<Boolean>, + response: Response<Boolean> + ) { + Toast.makeText( + this@ActivityUserProfile, "PRATITE KORISNIKA", Toast.LENGTH_LONG + ).show(); + } + override fun onFailure(call: Call<Boolean>, t: Throwable) { + Toast.makeText( + this@ActivityUserProfile, t.toString(), Toast.LENGTH_LONG + ).show(); + } + }) } showUserPosts.setOnClickListener { val bundle = Bundle() - bundle.putString("user", Gson().toJson(myObject)) + bundle.putString("user", Gson().toJson(userObject)) val fragment = Fragment() fragment.arguments = bundle getSupportFragmentManager().beginTransaction() - .replace(R.id.flActivityProfileFragmentContainer,FragmentShowUserPosts()).commit() + .replace(id.flActivityProfileFragmentContainer,FragmentShowUserPosts()).commit() } } + fun checkIfAlreadyFollow(){ + val api = RetrofitHelper.getInstance() + val token= SharedPreferencesHelper.getValue("jwt", this@ActivityUserProfile) + var data=api.checkIfAlreadyFollow("Bearer "+token,userObject._id); + data.enqueue(object : Callback<Boolean> { + + override fun onFailure(call: Call<Boolean>, t: Throwable) {; + Log.d("fail","faillllllllllllllllllllllllllllllllllllllllllllllllllllllll") + Log.d("fail",t.toString()) + } + + @SuppressLint("ResourceAsColor") + override fun onResponse(call: Call<Boolean>, response: Response<Boolean>) { + Log.d("success","successsssssssssssssssssss") + if (response.body() == null) { + return + } + var follow = response.body()!! + if(follow){ + Log.d("success","follow") + followUser.setCompoundDrawablesWithIntrinsicBounds(drawable.ic_outline_person_remove_24,0,0,0) + followUser.text="Ne prati više" + + } + if(!follow){ + Log.d("success","not follow") + followUser.setCompoundDrawablesWithIntrinsicBounds(drawable.ic_outline_person_add_alt_24,0,0,0) + followUser.text="Prati" + } + + } + }) + + } + + fun checkIfAlreadyFollowChangeButton(){ + + } }
\ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentFollowers.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentFollowers.kt index f1d9321..7450134 100644 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentFollowers.kt +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentFollowers.kt @@ -44,7 +44,7 @@ class FragmentFollowers : Fragment() { ).show(); } - getFollowers() + //getFollowers() btnBack.setOnClickListener { val fragmentProfile = FragmentProfile() @@ -56,7 +56,7 @@ class FragmentFollowers : Fragment() { return view } - fun getFollowers(){ + /* fun getFollowers(){ val api = RetrofitHelper.getInstance() val data=api.getFollowers(userId) data.enqueue(object : Callback<MutableList<UserReceive>> { @@ -80,5 +80,5 @@ class FragmentFollowers : Fragment() { ).show(); } }) - } + }*/ }
\ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentFollowing.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentFollowing.kt index b7a40dc..6f2ce65 100644 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentFollowing.kt +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentFollowing.kt @@ -38,7 +38,7 @@ class FragmentFollowing : Fragment() { ).show(); } - getFollowing() + //getFollowing() back.setOnClickListener { val fragmentProfile = FragmentProfile() @@ -50,7 +50,7 @@ class FragmentFollowing : Fragment() { return view } - fun getFollowing(){ + /*fun getFollowing(){ val api = RetrofitHelper.getInstance() val data=api.getFollowers(userId) data.enqueue(object : Callback<MutableList<UserReceive>> { @@ -74,5 +74,5 @@ class FragmentFollowing : Fragment() { ).show(); } }) - } + }*/ }
\ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentProfile.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentProfile.kt index 3427658..669b978 100644 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentProfile.kt +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentProfile.kt @@ -214,8 +214,8 @@ class FragmentProfile : Fragment(com.example.brzodolokacije.R.layout.fragment_pr username.setText("@"+user.username) postsCount.setText(user.postcount.toString()) - followersCount.setText(user.followersNumber.toString()) - followingCount.setText(user.followingNumber.toString()) + followersCount.setText(user.followersCount.toString()) + followingCount.setText(user.followingCount.toString()) userId=user._id 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 8556047..fc2d24f 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 @@ -72,14 +72,14 @@ interface IBackendApi { //@POST("putanja") //fun add(@Body obj:Post,@Header("Authorization") authHeader:String):Call<Post> - @POST("/api/user/{id}/followers") - fun getFollowers(@Path("id") id:String):Call <MutableList<UserReceive>> + @GET("/api/user/{id}/followers") + fun getFollowers(@Header("Authorization") authHeader:String,@Path("id") id:String):Call <MutableList<UserReceive>> - @POST("/api/user{id}/following") - fun getFollowing(@Path("id") id:String):Call <MutableList<UserReceive>> + @GET("/api/user/{id}/following") + fun getFollowing(@Header("Authorization") authHeader:String,@Path("id") id:String):Call <MutableList<UserReceive>> - @POST("/api/user{id}/addFollower") - fun addFollower(@Header("Authorization") authHeader:String,@Path("id") id:String):Call<UserReceive> + @GET("/api/user/{id}/addFollower") + fun addFollower(@Header("Authorization") authHeader:String,@Path("id") id:String):Call<Boolean> @GET("/api/user/{id}/id/profile") fun getProfileFromId(@Header("Authorization") authHeader:String,@Path("id") username:String):Call<UserReceive> @@ -95,4 +95,10 @@ interface IBackendApi { @GET("api/Location/search") fun searchLocationsQuery(@Header("Authorization") authHeader:String,@Query("query") query: String):Call<MutableList<Location>> + @GET("/api/user/{id}/myFollowings") + fun getMyFollowings(@Header("Authorization") authHeader:String):Call <MutableList<UserReceive>> + + @GET("/api/user/{id}/checkIfAlreadyFollow") + fun checkIfAlreadyFollow(@Header("Authorization") authHeader:String,@Path("id") id:String):Call<Boolean> + }
\ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Models/User.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Models/User.kt index 46338b3..6e282a9 100644 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Models/User.kt +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Models/User.kt @@ -29,10 +29,10 @@ data class UserReceive( var creationDate: Date, var pfp:PostImage?, var postcount:Int, - var followers:List<User>, - var followersNumber:Int, - var following:List<User>, - var followingNumber:Int, + var followers:List<String>, + var followersCount:Int, + var following:List<String>, + var followingCount:Int, var postIds:List<Int>, var postNumber:Int )
\ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/res/values/colors.xml b/Client/BrzoDoLokacije/app/src/main/res/values/colors.xml index 0d4da4f..fe34814 100644 --- a/Client/BrzoDoLokacije/app/src/main/res/values/colors.xml +++ b/Client/BrzoDoLokacije/app/src/main/res/values/colors.xml @@ -7,5 +7,7 @@ <color name="teal_700">#FF018786</color> <color name="black">#FF000000</color> <color name="white">#FFFFFFFF</color> + <color name="unfollow">#c4c4c4</color> <color name="dark_blue_transparent">#DE093A4C</color> + <color name="button_main">#183e4b</color> </resources>
\ No newline at end of file |