Tapis.Core.Reminders 1.0.5

dotnet add package Tapis.Core.Reminders --version 1.0.5
                    
NuGet\Install-Package Tapis.Core.Reminders -Version 1.0.5
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Tapis.Core.Reminders" Version="1.0.5" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Tapis.Core.Reminders" Version="1.0.5" />
                    
Directory.Packages.props
<PackageReference Include="Tapis.Core.Reminders" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add Tapis.Core.Reminders --version 1.0.5
                    
#r "nuget: Tapis.Core.Reminders, 1.0.5"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package Tapis.Core.Reminders@1.0.5
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=Tapis.Core.Reminders&version=1.0.5
                    
Install as a Cake Addin
#tool nuget:?package=Tapis.Core.Reminders&version=1.0.5
                    
Install as a Cake Tool

Tapis.Core.Reminders

Notlar ve hatırlatıcılar modülünün sözleşme paketi. Her ürün (ServiceManagement, HostelManagement) bu paketi kendi API'sinde barındırır ve kendi tenant veritabanında kendi tablolarını tutar. Paket tenant çözümlemesi, kimlik doğrulama ya da ürün varlıkları bilmez; ihtiyaç duyduğu her şeyi port üzerinden alır.

1.0.2'den beri uygulama servisleri ürünün içindedir (kullanıcı kararı S1, 2026-10-13). Paket not, hatırlatıcı, bildirim ve ek servislerinin yalnız arayüzünü verir; implementasyon ürünün kendi repository/UnitOfWork katmanını kullandığı için ürün projesinde yaşar. Paket container'dan DbContext çözmez.

İçerik

Alan Ne yapar
Entities/ Note, Reminder, ReminderChecklistItem, ReminderAlarm, Notification, Attachment — hepsi OwnerUserId taşır
Persistence/ ApplyRemindersModel(ModelBuilder) ile tablolar ürünün kendi DbContext'ine katılır (xmin damgası ve denetim interceptor'ı böylece otomatik gelir)
Services/ servis arayüzleri (INoteService, IReminderService, INotificationService, IAttachmentService), tekrar kuralı (RecurrenceService), alarm işleyici (ReminderDispatchService) ve ek eşlemesi (AttachmentMap)
RemindersLocalizationConsts ileti ve işlem anahtarları (İngilizce); metinler ürünün kaynak dosyalarında, ISharedLocalizer ile çözülür
Scheduling/ sonraki alarma kadar uyuyan zamanlayıcı döngüsü ve sinyal
Hubs/ RemindersHub — kullanıcı bazlı grup, NotificationCreated / UnreadCount olayları
Controllers/ api/Notes, api/Reminders, api/ReminderAttachments, api/ReminderNotifications
Ports/ IFileStorage, IReminderDbContextFactory, IReminderSchedulerSignal, IReminderRealtimeNotifier, IReminderClock, IReminderRecipientResolver
Services/RecordAccess erişim kuralının tek kaynağı (aşağıda "İşletme görünürlüğü")

Ürüne bağlama

// Program.cs
builder.Services.AddRemindersModule(builder.Configuration);
builder.Services.AddScoped<IReminderDbContextFactory, ServiceManagementReminderDbContextFactory>();

// Uygulama servisleri ürünün kendisindedir (S1): paket yalnız arayüzü tanımlar.
builder.Services.AddScoped<INoteService, NotService>();
builder.Services.AddScoped<IReminderService, HatirlaticiService>();
builder.Services.AddScoped<INotificationService, HatirlaticiBildirimService>();
builder.Services.AddScoped<IAttachmentService, HatirlaticiEkService>();
builder.Services.AddControllers().AddRemindersControllers();
...
app.MapRemindersModule();   // hub
// DbContext.OnModelCreating
builder.ApplyRemindersModel();

Yapılandırma Reminders bölümünden okunur (MaxSleepMinutes, MaxAttempts, RetryDelayMinutes, BatchSize, IdleShutdownMinutes, Attachments:MaxSizeMb, Attachments:AllowedExtensions, Attachments:MaxFilesPerRecord, Attachments:LocalRootPath).

