From 9799bca5e3b52e65c3d1f8ef1472a07394a3c4e5 Mon Sep 17 00:00:00 2001 From: Ivan Fontosh Date: Wed, 1 Jul 2026 16:44:18 +0800 Subject: [PATCH] Revoke a single license by product key (v1.0.2). Send license.key to the admin revoke API and track revoking state per key. Co-authored-by: Cursor --- app/build.gradle.kts | 4 ++-- .../ru/mailib/ttrpg/licensemanager/data/Models.kt | 2 +- .../mailib/ttrpg/licensemanager/data/Repositories.kt | 4 ++-- .../ttrpg/licensemanager/ui/LicenseViewModel.kt | 12 ++++++------ .../licensemanager/ui/screens/LicenseListScreen.kt | 4 ++-- 5 files changed, 13 insertions(+), 13 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 07acf15..1572950 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -12,8 +12,8 @@ android { applicationId = "ru.mailib.ttrpg.licensemanager" minSdk = 26 targetSdk = 35 - versionCode = 2 - versionName = "1.0.1" + versionCode = 3 + versionName = "1.0.2" } buildTypes { diff --git a/app/src/main/java/ru/mailib/ttrpg/licensemanager/data/Models.kt b/app/src/main/java/ru/mailib/ttrpg/licensemanager/data/Models.kt index 0cc1637..392b6c1 100644 --- a/app/src/main/java/ru/mailib/ttrpg/licensemanager/data/Models.kt +++ b/app/src/main/java/ru/mailib/ttrpg/licensemanager/data/Models.kt @@ -32,7 +32,7 @@ data class ProductKeyResponse( ) data class RevokeLicenseRequest( - val sub: String, + val key: String, ) data class RevokeLicenseResponse( diff --git a/app/src/main/java/ru/mailib/ttrpg/licensemanager/data/Repositories.kt b/app/src/main/java/ru/mailib/ttrpg/licensemanager/data/Repositories.kt index be1fd1d..479a7ca 100644 --- a/app/src/main/java/ru/mailib/ttrpg/licensemanager/data/Repositories.kt +++ b/app/src/main/java/ru/mailib/ttrpg/licensemanager/data/Repositories.kt @@ -59,8 +59,8 @@ class LicenseRepository( createApi(settings).createProductKey(request) } - suspend fun revokeLicense(settings: AppSettings, sub: String): Result = runCatching { - createApi(settings).revokeLicense(RevokeLicenseRequest(sub)) + suspend fun revokeLicense(settings: AppSettings, key: String): Result = runCatching { + createApi(settings).revokeLicense(RevokeLicenseRequest(key)) } private fun createApi(settings: AppSettings): LicenseApi { diff --git a/app/src/main/java/ru/mailib/ttrpg/licensemanager/ui/LicenseViewModel.kt b/app/src/main/java/ru/mailib/ttrpg/licensemanager/ui/LicenseViewModel.kt index e2dd758..f40c551 100644 --- a/app/src/main/java/ru/mailib/ttrpg/licensemanager/ui/LicenseViewModel.kt +++ b/app/src/main/java/ru/mailib/ttrpg/licensemanager/ui/LicenseViewModel.kt @@ -22,7 +22,7 @@ import java.time.ZoneOffset data class LicenseListUiState( val licenses: List = emptyList(), val isLoading: Boolean = false, - val revokingSub: String? = null, + val revokingKey: String? = null, val error: String? = null, ) @@ -76,18 +76,18 @@ class LicenseViewModel(application: Application) : AndroidViewModel(application) } } - fun revokeLicense(sub: String) { + fun revokeLicense(key: String) { viewModelScope.launch { - _listState.update { it.copy(revokingSub = sub, error = null) } - licenseRepository.revokeLicense(currentSettings(), sub) + _listState.update { it.copy(revokingKey = key, error = null) } + licenseRepository.revokeLicense(currentSettings(), key) .onSuccess { loadLicenses() - _listState.update { it.copy(revokingSub = null) } + _listState.update { it.copy(revokingKey = null) } } .onFailure { e -> _listState.update { it.copy( - revokingSub = null, + revokingKey = null, error = e.message ?: "Не удалось отозвать лицензию", ) } diff --git a/app/src/main/java/ru/mailib/ttrpg/licensemanager/ui/screens/LicenseListScreen.kt b/app/src/main/java/ru/mailib/ttrpg/licensemanager/ui/screens/LicenseListScreen.kt index abcebbb..f273fd4 100644 --- a/app/src/main/java/ru/mailib/ttrpg/licensemanager/ui/screens/LicenseListScreen.kt +++ b/app/src/main/java/ru/mailib/ttrpg/licensemanager/ui/screens/LicenseListScreen.kt @@ -63,7 +63,7 @@ fun LicenseListScreen(viewModel: LicenseViewModel) { confirmButton = { TextButton( onClick = { - viewModel.revokeLicense(license.sub) + viewModel.revokeLicense(license.key) confirmRevoke = null }, ) { @@ -116,7 +116,7 @@ fun LicenseListScreen(viewModel: LicenseViewModel) { items(state.licenses, key = { it.key }) { license -> LicenseCard( license = license, - isRevoking = state.revokingSub == license.sub, + isRevoking = state.revokingKey == license.key, onRevoke = { confirmRevoke = license }, ) }