package org.pac4j.oauth.profile.github;
import com.fasterxml.jackson.databind.JsonNode;
import com.github.scribejava.core.model.OAuth2AccessToken;
import org.pac4j.core.exception.HttpAction;
import org.pac4j.core.profile.converter.Converters;
import org.pac4j.oauth.config.OAuth20Configuration;
import org.pac4j.oauth.profile.JsonHelper;
import org.pac4j.oauth.profile.converter.JsonConverter;
import org.pac4j.oauth.profile.definition.OAuth20ProfileDefinition;
import java.util.Arrays;
/**
* This class is the GitHub profile definition.
*
* @author Jerome Leleu
* @since 1.1.0
*/
public class GitHubProfileDefinition extends OAuth20ProfileDefinition<GitHubProfile> {
public static final String TYPE = "type";
public static final String BLOG = "blog";
public static final String URL = "url";
public static final String PUBLIC_GISTS = "public_gists";
public static final String FOLLOWING = "following";
public static final String PRIVATE_GISTS = "private_gists";
public static final String PUBLIC_REPOS = "public_repos";
public static final String GRAVATAR_ID = "gravatar_id";
public static final String AVATAR_URL = "avatar_url";
public static final String FOLLOWERS = "followers";
public static final String LOGIN = "login";
public static final String COMPANY = "company";
public static final String HIREABLE = "hireable";
public static final String COLLABORATORS = "collaborators";
public static final String HTML_URL = "html_url";
public static final String BIO = "bio";
public static final String TOTAL_PRIVATE_REPOS = "total_private_repos";
public static final String CREATED_AT = "created_at";
public static final String UPDATED_AT = "updated_at";
public static final String NAME = "name";
public static final String DISK_USAGE = "disk_usage";
public static final String PLAN = "plan";
public static final String OWNED_PRIVATE_REPOS = "owned_private_repos";
public GitHubProfileDefinition() {
super(x -> new GitHubProfile());
Arrays.asList(new String[] {
URL, COMPANY, NAME, BLOG, LOGIN, LOCATION, TYPE, GRAVATAR_ID, BIO
}).forEach(a -> primary(a, Converters.STRING));
Arrays.asList(new String[] {
FOLLOWING, PUBLIC_REPOS, PUBLIC_GISTS, DISK_USAGE, COLLABORATORS, OWNED_PRIVATE_REPOS, TOTAL_PRIVATE_REPOS,
PRIVATE_GISTS, FOLLOWERS
}).forEach(a -> primary(a, Converters.INTEGER));
primary(HIREABLE, Converters.BOOLEAN);
primary(CREATED_AT, Converters.DATE_TZ_RFC822);
primary(UPDATED_AT, Converters.DATE_TZ_RFC822);
primary(AVATAR_URL, Converters.URL);
primary(HTML_URL, Converters.URL);
primary(PLAN, new JsonConverter<>(GitHubPlan.class));
}
@Override
public String getProfileUrl(final OAuth2AccessToken accessToken, final OAuth20Configuration configuration) {
return "https://api.github.com/user";
}
@Override
public GitHubProfile extractUserProfile(final String body) throws HttpAction {
final GitHubProfile profile = newProfile();
final JsonNode json = JsonHelper.getFirstNode(body);
if (json != null) {
profile.setId(JsonHelper.getElement(json, "id"));
for (final String attribute : getPrimaryAttributes()) {
convertAndAdd(profile, attribute, JsonHelper.getElement(json, attribute));
}
}
return profile;
}
}