Cluster ERP iş alanlarını uygulama olarak satar. Bir kullanıcının bir uygulamayı açıp açamayacağı ve bir arka uç modülünün API'sinin yanıt verip vermeyeceği dört katmana bağlıdır: katalog, lisans, rol atamaları ve kurulumun yükleme durumu. src/cluster_erp/modules/app_store/ içindeki app_store modülü bu kayıtları tutar, server/entitlements.py ise korunan bir modüle gelen her istekte bunları uygular. Bu sayfa her katmanı mekanizma düzeyinde açıklar. Lisans dosyası içeriğini ve doğrulama ayrıntılarını anlatmaz. Modül özeti app store modülü sayfasındadır.
Kısaca¶
- Katalog
modules/app_store/catalog.jsonile gelir ve her açılıştaapp_store_appstablosuna yakınsatılır; 6'sı sistem uygulaması olmak üzere 28 uygulama listeler (src/cluster_erp/modules/app_store/services.py:50-97,catalog.jsoniçindesystemveyapermanenttaşıyan girdilerden sayıldı). - Lisans, bir yöneticinin yüklediği satıcı imzalı bir belgedir ve her çözümlemede
license_public_keyiçindeki açık anahtara karşı yeniden doğrulanır (src/cluster_erp/modules/app_store/license.py:1-14,src/cluster_erp/modules/app_store/services.py:201-236). - Lisans durumları
none,invalid,active,graceveread_onlyolur (src/cluster_erp/modules/app_store/license.py:9-14,src/cluster_erp/modules/app_store/license.py:33). - Rol atamaları üç niyet kullanır:
required,availableveblocked; atama satırı olmayan bir uygulama herkese açıktır (src/cluster_erp/modules/app_store/models.py:77-104,src/cluster_erp/modules/app_store/services.py:23-47). - İş modülleri yönlendiricilerine
require_app(self.name)ekler; modülü kapsayan yüklü, lisanslı ve koltuklu bir uygulama yoksa istekleri reddeder (src/cluster_erp/server/entitlements.py:225-273, örneğinsrc/cluster_erp/modules/bom/module.py:59).
Nasıl çalışır¶
Katmanlar¶
| Katman | Kayıt | Soru | Kaynak |
|---|---|---|---|
| L0 katalog | app_store_apps içinde StoreApp |
Hangi uygulamalar var, her biri hangi arka uç modüllerini kapsar, hangileri sistem uygulaması | src/cluster_erp/modules/app_store/models.py:14-52 |
| L1 lisans | app_store_licenses içinde AppLicense |
Müşteri hangi uygulamaların bedelini ödedi, lisans güncel mi | src/cluster_erp/modules/app_store/models.py:55-75 |
| L2 koltuk | app_store_assignments içinde AppAssignment |
Hangi roller bir uygulamayı kullanabilir | src/cluster_erp/modules/app_store/models.py:77-104 |
| L3 kurulum | app_store_installs içinde AppInstall |
Kurulumda uygulama yüklü mü, yönetici hangi modüllere onay verdi | src/cluster_erp/modules/app_store/models.py:123-162 |
Bir kullanıcının uygulama isteği (AppRequest, durumlar pending, approved, denied) bir yöneticiden koltuk ister; onay, uygulamayı isteyenin rolleri için available yapar (src/cluster_erp/modules/app_store/models.py:107-120, src/cluster_erp/modules/app_store/services.py:335-361).
Hak kapısı¶
Akış şeması bir istek için assert_module_entitled fonksiyonunu gösterir.
flowchart TD
req["korunan bir modüle istek"] --> resolve["_resolve: guarded, installed, entitled, lisans durumu"]
resolve --> sold{"modülü bir uygulama satıyor mu?"}
sold -->|hayır| pass["geçer"]
sold -->|evet| seat{"kullanıcının koltuğu var mı?"}
seat -->|hayır| s403["entitlement.no_seat 403"]
seat -->|evet| inst{"modül yüklü mü?"}
inst -->|hayır| i403["entitlement.module_not_installed 403"]
inst -->|evet| lic{"modül lisanslı mı?"}
lic -->|hayır| l403["entitlement.app_not_licensed 403"]
lic -->|evet| ro{"read_only ve yazma mı?"}
ro -->|evet| r403["entitlement.license_read_only 403"]
ro -->|hayır| passDüz anlatımla:
_resolve, herhangi bir katalog uygulamasının kapsadığı modülleri, yüklü uygulamaların yönetici onayı içinde kapsadığı modülleri, lisanslı uygulamaların kapsadığı modülleri ve lisans durumunu hesaplar (src/cluster_erp/server/entitlements.py:80-186).- Hiçbir uygulamanın kapsamadığı bir modül serbestçe geçer (
src/cluster_erp/server/entitlements.py:232-233). - Kullanıcının modülü kapsayan bir uygulamada koltuğu olmalıdır (
src/cluster_erp/server/entitlements.py:189-222,src/cluster_erp/server/entitlements.py:234-240). - Modül yüklü ve lisanslı olmalıdır (
src/cluster_erp/server/entitlements.py:241-250). read_onlylisans durumunda yalnızcaGET,HEADveOPTIONSgeçer (src/cluster_erp/server/entitlements.py:251-257).
Her ret görüntü metni değil, bir ileti kodu taşır; böylece istemci yerelleştirilmiş bir kart gösterebilir (src/cluster_erp/server/entitlements.py:260-265). Modül adını yolda taşıyan genel kayıt yaşam döngüsü uçları aynı denetimi çağırır (src/cluster_erp/modules/records/lifecycle_routes.py:130).
Lisans durumları ve lisanslama duruşu¶
| Durum | Anlam | Kaynak |
|---|---|---|
none |
Lisans yüklenmemiş veya açık anahtar yapılandırılmamış | src/cluster_erp/modules/app_store/services.py:209-210 |
invalid |
Belge doğrulanmıyor veya bozuk | src/cluster_erp/modules/app_store/license.py:52-62 |
active |
Bitiş tarihinden önce | src/cluster_erp/modules/app_store/license.py:76-77 |
grace |
Süresi dolmuş, lisansın verdiği ek gün içinde; tam işlev | src/cluster_erp/modules/app_store/license.py:78-79 |
read_only |
Ek süre de geçmiş; yazmalar reddedilir | src/cluster_erp/modules/app_store/license.py:80-81 |
license_public_key boşken lisanslama kapalıdır ve her katalog uygulamasına hak verilir. Anahtar ayarlıyken eksik veya geçersiz bir lisans yalnızca sistem uygulamalarına hak verir (src/cluster_erp/server/entitlements.py:158-173, src/cluster_erp/modules/app_store/services.py:404-417, src/cluster_erp/config/settings.py:566-569). Doğrulanmayan bir yükleme HTTP 422 ile reddedilir; değiştirilen bir lisans pasifleştirilmiş satır olarak kayıtta kalır (src/cluster_erp/modules/app_store/services.py:238-265). Web ekranı durumu Lisans Durumu olarak gösterir (webapp/i18n/tr.json anahtarı license.status_title).
Kurulum, onay ve korunan paketler¶
- İlk açılışta her katalog uygulaması yüklenir ve kurulum satırı uygulama sürümünü ve onay verilen modülleri kaydeder (
src/cluster_erp/modules/app_store/services.py:114-159). - Bir güncelleme uygulamanın modül listesini genişletirse yeni modüller bir yönetici yeniden onaylayana kadar kapalı kalır (
src/cluster_erp/modules/app_store/services.py:161-180,src/cluster_erp/server/entitlements.py:153-157). - Kaldırma durumu
uninstalledyapar ve modül verisini asla silmez; sistem uygulamaları kaldırılamaz (src/cluster_erp/modules/app_store/models.py:123-136,src/cluster_erp/modules/app_store/services.py:182-189). - Uygulama başına JavaScript paketleri herkese açık statik bağlamanın dışında
gated_apps/içinde durur ve kullanıcı için bir katman denetiminden sonraGET /api/v1/app_store/assets/{app_key}/{filename}ile sunulur (src/cluster_erp/modules/app_store/routes.py:95-155).gated_apps/içinde dokuz klasör vardır. Bkz. korunan uygulama paketleri. GET /api/v1/app_store/registry, oturum açmış kullanıcı için her etkin uygulamayı hak, kurulum, koltuk ve yeniden onay durumuyla döndürür; web istemcisi başlatıcısını bundan çizer (src/cluster_erp/modules/app_store/routes.py:18-39,src/cluster_erp/modules/app_store/services.py:375-447).
İzinler¶
| Kod | Kullanan | Kaynak |
|---|---|---|
license.manage |
Lisansı yükleme ve kaldırma | src/cluster_erp/modules/app_store/routes.py:71-92 |
store_app.assign |
Rol atamaları ve uygulama istekleri | src/cluster_erp/modules/app_store/routes.py:158-264 |
store_app.install |
Yükleme ve yeniden onay | src/cluster_erp/modules/app_store/routes.py:267-285 |
store_app.uninstall |
Kaldırma | src/cluster_erp/modules/app_store/routes.py:288-295 |
Kodlar ek kodlar olarak tohumlanır (src/cluster_erp/server/app.py:801-807).
Neden böyle kurulmuştur¶
- Lisans satırı bir önbellektir ve dosya her çözümlemede yeniden doğrulanır, çünkü kendi sunucusunu yöneten bir yönetici veritabanını düzenleyebilir ama imza taklit edemez (
src/cluster_erp/modules/app_store/license.py:3-7). read_onlyveriyi okunur ve dışa aktarılabilir tutar, çünkü bir ERP iş verisini asla rehin tutmaz (src/cluster_erp/modules/app_store/license.py:9-11).- Kapı güvenlik sınırıdır; istemcide bir kutucuğu gizlemek yalnızca sunumdur (
src/cluster_erp/server/entitlements.py:4-8). - Lisanslama devredeyken silinen bir lisans sistemi açmaz, kapatır (
src/cluster_erp/server/entitlements.py:158-163). - Kapsam büyümesi yeni bir onay ister; böylece bir güncelleme uygulamanın erişimini sessizce genişletmez (
src/cluster_erp/modules/app_store/models.py:153-157).
Kurallar ve sınırlar¶
- Çözülmüş durum süreç belleğinde, kurulum ve lisans değişikliklerinde veritabanı tetikleyicilerinin ilerlettiği bir sürüm damgasıyla anahtarlanarak önbelleğe alınır; her kurulum değişikliği belleği ayrıca düşürür (
src/cluster_erp/server/entitlements.py:32-77,src/cluster_erp/modules/app_store/routes.py:82). tests/test_entitlement_stamp.py(2 test) vetests/test_store_catalog_assets.py(4 test) damgayı ve katalog varlıklarını sabitler; uçtan uca süitler arasındaweb-client/_e2e_app_store.mjs,web-client/_e2e_license.mjsveweb-client/_e2e_store.mjsvardır.
Diğer parçalarla etkileşim¶
- Koltuklar için rol kimlikleri auth bekçi kapısından,
role_ids_forile gelir (src/cluster_erp/modules/app_store/routes.py:250-252,src/cluster_erp/modules/auth/guards.py:189-202). - Mağazanın galeri sayfaları
webapp/store/içinde, uygulama başına bir klasördedir (26 klasör). Bkz. korunan uygulama paketleri.
Sınırlar ve açık noktalar¶
- Kayıt defteri açıklaması
seatveentitleddeğerlerini gelecek aşamalar olarak anlatır, ama kod bugün ikisini de hesaplar (src/cluster_erp/modules/app_store/services.py:381-387,src/cluster_erp/modules/app_store/services.py:410-441). - Satıcı tarafında lisans üretimi bu deponun sunucu kodunda değildir; lisans dosyalarının nasıl üretildiği koddan belirlenemedi.
Tanıtılan terimler¶
| Terim | Kod tanımlayıcısı | Tanım | Türkçe terim | Kaynak |
|---|---|---|---|---|
| catalogue app | StoreApp |
Kapsadığı arka uç modülleriyle satılabilir bir uygulama. | katalog uygulaması | src/cluster_erp/modules/app_store/models.py:14 |
| licence state | LicenseState |
Yüklenen lisansın türetilmiş durumu: none, invalid, active, grace veya read_only. | Lisans Durumu (webapp/i18n/tr.json anahtarı license.status_title) |
src/cluster_erp/modules/app_store/license.py:32 |
| seat assignment | AppAssignment |
Bir uygulamayı bir rol için zorunlu, kullanılabilir veya engelli yapan kural. | koltuk ataması | src/cluster_erp/modules/app_store/models.py:77 |
| install consent | consented_modules |
Bir yöneticinin yüklü bir uygulama için onayladığı arka uç modülleri. | kurulum onayı | src/cluster_erp/modules/app_store/models.py:162 |
| entitlement gate | require_app |
Hakkı olmayan bir modüle gelen istekleri reddeden yönlendirici bağımlılığı. | hak kapısı | src/cluster_erp/server/entitlements.py:260 |
İlgili sayfalar¶
- Kimlik, erişim, kiracılık, gizlilik ve lisans
- App store modülü
- Roller ve izinler
- Korunan uygulama paketleri
92f8051 numaralı commit ile 2026-11-13 tarihinde doğrulandı.