Skip to content
eugene274 edited this page Nov 6, 2016 · 2 revisions

Welcome to the zagar_io wiki!

Основы

обновления/вставку выполняйте с помощью DbHibernate.do(Get)Transactional(). оно реализовано по паттерну, поэтому работает более менее норм транзакция 'ломает' Session. хз, как и почему

Стек

DB - БД DAO занимается данными, не обрабатывая логику Сервис обрабатывает логику, взаимодействует с DAO, и передает результаты другому сервису или API API получает/отправляет информацию пользователю

эскалация возникающих ошибок

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

если это сервис, который взаимодействует с клиентским апи (непосредственно присутствует в сервлетах, LeaderBoardService) то выбрасывать он должен только любого наследника CustomerResponseError. Это специальный класс ошибок, который специально проаннотирован (mixin, customer), чтобы выдавать пользователю причину и код ошибки в красивом виде. если ошибка server-side (отвал базы/хз-что еще), то сразу выбрасывайте InternalError, бо не фиг юзеру знать, что у нас там в кишках Если это неправильно введенные данные, то выдавайте любую другую ошибку типа CustomerResponseError (я там уже кой-какие наваял, можно придумать свои)

итак, если это ошибка server-side записали в LOG.error() -> выбросили InternalError если ошибка пользователя записали в LOG.info() -> выбросили какую-нибудь ошибку с понятным текстом

если это сервис, который взаимодействует с сервисом (dao, например), то он может выкидывать любые ошибки. главное, чтобы они обрабатывались дальше по стеку и не дошли до юзера

UserService

что-то что требует токен. например ProfileManagerService. все его методы (обновление полей, вывод пользовательского профиля) требуют токен чтобы как-то опознать пользователя.

как происходит авторизованный запрос: HTTP запрос с Authorization заголовком ----> AuthenticationFilter ------> API

AuthenticationFilter проверяет токен по базе и в том же запросе выдает юзер ID, по которому дальше его будет узнавать API (на ходу добавляет два кастомных заголовка: токен и пользовательский id) => все методы юзер сервиса должны принимать Long id, либо, как в случае с ProfileManagerService, id передается в конструктор.

AccountService

Обрабатывает логин/логаут/регистрацию. Раньше обновлял имя пользователя, но теперь этим занимается ProfileManagerService. В нем все хорошо, за исключением Token token = usersSignedInReverse.search(4, (u, t) -> { if(u.checkCredentials(login,pass)) return t; else return null; }); if(null != token) return token;

эта часть отвечает за выдачу юзеру такого же токена, какой у него и был, если его сессия не истекла (или он не логаутнулся) эта процедура делается одним hql запросом и, поэтому, частично должна быть перенесена в DAO/TokenService .

Clone this wiki locally