package crmdna.user;
import crmdna.client.Client;
import crmdna.common.api.APIException;
import crmdna.common.api.APIResponse.Status;
import crmdna.group.Group;
import java.util.List;
public class User {
public static final String SUPER_USER = "sathyanarayanant@gmail.com";
public static UserProp create(String client, String email, long groupId, String login) {
Client.ensureValid(client);
ensureClientLevelPrivilege(client, login, ClientLevelPrivilege.UPDATE_USER);
Group.safeGet(client, groupId);
return UserCore.create(client, email, groupId);
}
public static UserProp updateEmail(String client, String existingEmail, String newEmail,
String login) {
Client.ensureValid(client);
ensureClientLevelPrivilege(client, login, ClientLevelPrivilege.UPDATE_USER);
UserProp userProp = UserCore.updateEmail(client, existingEmail, newEmail);
return userProp;
}
public static UserProp updateGroup(String client, String email, long newGroupId, String login) {
Client.ensureValid(client);
ensureClientLevelPrivilege(client, login, ClientLevelPrivilege.UPDATE_USER);
Group.safeGet(client, newGroupId);
return UserCore.updateGroup(client, email, newGroupId);
}
public static UserEntity get(String client, String email) {
Client.ensureValid(client);
return UserCore.get(client, email);
}
public static UserEntity safeGet(String client, String email) {
Client.ensureValid(client);
return UserCore.safeGet(client, email);
}
public static List<UserProp> getAll(String client, String login) {
Client.ensureValid(client);
User.ensureValidUser(client, login);
return UserCore.getAll(client);
}
public static List<UserProp> getAllForGroup(String client, long groupId) {
Client.ensureValid(client);
return UserCore.getAllForGroup(client, groupId);
}
public static UserProp addClientLevelPrivilege(String client, String email,
ClientLevelPrivilege privilege, String login) {
return addOrDeleteClientLevelPrivilege(client, email, privilege, true, login);
}
public static UserProp deleteClientLevelPrivilege(String client, String email,
ClientLevelPrivilege privilege, String login) {
return addOrDeleteClientLevelPrivilege(client, email, privilege, false, login);
}
private static UserProp addOrDeleteClientLevelPrivilege(String client, String email,
ClientLevelPrivilege privilege, boolean add, String login) {
Client.ensureValid(client);
ensureClientLevelPrivilege(client, login, ClientLevelPrivilege.UPDATE_USER);
UserProp userProp =
UserCore.addOrDeletePrivilege(client, email, "CLIENT", client, privilege.toString(), add);
return userProp;
}
public static UserProp addGroupLevelPrivilege(String client, long groupId, String email,
GroupLevelPrivilege privilege, String login) {
return addOrDeleteGroupLevelPrivilege(client, groupId, email, privilege, true, login);
}
public static UserProp deleteGroupLevelPrivilege(String client, long groupId, String email,
GroupLevelPrivilege privilege, String login) {
return addOrDeleteGroupLevelPrivilege(client, groupId, email, privilege, false, login);
}
private static UserProp addOrDeleteGroupLevelPrivilege(String client, long groupId, String email,
GroupLevelPrivilege privilege, boolean add, String login) {
Client.ensureValid(client);
ensureClientLevelPrivilege(client, login, ClientLevelPrivilege.UPDATE_USER);
UserProp userProp =
UserCore.addOrDeletePrivilege(client, email, "GROUP", groupId + "", privilege.toString(),
add);
return userProp;
}
public static UserProp clonePrivileges(String client, String sourceEmail, String targetEmail,
String login) {
Client.ensureValid(client);
ensureClientLevelPrivilege(client, login, ClientLevelPrivilege.UPDATE_USER);
UserProp userProp = UserCore.clonePrivileges(client, sourceEmail, targetEmail);
return userProp;
}
public static void ensureValidUser(String client, String login) {
Client.ensureValid(client);
UserCore.ensureValidUser(client, login);
}
public static void ensureClientLevelPrivilege(String client, String login,
ClientLevelPrivilege privilege) {
Client.ensureValid(client);
if (UserCore.hasPrivilege(client, login, "CLIENT", client, privilege.toString()))
return;
// throw exception
String message =
"User [" + login + "] does not have client level privilege [" + privilege
+ "] for client [" + client + "]";
throw new APIException(message).status(Status.ERROR_INSUFFICIENT_PERMISSION);
}
public static void ensureGroupLevelPrivilege(String client, long groupId, String login,
GroupLevelPrivilege privilege) {
Client.ensureValid(client);
if (UserCore.hasPrivilege(client, login, "GROUP", groupId + "", privilege.toString()))
return;
// throw exception
String message =
"User [" + login + "] does not have group level privilege [" + privilege + "] for client ["
+ client + "], group [" + groupId + "]";
throw new APIException(message).status(Status.ERROR_INSUFFICIENT_PERMISSION);
}
public static UserProp addApp(String client, String email, App app, String login) {
Client.ensureValid(client);
ensureClientLevelPrivilege(client, login, ClientLevelPrivilege.UPDATE_USER);
return UserCore
.addOrDeletePrivilege(client, email, "APP", app.toString(), app.toString(), true);
}
public static UserProp removeApp(String client, String email, App app, String login) {
Client.ensureValid(client);
ensureClientLevelPrivilege(client, login, ClientLevelPrivilege.UPDATE_USER);
return UserCore.addOrDeletePrivilege(client, email, "APP", app.toString(), app.toString(),
false);
}
public enum ResourceType {
MEMBER, GROUP, USER, INTERACTION, PRACTICE, PROGRAM_TYPE, VENUE, TEACHER, PROGRAM, CUSTOM_CONFIG, PAYPAL_CREDENTIALS, FROM_EMAIL, EMAIL_KEY, CONFIG, INVENTORY_ITEM_TYPE, INVENTORY_ITEM, DEPARTMENT, LIST, MAIL_CONTENT, MEAL
}
public enum GroupLevelPrivilege {
SEND_EMAIL, VIEW_LIST, UPDATE_LIST, UPDATE_PROGRAM, CHECK_IN, UPDATE_EMAIL_CONFIG, UPDATE_PAYMENT_CONFIG, UPDATE_INVENTORY_QUANTITY, UPDATE_INVENTORY_ITEM, UPDATE_MAIL_CONTENT, UPDATE_MAIL_SCHEDULE, UPDATE_PARTICIPANT,
UPDATE_CAMPAIGN
}
public enum ClientLevelPrivilege {
UPDATE_GROUP, ENABLE_DISABLE_ACCOUNT, UPDATE_USER, UPDATE_CLIENT_CONTACT_EMAIL, PURGE_MEMBER_DATA, VIEW_API_KEY, UPDATE_CUSTOM_CONFIG, UPDATE_DEPARTMENT, UPDATE_INTERACTION, UPDATE_INVENTORY_ITEM_TYPE, UPDATE_MEAL_COUNT, UPDATE_MAIL_CONTENT, VERIFY_EMAIL, UPDATE_PAYMENT, UPDATE_PRACTICE, UPDATE_PROGRAM_TYPE, UPDATE_SESSION_PASS, UPDATE_TEACHER, UPDATE_VENUE,
SUBSCRIBE_GROUP //required to undo unsubscribe. should be given only to select people
}
public enum App {
SEARCH, CHECK_IN, INVENTORY
}
}