package net.oschina.gitapp.api; import static net.oschina.gitapp.api.HTTPRequestor.*; import java.io.File; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.util.HashMap; import java.util.List; import java.util.Map; import org.codehaus.jackson.map.DeserializationConfig; import org.codehaus.jackson.map.ObjectMapper; import android.graphics.Bitmap; import android.util.Log; import net.oschina.gitapp.AppContext; import net.oschina.gitapp.AppException; import net.oschina.gitapp.bean.Branch; import net.oschina.gitapp.bean.CodeFile; import net.oschina.gitapp.bean.CodeTree; import net.oschina.gitapp.bean.Comment; import net.oschina.gitapp.bean.Commit; import net.oschina.gitapp.bean.CommitDiff; import net.oschina.gitapp.bean.CommonList; import net.oschina.gitapp.bean.Event; import net.oschina.gitapp.bean.GitNote; import net.oschina.gitapp.bean.Issue; import net.oschina.gitapp.bean.Language; import net.oschina.gitapp.bean.LuckMsg; import net.oschina.gitapp.bean.Milestone; import net.oschina.gitapp.bean.NotificationReadResult; import net.oschina.gitapp.bean.Project; import net.oschina.gitapp.bean.ProjectNotificationArray; import net.oschina.gitapp.bean.RandomProject; import net.oschina.gitapp.bean.ReadMe; import net.oschina.gitapp.bean.Session; import net.oschina.gitapp.bean.ShippingAddress; import net.oschina.gitapp.bean.StarWatchOptionResult; import net.oschina.gitapp.bean.UpLoadFile; import net.oschina.gitapp.bean.Update; import net.oschina.gitapp.bean.User; import net.oschina.gitapp.bean.URLs; import net.oschina.gitapp.common.CyptoUtils; import net.oschina.gitapp.common.StringUtils; /** * API客户端接口:用于访问网络数据 * * @author 火蚁 (http://my.oschina.net/LittleDY) * @version 1.0 * @created 2014-04-22 */ public class ApiClient { private final static String PRIVATE_TOKEN = "private_token"; private final static String GITOSC_PRIVATE_TOKEN = "git@osc_token"; // 私有token,每个用户都有一个唯一的 private static String private_token; public static final ObjectMapper MAPPER = new ObjectMapper().configure( DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false); /** * 清除private_token,注销登录的时候清除 */ public static void cleanToken() { private_token = ""; } /** * 获得private_token * * @param appContext * @return */ public static String getToken(AppContext appContext) { if (private_token == null || private_token == "") { private_token = appContext.getProperty(PRIVATE_TOKEN); } return CyptoUtils.decode(GITOSC_PRIVATE_TOKEN, private_token); } private static HTTPRequestor getHttpRequestor() { return new HTTPRequestor(); } /** * 给一个url拼接参数 * * @param p_url * @param params * @return */ private static String makeURL(String p_url, Map<String, Object> params) { StringBuilder url = new StringBuilder(p_url); if (params.size() == 0) return p_url; if (url.indexOf("?") < 0) url.append('?'); for (String name : params.keySet()) { String value = String.valueOf(params.get(name)); if (value != null && !StringUtils.isEmpty(value) && !value.equalsIgnoreCase("null")) { url.append('&'); url.append(name); url.append('='); // 对参数进行编码 try { url.append(URLEncoder.encode( String.valueOf(params.get(name)), "UTF-8")); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } } return url.toString().replace("?&", "?"); } /** * 用户登录,将私有token保存 * * @param appContext * @param username * @param password * @return GitlabUser用户信息 * @throws IOException */ public static User login(AppContext appContext, String userEmail, String password) throws AppException { String urlString = URLs.LOGIN_HTTPS; Session session = getHttpRequestor() .init(appContext, HTTPRequestor.POST_METHOD, urlString) .with("email", userEmail) .with("password", password) .to(Session.class); // 保存用户的私有token if (session != null && session.get_privateToken() != null) { String token = CyptoUtils.encode(GITOSC_PRIVATE_TOKEN, session.get_privateToken()); appContext.setProperty(PRIVATE_TOKEN, token); } return session; } /** * 获得一个用户的信息 * * @param appContext * @param userId * @return * @throws AppException */ public static User getUser(AppContext appContext, int userId) throws AppException { String url = URLs.USER + URLs.URL_SPLITTER + userId; return getHttpRequestor().init(appContext, HTTPRequestor.GET_METHOD, url).to(User.class); } /** * 获取网络图片 * * @param url * @return */ public static Bitmap getNetBitmap(String url) throws AppException { return getHttpRequestor().init(null, GET_METHOD, url) .getNetBitmap(); } /** * 获得一个项目的信息 * * @param appContext * @param projectId * @return * @throws AppException */ @SuppressWarnings("serial") public static Project getProject(final AppContext appContext, String projectId) throws AppException { String url = makeURL(URLs.PROJECT + URLs.URL_SPLITTER + projectId, new HashMap<String, Object>() { { put(PRIVATE_TOKEN, getToken(appContext)); } }); return getHttpRequestor().init(appContext, HTTPRequestor.GET_METHOD, url).to(Project.class); } /** * 获得具体用户的项目列表 * @param appContext * @param urerId * @param page * @return * @throws AppException */ public static CommonList<Project> getUserProjects(final AppContext appContext, String urerId, int page) throws AppException { CommonList<Project> res = new CommonList<Project>(); Map<String, Object> params = new HashMap<String, Object>(); params.put(PRIVATE_TOKEN, getToken(appContext)); params.put("page", page); String url = makeURL(URLs.USER + URLs.URL_SPLITTER + urerId + URLs.URL_SPLITTER + "projects", params); List<Project> list = getHttpRequestor().init(appContext, GET_METHOD, url) .getList(Project[].class); res.setCount(list.size()); res.setPageSize(list.size()); res.setList(list); return res; } /** * 获得发现页面最近更新的项目列表 * * @param appContext * @param page * 页数 * @return * @throws AppException */ @SuppressWarnings("serial") public static CommonList<Project> getExploreLatestProject( final AppContext appContext, final int page) throws AppException { CommonList<Project> projects = new CommonList<Project>(); String url = makeURL(URLs.EXPLORELATESTPROJECT, new HashMap<String, Object>() { { put("page", page); put(PRIVATE_TOKEN, getToken(appContext)); } }); List<Project> list = getHttpRequestor().init(appContext, HTTPRequestor.GET_METHOD, url).getList(Project[].class); projects.setList(list); projects.setCount(list.size()); projects.setPageSize(list.size()); return projects; } /** * 获得发现页面热门项目列表 * * @param appContext * @param page * @return * @throws AppException */ @SuppressWarnings("serial") public static CommonList<Project> getExplorePopularProject( final AppContext appContext, final int page) throws AppException { CommonList<Project> projects = new CommonList<Project>(); String url = makeURL(URLs.EXPLOREPOPULARPROJECT, new HashMap<String, Object>() { { put("page", page); put(PRIVATE_TOKEN, getToken(appContext)); } }); List<Project> list = getHttpRequestor().init(appContext, HTTPRequestor.GET_METHOD, url).getList(Project[].class); projects.setList(list); projects.setCount(list.size()); projects.setPageSize(list.size()); return projects; } /** * 获得发现页面推荐项目列表 * * @param appContext * @param page * @return * @throws AppException */ @SuppressWarnings("serial") public static CommonList<Project> getExploreFeaturedProject( final AppContext appContext, final int page) throws AppException { CommonList<Project> projects = new CommonList<Project>(); String url = makeURL(URLs.EXPLOREFEATUREDPROJECT, new HashMap<String, Object>() { { put("page", page); put(PRIVATE_TOKEN, getToken(appContext)); } }); List<Project> list = getHttpRequestor().init(appContext, HTTPRequestor.GET_METHOD, url).getList(Project[].class); projects.setList(list); projects.setCount(list.size()); projects.setPageSize(list.size()); return projects; } /** * 获得查询项目的结果 * @param appContext * @param page * @return * @throws AppException */ @SuppressWarnings("deprecation") public static List<Project> getSearcheProject(AppContext appContext, String query, int page) throws AppException { Map<String, Object> params = new HashMap<String, Object>(); params.put(PRIVATE_TOKEN, getToken(appContext)); params.put("page", page); String url = makeURL(URLs.SEARCHPROJECT + URLs.URL_SPLITTER + URLEncoder.encode(query), params); return getHttpRequestor().init(appContext, GET_METHOD, url) .getList(Project[].class); } /** * 获得个人动态列表 * * @param appContext * @param page * @return * @throws AppException */ @SuppressWarnings("serial") public static CommonList<Event> getMySelfEvents( final AppContext appContext, final int page) throws AppException { CommonList<Event> events = new CommonList<Event>(); String url = makeURL(URLs.EVENTS, new HashMap<String, Object>() { { put("page", page); put(PRIVATE_TOKEN, getToken(appContext)); } }); final List<Event> list = getHttpRequestor().init(appContext, HTTPRequestor.GET_METHOD, url).getList(Event[].class); events.setList(list); events.setCount(list.size()); events.setPageSize(list.size()); return events; } /** * 获得个人的所有项目 * * @param appContext * @param page * @return * @throws AppException */ public static CommonList<Project> getMySelfProjectList( AppContext appContext, int page) throws AppException { CommonList<Project> msProjects = new CommonList<Project>(); Map<String, Object> params = new HashMap<String, Object>(); params.put(PRIVATE_TOKEN, getToken(appContext)); params.put("page", page); String url = makeURL(URLs.PROJECT, params); List<Project> list = getHttpRequestor().init(appContext, HTTPRequestor.GET_METHOD, url).getList(Project[].class); msProjects.setList(list); msProjects.setCount(list.size()); msProjects.setPageSize(list.size()); return msProjects; } /** * 获取具体用户的最近动态列表 * @param appContext * @param user_id * @param page * @return * @throws AppException */ public static CommonList<Event> getUserEvents(AppContext appContext, String user_id ,int page) throws AppException { CommonList<Event> events = new CommonList<Event>(); Map<String, Object> params = new HashMap<String, Object>(); params.put(PRIVATE_TOKEN, getToken(appContext)); params.put("page", page); String url = makeURL(URLs.USEREVENTS + URLs.URL_SPLITTER + user_id, params); List<Event> list = getHttpRequestor().init(appContext, HTTPRequestor.GET_METHOD, url).getList(Event[].class); events.setList(list); events.setCount(list.size()); events.setPageSize(list.size()); return events; } /** * 获得一个项目的commit列表 * * @param appContext * @param projectId * 指定项目的id * @param page * 页码 * @param ref_name * 分支(optional) * @return * @throws AppException */ public static CommonList<Commit> getProjectCommitList( AppContext appContext, int projectId, int page, String ref_name) throws AppException { CommonList<Commit> commits = new CommonList<Commit>(); Map<String, Object> params = new HashMap<String, Object>(); params.put(PRIVATE_TOKEN, getToken(appContext)); params.put("page", page); params.put("ref_name", ref_name); // 拼接url地址 String url = makeURL(URLs.PROJECT + URLs.URL_SPLITTER + projectId + URLs.URL_SPLITTER + "repository/commits", params); List<Commit> list = getHttpRequestor().init(appContext, HTTPRequestor.GET_METHOD, url).getList(Commit[].class); commits.setList(list); commits.setCount(list.size()); commits.setPageSize(list.size()); return commits; } /** * 获得项目的代码树列表 * * @param appContext * @param projectId * 项目的id * @param path * (optional) 路径 * @param ref_name * (optional) 分支或者标签,空则为默认的master分支 * @return * @throws AppException */ public static CommonList<CodeTree> getProjectCodeTree( AppContext appContext, int projectId, String path, String ref_name) throws AppException { CommonList<CodeTree> codeTree = new CommonList<CodeTree>(); Map<String, Object> params = new HashMap<String, Object>(); params.put(PRIVATE_TOKEN, getToken(appContext)); params.put("path", path); params.put("ref_name", ref_name); String url = makeURL(URLs.PROJECT + URLs.URL_SPLITTER + projectId + URLs.URL_SPLITTER + "repository/tree", params); List<CodeTree> list = getHttpRequestor().init(appContext, HTTPRequestor.GET_METHOD, url).getList(CodeTree[].class); codeTree.setList(list); codeTree.setCount(list.size()); codeTree.setPageSize(list.size()); return codeTree; } /** * 获得一个项目issues列表 * * @param appContext * @param projectId * @param page * @return * @throws AppException */ public static CommonList<Issue> getProjectIssuesList(AppContext appContext, int projectId, int page) throws AppException { CommonList<Issue> commits = new CommonList<Issue>(); Map<String, Object> params = new HashMap<String, Object>(); params.put(PRIVATE_TOKEN, getToken(appContext)); params.put("page", page); // 拼接url地址 String url = makeURL(URLs.PROJECT + URLs.URL_SPLITTER + projectId + URLs.URL_SPLITTER + "issues", params); List<Issue> list = getHttpRequestor().init(appContext, HTTPRequestor.GET_METHOD, url).getList(Issue[].class); commits.setList(list); commits.setCount(list.size()); commits.setPageSize(list.size()); return commits; } /** * 获得一个项目的Branchs或者Tags列表 * * @param appContext * @param projectId * @param page * @param branchOrTag * @return * @throws AppException */ public static CommonList<Branch> getProjectBranchsOrTagsLsit( AppContext appContext, String projectId, int page, String branchOrTag) throws AppException { CommonList<Branch> commits = new CommonList<Branch>(); Map<String, Object> params = new HashMap<String, Object>(); params.put(PRIVATE_TOKEN, getToken(appContext)); params.put("page", page); // 拼接url地址 String url = makeURL(URLs.PROJECT + URLs.URL_SPLITTER + projectId + URLs.URL_SPLITTER + "repository" + URLs.URL_SPLITTER + branchOrTag, params); List<Branch> list = getHttpRequestor().init(appContext, HTTPRequestor.GET_METHOD, url).getList(Branch[].class); commits.setList(list); commits.setCount(list.size()); commits.setPageSize(list.size()); return commits; } /** * 获得issue的详情 * @param appContext * @param projectId * @param issueId * @return * @throws AppException */ public static Issue getIssue(AppContext appContext, String projectId, String issueId) throws AppException { Map<String, Object> params = new HashMap<String, Object>(); params.put(PRIVATE_TOKEN, getToken(appContext)); String url = makeURL(URLs.PROJECT + URLs.URL_SPLITTER + projectId + "/issues/" + issueId, params); return getHttpRequestor().init(appContext, GET_METHOD, url) .to(Issue.class); } /** * 获得issue的评论列表 * * @param appContext * @param projectId * @param noteId * @param page * @param isRefresh * @return * @throws Exception */ public static CommonList<GitNote> getIssueCommentList( AppContext appContext, String projectId, String issueId, int page) throws Exception { CommonList<GitNote> commits = new CommonList<GitNote>(); Map<String, Object> params = new HashMap<String, Object>(); params.put(PRIVATE_TOKEN, getToken(appContext)); params.put("page", page); // 拼接url地址 String url = makeURL(URLs.PROJECT + URLs.URL_SPLITTER + projectId + URLs.URL_SPLITTER + "issues" + URLs.URL_SPLITTER + issueId + URLs.URL_SPLITTER + "notes", params); List<GitNote> list = getHttpRequestor().init(appContext, HTTPRequestor.GET_METHOD, url).getList(GitNote[].class); commits.setList(list); commits.setCount(list.size()); commits.setPageSize(list.size()); return commits; } /** * 提交issue的一个评论 * * @param appContext * @param projectId * @param issueId * @param body * @return * @throws AppException */ public static GitNote pubIssueComment(AppContext appContext, String projectId, String issueId, String body) throws AppException { Map<String, Object> params = new HashMap<String, Object>(); params.put(PRIVATE_TOKEN, getToken(appContext)); String url = makeURL(URLs.PROJECT + URLs.URL_SPLITTER + projectId + URLs.URL_SPLITTER + "issues" + URLs.URL_SPLITTER + issueId + URLs.URL_SPLITTER + "notes", params); return getHttpRequestor() .init(appContext, HTTPRequestor.POST_METHOD, url) .with("body", body).to(GitNote.class); } /** * 获得代码文件详情 * * @param appContext * @param projectId * @param file_path * @param ref * @return * @throws AppException */ public static CodeFile getCodeFile(AppContext appContext, String projectId, String file_path, String ref) throws AppException { CodeFile codeFile = null; Map<String, Object> params = new HashMap<String, Object>(); params.put(PRIVATE_TOKEN, getToken(appContext)); params.put("file_path", file_path); params.put("ref", ref); String url = makeURL(URLs.PROJECT + URLs.URL_SPLITTER + projectId + URLs.URL_SPLITTER + "repository/files", params); codeFile = getHttpRequestor().init(appContext, HTTPRequestor.GET_METHOD, url).to(CodeFile.class); return codeFile; } /** * 获得一个项目的readme文件 * @param appContext * @param projectId * @return * @throws AppException */ public static ReadMe getReadMeFile(AppContext appContext, String projectId) throws AppException { Map<String, Object> params = new HashMap<String, Object>(); params.put(PRIVATE_TOKEN, getToken(appContext)); String url = makeURL(URLs.PROJECT + URLs.URL_SPLITTER + projectId + URLs.URL_SPLITTER + "readme", params); return getHttpRequestor() .init(appContext, GET_METHOD, url) .to(ReadMe.class); } /** * 获得commit文件diff * * @param appContext * @param projectId * @param commitId * @return * @throws Exception */ public static CommonList<CommitDiff> getCommitDiffList( AppContext appContext, String projectId, String commitId) throws Exception { CommonList<CommitDiff> commits = new CommonList<CommitDiff>(); Map<String, Object> params = new HashMap<String, Object>(); params.put(PRIVATE_TOKEN, getToken(appContext)); // 拼接url地址 String url = makeURL(URLs.PROJECT + URLs.URL_SPLITTER + projectId + URLs.URL_SPLITTER + "repository/commits" + URLs.URL_SPLITTER + commitId + URLs.URL_SPLITTER + "diff", params); List<CommitDiff> list = getHttpRequestor().init(appContext, HTTPRequestor.GET_METHOD, url).getList(CommitDiff[].class); commits.setList(list); commits.setCount(list.size()); commits.setPageSize(list.size()); return commits; } /** * 获得commit的评论列表 * * @param appContext * @param projectId * @param commitId * @param isRefresh * @return * @throws AppException */ public static CommonList<Comment> getCommitCommentList( AppContext appContext, String projectId, String commitId, boolean isRefresh) throws AppException { CommonList<Comment> commits = new CommonList<Comment>(); Map<String, Object> params = new HashMap<String, Object>(); params.put(PRIVATE_TOKEN, getToken(appContext)); // 拼接url地址 String url = makeURL(URLs.PROJECT + URLs.URL_SPLITTER + projectId + URLs.URL_SPLITTER + "repository/commits" + URLs.URL_SPLITTER + commitId + URLs.URL_SPLITTER + "comment", params); List<Comment> list = getHttpRequestor().init(appContext, HTTPRequestor.GET_METHOD, url).getList(Comment[].class); commits.setList(list); commits.setCount(list.size()); commits.setPageSize(list.size()); return commits; } /** * 通过commits获取代码文件的内容 * * @param appContext * @param projectId * @param commitId * @param filePath * @return * @throws Exception */ public static String getCommitFileDetail(AppContext appContext, String projectId, String commitId, String filePath) throws Exception { Map<String, Object> params = new HashMap<String, Object>(); params.put(PRIVATE_TOKEN, getToken(appContext)); params.put("filepath", filePath); String url = makeURL(URLs.PROJECT + URLs.URL_SPLITTER + projectId + URLs.URL_SPLITTER + "repository/commits" + URLs.URL_SPLITTER + commitId + URLs.URL_SPLITTER + "blob", params); return getHttpRequestor().init(appContext, HTTPRequestor.GET_METHOD, url).getResponseBodyString(); } /** * 加载项目的参与成员 * * @param appContext * @param projectId * @return * @throws AppException */ public static List<User> getProjectMembers(AppContext appContext, String projectId) throws AppException { Map<String, Object> params = new HashMap<String, Object>(); params.put(PRIVATE_TOKEN, getToken(appContext)); String url = makeURL(URLs.PROJECT + URLs.URL_SPLITTER + projectId + URLs.URL_SPLITTER + "members", params); return getHttpRequestor().init(appContext, HTTPRequestor.GET_METHOD, url).getList(User[].class); } /** * 加载项目的里程碑 * * @param appContext * @param projectId * @return * @throws AppException */ public static List<Milestone> getProjectMilestone(AppContext appContext, String projectId) throws AppException { Map<String, Object> params = new HashMap<String, Object>(); params.put(PRIVATE_TOKEN, getToken(appContext)); String url = makeURL(URLs.PROJECT + URLs.URL_SPLITTER + projectId + URLs.URL_SPLITTER + "milestones", params); return getHttpRequestor().init(appContext, HTTPRequestor.GET_METHOD, url).getList(Milestone[].class); } /** * 创建一个issue * * @param appContext * @param projectId * @param title * @param description * @param assignee_id * @param milestone_id * @return * @throws AppException */ public static Issue pubCreateIssue(AppContext appContext, String projectId, String title, String description, String assignee_id, String milestone_id) throws AppException { Map<String, Object> params = new HashMap<String, Object>(); params.put(PRIVATE_TOKEN, getToken(appContext)); String url = makeURL(URLs.PROJECT + URLs.URL_SPLITTER + projectId + URLs.URL_SPLITTER + "issues", params); return getHttpRequestor() .init(appContext, HTTPRequestor.POST_METHOD, url) .with("description", description) .with("title", title) .with("assignee_id", assignee_id) .with("milestone_id", milestone_id) .to(Issue.class); } /** * 上传文件 * * @param appContext * @param files * @return */ public static UpLoadFile upLoadFile(AppContext appContext, File file) throws AppException { Map<String, Object> params = new HashMap<String, Object>(); params.put(PRIVATE_TOKEN, getToken(appContext)); String url = makeURL(URLs.UPLOAD, params); return getHttpRequestor() .init(appContext, HTTPRequestor.POST_METHOD, url) .with("file", file).to(UpLoadFile.class); } /** * 获得通知 * @param appContext * @param filter * @param all * @param project_id * @return * @throws AppException */ public static CommonList<ProjectNotificationArray> getNotification( AppContext appContext, String filter, String all, String project_id) throws AppException { CommonList<ProjectNotificationArray> projectNotifications = new CommonList<ProjectNotificationArray>(); Map<String, Object> params = new HashMap<String, Object>(); params.put(PRIVATE_TOKEN, getToken(appContext)); params.put("filter", filter); params.put("all", all); String url = makeURL(URLs.NOTIFICATION, params); List<ProjectNotificationArray> list = getHttpRequestor(). init(appContext, HTTPRequestor.GET_METHOD, url) .getList(ProjectNotificationArray[].class); projectNotifications.setList(list); projectNotifications.setCount(list.size()); projectNotifications.setPageSize(list.size()); return projectNotifications; } /** * 设置通知为已读 * @param appContext * @param notificationId * @return * @throws AppException */ public static NotificationReadResult setNotificationIsRead(AppContext appContext, String notificationId) throws AppException { Map<String, Object> params = new HashMap<String, Object>(); params.put(PRIVATE_TOKEN, getToken(appContext)); String url = makeURL(URLs.NOTIFICATION_READED + URLs.URL_SPLITTER + notificationId, params); return getHttpRequestor().init(appContext, GET_METHOD, url) .to(NotificationReadResult.class); } /** * 获得App更新的信息 * @param appContext * @return * @throws AppException */ public static Update getUpdateInfo(AppContext appContext) throws AppException { Map<String, Object> params = new HashMap<String, Object>(); params.put(PRIVATE_TOKEN, getToken(appContext)); String url = makeURL(URLs.UPDATE, params); return getHttpRequestor().init(appContext, GET_METHOD, url) .to(Update.class); } /** * 获得语言列表 * @param appContext * @return * @throws AppException */ public static CommonList<Language> getLanguageList(AppContext appContext) throws AppException { CommonList<Language> languages = new CommonList<Language>(); Map<String, Object> params = new HashMap<String, Object>(); params.put(PRIVATE_TOKEN, getToken(appContext)); String url = makeURL(URLs.PROJECT + URLs.URL_SPLITTER + "languages", params); List<Language> list = getHttpRequestor().init(appContext, GET_METHOD, url) .getList(Language[].class); languages.setCount(list.size()); languages.setList(list); languages.setPageSize(list.size()); return languages; } /** * 根据语言的ID获得项目的列表 * @param appContext * @param languageId * @param page * @return * @throws AppException */ public static List<Project> getLanguageProjectList(AppContext appContext, String languageId, int page) throws AppException { Map<String, Object> params = new HashMap<String, Object>(); params.put(PRIVATE_TOKEN, getToken(appContext)); params.put("page", page); String url = makeURL(URLs.PROJECT + URLs.URL_SPLITTER + "languages" + URLs.URL_SPLITTER + languageId, params); return getHttpRequestor().init(appContext, GET_METHOD, url) .getList(Project[].class); } /** * star or unstar一个项目 * @param appContext * @param projectId * @return * @throws AppException */ public static StarWatchOptionResult starProject(AppContext appContext, String projectId, String type) throws AppException { Map<String, Object> params = new HashMap<String, Object>(); params.put(PRIVATE_TOKEN, getToken(appContext)); String url = ""; if (type.equalsIgnoreCase("star")) { url = makeURL(URLs.PROJECT + URLs.URL_SPLITTER + projectId + URLs.URL_SPLITTER + "star", params); } else { url = makeURL(URLs.PROJECT + URLs.URL_SPLITTER + projectId + URLs.URL_SPLITTER + "unstar", params); } return getHttpRequestor().init(appContext, POST_METHOD, url) .to(StarWatchOptionResult.class); } /** * watch or unwatch一个项目 * @param appContext * @param projectId * @return * @throws AppException */ public static StarWatchOptionResult watchProject(AppContext appContext, String projectId, String type) throws AppException { Map<String, Object> params = new HashMap<String, Object>(); params.put(PRIVATE_TOKEN, getToken(appContext)); String url = ""; if (type.equalsIgnoreCase("watch")) { url = makeURL(URLs.PROJECT + URLs.URL_SPLITTER + projectId + URLs.URL_SPLITTER + "watch", params); } else { url = makeURL(URLs.PROJECT + URLs.URL_SPLITTER + projectId + URLs.URL_SPLITTER + "unwatch", params); } return getHttpRequestor().init(appContext, POST_METHOD, url) .to(StarWatchOptionResult.class); } /** * 随机获取一个项目 * @param appContext * @return * @throws AppException */ public static RandomProject getRandomProject(AppContext appContext) throws AppException { Map<String, Object> params = new HashMap<String, Object>(); params.put(PRIVATE_TOKEN, getToken(appContext)); params.put("luck", 1); String url = makeURL(URLs.PROJECT + URLs.URL_SPLITTER + "random", params); return getHttpRequestor().init(appContext, GET_METHOD, url) .to(RandomProject.class); } /** * 更新代码库中的代码文件 * @param appContext * @param project_id * @param branch_name * @param content * @param commit_message * @return * @throws AppException */ public static String updateRepositoryFiles(AppContext appContext, String project_id, String ref, String file_path, String branch_name, String content, String commit_message) throws AppException { Map<String, Object> params = new HashMap<String, Object>(); params.put(PRIVATE_TOKEN, getToken(appContext)); String url = makeURL(URLs.PROJECT + URLs.URL_SPLITTER + project_id + "/repository/files", params); return getHttpRequestor().init(appContext, POST_METHOD, url) .with("ref", ref) .with("file_path", file_path) .with("branch_name", branch_name) .with("content", content) .with("commit_message", commit_message) .getResponseBodyString(); } /** * 获得某个用户star的项目列表 * @param appContext * @param user_id * @param page * @param isRefresh * @return * @throws AppException */ public static CommonList<Project> getStarProjectList(AppContext appContext, String user_id, int page, boolean isRefresh) throws AppException { CommonList<Project> projects = new CommonList<Project>(); Map<String, Object> params = new HashMap<String, Object>(); params.put(PRIVATE_TOKEN, getToken(appContext)); params.put("page", page); // 拼接url地址 String url = makeURL(URLs.USER + URLs.URL_SPLITTER + user_id + URLs.URL_SPLITTER + "stared_projects", params); List<Project> list = getHttpRequestor().init(appContext, HTTPRequestor.GET_METHOD, url).getList(Project[].class); projects.setList(list); projects.setCount(list.size()); projects.setPageSize(list.size()); return projects; } /** * 获得某个用户watched的项目列表 * @param appContext * @param user_id * @param page * @param isRefresh * @return * @throws AppException */ public static CommonList<Project> getWatchProjectList(AppContext appContext, String user_id, int page, boolean isRefresh) throws AppException { CommonList<Project> projects = new CommonList<Project>(); Map<String, Object> params = new HashMap<String, Object>(); params.put(PRIVATE_TOKEN, getToken(appContext)); params.put("page", page); // 拼接url地址 String url = makeURL(URLs.USER + URLs.URL_SPLITTER + user_id + URLs.URL_SPLITTER + "watched_projects", params); List<Project> list = getHttpRequestor().init(appContext, HTTPRequestor.GET_METHOD, url).getList(Project[].class); projects.setList(list); projects.setCount(list.size()); projects.setPageSize(list.size()); return projects; } /** * 获取用户的收货信息 * @param appContext * @param user_id * @return * @throws AppException */ public static ShippingAddress getUserShippingAddress(AppContext appContext, String user_id) throws AppException { Map<String, Object> params = new HashMap<String, Object>(); params.put(PRIVATE_TOKEN, getToken(appContext)); String url = makeURL(URLs.URL_API_HOST + "users" + URLs.URL_SPLITTER + user_id + URLs.URL_SPLITTER + "address", params); return getHttpRequestor().init(appContext, GET_METHOD, url) .to(ShippingAddress.class); } /** * 更新用户的收货信息 * @param appContext * @param user_id * @param shippingAddress * @return * @throws AppException */ public static ShippingAddress updateUserShippingAddress(AppContext appContext, String user_id, ShippingAddress shippingAddress) throws AppException { Map<String, Object> params = new HashMap<String, Object>(); params.put(PRIVATE_TOKEN, getToken(appContext)); String url = makeURL(URLs.URL_API_HOST + "users" + URLs.URL_SPLITTER + user_id + URLs.URL_SPLITTER + "address", params); return getHttpRequestor().init(appContext, POST_METHOD, url) .with("name", shippingAddress.getName()) .with("tel", shippingAddress.getTel()) .with("address", shippingAddress.getAddress()) .with("comment", shippingAddress.getComment()) .to(ShippingAddress.class); } /** * 获得抽奖活动的信息 * @param appContext * @return * @throws AppException */ public static LuckMsg getLuckMsg(AppContext appContext) throws AppException { Map<String, Object> params = new HashMap<String, Object>(); params.put(PRIVATE_TOKEN, getToken(appContext)); String url = makeURL(URLs.PROJECT + URLs.URL_SPLITTER + "luck_msg", params); return getHttpRequestor().init(appContext, GET_METHOD, url) .to(LuckMsg.class); } }