apiVersion: scaffolder.backstage.io/v1beta3
kind: Template
metadata:
  name: service-quarkus
  title: Java — Quarkus (native-ready service)
  description: |
    Production-grade JVM service optimized for fast startup, low
    memory, container deployments, and GraalVM native image builds
    (Java or Kotlin source). Uses Quarkus REST, CDI, Dev Services,
    Quarkus extensions, JUnit 5, and RestAssured.
  tags:
    - java
    - service
    - quarkus
    - native-image
  links:
    - url: https://quarkus.io/guides/getting-started
      title: Quarkus getting started
    - url: https://quarkus.io/guides/gradle-tooling
      title: Quarkus and Gradle
    - url: https://quarkus.io/guides/rest
      title: Quarkus REST
    - url: https://quarkus.io/guides/hibernate-orm-panache
      title: Hibernate ORM with Panache
    - url: https://quarkus.io/guides/opentelemetry
      title: OpenTelemetry in Quarkus
    - url: https://quarkus.io/guides/building-native-image
      title: Building a native executable
spec:
  owner: abp
  type: service
  parameters:
    - title: Stack Configuration
      required:
        - language_flavor
        - database
      properties:
        backend:
          title: Backend
          type: string
          const: quarkus
        frontend:
          title: Frontend
          type: string
          const: api-only
        language_flavor:
          title: Language
          type: string
          enum:
            - java
            - kotlin
          enumNames:
            - 'Java — default for Quarkus services'
            - 'Kotlin — supported when the team is Kotlin-oriented'
        database:
          title: Database
          type: string
          enum:
            - postgres
            - mysql
            - h2
            - none
          enumNames:
            - 'Postgres — default for production'
            - 'MySQL'
            - 'H2 — embedded development/test DB'
            - 'None — stateless service'
        persistence:
          title: Persistence
          type: string
          default: hibernate-orm-panache
          enum:
            - hibernate-orm-panache
            - hibernate-orm
            - hibernate-reactive-panache
            - jdbc-client
            - none
          enumNames:
            - 'Hibernate ORM with Panache — compact active-record/repository style'
            - 'Hibernate ORM — standard Jakarta Persistence'
            - 'Hibernate Reactive with Panache — reactive database access'
            - 'JDBC client — direct SQL'
            - 'None'
        background_jobs:
          title: Background Jobs
          type: string
          default: quarkus-scheduler
          enum:
            - quarkus-scheduler
            - quartz
            - none
          enumNames:
            - 'Quarkus Scheduler — built-in cron/fixed-rate jobs'
            - 'Quartz — durable, clustered job scheduling'
            - 'None'
        auth:
          title: Authentication
          type: string
          default: oidc
          enum:
            - oidc
            - smallrye-jwt
            - none
          enumNames:
            - 'Quarkus OIDC — OAuth2/OIDC resource server'
            - 'SmallRye JWT — signed JWT verification'
            - 'None'
        observability:
          title: Observability
          type: string
          default: smallrye-health-micrometer
          enum:
            - smallrye-health-micrometer
            - opentelemetry
            - none
          enumNames:
            - 'SmallRye Health + Micrometer — default'
            - 'OpenTelemetry'
            - 'None'
        native_image:
          title: GraalVM Native Image
          type: string
          default: disabled
          enum:
            - disabled
            - local
            - container
          enumNames:
            - 'Disabled — JVM runtime'
            - 'Enabled — local Mandrel/GraalVM build'
            - 'Enabled — container build'
  tooling:
    package_manager: gradle
    build_dsl: kotlin
    language_flavor: java-or-kotlin
    test_runner: quarkus-junit5-restassured
    lint_format: spotless-or-palantir-java-format
    runtime_cli: gradle
  smoke_test: |
    GET /q/health returns UP. One @QuarkusTest + RestAssured test
    asserts the endpoint response. If native_image is enabled, add a
    @QuarkusIntegrationTest smoke test for the packaged artifact.
  switch_when: |
    Need Spring ecosystem/starters/Spring Security/Spring Data →
    service-spring-boot. Compact API with minimal concepts →
    api-javalin. Compile-time DI / native-image fit without Quarkus
    extension conventions → Micronaut (future sibling).
