2026-08-10 09:08:08 +00:00
# Sozsoft Platform
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
**Çalı şma zamanı nda yapı landı rı labilen, çok kiracı lı (multi-tenant) low-code uygulama motoru.**
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
Sozsoft Platform, klasik bir "kod yaz– derle– yayı nla" uygulaması değildir. Ekranlar, menüler,
route'lar, yetkiler, veri kaynakları , iş akı şları ve hatta API endpoint'leri **veritabanı ndaki
konfigürasyon kayı tları ndan** üretilir. Yeni bir modül veya ekran eklemek çoğu durumda tek satı r
React/C# kodu yazmadan, yalnı zca konfigürasyon ile mümkündür.
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
> **Temel ilke:** Configuration first, code last.
> Bu ilkenin operasyonel karşı lı ğı ve yapay zeka ajanları için bağlayı cı kurallar
> [`.github/instructions/ai.instructions.md`](.github/instructions/ai.instructions.md) dosyası ndadı r.
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
---
2026-06-09 12:54:05 +00:00
## İçindekiler
2026-08-10 09:08:08 +00:00
1. [Platform Ne Yapar? ](#1-platform-ne-yapar )
2. [Mimari Genel Bakı ş ](#2-mimari-genel-bakı ş )
3. [Teknoloji Yı ğı nı ](#3-teknoloji-yı ğı nı )
4. [Depo Yapı sı ](#4-depo-yapı sı )
5. [Hı zlı Başlangı ç ](#5-hı zlı -başlangı ç )
6. [Yapı landı rma (Configuration) ](#6-yapı landı rma-configuration )
7. [Low-Code Motoru: ListForm Ekosistemi ](#7-low-code-motoru-listform-ekosistemi )
8. [Developer Kit ](#8-developer-kit )
9. [Dinamik Menü, Route ve Yetki Modeli ](#9-dinamik-menü-route-ve-yetki-modeli )
10. [Modül Kataloğu ](#10-modül-kataloğu )
11. [Kimlik, Oturum ve Güvenlik ](#11-kimlik-oturum-ve-güvenlik )
12. [Çok Kiracı lı lı k (Multi-Tenancy) ](#12-çok-kiracı lı lı k-multi-tenancy )
13. [Bildirim ve Entegrasyonlar ](#13-bildirim-ve-entegrasyonlar )
14. [Arka Plan İşleri ](#14-arka-plan-işleri )
15. [Raporlama ](#15-raporlama )
16. [Dosya Yönetimi ve CDN ](#16-dosya-yönetimi-ve-cdn )
17. [Gerçek Zamanlı Özellikler ](#17-gerçek-zamanlı -özellikler )
18. [Frontend Mimarisi ](#18-frontend-mimarisi )
19. [API ve Swagger ](#19-api-ve-swagger )
20. [Dağı tı m (Deployment) ](#20-dağı tı m-deployment )
21. [Geliştirme Standartları ve Sı k Kullanı lan Komutlar ](#21-geliştirme-standartları -ve-sı k-kullanı lan-komutlar )
22. [Sorun Giderme ](#22-sorun-giderme )
23. [Bilinen Sı nı rlar ve Notlar ](#23-bilinen-sı nı rlar-ve-notlar )
---
## 1. Platform Ne Yapar?
| Yetenek | Açı klama |
| --- | --- |
| **Dinamik liste/form ekranları ** | `ListForm` + `ListFormField` kayı tları yla tanı mlanan; grid, pivot, ağaç, grafik, gantt, scheduler, kart ve todo görünümlerini destekleyen ekranlar. |
| **Dinamik menü ve route** | Menüler ve route'lar veritabanı ndan okunur; frontend bunları çalı şma zamanı nda React Router'a bağlar. |
| **Yetki tabanlı görünürlük** | Menü, ekran, sütun ve buton seviyesinde ABP permission kontrolü. |
| **SQL Query Manager** | Tarayı cı içinden SQL nesne gezgini, sorgu editörü, sonuç grid'i ve tablo tasarı mcı sı . |
| **Custom / CRUD Endpoint** | Kod yazmadan, SQL veya tablo tanı mı ndan REST endpoint üretimi. |
| **Dynamic Service** | Roslyn ile çalı şma zamanı nda derlenen ve controller olarak kaydedilen C# ApplicationService'ler. |
| **Custom Component** | Babel ile tarayı cı da derlenen, veritabanı nda saklanan React bileşenleri ve bunları n route'ları . |
| **İş akı şı / onay** | ListForm üzerinde görsel workflow tasarı mcı sı , koşullu dallanma ve çok kişili onay adı mları . |
| **Çok kiracı lı lı k** | Tenant başı na ayrı bağlantı dizesi (ayrı veritabanı ) desteği, şube (branch) ve organizasyon birimi kı rı lı mı . |
| **Bildirim ve entegrasyon** | SMS, e-posta, WhatsApp, Rocket.Chat, masaüstü ve UI kanalları na kural tabanlı bildirim. |
| **Raporlama** | DevExpress Report Designer/Viewer + ListForm'dan otomatik üretilen dinamik raporlar. |
| **Arka plan işleri** | Hangfire + ABP Background Worker; zamanlanmı ş SQL, mail kuyruğu, yedekleme, oturum temizliği. |
| **Gerçek zamanlı ** | SignalR tabanlı messenger ve video oda (WebRTC/TURN) altyapı sı . |
| **Intranet & Forum** | Duyuru, anket, sosyal duvar, etkinlik; kategori/konu/gönderi tabanlı forum. |
2026-09-08 14:00:15 +00:00
| **Public web sitesi** | Menüsü ve sayfaları veritabanı ndan yönetilen ziyaretçi sitesi: sayfalar Custom Component, menü `Pub` modülü (bkz. §10.4). Ürün/ödeme ve demo akı şları fiziksel sayfalardı r. |
2026-08-10 09:08:08 +00:00
| **PWA** | Service worker ile offline kabuk, kontrollü sürüm güncellemesi ve changelog bildirimi. |
---
## 2. Mimari Genel Bakı ş
```
┌──────────────────────────────────────────────────────────────────────┐
2026-08-26 18:44:53 +00:00
│ UI — React 19 + Vite + TypeScript + DevExtreme + Tailwind (PWA) │
2026-08-10 09:08:08 +00:00
│ ├─ DynamicRouter (route kayı tları ndan React Router üretimi) │
│ ├─ ListForm runtime (Grid / Pivot / Tree / Chart / Gantt / ...) │
│ ├─ Form runtime (DevExtreme Form, metadata ile alan üretimi)│
│ ├─ Developer Kit UI (SQL, endpoint, component, dynamic service) │
│ └─ easy-peasy store + React Query + SignalR │
└───────────────┬──────────────────────────────────────────────────────┘
│ HTTPS / OAuth2 (OpenIddict) / SignalR
┌───────────────▼──────────────────────────────────────────────────────┐
│ API — ASP.NET Core (.NET 10) + ABP Framework 10 │
│ ├─ HttpApi.Host : Swagger, OpenIddict, Hangfire, SignalR Hub, │
│ │ DevExpress Reporting, Setup/Migration akı şı │
│ ├─ Application : ListForms, DeveloperKit, Identity, Tenants, │
│ │ Menu, Routes, DataSource, FileManagement, ... │
│ ├─ Domain : Entity'ler, dinamik veri erişimi, seed'ler │
│ └─ EF Core : Migration'lar, dinamik DbContext, tenant DB │
│ │
│ Modüller: Languages · Settings · Notifications · MailQueue · │
│ Sender · SqlQueryManager │
└───────────────┬──────────────────────────────────────────────────────┘
│
┌───────────────▼──────────────────────────────────────────────────────┐
│ Veri ve Altyapı │
│ SQL Server / PostgreSQL · Redis (cache + SignalR backplane) · │
│ Hangfire (job storage) · Dosya sistemi tabanlı BLOB/CDN · │
│ coturn (TURN) · nginx · Elasticsearch (opsiyonel) │
└──────────────────────────────────────────────────────────────────────┘
```
**Akı şı n özeti:** Kullanı cı giriş yapar → ABP `application-configuration` yanı tı na
`PlatformApplicationConfigurationContributor` menü, route ve yetkileri ekler → `DynamicRouter`
route kayı tları nı React bileşenlerine bağlar → `/admin/list/{ListFormCode}` gibi bir ekran
açı ldı ğı nda `ListFormsAppService` metadata'yı , `ListFormDataAppService` ise veriyi döner →
DevExtreme bileşenleri bu metadata'ya göre kendini kurar.
---
## 3. Teknoloji Yı ğı nı
### Backend
| Bileşen | Sürüm / Notlar |
| --- | --- |
| .NET | `net10.0` (SDK 10.0.300, `global.json` ile sabit) |
| ABP Framework | 10.0.0 (Identity, TenantManagement, PermissionManagement, AuditLogging, OpenIddict, BlobStoring, BackgroundWorkers) |
| Veritabanı | SQL Server 2022 veya PostgreSQL 17 (`PlatformConsts.DefaultDatabaseProvider`) |
| ORM | Entity Framework Core |
| Kimlik | OpenIddict (password + refresh token, `/connect/token` ) |
| Cache | Redis (opsiyonel; `Redis:IsEnabled` ) |
| Job | Hangfire (`default`, `platform` kuyrukları ) + ABP Background Workers |
| Raporlama | DevExpress Reporting (Web Document Viewer + Report Designer) |
| Log | Serilog |
| Dinamik derleme | Roslyn (`DynamicServiceCompiler`) |
| Şablon | Scriban (mail şablonları ), MailKit/MimeKit |
| Gerçek zamanlı | SignalR (Redis backplane destekli) |
### Frontend
| Bileşen | Sürüm / Notlar |
| --- | --- |
2026-08-26 18:44:53 +00:00
| React | 19.2 |
2026-08-10 09:08:08 +00:00
| Build | Vite 8 + TypeScript 5.9 |
2026-08-26 18:44:53 +00:00
| UI kütüphaneleri | DevExtreme 26.1 (React), Tailwind CSS 3.4, kendi `components/ui` tasarı m sistemi |
| Routing | react-router-dom 7 (dinamik route üretimi) |
2026-08-10 09:08:08 +00:00
| State | easy-peasy (global store) + @tanstack/react -query |
| Form | Formik + Yup, DevExtreme Form |
| Kod editörü | Monaco Editor |
| Runtime derleme | @babel/standalone (Custom Component) |
| Takvim/Gantt | FullCalendar, DevExtreme Scheduler/Gantt |
| Gerçek zamanlı | @microsoft/signalr |
| PWA | vite-plugin-pwa (Workbox) |
| Node | 24.13 / npm 11 (`volta` ile sabitlenmiş) |
---
## 4. Depo Yapı sı
```
sozsoft-platform/
├── api/ # .NET çözümü (Sozsoft.Platform.sln)
│ ├── src/
│ │ ├── Sozsoft.Platform.Domain.Shared/ # Sabitler, enum'lar, permission kodları (AppCodes)
│ │ ├── Sozsoft.Platform.Domain/ # Entity'ler, dinamik veri erişimi, repository'ler
│ │ ├── Sozsoft.Platform.Application.Contracts/ # DTO'lar, servis arayüzleri, permission tanı mları
│ │ ├── Sozsoft.Platform.Application/ # Uygulama servisleri (iş mantı ğı )
│ │ ├── Sozsoft.Platform.EntityFrameworkCore/ # DbContext, migration'lar, dinamik veri katmanı
│ │ ├── Sozsoft.Platform.HttpApi/ # Controller'lar (conventional)
│ │ ├── Sozsoft.Platform.HttpApi.Client/ # HTTP istemci proxy'leri
│ │ ├── Sozsoft.Platform.HttpApi.Host/ # Host: Swagger, auth, Hangfire, SignalR, raporlama
│ │ └── Sozsoft.Platform.DbMigrator/ # Migration + seed uygulaması
│ ├── modules/ # Bağı msı z ABP modülleri
│ │ ├── Sozsoft.Languages/ # Dil, dil anahtarı , çeviri metinleri
│ │ ├── Sozsoft.Settings/ # Ayar tanı mları ve ayar UI'ı
│ │ ├── Sozsoft.Notifications/ # Bildirim tipleri, kuralları , kullanı cı bildirimleri
│ │ ├── Sozsoft.MailQueue/ # Şablonlu mail kuyruğu ve ekleri
│ │ ├── Sozsoft.Sender/ # Mail (SES), SMS, WhatsApp, Rocket.Chat göndericileri
│ │ └── Sozsoft.SqlQueryManager/ # SQL nesne yönetimi ve sorgu çalı ştı rma
│ └── test/ # Test projeleri
├── ui/ # React uygulaması
│ └── src/
│ ├── routes/ # dynamicRouter, dynamicRouteLoader, route.constant
│ ├── views/ # list, form, admin, developerKit, public, intranet, forum, report, auth, setup
│ ├── components/ # ui (tasarı m sistemi), template (layout), importManager, visualDesigner, componentEditor
│ ├── services/ # API istemcileri (her modül için ayrı servis dosyası )
│ ├── store/ # easy-peasy modelleri (auth, theme, locale, abpConfig, admin)
│ ├── contexts/ # ComponentContext (runtime bileşenler), Dialog, Scroll
│ └── utils/ # editorScriptRuntime, workflow, hooks, hoc, biçimlendirme yardı mcı ları
├── configs/
│ ├── docker/ # Yerel geliştirme için veri katmanı compose dosyaları ve scriptler
│ ├── deployment/ # Dev/Prod compose dosyaları , nginx/redis/turn konfigürasyonu, deploy scriptleri
2026-08-17 09:23:47 +00:00
│ ├── seeds/ # Runtime'da düzenlenebilen seed'ler; CDN ile aynı kapsam düzeni
│ │ # host/{crud,custom,wizard,sql,postgres}
│ │ # tenants/{tenantId}/{crud,custom,wizard,sql,postgres}
│ │ # {sql|postgres}/{object,execute}
2026-08-10 09:08:08 +00:00
│ └── ai/ # AI entegrasyonu (n8n akı ş tanı mları )
2026-08-26 18:44:53 +00:00
├── .github/instructions/ # ai.instructions.md (bağlayı cı platform kuralları )
│ # lowcode.instructions.md (artefakt üretim referansı : şemalar, örnekler)
│ # dotnet.instructions.md (api/ için bağlayı cı .NET/ABP kod standardı )
│ # list.instructions.md (modül/liste ekleme prosedürü)
2026-08-10 09:08:08 +00:00
├── CLAUDE.md # Claude Code için operasyon kuralları
└── README.md
```
---
## 5. Hı zlı Başlangı ç
### 5.1. Önkoşullar
- .NET SDK **10.0.300+**
- Node.js **24.x** ve npm **11.x** (Volta önerilir)
- Docker Desktop (veritabanı ve Redis için)
- DevExpress lisansı (`api/DevExpress_License.txt`) ve DevExtreme npm erişimi
### 5.2. Veri katmanı nı ayağa kaldı rma
```powershell
# SQL Server + Redis
.\configs\docker\start_sql.bat
# veya PostgreSQL + Redis
.\configs\docker\start_postgres.bat
```
Compose dosyaları `configs/docker/docker-compose-data.yml` içindedir; `sql` ve `postgres`
profilleri ile hangi veritabanı nı n kalkacağı seçilir. Redis her iki profilde de çalı şı r.
### 5.3. Backend
```powershell
cd api
dotnet restore
dotnet run --project src/Sozsoft.Platform.HttpApi.Host
```
Uygulama `https://localhost:44344` adresinde açı lı r. Swagger UI kök adreste yayı nlanı r.
**Veritabanı ilk kurulum:** Veritabanı yoksa host, tam ABP yı ğı nı yerine minimal bir
"setup" uygulaması ile açı lı r (`DbStartup/SetupAppRunner`). Bu durumda:
- `GET /api/setup/application-status` — veritabanı nı n hazı r olup olmadı ğı nı döner (anonim).
- UI tarafı nda `/setup` route'u (`views/setup/DatabaseSetup.tsx`) migration'ı tetikleyen ekranı gösterir.
- Migration için `Setup:MigrationPassword` yapı landı rması veya `App.Setup.Migrate` yetkisi gerekir.
Alternatif olarak migration + seed'i doğrudan çalı ştı rabilirsiniz:
```powershell
dotnet run --project api/src/Sozsoft.Platform.DbMigrator
```
DbMigrator; şema migration'ları nı uygular ve ardı ndan menü, route, permission, dil,
host ayarları , ülke/şehir/ilçe verileri ile seed edilmiş ListForm ekranları nı yükler
2026-08-17 05:56:52 +00:00
(kodla versiyonlanan sabit seed'ler `api/src/Sozsoft.Platform.DbMigrator/Migrations/` ,
runtime'da düzenlenebilen seed'ler `configs/seeds/` altı ndadı r — bkz. `App:SeedsPath` ).
2026-08-17 09:23:47 +00:00
`configs/seeds` altı nda en üst seviye kapsamdı r (CDN klasörleriyle aynı mantı k): host
veritabanı için `host/` , her tenant için `tenants/{tenantId}/` . Kapsamı n altı nda içerik
2026-09-05 18:20:18 +00:00
türüne göre `crud/` , `wizard/` , `data/` , `sql/` , `postgres/` klasörleri bulunur:
2026-08-17 09:23:47 +00:00
```
configs/seeds/
host/
2026-09-05 18:20:18 +00:00
crud/ wizard/ data/
2026-08-17 09:23:47 +00:00
sql/ { object/ execute/ }
postgres/ { object/ execute/ }
tenants/
{tenantId}/
2026-09-05 18:20:18 +00:00
crud/ wizard/ data/
2026-08-17 09:23:47 +00:00
sql/ { object/ execute/ }
postgres/ { object/ execute/ }
```
Aktif veritabanı sağlayı cı sı na göre `sql/` (SQL Server) ya da `postgres/` okunur. Her
`.sql` dosyası amacı nı belirten bir klasörün altı ndadı r; klasör köklerinde dosya bulunmaz:
2026-08-17 05:56:52 +00:00
| Klasör | Ne zaman çalı şı r |
| --- | --- |
2026-08-17 09:23:47 +00:00
| `{sql\|postgres}/object` | Seed sı rası nda nesneyi oluşturur/günceller. SqlTableDesigner ve SqlQueryManager, deploy ettiği script'i çalı ştı ğı kapsamı n bu klasörüne yazar (host bağlamı → `host/` , tenant seçiliyken → `tenants/{tenantId}/` ). |
| `{sql\|postgres}/execute` | Nesneyi oluşturur; ayrı ca tüm migration ve seed'ler bittikten sonra `AfterAllMigrationsSqlExecutor` dosya adı ndan türettiği procedure'ü çalı ştı rı r (dosya adı = procedure adı , `schema.Procedure.sql` de olur). |
| `wizard` | ListForm Wizard'ı n ürettiği `.json` konfigürasyonları ; `WizardDataSeeder` kendi kapsamı ndaki dosyaları okur. |
2026-09-07 14:43:46 +00:00
| `crud` | CrudEndpoint konfigürasyonları ; `CrudDataSeeder` kendi kapsamı ndaki dosyaları `ICrudEndpointSeedApplier` üzerinden uygular. Politika **damga karşı laştı rmalı dı r** : eksik endpoint her zaman eklenir, mevcut bir kayı t yalnı zca dosyanı n `GeneratedAt` damgası kaydı n `LastModificationTime` /`CreationTime` değerinden **yeniyse** güncellenir ya da silinir; aksi halde kayı t korunur ve log'a drift uyarı sı düşer. Böylece CRUD Endpoint Manager'dan yapı lan bir revizyon depodan gelen eski bir dosya yüzünden migrate sı rası nda geri alı nmaz. Damgası olmayan (eski biçimde yazı lmı ş) dosya hiçbir zaman yeni sayı lmaz. |
2026-09-05 18:20:18 +00:00
| `data` | Ekranlardan girilen listelerin veri aynası (`{ListFormCode}.json`). `ListForm.SeedFilePath` dolu olan ekranda `SeedSyncInsert/Update/Delete` bayrakları ndan işaretli olan işlemler dosyaya yansı r (`ListFormSeedDataSynchronizer`); migrate/seed sı rası nda bütün contributor'lar bittikten sonra `ListFormSeedDataApplier` dosyayı geri uygular: anahtarı veritabanı nda **olmayan** satı rları ekler, var olanlara dokunmaz. Aynı uygulayı cı wizard import'unun kapanı şı nda da (`CompleteImport`) yalnı zca o import'ta yazı lan dosyalar için, `overwriteExisting` açı k olarak çalı şı r — orada var olan satı r dosyadaki değerlerle güncellenir. |
2026-08-17 05:56:52 +00:00
Klasör kökünde kalmı ş eski `.sql` dosyaları geriye dönük uyumluluk için hâlâ işlenir,
fakat `SqlDataSeeder` bunları uyarı ile loglar — ilgili klasöre taşı nmaları beklenir.
2026-08-10 09:08:08 +00:00
### 5.4. Frontend
```powershell
cd ui
npm install
2026-08-12 12:20:00 +00:00
npm start # vite dev server (http://localhost:3000)
2026-08-10 09:08:08 +00:00
```
2026-08-12 12:20:00 +00:00
Visual Designer ve Custom Component altyapı sı nı n kullandı ğı bileşen kataloğu
`src/components/visualDesigner/generated/componentProps.json` dosyası nda tutulur ve repoya
dahildir. `src/components/ui` altı ndaki bileşen prop'ları değiştiğinde bu dosya elle
güncellenmelidir.
2026-08-10 09:08:08 +00:00
### 5.5. İlk giriş
Seed edilen host yöneticisi ile `/login` üzerinden giriş yapı lı r (kullanı cı bilgileri
`PlatformIdentityDataSeeder` ve `HostData.json` ile belirlenir; ortam bazlı değerler
`HostData.Dev.json` / `HostData.Production.json` dosyaları ndadı r). Giriş sonrası
`/admin/dashboard` açı lı r.
---
## 6. Yapı landı rma (Configuration)
### 6.1. Backend (`appsettings.json`)
| Anahtar | Açı klama |
| --- | --- |
| `App:SelfUrl` | API'nin kendi adresi (OpenIddict authority ile uyumlu olmalı ). |
| `App:ClientUrl` | React uygulaması nı n kök adresi (mail linkleri bu adresi kullanı r). |
| `App:CorsOrigins` | Virgülle ayrı lmı ş izinli origin listesi; wildcard subdomain destekli. |
| `App:RedirectAllowedUrls` | OAuth yönlendirme için izinli adresler. |
| `App:CdnUrl` / `App:CdnPath` | Dosya servisinin adresi ve BLOB kök dizini. |
| `App:AttachmentsPath` | Mail kuyruğu eklerinin yazı ldı ğı dizin. |
| `App:BackupPath` | Veritabanı yedek dizini (BackupWorker kullanı r). |
| `App:Version` | Uygulama sürümü (UI sürüm kontrolü ile eşleşir). |
| `ConnectionStrings:SqlServer` / `PostgreSql` | Host veritabanı bağlantı ları . |
| `Redis:IsEnabled` / `Redis:Configuration` | Dağı tı k cache ve SignalR backplane. |
| `AuthServer:Authority` / `SwaggerClientId` | OpenIddict authority ve Swagger istemcisi. |
| `OpenIddict:TokenLifetimes:*` | Access/refresh token ömrü (dakika). |
| `Setup:MigrationPassword` | Setup ekranı ndan migration tetiklemek için parola. |
| `StringEncryption:DefaultPassPhrase` | ABP string şifreleme anahtarı . |
| `Serilog:MinimumLevel` | Log seviyeleri. |
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
> **Güvenlik:** Depodaki `appsettings.json` dosyaları geliştirme değerleri içerir.
> Üretimde bağlantı dizeleri, `MigrationPassword`, `DefaultPassPhrase` ve entegrasyon
> anahtarları **ortam değişkeni veya secret yöneticisi** ile verilmelidir; repoya yazı lmamalı dı r.
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
### 6.2. Frontend (`ui/.env`, `.env.dev`, `.env.production`)
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
| Değişken | Açı klama |
2026-06-09 12:54:05 +00:00
| --- | --- |
2026-08-10 09:08:08 +00:00
| `VITE_API_URL` | API kök adresi. |
| `VITE_CDN_URL` | Dosya/CDN kök adresi. |
| `VITE_REACT_APP_VERSION` | `package.json` sürümünden beslenir. |
| `VITE_AI_URL` | AI asistanı nı n n8n webhook kökü. |
| `VITE_USE_POLLING` | Dosya izlemede polling (WSL/Docker senaryoları ). |
| `VITE_PWA_DEV` | Geliştirmede service worker'ı açar (varsayı lan kapalı ). |
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
### 6.3. Uygulama içi ayarlar
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
Çalı şma zamanı ayarları veritabanı nda tutulur ve **Ayarlar** ekranı ndan (`/admin/settings`)
yönetilir. `Sozsoft.Settings` modülü ayar tanı mları nı , `SettingUiAppService` ise bu tanı mları n
UI gösterimini yönetir. Şifre politikası , oturum kuralları , gönderici kimlik bilgileri (SMS,
mail, WhatsApp, Rocket) ve AI bot yapı landı rması bu yolla değiştirilir — kod dağı tı mı gerekmez.
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
---
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
## 7. Low-Code Motoru: ListForm Ekosistemi
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
Platformun kalbi budur. Bir iş ekranı ; bir `ListForm` kaydı , ona bağlı `ListFormField`
kayı tları ve bir menü/route/permission üçlüsünden oluşur.
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
### 7.1. Kavramlar
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
| Varlı k | Rolü |
2026-06-09 12:54:05 +00:00
| --- | --- |
2026-08-10 09:08:08 +00:00
| `DataSource` | Hedef veritabanı bağlantı sı (MSSQL / PostgreSQL). Ekranlar `DataSourceCode` ile bağlanı r. |
| `ListForm` | Ekranı n tüm davranı şı : veri kaynağı , sütun/filtre/sayfalama/düzenleme ayarları , yetkiler, alt formlar, iş akı şı , grafik ayarları . |
| `ListFormField` | Tek bir sütun/alanı n davranı şı : başlı k, tip, genişlik, editör, lookup, doğrulama, biçim, yetki. |
| `ListFormCustomization` | Kullanı cı bazlı kişiselleştirme: kayı tlı filtre, grid state, sunucu tarafı join/where. |
| `ListFormWorkflow` | Onay ve koşul düğümlerinden oluşan iş akı şı grafiği. |
| `ListFormImport` / `ImportLog` | Excel/CSV içe aktarma tanı mı ve satı r bazlı sonuç günlüğü. |
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
### 7.2. `ListForm` anatomisi
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
Ekran davranı şı büyük ölçüde JSON kolonları nda saklanı r. Öne çı kanlar:
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
| Alan | İşlevi |
2026-06-09 12:54:05 +00:00
| --- | --- |
2026-08-10 09:08:08 +00:00
| `SelectCommandType` + `SelectCommand` | Veri kaynağı türü: `Table` , `View` , `TableValuedFunction` , `Query` , `StoredProcedure` . |
| `KeyFieldName` / `KeyFieldDbSourceType` | Birincil anahtar alanı ve tipi. |
| `PermissionJson` | Ekranı n create/read/update/delete/export/import/note yetki eşlemesi. |
| `EditingOptionJson` / `EditingFormJson` | Düzenleme modu (row/cell/batch/form/popup) ve düzenleme formu düzeni. |
| `FilterRowJson` , `HeaderFilterJson` , `FilterPanelJson` , `SearchPanelJson` , `GroupPanelJson` | Filtreleme, arama ve gruplama davranı şı . |
| `ColumnOptionJson` , `PagerOptionJson` , `SelectionJson` , `StateStoringJson` | Sütun, sayfalama, seçim ve durum saklama ayarları . |
| `Insert/Update/DeleteCommand` (+ `Before` / `After` ) | CRUD komutları ve öncesi/sonrası çalı şacak SQL kancaları . |
| `Insert/Update/DeleteServiceAddress` | Varsayı lan olarak `list-form-data/*` ; özel endpoint'e yönlendirilebilir. |
2026-09-04 09:05:26 +00:00
| `SeedFilePath` | Doluysa seed sı rası nda listenin verisi kapsam klasöründeki bu JSON dosyası ndan geri yüklenir (`data/{ListFormCode}.json`). |
| `SeedSyncInsert` / `SeedSyncUpdate` / `SeedSyncDelete` | Ekranda yapı lan hangi işlemin seed dosyası na yansı yacağı ; kapalı ysa o işlem dosyaya dokunmaz. |
2026-08-10 09:08:08 +00:00
| `SubFormsJson` | Ana-detay ilişkisi (ParentFieldName → ChildFieldName eşlemesi). |
| `WidgetsJson` | Ekranı n üstünde gösterilecek KPI kartları . |
| `WorkflowJson` | İş akı şı bağlaması . |
| `ExtraFilterJson` | Ekrana özel ek filtre araç çubuğu. |
| `PivotOptionJson` , `TreeOptionJson` , `GanttOptionJson` , `SchedulerOptionJson` , `TodoOptionJson` | Alternatif görünümlerin ayarları . |
| Grafik alanları (`SeriesJson`, `LegendJson` , `ArgumentAxisJson` , `ValueAxisJson` , `TooltipJson` , `ZoomAndPanJson` , …) | DevExtreme Chart yapı landı rması . |
| `CustomJsSourcesJson` / `CustomStyleSourcesJson` | Ekran yüklendiğinde çalı şacak JS/CSS. |
| `IsTenant` , `IsBranch` , `IsOrganizationUnit` | Otomatik tenant/şube/organizasyon birimi filtrelemesi. |
| `UserId` , `RoleId` , `CultureName` | Aynı ekranı n kullanı cı , rol veya dil bazlı varyantları . |
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
### 7.3. Görünüm tipleri
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
Aynı `ListForm` tanı mı , aynı veri hattı üzerinden birden fazla görünümle sunulabilir:
2026-06-09 12:54:05 +00:00
2026-08-26 18:44:53 +00:00
`Grid` · `Pivot` · `Tree` · `Chart` · `Gantt` · `Scheduler` · `CardView` · `TodoBoard (Kanban)` ·
`Widget Group`
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
Kullanı cı görünümler arası nda geçiş yapabilir; grid durumu (sütun sı rası , genişlik, filtre,
gruplama) kullanı cı bazlı saklanı r ve sı fı rlanabilir.
2026-06-09 12:54:05 +00:00
2026-08-26 18:44:53 +00:00
**TodoBoard artı k bir Kanban panosudur:** kolonlar `TodoOptionJson` içindeki `statusExpr`
değerlerinden üretilir, kartlar kolonlar arası nda sürüklenerek durum değiştirir ve panodan yeni
kolon (durum) eklenebilir. Kart içeriği `titleExpr` , `descriptionExpr` , `dueDateExpr` , `tagExpr`
ve atanan kullanı cı alanları ndan kurulur.
2026-08-10 09:08:08 +00:00
### 7.4. Alan (field) davranı şı
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
- **Editör tipleri:** `dxTextBox` , `dxTextArea` , `dxNumberBox` , `dxDateBox` , `dxDateRangeBox` ,
`dxCalendar` , `dxCheckBox` , `dxSwitch` , `dxRadioGroup` , `dxSelectBox` , `dxTagBox` , `dxLookup` ,
`dxDropDownBox` , `dxGridBox` , `dxAutocomplete` , `dxColorBox` , `dxHtmlEditor` , `dxSlider` ,
`dxRangeSlider` — ayrı ca görsel yükleme/görüntüleme editörleri.
- **Lookup kaynakları :** `StaticData` , `Query` , `WebService` ; ebeveyn– çocuk (cascade) desteklidir.
- **Doğrulama:** `ValidationRuleJson` ile required/range/pattern/custom kuralları .
- **Editör script:** `EditorScript` alanı ile alan değişiminde çalı şan JS (örn. tarih farkı ndan
gün hesaplama, miktar × birim fiyat toplamı ). Çalı ştı rma `utils/editorScriptRuntime.ts` üzerinden yapı lı r.
2026-08-26 18:44:53 +00:00
- **Editör seçenekleri:** `EditorOptions` alanı DevExtreme editörüne geçirilen JSON'dur
(format, maske, placeholder, yükseklik, buton görünürlüğü, platform editörlerinin tipli
ayarları ). Elle JSON yazmak zorunlu değildir; bkz. 7.4.1.
2026-08-10 09:08:08 +00:00
- **Koşullu biçimlendirme:** `ColumnStylingJson` , `ColumnCssClass` /`ColumnCssValue`.
- **Alan bazlı yetki:** `PermissionJson` ile sütun düzeyinde okuma/yazma/dı şa aktarma kontrolü.
2026-06-09 12:54:05 +00:00
2026-08-26 18:44:53 +00:00
#### 7.4.1. Script Builder ve Editor Options Builder
`EditorScript` ve `EditorOptions` alanları hem görsel olarak hem de seeder kodundan üretilir;
**iki tarafı n çı ktı sı birebir aynı olmak zorundadı r.**
**Editor Script Builder** (`json-row-operations/editor-script/`)
- Kural sözlüğü `scriptRecipes.ts` içindedir; her tarif (recipe) tek satı rlı k runtime çağrı sı üretir.
Gruplar: hesap (`calc`), veri (`data`), görünüm (`view`), bildirim, API.
- Üretilen script'in ilk satı rı ndaki `// @builder {...}` başlı ğı kuralları saklar. Dialog script'i
regex ile çözmeye çalı şmaz, bu başlı ktan geri okur; başlı k bozulursa/elle düzenlenirse script
"manuel" sayı lı r ve kural editörü kapanı r.
- Kural tetikleyicileri: `change` (varsayı lan), `open` (form açı lı şı nda — varsayı lan değer üretmek
için, script başı na `// @runOnOpen` direktifi eklenir), `both` .
- Koşullar `and` /`or` ile birleşir: `equals` , `notEquals` , `contains` , `empty` , `notEmpty` ,
`greaterThan` , `lessThan` , `isTrue` , `isFalse` , `always` .
- Dialog'un kendisi ortaktı r (`components/scriptBuilder/ScriptBuilderDialog.tsx` + IntelliSense);
ListForm lehçesi `formScriptDialect.ts` , Visual Designer lehçesi `designerScriptDialect.ts`
ile aynı sözleşmeye bağlanı r.
**Seeder tarafı (C#)** — `Sozsoft.Platform.Domain.Shared/Editors/`
`scriptRecipes.ts` ve editorOptions sözlüğünün C# portudur. Seeder ile bası lan script/JSON,
dialogda açı lı p görsel olarak düzenlenebilir kalı r. Bir tarif TypeScript tarafı nda değişirse
buradaki karşı lı ğı da güncellenmelidir.
| Tip | Kullanı m |
| --- | --- |
| `EditorScript` | `Multiply` , `Subtract` , `Percent` , `Sum` , `Formula` , `Today` , `Days` , `Hours` , `Copy` , `SetValue` , `Clear` , `ReadOnly` , `Notify` , `Ask` , `OpenUrl` , `ApiToField` , `Custom` → `EditorScript.Build(rules)` |
| `EditorScriptRule` | `.When(...)` / `.WhenAny(...)` koşulları , `.OnChange()` / `.OnOpen()` / `.OnOpenAndChange()` tetikleyicisi; `string` 'e örtük dönüşür |
| `EditorScriptCondition` | `Is` , `IsNot` , `Contains` , `IsEmpty` , `IsNotEmpty` , `GreaterThan` , `LessThan` , `IsTrue` , `IsFalse` , `Always` |
| `EditorOptions` | Hazı r başlangı çlar: `Disabled()` , `ReadOnly()` , `ShowClearButton()` , `Multiline(h)` , `Number(precision)` , `Percent()` , `Date()` , `DateTime()` , `Time(interval)` , `Phone()` , `Slider()` , `ImageUpload()` , `Html(h)` |
| `EditorOptionsBuilder` | Akı cı ekleme: `.Placeholder()` , `.MaxLength()` , `.Height()` , `.Width()` , `.Format()` , `.Mask()` , `.Flag()` , `.Text()` , `.Number()` , `.Json()` ; `string` 'e örtük dönüşür |
```csharp
EditorOptions = EditorOptions.Number(4).ShowClearButton(),
EditorOptions = EditorOptions.Multiline(60).Placeholder("Açı klama"),
EditorScript = EditorScript.Build(
EditorScript.Multiply("Quantity", "UnitPrice", "Total"),
EditorScript.Percent("Total", "VatRate", "VatAmount", mode: EditorScriptPercentMode.Add)
.When(EditorScriptCondition.IsNotEmpty("VatRate"))),
```
**Editor Options Builder** (`json-row-operations/editor-options/`)
- UI tamamen `optionSpecs.ts` veri sözlüğünden üretilir; yeni bir ayar eklemek için oraya tek
satı r yazmak yeterlidir. Her ayar `path` (örn. `format.precision` ), tip (`boolean` üç durumlu /
`number` / `text` / `select` / `size` / `stringList` / `json` ), grup ve hangi editörlerde
anlamlı olduğu bilgisini taşı r.
- `platform: true` işaretli ayarlar backend'in tipli DTO'ya (`GridBoxOptionsDto`,
`TagBoxOptionsDto` , `ImageUploadOptionsDto` ) deserialize ettiği alanlardı r; yanlı ş tipte
yazı lı rsa sessizce yok sayı lı r.
- `presets.ts` hazı r kalı plar sunar (HTML editör tam araç çubuğu, telefon maskesi, tarih/saat…);
kalı p mevcut JSON ile **birleştirilir** , diğer ayarları silmez.
2026-08-10 09:08:08 +00:00
### 7.5. İş akı şı ve onay
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
`FormTabWorkflow` ve `views/admin/listForm/workflow/WorkflowDesigner.tsx` üzerinden görsel
tasarlanı r. Düğüm türleri koşul karşı laştı rması (`CompareColumn`/`CompareOperator`/`CompareValue`)
ve onay adı mları dı r; her adı m için `NextOnTrue` , `NextOnFalse` , `NextOnApprove` , `NextOnReject`
geçişleri tanı mlanı r. Onaycı birden fazla kişi olabilir. Formlar içinde iş akı şı na bağlı özel
butonlar gösterilebilir.
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
### 7.6. Yeni ekran ekleme akı şı (Wizard)
2026-06-09 12:54:05 +00:00
2026-08-26 18:44:53 +00:00
`/admin/listform/wizard` altı ndaki sihirbaz, aşağı daki artefaktları tek akı şta üretir:
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
1. **ListForm** kaydı (kod, ad, başlı k, veri kaynağı , select komutu, anahtar alan)
2. **ListFormField** kümesi (sütunlar, editörler, lookup'lar, doğrulamalar)
3. **Route** kaydı (`key`, `path` , `componentPath` , `routeType` , `authority` )
4. **Menu** kaydı (`ParentCode`, `Code` , `DisplayName` , `Url` , `Icon` , `RequiredPermissionName` , `Order` )
5. **Permission** kayı tları (`.Default`, `.Create` , `.Update` , `.Delete` , `.Export` , `.Import` , `.Note` )
2026-08-26 18:44:53 +00:00
6. **Dil anahtarları ** (menü, başlı k, açı klama; EN + TR)
7. Gerekiyorsa **ayar/entegrasyon** bağı mlı lı kları
2026-09-02 08:32:53 +00:00
8. **Seed dosyası ** — `configs/seeds/{host|tenants/{tenantId}}/wizard/{Ad}.json` (wizard cevapları + üretilen `ListForm` /`Fields` sözleşmesi)
2026-08-26 18:44:53 +00:00
9. **Doğrulama ve geri alma** notları
**Adı m bileşenleri.** Adı mlar numaralı dosya adları yerine işlevleriyle adlandı rı lı r ve
`React.lazy` ile yüklenir; aynı anda yalnı zca görünen adı m indirilir, sihirbazı n açı lı ş maliyeti
adı m sayı sı ndan bağı msı zdı r.
| Adı m | Dosya | İçerik |
| --- | --- | --- |
| Menü ve kimlik | `WizardStepMenu.tsx` | Wizard adı , ListForm kodu, menü ağacı /üst menü, ikon, sı ra, izin grubu, dil metinleri |
| Veri ayarları | `WizardStepDataSettings.tsx` | Veri kaynağı , select komutu tipi, anahtar alan, CRUD endpoint diyaloğu |
| Alanlar | `WizardStepFields.tsx` | Sütun grupları , editör tipleri, lookup, doğrulama |
| Alt formlar | `WizardStepSubForms.tsx` | Ana– detay ilişki eşlemesi |
| Widget'lar | `WizardStepWidgets.tsx` | KPI kartları |
| İş akı şı | `WizardStepWorkflow.tsx` | Onay/koşul grafiği |
| Düzen adı mları | `WizardStepTodoLayout` · `WizardStepTreeLayout` · `WizardStepGanttLayout` · `WizardStepSchedulerLayout` | Yalnı zca ilgili görünüm açı ksa görünür |
| Bileşen | `WizardStepComponent.tsx` · `WizardStepCustomComponent.tsx` | Custom yolunda bağlanacak bileşen |
| Yayı nlama | `WizardStepDeploy.tsx` | Özet, doğrulama ve seed dosyası nı n üretimi |
Menü ağacı yardı mcı ları (`menuTree.ts`) adı m bileşenlerinden ayrı bir modüldedir; böylece Wizard
ve `SqlTableDesignerDialog` bu fonksiyonları kullanı rken adı m bileşenlerini pakete çekmez.
2026-09-02 08:32:53 +00:00
**Seed dosyası ekranı n kendisini taşı r.** Dosya `Wizard` bölümünün yanı nda ekranı n
`GridOptionsEditDto` sözleşmesini (`ListForm`) ve alanları n `ColumnFormatEditDto` sözleşmesini
(`Fields`) tutar; `WizardDataSeeder` ekranı bu iki bölümden kurar. Böylece Wizard ile ListForm
detayı aynı veri yapı sı nı konuşur ve tasarı mcı daki değişiklikler wizard'a geri yazı labilir.
`Wizard` bölümü yalnı zca ekrandan üretilemeyen bilgileri (menü, yetki, dil metinleri, bileşen
yolu, alan başlı kları nı n dil karşı lı kları ) taşı r; `ListForm` /`Fields` içinde karşı lı ğı olan alanlar
dosyaya yazı lmaz, okuma sı rası nda geri doldurulur. Kalanlar dosyada `Menu` , `Language` ve `Groups`
başlı kları altı nda toplanı r (`WizardSeedFileDto.ToSeedJson` / `FromSeedJson` ). Dosya adı `{Ad}.json` 'dı r (zaman damgası yok);
uygulama sı rası `Wizard.SeededAt` damgası ndan gelir.
2026-08-26 18:44:53 +00:00
**İki yol: `ComponentKind` .** `ListFormWizardDto.ComponentKind` sihirbazı n yol ayrı mı dı r ve seed
dosyası nda ilk alandı r. Varsayı lan `List` olduğu için bu alanı taşı mayan eski seed dosyaları
eskisi gibi çalı şı r.
| `ComponentKind` | Üretilen | Menü URL'i | Yetkiler |
| --- | --- | --- | --- |
| `List` | ListForm + ListFormField + Route + Menu + Permission + dil anahtarları | `/admin/list/{ListFormCode}` | `.Create` , `.Update` , `.Delete` , `.Export` , `.Import` , `.Note` |
| `Custom` | Menü + Permission + dil anahtarları ; ekran seçilen Custom Component'tir | Component'in `RoutePath` değeri | Yalnı zca `.Create` , `.Update` , `.Delete` (Export/Import/Note ListForm'a özgüdür) |
**Menüsüz wizard (`CreateMenu = false`).** Menü (ve gerekiyorsa üst menü) kaydı hiç üretilmez;
ListForm, permission ve dil anahtarları her iki durumda da üretilir. Menüsüz wizard'lar başka bir
ekranda SubGrid/parça olarak kullanı lmak üzere tanı mlanı r. Alan varsayı lanı `true` olduğundan bu
alanı taşı mayan eski seed dosyaları etkilenmez.
**İzin grubu seçimi.** Menü adı mı nda izin grubu bir seçim listesinden gelir
(`GetWizardPermissionGroups`). Görünen adlar, grup adı yla aynı olan dil anahtarı nı n metinlerinden
2026-09-02 14:31:39 +00:00
okunur; seçim yapı ldı ğı nda `PermissionGroupEn/Tr` forma doldurulur. Yeni bir grup
2026-08-26 18:44:53 +00:00
tanı mlanı rsa grup adı yla aynı dil anahtarı na bu metinler yazı lı r; mevcut grup seçilip alanlar boş
bı rakı lı rsa sunucu veritabanı ndaki değeri geri yazar. Böylece seed dosyası her durumda iki dilli
görünen adı taşı r.
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
Dinamik liste ekranları nı n route deseni `/admin/list/{ListFormCode}` biçimindedir; form
görünümleri `/admin/form/{listFormCode}/:id` , grafik `/admin/chart/{listFormCode}` , pivot
`/admin/pivot/{listFormCode}` yolları nı kullanı r.
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
Var olan bir ekranı düzenlemek için `/admin/listform/edit/{listFormCode}` — tüm JSON
yapı landı rması sekmeli bir editörde yönetilir (Veritabanı , Sütunlar, Filtreler, Düzenleme,
Yetkiler, Alt Form, Pivot, Tree, Gantt, Scheduler, Todo, Widget, Workflow, Durum, Grafik sekmeleri).
2026-06-09 12:54:05 +00:00
2026-08-26 18:44:53 +00:00
**Wizard File Manager** (`/admin/listform/wizard` liste ekranı ) üretilmiş seed dosyaları nı yönetir:
liste/kart görünümü arası nda geçiş (tercih diğer listelerle aynı yerde, `admin.lists.states`
altı nda saklanı r), arama, düzenleme (dosyanı n yerine geçen yeni bir çalı ştı rma), silme, veritabanı
2026-09-05 18:20:18 +00:00
migrate tetikleme, dı şa aktarma ve içe aktarma. Liste, wizard'ı n ilk deploy damgası na
(`Wizard.SeededAt`) göre **tersine** sı ralı dı r — en son üretilen ekran en üstte durur; damgası
okunamayan dosyalar sona düşer. Butonlar `App.Listforms.Wizard.*` yetkileriyle gizlenir; ası l
kontrol `ListFormWizardAppService` üzerindedir.
2026-08-26 18:44:53 +00:00
2026-08-10 09:08:08 +00:00
### 7.7. İçe/dı şa aktarma
2026-06-09 12:54:05 +00:00
2026-08-26 18:44:53 +00:00
**Veri (ekran içi)**
2026-08-10 09:08:08 +00:00
- **Dı şa aktarma:** xlsx, csv, pdf (grid durumuna ve görünür sütunlara saygı duyar).
- **İçe aktarma:** `components/importManager` altı ndaki dosya yükleme → önizleme → ilerleme →
sonuç akı şı ; sonuçlar `ListFormImportLog` üzerinde satı r bazı nda raporlanı r. Şablon dosyası
ekran tanı mı ndan üretilir.
2026-06-09 12:54:05 +00:00
2026-08-26 18:44:53 +00:00
**Ekran tanı mı (wizard seed paketi)**
Bir ekranı n tanı mı , bağı mlı lı kları yla birlikte tek bir zip olarak taşı nı r. Zip içindeki yollar seed
kapsam klasörü (`host` / `tenants/{tenantId}` ) kökü baz alı narak yazı lı r; arşiv başka bir ortamda
aynı klasör düzenine doğrudan açı labilir.
2026-09-07 14:43:46 +00:00
Toplama **özyinelemelidir** (`WizardExportCollector`): alt formları n wizard dosyaları kuyruğa
eklenir ve onları n bağı mlı lı kları da aynı kurallarla toplanı r. Böylece zip tek başı na çalı şı r.
2026-08-26 18:44:53 +00:00
| Yol | İçerik |
| --- | --- |
2026-09-07 14:43:46 +00:00
| `wizard/{dosya}.json` | Wizard tanı mı nı n kendisi **ve** `SubFormsDto[].Code` ile bağlı alt form ekranları nı n wizard dosyaları (özyinelemeli) |
2026-09-05 18:20:18 +00:00
| `data/App.DeveloperKit.CustomComponents.json` | Custom yolunda bağlı component ve bağı mlı lı kları — dosyanı n yalnı zca bu satı rlara süzülmüş kopyası |
2026-09-07 14:43:46 +00:00
| `data/{ListFormCode}.json` | Ekranı n `SeedFilePath` değeri doluysa kendi veri aynası |
2026-08-26 18:44:53 +00:00
| `crud/{entity}.json` | Component'lerin/nesnenin kullandı ğı CRUD endpoint tanı mları |
2026-09-07 14:43:46 +00:00
| `{sql\|postgres}/{object\|execute}/{nesne}.sql` | `SelectCommand` 'a karşı lı k gelen SQL nesnesi, lookup sorguları nı n (`LookupDto.LookupQuery`) `FROM` /`JOIN` ile işaret ettiği nesneler ve Custom yolunda CRUD endpoint'lerinin dayandı ğı tablolar |
Script dosyaları sabit bir sağlayı cı /klasör kombinasyonundan **tahmin edilmez** : kapsam kökündeki
script klasörleri (`sql/object`, `postgres/execute` …) diskten taranı r ve nesne adı yla eşleşen her
dosya arşive girer. Yeni bir sağlayı cı ya da script klasörü eklendiğinde toplayı cı değişmez.
Script bulunamaması **uyarı üretmez** : her tablo seed ile yönetilmez — ABP'nin kendi tabloları
(`AbpUsers`, `AbpRoles` …) EF migration'ları yla kurulur ve seed script'leri yoktur. "Bu tablo
hedefte var mı " sorusunun tek doğru cevabı hedef veritabanı ndadı r; kararı import analizi verir,
export varsayı mda bulunmaz.
Çözülemeyen bir **kayı tlı referans** (seed dosyası nda adı geçen ama karşı lı ğı bulunmayan alt form,
`SeedFilePath` veri aynası , `DataSources[].SeedFile` CRUD dosyası , custom component satı rı )
indirmeyi engellemez ama sessiz de kalmaz: `ExportAnalysis` ucu indirmeden önce arşivin tam
içeriğini ve eksikleri döndürür, Wizard File Manager eksik varsa önce bu listeyi gösterir.
**İçe aktarma dört adı mlı bir sihirbazdı r** (`WizardImportDialog`, `Steps` bileşeni):
2026-08-26 18:44:53 +00:00
2026-09-07 14:43:46 +00:00
| Adı m | İçerik | Geçiş koşulu |
| --- | --- | --- |
| **Dosyalar** | Zip girdileri ve durumları ; çakı şanlar Monaco `DiffEditor` ile çözülür | Çözülmemiş çakı şma kalmamalı |
| **Kontroller** | Analiz bulguları ve zip'te atlanan girdiler. Engelleyiciler iki başlı kta ayrı lı r — **arşiv eksik ya da bozuk** (burada giderilemez, kaynak ortamda export tekrarlanmalı ; düzeltme düğmesi yoktur) ve **ortamda giderilebilir** . Tabloya dokunan bulgularda mevcut `SqlTableDesignerDialog` açı lı r — şema farkı nda **Tabloyu düzenle** (düzenleme modu), eksik tabloda **Tabloyu oluştur** (oluşturma modu, ad ön dolu); deploy sonrası analiz kendiliğinden yenilenir (önceki oturum bı rakı lı r) | Engelleyici (`Error`) bulgu kalmamalı |
| **Yapı lacaklar** | Onaylandı ğı nda ne olacağı nı n tam listesi: yazı lacak dosyalar, çalı şacak SQL script'leri, eklenecek kolonlar (cümleleriyle), uygulanacak CRUD ve veri dosyaları , kurulacak ekranlar. Sı ra sunucudaki kapanı ş sı rası yla aynı dı r | Onay |
| **Uygulama** | Dosya dosya yazı m, kapanı ş adı mları nı n sonucu | — |
Geriye dönüş her zaman serbesttir; ileri atlama bağı mlı lı k koşulları na bağlı dı r. Adı m başlı kları na
tı klanarak da gezinilebilir.
İçe aktarma **toplu (batch) bir işlemdir** : engelleme oturum genelindedir, dosya bazlı değildir.
Bir tek engelleyici bulgu tüm zip'i durdurur ve o dosyanı n işaretini kaldı rarak aşı lamaz — yarı m
kurulum üretmemenin tek güvenli yolu budur. Karşı lı ğı nda, tabloya dair her engel diyalogdan
çı kmadan giderilebilir (tablo tasarı mcı sı → deploy → analiz yenilenir). Tabloyla ilgisi olmayan
engeller (eksik alt form, eksik custom component bağı mlı lı ğı , bozuk JSON) zip'in kendisinin eksik
olduğunu gösterir; bunlar kaynakta düzeltilip yeniden export edilmelidir.
Adı mları n altı nda yatan üç sunucu işlemi şunlardı r:
2026-08-26 18:44:53 +00:00
1. **Analiz** (`AnalyzeImport`) — zip, seed kökü altı ndaki `.imports/{importId}/staged` klasörüne
açı lı r (nokta ile başladı ğı için seeder taramaları na girmez) ve her dosya hedefteki karşı lı ğı yla
karşı laştı rı lı r: `New` (hedefte yok), `Identical` (aynı , sorulmaz), `Conflict` (farklı ).
Çakı şan dosyalar Monaco `DiffEditor` ile karşı laştı rı lı p birleştirilir.
2026-09-05 18:20:18 +00:00
`data/*.json` girdilerinde karşı laştı rma **satı r bazlı dı r** : hedef dosyadan yalnı zca gelen
satı rları n anahtarları süzülür, dosya düzeyindeki `GeneratedAt` /`Order` karşı laştı rmaya girmez.
Böylece aktarı lan kaydı n dı şı ndaki satı rlar fark olarak görünmez; gelen satı rları n hiçbiri
hedefte yoksa dosya var olsa bile durum `New` (ekleme), varsa ve içerik aynı ysa `Identical`
(hiç aktarı lmaz), farklı ysa `Conflict` (güncelleme) olur.
2026-08-26 18:44:53 +00:00
2. **Uygulama** (`ApplyImport`) — dosyalar tek tek yazı lı r, ilerleme satı r satı r gösterilir. Yazı lan
her dosyanı n önceki hâli `.imports/{importId}/backup` altı na alı ndı ğı için hata durumunda
2026-09-05 18:20:18 +00:00
`RollbackImport` ile toplu işlem geri alı nabilir.
2026-09-07 14:43:46 +00:00
3. **Kapanı ş** (`CompleteImport`) — oturum kapatı lmadan önce zip'in getirdiği dosyalar
**bağı mlı lı k sı rası yla** veritabanı na uygulanı r. Sı ra bilinçli ve sabittir:
** (a)** `{sql|postgres}/{object,execute}/*.sql` scriptleri çalı ştı rı lı r (`object` önce) — tablo
yoksa burada oluşur, aksi halde sonraki iki adı m eksik tablo yüzünden baştan düşerdi;
** (b)** hedefte eksik olan kolonlar eklenir (aşağı ya bakı n);
** (c)** `crud/*.json` dosyaları `ICrudEndpointSeedApplier` ile uygulanı r;
** (d)** `data/*.json` dosyaları
2026-09-05 18:20:18 +00:00
`IListFormSeedDataApplier.ApplyFilesAsync(..., overwriteExisting: true)` ile veritabanı na
uygulanı r: tabloda olmayan satı r eklenir, var olan satı r dosyadaki değerlerle **güncellenir**
(migrate/seed akı şı ndan farkı budur — orada dosya bayat olabileceği için canlı kayda
dokunulmaz). Kayı t daha önce **soft delete** edilmişse silinme izleri de temizlenir
(`IsDeleted`, `DeletionTime` , `DeleterId` ); aksi halde satı r tabloda durur ama ekranı n
varsayı lan süzgeci (`"IsDeleted" = 'false'`) onu gizlemeye devam ederdi. Hangi kolonları n
sı fı rlanacağı ekranı n `DeleteCommand` 'ı ndan okunur, hard delete yapan ekranda hiçbir şey
eklenmez. Hedefle **zaten aynı ** olan (`Identical`) veri dosyaları da uygulanı r: yazacak bir şey
yoktur ama satı rlar veritabanı nda eksik ya da silinmiş olabilir. Kullanı cı nı n "mevcudu koru"
dediği (farklı olup yazı lmayan) dosyaya dokunulmaz. Anahtarı olmayan satı r güncellenemez,
atlanı r; eklenen/güncellenen/atlanan satı r
sayı sı dialogda raporlanı r. Bu adı m `RollbackImport`
2026-09-07 14:43:46 +00:00
kapsamı nda **değildir** — geri alma bu adı mdan önce yapı lı r.
5. **Ekran tanı mları ** (`wizard/*.json`) — son adı m: ekranı n tablosu, CRUD ucu ve lookup verileri o
noktada hazı rdı r. Kurulum wizard ekranı nı n kullandı ğı yolun aynı sı ndan geçer
(`DeployWizardAsync`), dosya ekranı n üretilmiş `ListForm` /`Fields` sözleşmesini taşı dı ğı için
bunlar wizard cevapları ndan **yeniden türetilmez** — tasarı mcı üzerindeki her değişiklik olduğu
gibi kurulur. **Hedefte zaten var olan ekrana dokunulmaz.** Her ekran kendi işleminde kurulur:
bir dosyadaki hata yalnı zca o ekranı n kayı tları nı geri alı r. İmport bittiğinde ekran çalı şı r
durumdadı r, migrate beklemez; istemci ABP config'ini yeniler, böylece menü anı nda görünür.
**Analiz doğrulama da yapar** (`WizardImportValidator`). Zip'in hedef ortamda yarı m bir kurulum
bı rakı p bı rakmayacağı dosyalar yazı lmadan **önce** denetlenir; bulgular `Error` /`Warning` olarak
raporlanı r ve en az bir `Error` varken import başlatı lamaz — sunucu oturuma `blocked` işaret
dosyası bı rakı r, dolayı sı yla `ApplyImport` ucu doğrudan çağrı lsa bile reddeder.
| Kural | Ağı rlı k |
| --- | --- |
| Bozuk JSON (`wizard`, `crud` , `data` ) | Error |
| Wizard bölümü ya da adı olmayan wizard dosyası ; `ListForm` bölümü eksik List wizard'ı | Error |
| Ekranı n tablosu (`SelectCommand`, `Table` /`View`) hedefte **yok** ve zip onu oluşturan `.sql` dosyası nı **taşı mı yor** | Error |
| `crud/{Entity}.json` 'un tablosu hedefte yok ve zip'te oluşturan script yok | Error |
| `data/{code}.json` 'un ekranı ne zip'te ne hedefte var | Error |
| Custom component'in `Dependencies` ya da `DataSources[].SeedFile` bağı mlı lı ğı ne zip'te ne hedefte var | Error |
| Custom wizard'da bileşen adı / rota yolu boş | Error |
| Alt form (`SubFormsDto[].Code`) ne zip'te ne hedefte var | Error |
| Nesne varlı ğı sorgulanamadı (bağlantı /izin) ve script de yok | Warning |
| Zip yalnı zca karşı sağlayı cı nı n (`sql` ↔ `postgres` ) scriptlerini taşı yor | Warning |
| Ekranı n `SeedFilePath` veri dosyası ne zip'te ne hedefte var; boş CRUD/veri dosyası | Warning |
| Script'in kurduğu tablo hedefte **var** ama bir kolonu eksik | Warning — kapanı şta eklenir |
| Eksik kolon `NOT NULL` , varsayı lanı yok ve tabloda kayı t var | Error (otomatik eklenemez) |
| Var olan kolonun uzunluk / kesinlik / ondalı k / nullability değeri script'ten farklı | Error |
| Hedefte script'te olmayan fazladan kolon var | Warning (dokunulmaz) |
Eksik tablo ölçütü "veritabanı nda var" değil, "veritabanı nda var **ya da** zip onu oluşturan
scripti taşı yor"dur — kapanı ş scriptleri veri satı rları ndan önce çalı ştı rdı ğı için zip'te scripti
olan tablo eksik sayı lmaz.
#### Şema karşı laştı rması — tablo var ama yapı sı farklı ysa
Üretilen tablo script'leri `IF OBJECT_ID(...) IS NULL BEGIN CREATE TABLE ... END` kalı bı yla sarı lı dı r:
hedefte tablo varsa `CREATE` bloğu **tamamen atlanı r** . Dolayı sı yla eski şemalı bir tabloya yeni bir
kolon kendiliğinden gelmez; ekran o kolonu bir alan olarak tanı mladı ğı için açı lı şta "geçersiz kolon"
hatası verir. Bu sessiz uyuşmazlı ğı analiz adı mı yakalar (`SqlCreateTableParser` +
`WizardImportValidator` ): zip'in getirdiği `CREATE TABLE` bildirimi, hedef tablonun
`INFORMATION_SCHEMA.COLUMNS` üzerinden okunan canlı şeması yla karşı laştı rı lı r.
Ayrı m **kayı p riskine** göre yapı lı r:
- **Eksik kolon eklenir.** Kolon eklemek kayı psı z bir işlemdir; analiz "şu kolon eklenecek" diye
uyarı r, çalı ştı rı lacak cümleyi gösterir ve kapanı şta (SQL script'lerinden sonra, CRUD ve veriden
önce) uygular. Tek istisna: `NOT NULL` olup varsayı lan değeri olmayan bir kolon dolu bir tabloya
eklenemez — kolona hangi değerin yazı lacağı bir iş kararı dı r, bu durumda import durdurulur ve
cümle kullanı cı ya bı rakı lı r. Tablonun boş olup olmadı ğı çalı şma anı nda sorgulanı r; boş tabloya
böyle bir kolon güvenle eklenir.
- **Var olan kolon değiştirilmez.** Uzunluk/kesinlik/ondalı k/nullability farkı nda import durur.
Daraltma veri keser, tip dönüşümü başarı sı z olabilir; doğru işlem veriye bakmayı gerektirir.
Fark somut olarak bildirilir ("uzunluk hedefte 200, script'te 300"), düzeltmeyi kullanı cı yapar.
- **Hiçbir kolon düşürülmez, hiçbir tablo `DROP` edilmez.** Hedefteki fazla kolon yalnı zca
bilgilendirme olarak listelenir.
Karşı laştı rma **tip adı na bakmaz** . Sağlayı cı kataloğu kendi kanonik adı nı raporlar (PostgreSQL'de
`VARCHAR` → `character varying` , `TIMESTAMP` → `timestamp without time zone` ); script'teki yazı lı şla
metin olarak karşı laştı rmak her `VARCHAR` kolonunda sahte fark üretirdi. Yalnı zca her iki
sağlayı cı da da aynı anlamı taşı yan ölçüler karşı laştı rı lı r: uzunluk, kesinlik/ondalı k, nullability.
Script bir tablo kurmuyorsa (procedure, view) ya da `CREATE TABLE` çözülemiyorsa karşı laştı rma
sessizce atlanı r — tahmin yürütülmez.
2026-09-05 18:20:18 +00:00
`data/*.json` dosyaları kapsamdaki bütün satı rları taşı dı ğı için üzerine yazı lmaz: satı rlar anahtar
alan üzerinden birleştirilir (gelen satı r varsa günceller, yoksa eklenir, hedefteki diğer satı rlar
korunur). Diff ekranı nda düzenlenen içerik de aynı sözleşmeyi taşı dı ğı için elle birleştirme bu
davranı şı bozmaz.
Güvenlik sı nı rları : yalnı zca `wizard` , `crud` , `data` , `sql` , `postgres` kök klasörleri
2026-08-26 18:44:53 +00:00
(SQL sağlayı cı klasörlerinin altı nda yalnı zca `object` ve `execute` ) kabul edilir; dosya başı na
5 MB, arşiv başı na 50 MB, en çok 500 girdi. Kabul edilmeyen girdiler analiz sonucunda uyarı
olarak listelenir. Yetkiler: `App.Listforms.Wizard.Export` / `App.Listforms.Wizard.Import` .
2026-08-10 09:08:08 +00:00
---
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
## 8. Developer Kit
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
Teknik kullanı cı lar için `/admin/developerkit` altı nda toplanan araçlar:
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
| Araç | Route | Ne işe yarar |
2026-06-09 12:54:05 +00:00
| --- | --- | --- |
2026-08-26 18:44:53 +00:00
| **SQL Query Manager** | `/admin/sqlQueryManager` | Nesne gezgini, Monaco tabanlı SQL editörü, sonuç grid'i, **tablo tasarı mcı sı ** , **view tasarı mcı sı ** ve **CRUD endpoint yönetimi** . |
2026-08-17 14:26:51 +00:00
| **Custom Endpoint** | `/admin/list/App.DeveloperKit.CustomEndpoints` | SQL veya servis tanı mı ndan REST endpoint üretimi; GET/POST/PUT/DELETE için ayrı yetki kapı ları (`App.DeveloperKit.CustomEndpoints.*`) ve kullanı cı /rol/global erişim kuralları . |
| **CRUD Endpoint** | SQL Query Manager içinde | Tablo tanı mı ndan tam CRUD endpoint kümesi üretimi. Ayrı ekranı yoktur; bkz. aşağı daki not. |
2026-09-05 09:06:14 +00:00
| **Dynamic Service** | `/admin/list/App.DeveloperKit.DynamicServices` | Liste bir ListForm ekranı dı r (KPI şeridi, Swagger butonu, kart/ı zgara görünümü); kod yazma listeden açı lan `DynamicServiceEditor` diyalogundadı r: Monaco editörü, Roslyn ile derleme (`TestCompile`), yayı nlama (`Publish`) ve çalı şan uygulamaya controller olarak kaydetme. Yetkiler: Create/Edit/Delete/Manage/TestCompile/Publish/ViewCode. |
2026-09-07 06:14:00 +00:00
| **Custom Component** | `/admin/list/App.DeveloperKit.CustomComponents` | React bileşenini veritabanı nda saklama; `@babel/standalone` ile tarayı cı da derleyip route'a bağlama. Liste bir ListForm ekranı dı r (KPI şeridi, ı zgara/kart görünümü, grid'in kendi ekleme/düzenleme formu); satı rdaki **Design** butonu `/admin/developerkit/components/design/{id}` tasarı mcı sı nı , **Open URL** butonu bileşenin `RoutePath` 'ini açar. Kayı tlar `configs/seeds/host/data/App.DeveloperKit.CustomComponents.json` dosyası na senkronlanı r. Yetkiler `App.DeveloperKit.CustomComponents{,.Create,.Update,.Delete,.Export,.Import}` . |
| **Visual Designer** | `/admin/developerkit/components/design/:id` | Custom Component listesindeki **Design** butonundan açı lı r; sürükle-bı rak kanvas ile bileşen üretimi ve kod üretimi (`visualDesigner/codeGenerator.ts`). |
2026-08-26 18:44:53 +00:00
| **ListForm** | `/admin/list/App.Listforms.Listform` | Var olan ekranları n ham tanı m listesi; buradan `/admin/listform/edit/{kod}` sekmeli editörüne geçilir. |
| **Wizard Manager** | `/admin/listform/wizardManager` | Üretilmiş wizard seed dosyaları nı n listesi/kartı , düzenleme, silme, DB migrate, export/import. Yetki `App.Listforms.Wizard{,.Create,.Update,.Delete,.Export,.Import}` . |
> Bu ekranları n artefakt şemaları , enum değerleri ve çalı şan örnekleri
> [`.github/instructions/lowcode.instructions.md`](.github/instructions/lowcode.instructions.md)
> dosyası ndadı r.
### 8.1. SQL View Designer
`SqlViewDesignerDialog` (+ `sqlViewDesigner/` ), SSMS Query Designer düzeninde görsel view
oluşturma aracı dı r. Üç panel:
- **Diagram** (`DiagramPane.tsx`) — `ViewSource` kutuları (x/y konumlu, daraltı labilir, yalnı zca
seçili kolonları gösterebilir) ve araları ndaki JOIN okları . Kaynak bir tablo/view olabileceği
gibi `CROSS/OUTER APPLY` ya da türetilmiş bir alt sorgu da olabilir; alt sorgunun gövdesi
olduğu gibi saklanı r. JOIN türleri: `INNER` , `LEFT` , `RIGHT` , `FULL` , `CROSS` ; koşul
operatörleri `=` , `<>` , `>` , `>=` , `<` , `<=` .
- **Criteria grid** (`CriteriaGrid.tsx`) — Column / Alias / Output / Group By / Sort / Filter /
Or… satı rları . Bir satı r ya `sourceId + columnName` referansı dı r ya da serbest bir SQL
ifadesidir. Group By sütunu `GroupBy` , `Where` (satı r çı ktı ya girmez, yalnı zca filtre taşı r) ve
`SUM` /`COUNT`/`COUNT_DISTINCT`/`AVG`/`MIN`/`MAX` değerlerini alı r. Filtre hücreleri SSMS'teki
gibi serbest yüklemdir (`> 100`, `LIKE '%abc%'` , `IS NULL` ).
- **T-SQL önizleme** — model → SQL üretimi (`generateViewSql`).
Tasarı mcı tek yönlü çalı şı r: **model → T-SQL** . Mevcut bir view açı lı rken `parseViewSql` ile geri
okunmaya çalı şı lı r; üretilen kanonik şekle uymayan bir tanı m gelirse dialog **ham SQL moduna**
düşer ve kullanı cı Query Editor'dan devam eder (`onOpenInEditor`). PostgreSQL bağlantı ları nda
`isPostgreSql` bayrağı ile söz dizimi buna göre üretilir.
2026-06-09 12:54:05 +00:00
2026-08-17 14:26:51 +00:00
> **CRUD Endpoint, SQL Query Manager ile birleştirildi.** Ayrı `/admin/developerkit/endpoints`
> ekranı ve menüsü kaldı rı ldı . Endpoint üretme, aktif/pasif etme, test etme ve silme işlemleri
> artı k iki yerden yapı lı r: SQL Query Manager nesne gezgininde tablo satı rı nı n **CRUD Endpoints**
> aksiyonu (ve seçili tablolar için toolbar'daki toplu üretim butonu), ayrı ca ListForm
> sihirbazı nı n **Adı m 2 – Veri Kaynağı ** ekranı ndaki aynı diyalog. Ayrı ca **tablo
> tasarı mcı sı nda deploy öncesi bir adı m** vardı r: endpoint üretilip üretilmeyeceği ve
> hangi operasyonları n (GetList/GetById/Create/Update/Delete) aktif başlayacağı seçilir
> ("tümünü seç" destekli); seçilmeyenler pasif olarak kaydedilir, sonradan diyalogdan
> açı labilir. Hepsi `CrudEndpointDialog` bileşenini kullanı r. Yetki `App.SqlQueryManager` altı ndaki
> `App.SqlQueryManager.CrudEndpoints`'tir; izin verilmemişse butonlar görünmez ve
> `crud-endpoint-generate` uçları nı n tamamı (base CRUD metotları dahil) reddedilir.
> Üretilen endpoint'ler `configs/seeds/{host|tenants/{tenantId}}/crud/{EntityName}.json` olarak
> seed dosyası na yazı lı r; `CrudDataSeeder` aynı dosyaları okuyup endpoint'leri geri yükler.
2026-08-10 09:08:08 +00:00
> **Tablo tasarı mı varsayı lanı :** Yeni tablo oluştururken tenant ve tam denetim (audit) kolonları
> varsayı lan olarak eklenir: `Id`, `TenantId`, `CreationTime`, `CreatorId`, `LastModificationTime`,
> `LastModifierId`, `IsDeleted`, `DeletionTime`, `DeleterId`. Kullanı cı açı kça istemedikçe bu
> kolonlar çı karı lmaz.
2026-06-09 12:54:05 +00:00
2026-08-26 18:44:53 +00:00
### 8.2. Custom Component ve Visual Designer
**Saklanan tanı m.** Bir custom component `Name` , `RoutePath` , `Code` (JSX), `Props` ,
`Dependencies` ve `DataSources` alanları ndan oluşur. Görsel tasarı mcı dokümanı iki yerde tutulur:
`Props.visualDesigner` içinde (nodes, canvas, lifecycle, dataSources) ve üretilen kodun ilk
satı rı ndaki `/*__SOZSOFT_VISUAL_DESIGNER__…__*/` yorumunda. Böylece yalnı zca kod elinizdeyse bile
tasarı mcı dokümanı geri okunabilir. `sourceMode` alanı `visual` ya da `code` olur; kod moduna
geçilen bir bileşen kanvasa geri dönmez.
2026-09-05 18:20:18 +00:00
**Seed senkronizasyonu.** Bileşenlerin seed kaynağı Custom Components ekranı nı n veri dosyası dı r:
`configs/seeds/{host|tenants/{tenantId}}/data/App.DeveloperKit.CustomComponents.json` . Bileşene
yazan **iki yol** da bu dosyaya işlenir (`ListFormSeedDataSynchronizer`): listeden yapı lan
ekleme/güncelleme/silme ve Visual Designer'ı n kaydı (`CustomComponentAppService`). Veritabanı
sı fı rlandı ğı nda `ListFormSeedDataApplier` satı rları geri yazar; `Code` , `Props` ve `DataSources`
kolonları bu yüzden ekranda gizli alan olarak tanı mlı dı r. `DataSources` sütunu tasarı mcı
dokümanı ndan türetilir (`CustomComponentDataSourceResolver`): Data sekmesindeki her endpoint
`method + path` ile CRUD endpoint kataloğunda aranı r, eşleşenler `EntityName` +
`crud/{EntityName}.json` referansı nı taşı r, elle yazı lmı ş olanlar listede kalı r ama bu alanları
boş gelir. Wizard export'u bu referansları izleyerek bağlı `crud/*.json` dosyaları nı zip'e ekler.
2026-08-26 18:44:53 +00:00
**Toolbox.** Kanvasa bı rakı labilecekler beş aileye ayrı lı r:
| Aile | İçerik |
| --- | --- |
| `layout` | `PageContainer` , `FlexRow` (kolon sayı sı , ilk kolon genişliği, hizalama, gap, wrap), `Spacer` |
| `data` | `Form` — ASP.NET'in Form + FormView karşı lı ğı ; dört CRUD endpoint'ini sahiplenen kapsayı cı |
| `platform` | `ListView` , `DataGridView` , `TreeView` , `GanttView` , `TodoBoard` , `CardView` , `SchedulerView` , `PivotView` , `ChartView` — hepsi `listFormCode` ile bir ListForm ekranı nı gömer |
| `html` / `ui` | Ham HTML etiketleri ve `components/ui` tasarı m sistemi bileşenleri (sözleşmeleri metadata'dan okunur) |
| `custom` | Başka custom component'ler (bağı mlı lı k olarak kaydedilir) |
**Form bileşeni.** `selectEndpoint` / `insertEndpoint` / `updateEndpoint` / `deleteEndpoint` ,
`keyFieldName` , `collectionPath` , `keySource` + `keyParamName` , `previewKeyValue` , `autoLoad` ,
`showToolbar` , `columnCount` , `gap` özellikleriyle yapı landı rı lı r. İçine bı rakı lan her bileşen
Select sonucunun bir kolonuna bağlanı r ve Save/Delete üzerinden geri yazar.
**Veri bağlama.** `DesignerBinding` bir kaynağa (`sourceId`) ve yola (`path`) bağlanı r; `labelPath`
/ `valuePath` seçim bileşenleri içindir. `columns` ile ekranda görünmeyen ek sütunlar da taşı nı r
ve script'ten `refs.<ad>.getColumn('sutun')` ile okunup başka bir bileşenin değerine ya da Form
kaydı na yazı lı r. Filtreler CrudEndpoint `GetList` sözleşmesine göre üretilir: `eq` çı plak query
parametresi (`?RoleId=…`), diğerleri son ek taşı r (`?Name.contains=…`). Operatörler: `eq` , `ne` ,
`contains` , `startswith` , `endswith` , `gt` , `gte` , `lt` , `lte` , `in` , `isnull` , `notnull` .
**Yetki modeli.** İki katmanlı dı r:
- **Node görünürlüğü** — `designerPermission` prop'u dolu olan bir düğüm, yetki verilmemişse
render edilmez.
- **Form komutları ** — her komut (`selectPermission`, `insertPermission` , `updatePermission` ,
`deletePermission` ) ya serbesttir (boş) ya da bir yetkiye bağlı dı r. `Otomatik` modda temel,
Wizard'ı n bu bileşen için ürettiği okuma yetkisidir (menü kaydı nı n korunduğu yetkinin aynı sı ) ve
komutlara `''` / `.Create` / `.Update` / `.Delete` son ekleri eklenir. `Özel` modda yetki adı
elle yazı lı r.
**Script.** Tasarı mcı , ListForm Editor Script ile aynı ortak dialog'u kullanı r
(`designerScriptDialect.ts` + `designerScriptRecipes.ts` ); tarif grupları bileşen erişimi, API
çağrı ları , form ve olay/sayfa başlı kları altı nda toplanı r.
2026-09-08 14:00:15 +00:00
**Kanvas doğruluğu.** Tasarı m zamanı nda görülen, canlı da görülendir; bunu iki mekanizma sağlar.
(1) *Yerleşim sı nı fları nı n taşı nması * : kanvas her düğümü seçim/sürükleme için bir sarmalayı cı ya
alı r ve üst öğe grid/flex olduğunda ası l öğe o sarmalayı cı olur. `splitLayoutClasses` düğümün
yerleşim sı nı fları nı sarmalayı cı ya geçirir — `col-span` /`row-span`/`order`/`self`/`flex-1`/`basis`,
sabit ve kesirli `w-*` , kenar boşlukları taşı nı r; konum sı nı fları (`absolute`, `inset-*` , `z-*` ,
`w-full` ) her ikisinde de kalı r. Görünürlük sı nı fları da sarmalayı cı ya kopyalanı r (`hidden lg:flex`
→ sarmalayı cı da `hidden lg:block` ): aksi hâlde mobilde gizlenmesi gereken masaüstü şeridi yine bir
grid hücresi işgal eder ve komşuları nı yanlı ş hücreye iter. `fixed` kanvasta akı şa çevrilir, yoksa
düğüm tasarı m yüzeyinden taşardı . (2) *Cihaz çerçevesi* : araç çubuğundan masaüstü/tablet/mobil seçildiğinde kanvas kendi
belgesinde çizilir (`CanvasFrame`), böylece `md:` /`lg:` kuralları tarayı cı penceresine değil seçilen
genişliğe göre çözülür. Cihaz modunda tasarı m yüzeyi kenar boşluğunu bı rakı r: kanvas o cihazı n ekranı dı r. `Responsive`
seçimi aynı sayfada, çerçevesiz ve boşluklu çizer. (3) *Gezinme kapalı dı r* : kanvastaki bir bağlantı ya
tı klamak seçim yapar, sayfayı değiştirmez — tı klama yakalama evresinde durdurulur, `react-router` 'ı n
`Link` 'i de `defaultPrevented` görünce gezinmez.
2026-08-26 18:44:53 +00:00
**Diğer notlar.** `PlatformIcon` tasarı mcı dokümanı ndaki ikon adı nı çözer; `selectComponents.ts`
`Select.componentAs` için saklanan adı (`ReactSelect`, `CreatableSelect` , `AsyncSelect` ) gerçek
bileşene çevirir — kanvas ve üretilen bileşenin aynı adı aynı şekilde yorumlaması nı sağlayan tek
2026-09-05 18:20:18 +00:00
nokta budur. Yeni bileşen `configs/seeds/host/data/App.DeveloperKit.CustomComponents.json`
içindeki bir satı r olarak başlar.
2026-08-26 18:44:53 +00:00
2026-08-10 09:08:08 +00:00
**Dinamik servis yaşam döngüsü:** `DynamicServiceCompiler` kodu derler →
`DynamicAssemblyRegistrationService` assembly'yi tenant bağlamı yla kaydeder →
`ActionDescriptorChangeProvider` MVC'ye route tablosunun değiştiğini bildirir →
`DynamicControllerActivator` bağı mlı lı kları enjekte eder. Uygulama yeniden başlatı lmaz.
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
---
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
## 9. Dinamik Menü, Route ve Yetki Modeli
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
```
Permission (ABP) ──┐
├──► Menu.RequiredPermissionName ──► menüde görünürlük
Route.Authority ──┘ └► PermissionGuard ile erişim
```
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
- **Route** (`Entities/Tenant/Administration/Route.cs`): `Key` , `Path` , `ComponentType` ,
`ComponentPath` , `RouteType` (`public` / `protected` ), `Authority[]` .
- **Menu** (`Menu.cs`): `Code` , `ParentCode` , `DisplayName` , `Url` , `Icon` , `Order` ,
`RequiredPermissionName` , `Target` , `IsDisabled` , ayrı ca `UserId` / `RoleId` / `CultureName`
ile kullanı cı , rol ve dil bazlı menü varyantları .
- **Menü yöneticisi** (`/admin/menuManager`): sürükle-bı rak ağaç ile menü düzenleme.
- Frontend'de `dynamicRoutesContext` route'ları çeker, `dynamicRouteLoader` bunları fiziksel
view'lara veya runtime derlenmiş Custom Component'lere eşler, `DynamicRouter` React Router
ağacı nı kurar; her korumalı route `ProtectedRoute` + `PermissionGuard` ile sarı lı r.
2026-09-08 14:00:15 +00:00
- Aynı yolu bir fiziksel route ile bir Custom Component paylaşı yorsa **Custom Component kazanı r** ;
karşı lı ğı olan dosyası bulunmayan rota kaydı hiç yüklenmez. Public site menüsü bu modelin
dı şı ndadı r: `Pub` modülü altı nda tutulur ve uygulama konfigürasyonuyla taşı nı r (bkz. §10.4).
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
**Yetki kodları ** `PlatformConsts.AppCodes` içinde merkezî olarak tanı mlı dı r ve
`PermissionsData.json` ile seed edilir. Ana gruplar: `App.Saas` , `App.Branches` , `App.Intranet.*` ,
`App.Definitions.*` , `App.Restrictions.*` , `App.Languages.*` , `App.Listforms.*` ,
`App.Notifications.*` , `App.BackgroundWorkers.*` , `App.Menus.*` , `App.DeveloperKit.*` ,
2026-08-17 14:26:51 +00:00
`App.SqlQueryManager.*` ,
2026-08-10 09:08:08 +00:00
`App.Orders.*` , `App.BlogManagement.*` , `App.IdentityManagement.*` , `App.Reports.*` ,
`App.Administration` , `App.Setting` , `App.Setup.Migrate` .
2026-06-09 12:54:05 +00:00
2026-08-26 18:44:53 +00:00
Aksiyon yetkisi olan alt gruplar (UI tarafı ndaki karşı lı kları `constants/permission.constant.ts`
içindedir; oradaki kontroller yalnı zca butonları gizler, ası l kontrol AppService'lerdedir):
| Grup | Alt yetkiler |
| --- | --- |
| `App.Listforms.Wizard` | `.Create` , `.Update` , `.Delete` , `.Export` , `.Import` |
2026-09-07 06:14:00 +00:00
| `App.DeveloperKit.CustomComponents` | `.Create` , `.Update` , `.Delete` , `.Export` , `.Import` |
2026-08-26 18:44:53 +00:00
| `App.DeveloperKit.CustomEndpoints` | `.Get` , `.Post` , `.Put` , `.Remove` (dispatcher üzerinden çağrı kapı sı ; endpoint bazlı User/Role/Global kuralları bunun üstünde denetlenir) |
| `App.DeveloperKit.DynamicServices` | `.Create` , `.Edit` , `.Delete` , `.Manage` , `.TestCompile` , `.Publish` , `.ViewCode` |
| `App.SqlQueryManager` | `.CrudEndpoints` |
| `App.Setup.Migrate` | Migration + seed tetikleme (host tarafı ) |
2026-08-10 09:08:08 +00:00
> **Kural:** Yetki sözleşmesi olmayan menü/route önerilmez ve eklenmez.
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
---
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
## 10. Modül Kataloğu
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
### 10.1. Backend modülleri (`api/modules`)
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
| Modül | Kapsam |
2026-06-09 12:54:05 +00:00
| --- | --- |
2026-08-10 09:08:08 +00:00
| **Sozsoft.Languages** | Dil tanı mları , dil anahtarları , çeviri metinleri; tenant bazlı lokalizasyon (`TenantLocalizationMiddleware`). |
| **Sozsoft.Settings** | Ayar tanı mları , sağlayı cı lar, şifreleme bayrakları ve ayar ekranı metadata'sı . |
| **Sozsoft.Notifications** | Bildirim tipleri, kuralları ve kullanı cı bildirimleri; kanal bazlı yönlendirme. |
| **Sozsoft.MailQueue** | Şablon (Scriban) tabanlı gövde üretimi, ek dosya yaşam döngüsü, kuyruk çalı ştı rma ve günlükleme. |
| **Sozsoft.Sender** | Amazon SES (mail), Posta Güvercini (SMS), WhatsApp Cloud API, Rocket.Chat göndericileri. |
| **Sozsoft.SqlQueryManager** | SQL nesne yönetimi, sorgu çalı ştı rma, tablo/kolon metadata'sı . |
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
### 10.2. Uygulama servisleri (`api/src/Sozsoft.Platform.Application`)
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
`AiBots` · `AuditLogs` · `BackgroundWorker` · `Blog` · `Branch` · `Dashboard` · `DataSource` ·
`DeveloperKit` · `FileManagement` · `Forum` · `GlobalSearch` · `Hr` · `Identity` · `Intranet` ·
`ListForms` (+ `Administration` ) · `Menu` · `Messenger` · `Note` · `OrgChart` ·
`OrganizationUnits` · `Public` · `Routes` · `Tenants` · `Videoroom`
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
### 10.3. Yönetim ekranları (UI)
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
| Alan | Route | Açı klama |
2026-06-09 12:54:05 +00:00
| --- | --- | --- |
2026-08-10 09:08:08 +00:00
| Dashboard | `/admin/dashboard` | Widget tabanlı özet ekran. |
| Kullanı cı / Rol | `/admin/list/...` , `/admin/users/detail/:userId` | Kullanı cı , rol ve permission atamaları . |
| Organizasyon birimleri | `/admin/ous` | OU ağacı ve üyelik yönetimi. |
| Tenant yönetimi | ListForm ekranları | Tenant kayı tları , bağlantı dizeleri, siparişten otomatik tenant açma. |
| Ayarlar | `/admin/settings` | Sistem ve entegrasyon ayarları . |
| Menü yöneticisi | `/admin/menuManager` | Menü ağacı düzenleme. |
| Dosya yöneticisi | `/admin/files` | Klasör/dosya işlemleri. |
| Aktivite ve denetim kaydı | `/admin/activityLog` , `/admin/changeLog` | Kullanı cı hareketleri ve ABP audit log detayı . |
| Bildirimler | `/admin/profile/notification-settings` , bildirim ekranları | Kanal tercihleri ve bildirim oluşturma. |
2026-09-04 12:51:58 +00:00
| Forum | `/admin/forum` | Forum kullanı mı ; yönetim `App.ForumManagement` altı ndaki ListForm ekranları yla yapı lı r. |
2026-09-04 09:05:26 +00:00
| Intranet | Intranet dashboard ve widget'ları | Duyuru, anket, sosyal duvar, etkinlik. Hangi widget'ı n hangi kolonda, hangi sı rada ve hangi yetkiyle yayı nlandı ğı `Adm_T_IntranetWidget` kaydı ndan gelir; kayı tlar `configs/seeds/{kapsam}/data/App.DeveloperKit.IntranetWidgets.json` ile senkron tutulur. |
2026-08-10 09:08:08 +00:00
| Video oda | `/admin/videoroom/*` | Oda listesi, detay, planlama, katı lı mcı ve ekran paylaşı mı . |
| Raporlar | `/admin/reports/:report/view|design/...` | DevExpress rapor görüntüleyici ve tasarı mcı . |
| AI asistanı | `/admin/ai` | n8n webhook üzerinden sohbet arayüzü. |
| Profil | `/admin/profile/*` | Genel bilgiler, şifre, bildirim ayarları . |
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
### 10.4. Public site
2026-06-09 12:54:05 +00:00
2026-09-08 14:00:15 +00:00
`/home` · `/about` · `/contact` (Custom Component) · `/products` · `/checkout` · `/payment` ·
`/success` · `/blog` · `/blog/:id` · `/demo` (fiziksel sayfalar).
Ziyaretçiye açı k kı sı m iki parçadan oluşur ve ikisi de veritabanı nda yaşar:
**Menü.** Public menüler `Menu` tablosunda `ModuleId = "Pub"` modülü altı nda tutulur ve Menü
Yönetimi ekranı ndan girilir (sözleşme: `PlatformConsts.PublicSite` ). `App.Public.Header` kökü hem
üst navigasyonu hem de alt bilgideki hı zlı bağlantı ları besler — ikisi de `PublicNav` düğümüdür,
menü bir kez eklenir iki yerde birden görünür; alt kaydı olan bir menü üstte açı lı r liste olur.
Alt bilgide `cta` kayı tları (Giriş) yer almaz: oradaki düğüm `source="navigation"` ile çizilir. `Url` sayfa yolu, `Icon`
react-icons adı , `Order` sı ra, `IsDisabled` yayı n anahtarı , `DisplayName` dil anahtarı dı r;
`CssClass` içinde `cta` geçen kayı t düz bağlantı yerine vurgulu buton olarak çizilir. Menü ucu
`[Authorize]` olduğu için menüler uygulama konfigürasyonunun `publicMenus` alanı yla taşı nı r
(`PlatformApplicationConfigurationContributor`), istemcide `usePublicMenu` okur. `Pub` modülü
yönetim navigasyonuna girmez (`abpConfig.model.ts` menüyü kurarken bu modülü eler; Menü Yönetimi
ekranı elemez, menüler oradan düzenlenir). Seed: `MenusData.json` → `Modules` + `Menus` .
**Sayfa.** Her public sayfa bir Custom Component'tir: `RoutePath` `/admin/` ile başlamadı ğı sürece
bileşen otomatik olarak public route olur ve `PublicLayout` altı nda yayı nlanı r. Tasarı m yalnı zca
DeveloperKit > Custom Components (Visual Designer) üzerinden değişir. Aynı yolu bir fiziksel route
ile paylaşan custom component kazanı r; karşı lı ğı olan dosyası bulunmayan rota kaydı ise hiç
yüklenmez (`hasPhysicalComponent`) — seeder yalnı zca eklediği için eski kayı tlar veritabanı nda
kalsa bile ekran patlamaz. Seed: `configs/seeds/host/data/App.DeveloperKit.CustomComponents.json` ;
bileşenin ayrı dosyası yoktur, her bileşen bu dosyada bir satı rdı r.
Runtime kapsamı sı nı rlı dı r: bileşen kodundaki `import` satı rları derlemede temizlenir,
kullanı labilenler `React` , `ui` kit, `PlatformViewHost` , `apiService` , `axios` , `DOMPurify` ,
`translate` , `checkPermission` , `getCulture` ve **katalog düğümleri**
(`components/componentEditor/runtimeNodes.ts`). ** `react-icons` ve `react-router` yoktur** — ikon
`<PlatformIcon name="FaUsers" size={40} className="..." />` ile ada göre çizilir (menü ikonları yla
aynı sözlük), gezinme `<a href>` ile yazı lı r. Kullanı cı ya görünen metinler dil anahtarı üzerinden
gelir.
**Tailwind sı nı f yüzeyi.** Bileşenin kodu veritabanı nda yaşar; derleme sı rası nda taranan tek
kaynak seed dosyası dı r (`configs/seeds/*/data/App.DeveloperKit.CustomComponents.json`). Bu dosya
depo kökünde, `ui/` dı şı ndadı r — derleme bağlamı yalnı zca `ui/` klasörü olduğunda (docker, ayrı
checkout) glob boş döner ve seed'e özgü sı nı flar (`md:col-span-4`, `bg-gray-950/80` , `opacity-20` )
CSS'e hiç girmez: uygulama yerelde doğru, sunucuda stilsiz görünür. Bu yüzden aynı sı nı flar var
olan `ui/safelist.txt` dosyası na da yazı lı r. Dosyayı zaten `twSafelistGenerator` eklentisi üretiyor
(renk/ölçü listesi); eklenti artı k seed dosyaları ndaki `className` değerlerini de toplayı p
`# --- custom component classes ---` işaretinin altı na ekliyor. `safelist.txt` `ui/` içinde ve
depoda olduğu için her ortamda taranı r. Seed kökü görünmüyorsa işaretin altı ndaki liste olduğu gibi
korunur — eksik bir bağlam listeyi silip sorunu büyütmez. Ayrı bir betik ya da ikinci bir safelist
dosyası yoktur; liste her `npm run build` / `npm start` ile tazelenir.
**Katalog düğümleri.** Kanvası n doğrudan çizdiği, derlenen bileşen listesinde yer almayan
bileşenler tek bir sözlükte durur (`RUNTIME_NODE_COMPONENTS`): kanvas onu `VisualCanvas` içinde,
üretilen kod ise runtime kapsamı üzerinden kullanı r — iki taraf aynı kaynaktan beslendiği için
tasarı m ve çalı şma zamanı ayrı şamaz. Sözlükte `PlatformIcon` ve public site parçaları
(`components/publicSite`) bulunur. Yeni bir düğüm eklerken: bileşen `components/publicSite` (ya da
uygun klasör) → `runtimeNodes.ts` sözlüğü → `catalog.ts` tanı mı (`kind: 'custom'`) → `LanguagesData.json`
açı klama anahtarı .
Elle yazı lmı ş bir bileşen Visual Designer'da **kod modunda** açı lı r: tasarı mcı yalnı zca kendi
ürettiği kodu düğüm ağacı na çevirir (`isDesignerGeneratedCode`), aksi hâlde tanı madı ğı JSX'i
düşürüp kaydederken kodu yok ederdi.
Public bileşenlerin tamamı — `/home` , `/about` , `/contact` sayfaları ile üst ve alt bilgi
(`PublicHeader`, `PublicFooter` ; rotaları yok) — **tasarı mcı belgesi** olarak tutulur: `Props` alanı ndaki
`visualDesigner` düğüm ağacı kaynaktı r (`sourceMode: "visual"`), `Code` ondan üretilir
(`generateDesignerCode`) ve runtime da bileşeni bu belgeden derler. Yani hepsi kanvasta görünür,
sürükle-bı rak ve özellik paneliyle düzenlenir. Belgeler `div` /`h1`-`h5`/`p`/`span`/`img`/`a`
HTML düğümleri ve `PlatformIcon` ikon düğümüyle kurulmuştur; `::` ile başlayan metinler üretilen
kodda `translate()` çağrı sı na döner. `RoutePath` boş bı rakı labilir; rotası olmayan bir bileşen
yalnı zca başka bir ekranı n içinde çizilir (alt bilgi gibi).
Üst ve alt bilgi de birer Custom Component'tir (`PublicHeader`, `PublicFooter` ; rota yok):
`PublicLayout` ikisini de `renderComponent` ile çizer ve geriye yalnı zca rota değişiminde başa
sarma ile demo penceresi kalı r. Bileşen kayı tlı değilse o parça çizilmez.
Üst bilginin davranı şı (menü listesi, aktif bağlantı , kaydı rmada değişen görünüm, mobil panel,
tema/dil/demo kontrolleri) `components/publicSite` altı ndaki katalog düğümlerinde yaşar; yerleşim
ve sı nı flar tasarı mcı dadı r: `PublicHeaderBar` (kaydı rı ldı ğı nda `scrolledClassName` 'e geçen kabuk),
`PublicNav` (`source`: `navigation` /`actions`/`all`, `variant` : `horizontal` /`vertical`),
`PublicMobileMenu` (hamburger + içeriği tasarlanan panel), `PublicLogo` , `PublicThemeToggle` ,
`PublicLanguageSelector` , `PublicDemoButton` .
Rotası olmayan bileşende `RoutePath` **NULL** yazı lı r; `Sas_H_CustomComponent` 'in `RoutePath`
tekil indeksi yalnı zca dolu değerleri kapsar (`[IsDeleted] = 0 AND [RoutePath] IS NOT NULL`), aksi
hâlde ikinci rotası z bileşen birincisiyle çakı şı rdı .
`/home` , `/about` , `/contact` bu yolla çalı şı r (`PublicHomePage`, `PublicAboutPage` ,
`PublicContactPage` ); üst ve alt bilgi rotası zdı r (`PublicHeader`, `PublicFooter` ).
Veriden beslenen public sayfalar (`/products`, `/checkout` , `/payment` , `/success` , `/blog` ,
`/blog/:id` , `/demo` ) fiziksel kalı r; içerik sayfaları Custom Component'tir. Blog listesi ve detayı
`PublicAppService` 'in `post-list` / `post-by-slug` uçları ndan beslenir, yönetimi
`App.BlogManagement.*` ekranları ndadı r.
Eski statik içerik sayfaları ve sayfa içi tasarı m modu (`?design=1`) kaldı rı lmı ştı r:
`views/public/Home|About|Contact|Services` , `views/public/designer/` , bunlara özel istemci
servisleri; sunucuda `Home` /`About`/`Contact`/`Service` entity'leri, `PublicAppService` sayfa
Get/Save uçları ve DTO'ları , `TenantData.json` + `TenantDataSeeder` ,
`App.{Home,About,Services,Contact}` yetkileri ve `.Design` alt yetkileri, `/admin/public/*/designer`
rota ve menüleri.
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
---
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
## 11. Kimlik, Oturum ve Güvenlik
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
### 11.1. Kimlik doğrulama
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
- **OpenIddict** password + refresh token akı şı . Token uç noktası : `POST /connect/token`
(`grant_type=password`, `client_id=Platform_PublicApi` , `scope=offline_access Platform` ).
- Token ömürleri `OpenIddict:TokenLifetimes` ile yapı landı rı lı r (varsayı lan 60 dk access, 90 dk refresh).
- Swagger için ayrı istemci: `AuthServer:SwaggerClientId` .
- İki aşamalı doğrulama (2FA) ve hesap doğrulama (e-posta/telefon) desteklenir.
- Kayı t ve iletişim formları nda Cloudflare Turnstile tabanlı captcha (`CaptchaMiddleware`).
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
### 11.2. Oturum yönetimi
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
- `PlatformSessionValidationMiddleware` her istekte oturumun hâlâ geçerli olduğunu doğrular.
- `PlatformSessionRevocationHandler` token iptalinde oturumu sonlandı rı r.
- `PlatformSessionCleanupWorker` süresi dolmuş oturumları temizler.
- Eş zamanlı kullanı cı limiti aşı ldı ğı nda giriş reddedilir.
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
### 11.3. Giriş engelleri
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
`UserCannotSignInErrors` altı nda tanı mlı , kullanı cı ya lokalize mesajla dönen durumlar:
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
| Kod | Anlamı |
2026-06-09 12:54:05 +00:00
| --- | --- |
2026-08-10 09:08:08 +00:00
| `LoginNotAllowed_NotVerified` | Hesap doğrulanmamı ş. |
| `LoginNotAllowed_NotAllowedIp` | IP kı sı tlaması (`IpRestriction`). |
| `LoginNotAllowed_WorkHour` | Çalı şma saati kı sı tlaması (`WorkHour`). |
| `LoginNotAllowed_LoginEndDateDue` | Kullanı cı nı n giriş yetki süresi dolmuş. |
| `ShouldChangePasswordOnNextLogin` / `ShouldChangePasswordPeriodic` | Zorunlu şifre değişimi. |
| `LoginNotAllowed_TenantIsPassive` / `TenantNotFound` | Tenant pasif veya bulunamadı . |
| `LoginNotAllowed_BranchLimit` | Şube lisans limiti aşı ldı . |
| `LoginNotAllowed_ConcurrentUserLimit` | Eş zamanlı kullanı cı limiti aşı ldı . |
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
### 11.4. Güvenlik kuralları
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
- Tüm katmanlarda RBAC ve yetki tabanlı görünürlük zorunludur.
- Dinamik SQL'de **yalnı zca parametreli** desenler kullanı lı r; kullanı cı girdisi string birleştirme ile sorguya eklenmez.
- Her sorgu ve eylemde tenant izolasyonu korunur (`IsTenant`, `IsBranch` , `IsOrganizationUnit` bayrakları ve ABP tenant filtreleri).
- Gerçek kimlik bilgileri, token ve anahtarlar örneklerde/dokümanda yer almaz; yer tutucu kullanı lı r.
- Denetim: kritik işlemler ABP Audit Log'a yazı lı r; yüksek frekanslı `list-form-customization` çağrı ları denetim dı şı bı rakı lmı ştı r.
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
---
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
## 12. Çok Kiracı lı lı k (Multi-Tenancy)
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
- `PlatformConsts.IsMultiTenant = true` .
- Tenant çözümleme host adı (subdomain) ve ABP tenant resolver'ları ile yapı lı r (`utils/subdomain.ts`).
- **Tenant başı na ayrı veritabanı :** `TenantConnectionString` kayı tları ile her tenant kendi
veritabanı na yönlendirilebilir; migration'lar `DatabaseMigrationEventHandlerBase` üzerinden
tenant oluşturulduğunda otomatik uygulanı r.
- **Şube (Branch):** Tenant altı ndaki fiziksel/örgütsel kı rı lı m; kullanı cı – şube eşlemesi
`BranchUsers` ile tutulur, lisans limiti girişte kontrol edilir.
- **Organizasyon birimi:** ABP `OrganizationUnit` ağacı ; ListForm'lar OU bazlı filtrelenebilir.
- Tenant bazlı lokalizasyon: `TenantLocalizationInitializer` + `TenantLocalizationMiddleware` .
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
---
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
## 13. Bildirim ve Entegrasyonlar
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
### 13.1. Kanallar
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
`Sms` · `Mail` · `Rocket` · `Desktop` · `UiActivity` · `UiToast` · `WhatsApp` (`Telegram` altyapı da tanı mlı , UI'da kapalı )
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
### 13.2. Yönlendirme modeli
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
Bildirim **tip + kanal** eşleşmesiyle yönlendirilir. Alı cı hedefleme seçenekleri:
`All` , `User` , `Role` , `OrganizationUnit` , `Custom` . Kullanı cı lar kendi bildirim tercihlerini
`/admin/profile/notification-settings` üzerinden kanal bazı nda yönetir.
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
### 13.3. Göndericiler (`Sozsoft.Sender`)
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
| Kanal | Sağlayı cı |
2026-06-09 12:54:05 +00:00
| --- | --- |
2026-08-10 09:08:08 +00:00
| E-posta | ABP Emailing + Amazon SES (`AmazonSesEmailSender`), arka plan iş kuyruğu ile |
| SMS | Posta Güvercini HTTP API |
| WhatsApp | WhatsApp Cloud API (şablon tabanlı ) |
| Rocket.Chat | Rocket.Chat HTTP API |
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
Tüm sağlayı cı kimlik bilgileri ayar ekranı ndan yönetilir (`App.Settings.*` anahtarları );
koda gömülmez.
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
### 13.4. Mail kuyruğu
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
`Sozsoft.MailQueue` ; şablondan gövde üretir, PDF/XLS/TXT çı ktı ları ve ek dosyaları yönetir,
kuyruğu arka plan işçisiyle çalı ştı rı r ve sonuçları günlükler.
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
### 13.5. AI entegrasyonu
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
`AiBot` kayı tları tenant bazlı dı r; n8n webhook üzerinden LangChain ajanı + bellek penceresi ve
Gemini sohbet modeli bağlanı r (`configs/ai/Chat.json`). UI tarafı nda `/admin/ai` ve header'daki
asistan bileşeni bu uç noktayı kullanı r.
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
---
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
## 14. Arka Plan İşleri
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
İki motor birlikte kullanı lı r: **Hangfire** (kalı cı iş deposu, `default` ve `platform` kuyrukları )
ve **ABP Background Workers** (yinelenen işler). Yönetim `/admin` altı ndaki Background Worker
ekranları ndan yapı lı r; yetkiler `App.BackgroundWorkers.RecurringJobs` ve `.Jobs` .
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
| Worker tipi | İşlevi |
2026-06-09 12:54:05 +00:00
| --- | --- |
2026-08-10 09:08:08 +00:00
| `MailQueueWorker` | Mail kuyruğunu işler. |
| `SqlWorker` | Zamanlanmı ş SQL çalı ştı rı r. |
| `NotificationWorker` | Bildirim kuralları nı değerlendirir ve gönderir. |
| `SessionCleanupWorker` | Süresi dolmuş oturumları temizler. |
| `BackupWorker` | Veritabanı yedeği alı r ve eski yedekleri temizler. |
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
Hangfire panosu geliştirmede serbest, üretimde `AbpHangfireAuthorizationFilter` ile korumalı dı r
(`/hangfire`).
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
---
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
## 15. Raporlama
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
- **DevExpress Reporting**: Web Document Viewer (`/admin/reports/:report/view/...`) ve
Report Designer (`/admin/reports/:report/design/...`).
- **Rapor deposu**: `ReportTemplate` ve `ReportCategory` varlı kları ; `CustomReportStorageWebExtension`
ile veritabanı üzerinden okuma/yazma.
- **Dinamik raporlar** (`HttpApi.Host/PredefinedReports`): ListForm tanı mı ndan otomatik üretilen
grid, form ve ağaç raporları — grid durumunu (sütun sı rası , gruplama, filtre) rapora yansı tı r.
- Linux konteynerlerde font sorunları nı önlemek için `DevExpressFontConfiguration` devrededir.
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
---
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
## 16. Dosya Yönetimi ve CDN
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
- ABP BlobStoring, dosya sistemi sağlayı cı sı yla `App:CdnPath` altı na yazar; dosyalar `App:CdnUrl`
üzerinden servis edilir.
- `FileManagementAppService` : listeleme, yükleme, indirme, kopyalama, taşı ma, yeniden adlandı rma, silme.
- UI: `/admin/files` (`views/admin/files/FileManager.tsx`) — breadcrumb, çoklu yükleme, önizleme.
- Avatar, aktivite görselleri, içe aktarma dosyaları ve veritabanı yedekleri ayrı konteynerlerde tutulur.
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
---
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
## 17. Gerçek Zamanlı Özellikler
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
- **Messenger**: SignalR hub'ı `/messengerhub` . Konuşma ve mesaj varlı kları veritabanı nda;
Redis etkinse backplane olarak kullanı lı r. Query string ile gelen `access_token` ,
hub bağlantı sı için `Authorization` başlı ğı na çevrilir.
- **Video oda**: Oda oluşturma/başlatma/bitirme, katı lı mcı yönetimi, sohbet, doküman ve ekran
paylaşı mı panelleri; TURN sunucusu `configs/deployment/configs/turnserver.conf` ile yapı landı rı lı r.
- **Global arama**: `GlobalSearchAppService` üzerinden çapraz modül arama.
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
---
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
## 18. Frontend Mimarisi
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
### 18.1. Route ve bileşen çözümü
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
```
Route kayı tları (DB)
├─ componentPath ──► fiziksel view (React.lazy)
└─ CustomComponent ──► @babel/standalone ile runtime derleme ──► ComponentContext
│
DynamicRouter ──► ProtectedRoute ──► PermissionGuard ──► PageContainer
```
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
`ROUTES_ENUM` (`src/routes/route.constant.ts`) statik yol sözleşmelerini tutar; iş modülleri için
(`supplychain`, `maintenance` , `warehouse` , `projects` , `hr` , `crm` , `mrp` , `accounting` ) ayrı lmı ş
yol desenleri de buradadı r. Bu alanları n ekranları , fiziksel React sayfaları yerine ListForm
konfigürasyonu ile üretilir.
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
### 18.2. Durum yönetimi
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
- **easy-peasy** global store: `auth` , `theme` , `locale` , `abpConfig` , `admin` , `client` , `base` .
Oturum ve tercih verileri `localStorage` yerine store üzerinden yönetilir (`stateSync.ts`).
- **React Query**: sunucu verisi önbellekleme.
- **Context'ler**: `ComponentContext` (runtime bileşen kaydı ), `DialogContext` , `ScrollContext` .
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
### 18.3. Tema ve lokalizasyon
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
- Tailwind tabanlı tasarı m sistemi (`components/ui`) + DevExtreme temaları ; açı k/koyu mod ve
tema yapı landı rı cı (`ThemeConfigurator`).
2026-08-26 18:44:53 +00:00
- **Varsayı lan mod koyudur.** `proxy/theme/theme.config.ts` : `mode` ve `navMode` `dark` , DevExtreme
stili `dx.material.blue.dark.compact` . Kullanı cı tercihi store üzerinden saklanı r; bu yalnı zca
ilk açı lı ş varsayı lanı dı r.
2026-08-10 09:08:08 +00:00
- Dil metinleri veritabanı ndan gelir (`Sozsoft.Languages`); dil seçici header'dadı r.
Tenant bazlı çeviri geçersiz kı lma desteklenir.
- Layout seçenekleri: dikey menü, yatay menü, yı ğı lmı ş yan menü, mobil navigasyon.
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
### 18.4. PWA ve sürüm yönetimi
2026-06-09 12:54:05 +00:00
2026-08-12 19:08:14 +00:00
- Kurulum iki kademelidir: **kabuk** (index.html + entry JS/CSS + eager vendor chunk'ları )
workbox precache manifest'inden gelir ve zorunludur; **bileşenler** (tüm lazy chunk'lar,
build'de üretilen `dist/warmup.json` ) güncelleme penceresinde aynı ilerleme çubuğunda arka
planda indirilir. İkinci kademe best-effort'tur (inemeyen dosya kurulumu düşürmez, süre
bütçesi aşı lı rsa kalanlar runtime cache'e kalı r); böylece deploy sonrası ilk gezinmede chunk
beklenmez ama yavaş bağlantı da kurulum timeout'a düşmez. DevExtreme temaları (~33 MB), font
ve görseller runtime cache'tedir.
- `registerType: 'prompt'` — yeni sürüm indirilir, indirme bitince otomatik devreye alı nı r
(`views/version/swRegistration.ts`, `sw.ts` , `AppUpdateDialog.tsx` ).
2026-08-12 21:26:36 +00:00
- Isı tma yalnı zca kuruluma bağlı değildir: uygulama açı lı şta `ENSURE_WARMUP` mesajı yollar,
service worker eksik kalan bileşenleri kaldı ğı yerden tamamlar.
2026-08-17 08:51:46 +00:00
- **Sürüm bilgisi backend'dedir.** `Sas_H_ChangeLog` tablosu tek kaynaktı r; istemci sürüm
2026-08-12 21:26:36 +00:00
numarası nı ve son sürümün notları nı `application-configuration` yanı tı ndaki
`extraProperties.changeLogs` alanı ndan okur (`PlatformApplicationConfigurationContributor`),
2026-08-17 08:51:46 +00:00
tam listeyi ise `/api/app/change-log` endpoint'inden alı r. Ayrı bir `version.json` isteği
2026-08-12 21:26:36 +00:00
yoktur. Changelog `/admin/changeLog` ekranı nda gösterilir; sürüm numarası son görülenden
farklı ysa kullanı cı giriş sonrası oraya yönlendirilir (tetikleyici bundle değil, sürümdür —
yalnı zca yeni bir git tag'i eklenmiş olsa da çalı şı r).
2026-08-17 08:51:46 +00:00
- **Sürüm notu akı şı — DbMigrator gerektirmez:** `configs/change-logs/generate-change-logs.sh`
deploy sı rası nda (`deploy/app.sh`) git tag'lerinden `configs/change-logs/change-logs.json`
üretir, dosya API konteynerine `/etc/api/change-logs` altı na salt okunur mount edilir ve
`ChangeLogStartupService` uygulama açı lı şı nda tabloyu bu dosyayla eşitler. Dosya imaja
2026-08-15 06:30:36 +00:00
**gömülmez** : api build context'i içindeyken her yeni tag Dockerfile'daki `COPY . .`
katmanı nı geçersiz kı lı p imajı gereksiz yere yeniden derletiyordu; artı k kod değişmediyse
imaj cache'ten gelir. Yeni sürüm için tag atı p deploy etmek yeterlidir. Notlar
2026-08-12 21:26:36 +00:00
**annotated** tag mesajı ndan okunur (`git tag -a 1.2.0 -m "..."`), her satı r bir madde.
- **Tablo git tag listesinin aynası dı r:** yeni tag eklenir, mesajı düzeltilen tag güncellenir,
2026-08-17 08:51:46 +00:00
git'ten silinen tag tablodan da (hard delete ile) kaldı rı lı r. Bu yüzden `Sas_H_ChangeLog`
2026-08-12 21:26:36 +00:00
elle düzenlenmemelidir — ilk deploy'da geri alı nı r. Dosya okunamaz veya boşsa senkronizasyon
hiçbir şey yapmaz, tablo boşaltı lmaz.
- Deploy algı laması service worker'ı n kendi `registration.update()` kontrolüne dayanı r:
herhangi bir chunk değiştiğinde entry hash'i, dolayı sı yla index.html ve `sw.js` içindeki
precache manifest'i de değişir.
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
---
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
## 19. API ve Swagger
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
- Swagger UI, API kökünde yayı nlanı r; OAuth2 ile "Authorize" düğmesi üzerinden token alı nabilir.
- Endpoint'ler ABP **conventional controller** mekanizması yla uygulama servislerinden üretilir:
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
| Namespace | Kök yol |
2026-06-09 12:54:05 +00:00
| --- | --- |
2026-08-10 09:08:08 +00:00
| `Sozsoft.Platform.ListForms.Administration` | `/api/admin/...` |
| Diğer `Sozsoft.Platform.*` servisleri | `/api/app/...` |
| Modül servisleri (Languages, Settings, MailQueue, Notifications, SqlQueryManager) | Modül kendi kök yolunu kullanı r |
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
- DevExpress raporlama controller'ları (`CustomReportDesigner`, `CustomWebDocumentViewer` ,
`QueryBuilder` ) Swagger dokümanı ndan hariç tutulur.
- Yanı tlar Brotli/Gzip ile sı kı ştı rı lı r; `X-Correlation-Id` başlı ğı istemciye açı lı r.
- Hata kodları : `PlatformConsts.AppErrorCodes` (`Error:0001` yetkisiz, `App.NoResults` kayı t yok,
`Error:0003` parametre geçersiz, `Error:0005` iç hata).
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
**Token örneği** (yer tutucularla):
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
```http
POST /connect/token HTTP/1.1
Content-Type: application/x-www-form-urlencoded
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
grant_type=password
& username=< KULLANICI >
& password=< PAROLA >
& client_id=Platform_PublicApi
& scope=offline_access%20Platform
```
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
---
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
## 20. Dağı tı m (Deployment)
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
`configs/deployment` altı nda üç ortam için compose dosyaları ve numaralandı rı lmı ş scriptler bulunur.
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
| Dosya | Amaç |
2026-06-09 12:54:05 +00:00
| --- | --- |
2026-08-10 09:08:08 +00:00
| `docker-compose-data.yml` | Redis, SQL Server / PostgreSQL, yedek volume'ları |
| `docker-compose-app.yml` / `.dev.yml` / `.production.yml` | API, UI, migrator, nginx |
| `docker-compose-devops.yml` | Forgejo + runner (CI/CD) |
| `Dockerfile` , `api/*.Dockerfile` , `ui/Sozsoft.Platform.Ui.Dockerfile` | İmaj tanı mları |
| `configs/nginx.conf` , `redis.conf` , `turnserver.conf` , `elasticsearch.yml` | Servis yapı landı rmaları |
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
Script sı rası (`configs/deployment/scripts`):
```
1-devops.sh → DevOps makinesi (Forgejo, runner)
2-data-postgres.sh /
3-data-sql.sh → Veri katmanı
4-production-build.sh → İmaj build
5-production-deploy.sh → Yayı n
6-production-migrator-true.sh → Migration çalı ştı rma
7-setup_ssl.sh → Sertifika
8-dev-build.sh / 9-dev-deploy.sh / 10-dev-migrator-true.sh → Dev ortamı
```
2026-06-09 12:54:05 +00:00
2026-08-26 18:44:53 +00:00
Migrator servisi `SEED` ortam değişkeni ile çalı şı r ve compose dosyası nda `SEED=${SEED:-true}`
olarak tanı mlı dı r: değişken verilmezse seed **çalı şı r** . Seed dosyaları imaja gömülmez; depodaki
`configs/seeds` klasöründen mount edilir (`App:SeedsPath`), böylece bir seed değiştiğinde imaj
build etmek gerekmez.
2026-08-10 09:08:08 +00:00
Ayrı ntı lı kurulum notları : [`configs/deployment/README.md` ](configs/deployment/README.md ),
[`Readme_Production.md` ](configs/deployment/Readme_Production.md ),
[`Readme_Devops.md` ](configs/deployment/Readme_Devops.md ).
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
> Bu dokümanlarda geçmişte örnek amaçlı bı rakı lmı ş kimlik bilgileri bulunabilir; üretimde
> tümü döndürülmeli ve secret yöneticisine taşı nmalı dı r.
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
---
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
## 21. Geliştirme Standartları ve Sı k Kullanı lan Komutlar
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
### 21.1. Çözüm kuralları
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
1. Her istek şu sı rayla değerlendirilir: ** (1)** ListForm konfigürasyonu → ** (2)** SQL Query
Manager + Custom Endpoint → ** (3)** Dynamic Service → ** (4)** kod değişikliği (son çare,
gerekçe zorunlu).
2. Standart iş ihtiyaçları için yeni özel React sayfası /bileşeni geliştirilmez.
3. Her öneri tenant ve yetki tasarı mı nı içerir.
4. Platform yetkilendirme desenleri atlanmaz.
5. Secret, tenant id veya bağlantı dizesi koda gömülmez.
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
### 21.2. Frontend
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
```powershell
cd ui
npm start # geliştirme sunucusu
npm run build # üretim derlemesi (metadata + version + vite build)
npm run lint # ESLint
npm run format # prettier --write + eslint --fix
```
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
### 21.3. Backend
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
```powershell
cd api
dotnet build
dotnet run --project src/Sozsoft.Platform.HttpApi.Host
dotnet format --include .\modules\Sozsoft.Notifications\ --folder
2026-06-09 12:54:05 +00:00
2026-08-26 18:44:53 +00:00
# Kod standardı kapı sı (ölü kod / stil analizörleri)
dotnet build Sozsoft.Platform.sln --no-incremental `
-p:EnforceCodeStyleInBuild=true -p:GenerateDocumentationFile=true
dotnet format Sozsoft.Platform.sln --diagnostics IDE0005,IDE0161 --severity warn
2026-08-10 09:08:08 +00:00
# Migration (EntityFrameworkCore projesi içinde)
dotnet ef migrations add < Ad >
dotnet ef database update
dotnet ef migrations remove
```
2026-06-09 12:54:05 +00:00
2026-08-26 18:44:53 +00:00
.NET/ABP kod standardı (hedef sürümler, nullable politikası , ölü kod kuralları , modern C#
kullanı mı , ABP katman sı nı rları ) bağlayı cı olarak
[`.github/instructions/dotnet.instructions.md` ](.github/instructions/dotnet.instructions.md )
dosyası ndadı r. Standart derlemede zorlanı r: `api/Directory.Build.props` analizörleri açar,
`api/.editorconfig` kural şiddetlerini tanı mlar; bu iki dosya standardı n tek kaynağı dı r.
2026-08-10 09:08:08 +00:00
Yeni ABP modülü eklemek için:
`abp new Sozsoft.<Modul> -t module --no-ui -m none --database-provider ef`
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
### 21.4. Seed dosyaları
2026-06-09 12:54:05 +00:00
2026-08-26 18:44:53 +00:00
İki ayrı seed yüzeyi vardı r ve karı ştı rı lmamalı dı r.
**1. Depo içi (kod ile taşı nan) seed'ler** — `api/src/Sozsoft.Platform.DbMigrator/Migrations/` .
Platformun kendi ekranları , menüleri, yetkileri ve dil metinleri buradadı r; değişiklikleri
derlenip yayı nlanı r. Yeni bir modülün nası l kurulacağı nı öğrenmek için başvurulacak dosyalar:
- `ListFormSeeder_Saas.cs` , `ListFormSeeder_Administration.cs` — ListForm + alan tanı mları
2026-08-31 14:17:50 +00:00
- `MenusData.json` — `Routes` , `Modules` , `Menus`
2026-08-26 18:44:53 +00:00
- `PermissionsData.json` — yetki grupları ve tanı mları
- `HostData.json` — ayar/entegrasyon değerleri
- `LanguagesData.json` — dil anahtarları (EN/TR)
2026-09-05 18:20:18 +00:00
- `WizardDataSeeder.cs` , `CrudDataSeeder.cs` — aşağı daki
2026-08-26 18:44:53 +00:00
runtime seed dosyaları nı okuyup uygulayan seeder'lar
2026-09-07 14:43:46 +00:00
- `ListFormSeedDataApplier` , `CrudEndpointSeedApplier` (`Domain/Data/`) — uygulama kuralı nı n tek
yeri; hem migrate/seed akı şı hem wizard import'unun kapanı şı aynı servisleri çağı rı r
2026-08-26 18:44:53 +00:00
2026-09-05 18:20:18 +00:00
**2. Runtime'da üretilen seed'ler** — `configs/seeds/` . Wizard, Custom Components ekranı /Visual
2026-09-07 06:14:00 +00:00
Designer, CRUD Endpoint Manager ve `SeedFilePath` tanı mlı ListForm ekranları çalı şma zamanı nda
burayı yazar; veritabanı silinip yeniden oluşturulduğunda aynı dosyalar
2026-08-26 18:44:53 +00:00
geri yüklenir. Kapsam klasörü CDN düzeniyle aynı dı r ve `SeedPathResolver` üzerinden çözülür:
```
configs/seeds/
├── host/ # host kapsamı
2026-09-02 08:32:53 +00:00
│ ├── wizard/ # {Ad}.json → WizardDataSeeder
2026-09-07 14:43:46 +00:00
│ ├── crud/ # {EntityName}.json → CrudEndpointSeedApplier
2026-09-07 06:14:00 +00:00
│ ├── data/ # {ListFormCode}.json → ListFormSeedDataApplier
2026-08-26 18:44:53 +00:00
│ ├── sql/{object,execute}/ # .sql (SQL Server)
│ └── postgres/{object,execute}/
├── tenants/{tenantId}/… # aynı düzen, tenant kapsamı
└── .imports/{importId}/ # wizard import staging + backup (seeder taramaları na girmez)
```
2026-06-09 12:54:05 +00:00
2026-08-26 18:44:53 +00:00
> Bu dosyalar elle de düzenlenebilir; ilgili ekrandan tekrar kaydedildiğinde yeniden üretilirler.
> Wizard dosyası `EditFileName` ile güncellenirse sunucu önce eski dosyayı ve ürettiği kayı tları
2026-09-02 08:32:53 +00:00
> siler, sonra yenisini üretir. Wizard'ı n ürettiği ekran **ListForm detayı ndan** düzenlendiğinde
> de aynı dosya güncellenir (`WizardSeedSynchronizer`): `ListForm`/`Fields` bölümleri ve
> `Wizard` bölümündeki karşı lı kları veritabanı ndaki güncel haliyle değiştirilir.
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
---
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
## 22. Sorun Giderme
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
| Belirti | Olası neden ve çözüm |
2026-06-09 12:54:05 +00:00
| --- | --- |
2026-08-10 09:08:08 +00:00
| `/api/abp/application-configuration` 503 dönüyor | Veritabanı na erişilemiyor. Bağlantı dizesini ve veri konteynerini kontrol edin; `/api/setup/application-status` ile durumu görün. |
| UI `/setup` ekranı na düşüyor | Şema oluşmamı ş veya bekleyen migration var. Setup ekranı ndan migration'ı tetikleyin ya da DbMigrator'ı çalı ştı rı n. |
| Giriş "UserCannotSignIn..." hatası veriyor | [11.3 ](#113-giriş-engelleri ) tablosuna bakı n: IP, çalı şma saati, doğrulama, şube/eş zamanlı kullanı cı limiti. |
| Yeni sürüm tarayı cı da görünmüyor | Service worker `prompt` modundadı r; güncelleme bildirimini onaylayı n veya sekmeyi tamamen kapatı p açı n. |
| DevExtreme teması yüklenmiyor | `public/css` altı ndaki tema dosyaları runtime cache'tedir (StaleWhileRevalidate); hard refresh yeterlidir. |
| Hangfire başlangı çta hata veriyor | Bağlantı dizesi boşsa Hangfire kaydı atlanı r ama ABP modülleri yüklenir. Bağlantı dizesini doğrulayı n. |
| Dinamik servis yayı nlanmı yor | Önce `TestCompile` çalı ştı rı n; derleme hatası mesajı UI'da döner. `Publish` için ilgili yetki gerekir. |
| Raporlarda font/karakter bozukluğu (Linux) | `DevExpressFontConfiguration.InstallLinuxFonts` logları nı kontrol edin; konteynerde font paketi eksik olabilir. |
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
---
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
## 23. Bilinen Sı nı rlar ve Notlar
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
- `route.constant.ts` içindeki `supplychain` , `maintenance` , `warehouse` , `projects` , `crm` ,
`mrp` , `accounting` ve `hr` yol sabitleri **yol sözleşmesidir** ; bu alanları n ekranları fiziksel
React sayfaları olarak değil, ListForm konfigürasyonu ile üretilir. `hr` altı nda yalnı zca
organizasyon şeması (`OrgChart.tsx`) fiziksel bir view'dı r.
- `Telegram` bildirim kanalı altyapı da tanı mlı dı r ancak UI'da kapalı dı r.
- Depodaki `appsettings*.json` ve deployment dokümanları geliştirme değerleri/örnek kimlik
bilgileri içerir; üretim öncesi tümü değiştirilmelidir.
2026-08-26 18:44:53 +00:00
- SQL View Designer tek yönlüdür (model → T-SQL). Elle yazı lmı ş ya da tasarı mcı nı n kanonik
şekline uymayan bir view tanı mı geri okunamaz; dialog ham SQL moduna düşer.
- `api/test/Sozsoft.Platform.EntityFrameworkCore.Tests` şu an SQLite şema oluşturmada
(`nvarchar(max)` → `SQLite Error 1` ) kı rı ktı r; bu kı rı klı k kod standardı ndan önce de vardı ve
ayrı bir iş olarak ele alı nmalı dı r.
2026-08-10 09:08:08 +00:00
- Rol– yetki eşleşmeleri veritabanı nda müşteri ortamı na göre değişir; buradaki yetki kodları
tanı mı n kendisidir, atama değil.
---
## Lisans ve Sahiplik
2026-06-09 12:54:05 +00:00
2026-08-10 09:08:08 +00:00
Bu depo Sozsoft'a aittir. DevExpress/DevExtreme bileşenleri ticari lisans gerektirir
(`api/DevExpress_License.txt`).