WIP eliminar imagenes

This commit is contained in:
erik-everardo 2023-12-24 01:43:05 -06:00
parent 6e92dbb3c4
commit e9304a7a4e
5 changed files with 46 additions and 26 deletions

View File

@ -1,6 +0,0 @@
package com.isolaatti.images.common.data.remote
data class DeleteImagesResultDto(
val success: Boolean,
val unSuccessIds: List<String>
)

View File

@ -21,15 +21,12 @@ interface ImagesApi {
@POST("images/create") @POST("images/create")
@Multipart @Multipart
fun postImage(@Part file: MultipartBody.Part, fun postImage(@Part file: MultipartBody.Part,
@Part("name") name: String, @Part name: MultipartBody.Part,
@Part("setAsProfile") setAsProfile: Boolean? = null, @Part setAsProfile: MultipartBody.Part? = null,
@Part("squadId") squadId: String? = null): Call<ImageDto> @Part squadId: MultipartBody.Part? = null): Call<ImageDto>
@DELETE("images/{imageId}") @POST("images/delete_many")
fun deleteImage(@Path("imageId") imageId: String): Call<Any> fun deleteImages(@Body deleteImagesDto: DeleteImagesDto): Call<Void>
@DELETE("images/delete_many")
fun deleteImages(@Body deleteImagesDto: DeleteImagesDto): Call<DeleteImagesResultDto>
@GET("images/of_squad/{squadId}") @GET("images/of_squad/{squadId}")
fun getImagesOfSquad(@Path("squadId") squadId: String, fun getImagesOfSquad(@Path("squadId") squadId: String,

View File

@ -3,12 +3,10 @@ package com.isolaatti.images.common.data.repository
import android.content.ContentResolver import android.content.ContentResolver
import android.graphics.Bitmap import android.graphics.Bitmap
import android.graphics.BitmapFactory import android.graphics.BitmapFactory
import android.graphics.Picture
import android.net.Uri import android.net.Uri
import android.os.Build import android.os.Build
import android.os.MemoryFile
import android.os.SharedMemory
import android.util.Log import android.util.Log
import com.isolaatti.images.common.data.remote.DeleteImagesDto
import com.isolaatti.images.common.data.remote.ImagesApi import com.isolaatti.images.common.data.remote.ImagesApi
import com.isolaatti.images.common.domain.entity.Image import com.isolaatti.images.common.domain.entity.Image
import com.isolaatti.images.common.domain.repository.ImagesRepository import com.isolaatti.images.common.domain.repository.ImagesRepository
@ -16,18 +14,18 @@ import com.isolaatti.utils.Resource
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.flow
import okhttp3.MultipartBody import okhttp3.MultipartBody
import okhttp3.RequestBody
import okhttp3.RequestBody.Companion.toRequestBody import okhttp3.RequestBody.Companion.toRequestBody
import retrofit2.awaitResponse import retrofit2.awaitResponse
import java.io.ByteArrayOutputStream import java.io.ByteArrayOutputStream
import java.io.File
import java.io.InputStream import java.io.InputStream
import java.io.OutputStream
import java.io.OutputStreamWriter
import javax.inject.Inject import javax.inject.Inject
class ImagesRepositoryImpl @Inject constructor(private val imagesApi: ImagesApi, private val contentResolver: ContentResolver) : class ImagesRepositoryImpl @Inject constructor(private val imagesApi: ImagesApi, private val contentResolver: ContentResolver) :
ImagesRepository { ImagesRepository {
companion object {
const val TAG = "ImagesRepositoryImpl"
}
override fun getImagesOfUser(userId: Int, lastId: String?): Flow<Resource<List<Image>>> = flow { override fun getImagesOfUser(userId: Int, lastId: String?): Flow<Resource<List<Image>>> = flow {
emit(Resource.Loading()) emit(Resource.Loading())
try { try {
@ -47,7 +45,19 @@ class ImagesRepositoryImpl @Inject constructor(private val imagesApi: ImagesApi,
} }
override fun deleteImages(images: List<Image>): Flow<Resource<Boolean>> = flow { override fun deleteImages(images: List<Image>): Flow<Resource<Boolean>> = flow {
emit(Resource.Loading())
val dto = DeleteImagesDto(images.map { it.imageUrl })
try {
val response = imagesApi.deleteImages(dto).awaitResponse()
if(response.isSuccessful) {
emit(Resource.Success(true))
} else {
emit(Resource.Error(Resource.Error.mapErrorCode(response.code())))
}
} catch (e: Exception) {
Log.e(TAG, e.message.toString())
emit(Resource.Error(Resource.Error.ErrorType.NetworkError))
}
} }
override fun uploadImage(name: String, imageUri: Uri, squadId: String?): Flow<Resource<Image>> = flow { override fun uploadImage(name: String, imageUri: Uri, squadId: String?): Flow<Resource<Image>> = flow {
@ -71,7 +81,10 @@ class ImagesRepositoryImpl @Inject constructor(private val imagesApi: ImagesApi,
} }
val response = imagesApi.postImage(MultipartBody.Part.createFormData("file", name,outputStream.toByteArray().toRequestBody()), name).awaitResponse() val response = imagesApi.postImage(
MultipartBody.Part.createFormData("file", name,outputStream.toByteArray().toRequestBody()),
MultipartBody.Part.createFormData("name", name)
).awaitResponse()
if(response.isSuccessful) { if(response.isSuccessful) {
val imageDto = response.body() val imageDto = response.body()
if(imageDto == null) { if(imageDto == null) {

View File

@ -33,6 +33,10 @@ class ImageListViewModel @Inject constructor(private val imagesRepository: Image
return list.lastOrNull()?.id return list.lastOrNull()?.id
} }
fun addImageAtTheBeginning(image: Image) {
liveList.value = listOf(image) + list
}
fun loadNext() { fun loadNext() {
viewModelScope.launch { viewModelScope.launch {
@ -67,6 +71,16 @@ class ImageListViewModel @Inject constructor(private val imagesRepository: Image
} }
fun removeImages(images: List<Image>) { fun removeImages(images: List<Image>) {
viewModelScope.launch {
imagesRepository.deleteImages(images).onEach {
when(it) {
is Resource.Error -> {}
is Resource.Loading -> {}
is Resource.Success -> {
liveList.value = list.filterNot { image -> images.contains(image) }
}
}
}.flowOn(Dispatchers.IO).launchIn(this)
}
} }
} }

View File

@ -49,8 +49,10 @@ class ImagesFragment : Fragment() {
PictureViewerActivity.startActivityWithImages(requireContext(), images.toTypedArray(), position) PictureViewerActivity.startActivityWithImages(requireContext(), images.toTypedArray(), position)
} }
private val imageMakerLauncher = registerForActivityResult(ImageMakerContract()) { private val imageMakerLauncher = registerForActivityResult(ImageMakerContract()) { image ->
Toast.makeText(requireContext(), "se subio la imagen ${it?.id}", Toast.LENGTH_SHORT).show() image?.also {
viewModel.addImageAtTheBeginning(it)
}
} }
private val choosePictureLauncher = registerForActivityResult(ActivityResultContracts.PickVisualMedia()) { private val choosePictureLauncher = registerForActivityResult(ActivityResultContracts.PickVisualMedia()) {