All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.spotify.github.v3.clients.IssueClient Maven / Gradle / Ivy

/*-
 * -\-\-
 * github-api
 * --
 * Copyright (C) 2016 - 2020 Spotify AB
 * --
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *      http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * -/-/-
 */

package com.spotify.github.v3.clients;

import static com.spotify.github.v3.clients.GitHubClient.IGNORE_RESPONSE_CONSUMER;
import static com.spotify.github.v3.clients.GitHubClient.LIST_COMMENT_TYPE_REFERENCE;

import com.google.common.collect.ImmutableMap;
import com.spotify.github.async.AsyncPage;
import com.spotify.github.v3.comment.Comment;
import java.lang.invoke.MethodHandles;
import java.util.Iterator;
import java.util.concurrent.CompletableFuture;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/** Issue API client */
public class IssueClient {

  static final String COMMENTS_URI_NUMBER_TEMPLATE = "/repos/%s/%s/issues/%s/comments";
  static final String COMMENTS_URI_TEMPLATE = "/repos/%s/%s/issues/comments";
  static final String COMMENTS_URI_ID_TEMPLATE = "/repos/%s/%s/issues/comments/%s";
  private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());

  private final GitHubClient github;
  private final String owner;
  private final String repo;

  IssueClient(final GitHubClient github, final String owner, final String repo) {
    this.github = github;
    this.owner = owner;
    this.repo = repo;
  }

  static IssueClient create(final GitHubClient github, final String owner, final String repo) {
    return new IssueClient(github, owner, repo);
  }

  /**
   * List repository comments.
   *
   * @return comments
   */
  public Iterator> listComments() {
    return listComments(String.format(COMMENTS_URI_TEMPLATE, owner, repo));
  }

  /**
   * List given issue number comments.
   *
   * @param number issue number
   * @return comments
   */
  public Iterator> listComments(final int number) {
    return listComments(String.format(COMMENTS_URI_NUMBER_TEMPLATE, owner, repo, number));
  }

  /**
   * Get a specific comment.
   *
   * @param id comment id
   * @return a comment
   */
  public CompletableFuture getComment(final int id) {
    final String path = String.format(COMMENTS_URI_ID_TEMPLATE, owner, repo, id);
    log.info("Fetching issue comments from " + path);
    return github.request(path, Comment.class);
  }

  /**
   * Create a comment for a given issue number.
   *
   * @param number issue number
   * @param body comment content
   * @return the Comment that was just created
   */
  public CompletableFuture createComment(final int number, final String body) {
    final String path = String.format(COMMENTS_URI_NUMBER_TEMPLATE, owner, repo, number);
    final String requestBody = github.json().toJsonUnchecked(ImmutableMap.of("body", body));
    return github.post(path, requestBody, Comment.class);
  }

  /**
   * Edit a specific comment.
   *
   * @param id comment id
   * @param body new comment content
   */
  public CompletableFuture editComment(final int id, final String body) {
    final String path = String.format(COMMENTS_URI_ID_TEMPLATE, owner, repo, id);
    return github
        .patch(path, github.json().toJsonUnchecked(ImmutableMap.of("body", body)))
        .thenAccept(IGNORE_RESPONSE_CONSUMER);
  }

  /**
   * Delete a comment.
   *
   * @param id comment id
   */
  public CompletableFuture deleteComment(final int id) {
    return github
        .delete(String.format(COMMENTS_URI_ID_TEMPLATE, owner, repo, id))
        .thenAccept(IGNORE_RESPONSE_CONSUMER);
  }

  private Iterator> listComments(final String path) {
    return new GithubPageIterator<>(new GithubPage<>(github, path, LIST_COMMENT_TYPE_REFERENCE));
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy