Zamanlanmış İşler ve Kafka Dinleyiciler
Zamanlanmış İşler (Cron Jobs)
Giriş noktası: src/jobs/system/index.js — startSystemCronJobs()
Uygulama başlarken tüm job'lar node-cron ile zamanlanır. 7 job aynı anda aktif çalışır.
İş Tablosu
| Dosya | Zamanlama | Ne Zaman | Açıklama |
|---|---|---|---|
homework.timeout.job.js |
0 * * * * |
Her saat başı | Süresi geçmiş PENDING ödevleri kapatır |
kaltura.check.job.js |
0 * * * * |
Her saat başı | Toplantı kayıtlarını Kaltura'dan kontrol eder |
payment.check.job.js |
0 0 * * * |
Her gün gece yarısı | Ödeme süresi dolmuş kullanıcıları bloke eder |
recurring.task.job.js |
1 0 * * * |
Her gün 00:01 | Tekrar eden görevler için yeni dönem kayıtları oluşturur |
error.booklet.job.js |
0 2 1 * * |
Her ayın 1'i 02:00 | Bir önceki ay için hata kitapçığı üretir |
daily.routine.job.js |
0 1 * * 1 |
Her Pazartesi 01:00 | Akıllı rutin önerileri (SmartRoutineSuggestions) üretir |
monthly.success.report.job.js |
45 23 28-31 * * |
Ayın son günü 23:45 | Aylık başarı raporu üretir |
1. Ödev Timeout (homework.timeout.job.js)
Her saat başı tüm PENDING ödevleri tarar. Deadline'ı geçmiş ödev için:
- İlgili derse ait tamamlanmış bir
userLessonSectionExamkaydı varsa →COMPLETED - Yoksa →
FAILED
2. Kaltura Kayıt Kontrolü (kaltura.check.job.js)
Her saat başı, reWatchMediaId = null ve endDate ≤ şimdi ve referenceId != null koşullarını sağlayan toplantıları bulur.
Her toplantı için kalturaClient.getMedia(meet.referenceId) çağrısı yapılır. Kayıt bulunursa:
mediatablosunaVIDEOtipinde yeni kayıt eklenirmeet.reWatchMediaIdgüncellenir
Kaltura'da birden fazla kayıt varsa listedeki son (objects[objects.length - 1]) kullanılır.
3. Ödeme Kontrolü (payment.check.job.js)
Her gece yarısı iki koşulu kontrol eder:
Ödeme durumu:
paymentStatus0 (yapılmadı) veya 1 (bekliyor) olanisBlock: falselastPaymentDate ≤ şimdi
olan kullanıcılar isBlock: true yapılır.
Lisans süresi:
isUnlimitedLicense: falselicenseExpiryDatedolmuş
olan kullanıcılar da isBlock: true yapılır.
4. Tekrar Eden Görev Dönemleri (recurring.task.job.js)
Her gün 00:01'de DAILY/WEEKLY/MONTHLY frekanslı görevler için yeni dönem kaydı oluşturur. periodKey ile dönem benzersizliği sağlanır.
5. Hata Kitapçığı (error.booklet.job.js)
Her ayın 1'i sabah 02:00'de çalışır. Bir önceki ay için tüm öğrencilerin hata kitapçıklarını oluşturur. Detaylar için bkz. Sınav ve Değerlendirme.
6. Akıllı Rutin Önerileri (daily.routine.job.js)
Her Pazartesi 01:00'de çalışır. Hata kitapçığı verisine dayanarak SmartRoutineSuggestion kayıtları üretir. Kapsam: haftalık, userId + lessonId + weekStartDate kombinasyonu unique.
7. Aylık Başarı Raporu (monthly.success.report.job.js)
Zamanlama: 45 23 28-31 * * — 28-31. günlerde 23:45'te tetiklenir. Her çalışmada o günün ayın son günü olup olmadığını kontrol eder; değilse çıkar. Gerçek son gündeyse generateMonthlyReportsForAllUsers() çalıştırır.
Kafka Dinleyiciler
Giriş noktası: src/listeners/index.js — startListener()
DISABLE_KAFKA Bayrağı
DISABLE_KAFKA=true
Bu ortam değişkeni true olarak ayarlandığında tüm Kafka dinleyiciler başlatılmaz. Kafka olmayan ortamlar veya test senaryoları için kullanılır.
Dinleyici Tablosu
| Dinleyici | Topic | Ne Yapar |
|---|---|---|
recommendation.listener.js |
yesv3-{TENANT}-recommendations-create |
İçerik öneri bildirimleri (stub — şu an sadece log) |
meet.participant.created.listener.js |
yesv3-{TENANT}-meetparticipants-created |
Toplantı katılımcı eklenince takvime sistem etkinliği ekler |
meet.participant.deleted.listener.js |
yesv3-{TENANT}-meetparticipants-deleted |
Toplantı katılımcı silinince takvim kaydını siler |
meet.deleted.listener.js |
yesv3-{TENANT}-meet-deleted |
Toplantı silinince ilgili tüm takvim kayıtlarını siler |
homework.created.listener.js |
yesv3-{TENANT}-homeworks-created |
Ödev oluşturulunca takvime sistem etkinliği ekler |
meet.attendance.listener.js |
yesv3-{TENANT}-meeting-ended |
Toplantı bitince Zoom katılım verisi işlenir, devamsızlık kaydı oluşturulur |
report/homework.report.create.listener.js |
yesv3-{TENANT}-homeworks-updated |
Ödev tamamlandığında ödev raporu oluşturur |
Her consumer group ID'si benzersiz olması için uniqueId() ile sonlandırılır: yesv3-{TENANT}-{tip}-{uniqueId}.
Takvim Entegrasyonu (3 listener)
homework.created, meet.participant.created ve meet.participant.deleted dinleyicileri takvim sistemini besler:
- homework.created →
calendar.create({ type: "USER", isSystem: true, metadata: { referenceId, referenceType: "HOMEWORK" } }) - meet.participant.created →
calendar.create({ type: "USER"/"DEPARTMENT", isSystem: true, metadata: { referenceType: "MEET", meetParticipantId } }) - meet.participant.deleted → ilgili
calendarkaydını siler - meet.deleted →
metadata.referenceIdeşleşen tüm takvim kayıtlarını siler
isSystem: true olan bu kayıtlar takvim servisinden düzenlenemez.
Toplantı Katılım Takibi (meet.attendance.listener.js)
Topic: yesv3-{TENANT}-meeting-ended — Zoom toplantısı sona erince tetiklenir.
Akış:
- 30 saniye bekler (Zoom'un kendi işlemesini tamamlaması için)
meetAttendanceService.processMeetingAttendance(meetingId)çalıştırırreferenceId = meetingId, referenceType = 'ZOOM'olanmeetkaydı bulunur- Katılmayan katılımcılar için
MeetAttendancekaydıisPresent: falseile oluşturulur
Ödev Raporu Oluşturma (homework.report.create.listener.js)
Topic: yesv3-{TENANT}-homeworks-updated — Ödev durumu değiştiğinde tetiklenir.
Akış:
- Duplikat kontrol:
homeworkReportzaten varsa çıkılır - Ödev
FAILEDise boş rapor kaydı oluşturulur - Tamamlandıysa:
UserLessonSectionExamve yanıtları çekilir- Her soru için
correct/wrong/unansweredbelirlenir score_percent = ceil(correct / total * 100)- Yanlış ve cevapsız soruların kazanımları bulunur (
getWeakTopicsFromQuestions) - Aynı soruları paylaşan kazanımlar birleştirilir (
mergedTopicsMap) HomeworkReportkaydı{ items, summary, weakTopics, wrongTopics, unansweredTopics }ile oluşturulur