package it.niedermann.nextcloud.deck.remote.api;
import com.nextcloud.android.sso.api.EmptyResponse;
import com.nextcloud.android.sso.api.ParsedResponse;
import java.util.List;
import io.reactivex.Observable;
import it.niedermann.nextcloud.deck.model.AccessControl;
import it.niedermann.nextcloud.deck.model.Attachment;
import it.niedermann.nextcloud.deck.model.Board;
import it.niedermann.nextcloud.deck.model.Card;
import it.niedermann.nextcloud.deck.model.Label;
import it.niedermann.nextcloud.deck.model.Stack;
import it.niedermann.nextcloud.deck.model.enums.EAttachmentType;
import it.niedermann.nextcloud.deck.model.full.FullBoard;
import it.niedermann.nextcloud.deck.model.full.FullCard;
import it.niedermann.nextcloud.deck.model.full.FullStack;
import it.niedermann.nextcloud.deck.model.propagation.CardUpdate;
import it.niedermann.nextcloud.deck.model.propagation.Reorder;
import okhttp3.MultipartBody;
import okhttp3.ResponseBody;
import retrofit2.http.Body;
import retrofit2.http.DELETE;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.GET;
import retrofit2.http.Header;
import retrofit2.http.Multipart;
import retrofit2.http.POST;
import retrofit2.http.PUT;
import retrofit2.http.Part;
import retrofit2.http.Path;
import retrofit2.http.Query;
/**
* @link Deck REST API
*/
public interface DeckAPI {
String MODIFIED_SINCE_HEADER = "If-Modified-Since";
String IF_NONE_MATCH = "If-None-Match";
// Boards
@POST("v1.0/boards")
Observable createBoard(@Body Board board);
@GET("v1.0/boards/{id}")
Observable getBoard(@Path("id") long id, @Header(MODIFIED_SINCE_HEADER) String lastSync);
@PUT("v1.0/boards/{id}")
Observable updateBoard(@Path("id") long id, @Body Board board);
@DELETE("v1.0/boards/{id}")
Observable deleteBoard(@Path("id") long id);
@DELETE("v1.0/boards/{id}/undo_delete")
Observable restoreBoard(@Path("id") long id);
@GET("v1.0/boards")
Observable>> getBoards(@Query("details") boolean verbose, @Header(MODIFIED_SINCE_HEADER) String lastSync, @Header(IF_NONE_MATCH) String eTag);
@GET("v1.0/boards")
Observable>> getBoards(@Query("details") boolean verbose, @Header(MODIFIED_SINCE_HEADER) String lastSync);
// Stacks
@POST("v1.0/boards/{boardId}/stacks")
Observable createStack(@Path("boardId") long boardId, @Body Stack stack);
@PUT("v1.0/boards/{boardId}/stacks/{stackId}")
Observable updateStack(@Path("boardId") long boardId, @Path("stackId") long id, @Body Stack stack);
@DELETE("v1.0/boards/{boardId}/stacks/{stackId}")
Observable deleteStack(@Path("boardId") long boardId, @Path("stackId") long id);
@GET("v1.0/boards/{boardId}/stacks/{stackId}")
Observable getStack(@Path("boardId") long boardId, @Path("stackId") long id, @Header(MODIFIED_SINCE_HEADER) String lastSync);
@GET("v1.0/boards/{boardId}/stacks")
Observable> getStacks(@Path("boardId") long boardId, @Header(MODIFIED_SINCE_HEADER) String lastSync);
@GET("v1.0/boards/{boardId}/stacks/archived")
Observable> getArchivedStacks(@Path("boardId") long boardId, @Header(MODIFIED_SINCE_HEADER) String lastSync);
// Cards
@POST("v1.0/boards/{boardId}/stacks/{stackId}/cards")
Observable createCard(@Path("boardId") long boardId, @Path("stackId") long stackId, @Body Card card);
@PUT("v1.0/boards/{boardId}/stacks/{stackId}/cards/{cardId}")
Observable updateCard(@Path("boardId") long boardId, @Path("stackId") long stackId, @Path("cardId") long cardId, @Body CardUpdate card);
@FormUrlEncoded
@PUT("v1.0/boards/{boardId}/stacks/{stackId}/cards/{cardId}/assignLabel")
Observable assignLabelToCard(@Path("boardId") long boardId, @Path("stackId") long stackId, @Path("cardId") long cardId, @Field("labelId") long labelId);
@FormUrlEncoded
@PUT("v1.0/boards/{boardId}/stacks/{stackId}/cards/{cardId}/removeLabel")
Observable unassignLabelFromCard(@Path("boardId") long boardId, @Path("stackId") long stackId, @Path("cardId") long cardId, @Field("labelId") long labelId);
@FormUrlEncoded
@PUT("v1.0/boards/{boardId}/stacks/{stackId}/cards/{cardId}/assignUser")
Observable assignUserToCard(@Path("boardId") long boardId, @Path("stackId") long stackId, @Path("cardId") long cardId, @Field("userId") String userUID);
@FormUrlEncoded
@PUT("v1.0/boards/{boardId}/stacks/{stackId}/cards/{cardId}/unassignUser")
Observable unassignUserFromCard(@Path("boardId") long boardId, @Path("stackId") long stackId, @Path("cardId") long cardId, @Field("userId") String userUID);
@PUT("v1.0/boards/{boardId}/stacks/{stackId}/cards/{cardId}/reorder")
Observable> moveCard(@Path("boardId") long boardId, @Path("stackId") long stackId, @Path("cardId") long cardId, @Body Reorder reorder);
@DELETE("v1.0/boards/{boardId}/stacks/{stackId}/cards/{cardId}")
Observable deleteCard(@Path("boardId") long boardId, @Path("stackId") long stackId, @Path("cardId") long cardId);
/**
* @see This endpoint does only return {@link Attachment}s of type {@link EAttachmentType.DECK_FILE}
*/
@SuppressWarnings("JavadocReference")
@GET("v1.0/boards/{boardId}/stacks/{stackId}/cards/{cardId}")
Observable getCard_1_0(@Path("boardId") long boardId, @Path("stackId") long stackId, @Path("cardId") long cardId, @Header(MODIFIED_SINCE_HEADER) String lastSync);
@GET("v1.1/boards/{boardId}/stacks/{stackId}/cards/{cardId}")
Observable getCard_1_1(@Path("boardId") long boardId, @Path("stackId") long stackId, @Path("cardId") long cardId, @Header(MODIFIED_SINCE_HEADER) String lastSync);
// Labels
@GET("v1.0/boards/{boardId}/labels/{labelId}")
Observable