Zamanlanmış İşler ve Kafka Dinleyiciler


Zamanlanmış İşler (Cron Jobs)

Giriş noktası: src/jobs/system/index.jsstartSystemCronJobs()

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 userLessonSectionExam kaydı 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:

  1. media tablosuna VIDEO tipinde yeni kayıt eklenir
  2. meet.reWatchMediaId gü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:

  • paymentStatus 0 (yapılmadı) veya 1 (bekliyor) olan
  • isBlock: false
  • lastPaymentDate ≤ şimdi

olan kullanıcılar isBlock: true yapılır.

Lisans süresi:

  • isUnlimitedLicense: false
  • licenseExpiryDate dolmuş

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.jsstartListener()

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.createdcalendar.create({ type: "USER", isSystem: true, metadata: { referenceId, referenceType: "HOMEWORK" } })
  • meet.participant.createdcalendar.create({ type: "USER"/"DEPARTMENT", isSystem: true, metadata: { referenceType: "MEET", meetParticipantId } })
  • meet.participant.deleted → ilgili calendar kaydını siler
  • meet.deletedmetadata.referenceId eş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ış:

  1. 30 saniye bekler (Zoom'un kendi işlemesini tamamlaması için)
  2. meetAttendanceService.processMeetingAttendance(meetingId) çalıştırır
  3. referenceId = meetingId, referenceType = 'ZOOM' olan meet kaydı bulunur
  4. Katılmayan katılımcılar için MeetAttendance kaydı isPresent: false ile oluşturulur

Ödev Raporu Oluşturma (homework.report.create.listener.js)

Topic: yesv3-{TENANT}-homeworks-updated — Ödev durumu değiştiğinde tetiklenir.

Akış:

  1. Duplikat kontrol: homeworkReport zaten varsa çıkılır
  2. Ödev FAILED ise boş rapor kaydı oluşturulur
  3. Tamamlandıysa:
    • UserLessonSectionExam ve yanıtları çekilir
    • Her soru için correct / wrong / unanswered belirlenir
    • 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)
    • HomeworkReport kaydı { items, summary, weakTopics, wrongTopics, unansweredTopics } ile oluşturulur

results matching ""

    No results matching ""