diff options
28 files changed, 507 insertions, 106 deletions
diff --git a/Backend/Api/Api/Api.csproj b/Backend/Api/Api/Api.csproj index b09c2fd..80898fd 100644 --- a/Backend/Api/Api/Api.csproj +++ b/Backend/Api/Api/Api.csproj @@ -7,6 +7,9 @@ </PropertyGroup> <ItemGroup> + <PackageReference Include="Geocoding.Core" Version="4.0.1" /> + <PackageReference Include="Geocoding.Google" Version="4.0.1" /> + <PackageReference Include="Geocoding.MapQuest" Version="4.0.1" /> <PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="6.0.10" /> <PackageReference Include="MongoDB.Driver" Version="2.18.0" /> <PackageReference Include="Swashbuckle.AspNetCore" Version="6.2.3" /> diff --git a/Backend/Api/Api/Controllers/AuthController.cs b/Backend/Api/Api/Controllers/AuthController.cs index cbd5eb8..abb7adc 100644 --- a/Backend/Api/Api/Controllers/AuthController.cs +++ b/Backend/Api/Api/Controllers/AuthController.cs @@ -37,6 +37,17 @@ namespace Api.Controllers return Ok(); } + [HttpPost("refreshJwt")] + [Authorize(Roles ="User")] + public async Task<ActionResult<string>> refreshJwt() + { + var jwt = await _userService.RenewToken(); + if (jwt != null) + { + return Ok(jwt); + } + return BadRequest("Pogresno uneti podaci"); + } [HttpPost("login")] public async Task<ActionResult<string>> Login([FromBody] Login creds) { diff --git a/Backend/Api/Api/Interfaces/IUserService.cs b/Backend/Api/Api/Interfaces/IUserService.cs index 218c67a..db2eac1 100644 --- a/Backend/Api/Api/Interfaces/IUserService.cs +++ b/Backend/Api/Api/Interfaces/IUserService.cs @@ -12,7 +12,7 @@ namespace Api.Interfaces Task<User> deleteUser(String email); Task<User> getUserById(string id); - Task<string> RenewToken(string existingToken); + Task<string> RenewToken(); Task<string> Login(Login login); Task<string> Register(Register register); Task<Boolean> VerifyUser(VerifyUser login); diff --git a/Backend/Api/Api/Services/LocationService.cs b/Backend/Api/Api/Services/LocationService.cs index 629c2a7..292fc0e 100644 --- a/Backend/Api/Api/Services/LocationService.cs +++ b/Backend/Api/Api/Services/LocationService.cs @@ -1,6 +1,11 @@ using Api.Interfaces; using Api.Models; +using Geocoding; +using Geocoding.Google; +using Geocoding.MapQuest; using MongoDB.Driver; +using ZstdSharp.Unsafe; +using Location = Api.Models.Location; namespace Api.Services { @@ -9,15 +14,24 @@ namespace Api.Services private readonly MongoClient _client; private readonly IMongoCollection<Location> _locations; private readonly IHttpContextAccessor _httpContext; - public LocationService(IDatabaseConnection settings, IMongoClient mongoClient) + private IConfiguration _configuration; + private MapQuestGeocoder _geocoder; + public LocationService(IDatabaseConnection settings, IMongoClient mongoClient, IConfiguration configuration) { var database = mongoClient.GetDatabase(settings.DatabaseName); _locations = database.GetCollection<Location>(settings.LocationCollectionName); + _configuration = configuration; + var _mapQuestApiKey = _configuration.GetSection("AppSettings:MapQuestApiKey").Value; + _geocoder = new MapQuestGeocoder(_mapQuestApiKey); + } public async Task<Location> add(Location loc) { - //TODO GOOGLE MAPS API CALL FOR info + IEnumerable<Address> adresses = await _geocoder.GeocodeAsync(loc.name+" "+loc.address+" "+loc.city+" "+loc.country); + loc.latitude = adresses.First().Coordinates.Latitude; + loc.longitude=adresses.First().Coordinates.Longitude; await _locations.InsertOneAsync(loc); + return loc; } public async Task<Location> getById(string id) diff --git a/Backend/Api/Api/Services/PostService.cs b/Backend/Api/Api/Services/PostService.cs index 2f29366..0a12f39 100644 --- a/Backend/Api/Api/Services/PostService.cs +++ b/Backend/Api/Api/Services/PostService.cs @@ -23,7 +23,7 @@ namespace Api.Services { Post p = new Post(); p._id = ""; - p.ownerId = _httpContext.HttpContext.User.FindFirstValue("id"); + p.ownerId = _httpContext.HttpContext.User.FindFirstValue("id").ToString(); p.locationId = post.locationId; p.description = post.description; @@ -63,14 +63,6 @@ namespace Api.Services } await _posts.InsertOneAsync(p); - - - - - - - - return postToPostSend(p); } diff --git a/Backend/Api/Api/Services/UserService.cs b/Backend/Api/Api/Services/UserService.cs index 034c494..5fd61f6 100644 --- a/Backend/Api/Api/Services/UserService.cs +++ b/Backend/Api/Api/Services/UserService.cs @@ -163,9 +163,9 @@ namespace Api.Services return false; } - public async Task<string> RenewToken(string existingToken) + public async Task<string> RenewToken() { - var id = _jwtService.TokenToId(existingToken); + var id = await UserIdFromJwt(); if (id == null) return null; var user = await getUserById(id); diff --git a/Backend/Api/Api/appsettings.json b/Backend/Api/Api/appsettings.json index b7f25b2..22d91dc 100644 --- a/Backend/Api/Api/appsettings.json +++ b/Backend/Api/Api/appsettings.json @@ -1,8 +1,9 @@ { - "AppSettings": { - "JwtToken": "PjrVqQJ1P2VOkuWLw7NaZUluT4z7bkau", - "EmailToken": "e8X8c0lm9KS7itWi3wgE6BiPXR21WPvO" - }, + "AppSettings": { + "JwtToken": "PjrVqQJ1P2VOkuWLw7NaZUluT4z7bkau", + "EmailToken": "e8X8c0lm9KS7itWi3wgE6BiPXR21WPvO", + "MapQuestApiKey": "47oeviBUoCI2JxWzNARmCtrH9fDp5Mtk" //msbs#556ASDFGGSGSD + }, "Logging": { "LogLevel": { @@ -21,11 +22,11 @@ "LocationCollectionname": "locations" }, - "EmailCfg": { - "Email": "oddyssey.brzodolokacije@gmail.com", - "SmtpServer": "smtp.gmail.com", - "Password": "nrokhfcwahfbqnpp" //msbs#556 - }, + "EmailCfg": { + "Email": "oddyssey.brzodolokacije@gmail.com", + "SmtpServer": "smtp.gmail.com", + "Password": "nrokhfcwahfbqnpp" //msbs#556 + }, "URLs": { "localhost": "http://localhost:5279/", "actual":"add url when back put onto server" diff --git a/Client/BrzoDoLokacije/app/src/main/AndroidManifest.xml b/Client/BrzoDoLokacije/app/src/main/AndroidManifest.xml index f6e0fc5..870fa98 100644 --- a/Client/BrzoDoLokacije/app/src/main/AndroidManifest.xml +++ b/Client/BrzoDoLokacije/app/src/main/AndroidManifest.xml @@ -16,6 +16,13 @@ android:usesCleartextTraffic="true" tools:targetApi="31"> <activity + android:name=".ActivityAddPost" + android:exported="false"> + <meta-data + android:name="android.app.lib_name" + android:value="" /> + </activity> + <activity android:name=".Activities.SplashPage" android:exported="true"> <intent-filter> diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ActivityForgottenPassword.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ActivityForgottenPassword.kt index e7c9836..b0b7f5e 100644 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ActivityForgottenPassword.kt +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ActivityForgottenPassword.kt @@ -1,27 +1,73 @@ package com.example.brzodolokacije.Activities import android.content.Intent +import android.graphics.Color import androidx.appcompat.app.AppCompatActivity import android.os.Bundle +import android.util.Log import android.view.View import android.widget.Button +import android.widget.EditText import android.widget.Toast +import com.example.brzodolokacije.Models.Auth.JustMail +import com.example.brzodolokacije.Models.Auth.Login import com.example.brzodolokacije.R +import com.example.brzodolokacije.Services.RetrofitHelper +import com.example.brzodolokacije.Services.SharedPreferencesHelper +import okhttp3.ResponseBody +import retrofit2.Call +import retrofit2.Response class ActivityForgottenPassword : AppCompatActivity() { private lateinit var sendCode: Button + private lateinit var email: EditText + private lateinit var emailString:String + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_forgotten_password) sendCode=findViewById<View>(R.id.forgottenPasswordSendCode) as Button - + email=findViewById<View>(R.id.editTextTextPersonName) as EditText sendCode.setOnClickListener{ - intent= Intent(this, ActivityForgottenPasswordVerify::class.java) - startActivity(intent) - } + emailString=email.text.toString().trim() - } + if(!emailString.isEmpty() && checkEmail(emailString)==true) { + + var emailData= JustMail(emailString) + val authApi= RetrofitHelper.getInstance() + val request=authApi.forgotpass(emailData) + val cont=this + request.enqueue(object : retrofit2.Callback<ResponseBody?> { + override fun onResponse(call: Call<ResponseBody?>, response: Response<ResponseBody?>) { + Log.d("main",response.code().toString()) + Log.d("main",response.body().toString()) + if(response.code()==200){ + val intent = Intent(cont, ActivityForgottenPasswordVerify::class.java) + intent.putExtra("email", emailString) + startActivity(intent) + } + } + override fun onFailure(call: Call<ResponseBody?>, t: Throwable) { + } + }) + } + } + } + //from fragment login + fun checkEmail(emailString:String):Boolean{ + val emailRegex = "^[A-Za-z](.*)([@]{1})(.{1,})(\\.)(.{1,})" + if(!(emailRegex.toRegex().matches(emailString))){ + Toast.makeText( + this, "Email adresa nije validna, pokušajte ponovo", Toast.LENGTH_LONG + ).show(); + email.setHintTextColor(Color.RED) + return false + } + else{ + return true + } + } }
\ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ActivityForgottenPasswordVerify.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ActivityForgottenPasswordVerify.kt index 6533237..a1db97f 100644 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ActivityForgottenPasswordVerify.kt +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/ActivityForgottenPasswordVerify.kt @@ -5,24 +5,72 @@ import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.view.View import android.widget.Button +import android.widget.EditText import android.widget.Toast import com.example.brzodolokacije.MainActivity +import com.example.brzodolokacije.Models.Auth.Login +import com.example.brzodolokacije.Models.Auth.ResetPass import com.example.brzodolokacije.R +import com.example.brzodolokacije.Services.RetrofitHelper +import com.example.brzodolokacije.Services.SharedPreferencesHelper +import okhttp3.ResponseBody +import retrofit2.Call +import retrofit2.Response class ActivityForgottenPasswordVerify : AppCompatActivity() { private lateinit var changePassword: Button + private lateinit var pw:EditText + private lateinit var pwchk:EditText + private lateinit var kod:EditText override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_forgotten_password_verify) + kod=findViewById<View>(R.id.editTextTextPersonName) as EditText + pw=findViewById<View>(R.id.editTextoldPassword) as EditText + pwchk =findViewById<View>(R.id.editTextTextPassword) as EditText changePassword=findViewById<View>(R.id.btnChangePassword) as Button changePassword.setOnClickListener{ + + var email =intent.getStringExtra("email") + var pwstr=pw.text.toString().trim() + var pwchkstr=pwchk.text.toString().trim() + var kodstr=kod.text.toString().trim() + + if(!kodstr.isEmpty() && checkPassword(pwstr,pwchkstr)){ + var resetData= ResetPass(email!!,kodstr,pwstr) + val authApi= RetrofitHelper.getInstance() + val request=authApi.resetpass(resetData) + val cont=this + request.enqueue(object : retrofit2.Callback<ResponseBody?> { + override fun onResponse(call: Call<ResponseBody?>, response: Response<ResponseBody?>) { + if(response.code()==200){ + intent = Intent(cont, ActivityLoginRegister::class.java) + startActivity(intent) + } + } + override fun onFailure(call: Call<ResponseBody?>, t: Throwable) { + } + }) + } + } + } + + //from fragment login + fun checkPassword(passwordString:String,passwordConfirm:String):Boolean{ + + if(passwordString.length<6){ Toast.makeText( - this, "Lozinka je uspešno promenjena.", Toast.LENGTH_LONG + this, "Lozinke su prekratke", Toast.LENGTH_LONG ).show(); - - intent= Intent(this, ActivityLoginRegister::class.java) - startActivity(intent) + return false + } + if(!passwordString.equals(passwordConfirm)){ + Toast.makeText( + this, "Lozinke su se ne poklapaju", Toast.LENGTH_LONG + ).show(); + return false } + return true } }
\ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/NavigationActivity.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/NavigationActivity.kt index d36dbae..baa83ee 100644 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/NavigationActivity.kt +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/NavigationActivity.kt @@ -16,7 +16,7 @@ class NavigationActivity : AppCompatActivity() { val fragmentShowPosts=FragmentShowPosts() val browseFragment=FragmentBrowse() - val addPostFragment=FragmentAddPost() + val addPostFragment= FragmentAddNew() val profileFragment=FragmentProfile() val bottomNav=findViewById<View>(R.id.bottomNavigationView) as BottomNavigationView setCurrentFragment(fragmentShowPosts) diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentAddLocation.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentAddLocation.kt new file mode 100644 index 0000000..2d0a3bd --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentAddLocation.kt @@ -0,0 +1,60 @@ +package com.example.brzodolokacije.Fragments + +import android.os.Bundle +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import com.example.brzodolokacije.R + +// TODO: Rename parameter arguments, choose names that match +// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER +private const val ARG_PARAM1 = "param1" +private const val ARG_PARAM2 = "param2" + +/** + * A simple [Fragment] subclass. + * Use the [FragmentAddLocation.newInstance] factory method to + * create an instance of this fragment. + */ +class FragmentAddLocation : Fragment() { + // TODO: Rename and change types of parameters + private var param1: String? = null + private var param2: String? = null + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + arguments?.let { + param1 = it.getString(ARG_PARAM1) + param2 = it.getString(ARG_PARAM2) + } + } + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + // Inflate the layout for this fragment + return inflater.inflate(R.layout.fragment_add_location, container, false) + } + + companion object { + /** + * Use this factory method to create a new instance of + * this fragment using the provided parameters. + * + * @param param1 Parameter 1. + * @param param2 Parameter 2. + * @return A new instance of fragment FragmentAddLocation. + */ + // TODO: Rename and change types and number of parameters + @JvmStatic + fun newInstance(param1: String, param2: String) = + FragmentAddLocation().apply { + arguments = Bundle().apply { + putString(ARG_PARAM1, param1) + putString(ARG_PARAM2, param2) + } + } + } +}
\ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentAddNew.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentAddNew.kt new file mode 100644 index 0000000..b1b257b --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentAddNew.kt @@ -0,0 +1,59 @@ +package com.example.brzodolokacije.Fragments + +import android.os.Bundle +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.Button +import androidx.fragment.app.FragmentTransaction +import com.example.brzodolokacije.R + +// TODO: Rename parameter arguments, choose names that match +// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER +private const val ARG_PARAM1 = "param1" +private const val ARG_PARAM2 = "param2" + +/** + * A simple [Fragment] subclass. + * Use the [FragmentAddNew.newInstance] factory method to + * create an instance of this fragment. + */ +class FragmentAddNew : Fragment() { + // TODO: Rename and change types of parameters + + private lateinit var addNewPost: Button + private lateinit var addNewLocation: Button + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + // Inflate the layout for this fragment + val view:View=inflater.inflate(R.layout.fragment_add_new, container, false) + addNewPost=view.findViewById<View>(R.id.btnFragmentAddNewNewPost) as Button + addNewLocation=view.findViewById<View>(R.id.btnFragmentAddNewNewLocation) as Button + + + addNewPost.setOnClickListener{ + + var fm: FragmentTransaction =childFragmentManager.beginTransaction() + + fm.replace(R.id.flFragmentAddNewFragmentContainer, FragmentAddPost()) + fm.commit() + } + + + addNewLocation.setOnClickListener{ + + var fm: FragmentTransaction =childFragmentManager.beginTransaction() + + fm.replace(R.id.flFragmentAddNewFragmentContainer, FragmentAddLocation()) + fm.commit() + } + + return view + } + + +}
\ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentAddPost.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentAddPost.kt index 7fca83b..936d755 100644 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentAddPost.kt +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentAddPost.kt @@ -7,6 +7,7 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.Button +import androidx.core.content.ContextCompat.startActivity import com.example.brzodolokacije.Activities.ActivityLoginRegister import com.example.brzodolokacije.Activities.NavigationActivity import com.example.brzodolokacije.R @@ -28,21 +29,11 @@ class FragmentAddPost : Fragment(R.layout.fragment_add_post) { savedInstanceState: Bundle? ): View? { val view:View=inflater.inflate(R.layout.fragment_add_post, container, false) - // Inflate the layout for this fragment - /*val logOutButton=view.findViewById<View>(R.id.btnFragmentAddLogOut) as Button - logOutButton.setOnClickListener{ - logOut() - }*/ + return view; } - fun logOut(){ - if(SharedPreferencesHelper.removeValue("jwt",requireActivity())) - { - val intent= Intent(requireActivity(), ActivityLoginRegister::class.java) - startActivity(intent) - } - } + }
\ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentLogin.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentLogin.kt index b9568df..9092700 100644 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentLogin.kt +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentLogin.kt @@ -12,13 +12,11 @@ import android.widget.EditText import android.widget.TextView import android.widget.Toast -import com.example.brzodolokacije.Activities.ActivityLoginRegister import com.example.brzodolokacije.Activities.NavigationActivity import com.example.brzodolokacije.Activities.ActivityForgottenPassword -import com.example.brzodolokacije.Interfaces.IAuthApi import com.example.brzodolokacije.Models.Auth.Login import com.example.brzodolokacije.R import com.example.brzodolokacije.Services.RetrofitHelper @@ -84,7 +82,7 @@ class FragmentLogin : Fragment() { if(!emailString.isEmpty() && !passwordString.isEmpty()&& checkPassword(passwordString)==true && checkEmail(emailString)==true) { var loginData= Login(emailString,passwordString) - val authApi= RetrofitHelper.getInstance().create(IAuthApi::class.java) + val authApi= RetrofitHelper.getInstance() val request=authApi.login(loginData) request.enqueue(object : retrofit2.Callback<String?> { @@ -94,7 +92,6 @@ class FragmentLogin : Fragment() { Toast.makeText( activity, token, Toast.LENGTH_LONG ).show(); - //TODO(navigate to main page) SharedPreferencesHelper.addValue("jwt",token,activity!!) val intent= Intent(activity!!, NavigationActivity::class.java) startActivity(intent) 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 9c4c370..45cd0fe 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 @@ -1,11 +1,15 @@ package com.example.brzodolokacije.Fragments +import android.content.Intent import android.os.Bundle import androidx.fragment.app.Fragment import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.Button +import com.example.brzodolokacije.Activities.ActivityLoginRegister import com.example.brzodolokacije.R +import com.example.brzodolokacije.Services.SharedPreferencesHelper // TODO: Rename parameter arguments, choose names that match // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER @@ -18,6 +22,7 @@ private const val ARG_PARAM2 = "param2" * create an instance of this fragment. */ class FragmentMyProfileInfo : Fragment() { + private lateinit var logout:Button // TODO: Rename and change types of parameters private var param1: String? = null private var param2: String? = null @@ -28,6 +33,7 @@ class FragmentMyProfileInfo : Fragment() { param1 = it.getString(ARG_PARAM1) param2 = it.getString(ARG_PARAM2) } + } override fun onCreateView( @@ -35,26 +41,21 @@ class FragmentMyProfileInfo : Fragment() { savedInstanceState: Bundle? ): View? { // Inflate the layout for this fragment - return inflater.inflate(R.layout.fragment_my_profile_info, container, false) + var view=inflater.inflate(R.layout.fragment_my_profile_info, container, false) + + logout=view.findViewById<View>(R.id.buttonLogOut) as Button + logout.setOnClickListener{ + logOut() + } + + return view } - companion object { - /** - * Use this factory method to create a new instance of - * this fragment using the provided parameters. - * - * @param param1 Parameter 1. - * @param param2 Parameter 2. - * @return A new instance of fragment FragmentMyProfileInfo. - */ - // TODO: Rename and change types and number of parameters - @JvmStatic - fun newInstance(param1: String, param2: String) = - FragmentMyProfileInfo().apply { - arguments = Bundle().apply { - putString(ARG_PARAM1, param1) - putString(ARG_PARAM2, param2) - } - } + fun logOut(){ + if(SharedPreferencesHelper.removeValue("jwt",requireActivity())) + { + val intent= Intent(requireActivity(), ActivityLoginRegister::class.java) + startActivity(intent) + } } }
\ 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 c9ce8cc..243cab0 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 @@ -1,21 +1,14 @@ package com.example.brzodolokacije.Fragments import android.os.Bundle -import android.util.Log import androidx.fragment.app.Fragment import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.Button -import android.widget.EditText import android.widget.TextView import androidx.fragment.app.FragmentTransaction import com.example.brzodolokacije.R -import retrofit2.Call -import retrofit2.Callback -import retrofit2.Response -import retrofit2.Retrofit -import retrofit2.converter.gson.GsonConverterFactory // TODO: Rename parameter arguments, choose names that match // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER @@ -53,7 +46,6 @@ class FragmentProfile : Fragment(R.layout.fragment_profile) { postsCount = view.findViewById<View>(R.id.tvFragmentProfilePostsNo) as TextView followersCount = view.findViewById<View>(R.id.tvFragmentProfileFollowersNo) as TextView followingCount = view.findViewById<View>(R.id.tvFragmentProfileFollowNo) as TextView - showMyPosts=view.findViewById<View>(R.id.btnFragmentProfileShowMyPosts) as Button showMyData=view.findViewById<View>(R.id.btnFragmentProfileShowMyData) as Button showMyRecensions=view.findViewById<View>(R.id.btnFragmentProfileShowMyRecensions) as Button diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentRegister.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentRegister.kt index c9102ab..e166d38 100644 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentRegister.kt +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Fragments/FragmentRegister.kt @@ -1,9 +1,7 @@ package com.example.brzodolokacije.Fragments -import android.graphics.BitmapFactory import android.graphics.Color import android.os.Bundle -import android.util.Base64 import androidx.fragment.app.Fragment import android.view.LayoutInflater import android.view.View @@ -11,14 +9,12 @@ import android.view.ViewGroup import android.widget.Button import android.widget.EditText import android.widget.Toast -import com.example.brzodolokacije.Interfaces.IAuthApi import com.example.brzodolokacije.Models.Auth.Register import com.example.brzodolokacije.R import com.example.brzodolokacije.Services.RetrofitHelper import okhttp3.ResponseBody import retrofit2.Call import retrofit2.Response -import javax.security.auth.callback.Callback class FragmentRegister : Fragment() { // TODO: Rename and change types of parameters @@ -81,7 +77,7 @@ class FragmentRegister : Fragment() { var registerData=Register(nameString,usernameString,emailString,passwordString) - val authApi=RetrofitHelper.getInstance().create(IAuthApi::class.java) + val authApi=RetrofitHelper.getInstance() val request=authApi.register(registerData) diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Interfaces/IAuthApi.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Interfaces/IAuthApi.kt deleted file mode 100644 index bd430a8..0000000 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Interfaces/IAuthApi.kt +++ /dev/null @@ -1,15 +0,0 @@ -package com.example.brzodolokacije.Interfaces - -import com.example.brzodolokacije.Models.Auth.Login -import com.example.brzodolokacije.Models.Auth.Register -import okhttp3.ResponseBody -import retrofit2.Call -import retrofit2.http.Body -import retrofit2.http.POST - -interface IAuthApi { - @POST("/api/auth/login") - fun login(@Body obj:Login): Call<String> - @POST("/api/auth/register") - fun register(@Body obj:Register):Call<ResponseBody> -}
\ 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 new file mode 100644 index 0000000..0bbf72e --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Interfaces/IBackendApi.kt @@ -0,0 +1,27 @@ +package com.example.brzodolokacije.Interfaces + +import com.example.brzodolokacije.Models.Auth.JustMail +import com.example.brzodolokacije.Models.Auth.Login +import com.example.brzodolokacije.Models.Auth.Register +import com.example.brzodolokacije.Models.Auth.ResetPass +import okhttp3.ResponseBody +import retrofit2.Call +import retrofit2.http.Body +import retrofit2.http.Header +import retrofit2.http.POST + +interface IBackendApi { + @POST("/api/auth/login") + fun login(@Body obj:Login): Call<String> + @POST("/api/auth/register") + fun register(@Body obj:Register):Call<ResponseBody> + @POST("/api/auth/refreshJwt") + fun refreshJwt(@Header("Authorization") authHeader:String): Call<String> + @POST("/api/auth/forgotpass") + fun forgotpass(@Body obj:JustMail):Call<ResponseBody> + @POST("/api/auth/resetpass") + fun resetpass(@Body obj:ResetPass):Call<ResponseBody> + + //@POST("putanja") + //fun add(@Body obj:Post,@Header("Authorization") authHeader:String):Call<Post> +}
\ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/MainActivity.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/MainActivity.kt index 1208564..e55da11 100644 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/MainActivity.kt +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/MainActivity.kt @@ -3,10 +3,15 @@ package com.example.brzodolokacije import android.content.Intent import androidx.appcompat.app.AppCompatActivity import android.os.Bundle +import android.util.Log +import android.widget.Toast import com.auth0.android.jwt.JWT import com.example.brzodolokacije.Activities.ActivityLoginRegister import com.example.brzodolokacije.Activities.NavigationActivity +import com.example.brzodolokacije.Services.RetrofitHelper import com.example.brzodolokacije.Services.SharedPreferencesHelper +import retrofit2.Call +import retrofit2.Response class MainActivity : AppCompatActivity() { @@ -17,8 +22,9 @@ class MainActivity : AppCompatActivity() { setContentView(R.layout.activity_main) val intent:Intent - if(checkLoggedIn()) - intent= Intent(this, NavigationActivity::class.java) + if(checkLoggedIn()) { + intent = Intent(this, NavigationActivity::class.java) + } else intent= Intent(this, ActivityLoginRegister::class.java) @@ -33,10 +39,42 @@ class MainActivity : AppCompatActivity() { var jwt:JWT=JWT(jwtString) if(jwt.isExpired(30)) return false + refreshJwt(jwtString) return true } + + fun refreshJwt(token:String){ + Log.d("Main","RIPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP") + if(token==null) + return + var refreshJwt= RetrofitHelper.getInstance().refreshJwt("Bearer "+token) + refreshJwt.enqueue(object : retrofit2.Callback<String?> { + override fun onResponse(call: Call<String?>, response: Response<String?>) { + if(response.isSuccessful()){ + val newToken=response.body().toString() + Toast.makeText( + applicationContext, token, Toast.LENGTH_LONG + ).show(); + SharedPreferencesHelper.addValue("jwt",newToken,this@MainActivity) + }else{ + if(response.errorBody()!=null) + Toast.makeText(applicationContext, response.errorBody()!!.string(), Toast.LENGTH_LONG).show(); + } + + + } + + override fun onFailure(call: Call<String?>, t: Throwable) { + Toast.makeText( + applicationContext, t.toString(), Toast.LENGTH_LONG + ).show(); + } + }) + + + } }
\ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Models/Auth/ResetPass.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Models/Auth/ResetPass.kt new file mode 100644 index 0000000..945c8d1 --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Models/Auth/ResetPass.kt @@ -0,0 +1,4 @@ +package com.example.brzodolokacije.Models.Auth + +data class ResetPass(var email:String,var kod:String,var newpass:String) +data class JustMail(var email:String)
\ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Models/Post.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Models/Post.kt index 3fa1f70..2ac2619 100644 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Models/Post.kt +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Models/Post.kt @@ -1,7 +1,7 @@ package com.example.brzodolokacije.Models +import okhttp3.MultipartBody import java.time.LocalDateTime -import java.util.* data class Post ( var _id:String, @@ -12,10 +12,29 @@ data class Post ( var reports:List<String>, var ratings:List<Rating>, var comments:List<Comment>, - var images:List<File> + var images:List<PostImage> ) +data class PostSend( + var _id:String, + var locationId:String, + var description:String, + var images: List<MultipartBody.Part> + +) +data class PostPreview( + var _id:String, + var ownerId:String, + var location:Location, + var description:String, + var views:Int, + var ratings:Float, + var comments:List<Comment>, + var images:List<PostImage> +) + + data class Comment ( var userId:String, diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Models/File.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Models/PostImage.kt index 030f658..d024272 100644 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Models/File.kt +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Models/PostImage.kt @@ -1,6 +1,6 @@ package com.example.brzodolokacije.Models -data class File ( +data class PostImage ( var _id:String, var path:String )
\ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Services/RetrofitHelper.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Services/RetrofitHelper.kt index cc7eb56..afe93c9 100644 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Services/RetrofitHelper.kt +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Services/RetrofitHelper.kt @@ -1,5 +1,6 @@ package com.example.brzodolokacije.Services +import com.example.brzodolokacije.Interfaces.IBackendApi import com.google.gson.GsonBuilder import retrofit2.Retrofit import retrofit2.converter.gson.GsonConverterFactory @@ -7,13 +8,23 @@ import retrofit2.converter.gson.GsonConverterFactory object RetrofitHelper { val baseUrl="http://10.0.2.2:5279" - fun getInstance():Retrofit{ + + private var retrofit_noauth: IBackendApi? = null + private var retrofit_auth: IBackendApi? = null + + fun getInstance():IBackendApi{ + if(retrofit_noauth==null) + retrofit_noauth= createInstance() + return retrofit_noauth as IBackendApi + } + private fun createInstance():IBackendApi{ val gson = GsonBuilder() .setLenient() .create() return Retrofit.Builder().baseUrl(baseUrl) .addConverterFactory(GsonConverterFactory.create(gson)) - .build() + .build().create(IBackendApi::class.java) + } } //Usage diff --git a/Client/BrzoDoLokacije/app/src/main/res/layout/fragment_add_location.xml b/Client/BrzoDoLokacije/app/src/main/res/layout/fragment_add_location.xml new file mode 100644 index 0000000..bfc1edb --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/res/layout/fragment_add_location.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8"?> +<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="match_parent" + tools:context=".Fragments.FragmentAddLocation"> + + <!-- TODO: Update blank fragment layout --> + <TextView + android:layout_width="match_parent" + android:layout_height="match_parent" + android:text="@string/hello_blank_fragment" /> + +</FrameLayout>
\ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/res/layout/fragment_add_new.xml b/Client/BrzoDoLokacije/app/src/main/res/layout/fragment_add_new.xml new file mode 100644 index 0000000..5cfda04 --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/res/layout/fragment_add_new.xml @@ -0,0 +1,69 @@ +<?xml version="1.0" encoding="utf-8"?> +<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="match_parent" + tools:context=".Fragments.FragmentAddNew"> + + <!-- TODO: Update blank fragment layout --> + <TextView + android:layout_width="match_parent" + android:layout_height="match_parent" /> + <androidx.constraintlayout.widget.ConstraintLayout + android:layout_width="match_parent" + android:layout_height="match_parent"> + + <Button + android:id="@+id/btnFragmentAddNewNewLocation" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:backgroundTint="#FFFFFF" + android:stateListAnimator="@null" + android:text="Nova lokacija" + android:textColor="@color/cardview_dark_background" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toEndOf="@+id/btnFragmentAddNewNewPost" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintVertical_bias="0.00999999" /> + + <Button + android:id="@+id/btnFragmentAddNewNewPost" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:backgroundTint="#FFFFFF" + android:stateListAnimator="@null" + + android:text="Nova objava" + android:textColor="@color/cardview_dark_background" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toStartOf="@+id/btnFragmentAddNewNewLocation" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintVertical_bias="0.00999999" /> + + <View + android:id="@+id/divider3" + android:layout_width="409dp" + android:layout_height="1dp" + android:background="?android:attr/listDivider" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/btnFragmentAddNewNewPost" /> + + <FrameLayout + android:id="@+id/flFragmentAddNewFragmentContainer" + android:layout_width="409dp" + android:layout_height="673dp" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent"> + + </FrameLayout> + </androidx.constraintlayout.widget.ConstraintLayout> + + + + +</FrameLayout>
\ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/res/layout/fragment_my_profile_info.xml b/Client/BrzoDoLokacije/app/src/main/res/layout/fragment_my_profile_info.xml index d20c569..4a91f49 100644 --- a/Client/BrzoDoLokacije/app/src/main/res/layout/fragment_my_profile_info.xml +++ b/Client/BrzoDoLokacije/app/src/main/res/layout/fragment_my_profile_info.xml @@ -1,14 +1,30 @@ <?xml version="1.0" encoding="utf-8"?> -<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" +<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".Fragments.FragmentMyProfileInfo"> <!-- TODO: Update blank fragment layout --> + <TextView + android:id="@+id/textView5" android:layout_width="match_parent" android:layout_height="match_parent" - android:text="Moji podaci" /> + android:text="Moji podaci" + tools:layout_editor_absoluteX="0dp" + tools:layout_editor_absoluteY="0dp" /> + + <Button + android:id="@+id/buttonLogOut" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="Log out" + app:layout_constraintBottom_toBottomOf="@+id/textView5" + app:layout_constraintEnd_toEndOf="@+id/textView5" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="@+id/textView5" /> + -</FrameLayout>
\ No newline at end of file +</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file |