package it.niedermann.nextcloud.deck.api; import android.util.Log; import com.google.gson.reflect.TypeToken; import com.nextcloud.android.sso.aidl.NextcloudRequest; import com.nextcloud.android.sso.api.NextcloudAPI; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import io.reactivex.Observable; 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; public class DeckAPI_SSO implements DeckAPI { private static final String GET = "GET"; private static final String POST = "POST"; private static final String PUT = "PUT"; private static final String DELETE = "DELETE"; private static final String API_ENDPOINT = "/index.php/apps/deck/api/v1.0/"; private NextcloudAPI nextcloudAPI; private DateFormat API_FORMAT = new SimpleDateFormat("E, d MMM yyyy hh:mm:ss z"); public DeckAPI_SSO(NextcloudAPI nextcloudAPI) { this.nextcloudAPI = nextcloudAPI; } private NextcloudRequest.Builder buildRequest(String method, String path, Date lastSync) { NextcloudRequest.Builder builder = new NextcloudRequest.Builder() .setMethod(method) .setUrl(API_ENDPOINT + path) .setFollowRedirects(true); if (lastSync!=null) { String lastSyncHeader = API_FORMAT.format(lastSync); // omit Offset of timezone (e.g.: +01:00) if (lastSyncHeader.matches("^.*\\+[0-9]{2}:[0-9]{2}$")) { lastSyncHeader = lastSyncHeader.substring(0, lastSyncHeader.length()-6); } Log.d("deck lastSync", lastSyncHeader); Map> header = new HashMap<>(); //concurrency, new one is needed! List hdr = new ArrayList<>(); hdr.add(lastSyncHeader); header.put("If-Modified-Since", hdr); builder.setHeader(header); } return builder; } private String buildEndpointPath(String path, Object... params) { String[] pathFragments = path.split("\\{[a-zA-Z0-9]*\\}"); StringBuffer sb = new StringBuffer(); int i = 0; for (; i i ? params[i] : ""); } return sb.toString(); } private NextcloudRequest.Builder buildRequest(String method, String path, Date lastSync, Object... params) { return buildRequest(method, buildEndpointPath(path, params), lastSync); } private NextcloudRequest.Builder buildRequest(String method, String path, Object... params) { return buildRequest(method, path, null, params); } @Override public Observable> getBoards(Date lastSync) { NextcloudRequest request = buildRequest(GET, "boards", lastSync).build(); return nextcloudAPI.performRequestObservable(TypeToken.getParameterized(List.class, Board.class).getType(), request); } @Override public Observable createStack(long boardId, Stack stack) { NextcloudRequest request = buildRequest(POST, "boards/{boardId}/stacks", boardId) .setRequestBody(GsonConfig.GetGson().toJson(stack)).build(); return nextcloudAPI.performRequestObservable(Stack.class, request); } @Override public Observable updateStack(long boardId, long id, Stack stack) { NextcloudRequest request = buildRequest(PUT, "boards/{boardId}/stacks/{stackId}", boardId, id) .setRequestBody(GsonConfig.GetGson().toJson(stack)).build(); return nextcloudAPI.performRequestObservable(Stack.class, request); } @Override public Observable deleteStack(long boardId, long id) { NextcloudRequest request = buildRequest(DELETE, "boards/{boardId}/stacks/{stackId}", boardId, id).build(); return nextcloudAPI.performRequestObservable(Stack.class, request); } @Override public Observable getStack(long boardId, long id, Date lastSync) { NextcloudRequest request = buildRequest(GET, "boards/{boardId}/stacks/{stackId}", lastSync, boardId, id).build(); return nextcloudAPI.performRequestObservable(Stack.class, request); } @Override public Observable> getStacks(long boardId, Date lastSync) { NextcloudRequest request = buildRequest(GET, "boards/{boardId}/stacks", lastSync, boardId).build(); return nextcloudAPI.performRequestObservable(TypeToken.getParameterized(List.class, Stack.class).getType(), request); } @Override public Observable> getArchivedStacks(long boardId, Date lastSync) { NextcloudRequest request = buildRequest(GET, "boards/{boardId}/stacks/archived", lastSync, boardId).build(); return nextcloudAPI.performRequestObservable(TypeToken.getParameterized(List.class, Stack.class).getType(), request); } @Override public Observable createCard(long boardId, long stackId, Card card) { NextcloudRequest request = buildRequest(POST, "boards/{boardId}/stacks/{stackId}/cards", boardId, stackId) .setRequestBody(GsonConfig.GetGson().toJson(card)).build(); return nextcloudAPI.performRequestObservable(Card.class, request); } @Override public Observable updateCard(long boardId, long stackId, long cardId, Card card) { NextcloudRequest request = buildRequest(PUT, "boards/{boardId}/stacks/{stackId}/cards/{cardId}", boardId, stackId, cardId) .setRequestBody(GsonConfig.GetGson().toJson(card)).build(); return nextcloudAPI.performRequestObservable(Card.class, request); } @Override public Observable deleteCard(long boardId, long stackId, long cardId) { NextcloudRequest request = buildRequest(DELETE, "boards/{boardId}/stacks/{stackId}/cards/{cardId}", boardId, stackId, cardId).build(); return nextcloudAPI.performRequestObservable(Card.class, request); } @Override public Observable getCard(long boardId, long stackId, long cardId, Date lastSync) { NextcloudRequest request = buildRequest(GET, "boards/{boardId}/stacks/{stackId}/cards/{cardId}",lastSync, boardId, stackId, cardId).build(); return nextcloudAPI.performRequestObservable(Card.class, request); } @Override public Observable