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()
This commit is contained in:
Paweł Orzech 2026-03-20 00:43:10 +01:00
parent 807c6d559e
commit 2f9b7dac09
3 changed files with 40 additions and 0 deletions

View file

@ -1,5 +1,6 @@
package com.swoosh.microblog.data.api 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.GhostSite
import com.swoosh.microblog.data.model.MembersResponse import com.swoosh.microblog.data.model.MembersResponse
import com.swoosh.microblog.data.model.PageWrapper import com.swoosh.microblog.data.model.PageWrapper
@ -114,6 +115,13 @@ interface GhostApiService {
@Part file: MultipartBody.Part, @Part file: MultipartBody.Part,
@Part("purpose") purpose: RequestBody @Part("purpose") purpose: RequestBody
): Response<ImageUploadResponse> ): Response<ImageUploadResponse>
@Multipart
@POST("ghost/api/admin/files/upload/")
suspend fun uploadFile(
@Part file: MultipartBody.Part,
@Part("ref") ref: RequestBody? = null
): Response<FileUploadResponse>
} }
data class ImageUploadResponse( data class ImageUploadResponse(

View file

@ -0,0 +1,10 @@
package com.swoosh.microblog.data.model
data class FileUploadResponse(
val files: List<UploadedFile>
)
data class UploadedFile(
val url: String,
val ref: String?
)

View file

@ -133,6 +133,28 @@ class PostRepository(private val context: Context) {
} }
} }
suspend fun uploadFile(uri: Uri): Result<String> =
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. * Uploads multiple images and returns all uploaded URLs.
* If any upload fails, returns failure with the error. * If any upload fails, returns failure with the error.