Разделение кода на уровне сервиса и контроллере - PullRequest
0 голосов
/ 10 ноября 2018

Я написал код для сброса пароля и других частей моего приложения, Я хочу отделить сервисный слой от dao и controller; код моего контроллера:

@RequestMapping(value = "", method = RequestMethod.PUT)
public ResponseModel resetPassword(@Valid @RequestBody AuthenticationRequestModel authenticationRequestModel, HttpServletRequest request) {
    String ip = WebUtils.getClientIp(request);
    Optional<SecuritySMS> securitySMS = securitySMSService.getLastValidSMS(authenticationRequestModel.getMobile());
    if (!securitySMS.isPresent()) {
        return new ResponseModel(messages.get("sms.security.expired"), ResponseModel.ResponseStatus.ERROR);
    }
    SecuritySMS sms = securitySMS.get();
    if (!sms.isConfirmed()) {
        return new ResponseModel(messages.get("sms.security.expired"), ResponseModel.ResponseStatus.ERROR);
    } else if (!sms.getIp().equalsIgnoreCase(ip)) {
        return new ResponseModel(messages.get("sms.security.ip.changed"), ResponseModel.ResponseStatus.ERROR);
    }
    Optional<User> user = userService.findByMobile(sms.getMobile());
    if (!user.isPresent()) {
        return new ResponseModel(messages.get("sms.reset.user.nonexistent"), ResponseModel.ResponseStatus.ERROR);
    }

    userService.updatePassword(user.get(), authenticationRequestModel.getPassword());
    return authHelper.loginWithHttpResponse(authenticationRequestModel);
}

Я путаюсь с переносом кода на сервисный уровень; Является ли приведенный выше подход корректным или какой-то код (например, приведенный ниже) должен перейти на уровень обслуживания? если я перенесу этот код на уровень обслуживания, как я могу получить ответ обратно? Boolean (неприемлемо, потому что я хочу вернуть правильное сообщение пользователю), строка или исключение ?;

String ip = WebUtils.getClientIp(request);
Optional<SecuritySMS> securitySMS = securitySMSService.getLastValidSMS(authenticationRequestModel.getMobile());
if (!securitySMS.isPresent()) {
    return new ResponseModel(messages.get("sms.security.expired"), ResponseModel.ResponseStatus.ERROR);
}
SecuritySMS sms = securitySMS.get();
if (!sms.isConfirmed()) {
    return new ResponseModel(messages.get("sms.security.expired"), ResponseModel.ResponseStatus.ERROR);
} else if (!sms.getIp().equalsIgnoreCase(ip)) {
    return new ResponseModel(messages.get("sms.security.ip.changed"), ResponseModel.ResponseStatus.ERROR);
}
Optional<User> user = userService.findByMobile(sms.getMobile());
if (!user.isPresent()) {
    return new ResponseModel(messages.get("sms.reset.user.nonexistent"), ResponseModel.ResponseStatus.ERROR);
}

1 Ответ

0 голосов
/ 10 ноября 2018

MVS - это просто упрощение и не идеальный подход. Вот почему возникает так много вопросов, подобных этому.

  • Сколько логики должно быть в контроллере?
  • Должна ли модель содержать логику?
  • Должно ли представление содержать логику?

На подобные вопросы очень сложно ответить, но контроллер должен проверять входные данные и перенаправлять их к представлениям при необходимости. Ваш код действительно очень похож на доменную логику, которая должна появиться в сервисе позже, но ее проще контролировать на контроллере. Для предметной логики (она же бизнес-логика, бизнес-правила и знание предметной области) мы можем объяснить ее как логику, которая принимает критически важные для бизнеса решения.

Итак, действительно, вы принимаете решения в своем контроллере, но управление этими решениями в службе усложняет решение. Так что я бы просто оставил его там, так или иначе, в конце концов, никто, кроме вас и вашей группы, не внесет свой вклад в этот код, так что, если вам это удобно, все в порядке.

Но если бы вы переместили свой код, я бы порекомендовал использовать исключения. Сервисы, на мой взгляд, должны возвращать только нужные модели или ресурсы. Лучше обрабатывать ошибки, используя исключения.

...