package com.constellio.app.modules.rm.services.decommissioning;
import static java.util.Arrays.asList;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang3.StringUtils;
import com.constellio.app.modules.rm.constants.RMPermissionsTo;
import com.constellio.app.modules.rm.constants.RMRoles;
import com.constellio.app.modules.rm.services.decommissioning.DecommissioningEmailServiceException.CannotFindManangerEmail;
import com.constellio.app.modules.rm.wrappers.DecommissioningList;
import com.constellio.model.entities.records.Record;
import com.constellio.model.entities.records.wrappers.RecordWrapper;
import com.constellio.model.entities.records.wrappers.User;
import com.constellio.model.entities.security.global.UserCredentialStatus;
import com.constellio.model.services.factories.ModelLayerFactory;
import com.constellio.model.services.records.RecordServices;
import com.constellio.model.services.security.AuthorizationsServices;
public class DecommissioningEmailService {
String collection;
RecordServices recordServices;
AuthorizationsServices authorizationsServices;
public DecommissioningEmailService(String collection, ModelLayerFactory modelLayerFactory) {
this.authorizationsServices = modelLayerFactory.newAuthorizationsServices();
this.recordServices = modelLayerFactory.newRecordServices();
this.collection = collection;
}
public List<User> getUsersWithEmailAddressAndDecommissioningPermissionInConcept(RecordWrapper recordWrapper) {
return getUsersWithEmailAddressAndDecommissioningPermissionInConcept(recordWrapper.getWrappedRecord());
}
public List<User> getUsersWithEmailAddressAndDecommissioningPermissionInConcept(Record record) {
List<User> returnedUsers = filterUserWithoutEmail(authorizationsServices
.getUsersWithPermissionOnRecordExcludingRecordInheritedAuthorizations(
RMPermissionsTo.APPROVE_DECOMMISSIONING_LIST, record));
if (returnedUsers.isEmpty()) {
String parentId = record.getParentId();
if (parentId == null) {
return getUsersWithEmailAddressWithGlobalDecommissioningPermission();
} else {
Record parentRecord = recordServices.getDocumentById(parentId);
return getUsersWithEmailAddressAndDecommissioningPermissionInConcept(parentRecord);
}
} else {
return returnedUsers;
}
}
private List<User> getUsersWithEmailAddressWithGlobalDecommissioningPermission() {
List<User> users = filterUserWithoutEmail(authorizationsServices.getUsersWithGlobalPermissionInCollectionExcludingRoles(
RMPermissionsTo.APPROVE_DECOMMISSIONING_LIST, collection, asList(RMRoles.RGD)));
if (users.isEmpty()) {
return filterUserWithoutEmail(authorizationsServices.getUsersWithGlobalPermissionInCollection(
RMPermissionsTo.APPROVE_DECOMMISSIONING_LIST, collection));
} else {
return users;
}
}
private List<User> filterUserWithoutEmail(List<User> users) {
List<User> returnedUsers = new ArrayList<>();
for (User user : users) {
if (StringUtils.isNotBlank(user.getEmail()) && user.getStatus() == UserCredentialStatus.ACTIVE) {
returnedUsers.add(user);
}
}
return returnedUsers;
}
public List<User> getManagerEmailForList(DecommissioningList decommissioningList)
throws DecommissioningEmailServiceException {
Record record = recordServices.getDocumentById(decommissioningList.getId());
List<User> users = getUsersWithEmailAddressAndDecommissioningPermissionInConcept(record);
if (users.isEmpty()) {
throw new CannotFindManangerEmail(decommissioningList);
} else {
return users;
}
}
}