Kurallar

  • Uygulama servisi yazan ürün kendi IUnitOfWork/repository'lerini kullanır, DbContext'i doğrudan açmaz; doğrulama FluentValidation validator'ıyla ürün tarafında yapılır (paket DTO'ları ürünün global ValidationFilter'ından geçer); kullanıcıya dönen her ileti ISharedLocalizer ile RemindersLocalizationConsts anahtarından çözülür.
  • Kayıtlar varsayılan olarak kişiseldir (Visibility = Personal); işletme kayıtları için aşağıdaki bölüme bakın. Her not/hatırlatıcı sorgusu RecordAccess kuralından geçer, erişilemeyen kayıt olmayan kayıtla aynı 404'ü alır. Bildirimler her zaman OwnerUserId == ben ile süzülür.
  • Bildirim yalnız uygulama içidir: e-posta, SMS, WhatsApp gönderilmez ve bunlar için soyutlama yoktur.
  • Ek dosyalar yalnız yetki denetimi yapan indirme ucundan akar; depolama anahtarı istemciye hiç verilmez.
  • Tüm tarihler yerel saat (Europe/Istanbul) yazılır; modülde UTC kullanılmaz.
  • Elle transaction yalnız ürünün yürütme stratejisinin içinde açılır. Ürünler PostgreSQL context'ini EnableRetryOnFailure(3) ile kuruyor; EF, yeniden deneyen bir strateji altında BeginTransaction'ı InvalidOperationException ile reddeder. Yeni bir transaction gerekiyorsa gövde db.Database.CreateExecutionStrategy().ExecuteAsync(...) içine konur ve yeniden denenebilir yazılır (her denemede ChangeTracker.Clear() + veriyi sıfırdan oku). 1.0.0'da alarm turu bu kuralı ihlal ettiği için zamanlayıcı PostgreSQL'de hiç çalışmadı; SQLite testleri yeniden denemediği için göstermedi (regresyon testi: AlarmYenidenDenemeStratejisiTests).

Bildirim listesi: görünürlük, arama, süzgeç (1.0.5)

