Frontend
- Upgrade Angular 19 -> 22 (TypeScript 6, new control flow), drop unused
packages (bootstrap, jquery, popper, ng-bootstrap, webpack)
- Move the UI to Angular Material: toolbar with user menu, tutorials list,
add/edit forms, admin users table with role editing dialog, profile,
home page with published tutorials, registration form, login dialog
- Guard routes: login required for add/edit/profile, admin role for /admin
- Remove the /login, Moderator and User pages, event bus, auth interceptor
and other dead code
Backend
- Add PUT /api/users/{id}/roles (admin only) that keeps at least one admin
and does not let an admin drop their own admin role
- Tighten security: read tutorials publicly, change them only when logged
in, users/roles API for admins only; hide password hashes in JSON
- Remove unused Settings and Test endpoints, DTO mappers, commented code
- Flyway V2 aligns the schema with the entities (bigint ids, tutorials PK,
identity ids); Hibernate now runs with ddl-auto: validate
Docker
- Three-stage Dockerfile (Node build, Gradle build, JRE runtime) with
layer caching, non-root user and healthcheck; add .dockerignore
- docker-compose waits for a healthy Postgres, always rebuilds the image,
no longer mounts the Docker socket
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
74 lines
2.2 KiB
Groovy
74 lines
2.2 KiB
Groovy
plugins {
|
|
id 'java'
|
|
id 'org.springframework.boot' version '4.1.1'
|
|
id 'io.spring.dependency-management' version '1.1.7'
|
|
id 'com.github.node-gradle.node' version '7.0.2'
|
|
}
|
|
|
|
group = 'com.example'
|
|
version = '0.0.1-SNAPSHOT'
|
|
|
|
java {
|
|
toolchain {
|
|
languageVersion = JavaLanguageVersion.of(26)
|
|
}
|
|
}
|
|
|
|
tasks.register('copyAngularBuild', Copy) {
|
|
group = "_jambotron_build"
|
|
dependsOn deleteStaticFolder, buildAngular
|
|
from 'spring-angular-ui/static/browser'
|
|
into "src/main/resources/static"
|
|
}
|
|
|
|
tasks.register('deleteStaticFolder', Delete) {
|
|
group = "_jambotron_build"
|
|
delete "src/main/resources/static"
|
|
}
|
|
|
|
tasks.register('buildAngular', com.github.gradle.node.npm.task.NpmTask) {
|
|
group = "_jambotron_build"
|
|
dependsOn installAngularDeps
|
|
workingDir = file('./spring-angular-ui')
|
|
args = ['run', 'build']
|
|
}
|
|
|
|
tasks.register('installAngularDeps', com.github.gradle.node.npm.task.NpmTask) {
|
|
group = "_jambotron_build"
|
|
workingDir = file('./spring-angular-ui')
|
|
args = ['install', '--legacy-peer-deps']
|
|
}
|
|
|
|
repositories {
|
|
mavenCentral()
|
|
}
|
|
|
|
dependencies {
|
|
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
|
|
implementation 'org.springframework.boot:spring-boot-starter-flyway'
|
|
implementation 'org.springframework.boot:spring-boot-starter-webmvc'
|
|
implementation 'org.flywaydb:flyway-database-postgresql'
|
|
implementation 'org.springframework.boot:spring-boot-starter-actuator'
|
|
developmentOnly 'org.springframework.boot:spring-boot-devtools'
|
|
runtimeOnly 'org.postgresql:postgresql'
|
|
testImplementation 'org.springframework.boot:spring-boot-starter-data-jpa-test'
|
|
testImplementation 'org.springframework.boot:spring-boot-starter-flyway-test'
|
|
testImplementation 'org.springframework.boot:spring-boot-starter-webmvc-test'
|
|
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
|
|
|
|
implementation 'org.springframework.boot:spring-boot-starter-security'
|
|
implementation 'org.springframework.boot:spring-boot-starter-validation'
|
|
|
|
// Безопасность и JWT
|
|
implementation 'io.jsonwebtoken:jjwt-api:0.11.5'
|
|
runtimeOnly 'io.jsonwebtoken:jjwt-impl:0.11.5'
|
|
runtimeOnly 'io.jsonwebtoken:jjwt-jackson:0.11.5'
|
|
|
|
implementation 'com.fasterxml.jackson.core:jackson-databind:2.17.0'
|
|
|
|
}
|
|
|
|
tasks.named('test') {
|
|
useJUnitPlatform()
|
|
}
|