From 2f9b7dac09e07492c2b189102cbf8d9e425e6ef7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Orzech?= Date: Fri, 20 Mar 2026 00:43:10 +0100 Subject: [PATCH] feat: add file upload API endpoint, model, and repository method - Create FileModels.kt with FileUploadResponse and UploadedFile data classes - Add uploadFile() multipart endpoint to GhostApiService - Add uploadFile(uri) method to PostRepository following the same pattern as uploadImage() --- .../microblog/data/api/GhostApiService.kt | 8 +++++++ .../swoosh/microblog/data/model/FileModels.kt | 10 +++++++++ .../data/repository/PostRepository.kt | 22 +++++++++++++++++++ 3 files changed, 40 insertions(+) create mode 100644 app/src/main/java/com/swoosh/microblog/data/model/FileModels.kt 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.