package org.rakam.analysis; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; import com.google.auto.value.AutoValue; import javax.annotation.Nullable; public interface ApiKeyService { ProjectApiKeys createApiKeys(String project); String getProjectOfApiKey(String apiKey, AccessKeyType type); void revokeApiKeys(String project, String masterKey); void revokeAllKeys(String project); default void setup() { } @AutoValue abstract class ProjectApiKeys { @Nullable @JsonProperty("master_key") public abstract String masterKey(); @Nullable @JsonProperty("read_key") public abstract String readKey(); @Nullable @JsonProperty("write_key") public abstract String writeKey(); @JsonCreator public static ProjectApiKeys create( @JsonProperty("master_key") String masterKey, @JsonProperty("read_key") String readKey, @JsonProperty("write_key") String writeKey) { return new AutoValue_ApiKeyService_ProjectApiKeys(masterKey, readKey, writeKey); } public String getKey(AccessKeyType accessKeyType) { switch (accessKeyType) { case WRITE_KEY: return writeKey(); case MASTER_KEY: return masterKey(); case READ_KEY: return readKey(); default: throw new IllegalStateException(); } } } enum AccessKeyType { MASTER_KEY("master_key"), READ_KEY("read_key"), WRITE_KEY("write_key"); private final String key; AccessKeyType(String key) { this.key = key; } public String getKey() { return key; } public static AccessKeyType fromKey(String key) { for (AccessKeyType accessKeyType : values()) { if (accessKeyType.getKey().equals(key)) { return accessKeyType; } } throw new IllegalArgumentException(key + " doesn't exist."); } } }