VENTTT.P
68 subscribers
82 photos
28 videos
2 files
6 links
Download Telegram
#прога

Давно не было пет-проектов. Вот Swiply - полноценный клон Tinder. Это Android-приложение с серверно-клиентной архитектурой и бэкендом на Spring Boot. Я повторил почти весь функционал дейтинг-приложений: свайпы, матчи, профили по интересам, работа с геолокацией, активный чат с использованием Redis и безопансостей (sic), сложная авторизация через JWT, модерацию, что тоже важно. Реализовал сразу две БД, что для меня впервые - PostgreSQL и MongoDB. Статусы чата и то, что очень для меня важно: я впервые сделал не монолитные сервисы, а модульный бэкенд, и что еще сложнее - модульный Android. Android на Jetpack Compose, архитектура MVVM. Вот полный стек.

Android — Compose, Material 3, MVVM, многомодульный Gradle (13 модулей), Coroutines/Flow, Hilt, Retrofit, свой STOMP-клиент на OkHttp, Room + Paging 3, DataStore, шифрованное хранилище токенов, FusedLocationProvider, Navigation Compose, кастомные Canvas-иллюстрации. Тесты — JUnit4, MockK, Turbine, Compose UI Test.
Бэкенд — Spring Boot 3, suspend-контроллеры, Spring Security с JWT, JPA, Spring Data MongoDB и Redis, Spring AMQP, WebSocket/STOMP, Thymeleaf, Flyway, springdoc-openapi. Тесты — JUnit 5, MockK, Testcontainers.
Инфраструктура PostgreSQL 16 + PostGIS, MongoDB 7, Redis 7, RabbitMQ с DLQ, MinIO, Docker Compose, GitHub Actions.

Архитектурные решения (ADR-лог)

D1. PostgreSQL + MongoDB вместе. Из ТЗ: Postgres (+PostGIS) источник истины для всего транзакционного; MongoDB только conversations/messages.
D2. geometry(Point,4326) вместо geography в колонке. Hibernate Spatial валидирует geometry-тип без сюрпризов; метровая семантика достигается кастом ::geography в каждом гео-запросе (ST_DWithin, ST_Distance). Поведение идентично, схема дружит с ddl-auto: validate.
D3. EXIF-стрипинг через полный переэнкод. Вместо вырезания EXIF-тегов изображение декодируется и собирается заново (Thumbnailator → JPEG). Метаданные (включая GPS) исчезают by construction, а «полиглоты» (файлы с двойным дном) не переживают переэнкод. Принимаются только JPEG/PNG по magic bytes.
D4. Suspend-контроллеры + блокирующие сервисы. Spring MVC поддерживает suspend-хендлеры; JPA остаётся блокирующим, поэтому паттерн: suspend fun → withContext(Dispatchers.IO) { транзакционный сервис }. @Transactional на suspend-функциях с JPA не работает — транзакции живут только внутри блокирующего слоя.
D5. ASYNC-dispatch разрешён в Spring Security. Suspend-контроллеры завершаются через ASYNC-dispatch, где OncePerRequestFilter (JWT) по умолчанию не выполняется → AuthorizationFilter видел анонима и валил запрос 401-м. Решение из документации: dispatcherTypeMatchers(DispatcherType.ASYNC).permitAll() — аутентификация уже проверена на исходном REQUEST-dispatch.
D6. Установка SecurityContext — только через createEmptyContext() + setContext(). Мутация deferred-контекста (getContext().authentication = …) в Spring Security 6 теряется.
D7. Нормализация пары мэтча — лексикографически по uuid.toString(). UUID.compareTo в Java сравнивает знаково и НЕ совпадает с порядком uuid в PostgreSQL; строковое сравнение hex-представления совпадает с байтовым порядком БД, на котором держится CHECK-констрейнт user_a_id < user_b_id.
D8. Advisory-lock пары при свайпе. pg_advisory_xact_lock(hashtextextended(a:b)) сериализует встречные лайки — дубль мэтча невозможен даже при гонке.
Более тг не дает написать(((

Более подробно в https://github.com/ventilia/Swiply
6❤1
Пусть прога тут тоже будет 😌😌😌
2❤1
❤3
#poster
Вы все моя единственная радость.
Все люди это мозаика, которую собирают бережно, складывая каждый осколок прожитого вместе времени, каждое случайно оброненное слово, каждый образ, оставшийся в памяти, как отпечаток на стекле. Из этих кусочков недосказанных фраз, совместного времени, смеха и общих тайн складывается целостный образ, который не получится воспроизвести заново. Это мозаика ужасно хрупкая и если она разбилась, то новую уже не соберешь
❤‍🔥7❤52
#прога
Я тут сделал сайт для Александра tddsash`а. Получилась очень достойная и красивая работа. Александр очень хороший автор и замечательная личность, И мне приятно наблюдать за его ростом и быть в какой-то степени частью этого роста.
А если вам нужен сайт, лендинг, сервис любого характера или бот, то вы знаете, к кому обращаться.😌😌😌
Вот сам сайт https://tddsash.com
🤩🤩🤩
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
7❤53
☎️📱📱📞?
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5❤2
Please open Telegram to view this post
VIEW IN TELEGRAM
⚡3
Дорогие друзья, мы создали сообщество с нашими товарищами, которые тоже творят (пока далеко не все тут). Нас объединяет общая страсть к творчеству и то, что мы с замечательного чата, который, по крайней мере, для меня что-то значит и сильно вдохновил, и вдохновляет на творчество.
в последнее время я впал в полную творчечкую апатию и столкнулся с недостатком времени, но совсем скоро хоть что-то то и сделаю
💋6❤5⚡3🕊1
Please open Telegram to view this post
VIEW IN TELEGRAM
❤95❤‍🔥22🔥1
Forwarded from .vozderjus// (Vozderjus @)
Media is too big
VIEW IN TELEGRAM
🤩🤩🤩
🤩🤩🤩
./\ El camino nunca se detiene, solo olvida hacia dónde se dirigía, y tú lo olvidas junto con él. \].

// The path never stops, it only forgets where it was heading, and you forget right along with it.

🤩🤩🤩🤩🤩🤩🤩🤩
Сотрудничество: @shotmeinmyeyes


#me@vzdrjs
Please open Telegram to view this post
VIEW IN TELEGRAM
⚡6❤5
Please open Telegram to view this post
VIEW IN TELEGRAM
❤8⚡43
Please open Telegram to view this post
VIEW IN TELEGRAM
❤8❤‍🔥8⚡6