Попробовал tanstack router вместо react-router, файловый вариант. Очень медленный, по 2 раза рендерит компоненты (на гитхабе есть issue). В общем кажется пока сырой) Из плюсов - дерево роутов наглядно лежит по папкам и файлам. И есть примеры для Router Query
@sergey_labuzov2 күн бұрын
Это хороший опыт для вас, уже можете сравнивать две реализации и выбирать наиболее подходящий вариант. Tanstack router очень похож на роутинг Next.js
@ram09739 күн бұрын
Попробовал сделать Crud для сущности User. Вывожу таблицу пользователей и 3 иконки (исправить, удалить, просмотреть) и действия на них. При удалении вылезает Модальное окно с подтверждением. Также сделал переключатель enabled и при нажатии - срабатывает обработчик, который выводит Chakra Alert - успешно или неуспешно отработал бэкенд. Но получился такой винегрет из тегов Чакры и обработчиков событий, как интересно всё это красиво разложить...
@sergey_labuzov9 күн бұрын
Добрый день. Есть ссылка на репозиторий с кодом?
@ram09738 күн бұрын
@@sergey_labuzov приложил ссылку, но ютуб её удалил 😂👍Я просто видимо забежал вперед.
@sergey_labuzov8 күн бұрын
Тогда переходите в гит ( github.com/SLabuzov/twitter-client-app/issues ) и создавайте новый тикет, в котором указывайте все что пожелаете 😁
@user-yf2er5vr8q10 күн бұрын
спасибо большое - не планируете ли что-то новое с кафкой или ребитом например
@sergey_labuzov10 күн бұрын
Планов много, но времени катастрофически не хватает.
@ivankobyuk838510 күн бұрын
Доброго дня ! 2:36 питання по необхідності робити файл для докер компоуз для БД. У мене на ноуті ОС - Linux/Ubuntu, БД (postgres) вже працює локально, а в терміналі вже створив відповідну БД з кредами. Я так розумію мені операції з докер компоузом не має сенсу робити. Вірно ?
@sergey_labuzov10 күн бұрын
Добрый день! Да, все верно, нужно лишь подключение к БД. Каким способом Вы это реализуете абсолютно не важно
@ivankobyuk838510 күн бұрын
@@sergey_labuzov дякую!
@ram097313 күн бұрын
Котейка скучает 😂👍
@sergey_labuzov12 күн бұрын
Подсказывает)
@ram097313 күн бұрын
При рефакторинге в Идее можно делать Refactor-Move... F6
@sergey_labuzov12 күн бұрын
Можно, Idea вообще мощный инструмент
@ram097314 күн бұрын
А что вы думаете о headless cms, типа Strapi? Там можно набирать как бы таблицы из полей, насколько эта гибкая идея, интересно?
@sergey_labuzov12 күн бұрын
Не использовал инструменты с таким функционалом. В любом случае, если какой-то инструмент упрощает/ускоряет/приносит радость/и т.д. в работе, то почему бы и не пользоваться им. Гибкость зависит от конкретных задач 🙂 Один инструмент может быть гибким для разработчика, которому нужны простые контролы без сложных зависимостей, валидаций, уровней вложенности. А вот для другого разработчика нужны именно эти сложные сценарии, вот уже для него инструмент не будет гибким.
@ram097314 күн бұрын
В Чакре наверное маловато компонентов, по сравнению с Ant, Material, Mantine... Ещё есть Refine, там есть готовые экраны логинов. В любом случае большое спасибо, делаю простейший блог по вашим видео. Только на сессиях, не люблю JWT в голом виде. Идёт тяжело, фронтенд как-то сложнее бэкенда, да ещё и параллельно надо TypeScript учить. Такое ощущение, что всё учишься, и никогда не начнёшь уже что-то делать. И забывается то что учил в начале 🤣 На явараше отучился год, закончил курс, потом учился на JavaBegin, там делал пример с Keycloak/Angular. И ещё на htmlacademy, и видеокурсы нескончаемые
@sergey_labuzov12 күн бұрын
Учиться приходиться постоянно 🙂. Так же весьма достойный внимания ресурс www.jhipster.tech Если раньше не сталкивались, очень рекомендую.
@sergey_labuzov12 күн бұрын
Очень правильное решение, придумать сложную, объемную задачу и реализовать ее. В любом случае, при написании кода столкнетесь с ситуацией, когда решение заставит перелопатить множество источников. После этого знания останутся в памяти на долгие годы 🙂 Курсы хорошо, но практика показывает, что простое перенабирание кода за преподавателем очень редко становится «знаниями на долгие годы»
@ram097312 күн бұрын
@@sergey_labuzov я его видел, результат показался переусложненным...
@sergey_labuzov12 күн бұрын
Мне в свое время понравился данный ресурс: internetingishard.netlify.app
@ram097312 күн бұрын
@@sergey_labuzov спасибо
@eduardklygunov141216 күн бұрын
спасибо большое за видео!
@mishaprokopovich525317 күн бұрын
замечательные видео, потихонечку смотрю, узнаю новые приемы и возможности
@qqU2vertigo25 күн бұрын
Вопрос по бэку: Если у меня запрос возвращает список элементов, в которых одно поле может иметь значение, а может отсутствовать. И когда оно отсутствует, то я в него проставляю значение null. Это подстановка происходит вот так: return this.service.findNumberById(id).orElse(null); Правильно ли я это делаю, используя orElse(null) или лучше это делать иначе?
@sergey_labuzov25 күн бұрын
Добрый вечер. Можете в репозитории создать тикет и прикрепить фрагмент Вашего кода? (github.com/SLabuzov/twitter/issues )
@qqU2vertigo25 күн бұрын
@@sergey_labuzov к сожалению не смогу, так как на основе вашего курса начал делать свой проект для работы, а удаленка закрыта для переноса всего, даже кода)
@sergey_labuzov25 күн бұрын
Можно сделать снимок экрана )) 1. Да, так можно обрабатывать null значения. 2. "запрос возвращает список элементов, в которых одно поле может иметь значение, а может отсутствовать" - правильно ли я понимаю, что есть список id, которые Вы перебираете запросами this.service.findNumberById(id) ?
@qqU2vertigo24 күн бұрын
@@sergey_labuzov что то я про скриншоты совсем не подумал, в след раз так и сделаю) 2. Да, есть таблица со статусами номеров телефонов, номера в ней не храню, они лежат в другой таблице, с которой связаны через ключи. На выходе получаю вот такой список: [{ "id": 6, "phoneNumber": "79999999990", "numberStatus": { "id": 1, "phoneNumber": { "id": 6, "number": "79999999990" }, "phoneModels": { "id": 5, "model": "Test model" }, "lastChangeTimestamp": "2024-04-27T16:22:38.421315" } }, { "id": 7, "phoneNumber": "79999999992", "numberStatus": null }]
@sergey_labuzov24 күн бұрын
1.Мне кажется более эффективным способом будет запрашивать данные через список id-шников. 2. Выглядит так, что phoneNumber вложен в numberStatus (циклическая зависимость)
@mishaprokopovich5253Ай бұрын
Отличный прием с как мы [ищем UserAccount по username из Authentication]-->[...Api]-->[создаем UserProfile по id из ...Api], беру на заметку
@user-iu6yz6ck6hАй бұрын
Спасибо за видео. Очень полезно
@scalar3513Ай бұрын
@sergey_labuzov на 26:52 во время тестового прогона у меня status 401, не получается создать пользователя в чем может быть проблема, код вроде идентичный..
@sergey_labuzovАй бұрын
Добрый день. Чтобы мне было проще понять в чем причина, предлагаю Вам создать новый issue (github.com/SLabuzov/twitter/issues) и приложить свои конфиги с скрины.
@vladimirsolovyov940024 күн бұрын
была такая же проблема. в SecurityConfig добавил для нового маппинга следующую строчку .requestMatchers("/api/v1/user-profiles").permitAll() автор @sergey_labuzov , подскажите, на сколько это верное решение? а то spring security не дает без пермишена на этот маппинг запросы слать :)
@sergey_labuzov23 күн бұрын
Добрый день. Это приватный эндпоинт, скорее всего просто не добавили креды (вкладка Authorization в Postman) по аналогии предыдущего видео.
@mishaprokopovich5253Ай бұрын
отлично по шагам рассказал как настроить приложение, что для чего необходимо без лишних замудренных настроек, спасибо
@scalar3513Ай бұрын
считается ли best practise использовать @RequiredArgsConstructor вместо конструктора?
@sergey_labuzovАй бұрын
Скорее это будет лишь в рамках проектной команды разработчиков. Да и не как "best practice", а как "code convention"
@user-iu6yz6ck6hАй бұрын
Большое спасибо за видео!
@AndreyAndrey-nx6uj2 ай бұрын
Благодарю
@webbnba2 ай бұрын
Спасибо, но фронт пока сложновато заходит!
@sergey_labuzov2 ай бұрын
Добрый день! Какую часть функционала по фронту нужно пояснить?
@insafsagirov7582 ай бұрын
Здравствуйте! что лучше использовать для поля дата_создания: @PrePersist private void init() { createTimestamp = Instant.now(); } ИЛИ @EntityListeners(AuditingEntityListener.class) (показано на видео 25:15)?
@sergey_labuzov2 ай бұрын
Добрый вечер! "Под капотом" вариант @EntityListeners(AuditingEntityListener.class) использует @PrePersist. Плюс добавлены некоторые проверки на валидность. Поэтому я считаю более безопасным будет использование именно @EntityListeners(AuditingEntityListener.class).
@ram09732 ай бұрын
Всё классно, но имхо JWT в чистом виде связан с кучей уязвимостей. CSRF отключен, это плохо (в OAuth не зря его аналог есть). И невозможно отозвать токен. Имхо лучше уж сессии с secured http-only cookie или OAuth (лучше с BFF). Но для примера норм. Поправьте плиз, если я не прав.
@sergey_labuzov2 ай бұрын
Все верно. Вообще с безопасностью может быть все очень сложно, настройкой только этого функционала могут и должны заниматься специалисты с соответствующими знаниями, сертификациями. В рамках этого проекта используется JWT в чистом виде. Чуть позже докрутим некоторые доп механизмы защиты. Плюс нужно понимать, что любую защиту можно сломать 😉. Нужно постепенно повышать защищенность проекта по мере развития этого проекта. Я придерживаюсь такого подхода 🙂
@hurricane-rus2 ай бұрын
Смотрите видео внимательно! Как оказалось, в файле с миграцией --changeset и --rollback - это не просто комментарии, а управляющие команды Liquibase. Если их не добавить, Liquibase не увидит файл как миграцию.
@sergey_labuzov2 ай бұрын
Добрый вечер. Для кого предназначен Ваш комментарий?)
@hurricane-rus2 ай бұрын
Для тех, кто пишет код вручную и обычно игнорирует то, что похоже на лишние комментарии - а потом удивляется, почему миграция не работает без этого "комментария")
@m3hdim3hdi2 ай бұрын
Thank you so much but how can i use liquibase migrations in test container
@sergey_labuzov2 ай бұрын
in case you added testcontainers, liquibase will use this datasource when running tests.
@eduardklygunov14122 ай бұрын
Спасибо большое за видео! Надеюсь не забросите это дело, у вас талант да и на ютубе очень мало настолько полезной прикладной информации (я в целом про весь плейлист с проектом)
@qqU2vertigo2 ай бұрын
Это очень круто, спасибо за видео. Но подскажи, пожалуйста, где можно посмотреть примеры элементов, которые верстаем? Есть ли у Vite подобная документация с примерами реализаций компонентов, как у Fluent UI?
@sergey_labuzov2 ай бұрын
Добрый день. Да, у Chakra UI есть документация с примерами: chakra-ui.com/docs/components
@qqU2vertigo2 ай бұрын
@@sergey_labuzov вау! то, что надо, спасибо!
@qqU2vertigo2 ай бұрын
@@sergey_labuzov вау! то, что надо. Спасибо!
@arrnel943 ай бұрын
Столкнулся с ошибкой: Прикрутил несколько методов и указал свободный доступ по эндпоинту в SecurityConfig: Получения пользователя; Получение всех пользователей; Редактирование пользователя; Удаление пользователя; После добавления @Transactional в UserDetailsServiceImpl, корректно работали методы из DemoController. А из UserController, все кроме создания пользователя падали с ошибкой: "failed to lazily initialize a collection of role: jobHunter.security.model.User.authorities: could not initialize proxy - no Session". Пальцем в небо, решил проблему добавлением @Transactional в UserUseCaseFacade. Не знаю корректен ли данный "fix", но с @EntityGraph и FetchType.EAGER такой проблемы не было.
@sergey_labuzov3 ай бұрын
Все очень просто. Если необходимо замапить составную энтити, в которой связи объявлены как Lazy, тогда вешаем аннотацию @Transactional над соответствующим сервисом. Остальные способы (@EntityGraph и FetchType.EAGER) используются только в крайнем необходимости, особенно FetchType.EAGER. Данные способы формируют запрос, который сразу вытягивает все связные объекты из БД.
@user-yf2er5vr8q3 ай бұрын
а будет еще что-то новое по спрингу?
@sergey_labuzov3 ай бұрын
Да, конечно. Немного подтянем фронт и дальше будем в параллельном режиме реализовывать функционал на бэке и фронте
@andreyko_o90143 ай бұрын
вот мы добавили поле followers в userprofile 20:33, но в миграциях мы ничего не меняли,могли бы объяснить
@sergey_labuzov3 ай бұрын
Добрый день. Все очень просто, в данном примере в классе UserProfile всего лишь явно прописали связь между UserProfile и Subscription (это обычный внешний ключ). Он был сформирован в миграции changelog-create-twitter-subscriptions-table.sql (constraint followed__user_profile__fk)
@alexandr60553 ай бұрын
Спасибо, отличный урок
@webbnba3 ай бұрын
Спасибо, очень полезно и учит работе с документацией.
@iuseronline3 ай бұрын
Интересненько)
@webbnba3 ай бұрын
Подскажите, как правильно откатить changeset? Создать новый с командами drop, alter и т.д.
@sergey_labuzov3 ай бұрын
Для таких задач логичнее всего будет подключить gradle liquibase plugin. И воспользоваться командой rollbackCount.
@sergey_labuzov3 ай бұрын
Если данный вопрос для Вас представляет интерес, могу в следующем видео об этом немножко рассказать
@user-yf2er5vr8q4 ай бұрын
cупер пупер видео- лучшие
@user-yf2er5vr8q4 ай бұрын
cпасибо очень понравилось очень мало в ютубе подобного, ждем какой-то следующий больший проект
@knotty10674 ай бұрын
Круто, жду некст видос, фронт будем писать?
@sergey_labuzov4 ай бұрын
И фронт обязательно напишем 🙂
@user-sn9rj1dn1b4 ай бұрын
Спасибо за лекцию🔥
@knotty10674 ай бұрын
очень интересно и информативно, продолжай в том же духе!
@user-pt6vo2kp7c5 ай бұрын
Ты при супер! Может есть ссылочка на похожий проект с мавеном?
@sergey_labuzov4 ай бұрын
добрый вечер! похожего проекта с мавеном нет, но его не должно быть сложно адаптировать
@sergey_labuzov4 ай бұрын
@user-pt6vo2kp7c получилось адаптировать под мавен?
@qqU2vertigo5 ай бұрын
Привет, с толкнулся с проблемой: ValidationFailedException: Validation Failed: 1 changesets check sum сразу после внесения комманд с созданием нового столбца. В моем понимании проблема в том, что внес изменения в файл .sql, который уже исполнялся. Гугл подсказывает 4 вида решения проблем: 1. clearCheckSums 2. runOnChange attribute 3. runAlways attribute 4. The <validCheckSum> attribute Чтобы ты посоветовал из этого использовать?)
@sergey_labuzov5 ай бұрын
Привет. Каждое новое изменение должно быть оформлено новым changesets. Собственно это и будет самым правильным решением)
@qqU2vertigo5 ай бұрын
@@sergey_labuzov понимаю, но по неизвестной мне причине ошибка продолжала возникать, пробовал копипастом перенести команды из твоего гита, думал может что то пропустил(точку с запятой или еще что). Решить проблему не удалось, поэтому пересоздал базу) Надеюсь больше такого не случится, да и буду впредь более внимательным
@sergey_labuzov5 ай бұрын
В любом случае, если возникают вопросы по проекту, смело создавайте тикет в гите и уже там предметно получится все вопросы порешать
@respecktpro29545 ай бұрын
Спасибо за ваш труд!
@user-qt8eu7bi5d5 ай бұрын
Огромное спасбо за видео. Оказывается, Swagger может быть не только болью. Я когда сам с ним разбирался - потратил кучу времени и сил. P.S. вопрос не по теме - почему вы не используете автоимпорт в IDE? Когда вариантов для импорта класса один - происходит автоимпорт. Если больше - тогда надо руками выбирать.
@sergey_labuzov5 ай бұрын
"P.S. вопрос не по теме - почему вы не используете автоимпорт в IDE?" -- Это все моя лень. Спасибо за замечание, подкрутил настройки в IDE.
@user-qt8eu7bi5d5 ай бұрын
Спасибо за видео. А я говорил, что jacoco на 8.5 градл не налазил со старым способом конфигурации )
@inspiredsamat5 ай бұрын
А при регистраций юзеров от очередей (как я понял это кафка), как наш код является расширяемым? Нам же нужно будет менять метод register().
@sergey_labuzov5 ай бұрын
При использовании очередей нужно будет добавить лишь соответствующего слушателя Consumer, который будет получать RegisterRequest, аналогично UserAccountController. И все, "менять" ничего в register() не нужно.
@inspiredsamat5 ай бұрын
🔥🔥🔥
@fishman8525 ай бұрын
Все видео отличные. Даже, пожалуй, одни из лучших среди туториалов по спрингу. Единственное, подшаманить бы с положением микрофона, т.к. если слушать в наушниках, звук печатания и вибрации стола очень громкий, на столько что отдает в голову.
@sergey_labuzov5 ай бұрын
Спасибо за обратную связь! По звуку буду что-то думать.
@inspiredsamat5 ай бұрын
Коммент для продвижения
@user-yf2er5vr8q5 ай бұрын
спасибо большое буду делать ваш проект-пробовать
@inspiredsamat5 ай бұрын
А вы создали базу данных отдельно? У меня пишет база данных не существует
@sergey_labuzov5 ай бұрын
Нет, она сама создается. После инициализации кластер будет содержать базу данных с именем, которое указали для переменной POSTGRES_DB в docker-compose.yml файле.
@inspiredsamat5 ай бұрын
@@sergey_labuzov Делаю все как вы, но почему то пишет twitter_db does not exist. Не знаете почему?
@sergey_labuzov5 ай бұрын
Проще всего будет в ткрминале перейти в директорию с docker-compose.yml файлом. Далее выполнить две команды: 1. docker compose down 2. docker compose up -d Если проблема не пофиксится, предлагаю создать issue на гитхабе и будем разбираться
@user-qt8eu7bi5d5 ай бұрын
Если можно, вопрос по пользовательскому аватару: Возможно ли реализовать функционал загрузки аватара пользователя на сервер приложения и использования внутренней ссылки(т.е. запись этой ссылки в поле image_link БД?)
@sergey_labuzov5 ай бұрын
Добрый день! И такая реализация имеет право на жизнь.
Пікірлер
Попробовал tanstack router вместо react-router, файловый вариант. Очень медленный, по 2 раза рендерит компоненты (на гитхабе есть issue). В общем кажется пока сырой) Из плюсов - дерево роутов наглядно лежит по папкам и файлам. И есть примеры для Router Query
Это хороший опыт для вас, уже можете сравнивать две реализации и выбирать наиболее подходящий вариант. Tanstack router очень похож на роутинг Next.js
Попробовал сделать Crud для сущности User. Вывожу таблицу пользователей и 3 иконки (исправить, удалить, просмотреть) и действия на них. При удалении вылезает Модальное окно с подтверждением. Также сделал переключатель enabled и при нажатии - срабатывает обработчик, который выводит Chakra Alert - успешно или неуспешно отработал бэкенд. Но получился такой винегрет из тегов Чакры и обработчиков событий, как интересно всё это красиво разложить...
Добрый день. Есть ссылка на репозиторий с кодом?
@@sergey_labuzov приложил ссылку, но ютуб её удалил 😂👍Я просто видимо забежал вперед.
Тогда переходите в гит ( github.com/SLabuzov/twitter-client-app/issues ) и создавайте новый тикет, в котором указывайте все что пожелаете 😁
спасибо большое - не планируете ли что-то новое с кафкой или ребитом например
Планов много, но времени катастрофически не хватает.
Доброго дня ! 2:36 питання по необхідності робити файл для докер компоуз для БД. У мене на ноуті ОС - Linux/Ubuntu, БД (postgres) вже працює локально, а в терміналі вже створив відповідну БД з кредами. Я так розумію мені операції з докер компоузом не має сенсу робити. Вірно ?
Добрый день! Да, все верно, нужно лишь подключение к БД. Каким способом Вы это реализуете абсолютно не важно
@@sergey_labuzov дякую!
Котейка скучает 😂👍
Подсказывает)
При рефакторинге в Идее можно делать Refactor-Move... F6
Можно, Idea вообще мощный инструмент
А что вы думаете о headless cms, типа Strapi? Там можно набирать как бы таблицы из полей, насколько эта гибкая идея, интересно?
Не использовал инструменты с таким функционалом. В любом случае, если какой-то инструмент упрощает/ускоряет/приносит радость/и т.д. в работе, то почему бы и не пользоваться им. Гибкость зависит от конкретных задач 🙂 Один инструмент может быть гибким для разработчика, которому нужны простые контролы без сложных зависимостей, валидаций, уровней вложенности. А вот для другого разработчика нужны именно эти сложные сценарии, вот уже для него инструмент не будет гибким.
В Чакре наверное маловато компонентов, по сравнению с Ant, Material, Mantine... Ещё есть Refine, там есть готовые экраны логинов. В любом случае большое спасибо, делаю простейший блог по вашим видео. Только на сессиях, не люблю JWT в голом виде. Идёт тяжело, фронтенд как-то сложнее бэкенда, да ещё и параллельно надо TypeScript учить. Такое ощущение, что всё учишься, и никогда не начнёшь уже что-то делать. И забывается то что учил в начале 🤣 На явараше отучился год, закончил курс, потом учился на JavaBegin, там делал пример с Keycloak/Angular. И ещё на htmlacademy, и видеокурсы нескончаемые
Учиться приходиться постоянно 🙂. Так же весьма достойный внимания ресурс www.jhipster.tech Если раньше не сталкивались, очень рекомендую.
Очень правильное решение, придумать сложную, объемную задачу и реализовать ее. В любом случае, при написании кода столкнетесь с ситуацией, когда решение заставит перелопатить множество источников. После этого знания останутся в памяти на долгие годы 🙂 Курсы хорошо, но практика показывает, что простое перенабирание кода за преподавателем очень редко становится «знаниями на долгие годы»
@@sergey_labuzov я его видел, результат показался переусложненным...
Мне в свое время понравился данный ресурс: internetingishard.netlify.app
@@sergey_labuzov спасибо
спасибо большое за видео!
замечательные видео, потихонечку смотрю, узнаю новые приемы и возможности
Вопрос по бэку: Если у меня запрос возвращает список элементов, в которых одно поле может иметь значение, а может отсутствовать. И когда оно отсутствует, то я в него проставляю значение null. Это подстановка происходит вот так: return this.service.findNumberById(id).orElse(null); Правильно ли я это делаю, используя orElse(null) или лучше это делать иначе?
Добрый вечер. Можете в репозитории создать тикет и прикрепить фрагмент Вашего кода? (github.com/SLabuzov/twitter/issues )
@@sergey_labuzov к сожалению не смогу, так как на основе вашего курса начал делать свой проект для работы, а удаленка закрыта для переноса всего, даже кода)
Можно сделать снимок экрана )) 1. Да, так можно обрабатывать null значения. 2. "запрос возвращает список элементов, в которых одно поле может иметь значение, а может отсутствовать" - правильно ли я понимаю, что есть список id, которые Вы перебираете запросами this.service.findNumberById(id) ?
@@sergey_labuzov что то я про скриншоты совсем не подумал, в след раз так и сделаю) 2. Да, есть таблица со статусами номеров телефонов, номера в ней не храню, они лежат в другой таблице, с которой связаны через ключи. На выходе получаю вот такой список: [{ "id": 6, "phoneNumber": "79999999990", "numberStatus": { "id": 1, "phoneNumber": { "id": 6, "number": "79999999990" }, "phoneModels": { "id": 5, "model": "Test model" }, "lastChangeTimestamp": "2024-04-27T16:22:38.421315" } }, { "id": 7, "phoneNumber": "79999999992", "numberStatus": null }]
1.Мне кажется более эффективным способом будет запрашивать данные через список id-шников. 2. Выглядит так, что phoneNumber вложен в numberStatus (циклическая зависимость)
Отличный прием с как мы [ищем UserAccount по username из Authentication]-->[...Api]-->[создаем UserProfile по id из ...Api], беру на заметку
Спасибо за видео. Очень полезно
@sergey_labuzov на 26:52 во время тестового прогона у меня status 401, не получается создать пользователя в чем может быть проблема, код вроде идентичный..
Добрый день. Чтобы мне было проще понять в чем причина, предлагаю Вам создать новый issue (github.com/SLabuzov/twitter/issues) и приложить свои конфиги с скрины.
была такая же проблема. в SecurityConfig добавил для нового маппинга следующую строчку .requestMatchers("/api/v1/user-profiles").permitAll() автор @sergey_labuzov , подскажите, на сколько это верное решение? а то spring security не дает без пермишена на этот маппинг запросы слать :)
Добрый день. Это приватный эндпоинт, скорее всего просто не добавили креды (вкладка Authorization в Postman) по аналогии предыдущего видео.
отлично по шагам рассказал как настроить приложение, что для чего необходимо без лишних замудренных настроек, спасибо
считается ли best practise использовать @RequiredArgsConstructor вместо конструктора?
Скорее это будет лишь в рамках проектной команды разработчиков. Да и не как "best practice", а как "code convention"
Большое спасибо за видео!
Благодарю
Спасибо, но фронт пока сложновато заходит!
Добрый день! Какую часть функционала по фронту нужно пояснить?
Здравствуйте! что лучше использовать для поля дата_создания: @PrePersist private void init() { createTimestamp = Instant.now(); } ИЛИ @EntityListeners(AuditingEntityListener.class) (показано на видео 25:15)?
Добрый вечер! "Под капотом" вариант @EntityListeners(AuditingEntityListener.class) использует @PrePersist. Плюс добавлены некоторые проверки на валидность. Поэтому я считаю более безопасным будет использование именно @EntityListeners(AuditingEntityListener.class).
Всё классно, но имхо JWT в чистом виде связан с кучей уязвимостей. CSRF отключен, это плохо (в OAuth не зря его аналог есть). И невозможно отозвать токен. Имхо лучше уж сессии с secured http-only cookie или OAuth (лучше с BFF). Но для примера норм. Поправьте плиз, если я не прав.
Все верно. Вообще с безопасностью может быть все очень сложно, настройкой только этого функционала могут и должны заниматься специалисты с соответствующими знаниями, сертификациями. В рамках этого проекта используется JWT в чистом виде. Чуть позже докрутим некоторые доп механизмы защиты. Плюс нужно понимать, что любую защиту можно сломать 😉. Нужно постепенно повышать защищенность проекта по мере развития этого проекта. Я придерживаюсь такого подхода 🙂
Смотрите видео внимательно! Как оказалось, в файле с миграцией --changeset и --rollback - это не просто комментарии, а управляющие команды Liquibase. Если их не добавить, Liquibase не увидит файл как миграцию.
Добрый вечер. Для кого предназначен Ваш комментарий?)
Для тех, кто пишет код вручную и обычно игнорирует то, что похоже на лишние комментарии - а потом удивляется, почему миграция не работает без этого "комментария")
Thank you so much but how can i use liquibase migrations in test container
in case you added testcontainers, liquibase will use this datasource when running tests.
Спасибо большое за видео! Надеюсь не забросите это дело, у вас талант да и на ютубе очень мало настолько полезной прикладной информации (я в целом про весь плейлист с проектом)
Это очень круто, спасибо за видео. Но подскажи, пожалуйста, где можно посмотреть примеры элементов, которые верстаем? Есть ли у Vite подобная документация с примерами реализаций компонентов, как у Fluent UI?
Добрый день. Да, у Chakra UI есть документация с примерами: chakra-ui.com/docs/components
@@sergey_labuzov вау! то, что надо, спасибо!
@@sergey_labuzov вау! то, что надо. Спасибо!
Столкнулся с ошибкой: Прикрутил несколько методов и указал свободный доступ по эндпоинту в SecurityConfig: Получения пользователя; Получение всех пользователей; Редактирование пользователя; Удаление пользователя; После добавления @Transactional в UserDetailsServiceImpl, корректно работали методы из DemoController. А из UserController, все кроме создания пользователя падали с ошибкой: "failed to lazily initialize a collection of role: jobHunter.security.model.User.authorities: could not initialize proxy - no Session". Пальцем в небо, решил проблему добавлением @Transactional в UserUseCaseFacade. Не знаю корректен ли данный "fix", но с @EntityGraph и FetchType.EAGER такой проблемы не было.
Все очень просто. Если необходимо замапить составную энтити, в которой связи объявлены как Lazy, тогда вешаем аннотацию @Transactional над соответствующим сервисом. Остальные способы (@EntityGraph и FetchType.EAGER) используются только в крайнем необходимости, особенно FetchType.EAGER. Данные способы формируют запрос, который сразу вытягивает все связные объекты из БД.
а будет еще что-то новое по спрингу?
Да, конечно. Немного подтянем фронт и дальше будем в параллельном режиме реализовывать функционал на бэке и фронте
вот мы добавили поле followers в userprofile 20:33, но в миграциях мы ничего не меняли,могли бы объяснить
Добрый день. Все очень просто, в данном примере в классе UserProfile всего лишь явно прописали связь между UserProfile и Subscription (это обычный внешний ключ). Он был сформирован в миграции changelog-create-twitter-subscriptions-table.sql (constraint followed__user_profile__fk)
Спасибо, отличный урок
Спасибо, очень полезно и учит работе с документацией.
Интересненько)
Подскажите, как правильно откатить changeset? Создать новый с командами drop, alter и т.д.
Для таких задач логичнее всего будет подключить gradle liquibase plugin. И воспользоваться командой rollbackCount.
Если данный вопрос для Вас представляет интерес, могу в следующем видео об этом немножко рассказать
cупер пупер видео- лучшие
cпасибо очень понравилось очень мало в ютубе подобного, ждем какой-то следующий больший проект
Круто, жду некст видос, фронт будем писать?
И фронт обязательно напишем 🙂
Спасибо за лекцию🔥
очень интересно и информативно, продолжай в том же духе!
Ты при супер! Может есть ссылочка на похожий проект с мавеном?
добрый вечер! похожего проекта с мавеном нет, но его не должно быть сложно адаптировать
@user-pt6vo2kp7c получилось адаптировать под мавен?
Привет, с толкнулся с проблемой: ValidationFailedException: Validation Failed: 1 changesets check sum сразу после внесения комманд с созданием нового столбца. В моем понимании проблема в том, что внес изменения в файл .sql, который уже исполнялся. Гугл подсказывает 4 вида решения проблем: 1. clearCheckSums 2. runOnChange attribute 3. runAlways attribute 4. The <validCheckSum> attribute Чтобы ты посоветовал из этого использовать?)
Привет. Каждое новое изменение должно быть оформлено новым changesets. Собственно это и будет самым правильным решением)
@@sergey_labuzov понимаю, но по неизвестной мне причине ошибка продолжала возникать, пробовал копипастом перенести команды из твоего гита, думал может что то пропустил(точку с запятой или еще что). Решить проблему не удалось, поэтому пересоздал базу) Надеюсь больше такого не случится, да и буду впредь более внимательным
В любом случае, если возникают вопросы по проекту, смело создавайте тикет в гите и уже там предметно получится все вопросы порешать
Спасибо за ваш труд!
Огромное спасбо за видео. Оказывается, Swagger может быть не только болью. Я когда сам с ним разбирался - потратил кучу времени и сил. P.S. вопрос не по теме - почему вы не используете автоимпорт в IDE? Когда вариантов для импорта класса один - происходит автоимпорт. Если больше - тогда надо руками выбирать.
"P.S. вопрос не по теме - почему вы не используете автоимпорт в IDE?" -- Это все моя лень. Спасибо за замечание, подкрутил настройки в IDE.
Спасибо за видео. А я говорил, что jacoco на 8.5 градл не налазил со старым способом конфигурации )
А при регистраций юзеров от очередей (как я понял это кафка), как наш код является расширяемым? Нам же нужно будет менять метод register().
При использовании очередей нужно будет добавить лишь соответствующего слушателя Consumer, который будет получать RegisterRequest, аналогично UserAccountController. И все, "менять" ничего в register() не нужно.
🔥🔥🔥
Все видео отличные. Даже, пожалуй, одни из лучших среди туториалов по спрингу. Единственное, подшаманить бы с положением микрофона, т.к. если слушать в наушниках, звук печатания и вибрации стола очень громкий, на столько что отдает в голову.
Спасибо за обратную связь! По звуку буду что-то думать.
Коммент для продвижения
спасибо большое буду делать ваш проект-пробовать
А вы создали базу данных отдельно? У меня пишет база данных не существует
Нет, она сама создается. После инициализации кластер будет содержать базу данных с именем, которое указали для переменной POSTGRES_DB в docker-compose.yml файле.
@@sergey_labuzov Делаю все как вы, но почему то пишет twitter_db does not exist. Не знаете почему?
Проще всего будет в ткрминале перейти в директорию с docker-compose.yml файлом. Далее выполнить две команды: 1. docker compose down 2. docker compose up -d Если проблема не пофиксится, предлагаю создать issue на гитхабе и будем разбираться
Если можно, вопрос по пользовательскому аватару: Возможно ли реализовать функционал загрузки аватара пользователя на сервер приложения и использования внутренней ссылки(т.е. запись этой ссылки в поле image_link БД?)
Добрый день! И такая реализация имеет право на жизнь.
Спасибо большое!