package io.cattle.platform.iaas.api.user.preference;
import io.cattle.platform.api.auth.Policy;
import io.cattle.platform.core.constants.CredentialConstants;
import io.cattle.platform.core.model.UserPreference;
import io.cattle.platform.iaas.api.filter.common.AbstractDefaultResourceManagerFilter;
import io.cattle.platform.object.meta.ObjectMetaDataManager;
import io.github.ibuildthecloud.gdapi.condition.Condition;
import io.github.ibuildthecloud.gdapi.condition.ConditionType;
import io.github.ibuildthecloud.gdapi.context.ApiContext;
import io.github.ibuildthecloud.gdapi.exception.ValidationErrorException;
import io.github.ibuildthecloud.gdapi.request.ApiRequest;
import io.github.ibuildthecloud.gdapi.request.resource.ResourceManager;
import io.github.ibuildthecloud.gdapi.validation.ValidationErrorCodes;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.inject.Inject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class UserPreferenceFilter extends AbstractDefaultResourceManagerFilter {
@Inject
UserPreferenceDao userPreferenceDao;
private static final Logger log = LoggerFactory.getLogger(UserPreferenceFilter.class);
private static final String ALL = "all";
@Override
public Class<?>[] getTypeClasses() {
return new Class<?>[] { UserPreference.class };
}
@Override
public Object list(String type, ApiRequest request, ResourceManager next) {
if (!request.getConditions().containsKey(ALL)) {
addAccountIdCondition(request);
} else {
if (!request.getConditions().get(ALL).isEmpty()) {
for (Condition condition:request.getConditions().get(ALL)) {
if (condition.getConditionType().equals(ConditionType.EQ)
&& !Boolean.parseBoolean(String.valueOf(condition.getValue()))) {
addAccountIdCondition(request);
} else {
log.debug("Dont add account id condition.");
}
}
}
}
return super.list(type, request, next);
}
private void addAccountIdCondition(ApiRequest request) {
Map<String, List<Condition>> conditions = request
.getConditions();
if (conditions.get(ObjectMetaDataManager.ACCOUNT_FIELD) == null || conditions.get(ObjectMetaDataManager.ACCOUNT_FIELD).isEmpty()) {
if (conditions.get(ObjectMetaDataManager.ACCOUNT_FIELD) == null) {
conditions.put(ObjectMetaDataManager.ACCOUNT_FIELD, new ArrayList<Condition>());
}
try {
long accountId = ((Policy) ApiContext.getContext().getPolicy()).getAccountId();
conditions.get(ObjectMetaDataManager.ACCOUNT_FIELD).add(new Condition(ConditionType.EQ, accountId));
} catch (NullPointerException e) {
log.debug("Unable to get account id.");
}
}
}
@Override
public Object create(String type, ApiRequest request, ResourceManager next) {
UserPreference userPreference = request.proxyRequestObject(UserPreference.class);
long accountId;
try {
accountId = ((Policy) ApiContext.getContext().getPolicy()).getAccountId();
if (!userPreferenceDao.isUnique(userPreference, accountId)) {
throw new ValidationErrorException(ValidationErrorCodes.NOT_UNIQUE, CredentialConstants.PUBLIC_VALUE);
}
return super.create(type, request, next);
} catch (NullPointerException e) {
return super.create(type, request, next);
}
}
}