Информация об изменениях

Сообщение рефакторинг сервисного метода от 29.04.2015 6:16

Изменено 29.04.2015 6:31 Blazkowicz

Проект построен на Spring 4 Framework.

В сервисном методе нужно проверить или пользователь обладает необходимыми разрешениями для выполнения бизнес логики

Вот примерный код который сейчас это делает:

void processProduct() {

if (!SecurityUtils.hasRole("PERMISSION_UPDATE_ANY_PRODUCT")) {
if (SecurityUtils.hasRole("PERMISSION_UPDATE_OWN_PRODUCT")) {
if (!product.getAuthor().equals(user)) {
throw new AccessDeniedException("Access denied, you don't have permission to update other's products");
}
} else {
throw new AccessDeniedException("Access denied, you don't have permissions to update products");
}
}

if (product.getParent() != null) {
Long parentProductId = product.getParent().getId();
Product siblingProduct = productDao.findChildProductByName(parentProductId, name);
if (siblingProduct != null) {
if (!siblingProduct.equals(product)) {
throw new ProductAlreadyExistsException("Parent product already contains a child product with a given name");
}
}
}
.....

doSomeRealBusinessLogic();

}


Здесь проверяется или у пользователя есть разрешение — PERMISSION_UPDATE_ANY_PRODUCT и если есть то все ок, если нету то проверяется или есть разрешение PERMISSION_UPDATE_OWN_PRODUCT и если есть то принадлежит ли Продукт пользователю который пытается совершить над ним действие.

Затем вторая проверка проверяет или еще не содержится такого продукта с таким же именем у отцовского продукта(продуты в системе композитные)

Как можно отрефакторить этот метод и убрать проверки из сервисного метода во что то извне ?
рефакторинг сервисного метода
Проект построен на Spring 4 Framework.

В сервисном методе нужно проверить или пользователь обладает необходимыми разрешениями для выполнения бизнес логики

Вот примерный код который сейчас это делает:

void processProduct() {

        if (!SecurityUtils.hasRole("PERMISSION_UPDATE_ANY_PRODUCT")) {
            if (SecurityUtils.hasRole("PERMISSION_UPDATE_OWN_PRODUCT")) {
                if (!product.getAuthor().equals(user)) {
                    throw new AccessDeniedException("Access denied, you don't have permission to update other's products");
                }
            } else {
                throw new AccessDeniedException("Access denied, you don't have permissions to update products");
            }
        }

        if (product.getParent() != null) {
            Long parentProductId = product.getParent().getId();
            Product siblingProduct = productDao.findChildProductByName(parentProductId, name);
            if (siblingProduct != null) {
                if (!siblingProduct.equals(product)) {
                    throw new ProductAlreadyExistsException("Parent product already contains a child product with a given name");
                }
            }
        }
.....

doSomeRealBusinessLogic();

}


Здесь проверяется или у пользователя есть разрешение — PERMISSION_UPDATE_ANY_PRODUCT и если есть то все ок, если нету то проверяется или есть разрешение PERMISSION_UPDATE_OWN_PRODUCT и если есть то принадлежит ли Продукт пользователю который пытается совершить над ним действие.

Затем вторая проверка проверяет или еще не содержится такого продукта с таким же именем у отцовского продукта(продуты в системе композитные)

Как можно отрефакторить этот метод и убрать проверки из сервисного метода во что то извне ?