---
name: yeni-modul
description: ConstructionStructure projesinde yeni bir modül iskeleti oluşturur. Kullanıcı "yeni modül oluştur", "modül ekle", "modül iskeleti", "scaffold modül" veya herhangi bir modül adı verip yapılandırma istediğinde bu skill'i kullan. Modülün NuGet paketi yapısı, PostgreSQL schema izolasyonu, MediatR entegrasyonu, FluentValidation, Dapper/EF Core ayrımı ve standart Response formatı dahil tüm proje konvansiyonlarına uygun olarak üretilmesini sağlar.
---

# Yeni Modül Oluşturma Skill'i

Bu skill, ConstructionStructure projesinde yeni bir modülü tüm proje
standartlarına uygun biçimde iskeletler.

**Önce oku:** `docs/SYSTEM_PROMPT-v1.7.2.md` — tüm teknik kararların
tek kaynağıdır. Bu skill o belgeyi tamamlar, yerini almaz.

---

## 1. KULLANICIDAN ALINACAK BİLGİLER

Kod yazmadan önce aşağıdakileri öğren. Yanıtlar net değilse sor:

1. **Modül adı** (Örn: `Aidat`, `Tahsilat`, `Isınma`)
2. **PostgreSQL schema adı** (Örn: `aidat`, `tahsilat`) — genellikle modül adının küçük harfi
3. **Yapı tipi** — Hangi yapı tipleri bu modülü kullanacak? (Site, AVM, Marina, hepsi?)
4. **Temel entity'ler** — Bu modülün ana varlıkları neler? (Örn: AidatTahakkuk, AidatOdeme)
5. **Diğer modüllerle ilişki** — Hangi modüllerle event bazlı iletişim kurması gerekiyor?

Ardından **3-5 stratejik risk sorusu** sor (Gatekeeping kuralı).
Yusuf **"ONAY"** vermeden kod üretilemez.

---

## 2. ÜRETILECEK DOSYA YAPISI

```
ConstructionStructure.Modules.{ModulAdi}/
│
├── {ModulAdi}.csproj                          ← NuGet paketi tanımı
│
├── Domain/
│   ├── Entities/
│   │   └── {Entity}.cs                        ← GUID + ShortCode zorunlu
│   └── Events/
│       └── {Entity}OlusturulduEvent.cs        ← MediatR INotification
│
├── Application/
│   ├── Common/
│   │   └── {ModulAdi}Permissions.cs           ← İzin sabitleri
│   ├── Features/
│   │   └── {Entity}/
│   │       ├── Create{Entity}Command.cs       ← Command + Handler + Validator
│   │       ├── Update{Entity}Command.cs
│   │       ├── Delete{Entity}Command.cs
│   │       └── Get{Entity}Query.cs            ← Dapper ile
│   └── Behaviors/
│       └── ValidationBehavior.cs              ← Pipeline behavior (Core'dan referans alınır)
│
├── Infrastructure/
│   ├── Persistence/
│   │   ├── {ModulAdi}DbContext.cs             ← Schema izolasyonu burada
│   │   └── Configurations/
│   │       └── {Entity}Configuration.cs
│   ├── Migrations/
│   └── Repositories/
│       └── {Entity}Repository.cs              ← Write (EF Core)
│
├── Presentation/
│   └── {ModulAdi}Endpoints.cs                ← Minimal API endpoint'leri
│
└── Resources/
    ├── {ModulAdi}.tr-TR.resx                  ← Türkçe mesajlar
    └── {ModulAdi}.en-US.resx                  ← İngilizce mesajlar
```

---

## 3. KOD ÜRETİM KURALLARI

### 3.1 Entity Şablonu
Her entity şunları içermek ZORUNDADIR:

```csharp
/// <summary>
/// [Entity'nin neden var olduğunu açıkla — ne yaptığını değil]
/// </summary>
public class {Entity} : BaseEntity  // BaseEntity: GUID Id + ShortCode + TenantId + audit alanları
{
    // Alanlar buraya
}
```

