diff --git a/app/src/main/java/com/swoosh/microblog/data/api/GhostApiService.kt b/app/src/main/java/com/swoosh/microblog/data/api/GhostApiService.kt index 952ed4d..628dd13 100644 --- a/app/src/main/java/com/swoosh/microblog/data/api/GhostApiService.kt +++ b/app/src/main/java/com/swoosh/microblog/data/api/GhostApiService.kt @@ -1,5 +1,6 @@ package com.swoosh.microblog.data.api +import com.swoosh.microblog.data.model.FileUploadResponse import com.swoosh.microblog.data.model.GhostSite import com.swoosh.microblog.data.model.MembersResponse import com.swoosh.microblog.data.model.PageWrapper @@ -114,6 +115,13 @@ interface GhostApiService { @Part file: MultipartBody.Part, @Part("purpose") purpose: RequestBody ): Response + + @Multipart + @POST("ghost/api/admin/files/upload/") + suspend fun uploadFile( + @Part file: MultipartBody.Part, + @Part("ref") ref: RequestBody? = null + ): Response } data class ImageUploadResponse( diff --git a/app/src/main/java/com/swoosh/microblog/data/model/FileModels.kt b/app/src/main/java/com/swoosh/microblog/data/model/FileModels.kt new file mode 100644 index 0000000..2cdcec0 --- /dev/null +++ b/app/src/main/java/com/swoosh/microblog/data/model/FileModels.kt @@ -0,0 +1,10 @@ +package com.swoosh.microblog.data.model + +data class FileUploadResponse( + val files: List +) + +data class UploadedFile( + val url: String, + val ref: String? +) diff --git a/app/src/main/java/com/swoosh/microblog/data/repository/PostRepository.kt b/app/src/main/java/com/swoosh/microblog/data/repository/PostRepository.kt index ec0a46e..00571fa 100644 --- a/app/src/main/java/com/swoosh/microblog/data/repository/PostRepository.kt +++ b/app/src/main/java/com/swoosh/microblog/data/repository/PostRepository.kt @@ -133,6 +133,28 @@ class PostRepository(private val context: Context) { } } + suspend fun uploadFile(uri: Uri): Result = + withContext(Dispatchers.IO) { + try { + val file = copyUriToTempFile(uri) + val mimeType = context.contentResolver.getType(uri) ?: "application/octet-stream" + val requestBody = file.asRequestBody(mimeType.toMediaType()) + val part = MultipartBody.Part.createFormData("file", file.name, requestBody) + + val response = getApi().uploadFile(part) + file.delete() + + if (response.isSuccessful) { + val url = response.body()!!.files.first().url + Result.success(url) + } else { + Result.failure(Exception("File upload failed ${response.code()}")) + } + } catch (e: Exception) { + Result.failure(e) + } + } + /** * Uploads multiple images and returns all uploaded URLs. * If any upload fails, returns failure with the error.