diff --git a/app/src/main/java/com/displaynone/ACSSApplication.kt b/app/src/main/java/com/displaynone/ACSSApplication.kt index 7fff61b..04dde97 100644 --- a/app/src/main/java/com/displaynone/ACSSApplication.kt +++ b/app/src/main/java/com/displaynone/ACSSApplication.kt @@ -1,11 +1,15 @@ package com.displaynone import android.app.Application +import com.displaynone.acss.components.acs.models.gate.GateServiceST +import com.displaynone.acss.components.acs.models.visit.VisitServiceST import com.displaynone.acss.components.auth.models.user.UserServiceST class ACSSApplication : Application() { override fun onCreate() { super.onCreate() UserServiceST.createInstance(this) + GateServiceST.createInstance() + VisitServiceST.createInstance() } } diff --git a/app/src/main/java/com/displaynone/acss/components/acs/models/gate/GateServiceST.kt b/app/src/main/java/com/displaynone/acss/components/acs/models/gate/GateServiceST.kt index 94f988f..e5a2805 100644 --- a/app/src/main/java/com/displaynone/acss/components/acs/models/gate/GateServiceST.kt +++ b/app/src/main/java/com/displaynone/acss/components/acs/models/gate/GateServiceST.kt @@ -1,4 +1,28 @@ package com.displaynone.acss.components.acs.models.gate +import android.content.Context +import android.util.Log +import com.displaynone.acss.components.acs.models.gate.repository.GateRepository +import com.displaynone.acss.components.auth.internal_utils.AuthTokenManager +import com.displaynone.acss.components.auth.internal_utils.UserManager +import com.displaynone.acss.components.auth.models.user.UserServiceST + class GateServiceST { + companion object { + private var instance: GateServiceST? = null + + fun createInstance() { + if (instance == null) { + instance = GateServiceST() + } + } + fun getInstance(): GateServiceST { + return instance ?: throw RuntimeException("null instance") + } + } + private val gateRepository: GateRepository = GateRepository() + suspend fun openDoor(code: String): Result { + Log.d("1234", UserServiceST.getInstance().getTokenPair().accessToken) + return gateRepository.openDoor(UserServiceST.getInstance().getTokenPair().accessToken, code = code) + } } \ No newline at end of file diff --git a/app/src/main/java/com/displaynone/acss/components/acs/models/gate/repository/GateRepository.kt b/app/src/main/java/com/displaynone/acss/components/acs/models/gate/repository/GateRepository.kt new file mode 100644 index 0000000..94071f9 --- /dev/null +++ b/app/src/main/java/com/displaynone/acss/components/acs/models/gate/repository/GateRepository.kt @@ -0,0 +1,37 @@ +package com.displaynone.acss.components.acs.models.gate.repository + +import android.util.Log +import com.displaynone.acss.config.Constants.serverUrl +import com.displaynone.acss.config.Network +import io.ktor.client.call.body +import io.ktor.client.request.headers +import io.ktor.client.request.patch +import io.ktor.client.request.post +import io.ktor.client.request.setBody +import io.ktor.client.statement.bodyAsText +import io.ktor.http.ContentType +import io.ktor.http.HttpHeaders +import io.ktor.http.HttpStatusCode +import io.ktor.http.contentType +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext + +class GateRepository { + + suspend fun openDoor(token: String, code: String): Result = withContext(Dispatchers.IO){ + runCatching{ + val result = Network.client.post("$serverUrl/api/acs/open") { + headers { + append(HttpHeaders.Authorization, "Bearer $token") + } + contentType(ContentType.Application.Json) + setBody("""{ "code": $code }""") + } + if (result.status != HttpStatusCode.OK) { + error("Status ${result.status}: ${result.body()}") + } + Log.d("UserRepository", result.bodyAsText()) + result.status.value + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/displaynone/acss/components/auth/models/user/repository/VisitAdapter.kt b/app/src/main/java/com/displaynone/acss/components/acs/models/visit/VisitAdapter.kt similarity index 88% rename from app/src/main/java/com/displaynone/acss/components/auth/models/user/repository/VisitAdapter.kt rename to app/src/main/java/com/displaynone/acss/components/acs/models/visit/VisitAdapter.kt index 4b7241e..70ebf0a 100644 --- a/app/src/main/java/com/displaynone/acss/components/auth/models/user/repository/VisitAdapter.kt +++ b/app/src/main/java/com/displaynone/acss/components/acs/models/visit/VisitAdapter.kt @@ -1,13 +1,11 @@ -package com.displaynone.acss.components.auth.models.user.repository +package com.displaynone.acss.components.acs.models.visit -import android.graphics.Color import android.view.LayoutInflater import android.view.ViewGroup import androidx.paging.PagingDataAdapter import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.RecyclerView -import com.bumptech.glide.Glide -import com.displaynone.acss.components.auth.models.user.repository.dto.VisitDto +import com.displaynone.acss.components.acs.models.visit.repository.dto.VisitDto import com.displaynone.acss.databinding.ItemScannerViewBinding class VisitAdapter: PagingDataAdapter(VisitDiff) { @@ -29,7 +27,8 @@ class VisitAdapter: PagingDataAdapter(VisitDi userId = -1, gateId = -1, createdAt = "Loading...", - )) + ) + ) } diff --git a/app/src/main/java/com/displaynone/acss/components/auth/models/user/repository/VisitListPagingSource.kt b/app/src/main/java/com/displaynone/acss/components/acs/models/visit/VisitListPagingSource.kt similarity index 89% rename from app/src/main/java/com/displaynone/acss/components/auth/models/user/repository/VisitListPagingSource.kt rename to app/src/main/java/com/displaynone/acss/components/acs/models/visit/VisitListPagingSource.kt index c80f861..b7aa84a 100644 --- a/app/src/main/java/com/displaynone/acss/components/auth/models/user/repository/VisitListPagingSource.kt +++ b/app/src/main/java/com/displaynone/acss/components/acs/models/visit/VisitListPagingSource.kt @@ -1,8 +1,8 @@ -package com.displaynone.acss.components.auth.models.user.repository +package com.displaynone.acss.components.acs.models.visit import androidx.paging.PagingSource import androidx.paging.PagingState -import com.displaynone.acss.components.auth.models.user.repository.dto.VisitDto +import com.displaynone.acss.components.acs.models.visit.repository.dto.VisitDto class VisitListPagingSource( private val request: suspend (pageNum: Int, pageSize: Int) -> Result> diff --git a/app/src/main/java/com/displaynone/acss/components/acs/models/visit/VisitServiceST.kt b/app/src/main/java/com/displaynone/acss/components/acs/models/visit/VisitServiceST.kt index f00465a..927d449 100644 --- a/app/src/main/java/com/displaynone/acss/components/acs/models/visit/VisitServiceST.kt +++ b/app/src/main/java/com/displaynone/acss/components/acs/models/visit/VisitServiceST.kt @@ -1,4 +1,45 @@ package com.displaynone.acss.components.acs.models.visit +import android.content.Context +import com.displaynone.acss.components.acs.models.visit.repository.VisitRepository +import com.displaynone.acss.components.acs.models.visit.repository.dto.VisitDto +import com.displaynone.acss.components.auth.internal_utils.AuthTokenManager +import com.displaynone.acss.components.auth.internal_utils.UserManager +import com.displaynone.acss.components.auth.models.user.UserServiceST + class VisitServiceST { + companion object { + private var instance: VisitServiceST? = null + + fun createInstance() { + if (instance == null) { + instance = VisitServiceST() + } + } + + fun getInstance(): VisitServiceST { + return instance ?: throw RuntimeException("null instance") + } + } + private val visitRepository: VisitRepository = VisitRepository() + suspend fun getLastVisitsByLogin(pageNum: Int, + pageSize: Int, + login: String): Result> { + if (!UserServiceST.getInstance().hasTokens()) { + throw RuntimeException("access token is null") + } + return visitRepository.getLastVisitsByLogin(pageNum, pageSize, UserServiceST.getInstance().getTokenPair().accessToken, login).map { pagingDto -> pagingDto.content } + } + suspend fun getMyLastVisits(pageNum: Int, + pageSize: Int): Result> { + if (!UserServiceST.getInstance().hasTokens()) { + throw RuntimeException("access token is null") + } + + return visitRepository.getMyLastVisits( + pageNum = pageNum, + pageSize = pageSize, + token = UserServiceST.getInstance().getTokenPair().accessToken + ).map { pagingDto -> pagingDto.content } + } } \ No newline at end of file diff --git a/app/src/main/java/com/displaynone/acss/components/acs/models/visit/repository/VisitRepository.kt b/app/src/main/java/com/displaynone/acss/components/acs/models/visit/repository/VisitRepository.kt new file mode 100644 index 0000000..443e607 --- /dev/null +++ b/app/src/main/java/com/displaynone/acss/components/acs/models/visit/repository/VisitRepository.kt @@ -0,0 +1,57 @@ +package com.displaynone.acss.components.acs.models.visit.repository + +import android.util.Log +import com.displaynone.acss.components.acs.models.visit.repository.dto.LastVisitsDto +import com.displaynone.acss.config.Constants.serverUrl +import com.displaynone.acss.config.Network +import io.ktor.client.call.body +import io.ktor.client.request.get +import io.ktor.client.request.headers +import io.ktor.client.request.setBody +import io.ktor.client.statement.bodyAsText +import io.ktor.http.HttpHeaders +import io.ktor.http.HttpStatusCode +import io.ktor.http.encodeURLPath +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext + +class VisitRepository { + + suspend fun getMyLastVisits(pageNum: Int, + pageSize: Int, + token: String): Result = withContext(Dispatchers.IO){ + runCatching { + val result = Network.client.get("$serverUrl/api/acs/visits/me?page=$pageNum&size=$pageSize") { + headers { + append(HttpHeaders.Authorization, "Bearer $token") + } + } + Log.d("VisitRepository", result.bodyAsText()) + if (result.status != HttpStatusCode.OK) { + error("Status ${result.status}: ${result.body()}") + } + + result.body() + } + } + suspend fun getLastVisitsByLogin(pageNum: Int, + pageSize: Int, + token: String, login: String): Result = withContext( + Dispatchers.IO){ + runCatching { + Log.d("VisitRepository", login) + val encodedLogin = login.encodeURLPath() + val result = Network.client.get("$serverUrl/api/acs/visits/login/${encodedLogin}?page=$pageNum&size=$pageSize") { + headers { + append(HttpHeaders.Authorization, "Bearer $token") + } + setBody("""{ "login": "$encodedLogin" }""") + } + if (result.status != HttpStatusCode.OK) { + error("Status ${result.status}: ${result.body()}") + } + Log.d("VisitRepository", result.bodyAsText()) + result.body() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/displaynone/acss/components/auth/models/user/repository/dto/LastVisitsDto.kt b/app/src/main/java/com/displaynone/acss/components/acs/models/visit/repository/dto/LastVisitsDto.kt similarity index 75% rename from app/src/main/java/com/displaynone/acss/components/auth/models/user/repository/dto/LastVisitsDto.kt rename to app/src/main/java/com/displaynone/acss/components/acs/models/visit/repository/dto/LastVisitsDto.kt index dea6502..16825a5 100644 --- a/app/src/main/java/com/displaynone/acss/components/auth/models/user/repository/dto/LastVisitsDto.kt +++ b/app/src/main/java/com/displaynone/acss/components/acs/models/visit/repository/dto/LastVisitsDto.kt @@ -1,4 +1,4 @@ -package com.displaynone.acss.components.auth.models.user.repository.dto +package com.displaynone.acss.components.acs.models.visit.repository.dto import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable diff --git a/app/src/main/java/com/displaynone/acss/components/auth/models/user/repository/dto/VisitDto.kt b/app/src/main/java/com/displaynone/acss/components/acs/models/visit/repository/dto/VisitDto.kt similarity index 83% rename from app/src/main/java/com/displaynone/acss/components/auth/models/user/repository/dto/VisitDto.kt rename to app/src/main/java/com/displaynone/acss/components/acs/models/visit/repository/dto/VisitDto.kt index a22dfc7..2702960 100644 --- a/app/src/main/java/com/displaynone/acss/components/auth/models/user/repository/dto/VisitDto.kt +++ b/app/src/main/java/com/displaynone/acss/components/acs/models/visit/repository/dto/VisitDto.kt @@ -1,4 +1,4 @@ -package com.displaynone.acss.components.auth.models.user.repository.dto +package com.displaynone.acss.components.acs.models.visit.repository.dto import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable diff --git a/app/src/main/java/com/displaynone/acss/components/auth/models/user/UserServiceST.kt b/app/src/main/java/com/displaynone/acss/components/auth/models/user/UserServiceST.kt index 5bd33ca..083734c 100644 --- a/app/src/main/java/com/displaynone/acss/components/auth/models/user/UserServiceST.kt +++ b/app/src/main/java/com/displaynone/acss/components/auth/models/user/UserServiceST.kt @@ -1,14 +1,12 @@ package com.displaynone.acss.components.auth.models.user import android.content.Context -import android.util.Log import com.displaynone.acss.components.auth.internal_utils.AuthTokenManager import com.displaynone.acss.components.auth.internal_utils.UserManager +import com.displaynone.acss.components.auth.models.AuthTokenPair import com.displaynone.acss.components.auth.models.user.repository.UserRepository -import com.displaynone.acss.components.auth.models.user.repository.dto.LastVisitsDto import com.displaynone.acss.components.auth.models.user.repository.dto.UserDTO -import com.displaynone.acss.components.auth.models.user.repository.dto.VisitDto -import java.util.Optional +import com.displaynone.acss.components.acs.models.visit.repository.dto.VisitDto class UserServiceST( @@ -43,29 +41,32 @@ class UserServiceST( } } } + fun getTokenPair(): AuthTokenPair { + return tokenManager.authTokenPair!! + } fun hasTokens(): Boolean { return tokenManager.hasTokens() } - suspend fun getMyLastVisits(pageNum: Int, - pageSize: Int): Result> { - if (!tokenManager.hasTokens()) { - throw RuntimeException("access token is null") - } - - return userRepository.getMyLastVisits( - pageNum = pageNum, - pageSize = pageSize, - token = tokenManager.authTokenPair!!.accessToken - ).map { pagingDto -> pagingDto.content } - } - suspend fun getLastVisitsByLogin(pageNum: Int, - pageSize: Int, - login: String): Result> { - if (!tokenManager.hasTokens()) { - throw RuntimeException("access token is null") - } - return userRepository.getLastVisitsByLogin(pageNum, pageSize, tokenManager.authTokenPair!!.accessToken, login).map { pagingDto -> pagingDto.content } - } +// suspend fun getMyLastVisits(pageNum: Int, +// pageSize: Int): Result> { +// if (!tokenManager.hasTokens()) { +// throw RuntimeException("access token is null") +// } +// +// return userRepository.getMyLastVisits( +// pageNum = pageNum, +// pageSize = pageSize, +// token = tokenManager.authTokenPair!!.accessToken +// ).map { pagingDto -> pagingDto.content } +// } +// suspend fun getLastVisitsByLogin(pageNum: Int, +// pageSize: Int, +// login: String): Result> { +// if (!tokenManager.hasTokens()) { +// throw RuntimeException("access token is null") +// } +// return userRepository.getLastVisitsByLogin(pageNum, pageSize, tokenManager.authTokenPair!!.accessToken, login).map { pagingDto -> pagingDto.content } +// } fun logout(){ tokenManager.clear() } diff --git a/app/src/main/java/com/displaynone/acss/components/auth/models/user/repository/UserRepository.kt b/app/src/main/java/com/displaynone/acss/components/auth/models/user/repository/UserRepository.kt index 685341e..16a8a1a 100644 --- a/app/src/main/java/com/displaynone/acss/components/auth/models/user/repository/UserRepository.kt +++ b/app/src/main/java/com/displaynone/acss/components/auth/models/user/repository/UserRepository.kt @@ -2,7 +2,6 @@ package com.displaynone.acss.components.auth.models.user.repository import android.util.Log import com.displaynone.acss.components.auth.models.AuthTokenPair -import com.displaynone.acss.components.auth.models.user.repository.dto.LastVisitsDto import com.displaynone.acss.config.Constants.serverUrl import com.displaynone.acss.config.Network import com.displaynone.acss.components.auth.models.user.repository.dto.RegisterUserDto @@ -11,7 +10,6 @@ import com.displaynone.acss.components.auth.models.user.repository.dto.UserLogin import io.ktor.client.call.body import io.ktor.client.request.get import io.ktor.client.request.headers -import io.ktor.client.request.patch import io.ktor.client.request.post import io.ktor.client.request.setBody import io.ktor.client.statement.bodyAsText @@ -24,7 +22,6 @@ import io.ktor.http.encodeURLPath import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext import kotlinx.serialization.json.Json -import kotlin.math.log class UserRepository( @@ -104,72 +101,6 @@ class UserRepository( result.body() } } - suspend fun getMyLastVisits(pageNum: Int, - pageSize: Int, - token: String): Result = withContext(Dispatchers.IO){ - runCatching { - val result = Network.client.get("$serverUrl/api/acs/visits/me?page=$pageNum&size=$pageSize") { - headers { - append(HttpHeaders.Authorization, "Bearer $token") - } - } - Log.d("UserRepository", result.bodyAsText()) - if (result.status != HttpStatusCode.OK) { - error("Status ${result.status}: ${result.body()}") - } - - result.body() - } - } - suspend fun getLastVisitsByLogin(pageNum: Int, - pageSize: Int, - token: String, login: String): Result = withContext(Dispatchers.IO){ - runCatching { - Log.d("UserRepository", login) - val encodedLogin = login.encodeURLPath() - val result = Network.client.get("$serverUrl/api/acs/visits/login/${encodedLogin}?page=$pageNum&size=$pageSize") { - headers { - append(HttpHeaders.Authorization, "Bearer $token") - } - setBody("""{ "login": "$encodedLogin" }""") - } - if (result.status != HttpStatusCode.OK) { - error("Status ${result.status}: ${result.body()}") - } - Log.d("UserRepository", result.bodyAsText()) - result.body() - } - } - suspend fun getAllLastVisitsAsAdmin(token: String, login: String): Result = withContext(Dispatchers.IO){ - runCatching { - val encodedLogin = login.encodeURLPath() - val result = Network.client.get("$serverUrl/api/users/login/$encodedLogin") { - headers { - append(HttpHeaders.Authorization, "Bearer $token") - } - setBody("""{ "code": "$encodedLogin" }""") - } - if (result.status != HttpStatusCode.OK) { - error("Status ${result.status}: ${result.body()}") - } - Log.d("UserRepository", result.bodyAsText()) - result.body() - } - } - suspend fun openDoor(token: String, code: Long): Result = withContext(Dispatchers.IO) { - runCatching { - val result = Network.client.patch("$serverUrl/api/open") { - headers { - append(HttpHeaders.Authorization, token) - } - setBody("""{"value":$code}""") - } - if (result.status != HttpStatusCode.OK) { - error("Status ${result.status}: ${result.body()}") - } - Unit - } - } suspend fun register(login: String, password: String): Result = withContext(Dispatchers.IO) { diff --git a/app/src/main/java/com/displaynone/acss/ui/profile/ProfileFragment.kt b/app/src/main/java/com/displaynone/acss/ui/profile/ProfileFragment.kt index 9739573..57fee69 100644 --- a/app/src/main/java/com/displaynone/acss/ui/profile/ProfileFragment.kt +++ b/app/src/main/java/com/displaynone/acss/ui/profile/ProfileFragment.kt @@ -12,7 +12,7 @@ import androidx.recyclerview.widget.LinearLayoutManager import com.bumptech.glide.Glide import com.displaynone.acss.R import com.displaynone.acss.components.auth.models.user.UserServiceST -import com.displaynone.acss.components.auth.models.user.repository.VisitAdapter +import com.displaynone.acss.components.acs.models.visit.VisitAdapter import com.displaynone.acss.components.auth.models.user.repository.dto.UserDTO import com.displaynone.acss.databinding.FragmentProfileBinding import com.displaynone.acss.ui.profile.ProfileViewModel.Action diff --git a/app/src/main/java/com/displaynone/acss/ui/profile/ProfileViewModel.kt b/app/src/main/java/com/displaynone/acss/ui/profile/ProfileViewModel.kt index fe45d33..d58d9b3 100644 --- a/app/src/main/java/com/displaynone/acss/ui/profile/ProfileViewModel.kt +++ b/app/src/main/java/com/displaynone/acss/ui/profile/ProfileViewModel.kt @@ -6,9 +6,9 @@ import androidx.lifecycle.viewModelScope import androidx.paging.Pager import androidx.paging.PagingConfig import androidx.paging.cachedIn -import androidx.paging.log import com.displaynone.acss.components.auth.models.user.UserServiceST -import com.displaynone.acss.components.auth.models.user.repository.VisitListPagingSource +import com.displaynone.acss.components.acs.models.visit.VisitListPagingSource +import com.displaynone.acss.components.acs.models.visit.VisitServiceST import com.displaynone.acss.components.auth.models.user.repository.dto.UserDTO import kotlinx.coroutines.channels.BufferOverflow import kotlinx.coroutines.channels.Channel @@ -36,7 +36,7 @@ class ProfileViewModel(): ViewModel() { maxSize = 100 ) ) { - VisitListPagingSource(UserServiceST.getInstance()::getMyLastVisits) + VisitListPagingSource(VisitServiceST.getInstance()::getMyLastVisits) }.flow .cachedIn(viewModelScope) @@ -44,7 +44,7 @@ class ProfileViewModel(): ViewModel() { config = PagingConfig(pageSize = 20, enablePlaceholders = false, maxSize = 100) ) { VisitListPagingSource { pageNum, pageSize -> - UserServiceST.getInstance().getLastVisitsByLogin(pageNum,pageSize, login) + VisitServiceST.getInstance().getLastVisitsByLogin(pageNum,pageSize, login) } }.flow.cachedIn(viewModelScope) diff --git a/app/src/main/java/com/displaynone/acss/ui/result/QrResultViewModel.kt b/app/src/main/java/com/displaynone/acss/ui/result/QrResultViewModel.kt index 93f6fc5..54dffc8 100644 --- a/app/src/main/java/com/displaynone/acss/ui/result/QrResultViewModel.kt +++ b/app/src/main/java/com/displaynone/acss/ui/result/QrResultViewModel.kt @@ -6,6 +6,7 @@ import android.app.Application import android.net.http.HttpException import android.util.Log import androidx.lifecycle.viewModelScope +import com.displaynone.acss.components.acs.models.gate.GateServiceST import com.displaynone.acss.components.auth.models.user.UserServiceST import kotlinx.coroutines.launch import kotlinx.io.IOException @@ -18,7 +19,7 @@ class QrResultViewModel(application: Application) : AndroidViewModel(application viewModelScope.launch { try { val stringCode = code.toString() - UserServiceST.getInstance().openDoor(stringCode).fold( + GateServiceST.getInstance().openDoor(stringCode).fold( onSuccess = { response -> Log.d("QrResultViewModel", "Door opened") _state.emit(State.Result( diff --git a/app/src/main/res/layout/fragment_profile.xml b/app/src/main/res/layout/fragment_profile.xml index c603017..01e5175 100644 --- a/app/src/main/res/layout/fragment_profile.xml +++ b/app/src/main/res/layout/fragment_profile.xml @@ -209,16 +209,6 @@ - -