package com.instructure.canvasapi.api;
import com.instructure.canvasapi.model.CanvasContext;
import com.instructure.canvasapi.model.FileFolder;
import com.instructure.canvasapi.utilities.APIHelpers;
import com.instructure.canvasapi.utilities.CanvasCallback;
import com.instructure.canvasapi.utilities.LinkHeaders;
import retrofit.Callback;
import retrofit.RetrofitError;
import retrofit.client.Response;
import retrofit.http.DELETE;
import retrofit.http.GET;
import retrofit.http.Path;
/**
*
* Copyright (c) 2014 Instructure. All rights reserved.
*/
public class FileFolderAPI extends BuildInterfaceAPI {
interface FilesFoldersInterface {
@GET("/{context_id}/folders/root")
void getRootFolderForContext(@Path("context_id") long context_id, Callback<FileFolder> callback);
@GET("/self/folders/root")
void getRootUserFolder(Callback<FileFolder> callback);
@GET("/folders/{folderid}/folders")
void getFirstPageFolders(@Path("folderid") long folder_id, Callback<FileFolder[]> callback);
@GET("/folders/{folderid}/files")
void getFirstPageFiles(@Path("folderid") long folder_id, Callback<FileFolder[]> callback);
@GET("/{fileurl}")
void getFileFolderFromURL(@Path(value = "fileurl", encode = false) String fileURL, Callback<FileFolder> callback);
@GET("/{next}")
void getNextPageFileFoldersList(@Path(value = "next", encode = false) String nextURL, Callback<FileFolder[]> callback);
@DELETE("/files/{fileid}")
void deleteFile(@Path("fileid")long fileId, Callback<Response> callback);
}
/////////////////////////////////////////////////////////////////////////
// API Calls
/////////////////////////////////////////////////////////////////////////
public static void getFirstPageFoldersRoot(CanvasContext canvasContext, final CanvasCallback<FileFolder[]> callback) {
if (APIHelpers.paramIsNull(callback, canvasContext)) {
return;
}
// Build a callback bridge. Use a CanvasCallback instead of a regular callback so we can use caching appropriately and
// not have to make more API calls than necessary
Callback<FileFolder> bridgeCallback = new CanvasCallback<FileFolder>(callback.getStatusDelegate()) {
@Override
public void cache(FileFolder fileFolder, LinkHeaders linkHeaders, Response response) {
buildCacheInterface(FilesFoldersInterface.class, callback, null).getFirstPageFolders(fileFolder.getId(), callback);
}
@Override
public void firstPage(FileFolder fileFolder, LinkHeaders linkHeaders, Response response) {
//Handle if the fragment becomes detached. This isn't a CanvasCallback, so it's not automatic.
if(callback == null || callback.getContext() == null) {return;}
buildInterface(FilesFoldersInterface.class, callback, null).getFirstPageFolders(fileFolder.getId(), callback);
}
@Override
public void failure(RetrofitError retrofitError) {
callback.failure(retrofitError);
}
};
// get from cache
getRootFolder(canvasContext, true, callback, bridgeCallback);
// get from network
getRootFolder(canvasContext, false, callback, bridgeCallback);
}
public static void getFirstPageFilesRoot(CanvasContext canvasContext, final CanvasCallback<FileFolder[]> callback) {
getFirstPageFilesRootChained(canvasContext, false, callback);
}
public static void getFirstPageFilesRootChained(CanvasContext canvasContext, boolean isCached, final CanvasCallback<FileFolder[]> callback) {
if (APIHelpers.paramIsNull(callback, canvasContext)) {
return;
}
// Build a callback bridge. Use a CanvasCallback instead of a regular callback so we can use caching appropriately and
// not have to make more API calls than necessary
Callback<FileFolder> bridgeCallback = new CanvasCallback<FileFolder>(callback.getStatusDelegate()) {
@Override
public void cache(FileFolder fileFolder, LinkHeaders linkHeaders, Response response) {
buildCacheInterface(FilesFoldersInterface.class, callback, null).getFirstPageFiles(fileFolder.getId(), callback);
}
@Override
public void firstPage(FileFolder fileFolder, LinkHeaders linkHeaders, Response response) {
//Handle if the fragment becomes detached. This isn't a CanvasCallback, so it's not automatic.
if(callback == null || callback.getContext() == null) {return;}
buildInterface(FilesFoldersInterface.class, callback, null).getFirstPageFiles(fileFolder.getId(), callback);
}
@Override
public void failure(RetrofitError retrofitError) {
callback.failure(retrofitError);
}
};
getRootFolder(canvasContext, isCached, callback, bridgeCallback);
}
private static void getRootFolder(CanvasContext canvasContext, boolean isCached, CanvasCallback callback, Callback<FileFolder> bridgeCallback) {
FilesFoldersInterface foldersInterface = buildInterface(FilesFoldersInterface.class, callback, canvasContext);
if (canvasContext.getType() == CanvasContext.Type.USER) {
if(isCached) {
buildCacheInterface(FilesFoldersInterface.class, callback, canvasContext).getRootUserFolder(bridgeCallback);
} else {
foldersInterface.getRootUserFolder(bridgeCallback);
}
} else {
if(isCached) {
buildCacheInterface(FilesFoldersInterface.class, callback, canvasContext).getRootFolderForContext(canvasContext.getId(), bridgeCallback);
} else {
foldersInterface.getRootFolderForContext(canvasContext.getId(), bridgeCallback);
}
}
}
public static void getFirstPageFolders(long folderid, CanvasCallback<FileFolder[]> callback) {
if (APIHelpers.paramIsNull(callback) || folderid <= 0) {
return;
}
buildCacheInterface(FilesFoldersInterface.class, callback, null).getFirstPageFolders(folderid, callback);
buildInterface(FilesFoldersInterface.class, callback, null).getFirstPageFolders(folderid, callback);
}
public static void getFirstPageFiles(long folderid, CanvasCallback<FileFolder[]> callback) {
if (APIHelpers.paramIsNull(callback) || folderid <= 0) {
return;
}
buildCacheInterface(FilesFoldersInterface.class, callback, null).getFirstPageFiles(folderid, callback);
buildInterface(FilesFoldersInterface.class, callback, null).getFirstPageFiles(folderid, callback);
}
public static void getFirstPageFilesChained(long folderid, boolean isCached, CanvasCallback<FileFolder[]> callback) {
if (APIHelpers.paramIsNull(callback) || folderid <= 0) {
return;
}
if(isCached) {
buildCacheInterface(FilesFoldersInterface.class, callback, null).getFirstPageFiles(folderid, callback);
} else {
buildInterface(FilesFoldersInterface.class, callback, null).getFirstPageFiles(folderid, callback);
}
}
public static void getNextPageFileFolders(String nextURL, CanvasCallback<FileFolder[]> callback) {
if (APIHelpers.paramIsNull(callback, nextURL)) {
return;
}
callback.setIsNextPage(true);
buildCacheInterface(FilesFoldersInterface.class, callback, false).getNextPageFileFoldersList(nextURL, callback);
buildInterface(FilesFoldersInterface.class, callback, false).getNextPageFileFoldersList(nextURL, callback);
}
public static void getFileFolderFromURL(String url, CanvasCallback<FileFolder> callback) {
if (APIHelpers.paramIsNull(callback, url)) {
return;
}
buildCacheInterface(FilesFoldersInterface.class, callback, null).getFileFolderFromURL(url, callback);
buildInterface(FilesFoldersInterface.class, callback, null).getFileFolderFromURL(url, callback);
}
public static void deleteFile(long fileId, CanvasCallback<Response> callback) {
if (APIHelpers.paramIsNull(callback)) {
return;
}
buildInterface(FilesFoldersInterface.class, callback, null).deleteFile(fileId,callback);
}
}