446 Commits

Author SHA1 Message Date
76ab9c72f5 feat(privacy): add private-message permission toggle 2026-03-08 02:56:58 +03:00
f1b2e47df8 feat(notifications): add in-app notification center panel
- add notifications API client
- add notifications modal in chat page header
- show recent notification events with timestamps and count badge
2026-03-08 02:54:16 +03:00
d74e2c08c1 feat(drafts): persist chat drafts in localStorage
- load drafts from localStorage on startup
- write drafts to localStorage on update/clear
- keep per-chat draft restore across page reload
2026-03-08 02:53:32 +03:00
eef89983e0 feat(search): focus and highlight found message in chat
- store focused message id per chat
- scroll to target message and highlight it after search selection
- clear focus automatically after short timeout
2026-03-08 02:53:03 +03:00
874f9da12c fix(realtime): resync active chat messages on websocket reconnect
- on ws reconnect, reload chats and active chat history
- reduce status/history drift after transient disconnects
2026-03-08 02:52:26 +03:00
71d0472337 feat(web-chat): add message history pagination
- add loadMoreMessages with before_id cursor in chat store
- track hasMore/loading state per chat
- add 'Load older messages' control in message list
2026-03-08 02:52:01 +03:00
df79a70baf chore(prod): startup migrations, readiness checks and backend healthcheck
- add backend entrypoint that can run alembic upgrade head on startup
- add RUN_MIGRATIONS_ON_STARTUP setting and compose wiring
- add /health/live and /health/ready endpoints with db+redis checks
- add backend container healthcheck against readiness endpoint
- document readiness and startup migration behavior
2026-03-08 02:50:57 +03:00
74d9163dde fix(media): support voice audio/webm uploads
Some checks failed
CI / test (push) Failing after 18s
- allow audio/webm mime type
- normalize content-type values with codec parameters before validation
- use normalized mime for extension resolution
2026-03-08 02:48:44 +03:00
66158b9070 fix(web): handle blocked users fetch fallback in chat info
Some checks failed
CI / test (push) Failing after 24s
2026-03-08 02:35:08 +03:00
0b4bb19425 feat(chat): add random public_id and fix users blocked route
Some checks failed
CI / test (push) Failing after 20s
- add chats.public_id random identifier with migration 0011
- expose public_id in chat API payloads
- use chat public_id in message search UI label
- fix users router order so /users/blocked no longer conflicts with /users/{user_id}
2026-03-08 02:34:24 +03:00
34edf2bae5 feat(web-media): improve upload/send reliability
Some checks failed
CI / test (push) Failing after 17s
- add retry logic for presigned media upload
- add retry for text send with idempotent client message id
- avoid dropping already sent media message when attachment metadata call fails
2026-03-08 02:20:24 +03:00
159a8ba516 feat(privacy): user blocklist with private chat enforcement
Some checks failed
CI / test (push) Failing after 21s
- add blocked_users table and migration
- add users API: block, unblock, list blocked users
- prevent private chat creation and private messaging when block relation exists
- add block/unblock action in private chat info panel
2026-03-08 02:19:37 +03:00
ea8a50ee05 feat(notifications): per-chat mute settings
Some checks failed
CI / test (push) Failing after 18s
- add chat_notification_settings table and migration
- add chat notifications API (get/update muted)
- skip message notifications for muted recipients
- add mute/unmute control in chat info panel
2026-03-08 02:17:09 +03:00
eddd4bda0b feat(web): per-chat message drafts
Some checks failed
CI / test (push) Failing after 17s
- store unsent draft text per chat in zustand
- restore draft when switching chats
- clear draft after successful send
2026-03-08 02:15:13 +03:00
62390a1727 feat(web): add message search modal (chat/global)
Some checks failed
CI / test (push) Failing after 19s
- add Search action in chat header
- support search in active chat or globally when no chat selected
- show searchable message results and jump to target chat on click
2026-03-08 02:14:26 +03:00
a9e4222062 feat(realtime): add ping/pong heartbeat and watchdog reconnect
Some checks failed
CI / test (push) Failing after 20s
- support ping incoming event and pong outgoing response
- add web heartbeat interval to keep ws alive
- add stale-connection watchdog to force reconnect on missing pong
2026-03-08 02:13:34 +03:00
46dc601c84 feat(realtime): live online/offline events and unified search
Some checks failed
CI / test (push) Failing after 18s
- add websocket events user_online/user_offline
- broadcast presence changes on first connect and final disconnect only
- apply live presence updates in web chat store and realtime hook
- move public discover into unified left search (users + groups/channels)
- remove separate Discover Chats dialog/menu entry
2026-03-08 02:12:11 +03:00
afeb0acbe7 fix(channel): enforce read-only for members and polish chat info
Some checks failed
CI / test (push) Failing after 26s
- block send/forward in channels for member role on backend
- expose my_role in chat payload for client-side permissions
- hide message composer for channel members and show read-only notice
- hide members management sections for private/saved chats in info panel
- return enriched chat detail via serialize_chat_for_user
2026-03-08 02:07:37 +03:00
e6a271f8be feat(chat): add presence metadata and improve web chat core
Some checks failed
CI / test (push) Failing after 22s
- add user last_seen_at with alembic migration and persist on realtime disconnect
- extend chat serialization with private online/last_seen, group members/online, channel subscribers
- add Redis batch presence lookup helper
- update web chat list/header to display status counters and last-seen labels
- improve delivery receipt handling using last_delivered/last_read boundaries
- include chat info panel and related API/type updates
2026-03-08 02:02:09 +03:00
51275692ac fix(web-core): stabilize unread sync and realtime dedup behavior
Some checks failed
CI / test (push) Failing after 22s
- make prependMessage return insertion status for dedup-safe unread increments

