package com.constellio.app.ui.pages.management.authorizations;
import com.constellio.app.modules.rm.navigation.RMViews;
import com.constellio.app.modules.rm.wrappers.AdministrativeUnit;
import com.constellio.app.modules.rm.wrappers.Document;
import com.constellio.app.modules.rm.wrappers.Folder;
import com.constellio.data.utils.LangUtils;
import com.constellio.model.entities.CorePermissions;
import com.constellio.model.entities.Taxonomy;
import com.constellio.model.entities.records.Record;
import com.constellio.model.entities.records.wrappers.User;
import com.constellio.model.entities.schemas.Schemas;
import com.constellio.model.entities.security.Authorization;
import com.constellio.model.entities.security.Role;
import com.constellio.model.services.schemas.SchemaUtils;
import com.constellio.model.services.taxonomies.TaxonomiesManager;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import static com.constellio.model.entities.security.global.AuthorizationDeleteRequest.authorizationDeleteRequest;
public class ListContentAccessAuthorizationsPresenter extends ListAuthorizationsPresenter {
public ListContentAccessAuthorizationsPresenter(ListContentAccessAuthorizationsView view) {
super(view);
}
@Override
protected List<String> getRestrictedRecordIds(String params) {
return Arrays.asList(recordId);
}
@Override
protected boolean hasPageAccess(String params, User user) {
return true;
}
@Override
protected boolean hasRestrictedRecordAccess(String params, User user, Record restrictedRecord) {
TaxonomiesManager taxonomiesManager = modelLayerFactory.getTaxonomiesManager();
String schemaType = new SchemaUtils().getSchemaTypeCode(restrictedRecord.getSchemaCode());
Taxonomy taxonomy = taxonomiesManager.getTaxonomyFor(user.getCollection(), schemaType);
if (taxonomy != null && taxonomy.hasSameCode(taxonomiesManager.getPrincipalTaxonomy(user.getCollection()))) {
return user.has(CorePermissions.MANAGE_SECURITY).globally();
} else {
return user.hasReadAccess().on(restrictedRecord);
}
}
@Override
public void backButtonClicked(String schemaCode) {
if (schemaCode.startsWith(Folder.SCHEMA_TYPE)) {
view.navigate().to(RMViews.class).displayFolder(recordId);
} else if (schemaCode.startsWith(Document.SCHEMA_TYPE)) {
view.navigate().to(RMViews.class).displayDocument(recordId);
} else {
Taxonomy taxonomy = modelLayerFactory.getTaxonomiesManager().getPrincipalTaxonomy(view.getCollection());
view.navigate().to().taxonomyManagement(taxonomy.getCode(), recordId);
}
}
@Override
public boolean isDetacheable() {
return !AdministrativeUnit.SCHEMA_TYPE.equals(getSchemaType());
}
public String getSchemaType() {
return getRecordVO() == null || getRecordVO().getSchema() == null ? null: getRecordVO().getSchema().getTypeCode();
}
@Override
public boolean isAttached() {
Record record = recordServices().getDocumentById(recordId);
return LangUtils.isFalseOrNull(record.get(Schemas.IS_DETACHED_AUTHORIZATIONS));
}
@Override
public List<String> getAllowedAccesses() {
List<String> results = new ArrayList<>(3);
User user = getCurrentUser();
Record record = presenterService().getRecord(recordId);
if (user.has(CorePermissions.MANAGE_SECURITY).globally()) {
results.addAll(Arrays.asList(Role.READ, Role.WRITE, Role.DELETE));
} else {
if (user.hasReadAccess().on(record)) {
results.add(Role.READ);
}
if (user.hasWriteAccess().on(record)) {
results.add(Role.WRITE);
}
if (user.hasDeleteAccess().on(record)) {
results.add(Role.DELETE);
}
}
return results;
}
@Override
protected boolean isOwnAuthorization(Authorization authorization) {
return authorization.getGrantedOnRecord().equals(recordId);
}
@Override
protected void removeAuthorization(Authorization authorization) {
authorizationsServices().execute(authorizationDeleteRequest(authorization).setExecutedBy(getCurrentUser()));
}
@Override
public boolean seeRolesField() {
return false;
}
@Override
public boolean seeAccessField() {
return true;
}
}