Initial commit: LMS microservices scaffold

- Gradle multi-module: libs/{common-http,security-jwt,markdown,test-support},
  services/{identity,academic,progress,gateway}, web (Thymeleaf+htmx)
- identity-service: JWT auth (RSA), accounts, students, groups, enrollment,
  import from XLSX/CSV, credentials export, password reset
- academic-service: lab import from JSON/zip (markdown + YAML + variants),
  levels, API
- progress-service: schema for student levels and variant assignments
- gateway: Spring Cloud Gateway, JWT validation, route propagation
- web: Server-side UI with flex/footer layout, light/dark theme toggle,
  admin dashboard, groups CRUD, student portal placeholder
- docker-compose: PostgreSQL 18
- Tests: identity smoke test with Testcontainers
This commit is contained in:
2026-09-10 19:46:13 +03:00
commit 9b7748571e
119 changed files with 4671 additions and 0 deletions

80
gradle/libs.versions.toml Normal file
View File

@@ -0,0 +1,80 @@
# Version catalog: central place for dependency versions.
# https://docs.gradle.org/current/userguide/platforms.html#sub:version-catalog
[versions]
# Spring Boot 4.0.x is the release train matched by Spring Cloud 2025.1.x.
springBoot = "4.0.8"
springCloud = "2025.1.3"
kotlin = "2.4.20"
springdoc = "3.0.3"
flexmark = "0.64.8"
owaspSanitizer = "20260313.1"
apachePoi = "5.5.1"
[libraries]
# --- Gradle plugins used from buildSrc ---
kotlinGradlePlugin = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin", version.ref = "kotlin" }
kotlinAllopenPlugin = { module = "org.jetbrains.kotlin:kotlin-allopen", version.ref = "kotlin" }
kotlinNoargPlugin = { module = "org.jetbrains.kotlin:kotlin-noarg", version.ref = "kotlin" }
springBootGradlePlugin = { module = "org.springframework.boot:spring-boot-gradle-plugin", version.ref = "springBoot" }
# --- Platform BOMs (versions only) ---
springBootBom = { module = "org.springframework.boot:spring-boot-dependencies", version.ref = "springBoot" }
springCloudBom = { module = "org.springframework.cloud:spring-cloud-dependencies", version.ref = "springCloud" }
# --- Spring Boot starters (versions managed by the Boot BOM) ---
springBootStarterWeb = { module = "org.springframework.boot:spring-boot-starter-web" }
springBootStarterWebflux = { module = "org.springframework.boot:spring-boot-starter-webflux" }
springBootStarterValidation = { module = "org.springframework.boot:spring-boot-starter-validation" }
springBootStarterActuator = { module = "org.springframework.boot:spring-boot-starter-actuator" }
springBootStarterDataJpa = { module = "org.springframework.boot:spring-boot-starter-data-jpa" }
springBootStarterFlyway = { module = "org.springframework.boot:spring-boot-starter-flyway" }
springBootStarterSecurity = { module = "org.springframework.boot:spring-boot-starter-security" }
springBootStarterOauth2ResourceServer = { module = "org.springframework.boot:spring-boot-starter-oauth2-resource-server" }
springBootStarterThymeleaf = { module = "org.springframework.boot:spring-boot-starter-thymeleaf" }
springBootStarterTest = { module = "org.springframework.boot:spring-boot-starter-test" }
springBootDevtools = { module = "org.springframework.boot:spring-boot-devtools" }
springSecurityTest = { module = "org.springframework.security:spring-security-test" }
# --- Spring Cloud ---
springCloudStarterGatewayWebflux = { module = "org.springframework.cloud:spring-cloud-starter-gateway-server-webflux" }
# --- Plain Spring libraries (for shared modules) ---
springWeb = { module = "org.springframework:spring-web" }
springContext = { module = "org.springframework:spring-context" }
springBootAutoconfigure = { module = "org.springframework.boot:spring-boot-autoconfigure" }
springSecurityConfig = { module = "org.springframework.security:spring-security-config" }
springSecurityWeb = { module = "org.springframework.security:spring-security-web" }
springSecurityOauth2Jose = { module = "org.springframework.security:spring-security-oauth2-jose" }
# --- Persistence / migrations ---
flywayCore = { module = "org.flywaydb:flyway-core" }
flywayPostgresql = { module = "org.flywaydb:flyway-database-postgresql" }
postgresql = { module = "org.postgresql:postgresql" }
jacksonYaml = { module = "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml" }
jacksonModuleKotlin = { module = "com.fasterxml.jackson.module:jackson-module-kotlin" }
# --- API docs ---
springdocStarterWebmvcUi = { module = "org.springdoc:springdoc-openapi-starter-webmvc-ui", version.ref = "springdoc" }
# --- Markdown rendering ---
flexmarkAll = { module = "com.vladsch.flexmark:flexmark-all", version.ref = "flexmark" }
owaspHtmlSanitizer = { module = "com.googlecode.owasp-java-html-sanitizer:owasp-java-html-sanitizer", version.ref = "owaspSanitizer" }
# --- Spreadsheet import/export ---
apachePoiOoxml = { module = "org.apache.poi:poi-ooxml", version.ref = "apachePoi" }
# --- Tests / Testcontainers (versions managed by the Boot BOM) ---
springBootTestcontainers = { module = "org.springframework.boot:spring-boot-testcontainers" }
testcontainersPostgresql = { module = "org.testcontainers:testcontainers-postgresql" }
testcontainersJunitJupiter = { module = "org.testcontainers:testcontainers-junit-jupiter" }
[bundles]
springWeb = ["springBootStarterWeb", "springBootStarterValidation", "springBootStarterActuator"]
springPersistence = ["springBootStarterDataJpa", "flywayCore", "flywayPostgresql", "postgresql"]
[plugins]
kotlinPluginJvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" }
kotlinPluginSpring = { id = "org.jetbrains.kotlin.plugin.spring", version.ref = "kotlin" }
kotlinPluginJpa = { id = "org.jetbrains.kotlin.plugin.jpa", version.ref = "kotlin" }
springBootPlugin = { id = "org.springframework.boot", version.ref = "springBoot" }

BIN
gradle/wrapper/gradle-wrapper.jar vendored Normal file

Binary file not shown.

View File

@@ -0,0 +1,6 @@
#Thu Sep 10 14:24:06 MSK 2026
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-9.6.0-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists