khg-development gateway .cursorrules file for Java

You are an expert in Java programming, Spring Boot, Spring Framework, Maven, JUnit, and related Java technologies.

Uygulama bir Gateway uygulamasıdır. Reactive programlama kullanılmaktadır. Tüm fonksiyonları buna göre hazırla.
Uygulamanın ana paket adı "tr.com.khg.services.gateway" dir ve src/main/java/tr/com/khg/services/gateway altında bulunur.

Kod yerleşimi
- Configuration sınıfları src/main/java/tr/com/khg/services/gateway/config altında bulunur.
- Entity sınıfları src/main/java/tr/com/khg/services/gateway/entity altında bulunur.
- Repository sınıfları src/main/java/tr/com/khg/services/gateway/repository altında bulunur.
- Service sınıfları src/main/java/tr/com/khg/services/gateway/service altında bulunur.
- Controller sınıfları src/main/java/tr/com/khg/services/gateway/web/rest altında bulunur.
- Model sınıfları src/main/java/tr/com/khg/services/gateway/model altında bulunur.
- Request sınıfları src/main/java/tr/com/khg/services/gateway/model/request altında bulunur.
- Response sınıfları src/main/java/tr/com/khg/services/gateway/model/response altında bulunur.

Gateway filter tanımlama
- Spring Cloud Gateway ile filter tanımlama yapılacaktır.
- Yeni eklenecek yeni tip filter tanımı için yeni bir entity tanımlanacak ve Route entity'si ile ilişkilendirilecektir.
- Filter entity'nin adı RouteXFilter gibi olacaktır.
- Route sınıfı içine OneToMany olarak eklenecek ve clearFilters metotu içinde clear edilecektir.
- Entity paketinde bulunan Enums paketinde bulunan FilterType enum'u içine yeni bir tip eklenecektir.
- Eklenen filter için repository paketi altına yeni bir repository tanımlanacak.
- Repository içine deleteByRoute adında bir method tanımlanacak. Ve bu metot modifying ve transactional olacak.
- Bu filtreyi ekleme için Filtre Adına uygun şekilde bir ekleme sınıfı tanımlanacak. Örneğin isim NewFilter gibi olacaktır.
- Yeni bir route ekleme isteğinde kullanılan RouteRequest sınıfının içinde bulunan Filter tipindeki sınıf içine yeni filtre ekleme sınıfı eklenecektir.
- Listeleme için Filter Response sınıfı oluşturulacak. RouteResponse sınıfının içinde bulunan FiltersResponse tipindeki sınıf içine yeni filtre listeme sınıfı eklenecektir.
- Utils atında bulunan FilterUtils sınıfı içine yeni eklenen filtre için metot eklenecektir.
- Route service içinde route ekleme ve güncelleme metotları içine yeni eklenen filtreyi diğer filtrelerde oluduğu gibi ekleme işlemi ve güncelleme işlemini yapılacak şekilde güncellenecektir.
- Route service içinde createRouteFromRequest metotu içinde yeni varsayılan bir route tanımı içine yeni eklenen filtrede eklenecektir. Aynı fonksiyon içinde route değişkenine filtre utils sınıfı ile oluşturulan yeni filtre listesi setlenecektir.
- Route service içinde updateRouteFromRequest metotu içinde repository içindeki deleteByRoute ile var olan filtreler silinecek ve yeni eklenen filtreler eklenecektir.
- Route service içinde bulunan createRouteDefinition metotu içinde yeni eklenen filtre eğer istek içinde gönderilmişse route definition içinde set edilecektir.
- Route service içinde bulunan mapToRouteResponse metotu içine yeni eklenen filter'ı response içinde gösterecek şekilde güncellenecektir.

Code Style and Structure
- Write clean, efficient, and well-documented Java code with accurate Spring Boot examples.
- Use Spring Boot best practices and conventions throughout your code.
- Implement RESTful API design patterns when creating web services.
- Use descriptive method and variable names following camelCase convention.
- Structure Spring Boot applications: controllers, services, repositories, models, configurations.
- Tüm component, service, restcontroller sınıflarında yoksa RequiredArgsConstructor anotasyonu eklenecek ve dependency injection yaparken inject edilecek sınıf private final ile eklenecektir.

Spring Boot Specifics
- Use Spring Boot starters for quick project setup and dependency management.
- Implement proper use of annotations (e.g., @SpringBootApplication, @RestController, @Service).
- Utilize Spring Boot's auto-configuration features effectively.
- Implement proper exception handling using @ControllerAdvice and @ExceptionHandler.

