mirror of
https://github.com/pawelorzech/Swoosh.git
synced 2026-03-31 20:15:41 +00:00
feat: add TagRepository for tag CRUD operations
Follows PostRepository pattern: constructor takes Context, creates AccountManager, uses ApiClient.getService, wraps calls in withContext(Dispatchers.IO), returns Result<T>.
This commit is contained in:
parent
d0019947f8
commit
2dbb4ad005
1 changed files with 86 additions and 0 deletions
|
|
@ -0,0 +1,86 @@
|
||||||
|
package com.swoosh.microblog.data.repository
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import com.swoosh.microblog.data.AccountManager
|
||||||
|
import com.swoosh.microblog.data.api.ApiClient
|
||||||
|
import com.swoosh.microblog.data.api.GhostApiService
|
||||||
|
import com.swoosh.microblog.data.model.GhostTagFull
|
||||||
|
import com.swoosh.microblog.data.model.TagWrapper
|
||||||
|
import kotlinx.coroutines.Dispatchers
|
||||||
|
import kotlinx.coroutines.withContext
|
||||||
|
|
||||||
|
class TagRepository(private val context: Context) {
|
||||||
|
|
||||||
|
private val accountManager = AccountManager(context)
|
||||||
|
|
||||||
|
private fun getApi(): GhostApiService {
|
||||||
|
val account = accountManager.getActiveAccount()
|
||||||
|
?: throw IllegalStateException("No active account configured")
|
||||||
|
return ApiClient.getService(account.blogUrl) { account.apiKey }
|
||||||
|
}
|
||||||
|
|
||||||
|
suspend fun fetchTags(): Result<List<GhostTagFull>> =
|
||||||
|
withContext(Dispatchers.IO) {
|
||||||
|
try {
|
||||||
|
val response = getApi().getTags()
|
||||||
|
if (response.isSuccessful) {
|
||||||
|
Result.success(response.body()!!.tags)
|
||||||
|
} else {
|
||||||
|
Result.failure(Exception("API error ${response.code()}: ${response.errorBody()?.string()}"))
|
||||||
|
}
|
||||||
|
} catch (e: Exception) {
|
||||||
|
Result.failure(e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
suspend fun createTag(
|
||||||
|
name: String,
|
||||||
|
description: String? = null,
|
||||||
|
accentColor: String? = null
|
||||||
|
): Result<GhostTagFull> =
|
||||||
|
withContext(Dispatchers.IO) {
|
||||||
|
try {
|
||||||
|
val tag = GhostTagFull(
|
||||||
|
name = name,
|
||||||
|
description = description,
|
||||||
|
accent_color = accentColor
|
||||||
|
)
|
||||||
|
val response = getApi().createTag(TagWrapper(listOf(tag)))
|
||||||
|
if (response.isSuccessful) {
|
||||||
|
Result.success(response.body()!!.tags.first())
|
||||||
|
} else {
|
||||||
|
Result.failure(Exception("Create tag failed ${response.code()}: ${response.errorBody()?.string()}"))
|
||||||
|
}
|
||||||
|
} catch (e: Exception) {
|
||||||
|
Result.failure(e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
suspend fun updateTag(id: String, tag: GhostTagFull): Result<GhostTagFull> =
|
||||||
|
withContext(Dispatchers.IO) {
|
||||||
|
try {
|
||||||
|
val response = getApi().updateTag(id, TagWrapper(listOf(tag)))
|
||||||
|
if (response.isSuccessful) {
|
||||||
|
Result.success(response.body()!!.tags.first())
|
||||||
|
} else {
|
||||||
|
Result.failure(Exception("Update tag failed ${response.code()}: ${response.errorBody()?.string()}"))
|
||||||
|
}
|
||||||
|
} catch (e: Exception) {
|
||||||
|
Result.failure(e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
suspend fun deleteTag(id: String): Result<Unit> =
|
||||||
|
withContext(Dispatchers.IO) {
|
||||||
|
try {
|
||||||
|
val response = getApi().deleteTag(id)
|
||||||
|
if (response.isSuccessful) {
|
||||||
|
Result.success(Unit)
|
||||||
|
} else {
|
||||||
|
Result.failure(Exception("Delete tag failed ${response.code()}"))
|
||||||
|
}
|
||||||
|
} catch (e: Exception) {
|
||||||
|
Result.failure(e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in a new issue