X-Git-Url: https://gerrit.onap.org/r/gitweb?a=blobdiff_plain;f=portal-BE%2Fsrc%2Fmain%2Fjava%2Forg%2Fonap%2Fportal%2Fservice%2FWidgetService.java;h=4b037919ac7b8ab4ece9899490c50ff2162c3082;hb=009040bc056dee5e26e43244422e8e0b9c47144a;hp=24a77ed59817c023647f4d8ce72158e63d2e3ad7;hpb=cb3f6ffee6dd5a9a15a6962065a313cc1f97b7c1;p=portal.git diff --git a/portal-BE/src/main/java/org/onap/portal/service/WidgetService.java b/portal-BE/src/main/java/org/onap/portal/service/WidgetService.java index 24a77ed5..4b037919 100644 --- a/portal-BE/src/main/java/org/onap/portal/service/WidgetService.java +++ b/portal-BE/src/main/java/org/onap/portal/service/WidgetService.java @@ -43,60 +43,209 @@ package org.onap.portal.service; import java.util.ArrayList; import java.util.List; import javax.persistence.EntityManager; +import javax.servlet.http.HttpServletResponse; +import org.onap.portal.dao.fn.FnWidgetDao; import org.onap.portal.domain.db.fn.FnUser; +import org.onap.portal.domain.db.fn.FnUserRole; +import org.onap.portal.domain.db.fn.FnWidget; +import org.onap.portal.domain.dto.ecomp.EPUserApp; +import org.onap.portal.domain.dto.transport.FieldsValidator; import org.onap.portal.domain.dto.transport.OnboardingWidget; +import org.onap.portal.service.fn.FnUserRoleService; +import org.onap.portal.utils.EPCommonSystemProperties; +import org.onap.portalsdk.core.logging.logic.EELFLoggerDelegate; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.EnableAspectJAutoProxy; +import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; @Service +@EnableAspectJAutoProxy +@Transactional public class WidgetService { - private final AdminRolesService adminRolesService; - - private static Long ACCOUNT_ADMIN_ROLE_ID = 999L; + private final EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(WidgetService.class); + private final Long ACCOUNT_ADMIN_ROLE_ID = 999L; - private static String baseSqlToken = " widget.WIDGET_ID, widget.WDG_NAME, widget.APP_ID, app.APP_NAME, widget.WDG_WIDTH, widget.WDG_HEIGHT, widget.WDG_URL" - + " from FN_WIDGET widget join FN_APP app ON widget.APP_ID = app.APP_ID"; + private static String baseSqlToken = + " new org.onap.portal.domain.dto.transport.OnboardingWidget(" + + "widget.WIDGET_ID,widget.WDG_NAME,widget.APP_ID," + + "app.APP_NAME,widget.WDG_WIDTH,widget.WDG_HEIGHT," + + "widget.WDG_URL, widget.WIDGET_ID,widget.WDG_NAME,widget.APP_ID,app.APP_NAME,widget.WDG_WIDTH,widget.WDG_HEIGHT,widget.WDG_URL) from FN_WIDGET widget join FN_APP app ON widget.APP_ID = app.APP_ID"; - private static String validAppsFilter = ""; + private static final String urlField = "url"; + private static final Long DUBLICATED_FIELD_VALUE_ECOMP_ERROR = new Long( + EPCommonSystemProperties.DUBLICATED_FIELD_VALUE_ECOMP_ERROR); + private static final String nameField = "name"; + private final AdminRolesService adminRolesService; private final EntityManager entityManager; + private final FnWidgetDao fnWidgetDao; + private final FnUserRoleService fnUserRoleService; @Autowired - public WidgetService(final AdminRolesService adminRolesService, EntityManager entityManager) { + public WidgetService(final AdminRolesService adminRolesService, final EntityManager entityManager, + final FnWidgetDao fnWidgetDao, FnUserRoleService fnUserRoleService) { this.adminRolesService = adminRolesService; this.entityManager = entityManager; + this.fnWidgetDao = fnWidgetDao; + this.fnUserRoleService = fnUserRoleService; } + private static final Object syncRests = new Object(); + public List getOnboardingWidgets(FnUser user, boolean managed) { - List onboardingWidgets = new ArrayList<>(); - String sql = null; - if (adminRolesService.isSuperAdmin(user)) { - sql = this.sqlWidgetsForAllApps(); + if (adminRolesService.isSuperAdmin(user.getOrgUserId())) { + return entityManager.createQuery(sqlWidgetsForAllApps(), OnboardingWidget.class).getResultList(); } else if (managed) { if (adminRolesService.isAccountAdmin(user)) { - sql = this.sqlWidgetsForAllAppsWhereUserIsAdmin(user.getId()); + return entityManager + .createQuery(sqlWidgetsForAllAppsWhereUserIsAdmin(), OnboardingWidget.class) + .setParameter("USERID", user.getId()).getResultList(); } } else if (adminRolesService.isAccountAdmin(user) || adminRolesService.isUser(user)) { - sql = this.sqlWidgetsForAllAppsWhereUserHasAnyRole(user.getId()); - } - if (sql != null) { - onboardingWidgets = (List) entityManager.createNativeQuery(sql, OnboardingWidget.class).getResultList(); + return entityManager + .createQuery(sqlWidgetsForAllAppsWhereUserHasAnyRole(), OnboardingWidget.class) + .setParameter("USERID", user.getId()).getResultList(); } - return onboardingWidgets; + return new ArrayList<>(); } private String sqlWidgetsForAllApps() { - return "SELECT" + baseSqlToken + validAppsFilter; + return "SELECT" + baseSqlToken; + } + + private String sqlWidgetsForAllAppsWhereUserIsAdmin() { + return "SELECT" + baseSqlToken + + " join FN_USER_ROLE ON FN_USER_ROLE.APP_ID = app.APP_ID where FN_USER_ROLE.USER_ID = :USERID AND FN_USER_ROLE.ROLE_ID = " + + ACCOUNT_ADMIN_ROLE_ID; + } + + private String sqlWidgetsForAllAppsWhereUserHasAnyRole() { + return "SELECT DISTINCT" + baseSqlToken + + " join FN_USER_ROLE ON FN_USER_ROLE.APP_ID = app.APP_ID where FN_USER_ROLE.USER_ID = " + + ":USERID"; + } + + @PreAuthorize("hasRole('System_Administrator')") + public FieldsValidator setOnboardingWidget(final Long userId, final OnboardingWidget onboardingWidget) { + return this.updateOrSaveWidget(true, userId, onboardingWidget); + } + + private FieldsValidator updateOrSaveWidget(boolean superAdmin, Long userId, OnboardingWidget onboardingWidget) { + FieldsValidator fieldsValidator = new FieldsValidator(); + if (!this.isUserAdminOfAppForWidget(superAdmin, userId, onboardingWidget.getAppId())) { + fieldsValidator.setHttpStatusCode((long) HttpServletResponse.SC_FORBIDDEN); + return fieldsValidator; + } + synchronized (syncRests) { + if (onboardingWidget.getId() == null) { + this.validateOnboardingWidget(onboardingWidget, fieldsValidator); + } else { + FnWidget widget = fnWidgetDao.getOne(onboardingWidget.getId()); + if (widget == null || widget.getAppId() == null) { + fieldsValidator.setHttpStatusCode((long) HttpServletResponse.SC_NOT_FOUND); + return fieldsValidator; + } + this.validateOnboardingWidget(onboardingWidget, fieldsValidator); + } + if (fieldsValidator.getHttpStatusCode() == HttpServletResponse.SC_OK) { + this.applyOnboardingWidget(onboardingWidget, fieldsValidator); + } + } + return fieldsValidator; + } + + private boolean isUserAdminOfAppForWidget(boolean superAdmin, Long userId, Long appId) { + if (!superAdmin) { + List userRoles = getAdminUserRoles(userId, appId); + return (userRoles.size() > 0); + } + return true; } - private String sqlWidgetsForAllAppsWhereUserHasAnyRole(Long userId) { - return "SELECT DISTINCT" + baseSqlToken + " join FN_USER_ROLE ON FN_USER_ROLE.APP_ID = app.APP_ID where FN_USER_ROLE.USER_ID = " - + userId + validAppsFilter; + private List getAdminUserRoles(Long userId, Long appId) { + return fnUserRoleService.getAdminUserRoles(userId, ACCOUNT_ADMIN_ROLE_ID, appId); + } + + private void applyOnboardingWidget(OnboardingWidget onboardingWidget, FieldsValidator fieldsValidator) { + boolean result; + FnWidget widget; + if (onboardingWidget.getId() == null) { + widget = new FnWidget(); + } else { + widget = fnWidgetDao.getOne(onboardingWidget.getId()); + } + widget.setAppId(onboardingWidget.getAppId()); + widget.setName(onboardingWidget.getName()); + widget.setWidth(onboardingWidget.getWidth()); + widget.setHeight(onboardingWidget.getHeight()); + widget.setUrl(onboardingWidget.getUrl()); + result = widget.equals(fnWidgetDao.saveAndFlush(widget)); + if (!result) { + fieldsValidator.setHttpStatusCode((long) HttpServletResponse.SC_INTERNAL_SERVER_ERROR); + } + } + + private void validateOnboardingWidget(OnboardingWidget onboardingWidget, FieldsValidator fieldsValidator) { + List widgets = getWidgets(onboardingWidget); + boolean dublicatedUrl = false; + boolean dublicatedName = false; + for (FnWidget widget : widgets) { + if (onboardingWidget.getId() != null && onboardingWidget.getId().equals(widget.getWidgetId())) { + // widget should not be compared with itself + continue; + } + if (!dublicatedUrl && widget.getUrl().equals(onboardingWidget.getUrl())) { + dublicatedUrl = true; + if (dublicatedName) { + break; + } + } + if (!dublicatedName && widget.getName().equalsIgnoreCase(onboardingWidget.getName()) && widget + .getAppId().equals(onboardingWidget.getAppId())) { + dublicatedName = true; + if (dublicatedUrl) { + break; + } + } + } + if (dublicatedUrl || dublicatedName) { + if (dublicatedUrl) { + fieldsValidator.addProblematicFieldName(urlField); + } + if (dublicatedName) { + fieldsValidator.addProblematicFieldName(nameField); + } + fieldsValidator.setHttpStatusCode((long) HttpServletResponse.SC_CONFLICT); + fieldsValidator.setErrorCode(DUBLICATED_FIELD_VALUE_ECOMP_ERROR); + } + } + + private List getWidgets(final OnboardingWidget onboardingWidget) { + return fnWidgetDao.getForUrlNameAndAppId(onboardingWidget.getUrl(), onboardingWidget.getName(), onboardingWidget.getAppId()).orElse(new ArrayList<>()); + } + + public FieldsValidator deleteOnboardingWidget(FnUser user, Long onboardingWidgetId) { + FieldsValidator fieldsValidator = new FieldsValidator(); + synchronized (syncRests) { + FnWidget widget = fnWidgetDao.getOne(onboardingWidgetId); + if (widget != null && widget.getAppId() != null) { // widget exists + if (!this.isUserAdminOfAppForWidget(adminRolesService.isSuperAdmin(user.getOrgUserId()), user.getUserId(), + widget.getAppId())) { + fieldsValidator.setHttpStatusCode((long) HttpServletResponse.SC_FORBIDDEN); + } else { + fnWidgetDao.deleteById(onboardingWidgetId); + fieldsValidator.setHttpStatusCode( + (long) HttpServletResponse.SC_INTERNAL_SERVER_ERROR); + } + } + } + return fieldsValidator; } - private String sqlWidgetsForAllAppsWhereUserIsAdmin(Long userId) { - return "SELECT" + baseSqlToken + " join FN_USER_ROLE ON FN_USER_ROLE.APP_ID = app.APP_ID where FN_USER_ROLE.USER_ID = " + userId - + " AND FN_USER_ROLE.ROLE_ID = " + ACCOUNT_ADMIN_ROLE_ID + validAppsFilter; + public FnWidget saveOne(final FnWidget widget){ + return fnWidgetDao.saveAndFlush(widget); } }