- `Id` → `Guid` (BaseEntity'den gelir)
- `ShortCode` → 8 karakter alfanümerik (BaseEntity'den gelir)
- `TenantId` → `Guid` (BaseEntity'den gelir)
- Tüm navigation property'ler `private set` olmalı

### 3.2 Command/Query Şablonu

```csharp
// Command (Write) → EF Core
public record Create{Entity}Command : IRequest<Result<{Entity}Response>>
{
    public Guid TenantId { get; init; }  // Middleware tarafından doldurulur
    // Diğer alanlar...
}

// Query (Read) → Dapper
public record Get{Entity}Query : IRequest<Result<{Entity}Response>>
{
    public string ShortCode { get; init; }  // GUID değil, ShortCode kullanılır
    public Guid TenantId { get; init; }
}
```

### 3.3 Validator Şablonu

```csharp
public class Create{Entity}CommandValidator : AbstractValidator<Create{Entity}Command>
{
    public Create{Entity}CommandValidator(IStringLocalizer<{ModulAdi}Resource> localizer)
    {
        RuleFor(x => x.{Alan})
            .NotEmpty()
            .WithMessage(localizer["{ModulAdi}.Validation.{Alan}Required"]);
    }
}
```

### 3.4 Endpoint Şablonu

```csharp
// Tüm response'lar standart Hibrit Zarf formatında olmalı:
// { success, data, problem }
// GUID asla URL'ye çıkmaz — ShortCode kullanılır

app.MapPost("/api/v1/{modül}", async (...) => { ... })
   .WithName("Create{Entity}")
   .WithTags("{ModulAdi}")
   .RequireAuthorization();
```

### 3.5 DbContext Şablonu

```csharp
/// <summary>
/// {ModulAdi} modülünün veritabanı bağlamı.
/// Schema izolasyonu ile diğer modüllerden ayrışır.
/// </summary>
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.HasDefaultSchema("{schemaAdi}");  // Örn: "aidat"
    modelBuilder.ApplyConfigurationsFromAssembly(Assembly.GetExecutingAssembly());
}
```

### 3.6 Loglama Kuralı

Tüm CRUD işlemlerinde üç hedefe birden log yazılır:

```csharp
_logger.LogInformation(
    "{Entity} oluşturuldu. TenantId: {TenantId}, ShortCode: {ShortCode}",
    nameof({Entity}), command.TenantId, entity.ShortCode
);
// NOT: Kişisel veri (TC, ad-soyad vb.) loglara asla yazılmaz (KVKK)
```

### 3.7 .csproj Şablonu

```xml
<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net10.0</TargetFramework>
    <Nullable>enable</Nullable>
    <ImplicitUsings>enable</ImplicitUsings>
    <!-- NuGet Paketi Tanımı -->
    <PackageId>ConstructionStructure.Modules.{ModulAdi}</PackageId>
    <Version>1.0.0</Version>
    <Authors>ConstructionStructure</Authors>
    <Description>{ModulAdi} modülü — toplu yapı yönetim platformu</Description>
  </PropertyGroup>
</Project>
```

---

## 4. MESAJ KEY'LERİ

Modül oluşturulduğunda `.resx` dosyalarına şu key'ler eklenir:

```
{ModulAdi}.Validation.{Alan}Required
{ModulAdi}.Validation.{Alan}Invalid
{ModulAdi}.Error.NotFound
{ModulAdi}.Error.AlreadyExists
{ModulAdi}.Success.Created
{ModulAdi}.Success.Updated
{ModulAdi}.Success.Deleted
```

---

## 5. TAMAMLAMA KRİTERİ

Modül iskeleti tamamlandığında şunlar hazır olmalıdır:

- [ ] Proje dosyası NuGet paketi olarak yapılandırıldı
- [ ] PostgreSQL schema izolasyonu tanımlandı
- [ ] En az bir entity GUID + ShortCode ile oluşturuldu
- [ ] EF Core konfigürasyonu yazıldı
- [ ] Create/Update/Delete Command + Validator üretildi
- [ ] Get Query Dapper ile yazıldı
- [ ] Endpoint'ler Hibrit Zarf formatında tanımlandı
- [ ] tr-TR ve en-US `.resx` dosyaları oluşturuldu
- [ ] Tüm yapılar `/// <summary>` ile "neden" belirtilerek dökümante edildi
- [ ] Loglama üç hedefe yazılacak şekilde eklendi

---

## 6. REFERANSLAR

- Proje standartları → `docs/SYSTEM_PROMPT-v1.7.2.md`
- Ortak bileşenler (BaseEntity, Result<T>, vb.) → `ConstructionStructure.Core`
- Diğer modüller → örnek için mevcut modülleri incele
