Tapis.Core.Shared
2.0.22
dotnet add package Tapis.Core.Shared --version 2.0.22
NuGet\Install-Package Tapis.Core.Shared -Version 2.0.22
<PackageReference Include="Tapis.Core.Shared" Version="2.0.22" />
<PackageVersion Include="Tapis.Core.Shared" Version="2.0.22" />
<PackageReference Include="Tapis.Core.Shared" />
paket add Tapis.Core.Shared --version 2.0.22
#r "nuget: Tapis.Core.Shared, 2.0.22"
#:package Tapis.Core.Shared@2.0.22
#addin nuget:?package=Tapis.Core.Shared&version=2.0.22
#tool nuget:?package=Tapis.Core.Shared&version=2.0.22
Tapis.Core.Shared
Tapis.Core.Shared 2.0.4, Tapis Organization uygulamalarında kullanılan ortak .NET çekirdek sözleşmelerini içerir.
Paket; ortak entity yapıları, CustomResponse, kullanıcıya güvenli hata sınıflandırması (PublicFailureClassifier), HTTP context abstractions, printing, WhatsApp/e-posta modelleri ve bearer guard'ları sağlar.
2.0.4 değişiklikleri (breaking)
İyimser eşzamanlılık damgası PostgreSQL'in xmin sistem sütunu oldu
(DevelopmentStandards/backend/PERSISTENCE-STANDARDS.md §8). PostgreSQL tek
hedef motor olduğu için damganın sağlayıcıdan bağımsız olması gerekmiyor; iki
damganın bir satırda yaşaması ise bu kararın engellemek istediği şey.
BaseEntity<TKey>artık damga taşımıyor:Guid VersiyonveIVersiyonluEntitykalıtımı kaldırıldı, arayüz silindi.SistemTanimdamga taşımıyor.BaseDTO<TKey>.Versiyonstring?oldu. Damga istemciye opaktır: olduğu gibi geri gönderilir, ayrıştırılmaz, sıralama için karşılaştırılmaz.RowStateTip RowStateveCustomResponse<T>sözleşmeleri değişmedi.
Yükseltirken: entity'lerdeki Versiyon sütunu düşer ve DbContext xmin
eşlemesine geçer. Ürünler bu pakete Master ve ServiceManagement birlikte
taşınır; HostelManagement kendi turunda gelir ve o zamana kadar Guid Versiyon
ile kalması ihlal değildir.
Kök namespace ve assembly adı: Tapis.Core.Shared.
ASP.NET middleware, EF interceptor, SMTP gönderici ve Meta WhatsApp client'ları ayrı paketlerdedir:
Tapis.Core.InfrastructureTapis.Core.EmailTapis.Core.WhatsAppTapis.Core.Verification
E-posta ve WhatsApp sözleşmeleri (IEmailSender, IWhatsAppSender, modeller) Shared'da kalır; host Application katmanı MailKit/Meta paketini pinlemek zorunda değildir. Uygulamalar Tapis.Core.Email / Tapis.Core.WhatsApp yalnızca gerçek gönderici kaydı için ekler.
2.0.21: dinamik liste sorgusu (IRepository<T>.SayfaliListeAsync)
Kolon başlığı filtresi, çoklu sıralama ve sayfalama tek ortak repository metoduyla, veritabanında yapılır.
Kırıcı: IRepository<T>'e üye eklendi; ServiceManagement ve HostelManagement Repository<T> sınıfları metodu
gerçeklemeli ve bir IKolonYolDogrulayici (EF metadata) sağlamalıdır (Master gerçeklemez).
İstek:
ListeSorgusu(PageNumber,PageRows,Siralama,KolonFiltreleri). Ürün liste FiltreDTO'sunu bundan türetir, kendi çekmece filtrelerini/Arama'yı ekler ve onlarıtemelFiltreolarak verir. Sonuç:PageDTO<T>.İzin listesi zorunludur (
ListeSorguSecenekleri<T>, "her şeye izin" yok): kolon kimliği yalnız izin listesinde ya da takma adlarda ise kabul edilir. Filtre ve sıralama aynı kurala tabidir. İki tanım yolu:new ListeSorguSecenekleri<Belge>(["belgeNo", "tutar", "cariHesap.telefon1"]); // açık kimlikler ListeSorguSecenekleri<Belge>.Dto<BelgeListeDTO>(); // sonuç DTO'sundan türetilir ListeSorguSecenekleri<Belge>.Dto<BelgeListeDTO>().Takma("cariAdi", b => b.CariHesap!.Unvan); // + takma adDto<TDto>()DTO'nun genel özelliklerini (ve iç içe 1:1 DTO'ları, en çok 3 parça, koleksiyon yok) camelCase yola çevirir (belgeNo,cariHesap.telefon1) ve türe göre önbelleğe alır. Ekranın gördüğü alan ile süzülebilen alan aynıdır: DTO'da IBAN yoksa IBAN'a göre süzülemez (değer tahmini kapanır). DTO'da olup entity'de karşılığı olmayan ya da hesaplanan alan,Takmaile açıkça yazılmadıkça süzülemez (sözleşme hatası). Takma ad geliştiricinin yazdığı ifadedir; izin listesine yazılması gerekmez, hassas ad deseni ve metadata denetiminden muaftır.Denetim sırası: izin listesi → hassas alan engeli → veri modeli (metadata) denetimi → türe özgü operatör denetimi. Her başarısızlık
ListeSorguHatasifırlatır; ürün 400 veListeSorguHatasi.KullaniciMesaji("Sayfayı yenileyip tekrar deneyin.") döndürür, ayrıntıNedenyalnız log içindir.Hassas alan engeli izin listesinde olsa da çalışır (derinlemesine savunma):
[ListeSorgusundaKullanilamaz],[NotMapped]ve ad deseni (password, sifre, parola, hash, secret, token, apikey, iban).Veri modeli denetimi
IKolonYolDogrulayiciile yapılır (Tapis.Core.Shared EF'e bağımlı değildir): yolun her parçası için modelde eşlenmiş skaler özellik (son parça) ya da eşlenmiş referans navigasyonu (ara parça) aranır; koleksiyon, eşlenmemiş ve hesaplanan özellikler reddedilir.YansimaKolonYolDogrulayiciyalnız test ve LINQ-to-objects içindir (CLR türüne bakarak tahmin eder), gerçek sorguda kullanılmaz.Sıra:
temelFiltre→ kolon filtreleri → sayım → sıralama (+ Id ile kararlı) → sayfa →secim. Null navigasyonx.Nav != null && ...korumasıyla çevrilir (Bosnull navigasyonda doğru, diğerleri yanlış).Metin eşleşmesi varsayılanı Türkçe duyarlı
ToLowerInvariant'dır; PostgreSQL ürünüIMetinEslestiriciileEF.Functions.ILikeverebilir.DateTimekolonunda değer yalnız gün (2026-10-01) ise karşılaştırma gün bazlıdır.
Ürün tarafı (SM/HM), generic Repository<T> içinde. Seçenek servis/çağıran tarafından, doğrulayıcı repository
tarafından verilir; servis IQueryable ya da EF görmez:
internal sealed class EfKolonYolDogrulayici(IModel model) : IKolonYolDogrulayici
{
public KolonEslemeTuru Sorgula(Type entityTuru, string ozellikAdi)
{
var tur = model.FindEntityType(entityTuru);
if (tur is null) return KolonEslemeTuru.Eslenmemis;
if (tur.FindProperty(ozellikAdi) is not null) return KolonEslemeTuru.Skaler;
if (tur.FindNavigation(ozellikAdi) is { } nav)
return nav.IsCollection ? KolonEslemeTuru.KoleksiyonNavigasyon : KolonEslemeTuru.ReferansNavigasyon;
// Sahipli (owned) türler EF'te navigasyon olarak, karmaşık türler FindComplexProperty ile gelir.
return tur.FindComplexProperty(ozellikAdi) is { IsCollection: false }
? KolonEslemeTuru.ReferansNavigasyon : KolonEslemeTuru.Eslenmemis;
}
}
// Repository<T> içinde (db: DbContext):
public async Task<PageDTO<TResult>> SayfaliListeAsync<TResult>(ListeSorgusu sorgu,
Expression<Func<T, bool>>? temelFiltre, Expression<Func<T, TResult>> secim,
ListeSorguSecenekleri<T> secenek, CancellationToken ct = default) where TResult : class
{
var dogrulayici = new EfKolonYolDogrulayici(db.Model); // ya da tek örnek
IQueryable<T> q = Set.AsNoTracking();
if (temelFiltre is not null) q = q.Where(temelFiltre); // tenant/yetki/ekran filtresi ÖNCE
var filtreli = q.KolonFiltreleriniUygula(sorgu, secenek, dogrulayici);
var toplam = await filtreli.CountAsync(ct);
var satirlar = await filtreli.SiralaVeSayfala(sorgu, secenek, dogrulayici).Select(secim).ToListAsync(ct);
return sorgu.SayfaSonucu(satirlar, toplam);
}
Target Framework
- .NET 10
Installation
dotnet add package Tapis.Core.Shared
| Product | Versions 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. |
-
net10.0
- No dependencies.
NuGet packages (6)
Showing the top 5 NuGet packages that depend on Tapis.Core.Shared:
| Package | Downloads |
|---|---|
|
Tapis.Core.Infrastructure
Tapis.Core ASP.NET / EF / Refit altyapısı: middleware, interceptors, HTTP clients, permission attributes. Publicly distributed proprietary software. Usage is subject to LICENSE.txt. |
|
|
Tapis.Core.WhatsApp
Tapis.Core Meta Cloud API WhatsApp gönderici ve admin client. Publicly distributed proprietary software. Usage is subject to LICENSE.txt. |
|
|
Tapis.Core.Email
Tapis.Core SMTP e-posta gönderimi (MailKit). IEmailSender uygulaması. Publicly distributed proprietary software. Usage is subject to LICENSE.txt. |
|
|
Tapis.Core.Reminders
Tapis.Core notlar ve hatırlatıcılar modülü: kişisel notlar, hatırlatıcılar (saat ve erken uyarılar), alarm zamanlayıcı, uygulama içi bildirimler (SignalR) ve ekler. Her ürün kendi veritabanında barındırır. Publicly distributed proprietary software. Usage is subject to LICENSE.txt. |
|
|
Tapis.Core.Portal
Tapis.Core musteri portali modulu: davet kodu ile cihaz baglama, kisa omurlu PortalToken, kayan yenileme oturumu, aydinlatma rizasi ve controller taban siniflari. Her urun kendi veritabaninda barindirir. Publicly distributed proprietary software. Usage is subject to LICENSE.txt. |
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 2.0.22 | 89 | 10/23/2026 |
| 2.0.21 | 53 | 10/22/2026 |
| 2.0.20 | 150 | 10/21/2026 |
| 2.0.19 | 250 | 10/17/2026 |
| 2.0.18 | 192 | 10/14/2026 |
| 2.0.17 | 259 | 10/12/2026 |
| 2.0.16 | 92 | 10/12/2026 |
| 2.0.15 | 345 | 10/8/2026 |
| 2.0.14 | 249 | 10/3/2026 |
| 2.0.13 | 278 | 10/3/2026 |
| 2.0.12 | 91 | 10/3/2026 |
| 2.0.11 | 106 | 10/2/2026 |
| 2.0.10 | 108 | 10/2/2026 |
| 2.0.9 | 137 | 10/2/2026 |
| 2.0.8 | 115 | 10/1/2026 |
| 2.0.7 | 168 | 10/1/2026 |
| 2.0.6 | 155 | 9/30/2026 |
| 2.0.5 | 195 | 9/26/2026 |
| 2.0.4 | 262 | 9/20/2026 |
| 2.0.3 | 565 | 9/5/2026 |
Gizli bilgi sertlestirme (KIRICI: IWhatsAppCloudAdminClient.RegisterPhoneAsync(accessToken, phoneNumberId, pin = null, ct); MetaWhatsAppOptions.RegisterPin varsayilani 000000 kaldirildi, null olabilir). WhatsAppRegisterPin.Uret/Dogrula eklendi. Dinamik liste sorgusu (2026-10-23, KIRICI: IRepository<T>'e yeni uye): IRepository<T>.SayfaliListeAsync<TResult>(ListeSorgusu, temelFiltre, secim, ListeSorguSecenekleri<T>, ct) PageDTO<TResult> doner; arayuzu gerceklestiren her Repository<T> (ServiceManagement, HostelManagement) bu metodu eklemek ve bir IKolonYolDogrulayici (EF db.Model: FindProperty, FindNavigation, IsCollection) saglamak zorunda, Master gerceklemez. Yeni Tapis.Core.Shared.Models.Liste: ListeSorgusu (PageNumber/PageRows + Siralama + KolonFiltreleri; urun FiltreDTO'su bundan turer), KolonSiralama, KolonFiltresi, KolonFiltreOperatoru (Icerir, Esittir, IleBaslar, Buyuk, BuyukEsit, Kucuk, KucukEsit, Arasinda, Icinde, Bos, BosDegil), ListeSorguSecenekleri<T> (ZORUNLU izin listesi: acik kimlikler ya da Dto<TDto>() ile sonuc DTO'sundan turetilir; takma ad, varsayilan siralama, IMetinEslestirici), EkranKolonlari (DTO'dan camelCase kolon kimlikleri, ic ice 1:1 DTO en cok 3 parca, koleksiyon yok, onbellekli), IKolonYolDogrulayici + KolonEslemeTuru (veri modeli denetimi icin EF'siz soyutlama; YansimaKolonYolDogrulayici yalniz test/LINQ-to-objects icin), ListeSorguMotoru ve ListeSorgusuUzantilari (KolonFiltreleriniUygula, SiralaVeSayfala, SayfaSonucu; yalniz repository icin, saf LINQ, EF bagimliligi yok). Kolon yolu noktali ve harf duyarsiz (cariHesap.telefon1), yalniz referans navigasyonu izlenir, koleksiyon reddedilir, en cok 3 parca. Denetim sirasi: izin listesi (takma adlar haric), hassas alan engeli ([ListeSorgusundaKullanilamaz], [NotMapped], ad deseni password|sifre|parola|hash|secret|token|apikey|iban; izin listesinde olsa da uygulanir), veri modeli denetimi, turu ozgu operator denetimi; filtre ve siralama ayni kurala tabidir. Her gecersizlik ListeSorguHatasi olur (urun 400 doner: Sayfayi yenileyip tekrar deneyin). Takma ad gelistiricinin acikca yazdigi ifadedir, izin listesi/ad deseni/metadata denetiminden muaftir. Null navigasyon x.Nav != null korumasiyla cevrilir. Metin eslesmesi varsayilan olarak Turkce duyarli ToLowerInvariant tabanli; PostgreSQL urunleri IMetinEslestirici ile ILike verebilir. DateTime degeri yalniz gun ise karsilastirma gun bazli. Yazici QR destegi (eklemeli, 2026-10-21): TsplPrintCommandBuilder/ZplPrintCommandBuilder.TekBarkodEtiket(takipNo, qr) 50x30 etiket (QR + barkod + "Portal"), PrintDocument.QrAltYazi (QR altina satirlar), PrintDocument.Qr (barkoddan ayri, string?) ve PrintDocument.KagitGenisligiMm (int?). Qr bos/null iken uc builder cikisi bayt bayt degismez. ESC/POS yazicinin yerel QR komutunu (GS ( k: model 2, hata duzeltme M, modul boyutu 58 mm icin 4, 80 mm ve ustu icin 6) toplam, barkod ve alt nottan sonra fisin sonunda basar; TSPL QRCODE, ZPL ^BQ kullanir; resim/raster yok. Qr yalniz yazdirilabilir ASCII olmali (URL yuzde-kodlanmis), aksi halde builder ArgumentException atar. TSPL/ZPL: Qr doluyken tek-barkod kisayolu yerine belge yolu kullanilir. Destek talebi gorunurlugu (eklemeli, 2026-10-17): yeni enum DestekTalebiGorunurlugu (Kisisel = 1, Isletme = 2; sifir yok, gelmeyen = Kisisel, tanimsiz sayi Master validator 400) ve DestekBildirimGorunurlukSuzgeci (Tumu = 0, Kisisel = 1, Isletme = 2). MasterDestekTalebiOlusturDTO.Gorunurluk (nullable); yeni MasterDestekTalebiGorunurlukDTO (GetirDTO + Gorunurluk + Damga, UrundenGorunurlukDegistir). MasterDestekTalebiOzetDTO/DetayDTO: Gorunurluk, BenimMi (Master hesaplar, acanin kullanici id si tasinmaz), AcanAdi (yalniz Isletme talebinde, aksi null); acan olmayana EkranYolu, KayitId ve Ekler null/bos. MasterDestekTalebiYanitiDTO.YazarAdi (musteri yaniti; destekte null). MasterDestekBildirimListeDTO.Arama (en cok 100), SadeceOkunmamis, Gorunurluk suzgeci; MasterDestekBildirimDTO.Gorunurluk. Master yukumlulukleri: Isletme talebini ayni tenant+uygulamadaki her aktif kullaniciya ac, ek/EkranYolu/KayitId yalniz acan ve destekte; iptal, metin guncelleme, ek ekleme, gorunurluk degistirme yalniz acan, Isletme yalniz acikken; sahip bildirimleri Isletme talebinde tum aktif kullanicilara; Arama>100 ve tanimsiz enum 400. Urunler yeni alanlari kullaniciya aynen iletir, yetkiyi Master uygular. Kalici destek bildirimleri sozlesmesi (eklemeli): DestekBildirimTuru enum, MasterDestekBildirimListeDTO/BildirimDTO/BildirimOkunduDTO/BildirimTalepOkunduDTO. Destek talebi sahip islemleri sozlesmesi (eklemeli, kirici degisiklik yok): DestekTalebiDurum.Iptal = 3; yeni enum DestekTalebiYanitYazari (Destek = 1, Musteri = 2; sifir uyesi yok, bu alandan onceki yanitlar destek yanitidir). MasterDestekTalebiOzetDTO.Damga (sahip yazma uclarinin eszamanlilik damgasi), MasterDestekTalebiYanitiDTO.YazarTuru (yanitlayanin kimligi hala verilmez, yalniz taraf), MasterDestekTalebiEkDTO.SiraNo (ekin kullaniciya gorunen numarasi; musteri yanit metninde "#2" diye anar), MasterDestekTalebiDetayDTO.IptalNedeni ve DestekYanitiVarMi. Yeni istek DTO'lari (hepsi MasterDestekTalebiGetirDTO'dan turer, UygulamaId tasimaz): MasterDestekTalebiIptalDTO, MasterDestekTalebiGuncelleDTO, MasterDestekTalebiSahipYanitiDTO, MasterDestekTalebiEkEkleDTO. Yeni ClientTokenScopes.SupportTicketManage (support.ticket.manage) + ClientTokenPolicies.SupportTicketManage: sahip islemleri support.ticket.write'tan AYRI scope ister, ayri token ile alinir. Yetki, sahiplik ve is kurallari (kapali talebe yanit yok, metin duzenleme yalniz ilk destek yanitina kadar, ek ekleme talep acik oldugu surece, iptal nedeni zorunlu/1000) Master'da uygulanir; bu paket dogrulama tasimaz. Erisim kaldirma scope (eklemeli): yeni ClientTokenScopes.TenantUserRoleRevoke (tenant.user-role.revoke) + ClientTokenPolicies.TenantUserRoleRevoke: urunun (SM/HM) Auth ucunda bir kullanicinin TUM rollerini kaldirir, rol adi tasimaz; yalniz *.Provision sinifi client tasir, ayri token ile istenir (tenant.provision/tenant.migrate istegine eklenmez), TenantUserRoleRead ile ayni aile ama onu ima etmez ve onun tarafindan ima edilmez. Yetki mantigi Master ve urunlerde uygulanir; bu paket yalniz sabiti tasir.