Migration gerekmez (şema aynı). Bildirimler hâlâ yalnız alıcısınındır: OwnerUserId == ben tek erişim kuralıdır, RecordAccess'in işletme kuralı bildirimlere uygulanmaz; hatırlatıcıyla ilişki satır eklemez, yalnız görünürlüğü taşır ve (süzgeçte) eler.

  • NotificationDTO.Visibility (RecordVisibility?): kaynak hatırlatıcının şu anki görünürlüğü; hatırlatıcı silinmişse ya da ReminderId boşsa null (arayüz rozet göstermez). Alarmın anlık push DTO'sunda da dolu gelir.
  • NotificationQueryDTO: mevcut Skip, Take, SadeceOkunmamis yanında Arama (string?, kırpılır, en çok NotificationQuery.MaxSearchLength = 100, başlık + metinde büyük/küçük harfe duyarsız) ve Gorunurluk (NotificationVisibilityFilter: All 0, Personal 1, Business 2; hatırlatıcısı silinmiş bildirimler yalnız All'da).
  • NotificationQuery (Tapis.Core.Reminders.Services): ApplyFilter(hatirlaticilar, ownerUserId, sorgu) (owner + okunmamış + arama + görünürlük), Project(hatirlaticilar) (DTO + Visibility), NormalizeSearch, IsSearchValid, IsValidVisibilityFilter.

Ürün kontrol listesi (HostelManagement / ServiceManagement)

  1. BildirimRepository.SayfaAsync (ve INotificationService.ListAsync) kendi OwnerUserId == ben / SadeceOkunmamis süzgecini bırakıp bildirimler.ApplyFilter(hatirlaticilar, kullaniciId, sorgu) çağırır; toplam sayı bu süzülmüş sorgudan, sırala (okunmamışlar önce, sonra OlusturmaTarihi azalan) + Skip/Take sonra Project(hatirlaticilar) ile DTO'ya. hatirlaticilar = ürünün Set<Reminder>()'ı (AsNoTracking). UnreadCount sayacı süzgeçsiz kalır (zil rozeti).
  2. Validator: Arama için NotificationQuery.IsSearchValid (ya da MaximumLength(100)), Gorunurluk için IsInEnum; mesaj Türkçe, WithMessage ile. Paketin FluentValidation bağımlılığı yoktur.
  3. /api-regen, Angular Bildirimler sayfası: visibility rozeti (Kişisel/İşletme; null = rozet yok), arama kutusu, görünürlük süzgeci. Başka kullanıcının satırı hiçbir süzgeçle dönmez.
  4. Ürün CLAUDE.md'sindeki bildirim bölümü güncellenir.

İşletme görünürlüğü (1.0.4)

Note ve Reminder bir Visibility taşır: RecordVisibility.Personal (0, varsayılan, mevcut satırlar) ya da Business (1). İşletme kaydını tenant'ın kimliği doğrulanmış her kullanıcı oturumu okur ve yazar (düzenleme, silme, tamamlama, erteleme, alarm, alt madde, etiket, ek). İşletme hatırlatıcısının alarmı tenant'ın her aktif kullanıcısına ayrı bildirim üretir. Kişisele geri almayı yalnız oluşturan (OwnerUserId) yapar; işletmeye alma her yazarın hakkıdır. OwnerUserId yalnız oluşturmada yazılır, hiçbir güncelleme DTO'su onu taşımaz ve görünürlük değişimi onu değiştirmez.

Pakette olanlar

  • RecordAccess (Tapis.Core.Reminders.Services): NoteReadable/NoteWritable, ReminderReadable/ReminderWritable, ChecklistItemAccessible, AlarmAccessible, NoteTagAccessible, AttachmentAccessible (ek, üst kaydı okunabiliyorsa okunur; ek + üst kayıt + kural tek sorguda), NoteFilter/ReminderFilter (Gorunurluk süzgeci), CanChangeVisibility, IsValidVisibility, IsOwner, RemoveNonOwnerNotificationsAsync. Boş/boşluk kullanıcı kimliği hiçbir satırla eşleşmez (işletme satırıyla da).
  • IReminderRecipientResolver: ActiveUserIdsAsync(DbContext, ct) ve DisplayNamesAsync(DbContext, ids, ct). ReminderDispatchService işletme hatırlatıcısında alıcıları tur başına bir kez, alarmı Fired yapan transaction'ın içinde çözer; her alıcıya bir Notification satırı yazar, commit'ten sonra alıcı başına tek push yollar (mevcut t:{tenant}:u:{user} grubu; yeni grup, Clients.All/User/Others yok; okunmamış sayaçları alıcı başına sorgu değil parça başına gruplu sorguyla). Çözümleyici kayıtsızsa ya da boş dönerse bildirim üretilmez (sahibe ya da başka birine düşülmez). Çözümleyici ReminderDispatchService'e isteğe bağlı enjekte edilir.
  • Notification tekil indeksi (AlarmId, OwnerUserId); (ReminderId, FireAt) değişmedi.
  • Entity/EF: Visibility (zorunlu, varsayılan 0), indeksler Notlar (Visibility, IsPinned) ve Hatirlaticilar (Visibility, IsCompleted, DueAt).
  • DTO: create/update/list/detail'de Visibility; list/detail'de CreatedByName, IsMine; filtre DTO'larında Gorunurluk.

Faz 2 ürün kontrol listesi (HostelManagement / ServiceManagement)

  1. Migration: Notlar.Visibility, Hatirlaticilar.Visibility (int, NOT NULL, default 0), iki yeni indeks ve Bildirimler tekil indeksinin AlarmId → (AlarmId, OwnerUserId) olarak değişmesi (/add-migration).
  2. Fail-closed kapı: servisler ClientToken çağıranlarını ve boş kullanıcı kimliğini kural değerlendirilmeden ÖNCE reddeder (mevcut FU1 denetimi); paket de boş kimlikte hiçbir şey eşleştirmez, ama bu ikinci savunmadır.
  3. RecordAccess her yerde: not, hatırlatıcı, alt madde, alarm/erteleme/tamamlama, etiket, sayaç (Counts), arama, liste ve ek indirme/yükleme/silme sorguları. Elle OwnerUserId == userId yazılmaz. Bildirim sorguları (liste, sayaç, okundu, silme) OwnerUserId == ben olarak KALIR.
  4. Çözümleyici: IReminderRecipientResolver'ı ürün ApplicationUser.Aktif == true ile, yalnız verilen DbContext üzerinde uygular (scoped DbContext/HttpContext enjekte etmez; arka plan yolunda ikisi de yoktur), DisplayNamesAsync yalnız görünen adı döner. DI'a kaydedilir.
  5. Görünen ad: list/detail DTO'larında CreatedByName (çözümleyiciden, sayfa başına tek sorgu) ve IsMine (OwnerUserId == ben) doldurulur.
  6. Bildirim temizliği: işletme kaydı silinirken ya da Personal'a çevrilirken RecordAccess.RemoveNonOwnerNotificationsAsync AYNI SaveChanges'te çağrılır.
  7. Görünürlük değişimi: güncelleme DTO'larında Visibility RecordVisibility?'dir; null = mevcut değer korunur (CanChangeVisibility çağrılmaz, bildirim temizliği yapılmaz). Değer doluysa ve mevcuttan farklıysa RecordAccess.CanChangeVisibility ile denetlenir; işletmeden kişisele yalnız oluşturan. OwnerUserId yalnız oluşturmada yazılır, update DTO/mapper onu hiç yazmaz. NoteCreateDTO/ReminderCreateDTO artık NoteUpdateDTO/ReminderUpdateDTO'nun tabanı değildir (ortak taban *InputBaseDTO): mapper'lar buna göre güncellenir.
  8. Validator: Visibility için IsInEnum (paketin FluentValidation bağımlılığı yoktur; validator'lar ürünündür). Oluşturmada eksik değer Personal sayılır; güncellemede null mevcut değeri korur (madde 7).
  9. Denetim: ürünün denetim interceptor'ı Visibility değişimini zaten kapsar; ayrı kod gerekmez, doğrula.
  10. Güvenlik dokümanları (DevelopmentStandards):
    • security/AUTHORIZATION.md, Object-level bölümüne Reminders istisnası: Personal = yalnız OwnerUserId; Business = tenant'ın kimliği doğrulanmış her kullanıcı oturumu okur+yazar; Personal'a geri alma yalnız oluşturan; sahip asla yeniden atanmaz; bildirimler yalnız sahibinindir; erişimin dışı 404; ClientToken reddedilir.
    • security/TENANT-SECURITY.md, Background work bölümüne: işletme alarm dağıtımı yalnız turun tenant DbContext'ini ve döngünün tenantId'sini kullanır, yedek alıcı yoktur, push yalnız mevcut t:{tenant}:u:{user} gruplarına gider.
  11. Docs / istemci: ürün CLAUDE.md'si (Notlar & Hatırlatıcılar bölümü), /api-regen, Angular tarafı.

Bilinen sınırlama

Bir alarm turu çalışırken kayıt kişisele çevrilirse (ya da silinirse), o turun yazdığı sahip-dışı bildirim satırları temizlikten sonra kalabilir (yarış). Bu durumda sahip-dışı alıcılar o alarmın başlığını ve metnini bildirim listelerinde görmeye devam edebilir (kayıt az önceye kadar onlara zaten açıktı); satırı kullanıcı silebilir. Alıcı kimlikleri çözümleyiciden olduğu gibi alınır: kenarında boşluk olan kimlik atılır.

Product Compatible and additional computed target framework versions.
.NET net10.0 is compatible.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
1.0.5 67 10/17/2026
1.0.4 58 10/16/2026
1.0.3 114 10/13/2026
1.0.2 53 10/13/2026
1.0.1 51 10/13/2026
1.0.0 60 10/13/2026

1.0.5 (migration gerekmez): bildirim listesi - NotificationDTO.Visibility (kaynak hatirlaticinin simdiki gorunurlugu, hatirlatici yoksa null), NotificationQueryDTO.Arama ve Gorunurluk (NotificationVisibilityFilter), NotificationQuery yardimcisi (Normalize/Validate/ApplyFilter/Project); bildirim erisimi yine yalniz OwnerUserId == ben. 1.0.4: Isletme notlari/hatirlatici (kirici, urun migration ister): RecordVisibility (Personal=0, Business=1) ve RecordVisibilityFilter; Note.Visibility, Reminder.Visibility (varsayilan 0) ve indeksler (Visibility, IsPinned) / (Visibility, IsCompleted, DueAt); Notification tekil indeksi AlarmId yerine (AlarmId, OwnerUserId). RecordAccess: erisim kuralinin tek kaynagi (NoteReadable/NoteWritable, ReminderReadable/ReminderWritable, alt madde/alarm/etiket/ek ifadeleri, liste suzgecleri, CanChangeVisibility, RemoveNonOwnerNotificationsAsync); bos kullanici kimligi hicbir satirla eslesmez. Yeni IReminderRecipientResolver (ActiveUserIdsAsync, DisplayNamesAsync): ReminderDispatchService isletme hatirlaticisinda her aktif kullaniciya ayri bildirim uretir (ayni transaction), commit sonrasi alici basina tek push; cozumleyici yoksa ya da bos donerse bildirim uretilmez. DTO'lara Visibility, CreatedByName, IsMine ve Gorunurluk suzgeci eklendi.