Ana içeriğe geç

Messaging, Notes & Push

Bu sayfa, Cınga backend içinde kullanıcıya dönük mesajlaşma, teknik notlar, inbox durumu ve push bildirim altyapısı için kullanılan veri modelini detaylı biçimde açıklar.

Bu katman telemetry veya inventory üretmez; onların ürettiği anlamı kullanıcıya okunabilir ve yönetilebilir biçimde taşır.

Katmanın Amacı

Bu katman şu ihtiyaçları karşılar:

  • cihaz veya kullanıcı bağlamlı sistem mesajı üretmek
  • kullanıcılar arası mesajlaşma tutmak
  • teknik / operasyonel notları saklamak
  • push bildirim şablonlarını merkezi yönetmek
  • okundu, arşivlendi, snooze edildi gibi kullanıcı bazlı inbox durumlarını tutmak

Genel Akış

1. notes

notes, cihaz veya kullanıcı bağlamında serbest biçimli notları tutar.

Neden vardır?

Her önemli bilgi alarm veya measurement değildir. Saha gözlemi, bakım notu, kullanıcıyla konuşma özeti, hatırlatma veya teknik tespit gibi yapılar daha serbest bir veri modeli ister.

Kolonlar

KolonTipNullAnlamı
idinthayırNot anahtarı
device_idvarchar(21)evetNot belirli cihaza aitse
user_idintevetNot belirli kullanıcı bağlamındaysa
titlevarchar(250)evetBaşlık
notetextevetNot içeriği
is_deletedbooleanhayırSoft delete
is_technicalbooleanhayırTeknik not mu
reminder_sentbooleanhayırHatırlatma gönderildi mi
reminder_timetimestampevetHatırlatma zamanı
created_byintevetOluşturan kullanıcı
updated_byintevetGüncelleyen kullanıcı
create_timetimestamphayırOluşturma
update_timetimestamphayırGüncelleme

Örnek kayıt

{
"id": 1,
"device_id": "46000000C47CA670",
"user_id": 1,
"title": "Pompa Kontrolü",
"note": "Kuyu 1 cihazında pompa akım değerleri son kontrolde normal göründü.",
"is_deleted": false,
"is_technical": true,
"reminder_sent": false,
"reminder_time": null,
"created_by": 1,
"updated_by": 1
}

2. inbox

inbox, sistem ve kullanıcı kaynaklı mesajların ana gövde tablosudur.

Neden vardır?

Alarm, offline bildirimi, hoş geldin mesajı, kullanıcı mesajı veya cihaz bazlı operasyon mesajı gibi farklı türler tek bir ortak mesaj kanalı üzerinden yönetilebilir.

Tasarım kararı

Mesaj gövdesi tek yerde oluşur; kullanıcıya özel okuma, klasör ve arşiv durumu ayrı tabloda tutulur. Böylece aynı mesaj birden fazla kullanıcıya farklı okunma durumlarıyla sunulabilir.

Kolonlar

KolonTipNullAnlamı
idbiginthayırMesaj anahtarı
typevarchar(30)hayırMesaj tipi
sender_idintevetMesajı oluşturan kullanıcı
receiver_idintevetDoğrudan kullanıcı hedefi
device_idvarchar(21)evetCihaz bağlamlı mesaj hedefi
titletexthayırBaşlık
messagetexthayırMesaj içeriği
tagsjsonevetKategori, severity vb.
reply_to_idbigintevetYanıt ilişkisi
conversation_idbigintevetKonuşma dizisi
payloadjsonevetŞablon / push parametreleri
push_statebooleanhayırPush gönderildi mi
push_sent_attimestampevetPush zamanı
create_timetimestamphayırOluşturma
update_timetimestamphayırGüncelleme

Önemli not

Bu modelde receiver_id ile device_id aynı anda kullanılmaz. Mesaj ya kullanıcı bazlıdır ya cihaz bağlamlıdır.

Örnek kayıt

{
"id": 2,
"type": "alert",
"sender_id": null,
"receiver_id": null,
"device_id": "46000000C47CA670",
"title": "Pompa Alarmı",
"message": "Cihazda kritik akım alarmı oluştu.",
"tags": { "category": "alarm", "severity": "high" },
"payload": {
"push_template": { "code": "DEVICE_ALARM", "version": 1, "locale": "tr" },
"push_params": { "device_name": "Kuyu 1 PowerStat", "alarm": "Kritik akım alarmı" }
},
"push_state": true,
"push_sent_at": "2026-04-03T10:30:05Z"
}

