Proje: OkulUp · Hub: OkulUp — Domain

Mesajlaşma Sistemi

Conversation Türleri

ConversationType: 'direct' | 'broadcast' | 'group'
  • direct — veli-öğretmen bire-bir
  • broadcast — öğretmenden tüm sınıfa (sınıf bazlı toplu mesaj)
  • group — (gelecek için hazır)

Reply Policy

ConversationReplyPolicy: 'everyone' | 'teacher_only' | 'no_replies'

mobileConfig.policies.message_reply_default ile okul bazlı varsayılan belirleniyor.

Veri Modeli

Conversation:
- parent_id, teacher_id, class_id — ilişkiler
- conversation_type — tip
- reply_policy — kim cevap verebilir
- unread_count, last_message — computed
- participants: User[]
- messages: Message[]

Message:
- sender_id, content, read_at
- attachment_url, attachment_type, attachment_name — opsiyonel dosya

API Endpoint’leri

GET  /api/conversations                 → liste (parent/teacher)
GET  /api/conversations/:id             → detay + messages
POST /api/messages                      → mesaj gönder (creates/reuses conversation)
POST /api/messages/broadcast            → sınıfa toplu mesaj
GET  /api/messages/direct-recipients   → yazılabilecek kişiler listesi

SendMessage Polymorphism

SendMessageRequest union type:

  1. { recipient_id, content } — direct yeni konuşma
  2. { parent_id, teacher_id, class_id, content } — legacy format
  3. { conversation_id, content } — mevcut konuşmaya cevap

Real-Time

WebSocket ile chat ekranında anlık mesaj: subscribeToConversation(id, { onMessage, onRead, onTyping })

Conversation ekranında useRealtimeMessages() hook’u bunu yönetiyor.

Policy Kontrolleri

  • allow_parent_direct_message — veli direkt mesaj atabilir mi
  • show_teacher_read_receipts_to_parent — öğretmen mesajı okuyunca veli görebilir mi
  • Broadcast sadece messages.broadcast yetkisi olan staff