package org.rakam.analysis; import com.google.common.collect.ImmutableList; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Optional; import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; public class InMemoryApiKeyService implements ApiKeyService { private final Map<String, List<ProjectApiKeys>> apiKeys = new ConcurrentHashMap<>(); @Override public synchronized ProjectApiKeys createApiKeys(String project) { List<ProjectApiKeys> keys = apiKeys.computeIfAbsent(project, p -> new ArrayList<>()); ProjectApiKeys projectApiKeys = ProjectApiKeys.create( UUID.randomUUID().toString(), UUID.randomUUID().toString(), UUID.randomUUID().toString()); keys.add(projectApiKeys); return projectApiKeys; } @Override public String getProjectOfApiKey(String apiKey, AccessKeyType type) { Optional<String> project = apiKeys.entrySet().stream() .filter(e -> e.getValue().stream() .anyMatch(a -> a.getKey(type).equals(apiKey))) .findAny().map(e -> e.getKey()); if(!project.isPresent()) { throw new IllegalStateException(); } return project.get(); } @Override public void revokeApiKeys(String project, String masterKey) { apiKeys.getOrDefault(project, ImmutableList.of()) .removeIf(e -> e.masterKey().equals(masterKey)); } private String getKey(ProjectApiKeys keys, AccessKeyType type) { switch (type) { case MASTER_KEY: return keys.masterKey(); case READ_KEY: return keys.readKey(); case WRITE_KEY: return keys.writeKey(); default: throw new IllegalStateException(); } } @Override public void revokeAllKeys(String project) { apiKeys.remove(project); } }