- increment unread only on newly inserted incoming messages

- trigger chat list refresh on websocket reconnect to resync unread counters
2026-03-08 01:53:16 +03:00
7003c8e4c3 feat(web): add multi-select batch delete and undo flow
Some checks failed
CI / test (push) Failing after 18s
- add message selection mode from context menu

- support batch delete for me and conditional batch delete for everyone

- add undo snackbar for delete-for-me with delayed backend commit

- add restoreMessages helper in chat store for undo rollback
2026-03-08 01:50:34 +03:00
4ffbfc1e83 feat(web-core): implement unread counters and new-messages divider
Some checks failed
CI / test (push) Failing after 19s
backend:

- add unread_count to ChatRead serialization

- compute unread_count per chat using message_receipts and hidden messages

web:

- add unread badges in chat list

- track unread boundary per chat in store

- show 'New messages' divider in message list

- update realtime flow to increment/clear unread on incoming events
2026-03-08 01:43:27 +03:00
7f15edcb4e feat(core): clear saved chat and add message deletion scopes
Some checks failed
CI / test (push) Failing after 26s
backend:

- add message_hidden table for per-user message hiding

- support DELETE /messages/{id}?for_all=true|false

- implement delete-for-me vs delete-for-all logic by chat type/permissions

- add POST /chats/{chat_id}/clear and route saved chat deletion to clear

web:

- saved messages action changed from delete to clear

- message context menu now supports delete modal: for me / for everyone

- add local store helpers removeMessage/clearChatMessages

- include realtime stability improvements and app error boundary
2026-03-08 01:13:20 +03:00
a42f97962b fix(web): resolve React #310 hook order crash in MessageList
Some checks failed
CI / test (push) Failing after 22s
- move forwardTargets useMemo above conditional early return

- keep hooks call order stable after login/activeChat switch
2026-03-08 01:05:45 +03:00
997598188d fix(web): improve context menu positioning and forward UX
Some checks failed
CI / test (push) Failing after 18s
- render chat/message context menus via portal to document.body

- clamp menu coordinates to viewport while keeping near-cursor placement

- remove visible chat id fallbacks from chat/discover UI

- hide 'delete for everyone' checkbox for channels; show channel-specific hint

- replace forward-by-chat-id prompt with searchable chat picker modal
2026-03-08 01:03:04 +03:00
456595a576 feat: add user display profiles and fix web context menu UX
Some checks failed
CI / test (push) Failing after 17s
backend:

- add required user name and optional bio fields

- extend auth/register and user schemas/services with name/bio

- add alembic migration 0006 with safe backfill name=username

- compute per-user chat display_title for private chats

