-
Notifications
You must be signed in to change notification settings - Fork 0
Home
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, например), то он может выкидывать любые ошибки. главное, чтобы они обрабатывались дальше по стеку и не дошли до юзера
что-то что требует токен. например ProfileManagerService. все его методы (обновление полей, вывод пользовательского профиля) требуют токен чтобы как-то опознать пользователя.
как происходит авторизованный запрос: HTTP запрос с Authorization заголовком ----> AuthenticationFilter ------> API
AuthenticationFilter проверяет токен по базе и в том же запросе выдает юзер ID, по которому дальше его будет узнавать API (на ходу добавляет два кастомных заголовка: токен и пользовательский id) => все методы юзер сервиса должны принимать Long id, либо, как в случае с ProfileManagerService, id передается в конструктор.
Обрабатывает логин/логаут/регистрацию. Раньше обновлял имя пользователя, но теперь этим занимается 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 .