Naming Conventions
- Use PascalCase for class names (e.g., UserController, OrderService).
- Use camelCase for method and variable names (e.g., findUserById, isOrderValid).
- Use ALL_CAPS for constants (e.g., MAX_RETRY_ATTEMPTS, DEFAULT_PAGE_SIZE).

Java and Spring Boot Usage
- Use Java 17 or later features when applicable (e.g., records, sealed classes, pattern matching).
- Leverage Spring Boot 3.x features and best practices.
- Use Spring Data JPA for database operations when applicable.
- Implement proper validation using Bean Validation (e.g., @Valid, custom validators).

Configuration and Properties
- Use application.properties or application.yml for configuration.
- Implement environment-specific configurations using Spring Profiles.
- Use @ConfigurationProperties for type-safe configuration properties.

Dependency Injection and IoC
- Use constructor injection over field injection for better testability.
- Leverage Spring's IoC container for managing bean lifecycles.

Testing
- Test yazarken, `throws` ifadesi yerine `@SneakyThrows` anotasyonunu kullanın.
- Write unit tests using JUnit 5 and Spring Boot Test.
- Use MockMvc for testing web layers.
- Implement integration tests using @SpringBootTest.
- Use @DataJpaTest for repository layer tests.

Performance and Scalability
- Implement caching strategies using Spring Cache abstraction.
- Use async processing with @Async for non-blocking operations.
- Implement proper database indexing and query optimization.

Security
- Implement Spring Security for authentication and authorization.
- Use proper password encoding (e.g., BCrypt).
- Implement CORS configuration when necessary.

Logging and Monitoring
- Use SLF4J with Logback for logging.
- Implement proper log levels (ERROR, WARN, INFO, DEBUG).
- Use Spring Boot Actuator for application monitoring and metrics.

API Documentation
- Use Springdoc OpenAPI (formerly Swagger) for API documentation.

Data Access and ORM
- Use Spring Data JPA for database operations.
- Implement proper entity relationships and cascading.
- Use database migrations with Flyway.
- Flyway migration dosyalarının isimleri src/main/resources/db/migration altında bulunan en büyük sayılı migration dosyasının sayısından bir fazlası XX olmak kaydıyla V1_XX__Migration_Name.sql olmalıdır. Migration adının her kelimesi büyük harf ile başlayan ve aralarında alt çizgi ile ayrılmış olmalıdır.
- Migration dosyaları Postgresql'e göre yazılacak ve id için bigserial tipi kullanılacaktır.

Build and Deployment
- Use Maven for dependency management and build processes.
- Implement proper profiles for different environments (dev, test, prod).
- Use Docker for containerization if applicable.

Follow best practices for:
- RESTful API design (proper use of HTTP methods, status codes, etc.).
- Microservices architecture (if applicable).
- Asynchronous processing using Spring's @Async or reactive programming with Spring WebFlux.

Adhere to SOLID principles and maintain high cohesion and low coupling in your Spring Boot application design.
Always keep the code clean, well-documented, and easy to maintain.

## RFC Kuralları
- Gateway Predicate testleri için RFC'ler RFC-00X formatında numaralandırılır
- Her yeni predicate için sıradaki numara kullanılır
- RFC'ler docs/rfc/ klasörü altında tutulur
- RFC dosya adı formatı: RFC-XXX-Name.md

## RFC İçerik Yapısı
1. Durum bilgisi (Taslak, İnceleme, Onaylandı, Uygulandı)
2. Özet
3. Test gereksinimleri
   - Test edilecek sınıflar
   - Test senaryoları
   - Test ortamı gereksinimleri
   - Örnek test kodları
4. Test coverage gereksinimleri
5. Gelecek adımlar
6. Referanslar

## RFC Mapping
- RFC-001: After Route Predicate Factory Tests
- RFC-002: Before Route Predicate Factory Tests

## Test Paket Yapısı
- Entity testleri: src/test/java/tr/com/khg/services/gateway/entity
- Repository testleri: src/test/java/tr/com/khg/services/gateway/repository
- Request/Response model testleri: src/test/java/tr/com/khg/services/gateway/model
- Test fixture'ları: src/test/java/tr/com/khg/services/gateway/utils/TestFixtures.java

## Test Adlandırma Kuralları
- Test sınıfı adı: TestedClass + Test (örn: RouteAfterPredicationTest)
- Test metodu adı: when + Scenario + then + ExpectedResult
- Test fixture metodu adı: create + EntityName (örn: createTestRoute)

## Test Coverage Gereksinimleri
- Entity sınıfları: minimum %90
- Repository sınıfları: minimum %85
- Request/Response modelleri: minimum %90

## Test Teknolojileri
- JUnit 5
- AssertJ
- Mockito
- H2 Database (test veritabanı)
- @DataJpaTest (repository testleri için)
- @SpringBootTest (entegrasyon testleri için)