- keep Saved Messages delete-for-all protections

web:

- registration now includes name

- add profile edit modal (name/username/bio/avatar url)

- show private chat names via display_title

- fix context menus to open near cursor with viewport clamping

- stabilize +/close floating button to remove visual jump
2026-03-08 00:57:02 +03:00
321f918dca fix(web): keep chat context menu within viewport
All checks were successful
CI / test (push) Successful in 21s
- adjust right-click menu coordinates to avoid clipping near screen edges
2026-03-08 00:44:57 +03:00
b9f71b9528 feat: add saved messages, public chat discovery/join, and chat delete options
All checks were successful
CI / test (push) Successful in 19s
- add Saved Messages system chat with dedicated API

- add public group/channel metadata and discover/join endpoints

- add chat delete flow with for_all option and channel-wide delete

- switch message actions to context menu and improve reply/forward visuals

- improve microphone permission handling for voice recording
2026-03-08 00:41:35 +03:00
b5a7d733c6 fix(orm): disambiguate Chat<->Message relationships
All checks were successful
CI / test (push) Successful in 26s
- set explicit foreign_keys for Chat.messages and Message.chat

- resolve mapper initialization error after pinned_message_id fk
2026-03-08 00:31:09 +03:00
e1d0375392 feat: add reply/forward/pin message flow across backend and web
Some checks failed
CI / test (push) Failing after 24s
- add reply_to/forwarded_from message fields and chat pinned_message field

- add forward and pin APIs plus reply support in message create

- wire web actions: Reply, Fwd, Pin and reply composer state

- fix spam policy bug: allow repeated identical messages, keep rate limiting
2026-03-08 00:28:43 +03:00
4d704fc279 feat: add search APIs and telegram-like chats sidebar flow
All checks were successful
CI / test (push) Successful in 24s
- implement chat query filtering and message search endpoints

- add db indexes for search fields

- activate chats search input in web

- replace inline create panel with floating TG-style action menu
2026-03-08 00:19:34 +03:00
0a602e4078 feat(web): redesign chat ui in telegram-like style
All checks were successful
CI / test (push) Successful in 21s
- update overall layout for desktop/mobile chat navigation

- restyle dialogs list, message bubbles and composer

- add atmospheric background and unified panel styling
2026-03-08 00:10:08 +03:00
a4d7294628 feat(chats): add role-based member management APIs
All checks were successful
CI / test (push) Successful in 32s
- add owner/admin/member permission checks

- implement member add/remove, role updates, and leave flow

- add chat title update endpoint for manageable chat types
2026-03-08 00:04:54 +03:00
16a584c6cb feat(web): add telegram-like message status indicators
All checks were successful
CI / test (push) Successful in 21s
- optimistic sending state with pending clock icon

- transition statuses sent -> delivered -> read via realtime events

- render checkmarks next to outgoing message timestamps
2026-03-08 00:01:22 +03:00
f6ad480973 feat: add message reliability foundation
All checks were successful
CI / test (push) Successful in 23s
- implement idempotent message creation via client_message_id

- add persistent delivered/read receipts

- expose /messages/status and wire websocket receipt events

- update web client to send client ids and auto-ack delivered/read
2026-03-07 23:57:35 +03:00
ff6f409c5a feat: improve media delivery and web upload pipeline
All checks were successful
CI / test (push) Successful in 26s
- make minio bucket downloadable for direct media links

- switch object keys to random uuid-based names

- add client-side image compression before upload
2026-03-07 23:49:14 +03:00
81c08a97f6 fix: avoid failing mc cors setup in minio-init
All checks were successful
CI / test (push) Successful in 20s
- configure CORS via MINIO_API_CORS_ALLOW_ORIGIN

- keep minio-init responsible only for bucket creation
2026-03-07 22:55:36 +03:00
5f3a36fce3 fix: repair minio-init cors setup script
All checks were successful
CI / test (push) Successful in 26s
- replace fragile heredoc in compose entrypoint

- use shell-safe printf json for mc cors set
2026-03-07 22:54:30 +03:00
ffd63018d6 fix: make media uploads work behind docker
All checks were successful
CI / test (push) Successful in 26s
- add S3_PUBLIC_ENDPOINT_URL for browser-reachable presigned urls

