OrganizationLinkerService.java

package edu.ucsb.cs156.frontiers.services;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import edu.ucsb.cs156.frontiers.errors.InvalidInstallationTypeException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

import java.security.NoSuchAlgorithmException;
import java.security.spec.InvalidKeySpecException;

@Service
public class OrganizationLinkerService {
    private RestTemplate restTemplate;

    @Autowired
    JwtService jwtService;

    @Autowired
    ObjectMapper objectMapper;

    public OrganizationLinkerService(RestTemplateBuilder restTemplateBuilder) {
        restTemplate = restTemplateBuilder.build();
    }

    /**
     * Returns the URL for a redirect to install Frontiers
     * @return URL to install Frontiers to an organization
     */
    public String getRedirectUrl() throws NoSuchAlgorithmException, InvalidKeySpecException, JsonProcessingException {
        String token = jwtService.getJwt();
        HttpHeaders requestHeaders = new HttpHeaders();
        requestHeaders.add("Authorization", "Bearer " + token);
        requestHeaders.add("Accept", "application/vnd.github+json");
        requestHeaders.add("X-GitHub-Api-Version", "2022-11-28");
        String ENDPOINT = "https://api.github.com/app";
        HttpEntity<String> newEntity = new HttpEntity<>(requestHeaders);
        ResponseEntity<String> response = restTemplate.exchange(ENDPOINT, HttpMethod.GET,  newEntity, String.class);

        JsonNode responseJson = objectMapper.readTree(response.getBody());

        String newUrl = responseJson.get("html_url").toString().replaceAll("\"", "");
        return newUrl;
    }

    /**
     * Provides the name of the organization attached to a particular installation ID
     * @param installation_id ID of the app installation
     * @return name of the organization attached to the installation
     */
    public String getOrgName(String installation_id) throws NoSuchAlgorithmException, InvalidKeySpecException, JsonProcessingException {
        String token = jwtService.getJwt();
        String ENDPOINT = "https://api.github.com/app/installations/" + installation_id;

        HttpHeaders headers = new HttpHeaders();
        headers.add("Authorization", "Bearer " + token);
        headers.add("Accept", "application/vnd.github+json");
        headers.add("X-GitHub-Api-Version", "2022-11-28");
        HttpEntity<String> entity = new HttpEntity<>(headers);
        ResponseEntity<String> response = restTemplate.exchange(ENDPOINT, HttpMethod.GET, entity, String.class);
        JsonNode responseJson = objectMapper.readTree(response.getBody());
        String type = responseJson.get("account").get("type").asText();
        if(!type.equals("Organization")){
            throw new InvalidInstallationTypeException(type);
        }
        String orgName = responseJson.get("account").get("login").asText();
        return orgName;
    }
}