<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>4.0.6</version>
        <relativePath/>
    </parent>

    <groupId>platform</groupId>
    <artifactId>platform-back</artifactId>
    <version>0.1.0-SNAPSHOT</version>
    <packaging>jar</packaging>
    <name>platform-back</name>

    <properties>
        <java.version>21</java.version>
        <querydsl.version>5.1.0</querydsl.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

        <dependency>
            <groupId>com.github.f4b6a3</groupId>
            <artifactId>uuid-creator</artifactId>
            <version>6.1.1</version>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

        <!-- QueryDSL JPA (BaseCrudService) -->
        <dependency>
            <groupId>com.querydsl</groupId>
            <artifactId>querydsl-jpa</artifactId>
            <version>${querydsl.version}</version>
            <classifier>jakarta</classifier>
        </dependency>
        <dependency>
            <groupId>com.querydsl</groupId>
            <artifactId>querydsl-apt</artifactId>
            <version>${querydsl.version}</version>
            <classifier>jakarta</classifier>
            <scope>provided</scope>
        </dependency>

        <!-- Spring Web (AbstractCrudController) — fourni par l'app consommatrice -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <optional>true</optional>
        </dependency>

        <!-- Spring Security (RequestLoggingFilter userId) — fourni par l'app consommatrice -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
            <optional>true</optional>
        </dependency>

        <!-- OAuth2 Resource Server (validation JWT Ipse via JWKS) — fourni par l'app consommatrice -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-oauth2-resource-server</artifactId>
            <optional>true</optional>
        </dependency>

        <!-- Logs JSON structurés (RequestLoggingFilter, logback-spring.xml) -->
        <dependency>
            <groupId>net.logstash.logback</groupId>
            <artifactId>logstash-logback-encoder</artifactId>
            <version>8.0</version>
        </dependency>

        <!-- Rate-limiting applicatif (token-bucket) : par plan (platform.billing) et throttle anti-flood
             (platform.throttle). Variante JDK17 (projet en Java 21). -->
        <dependency>
            <groupId>com.bucket4j</groupId>
            <artifactId>bucket4j_jdk17-core</artifactId>
            <version>8.19.0</version>
        </dependency>

        <!-- Caffeine : store borné à éviction pour les seaux du throttle anti-flood (clés par IP).
             Version gérée par le BOM Spring Boot. -->
        <dependency>
            <groupId>com.github.ben-manes.caffeine</groupId>
            <artifactId>caffeine</artifactId>
        </dependency>

        <!-- Datafaker : génération de données réalistes pour le seeder (platform.seed). Utilisé en dev
             (commandes seed:*) et réutilisable comme factory dans les tests d'intégration. -->
        <dependency>
            <groupId>net.datafaker</groupId>
            <artifactId>datafaker</artifactId>
            <version>2.4.2</version>
        </dependency>

        <!-- ════════════════ Tests (harness platform, packagé en test-jar) ════════════════ -->

        <!-- Pile de test Spring Boot 4 : webmvc-test inclut starter-test + MockMvc (le monolithe
             spring-boot-starter-test a été éclaté en modules granulaires). Security/oauth2 sont déjà
             optional côté main, donc présents sur le classpath de test de ce module. -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-webmvc-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!-- Bean Validation (jakarta.validation + hibernate-validator) pour déclencher les 400 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
            <scope>test</scope>
        </dependency>

        <!-- Base H2 en mémoire (mode PostgreSQL) : pas de Docker, démarrage instantané (Jenkins-friendly).
             Le schéma est régénéré par JPA (Flyway off en test) ; les migrations Postgres ne sont pas
             rejouées sur H2 — elles sont auto-générées et hors périmètre des tests. -->
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <scope>test</scope>
        </dependency>

        <!-- JWKS mock : sert la clé publique de test pour valider les JWT RS256 signés localement -->
        <dependency>
            <groupId>org.wiremock</groupId>
            <artifactId>wiremock-standalone</artifactId>
            <version>3.10.0</version>
            <scope>test</scope>
        </dependency>
        <!-- Note : nimbus-jose-jwt (signature des tokens de test) est transitif via
             spring-boot-starter-oauth2-resource-server → spring-security-oauth2-jose. -->

        <!-- ArchUnit : règles d'architecture (Controller ne dépend pas d'un Repository, etc.) -->
        <dependency>
            <groupId>com.tngtech.archunit</groupId>
            <artifactId>archunit-junit5</artifactId>
            <version>1.3.0</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <annotationProcessorPaths>
                        <path>
                            <groupId>org.springframework.boot</groupId>
                            <artifactId>spring-boot-autoconfigure-processor</artifactId>
                        </path>
                        <path>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </path>
                        <path>
                            <groupId>com.querydsl</groupId>
                            <artifactId>querydsl-apt</artifactId>
                            <version>${querydsl.version}</version>
                            <classifier>jakarta</classifier>
                        </path>
                        <path>
                            <groupId>jakarta.persistence</groupId>
                            <artifactId>jakarta.persistence-api</artifactId>
                        </path>
                    </annotationProcessorPaths>
                </configuration>
            </plugin>

            <!-- Publie le harness de test réutilisable (platform.test) en test-jar.
                 Les projets l'ajoutent en <type>test-jar</type><scope>test</scope>.
                 Les fixtures internes et les tests concrets ne sont pas inclus. -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <executions>
                    <execution>
                        <id>test-jar</id>
                        <goals>
                            <goal>test-jar</goal>
                        </goals>
                        <configuration>
                            <includes>
                                <include>platform/test/**</include>
                            </includes>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

    <distributionManagement>
        <repository>
            <id>forgejo</id>
            <url>https://forgejo.homepickle.ddns.net/api/packages/pickle-dev-fr/maven</url>
        </repository>
    </distributionManagement>
</project>
