'How to implement delete without returning unit/void using retrofit?

I've got the root of the problem of this implmenetation: How to delete with Body using retrofit with usecase?

In brief:

  1. With this usecase method like underneath I return Unit.
  2. My logs didn't show it directly, but in debugger I have seen that the problem is because of
Service methods cannot return void.
    for method NotificationApi.deleteToken

        if (e.isSameExceptionAs(fromDownstream) || e.isCancellationCause(coroutineContext)) {

  1. How to change this method deleteToken to work with delete and not return void/unit?
  2. How to provide it with usecase properly?

Thanks.

This is my UseCase

class DeleteTokenSecondUseCase @Inject constructor(private val api: NotificationApi) :
    BaseApiRequestUseCase<DeleteTokenSecondUseCase.Params, Unit>() {
    override fun create(params: Params): Flow<Unit> = flow {
        api.deleteToken(NotificationApi.TokenChangedBody(params.token))

    }

    data class Params(val token: String)
}

this is my delete

    @HTTP(method = "DELETE", path = "account/firebase", hasBody = true)
    fun deleteToken(@Body body: TokenChangedBody)

    data class TokenChangedBody(val token: String)

fun method in vm

    fun notifyNotificationTokenChanged(token: String) {

        val params = DeleteTokenSecondUseCase.Params(token)
        deleteTokenSecondUseCase.buildWithState(params)
            .withSuccess { Log.d("build", "WORKS $params") }
            .withError {  Log.d("build", "NOT WORKS $params")  }
            .launchIn(viewModelScope)
    }

EDIT: I have implmeneted it with Call event but still it goes onFailure, guys why?

    @HTTP(method = "DELETE", path = "account/firebase", hasBody = true)
    fun deleteToken(@Body body: TokenChangedBody) : Call<ResponseBody>
    fun notifyNotificationTokenChanged(token: String) {

        val params = NotificationApi.TokenChangedBody(token)
        val deleteRequest: Call<ResponseBody> = notificationApi.deleteToken(params)
        deleteRequest.enqueue(object : Callback<ResponseBody?> {
            override fun onResponse(call: Call<ResponseBody?>?, response: Response<ResponseBody?>?) {
                Log.d("apitoken", "WORKS")
            }

            override fun onFailure(call: Call<ResponseBody?>?, t: Throwable?) {
                Log.d("apitoken", "DOESNT WORK")
            }
        })
}

EDIT2: WORKS!

SOLUTION

    fun notifyNotificationTokenChanged(token: String) {

        val params = NotificationApi.TokenChangedBody(token)
        val deleteRequest: Call<Void> = notificationApi.deleteToken(params)
        deleteRequest.enqueue(object : Callback<Void?> {
            override fun onResponse(call: Call<Void?>?, response: Response<Void?>?) {
            }
            override fun onFailure(call: Call<Void?>?, t: Throwable?) {
            }
        })
    }
    @HTTP(method = "DELETE", path = "account/firebase", hasBody = true)
    fun deleteToken(@Body body: TokenChangedBody) : Call<Void>

Someone told in Kotlin use :Completable, but haven't test it. stackoverflow.com/questions/35429481/retrofit-2-void-return



Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source