package org.rakam.analysis;
import com.fasterxml.jackson.annotation.JsonCreator;
import org.rakam.Mapper;
import org.rakam.bootstrap.SystemRegistry;
import org.rakam.bootstrap.SystemRegistry.ModuleDescriptor;
import org.rakam.collection.FieldDependencyBuilder;
import org.rakam.collection.FieldType;
import org.rakam.collection.SchemaField;
import org.rakam.config.ProjectConfig;
import org.rakam.plugin.EventMapper;
import org.rakam.server.http.HttpService;
import org.rakam.server.http.annotations.Api;
import org.rakam.server.http.annotations.ApiOperation;
import org.rakam.server.http.annotations.ApiParam;
import org.rakam.server.http.annotations.Authorization;
import org.rakam.server.http.annotations.IgnoreApi;
import org.rakam.server.http.annotations.JsonRequest;
import org.rakam.ui.ActiveModuleListBuilder;
import org.rakam.ui.ActiveModuleListBuilder.ActiveModuleList;
import javax.inject.Inject;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;
@Path("/admin")
@Api(value = "/admin", nickname = "admin", description = "System operations", tags = "admin")
public class AdminHttpService
extends HttpService
{
private final SystemRegistry systemRegistry;
private final ActiveModuleList activeModules;
private final ProjectConfig projectConfig;
private final Set<EventMapper> eventMappers;
@Inject
public AdminHttpService(SystemRegistry systemRegistry, Set<EventMapper> eventMappers, ProjectConfig projectConfig, ActiveModuleListBuilder activeModuleListBuilder)
{
this.systemRegistry = systemRegistry;
this.projectConfig = projectConfig;
this.eventMappers = eventMappers;
activeModules = activeModuleListBuilder.build();
}
@ApiOperation(value = "List installed modules",
authorizations = @Authorization(value = "master_key")
)
@GET
@Path("/configurations")
@JsonRequest
public List<ModuleDescriptor> getConfigurations()
{
return systemRegistry.getModules();
}
@ApiOperation(value = "List event mappers",
authorizations = @Authorization(value = "master_key")
)
@GET
@Path("/event_mappers")
@JsonRequest
public List<EventMapperDescription> getEventMappers()
{
return eventMappers.stream().map(mapper -> {
Mapper annotation = mapper.getClass().getAnnotation(Mapper.class);
String name;
String description;
if (annotation != null) {
name = annotation.name();
description = annotation.description();
}
else {
name = mapper.getClass().getSimpleName();
description = "";
}
FieldDependencyBuilder builder = new FieldDependencyBuilder();
mapper.addFieldDependency(builder);
FieldDependencyBuilder.FieldDependency build = builder.build();
return new EventMapperDescription(name, description,
build.dependentFields.isEmpty() ? null : build.dependentFields,
build.constantFields.isEmpty() ? null : build.constantFields);
}).collect(Collectors.toList());
}
public static class EventMapperDescription
{
public final String name;
public final String description;
public final Map<String, List<SchemaField>> dependentFields;
public final Set<SchemaField> constantFields;
@JsonCreator
public EventMapperDescription(String name, String description, Map<String, List<SchemaField>> dependentFields, Set<SchemaField> constantFields)
{
this.name = name;
this.description = description;
this.dependentFields = dependentFields;
this.constantFields = constantFields;
}
}
@ApiOperation(value = "Get types",
authorizations = @Authorization(value = "master_key")
)
@GET
@JsonRequest
@Path("/types")
public Map<String, String> getTypes()
{
return Arrays.stream(FieldType.values()).collect(Collectors.toMap(FieldType::name, FieldType::getPrettyName));
}
@ApiOperation(value = "Check lock key",
authorizations = @Authorization(value = "master_key")
)
@JsonRequest
@Path("/lock_key")
public boolean checkLockKey(@ApiParam(value = "lock_key", required = false) String lockKey)
{
return Objects.equals(lockKey, projectConfig.getLockKey());
}
@Path("/modules")
@GET
@IgnoreApi
@ApiOperation(value = "List installed modules for Rakam UI",
authorizations = @Authorization(value = "master_key")
)
public ActiveModuleList modules()
{
return activeModules;
}
}