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