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
                    
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.Shared" Version="2.0.22" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Tapis.Core.Shared" Version="2.0.22" />
                    
Directory.Packages.props
<PackageReference Include="Tapis.Core.Shared" />
                    
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.Shared --version 2.0.22
                    
#r "nuget: Tapis.Core.Shared, 2.0.22"
                    
#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.Shared@2.0.22
                    
#: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.Shared&version=2.0.22
                    
Install as a Cake Addin
#tool nuget:?package=Tapis.Core.Shared&version=2.0.22
                    
Install as a Cake Tool

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 Versiyon ve IVersiyonluEntity kalıtımı kaldırıldı, arayüz silindi.
  • SistemTanim damga taşımıyor.
  • BaseDTO<TKey>.Versiyon string? 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 RowState ve CustomResponse<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.Infrastructure
  • Tapis.Core.Email
  • Tapis.Core.WhatsApp
  • Tapis.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ı temelFiltre olarak 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 ad
    

    Dto<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, Takma ile 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 ListeSorguHatasi fırlatır; ürün 400 ve ListeSorguHatasi.KullaniciMesaji ("Sayfayı yenileyip tekrar deneyin.") döndürür, ayrıntı Neden yalnı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 IKolonYolDogrulayici ile 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. YansimaKolonYolDogrulayici yalnı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 navigasyon x.Nav != null && ... korumasıyla çevrilir (Bos null navigasyonda doğru, diğerleri yanlış).

  • Metin eşleşmesi varsayılanı Türkçe duyarlı ToLowerInvariant'dır; PostgreSQL ürünü IMetinEslestirici ile EF.Functions.ILike verebilir. DateTime kolonunda 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 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.
  • 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 146 10/21/2026
2.0.19 249 10/17/2026
2.0.18 192 10/14/2026
2.0.17 256 10/12/2026
2.0.16 89 10/12/2026
2.0.15 343 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 564 9/5/2026
Loading failed

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.