forked from n.nasr/skills
Nora
3 years ago
commit
80703d2dd7
128 changed files with 26487 additions and 0 deletions
-
23.editorconfig
-
150.gitattributes
-
147.gitignore
-
5.huskyrc
-
30.jhipster/Skills.json
-
3.lintstagedrc.js
-
8.prettierignore
-
12.prettierrc
-
40.yo-rc.json
-
126README.md
-
11Skills.jdl
-
309build.gradle
-
19checkstyle.xml
-
65gradle.properties
-
22gradle/docker.gradle
-
47gradle/profile_dev.gradle
-
37gradle/profile_prod.gradle
-
26gradle/sonar.gradle
-
13gradle/war.gradle
-
BINgradle/wrapper/gradle-wrapper.jar
-
5gradle/wrapper/gradle-wrapper.properties
-
3gradle/zipkin.gradle
-
188gradlew
-
100gradlew.bat
-
16205package-lock.json
-
23package.json
-
16settings.gradle
-
28sonar-project.properties
-
23src/main/docker/app.yml
-
8src/main/docker/central-server-config/README.md
-
15src/main/docker/central-server-config/docker-config/application.yml
-
15src/main/docker/central-server-config/localhost-config/application.yml
-
3778src/main/docker/grafana/provisioning/dashboards/JVM.json
-
11src/main/docker/grafana/provisioning/dashboards/dashboard.yml
-
50src/main/docker/grafana/provisioning/datasources/datasource.yml
-
22src/main/docker/jhipster-registry.yml
-
26src/main/docker/monitoring.yml
-
16src/main/docker/mssql.yml
-
31src/main/docker/prometheus/prometheus.yml
-
7src/main/docker/sonar.yml
-
20src/main/java/com/cm/skills/ApplicationWebXml.java
-
105src/main/java/com/cm/skills/SkillsApp.java
-
113src/main/java/com/cm/skills/aop/logging/LoggingAspect.java
-
18src/main/java/com/cm/skills/client/UserFeignClientInterceptor.java
-
13src/main/java/com/cm/skills/config/ApplicationProperties.java
-
47src/main/java/com/cm/skills/config/AsyncConfiguration.java
-
28src/main/java/com/cm/skills/config/CloudDatabaseConfiguration.java
-
12src/main/java/com/cm/skills/config/Constants.java
-
21src/main/java/com/cm/skills/config/DatabaseConfiguration.java
-
20src/main/java/com/cm/skills/config/DateTimeFormatConfiguration.java
-
22src/main/java/com/cm/skills/config/FeignConfiguration.java
-
52src/main/java/com/cm/skills/config/JacksonConfiguration.java
-
60src/main/java/com/cm/skills/config/LiquibaseConfiguration.java
-
27src/main/java/com/cm/skills/config/LocaleConfiguration.java
-
19src/main/java/com/cm/skills/config/LoggingAspectConfiguration.java
-
56src/main/java/com/cm/skills/config/LoggingConfiguration.java
-
69src/main/java/com/cm/skills/config/SecurityConfiguration.java
-
58src/main/java/com/cm/skills/config/WebConfigurer.java
-
86src/main/java/com/cm/skills/config/audit/AuditEventConverter.java
-
4src/main/java/com/cm/skills/config/audit/package-info.java
-
4src/main/java/com/cm/skills/config/package-info.java
-
77src/main/java/com/cm/skills/domain/AbstractAuditingEntity.java
-
108src/main/java/com/cm/skills/domain/PersistentAuditEvent.java
-
106src/main/java/com/cm/skills/domain/Skills.java
-
4src/main/java/com/cm/skills/domain/package-info.java
-
14src/main/java/com/cm/skills/repository/SkillsRepository.java
-
4src/main/java/com/cm/skills/repository/package-info.java
-
16src/main/java/com/cm/skills/security/AuthoritiesConstants.java
-
85src/main/java/com/cm/skills/security/SecurityUtils.java
-
20src/main/java/com/cm/skills/security/SpringSecurityAuditorAware.java
-
21src/main/java/com/cm/skills/security/jwt/JWTConfigurer.java
-
48src/main/java/com/cm/skills/security/jwt/JWTFilter.java
-
111src/main/java/com/cm/skills/security/jwt/TokenProvider.java
-
4src/main/java/com/cm/skills/security/package-info.java
-
84src/main/java/com/cm/skills/service/SkillsService.java
-
78src/main/java/com/cm/skills/service/dto/SkillsDTO.java
-
21src/main/java/com/cm/skills/service/mapper/EntityMapper.java
-
25src/main/java/com/cm/skills/service/mapper/SkillsMapper.java
-
4src/main/java/com/cm/skills/service/package-info.java
-
125src/main/java/com/cm/skills/web/rest/SkillsResource.java
-
42src/main/java/com/cm/skills/web/rest/errors/BadRequestAlertException.java
-
15src/main/java/com/cm/skills/web/rest/errors/ErrorConstants.java
-
181src/main/java/com/cm/skills/web/rest/errors/ExceptionTranslator.java
-
33src/main/java/com/cm/skills/web/rest/errors/FieldErrorVM.java
-
6src/main/java/com/cm/skills/web/rest/errors/package-info.java
-
4src/main/java/com/cm/skills/web/rest/package-info.java
-
4src/main/java/com/cm/skills/web/rest/vm/package-info.java
-
4src/main/jib/entrypoint.sh
-
10src/main/resources/banner.txt
-
134src/main/resources/config/application-dev.yml
-
149src/main/resources/config/application-prod.yml
-
19src/main/resources/config/application-tls.yml
-
210src/main/resources/config/application.yml
-
22src/main/resources/config/bootstrap-prod.yml
-
26src/main/resources/config/bootstrap.yml
-
74src/main/resources/config/liquibase/changelog/00000000000000_initial_schema.xml
-
57src/main/resources/config/liquibase/changelog/20210618132416_added_entity_Skills.xml
-
11src/main/resources/config/liquibase/fake-data/skills.csv
-
21src/main/resources/config/liquibase/master.xml
-
BINsrc/main/resources/config/tls/keystore.p12
@ -0,0 +1,23 @@ |
|||||
|
# EditorConfig helps developers define and maintain consistent |
||||
|
# coding styles between different editors and IDEs |
||||
|
# editorconfig.org |
||||
|
|
||||
|
root = true |
||||
|
|
||||
|
[*] |
||||
|
|
||||
|
# We recommend you to keep these unchanged |
||||
|
end_of_line = lf |
||||
|
charset = utf-8 |
||||
|
trim_trailing_whitespace = true |
||||
|
insert_final_newline = true |
||||
|
|
||||
|
# Change these settings to your own preference |
||||
|
indent_style = space |
||||
|
indent_size = 4 |
||||
|
|
||||
|
[*.{ts,tsx,js,jsx,json,css,scss,yml}] |
||||
|
indent_size = 2 |
||||
|
|
||||
|
[*.md] |
||||
|
trim_trailing_whitespace = false |
@ -0,0 +1,150 @@ |
|||||
|
# This file is inspired by https://github.com/alexkaratarakis/gitattributes |
||||
|
# |
||||
|
# Auto detect text files and perform LF normalization |
||||
|
# http://davidlaing.com/2012/09/19/customise-your-gitattributes-to-become-a-git-ninja/ |
||||
|
* text=auto |
||||
|
|
||||
|
# The above will handle all files NOT found below |
||||
|
# These files are text and should be normalized (Convert crlf => lf) |
||||
|
|
||||
|
*.bat text eol=crlf |
||||
|
*.cmd text eol=crlf |
||||
|
*.ps1 text eol=crlf |
||||
|
*.coffee text |
||||
|
*.css text |
||||
|
*.cql text |
||||
|
*.df text |
||||
|
*.ejs text |
||||
|
*.html text |
||||
|
*.java text |
||||
|
*.js text |
||||
|
*.json text |
||||
|
*.less text |
||||
|
*.properties text |
||||
|
*.sass text |
||||
|
*.scss text |
||||
|
*.sh text eol=lf |
||||
|
*.sql text |
||||
|
*.txt text |
||||
|
*.ts text |
||||
|
*.xml text |
||||
|
*.yaml text |
||||
|
*.yml text |
||||
|
|
||||
|
# Documents |
||||
|
*.doc diff=astextplain |
||||
|
*.DOC diff=astextplain |
||||
|
*.docx diff=astextplain |
||||
|
*.DOCX diff=astextplain |
||||
|
*.dot diff=astextplain |
||||
|
*.DOT diff=astextplain |
||||
|
*.pdf diff=astextplain |
||||
|
*.PDF diff=astextplain |
||||
|
*.rtf diff=astextplain |
||||
|
*.RTF diff=astextplain |
||||
|
*.markdown text |
||||
|
*.md text |
||||
|
*.adoc text |
||||
|
*.textile text |
||||
|
*.mustache text |
||||
|
*.csv text |
||||
|
*.tab text |
||||
|
*.tsv text |
||||
|
*.txt text |
||||
|
AUTHORS text |
||||
|
CHANGELOG text |
||||
|
CHANGES text |
||||
|
CONTRIBUTING text |
||||
|
COPYING text |
||||
|
copyright text |
||||
|
*COPYRIGHT* text |
||||
|
INSTALL text |
||||
|
license text |
||||
|
LICENSE text |
||||
|
NEWS text |
||||
|
readme text |
||||
|
*README* text |
||||
|
TODO text |
||||
|
|
||||
|
# Graphics |
||||
|
*.png binary |
||||
|
*.jpg binary |
||||
|
*.jpeg binary |
||||
|
*.gif binary |
||||
|
*.tif binary |
||||
|
*.tiff binary |
||||
|
*.ico binary |
||||
|
# SVG treated as an asset (binary) by default. If you want to treat it as text, |
||||
|
# comment-out the following line and uncomment the line after. |
||||
|
*.svg binary |
||||
|
#*.svg text |
||||
|
*.eps binary |
||||
|
|
||||
|
# These files are binary and should be left untouched |
||||
|
# (binary is a macro for -text -diff) |
||||
|
*.class binary |
||||
|
*.jar binary |
||||
|
*.war binary |
||||
|
|
||||
|
## LINTERS |
||||
|
.csslintrc text |
||||
|
.eslintrc text |
||||
|
.jscsrc text |
||||
|
.jshintrc text |
||||
|
.jshintignore text |
||||
|
.stylelintrc text |
||||
|
|
||||
|
## CONFIGS |
||||
|
*.conf text |
||||
|
*.config text |
||||
|
.editorconfig text |
||||
|
.gitattributes text |
||||
|
.gitconfig text |
||||
|
.gitignore text |
||||
|
.htaccess text |
||||
|
*.npmignore text |
||||
|
|
||||
|
## HEROKU |
||||
|
Procfile text |
||||
|
.slugignore text |
||||
|
|
||||
|
## AUDIO |
||||
|
*.kar binary |
||||
|
*.m4a binary |
||||
|
*.mid binary |
||||
|
*.midi binary |
||||
|
*.mp3 binary |
||||
|
*.ogg binary |
||||
|
*.ra binary |
||||
|
|
||||
|
## VIDEO |
||||
|
*.3gpp binary |
||||
|
*.3gp binary |
||||
|
*.as binary |
||||
|
*.asf binary |
||||
|
*.asx binary |
||||
|
*.fla binary |
||||
|
*.flv binary |
||||
|
*.m4v binary |
||||
|
*.mng binary |
||||
|
*.mov binary |
||||
|
*.mp4 binary |
||||
|
*.mpeg binary |
||||
|
*.mpg binary |
||||
|
*.swc binary |
||||
|
*.swf binary |
||||
|
*.webm binary |
||||
|
|
||||
|
## ARCHIVES |
||||
|
*.7z binary |
||||
|
*.gz binary |
||||
|
*.rar binary |
||||
|
*.tar binary |
||||
|
*.zip binary |
||||
|
|
||||
|
## FONTS |
||||
|
*.ttf binary |
||||
|
*.eot binary |
||||
|
*.otf binary |
||||
|
*.woff binary |
||||
|
*.woff2 binary |
@ -0,0 +1,147 @@ |
|||||
|
###################### |
||||
|
# Project Specific |
||||
|
###################### |
||||
|
/build/resources/main/static/** |
||||
|
/src/test/javascript/coverage/ |
||||
|
|
||||
|
###################### |
||||
|
# Node |
||||
|
###################### |
||||
|
/node/ |
||||
|
node_tmp/ |
||||
|
node_modules/ |
||||
|
npm-debug.log.* |
||||
|
/.awcache/* |
||||
|
/.cache-loader/* |
||||
|
|
||||
|
###################### |
||||
|
# SASS |
||||
|
###################### |
||||
|
.sass-cache/ |
||||
|
|
||||
|
###################### |
||||
|
# Eclipse |
||||
|
###################### |
||||
|
*.pydevproject |
||||
|
.project |
||||
|
.metadata |
||||
|
tmp/ |
||||
|
tmp/**/* |
||||
|
*.tmp |
||||
|
*.bak |
||||
|
*.swp |
||||
|
*~.nib |
||||
|
local.properties |
||||
|
.classpath |
||||
|
.settings/ |
||||
|
.loadpath |
||||
|
.factorypath |
||||
|
/src/main/resources/rebel.xml |
||||
|
|
||||
|
# External tool builders |
||||
|
.externalToolBuilders/** |
||||
|
|
||||
|
# Locally stored "Eclipse launch configurations" |
||||
|
*.launch |
||||
|
|
||||
|
# CDT-specific |
||||
|
.cproject |
||||
|
|
||||
|
# PDT-specific |
||||
|
.buildpath |
||||
|
|
||||
|
# STS-specific |
||||
|
/.sts4-cache/* |
||||
|
|
||||
|
###################### |
||||
|
# IntelliJ |
||||
|
###################### |
||||
|
.idea/ |
||||
|
*.iml |
||||
|
*.iws |
||||
|
*.ipr |
||||
|
*.ids |
||||
|
*.orig |
||||
|
classes/ |
||||
|
out/ |
||||
|
|
||||
|
###################### |
||||
|
# Visual Studio Code |
||||
|
###################### |
||||
|
.vscode/ |
||||
|
|
||||
|
###################### |
||||
|
# Maven |
||||
|
###################### |
||||
|
/log/ |
||||
|
/target/ |
||||
|
|
||||
|
###################### |
||||
|
# Gradle |
||||
|
###################### |
||||
|
.gradle/ |
||||
|
/build/ |
||||
|
|
||||
|
###################### |
||||
|
# Package Files |
||||
|
###################### |
||||
|
*.jar |
||||
|
*.war |
||||
|
*.ear |
||||
|
*.db |
||||
|
|
||||
|
###################### |
||||
|
# Windows |
||||
|
###################### |
||||
|
# Windows image file caches |
||||
|
Thumbs.db |
||||
|
|
||||
|
# Folder config file |
||||
|
Desktop.ini |
||||
|
|
||||
|
###################### |
||||
|
# Mac OSX |
||||
|
###################### |
||||
|
.DS_Store |
||||
|
.svn |
||||
|
|
||||
|
# Thumbnails |
||||
|
._* |
||||
|
|
||||
|
# Files that might appear on external disk |
||||
|
.Spotlight-V100 |
||||
|
.Trashes |
||||
|
|
||||
|
###################### |
||||
|
# Directories |
||||
|
###################### |
||||
|
/bin/ |
||||
|
/deploy/ |
||||
|
|
||||
|
###################### |
||||
|
# Logs |
||||
|
###################### |
||||
|
*.log* |
||||
|
|
||||
|
###################### |
||||
|
# Others |
||||
|
###################### |
||||
|
*.class |
||||
|
*.*~ |
||||
|
*~ |
||||
|
.merge_file* |
||||
|
|
||||
|
###################### |
||||
|
# Gradle Wrapper |
||||
|
###################### |
||||
|
!gradle/wrapper/gradle-wrapper.jar |
||||
|
|
||||
|
###################### |
||||
|
# Maven Wrapper |
||||
|
###################### |
||||
|
!.mvn/wrapper/maven-wrapper.jar |
||||
|
|
||||
|
###################### |
||||
|
# ESLint |
||||
|
###################### |
||||
|
.eslintcache |
@ -0,0 +1,5 @@ |
|||||
|
{ |
||||
|
"hooks": { |
||||
|
"pre-commit": "lint-staged" |
||||
|
} |
||||
|
} |
@ -0,0 +1,30 @@ |
|||||
|
{ |
||||
|
"name": "Skills", |
||||
|
"fields": [ |
||||
|
{ |
||||
|
"fieldName": "idFormation", |
||||
|
"fieldType": "Long" |
||||
|
}, |
||||
|
{ |
||||
|
"fieldName": "idPersonnel", |
||||
|
"fieldType": "Long" |
||||
|
}, |
||||
|
{ |
||||
|
"fieldName": "competence", |
||||
|
"fieldType": "String" |
||||
|
} |
||||
|
], |
||||
|
"relationships": [], |
||||
|
"changelogDate": "20210618132416", |
||||
|
"entityTableName": "skills", |
||||
|
"dto": "mapstruct", |
||||
|
"pagination": "pagination", |
||||
|
"service": "serviceClass", |
||||
|
"jpaMetamodelFiltering": false, |
||||
|
"fluentMethods": true, |
||||
|
"readOnly": false, |
||||
|
"embedded": false, |
||||
|
"clientRootFolder": "skills", |
||||
|
"applications": "*", |
||||
|
"microserviceName": "Skills" |
||||
|
} |
@ -0,0 +1,3 @@ |
|||||
|
module.exports = { |
||||
|
'{,src/**/}*.{json,md,yml}': ['prettier --write', 'git add'] |
||||
|
}; |
@ -0,0 +1,8 @@ |
|||||
|
node_modules |
||||
|
target |
||||
|
build |
||||
|
package-lock.json |
||||
|
.git |
||||
|
.mvn |
||||
|
gradle |
||||
|
.gradle |
@ -0,0 +1,12 @@ |
|||||
|
# Prettier configuration |
||||
|
|
||||
|
printWidth: 140 |
||||
|
singleQuote: true |
||||
|
tabWidth: 2 |
||||
|
useTabs: false |
||||
|
|
||||
|
# js and ts rules: |
||||
|
arrowParens: avoid |
||||
|
|
||||
|
# jsx and tsx rules: |
||||
|
jsxBracketSameLine: false |
@ -0,0 +1,40 @@ |
|||||
|
{ |
||||
|
"generator-jhipster": { |
||||
|
"promptValues": { |
||||
|
"packageName": "com.cm.skills", |
||||
|
"nativeLanguage": "fr" |
||||
|
}, |
||||
|
"jhipsterVersion": "6.10.5", |
||||
|
"applicationType": "microservice", |
||||
|
"baseName": "skills", |
||||
|
"packageName": "com.cm.skills", |
||||
|
"packageFolder": "com/cm/skills", |
||||
|
"serverPort": "3006", |
||||
|
"authenticationType": "jwt", |
||||
|
"cacheProvider": "no", |
||||
|
"websocket": false, |
||||
|
"databaseType": "sql", |
||||
|
"devDatabaseType": "mssql", |
||||
|
"prodDatabaseType": "mssql", |
||||
|
"searchEngine": false, |
||||
|
"messageBroker": false, |
||||
|
"serviceDiscoveryType": "eureka", |
||||
|
"buildTool": "gradle", |
||||
|
"enableSwaggerCodegen": false, |
||||
|
"jwtSecretKey": "NWY1NjJhNmQ1MzdkY2FhZDQ0ZGI5ODVlYTEwZmRjMjdlNDYzYjQ3OTNjN2MxN2NhY2ZjNDg1ODczZDUyM2IwZjBhMDFmYjY2ZTc4MjhjZTVlYmEyNzgwMDI3ZjE4ZTA3NzE4Y2VmOGU1MjRhZDU2MWI4YjExYjM0YjFhNDgyNDg=", |
||||
|
"embeddableLaunchScript": false, |
||||
|
"creationTimestamp": 1624016278560, |
||||
|
"testFrameworks": [], |
||||
|
"jhiPrefix": "jhi", |
||||
|
"entitySuffix": "", |
||||
|
"dtoSuffix": "DTO", |
||||
|
"otherModules": [], |
||||
|
"enableTranslation": true, |
||||
|
"clientPackageManager": "npm", |
||||
|
"nativeLanguage": "fr", |
||||
|
"languages": ["fr", "ar-ly"], |
||||
|
"blueprints": [], |
||||
|
"skipClient": true, |
||||
|
"skipUserManagement": true |
||||
|
} |
||||
|
} |
@ -0,0 +1,126 @@ |
|||||
|
# skills |
||||
|
|
||||
|
This application was generated using JHipster 6.10.5, you can find documentation and help at [https://www.jhipster.tech/documentation-archive/v6.10.5](https://www.jhipster.tech/documentation-archive/v6.10.5). |
||||
|
|
||||
|
This is a "microservice" application intended to be part of a microservice architecture, please refer to the [Doing microservices with JHipster][] page of the documentation for more information. |
||||
|
|
||||
|
This application is configured for Service Discovery and Configuration with the JHipster-Registry. On launch, it will refuse to start if it is not able to connect to the JHipster-Registry at [http://localhost:8761](http://localhost:8761). For more information, read our documentation on [Service Discovery and Configuration with the JHipster-Registry][]. |
||||
|
|
||||
|
## Development |
||||
|
|
||||
|
To start your application in the dev profile, run: |
||||
|
|
||||
|
``` |
||||
|
./gradlew |
||||
|
``` |
||||
|
|
||||
|
For further instructions on how to develop with JHipster, have a look at [Using JHipster in development][]. |
||||
|
|
||||
|
## Building for production |
||||
|
|
||||
|
### Packaging as jar |
||||
|
|
||||
|
To build the final jar and optimize the skills application for production, run: |
||||
|
|
||||
|
``` |
||||
|
|
||||
|
|
||||
|
./gradlew -Pprod clean bootJar |
||||
|
|
||||
|
``` |
||||
|
|
||||
|
To ensure everything worked, run: |
||||
|
|
||||
|
``` |
||||
|
|
||||
|
|
||||
|
java -jar build/libs/*.jar |
||||
|
|
||||
|
``` |
||||
|
|
||||
|
Refer to [Using JHipster in production][] for more details. |
||||
|
|
||||
|
### Packaging as war |
||||
|
|
||||
|
To package your application as a war in order to deploy it to an application server, run: |
||||
|
|
||||
|
``` |
||||
|
|
||||
|
|
||||
|
./gradlew -Pprod -Pwar clean bootWar |
||||
|
|
||||
|
``` |
||||
|
|
||||
|
## Testing |
||||
|
|
||||
|
To launch your application's tests, run: |
||||
|
|
||||
|
``` |
||||
|
./gradlew test integrationTest jacocoTestReport |
||||
|
``` |
||||
|
|
||||
|
For more information, refer to the [Running tests page][]. |
||||
|
|
||||
|
### Code quality |
||||
|
|
||||
|
Sonar is used to analyse code quality. You can start a local Sonar server (accessible on http://localhost:9001) with: |
||||
|
|
||||
|
``` |
||||
|
docker-compose -f src/main/docker/sonar.yml up -d |
||||
|
``` |
||||
|
|
||||
|
You can run a Sonar analysis with using the [sonar-scanner](https://docs.sonarqube.org/display/SCAN/Analyzing+with+SonarQube+Scanner) or by using the gradle plugin. |
||||
|
|
||||
|
Then, run a Sonar analysis: |
||||
|
|
||||
|
``` |
||||
|
./gradlew -Pprod clean check jacocoTestReport sonarqube |
||||
|
``` |
||||
|
|
||||
|
For more information, refer to the [Code quality page][]. |
||||
|
|
||||
|
## Using Docker to simplify development (optional) |
||||
|
|
||||
|
You can use Docker to improve your JHipster development experience. A number of docker-compose configuration are available in the [src/main/docker](src/main/docker) folder to launch required third party services. |
||||
|
|
||||
|
For example, to start a mssql database in a docker container, run: |
||||
|
|
||||
|
``` |
||||
|
docker-compose -f src/main/docker/mssql.yml up -d |
||||
|
``` |
||||
|
|
||||
|
To stop it and remove the container, run: |
||||
|
|
||||
|
``` |
||||
|
docker-compose -f src/main/docker/mssql.yml down |
||||
|
``` |
||||
|
|
||||
|
You can also fully dockerize your application and all the services that it depends on. |
||||
|
To achieve this, first build a docker image of your app by running: |
||||
|
|
||||
|
``` |
||||
|
./gradlew bootJar -Pprod jibDockerBuild |
||||
|
``` |
||||
|
|
||||
|
Then run: |
||||
|
|
||||
|
``` |
||||
|
docker-compose -f src/main/docker/app.yml up -d |
||||
|
``` |
||||
|
|
||||
|
For more information refer to [Using Docker and Docker-Compose][], this page also contains information on the docker-compose sub-generator (`jhipster docker-compose`), which is able to generate docker configurations for one or several JHipster applications. |
||||
|
|
||||
|
## Continuous Integration (optional) |
||||
|
|
||||
|
To configure CI for your project, run the ci-cd sub-generator (`jhipster ci-cd`), this will let you generate configuration files for a number of Continuous Integration systems. Consult the [Setting up Continuous Integration][] page for more information. |
||||
|
|
||||
|
[jhipster homepage and latest documentation]: https://www.jhipster.tech |
||||
|
[jhipster 6.10.5 archive]: https://www.jhipster.tech/documentation-archive/v6.10.5 |
||||
|
[doing microservices with jhipster]: https://www.jhipster.tech/documentation-archive/v6.10.5/microservices-architecture/ |
||||
|
[using jhipster in development]: https://www.jhipster.tech/documentation-archive/v6.10.5/development/ |
||||
|
[service discovery and configuration with the jhipster-registry]: https://www.jhipster.tech/documentation-archive/v6.10.5/microservices-architecture/#jhipster-registry |
||||
|
[using docker and docker-compose]: https://www.jhipster.tech/documentation-archive/v6.10.5/docker-compose |
||||
|
[using jhipster in production]: https://www.jhipster.tech/documentation-archive/v6.10.5/production/ |
||||
|
[running tests page]: https://www.jhipster.tech/documentation-archive/v6.10.5/running-tests/ |
||||
|
[code quality page]: https://www.jhipster.tech/documentation-archive/v6.10.5/code-quality/ |
||||
|
[setting up continuous integration]: https://www.jhipster.tech/documentation-archive/v6.10.5/setting-up-ci/ |
@ -0,0 +1,11 @@ |
|||||
|
|
||||
|
entity Skills { |
||||
|
idFormation Long, |
||||
|
idPersonnel Long, |
||||
|
competence String |
||||
|
} |
||||
|
|
||||
|
service all with serviceClass |
||||
|
microservice * with Skills |
||||
|
paginate * with pagination |
||||
|
dto * with mapstruct |
@ -0,0 +1,309 @@ |
|||||
|
buildscript { |
||||
|
repositories { |
||||
|
mavenLocal() |
||||
|
mavenCentral() |
||||
|
gradlePluginPortal() |
||||
|
maven { url "https://repo.spring.io/plugins-release" } |
||||
|
} |
||||
|
dependencies { |
||||
|
//jhipster-needle-gradle-buildscript-dependency - JHipster will add additional gradle build script plugins here |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
plugins { |
||||
|
id "java" |
||||
|
id "maven-publish" |
||||
|
id "idea" |
||||
|
id "jacoco" |
||||
|
id "org.springframework.boot" |
||||
|
id "com.google.cloud.tools.jib" |
||||
|
id "com.gorylenko.gradle-git-properties" |
||||
|
id "net.ltgt.apt-eclipse" |
||||
|
id "net.ltgt.apt-idea" |
||||
|
id "net.ltgt.apt" |
||||
|
id "org.liquibase.gradle" |
||||
|
id "org.sonarqube" |
||||
|
id "io.spring.nohttp" |
||||
|
//jhipster-needle-gradle-plugins - JHipster will add additional gradle plugins here |
||||
|
} |
||||
|
|
||||
|
group = "com.cm.skills" |
||||
|
version = "0.0.1-SNAPSHOT" |
||||
|
|
||||
|
description = "" |
||||
|
|
||||
|
sourceCompatibility=1.8 |
||||
|
targetCompatibility=1.8 |
||||
|
assert System.properties["java.specification.version"] == "1.8" || "11" || "12" || "13" || "14" |
||||
|
|
||||
|
apply from: "gradle/docker.gradle" |
||||
|
apply from: "gradle/sonar.gradle" |
||||
|
//jhipster-needle-gradle-apply-from - JHipster will add additional gradle scripts to be applied here |
||||
|
|
||||
|
if (project.hasProperty("prod") || project.hasProperty("gae")) { |
||||
|
apply from: "gradle/profile_prod.gradle" |
||||
|
} else { |
||||
|
apply from: "gradle/profile_dev.gradle" |
||||
|
} |
||||
|
|
||||
|
if (project.hasProperty("war")) { |
||||
|
apply from: "gradle/war.gradle" |
||||
|
} |
||||
|
|
||||
|
if (project.hasProperty("gae")) { |
||||
|
apply plugin: 'maven' |
||||
|
apply plugin: 'org.springframework.boot.experimental.thin-launcher' |
||||
|
apply plugin: 'io.spring.dependency-management' |
||||
|
|
||||
|
dependencyManagement { |
||||
|
imports { |
||||
|
mavenBom "io.github.jhipster:jhipster-dependencies:${jhipster_dependencies_version}" |
||||
|
} |
||||
|
} |
||||
|
appengineStage.dependsOn thinResolve |
||||
|
} |
||||
|
|
||||
|
if (project.hasProperty("zipkin")) { |
||||
|
apply from: "gradle/zipkin.gradle" |
||||
|
} |
||||
|
|
||||
|
idea { |
||||
|
module { |
||||
|
excludeDirs += files("node_modules") |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
eclipse { |
||||
|
sourceSets { |
||||
|
main { |
||||
|
java { |
||||
|
srcDirs += ["build/generated/sources/annotationProcessor/java/main"] |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
defaultTasks "bootRun" |
||||
|
|
||||
|
springBoot { |
||||
|
mainClassName = "com.cm.skills.SkillsApp" |
||||
|
} |
||||
|
|
||||
|
test { |
||||
|
useJUnitPlatform() |
||||
|
exclude "**/*IT*", "**/*IntTest*" |
||||
|
|
||||
|
testLogging { |
||||
|
events 'FAILED', 'SKIPPED' |
||||
|
} |
||||
|
// uncomment if the tests reports are not generated |
||||
|
// see https://github.com/jhipster/generator-jhipster/pull/2771 and https://github.com/jhipster/generator-jhipster/pull/4484 |
||||
|
// ignoreFailures true |
||||
|
reports.html.enabled = false |
||||
|
} |
||||
|
|
||||
|
task integrationTest(type: Test) { |
||||
|
useJUnitPlatform() |
||||
|
description = "Execute integration tests." |
||||
|
group = "verification" |
||||
|
include "**/*IT*", "**/*IntTest*" |
||||
|
|
||||
|
testLogging { |
||||
|
events 'FAILED', 'SKIPPED' |
||||
|
} |
||||
|
|
||||
|
if (project.hasProperty('testcontainers')) { |
||||
|
environment 'spring.profiles.active', 'testcontainers' |
||||
|
} |
||||
|
|
||||
|
// uncomment if the tests reports are not generated |
||||
|
// see https://github.com/jhipster/generator-jhipster/pull/2771 and https://github.com/jhipster/generator-jhipster/pull/4484 |
||||
|
// ignoreFailures true |
||||
|
reports.html.enabled = false |
||||
|
} |
||||
|
|
||||
|
check.dependsOn integrationTest |
||||
|
task testReport(type: TestReport) { |
||||
|
destinationDir = file("$buildDir/reports/tests") |
||||
|
reportOn test |
||||
|
} |
||||
|
|
||||
|
task integrationTestReport(type: TestReport) { |
||||
|
destinationDir = file("$buildDir/reports/tests") |
||||
|
reportOn integrationTest |
||||
|
} |
||||
|
|
||||
|
if (!project.hasProperty("runList")) { |
||||
|
project.ext.runList = "main" |
||||
|
} |
||||
|
|
||||
|
project.ext.diffChangelogFile = "src/main/resources/config/liquibase/changelog/" + new Date().format("yyyyMMddHHmmss") + "_changelog.xml" |
||||
|
|
||||
|
liquibase { |
||||
|
activities { |
||||
|
main { |
||||
|
driver "" |
||||
|
url "jdbc:sqlserver://localhost:1433;database=skills" |
||||
|
username "SA" |
||||
|
password "yourStrong(!)Password" |
||||
|
changeLogFile "src/main/resources/config/liquibase/master.xml" |
||||
|
defaultSchemaName "" |
||||
|
logLevel "debug" |
||||
|
classpath "src/main/resources/" |
||||
|
} |
||||
|
diffLog { |
||||
|
driver "" |
||||
|
url "jdbc:sqlserver://localhost:1433;database=skills" |
||||
|
username "SA" |
||||
|
password "yourStrong(!)Password" |
||||
|
changeLogFile project.ext.diffChangelogFile |
||||
|
referenceUrl "hibernate:spring:com.cm.skills.domain?dialect=org.hibernate.dialect.SQLServer2012Dialect&hibernate.physical_naming_strategy=org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy&hibernate.implicit_naming_strategy=org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy" |
||||
|
defaultSchemaName "" |
||||
|
logLevel "debug" |
||||
|
classpath "$buildDir/classes/java/main" |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
runList = project.ext.runList |
||||
|
} |
||||
|
|
||||
|
gitProperties { |
||||
|
failOnNoGitDirectory = false |
||||
|
keys = ["git.branch", "git.commit.id.abbrev", "git.commit.id.describe"] |
||||
|
} |
||||
|
|
||||
|
checkstyle { |
||||
|
toolVersion '${checkstyle_version}' |
||||
|
configFile file("checkstyle.xml") |
||||
|
checkstyleTest.enabled = false |
||||
|
} |
||||
|
nohttp { |
||||
|
source.include "build.gradle", "README.md" |
||||
|
} |
||||
|
|
||||
|
configurations { |
||||
|
providedRuntime |
||||
|
implementation.exclude module: "spring-boot-starter-tomcat" |
||||
|
all { |
||||
|
resolutionStrategy { |
||||
|
// Inherited version from Spring Boot can't be used because of regressions: |
||||
|
// To be removed as soon as spring-boot use the same version |
||||
|
force 'org.liquibase:liquibase-core:3.9.0' |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
repositories { |
||||
|
mavenLocal() |
||||
|
mavenCentral() |
||||
|
jcenter() |
||||
|
//jhipster-needle-gradle-repositories - JHipster will add additional repositories |
||||
|
} |
||||
|
|
||||
|
dependencies { |
||||
|
// import JHipster dependencies BOM |
||||
|
if (!project.hasProperty("gae")) { |
||||
|
implementation platform("io.github.jhipster:jhipster-dependencies:${jhipster_dependencies_version}") |
||||
|
} |
||||
|
|
||||
|
// Use ", version: jhipster_dependencies_version, changing: true" if you want |
||||
|
// to use a SNAPSHOT release instead of a stable release |
||||
|
implementation group: "io.github.jhipster", name: "jhipster-framework" |
||||
|
implementation "javax.annotation:javax.annotation-api" |
||||
|
implementation "io.dropwizard.metrics:metrics-core" |
||||
|
implementation "io.micrometer:micrometer-registry-prometheus" |
||||
|
implementation "net.logstash.logback:logstash-logback-encoder" |
||||
|
implementation "com.fasterxml.jackson.datatype:jackson-datatype-hppc" |
||||
|
implementation "com.fasterxml.jackson.datatype:jackson-datatype-jsr310" |
||||
|
implementation "com.fasterxml.jackson.module:jackson-module-jaxb-annotations" |
||||
|
implementation "com.fasterxml.jackson.datatype:jackson-datatype-hibernate5" |
||||
|
implementation "com.fasterxml.jackson.core:jackson-annotations" |
||||
|
implementation "com.fasterxml.jackson.core:jackson-databind" |
||||
|
implementation "org.hibernate:hibernate-core" |
||||
|
implementation "com.zaxxer:HikariCP" |
||||
|
implementation "javax.transaction:javax.transaction-api" |
||||
|
implementation "org.hibernate:hibernate-entitymanager" |
||||
|
implementation "org.hibernate.validator:hibernate-validator" |
||||
|
implementation "org.liquibase:liquibase-core" |
||||
|
liquibaseRuntime "org.liquibase:liquibase-core" |
||||
|
liquibaseRuntime "org.liquibase.ext:liquibase-hibernate5:${liquibase_hibernate5_version}" |
||||
|
liquibaseRuntime sourceSets.main.compileClasspath |
||||
|
implementation "org.springframework.boot:spring-boot-loader-tools" |
||||
|
implementation "org.springframework.boot:spring-boot-starter-mail" |
||||
|
implementation "org.springframework.boot:spring-boot-starter-logging" |
||||
|
implementation "org.springframework.boot:spring-boot-starter-actuator" |
||||
|
implementation "org.springframework.boot:spring-boot-starter-aop" |
||||
|
implementation "org.springframework.boot:spring-boot-starter-data-jpa" |
||||
|
testImplementation "org.testcontainers:mssqlserver" |
||||
|
implementation "org.springframework.boot:spring-boot-starter-security" |
||||
|
implementation ("org.springframework.boot:spring-boot-starter-web") { |
||||
|
exclude module: "spring-boot-starter-tomcat" |
||||
|
} |
||||
|
implementation "org.springframework.boot:spring-boot-starter-undertow" |
||||
|
implementation "org.springframework.boot:spring-boot-starter-thymeleaf" |
||||
|
implementation "org.zalando:problem-spring-web" |
||||
|
implementation "org.springframework.cloud:spring-cloud-starter" |
||||
|
implementation "org.springframework.cloud:spring-cloud-starter-netflix-ribbon" |
||||
|
implementation "org.springframework.cloud:spring-cloud-starter-netflix-hystrix" |
||||
|
implementation "org.springframework.retry:spring-retry" |
||||
|
implementation "org.springframework.cloud:spring-cloud-starter-netflix-eureka-client" |
||||
|
implementation "org.springframework.cloud:spring-cloud-starter-config" |
||||
|
implementation "org.springframework.cloud:spring-cloud-starter-openfeign" |
||||
|
implementation "org.springframework.boot:spring-boot-starter-cloud-connectors" |
||||
|
implementation "org.springframework.security:spring-security-config" |
||||
|
implementation "org.springframework.security:spring-security-data" |
||||
|
implementation "org.springframework.security:spring-security-web" |
||||
|
implementation "io.jsonwebtoken:jjwt-api" |
||||
|
if (!project.hasProperty("gae")) { |
||||
|
runtimeOnly "io.jsonwebtoken:jjwt-impl" |
||||
|
runtimeOnly "io.jsonwebtoken:jjwt-jackson" |
||||
|
} else { |
||||
|
implementation "io.jsonwebtoken:jjwt-impl" |
||||
|
implementation "io.jsonwebtoken:jjwt-jackson" |
||||
|
} |
||||
|
implementation ("io.springfox:springfox-swagger2") { |
||||
|
exclude module: "mapstruct" |
||||
|
} |
||||
|
implementation "io.springfox:springfox-bean-validators" |
||||
|
implementation "com.microsoft.sqlserver:mssql-jdbc" |
||||
|
implementation "com.github.sabomichal:liquibase-mssql" |
||||
|
liquibaseRuntime "com.microsoft.sqlserver:mssql-jdbc" |
||||
|
liquibaseRuntime "com.github.sabomichal:liquibase-mssql" |
||||
|
implementation "org.mapstruct:mapstruct:${mapstruct_version}" |
||||
|
annotationProcessor "org.mapstruct:mapstruct-processor:${mapstruct_version}" |
||||
|
annotationProcessor "org.hibernate:hibernate-jpamodelgen:${hibernate_version}" |
||||
|
annotationProcessor "org.glassfish.jaxb:jaxb-runtime:${jaxb_runtime_version}" |
||||
|
annotationProcessor "org.springframework.boot:spring-boot-configuration-processor:${spring_boot_version}" |
||||
|
testImplementation ("org.springframework.boot:spring-boot-starter-test") { |
||||
|
exclude group: "org.junit.vintage", module: "junit-vintage-engine" |
||||
|
} |
||||
|
testImplementation "org.springframework.security:spring-security-test" |
||||
|
testImplementation "org.springframework.boot:spring-boot-test" |
||||
|
testImplementation "com.tngtech.archunit:archunit-junit5-api:${archunit_junit5_version}" |
||||
|
testRuntimeOnly "com.tngtech.archunit:archunit-junit5-engine:${archunit_junit5_version}" |
||||
|
testImplementation "com.h2database:h2" |
||||
|
//jhipster-needle-gradle-dependency - JHipster will add additional dependencies here |
||||
|
} |
||||
|
|
||||
|
if (project.hasProperty("gae")) { |
||||
|
task createPom { |
||||
|
def basePath = 'build/resources/main/META-INF/maven' |
||||
|
doLast { |
||||
|
pom { |
||||
|
withXml(dependencyManagement.pomConfigurer) |
||||
|
}.writeTo("${basePath}/${project.group}/${project.name}/pom.xml") |
||||
|
} |
||||
|
} |
||||
|
bootJar.dependsOn = [createPom] |
||||
|
} |
||||
|
|
||||
|
task cleanResources(type: Delete) { |
||||
|
delete "build/resources" |
||||
|
} |
||||
|
|
||||
|
wrapper { |
||||
|
gradleVersion = "6.5" |
||||
|
} |
||||
|
|
||||
|
compileJava.dependsOn processResources |
||||
|
processResources.dependsOn bootBuildInfo |
@ -0,0 +1,19 @@ |
|||||
|
<?xml version="1.0"?> |
||||
|
<!DOCTYPE module PUBLIC "-//Puppy Crawl//DTD Check Configuration 1.3//EN" |
||||
|
"https://www.puppycrawl.com/dtds/configuration_1_3.dtd"> |
||||
|
<module name="Checker"> |
||||
|
|
||||
|
<!-- Configure checker to use UTF-8 encoding --> |
||||
|
<property name="charset" value="UTF-8"/> |
||||
|
<!-- Configure checker to run on files with these extensions --> |
||||
|
<property name="fileExtensions" value=""/> |
||||
|
<!-- For detailed checkstyle configuration, see https://github.com/spring-io/nohttp/tree/master/nohttp-checkstyle --> |
||||
|
<module name="io.spring.nohttp.checkstyle.check.NoHttpCheck"> |
||||
|
</module> |
||||
|
<!-- Allow suppression with comments |
||||
|
// CHECKSTYLE:OFF |
||||
|
... ignored content ... |
||||
|
// CHECKSTYLE:ON |
||||
|
--> |
||||
|
<module name="SuppressWithPlainTextCommentFilter"/> |
||||
|
</module> |
@ -0,0 +1,65 @@ |
|||||
|
rootProject.name=skills |
||||
|
profile=dev |
||||
|
|
||||
|
# Build properties |
||||
|
node_version=12.16.1 |
||||
|
npm_version=6.14.5 |
||||
|
yarn_version=1.22.4 |
||||
|
|
||||
|
# Dependency versions |
||||
|
jhipster_dependencies_version=3.9.1 |
||||
|
# The spring-boot version should match the one managed by |
||||
|
# https://mvnrepository.com/artifact/io.github.jhipster/jhipster-dependencies/${jhipster_dependencies_version} |
||||
|
spring_boot_version=2.2.7.RELEASE |
||||
|
# The hibernate version should match the one managed by |
||||
|
# https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-dependencies/${spring-boot.version} --> |
||||
|
hibernate_version=5.4.15.Final |
||||
|
mapstruct_version=1.3.1.Final |
||||
|
archunit_junit5_version=0.14.1 |
||||
|
liquibase_hibernate5_version=3.8 |
||||
|
liquibaseTaskPrefix=liquibase |
||||
|
|
||||
|
|
||||
|
jaxb_runtime_version=2.3.3 |
||||
|
|
||||
|
# gradle plugin version |
||||
|
jib_plugin_version=2.4.0 |
||||
|
git_properties_plugin_version=2.2.2 |
||||
|
apt_plugin_version=0.21 |
||||
|
liquibase_plugin_version=2.0.3 |
||||
|
sonarqube_plugin_version=2.8 |
||||
|
spring_no_http_plugin_version=0.0.4.RELEASE |
||||
|
checkstyle_version=8.32 |
||||
|
|
||||
|
# jhipster-needle-gradle-property - JHipster will add additional properties here |
||||
|
|
||||
|
## below are some of the gradle performance improvement settings that can be used as required, these are not enabled by default |
||||
|
|
||||
|
## The Gradle daemon aims to improve the startup and execution time of Gradle. |
||||
|
## The daemon is enabled by default in Gradle 3+ setting this to false will disable this. |
||||
|
## TODO: disable daemon on CI, since builds should be clean and reliable on servers |
||||
|
## https://docs.gradle.org/current/userguide/gradle_daemon.html#sec:ways_to_disable_gradle_daemon |
||||
|
## uncomment the below line to disable the daemon |
||||
|
|
||||
|
#org.gradle.daemon=false |
||||
|
|
||||
|
## Specifies the JVM arguments used for the daemon process. |
||||
|
## The setting is particularly useful for tweaking memory settings. |
||||
|
## Default value: -Xmx1024m -XX:MaxPermSize=256m |
||||
|
## uncomment the below line to override the daemon defaults |
||||
|
|
||||
|
#org.gradle.jvmargs=-Xmx1024m -XX:MaxPermSize=256m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 |
||||
|
|
||||
|
## When configured, Gradle will run in incubating parallel mode. |
||||
|
## This option should only be used with decoupled projects. More details, visit |
||||
|
## http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects |
||||
|
## uncomment the below line to enable parallel mode |
||||
|
|
||||
|
#org.gradle.parallel=true |
||||
|
|
||||
|
## Enables new incubating mode that makes Gradle selective when configuring projects. |
||||
|
## Only relevant projects are configured which results in faster builds for large multi-projects. |
||||
|
## http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:configuration_on_demand |
||||
|
## uncomment the below line to enable the selective mode |
||||
|
|
||||
|
#org.gradle.configureondemand=true |
@ -0,0 +1,22 @@ |
|||||
|
jib { |
||||
|
from { |
||||
|
image = "adoptopenjdk:11-jre-hotspot" |
||||
|
} |
||||
|
to { |
||||
|
image = "skills:latest" |
||||
|
} |
||||
|
container { |
||||
|
entrypoint = ["bash", "-c", "/entrypoint.sh"] |
||||
|
ports = ["3006"] |
||||
|
environment = [ |
||||
|
SPRING_OUTPUT_ANSI_ENABLED: "ALWAYS", |
||||
|
JHIPSTER_SLEEP: "0" |
||||
|
] |
||||
|
creationTime = "USE_CURRENT_TIMESTAMP" |
||||
|
} |
||||
|
extraDirectories { |
||||
|
paths = file("src/main/jib") |
||||
|
permissions = ["/entrypoint.sh": "755"] |
||||
|
} |
||||
|
} |
||||
|
|
@ -0,0 +1,47 @@ |
|||||
|
configurations { |
||||
|
developmentOnly |
||||
|
runtimeClasspath { |
||||
|
extendsFrom developmentOnly |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
dependencies { |
||||
|
developmentOnly "org.springframework.boot:spring-boot-devtools" |
||||
|
} |
||||
|
|
||||
|
def profiles = "dev" |
||||
|
if (project.hasProperty("no-liquibase")) { |
||||
|
profiles += ",no-liquibase" |
||||
|
} |
||||
|
if (project.hasProperty("tls")) { |
||||
|
profiles += ",tls" |
||||
|
} |
||||
|
|
||||
|
springBoot { |
||||
|
buildInfo { |
||||
|
properties { |
||||
|
time = null |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
bootRun { |
||||
|
args = [] |
||||
|
} |
||||
|
|
||||
|
|
||||
|
processResources { |
||||
|
inputs.property('version', version) |
||||
|
inputs.property('springProfiles', profiles) |
||||
|
filesMatching("**/application.yml") { |
||||
|
filter { |
||||
|
it.replace("#project.version#", version) |
||||
|
} |
||||
|
} |
||||
|
filesMatching("**/bootstrap.yml") { |
||||
|
filter { |
||||
|
it.replace("#spring.profiles.active#", profiles) |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
@ -0,0 +1,37 @@ |
|||||
|
dependencies { |
||||
|
testImplementation "com.h2database:h2" |
||||
|
} |
||||
|
|
||||
|
def profiles = "prod" |
||||
|
if (project.hasProperty("no-liquibase")) { |
||||
|
profiles += ",no-liquibase" |
||||
|
} |
||||
|
|
||||
|
if (project.hasProperty("swagger")) { |
||||
|
profiles += ",swagger" |
||||
|
} |
||||
|
|
||||
|
springBoot { |
||||
|
buildInfo() |
||||
|
} |
||||
|
|
||||
|
bootRun { |
||||
|
args = [] |
||||
|
} |
||||
|
|
||||
|
|
||||
|
processResources { |
||||
|
inputs.property('version', version) |
||||
|
inputs.property('springProfiles', profiles) |
||||
|
filesMatching("**/application.yml") { |
||||
|
filter { |
||||
|
it.replace("#project.version#", version) |
||||
|
} |
||||
|
} |
||||
|
filesMatching("**/bootstrap.yml") { |
||||
|
filter { |
||||
|
it.replace("#spring.profiles.active#", profiles) |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
@ -0,0 +1,26 @@ |
|||||
|
jacoco { |
||||
|
toolVersion = "0.8.5" |
||||
|
} |
||||
|
|
||||
|
jacocoTestReport { |
||||
|
executionData tasks.withType(Test) |
||||
|
classDirectories.from = files(sourceSets.main.output.classesDirs) |
||||
|
sourceDirectories.from = files(sourceSets.main.java.srcDirs) |
||||
|
|
||||
|
reports { |
||||
|
xml.enabled = true |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
file("sonar-project.properties").withReader { |
||||
|
Properties sonarProperties = new Properties() |
||||
|
sonarProperties.load(it) |
||||
|
|
||||
|
sonarProperties.each { key, value -> |
||||
|
sonarqube { |
||||
|
properties { |
||||
|
property key, value |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
@ -0,0 +1,13 @@ |
|||||
|
apply plugin: "war" |
||||
|
|
||||
|
bootWar { |
||||
|
mainClassName = "com.cm.skills.SkillsApp" |
||||
|
includes = ["WEB-INF/**", "META-INF/**"] |
||||
|
} |
||||
|
|
||||
|
war { |
||||
|
enabled = true |
||||
|
archiveExtension = "war.original" |
||||
|
includes = ["WEB-INF/**", "META-INF/**"] |
||||
|
|
||||
|
} |
@ -0,0 +1,5 @@ |
|||||
|
distributionBase=GRADLE_USER_HOME |
||||
|
distributionPath=wrapper/dists |
||||
|
distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-bin.zip |
||||
|
zipStoreBase=GRADLE_USER_HOME |
||||
|
zipStorePath=wrapper/dists |
@ -0,0 +1,3 @@ |
|||||
|
dependencies { |
||||
|
implementation "org.springframework.cloud:spring-cloud-starter-zipkin" |
||||
|
} |
@ -0,0 +1,188 @@ |
|||||
|
#!/usr/bin/env sh |
||||
|
|
||||
|
# |
||||
|
# Copyright 2015 the original author or authors. |
||||
|
# |
||||
|
# Licensed under the Apache License, Version 2.0 (the "License"); |
||||
|
# you may not use this file except in compliance with the License. |
||||
|
# You may obtain a copy of the License at |
||||
|
# |
||||
|
# https://www.apache.org/licenses/LICENSE-2.0 |
||||
|
# |
||||
|
# Unless required by applicable law or agreed to in writing, software |
||||
|
# distributed under the License is distributed on an "AS IS" BASIS, |
||||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
|
# See the License for the specific language governing permissions and |
||||
|
# limitations under the License. |
||||
|
# |
||||
|
|
||||
|
############################################################################## |
||||
|
## |
||||
|
## Gradle start up script for UN*X |
||||
|
## |
||||
|
############################################################################## |
||||
|
|
||||
|
# Attempt to set APP_HOME |
||||
|
# Resolve links: $0 may be a link |
||||
|
PRG="$0" |
||||
|
# Need this for relative symlinks. |
||||
|
while [ -h "$PRG" ] ; do |
||||
|
ls=`ls -ld "$PRG"` |
||||
|
link=`expr "$ls" : '.*-> \(.*\)$'` |
||||
|
if expr "$link" : '/.*' > /dev/null; then |
||||
|
PRG="$link" |
||||
|
else |
||||
|
PRG=`dirname "$PRG"`"/$link" |
||||
|
fi |
||||
|
done |
||||
|
SAVED="`pwd`" |
||||
|
cd "`dirname \"$PRG\"`/" >/dev/null |
||||
|
APP_HOME="`pwd -P`" |
||||
|
cd "$SAVED" >/dev/null |
||||
|
|
||||
|
APP_NAME="Gradle" |
||||
|
APP_BASE_NAME=`basename "$0"` |
||||
|
|
||||
|
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. |
||||
|
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' |
||||
|
|
||||
|
# Use the maximum available, or set MAX_FD != -1 to use that value. |
||||
|
MAX_FD="maximum" |
||||
|
|
||||
|
warn () { |
||||
|
echo "$*" |
||||
|
} |
||||
|
|
||||
|
die () { |
||||
|
echo |
||||
|
echo "$*" |
||||
|
echo |
||||
|
exit 1 |
||||
|
} |
||||
|
|
||||
|
# OS specific support (must be 'true' or 'false'). |
||||
|
cygwin=false |
||||
|
msys=false |
||||
|
darwin=false |
||||
|
nonstop=false |
||||
|
case "`uname`" in |
||||
|
CYGWIN* ) |
||||
|
cygwin=true |
||||
|
;; |
||||
|
Darwin* ) |
||||
|
darwin=true |
||||
|
;; |
||||
|
MINGW* ) |
||||
|
msys=true |
||||
|
;; |
||||
|
NONSTOP* ) |
||||
|
nonstop=true |
||||
|
;; |
||||
|
esac |
||||
|
|
||||
|
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar |
||||
|
|
||||
|
# Determine the Java command to use to start the JVM. |
||||
|
if [ -n "$JAVA_HOME" ] ; then |
||||
|
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then |
||||
|
# IBM's JDK on AIX uses strange locations for the executables |
||||
|
JAVACMD="$JAVA_HOME/jre/sh/java" |
||||
|
else |
||||
|
JAVACMD="$JAVA_HOME/bin/java" |
||||
|
fi |
||||
|
if [ ! -x "$JAVACMD" ] ; then |
||||
|
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME |
||||
|
|
||||
|
Please set the JAVA_HOME variable in your environment to match the |
||||
|
location of your Java installation." |
||||
|
fi |
||||
|
else |
||||
|
JAVACMD="java" |
||||
|
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. |
||||
|
|
||||
|
Please set the JAVA_HOME variable in your environment to match the |
||||
|
location of your Java installation." |
||||
|
fi |
||||
|
|
||||
|
# Increase the maximum file descriptors if we can. |
||||
|
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then |
||||
|
MAX_FD_LIMIT=`ulimit -H -n` |
||||
|
if [ $? -eq 0 ] ; then |
||||
|
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then |
||||
|
MAX_FD="$MAX_FD_LIMIT" |
||||
|
fi |
||||
|
ulimit -n $MAX_FD |
||||
|
if [ $? -ne 0 ] ; then |
||||
|
warn "Could not set maximum file descriptor limit: $MAX_FD" |
||||
|
fi |
||||
|
else |
||||
|
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" |
||||
|
fi |
||||
|
fi |
||||
|
|
||||
|
# For Darwin, add options to specify how the application appears in the dock |
||||
|
if $darwin; then |
||||
|
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" |
||||
|
fi |
||||
|
|
||||
|
# For Cygwin or MSYS, switch paths to Windows format before running java |
||||
|
if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then |
||||
|
APP_HOME=`cygpath --path --mixed "$APP_HOME"` |
||||
|
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` |
||||
|
JAVACMD=`cygpath --unix "$JAVACMD"` |
||||
|
|
||||
|
# We build the pattern for arguments to be converted via cygpath |
||||
|
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` |
||||
|
SEP="" |
||||
|
for dir in $ROOTDIRSRAW ; do |
||||
|
ROOTDIRS="$ROOTDIRS$SEP$dir" |
||||
|
SEP="|" |
||||
|
done |
||||
|
OURCYGPATTERN="(^($ROOTDIRS))" |
||||
|
# Add a user-defined pattern to the cygpath arguments |
||||
|
if [ "$GRADLE_CYGPATTERN" != "" ] ; then |
||||
|
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" |
||||
|
fi |
||||
|
# Now convert the arguments - kludge to limit ourselves to /bin/sh |
||||
|
i=0 |
||||
|
for arg in "$@" ; do |
||||
|
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` |
||||
|
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option |
||||
|
|
||||
|
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition |
||||
|
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` |
||||
|
else |
||||
|
eval `echo args$i`="\"$arg\"" |
||||
|
fi |
||||
|
i=$((i+1)) |
||||
|
done |
||||
|
case $i in |
||||
|
(0) set -- ;; |
||||
|
(1) set -- "$args0" ;; |
||||
|
(2) set -- "$args0" "$args1" ;; |
||||
|
(3) set -- "$args0" "$args1" "$args2" ;; |
||||
|
(4) set -- "$args0" "$args1" "$args2" "$args3" ;; |
||||
|
(5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; |
||||
|
(6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; |
||||
|
(7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; |
||||
|
(8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; |
||||
|
(9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; |
||||
|
esac |
||||
|
fi |
||||
|
|
||||
|
# Escape application args |
||||
|
save () { |
||||
|
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done |
||||
|
echo " " |
||||
|
} |
||||
|
APP_ARGS=$(save "$@") |
||||
|
|
||||
|
# Collect all arguments for the java command, following the shell quoting and substitution rules |
||||
|
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" |
||||
|
|
||||
|
# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong |
||||
|
if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then |
||||
|
cd "$(dirname "$0")" |
||||
|
fi |
||||
|
|
||||
|
exec "$JAVACMD" "$@" |
@ -0,0 +1,100 @@ |
|||||
|
@rem |
||||
|
@rem Copyright 2015 the original author or authors. |
||||
|
@rem |
||||
|
@rem Licensed under the Apache License, Version 2.0 (the "License"); |
||||
|
@rem you may not use this file except in compliance with the License. |
||||
|
@rem You may obtain a copy of the License at |
||||
|
@rem |
||||
|
@rem https://www.apache.org/licenses/LICENSE-2.0 |
||||
|
@rem |
||||
|
@rem Unless required by applicable law or agreed to in writing, software |
||||
|
@rem distributed under the License is distributed on an "AS IS" BASIS, |
||||
|
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
|
@rem See the License for the specific language governing permissions and |
||||
|
@rem limitations under the License. |
||||
|
@rem |
||||
|
|
||||
|
@if "%DEBUG%" == "" @echo off |
||||
|
@rem ########################################################################## |
||||
|
@rem |
||||
|
@rem Gradle startup script for Windows |
||||
|
@rem |
||||
|
@rem ########################################################################## |
||||
|
|
||||
|
@rem Set local scope for the variables with windows NT shell |
||||
|
if "%OS%"=="Windows_NT" setlocal |
||||
|
|
||||
|
set DIRNAME=%~dp0 |
||||
|
if "%DIRNAME%" == "" set DIRNAME=. |
||||
|
set APP_BASE_NAME=%~n0 |
||||
|
set APP_HOME=%DIRNAME% |
||||
|
|
||||
|
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. |
||||
|
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" |
||||
|
|
||||
|
@rem Find java.exe |
||||
|
if defined JAVA_HOME goto findJavaFromJavaHome |
||||
|
|
||||
|
set JAVA_EXE=java.exe |
||||
|
%JAVA_EXE% -version >NUL 2>&1 |
||||
|
if "%ERRORLEVEL%" == "0" goto init |
||||
|
|
||||
|
echo. |
||||
|
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. |
||||
|
echo. |
||||
|
echo Please set the JAVA_HOME variable in your environment to match the |
||||
|
echo location of your Java installation. |
||||
|
|
||||
|
goto fail |
||||
|
|
||||
|
:findJavaFromJavaHome |
||||
|
set JAVA_HOME=%JAVA_HOME:"=% |
||||
|
set JAVA_EXE=%JAVA_HOME%/bin/java.exe |
||||
|
|
||||
|
if exist "%JAVA_EXE%" goto init |
||||
|
|
||||
|
echo. |
||||
|
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% |
||||
|
echo. |
||||
|
echo Please set the JAVA_HOME variable in your environment to match the |
||||
|
echo location of your Java installation. |
||||
|
|
||||
|
goto fail |
||||
|
|
||||
|
:init |
||||
|
@rem Get command-line arguments, handling Windows variants |
||||
|
|
||||
|
if not "%OS%" == "Windows_NT" goto win9xME_args |
||||
|
|
||||
|
:win9xME_args |
||||
|
@rem Slurp the command line arguments. |
||||
|
set CMD_LINE_ARGS= |
||||
|
set _SKIP=2 |
||||
|
|
||||
|
:win9xME_args_slurp |
||||
|
if "x%~1" == "x" goto execute |
||||
|
|
||||
|
set CMD_LINE_ARGS=%* |
||||
|
|
||||
|
:execute |
||||
|
@rem Setup the command line |
||||
|
|
||||
|
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar |
||||
|
|
||||
|
@rem Execute Gradle |
||||
|
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% |
||||
|
|
||||
|
:end |
||||
|
@rem End local scope for the variables with windows NT shell |
||||
|
if "%ERRORLEVEL%"=="0" goto mainEnd |
||||
|
|
||||
|
:fail |
||||
|
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of |
||||
|
rem the _cmd.exe /c_ return code! |
||||
|
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 |
||||
|
exit /b 1 |
||||
|
|
||||
|
:mainEnd |
||||
|
if "%OS%"=="Windows_NT" endlocal |
||||
|
|
||||
|
:omega |
16205
package-lock.json
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1,23 @@ |
|||||
|
{ |
||||
|
"name": "skills", |
||||
|
"version": "0.0.0", |
||||
|
"description": "Description for skills", |
||||
|
"private": true, |
||||
|
"license": "UNLICENSED", |
||||
|
"cacheDirectories": [ |
||||
|
"node_modules" |
||||
|
], |
||||
|
"devDependencies": { |
||||
|
"@openapitools/openapi-generator-cli": "1.0.13-4.3.1", |
||||
|
"generator-jhipster": "6.10.5", |
||||
|
"husky": "4.2.5", |
||||
|
"lint-staged": "8.2.1", |
||||
|
"prettier": "2.1.2" |
||||
|
}, |
||||
|
"engines": { |
||||
|
"node": ">=12.16.1" |
||||
|
}, |
||||
|
"scripts": { |
||||
|
"prettier:format": "prettier --write \"{,src/**/}*.{md,json,yml}\"" |
||||
|
} |
||||
|
} |
@ -0,0 +1,16 @@ |
|||||
|
|
||||
|
pluginManagement { |
||||
|
plugins { |
||||
|
id 'org.springframework.boot' version "${spring_boot_version}" |
||||
|
id 'com.google.cloud.tools.jib' version "${jib_plugin_version}" |
||||
|
id 'com.gorylenko.gradle-git-properties' version "${git_properties_plugin_version}" |
||||
|
id 'org.liquibase.gradle' version "${liquibase_plugin_version}" |
||||
|
id 'org.sonarqube' version "${sonarqube_plugin_version}" |
||||
|
id 'net.ltgt.apt-eclipse' version "${apt_plugin_version}" |
||||
|
id 'net.ltgt.apt-idea' version "${apt_plugin_version}" |
||||
|
id 'net.ltgt.apt' version "${apt_plugin_version}" |
||||
|
id "io.spring.nohttp" version "${spring_no_http_plugin_version}" |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
rootProject.name = "skills" |
@ -0,0 +1,28 @@ |
|||||
|
sonar.projectKey=skills |
||||
|
sonar.projectName=skills generated by jhipster |
||||
|
sonar.projectVersion=1.0 |
||||
|
|
||||
|
sonar.sources=src/main/ |
||||
|
sonar.host.url=http://localhost:9001 |
||||
|
|
||||
|
sonar.tests=src/test/ |
||||
|
sonar.coverage.jacoco.xmlReportPaths=build/reports/jacoco/test/jacocoTestReport.xml |
||||
|
sonar.java.codeCoveragePlugin=jacoco |
||||
|
sonar.junit.reportPaths=build/test-results/test,build/test-results/integrationTest |
||||
|
|
||||
|
sonar.sourceEncoding=UTF-8 |
||||
|
sonar.exclusions=src/main/webapp/content/**/*.*, src/main/webapp/i18n/*.js, build/resources/main/static/**/*.* |
||||
|
|
||||
|
sonar.issue.ignore.multicriteria=S3437,S4502,S4684,UndocumentedApi |
||||
|
# Rule https://sonarcloud.io/coding_rules?open=squid%3AS3437&rule_key=squid%3AS3437 is ignored, as a JPA-managed field cannot be transient |
||||
|
sonar.issue.ignore.multicriteria.S3437.resourceKey=src/main/java/**/* |
||||
|
sonar.issue.ignore.multicriteria.S3437.ruleKey=squid:S3437 |
||||
|
# Rule https://sonarcloud.io/coding_rules?open=squid%3AUndocumentedApi&rule_key=squid%3AUndocumentedApi is ignored, as we want to follow "clean code" guidelines and classes, methods and arguments names should be self-explanatory |
||||
|
sonar.issue.ignore.multicriteria.UndocumentedApi.resourceKey=src/main/java/**/* |
||||
|
sonar.issue.ignore.multicriteria.UndocumentedApi.ruleKey=squid:UndocumentedApi |
||||
|
# Rule https://sonarcloud.io/coding_rules?open=squid%3AS4502&rule_key=squid%3AS4502 is ignored, as for JWT tokens we are not subject to CSRF attack |
||||
|
sonar.issue.ignore.multicriteria.S4502.resourceKey=src/main/java/**/* |
||||
|
sonar.issue.ignore.multicriteria.S4502.ruleKey=squid:S4502 |
||||
|
# Rule https://sonarcloud.io/coding_rules?open=java%3AS4684&rule_key=java%3AS4684 |
||||
|
sonar.issue.ignore.multicriteria.S4684.resourceKey=src/main/java/**/* |
||||
|
sonar.issue.ignore.multicriteria.S4684.ruleKey=java:S4684 |
@ -0,0 +1,23 @@ |
|||||
|
version: '2' |
||||
|
services: |
||||
|
skills-app: |
||||
|
image: skills |
||||
|
environment: |
||||
|
- _JAVA_OPTIONS=-Xmx512m -Xms256m |
||||
|
- SPRING_PROFILES_ACTIVE=prod,swagger |
||||
|
- MANAGEMENT_METRICS_EXPORT_PROMETHEUS_ENABLED=true |
||||
|
- EUREKA_CLIENT_SERVICE_URL_DEFAULTZONE=http://admin:$${jhipster.registry.password}@jhipster-registry:8761/eureka |
||||
|
- SPRING_CLOUD_CONFIG_URI=http://admin:$${jhipster.registry.password}@jhipster-registry:8761/config |
||||
|
- SPRING_DATASOURCE_URL=jdbc:sqlserver://skills-mssql:1433;database=skills |
||||
|
- JHIPSTER_SLEEP=30 # gives time for other services to boot before the application |
||||
|
skills-mssql: |
||||
|
extends: |
||||
|
file: mssql.yml |
||||
|
service: skills-mssql |
||||
|
jhipster-registry: |
||||
|
extends: |
||||
|
file: jhipster-registry.yml |
||||
|
service: jhipster-registry |
||||
|
environment: |
||||
|
- SPRING_CLOUD_CONFIG_SERVER_COMPOSITE_0_TYPE=native |
||||
|
- SPRING_CLOUD_CONFIG_SERVER_COMPOSITE_0_SEARCH_LOCATIONS=file:./central-config/docker-config/ |
@ -0,0 +1,8 @@ |
|||||
|
# Central configuration sources details |
||||
|
|
||||
|
The JHipster-Registry will use the following directories as its configuration source : |
||||
|
|
||||
|
- localhost-config : when running the registry in docker with the jhipster-registry.yml docker-compose file |
||||
|
- docker-config : when running the registry and the app both in docker with the app.yml docker-compose file |
||||
|
|
||||
|
For more info, refer to https://www.jhipster.tech/jhipster-registry/#spring-cloud-config |
@ -0,0 +1,15 @@ |
|||||
|
# Common configuration shared between all applications |
||||
|
configserver: |
||||
|
name: Docker JHipster Registry |
||||
|
status: Connected to the JHipster Registry running in Docker |
||||
|
|
||||
|
jhipster: |
||||
|
security: |
||||
|
authentication: |
||||
|
jwt: |
||||
|
secret: my-secret-key-which-should-be-changed-in-production-and-be-base64-encoded |
||||
|
|
||||
|
eureka: |
||||
|
client: |
||||
|
service-url: |
||||
|
defaultZone: http://admin:${jhipster.registry.password}@jhipster-registry:8761/eureka/ |
@ -0,0 +1,15 @@ |
|||||
|
# Common configuration shared between all applications |
||||
|
configserver: |
||||
|
name: Docker JHipster Registry |
||||
|
status: Connected to the JHipster Registry running in Docker |
||||
|
|
||||
|
jhipster: |
||||
|
security: |
||||
|
authentication: |
||||
|
jwt: |
||||
|
secret: my-secret-key-which-should-be-changed-in-production-and-be-base64-encoded |
||||
|
|
||||
|
eureka: |
||||
|
client: |
||||
|
service-url: |
||||
|
defaultZone: http://admin:${jhipster.registry.password}@localhost:8761/eureka/ |
3778
src/main/docker/grafana/provisioning/dashboards/JVM.json
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1,11 @@ |
|||||
|
apiVersion: 1 |
||||
|
|
||||
|
providers: |
||||
|
- name: 'Prometheus' |
||||
|
orgId: 1 |
||||
|
folder: '' |
||||
|
type: file |
||||
|
disableDeletion: false |
||||
|
editable: true |
||||
|
options: |
||||
|
path: /etc/grafana/provisioning/dashboards |
@ -0,0 +1,50 @@ |
|||||
|
apiVersion: 1 |
||||
|
|
||||
|
# list of datasources that should be deleted from the database |
||||
|
deleteDatasources: |
||||
|
- name: Prometheus |
||||
|
orgId: 1 |
||||
|
|
||||
|
# list of datasources to insert/update depending |
||||
|
# whats available in the database |
||||
|
datasources: |
||||
|
# <string, required> name of the datasource. Required |
||||
|
- name: Prometheus |
||||
|
# <string, required> datasource type. Required |
||||
|
type: prometheus |
||||
|
# <string, required> access mode. direct or proxy. Required |
||||
|
access: proxy |
||||
|
# <int> org id. will default to orgId 1 if not specified |
||||
|
orgId: 1 |
||||
|
# <string> url |
||||
|
# On MacOS, replace localhost by host.docker.internal |
||||
|
url: http://localhost:9090 |
||||
|
# <string> database password, if used |
||||
|
password: |
||||
|
# <string> database user, if used |
||||
|
user: |
||||
|
# <string> database name, if used |
||||
|
database: |
||||
|
# <bool> enable/disable basic auth |
||||
|
basicAuth: false |
||||
|
# <string> basic auth username |
||||
|
basicAuthUser: admin |
||||
|
# <string> basic auth password |
||||
|
basicAuthPassword: admin |
||||
|
# <bool> enable/disable with credentials headers |
||||
|
withCredentials: |
||||
|
# <bool> mark as default datasource. Max one per org |
||||
|
isDefault: true |
||||
|
# <map> fields that will be converted to json and stored in json_data |
||||
|
jsonData: |
||||
|
graphiteVersion: '1.1' |
||||
|
tlsAuth: false |
||||
|
tlsAuthWithCACert: false |
||||
|
# <string> json object of data that will be encrypted. |
||||
|
secureJsonData: |
||||
|
tlsCACert: '...' |
||||
|
tlsClientCert: '...' |
||||
|
tlsClientKey: '...' |
||||
|
version: 1 |
||||
|
# <bool> allow users to edit datasources from the UI. |
||||
|
editable: true |
@ -0,0 +1,22 @@ |
|||||
|
version: '2' |
||||
|
services: |
||||
|
jhipster-registry: |
||||
|
image: jhipster/jhipster-registry:v6.3.0 |
||||
|
volumes: |
||||
|
- ./central-server-config:/central-config |
||||
|
# When run with the "dev" Spring profile, the JHipster Registry will |
||||
|
# read the config from the local filesystem (central-server-config directory) |
||||
|
# When run with the "prod" Spring profile, it will read the configuration from a Git repository |
||||
|
# See https://www.jhipster.tech/jhipster-registry/#spring-cloud-config |
||||
|
environment: |
||||
|
- _JAVA_OPTIONS=-Xmx512m -Xms256m |
||||
|
- SPRING_PROFILES_ACTIVE=dev,swagger |
||||
|
- SPRING_SECURITY_USER_PASSWORD=admin |
||||
|
- JHIPSTER_REGISTRY_PASSWORD=admin |
||||
|
- SPRING_CLOUD_CONFIG_SERVER_COMPOSITE_0_TYPE=native |
||||
|
- SPRING_CLOUD_CONFIG_SERVER_COMPOSITE_0_SEARCH_LOCATIONS=file:./central-config/localhost-config/ |
||||
|
# - SPRING_CLOUD_CONFIG_SERVER_COMPOSITE_0_TYPE=git |
||||
|
# - SPRING_CLOUD_CONFIG_SERVER_COMPOSITE_0_URI=https://github.com/jhipster/jhipster-registry/ |
||||
|
# - SPRING_CLOUD_CONFIG_SERVER_COMPOSITE_0_SEARCH_PATHS=central-config |
||||
|
ports: |
||||
|
- 8761:8761 |
@ -0,0 +1,26 @@ |
|||||
|
version: '2' |
||||
|
services: |
||||
|
skills-prometheus: |
||||
|
image: prom/prometheus:v2.18.1 |
||||
|
volumes: |
||||
|
- ./prometheus/:/etc/prometheus/ |
||||
|
command: |
||||
|
- '--config.file=/etc/prometheus/prometheus.yml' |
||||
|
ports: |
||||
|
- 9090:9090 |
||||
|
# On MacOS, remove next line and replace localhost by host.docker.internal in prometheus/prometheus.yml and |
||||
|
# grafana/provisioning/datasources/datasource.yml |
||||
|
network_mode: 'host' # to test locally running service |
||||
|
skills-grafana: |
||||
|
image: grafana/grafana:7.0.1 |
||||
|
volumes: |
||||
|
- ./grafana/provisioning/:/etc/grafana/provisioning/ |
||||
|
environment: |
||||
|
- GF_SECURITY_ADMIN_PASSWORD=admin |
||||
|
- GF_USERS_ALLOW_SIGN_UP=false |
||||
|
- GF_INSTALL_PLUGINS=grafana-piechart-panel |
||||
|
ports: |
||||
|
- 3000:3000 |
||||
|
# On MacOS, remove next line and replace localhost by host.docker.internal in prometheus/prometheus.yml and |
||||
|
# grafana/provisioning/datasources/datasource.yml |
||||
|
network_mode: 'host' # to test locally running service |
@ -0,0 +1,16 @@ |
|||||
|
version: '2' |
||||
|
services: |
||||
|
skills-mssql: |
||||
|
image: mcr.microsoft.com/mssql/server:2017-latest-ubuntu |
||||
|
# volumes are not supported on macOS |
||||
|
# volumes: |
||||
|
# - ~/volumes/jhipster/tempdb/mssql/:/var/opt/mssql/data/ |
||||
|
environment: |
||||
|
- ACCEPT_EULA=Y |
||||
|
- MSSQL_PID=Express |
||||
|
- SA_PASSWORD=yourStrong(!)Password |
||||
|
- MSSQL_DATABASE=skills |
||||
|
- MSSQL_SLEEP=60 |
||||
|
ports: |
||||
|
- 1433:1433 |
||||
|
command: /bin/bash -c '/opt/mssql/bin/sqlservr & echo "wait $$MSSQL_SLEEP sec for DB to start "; sleep $$MSSQL_SLEEP; /opt/mssql-tools/bin/sqlcmd -U sa -P $$SA_PASSWORD -d tempdb -q "EXIT(CREATE DATABASE $$MSSQL_DATABASE)"; wait;' |
@ -0,0 +1,31 @@ |
|||||
|
# Sample global config for monitoring JHipster applications |
||||
|
global: |
||||
|
scrape_interval: 15s # By default, scrape targets every 15 seconds. |
||||
|
evaluation_interval: 15s # By default, scrape targets every 15 seconds. |
||||
|
# scrape_timeout is set to the global default (10s). |
||||
|
|
||||
|
# Attach these labels to any time series or alerts when communicating with |
||||
|
# external systems (federation, remote storage, Alertmanager). |
||||
|
external_labels: |
||||
|
monitor: 'jhipster' |
||||
|
|
||||
|
# A scrape configuration containing exactly one endpoint to scrape: |
||||
|
# Here it's Prometheus itself. |
||||
|
scrape_configs: |
||||
|
# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config. |
||||
|
- job_name: 'prometheus' |
||||
|
|
||||
|
# Override the global default and scrape targets from this job every 5 seconds. |
||||
|
scrape_interval: 5s |
||||
|
|
||||
|
# scheme defaults to 'http' enable https in case your application is server via https |
||||
|
#scheme: https |
||||
|
# basic auth is not needed by default. See https://www.jhipster.tech/monitoring/#configuring-metrics-forwarding for details |
||||
|
#basic_auth: |
||||
|
# username: admin |
||||
|
# password: admin |
||||
|
metrics_path: /management/prometheus |
||||
|
static_configs: |
||||
|
- targets: |
||||
|
# On MacOS, replace localhost by host.docker.internal |
||||
|
- localhost:3006 |
@ -0,0 +1,7 @@ |
|||||
|
version: '2' |
||||
|
services: |
||||
|
skills-sonar: |
||||
|
image: sonarqube:8.3.1-community |
||||
|
ports: |
||||
|
- 9001:9000 |
||||
|
- 9092:9092 |
@ -0,0 +1,20 @@ |
|||||
|
package com.cm.skills; |
||||
|
|
||||
|
import io.github.jhipster.config.DefaultProfileUtil; |
||||
|
|
||||
|
import org.springframework.boot.builder.SpringApplicationBuilder; |
||||
|
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; |
||||
|
|
||||
|
/** |
||||
|
* This is a helper Java class that provides an alternative to creating a {@code web.xml}. |
||||
|
* This will be invoked only when the application is deployed to a Servlet container like Tomcat, JBoss etc. |
||||
|
*/ |
||||
|
public class ApplicationWebXml extends SpringBootServletInitializer { |
||||
|
|
||||
|
@Override |
||||
|
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { |
||||
|
// set a default to use when no profile is configured. |
||||
|
DefaultProfileUtil.addDefaultProfile(application.application()); |
||||
|
return application.sources(SkillsApp.class); |
||||
|
} |
||||
|
} |
@ -0,0 +1,105 @@ |
|||||
|
package com.cm.skills; |
||||
|
|
||||
|
import com.cm.skills.config.ApplicationProperties; |
||||
|
|
||||
|
import io.github.jhipster.config.DefaultProfileUtil; |
||||
|
import io.github.jhipster.config.JHipsterConstants; |
||||
|
|
||||
|
import org.apache.commons.lang3.StringUtils; |
||||
|
import org.slf4j.Logger; |
||||
|
import org.slf4j.LoggerFactory; |
||||
|
import org.springframework.boot.SpringApplication; |
||||
|
import org.springframework.boot.autoconfigure.SpringBootApplication; |
||||
|
import org.springframework.boot.autoconfigure.liquibase.LiquibaseProperties; |
||||
|
import org.springframework.boot.context.properties.EnableConfigurationProperties; |
||||
|
import org.springframework.core.env.Environment; |
||||
|
|
||||
|
import javax.annotation.PostConstruct; |
||||
|
import java.net.InetAddress; |
||||
|
import java.net.UnknownHostException; |
||||
|
import java.util.Arrays; |
||||
|
import java.util.Collection; |
||||
|
|
||||
|
@SpringBootApplication |
||||
|
@EnableConfigurationProperties({LiquibaseProperties.class, ApplicationProperties.class}) |
||||
|
public class SkillsApp { |
||||
|
|
||||
|
private static final Logger log = LoggerFactory.getLogger(SkillsApp.class); |
||||
|
|
||||
|
private final Environment env; |
||||
|
|
||||
|
public SkillsApp(Environment env) { |
||||
|
this.env = env; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Initializes skills. |
||||
|
* <p> |
||||
|
* Spring profiles can be configured with a program argument --spring.profiles.active=your-active-profile |
||||
|
* <p> |
||||
|
* You can find more information on how profiles work with JHipster on <a href="https://www.jhipster.tech/profiles/">https://www.jhipster.tech/profiles/</a>. |
||||
|
*/ |
||||
|
@PostConstruct |
||||
|
public void initApplication() { |
||||
|
Collection<String> activeProfiles = Arrays.asList(env.getActiveProfiles()); |
||||
|
if (activeProfiles.contains(JHipsterConstants.SPRING_PROFILE_DEVELOPMENT) && activeProfiles.contains(JHipsterConstants.SPRING_PROFILE_PRODUCTION)) { |
||||
|
log.error("You have misconfigured your application! It should not run " + |
||||
|
"with both the 'dev' and 'prod' profiles at the same time."); |
||||
|
} |
||||
|
if (activeProfiles.contains(JHipsterConstants.SPRING_PROFILE_DEVELOPMENT) && activeProfiles.contains(JHipsterConstants.SPRING_PROFILE_CLOUD)) { |
||||
|
log.error("You have misconfigured your application! It should not " + |
||||
|
"run with both the 'dev' and 'cloud' profiles at the same time."); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Main method, used to run the application. |
||||
|
* |
||||
|
* @param args the command line arguments. |
||||
|
*/ |
||||
|
public static void main(String[] args) { |
||||
|
SpringApplication app = new SpringApplication(SkillsApp.class); |
||||
|
DefaultProfileUtil.addDefaultProfile(app); |
||||
|
Environment env = app.run(args).getEnvironment(); |
||||
|
logApplicationStartup(env); |
||||
|
} |
||||
|
|
||||
|
private static void logApplicationStartup(Environment env) { |
||||
|
String protocol = "http"; |
||||
|
if (env.getProperty("server.ssl.key-store") != null) { |
||||
|
protocol = "https"; |
||||
|
} |
||||
|
String serverPort = env.getProperty("server.port"); |
||||
|
String contextPath = env.getProperty("server.servlet.context-path"); |
||||
|
if (StringUtils.isBlank(contextPath)) { |
||||
|
contextPath = "/"; |
||||
|
} |
||||
|
String hostAddress = "localhost"; |
||||
|
try { |
||||
|
hostAddress = InetAddress.getLocalHost().getHostAddress(); |
||||
|
} catch (UnknownHostException e) { |
||||
|
log.warn("The host name could not be determined, using `localhost` as fallback"); |
||||
|
} |
||||
|
log.info("\n----------------------------------------------------------\n\t" + |
||||
|
"Application '{}' is running! Access URLs:\n\t" + |
||||
|
"Local: \t\t{}://localhost:{}{}\n\t" + |
||||
|
"External: \t{}://{}:{}{}\n\t" + |
||||
|
"Profile(s): \t{}\n----------------------------------------------------------", |
||||
|
env.getProperty("spring.application.name"), |
||||
|
protocol, |
||||
|
serverPort, |
||||
|
contextPath, |
||||
|
protocol, |
||||
|
hostAddress, |
||||
|
serverPort, |
||||
|
contextPath, |
||||
|
env.getActiveProfiles()); |
||||
|
|
||||
|
String configServerStatus = env.getProperty("configserver.status"); |
||||
|
if (configServerStatus == null) { |
||||
|
configServerStatus = "Not found or not setup for this application"; |
||||
|
} |
||||
|
log.info("\n----------------------------------------------------------\n\t" + |
||||
|
"Config Server: \t{}\n----------------------------------------------------------", configServerStatus); |
||||
|
} |
||||
|
} |
@ -0,0 +1,113 @@ |
|||||
|
package com.cm.skills.aop.logging; |
||||
|
|
||||
|
import io.github.jhipster.config.JHipsterConstants; |
||||
|
|
||||
|
import org.aspectj.lang.JoinPoint; |
||||
|
import org.aspectj.lang.ProceedingJoinPoint; |
||||
|
import org.aspectj.lang.annotation.AfterThrowing; |
||||
|
import org.aspectj.lang.annotation.Around; |
||||
|
import org.aspectj.lang.annotation.Aspect; |
||||
|
import org.aspectj.lang.annotation.Pointcut; |
||||
|
import org.slf4j.Logger; |
||||
|
import org.slf4j.LoggerFactory; |
||||
|
import org.springframework.core.env.Environment; |
||||
|
import org.springframework.core.env.Profiles; |
||||
|
|
||||
|
import java.util.Arrays; |
||||
|
|
||||
|
/** |
||||
|
* Aspect for logging execution of service and repository Spring components. |
||||
|
* |
||||
|
* By default, it only runs with the "dev" profile. |
||||
|
*/ |
||||
|
@Aspect |
||||
|
public class LoggingAspect { |
||||
|
|
||||
|
private final Environment env; |
||||
|
|
||||
|
public LoggingAspect(Environment env) { |
||||
|
this.env = env; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Pointcut that matches all repositories, services and Web REST endpoints. |
||||
|
*/ |
||||
|
@Pointcut("within(@org.springframework.stereotype.Repository *)" + |
||||
|
" || within(@org.springframework.stereotype.Service *)" + |
||||
|
" || within(@org.springframework.web.bind.annotation.RestController *)") |
||||
|
public void springBeanPointcut() { |
||||
|
// Method is empty as this is just a Pointcut, the implementations are in the advices. |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Pointcut that matches all Spring beans in the application's main packages. |
||||
|
*/ |
||||
|
@Pointcut("within(com.cm.skills.repository..*)"+ |
||||
|
" || within(com.cm.skills.service..*)"+ |
||||
|
" || within(com.cm.skills.web.rest..*)") |
||||
|
public void applicationPackagePointcut() { |
||||
|
// Method is empty as this is just a Pointcut, the implementations are in the advices. |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Retrieves the {@link Logger} associated to the given {@link JoinPoint}. |
||||
|
* |
||||
|
* @param joinPoint join point we want the logger for. |
||||
|
* @return {@link Logger} associated to the given {@link JoinPoint}. |
||||
|
*/ |
||||
|
private Logger logger(JoinPoint joinPoint) { |
||||
|
return LoggerFactory.getLogger(joinPoint.getSignature().getDeclaringTypeName()); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Advice that logs methods throwing exceptions. |
||||
|
* |
||||
|
* @param joinPoint join point for advice. |
||||
|
* @param e exception. |
||||
|
*/ |
||||
|
@AfterThrowing(pointcut = "applicationPackagePointcut() && springBeanPointcut()", throwing = "e") |
||||
|
public void logAfterThrowing(JoinPoint joinPoint, Throwable e) { |
||||
|
if (env.acceptsProfiles(Profiles.of(JHipsterConstants.SPRING_PROFILE_DEVELOPMENT))) { |
||||
|
logger(joinPoint) |
||||
|
.error( |
||||
|
"Exception in {}() with cause = \'{}\' and exception = \'{}\'", |
||||
|
joinPoint.getSignature().getName(), |
||||
|
e.getCause() != null ? e.getCause() : "NULL", |
||||
|
e.getMessage(), |
||||
|
e |
||||
|
); |
||||
|
} else { |
||||
|
logger(joinPoint) |
||||
|
.error( |
||||
|
"Exception in {}() with cause = {}", |
||||
|
joinPoint.getSignature().getName(), |
||||
|
e.getCause() != null ? e.getCause() : "NULL" |
||||
|
); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Advice that logs when a method is entered and exited. |
||||
|
* |
||||
|
* @param joinPoint join point for advice. |
||||
|
* @return result. |
||||
|
* @throws Throwable throws {@link IllegalArgumentException}. |
||||
|
*/ |
||||
|
@Around("applicationPackagePointcut() && springBeanPointcut()") |
||||
|
public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable { |
||||
|
Logger log = logger(joinPoint); |
||||
|
if (log.isDebugEnabled()) { |
||||
|
log.debug("Enter: {}() with argument[s] = {}", joinPoint.getSignature().getName(), Arrays.toString(joinPoint.getArgs())); |
||||
|
} |
||||
|
try { |
||||
|
Object result = joinPoint.proceed(); |
||||
|
if (log.isDebugEnabled()) { |
||||
|
log.debug("Exit: {}() with result = {}", joinPoint.getSignature().getName(), result); |
||||
|
} |
||||
|
return result; |
||||
|
} catch (IllegalArgumentException e) { |
||||
|
log.error("Illegal argument: {} in {}()", Arrays.toString(joinPoint.getArgs()), joinPoint.getSignature().getName()); |
||||
|
throw e; |
||||
|
} |
||||
|
} |
||||
|
} |
@ -0,0 +1,18 @@ |
|||||
|
package com.cm.skills.client; |
||||
|
|
||||
|
import com.cm.skills.security.SecurityUtils; |
||||
|
import feign.RequestInterceptor; |
||||
|
import feign.RequestTemplate; |
||||
|
import org.springframework.stereotype.Component; |
||||
|
|
||||
|
@Component |
||||
|
public class UserFeignClientInterceptor implements RequestInterceptor { |
||||
|
private static final String AUTHORIZATION_HEADER = "Authorization"; |
||||
|
private static final String BEARER = "Bearer"; |
||||
|
|
||||
|
@Override |
||||
|
public void apply(RequestTemplate template) { |
||||
|
SecurityUtils.getCurrentUserJWT() |
||||
|
.ifPresent(s -> template.header(AUTHORIZATION_HEADER,String.format("%s %s", BEARER, s))); |
||||
|
} |
||||
|
} |
@ -0,0 +1,13 @@ |
|||||
|
package com.cm.skills.config; |
||||
|
|
||||
|
import org.springframework.boot.context.properties.ConfigurationProperties; |
||||
|
|
||||
|
/** |
||||
|
* Properties specific to Skills. |
||||
|
* <p> |
||||
|
* Properties are configured in the {@code application.yml} file. |
||||
|
* See {@link io.github.jhipster.config.JHipsterProperties} for a good example. |
||||
|
*/ |
||||
|
@ConfigurationProperties(prefix = "application", ignoreUnknownFields = false) |
||||
|
public class ApplicationProperties { |
||||
|
} |
@ -0,0 +1,47 @@ |
|||||
|
package com.cm.skills.config; |
||||
|
|
||||
|
import io.github.jhipster.async.ExceptionHandlingAsyncTaskExecutor; |
||||
|
import org.slf4j.Logger; |
||||
|
import org.slf4j.LoggerFactory; |
||||
|
import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler; |
||||
|
import org.springframework.aop.interceptor.SimpleAsyncUncaughtExceptionHandler; |
||||
|
import org.springframework.boot.autoconfigure.task.TaskExecutionProperties; |
||||
|
import org.springframework.context.annotation.Bean; |
||||
|
import org.springframework.context.annotation.Configuration; |
||||
|
import org.springframework.scheduling.annotation.AsyncConfigurer; |
||||
|
import org.springframework.scheduling.annotation.EnableAsync; |
||||
|
import org.springframework.scheduling.annotation.EnableScheduling; |
||||
|
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; |
||||
|
|
||||
|
import java.util.concurrent.Executor; |
||||
|
|
||||
|
@Configuration |
||||
|
@EnableAsync |
||||
|
@EnableScheduling |
||||
|
public class AsyncConfiguration implements AsyncConfigurer { |
||||
|
|
||||
|
private final Logger log = LoggerFactory.getLogger(AsyncConfiguration.class); |
||||
|
|
||||
|
private final TaskExecutionProperties taskExecutionProperties; |
||||
|
|
||||
|
public AsyncConfiguration(TaskExecutionProperties taskExecutionProperties) { |
||||
|
this.taskExecutionProperties = taskExecutionProperties; |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
@Bean(name = "taskExecutor") |
||||
|
public Executor getAsyncExecutor() { |
||||
|
log.debug("Creating Async Task Executor"); |
||||
|
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); |
||||
|
executor.setCorePoolSize(taskExecutionProperties.getPool().getCoreSize()); |
||||
|
executor.setMaxPoolSize(taskExecutionProperties.getPool().getMaxSize()); |
||||
|
executor.setQueueCapacity(taskExecutionProperties.getPool().getQueueCapacity()); |
||||
|
executor.setThreadNamePrefix(taskExecutionProperties.getThreadNamePrefix()); |
||||
|
return new ExceptionHandlingAsyncTaskExecutor(executor); |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() { |
||||
|
return new SimpleAsyncUncaughtExceptionHandler(); |
||||
|
} |
||||
|
} |
@ -0,0 +1,28 @@ |
|||||
|
package com.cm.skills.config; |
||||
|
|
||||
|
import io.github.jhipster.config.JHipsterConstants; |
||||
|
|
||||
|
import org.slf4j.Logger; |
||||
|
import org.slf4j.LoggerFactory; |
||||
|
import org.springframework.cloud.config.java.AbstractCloudConfig; |
||||
|
import org.springframework.context.annotation.*; |
||||
|
|
||||
|
import javax.sql.DataSource; |
||||
|
import org.springframework.boot.context.properties.ConfigurationProperties; |
||||
|
|
||||
|
|
||||
|
@Configuration |
||||
|
@Profile(JHipsterConstants.SPRING_PROFILE_CLOUD) |
||||
|
public class CloudDatabaseConfiguration extends AbstractCloudConfig { |
||||
|
|
||||
|
private final Logger log = LoggerFactory.getLogger(CloudDatabaseConfiguration.class); |
||||
|
|
||||
|
private static final String CLOUD_CONFIGURATION_HIKARI_PREFIX = "spring.datasource.hikari"; |
||||
|
|
||||
|
@Bean |
||||
|
@ConfigurationProperties(CLOUD_CONFIGURATION_HIKARI_PREFIX) |
||||
|
public DataSource dataSource() { |
||||
|
log.info("Configuring JDBC datasource from a cloud provider"); |
||||
|
return connectionFactory().dataSource(); |
||||
|
} |
||||
|
} |
@ -0,0 +1,12 @@ |
|||||
|
package com.cm.skills.config; |
||||
|
|
||||
|
/** |
||||
|
* Application constants. |
||||
|
*/ |
||||
|
public final class Constants { |
||||
|
|
||||
|
public static final String SYSTEM_ACCOUNT = "system"; |
||||
|
|
||||
|
private Constants() { |
||||
|
} |
||||
|
} |
@ -0,0 +1,21 @@ |
|||||
|
package com.cm.skills.config; |
||||
|
|
||||
|
import io.github.jhipster.config.JHipsterConstants; |
||||
|
import org.slf4j.Logger; |
||||
|
import org.slf4j.LoggerFactory; |
||||
|
import org.springframework.context.annotation.Bean; |
||||
|
import org.springframework.context.annotation.Configuration; |
||||
|
|
||||
|
import org.springframework.data.jpa.repository.config.EnableJpaAuditing; |
||||
|
import org.springframework.data.jpa.repository.config.EnableJpaRepositories; |
||||
|
import org.springframework.transaction.annotation.EnableTransactionManagement; |
||||
|
|
||||
|
|
||||
|
@Configuration |
||||
|
@EnableJpaRepositories("com.cm.skills.repository") |
||||
|
@EnableJpaAuditing(auditorAwareRef = "springSecurityAuditorAware") |
||||
|
@EnableTransactionManagement |
||||
|
public class DatabaseConfiguration { |
||||
|
|
||||
|
private final Logger log = LoggerFactory.getLogger(DatabaseConfiguration.class); |
||||
|
} |
@ -0,0 +1,20 @@ |
|||||
|
package com.cm.skills.config; |
||||
|
|
||||
|
import org.springframework.context.annotation.Configuration; |
||||
|
import org.springframework.format.FormatterRegistry; |
||||
|
import org.springframework.format.datetime.standard.DateTimeFormatterRegistrar; |
||||
|
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; |
||||
|
|
||||
|
/** |
||||
|
* Configure the converters to use the ISO format for dates by default. |
||||
|
*/ |
||||
|
@Configuration |
||||
|
public class DateTimeFormatConfiguration implements WebMvcConfigurer { |
||||
|
|
||||
|
@Override |
||||
|
public void addFormatters(FormatterRegistry registry) { |
||||
|
DateTimeFormatterRegistrar registrar = new DateTimeFormatterRegistrar(); |
||||
|
registrar.setUseIsoFormat(true); |
||||
|
registrar.registerFormatters(registry); |
||||
|
} |
||||
|
} |
@ -0,0 +1,22 @@ |
|||||
|
package com.cm.skills.config; |
||||
|
|
||||
|
import org.springframework.cloud.openfeign.EnableFeignClients; |
||||
|
import org.springframework.cloud.openfeign.FeignClientsConfiguration; |
||||
|
import org.springframework.context.annotation.Bean; |
||||
|
import org.springframework.context.annotation.Configuration; |
||||
|
import org.springframework.context.annotation.Import; |
||||
|
|
||||
|
@Configuration |
||||
|
@EnableFeignClients(basePackages = "com.cm.skills") |
||||
|
@Import(FeignClientsConfiguration.class) |
||||
|
public class FeignConfiguration { |
||||
|
|
||||
|
/** |
||||
|
* Set the Feign specific log level to log client REST requests. |
||||
|
*/ |
||||
|
@Bean |
||||
|
feign.Logger.Level feignLoggerLevel() { |
||||
|
return feign.Logger.Level.BASIC; |
||||
|
} |
||||
|
|
||||
|
} |
@ -0,0 +1,52 @@ |
|||||
|
package com.cm.skills.config; |
||||
|
|
||||
|
import com.fasterxml.jackson.datatype.hibernate5.Hibernate5Module; |
||||
|
import com.fasterxml.jackson.datatype.jdk8.Jdk8Module; |
||||
|
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; |
||||
|
|
||||
|
import org.springframework.context.annotation.Bean; |
||||
|
import org.springframework.context.annotation.Configuration; |
||||
|
import org.zalando.problem.ProblemModule; |
||||
|
import org.zalando.problem.violations.ConstraintViolationProblemModule; |
||||
|
|
||||
|
@Configuration |
||||
|
public class JacksonConfiguration { |
||||
|
|
||||
|
/** |
||||
|
* Support for Java date and time API. |
||||
|
* @return the corresponding Jackson module. |
||||
|
*/ |
||||
|
@Bean |
||||
|
public JavaTimeModule javaTimeModule() { |
||||
|
return new JavaTimeModule(); |
||||
|
} |
||||
|
|
||||
|
@Bean |
||||
|
public Jdk8Module jdk8TimeModule() { |
||||
|
return new Jdk8Module(); |
||||
|
} |
||||
|
|
||||
|
/* |
||||
|
* Support for Hibernate types in Jackson. |
||||
|
*/ |
||||
|
@Bean |
||||
|
public Hibernate5Module hibernate5Module() { |
||||
|
return new Hibernate5Module(); |
||||
|
} |
||||
|
|
||||
|
/* |
||||
|
* Module for serialization/deserialization of RFC7807 Problem. |
||||
|
*/ |
||||
|
@Bean |
||||
|
public ProblemModule problemModule() { |
||||
|
return new ProblemModule(); |
||||
|
} |
||||
|
|
||||
|
/* |
||||
|
* Module for serialization/deserialization of ConstraintViolationProblem. |
||||
|
*/ |
||||
|
@Bean |
||||
|
public ConstraintViolationProblemModule constraintViolationProblemModule() { |
||||
|
return new ConstraintViolationProblemModule(); |
||||
|
} |
||||
|
} |
@ -0,0 +1,60 @@ |
|||||
|
package com.cm.skills.config; |
||||
|
|
||||
|
import io.github.jhipster.config.JHipsterConstants; |
||||
|
import io.github.jhipster.config.liquibase.SpringLiquibaseUtil; |
||||
|
import liquibase.integration.spring.SpringLiquibase; |
||||
|
import org.slf4j.Logger; |
||||
|
import org.slf4j.LoggerFactory; |
||||
|
import org.springframework.beans.factory.ObjectProvider; |
||||
|
import org.springframework.beans.factory.annotation.Qualifier; |
||||
|
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties; |
||||
|
import org.springframework.boot.autoconfigure.liquibase.LiquibaseDataSource; |
||||
|
import org.springframework.boot.autoconfigure.liquibase.LiquibaseProperties; |
||||
|
import org.springframework.context.annotation.Bean; |
||||
|
import org.springframework.context.annotation.Configuration; |
||||
|
import org.springframework.core.env.Environment; |
||||
|
import org.springframework.core.env.Profiles; |
||||
|
|
||||
|
import javax.sql.DataSource; |
||||
|
import java.util.concurrent.Executor; |
||||
|
|
||||
|
@Configuration |
||||
|
public class LiquibaseConfiguration { |
||||
|
|
||||
|
private final Logger log = LoggerFactory.getLogger(LiquibaseConfiguration.class); |
||||
|
|
||||
|
private final Environment env; |
||||
|
|
||||
|
public LiquibaseConfiguration(Environment env) { |
||||
|
this.env = env; |
||||
|
} |
||||
|
|
||||
|
@Bean |
||||
|
public SpringLiquibase liquibase(@Qualifier("taskExecutor") Executor executor, |
||||
|
@LiquibaseDataSource ObjectProvider<DataSource> liquibaseDataSource, LiquibaseProperties liquibaseProperties, |
||||
|
ObjectProvider<DataSource> dataSource, DataSourceProperties dataSourceProperties) { |
||||
|
|
||||
|
// If you don't want Liquibase to start asynchronously, substitute by this: |
||||
|
// SpringLiquibase liquibase = SpringLiquibaseUtil.createSpringLiquibase(liquibaseDataSource.getIfAvailable(), liquibaseProperties, dataSource.getIfUnique(), dataSourceProperties); |
||||
|
SpringLiquibase liquibase = SpringLiquibaseUtil.createAsyncSpringLiquibase(this.env, executor, liquibaseDataSource.getIfAvailable(), liquibaseProperties, dataSource.getIfUnique(), dataSourceProperties); |
||||
|
liquibase.setChangeLog("classpath:config/liquibase/master.xml"); |
||||
|
liquibase.setContexts(liquibaseProperties.getContexts()); |
||||
|
liquibase.setDefaultSchema(liquibaseProperties.getDefaultSchema()); |
||||
|
liquibase.setLiquibaseSchema(liquibaseProperties.getLiquibaseSchema()); |
||||
|
liquibase.setLiquibaseTablespace(liquibaseProperties.getLiquibaseTablespace()); |
||||
|
liquibase.setDatabaseChangeLogLockTable(liquibaseProperties.getDatabaseChangeLogLockTable()); |
||||
|
liquibase.setDatabaseChangeLogTable(liquibaseProperties.getDatabaseChangeLogTable()); |
||||
|
liquibase.setDropFirst(liquibaseProperties.isDropFirst()); |
||||
|
liquibase.setLabels(liquibaseProperties.getLabels()); |
||||
|
liquibase.setChangeLogParameters(liquibaseProperties.getParameters()); |
||||
|
liquibase.setRollbackFile(liquibaseProperties.getRollbackFile()); |
||||
|
liquibase.setTestRollbackOnUpdate(liquibaseProperties.isTestRollbackOnUpdate()); |
||||
|
if (env.acceptsProfiles(Profiles.of(JHipsterConstants.SPRING_PROFILE_NO_LIQUIBASE))) { |
||||
|
liquibase.setShouldRun(false); |
||||
|
} else { |
||||
|
liquibase.setShouldRun(liquibaseProperties.isEnabled()); |
||||
|
log.debug("Configuring Liquibase"); |
||||
|
} |
||||
|
return liquibase; |
||||
|
} |
||||
|
} |
@ -0,0 +1,27 @@ |
|||||
|
package com.cm.skills.config; |
||||
|
|
||||
|
import io.github.jhipster.config.locale.AngularCookieLocaleResolver; |
||||
|
|
||||
|
import org.springframework.context.annotation.Bean; |
||||
|
import org.springframework.context.annotation.Configuration; |
||||
|
import org.springframework.web.servlet.LocaleResolver; |
||||
|
import org.springframework.web.servlet.config.annotation.*; |
||||
|
import org.springframework.web.servlet.i18n.LocaleChangeInterceptor; |
||||
|
|
||||
|
@Configuration |
||||
|
public class LocaleConfiguration implements WebMvcConfigurer { |
||||
|
|
||||
|
@Bean |
||||
|
public LocaleResolver localeResolver() { |
||||
|
AngularCookieLocaleResolver cookieLocaleResolver = new AngularCookieLocaleResolver(); |
||||
|
cookieLocaleResolver.setCookieName("NG_TRANSLATE_LANG_KEY"); |
||||
|
return cookieLocaleResolver; |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public void addInterceptors(InterceptorRegistry registry) { |
||||
|
LocaleChangeInterceptor localeChangeInterceptor = new LocaleChangeInterceptor(); |
||||
|
localeChangeInterceptor.setParamName("language"); |
||||
|
registry.addInterceptor(localeChangeInterceptor); |
||||
|
} |
||||
|
} |
@ -0,0 +1,19 @@ |
|||||
|
package com.cm.skills.config; |
||||
|
|
||||
|
import com.cm.skills.aop.logging.LoggingAspect; |
||||
|
|
||||
|
import io.github.jhipster.config.JHipsterConstants; |
||||
|
|
||||
|
import org.springframework.context.annotation.*; |
||||
|
import org.springframework.core.env.Environment; |
||||
|
|
||||
|
@Configuration |
||||
|
@EnableAspectJAutoProxy |
||||
|
public class LoggingAspectConfiguration { |
||||
|
|
||||
|
@Bean |
||||
|
@Profile(JHipsterConstants.SPRING_PROFILE_DEVELOPMENT) |
||||
|
public LoggingAspect loggingAspect(Environment env) { |
||||
|
return new LoggingAspect(env); |
||||
|
} |
||||
|
} |
@ -0,0 +1,56 @@ |
|||||
|
package com.cm.skills.config; |
||||
|
|
||||
|
import ch.qos.logback.classic.LoggerContext; |
||||
|
import com.fasterxml.jackson.core.JsonProcessingException; |
||||
|
import com.fasterxml.jackson.databind.ObjectMapper; |
||||
|
import io.github.jhipster.config.JHipsterProperties; |
||||
|
import org.slf4j.LoggerFactory; |
||||
|
import org.springframework.beans.factory.ObjectProvider; |
||||
|
import org.springframework.beans.factory.annotation.Value; |
||||
|
import org.springframework.boot.info.BuildProperties; |
||||
|
import org.springframework.cloud.context.config.annotation.RefreshScope; |
||||
|
import org.springframework.context.annotation.Configuration; |
||||
|
|
||||
|
import java.util.HashMap; |
||||
|
import java.util.Map; |
||||
|
|
||||
|
import static io.github.jhipster.config.logging.LoggingUtils.*; |
||||
|
|
||||
|
/* |
||||
|
* Configures the console and Logstash log appenders from the app properties |
||||
|
*/ |
||||
|
@Configuration |
||||
|
@RefreshScope |
||||
|
public class LoggingConfiguration { |
||||
|
|
||||
|
public LoggingConfiguration(@Value("${spring.application.name}") String appName, |
||||
|
@Value("${server.port}") String serverPort, |
||||
|
JHipsterProperties jHipsterProperties, |
||||
|
ObjectProvider<BuildProperties> buildProperties, |
||||
|
ObjectMapper mapper) throws JsonProcessingException { |
||||
|
|
||||
|
LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory(); |
||||
|
|
||||
|
Map<String, String> map = new HashMap<>(); |
||||
|
map.put("app_name", appName); |
||||
|
map.put("app_port", serverPort); |
||||
|
buildProperties.ifAvailable(it -> map.put("version", it.getVersion())); |
||||
|
String customFields = mapper.writeValueAsString(map); |
||||
|
|
||||
|
JHipsterProperties.Logging loggingProperties = jHipsterProperties.getLogging(); |
||||
|
JHipsterProperties.Logging.Logstash logstashProperties = loggingProperties.getLogstash(); |
||||
|
|
||||
|
if (loggingProperties.isUseJsonFormat()) { |
||||
|
addJsonConsoleAppender(context, customFields); |
||||
|
} |
||||
|
if (logstashProperties.isEnabled()) { |
||||
|
addLogstashTcpSocketAppender(context, customFields, logstashProperties); |
||||
|
} |
||||
|
if (loggingProperties.isUseJsonFormat() || logstashProperties.isEnabled()) { |
||||
|
addContextListener(context, customFields, loggingProperties); |
||||
|
} |
||||
|
if (jHipsterProperties.getMetrics().getLogs().isEnabled()) { |
||||
|
setMetricsMarkerLogbackFilter(context, loggingProperties.isUseJsonFormat()); |
||||
|
} |
||||
|
} |
||||
|
} |
@ -0,0 +1,69 @@ |
|||||
|
package com.cm.skills.config; |
||||
|
|
||||
|
import com.cm.skills.security.*; |
||||
|
import com.cm.skills.security.jwt.*; |
||||
|
|
||||
|
import org.springframework.context.annotation.Bean; |
||||
|
import org.springframework.context.annotation.Import; |
||||
|
import org.springframework.http.HttpMethod; |
||||
|
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; |
||||
|
import org.springframework.security.config.annotation.web.builders.HttpSecurity; |
||||
|
import org.springframework.security.config.annotation.web.builders.WebSecurity; |
||||
|
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; |
||||
|
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; |
||||
|
import org.springframework.security.config.http.SessionCreationPolicy; |
||||
|
import org.springframework.security.web.header.writers.ReferrerPolicyHeaderWriter; |
||||
|
import org.zalando.problem.spring.web.advice.security.SecurityProblemSupport; |
||||
|
|
||||
|
@EnableWebSecurity |
||||
|
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true) |
||||
|
@Import(SecurityProblemSupport.class) |
||||
|
public class SecurityConfiguration extends WebSecurityConfigurerAdapter { |
||||
|
|
||||
|
private final TokenProvider tokenProvider; |
||||
|
private final SecurityProblemSupport problemSupport; |
||||
|
|
||||
|
public SecurityConfiguration(TokenProvider tokenProvider, SecurityProblemSupport problemSupport) { |
||||
|
this.tokenProvider = tokenProvider; |
||||
|
this.problemSupport = problemSupport; |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public void configure(HttpSecurity http) throws Exception { |
||||
|
// @formatter:off |
||||
|
http |
||||
|
.csrf() |
||||
|
.disable() |
||||
|
.exceptionHandling() |
||||
|
.authenticationEntryPoint(problemSupport) |
||||
|
.accessDeniedHandler(problemSupport) |
||||
|
.and() |
||||
|
.headers() |
||||
|
.contentSecurityPolicy("default-src 'self'; frame-src 'self' data:; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://storage.googleapis.com; style-src 'self' 'unsafe-inline'; img-src 'self' data:; font-src 'self' data:") |
||||
|
.and() |
||||
|
.referrerPolicy(ReferrerPolicyHeaderWriter.ReferrerPolicy.STRICT_ORIGIN_WHEN_CROSS_ORIGIN) |
||||
|
.and() |
||||
|
.featurePolicy("geolocation 'none'; midi 'none'; sync-xhr 'none'; microphone 'none'; camera 'none'; magnetometer 'none'; gyroscope 'none'; speaker 'none'; fullscreen 'self'; payment 'none'") |
||||
|
.and() |
||||
|
.frameOptions() |
||||
|
.deny() |
||||
|
.and() |
||||
|
.sessionManagement() |
||||
|
.sessionCreationPolicy(SessionCreationPolicy.STATELESS) |
||||
|
.and() |
||||
|
.authorizeRequests() |
||||
|
.antMatchers("/api/authenticate").permitAll() |
||||
|
.antMatchers("/api/**").authenticated() |
||||
|
.antMatchers("/management/health").permitAll() |
||||
|
.antMatchers("/management/info").permitAll() |
||||
|
.antMatchers("/management/prometheus").permitAll() |
||||
|
.antMatchers("/management/**").hasAuthority(AuthoritiesConstants.ADMIN) |
||||
|
.and() |
||||
|
.apply(securityConfigurerAdapter()); |
||||
|
// @formatter:on |
||||
|
} |
||||
|
|
||||
|
private JWTConfigurer securityConfigurerAdapter() { |
||||
|
return new JWTConfigurer(tokenProvider); |
||||
|
} |
||||
|
} |
@ -0,0 +1,58 @@ |
|||||
|
package com.cm.skills.config; |
||||
|
|
||||
|
import io.github.jhipster.config.JHipsterProperties; |
||||
|
import org.slf4j.Logger; |
||||
|
import org.slf4j.LoggerFactory; |
||||
|
import org.springframework.boot.web.server.*; |
||||
|
import org.springframework.boot.web.servlet.ServletContextInitializer; |
||||
|
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory; |
||||
|
import org.springframework.context.annotation.Bean; |
||||
|
import org.springframework.context.annotation.Configuration; |
||||
|
import org.springframework.core.env.Environment; |
||||
|
import org.springframework.core.env.Profiles; |
||||
|
import org.springframework.web.cors.CorsConfiguration; |
||||
|
import org.springframework.web.cors.UrlBasedCorsConfigurationSource; |
||||
|
import org.springframework.web.filter.CorsFilter; |
||||
|
|
||||
|
import javax.servlet.*; |
||||
|
|
||||
|
/** |
||||
|
* Configuration of web application with Servlet 3.0 APIs. |
||||
|
*/ |
||||
|
@Configuration |
||||
|
public class WebConfigurer implements ServletContextInitializer { |
||||
|
|
||||
|
private final Logger log = LoggerFactory.getLogger(WebConfigurer.class); |
||||
|
|
||||
|
private final Environment env; |
||||
|
|
||||
|
private final JHipsterProperties jHipsterProperties; |
||||
|
|
||||
|
public WebConfigurer(Environment env, JHipsterProperties jHipsterProperties) { |
||||
|
this.env = env; |
||||
|
this.jHipsterProperties = jHipsterProperties; |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public void onStartup(ServletContext servletContext) throws ServletException { |
||||
|
if (env.getActiveProfiles().length != 0) { |
||||
|
log.info("Web application configuration, using profiles: {}", (Object[]) env.getActiveProfiles()); |
||||
|
} |
||||
|
|
||||
|
log.info("Web application fully configured"); |
||||
|
} |
||||
|
|
||||
|
@Bean |
||||
|
public CorsFilter corsFilter() { |
||||
|
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); |
||||
|
CorsConfiguration config = jHipsterProperties.getCors(); |
||||
|
if (config.getAllowedOrigins() != null && !config.getAllowedOrigins().isEmpty()) { |
||||
|
log.debug("Registering CORS filter"); |
||||
|
source.registerCorsConfiguration("/api/**", config); |
||||
|
source.registerCorsConfiguration("/management/**", config); |
||||
|
source.registerCorsConfiguration("/v2/api-docs", config); |
||||
|
} |
||||
|
return new CorsFilter(source); |
||||
|
} |
||||
|
|
||||
|
} |
@ -0,0 +1,86 @@ |
|||||
|
package com.cm.skills.config.audit; |
||||
|
|
||||
|
import com.cm.skills.domain.PersistentAuditEvent; |
||||
|
|
||||
|
import org.springframework.boot.actuate.audit.AuditEvent; |
||||
|
import org.springframework.security.web.authentication.WebAuthenticationDetails; |
||||
|
import org.springframework.stereotype.Component; |
||||
|
|
||||
|
import java.util.*; |
||||
|
|
||||
|
@Component |
||||
|
public class AuditEventConverter { |
||||
|
|
||||
|
/** |
||||
|
* Convert a list of {@link PersistentAuditEvent}s to a list of {@link AuditEvent}s. |
||||
|
* |
||||
|
* @param persistentAuditEvents the list to convert. |
||||
|
* @return the converted list. |
||||
|
*/ |
||||
|
public List<AuditEvent> convertToAuditEvent(Iterable<PersistentAuditEvent> persistentAuditEvents) { |
||||
|
if (persistentAuditEvents == null) { |
||||
|
return Collections.emptyList(); |
||||
|
} |
||||
|
List<AuditEvent> auditEvents = new ArrayList<>(); |
||||
|
for (PersistentAuditEvent persistentAuditEvent : persistentAuditEvents) { |
||||
|
auditEvents.add(convertToAuditEvent(persistentAuditEvent)); |
||||
|
} |
||||
|
return auditEvents; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Convert a {@link PersistentAuditEvent} to an {@link AuditEvent}. |
||||
|
* |
||||
|
* @param persistentAuditEvent the event to convert. |
||||
|
* @return the converted list. |
||||
|
*/ |
||||
|
public AuditEvent convertToAuditEvent(PersistentAuditEvent persistentAuditEvent) { |
||||
|
if (persistentAuditEvent == null) { |
||||
|
return null; |
||||
|
} |
||||
|
return new AuditEvent(persistentAuditEvent.getAuditEventDate(), persistentAuditEvent.getPrincipal(), |
||||
|
persistentAuditEvent.getAuditEventType(), convertDataToObjects(persistentAuditEvent.getData())); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Internal conversion. This is needed to support the current SpringBoot actuator {@code AuditEventRepository} interface. |
||||
|
* |
||||
|
* @param data the data to convert. |
||||
|
* @return a map of {@link String}, {@link Object}. |
||||
|
*/ |
||||
|
public Map<String, Object> convertDataToObjects(Map<String, String> data) { |
||||
|
Map<String, Object> results = new HashMap<>(); |
||||
|
|
||||
|
if (data != null) { |
||||
|
for (Map.Entry<String, String> entry : data.entrySet()) { |
||||
|
results.put(entry.getKey(), entry.getValue()); |
||||
|
} |
||||
|
} |
||||
|
return results; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Internal conversion. This method will allow to save additional data. |
||||
|
* By default, it will save the object as string. |
||||
|
* |
||||
|
* @param data the data to convert. |
||||
|
* @return a map of {@link String}, {@link String}. |
||||
|
*/ |
||||
|
public Map<String, String> convertDataToStrings(Map<String, Object> data) { |
||||
|
Map<String, String> results = new HashMap<>(); |
||||
|
|
||||
|
if (data != null) { |
||||
|
for (Map.Entry<String, Object> entry : data.entrySet()) { |
||||
|
// Extract the data that will be saved. |
||||
|
if (entry.getValue() instanceof WebAuthenticationDetails) { |
||||
|
WebAuthenticationDetails authenticationDetails = (WebAuthenticationDetails) entry.getValue(); |
||||
|
results.put("remoteAddress", authenticationDetails.getRemoteAddress()); |
||||
|
results.put("sessionId", authenticationDetails.getSessionId()); |
||||
|
} else { |
||||
|
results.put(entry.getKey(), Objects.toString(entry.getValue())); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
return results; |
||||
|
} |
||||
|
} |
@ -0,0 +1,4 @@ |
|||||
|
/** |
||||
|
* Audit specific code. |
||||
|
*/ |
||||
|
package com.cm.skills.config.audit; |
@ -0,0 +1,4 @@ |
|||||
|
/** |
||||
|
* Spring Framework configuration files. |
||||
|
*/ |
||||
|
package com.cm.skills.config; |
@ -0,0 +1,77 @@ |
|||||
|
package com.cm.skills.domain; |
||||
|
|
||||
|
import com.fasterxml.jackson.annotation.JsonIgnore; |
||||
|
import org.springframework.data.annotation.CreatedBy; |
||||
|
import org.springframework.data.annotation.CreatedDate; |
||||
|
import org.springframework.data.annotation.LastModifiedBy; |
||||
|
import org.springframework.data.annotation.LastModifiedDate; |
||||
|
import org.springframework.data.jpa.domain.support.AuditingEntityListener; |
||||
|
|
||||
|
import java.io.Serializable; |
||||
|
import java.time.Instant; |
||||
|
import javax.persistence.Column; |
||||
|
import javax.persistence.EntityListeners; |
||||
|
import javax.persistence.MappedSuperclass; |
||||
|
|
||||
|
/** |
||||
|
* Base abstract class for entities which will hold definitions for created, last modified, created by, |
||||
|
* last modified by attributes. |
||||
|
*/ |
||||
|
@MappedSuperclass |
||||
|
@EntityListeners(AuditingEntityListener.class) |
||||
|
public abstract class AbstractAuditingEntity implements Serializable { |
||||
|
|
||||
|
private static final long serialVersionUID = 1L; |
||||
|
|
||||
|
@CreatedBy |
||||
|
@Column(name = "created_by", nullable = false, length = 50, updatable = false) |
||||
|
@JsonIgnore |
||||
|
private String createdBy; |
||||
|
|
||||
|
@CreatedDate |
||||
|
@Column(name = "created_date", updatable = false) |
||||
|
@JsonIgnore |
||||
|
private Instant createdDate = Instant.now(); |
||||
|
|
||||
|
@LastModifiedBy |
||||
|
@Column(name = "last_modified_by", length = 50) |
||||
|
@JsonIgnore |
||||
|
private String lastModifiedBy; |
||||
|
|
||||
|
@LastModifiedDate |
||||
|
@Column(name = "last_modified_date") |
||||
|
@JsonIgnore |
||||
|
private Instant lastModifiedDate = Instant.now(); |
||||
|
|
||||
|
public String getCreatedBy() { |
||||
|
return createdBy; |
||||
|
} |
||||
|
|
||||
|
public void setCreatedBy(String createdBy) { |
||||
|
this.createdBy = createdBy; |
||||
|
} |
||||
|
|
||||
|
public Instant getCreatedDate() { |
||||
|
return createdDate; |
||||
|
} |
||||
|
|
||||
|
public void setCreatedDate(Instant createdDate) { |
||||
|
this.createdDate = createdDate; |
||||
|
} |
||||
|
|
||||
|
public String getLastModifiedBy() { |
||||
|
return lastModifiedBy; |
||||
|
} |
||||
|
|
||||
|
public void setLastModifiedBy(String lastModifiedBy) { |
||||
|
this.lastModifiedBy = lastModifiedBy; |
||||
|
} |
||||
|
|
||||
|
public Instant getLastModifiedDate() { |
||||
|
return lastModifiedDate; |
||||
|
} |
||||
|
|
||||
|
public void setLastModifiedDate(Instant lastModifiedDate) { |
||||
|
this.lastModifiedDate = lastModifiedDate; |
||||
|
} |
||||
|
} |
@ -0,0 +1,108 @@ |
|||||
|
package com.cm.skills.domain; |
||||
|
|
||||
|
import javax.persistence.*; |
||||
|
import javax.validation.constraints.NotNull; |
||||
|
import java.io.Serializable; |
||||
|
import java.time.Instant; |
||||
|
import java.util.HashMap; |
||||
|
import java.util.Map; |
||||
|
|
||||
|
/** |
||||
|
* Persist AuditEvent managed by the Spring Boot actuator. |
||||
|
* |
||||
|
* @see org.springframework.boot.actuate.audit.AuditEvent |
||||
|
*/ |
||||
|
@Entity |
||||
|
@Table(name = "jhi_persistent_audit_event") |
||||
|
public class PersistentAuditEvent implements Serializable { |
||||
|
|
||||
|
private static final long serialVersionUID = 1L; |
||||
|
|
||||
|
@Id |
||||
|
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator") |
||||
|
@SequenceGenerator(name = "sequenceGenerator") |
||||
|
@Column(name = "event_id") |
||||
|
private Long id; |
||||
|
|
||||
|
@NotNull |
||||
|
@Column(nullable = false) |
||||
|
private String principal; |
||||
|
|
||||
|
@Column(name = "event_date") |
||||
|
private Instant auditEventDate; |
||||
|
|
||||
|
@Column(name = "event_type") |
||||
|
private String auditEventType; |
||||
|
|
||||
|
@ElementCollection |
||||
|
@MapKeyColumn(name = "name") |
||||
|
@Column(name = "value") |
||||
|
@CollectionTable(name = "jhi_persistent_audit_evt_data", joinColumns=@JoinColumn(name="event_id")) |
||||
|
private Map<String, String> data = new HashMap<>(); |
||||
|
|
||||
|
public Long getId() { |
||||
|
return id; |
||||
|
} |
||||
|
|
||||
|
public void setId(Long id) { |
||||
|
this.id = id; |
||||
|
} |
||||
|
|
||||
|
public String getPrincipal() { |
||||
|
return principal; |
||||
|
} |
||||
|
|
||||
|
public void setPrincipal(String principal) { |
||||
|
this.principal = principal; |
||||
|
} |
||||
|
|
||||
|
public Instant getAuditEventDate() { |
||||
|
return auditEventDate; |
||||
|
} |
||||
|
|
||||
|
public void setAuditEventDate(Instant auditEventDate) { |
||||
|
this.auditEventDate = auditEventDate; |
||||
|
} |
||||
|
|
||||
|
public String getAuditEventType() { |
||||
|
return auditEventType; |
||||
|
} |
||||
|
|
||||
|
public void setAuditEventType(String auditEventType) { |
||||
|
this.auditEventType = auditEventType; |
||||
|
} |
||||
|
|
||||
|
public Map<String, String> getData() { |
||||
|
return data; |
||||
|
} |
||||
|
|
||||
|
public void setData(Map<String, String> data) { |
||||
|
this.data = data; |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public boolean equals(Object o) { |
||||
|
if (this == o) { |
||||
|
return true; |
||||
|
} |
||||
|
if (!(o instanceof PersistentAuditEvent)) { |
||||
|
return false; |
||||
|
} |
||||
|
return id != null && id.equals(((PersistentAuditEvent) o).id); |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public int hashCode() { |
||||
|
return 31; |
||||
|
} |
||||
|
|
||||
|
// prettier-ignore |
||||
|
@Override |
||||
|
public String toString() { |
||||
|
return "PersistentAuditEvent{" + |
||||
|
"principal='" + principal + '\'' + |
||||
|
", auditEventDate=" + auditEventDate + |
||||
|
", auditEventType='" + auditEventType + '\'' + |
||||
|
'}'; |
||||
|
} |
||||
|
} |
@ -0,0 +1,106 @@ |
|||||
|
package com.cm.skills.domain; |
||||
|
|
||||
|
|
||||
|
import javax.persistence.*; |
||||
|
|
||||
|
import java.io.Serializable; |
||||
|
|
||||
|
/** |
||||
|
* A Skills. |
||||
|
*/ |
||||
|
@Entity |
||||
|
@Table(name = "skills") |
||||
|
public class Skills implements Serializable { |
||||
|
|
||||
|
private static final long serialVersionUID = 1L; |
||||
|
|
||||
|
@Id |
||||
|
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator") |
||||
|
@SequenceGenerator(name = "sequenceGenerator") |
||||
|
private Long id; |
||||
|
|
||||
|
@Column(name = "id_formation") |
||||
|
private Long idFormation; |
||||
|
|
||||
|
@Column(name = "id_personnel") |
||||
|
private Long idPersonnel; |
||||
|
|
||||
|
@Column(name = "competence") |
||||
|
private String competence; |
||||
|
|
||||
|
// jhipster-needle-entity-add-field - JHipster will add fields here |
||||
|
public Long getId() { |
||||
|
return id; |
||||
|
} |
||||
|
|
||||
|
public void setId(Long id) { |
||||
|
this.id = id; |
||||
|
} |
||||
|
|
||||
|
public Long getIdFormation() { |
||||
|
return idFormation; |
||||
|
} |
||||
|
|
||||
|
public Skills idFormation(Long idFormation) { |
||||
|
this.idFormation = idFormation; |
||||
|
return this; |
||||
|
} |
||||
|
|
||||
|
public void setIdFormation(Long idFormation) { |
||||
|
this.idFormation = idFormation; |
||||
|
} |
||||
|
|
||||
|
public Long getIdPersonnel() { |
||||
|
return idPersonnel; |
||||
|
} |
||||
|
|
||||
|
public Skills idPersonnel(Long idPersonnel) { |
||||
|
this.idPersonnel = idPersonnel; |
||||
|
return this; |
||||
|
} |
||||
|
|
||||
|
public void setIdPersonnel(Long idPersonnel) { |
||||
|
this.idPersonnel = idPersonnel; |
||||
|
} |
||||
|
|
||||
|
public String getCompetence() { |
||||
|
return competence; |
||||
|
} |
||||
|
|
||||
|
public Skills competence(String competence) { |
||||
|
this.competence = competence; |
||||
|
return this; |
||||
|
} |
||||
|
|
||||
|
public void setCompetence(String competence) { |
||||
|
this.competence = competence; |
||||
|
} |
||||
|
// jhipster-needle-entity-add-getters-setters - JHipster will add getters and setters here |
||||
|
|
||||
|
@Override |
||||
|
public boolean equals(Object o) { |
||||
|
if (this == o) { |
||||
|
return true; |
||||
|
} |
||||
|
if (!(o instanceof Skills)) { |
||||
|
return false; |
||||
|
} |
||||
|
return id != null && id.equals(((Skills) o).id); |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public int hashCode() { |
||||
|
return 31; |
||||
|
} |
||||
|
|
||||
|
// prettier-ignore |
||||
|
@Override |
||||
|
public String toString() { |
||||
|
return "Skills{" + |
||||
|
"id=" + getId() + |
||||
|
", idFormation=" + getIdFormation() + |
||||
|
", idPersonnel=" + getIdPersonnel() + |
||||
|
", competence='" + getCompetence() + "'" + |
||||
|
"}"; |
||||
|
} |
||||
|
} |
@ -0,0 +1,4 @@ |
|||||
|
/** |
||||
|
* JPA domain objects. |
||||
|
*/ |
||||
|
package com.cm.skills.domain; |
@ -0,0 +1,14 @@ |
|||||
|
package com.cm.skills.repository; |
||||
|
|
||||
|
import com.cm.skills.domain.Skills; |
||||
|
|
||||
|
import org.springframework.data.jpa.repository.*; |
||||
|
import org.springframework.stereotype.Repository; |
||||
|
|
||||
|
/** |
||||
|
* Spring Data repository for the Skills entity. |
||||
|
*/ |
||||
|
@SuppressWarnings("unused") |
||||
|
@Repository |
||||
|
public interface SkillsRepository extends JpaRepository<Skills, Long> { |
||||
|
} |
@ -0,0 +1,4 @@ |
|||||
|
/** |
||||
|
* Spring Data JPA repositories. |
||||
|
*/ |
||||
|
package com.cm.skills.repository; |
@ -0,0 +1,16 @@ |
|||||
|
package com.cm.skills.security; |
||||
|
|
||||
|
/** |
||||
|
* Constants for Spring Security authorities. |
||||
|
*/ |
||||
|
public final class AuthoritiesConstants { |
||||
|
|
||||
|
public static final String ADMIN = "ROLE_ADMIN"; |
||||
|
|
||||
|
public static final String USER = "ROLE_USER"; |
||||
|
|
||||
|
public static final String ANONYMOUS = "ROLE_ANONYMOUS"; |
||||
|
|
||||
|
private AuthoritiesConstants() { |
||||
|
} |
||||
|
} |
@ -0,0 +1,85 @@ |
|||||
|
package com.cm.skills.security; |
||||
|
|
||||
|
import org.springframework.security.core.Authentication; |
||||
|
import org.springframework.security.core.GrantedAuthority; |
||||
|
import org.springframework.security.core.context.SecurityContext; |
||||
|
import org.springframework.security.core.context.SecurityContextHolder; |
||||
|
import org.springframework.security.core.userdetails.UserDetails; |
||||
|
|
||||
|
import java.util.Optional; |
||||
|
import java.util.stream.Stream; |
||||
|
|
||||
|
/** |
||||
|
* Utility class for Spring Security. |
||||
|
*/ |
||||
|
public final class SecurityUtils { |
||||
|
|
||||
|
private SecurityUtils() { |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Get the login of the current user. |
||||
|
* |
||||
|
* @return the login of the current user. |
||||
|
*/ |
||||
|
public static Optional<String> getCurrentUserLogin() { |
||||
|
SecurityContext securityContext = SecurityContextHolder.getContext(); |
||||
|
return Optional.ofNullable(extractPrincipal(securityContext.getAuthentication())); |
||||
|
} |
||||
|
|
||||
|
private static String extractPrincipal(Authentication authentication) { |
||||
|
if (authentication == null) { |
||||
|
return null; |
||||
|
} else if (authentication.getPrincipal() instanceof UserDetails) { |
||||
|
UserDetails springSecurityUser = (UserDetails) authentication.getPrincipal(); |
||||
|
return springSecurityUser.getUsername(); |
||||
|
} else if (authentication.getPrincipal() instanceof String) { |
||||
|
return (String) authentication.getPrincipal(); |
||||
|
} |
||||
|
return null; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* Get the JWT of the current user. |
||||
|
* |
||||
|
* @return the JWT of the current user. |
||||
|
*/ |
||||
|
public static Optional<String> getCurrentUserJWT() { |
||||
|
SecurityContext securityContext = SecurityContextHolder.getContext(); |
||||
|
return Optional.ofNullable(securityContext.getAuthentication()) |
||||
|
.filter(authentication -> authentication.getCredentials() instanceof String) |
||||
|
.map(authentication -> (String) authentication.getCredentials()); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Check if a user is authenticated. |
||||
|
* |
||||
|
* @return true if the user is authenticated, false otherwise. |
||||
|
*/ |
||||
|
public static boolean isAuthenticated() { |
||||
|
Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); |
||||
|
return authentication != null && |
||||
|
getAuthorities(authentication).noneMatch(AuthoritiesConstants.ANONYMOUS::equals); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* If the current user has a specific authority (security role). |
||||
|
* <p> |
||||
|
* The name of this method comes from the {@code isUserInRole()} method in the Servlet API. |
||||
|
* |
||||
|
* @param authority the authority to check. |
||||
|
* @return true if the current user has the authority, false otherwise. |
||||
|
*/ |
||||
|
public static boolean isCurrentUserInRole(String authority) { |
||||
|
Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); |
||||
|
return authentication != null && |
||||
|
getAuthorities(authentication).anyMatch(authority::equals); |
||||
|
} |
||||
|
|
||||
|
private static Stream<String> getAuthorities(Authentication authentication) { |
||||
|
return authentication.getAuthorities().stream() |
||||
|
.map(GrantedAuthority::getAuthority); |
||||
|
} |
||||
|
|
||||
|
} |
@ -0,0 +1,20 @@ |
|||||
|
package com.cm.skills.security; |
||||
|
|
||||
|
import com.cm.skills.config.Constants; |
||||
|
|
||||
|
import java.util.Optional; |
||||
|
|
||||
|
import org.springframework.data.domain.AuditorAware; |
||||
|
import org.springframework.stereotype.Component; |
||||
|
|
||||
|
/** |
||||
|
* Implementation of {@link AuditorAware} based on Spring Security. |
||||
|
*/ |
||||
|
@Component |
||||
|
public class SpringSecurityAuditorAware implements AuditorAware<String> { |
||||
|
|
||||
|
@Override |
||||
|
public Optional<String> getCurrentAuditor() { |
||||
|
return Optional.of(SecurityUtils.getCurrentUserLogin().orElse(Constants.SYSTEM_ACCOUNT)); |
||||
|
} |
||||
|
} |
@ -0,0 +1,21 @@ |
|||||
|
package com.cm.skills.security.jwt; |
||||
|
|
||||
|
import org.springframework.security.config.annotation.SecurityConfigurerAdapter; |
||||
|
import org.springframework.security.config.annotation.web.builders.HttpSecurity; |
||||
|
import org.springframework.security.web.DefaultSecurityFilterChain; |
||||
|
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; |
||||
|
|
||||
|
public class JWTConfigurer extends SecurityConfigurerAdapter<DefaultSecurityFilterChain, HttpSecurity> { |
||||
|
|
||||
|
private final TokenProvider tokenProvider; |
||||
|
|
||||
|
public JWTConfigurer(TokenProvider tokenProvider) { |
||||
|
this.tokenProvider = tokenProvider; |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public void configure(HttpSecurity http) { |
||||
|
JWTFilter customFilter = new JWTFilter(tokenProvider); |
||||
|
http.addFilterBefore(customFilter, UsernamePasswordAuthenticationFilter.class); |
||||
|
} |
||||
|
} |
@ -0,0 +1,48 @@ |
|||||
|
package com.cm.skills.security.jwt; |
||||
|
|
||||
|
import org.springframework.security.core.Authentication; |
||||
|
import org.springframework.security.core.context.SecurityContextHolder; |
||||
|
import org.springframework.util.StringUtils; |
||||
|
import org.springframework.web.filter.GenericFilterBean; |
||||
|
|
||||
|
import javax.servlet.FilterChain; |
||||
|
import javax.servlet.ServletException; |
||||
|
import javax.servlet.ServletRequest; |
||||
|
import javax.servlet.ServletResponse; |
||||
|
import javax.servlet.http.HttpServletRequest; |
||||
|
import java.io.IOException; |
||||
|
|
||||
|
/** |
||||
|
* Filters incoming requests and installs a Spring Security principal if a header corresponding to a valid user is |
||||
|
* found. |
||||
|
*/ |
||||
|
public class JWTFilter extends GenericFilterBean { |
||||
|
|
||||
|
public static final String AUTHORIZATION_HEADER = "Authorization"; |
||||
|
|
||||
|
private final TokenProvider tokenProvider; |
||||
|
|
||||
|
public JWTFilter(TokenProvider tokenProvider) { |
||||
|
this.tokenProvider = tokenProvider; |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) |
||||
|
throws IOException, ServletException { |
||||
|
HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest; |
||||
|
String jwt = resolveToken(httpServletRequest); |
||||
|
if (StringUtils.hasText(jwt) && this.tokenProvider.validateToken(jwt)) { |
||||
|
Authentication authentication = this.tokenProvider.getAuthentication(jwt); |
||||
|
SecurityContextHolder.getContext().setAuthentication(authentication); |
||||
|
} |
||||
|
filterChain.doFilter(servletRequest, servletResponse); |
||||
|
} |
||||
|
|
||||
|
private String resolveToken(HttpServletRequest request) { |
||||
|
String bearerToken = request.getHeader(AUTHORIZATION_HEADER); |
||||
|
if (StringUtils.hasText(bearerToken) && bearerToken.startsWith("Bearer ")) { |
||||
|
return bearerToken.substring(7); |
||||
|
} |
||||
|
return null; |
||||
|
} |
||||
|
} |
@ -0,0 +1,111 @@ |
|||||
|
package com.cm.skills.security.jwt; |
||||
|
|
||||
|
import java.nio.charset.StandardCharsets; |
||||
|
import java.security.Key; |
||||
|
import java.util.*; |
||||
|
import java.util.stream.Collectors; |
||||
|
import javax.annotation.PostConstruct; |
||||
|
|
||||
|
import org.slf4j.Logger; |
||||
|
import org.slf4j.LoggerFactory; |
||||
|
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; |
||||
|
import org.springframework.security.core.Authentication; |
||||
|
import org.springframework.security.core.GrantedAuthority; |
||||
|
import org.springframework.security.core.authority.SimpleGrantedAuthority; |
||||
|
import org.springframework.security.core.userdetails.User; |
||||
|
import org.springframework.stereotype.Component; |
||||
|
import org.springframework.util.StringUtils; |
||||
|
|
||||
|
import io.github.jhipster.config.JHipsterProperties; |
||||
|
import io.jsonwebtoken.*; |
||||
|
import io.jsonwebtoken.io.Decoders; |
||||
|
import io.jsonwebtoken.security.Keys; |
||||
|
|
||||
|
@Component |
||||
|
public class TokenProvider { |
||||
|
|
||||
|
private final Logger log = LoggerFactory.getLogger(TokenProvider.class); |
||||
|
|
||||
|
private static final String AUTHORITIES_KEY = "auth"; |
||||
|
|
||||
|
private Key key; |
||||
|
|
||||
|
private long tokenValidityInMilliseconds; |
||||
|
|
||||
|
private long tokenValidityInMillisecondsForRememberMe; |
||||
|
|
||||
|
private final JHipsterProperties jHipsterProperties; |
||||
|
|
||||
|
public TokenProvider(JHipsterProperties jHipsterProperties) { |
||||
|
this.jHipsterProperties = jHipsterProperties; |
||||
|
} |
||||
|
|
||||
|
@PostConstruct |
||||
|
public void init() { |
||||
|
byte[] keyBytes; |
||||
|
String secret = jHipsterProperties.getSecurity().getAuthentication().getJwt().getSecret(); |
||||
|
if (!StringUtils.isEmpty(secret)) { |
||||
|
log.warn("Warning: the JWT key used is not Base64-encoded. " + |
||||
|
"We recommend using the `jhipster.security.authentication.jwt.base64-secret` key for optimum security."); |
||||
|
keyBytes = secret.getBytes(StandardCharsets.UTF_8); |
||||
|
} else { |
||||
|
log.debug("Using a Base64-encoded JWT secret key"); |
||||
|
keyBytes = Decoders.BASE64.decode(jHipsterProperties.getSecurity().getAuthentication().getJwt().getBase64Secret()); |
||||
|
} |
||||
|
this.key = Keys.hmacShaKeyFor(keyBytes); |
||||
|
this.tokenValidityInMilliseconds = |
||||
|
1000 * jHipsterProperties.getSecurity().getAuthentication().getJwt().getTokenValidityInSeconds(); |
||||
|
this.tokenValidityInMillisecondsForRememberMe = |
||||
|
1000 * jHipsterProperties.getSecurity().getAuthentication().getJwt() |
||||
|
.getTokenValidityInSecondsForRememberMe(); |
||||
|
} |
||||
|
|
||||
|
public String createToken(Authentication authentication, boolean rememberMe) { |
||||
|
String authorities = authentication.getAuthorities().stream() |
||||
|
.map(GrantedAuthority::getAuthority) |
||||
|
.collect(Collectors.joining(",")); |
||||
|
|
||||
|
long now = (new Date()).getTime(); |
||||
|
Date validity; |
||||
|
if (rememberMe) { |
||||
|
validity = new Date(now + this.tokenValidityInMillisecondsForRememberMe); |
||||
|
} else { |
||||
|
validity = new Date(now + this.tokenValidityInMilliseconds); |
||||
|
} |
||||
|
|
||||
|
return Jwts.builder() |
||||
|
.setSubject(authentication.getName()) |
||||
|
.claim(AUTHORITIES_KEY, authorities) |
||||
|
.signWith(key, SignatureAlgorithm.HS512) |
||||
|
.setExpiration(validity) |
||||
|
.compact(); |
||||
|
} |
||||
|
|
||||
|
public Authentication getAuthentication(String token) { |
||||
|
Claims claims = Jwts.parserBuilder() |
||||
|
.setSigningKey(key) |
||||
|
.build() |
||||
|
.parseClaimsJws(token) |
||||
|
.getBody(); |
||||
|
|
||||
|
Collection<? extends GrantedAuthority> authorities = |
||||
|
Arrays.stream(claims.get(AUTHORITIES_KEY).toString().split(",")) |
||||
|
.map(SimpleGrantedAuthority::new) |
||||
|
.collect(Collectors.toList()); |
||||
|
|
||||
|
User principal = new User(claims.getSubject(), "", authorities); |
||||
|
|
||||
|
return new UsernamePasswordAuthenticationToken(principal, token, authorities); |
||||
|
} |
||||
|
|
||||
|
public boolean validateToken(String authToken) { |
||||
|
try { |
||||
|
Jwts.parserBuilder().setSigningKey(key).build().parseClaimsJws(authToken); |
||||
|
return true; |
||||
|
} catch (JwtException | IllegalArgumentException e) { |
||||
|
log.info("Invalid JWT token."); |
||||
|
log.trace("Invalid JWT token trace.", e); |
||||
|
} |
||||
|
return false; |
||||
|
} |
||||
|
} |
@ -0,0 +1,4 @@ |
|||||
|
/** |
||||
|
* Spring Security configuration. |
||||
|
*/ |
||||
|
package com.cm.skills.security; |
@ -0,0 +1,84 @@ |
|||||
|
package com.cm.skills.service; |
||||
|
|
||||
|
import com.cm.skills.domain.Skills; |
||||
|
import com.cm.skills.repository.SkillsRepository; |
||||
|
import com.cm.skills.service.dto.SkillsDTO; |
||||
|
import com.cm.skills.service.mapper.SkillsMapper; |
||||
|
import org.slf4j.Logger; |
||||
|
import org.slf4j.LoggerFactory; |
||||
|
|
||||
|
import org.springframework.data.domain.Page; |
||||
|
import org.springframework.data.domain.Pageable; |
||||
|
import org.springframework.stereotype.Service; |
||||
|
import org.springframework.transaction.annotation.Transactional; |
||||
|
|
||||
|
import java.util.Optional; |
||||
|
|
||||
|
/** |
||||
|
* Service Implementation for managing {@link Skills}. |
||||
|
*/ |
||||
|
@Service |
||||
|
@Transactional |
||||
|
public class SkillsService { |
||||
|
|
||||
|
private final Logger log = LoggerFactory.getLogger(SkillsService.class); |
||||
|
|
||||
|
private final SkillsRepository skillsRepository; |
||||
|
|
||||
|
private final SkillsMapper skillsMapper; |
||||
|
|
||||
|
public SkillsService(SkillsRepository skillsRepository, SkillsMapper skillsMapper) { |
||||
|
this.skillsRepository = skillsRepository; |
||||
|
this.skillsMapper = skillsMapper; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Save a skills. |
||||
|
* |
||||
|
* @param skillsDTO the entity to save. |
||||
|
* @return the persisted entity. |
||||
|
*/ |
||||
|
public SkillsDTO save(SkillsDTO skillsDTO) { |
||||
|
log.debug("Request to save Skills : {}", skillsDTO); |
||||
|
Skills skills = skillsMapper.toEntity(skillsDTO); |
||||
|
skills = skillsRepository.save(skills); |
||||
|
return skillsMapper.toDto(skills); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Get all the skills. |
||||
|
* |
||||
|
* @param pageable the pagination information. |
||||
|
* @return the list of entities. |
||||
|
*/ |
||||
|
@Transactional(readOnly = true) |
||||
|
public Page<SkillsDTO> findAll(Pageable pageable) { |
||||
|
log.debug("Request to get all Skills"); |
||||
|
return skillsRepository.findAll(pageable) |
||||
|
.map(skillsMapper::toDto); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* Get one skills by id. |
||||
|
* |
||||
|
* @param id the id of the entity. |
||||
|
* @return the entity. |
||||
|
*/ |
||||
|
@Transactional(readOnly = true) |
||||
|
public Optional<SkillsDTO> findOne(Long id) { |
||||
|
log.debug("Request to get Skills : {}", id); |
||||
|
return skillsRepository.findById(id) |
||||
|
.map(skillsMapper::toDto); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Delete the skills by id. |
||||
|
* |
||||
|
* @param id the id of the entity. |
||||
|
*/ |
||||
|
public void delete(Long id) { |
||||
|
log.debug("Request to delete Skills : {}", id); |
||||
|
skillsRepository.deleteById(id); |
||||
|
} |
||||
|
} |
@ -0,0 +1,78 @@ |
|||||
|
package com.cm.skills.service.dto; |
||||
|
|
||||
|
import java.io.Serializable; |
||||
|
|
||||
|
/** |
||||
|
* A DTO for the {@link com.cm.skills.domain.Skills} entity. |
||||
|
*/ |
||||
|
public class SkillsDTO implements Serializable { |
||||
|
|
||||
|
private Long id; |
||||
|
|
||||
|
private Long idFormation; |
||||
|
|
||||
|
private Long idPersonnel; |
||||
|
|
||||
|
private String competence; |
||||
|
|
||||
|
|
||||
|
public Long getId() { |
||||
|
return id; |
||||
|
} |
||||
|
|
||||
|
public void setId(Long id) { |
||||
|
this.id = id; |
||||
|
} |
||||
|
|
||||
|
public Long getIdFormation() { |
||||
|
return idFormation; |
||||
|
} |
||||
|
|
||||
|
public void setIdFormation(Long idFormation) { |
||||
|
this.idFormation = idFormation; |
||||
|
} |
||||
|
|
||||
|
public Long getIdPersonnel() { |
||||
|
return idPersonnel; |
||||
|
} |
||||
|
|
||||
|
public void setIdPersonnel(Long idPersonnel) { |
||||
|
this.idPersonnel = idPersonnel; |
||||
|
} |
||||
|
|
||||
|
public String getCompetence() { |
||||
|
return competence; |
||||
|
} |
||||
|
|
||||
|
public void setCompetence(String competence) { |
||||
|
this.competence = competence; |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public boolean equals(Object o) { |
||||
|
if (this == o) { |
||||
|
return true; |
||||
|
} |
||||
|
if (!(o instanceof SkillsDTO)) { |
||||
|
return false; |
||||
|
} |
||||
|
|
||||
|
return id != null && id.equals(((SkillsDTO) o).id); |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public int hashCode() { |
||||
|
return 31; |
||||
|
} |
||||
|
|
||||
|
// prettier-ignore |
||||
|
@Override |
||||
|
public String toString() { |
||||
|
return "SkillsDTO{" + |
||||
|
"id=" + getId() + |
||||
|
", idFormation=" + getIdFormation() + |
||||
|
", idPersonnel=" + getIdPersonnel() + |
||||
|
", competence='" + getCompetence() + "'" + |
||||
|
"}"; |
||||
|
} |
||||
|
} |
@ -0,0 +1,21 @@ |
|||||
|
package com.cm.skills.service.mapper; |
||||
|
|
||||
|
import java.util.List; |
||||
|
|
||||
|
/** |
||||
|
* Contract for a generic dto to entity mapper. |
||||
|
* |
||||
|
* @param <D> - DTO type parameter. |
||||
|
* @param <E> - Entity type parameter. |
||||
|
*/ |
||||
|
|
||||
|
public interface EntityMapper <D, E> { |
||||
|
|
||||
|
E toEntity(D dto); |
||||
|
|
||||
|
D toDto(E entity); |
||||
|
|
||||
|
List <E> toEntity(List<D> dtoList); |
||||
|
|
||||
|
List <D> toDto(List<E> entityList); |
||||
|
} |
@ -0,0 +1,25 @@ |
|||||
|
package com.cm.skills.service.mapper; |
||||
|
|
||||
|
|
||||
|
import com.cm.skills.domain.*; |
||||
|
import com.cm.skills.service.dto.SkillsDTO; |
||||
|
|
||||
|
import org.mapstruct.*; |
||||
|
|
||||
|
/** |
||||
|
* Mapper for the entity {@link Skills} and its DTO {@link SkillsDTO}. |
||||
|
*/ |
||||
|
@Mapper(componentModel = "spring", uses = {}) |
||||
|
public interface SkillsMapper extends EntityMapper<SkillsDTO, Skills> { |
||||
|
|
||||
|
|
||||
|
|
||||
|
default Skills fromId(Long id) { |
||||
|
if (id == null) { |
||||
|
return null; |
||||
|
} |
||||
|
Skills skills = new Skills(); |
||||
|
skills.setId(id); |
||||
|
return skills; |
||||
|
} |
||||
|
} |
@ -0,0 +1,4 @@ |
|||||
|
/** |
||||
|
* Service layer beans. |
||||
|
*/ |
||||
|
package com.cm.skills.service; |
@ -0,0 +1,125 @@ |
|||||
|
package com.cm.skills.web.rest; |
||||
|
|
||||
|
import com.cm.skills.service.SkillsService; |
||||
|
import com.cm.skills.web.rest.errors.BadRequestAlertException; |
||||
|
import com.cm.skills.service.dto.SkillsDTO; |
||||
|
|
||||
|
import io.github.jhipster.web.util.HeaderUtil; |
||||
|
import io.github.jhipster.web.util.PaginationUtil; |
||||
|
import io.github.jhipster.web.util.ResponseUtil; |
||||
|
import org.slf4j.Logger; |
||||
|
import org.slf4j.LoggerFactory; |
||||
|
import org.springframework.beans.factory.annotation.Value; |
||||
|
import org.springframework.data.domain.Page; |
||||
|
import org.springframework.data.domain.Pageable; |
||||
|
import org.springframework.http.HttpHeaders; |
||||
|
import org.springframework.http.HttpStatus; |
||||
|
import org.springframework.web.servlet.support.ServletUriComponentsBuilder; |
||||
|
import org.springframework.http.ResponseEntity; |
||||
|
import org.springframework.web.bind.annotation.*; |
||||
|
|
||||
|
import java.net.URI; |
||||
|
import java.net.URISyntaxException; |
||||
|
import java.util.List; |
||||
|
import java.util.Optional; |
||||
|
|
||||
|
/** |
||||
|
* REST controller for managing {@link com.cm.skills.domain.Skills}. |
||||
|
*/ |
||||
|
@RestController |
||||
|
@RequestMapping("/api") |
||||
|
public class SkillsResource { |
||||
|
|
||||
|
private final Logger log = LoggerFactory.getLogger(SkillsResource.class); |
||||
|
|
||||
|
private static final String ENTITY_NAME = "skillsSkills"; |
||||
|
|
||||
|
@Value("${jhipster.clientApp.name}") |
||||
|
private String applicationName; |
||||
|
|
||||
|
private final SkillsService skillsService; |
||||
|
|
||||
|
public SkillsResource(SkillsService skillsService) { |
||||
|
this.skillsService = skillsService; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* {@code POST /skills} : Create a new skills. |
||||
|
* |
||||
|
* @param skillsDTO the skillsDTO to create. |
||||
|
* @return the {@link ResponseEntity} with status {@code 201 (Created)} and with body the new skillsDTO, or with status {@code 400 (Bad Request)} if the skills has already an ID. |
||||
|
* @throws URISyntaxException if the Location URI syntax is incorrect. |
||||
|
*/ |
||||
|
@PostMapping("/skills") |
||||
|
public ResponseEntity<SkillsDTO> createSkills(@RequestBody SkillsDTO skillsDTO) throws URISyntaxException { |
||||
|
log.debug("REST request to save Skills : {}", skillsDTO); |
||||
|
if (skillsDTO.getId() != null) { |
||||
|
throw new BadRequestAlertException("A new skills cannot already have an ID", ENTITY_NAME, "idexists"); |
||||
|
} |
||||
|
SkillsDTO result = skillsService.save(skillsDTO); |
||||
|
return ResponseEntity.created(new URI("/api/skills/" + result.getId())) |
||||
|
.headers(HeaderUtil.createEntityCreationAlert(applicationName, true, ENTITY_NAME, result.getId().toString())) |
||||
|
.body(result); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* {@code PUT /skills} : Updates an existing skills. |
||||
|
* |
||||
|
* @param skillsDTO the skillsDTO to update. |
||||
|
* @return the {@link ResponseEntity} with status {@code 200 (OK)} and with body the updated skillsDTO, |
||||
|
* or with status {@code 400 (Bad Request)} if the skillsDTO is not valid, |
||||
|
* or with status {@code 500 (Internal Server Error)} if the skillsDTO couldn't be updated. |
||||
|
* @throws URISyntaxException if the Location URI syntax is incorrect. |
||||
|
*/ |
||||
|
@PutMapping("/skills") |
||||
|
public ResponseEntity<SkillsDTO> updateSkills(@RequestBody SkillsDTO skillsDTO) throws URISyntaxException { |
||||
|
log.debug("REST request to update Skills : {}", skillsDTO); |
||||
|
if (skillsDTO.getId() == null) { |
||||
|
throw new BadRequestAlertException("Invalid id", ENTITY_NAME, "idnull"); |
||||
|
} |
||||
|
SkillsDTO result = skillsService.save(skillsDTO); |
||||
|
return ResponseEntity.ok() |
||||
|
.headers(HeaderUtil.createEntityUpdateAlert(applicationName, true, ENTITY_NAME, skillsDTO.getId().toString())) |
||||
|
.body(result); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* {@code GET /skills} : get all the skills. |
||||
|
* |
||||
|
* @param pageable the pagination information. |
||||
|
* @return the {@link ResponseEntity} with status {@code 200 (OK)} and the list of skills in body. |
||||
|
*/ |
||||
|
@GetMapping("/skills") |
||||
|
public ResponseEntity<List<SkillsDTO>> getAllSkills(Pageable pageable) { |
||||
|
log.debug("REST request to get a page of Skills"); |
||||
|
Page<SkillsDTO> page = skillsService.findAll(pageable); |
||||
|
HttpHeaders headers = PaginationUtil.generatePaginationHttpHeaders(ServletUriComponentsBuilder.fromCurrentRequest(), page); |
||||
|
return ResponseEntity.ok().headers(headers).body(page.getContent()); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* {@code GET /skills/:id} : get the "id" skills. |
||||
|
* |
||||
|
* @param id the id of the skillsDTO to retrieve. |
||||
|
* @return the {@link ResponseEntity} with status {@code 200 (OK)} and with body the skillsDTO, or with status {@code 404 (Not Found)}. |
||||
|
*/ |
||||
|
@GetMapping("/skills/{id}") |
||||
|
public ResponseEntity<SkillsDTO> getSkills(@PathVariable Long id) { |
||||
|
log.debug("REST request to get Skills : {}", id); |
||||
|
Optional<SkillsDTO> skillsDTO = skillsService.findOne(id); |
||||
|
return ResponseUtil.wrapOrNotFound(skillsDTO); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* {@code DELETE /skills/:id} : delete the "id" skills. |
||||
|
* |
||||
|
* @param id the id of the skillsDTO to delete. |
||||
|
* @return the {@link ResponseEntity} with status {@code 204 (NO_CONTENT)}. |
||||
|
*/ |
||||
|
@DeleteMapping("/skills/{id}") |
||||
|
public ResponseEntity<Void> deleteSkills(@PathVariable Long id) { |
||||
|
log.debug("REST request to delete Skills : {}", id); |
||||
|
skillsService.delete(id); |
||||
|
return ResponseEntity.noContent().headers(HeaderUtil.createEntityDeletionAlert(applicationName, true, ENTITY_NAME, id.toString())).build(); |
||||
|
} |
||||
|
} |
@ -0,0 +1,42 @@ |
|||||
|
package com.cm.skills.web.rest.errors; |
||||
|
|
||||
|
import org.zalando.problem.AbstractThrowableProblem; |
||||
|
import org.zalando.problem.Status; |
||||
|
|
||||
|
import java.net.URI; |
||||
|
import java.util.HashMap; |
||||
|
import java.util.Map; |
||||
|
|
||||
|
public class BadRequestAlertException extends AbstractThrowableProblem { |
||||
|
|
||||
|
private static final long serialVersionUID = 1L; |
||||
|
|
||||
|
private final String entityName; |
||||
|
|
||||
|
private final String errorKey; |
||||
|
|
||||
|
public BadRequestAlertException(String defaultMessage, String entityName, String errorKey) { |
||||
|
this(ErrorConstants.DEFAULT_TYPE, defaultMessage, entityName, errorKey); |
||||
|
} |
||||
|
|
||||
|
public BadRequestAlertException(URI type, String defaultMessage, String entityName, String errorKey) { |
||||
|
super(type, defaultMessage, Status.BAD_REQUEST, null, null, null, getAlertParameters(entityName, errorKey)); |
||||
|
this.entityName = entityName; |
||||
|
this.errorKey = errorKey; |
||||
|
} |
||||
|
|
||||
|
public String getEntityName() { |
||||
|
return entityName; |
||||
|
} |
||||
|
|
||||
|
public String getErrorKey() { |
||||
|
return errorKey; |
||||
|
} |
||||
|
|
||||
|
private static Map<String, Object> getAlertParameters(String entityName, String errorKey) { |
||||
|
Map<String, Object> parameters = new HashMap<>(); |
||||
|
parameters.put("message", "error." + errorKey); |
||||
|
parameters.put("params", entityName); |
||||
|
return parameters; |
||||
|
} |
||||
|
} |
@ -0,0 +1,15 @@ |
|||||
|
package com.cm.skills.web.rest.errors; |
||||
|
|
||||
|
import java.net.URI; |
||||
|
|
||||
|
public final class ErrorConstants { |
||||
|
|
||||
|
public static final String ERR_CONCURRENCY_FAILURE = "error.concurrencyFailure"; |
||||
|
public static final String ERR_VALIDATION = "error.validation"; |
||||
|
public static final String PROBLEM_BASE_URL = "https://www.jhipster.tech/problem"; |
||||
|
public static final URI DEFAULT_TYPE = URI.create(PROBLEM_BASE_URL + "/problem-with-message"); |
||||
|
public static final URI CONSTRAINT_VIOLATION_TYPE = URI.create(PROBLEM_BASE_URL + "/constraint-violation"); |
||||
|
|
||||
|
private ErrorConstants() { |
||||
|
} |
||||
|
} |
@ -0,0 +1,181 @@ |
|||||
|
package com.cm.skills.web.rest.errors; |
||||
|
|
||||
|
import io.github.jhipster.config.JHipsterConstants; |
||||
|
import io.github.jhipster.web.util.HeaderUtil; |
||||
|
|
||||
|
import org.apache.commons.lang3.StringUtils; |
||||
|
import org.springframework.beans.factory.annotation.Value; |
||||
|
import org.springframework.dao.ConcurrencyFailureException; |
||||
|
import org.springframework.dao.DataAccessException; |
||||
|
import org.springframework.http.ResponseEntity; |
||||
|
import org.springframework.http.converter.HttpMessageConversionException; |
||||
|
import org.springframework.validation.BindingResult; |
||||
|
import org.springframework.web.bind.MethodArgumentNotValidException; |
||||
|
import org.springframework.web.bind.annotation.ControllerAdvice; |
||||
|
import org.springframework.web.bind.annotation.ExceptionHandler; |
||||
|
import org.springframework.web.context.request.NativeWebRequest; |
||||
|
import org.springframework.core.env.Environment; |
||||
|
import org.zalando.problem.DefaultProblem; |
||||
|
import org.zalando.problem.Problem; |
||||
|
import org.zalando.problem.ProblemBuilder; |
||||
|
import org.zalando.problem.Status; |
||||
|
import org.zalando.problem.StatusType; |
||||
|
import org.zalando.problem.spring.web.advice.ProblemHandling; |
||||
|
import org.zalando.problem.spring.web.advice.security.SecurityAdviceTrait; |
||||
|
import org.zalando.problem.violations.ConstraintViolationProblem; |
||||
|
|
||||
|
import javax.annotation.Nonnull; |
||||
|
import javax.annotation.Nullable; |
||||
|
import javax.servlet.http.HttpServletRequest; |
||||
|
import java.net.URI; |
||||
|
import java.util.Arrays; |
||||
|
import java.util.Collection; |
||||
|
import java.util.List; |
||||
|
import java.util.Optional; |
||||
|
import java.util.stream.Collectors; |
||||
|
|
||||
|
/** |
||||
|
* Controller advice to translate the server side exceptions to client-friendly json structures. |
||||
|
* The error response follows RFC7807 - Problem Details for HTTP APIs (https://tools.ietf.org/html/rfc7807). |
||||
|
*/ |
||||
|
@ControllerAdvice |
||||
|
public class ExceptionTranslator implements ProblemHandling, SecurityAdviceTrait { |
||||
|
|
||||
|
private static final String FIELD_ERRORS_KEY = "fieldErrors"; |
||||
|
private static final String MESSAGE_KEY = "message"; |
||||
|
private static final String PATH_KEY = "path"; |
||||
|
private static final String VIOLATIONS_KEY = "violations"; |
||||
|
|
||||
|
@Value("${jhipster.clientApp.name}") |
||||
|
private String applicationName; |
||||
|
|
||||
|
private final Environment env; |
||||
|
|
||||
|
public ExceptionTranslator(Environment env) { |
||||
|
this.env = env; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Post-process the Problem payload to add the message key for the front-end if needed. |
||||
|
*/ |
||||
|
@Override |
||||
|
public ResponseEntity<Problem> process(@Nullable ResponseEntity<Problem> entity, NativeWebRequest request) { |
||||
|
if (entity == null) { |
||||
|
return entity; |
||||
|
} |
||||
|
Problem problem = entity.getBody(); |
||||
|
if (!(problem instanceof ConstraintViolationProblem || problem instanceof DefaultProblem)) { |
||||
|
return entity; |
||||
|
} |
||||
|
ProblemBuilder builder = Problem.builder() |
||||
|
.withType(Problem.DEFAULT_TYPE.equals(problem.getType()) ? ErrorConstants.DEFAULT_TYPE : problem.getType()) |
||||
|
.withStatus(problem.getStatus()) |
||||
|
.withTitle(problem.getTitle()) |
||||
|
.with(PATH_KEY, request.getNativeRequest(HttpServletRequest.class).getRequestURI()); |
||||
|
|
||||
|
if (problem instanceof ConstraintViolationProblem) { |
||||
|
builder |
||||
|
.with(VIOLATIONS_KEY, ((ConstraintViolationProblem) problem).getViolations()) |
||||
|
.with(MESSAGE_KEY, ErrorConstants.ERR_VALIDATION); |
||||
|
} else { |
||||
|
builder |
||||
|
.withCause(((DefaultProblem) problem).getCause()) |
||||
|
.withDetail(problem.getDetail()) |
||||
|
.withInstance(problem.getInstance()); |
||||
|
problem.getParameters().forEach(builder::with); |
||||
|
if (!problem.getParameters().containsKey(MESSAGE_KEY) && problem.getStatus() != null) { |
||||
|
builder.with(MESSAGE_KEY, "error.http." + problem.getStatus().getStatusCode()); |
||||
|
} |
||||
|
} |
||||
|
return new ResponseEntity<>(builder.build(), entity.getHeaders(), entity.getStatusCode()); |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public ResponseEntity<Problem> handleMethodArgumentNotValid(MethodArgumentNotValidException ex, @Nonnull NativeWebRequest request) { |
||||
|
BindingResult result = ex.getBindingResult(); |
||||
|
List<FieldErrorVM> fieldErrors = result.getFieldErrors().stream() |
||||
|
.map(f -> new FieldErrorVM(f.getObjectName().replaceFirst("DTO$", ""), f.getField(), f.getCode())) |
||||
|
.collect(Collectors.toList()); |
||||
|
|
||||
|
Problem problem = Problem.builder() |
||||
|
.withType(ErrorConstants.CONSTRAINT_VIOLATION_TYPE) |
||||
|
.withTitle("Method argument not valid") |
||||
|
.withStatus(defaultConstraintViolationStatus()) |
||||
|
.with(MESSAGE_KEY, ErrorConstants.ERR_VALIDATION) |
||||
|
.with(FIELD_ERRORS_KEY, fieldErrors) |
||||
|
.build(); |
||||
|
return create(ex, problem, request); |
||||
|
} |
||||
|
|
||||
|
@ExceptionHandler |
||||
|
public ResponseEntity<Problem> handleBadRequestAlertException(BadRequestAlertException ex, NativeWebRequest request) { |
||||
|
return create(ex, request, HeaderUtil.createFailureAlert(applicationName, true, ex.getEntityName(), ex.getErrorKey(), ex.getMessage())); |
||||
|
} |
||||
|
|
||||
|
@ExceptionHandler |
||||
|
public ResponseEntity<Problem> handleConcurrencyFailure(ConcurrencyFailureException ex, NativeWebRequest request) { |
||||
|
Problem problem = Problem.builder() |
||||
|
.withStatus(Status.CONFLICT) |
||||
|
.with(MESSAGE_KEY, ErrorConstants.ERR_CONCURRENCY_FAILURE) |
||||
|
.build(); |
||||
|
return create(ex, problem, request); |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public ProblemBuilder prepare(final Throwable throwable, final StatusType status, final URI type) { |
||||
|
|
||||
|
Collection<String> activeProfiles = Arrays.asList(env.getActiveProfiles()); |
||||
|
|
||||
|
if (activeProfiles.contains(JHipsterConstants.SPRING_PROFILE_PRODUCTION)) { |
||||
|
if (throwable instanceof HttpMessageConversionException) { |
||||
|
return Problem.builder() |
||||
|
.withType(type) |
||||
|
.withTitle(status.getReasonPhrase()) |
||||
|
.withStatus(status) |
||||
|
.withDetail("Unable to convert http message") |
||||
|
.withCause(Optional.ofNullable(throwable.getCause()) |
||||
|
.filter(cause -> isCausalChainsEnabled()) |
||||
|
.map(this::toProblem) |
||||
|
.orElse(null)); |
||||
|
} |
||||
|
if (throwable instanceof DataAccessException) { |
||||
|
return Problem.builder() |
||||
|
.withType(type) |
||||
|
.withTitle(status.getReasonPhrase()) |
||||
|
.withStatus(status) |
||||
|
.withDetail("Failure during data access") |
||||
|
.withCause(Optional.ofNullable(throwable.getCause()) |
||||
|
.filter(cause -> isCausalChainsEnabled()) |
||||
|
.map(this::toProblem) |
||||
|
.orElse(null)); |
||||
|
} |
||||
|
if (containsPackageName(throwable.getMessage())) { |
||||
|
return Problem.builder() |
||||
|
.withType(type) |
||||
|
.withTitle(status.getReasonPhrase()) |
||||
|
.withStatus(status) |
||||
|
.withDetail("Unexpected runtime exception") |
||||
|
.withCause(Optional.ofNullable(throwable.getCause()) |
||||
|
.filter(cause -> isCausalChainsEnabled()) |
||||
|
.map(this::toProblem) |
||||
|
.orElse(null)); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
return Problem.builder() |
||||
|
.withType(type) |
||||
|
.withTitle(status.getReasonPhrase()) |
||||
|
.withStatus(status) |
||||
|
.withDetail(throwable.getMessage()) |
||||
|
.withCause(Optional.ofNullable(throwable.getCause()) |
||||
|
.filter(cause -> isCausalChainsEnabled()) |
||||
|
.map(this::toProblem) |
||||
|
.orElse(null)); |
||||
|
} |
||||
|
|
||||
|
private boolean containsPackageName(String message) { |
||||
|
|
||||
|
// This list is for sure not complete |
||||
|
return StringUtils.containsAny(message, "org.", "java.", "net.", "javax.", "com.", "io.", "de.", "com.cm.skills"); |
||||
|
} |
||||
|
} |
@ -0,0 +1,33 @@ |
|||||
|
package com.cm.skills.web.rest.errors; |
||||
|
|
||||
|
import java.io.Serializable; |
||||
|
|
||||
|
public class FieldErrorVM implements Serializable { |
||||
|
|
||||
|
private static final long serialVersionUID = 1L; |
||||
|
|
||||
|
private final String objectName; |
||||
|
|
||||
|
private final String field; |
||||
|
|
||||
|
private final String message; |
||||
|
|
||||
|
public FieldErrorVM(String dto, String field, String message) { |
||||
|
this.objectName = dto; |
||||
|
this.field = field; |
||||
|
this.message = message; |
||||
|
} |
||||
|
|
||||
|
public String getObjectName() { |
||||
|
return objectName; |
||||
|
} |
||||
|
|
||||
|
public String getField() { |
||||
|
return field; |
||||
|
} |
||||
|
|
||||
|
public String getMessage() { |
||||
|
return message; |
||||
|
} |
||||
|
|
||||
|
} |
@ -0,0 +1,6 @@ |
|||||
|
/** |
||||
|
* Specific errors used with Zalando's "problem-spring-web" library. |
||||
|
* |
||||
|
* More information on https://github.com/zalando/problem-spring-web |
||||
|
*/ |
||||
|
package com.cm.skills.web.rest.errors; |
@ -0,0 +1,4 @@ |
|||||
|
/** |
||||
|
* Spring MVC REST controllers. |
||||
|
*/ |
||||
|
package com.cm.skills.web.rest; |
@ -0,0 +1,4 @@ |
|||||
|
/** |
||||
|
* View Models used by Spring MVC REST controllers. |
||||
|
*/ |
||||
|
package com.cm.skills.web.rest.vm; |
@ -0,0 +1,4 @@ |
|||||
|
#!/bin/sh |
||||
|
|
||||
|
echo "The application will start in ${JHIPSTER_SLEEP}s..." && sleep ${JHIPSTER_SLEEP} |
||||
|
exec java ${JAVA_OPTS} -noverify -XX:+AlwaysPreTouch -Djava.security.egd=file:/dev/./urandom -cp /app/resources/:/app/classes/:/app/libs/* "com.cm.skills.SkillsApp" "$@" |
@ -0,0 +1,10 @@ |
|||||
|
|
||||
|
${AnsiColor.GREEN} ██╗${AnsiColor.RED} ██╗ ██╗ ████████╗ ███████╗ ██████╗ ████████╗ ████████╗ ███████╗ |
||||
|
${AnsiColor.GREEN} ██║${AnsiColor.RED} ██║ ██║ ╚══██╔══╝ ██╔═══██╗ ██╔════╝ ╚══██╔══╝ ██╔═════╝ ██╔═══██╗ |
||||
|
${AnsiColor.GREEN} ██║${AnsiColor.RED} ████████║ ██║ ███████╔╝ ╚█████╗ ██║ ██████╗ ███████╔╝ |
||||
|
${AnsiColor.GREEN}██╗ ██║${AnsiColor.RED} ██╔═══██║ ██║ ██╔════╝ ╚═══██╗ ██║ ██╔═══╝ ██╔══██║ |
||||
|
${AnsiColor.GREEN}╚██████╔╝${AnsiColor.RED} ██║ ██║ ████████╗ ██║ ██████╔╝ ██║ ████████╗ ██║ ╚██╗ |
||||
|
${AnsiColor.GREEN} ╚═════╝ ${AnsiColor.RED} ╚═╝ ╚═╝ ╚═══════╝ ╚═╝ ╚═════╝ ╚═╝ ╚═══════╝ ╚═╝ ╚═╝ |
||||
|
|
||||
|
${AnsiColor.BRIGHT_BLUE}:: JHipster 🤓 :: Running Spring Boot ${spring-boot.version} :: |
||||
|
:: https://www.jhipster.tech ::${AnsiColor.DEFAULT} |
@ -0,0 +1,134 @@ |
|||||
|
# =================================================================== |
||||
|
# Spring Boot configuration for the "dev" profile. |
||||
|
# |
||||
|
# This configuration overrides the application.yml file. |
||||
|
# |
||||
|
# More information on profiles: https://www.jhipster.tech/profiles/ |
||||
|
# More information on configuration properties: https://www.jhipster.tech/common-application-properties/ |
||||
|
# =================================================================== |
||||
|
|
||||
|
# =================================================================== |
||||
|
# Standard Spring Boot properties. |
||||
|
# Full reference is available at: |
||||
|
# http://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html |
||||
|
# =================================================================== |
||||
|
|
||||
|
logging: |
||||
|
level: |
||||
|
ROOT: DEBUG |
||||
|
io.github.jhipster: DEBUG |
||||
|
com.cm.skills: DEBUG |
||||
|
|
||||
|
eureka: |
||||
|
instance: |
||||
|
prefer-ip-address: true |
||||
|
client: |
||||
|
service-url: |
||||
|
defaultZone: http://admin:${jhipster.registry.password}@localhost:8761/eureka/ |
||||
|
|
||||
|
spring: |
||||
|
profiles: |
||||
|
active: dev |
||||
|
include: |
||||
|
- swagger |
||||
|
# Uncomment to activate TLS for the dev profile |
||||
|
#- tls |
||||
|
devtools: |
||||
|
restart: |
||||
|
enabled: true |
||||
|
additional-exclude: static/** |
||||
|
livereload: |
||||
|
enabled: false # we use Webpack dev server + BrowserSync for livereload |
||||
|
jackson: |
||||
|
serialization: |
||||
|
indent-output: true |
||||
|
datasource: |
||||
|
type: com.zaxxer.hikari.HikariDataSource |
||||
|
url: jdbc:sqlserver://localhost:1433;database=skills |
||||
|
username: noura |
||||
|
password: 123456789 |
||||
|
hikari: |
||||
|
poolName: Hikari |
||||
|
auto-commit: false |
||||
|
data-source-properties: |
||||
|
cachePrepStmts: true |
||||
|
prepStmtCacheSize: 250 |
||||
|
prepStmtCacheSqlLimit: 2048 |
||||
|
useServerPrepStmts: true |
||||
|
jpa: |
||||
|
show-sql: true |
||||
|
liquibase: |
||||
|
# Remove 'faker' if you do not want the sample data to be loaded automatically |
||||
|
contexts: dev, faker |
||||
|
mail: |
||||
|
host: localhost |
||||
|
port: 25 |
||||
|
username: |
||||
|
password: |
||||
|
messages: |
||||
|
cache-duration: PT1S # 1 second, see the ISO 8601 standard |
||||
|
thymeleaf: |
||||
|
cache: false |
||||
|
sleuth: |
||||
|
sampler: |
||||
|
probability: 1 # report 100% of traces |
||||
|
zipkin: # Use the "zipkin" Maven profile to have the Spring Cloud Zipkin dependencies |
||||
|
base-url: http://localhost:9411 |
||||
|
enabled: false |
||||
|
locator: |
||||
|
discovery: |
||||
|
enabled: true |
||||
|
|
||||
|
server: |
||||
|
port: 3006 |
||||
|
|
||||
|
# =================================================================== |
||||
|
# JHipster specific properties |
||||
|
# |
||||
|
# Full reference is available at: https://www.jhipster.tech/common-application-properties/ |
||||
|
# =================================================================== |
||||
|
|
||||
|
jhipster: |
||||
|
# CORS is disabled by default on microservices, as you should access them through a gateway. |
||||
|
# If you want to enable it, please uncomment the configuration below. |
||||
|
# cors: |
||||
|
# allowed-origins: "*" |
||||
|
# allowed-methods: "*" |
||||
|
# allowed-headers: "*" |
||||
|
# exposed-headers: "Authorization,Link,X-Total-Count" |
||||
|
# allow-credentials: true |
||||
|
# max-age: 1800 |
||||
|
security: |
||||
|
authentication: |
||||
|
jwt: |
||||
|
# This token must be encoded using Base64 and be at least 256 bits long (you can type `openssl rand -base64 64` on your command line to generate a 512 bits one) |
||||
|
base64-secret: NWY1NjJhNmQ1MzdkY2FhZDQ0ZGI5ODVlYTEwZmRjMjdlNDYzYjQ3OTNjN2MxN2NhY2ZjNDg1ODczZDUyM2IwZjBhMDFmYjY2ZTc4MjhjZTVlYmEyNzgwMDI3ZjE4ZTA3NzE4Y2VmOGU1MjRhZDU2MWI4YjExYjM0YjFhNDgyNDg= |
||||
|
# Token is valid 24 hours |
||||
|
token-validity-in-seconds: 86400 |
||||
|
token-validity-in-seconds-for-remember-me: 2592000 |
||||
|
mail: # specific JHipster mail property, for standard properties see MailProperties |
||||
|
base-url: http://127.0.0.1:3006 |
||||
|
metrics: |
||||
|
logs: # Reports metrics in the logs |
||||
|
enabled: false |
||||
|
report-frequency: 60 # in seconds |
||||
|
logging: |
||||
|
use-json-format: false # By default, logs are not in Json format |
||||
|
logstash: # Forward logs to logstash over a socket, used by LoggingConfiguration |
||||
|
enabled: false |
||||
|
host: localhost |
||||
|
port: 5000 |
||||
|
queue-size: 512 |
||||
|
audit-events: |
||||
|
retention-period: 30 # Number of days before audit events are deleted. |
||||
|
|
||||
|
# =================================================================== |
||||
|
# Application specific properties |
||||
|
# Add your own application properties here, see the ApplicationProperties class |
||||
|
# to have type-safe configuration, like in the JHipsterProperties above |
||||
|
# |
||||
|
# More documentation is available at: |
||||
|
# https://www.jhipster.tech/common-application-properties/ |
||||
|
# =================================================================== |
||||
|
|
||||
|
# application: |
@ -0,0 +1,149 @@ |
|||||
|
# =================================================================== |
||||
|
# Spring Boot configuration for the "prod" profile. |
||||
|
# |
||||
|
# This configuration overrides the application.yml file. |
||||
|
# |
||||
|
# More information on profiles: https://www.jhipster.tech/profiles/ |
||||
|
# More information on configuration properties: https://www.jhipster.tech/common-application-properties/ |
||||
|
# =================================================================== |
||||
|
|
||||
|
# =================================================================== |
||||
|
# Standard Spring Boot properties. |
||||
|
# Full reference is available at: |
||||
|
# http://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html |
||||
|
# =================================================================== |
||||
|
|
||||
|
logging: |
||||
|
level: |
||||
|
ROOT: INFO |
||||
|
io.github.jhipster: INFO |
||||
|
com.cm.skills: INFO |
||||
|
|
||||
|
eureka: |
||||
|
instance: |
||||
|
prefer-ip-address: true |
||||
|
client: |
||||
|
service-url: |
||||
|
defaultZone: http://admin:${jhipster.registry.password}@localhost:8761/eureka/ |
||||
|
|
||||
|
management: |
||||
|
metrics: |
||||
|
export: |
||||
|
prometheus: |
||||
|
enabled: false |
||||
|
|
||||
|
spring: |
||||
|
devtools: |
||||
|
restart: |
||||
|
enabled: false |
||||
|
livereload: |
||||
|
enabled: false |
||||
|
datasource: |
||||
|
type: com.zaxxer.hikari.HikariDataSource |
||||
|
url: jdbc:sqlserver://localhost:1433;database=skills |
||||
|
username: SA |
||||
|
password: yourStrong(!)Password |
||||
|
hikari: |
||||
|
poolName: Hikari |
||||
|
auto-commit: false |
||||
|
data-source-properties: |
||||
|
cachePrepStmts: true |
||||
|
prepStmtCacheSize: 250 |
||||
|
prepStmtCacheSqlLimit: 2048 |
||||
|
useServerPrepStmts: true |
||||
|
jpa: |
||||
|
show-sql: false |
||||
|
# Replace by 'prod, faker' to add the faker context and have sample data loaded in production |
||||
|
liquibase: |
||||
|
contexts: prod |
||||
|
mail: |
||||
|
host: localhost |
||||
|
port: 25 |
||||
|
username: |
||||
|
password: |
||||
|
thymeleaf: |
||||
|
cache: true |
||||
|
sleuth: |
||||
|
sampler: |
||||
|
probability: 1 # report 100% of traces |
||||
|
zipkin: # Use the "zipkin" Maven profile to have the Spring Cloud Zipkin dependencies |
||||
|
base-url: http://localhost:9411 |
||||
|
enabled: false |
||||
|
locator: |
||||
|
discovery: |
||||
|
enabled: true |
||||
|
|
||||
|
# =================================================================== |
||||
|
# To enable TLS in production, generate a certificate using: |
||||
|
# keytool -genkey -alias skills -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore keystore.p12 -validity 3650 |
||||
|
# |
||||
|
# You can also use Let's Encrypt: |
||||
|
# https://maximilian-boehm.com/hp2121/Create-a-Java-Keystore-JKS-from-Let-s-Encrypt-Certificates.htm |
||||
|
# |
||||
|
# Then, modify the server.ssl properties so your "server" configuration looks like: |
||||
|
# |
||||
|
# server: |
||||
|
# port: 443 |
||||
|
# ssl: |
||||
|
# key-store: classpath:config/tls/keystore.p12 |
||||
|
# key-store-password: password |
||||
|
# key-store-type: PKCS12 |
||||
|
# key-alias: selfsigned |
||||
|
# # The ciphers suite enforce the security by deactivating some old and deprecated SSL cipher, this list was tested against SSL Labs (https://www.ssllabs.com/ssltest/) |
||||
|
# ciphers: TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 ,TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 ,TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 ,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,TLS_DHE_RSA_WITH_AES_128_CBC_SHA256,TLS_DHE_RSA_WITH_AES_128_CBC_SHA,TLS_DHE_RSA_WITH_AES_256_CBC_SHA256,TLS_DHE_RSA_WITH_AES_256_CBC_SHA,TLS_RSA_WITH_AES_128_GCM_SHA256,TLS_RSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_256_CBC_SHA256,TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA,TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA,TLS_RSA_WITH_CAMELLIA_256_CBC_SHA,TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA,TLS_RSA_WITH_CAMELLIA_128_CBC_SHA |
||||
|
# =================================================================== |
||||
|
server: |
||||
|
port: 3006 |
||||
|
compression: |
||||
|
enabled: true |
||||
|
mime-types: text/html,text/xml,text/plain,text/css, application/javascript, application/json |
||||
|
min-response-size: 1024 |
||||
|
|
||||
|
# =================================================================== |
||||
|
# JHipster specific properties |
||||
|
# |
||||
|
# Full reference is available at: https://www.jhipster.tech/common-application-properties/ |
||||
|
# =================================================================== |
||||
|
|
||||
|
jhipster: |
||||
|
http: |
||||
|
cache: # Used by the CachingHttpHeadersFilter |
||||
|
timeToLiveInDays: 1461 |
||||
|
security: |
||||
|
authentication: |
||||
|
jwt: |
||||
|
# This token must be encoded using Base64 and be at least 256 bits long (you can type `openssl rand -base64 64` on your command line to generate a 512 bits one) |
||||
|
# As this is the PRODUCTION configuration, you MUST change the default key, and store it securely: |
||||
|
# - In the JHipster Registry (which includes a Spring Cloud Config server) |
||||
|
# - In a separate `application-prod.yml` file, in the same folder as your executable JAR file |
||||
|
# - In the `JHIPSTER_SECURITY_AUTHENTICATION_JWT_BASE64_SECRET` environment variable |
||||
|
base64-secret: NWY1NjJhNmQ1MzdkY2FhZDQ0ZGI5ODVlYTEwZmRjMjdlNDYzYjQ3OTNjN2MxN2NhY2ZjNDg1ODczZDUyM2IwZjBhMDFmYjY2ZTc4MjhjZTVlYmEyNzgwMDI3ZjE4ZTA3NzE4Y2VmOGU1MjRhZDU2MWI4YjExYjM0YjFhNDgyNDg= |
||||
|
# Token is valid 24 hours |
||||
|
token-validity-in-seconds: 86400 |
||||
|
token-validity-in-seconds-for-remember-me: 2592000 |
||||
|
mail: # specific JHipster mail property, for standard properties see MailProperties |
||||
|
base-url: http://my-server-url-to-change # Modify according to your server's URL |
||||
|
metrics: |
||||
|
logs: # Reports metrics in the logs |
||||
|
enabled: false |
||||
|
report-frequency: 60 # in seconds |
||||
|
logging: |
||||
|
use-json-format: false # By default, logs are not in Json format |
||||
|
logstash: # Forward logs to logstash over a socket, used by LoggingConfiguration |
||||
|
enabled: false |
||||
|
host: localhost |
||||
|
port: 5000 |
||||
|
queue-size: 512 |
||||
|
audit-events: |
||||
|
retention-period: 30 # Number of days before audit events are deleted. |
||||
|
|
||||
|
# =================================================================== |
||||
|
# Application specific properties |
||||
|
# Add your own application properties here, see the ApplicationProperties class |
||||
|
# to have type-safe configuration, like in the JHipsterProperties above |
||||
|
# |
||||
|
# More documentation is available at: |
||||
|
# https://www.jhipster.tech/common-application-properties/ |
||||
|
# =================================================================== |
||||
|
|
||||
|
# application: |
@ -0,0 +1,19 @@ |
|||||
|
# =================================================================== |
||||
|
# Activate this profile to enable TLS and HTTP/2. |
||||
|
# |
||||
|
# JHipster has generated a self-signed certificate, which will be used to encrypt traffic. |
||||
|
# As your browser will not understand this certificate, you will need to import it. |
||||
|
# |
||||
|
# Another (easiest) solution with Chrome is to enable the "allow-insecure-localhost" flag |
||||
|
# at chrome://flags/#allow-insecure-localhost |
||||
|
# =================================================================== |
||||
|
server: |
||||
|
ssl: |
||||
|
key-store: classpath:config/tls/keystore.p12 |
||||
|
key-store-password: password |
||||
|
key-store-type: PKCS12 |
||||
|
key-alias: selfsigned |
||||
|
ciphers: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384, TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384, TLS_DHE_RSA_WITH_AES_128_GCM_SHA256, TLS_DHE_RSA_WITH_AES_256_GCM_SHA384, TLS_DHE_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_RSA_WITH_AES_256_CBC_SHA, TLS_DHE_RSA_WITH_AES_128_CBC_SHA256, TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 |
||||
|
enabled-protocols: TLSv1.2 |
||||
|
http2: |
||||
|
enabled: true |
@ -0,0 +1,210 @@ |
|||||
|
# =================================================================== |
||||
|
# Spring Boot configuration. |
||||
|
# |
||||
|
# This configuration will be overridden by the Spring profile you use, |
||||
|
# for example application-dev.yml if you use the "dev" profile. |
||||
|
# |
||||
|
# More information on profiles: https://www.jhipster.tech/profiles/ |
||||
|
# More information on configuration properties: https://www.jhipster.tech/common-application-properties/ |
||||
|
# =================================================================== |
||||
|
|
||||
|
# =================================================================== |
||||
|
# Standard Spring Boot properties. |
||||
|
# Full reference is available at: |
||||
|
# http://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html |
||||
|
# =================================================================== |
||||
|
|
||||
|
eureka: |
||||
|
client: |
||||
|
enabled: true |
||||
|
healthcheck: |
||||
|
enabled: true |
||||
|
fetch-registry: true |
||||
|
register-with-eureka: true |
||||
|
instance-info-replication-interval-seconds: 10 |
||||
|
registry-fetch-interval-seconds: 10 |
||||
|
instance: |
||||
|
appname: skills |
||||
|
instanceId: skills:${spring.application.instance-id:${random.value}} |
||||
|
lease-renewal-interval-in-seconds: 5 |
||||
|
lease-expiration-duration-in-seconds: 10 |
||||
|
status-page-url-path: ${management.endpoints.web.base-path}/info |
||||
|
health-check-url-path: ${management.endpoints.web.base-path}/health |
||||
|
metadata-map: |
||||
|
zone: primary # This is needed for the load balancer |
||||
|
profile: ${spring.profiles.active} |
||||
|
version: #project.version# |
||||
|
git-version: ${git.commit.id.describe:} |
||||
|
git-commit: ${git.commit.id.abbrev:} |
||||
|
git-branch: ${git.branch:} |
||||
|
ribbon: |
||||
|
eureka: |
||||
|
enabled: true |
||||
|
feign: |
||||
|
hystrix: |
||||
|
enabled: true |
||||
|
# client: |
||||
|
# config: |
||||
|
# default: |
||||
|
# connectTimeout: 5000 |
||||
|
# readTimeout: 5000 |
||||
|
|
||||
|
# See https://github.com/Netflix/Hystrix/wiki/Configuration |
||||
|
hystrix: |
||||
|
command: |
||||
|
default: |
||||
|
execution: |
||||
|
isolation: |
||||
|
strategy: SEMAPHORE |
||||
|
# See https://github.com/spring-cloud/spring-cloud-netflix/issues/1330 |
||||
|
# thread: |
||||
|
# timeoutInMilliseconds: 10000 |
||||
|
shareSecurityContext: true |
||||
|
|
||||
|
management: |
||||
|
endpoints: |
||||
|
web: |
||||
|
base-path: /management |
||||
|
exposure: |
||||
|
include: ['configprops', 'env', 'health', 'info', 'jhimetrics', 'logfile', 'loggers', 'prometheus', 'threaddump'] |
||||
|
endpoint: |
||||
|
health: |
||||
|
show-details: when_authorized |
||||
|
roles: 'ROLE_ADMIN' |
||||
|
jhimetrics: |
||||
|
enabled: true |
||||
|
info: |
||||
|
git: |
||||
|
mode: full |
||||
|
health: |
||||
|
mail: |
||||
|
enabled: false # When using the MailService, configure an SMTP server and set this to true |
||||
|
metrics: |
||||
|
export: |
||||
|
# Prometheus is the default metrics backend |
||||
|
prometheus: |
||||
|
enabled: true |
||||
|
step: 60 |
||||
|
enable: |
||||
|
http: true |
||||
|
jvm: true |
||||
|
logback: true |
||||
|
process: true |
||||
|
system: true |
||||
|
distribution: |
||||
|
percentiles-histogram: |
||||
|
all: true |
||||
|
percentiles: |
||||
|
all: 0, 0.5, 0.75, 0.95, 0.99, 1.0 |
||||
|
tags: |
||||
|
application: ${spring.application.name} |
||||
|
web: |
||||
|
server: |
||||
|
request: |
||||
|
autotime: |
||||
|
enabled: true |
||||
|
|
||||
|
spring: |
||||
|
application: |
||||
|
name: skills |
||||
|
jmx: |
||||
|
enabled: false |
||||
|
data: |
||||
|
jpa: |
||||
|
repositories: |
||||
|
bootstrap-mode: deferred |
||||
|
jpa: |
||||
|
open-in-view: false |
||||
|
properties: |
||||
|
hibernate.jdbc.time_zone: UTC |
||||
|
hibernate.id.new_generator_mappings: true |
||||
|
hibernate.connection.provider_disables_autocommit: true |
||||
|
hibernate.cache.use_second_level_cache: false |
||||
|
hibernate.cache.use_query_cache: false |
||||
|
hibernate.generate_statistics: false |
||||
|
# modify batch size as necessary |
||||
|
hibernate.jdbc.batch_size: 25 |
||||
|
hibernate.order_inserts: true |
||||
|
hibernate.order_updates: true |
||||
|
# modify fetch size as necessary |
||||
|
hibernate.jdbc.fetch_size: 150 |
||||
|
hibernate.criteria.literal_handling_mode: BIND |
||||
|
hibernate.query.fail_on_pagination_over_collection_fetch: true |
||||
|
hibernate.query.in_clause_parameter_padding: true |
||||
|
hibernate: |
||||
|
ddl-auto: none |
||||
|
naming: |
||||
|
physical-strategy: org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy |
||||
|
implicit-strategy: org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy |
||||
|
messages: |
||||
|
basename: i18n/messages |
||||
|
main: |
||||
|
allow-bean-definition-overriding: true |
||||
|
task: |
||||
|
execution: |
||||
|
thread-name-prefix: skills-task- |
||||
|
pool: |
||||
|
core-size: 2 |
||||
|
max-size: 50 |
||||
|
queue-capacity: 10000 |
||||
|
scheduling: |
||||
|
thread-name-prefix: skills-scheduling- |
||||
|
pool: |
||||
|
size: 2 |
||||
|
thymeleaf: |
||||
|
mode: HTML |
||||
|
output: |
||||
|
ansi: |
||||
|
console-available: true |
||||
|
|
||||
|
server: |
||||
|
servlet: |
||||
|
session: |
||||
|
cookie: |
||||
|
http-only: true |
||||
|
|
||||
|
# Properties to be exposed on the /info management endpoint |
||||
|
info: |
||||
|
# Comma separated list of profiles that will trigger the ribbon to show |
||||
|
display-ribbon-on-profiles: 'dev' |
||||
|
|
||||
|
# =================================================================== |
||||
|
# JHipster specific properties |
||||
|
# |
||||
|
# Full reference is available at: https://www.jhipster.tech/common-application-properties/ |
||||
|
# =================================================================== |
||||
|
|
||||
|
jhipster: |
||||
|
clientApp: |
||||
|
name: 'skillsApp' |
||||
|
# By default CORS is disabled. Uncomment to enable. |
||||
|
# cors: |
||||
|
# allowed-origins: "*" |
||||
|
# allowed-methods: "*" |
||||
|
# allowed-headers: "*" |
||||
|
# exposed-headers: "Authorization,Link,X-Total-Count" |
||||
|
# allow-credentials: true |
||||
|
# max-age: 1800 |
||||
|
mail: |
||||
|
from: skills@localhost |
||||
|
swagger: |
||||
|
default-include-pattern: /api/.* |
||||
|
title: skills API |
||||
|
description: skills API documentation |
||||
|
version: 0.0.1 |
||||
|
terms-of-service-url: |
||||
|
contact-name: |
||||
|
contact-url: |
||||
|
contact-email: |
||||
|
license: unlicensed |
||||
|
license-url: |
||||
|
# =================================================================== |
||||
|
# Application specific properties |
||||
|
# Add your own application properties here, see the ApplicationProperties class |
||||
|
# to have type-safe configuration, like in the JHipsterProperties above |
||||
|
# |
||||
|
# More documentation is available at: |
||||
|
# https://www.jhipster.tech/common-application-properties/ |
||||
|
# =================================================================== |
||||
|
|
||||
|
# application: |
@ -0,0 +1,22 @@ |
|||||
|
# =================================================================== |
||||
|
# Spring Cloud Config bootstrap configuration for the "prod" profile |
||||
|
# =================================================================== |
||||
|
|
||||
|
spring: |
||||
|
cloud: |
||||
|
config: |
||||
|
fail-fast: true |
||||
|
retry: |
||||
|
initial-interval: 1000 |
||||
|
max-interval: 2000 |
||||
|
max-attempts: 100 |
||||
|
uri: http://admin:${jhipster.registry.password}@localhost:8761/config |
||||
|
# name of the config server's property source (file.yml) that we want to use |
||||
|
name: skills |
||||
|
profile: prod # profile(s) of the property source |
||||
|
label: master # toggle to switch to a different version of the configuration as stored in git |
||||
|
# it can be set to any label, branch or commit of the configuration source Git repository |
||||
|
|
||||
|
jhipster: |
||||
|
registry: |
||||
|
password: admin |
@ -0,0 +1,26 @@ |
|||||
|
# =================================================================== |
||||
|
# Spring Cloud Config bootstrap configuration for the "dev" profile |
||||
|
# In prod profile, properties will be overwritten by the ones defined in bootstrap-prod.yml |
||||
|
# =================================================================== |
||||
|
|
||||
|
jhipster: |
||||
|
registry: |
||||
|
password: admin |
||||
|
|
||||
|
spring: |
||||
|
application: |
||||
|
name: skills |
||||
|
profiles: |
||||
|
# The commented value for `active` can be replaced with valid Spring profiles to load. |
||||
|
# Otherwise, it will be filled in by gradle when building the JAR file |
||||
|
# Either way, it can be overridden by `--spring.profiles.active` value passed in the commandline or `-Dspring.profiles.active` set in `JAVA_OPTS` |
||||
|
active: #spring.profiles.active# |
||||
|
cloud: |
||||
|
config: |
||||
|
fail-fast: false # if not in "prod" profile, do not force to use Spring Cloud Config |
||||
|
uri: http://admin:${jhipster.registry.password}@localhost:8761/config |
||||
|
# name of the config server's property source (file.yml) that we want to use |
||||
|
name: skills |
||||
|
profile: dev # profile(s) of the property source |
||||
|
label: master # toggle to switch to a different version of the configuration as stored in git |
||||
|
# it can be set to any label, branch or commit of the configuration source Git repository |
@ -0,0 +1,74 @@ |
|||||
|
<?xml version="1.0" encoding="utf-8"?> |
||||
|
<databaseChangeLog |
||||
|
xmlns="http://www.liquibase.org/xml/ns/dbchangelog" |
||||
|
xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" |
||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
||||
|
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.9.xsd |
||||
|
http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd"> |
||||
|
|
||||
|
<changeSet id="00000000000000" author="jhipster"> |
||||
|
<createSequence sequenceName="sequence_generator" startValue="1050" incrementBy="50"/> |
||||
|
</changeSet> |
||||
|
|
||||
|
<!-- |
||||
|
JHipster core tables. |
||||
|
The initial schema has the '00000000000001' id, so that it is over-written if we re-generate it. |
||||
|
--> |
||||
|
<changeSet id="00000000000001" author="jhipster"> |
||||
|
<createTable tableName="jhi_persistent_audit_event"> |
||||
|
<column name="event_id" type="bigint" > |
||||
|
<constraints primaryKey="true" nullable="false"/> |
||||
|
</column> |
||||
|
<column name="principal" type="varchar(50)"> |
||||
|
<constraints nullable="false" /> |
||||
|
</column> |
||||
|
<column name="event_date" type="timestamp"/> |
||||
|
<column name="event_type" type="varchar(255)"/> |
||||
|
</createTable> |
||||
|
|
||||
|
<createTable tableName="jhi_persistent_audit_evt_data"> |
||||
|
<column name="event_id" type="bigint"> |
||||
|
<constraints nullable="false"/> |
||||
|
</column> |
||||
|
<column name="name" type="varchar(150)"> |
||||
|
<constraints nullable="false"/> |
||||
|
</column> |
||||
|
<column name="value" type="varchar(255)"/> |
||||
|
</createTable> |
||||
|
<addPrimaryKey columnNames="event_id, name" tableName="jhi_persistent_audit_evt_data"/> |
||||
|
|
||||
|
<createIndex indexName="idx_persistent_audit_event" |
||||
|
tableName="jhi_persistent_audit_event" |
||||
|
unique="false"> |
||||
|
<column name="principal" type="varchar(50)"/> |
||||
|
<column name="event_date" type="timestamp"/> |
||||
|
</createIndex> |
||||
|
|
||||
|
<createIndex indexName="idx_persistent_audit_evt_data" |
||||
|
tableName="jhi_persistent_audit_evt_data" |
||||
|
unique="false"> |
||||
|
<column name="event_id" type="bigint"/> |
||||
|
</createIndex> |
||||
|
|
||||
|
<addForeignKeyConstraint baseColumnNames="event_id" |
||||
|
baseTableName="jhi_persistent_audit_evt_data" |
||||
|
constraintName="fk_evt_pers_audit_evt_data" |
||||
|
referencedColumnNames="event_id" |
||||
|
referencedTableName="jhi_persistent_audit_event"/> |
||||
|
</changeSet> |
||||
|
|
||||
|
<changeSet author="jhipster" id="00000000000002" context="test"> |
||||
|
<createTable tableName="jhi_date_time_wrapper"> |
||||
|
<column name="id" type="BIGINT"> |
||||
|
<constraints primaryKey="true" primaryKeyName="jhi_date_time_wrapperPK"/> |
||||
|
</column> |
||||
|
<column name="instant" type="timestamp"/> |
||||
|
<column name="local_date_time" type="timestamp"/> |
||||
|
<column name="offset_date_time" type="timestamp"/> |
||||
|
<column name="zoned_date_time" type="timestamp"/> |
||||
|
<column name="local_time" type="time"/> |
||||
|
<column name="offset_time" type="time"/> |
||||
|
<column name="local_date" type="date"/> |
||||
|
</createTable> |
||||
|
</changeSet> |
||||
|
</databaseChangeLog> |
@ -0,0 +1,57 @@ |
|||||
|
<?xml version="1.0" encoding="utf-8"?> |
||||
|
<databaseChangeLog |
||||
|
xmlns="http://www.liquibase.org/xml/ns/dbchangelog" |
||||
|
xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" |
||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
||||
|
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.9.xsd |
||||
|
http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd"> |
||||
|
|
||||
|
|
||||
|
<!-- |
||||
|
Added the entity Skills. |
||||
|
--> |
||||
|
<changeSet id="20210618132416-1" author="jhipster"> |
||||
|
<createTable tableName="skills"> |
||||
|
<column name="id" type="bigint"> |
||||
|
<constraints primaryKey="true" nullable="false"/> |
||||
|
</column> |
||||
|
<column name="id_formation" type="bigint"> |
||||
|
<constraints nullable="true" /> |
||||
|
</column> |
||||
|
<column name="id_personnel" type="bigint"> |
||||
|
<constraints nullable="true" /> |
||||
|
</column> |
||||
|
<column name="competence" type="varchar(255)"> |
||||
|
<constraints nullable="true" /> |
||||
|
</column> |
||||
|
<!-- jhipster-needle-liquibase-add-column - JHipster will add columns here --> |
||||
|
</createTable> |
||||
|
</changeSet> |
||||
|
|
||||
|
<changeSet id="20210618132416-1-relations" author="jhipster"> |
||||
|
|
||||
|
</changeSet> |
||||
|
<!-- jhipster-needle-liquibase-add-changeset - JHipster will add changesets here --> |
||||
|
|
||||
|
<!-- |
||||
|
Load sample data generated with Faker.js |
||||
|
- This data can be easily edited using a CSV editor (or even MS Excel) and |
||||
|
is located in the 'src/main/resources/config/liquibase/fake-data' directory |
||||
|
- By default this data is applied when running with the JHipster 'dev' profile. |
||||
|
This can be customized by adding or removing 'faker' in the 'spring.liquibase.contexts' |
||||
|
Spring Boot configuration key. |
||||
|
--> |
||||
|
<changeSet id="20210618132416-1-data" author="jhipster" context="faker"> |
||||
|
<loadData |
||||
|
file="config/liquibase/fake-data/skills.csv" |
||||
|
separator=";" |
||||
|
tableName="skills"> |
||||
|
<column name="id" type="numeric"/> |
||||
|
<column name="id_formation" type="numeric"/> |
||||
|
<column name="id_personnel" type="numeric"/> |
||||
|
<column name="competence" type="string"/> |
||||
|
<!-- jhipster-needle-liquibase-add-loadcolumn - JHipster (and/or extensions) can add load columns here --> |
||||
|
</loadData> |
||||
|
</changeSet> |
||||
|
|
||||
|
</databaseChangeLog> |
@ -0,0 +1,11 @@ |
|||||
|
id;id_formation;id_personnel;competence |
||||
|
1;57936;40993;United Kingdom deposit Nevada |
||||
|
2;41642;54756;Licensed Fresh Pants Serbia |
||||
|
3;85178;77165;fuchsia Designer |
||||
|
4;73654;34344;e-services back-end |
||||
|
5;99695;3818;Personal Loan Account quantifying |
||||
|
6;82130;8328;cultivate |
||||
|
7;4991;11624;Facilitator |
||||
|
8;63998;24913;parse Applications |
||||
|
9;34163;17859;Legacy Awesome |
||||
|
10;63636;3448;digital |
@ -0,0 +1,21 @@ |
|||||
|
<?xml version="1.0" encoding="utf-8"?> |
||||
|
<databaseChangeLog |
||||
|
xmlns="http://www.liquibase.org/xml/ns/dbchangelog" |
||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
||||
|
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.9.xsd"> |
||||
|
|
||||
|
<property name="now" value="now()" dbms="h2"/> |
||||
|
<property name="now" value="GETDATE()" dbms="mssql"/> |
||||
|
|
||||
|
<property name="floatType" value="float4" dbms="postgresql, h2"/> |
||||
|
<property name="floatType" value="float" dbms="mysql, oracle, mssql, mariadb"/> |
||||
|
<property name="clobType" value="clob" dbms="h2"/> |
||||
|
<property name="clobType" value="clob" dbms="mysql, oracle, mssql, mariadb, postgresql"/> |
||||
|
<property name="uuidType" value="uuid" dbms="h2, mssql"/> |
||||
|
|
||||
|
<include file="config/liquibase/changelog/00000000000000_initial_schema.xml" relativeToChangelogFile="false"/> |
||||
|
<include file="config/liquibase/changelog/20210618132416_added_entity_Skills.xml" relativeToChangelogFile="false"/> |
||||
|
<!-- jhipster-needle-liquibase-add-changelog - JHipster will add liquibase changelogs here --> |
||||
|
<!-- jhipster-needle-liquibase-add-constraints-changelog - JHipster will add liquibase constraints changelogs here --> |
||||
|
<!-- jhipster-needle-liquibase-add-incremental-changelog - JHipster will add incremental liquibase changelogs here --> |
||||
|
</databaseChangeLog> |
Some files were not shown because too many files changed in this diff
Write
Preview
Loading…
Cancel
Save
Reference in new issue