## Test Kuralları ve Yapısı

### Gateway Predicate Testleri
- Her predicate için ayrı bir RFC dokümanı oluşturulmalı (RFC-00X formatında)
- Her RFC için ayrı bir test sınıfı yazılmalı
- Test sınıfları integration test olarak tasarlanmalı
- WebTestClient kullanılarak HTTP istekleri test edilmeli
- MockServer ile hedef servisler simüle edilmeli

### Test Sınıfı Yapısı
```java
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
class RoutePredicateTest {
  @Autowired private WebTestClient webTestClient;
  @Autowired private RouteService routeService;
  @Autowired private ApiProxyRepository apiProxyRepository;
  @Autowired private RouteRepository routeRepository;
  @Autowired private RouteDefinitionLocator routeDefinitionLocator;
  @Autowired private RouteDefinitionWriter routeDefinitionWriter;
  @Autowired private ApplicationEventPublisher eventPublisher;

    private ClientAndServer mockServer;
    private final String testProxyName = "test-proxy";

  @BeforeEach
  void setUp() {
    apiProxyRepository.deleteByName(testProxyName);
    apiProxyRepository.save(
        ApiProxy.builder().name(testProxyName).uri("http://localhost:8081").build());
    mockServer = ClientAndServer.startClientAndServer(8081);
  }

  @AfterEach
  void tearDown() {
    routeRepository.deleteAll();
    routeDefinitionLocator
        .getRouteDefinitions()
        .flatMap(
            routeDefinition ->
                routeDefinitionWriter
                    .delete(Mono.just(routeDefinition.getId()))
                    .onErrorResume(e -> Mono.empty()))
        .blockLast();

    eventPublisher.publishEvent(new RefreshRoutesEvent(this));

    mockServer.stop();
  }
}
```

### Test Metot Adlandırma
- Format: when[Senaryo]_then[BeklenenSonuç]
- Örnek: whenRouteActivationTimeIsInFuture_thenRouteShouldBeInactive()

### Test Senaryoları İçeriği
1. Pozitif test senaryoları
2. Negatif test senaryoları
3. Edge case'ler
4. Zaman bazlı senaryolar (gerektiğinde)
5. Hata durumları

### Test Ortam Gereksinimleri
- Spring Boot Test ortamı (@SpringBootTest)
- H2 test veritabanı
- MockServer (hedef servis simülasyonu)
- WebTestClient
- TestContainers (gerektiğinde)

### Test Coverage Hedefleri
- Integration testleri: minimum %85
- Unit testler: minimum %90
- Entity testleri: minimum %90
- Repository testleri: minimum %85
- Controller testleri: minimum %85

### Test Fixture Kullanımı
- src/test/java/tr/com/khg/services/gateway/utils/TestFixtures.java içinde tanımlanmalı
- Her entity için ayrı factory metotları olmalı
- Test verisi oluşturma metotları statik olmalı
```java
public class TestFixtures {
    public static Route createTestRoute() {
        // Test route oluşturma
    }

    public static ApiProxy createTestProxy() {
        // Test proxy oluşturma
    }
}
```

### Test Temizliği
- Her test öncesi veritabanı temizlenmeli
- Test sonrası kaynaklar serbest bırakılmalı
- MockServer her test sonrası resetlenmeli

### Test Dokümantasyonu
- Her test sınıfı için JavaDoc yazılmalı
- Karmaşık test senaryoları için metot seviyesinde açıklama eklenmeli
- Test hazırlık ve temizlik adımları belgelenmeli

### Test Kategorileri
1. Entity Testleri
   - JPA ilişkileri
   - Entity validasyonları
   - Lifecycle metotları

2. Repository Testleri
   - CRUD operasyonları
   - Özel sorgu metotları
   - Pagination

3. Integration Testleri
   - Predicate davranışları
   - Route yönetimi
   - Filter zincirleri

4. Performance Testleri
   - Yük testleri
   - Stress testleri
   - Response time ölçümleri

### Test Araçları ve Teknolojiler
- JUnit 5
- AssertJ
- Mockito
- H2 Database
- WebTestClient
- MockServer
- TestContainers (gerektiğinde)
- Spring Boot Test
- @DataJpaTest
- @SpringBootTest

### Test Raporlama
- JaCoCo test coverage raporları
- Surefire test raporları
- Failsafe integration test raporları
bun
docker
golang
java
postgresql
react
rest-api
solidjs
+1 more

First Time Repository

Java

Languages:

Java: 316.7KB
Created: 12/4/2024
Updated: 1/21/2025

All Repositories (1)