package io.gitlab.jfronny.inceptum.util.api; import com.google.gson.reflect.TypeToken; import io.gitlab.jfronny.inceptum.model.gitlab.GitlabJob; import io.gitlab.jfronny.inceptum.model.gitlab.GitlabPackage; import io.gitlab.jfronny.inceptum.model.gitlab.GitlabPackageFile; import io.gitlab.jfronny.inceptum.model.gitlab.GitlabProject; import io.gitlab.jfronny.inceptum.util.HttpUtils; import java.io.IOException; import java.lang.reflect.Type; import java.net.URISyntaxException; import java.util.List; import java.util.function.Predicate; public class GitlabApi { public static final String PROJECTS = "https://gitlab.com/api/v4/projects/"; private static final Type packageInfoListType = new TypeToken>() {}.getType(); private static final Type jobListType = new TypeToken>() {}.getType(); private static final Type packageFileInfoListType = new TypeToken>() {}.getType(); public static GitlabProject getProject(Long projectId) throws IOException, URISyntaxException { return HttpUtils.get(PROJECTS + projectId).sendJson(GitlabProject.class); } public static List getPackages(GitlabProject project) throws IOException, URISyntaxException { List list = HttpUtils.get(PROJECTS + project.id + "/packages").sendJson(packageInfoListType); list.sort((left, right) -> right.created_at.compareTo(left.created_at)); return list; } public static List getJobs(GitlabProject project, Long pipelineId) throws IOException, URISyntaxException { return HttpUtils.get(PROJECTS + project.id + "/pipelines/" + pipelineId + "/jobs").sendJson(jobListType); } public static GitlabPackageFile getFile(GitlabProject project, GitlabPackage packageInfo, Predicate isValid) throws IOException, URISyntaxException { int page = 0; while (true) { List files = HttpUtils.get(PROJECTS + project.id + "/packages/" + packageInfo.id + "/package_files?per_page=100&page=" + ++page).sendJson(packageFileInfoListType); if (files.isEmpty()) return null; for (GitlabPackageFile file : files) { if (isValid.test(file)) return file; } } } }