package org.pac4j.oauth.profile.strava;
import com.fasterxml.jackson.core.type.TypeReference;
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;
import java.util.List;
/**
* This class is the Strava profile definition.
*
* @since 1.7.0
* @author Adrian Papusoi
*/
public class StravaProfileDefinition extends OAuth20ProfileDefinition<StravaProfile> {
public static final String ID = "id";
public static final String RESOURCE_STATE = "resource_state";
public static final String FIRST_NAME = "firstname";
public static final String LAST_NAME = "lastname";
public static final String PROFILE_MEDIUM = "profile_medium";
public static final String PROFILE = "profile";
public static final String CITY = "city";
public static final String STATE = "state";
public static final String COUNTRY = "country";
public static final String SEX = "sex";
// friend
// follower
public static final String PREMIUM = "premium";
public static final String CREATED_AT = "created_at";
public static final String UPDATED_AT = "updated_at";
public static final String BADGE_TYPE_ID = "badge_type_id";
public static final String FOLLOWER_COUNT = "follower_count";
public static final String FRIEND_COUNT = "friend_count";
// mutual_friend_count
public static final String DATE_PREFERENCE = "date_preference";
public static final String MEASUREMENT_PREFERENCE = "measurement_preference";
// ftp
public static final String CLUBS = "clubs";
public static final String BIKES = "bikes";
public static final String SHOES = "shoes";
public StravaProfileDefinition() {
super(x -> new StravaProfile());
Arrays.stream(new String[] { FIRST_NAME, LAST_NAME, PROFILE_MEDIUM, CITY, STATE, COUNTRY,
DATE_PREFERENCE, MEASUREMENT_PREFERENCE }).forEach(a -> primary(a, Converters.STRING));
primary(ID, Converters.LONG);
primary(RESOURCE_STATE, Converters.INTEGER);
primary(BADGE_TYPE_ID, Converters.INTEGER);
primary(FOLLOWER_COUNT, Converters.INTEGER);
primary(FRIEND_COUNT, Converters.INTEGER);
primary(PREMIUM, Converters.BOOLEAN);
primary(SEX, Converters.GENDER);
primary(CREATED_AT, Converters.DATE_TZ_RFC822);
primary(UPDATED_AT, Converters.DATE_TZ_RFC822);
primary(CLUBS, new JsonConverter(List.class, new TypeReference<List<StravaClub>>() {}));
final JsonConverter multiGearConverter = new JsonConverter(List.class, new TypeReference<List<StravaGear>>() {});
primary(BIKES, multiGearConverter);
primary(SHOES, multiGearConverter);
primary(PROFILE, Converters.URL);
}
@Override
public String getProfileUrl(final OAuth2AccessToken accessToken, final OAuth20Configuration configuration) {
return "https://www.strava.com/api/v3/athlete";
}
@Override
public StravaProfile extractUserProfile(String body) throws HttpAction {
final StravaProfile profile = newProfile();
final JsonNode json = JsonHelper.getFirstNode(body);
if (json != null) {
profile.setId(JsonHelper.getElement(json, StravaProfileDefinition.ID));
for (final String attribute : getPrimaryAttributes()) {
convertAndAdd(profile, attribute, JsonHelper.getElement(json, attribute));
}
}
return profile;
}
}