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-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-08-18 09:36:40 +00:00
| `crud` | CrudEndpoint konfigürasyonları ; `CrudDataSeeder` kendi kapsamı ndaki dosyaları okur. |
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.
| Yol | İçerik |
| --- | --- |
| `wizard/{dosya}.json` | Wizard tanı mı nı n kendisi |
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-08-26 18:44:53 +00:00
| `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 |
2026-09-05 18:20:18 +00:00
**İçe aktarma üç adı mlı dı r** (`WizardImportDialog`):
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.
3. **Kapanı ş** (`CompleteImport`) — oturum kapatı lmadan önce zip'in getirdiği `data/*.json` dosyaları
`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`
kapsamı nda **değildir** — geri alma bu adı mdan önce yapı lı r. Diğer klasörler (`wizard`, `crud` ,
`sql` ) dosya olarak kalı r; veritabanı na seeder ya da wizard deploy ile geçer.
`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.
**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-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ı ) |
| `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. |
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-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)
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 06:14:00 +00:00
- `ListFormSeedDataApplier` (`Domain/Data/`) — bütün contributor'lar bittikten sonra
`data/{ListFormCode}.json` dosyaları nı uygular
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-08-26 18:44:53 +00:00
│ ├── crud/ # {EntityName}.json → CrudDataSeeder
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`).