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. |
| **Public web sitesi** | Ana sayfa, hakkı mı zda, hizmetler, ürün, ödeme, blog, demo ve iletişim içerikleri (tasarı mcı ekranları yla düzenlenebilir). |
| **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-04 09:05:26 +00:00
türüne göre `crud/` , `custom/` , `wizard/` , `data/` , `sql/` , `postgres/` klasörleri bulunur:
2026-08-17 09:23:47 +00:00
```
configs/seeds/
host/
2026-09-04 09:05:26 +00:00
crud/ custom/ wizard/ data/
2026-08-17 09:23:47 +00:00
sql/ { object/ execute/ }
postgres/ { object/ execute/ }
tenants/
{tenantId}/
2026-09-04 09:05:26 +00:00
crud/ custom/ 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-08-18 09:36:40 +00:00
| `crud` | CrudEndpoint konfigürasyonları ; `CrudDataSeeder` kendi kapsamı ndaki dosyaları okur. |
| `custom` | Custom Component konfigürasyonları (`{Name}.json`); Component Manager kaydetme/silme sı rası nda dosyayı senkronlar, `CustomComponentDataSeeder` kendi kapsamı ndaki dosyaları okuyup veritabanı na uygular. |
2026-09-04 09:05:26 +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. |
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ı
migrate tetikleme, dı şa aktarma ve içe aktarma. Butonlar `App.Listforms.Wizard.*` yetkileriyle
gizlenir; ası l kontrol `ListFormWizardAppService` üzerindedir.
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.
| Yol | İçerik |
| --- | --- |
| `wizard/{dosya}.json` | Wizard tanı mı nı n kendisi |
| `custom/{component}.json` | Custom yolunda bağlı component ve bağı mlı lı kları |
| `crud/{entity}.json` | Component'lerin/nesnenin kullandı ğı CRUD endpoint tanı mları |
| `{sql\|postgres}/{object\|execute}/{nesne}.sql` | List yolunda `SelectCommand` 'a karşı lı k gelen SQL nesnesi |
**İçe aktarma iki adı mlı dı r** (`WizardImportDialog`):
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.
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
`RollbackImport` ile toplu işlem geri alı nabilir; `CompleteImport` oturumu kapatı r.
Güvenlik sı nı rları : yalnı zca `wizard` , `crud` , `custom` , `sql` , `postgres` kök klasörleri
(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-08-10 09:08:08 +00:00
| **Dynamic Service** | `/admin/developerkit/dynamic-services` | C# kodunu tarayı cı da yazı p Roslyn ile derleme (`TestCompile`), yayı nlama (`Publish`) ve çalı şan uygulamaya controller olarak kaydetme. Yetkiler: Create/Edit/Delete/Manage/TestCompile/Publish/ViewCode. |
2026-08-26 18:44:53 +00:00
| **Custom Component** | `/admin/developerkit/components` | React bileşenini veritabanı nda saklama; `@babel/standalone` ile tarayı cı da derleyip route'a bağlama. Liste/kart görünümü, arama; yetkiler `App.DeveloperKit.Components{,.Create,.Update,.Delete}` . |
2026-08-10 09:08:08 +00:00
| **Visual Designer** | Component editörü içinde | 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.
**Seed senkronizasyonu.** Component Manager üzerinden kaydedilen/silinen her bileşen
`configs/seeds/{host|tenants/{tenantId}}/custom/{Name}.json` olarak yazı lı r;
`CustomComponentDataSeeder` veritabanı silinip yeniden oluşturulduğunda aynı dosyaları okuyup geri
yükler. Dosya düzeni bilinçli olarak `TenantData.json` içindeki `CustomComponents` bloğuyla
aynı 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. Aynı çözüm hem kaydetmede (katalog
veritabanı ndan) hem seed'de (katalog `crud/*.json` dosyaları ndan) kullanı ldı ğı için sütun iki
yolda da aynı üretilir.
**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.
**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
nokta budur. Yeni bileşen `configs/seeds/host/custom/NewComponent.json` şablonundan başlar.
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-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` |
| `App.DeveloperKit.Components` | `.Create` , `.Update` , `.Delete` |
| `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ı ) |
| `App.{Home,About,Services,Contact}.Design` | Public site sayfa tasarı m modu (`?design=1`) |
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. |
| Forum | `/admin/forum` , `/admin/forumManagement` | Forum kullanı mı ve yönetimi. |
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-08-10 09:08:08 +00:00
`/home` · `/about` · `/services` · `/products` · `/checkout` · `/payment` · `/success` ·
`/blog` · `/blog/:id` · `/demo` · `/contact` — içerikler veritabanı ndan yönetilir;
`/about/designer` ve `/services/designer` sayfa tasarı mcı ları 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
## 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)
- `WizardDataSeeder.cs` , `CustomComponentDataSeeder.cs` , `CrudDataSeeder.cs` — aşağı daki
runtime seed dosyaları nı okuyup uygulayan seeder'lar
**2. Runtime'da üretilen seed'ler** — `configs/seeds/` . Wizard, Component Manager ve CRUD Endpoint
Manager çalı şma zamanı nda burayı yazar; veritabanı silinip yeniden oluşturulduğunda aynı dosyalar
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-08-26 18:44:53 +00:00
│ ├── custom/ # {ComponentName}.json → CustomComponentDataSeeder
│ ├── crud/ # {EntityName}.json → CrudDataSeeder
│ ├── 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`).