From 3ab8beaf7d7e2b51df0451ff39c5f7a46739408f Mon Sep 17 00:00:00 2001 From: Michael Avoyan Date: Sun, 29 Oct 2023 16:12:47 +0200 Subject: [PATCH 1/2] download dynamic service types --- VCL/build.gradle | 4 +- .../api/entities/VCLServiceTypeDynamic.kt | 26 +++++ .../api/entities/VCLServiceTypesDynamic.kt | 14 +++ .../io/velocitycareerlabs/impl/VCLImpl.kt | 20 +++- .../impl/VclBlocksProvider.kt | 12 ++ .../infrastructure/db/CacheServiceImpl.kt | 20 +++- .../impl/data/models/ServiceTypesModelImpl.kt | 32 ++++++ .../ServiceTypesRepositoryImpl.kt | 105 ++++++++++++++++++ .../impl/data/repositories/Urls.kt | 1 + .../data/usecases/ServiceTypesUseCaseImpl.kt | 29 +++++ .../domain/infrastructure/db/CacheService.kt | 4 + .../impl/domain/models/ServiceTypesModel.kt | 12 ++ .../repositories/ServiceTypesRepository.kt | 18 +++ .../domain/usecases/ServiceTypesUseCase.kt | 18 +++ .../resources/EmptyCacheService.kt | 3 + .../resources/valid/ServiceTypesMocks.kt | 12 ++ .../repositories/UrlsTest.kt | 1 + .../usecases/ServiceTypesUseCaseTest.kt | 54 +++++++++ 18 files changed, 380 insertions(+), 5 deletions(-) create mode 100644 VCL/src/main/java/io/velocitycareerlabs/api/entities/VCLServiceTypeDynamic.kt create mode 100644 VCL/src/main/java/io/velocitycareerlabs/api/entities/VCLServiceTypesDynamic.kt create mode 100644 VCL/src/main/java/io/velocitycareerlabs/impl/data/models/ServiceTypesModelImpl.kt create mode 100644 VCL/src/main/java/io/velocitycareerlabs/impl/data/repositories/ServiceTypesRepositoryImpl.kt create mode 100644 VCL/src/main/java/io/velocitycareerlabs/impl/data/usecases/ServiceTypesUseCaseImpl.kt create mode 100644 VCL/src/main/java/io/velocitycareerlabs/impl/domain/models/ServiceTypesModel.kt create mode 100644 VCL/src/main/java/io/velocitycareerlabs/impl/domain/repositories/ServiceTypesRepository.kt create mode 100644 VCL/src/main/java/io/velocitycareerlabs/impl/domain/usecases/ServiceTypesUseCase.kt create mode 100644 VCL/src/test/java/io/velocitycareerlabs/infrastructure/resources/valid/ServiceTypesMocks.kt create mode 100644 VCL/src/test/java/io/velocitycareerlabs/usecases/ServiceTypesUseCaseTest.kt diff --git a/VCL/build.gradle b/VCL/build.gradle index 1a7b8f0a..218e8468 100644 --- a/VCL/build.gradle +++ b/VCL/build.gradle @@ -13,8 +13,8 @@ android { defaultConfig { minSdk 24 targetSdk 33 - versionName "1.18.0" - versionCode 110 + versionName "1.19.0" + versionCode 111 testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" consumerProguardFiles "consumer-rules.pro" } diff --git a/VCL/src/main/java/io/velocitycareerlabs/api/entities/VCLServiceTypeDynamic.kt b/VCL/src/main/java/io/velocitycareerlabs/api/entities/VCLServiceTypeDynamic.kt new file mode 100644 index 00000000..f45a10ae --- /dev/null +++ b/VCL/src/main/java/io/velocitycareerlabs/api/entities/VCLServiceTypeDynamic.kt @@ -0,0 +1,26 @@ +/** + * Created by Michael Avoyan on 25/10/2023. + * + * Copyright 2022 Velocity Career Labs inc. + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.velocitycareerlabs.api.entities + +import org.json.JSONObject + +data class VCLServiceTypeDynamic( + val payload: JSONObject +) { + val serviceType: String get() = payload.optString(KeyServiceType) + val serviceCategory: String get() = payload.optString(KeyServiceCategory) + val notary: Boolean get() = payload.optBoolean(KeyNotary) + val credentialGroup: String get() = payload.optString(KeyCredentialGroup) + + companion object CodingKeys { + const val KeyServiceType = "serviceType" + const val KeyServiceCategory = "serviceCategory" + const val KeyNotary = "notary" + const val KeyCredentialGroup = "credentialGroup" + } +} diff --git a/VCL/src/main/java/io/velocitycareerlabs/api/entities/VCLServiceTypesDynamic.kt b/VCL/src/main/java/io/velocitycareerlabs/api/entities/VCLServiceTypesDynamic.kt new file mode 100644 index 00000000..fb7b5793 --- /dev/null +++ b/VCL/src/main/java/io/velocitycareerlabs/api/entities/VCLServiceTypesDynamic.kt @@ -0,0 +1,14 @@ +/** + * Created by Michael Avoyan on 25/10/2023. + * + * Copyright 2022 Velocity Career Labs inc. + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.velocitycareerlabs.api.entities + +data class VCLServiceTypesDynamic(val all: List) { + companion object CodingKeys { + const val KeyServiceTypes = "serviceTypes" + } +} diff --git a/VCL/src/main/java/io/velocitycareerlabs/impl/VCLImpl.kt b/VCL/src/main/java/io/velocitycareerlabs/impl/VCLImpl.kt index 29ef3167..06f42c5b 100644 --- a/VCL/src/main/java/io/velocitycareerlabs/impl/VCLImpl.kt +++ b/VCL/src/main/java/io/velocitycareerlabs/impl/VCLImpl.kt @@ -16,6 +16,7 @@ import io.velocitycareerlabs.api.entities.handleResult import io.velocitycareerlabs.api.entities.initialization.VCLInitializationDescriptor import io.velocitycareerlabs.impl.domain.models.CountriesModel import io.velocitycareerlabs.impl.domain.models.CredentialTypesModel +import io.velocitycareerlabs.impl.domain.models.ServiceTypesModel import io.velocitycareerlabs.impl.domain.usecases.CredentialManifestUseCase import io.velocitycareerlabs.impl.domain.usecases.CredentialTypesUIFormSchemaUseCase import io.velocitycareerlabs.impl.domain.usecases.ExchangeProgressUseCase @@ -37,13 +38,14 @@ internal class VCLImpl: VCL { companion object { val TAG = VCLImpl::class.simpleName - private const val ModelsToInitializeAmount = 3 + private const val ModelsToInitializeAmount = 4 } private lateinit var initializationDescriptor: VCLInitializationDescriptor private lateinit var credentialTypesModel: CredentialTypesModel private lateinit var credentialTypeSchemasModel: CredentialTypeSchemasModel private lateinit var countriesModel: CountriesModel + private lateinit var serviceTypesModel: ServiceTypesModel private lateinit var presentationRequestUseCase: PresentationRequestUseCase private lateinit var presentationSubmissionUseCase: PresentationSubmissionUseCase @@ -160,6 +162,9 @@ internal class VCLImpl: VCL { countriesModel = VclBlocksProvider.provideCountriesModel(context) + serviceTypesModel = + VclBlocksProvider.provideServiceTypesModel(context) + countriesModel.initialize(cacheSequence) { result -> result.handleResult( { @@ -171,6 +176,7 @@ internal class VCLImpl: VCL { completionHandler(context, successHandler, errorHandler) }) } + credentialTypesModel.initialize(cacheSequence) { result -> result.handleResult( { @@ -208,6 +214,18 @@ internal class VCLImpl: VCL { } }) } + + serviceTypesModel.initialize(cacheSequence) { result -> + result.handleResult( + { + if (initializationWatcher.onInitializedModel(null)) + completionHandler(context, successHandler, errorHandler) + }, + { error -> + if (initializationWatcher.onInitializedModel(error)) + completionHandler(context, successHandler, errorHandler) + }) + } } private fun initGlobalConfigurations() { diff --git a/VCL/src/main/java/io/velocitycareerlabs/impl/VclBlocksProvider.kt b/VCL/src/main/java/io/velocitycareerlabs/impl/VclBlocksProvider.kt index bfa8cc83..d6afe4f5 100644 --- a/VCL/src/main/java/io/velocitycareerlabs/impl/VclBlocksProvider.kt +++ b/VCL/src/main/java/io/velocitycareerlabs/impl/VclBlocksProvider.kt @@ -147,6 +147,18 @@ internal object VclBlocksProvider { ) ) + @Throws(VCLError::class) + fun provideServiceTypesModel(context: Context): ServiceTypesModel = + ServiceTypesModelImpl( + ServiceTypesUseCaseImpl( + ServiceTypesRepositoryImpl( + NetworkServiceImpl(), + CacheServiceImpl(context) + ), + ExecutorImpl() + ) + ) + @Throws(VCLError::class) fun providePresentationRequestUseCase( context: Context, diff --git a/VCL/src/main/java/io/velocitycareerlabs/impl/data/infrastructure/db/CacheServiceImpl.kt b/VCL/src/main/java/io/velocitycareerlabs/impl/data/infrastructure/db/CacheServiceImpl.kt index a3c86d81..039c3004 100644 --- a/VCL/src/main/java/io/velocitycareerlabs/impl/data/infrastructure/db/CacheServiceImpl.kt +++ b/VCL/src/main/java/io/velocitycareerlabs/impl/data/infrastructure/db/CacheServiceImpl.kt @@ -24,9 +24,13 @@ internal class CacheServiceImpl( private const val MODE = Context.MODE_PRIVATE internal const val KEY_CACHE_SEQUENCE_COUNTRIES = "KEY_CACHE_SEQUENCE_COUNTRIES" - internal const val KEY_CACHE_SEQUENCE_CREDENTIAL_TYPES = "KEY_CACHE_SEQUENCE_CREDENTIAL_TYPES" - internal const val KEY_CACHE_SEQUENCE_CREDENTIAL_TYPE_SCHEMA = "KEY_CACHE_SEQUENCE_CREDENTIAL_TYPE_SCHEMA" + internal const val KEY_CACHE_SEQUENCE_CREDENTIAL_TYPES = + "KEY_CACHE_SEQUENCE_CREDENTIAL_TYPES" + internal const val KEY_CACHE_SEQUENCE_CREDENTIAL_TYPE_SCHEMA = + "KEY_CACHE_SEQUENCE_CREDENTIAL_TYPE_SCHEMA" + internal const val KEY_CACHE_SEQUENCE_SERVICE_TYPES = "KEY_CACHE_SEQUENCE_CREDENTIAL_TYPES" } + private var preferences: SharedPreferences = context.getSharedPreferences(NAME, MODE) // an inline function to put variable and save it @@ -53,6 +57,7 @@ internal class CacheServiceImpl( setString(key, value) setInt(KEY_CACHE_SEQUENCE_COUNTRIES, cacheSequence) } + override fun isResetCacheCountries(cacheSequence: Int) = getInt(KEY_CACHE_SEQUENCE_COUNTRIES) < cacheSequence @@ -61,6 +66,7 @@ internal class CacheServiceImpl( setString(key, value) setInt(KEY_CACHE_SEQUENCE_CREDENTIAL_TYPES, cacheSequence) } + override fun isResetCacheCredentialTypes(cacheSequence: Int) = getInt(KEY_CACHE_SEQUENCE_CREDENTIAL_TYPES) < cacheSequence @@ -69,6 +75,16 @@ internal class CacheServiceImpl( setString(key, value) setInt(KEY_CACHE_SEQUENCE_CREDENTIAL_TYPE_SCHEMA, cacheSequence) } + override fun isResetCacheCredentialTypeSchema(cacheSequence: Int) = getInt(KEY_CACHE_SEQUENCE_CREDENTIAL_TYPE_SCHEMA) < cacheSequence + + override fun getServiceTypes(key: String) = getString(key) + override fun setServiceTypes(key: String, value: String, cacheSequence: Int) { + setString(key, value) + setInt(KEY_CACHE_SEQUENCE_SERVICE_TYPES, cacheSequence) + } + + override fun isResetCacheServiceTypes(cacheSequence: Int) = + getInt(KEY_CACHE_SEQUENCE_SERVICE_TYPES) < cacheSequence } \ No newline at end of file diff --git a/VCL/src/main/java/io/velocitycareerlabs/impl/data/models/ServiceTypesModelImpl.kt b/VCL/src/main/java/io/velocitycareerlabs/impl/data/models/ServiceTypesModelImpl.kt new file mode 100644 index 00000000..f6fef8d4 --- /dev/null +++ b/VCL/src/main/java/io/velocitycareerlabs/impl/data/models/ServiceTypesModelImpl.kt @@ -0,0 +1,32 @@ +/** + * Created by Michael Avoyan on 25/10/2023. + * + * Copyright 2022 Velocity Career Labs inc. + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.velocitycareerlabs.impl.data.models + +import io.velocitycareerlabs.api.entities.VCLResult +import io.velocitycareerlabs.api.entities.VCLServiceTypesDynamic +import io.velocitycareerlabs.api.entities.data +import io.velocitycareerlabs.api.entities.handleResult +import io.velocitycareerlabs.impl.domain.models.ServiceTypesModel +import io.velocitycareerlabs.impl.domain.usecases.ServiceTypesUseCase + +internal class ServiceTypesModelImpl( + private val serviceTypesUseCase: ServiceTypesUseCase +): ServiceTypesModel { + + override var data: VCLServiceTypesDynamic? = null + + override fun initialize( + cacheSequence: Int, + completionBlock: (VCLResult) -> Unit + ) { + serviceTypesUseCase.getServiceTypes(cacheSequence) { result -> + result.handleResult({ data = result.data }, { }) + completionBlock(result) + } + } +} \ No newline at end of file diff --git a/VCL/src/main/java/io/velocitycareerlabs/impl/data/repositories/ServiceTypesRepositoryImpl.kt b/VCL/src/main/java/io/velocitycareerlabs/impl/data/repositories/ServiceTypesRepositoryImpl.kt new file mode 100644 index 00000000..18b55863 --- /dev/null +++ b/VCL/src/main/java/io/velocitycareerlabs/impl/data/repositories/ServiceTypesRepositoryImpl.kt @@ -0,0 +1,105 @@ +/** + * Created by Michael Avoyan on 25/10/2023. + * + * Copyright 2022 Velocity Career Labs inc. + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.velocitycareerlabs.impl.data.repositories + +import io.velocitycareerlabs.api.entities.VCLResult +import io.velocitycareerlabs.api.entities.VCLServiceType +import io.velocitycareerlabs.api.entities.VCLServiceTypeDynamic +import io.velocitycareerlabs.api.entities.VCLServiceTypesDynamic +import io.velocitycareerlabs.api.entities.error.VCLError +import io.velocitycareerlabs.api.entities.handleResult +import io.velocitycareerlabs.impl.data.infrastructure.network.Request +import io.velocitycareerlabs.impl.domain.infrastructure.db.CacheService +import io.velocitycareerlabs.impl.domain.infrastructure.network.NetworkService +import io.velocitycareerlabs.impl.domain.repositories.ServiceTypesRepository +import io.velocitycareerlabs.impl.extensions.toJsonArray +import io.velocitycareerlabs.impl.extensions.toJsonObject +import org.json.JSONArray +import org.json.JSONObject +import java.lang.Exception + +internal class ServiceTypesRepositoryImpl( + private val networkService: NetworkService, + private val cacheService: CacheService +): ServiceTypesRepository { + override fun getServiceTypes( + cacheSequence: Int, + completionBlock: (VCLResult) -> Unit + ) { + val endpoint = Urls.ServiceTypes + if (cacheService.isResetCacheServiceTypes(cacheSequence)) { + fetchServiceTypes(endpoint, cacheSequence, completionBlock) + } else { + cacheService.getServiceTypes(endpoint)?.let { serviceTypes -> + parse(serviceTypes.toJsonObject())?.let { + completionBlock(VCLResult.Success(it)) + } ?: run { + completionBlock(VCLResult.Failure(VCLError("Failed to parse $serviceTypes"))) + } + } ?: run { + fetchServiceTypes(endpoint, cacheSequence, completionBlock) + } + } + } + + private fun fetchServiceTypes( + endpoint: String, + cacheSequence: Int, + completionBlock: (VCLResult) -> Unit + ) { + networkService.sendRequest( + endpoint = endpoint, + contentType = Request.ContentTypeApplicationJson, + method = Request.HttpMethod.GET, + headers = listOf(Pair(HeaderKeys.XVnfProtocolVersion, HeaderValues.XVnfProtocolVersion)), + useCaches = true, + completionBlock = { result -> + result.handleResult( + { serviceTypesResponse-> + try { + cacheService.setServiceTypes( + endpoint, + serviceTypesResponse.payload, + cacheSequence + ) + parse(serviceTypesResponse.payload.toJsonObject())?.let { + completionBlock(VCLResult.Success(it)) + } ?: run { + completionBlock(VCLResult.Failure(VCLError("Failed to parse ${serviceTypesResponse.payload}"))) + } + } catch (ex: Exception) { + completionBlock(VCLResult.Failure(VCLError(ex))) + } + }, + { error -> + completionBlock(VCLResult.Failure(error)) + } + ) + } + ) + } + + private fun parse(serviceTypesJsonObj: JSONObject?): VCLServiceTypesDynamic? { + serviceTypesJsonObj?.optJSONArray(VCLServiceTypesDynamic.KeyServiceTypes)?.let { + serviceTypesJsonArr -> + val serviceTypesArr = mutableListOf() + for (i in 0 until (serviceTypesJsonArr.length())) { + serviceTypesJsonArr.optJSONObject(i)?.let { payload -> + serviceTypesArr.add( + VCLServiceTypeDynamic(payload) + ) + } + } + return VCLServiceTypesDynamic(serviceTypesArr) + } ?: return null + } + + companion object { + + } +} \ No newline at end of file diff --git a/VCL/src/main/java/io/velocitycareerlabs/impl/data/repositories/Urls.kt b/VCL/src/main/java/io/velocitycareerlabs/impl/data/repositories/Urls.kt index 103a5a37..d769be63 100644 --- a/VCL/src/main/java/io/velocitycareerlabs/impl/data/repositories/Urls.kt +++ b/VCL/src/main/java/io/velocitycareerlabs/impl/data/repositories/Urls.kt @@ -23,6 +23,7 @@ internal class Urls { } private val BaseUrlRegistrar get() = "https://${EnvironmentPrefix}registrar.velocitynetwork.foundation" // private val BaseUrlWalletApi get() = "https://${EnvironmentPrefix}walletapi.velocitycareerlabs.io" + val ServiceTypes get() = "$BaseUrlRegistrar/api/v0.6/service-types" val CredentialTypes get() = "$BaseUrlRegistrar/api/v0.6/credential-types" val CredentialTypeSchemas get() = "$BaseUrlRegistrar/schemas/" val Countries get() = "$BaseUrlRegistrar/reference/countries" diff --git a/VCL/src/main/java/io/velocitycareerlabs/impl/data/usecases/ServiceTypesUseCaseImpl.kt b/VCL/src/main/java/io/velocitycareerlabs/impl/data/usecases/ServiceTypesUseCaseImpl.kt new file mode 100644 index 00000000..8710ba4b --- /dev/null +++ b/VCL/src/main/java/io/velocitycareerlabs/impl/data/usecases/ServiceTypesUseCaseImpl.kt @@ -0,0 +1,29 @@ +/** + * Created by Michael Avoyan on 25/10/2023. + */ + +package io.velocitycareerlabs.impl.data.usecases + +import io.velocitycareerlabs.api.entities.VCLResult +import io.velocitycareerlabs.api.entities.VCLServiceTypesDynamic +import io.velocitycareerlabs.impl.domain.infrastructure.executors.Executor +import io.velocitycareerlabs.impl.domain.repositories.ServiceTypesRepository +import io.velocitycareerlabs.impl.domain.usecases.ServiceTypesUseCase + +internal class ServiceTypesUseCaseImpl( + private val serviceTypesRepository: ServiceTypesRepository, + private val executor: Executor +): ServiceTypesUseCase { + override fun getServiceTypes( + cacheSequence: Int, + completionBlock: (VCLResult) -> Unit + ) { + executor.runOnBackground { + serviceTypesRepository.getServiceTypes(cacheSequence) { + executor.runOnMain { + completionBlock(it) + } + } + } + } +} \ No newline at end of file diff --git a/VCL/src/main/java/io/velocitycareerlabs/impl/domain/infrastructure/db/CacheService.kt b/VCL/src/main/java/io/velocitycareerlabs/impl/domain/infrastructure/db/CacheService.kt index 2aca1e12..23241099 100644 --- a/VCL/src/main/java/io/velocitycareerlabs/impl/domain/infrastructure/db/CacheService.kt +++ b/VCL/src/main/java/io/velocitycareerlabs/impl/domain/infrastructure/db/CacheService.kt @@ -21,4 +21,8 @@ internal interface CacheService { fun getCredentialTypeSchema(key: String): String? fun setCredentialTypeSchema(key: String, value: String, cacheSequence: Int) fun isResetCacheCredentialTypeSchema(cacheSequence: Int): Boolean + + fun getServiceTypes(key: String): String? + fun setServiceTypes(key: String, value: String, cacheSequence: Int) + fun isResetCacheServiceTypes(cacheSequence: Int): Boolean } \ No newline at end of file diff --git a/VCL/src/main/java/io/velocitycareerlabs/impl/domain/models/ServiceTypesModel.kt b/VCL/src/main/java/io/velocitycareerlabs/impl/domain/models/ServiceTypesModel.kt new file mode 100644 index 00000000..aae6b96c --- /dev/null +++ b/VCL/src/main/java/io/velocitycareerlabs/impl/domain/models/ServiceTypesModel.kt @@ -0,0 +1,12 @@ +/** + * Created by Michael Avoyan on 25/10/2023. + * + * Copyright 2022 Velocity Career Labs inc. + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.velocitycareerlabs.impl.domain.models + +import io.velocitycareerlabs.api.entities.VCLServiceTypesDynamic + +internal interface ServiceTypesModel: Model, Initializable \ No newline at end of file diff --git a/VCL/src/main/java/io/velocitycareerlabs/impl/domain/repositories/ServiceTypesRepository.kt b/VCL/src/main/java/io/velocitycareerlabs/impl/domain/repositories/ServiceTypesRepository.kt new file mode 100644 index 00000000..db614e52 --- /dev/null +++ b/VCL/src/main/java/io/velocitycareerlabs/impl/domain/repositories/ServiceTypesRepository.kt @@ -0,0 +1,18 @@ +/** + * Created by Michael Avoyan on 25/10/2023. + * + * Copyright 2022 Velocity Career Labs inc. + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.velocitycareerlabs.impl.domain.repositories + +import io.velocitycareerlabs.api.entities.VCLResult +import io.velocitycareerlabs.api.entities.VCLServiceTypesDynamic + +internal interface ServiceTypesRepository { + fun getServiceTypes( + cacheSequence: Int, + completionBlock: (VCLResult) -> Unit + ) +} \ No newline at end of file diff --git a/VCL/src/main/java/io/velocitycareerlabs/impl/domain/usecases/ServiceTypesUseCase.kt b/VCL/src/main/java/io/velocitycareerlabs/impl/domain/usecases/ServiceTypesUseCase.kt new file mode 100644 index 00000000..97c780f3 --- /dev/null +++ b/VCL/src/main/java/io/velocitycareerlabs/impl/domain/usecases/ServiceTypesUseCase.kt @@ -0,0 +1,18 @@ +/** + * Created by Michael Avoyan on 25/10/2023. + * + * Copyright 2022 Velocity Career Labs inc. + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.velocitycareerlabs.impl.domain.usecases + +import io.velocitycareerlabs.api.entities.VCLResult +import io.velocitycareerlabs.api.entities.VCLServiceTypesDynamic + +internal interface ServiceTypesUseCase { + fun getServiceTypes( + cacheSequence: Int, + completionBlock: (VCLResult) -> Unit + ) +} \ No newline at end of file diff --git a/VCL/src/test/java/io/velocitycareerlabs/infrastructure/resources/EmptyCacheService.kt b/VCL/src/test/java/io/velocitycareerlabs/infrastructure/resources/EmptyCacheService.kt index 4ea67e66..76060c56 100644 --- a/VCL/src/test/java/io/velocitycareerlabs/infrastructure/resources/EmptyCacheService.kt +++ b/VCL/src/test/java/io/velocitycareerlabs/infrastructure/resources/EmptyCacheService.kt @@ -19,4 +19,7 @@ internal class EmptyCacheService: CacheService { override fun getCredentialTypeSchema(key: String) = null override fun setCredentialTypeSchema(key: String, value: String, cacheSequence: Int) {} override fun isResetCacheCredentialTypeSchema(cacheSequence: Int) = false + override fun getServiceTypes(key: String) = null + override fun setServiceTypes(key: String, value: String, cacheSequence: Int) {} + override fun isResetCacheServiceTypes(cacheSequence: Int) = false } \ No newline at end of file diff --git a/VCL/src/test/java/io/velocitycareerlabs/infrastructure/resources/valid/ServiceTypesMocks.kt b/VCL/src/test/java/io/velocitycareerlabs/infrastructure/resources/valid/ServiceTypesMocks.kt new file mode 100644 index 00000000..d42b7357 --- /dev/null +++ b/VCL/src/test/java/io/velocitycareerlabs/infrastructure/resources/valid/ServiceTypesMocks.kt @@ -0,0 +1,12 @@ +/** + * Created by Michael Avoyan on 29/10/2023. + */ + +package io.velocitycareerlabs.infrastructure.resources.valid + +class ServiceTypesMocks { + companion object { + const val ServiceTypesJsonStr = + "{\"serviceTypes\":[{\"serviceType\":\"VlcInspector_v1\",\"serviceCategory\":\"Inspector\",\"notary\":false},{\"serviceType\":\"VlcNotaryIssuer_v1\",\"serviceCategory\":\"NotaryIssuer\",\"notary\":true,\"credentialGroup\":\"Contact\"},{\"serviceType\":\"VlcHolderAppProvider_v1\",\"serviceCategory\":\"HolderAppProvider\",\"notary\":false},{\"serviceType\":\"VlcNodeOperator_v1\",\"serviceCategory\":\"NodeOperator\",\"notary\":false},{\"serviceType\":\"VlcCredentialAgentOperator_v1\",\"serviceCategory\":\"CredentialAgentOperator\",\"notary\":false},{\"serviceType\":\"VlcCareerIssuer_v1\",\"serviceCategory\":\"Issuer\",\"notary\":false,\"credentialGroup\":\"Career\"},{\"serviceType\":\"VlcIdDocumentIssuer_v1\",\"serviceCategory\":\"IdDocumentIssuer\",\"notary\":false,\"credentialGroup\":\"IdDocument\"},{\"serviceType\":\"VlcNotaryIdDocumentIssuer_v1\",\"serviceCategory\":\"NotaryIdDocumentIssuer\",\"notary\":true,\"credentialGroup\":\"IdDocument\"},{\"serviceType\":\"VlcContactIssuer_v1\",\"serviceCategory\":\"ContactIssuer\",\"notary\":false,\"credentialGroup\":\"Contact\"},{\"serviceType\":\"VlcNotaryContactIssuer_v1\",\"serviceCategory\":\"NotaryContactIssuer\",\"notary\":true,\"credentialGroup\":\"Contact\"}]}" + } +} \ No newline at end of file diff --git a/VCL/src/test/java/io/velocitycareerlabs/repositories/UrlsTest.kt b/VCL/src/test/java/io/velocitycareerlabs/repositories/UrlsTest.kt index 2d12fab0..428897cc 100644 --- a/VCL/src/test/java/io/velocitycareerlabs/repositories/UrlsTest.kt +++ b/VCL/src/test/java/io/velocitycareerlabs/repositories/UrlsTest.kt @@ -62,6 +62,7 @@ internal class UrlsTest { private fun verifyUrlsPrefix(registrarPrefix: String) { assert(Urls.CredentialTypes.startsWith(registrarPrefix)) {"expected: $registrarPrefix, actual: ${Urls.CredentialTypes}"} + assert(Urls.ServiceTypes.startsWith(registrarPrefix)) {"expected: $registrarPrefix, actual: ${Urls.ServiceTypes}"} assert(Urls.CredentialTypeSchemas.startsWith(registrarPrefix)) {"expected: $registrarPrefix, actual: ${Urls.CredentialTypeSchemas}"} assert(Urls.Countries.startsWith(registrarPrefix)) {"expected: $registrarPrefix, actual: ${Urls.Countries}"} assert(Urls.Organizations.startsWith(registrarPrefix)) {"expected: $registrarPrefix, actual: ${Urls.Organizations}"} diff --git a/VCL/src/test/java/io/velocitycareerlabs/usecases/ServiceTypesUseCaseTest.kt b/VCL/src/test/java/io/velocitycareerlabs/usecases/ServiceTypesUseCaseTest.kt new file mode 100644 index 00000000..cad96a50 --- /dev/null +++ b/VCL/src/test/java/io/velocitycareerlabs/usecases/ServiceTypesUseCaseTest.kt @@ -0,0 +1,54 @@ +/** + * Created by Michael Avoyan on 29/10/2023. + * + * Copyright 2022 Velocity Career Labs inc. + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.velocitycareerlabs.usecases + +import io.velocitycareerlabs.api.entities.handleResult +import io.velocitycareerlabs.impl.data.infrastructure.executors.ExecutorImpl +import io.velocitycareerlabs.impl.data.repositories.ServiceTypesRepositoryImpl +import io.velocitycareerlabs.impl.data.usecases.ServiceTypesUseCaseImpl +import io.velocitycareerlabs.impl.domain.usecases.ServiceTypesUseCase +import io.velocitycareerlabs.infrastructure.network.NetworkServiceSuccess +import io.velocitycareerlabs.infrastructure.resources.EmptyCacheService +import io.velocitycareerlabs.infrastructure.resources.EmptyExecutor +import io.velocitycareerlabs.infrastructure.resources.valid.ServiceTypesMocks +import org.junit.Before +import org.junit.Test + +internal class ServiceTypesUseCaseTest { + + internal lateinit var subject: ServiceTypesUseCase + + private val CredentialgroupAllowedValues = mutableListOf("Career", "IdDocument", "Contact", "") + + @Before + fun setUp() { + subject = ServiceTypesUseCaseImpl( + ServiceTypesRepositoryImpl( + NetworkServiceSuccess(ServiceTypesMocks.ServiceTypesJsonStr), + EmptyCacheService() + ), + EmptyExecutor() + ) + } + + @Test + fun testGetServiceTypes() { + subject.getServiceTypes(cacheSequence = 1) { + it.handleResult( + successHandler = { serviceTypes -> + assert(serviceTypes.all.size == 10) + serviceTypes.all.forEach { serviceType -> + assert(CredentialgroupAllowedValues.contains(serviceType.credentialGroup)) + } + }, + errorHandler = { error -> + assert(false) { error } + }) + } + } +} \ No newline at end of file From 757b1907291adcae68086a9f8f0f0973d54c881d Mon Sep 17 00:00:00 2001 From: Michael Avoyan Date: Fri, 24 Nov 2023 12:28:56 +0200 Subject: [PATCH 2/2] update nexus secrets --- publish-core.gradle | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/publish-core.gradle b/publish-core.gradle index f2a295bc..48de19a5 100644 --- a/publish-core.gradle +++ b/publish-core.gradle @@ -1,15 +1,15 @@ Properties properties = new Properties() properties.load(new FileInputStream(rootProject.file( - '/Volumes/Keybase/team/velocitycareers/mobile/android/maven/sonatype.properties' + '/Volumes/Keybase/team/velocitycareers/mobile/android/maven/nexus.properties' ))) ext { - signingKeyId = System.getenv("SIGNING_KEY_ID") ?: properties["signingKeyId"] - signingPassword = System.getenv("SIGNING_PASSWORD") ?: properties["signingPassword"] - ossrhUsername = System.getenv("OSSRH_USERNAME") ?: properties["ossrhUsername"] - ossrhPassword = System.getenv("OSSRH_PASSWORD") ?: properties["ossrhPassword"] - sonatypeStagingProfileId = System.getenv("SONATYPE_STAGING_PROFILE_ID") ?: properties["sonatypeStagingProfileId"] - signingPrivateKey = System.getenv("SIGNING_KEY") ?: properties["signingPrivateKey"] + signingKeyId = System.getenv("ANDROID_NEXUS_SIGNING_KEY_ID") ?: properties["signingKeyId"] + signingPassword = System.getenv("ANDROID_NEXUS_SIGNING_PWD") ?: properties["signingPassword"] + ossrhUsername = System.getenv("ANDROID_NEXUS_OSSRH_USERNAME") ?: properties["ossrhUsername"] + ossrhPassword = System.getenv("ANDROID_NEXUS_OSSRH_PWD") ?: properties["ossrhPassword"] + sonatypeStagingProfileId = System.getenv("ANDROID_NEXUS_STAGING_PROFILE_ID") ?: properties["stagingProfileId"] + signingPrivateKey = System.getenv("ANDROID_NEXUS_PRIVATE_KEY") ?: properties["signingPrivateKey"] } //println("signingKeyId: ${signingKeyId}")