package com.constellio.app.client.services;
import java.util.Arrays;
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.GlobalGroupResource;
import com.constellio.app.client.entities.GroupResource;
import com.constellio.app.client.entities.UserResource;
public class UserServicesClient {
final WebTarget target;
final String token;
final String serviceKey;
UserServicesClient(WebTarget target, String token, String serviceKey) {
this.target = target;
this.token = token;
this.serviceKey = serviceKey;
}
public String addUpdateUserCredential(UserResource userResource) {
return requestString("addUpdateUserCredential").post(Entity.json(userResource), String.class);
}
public String addUpdateGlobalGroup(GlobalGroupResource resource) {
return requestString("addUpdateGlobalGroup").post(Entity.json(resource), String.class);
}
public String addUserToCollection(String user, String collection) {
UserResource resource = new UserResource();
resource.setUsername(user);
resource.setCollections(Arrays.asList(collection));
return requestString("addUserToCollection").post(Entity.json(resource), String.class);
}
public UserResource getUser(String username) {
Map<String, String> queryParams = new HashMap<String, String>();
queryParams.put("username", username);
return request("getUser", queryParams).get(UserResource.class);
}
public String generateServiceKeyForUser(String username) {
return requestString("generateServiceKeyForUser").post(Entity.text(username), String.class);
}
public String setGlobalGroupUsers(String groupCode, List<String> usernames) {
GlobalGroupResource resource = new GlobalGroupResource();
resource.setCode(groupCode);
resource.setUsersAutomaticallyAddedToCollections(usernames);
return requestString("setGlobalGroupUsers").post(Entity.json(resource), String.class);
}
public List<String> getGlobalGroupUsers(String groupCode) {
Map<String, String> queryParams = new HashMap<String, String>();
queryParams.put("groupCode", groupCode);
return requestJson("getGlobalGroupUsers", queryParams).get(List.class);
}
public GlobalGroupResource getGlobalGroup(String groupCode) {
Map<String, String> queryParams = new HashMap<String, String>();
queryParams.put("groupCode", groupCode);
return requestJson("getGlobalGroup", queryParams).get(GlobalGroupResource.class);
}
public String removeUserFromCollection(String username, String collection) {
UserResource resource = new UserResource();
resource.setCollections(Arrays.asList(collection));
resource.setUsername(username);
return requestString("removeUserFromCollection").post(Entity.json(resource), String.class);
}
public String removeGlobalGroup(String group) {
GlobalGroupResource resource = new GlobalGroupResource();
resource.setCode(group);
return requestString("removeGlobalGroup").post(Entity.json(resource), String.class);
}
public String removeUserFromGlobalGroup(String username, String groupCode) {
UserResource resource = new UserResource();
resource.setGlobalGroups(Arrays.asList(groupCode));
resource.setUsername(username);
return requestString("removeUserFromGlobalGroup").post(Entity.json(resource), String.class);
}
public String createCollectionGroup(String collection, String code, String name) {
GroupResource resource = new GroupResource();
resource.setCollection(collection);
resource.setCode(code);
resource.setName(name);
return requestString("createCustomGroupInCollectionWithCodeAndName").post(Entity.json(resource), String.class);
}
public String removeCollectionGroup(String collection, String groupCode) {
GroupResource resource = new GroupResource();
resource.setCollection(collection);
resource.setCode(groupCode);
return requestString("removeCollectionGroup").post(Entity.json(resource), String.class);
}
public List<String> getCollectionGroups(String collection) {
Map<String, String> queryParams = new HashMap<String, String>();
queryParams.put("collection", collection);
return requestJson("getCustomGroupsInCollections", queryParams).get(List.class);
}
private Builder requestJson(String service) {
return target.path(service).request(MediaType.APPLICATION_JSON_TYPE).header(AdminServicesConstants.AUTH_TOKEN, token)
.header(AdminServicesConstants.SERVICE_KEY, serviceKey);
}
private Builder requestString(String service) {
return target.path(service).request(MediaType.TEXT_PLAIN).header(AdminServicesConstants.AUTH_TOKEN, token)
.header(AdminServicesConstants.SERVICE_KEY, serviceKey);
}
private Builder request(String service) {
return target.path(service).request().header(AdminServicesConstants.AUTH_TOKEN, token)
.header(AdminServicesConstants.SERVICE_KEY, serviceKey);
}
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 requestString(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 Builder request(String service, Map<String, String> queryParams) {
return path(service, queryParams).request().header(AdminServicesConstants.AUTH_TOKEN, token)
.header(AdminServicesConstants.SERVICE_KEY, serviceKey);
}
private WebTarget path(String service, Map<String, String> queryParams) {
WebTarget target = this.target;
for (Map.Entry<String, String> queryParam : queryParams.entrySet()) {
target = target.queryParam(queryParam.getKey(), queryParam.getValue());
}
return target.path(service);
}
}