package com.constellio.app.client.services;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.ws.rs.client.Entity;
import javax.ws.rs.client.Invocation.Builder;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.MediaType;
import com.constellio.app.client.AdminServicesConstants;
import com.constellio.app.client.entities.MetadataResource;
public class SchemaServicesClient {
final WebTarget target;
final String token;
final String serviceKey;
final String collection;
SchemaServicesClient(WebTarget target, String token, String serviceKey, String collection) {
this.target = target;
this.token = token;
this.serviceKey = serviceKey;
this.collection = collection;
}
public List<String> getSchemaTypes() {
Map<String, String> queryParams = new HashMap<>();
return requestJson("getSchemaTypes", queryParams).get(List.class);
}
public List<String> getSchemas(String schemaType) {
Map<String, String> queryParams = new HashMap<>();
queryParams.put("schemaType", schemaType);
return requestJson("getSchemas", queryParams).get(List.class);
}
public List<String> getSchemaMetadataCodes(String schemaCode) {
Map<String, String> queryParams = new HashMap<>();
queryParams.put("schemaCode", schemaCode);
return requestJson("getSchemaMetadataCodes", queryParams).get(List.class);
}
public List<String> getSchemaValidators(String schemaCode) {
Map<String, String> queryParams = new HashMap<>();
queryParams.put("schemaCode", schemaCode);
return requestJson("getSchemaValidators", queryParams).get(List.class);
}
public MetadataResource getMetadata(String code) {
Map<String, String> queryParams = new HashMap<>();
queryParams.put("code", code);
return requestJson("getDataStoreFields", queryParams).get(MetadataResource.class);
}
public List<String> getTaxonomies() {
Map<String, String> queryParams = new HashMap<>();
return requestJson("getTaxonomies", queryParams).get(List.class);
}
public String getPrincipalTaxonomy() {
Map<String, String> queryParams = new HashMap<>();
return request("getPrincipalTaxonomy", queryParams).get(String.class);
}
public List<String> getTaxonomySchemaTypes(String taxonomyCode) {
Map<String, String> queryParams = new HashMap<>();
queryParams.put("taxonomyCode", taxonomyCode);
return requestJson("getTaxonomySchemaTypes", queryParams).get(List.class);
}
public void createSchemaType(String schemaTypeCode) {
Map<String, String> queryParams = new HashMap<>();
queryParams.put("schemaTypeCode", schemaTypeCode);
request("createSchemaType", queryParams).post(Entity.text(""), String.class);
}
public void createCustomSchema(String schemaCode) {
Map<String, String> queryParams = new HashMap<>();
queryParams.put("schemaCode", schemaCode);
request("createCustomSchema", queryParams).post(Entity.text(""), String.class);
}
public void addSchemaValidator(String schemaCode, String schemaValidator) {
Map<String, String> queryParams = new HashMap<>();
queryParams.put("schemaCode", schemaCode);
queryParams.put("schemaValidator", schemaValidator);
request("addSchemaValidator", queryParams).post(Entity.text(""), String.class);
}
public void removeSchemaValidator(String schemaCode, String schemaValidator) {
Map<String, String> queryParams = new HashMap<>();
queryParams.put("schemaCode", schemaCode);
queryParams.put("schemaValidator", schemaValidator);
request("removeSchemaValidator", queryParams).post(Entity.text(""), String.class);
}
public void addUpdateMetadata(MetadataResource metadataResource) {
Map<String, String> queryParams = new HashMap<>();
request("addUpdateMetadata", queryParams).post(Entity.json(metadataResource), String.class);
}
public void disableMetadata(String metadataCode) {
Map<String, String> queryParams = new HashMap<>();
queryParams.put("metadataCode", metadataCode);
request("disableMetadata", queryParams).post(Entity.text(""), String.class);
}
public void createTaxonomy(String code, List<String> schemaTypes) {
Map<String, String> queryParams = new HashMap<>();
queryParams.put("code", code);
request("createTaxonomy", queryParams).post(Entity.json(schemaTypes), String.class);
}
public void setAsPrincipalTaxonomy(String code) {
Map<String, String> queryParams = new HashMap<>();
queryParams.put("code", code);
request("setAsPrincipalTaxonomy", queryParams).post(Entity.text(""), String.class);
}
private Builder requestJson(String service, Map<String, String> queryParams) {
return path(service, queryParams).request(MediaType.APPLICATION_JSON_TYPE)
.header(AdminServicesConstants.AUTH_TOKEN, token).header(AdminServicesConstants.SERVICE_KEY, serviceKey);
}
private Builder request(String service, Map<String, String> queryParams) {
return path(service, queryParams).request(MediaType.TEXT_PLAIN).header(AdminServicesConstants.AUTH_TOKEN, token)
.header(AdminServicesConstants.SERVICE_KEY, serviceKey);
}
private WebTarget path(String service, Map<String, String> queryParams) {
WebTarget target = this.target.queryParam("collection", collection);
for (Map.Entry<String, String> queryParam : queryParams.entrySet()) {
target = target.queryParam(queryParam.getKey(), queryParam.getValue());
}
return target.path(service);
}
}