diff --git a/resources/META-INF/plugin.xml b/resources/META-INF/plugin.xml index f3099c9..74cfab7 100644 --- a/resources/META-INF/plugin.xml +++ b/resources/META-INF/plugin.xml @@ -1,7 +1,7 @@ biz.elfuego.idea.issues.gitea Gitea issues plugin - 1.2 + 1.3 elfuego.biz projects = new ArrayList<>(); private GiteaProject selectedProject = null; @@ -64,13 +67,31 @@ class GiteaRepository extends BaseRepositoryImpl { public GiteaRepository(GiteaRepository other) { super(other); userId = other.userId; + userLogin = other.userLogin; + projectFilter = other.projectFilter; projects = other.projects; selectedProject = other.selectedProject; } + @Override + public boolean equals(Object o) { + if (o == null || !(o instanceof GiteaRepository)) + return false; + GiteaRepository other = (GiteaRepository) o; + return equal(userId, other.userId) && + equal(userLogin, other.userLogin) && + equal(projectFilter, other.projectFilter) && + equal(projects, other.projects) && + equal(selectedProject, other.selectedProject); + } + + private boolean equal(Object o1, Object o2) { + return o1 == null && o2 == null || o1 != null && o2 != null && o1.equals(o2); + } + @Nullable @Override - public Task findTask(@NotNull String s) throws Exception { + public Task findTask(@NotNull String s) /*throws Exception*/ { // TODO return null; } @@ -159,6 +180,7 @@ class GiteaRepository extends BaseRepositoryImpl { private void doTest() throws Exception { userId = null; + userLogin = null; checkSetup(); JsonElement response = executeMethod(new GetMethod(getApiUrl() + Consts.EndPoint.ME)); final JsonObject obj = getObject(response); @@ -286,33 +308,56 @@ class GiteaRepository extends BaseRepositoryImpl { } private void ensureUserId() throws Exception { - if (userId == null || userId.isEmpty()) { + if (userLogin == null || userLogin.isEmpty()) { JsonElement result = executeMethod(new GetMethod(getApiUrl() + Consts.EndPoint.ME)); - userId = result.getAsJsonObject().get("login").getAsJsonPrimitive().getAsString(); + userId = result.getAsJsonObject().get("id").getAsJsonPrimitive().getAsString(); + userLogin = result.getAsJsonObject().get("login").getAsJsonPrimitive().getAsString(); } } @Transient - List getProjectList() throws Exception { + List getProjectList(ProjectFilter projectFilter) throws Exception { ensureUserId(); - if (projects == null || projects.isEmpty()) { - JsonElement response = executeMethod(new GetMethod(getApiUrl() + Consts.EndPoint.REPOS_SEARCH + userId)); - JsonArray query = getOkData(response); - List result = new ArrayList<>(); - for (int i = 0; i < query.size(); i++) { - JsonObject current = getObject(query.get(i)); - GiteaProject project = new GiteaProject().setId(getString(current, "id", "")) - .setName(getString(current, "full_name", "")); - if (!project.isValid()) { - continue; - } - result.add(project); + final String query; + if (projectFilter == null) + projectFilter = ProjectFilter.GENERAL; + switch (projectFilter) { + case CONTRUBUTOR: + query = Consts.EndPoint.REPOS_SEARCH_UID + userId; + break; + case OWNER: + query = Consts.EndPoint.REPOS_SEARCH_UID_EX + userId; + break; + default: + query = Consts.EndPoint.REPOS_SEARCH; + break; + } + JsonElement response = executeMethod(new GetMethod(getApiUrl() + query)); + JsonArray reply = getOkData(response); + List result = new ArrayList<>(); + for (int i = 0; i < reply.size(); i++) { + JsonObject current = getObject(reply.get(i)); + GiteaProject project = new GiteaProject().setId(getString(current, "id", "")) + .setName(getString(current, "full_name", "")); + if (!project.isValid()) { + continue; } - projects = result; + result.add(project); } + projects = result; return projects; } + @SuppressWarnings("WeakerAccess") + public ProjectFilter getProjectFilter() { + return projectFilter; + } + + @SuppressWarnings("WeakerAccess") + public void setProjectFilter(ProjectFilter projectFilter) { + this.projectFilter = projectFilter; + } + @SuppressWarnings("WeakerAccess") public GiteaProject getSelectedProject() { return selectedProject; @@ -333,6 +378,16 @@ class GiteaRepository extends BaseRepositoryImpl { this.userId = userId; } + @SuppressWarnings("UnusedDeclaration") + public String getUserLogin() { + return userLogin; + } + + @SuppressWarnings("UnusedDeclaration") + public void setUserLogin(String userLogin) { + this.userLogin = userLogin; + } + @SuppressWarnings("UnusedDeclaration") @AbstractCollection(surroundWithTag = false, elementTag = "GiteaProject", elementTypes = GiteaProject.class) public List getProjects() { diff --git a/src/biz/elfuego/idea/issues/gitea/GiteaRepositoryEditor.java b/src/biz/elfuego/idea/issues/gitea/GiteaRepositoryEditor.java index 4523c15..d269aa1 100644 --- a/src/biz/elfuego/idea/issues/gitea/GiteaRepositoryEditor.java +++ b/src/biz/elfuego/idea/issues/gitea/GiteaRepositoryEditor.java @@ -4,6 +4,7 @@ package biz.elfuego.idea.issues.gitea; import biz.elfuego.idea.issues.gitea.model.GiteaProject; +import biz.elfuego.idea.issues.gitea.util.Consts.ProjectFilter; import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.ComboBox; @@ -27,17 +28,18 @@ public class GiteaRepositoryEditor extends BaseRepositoryEditor private JBLabel projectLabel; private ComboBox projectBox; + private JBLabel filterLabel; + private ComboBox filterBox; + GiteaRepositoryEditor(GiteaRepository repository, Project project, Consumer consumer) { super(project, repository, consumer); + filterBox.setSelectedItem(myRepository.getProjectFilter()); + projectBox.setSelectedItem(myRepository.getSelectedProject()); + installListener(filterBox); installListener(projectBox); - UIUtil.invokeLaterIfNeeded(new Runnable() { - @Override - public void run() { - initialize(); - } - }); + UIUtil.invokeLaterIfNeeded(this::initialize); } private void initialize() { @@ -49,12 +51,18 @@ public class GiteaRepositoryEditor extends BaseRepositoryEditor @Nullable @Override protected JComponent createCustomPanel() { + filterBox = new ComboBox<>(ProjectFilter.values(), 300); + filterBox.addActionListener(e -> new FetchProjectsTask().queue()); + filterLabel = new JBLabel("Project filter:", SwingConstants.RIGHT); + filterLabel.setLabelFor(filterBox); + projectBox = new ComboBox(300); projectBox.setRenderer(new TaskUiUtil.SimpleComboBoxRenderer("Set URL, username, and password")); projectLabel = new JBLabel("Project:", SwingConstants.RIGHT); projectLabel.setLabelFor(projectBox); return new FormBuilder().setAlignLabelOnRight(true) + .addLabeledComponent(filterLabel, filterBox) .addLabeledComponent(projectLabel, projectBox) .getPanel(); } @@ -62,6 +70,7 @@ public class GiteaRepositoryEditor extends BaseRepositoryEditor @Override public void setAnchor(@Nullable JComponent anchor) { super.setAnchor(anchor); + filterLabel.setAnchor(anchor); projectLabel.setAnchor(anchor); } @@ -75,6 +84,7 @@ public class GiteaRepositoryEditor extends BaseRepositoryEditor @Override public void apply() { super.apply(); + myRepository.setProjectFilter((ProjectFilter) filterBox.getSelectedItem()); myRepository.setSelectedProject((GiteaProject) projectBox.getSelectedItem()); myTestButton.setEnabled(myRepository.isConfigured()); } @@ -98,9 +108,7 @@ public class GiteaRepositoryEditor extends BaseRepositoryEditor @NotNull @Override protected List fetch(@NotNull ProgressIndicator indicator) throws Exception { - myRepository.setSelectedProject(null); - myRepository.setProjects(null); - return myRepository.getProjectList(); + return myRepository.getProjectList((ProjectFilter) filterBox.getSelectedItem()); } } } diff --git a/src/biz/elfuego/idea/issues/gitea/GiteaTaskImpl.java b/src/biz/elfuego/idea/issues/gitea/GiteaTaskImpl.java index 5118a19..9891c2a 100644 --- a/src/biz/elfuego/idea/issues/gitea/GiteaTaskImpl.java +++ b/src/biz/elfuego/idea/issues/gitea/GiteaTaskImpl.java @@ -22,10 +22,10 @@ import java.util.Date; * @date 2018.06.30 */ public class GiteaTaskImpl extends Task implements Comparable { - private GiteaProject project; - private GiteaRepository repository; + private final GiteaProject project; + private final GiteaRepository repository; private Comment[] comments; - GiteaTask task; + final GiteaTask task; GiteaTaskImpl(@NotNull GiteaRepository repository, @NotNull GiteaTask task) { this.repository = repository; diff --git a/src/biz/elfuego/idea/issues/gitea/util/Consts.java b/src/biz/elfuego/idea/issues/gitea/util/Consts.java index b7b7634..588e779 100644 --- a/src/biz/elfuego/idea/issues/gitea/util/Consts.java +++ b/src/biz/elfuego/idea/issues/gitea/util/Consts.java @@ -11,6 +11,23 @@ public class Consts { public static final String ERROR = "Error communicating to the server"; public static final String UNSPEC_PROJ_ID = "--"; + public enum ProjectFilter { + GENERAL("General search"), + CONTRUBUTOR("Owned and participated by me"), + OWNER("Owned by me"); + + private final String message; + + ProjectFilter(String message) { + this.message = message; + } + + @Override + public String toString() { + return this.message; + } + } + public interface Url { String DEFAULT = "https://try.gitea.io"; } @@ -21,7 +38,9 @@ public class Consts { String REPOS = "/repos/"; String ISSUES = "/issues"; String COMMENTS = "/comments"; - String REPOS_SEARCH = REPOS + "search?uid="; + String REPOS_SEARCH = REPOS + "search"; + String REPOS_SEARCH_UID = REPOS + "search?uid="; + String REPOS_SEARCH_UID_EX = REPOS + "search?exclusive=true&uid="; } public enum States {