3. message_read_state

Bu tablo aynı mesajın kullanıcı bazlı okuma, klasör ve görünürlük durumunu tutar.

Neden ayrı tablodur?

Çünkü aynı inbox mesajı bir kullanıcı için okunmuş, başka biri için okunmamış olabilir. Mesaj gövdesi ile kullanıcıya özgü okuma durumu aynı satırda tutulmamalıdır.

Kolonlar

KolonTipNullAnlamı
idbiginthayırDurum anahtarı
message_idbiginthayırİlgili inbox mesajı
user_idinthayırKullanıcı
statusenumhayırunread / read / deleted
folderenumhayırinbox / archived / trash
snooze_untiltimestampevetGörünürlüğü erteleme zamanı
auto_archive_attimestampevetOtomatik arşiv zamanı
pinnedbooleanhayırPinli mi
read_timetimestampevetOkuma zamanı
create_timetimestamphayırOluşturma
update_timetimestamphayırGüncelleme

Örnek kayıt

{
"id": 2,
"message_id": 2,
"user_id": 1,
"status": "unread",
"folder": "inbox",
"snooze_until": null,
"auto_archive_at": "2026-04-10T10:30:00Z",
"pinned": true,
"read_time": null
}

4. push_templates

Push bildirimlerinde tekrar eden metin şablonlarının sözlüğüdür.

Neden vardır?

Push metnini kod içinde dağınık string’lerle üretmek yerine şablonlaştırmak:

  • lokalizasyonu
  • versiyonlamayı
  • tekrar kullanımını kolaylaştırır.

Kolonlar

KolonTipNullAnlamı
idbiginthayırŞablon anahtarı
codevarchar(100)hayırŞablon kodu
versionintevetVersiyon
localevarchar(10)hayırDil/bölge
title_templatetexthayırBaşlık şablonu
message_templatetexthayırMesaj şablonu
create_timetimestamphayırOluşturma
update_timetimestamphayırGüncelleme

Örnek kayıt

{
"id": 2,
"code": "DEVICE_ALARM",
"version": 1,
"locale": "tr",
"title_template": "{{device_name}}",
"message_template": "{{alarm}} oluştu."
}

5. user_inbox_settings

Bu tablo kullanıcı bazlı inbox davranış tercihlerini taşır.

Neden vardır?

Farklı kullanıcılar farklı arşiv, snooze ve pin davranışı isteyebilir. Bu tercihleri kullanıcı tablosunda tutmak yerine ayrı ayar tablosunda saklamak daha temizdir.

Kolonlar

KolonTipNullAnlamı
user_idinthayırKullanıcı
auto_archive_days_unreadinthayırOkunmamış mesajların arşiv süresi
auto_archive_days_readinthayırOkunmuş mesajların arşiv süresi
include_system_in_autobooleanhayırSistem mesajları da arşiv kuralına dahil mi
snooze_allowedbooleanhayırKullanıcı snooze kullanabilir mi
pin_exempts_autobooleanhayırPinli mesajlar otomatik arşivden muaf mı
update_timetimestamphayırGüncelleme

Örnek kayıt

{
"user_id": 1,
"auto_archive_days_unread": 7,
"auto_archive_days_read": 30,
"include_system_in_auto": true,
"snooze_allowed": true,
"pin_exempts_auto": true
}

Katmandaki Temel Tasarım Kararları

Mesaj gövdesi ile kullanıcı durumu ayrıdır

inbox mesajın kendisini taşır; message_read_state ise kullanıcı bazlı okunma ve klasör durumunu taşır.

Teknik not ile sistem mesajı aynı şey değildir

  • notes serbest içerik ve insan odaklı saha bilgisidir
  • inbox ise sistem içinde akışa giren mesaj nesnesidir

Push şablonları merkezi tutulur

Şablon kodu ve locale mantığı push üretimini tekrar kullanılabilir hale getirir.

Sonuç

Messaging, Notes & Push katmanı; telemetry, rule engine ve kullanıcı işlemlerinden doğan anlamı insanlara aktarır. Bu modelde serbest not, inbox mesajı, okuma durumu ve push şablonu aynı deneyim alanında görünse de veri modelinde rolleri ayrı tutulur. Bu ayrım hem esneklik hem de kullanıcı deneyimi açısından önemlidir.