- support both public/internal file url validation

- configure MinIO bucket CORS in minio-init

- update env examples and docs
2026-03-07 22:52:05 +03:00
f95a0e9727 feat: improve chat realtime and media composer UX
All checks were successful
CI / test (push) Successful in 27s
- add media preview and upload confirmation for image/video

- add upload progress tracking for presigned uploads

- keep voice recording/upload flow with better UI states

- include related realtime/chat updates currently in working tree
2026-03-07 22:46:04 +03:00
9ef9366aca Add username search and improve chat creation UX
All checks were successful
CI / test (push) Successful in 23s
Backend user search:

- Added users search endpoint for @username lookup.

- Implemented repository/service/router support with bounded result limits.

Web chat creation:

- Added API client for /users/search.

- Added NewChatPanel for creating private chats via @username search.

- Added group/channel creation flow from sidebar.

UX refinement:

- Hide message composer when no chat is selected.

- Show explicit placeholder: 'Выберите чат, чтобы начать переписку'.

- Added tsbuildinfo ignore rule.
2026-03-07 22:34:53 +03:00
ab65a8b768 Implement real SMTP delivery and transactional email auth flow
All checks were successful
CI / test (push) Successful in 21s
Email delivery:

- Replaced logging-only email sender with aiosmtplib SMTP implementation.

- Added provider mode switch via EMAIL_PROVIDER (log/smtp).

- Added TLS/SSL and timeout controls for SMTP transport.

Auth registration flow:

- Made register/resend/reset email flows transactional with rollback on delivery failure.

- Return 503 when verification/reset email cannot be delivered.

Configuration:

- Extended settings and env templates for EMAIL_PROVIDER, SMTP_USE_SSL, SMTP_TIMEOUT_SECONDS.

- Updated docker-compose environment mapping for new SMTP variables.
2026-03-07 22:24:22 +03:00
683c8a49e2 Parameterize docker-compose for server deployment
All checks were successful
CI / test (push) Successful in 20s
Compose settings:

- Reworked docker-compose.yml to use environment-variable driven configuration.

- Added shared app env anchors for backend and worker to reduce duplication.

- Made ports, credentials, security limits, SMTP, and storage options configurable.

Production profile:

- Added docker-compose.prod.yml override to close internal service ports.

- Keeps external attack surface minimal for Linux server deployments.

Docs and ops:

- Added .env.docker.example with full variable set for server setup.

- Updated README with quick-start and production launch commands.
2026-03-07 21:58:21 +03:00
2501466c7a Add web client and containerized deployment stack
All checks were successful
CI / test (push) Successful in 19s
Web client:

- Added React + TypeScript + Vite + Tailwind application in web/.

- Implemented auth, chat list, chat messages, typing indicators, file uploads, and voice recording/playback.

- Added typed API layer, Zustand stores, and realtime websocket hook integration.

Containerization:

- Added backend Dockerfile and project .dockerignore.

- Added web multi-stage Dockerfile with nginx static hosting and API/WS reverse proxy.

- Added full docker-compose stack with postgres, redis, minio, backend, worker, mailpit, and web.

- Added MinIO bucket bootstrap init job and updated README with Docker quick-start.
2026-03-07 21:55:50 +03:00
85631b566a Implement security hardening, notification pipeline, and CI test suite
All checks were successful
CI / test (push) Successful in 9m2s
Security hardening:

- Added IP/user rate limiting with Redis-backed counters and fail-open behavior.

- Added message anti-spam controls (per-chat rate + duplicate cooldown).

- Implemented refresh token rotation with JTI tracking and revoke support.

Notification pipeline:

- Added Celery app and async notification tasks for mention/offline delivery.

- Added Redis-based presence tracking and integrated it into realtime connect/disconnect.

- Added notification dispatch from message flow and notifications listing endpoint.

Quality gates and CI:

- Added pytest async integration tests for auth and chat/message lifecycle.

- Added pytest config, test fixtures, and GitHub Actions CI workflow.

- Fixed bcrypt/passlib compatibility by pinning bcrypt version.

- Documented worker and quality-gate commands in README.
2026-03-07 21:46:30 +03:00
a879ba7b50 first commit 2026-03-07 21:31:38 +03:00