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:
{ recipient_id, content }— direct yeni konuşma{ parent_id, teacher_id, class_id, content }— legacy format{ 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 mishow_teacher_read_receipts_to_parent— öğretmen mesajı okuyunca veli görebilir mi- Broadcast sadece
messages.broadcastyetkisi olan staff
Related
- permission-system — messages.view, messages.send, messages.broadcast
- realtime-infrastructure — WebSocket kanalları
- mobile-config-feature-flags — messaging feature flag