├── src
├── test
│ ├── features
│ │ ├── gitkeep
│ │ └── user
│ │ │ └── user.feature
│ ├── resources
│ │ ├── i18n
│ │ │ ├── messages_de.properties
│ │ │ └── messages_en.properties
│ │ ├── templates
│ │ │ └── mail
│ │ │ │ └── testEmail.html
│ │ └── config
│ │ │ └── application-testcontainers.yml
│ ├── javascript
│ │ ├── jest.ts
│ │ ├── jest-global-mocks.ts
│ │ └── spec
│ │ │ └── helpers
│ │ │ ├── mock-alert.service.ts
│ │ │ ├── mock-event-manager.service.ts
│ │ │ ├── mock-login-modal.service.ts
│ │ │ ├── mock-language.service.ts
│ │ │ ├── mock-active-modal.service.ts
│ │ │ ├── mock-state-storage.service.ts
│ │ │ └── mock-login.service.ts
│ └── java
│ │ └── com
│ │ └── github
│ │ └── microcatalog
│ │ ├── cucumber
│ │ ├── stepdefs
│ │ │ └── StepDefs.java
│ │ ├── CucumberIT.java
│ │ └── CucumberContextConfiguration.java
│ │ ├── MappersConfig.java
│ │ ├── repository
│ │ └── timezone
│ │ │ └── DateTimeWrapperRepository.java
│ │ ├── config
│ │ ├── WebConfigurerTestController.java
│ │ └── NoOpMailConfiguration.java
│ │ ├── service
│ │ └── custom
│ │ │ ├── GraphOperationsServiceTest.java
│ │ │ └── dto
│ │ │ └── custom
│ │ │ ├── DependencyDtoTest.java
│ │ │ └── MicroserviceDtoTest.java
│ │ ├── utils
│ │ ├── MicroserviceBuilderTest.java
│ │ └── DependencyBuilderTest.java
│ │ ├── MockMvcWithUser.java
│ │ └── domain
│ │ ├── TeamTest.java
│ │ ├── StatusTest.java
│ │ ├── DependencyTest.java
│ │ └── MicroserviceTest.java
└── main
│ ├── webapp
│ ├── i18n
│ │ ├── de
│ │ │ ├── dependency-dashboard.json
│ │ │ ├── configuration.json
│ │ │ ├── logs.json
│ │ │ ├── activate.json
│ │ │ ├── password.json
│ │ │ ├── sessions.json
│ │ │ ├── login.json
│ │ │ ├── error.json
│ │ │ ├── custom-microservice.json
│ │ │ ├── audits.json
│ │ │ ├── health.json
│ │ │ ├── status.json
│ │ │ ├── team.json
│ │ │ ├── home.json
│ │ │ ├── dependency.json
│ │ │ ├── reset.json
│ │ │ ├── microservice.json
│ │ │ ├── register.json
│ │ │ └── user-management.json
│ │ └── en
│ │ │ ├── configuration.json
│ │ │ ├── logs.json
│ │ │ ├── activate.json
│ │ │ ├── password.json
│ │ │ ├── sessions.json
│ │ │ ├── login.json
│ │ │ ├── custom-microservice.json
│ │ │ ├── audits.json
│ │ │ ├── health.json
│ │ │ ├── home.json
│ │ │ ├── status.json
│ │ │ ├── team.json
│ │ │ ├── reset.json
│ │ │ ├── dependency.json
│ │ │ ├── error.json
│ │ │ ├── register.json
│ │ │ ├── user-management.json
│ │ │ └── microservice.json
│ ├── app
│ │ ├── shared
│ │ │ ├── constants
│ │ │ │ ├── pagination.constants.ts
│ │ │ │ ├── authority.constants.ts
│ │ │ │ ├── input.constants.ts
│ │ │ │ └── error.constants.ts
│ │ │ ├── model
│ │ │ │ ├── impact
│ │ │ │ │ └── analysis
│ │ │ │ │ │ ├── group.model.ts
│ │ │ │ │ │ ├── item.model.ts
│ │ │ │ │ │ └── result.model.ts
│ │ │ │ ├── status.model.ts
│ │ │ │ ├── release-group.model.ts
│ │ │ │ ├── team.model.ts
│ │ │ │ ├── release-step.model.ts
│ │ │ │ ├── util
│ │ │ │ │ └── microservice-group-filter.ts
│ │ │ │ ├── release-path.model.ts
│ │ │ │ ├── dependency.model.ts
│ │ │ │ └── microservice.model.ts
│ │ │ ├── alert
│ │ │ │ └── alert-error.model.ts
│ │ │ ├── language
│ │ │ │ └── find-language-from-key.pipe.ts
│ │ │ ├── shared-libs.module.ts
│ │ │ └── util
│ │ │ │ ├── request-util.ts
│ │ │ │ └── datepicker-adapter.ts
│ │ ├── polyfills.ts
│ │ ├── vendor.ts
│ │ ├── layouts
│ │ │ ├── footer
│ │ │ │ ├── footer.component.html
│ │ │ │ └── footer.component.ts
│ │ │ ├── navbar
│ │ │ │ ├── navbar.route.ts
│ │ │ │ └── active-menu.directive.ts
│ │ │ ├── profiles
│ │ │ │ ├── profile-info.model.ts
│ │ │ │ ├── page-ribbon.component.ts
│ │ │ │ └── page-ribbon.scss
│ │ │ ├── main
│ │ │ │ └── main.component.html
│ │ │ └── error
│ │ │ │ ├── error.component.html
│ │ │ │ └── error.route.ts
│ │ ├── dashboard
│ │ │ ├── release-path-dashboard
│ │ │ │ ├── release-graph
│ │ │ │ │ ├── release-graph.component.html
│ │ │ │ │ └── release-graph.module.ts
│ │ │ │ ├── release-path
│ │ │ │ │ ├── release-path.component.html
│ │ │ │ │ └── release-path.module.ts
│ │ │ │ ├── release-path-dashboard.component.html
│ │ │ │ ├── release-path-dashboard.component.ts
│ │ │ │ ├── node-colors.service.ts
│ │ │ │ └── release-path-dashboard.module.ts
│ │ │ ├── impact-analysis
│ │ │ │ ├── impact-analysis-graph
│ │ │ │ │ ├── impact-analysis-graph.component.html
│ │ │ │ │ └── impact-analysis-graph.module.ts
│ │ │ │ ├── impact-analysis-legend
│ │ │ │ │ └── impact-analysis-legend.module.ts
│ │ │ │ ├── impact-analysis-dashboard.module.ts
│ │ │ │ └── impact-analysis-dashboard.component.html
│ │ │ ├── dependency-dashboard
│ │ │ │ ├── node-legend
│ │ │ │ │ ├── edge-legend
│ │ │ │ │ │ └── edge-legend.component.html
│ │ │ │ │ ├── vertex-legend
│ │ │ │ │ │ └── vertex-legend.component.html
│ │ │ │ │ ├── graph-legend.component.html
│ │ │ │ │ ├── coordinates-e2e
│ │ │ │ │ │ ├── coordinates-e2e.component.ts
│ │ │ │ │ │ └── coordinates-e2e.component.html
│ │ │ │ │ ├── graph-legend.component.ts
│ │ │ │ │ └── graph-legend.module.ts
│ │ │ │ ├── dependency-dashboard.route.ts
│ │ │ │ ├── create-dependency-dialog
│ │ │ │ │ └── create-dependency-dialog.module.ts
│ │ │ │ └── dependency-dashboard.module.ts
│ │ │ └── dashboard-routing.module.ts
│ │ ├── core
│ │ │ ├── login
│ │ │ │ ├── login.model.ts
│ │ │ │ ├── login-modal.service.ts
│ │ │ │ └── login.service.ts
│ │ │ ├── user
│ │ │ │ ├── account.model.ts
│ │ │ │ └── user.model.ts
│ │ │ ├── auth
│ │ │ │ ├── csrf.service.ts
│ │ │ │ └── state-storage.service.ts
│ │ │ └── language
│ │ │ │ └── language.constants.ts
│ │ ├── admin
│ │ │ ├── audits
│ │ │ │ ├── audit-data.model.ts
│ │ │ │ ├── audit.model.ts
│ │ │ │ ├── audits.route.ts
│ │ │ │ ├── audits.module.ts
│ │ │ │ └── audits.service.ts
│ │ │ ├── docs
│ │ │ │ ├── docs.component.html
│ │ │ │ ├── docs.scss
│ │ │ │ ├── docs.component.ts
│ │ │ │ ├── docs.route.ts
│ │ │ │ └── docs.module.ts
│ │ │ ├── logs
│ │ │ │ ├── logs.route.ts
│ │ │ │ ├── log.model.ts
│ │ │ │ ├── logs.module.ts
│ │ │ │ └── logs.service.ts
│ │ │ ├── health
│ │ │ │ ├── health.route.ts
│ │ │ │ ├── health.module.ts
│ │ │ │ └── health.service.ts
│ │ │ ├── metrics
│ │ │ │ ├── metrics.route.ts
│ │ │ │ ├── metrics.module.ts
│ │ │ │ └── metrics.service.ts
│ │ │ ├── configuration
│ │ │ │ ├── configuration.route.ts
│ │ │ │ └── configuration.module.ts
│ │ │ └── user-management
│ │ │ │ ├── user-management-detail.component.ts
│ │ │ │ ├── user-management-delete-dialog.component.ts
│ │ │ │ └── user-management.module.ts
│ │ ├── entities
│ │ │ ├── microservice
│ │ │ │ ├── microservice-details
│ │ │ │ │ ├── microservice-custom-details.component.html
│ │ │ │ │ └── microservice-custom-details.module.ts
│ │ │ │ ├── microservice-dashboard
│ │ │ │ │ ├── microservice-card
│ │ │ │ │ │ └── card-settings.model.ts
│ │ │ │ │ ├── microservice-search
│ │ │ │ │ │ ├── microservice-group-filter
│ │ │ │ │ │ │ └── microservice-group-filter.module.ts
│ │ │ │ │ │ ├── microservice-search.module.ts
│ │ │ │ │ │ └── microservice-search.component.html
│ │ │ │ │ ├── microservice-dashboard.component.html
│ │ │ │ │ └── microservice-dashboard.module.ts
│ │ │ │ ├── microservice.module.ts
│ │ │ │ └── microservice-delete-dialog.component.ts
│ │ │ ├── team
│ │ │ │ ├── team-detail.component.ts
│ │ │ │ ├── team.module.ts
│ │ │ │ └── team-delete-dialog.component.ts
│ │ │ ├── status
│ │ │ │ ├── status-detail.component.ts
│ │ │ │ ├── status.module.ts
│ │ │ │ └── status-delete-dialog.component.ts
│ │ │ ├── dependency
│ │ │ │ ├── dependency.module.ts
│ │ │ │ └── dependency-delete-dialog.component.ts
│ │ │ └── entity.module.ts
│ │ ├── home
│ │ │ ├── home.route.ts
│ │ │ ├── home.module.ts
│ │ │ └── home.scss
│ │ ├── blocks
│ │ │ ├── config
│ │ │ │ ├── prod.config.ts
│ │ │ │ └── uib-pagination.config.ts
│ │ │ └── interceptor
│ │ │ │ └── errorhandler.interceptor.ts
│ │ ├── account
│ │ │ ├── activate
│ │ │ │ ├── activate.route.ts
│ │ │ │ ├── activate.service.ts
│ │ │ │ ├── activate.component.html
│ │ │ │ └── activate.component.ts
│ │ │ ├── register
│ │ │ │ ├── register.route.ts
│ │ │ │ └── register.service.ts
│ │ │ ├── password-reset
│ │ │ │ ├── init
│ │ │ │ │ ├── password-reset-init.route.ts
│ │ │ │ │ └── password-reset-init.service.ts
│ │ │ │ └── finish
│ │ │ │ │ ├── password-reset-finish.route.ts
│ │ │ │ │ └── password-reset-finish.service.ts
│ │ │ ├── password
│ │ │ │ ├── password.service.ts
│ │ │ │ ├── password.route.ts
│ │ │ │ └── password-strength-bar.scss
│ │ │ ├── settings
│ │ │ │ └── settings.route.ts
│ │ │ └── account.route.ts
│ │ ├── app.main.ts
│ │ ├── services
│ │ │ └── integration-tests.service.ts
│ │ └── app.constants.ts
│ ├── favicon.ico
│ ├── content
│ │ ├── images
│ │ │ ├── logo-jhipster.png
│ │ │ ├── jhipster_family_member_0_head-192.png
│ │ │ ├── jhipster_family_member_0_head-256.png
│ │ │ ├── jhipster_family_member_0_head-384.png
│ │ │ ├── jhipster_family_member_0_head-512.png
│ │ │ ├── jhipster_family_member_1_head-192.png
│ │ │ ├── jhipster_family_member_1_head-256.png
│ │ │ ├── jhipster_family_member_1_head-384.png
│ │ │ ├── jhipster_family_member_1_head-512.png
│ │ │ ├── jhipster_family_member_2_head-192.png
│ │ │ ├── jhipster_family_member_2_head-256.png
│ │ │ ├── jhipster_family_member_2_head-384.png
│ │ │ ├── jhipster_family_member_2_head-512.png
│ │ │ ├── jhipster_family_member_3_head-192.png
│ │ │ ├── jhipster_family_member_3_head-256.png
│ │ │ ├── jhipster_family_member_3_head-384.png
│ │ │ └── jhipster_family_member_3_head-512.png
│ │ └── scss
│ │ │ ├── _bootstrap-variables.scss
│ │ │ └── vendor.scss
│ ├── swagger-ui
│ │ └── dist
│ │ │ └── images
│ │ │ └── throbber.gif
│ ├── robots.txt
│ ├── WEB-INF
│ │ └── web.xml
│ └── manifest.webapp
│ ├── resources
│ ├── config
│ │ ├── liquibase
│ │ │ ├── data
│ │ │ │ ├── authority.csv
│ │ │ │ ├── user_authority.csv
│ │ │ │ └── user.csv
│ │ │ └── fake-data
│ │ │ │ ├── blob
│ │ │ │ ├── custom-description.txt
│ │ │ │ ├── hipster.png
│ │ │ │ └── hipster.txt
│ │ │ │ ├── team.csv
│ │ │ │ ├── status.csv
│ │ │ │ └── dependency.csv
│ │ ├── bootstrap-heroku.yml
│ │ └── application-heroku.yml
│ ├── .h2.server.properties
│ ├── banner.txt
│ └── i18n
│ │ ├── messages_en.properties
│ │ ├── messages.properties
│ │ └── messages_de.properties
│ ├── k8s
│ ├── namespace.yaml
│ ├── secrets.yaml
│ ├── config-maps.yaml
│ ├── kustomization.yaml
│ ├── storage.yaml
│ └── services.yaml
│ ├── java
│ └── com
│ │ └── github
│ │ └── microcatalog
│ │ ├── domain
│ │ └── package-info.java
│ │ ├── service
│ │ ├── package-info.java
│ │ ├── dto
│ │ │ ├── package-info.java
│ │ │ ├── custom
│ │ │ │ ├── StatusDto.java
│ │ │ │ ├── TeamDto.java
│ │ │ │ ├── MicroserviceDto.java
│ │ │ │ ├── JenkinsCrumbDto.java
│ │ │ │ ├── DependencyDto.java
│ │ │ │ └── requests
│ │ │ │ │ └── CreateDependencyRequest.java
│ │ │ └── PasswordChangeDTO.java
│ │ ├── mapper
│ │ │ ├── package-info.java
│ │ │ ├── TeamMapper.java
│ │ │ ├── StatusMapper.java
│ │ │ ├── DependencyMapper.java
│ │ │ ├── MicroserviceMapper.java
│ │ │ └── FullMicroserviceMapper.java
│ │ ├── InvalidPasswordException.java
│ │ ├── EmailAlreadyUsedException.java
│ │ ├── UsernameAlreadyUsedException.java
│ │ └── custom
│ │ │ └── exceptions
│ │ │ ├── ImportException.java
│ │ │ ├── MicroserviceNotFoundException.java
│ │ │ ├── DuplicateDependencyException.java
│ │ │ ├── SelfCircularException.java
│ │ │ └── CircularDependenciesException.java
│ │ ├── config
│ │ ├── audit
│ │ │ └── package-info.java
│ │ ├── package-info.java
│ │ ├── CSPProperties.java
│ │ ├── Constants.java
│ │ ├── LoggingAspectConfiguration.java
│ │ └── DateTimeFormatConfiguration.java
│ │ ├── web
│ │ └── rest
│ │ │ ├── package-info.java
│ │ │ ├── vm
│ │ │ ├── package-info.java
│ │ │ ├── KeyAndPasswordVM.java
│ │ │ └── ManagedUserVM.java
│ │ │ ├── errors
│ │ │ ├── package-info.java
│ │ │ ├── LoginAlreadyUsedException.java
│ │ │ ├── EmailAlreadyUsedException.java
│ │ │ ├── InvalidPasswordException.java
│ │ │ ├── FieldErrorVM.java
│ │ │ └── ErrorConstants.java
│ │ │ ├── ClientForwardController.java
│ │ │ └── custom
│ │ │ └── IntegrationTestsCustomResource.java
│ │ ├── repository
│ │ ├── package-info.java
│ │ ├── AuthorityRepository.java
│ │ ├── TeamRepository.java
│ │ ├── StatusRepository.java
│ │ ├── DependencyRepository.java
│ │ ├── MicroserviceRepository.java
│ │ └── PersistenceAuditEventRepository.java
│ │ ├── security
│ │ ├── package-info.java
│ │ ├── AuthoritiesConstants.java
│ │ ├── UserNotActivatedException.java
│ │ ├── SpringSecurityAuditorAware.java
│ │ └── jwt
│ │ │ └── JWTConfigurer.java
│ │ ├── utils
│ │ └── MicroserviceBuilder.java
│ │ └── ApplicationWebXml.java
│ ├── scraper
│ └── .repos
│ ├── tf
│ └── startup.sh
│ ├── docker
│ ├── grafana
│ │ └── provisioning
│ │ │ └── dashboards
│ │ │ └── dashboard.yml
│ ├── postgresql.yml
│ └── app.yml
│ └── jib
│ └── entrypoint.sh
├── system.properties
├── .huskyrc
├── postcss.config.js
├── .prettierignore
├── Procfile
├── webpack
└── logo-jhipster.png
├── tsconfig.app.json
├── .lintstagedrc.js
├── .mvn
└── wrapper
│ ├── maven-wrapper.jar
│ └── maven-wrapper.properties
├── cypress.json
├── proxy.conf.json
├── Dockerfile
├── cypress
├── fixtures
│ └── example.json
├── tsconfig.json
├── integration
│ ├── login.ts
│ ├── impact-analysis.ts
│ └── release-path.ts
├── support
│ ├── index.js
│ └── commands.js
└── plugins
│ └── index.js
├── tsconfig.json
├── .eslintignore
├── .prettierrc
├── .editorconfig
├── .eslintrc.json
├── docker-compose.yml
├── tslint.json
├── .jhipster
├── Status.json
└── Team.json
├── microcatalog.jdl
├── tsconfig.base.json
├── angular.json
└── checkstyle.xml
/src/test/features/gitkeep:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/system.properties:
--------------------------------------------------------------------------------
1 | java.runtime.version=11
--------------------------------------------------------------------------------
/.huskyrc:
--------------------------------------------------------------------------------
1 | {
2 | "hooks": {
3 | "pre-commit": "lint-staged"
4 | }
5 | }
6 |
--------------------------------------------------------------------------------
/src/test/resources/i18n/messages_de.properties:
--------------------------------------------------------------------------------
1 | email.test.title=Aktivierung
2 |
--------------------------------------------------------------------------------
/src/main/webapp/i18n/de/dependency-dashboard.json:
--------------------------------------------------------------------------------
1 | {
2 | "microcatalogApp": {}
3 | }
4 |
--------------------------------------------------------------------------------
/src/main/webapp/app/shared/constants/pagination.constants.ts:
--------------------------------------------------------------------------------
1 | export const ITEMS_PER_PAGE = 20;
2 |
--------------------------------------------------------------------------------
/src/test/javascript/jest.ts:
--------------------------------------------------------------------------------
1 | import 'jest-preset-angular';
2 | import './jest-global-mocks';
3 |
--------------------------------------------------------------------------------
/src/main/resources/config/liquibase/data/authority.csv:
--------------------------------------------------------------------------------
1 | name
2 | ROLE_ADMIN
3 | ROLE_USER
4 | ROLE_IMPORT
5 |
--------------------------------------------------------------------------------
/postcss.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | plugins: [
3 | require('autoprefixer')
4 | ]
5 | }
6 |
--------------------------------------------------------------------------------
/.prettierignore:
--------------------------------------------------------------------------------
1 | node_modules
2 | target
3 | build
4 | package-lock.json
5 | .git
6 | .mvn
7 | gradle
8 | .gradle
9 |
--------------------------------------------------------------------------------
/Procfile:
--------------------------------------------------------------------------------
1 | web: java $JAVA_OPTS -Xmx256m -jar target/*.jar --spring.profiles.active=prod,heroku --server.port=$PORT
2 |
--------------------------------------------------------------------------------
/src/main/k8s/namespace.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: v1
2 | kind: Namespace
3 | metadata:
4 | name: microservice-catalog
5 |
--------------------------------------------------------------------------------
/src/main/resources/config/liquibase/fake-data/blob/custom-description.txt:
--------------------------------------------------------------------------------
1 | This is custom old service description
2 |
--------------------------------------------------------------------------------
/src/main/webapp/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tillias/microservice-catalog/HEAD/src/main/webapp/favicon.ico
--------------------------------------------------------------------------------
/webpack/logo-jhipster.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tillias/microservice-catalog/HEAD/webpack/logo-jhipster.png
--------------------------------------------------------------------------------
/tsconfig.app.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "./tsconfig.base.json",
3 | "files": ["src/main/webapp/app/app.main.ts"]
4 | }
5 |
--------------------------------------------------------------------------------
/.lintstagedrc.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | '{,src/**/}*.{json,md,yml,ts,css,scss}': ['prettier --write', 'git add']
3 | };
4 |
--------------------------------------------------------------------------------
/.mvn/wrapper/maven-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tillias/microservice-catalog/HEAD/.mvn/wrapper/maven-wrapper.jar
--------------------------------------------------------------------------------
/cypress.json:
--------------------------------------------------------------------------------
1 | {
2 | "baseUrl": "http://localhost:8080",
3 | "chromeWebSecurity": false,
4 | "projectId": "ge12oz"
5 | }
6 |
--------------------------------------------------------------------------------
/src/main/webapp/app/polyfills.ts:
--------------------------------------------------------------------------------
1 | import 'zone.js/dist/zone';
2 | import '@angular/localize/init';
3 | require('../manifest.webapp');
4 |
--------------------------------------------------------------------------------
/src/main/webapp/app/vendor.ts:
--------------------------------------------------------------------------------
1 | /* after changing this file run 'npm run webpack:build' */
2 | import '../content/scss/vendor.scss';
3 |
--------------------------------------------------------------------------------
/proxy.conf.json:
--------------------------------------------------------------------------------
1 | {
2 | "*": {
3 | "target": "http://localhost:8080",
4 | "secure": false,
5 | "loglevel": "debug"
6 | }
7 | }
8 |
--------------------------------------------------------------------------------
/src/main/webapp/app/shared/constants/authority.constants.ts:
--------------------------------------------------------------------------------
1 | export enum Authority {
2 | ADMIN = 'ROLE_ADMIN',
3 | USER = 'ROLE_USER',
4 | }
5 |
--------------------------------------------------------------------------------
/src/test/javascript/jest-global-mocks.ts:
--------------------------------------------------------------------------------
1 | Object.defineProperty(window, 'getComputedStyle', {
2 | value: () => ['-webkit-appearance'],
3 | });
4 |
--------------------------------------------------------------------------------
/src/main/java/com/github/microcatalog/domain/package-info.java:
--------------------------------------------------------------------------------
1 | /**
2 | * JPA domain objects.
3 | */
4 | package com.github.microcatalog.domain;
5 |
--------------------------------------------------------------------------------
/src/main/java/com/github/microcatalog/service/package-info.java:
--------------------------------------------------------------------------------
1 | /**
2 | * Service layer beans.
3 | */
4 | package com.github.microcatalog.service;
5 |
--------------------------------------------------------------------------------
/src/main/webapp/app/layouts/footer/footer.component.html:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/src/main/webapp/app/dashboard/release-path-dashboard/release-graph/release-graph.component.html:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/src/main/webapp/app/dashboard/release-path-dashboard/release-path/release-path.component.html:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/src/main/webapp/app/shared/constants/input.constants.ts:
--------------------------------------------------------------------------------
1 | export const DATE_FORMAT = 'YYYY-MM-DD';
2 | export const DATE_TIME_FORMAT = 'YYYY-MM-DDTHH:mm';
3 |
--------------------------------------------------------------------------------
/src/main/java/com/github/microcatalog/config/audit/package-info.java:
--------------------------------------------------------------------------------
1 | /**
2 | * Audit specific code.
3 | */
4 | package com.github.microcatalog.config.audit;
5 |
--------------------------------------------------------------------------------
/src/main/java/com/github/microcatalog/service/dto/package-info.java:
--------------------------------------------------------------------------------
1 | /**
2 | * Data Transfer Objects.
3 | */
4 | package com.github.microcatalog.service.dto;
5 |
--------------------------------------------------------------------------------
/src/main/java/com/github/microcatalog/web/rest/package-info.java:
--------------------------------------------------------------------------------
1 | /**
2 | * Spring MVC REST controllers.
3 | */
4 | package com.github.microcatalog.web.rest;
5 |
--------------------------------------------------------------------------------
/src/main/webapp/content/images/logo-jhipster.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tillias/microservice-catalog/HEAD/src/main/webapp/content/images/logo-jhipster.png
--------------------------------------------------------------------------------
/src/test/resources/templates/mail/testEmail.html:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/src/main/java/com/github/microcatalog/config/package-info.java:
--------------------------------------------------------------------------------
1 | /**
2 | * Spring Framework configuration files.
3 | */
4 | package com.github.microcatalog.config;
5 |
--------------------------------------------------------------------------------
/src/main/java/com/github/microcatalog/repository/package-info.java:
--------------------------------------------------------------------------------
1 | /**
2 | * Spring Data JPA repositories.
3 | */
4 | package com.github.microcatalog.repository;
5 |
--------------------------------------------------------------------------------
/src/main/java/com/github/microcatalog/security/package-info.java:
--------------------------------------------------------------------------------
1 | /**
2 | * Spring Security configuration.
3 | */
4 | package com.github.microcatalog.security;
5 |
--------------------------------------------------------------------------------
/src/main/webapp/app/dashboard/impact-analysis/impact-analysis-graph/impact-analysis-graph.component.html:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/src/main/webapp/app/shared/model/impact/analysis/group.model.ts:
--------------------------------------------------------------------------------
1 | import { IItem } from './item.model';
2 |
3 | export interface IGroup {
4 | items: IItem[];
5 | }
6 |
--------------------------------------------------------------------------------
/src/main/webapp/swagger-ui/dist/images/throbber.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tillias/microservice-catalog/HEAD/src/main/webapp/swagger-ui/dist/images/throbber.gif
--------------------------------------------------------------------------------
/src/main/webapp/app/core/login/login.model.ts:
--------------------------------------------------------------------------------
1 | export class Login {
2 | constructor(public username: string, public password: string, public rememberMe: boolean) {}
3 | }
4 |
--------------------------------------------------------------------------------
/src/main/webapp/app/shared/alert/alert-error.model.ts:
--------------------------------------------------------------------------------
1 | export class AlertError {
2 | constructor(public message: string, public key?: string, public params?: any) {}
3 | }
4 |
--------------------------------------------------------------------------------
/src/main/java/com/github/microcatalog/web/rest/vm/package-info.java:
--------------------------------------------------------------------------------
1 | /**
2 | * View Models used by Spring MVC REST controllers.
3 | */
4 | package com.github.microcatalog.web.rest.vm;
5 |
--------------------------------------------------------------------------------
/src/main/resources/config/liquibase/data/user_authority.csv:
--------------------------------------------------------------------------------
1 | user_id;authority_name
2 | 1;ROLE_ADMIN
3 | 1;ROLE_USER
4 | 3;ROLE_ADMIN
5 | 3;ROLE_USER
6 | 4;ROLE_USER
7 | 5;ROLE_IMPORT
8 |
--------------------------------------------------------------------------------
/src/main/resources/config/liquibase/fake-data/blob/hipster.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tillias/microservice-catalog/HEAD/src/main/resources/config/liquibase/fake-data/blob/hipster.png
--------------------------------------------------------------------------------
/src/main/webapp/app/admin/audits/audit-data.model.ts:
--------------------------------------------------------------------------------
1 | export class AuditData {
2 | constructor(public remoteAddress?: string, public sessionId?: string, public message?: string) {}
3 | }
4 |
--------------------------------------------------------------------------------
/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM openjdk:11-jre-slim
2 | ENV APP_ROOT /app
3 | RUN mkdir ${APP_ROOT}
4 | WORKDIR ${APP_ROOT}
5 | COPY target/*.jar ${APP_ROOT}/run.jar
6 | ENTRYPOINT ["java", "-jar", "run.jar"]
7 |
--------------------------------------------------------------------------------
/src/main/webapp/app/admin/docs/docs.component.html:
--------------------------------------------------------------------------------
1 |
3 |
--------------------------------------------------------------------------------
/cypress/fixtures/example.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Using fixtures to represent data",
3 | "email": "hello@cypress.io",
4 | "body": "Fixtures are a great way to mock data for responses to routes"
5 | }
--------------------------------------------------------------------------------
/src/main/webapp/content/images/jhipster_family_member_0_head-192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tillias/microservice-catalog/HEAD/src/main/webapp/content/images/jhipster_family_member_0_head-192.png
--------------------------------------------------------------------------------
/src/main/webapp/content/images/jhipster_family_member_0_head-256.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tillias/microservice-catalog/HEAD/src/main/webapp/content/images/jhipster_family_member_0_head-256.png
--------------------------------------------------------------------------------
/src/main/webapp/content/images/jhipster_family_member_0_head-384.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tillias/microservice-catalog/HEAD/src/main/webapp/content/images/jhipster_family_member_0_head-384.png
--------------------------------------------------------------------------------
/src/main/webapp/content/images/jhipster_family_member_0_head-512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tillias/microservice-catalog/HEAD/src/main/webapp/content/images/jhipster_family_member_0_head-512.png
--------------------------------------------------------------------------------
/src/main/webapp/content/images/jhipster_family_member_1_head-192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tillias/microservice-catalog/HEAD/src/main/webapp/content/images/jhipster_family_member_1_head-192.png
--------------------------------------------------------------------------------
/src/main/webapp/content/images/jhipster_family_member_1_head-256.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tillias/microservice-catalog/HEAD/src/main/webapp/content/images/jhipster_family_member_1_head-256.png
--------------------------------------------------------------------------------
/src/main/webapp/content/images/jhipster_family_member_1_head-384.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tillias/microservice-catalog/HEAD/src/main/webapp/content/images/jhipster_family_member_1_head-384.png
--------------------------------------------------------------------------------
/src/main/webapp/content/images/jhipster_family_member_1_head-512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tillias/microservice-catalog/HEAD/src/main/webapp/content/images/jhipster_family_member_1_head-512.png
--------------------------------------------------------------------------------
/src/main/webapp/content/images/jhipster_family_member_2_head-192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tillias/microservice-catalog/HEAD/src/main/webapp/content/images/jhipster_family_member_2_head-192.png
--------------------------------------------------------------------------------
/src/main/webapp/content/images/jhipster_family_member_2_head-256.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tillias/microservice-catalog/HEAD/src/main/webapp/content/images/jhipster_family_member_2_head-256.png
--------------------------------------------------------------------------------
/src/main/webapp/content/images/jhipster_family_member_2_head-384.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tillias/microservice-catalog/HEAD/src/main/webapp/content/images/jhipster_family_member_2_head-384.png
--------------------------------------------------------------------------------
/src/main/webapp/content/images/jhipster_family_member_2_head-512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tillias/microservice-catalog/HEAD/src/main/webapp/content/images/jhipster_family_member_2_head-512.png
--------------------------------------------------------------------------------
/src/main/webapp/content/images/jhipster_family_member_3_head-192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tillias/microservice-catalog/HEAD/src/main/webapp/content/images/jhipster_family_member_3_head-192.png
--------------------------------------------------------------------------------
/src/main/webapp/content/images/jhipster_family_member_3_head-256.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tillias/microservice-catalog/HEAD/src/main/webapp/content/images/jhipster_family_member_3_head-256.png
--------------------------------------------------------------------------------
/src/main/webapp/content/images/jhipster_family_member_3_head-384.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tillias/microservice-catalog/HEAD/src/main/webapp/content/images/jhipster_family_member_3_head-384.png
--------------------------------------------------------------------------------
/src/main/webapp/content/images/jhipster_family_member_3_head-512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tillias/microservice-catalog/HEAD/src/main/webapp/content/images/jhipster_family_member_3_head-512.png
--------------------------------------------------------------------------------
/src/main/resources/.h2.server.properties:
--------------------------------------------------------------------------------
1 | #H2 Server Properties
2 | 0=JHipster H2 (Memory)|org.h2.Driver|jdbc\:h2\:mem\:microcatalog|microcatalog
3 | webAllowOthers=true
4 | webPort=8082
5 | webSSL=false
6 |
--------------------------------------------------------------------------------
/src/main/resources/config/liquibase/fake-data/blob/hipster.txt:
--------------------------------------------------------------------------------
1 | JHipster is a development platform to generate, develop and deploy Spring Boot + Angular / React / Vue Web applications and Spring microservices.
--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "files": [],
3 | "references": [
4 | {
5 | "path": "./tsconfig.app.json"
6 | },
7 | {
8 | "path": "./tsconfig.e2e.json"
9 | }
10 | ]
11 | }
12 |
--------------------------------------------------------------------------------
/.eslintignore:
--------------------------------------------------------------------------------
1 | node_modules/
2 | src/main/docker/
3 | src/test/javascript/protractor.conf.js
4 | src/test/javascript/jest.conf.js
5 | webpack/
6 | target/
7 | build/
8 | node/
9 | postcss.config.js
10 |
--------------------------------------------------------------------------------
/src/main/k8s/secrets.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: v1
2 | kind: Secret
3 | metadata:
4 | name: postgres-secret
5 | namespace: microservice-catalog
6 | type: Opaque
7 | data:
8 | POSTGRES_PASSWORD: a0V0I3VSNk0=
9 |
--------------------------------------------------------------------------------
/src/main/java/com/github/microcatalog/service/mapper/package-info.java:
--------------------------------------------------------------------------------
1 | /**
2 | * MapStruct mappers for mapping domain objects and Data Transfer Objects.
3 | */
4 | package com.github.microcatalog.service.mapper;
5 |
--------------------------------------------------------------------------------
/src/main/resources/config/liquibase/fake-data/team.csv:
--------------------------------------------------------------------------------
1 | id;name;team_lead;product_owner
2 | 1;Team One;John Doe 1;Max Mustermann 1
3 | 2;Team Two;John Doe 2;Max Mustermann 2
4 | 3;Team Three;John Doe 3;Max Mustermann 3
5 |
--------------------------------------------------------------------------------
/src/main/webapp/app/admin/docs/docs.scss:
--------------------------------------------------------------------------------
1 | @import '~bootstrap/scss/functions';
2 | @import '~bootswatch/dist/solar/variables';
3 | @import '~bootstrap/scss/variables';
4 |
5 | iframe {
6 | background: white;
7 | }
8 |
--------------------------------------------------------------------------------
/src/main/webapp/app/shared/model/impact/analysis/item.model.ts:
--------------------------------------------------------------------------------
1 | import { IMicroservice } from '../../microservice.model';
2 |
3 | export interface IItem {
4 | target: IMicroservice;
5 | siblings: IMicroservice[];
6 | }
7 |
--------------------------------------------------------------------------------
/src/main/resources/config/liquibase/fake-data/status.csv:
--------------------------------------------------------------------------------
1 | id;name;description
2 | 1;Released;Some description here
3 | 2;In Progress;Some description here
4 | 3;Deprecated;Some description here
5 | 4;Draft;Some description here
6 |
--------------------------------------------------------------------------------
/src/test/features/user/user.feature:
--------------------------------------------------------------------------------
1 | Feature: User management
2 |
3 | Scenario: Retrieve administrator user
4 | When I search user 'admin'
5 | Then the user is found
6 | And his last name is 'Administrator'
7 |
--------------------------------------------------------------------------------
/src/main/webapp/app/layouts/footer/footer.component.ts:
--------------------------------------------------------------------------------
1 | import { Component } from '@angular/core';
2 |
3 | @Component({
4 | selector: 'jhi-footer',
5 | templateUrl: './footer.component.html',
6 | })
7 | export class FooterComponent {}
8 |
--------------------------------------------------------------------------------
/.prettierrc:
--------------------------------------------------------------------------------
1 | # Prettier configuration
2 |
3 | printWidth: 140
4 | singleQuote: true
5 | tabWidth: 2
6 | useTabs: false
7 |
8 | # js and ts rules:
9 | arrowParens: avoid
10 |
11 | # jsx and tsx rules:
12 | jsxBracketSameLine: false
13 |
--------------------------------------------------------------------------------
/src/main/java/com/github/microcatalog/service/dto/custom/StatusDto.java:
--------------------------------------------------------------------------------
1 | package com.github.microcatalog.service.dto.custom;
2 |
3 | import java.io.Serializable;
4 |
5 | public class StatusDto extends BaseDto implements Serializable {
6 | }
7 |
--------------------------------------------------------------------------------
/src/main/webapp/app/admin/audits/audit.model.ts:
--------------------------------------------------------------------------------
1 | import { AuditData } from './audit-data.model';
2 |
3 | export class Audit {
4 | constructor(public data: AuditData, public principal: string, public timestamp: string, public type: string) {}
5 | }
6 |
--------------------------------------------------------------------------------
/src/test/resources/i18n/messages_en.properties:
--------------------------------------------------------------------------------
1 | email.test.title=test title
2 | # Value used for English locale unit test in MailServiceIT
3 | # as this file is loaded instead of real file
4 | email.activation.title=microcatalog account activation
5 |
--------------------------------------------------------------------------------
/.mvn/wrapper/maven-wrapper.properties:
--------------------------------------------------------------------------------
1 | distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.3/apache-maven-3.6.3-bin.zip
2 | wrapperUrl=https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar
3 |
--------------------------------------------------------------------------------
/src/main/webapp/app/admin/docs/docs.component.ts:
--------------------------------------------------------------------------------
1 | import { Component } from '@angular/core';
2 |
3 | @Component({
4 | selector: 'jhi-docs',
5 | templateUrl: './docs.component.html',
6 | styleUrls: ['docs.scss'],
7 | })
8 | export class DocsComponent {}
9 |
--------------------------------------------------------------------------------
/src/main/webapp/app/entities/microservice/microservice-details/microservice-custom-details.component.html:
--------------------------------------------------------------------------------
1 | microservice-details works!
2 | Microservice {{ microservice?.id }}
3 |
--------------------------------------------------------------------------------
/src/main/webapp/i18n/en/configuration.json:
--------------------------------------------------------------------------------
1 | {
2 | "configuration": {
3 | "title": "Configuration",
4 | "filter": "Filter (by prefix)",
5 | "table": {
6 | "prefix": "Prefix",
7 | "properties": "Properties"
8 | }
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/src/main/webapp/i18n/de/configuration.json:
--------------------------------------------------------------------------------
1 | {
2 | "configuration": {
3 | "title": "Konfiguration",
4 | "filter": "Filter (nach Präfix)",
5 | "table": {
6 | "prefix": "Präfix",
7 | "properties": "Eigenschaften"
8 | }
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/src/main/webapp/i18n/en/logs.json:
--------------------------------------------------------------------------------
1 | {
2 | "logs": {
3 | "title": "Logs",
4 | "nbloggers": "There are {{ total }} loggers.",
5 | "filter": "Filter",
6 | "table": {
7 | "name": "Name",
8 | "level": "Level"
9 | }
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/src/main/resources/config/bootstrap-heroku.yml:
--------------------------------------------------------------------------------
1 | # ===================================================================
2 | # Spring Cloud Config bootstrap configuration for the "heroku" profile
3 | # ===================================================================
4 |
5 |
--------------------------------------------------------------------------------
/src/main/scraper/.repos:
--------------------------------------------------------------------------------
1 | https://jsonblob.com/api/jsonBlob/e2245880-57d7-11eb-ab2d-25870e147ce6
2 | https://jsonblob.com/api/jsonBlob/fd2bae20-57d9-11eb-ab2d-871b15be5575
3 | https://github.com/repo1/blob/master/.microservice
4 | https://github.com/repo2/blob/master/.microservice
5 |
--------------------------------------------------------------------------------
/src/main/webapp/i18n/de/logs.json:
--------------------------------------------------------------------------------
1 | {
2 | "logs": {
3 | "title": "Protokolle",
4 | "nbloggers": "Es existieren {{ total }} Logger.",
5 | "filter": "Filter",
6 | "table": {
7 | "name": "Name",
8 | "level": "Stufe"
9 | }
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/src/main/java/com/github/microcatalog/web/rest/errors/package-info.java:
--------------------------------------------------------------------------------
1 | /**
2 | * Specific errors used with Zalando's "problem-spring-web" library.
3 | *
4 | * More information on https://github.com/zalando/problem-spring-web
5 | */
6 | package com.github.microcatalog.web.rest.errors;
7 |
--------------------------------------------------------------------------------
/src/main/webapp/app/layouts/navbar/navbar.route.ts:
--------------------------------------------------------------------------------
1 | import { Route } from '@angular/router';
2 |
3 | import { NavbarComponent } from './navbar.component';
4 |
5 | export const navbarRoute: Route = {
6 | path: '',
7 | component: NavbarComponent,
8 | outlet: 'navbar',
9 | };
10 |
--------------------------------------------------------------------------------
/src/main/webapp/app/shared/constants/error.constants.ts:
--------------------------------------------------------------------------------
1 | export const PROBLEM_BASE_URL = 'https://www.jhipster.tech/problem';
2 | export const EMAIL_ALREADY_USED_TYPE = PROBLEM_BASE_URL + '/email-already-used';
3 | export const LOGIN_ALREADY_USED_TYPE = PROBLEM_BASE_URL + '/login-already-used';
4 |
--------------------------------------------------------------------------------
/src/test/java/com/github/microcatalog/cucumber/stepdefs/StepDefs.java:
--------------------------------------------------------------------------------
1 | package com.github.microcatalog.cucumber.stepdefs;
2 |
3 | import org.springframework.test.web.servlet.ResultActions;
4 |
5 | public abstract class StepDefs {
6 |
7 | protected ResultActions actions;
8 |
9 | }
10 |
--------------------------------------------------------------------------------
/src/main/k8s/config-maps.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: v1
2 | kind: ConfigMap
3 | metadata:
4 | name: postgres-config
5 | namespace: microservice-catalog
6 | data:
7 | PGDATA: /var/lib/postgresql/data/pgdata
8 | POSTGRES_USER: microservice-catalog
9 | POSTGRES_DB: microservice-catalog
10 |
--------------------------------------------------------------------------------
/src/main/tf/startup.sh:
--------------------------------------------------------------------------------
1 | #! /bin/bash
2 |
3 | cd /tmp
4 | git clone https://github.com/tillias/microservice-catalog.git
5 | cd microservice-catalog
6 | docker run --rm \
7 | -v /var/run/docker.sock:/var/run/docker.sock \
8 | -v "$PWD:$PWD" \
9 | -w="$PWD" \
10 | docker/compose up
11 |
--------------------------------------------------------------------------------
/src/main/webapp/app/shared/model/status.model.ts:
--------------------------------------------------------------------------------
1 | export interface IStatus {
2 | id?: number;
3 | name?: string;
4 | description?: string;
5 | }
6 |
7 | export class Status implements IStatus {
8 | constructor(public id?: number, public name?: string, public description?: string) {}
9 | }
10 |
--------------------------------------------------------------------------------
/src/main/docker/grafana/provisioning/dashboards/dashboard.yml:
--------------------------------------------------------------------------------
1 | apiVersion: 1
2 |
3 | providers:
4 | - name: 'Prometheus'
5 | orgId: 1
6 | folder: ''
7 | type: file
8 | disableDeletion: false
9 | editable: true
10 | options:
11 | path: /etc/grafana/provisioning/dashboards
12 |
--------------------------------------------------------------------------------
/src/main/webapp/app/admin/logs/logs.route.ts:
--------------------------------------------------------------------------------
1 | import { Route } from '@angular/router';
2 |
3 | import { LogsComponent } from './logs.component';
4 |
5 | export const logsRoute: Route = {
6 | path: '',
7 | component: LogsComponent,
8 | data: {
9 | pageTitle: 'logs.title',
10 | },
11 | };
12 |
--------------------------------------------------------------------------------
/src/main/java/com/github/microcatalog/service/dto/custom/TeamDto.java:
--------------------------------------------------------------------------------
1 | package com.github.microcatalog.service.dto.custom;
2 |
3 | import java.io.Serializable;
4 |
5 | public final class TeamDto extends BaseDto implements Serializable {
6 | private static final long serialVersionUID = 7604902444444032842L;
7 | }
8 |
--------------------------------------------------------------------------------
/src/main/webapp/robots.txt:
--------------------------------------------------------------------------------
1 | # robotstxt.org/
2 |
3 | User-agent: *
4 | Disallow: /api/account
5 | Disallow: /api/account/change-password
6 | Disallow: /api/account/sessions
7 | Disallow: /api/audits/
8 | Disallow: /api/logs/
9 | Disallow: /api/users/
10 | Disallow: /management/
11 | Disallow: /v2/api-docs/
12 |
--------------------------------------------------------------------------------
/src/main/jib/entrypoint.sh:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 |
3 | echo "The application will start in ${JHIPSTER_SLEEP}s..." && sleep ${JHIPSTER_SLEEP}
4 | exec java ${JAVA_OPTS} -noverify -XX:+AlwaysPreTouch -Djava.security.egd=file:/dev/./urandom -cp /app/resources/:/app/classes/:/app/libs/* "com.github.microcatalog.MicrocatalogApp" "$@"
5 |
--------------------------------------------------------------------------------
/src/main/webapp/app/admin/health/health.route.ts:
--------------------------------------------------------------------------------
1 | import { Route } from '@angular/router';
2 |
3 | import { HealthComponent } from './health.component';
4 |
5 | export const healthRoute: Route = {
6 | path: '',
7 | component: HealthComponent,
8 | data: {
9 | pageTitle: 'health.title',
10 | },
11 | };
12 |
--------------------------------------------------------------------------------
/src/main/docker/postgresql.yml:
--------------------------------------------------------------------------------
1 | version: '3.1'
2 | services:
3 | db:
4 | image: postgres
5 | restart: always
6 | ports:
7 | - 5432:5432
8 | environment:
9 | POSTGRES_PASSWORD: kEt#uR6M
10 | adminer:
11 | image: adminer
12 | restart: always
13 | ports:
14 | - 9080:8080
15 |
--------------------------------------------------------------------------------
/src/main/webapp/app/admin/docs/docs.route.ts:
--------------------------------------------------------------------------------
1 | import { Route } from '@angular/router';
2 |
3 | import { DocsComponent } from './docs.component';
4 |
5 | export const docsRoute: Route = {
6 | path: '',
7 | component: DocsComponent,
8 | data: {
9 | pageTitle: 'global.menu.admin.apidocs',
10 | },
11 | };
12 |
--------------------------------------------------------------------------------
/src/main/webapp/app/admin/metrics/metrics.route.ts:
--------------------------------------------------------------------------------
1 | import { Route } from '@angular/router';
2 |
3 | import { MetricsComponent } from './metrics.component';
4 |
5 | export const metricsRoute: Route = {
6 | path: '',
7 | component: MetricsComponent,
8 | data: {
9 | pageTitle: 'metrics.title',
10 | },
11 | };
12 |
--------------------------------------------------------------------------------
/src/main/webapp/app/home/home.route.ts:
--------------------------------------------------------------------------------
1 | import { Route } from '@angular/router';
2 |
3 | import { HomeComponent } from './home.component';
4 |
5 | export const HOME_ROUTE: Route = {
6 | path: '',
7 | component: HomeComponent,
8 | data: {
9 | authorities: [],
10 | pageTitle: 'home.title',
11 | },
12 | };
13 |
--------------------------------------------------------------------------------
/src/main/webapp/app/shared/model/release-group.model.ts:
--------------------------------------------------------------------------------
1 | import { IReleaseStep } from 'app/shared/model/release-step.model';
2 |
3 | export interface IReleaseGroup {
4 | steps?: IReleaseStep[];
5 | }
6 |
7 | export class ReleaseGroup implements IReleaseGroup {
8 | constructor(public steps?: IReleaseStep[]) {}
9 | }
10 |
--------------------------------------------------------------------------------
/src/main/k8s/kustomization.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: kustomize.config.k8s.io/v1beta1
2 | kind: Kustomization
3 |
4 | resources:
5 | - namespace.yaml
6 | - secrets.yaml
7 | - config-maps.yaml
8 | - storage.yaml
9 | - services.yaml
10 | - database-deployment.yaml
11 | - microservice-catalog-deployment.yaml
12 |
--------------------------------------------------------------------------------
/src/main/webapp/app/dashboard/dependency-dashboard/node-legend/edge-legend/edge-legend.component.html:
--------------------------------------------------------------------------------
1 |
2 |
Selected dependencies:
3 |
4 |
9 |
--------------------------------------------------------------------------------
/src/main/webapp/app/dashboard/dependency-dashboard/node-legend/vertex-legend/vertex-legend.component.html:
--------------------------------------------------------------------------------
1 |
2 |
Selected microservices:
3 |
4 |
9 |
--------------------------------------------------------------------------------
/src/main/webapp/content/scss/_bootstrap-variables.scss:
--------------------------------------------------------------------------------
1 | /*
2 | * Bootstrap overrides https://getbootstrap.com/docs/4.0/getting-started/theming/
3 | * All values defined in bootstrap source
4 | * https://github.com/twbs/bootstrap/blob/v4-dev/scss/_variables.scss can be overwritten here
5 | * Make sure not to add !default to values here
6 | */
7 |
--------------------------------------------------------------------------------
/src/main/webapp/app/blocks/config/prod.config.ts:
--------------------------------------------------------------------------------
1 | import { enableProdMode } from '@angular/core';
2 | import { DEBUG_INFO_ENABLED } from 'app/app.constants';
3 |
4 | export function ProdConfig(): void {
5 | // disable debug data on prod profile to improve performance
6 | if (!DEBUG_INFO_ENABLED) {
7 | enableProdMode();
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/src/main/webapp/app/dashboard/release-path-dashboard/release-path-dashboard.component.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
Release path
4 |
5 |
6 |
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/src/main/webapp/app/shared/model/team.model.ts:
--------------------------------------------------------------------------------
1 | export interface ITeam {
2 | id?: number;
3 | name?: string;
4 | teamLead?: string;
5 | productOwner?: string;
6 | }
7 |
8 | export class Team implements ITeam {
9 | constructor(public id?: number, public name?: string, public teamLead?: string, public productOwner?: string) {}
10 | }
11 |
--------------------------------------------------------------------------------
/src/main/webapp/i18n/en/activate.json:
--------------------------------------------------------------------------------
1 | {
2 | "activate": {
3 | "title": "Activation",
4 | "messages": {
5 | "success": "Your user account has been activated. Please ",
6 | "error": "Your user could not be activated. Please use the registration form to sign up."
7 | }
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/src/main/k8s/storage.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: v1
2 | kind: PersistentVolumeClaim
3 | metadata:
4 | name: postgres-pv-claim
5 | namespace: microservice-catalog
6 | labels:
7 | app: microservice-catalog
8 | spec:
9 | accessModes:
10 | - ReadWriteOnce
11 | resources:
12 | requests:
13 | storage: 50M
14 |
--------------------------------------------------------------------------------
/src/main/webapp/app/admin/audits/audits.route.ts:
--------------------------------------------------------------------------------
1 | import { Route } from '@angular/router';
2 |
3 | import { AuditsComponent } from './audits.component';
4 |
5 | export const auditsRoute: Route = {
6 | path: '',
7 | component: AuditsComponent,
8 | data: {
9 | pageTitle: 'audits.title',
10 | defaultSort: 'auditEventDate,desc',
11 | },
12 | };
13 |
--------------------------------------------------------------------------------
/src/main/webapp/app/dashboard/dependency-dashboard/dependency-dashboard.route.ts:
--------------------------------------------------------------------------------
1 | import { Routes } from '@angular/router';
2 | import { DependencyDashboardComponent } from './dependency-dashboard.component';
3 |
4 | export const dependencyDashboardRoute: Routes = [
5 | {
6 | path: '',
7 | component: DependencyDashboardComponent,
8 | },
9 | ];
10 |
--------------------------------------------------------------------------------
/src/test/java/com/github/microcatalog/MappersConfig.java:
--------------------------------------------------------------------------------
1 | package com.github.microcatalog;
2 |
3 | import org.springframework.boot.test.context.TestConfiguration;
4 | import org.springframework.context.annotation.ComponentScan;
5 |
6 | @TestConfiguration
7 | @ComponentScan("com.github.microcatalog.service.mapper")
8 | public class MappersConfig {
9 | }
10 |
--------------------------------------------------------------------------------
/src/main/webapp/app/account/activate/activate.route.ts:
--------------------------------------------------------------------------------
1 | import { Route } from '@angular/router';
2 |
3 | import { ActivateComponent } from './activate.component';
4 |
5 | export const activateRoute: Route = {
6 | path: 'activate',
7 | component: ActivateComponent,
8 | data: {
9 | authorities: [],
10 | pageTitle: 'activate.title',
11 | },
12 | };
13 |
--------------------------------------------------------------------------------
/src/main/webapp/app/account/register/register.route.ts:
--------------------------------------------------------------------------------
1 | import { Route } from '@angular/router';
2 |
3 | import { RegisterComponent } from './register.component';
4 |
5 | export const registerRoute: Route = {
6 | path: 'register',
7 | component: RegisterComponent,
8 | data: {
9 | authorities: [],
10 | pageTitle: 'register.title',
11 | },
12 | };
13 |
--------------------------------------------------------------------------------
/src/main/webapp/app/admin/configuration/configuration.route.ts:
--------------------------------------------------------------------------------
1 | import { Route } from '@angular/router';
2 |
3 | import { ConfigurationComponent } from './configuration.component';
4 |
5 | export const configurationRoute: Route = {
6 | path: '',
7 | component: ConfigurationComponent,
8 | data: {
9 | pageTitle: 'configuration.title',
10 | },
11 | };
12 |
--------------------------------------------------------------------------------
/src/main/java/com/github/microcatalog/service/InvalidPasswordException.java:
--------------------------------------------------------------------------------
1 | package com.github.microcatalog.service;
2 |
3 | public class InvalidPasswordException extends RuntimeException {
4 |
5 | private static final long serialVersionUID = 1L;
6 |
7 | public InvalidPasswordException() {
8 | super("Incorrect password");
9 | }
10 |
11 | }
12 |
--------------------------------------------------------------------------------
/src/main/webapp/i18n/de/activate.json:
--------------------------------------------------------------------------------
1 | {
2 | "activate": {
3 | "title": "Aktivierung",
4 | "messages": {
5 | "success": "Ihr Benutzer wurde aktiviert. Bitte ",
6 | "error": "Ihr Benutzer konnte nicht aktiviert werden. Bitte benutzen Sie die Registrierungsmaske, um sich zu registrieren."
7 | }
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/src/main/java/com/github/microcatalog/service/EmailAlreadyUsedException.java:
--------------------------------------------------------------------------------
1 | package com.github.microcatalog.service;
2 |
3 | public class EmailAlreadyUsedException extends RuntimeException {
4 |
5 | private static final long serialVersionUID = 1L;
6 |
7 | public EmailAlreadyUsedException() {
8 | super("Email is already in use!");
9 | }
10 |
11 | }
12 |
--------------------------------------------------------------------------------
/src/main/webapp/app/core/user/account.model.ts:
--------------------------------------------------------------------------------
1 | export class Account {
2 | constructor(
3 | public activated: boolean,
4 | public authorities: string[],
5 | public email: string,
6 | public firstName: string,
7 | public langKey: string,
8 | public lastName: string,
9 | public login: string,
10 | public imageUrl: string
11 | ) {}
12 | }
13 |
--------------------------------------------------------------------------------
/src/main/java/com/github/microcatalog/service/UsernameAlreadyUsedException.java:
--------------------------------------------------------------------------------
1 | package com.github.microcatalog.service;
2 |
3 | public class UsernameAlreadyUsedException extends RuntimeException {
4 |
5 | private static final long serialVersionUID = 1L;
6 |
7 | public UsernameAlreadyUsedException() {
8 | super("Login name already used!");
9 | }
10 |
11 | }
12 |
--------------------------------------------------------------------------------
/src/main/webapp/i18n/en/password.json:
--------------------------------------------------------------------------------
1 | {
2 | "password": {
3 | "title": "Password for [{{username}}]",
4 | "form": {
5 | "button": "Save"
6 | },
7 | "messages": {
8 | "error": "An error has occurred! The password could not be changed.",
9 | "success": "Password changed!"
10 | }
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/src/main/java/com/github/microcatalog/service/mapper/TeamMapper.java:
--------------------------------------------------------------------------------
1 | package com.github.microcatalog.service.mapper;
2 |
3 | import com.github.microcatalog.domain.Team;
4 | import com.github.microcatalog.service.dto.custom.TeamDto;
5 | import org.mapstruct.Mapper;
6 |
7 | @Mapper(componentModel = "spring")
8 | public interface TeamMapper {
9 | TeamDto teamToDto(Team team);
10 | }
11 |
--------------------------------------------------------------------------------
/src/test/javascript/spec/helpers/mock-alert.service.ts:
--------------------------------------------------------------------------------
1 | import { JhiAlertService, JhiAlert } from 'ng-jhipster';
2 |
3 | import { SpyObject } from './spyobject';
4 |
5 | export class MockAlertService extends SpyObject {
6 | constructor() {
7 | super(JhiAlertService);
8 | }
9 |
10 | addAlert(alertOptions: JhiAlert): JhiAlert {
11 | return alertOptions;
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/src/main/webapp/app/core/auth/csrf.service.ts:
--------------------------------------------------------------------------------
1 | import { Injectable } from '@angular/core';
2 | import { CookieService } from 'ngx-cookie-service';
3 |
4 | @Injectable({ providedIn: 'root' })
5 | export class CSRFService {
6 | constructor(private cookieService: CookieService) {}
7 |
8 | getCSRF(name = 'XSRF-TOKEN'): string {
9 | return this.cookieService.get(name);
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/src/test/java/com/github/microcatalog/cucumber/CucumberIT.java:
--------------------------------------------------------------------------------
1 | package com.github.microcatalog.cucumber;
2 |
3 | import org.junit.runner.RunWith;
4 |
5 | import io.cucumber.junit.CucumberOptions;
6 | import io.cucumber.junit.Cucumber;
7 |
8 | @RunWith(Cucumber.class)
9 | @CucumberOptions(plugin = "pretty", features = "src/test/features")
10 |
11 | public class CucumberIT {
12 |
13 | }
14 |
--------------------------------------------------------------------------------
/src/main/java/com/github/microcatalog/service/mapper/StatusMapper.java:
--------------------------------------------------------------------------------
1 | package com.github.microcatalog.service.mapper;
2 |
3 | import com.github.microcatalog.domain.Status;
4 | import com.github.microcatalog.service.dto.custom.StatusDto;
5 | import org.mapstruct.Mapper;
6 |
7 | @Mapper(componentModel = "spring")
8 | public interface StatusMapper {
9 | StatusDto statusToDto(Status status);
10 | }
11 |
--------------------------------------------------------------------------------
/src/main/webapp/app/dashboard/release-path-dashboard/release-path-dashboard.component.ts:
--------------------------------------------------------------------------------
1 | import { Component, OnInit } from '@angular/core';
2 |
3 | @Component({
4 | selector: 'jhi-release-path-dashboard',
5 | templateUrl: './release-path-dashboard.component.html',
6 | })
7 | export class ReleasePathDashboardComponent implements OnInit {
8 | constructor() {}
9 |
10 | ngOnInit(): void {}
11 | }
12 |
--------------------------------------------------------------------------------
/src/main/webapp/app/shared/model/release-step.model.ts:
--------------------------------------------------------------------------------
1 | import { IMicroservice } from 'app/shared/model/microservice.model';
2 |
3 | export interface IReleaseStep {
4 | workItem?: IMicroservice;
5 | parentWorkItems?: IMicroservice[];
6 | }
7 |
8 | export class ReleaseStep implements IReleaseStep {
9 | constructor(public workItem?: IMicroservice, public parentWorkItems?: IMicroservice[]) {}
10 | }
11 |
--------------------------------------------------------------------------------
/src/main/webapp/i18n/de/password.json:
--------------------------------------------------------------------------------
1 | {
2 | "password": {
3 | "title": "Passwort für [{{username}}]",
4 | "form": {
5 | "button": "Speichern"
6 | },
7 | "messages": {
8 | "error": "Es ist ein Fehler aufgetreten! Das Passwort konnte nicht geändert werden.",
9 | "success": "Passwort wurde geändert!"
10 | }
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/src/test/javascript/spec/helpers/mock-event-manager.service.ts:
--------------------------------------------------------------------------------
1 | import Spy = jasmine.Spy;
2 | import { JhiEventManager } from 'ng-jhipster';
3 |
4 | import { SpyObject } from './spyobject';
5 |
6 | export class MockEventManager extends SpyObject {
7 | broadcastSpy: Spy;
8 |
9 | constructor() {
10 | super(JhiEventManager);
11 | this.broadcastSpy = this.spy('broadcast').andReturn(this);
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/src/test/javascript/spec/helpers/mock-login-modal.service.ts:
--------------------------------------------------------------------------------
1 | import Spy = jasmine.Spy;
2 |
3 | import { SpyObject } from './spyobject';
4 | import { LoginModalService } from 'app/core/login/login-modal.service';
5 |
6 | export class MockLoginModalService extends SpyObject {
7 | open: Spy;
8 |
9 | constructor() {
10 | super(LoginModalService);
11 |
12 | this.open = this.spy('open');
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/src/main/java/com/github/microcatalog/repository/AuthorityRepository.java:
--------------------------------------------------------------------------------
1 | package com.github.microcatalog.repository;
2 |
3 | import com.github.microcatalog.domain.Authority;
4 |
5 | import org.springframework.data.jpa.repository.JpaRepository;
6 |
7 | /**
8 | * Spring Data JPA repository for the {@link Authority} entity.
9 | */
10 | public interface AuthorityRepository extends JpaRepository {
11 | }
12 |
--------------------------------------------------------------------------------
/src/main/webapp/app/core/language/language.constants.ts:
--------------------------------------------------------------------------------
1 | /*
2 | Languages codes are ISO_639-1 codes, see http://en.wikipedia.org/wiki/List_of_ISO_639-1_codes
3 | They are written in English to avoid character encoding issues (not a perfect solution)
4 | */
5 | export const LANGUAGES: string[] = [
6 | 'en',
7 | 'de',
8 | // jhipster-needle-i18n-language-constant - JHipster will add/remove languages in this array
9 | ];
10 |
--------------------------------------------------------------------------------
/src/main/java/com/github/microcatalog/service/mapper/DependencyMapper.java:
--------------------------------------------------------------------------------
1 | package com.github.microcatalog.service.mapper;
2 |
3 | import com.github.microcatalog.domain.Dependency;
4 | import com.github.microcatalog.service.dto.custom.DependencyDto;
5 | import org.mapstruct.Mapper;
6 |
7 | @Mapper(componentModel = "spring")
8 | public interface DependencyMapper {
9 | DependencyDto dependencyToDto(Dependency dependency);
10 | }
11 |
--------------------------------------------------------------------------------
/src/main/webapp/app/account/password-reset/init/password-reset-init.route.ts:
--------------------------------------------------------------------------------
1 | import { Route } from '@angular/router';
2 |
3 | import { PasswordResetInitComponent } from './password-reset-init.component';
4 |
5 | export const passwordResetInitRoute: Route = {
6 | path: 'reset/request',
7 | component: PasswordResetInitComponent,
8 | data: {
9 | authorities: [],
10 | pageTitle: 'global.menu.account.password',
11 | },
12 | };
13 |
--------------------------------------------------------------------------------
/src/main/webapp/app/admin/logs/log.model.ts:
--------------------------------------------------------------------------------
1 | export type Level = 'TRACE' | 'DEBUG' | 'INFO' | 'WARN' | 'ERROR' | 'OFF';
2 |
3 | export interface Logger {
4 | configuredLevel: Level | null;
5 | effectiveLevel: Level;
6 | }
7 |
8 | export interface LoggersResponse {
9 | levels: Level[];
10 | loggers: { [key: string]: Logger };
11 | }
12 |
13 | export class Log {
14 | constructor(public name: string, public level: Level) {}
15 | }
16 |
--------------------------------------------------------------------------------
/src/main/webapp/app/layouts/profiles/profile-info.model.ts:
--------------------------------------------------------------------------------
1 | export interface InfoResponse {
2 | 'display-ribbon-on-profiles'?: string;
3 | git?: any;
4 | build?: any;
5 | activeProfiles?: string[];
6 | }
7 |
8 | export class ProfileInfo {
9 | constructor(
10 | public activeProfiles?: string[],
11 | public ribbonEnv?: string,
12 | public inProduction?: boolean,
13 | public swaggerEnabled?: boolean
14 | ) {}
15 | }
16 |
--------------------------------------------------------------------------------
/cypress/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "composite": true,
3 | "compilerOptions": {
4 | "target": "es5",
5 | "lib": ["es5", "dom"],
6 | "types": ["cypress"]
7 | },
8 | "include": [
9 | "**/*.ts",
10 | "../node_modules/cypress",
11 | "../node_modules/cypress-commands",
12 | "../node_modules/@percy/cypress"
13 | ],
14 | "types": [
15 | "cypress-commands",
16 | "cypress",
17 | "@percy/cypress"
18 | ]
19 | }
20 |
--------------------------------------------------------------------------------
/src/main/java/com/github/microcatalog/service/mapper/MicroserviceMapper.java:
--------------------------------------------------------------------------------
1 | package com.github.microcatalog.service.mapper;
2 |
3 | import com.github.microcatalog.domain.Microservice;
4 | import com.github.microcatalog.service.dto.custom.MicroserviceDto;
5 | import org.mapstruct.Mapper;
6 |
7 | @Mapper(componentModel = "spring")
8 | public interface MicroserviceMapper {
9 | MicroserviceDto microserviceToDto(Microservice microservice);
10 | }
11 |
--------------------------------------------------------------------------------
/src/main/webapp/app/account/password-reset/finish/password-reset-finish.route.ts:
--------------------------------------------------------------------------------
1 | import { Route } from '@angular/router';
2 |
3 | import { PasswordResetFinishComponent } from './password-reset-finish.component';
4 |
5 | export const passwordResetFinishRoute: Route = {
6 | path: 'reset/finish',
7 | component: PasswordResetFinishComponent,
8 | data: {
9 | authorities: [],
10 | pageTitle: 'global.menu.account.password',
11 | },
12 | };
13 |
--------------------------------------------------------------------------------
/src/test/javascript/spec/helpers/mock-language.service.ts:
--------------------------------------------------------------------------------
1 | import Spy = jasmine.Spy;
2 | import { JhiLanguageService } from 'ng-jhipster';
3 |
4 | import { SpyObject } from './spyobject';
5 |
6 | export class MockLanguageService extends SpyObject {
7 | getCurrentLanguageSpy: Spy;
8 |
9 | constructor() {
10 | super(JhiLanguageService);
11 |
12 | this.getCurrentLanguageSpy = this.spy('getCurrentLanguage').andReturn('en');
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/src/main/java/com/github/microcatalog/web/rest/errors/LoginAlreadyUsedException.java:
--------------------------------------------------------------------------------
1 | package com.github.microcatalog.web.rest.errors;
2 |
3 | public class LoginAlreadyUsedException extends BadRequestAlertException {
4 |
5 | private static final long serialVersionUID = 1L;
6 |
7 | public LoginAlreadyUsedException() {
8 | super(ErrorConstants.LOGIN_ALREADY_USED_TYPE, "Login name already used!", "userManagement", "userexists");
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/src/main/java/com/github/microcatalog/service/mapper/FullMicroserviceMapper.java:
--------------------------------------------------------------------------------
1 | package com.github.microcatalog.service.mapper;
2 |
3 | import com.github.microcatalog.domain.Microservice;
4 | import com.github.microcatalog.service.dto.custom.FullMicroserviceDto;
5 | import org.mapstruct.Mapper;
6 |
7 | @Mapper(componentModel = "spring")
8 | public interface FullMicroserviceMapper {
9 | FullMicroserviceDto microserviceToDto(Microservice microservice);
10 | }
11 |
--------------------------------------------------------------------------------
/src/main/java/com/github/microcatalog/web/rest/errors/EmailAlreadyUsedException.java:
--------------------------------------------------------------------------------
1 | package com.github.microcatalog.web.rest.errors;
2 |
3 | public class EmailAlreadyUsedException extends BadRequestAlertException {
4 |
5 | private static final long serialVersionUID = 1L;
6 |
7 | public EmailAlreadyUsedException() {
8 | super(ErrorConstants.EMAIL_ALREADY_USED_TYPE, "Email is already in use!", "userManagement", "emailexists");
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/src/main/webapp/app/dashboard/release-path-dashboard/release-path/release-path.module.ts:
--------------------------------------------------------------------------------
1 | import { NgModule } from '@angular/core';
2 | import { MicrocatalogSharedModule } from 'app/shared/shared.module';
3 | import { ReleasePathComponent } from './release-path.component';
4 |
5 | @NgModule({
6 | declarations: [ReleasePathComponent],
7 | imports: [MicrocatalogSharedModule],
8 | exports: [ReleasePathComponent],
9 | })
10 | export class ReleasePathModule {}
11 |
--------------------------------------------------------------------------------
/src/main/webapp/app/layouts/main/main.component.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
--------------------------------------------------------------------------------
/src/main/webapp/app/dashboard/release-path-dashboard/release-graph/release-graph.module.ts:
--------------------------------------------------------------------------------
1 | import { NgModule } from '@angular/core';
2 | import { MicrocatalogSharedModule } from 'app/shared/shared.module';
3 | import { ReleaseGraphComponent } from './release-graph.component';
4 |
5 | @NgModule({
6 | declarations: [ReleaseGraphComponent],
7 | imports: [MicrocatalogSharedModule],
8 | exports: [ReleaseGraphComponent],
9 | })
10 | export class ReleaseGraphModule {}
11 |
--------------------------------------------------------------------------------
/cypress/integration/login.ts:
--------------------------------------------------------------------------------
1 | describe('login', () => {
2 | it('login', function () {
3 | cy.logout();
4 |
5 | cy.visit('/');
6 |
7 | cy.get('.alert:nth-child(1) > .alert-link').click();
8 | cy.get('#username').type('user');
9 | cy.get('#password').type('user');
10 | cy.get('.btn').click();
11 | cy.get('.form').submit();
12 |
13 | cy.get('#home-logged-message').should('have.text', 'You are logged in as user "user".');
14 | })
15 | })
16 |
--------------------------------------------------------------------------------
/src/main/java/com/github/microcatalog/service/custom/exceptions/ImportException.java:
--------------------------------------------------------------------------------
1 | package com.github.microcatalog.service.custom.exceptions;
2 |
3 | /**
4 | * Used by {@link com.github.microcatalog.service.custom.ImportService}
5 | */
6 | public class ImportException extends RuntimeException {
7 | private static final long serialVersionUID = -5092030802613208627L;
8 |
9 | public ImportException(String message) {
10 | super(message);
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/src/test/java/com/github/microcatalog/repository/timezone/DateTimeWrapperRepository.java:
--------------------------------------------------------------------------------
1 | package com.github.microcatalog.repository.timezone;
2 |
3 | import org.springframework.data.jpa.repository.JpaRepository;
4 | import org.springframework.stereotype.Repository;
5 |
6 | /**
7 | * Spring Data JPA repository for the {@link DateTimeWrapper} entity.
8 | */
9 | @Repository
10 | public interface DateTimeWrapperRepository extends JpaRepository {
11 |
12 | }
13 |
--------------------------------------------------------------------------------
/src/main/webapp/app/shared/model/impact/analysis/result.model.ts:
--------------------------------------------------------------------------------
1 | import { Moment } from 'moment';
2 | import { IMicroservice } from '../../microservice.model';
3 | import { IGroup } from './group.model';
4 |
5 | export interface IResult {
6 | createdOn?: Moment;
7 | target?: IMicroservice;
8 | groups?: IGroup[];
9 | }
10 |
11 | export class Result implements IResult {
12 | constructor(public createdOn?: Moment, public groups?: IGroup[], public target?: IMicroservice) {}
13 | }
14 |
--------------------------------------------------------------------------------
/src/main/webapp/app/admin/docs/docs.module.ts:
--------------------------------------------------------------------------------
1 | import { NgModule } from '@angular/core';
2 | import { RouterModule } from '@angular/router';
3 | import { MicrocatalogSharedModule } from 'app/shared/shared.module';
4 |
5 | import { DocsComponent } from './docs.component';
6 |
7 | import { docsRoute } from './docs.route';
8 |
9 | @NgModule({
10 | imports: [MicrocatalogSharedModule, RouterModule.forChild([docsRoute])],
11 | declarations: [DocsComponent],
12 | })
13 | export class DocsModule {}
14 |
--------------------------------------------------------------------------------
/src/main/webapp/app/admin/logs/logs.module.ts:
--------------------------------------------------------------------------------
1 | import { NgModule } from '@angular/core';
2 | import { RouterModule } from '@angular/router';
3 | import { MicrocatalogSharedModule } from 'app/shared/shared.module';
4 |
5 | import { LogsComponent } from './logs.component';
6 |
7 | import { logsRoute } from './logs.route';
8 |
9 | @NgModule({
10 | imports: [MicrocatalogSharedModule, RouterModule.forChild([logsRoute])],
11 | declarations: [LogsComponent],
12 | })
13 | export class LogsModule {}
14 |
--------------------------------------------------------------------------------
/src/test/javascript/spec/helpers/mock-active-modal.service.ts:
--------------------------------------------------------------------------------
1 | import Spy = jasmine.Spy;
2 | import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';
3 |
4 | import { SpyObject } from './spyobject';
5 |
6 | export class MockActiveModal extends SpyObject {
7 | dismissSpy: Spy;
8 | closeSpy: Spy;
9 |
10 | constructor() {
11 | super(NgbActiveModal);
12 | this.dismissSpy = this.spy('dismiss').andReturn(this);
13 | this.closeSpy = this.spy('close').andReturn(this);
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/src/main/webapp/WEB-INF/web.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
9 | html
10 | text/html;charset=utf-8
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/src/main/webapp/app/layouts/error/error.component.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
Error Page!
9 |
10 |
11 |
{{ errorMessage }}
12 |
13 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/src/main/webapp/i18n/en/sessions.json:
--------------------------------------------------------------------------------
1 | {
2 | "sessions": {
3 | "title": "Active sessions for [{{username}}]",
4 | "table": {
5 | "ipaddress": "IP address",
6 | "useragent": "User Agent",
7 | "date": "Date",
8 | "button": "Invalidate"
9 | },
10 | "messages": {
11 | "success": "Session invalidated!",
12 | "error": "An error has occurred! The session could not be invalidated."
13 | }
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/src/main/webapp/app/admin/audits/audits.module.ts:
--------------------------------------------------------------------------------
1 | import { NgModule } from '@angular/core';
2 | import { RouterModule } from '@angular/router';
3 | import { MicrocatalogSharedModule } from 'app/shared/shared.module';
4 |
5 | import { AuditsComponent } from './audits.component';
6 |
7 | import { auditsRoute } from './audits.route';
8 |
9 | @NgModule({
10 | imports: [MicrocatalogSharedModule, RouterModule.forChild([auditsRoute])],
11 | declarations: [AuditsComponent],
12 | })
13 | export class AuditsModule {}
14 |
--------------------------------------------------------------------------------
/src/main/webapp/app/dashboard/impact-analysis/impact-analysis-graph/impact-analysis-graph.module.ts:
--------------------------------------------------------------------------------
1 | import { NgModule } from '@angular/core';
2 | import { ImpactAnalysisGraphComponent } from './impact-analysis-graph.component';
3 | import { MicrocatalogSharedModule } from '../../../shared/shared.module';
4 |
5 | @NgModule({
6 | declarations: [ImpactAnalysisGraphComponent],
7 | imports: [MicrocatalogSharedModule],
8 | exports: [ImpactAnalysisGraphComponent],
9 | })
10 | export class ImpactAnalysisGraphModule {}
11 |
--------------------------------------------------------------------------------
/src/main/java/com/github/microcatalog/repository/TeamRepository.java:
--------------------------------------------------------------------------------
1 | package com.github.microcatalog.repository;
2 |
3 | import com.github.microcatalog.domain.Team;
4 | import org.springframework.data.jpa.repository.JpaRepository;
5 | import org.springframework.stereotype.Repository;
6 |
7 | /**
8 | * Spring Data repository for the Team entity.
9 | */
10 | @SuppressWarnings("unused")
11 | @Repository
12 | public interface TeamRepository extends JpaRepository {
13 | Team findByName(String name);
14 | }
15 |
--------------------------------------------------------------------------------
/src/main/webapp/app/admin/metrics/metrics.module.ts:
--------------------------------------------------------------------------------
1 | import { NgModule } from '@angular/core';
2 | import { RouterModule } from '@angular/router';
3 | import { MicrocatalogSharedModule } from 'app/shared/shared.module';
4 |
5 | import { MetricsComponent } from './metrics.component';
6 |
7 | import { metricsRoute } from './metrics.route';
8 |
9 | @NgModule({
10 | imports: [MicrocatalogSharedModule, RouterModule.forChild([metricsRoute])],
11 | declarations: [MetricsComponent],
12 | })
13 | export class MetricsModule {}
14 |
--------------------------------------------------------------------------------
/src/main/webapp/app/entities/microservice/microservice-dashboard/microservice-card/card-settings.model.ts:
--------------------------------------------------------------------------------
1 | export interface ICardSettings {
2 | previewWidth: number;
3 | previewHeight: number;
4 | fallbackImage: string;
5 | }
6 |
7 | export class CardSettings implements ICardSettings {
8 | static DEFAULT: CardSettings = new CardSettings(96, 96, '/content/images/jhipster_family_member_1.svg');
9 |
10 | constructor(public previewWidth: number, public previewHeight: number, public fallbackImage: string) {}
11 | }
12 |
--------------------------------------------------------------------------------
/src/main/webapp/i18n/de/sessions.json:
--------------------------------------------------------------------------------
1 | {
2 | "sessions": {
3 | "title": "Aktive Sitzungen für [{{username}}]",
4 | "table": {
5 | "ipaddress": "IP Adresse",
6 | "useragent": "User Agent",
7 | "date": "Datum",
8 | "button": "Schließen"
9 | },
10 | "messages": {
11 | "success": "Sitzung wurde geschlossen!",
12 | "error": "Es ist ein Fehler aufgetreten! Die Sitzung konnte nicht geschlossen werden."
13 | }
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/src/test/java/com/github/microcatalog/config/WebConfigurerTestController.java:
--------------------------------------------------------------------------------
1 | package com.github.microcatalog.config;
2 |
3 | import org.springframework.web.bind.annotation.GetMapping;
4 | import org.springframework.web.bind.annotation.RestController;
5 |
6 | @RestController
7 | public class WebConfigurerTestController {
8 |
9 | @GetMapping("/api/test-cors")
10 | public void testCorsOnApiPath() {
11 | }
12 |
13 | @GetMapping("/test/test-cors")
14 | public void testCorsOnOtherPath() {
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/src/main/java/com/github/microcatalog/repository/StatusRepository.java:
--------------------------------------------------------------------------------
1 | package com.github.microcatalog.repository;
2 |
3 | import com.github.microcatalog.domain.Status;
4 | import org.springframework.data.jpa.repository.JpaRepository;
5 | import org.springframework.stereotype.Repository;
6 |
7 | /**
8 | * Spring Data repository for the Status entity.
9 | */
10 | @SuppressWarnings("unused")
11 | @Repository
12 | public interface StatusRepository extends JpaRepository {
13 | Status findByName(String name);
14 | }
15 |
--------------------------------------------------------------------------------
/src/main/webapp/app/blocks/config/uib-pagination.config.ts:
--------------------------------------------------------------------------------
1 | import { Injectable } from '@angular/core';
2 | import { NgbPaginationConfig } from '@ng-bootstrap/ng-bootstrap';
3 | import { ITEMS_PER_PAGE } from 'app/shared/constants/pagination.constants';
4 |
5 | @Injectable({ providedIn: 'root' })
6 | export class PaginationConfig {
7 | constructor(config: NgbPaginationConfig) {
8 | config.boundaryLinks = true;
9 | config.maxSize = 5;
10 | config.pageSize = ITEMS_PER_PAGE;
11 | config.size = 'sm';
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/src/main/webapp/app/shared/model/util/microservice-group-filter.ts:
--------------------------------------------------------------------------------
1 | import { ITeam } from 'app/shared/model/team.model';
2 | import { IStatus } from 'app/shared/model/status.model';
3 |
4 | export interface IMicroserviceGroupFilter {
5 | caseSensitive: boolean;
6 | name?: string;
7 | description?: string;
8 | swaggerUrl?: string;
9 | gitUrl?: string;
10 | team?: ITeam;
11 | status?: IStatus;
12 | }
13 |
14 | export class MicroserviceGroupFilter implements IMicroserviceGroupFilter {
15 | caseSensitive = false;
16 | }
17 |
--------------------------------------------------------------------------------
/src/main/webapp/app/dashboard/dependency-dashboard/node-legend/graph-legend.component.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/src/test/java/com/github/microcatalog/service/custom/GraphOperationsServiceTest.java:
--------------------------------------------------------------------------------
1 | package com.github.microcatalog.service.custom;
2 |
3 | import org.junit.jupiter.api.Test;
4 |
5 | import static org.assertj.core.api.Assertions.assertThat;
6 |
7 | class GraphOperationsServiceTest {
8 |
9 | @Test
10 | void graphContext_NullGraph() {
11 | final GraphOperationsService.GraphContext context = new GraphOperationsService.GraphContext(null, null);
12 | assertThat(context.hasEmptyGraph()).isTrue();
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/cypress/integration/impact-analysis.ts:
--------------------------------------------------------------------------------
1 | describe.only('impact analysis', () => {
2 |
3 | before(function login() {
4 | cy.logout();
5 | cy.loginUser();
6 | })
7 |
8 | it('impact analysis is shown', function () {
9 | cy.server();
10 | cy.route('GET', '/api/impact-analysis/microservice/4').as('apiRequest');
11 |
12 | cy.visit('/dashboard/impact-analysis/4');
13 |
14 | cy.wait('@apiRequest');
15 | cy.get('canvas');
16 |
17 | cy.percySnapshot('impact-analysis', { widths: [1024] });
18 | })
19 |
20 | })
21 |
--------------------------------------------------------------------------------
/src/main/java/com/github/microcatalog/web/rest/errors/InvalidPasswordException.java:
--------------------------------------------------------------------------------
1 | package com.github.microcatalog.web.rest.errors;
2 |
3 | import org.zalando.problem.AbstractThrowableProblem;
4 | import org.zalando.problem.Status;
5 |
6 | public class InvalidPasswordException extends AbstractThrowableProblem {
7 |
8 | private static final long serialVersionUID = 1L;
9 |
10 | public InvalidPasswordException() {
11 | super(ErrorConstants.INVALID_PASSWORD_TYPE, "Incorrect password", Status.BAD_REQUEST);
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/src/main/java/com/github/microcatalog/service/dto/custom/MicroserviceDto.java:
--------------------------------------------------------------------------------
1 | package com.github.microcatalog.service.dto.custom;
2 |
3 | import java.io.Serializable;
4 |
5 | public final class MicroserviceDto extends BaseDto implements Serializable {
6 |
7 | private static final long serialVersionUID = 4624953286552443974L;
8 |
9 | private String ciUrl;
10 |
11 | public String getCiUrl() {
12 | return ciUrl;
13 | }
14 |
15 | public void setCiUrl(String ciUrl) {
16 | this.ciUrl = ciUrl;
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/src/main/webapp/app/shared/model/release-path.model.ts:
--------------------------------------------------------------------------------
1 | import { Moment } from 'moment';
2 | import { IReleaseGroup } from 'app/shared/model/release-group.model';
3 | import { IMicroservice } from 'app/shared/model/microservice.model';
4 |
5 | export interface IReleasePath {
6 | createdOn?: Moment;
7 | groups?: IReleaseGroup[];
8 | target?: IMicroservice;
9 | }
10 |
11 | export class ReleasePath implements IReleasePath {
12 | constructor(public createdOn?: Moment, public groups?: IReleaseGroup[], public target?: IMicroservice) {}
13 | }
14 |
--------------------------------------------------------------------------------
/src/main/webapp/i18n/en/login.json:
--------------------------------------------------------------------------------
1 | {
2 | "login": {
3 | "title": "Sign in",
4 | "form": {
5 | "password": "Password",
6 | "password.placeholder": "Your password",
7 | "rememberme": "Remember me",
8 | "button": "Sign in"
9 | },
10 | "messages": {
11 | "error": {
12 | "authentication": "Failed to sign in! Please check your credentials and try again."
13 | }
14 | },
15 | "password": {
16 | "forgot": "Did you forget your password?"
17 | }
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/src/main/java/com/github/microcatalog/repository/DependencyRepository.java:
--------------------------------------------------------------------------------
1 | package com.github.microcatalog.repository;
2 |
3 | import com.github.microcatalog.domain.Dependency;
4 | import org.springframework.data.jpa.repository.JpaRepository;
5 | import org.springframework.stereotype.Repository;
6 |
7 | /**
8 | * Spring Data repository for the Dependency entity.
9 | */
10 | @SuppressWarnings("unused")
11 | @Repository
12 | public interface DependencyRepository extends JpaRepository {
13 | Long deleteByName(String name);
14 | }
15 |
--------------------------------------------------------------------------------
/src/main/java/com/github/microcatalog/security/AuthoritiesConstants.java:
--------------------------------------------------------------------------------
1 | package com.github.microcatalog.security;
2 |
3 | /**
4 | * Constants for Spring Security authorities.
5 | */
6 | public final class AuthoritiesConstants {
7 |
8 | public static final String ADMIN = "ROLE_ADMIN";
9 |
10 | public static final String USER = "ROLE_USER";
11 |
12 | public static final String ANONYMOUS = "ROLE_ANONYMOUS";
13 |
14 | public static final String IMPORT = "ROLE_IMPORT";
15 |
16 | private AuthoritiesConstants() {
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/src/main/java/com/github/microcatalog/service/custom/exceptions/MicroserviceNotFoundException.java:
--------------------------------------------------------------------------------
1 | package com.github.microcatalog.service.custom.exceptions;
2 |
3 | public class MicroserviceNotFoundException extends RuntimeException {
4 | private final long microserviceId;
5 |
6 | public MicroserviceNotFoundException(String message, long microserviceId) {
7 | super(message);
8 |
9 | this.microserviceId = microserviceId;
10 | }
11 |
12 | public long getMicroserviceId() {
13 | return microserviceId;
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/src/main/webapp/app/account/password-reset/init/password-reset-init.service.ts:
--------------------------------------------------------------------------------
1 | import { Injectable } from '@angular/core';
2 | import { HttpClient } from '@angular/common/http';
3 | import { Observable } from 'rxjs';
4 |
5 | import { SERVER_API_URL } from 'app/app.constants';
6 |
7 | @Injectable({ providedIn: 'root' })
8 | export class PasswordResetInitService {
9 | constructor(private http: HttpClient) {}
10 |
11 | save(mail: string): Observable<{}> {
12 | return this.http.post(SERVER_API_URL + 'api/account/reset-password/init', mail);
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/src/main/webapp/app/shared/model/dependency.model.ts:
--------------------------------------------------------------------------------
1 | import { IMicroservice } from 'app/shared/model/microservice.model';
2 |
3 | export interface IDependency {
4 | id?: number;
5 | name?: string;
6 | description?: any;
7 | source?: IMicroservice;
8 | target?: IMicroservice;
9 | }
10 |
11 | export class Dependency implements IDependency {
12 | constructor(
13 | public id?: number,
14 | public name?: string,
15 | public description?: any,
16 | public source?: IMicroservice,
17 | public target?: IMicroservice
18 | ) {}
19 | }
20 |
--------------------------------------------------------------------------------
/src/main/webapp/app/account/register/register.service.ts:
--------------------------------------------------------------------------------
1 | import { Injectable } from '@angular/core';
2 | import { HttpClient } from '@angular/common/http';
3 | import { Observable } from 'rxjs';
4 |
5 | import { SERVER_API_URL } from 'app/app.constants';
6 | import { IUser } from 'app/core/user/user.model';
7 |
8 | @Injectable({ providedIn: 'root' })
9 | export class RegisterService {
10 | constructor(private http: HttpClient) {}
11 |
12 | save(account: IUser): Observable<{}> {
13 | return this.http.post(SERVER_API_URL + 'api/register', account);
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/.editorconfig:
--------------------------------------------------------------------------------
1 | # EditorConfig helps developers define and maintain consistent
2 | # coding styles between different editors and IDEs
3 | # editorconfig.org
4 |
5 | root = true
6 |
7 | [*]
8 |
9 | # We recommend you to keep these unchanged
10 | end_of_line = lf
11 | charset = utf-8
12 | trim_trailing_whitespace = true
13 | insert_final_newline = true
14 |
15 | # Change these settings to your own preference
16 | indent_style = space
17 | indent_size = 4
18 |
19 | [*.{ts,tsx,js,jsx,json,css,scss,yml}]
20 | indent_size = 2
21 |
22 | [*.md]
23 | trim_trailing_whitespace = false
24 |
--------------------------------------------------------------------------------
/src/main/webapp/app/admin/configuration/configuration.module.ts:
--------------------------------------------------------------------------------
1 | import { NgModule } from '@angular/core';
2 | import { RouterModule } from '@angular/router';
3 | import { MicrocatalogSharedModule } from 'app/shared/shared.module';
4 |
5 | import { ConfigurationComponent } from './configuration.component';
6 |
7 | import { configurationRoute } from './configuration.route';
8 |
9 | @NgModule({
10 | imports: [MicrocatalogSharedModule, RouterModule.forChild([configurationRoute])],
11 | declarations: [ConfigurationComponent],
12 | })
13 | export class ConfigurationModule {}
14 |
--------------------------------------------------------------------------------
/src/main/webapp/app/entities/microservice/microservice-dashboard/microservice-search/microservice-group-filter/microservice-group-filter.module.ts:
--------------------------------------------------------------------------------
1 | import { NgModule } from '@angular/core';
2 | import { MicroserviceGroupFilterComponent } from './microservice-group-filter.component';
3 | import { MicrocatalogSharedModule } from 'app/shared/shared.module';
4 |
5 | @NgModule({
6 | declarations: [MicroserviceGroupFilterComponent],
7 | imports: [MicrocatalogSharedModule],
8 | exports: [MicroserviceGroupFilterComponent],
9 | })
10 | export class MicroserviceGroupFilterModule {}
11 |
--------------------------------------------------------------------------------
/src/main/webapp/app/account/activate/activate.service.ts:
--------------------------------------------------------------------------------
1 | import { Injectable } from '@angular/core';
2 | import { HttpClient, HttpParams } from '@angular/common/http';
3 | import { Observable } from 'rxjs';
4 |
5 | import { SERVER_API_URL } from 'app/app.constants';
6 |
7 | @Injectable({ providedIn: 'root' })
8 | export class ActivateService {
9 | constructor(private http: HttpClient) {}
10 |
11 | get(key: string): Observable<{}> {
12 | return this.http.get(SERVER_API_URL + 'api/activate', {
13 | params: new HttpParams().set('key', key),
14 | });
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/src/main/webapp/app/account/password/password.service.ts:
--------------------------------------------------------------------------------
1 | import { Injectable } from '@angular/core';
2 | import { HttpClient } from '@angular/common/http';
3 | import { Observable } from 'rxjs';
4 |
5 | import { SERVER_API_URL } from 'app/app.constants';
6 |
7 | @Injectable({ providedIn: 'root' })
8 | export class PasswordService {
9 | constructor(private http: HttpClient) {}
10 |
11 | save(newPassword: string, currentPassword: string): Observable<{}> {
12 | return this.http.post(SERVER_API_URL + 'api/account/change-password', { currentPassword, newPassword });
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/src/main/webapp/app/dashboard/impact-analysis/impact-analysis-legend/impact-analysis-legend.module.ts:
--------------------------------------------------------------------------------
1 | import { NgModule } from '@angular/core';
2 | import { MicrocatalogSharedModule } from 'app/shared/shared.module';
3 | import { ImpactAnalysisLegendComponent } from './impact-analysis-legend.component';
4 | import { RouterModule } from '@angular/router';
5 |
6 | @NgModule({
7 | declarations: [ImpactAnalysisLegendComponent],
8 | imports: [MicrocatalogSharedModule, RouterModule],
9 | exports: [ImpactAnalysisLegendComponent],
10 | })
11 | export class ImpactAnalysisLegendModule {}
12 |
--------------------------------------------------------------------------------
/src/main/webapp/i18n/de/login.json:
--------------------------------------------------------------------------------
1 | {
2 | "login": {
3 | "title": "Anmeldung",
4 | "form": {
5 | "password": "Passwort",
6 | "password.placeholder": "Ihr Passwort",
7 | "rememberme": "Automatische Anmeldung",
8 | "button": "Anmelden"
9 | },
10 | "messages": {
11 | "error": {
12 | "authentication": "Anmeldung fehlgeschlagen! Überprüfen Sie bitte Ihre Angaben und versuchen Sie es erneut."
13 | }
14 | },
15 | "password": {
16 | "forgot": "Sie haben Ihr Passwort vergessen?"
17 | }
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/src/main/webapp/app/shared/language/find-language-from-key.pipe.ts:
--------------------------------------------------------------------------------
1 | import { Pipe, PipeTransform } from '@angular/core';
2 |
3 | @Pipe({ name: 'findLanguageFromKey' })
4 | export class FindLanguageFromKeyPipe implements PipeTransform {
5 | private languages: { [key: string]: { name: string; rtl?: boolean } } = {
6 | en: { name: 'English' },
7 | de: { name: 'Deutsch' },
8 | // jhipster-needle-i18n-language-key-pipe - JHipster will add/remove languages in this object
9 | };
10 |
11 | transform(lang: string): string {
12 | return this.languages[lang].name;
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/src/main/java/com/github/microcatalog/config/CSPProperties.java:
--------------------------------------------------------------------------------
1 | package com.github.microcatalog.config;
2 |
3 | import org.springframework.boot.context.properties.ConfigurationProperties;
4 |
5 | @ConfigurationProperties(prefix = "csp", ignoreUnknownFields = false)
6 | public class CSPProperties {
7 | private String imageSrc = "'self' data:";
8 |
9 | public CSPProperties() {
10 | }
11 |
12 | public String getImageSrc() {
13 | return imageSrc;
14 | }
15 |
16 | public void setImageSrc(String imageSrc) {
17 | this.imageSrc = imageSrc;
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/src/main/webapp/app/account/password/password.route.ts:
--------------------------------------------------------------------------------
1 | import { Route } from '@angular/router';
2 |
3 | import { UserRouteAccessService } from 'app/core/auth/user-route-access-service';
4 | import { PasswordComponent } from './password.component';
5 | import { Authority } from 'app/shared/constants/authority.constants';
6 |
7 | export const passwordRoute: Route = {
8 | path: 'password',
9 | component: PasswordComponent,
10 | data: {
11 | authorities: [Authority.USER],
12 | pageTitle: 'global.menu.account.password',
13 | },
14 | canActivate: [UserRouteAccessService],
15 | };
16 |
--------------------------------------------------------------------------------
/src/main/webapp/app/account/settings/settings.route.ts:
--------------------------------------------------------------------------------
1 | import { Route } from '@angular/router';
2 |
3 | import { UserRouteAccessService } from 'app/core/auth/user-route-access-service';
4 | import { SettingsComponent } from './settings.component';
5 | import { Authority } from 'app/shared/constants/authority.constants';
6 |
7 | export const settingsRoute: Route = {
8 | path: 'settings',
9 | component: SettingsComponent,
10 | data: {
11 | authorities: [Authority.USER],
12 | pageTitle: 'global.menu.account.settings',
13 | },
14 | canActivate: [UserRouteAccessService],
15 | };
16 |
--------------------------------------------------------------------------------
/src/main/webapp/app/app.main.ts:
--------------------------------------------------------------------------------
1 | import './polyfills';
2 | import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
3 | import { ProdConfig } from './blocks/config/prod.config';
4 | import { MicrocatalogAppModule } from './app.module';
5 |
6 | ProdConfig();
7 |
8 | if (module['hot']) {
9 | module['hot'].accept();
10 | }
11 |
12 | platformBrowserDynamic()
13 | .bootstrapModule(MicrocatalogAppModule, { preserveWhitespaces: true })
14 | // eslint-disable-next-line no-console
15 | .then(() => console.log('Application started'))
16 | .catch(err => console.error(err));
17 |
--------------------------------------------------------------------------------
/src/main/webapp/app/dashboard/dependency-dashboard/node-legend/coordinates-e2e/coordinates-e2e.component.ts:
--------------------------------------------------------------------------------
1 | import { Component, Input, OnInit } from '@angular/core';
2 | import { ISelectPayload } from 'app/shared/vis/events/VisEvents';
3 |
4 | @Component({
5 | selector: 'jhi-coordinates-e2e',
6 | templateUrl: './coordinates-e2e.component.html',
7 | })
8 | export class CoordinatesE2eComponent implements OnInit {
9 | @Input()
10 | nodeSelection?: ISelectPayload;
11 |
12 | @Input()
13 | edgeSelection?: ISelectPayload;
14 |
15 | constructor() {}
16 |
17 | ngOnInit(): void {}
18 | }
19 |
--------------------------------------------------------------------------------
/src/main/webapp/app/entities/microservice/microservice-dashboard/microservice-dashboard.component.html:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
6 |
7 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/src/main/webapp/app/account/password-reset/finish/password-reset-finish.service.ts:
--------------------------------------------------------------------------------
1 | import { Injectable } from '@angular/core';
2 | import { HttpClient } from '@angular/common/http';
3 | import { Observable } from 'rxjs';
4 |
5 | import { SERVER_API_URL } from 'app/app.constants';
6 |
7 | @Injectable({ providedIn: 'root' })
8 | export class PasswordResetFinishService {
9 | constructor(private http: HttpClient) {}
10 |
11 | save(key: string, newPassword: string): Observable<{}> {
12 | return this.http.post(SERVER_API_URL + 'api/account/reset-password/finish', { key, newPassword });
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/.eslintrc.json:
--------------------------------------------------------------------------------
1 | {
2 | "plugins": ["@typescript-eslint/tslint"],
3 | "extends": ["jhipster"],
4 | "parserOptions": {
5 | "project": "./tsconfig.base.json"
6 | },
7 | "rules": {
8 | "@typescript-eslint/tslint/config": [
9 | "error",
10 | {
11 | "lintFile": "./tslint.json"
12 | }
13 | ],
14 | "@typescript-eslint/no-unused-vars": [
15 | "warn",
16 | {
17 | "vars": "all",
18 | "args": "after-used",
19 | "ignoreRestSiblings": false
20 | }
21 | ],
22 | "@typescript-eslint/no-non-null-assertion": "off"
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/src/main/java/com/github/microcatalog/repository/MicroserviceRepository.java:
--------------------------------------------------------------------------------
1 | package com.github.microcatalog.repository;
2 |
3 | import com.github.microcatalog.domain.Microservice;
4 | import org.springframework.data.jpa.repository.JpaRepository;
5 | import org.springframework.stereotype.Repository;
6 |
7 | /**
8 | * Spring Data repository for the Microservice entity.
9 | */
10 | @SuppressWarnings("unused")
11 | @Repository
12 | public interface MicroserviceRepository extends JpaRepository {
13 | Long deleteByName(String name);
14 |
15 | Microservice findByName(String name);
16 | }
17 |
--------------------------------------------------------------------------------
/src/main/webapp/app/entities/microservice/microservice-details/microservice-custom-details.module.ts:
--------------------------------------------------------------------------------
1 | import { NgModule } from '@angular/core';
2 | import { MicroserviceCustomDetailsComponent } from './microservice-custom-details.component';
3 | import { MicrocatalogSharedModule } from '../../../shared/shared.module';
4 | import { RouterModule } from '@angular/router';
5 |
6 | @NgModule({
7 | declarations: [MicroserviceCustomDetailsComponent],
8 | imports: [MicrocatalogSharedModule, RouterModule],
9 | exports: [MicroserviceCustomDetailsComponent],
10 | })
11 | export class MicroserviceCustomDetailsModule {}
12 |
--------------------------------------------------------------------------------
/src/main/java/com/github/microcatalog/config/Constants.java:
--------------------------------------------------------------------------------
1 | package com.github.microcatalog.config;
2 |
3 | /**
4 | * Application constants.
5 | */
6 | public final class Constants {
7 |
8 | // Regex for acceptable logins
9 | public static final String LOGIN_REGEX = "^(?>[a-zA-Z0-9!$&*+=?^_`{|}~.-]+@[a-zA-Z0-9-]+(?:\\.[a-zA-Z0-9-]+)*)|(?>[_.@A-Za-z0-9-]+)$";
10 |
11 | public static final String SYSTEM_ACCOUNT = "system";
12 | public static final String DEFAULT_LANGUAGE = "en";
13 | public static final String ANONYMOUS_USER = "anonymoususer";
14 |
15 | private Constants() {
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/src/main/webapp/content/scss/vendor.scss:
--------------------------------------------------------------------------------
1 | /* after changing this file run 'npm run webpack:build' */
2 |
3 | /***************************
4 | put Sass variables here:
5 | eg $input-color: red;
6 | ****************************/
7 | @import '~vis-network/styles/vis-network.css';
8 | @import '~bootswatch/dist/solar/variables';
9 | // Override Bootstrap variables
10 | @import 'bootstrap-variables';
11 | // Import Bootstrap source files from node_modules
12 | @import '~bootstrap/scss/bootstrap';
13 | @import '~bootswatch/dist/solar/bootswatch';
14 |
15 | /* jhipster-needle-scss-add-vendor JHipster will add new css style */
16 |
--------------------------------------------------------------------------------
/src/main/docker/app.yml:
--------------------------------------------------------------------------------
1 | version: '2'
2 | services:
3 | microcatalog-app:
4 | image: microcatalog
5 | environment:
6 | - _JAVA_OPTIONS=-Xmx512m -Xms256m
7 | - SPRING_PROFILES_ACTIVE=prod,swagger
8 | - MANAGEMENT_METRICS_EXPORT_PROMETHEUS_ENABLED=true
9 | - SPRING_DATASOURCE_URL=jdbc:postgresql://microcatalog-postgresql:5432/microcatalog
10 | - JHIPSTER_SLEEP=30 # gives time for other services to boot before the application
11 | ports:
12 | - 8080:8080
13 | microcatalog-postgresql:
14 | extends:
15 | file: postgresql.yml
16 | service: microcatalog-postgresql
17 |
--------------------------------------------------------------------------------
/src/main/webapp/i18n/de/error.json:
--------------------------------------------------------------------------------
1 | {
2 | "error": {
3 | "title": "Fehlerseite!",
4 | "http": {
5 | "400": "Ungültige Anfrage.",
6 | "403": "Sie haben nicht die nötigen Berechtigungen um diese Seite anzuzeigen.",
7 | "404": "Die Seite existiert nicht.",
8 | "405": "Die verwendete Anfrage-Methode ist für diese URL nicht erlaubt.",
9 | "500": "Interner Serverfehler."
10 | },
11 | "concurrencyFailure": "Ein anderer Benutzer hat diese Daten zeitgleich mit Ihnen geändert. Ihre Änderungen wurden abgelehnt.",
12 | "validation": "Validierungsfehler auf dem Server."
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/src/main/java/com/github/microcatalog/web/rest/ClientForwardController.java:
--------------------------------------------------------------------------------
1 | package com.github.microcatalog.web.rest;
2 |
3 | import org.springframework.stereotype.Controller;
4 | import org.springframework.web.bind.annotation.GetMapping;
5 |
6 | @Controller
7 | public class ClientForwardController {
8 |
9 | /**
10 | * Forwards any unmapped paths (except those containing a period) to the client {@code index.html}.
11 | * @return forward to client {@code index.html}.
12 | */
13 | @GetMapping(value = "/**/{path:[^\\.]*}")
14 | public String forward() {
15 | return "forward:/";
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/src/main/webapp/app/admin/user-management/user-management-detail.component.ts:
--------------------------------------------------------------------------------
1 | import { Component, OnInit } from '@angular/core';
2 | import { ActivatedRoute } from '@angular/router';
3 |
4 | import { User } from 'app/core/user/user.model';
5 |
6 | @Component({
7 | selector: 'jhi-user-mgmt-detail',
8 | templateUrl: './user-management-detail.component.html',
9 | })
10 | export class UserManagementDetailComponent implements OnInit {
11 | user: User | null = null;
12 |
13 | constructor(private route: ActivatedRoute) {}
14 |
15 | ngOnInit(): void {
16 | this.route.data.subscribe(({ user }) => (this.user = user));
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/docker-compose.yml:
--------------------------------------------------------------------------------
1 | version: '3.1'
2 | services:
3 | db:
4 | image: postgres
5 | restart: always
6 | environment:
7 | POSTGRES_PASSWORD: kEt#uR6M
8 | adminer:
9 | image: adminer
10 | restart: always
11 | ports:
12 | - 9080:8080
13 | microcatalog:
14 | image: tillias/microcatalog
15 | restart: always
16 | environment:
17 | DB_HOST: db
18 | DB_PORT: 5432
19 | DB_NAME: postgres
20 | DB_PASSWORD: kEt#uR6M
21 | DB_USER: postgres
22 | CSP_IMAGE_SRC: '*'
23 | SERVER_PORT: 2080
24 | SPRING_PROFILES_ACTIVE: prod,heroku
25 | ports:
26 | - 8080:2080
27 |
--------------------------------------------------------------------------------
/src/main/webapp/app/account/password/password-strength-bar.scss:
--------------------------------------------------------------------------------
1 | /* ==========================================================================
2 | start Password strength bar style
3 | ========================================================================== */
4 | ul#strength {
5 | display: inline;
6 | list-style: none;
7 | margin: 0;
8 | margin-left: 15px;
9 | padding: 0;
10 | vertical-align: 2px;
11 | }
12 |
13 | .point {
14 | background: #ddd;
15 | border-radius: 2px;
16 | display: inline-block;
17 | height: 5px;
18 | margin-right: 1px;
19 | width: 20px;
20 | &:last-child {
21 | margin: 0 !important;
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/src/main/webapp/app/admin/health/health.module.ts:
--------------------------------------------------------------------------------
1 | import { NgModule } from '@angular/core';
2 | import { RouterModule } from '@angular/router';
3 | import { MicrocatalogSharedModule } from 'app/shared/shared.module';
4 |
5 | import { HealthComponent } from './health.component';
6 | import { HealthModalComponent } from './health-modal.component';
7 |
8 | import { healthRoute } from './health.route';
9 |
10 | @NgModule({
11 | imports: [MicrocatalogSharedModule, RouterModule.forChild([healthRoute])],
12 | declarations: [HealthComponent, HealthModalComponent],
13 | entryComponents: [HealthModalComponent],
14 | })
15 | export class HealthModule {}
16 |
--------------------------------------------------------------------------------
/tslint.json:
--------------------------------------------------------------------------------
1 | {
2 | "rulesDirectory": ["node_modules/codelyzer"],
3 | "rules": {
4 | "directive-selector": [true, "attribute", "jhi", "camelCase"],
5 | "component-selector": [true, "element", "jhi", "kebab-case"],
6 | "no-inputs-metadata-property": true,
7 | "no-outputs-metadata-property": true,
8 | "no-host-metadata-property": true,
9 | "no-input-rename": true,
10 | "no-output-rename": true,
11 | "use-lifecycle-interface": true,
12 | "use-pipe-transform-interface": false,
13 | "component-class-suffix": true,
14 | "directive-class-suffix": true,
15 | "typedef": [true, "call-signature"]
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/src/main/webapp/app/home/home.module.ts:
--------------------------------------------------------------------------------
1 | import { NgModule } from '@angular/core';
2 | import { RouterModule } from '@angular/router';
3 |
4 | import { MicrocatalogSharedModule } from 'app/shared/shared.module';
5 | import { HOME_ROUTE } from './home.route';
6 | import { HomeComponent } from './home.component';
7 | import { MicroserviceDashboardModule } from 'app/entities/microservice/microservice-dashboard/microservice-dashboard.module';
8 |
9 | @NgModule({
10 | imports: [MicrocatalogSharedModule, MicroserviceDashboardModule, RouterModule.forChild([HOME_ROUTE])],
11 | declarations: [HomeComponent],
12 | })
13 | export class MicrocatalogHomeModule {}
14 |
--------------------------------------------------------------------------------
/src/main/webapp/i18n/en/custom-microservice.json:
--------------------------------------------------------------------------------
1 | {
2 | "microcatalogApp": {
3 | "microservice": {
4 | "search": {
5 | "placeholder": "Search text...",
6 | "group": {
7 | "case": "Case-sensitive search",
8 | "team": "Select Team...",
9 | "status": "Select Status...",
10 | "search": "Search",
11 | "clear": "Clear filters"
12 | }
13 | }
14 | },
15 | "dashboard": {
16 | "dependency": {
17 | "filter": {
18 | "incoming": "Show downstreams",
19 | "outgoing": "Show upstreams"
20 | }
21 | }
22 | }
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/src/main/java/com/github/microcatalog/config/LoggingAspectConfiguration.java:
--------------------------------------------------------------------------------
1 | package com.github.microcatalog.config;
2 |
3 | import com.github.microcatalog.aop.logging.LoggingAspect;
4 |
5 | import io.github.jhipster.config.JHipsterConstants;
6 |
7 | import org.springframework.context.annotation.*;
8 | import org.springframework.core.env.Environment;
9 |
10 | @Configuration
11 | @EnableAspectJAutoProxy
12 | public class LoggingAspectConfiguration {
13 |
14 | @Bean
15 | @Profile(JHipsterConstants.SPRING_PROFILE_DEVELOPMENT)
16 | public LoggingAspect loggingAspect(Environment env) {
17 | return new LoggingAspect(env);
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/src/main/java/com/github/microcatalog/service/dto/custom/JenkinsCrumbDto.java:
--------------------------------------------------------------------------------
1 | package com.github.microcatalog.service.dto.custom;
2 |
3 | public class JenkinsCrumbDto {
4 | private String crumbRequestField;
5 | private String crumb;
6 |
7 | public String getCrumbRequestField() {
8 | return crumbRequestField;
9 | }
10 |
11 | public void setCrumbRequestField(String crumbRequestField) {
12 | this.crumbRequestField = crumbRequestField;
13 | }
14 |
15 | public String getCrumb() {
16 | return crumb;
17 | }
18 |
19 | public void setCrumb(String crumb) {
20 | this.crumb = crumb;
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/src/main/webapp/app/services/integration-tests.service.ts:
--------------------------------------------------------------------------------
1 | import { Injectable } from '@angular/core';
2 | import { SERVER_API_URL } from '../app.constants';
3 | import { HttpClient } from '@angular/common/http';
4 | import { Observable } from 'rxjs';
5 |
6 | @Injectable({
7 | providedIn: 'root',
8 | })
9 | export class IntegrationTestsService {
10 | public resourceUrl = SERVER_API_URL + 'api/integration-tests';
11 |
12 | constructor(protected http: HttpClient) {}
13 |
14 | trigger(microserviceId: number): Observable {
15 | return this.http.post(`${this.resourceUrl}/microservice/${microserviceId}`, { observe: 'response' });
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/src/main/webapp/app/dashboard/dependency-dashboard/create-dependency-dialog/create-dependency-dialog.module.ts:
--------------------------------------------------------------------------------
1 | import { NgModule } from '@angular/core';
2 | import { CreateDependencyDialogComponent } from './create-dependency-dialog.component';
3 | import { MicrocatalogSharedModule } from '../../../shared/shared.module';
4 | import { MicroserviceSearchModule } from '../../../entities/microservice/microservice-dashboard/microservice-search/microservice-search.module';
5 |
6 | @NgModule({
7 | imports: [MicroserviceSearchModule, MicrocatalogSharedModule],
8 | declarations: [CreateDependencyDialogComponent],
9 | })
10 | export class CreateDependencyDialogModule {}
11 |
--------------------------------------------------------------------------------
/src/main/java/com/github/microcatalog/security/UserNotActivatedException.java:
--------------------------------------------------------------------------------
1 | package com.github.microcatalog.security;
2 |
3 | import org.springframework.security.core.AuthenticationException;
4 |
5 | /**
6 | * This exception is thrown in case of a not activated user trying to authenticate.
7 | */
8 | public class UserNotActivatedException extends AuthenticationException {
9 |
10 | private static final long serialVersionUID = 1L;
11 |
12 | public UserNotActivatedException(String message) {
13 | super(message);
14 | }
15 |
16 | public UserNotActivatedException(String message, Throwable t) {
17 | super(message, t);
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/src/test/java/com/github/microcatalog/service/custom/dto/custom/DependencyDtoTest.java:
--------------------------------------------------------------------------------
1 | package com.github.microcatalog.service.custom.dto.custom;
2 |
3 | import com.github.microcatalog.service.dto.custom.DependencyDto;
4 | import nl.jqno.equalsverifier.EqualsVerifier;
5 | import nl.jqno.equalsverifier.Warning;
6 | import org.junit.jupiter.api.Test;
7 |
8 | class DependencyDtoTest {
9 |
10 | @Test
11 | void testEquals() {
12 | EqualsVerifier.forClass(DependencyDto.class)
13 | .withRedefinedSuperclass()
14 | .withOnlyTheseFields("id")
15 | .suppress(Warning.NONFINAL_FIELDS)
16 | .verify();
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/src/test/java/com/github/microcatalog/service/custom/dto/custom/MicroserviceDtoTest.java:
--------------------------------------------------------------------------------
1 | package com.github.microcatalog.service.custom.dto.custom;
2 |
3 | import com.github.microcatalog.service.dto.custom.MicroserviceDto;
4 | import nl.jqno.equalsverifier.EqualsVerifier;
5 | import nl.jqno.equalsverifier.Warning;
6 | import org.junit.jupiter.api.Test;
7 |
8 | class MicroserviceDtoTest {
9 |
10 | @Test
11 | void testEquals() {
12 | EqualsVerifier.forClass(MicroserviceDto.class)
13 | .withRedefinedSuperclass()
14 | .withOnlyTheseFields("id")
15 | .suppress(Warning.NONFINAL_FIELDS)
16 | .verify();
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/src/main/webapp/i18n/en/audits.json:
--------------------------------------------------------------------------------
1 | {
2 | "audits": {
3 | "title": "Audits",
4 | "filter": {
5 | "title": "Filter per date",
6 | "from": "from",
7 | "to": "to",
8 | "button": {
9 | "weeks": "Weeks",
10 | "today": "today",
11 | "clear": "clear",
12 | "close": "close"
13 | }
14 | },
15 | "table": {
16 | "header": {
17 | "principal": "User",
18 | "date": "Date",
19 | "status": "State",
20 | "data": "Extra data"
21 | },
22 | "data": {
23 | "remoteAddress": "Remote Address:"
24 | }
25 | },
26 | "notFound": "No audit found"
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/src/main/java/com/github/microcatalog/web/rest/vm/KeyAndPasswordVM.java:
--------------------------------------------------------------------------------
1 | package com.github.microcatalog.web.rest.vm;
2 |
3 | /**
4 | * View Model object for storing the user's key and password.
5 | */
6 | public class KeyAndPasswordVM {
7 |
8 | private String key;
9 |
10 | private String newPassword;
11 |
12 | public String getKey() {
13 | return key;
14 | }
15 |
16 | public void setKey(String key) {
17 | this.key = key;
18 | }
19 |
20 | public String getNewPassword() {
21 | return newPassword;
22 | }
23 |
24 | public void setNewPassword(String newPassword) {
25 | this.newPassword = newPassword;
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/src/main/webapp/app/core/login/login-modal.service.ts:
--------------------------------------------------------------------------------
1 | import { Injectable } from '@angular/core';
2 | import { NgbModal, NgbModalRef } from '@ng-bootstrap/ng-bootstrap';
3 |
4 | import { LoginModalComponent } from 'app/shared/login/login.component';
5 |
6 | @Injectable({ providedIn: 'root' })
7 | export class LoginModalService {
8 | private isOpen = false;
9 |
10 | constructor(private modalService: NgbModal) {}
11 |
12 | open(): void {
13 | if (this.isOpen) {
14 | return;
15 | }
16 | this.isOpen = true;
17 | const modalRef: NgbModalRef = this.modalService.open(LoginModalComponent);
18 | modalRef.result.finally(() => (this.isOpen = false));
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/src/main/webapp/i18n/de/custom-microservice.json:
--------------------------------------------------------------------------------
1 | {
2 | "microcatalogApp": {
3 | "microservice": {
4 | "search": {
5 | "placeholder": "Suchbegriff...",
6 | "group": {
7 | "case": "Case-sensitive search",
8 | "team": "Select Team...",
9 | "status": "Select Status...",
10 | "search": "Search",
11 | "clear": "Clear filters"
12 | }
13 | }
14 | },
15 | "dashboard": {
16 | "dependency": {
17 | "filter": {
18 | "incoming": "Eingehende Abhängigkeiten anzeigen",
19 | "outgoing": "Ausgehende Abhängigkeiten anzeigen"
20 | }
21 | }
22 | }
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/src/main/webapp/app/entities/team/team-detail.component.ts:
--------------------------------------------------------------------------------
1 | import { Component, OnInit } from '@angular/core';
2 | import { ActivatedRoute } from '@angular/router';
3 |
4 | import { ITeam } from 'app/shared/model/team.model';
5 |
6 | @Component({
7 | selector: 'jhi-team-detail',
8 | templateUrl: './team-detail.component.html',
9 | })
10 | export class TeamDetailComponent implements OnInit {
11 | team: ITeam | null = null;
12 |
13 | constructor(protected activatedRoute: ActivatedRoute) {}
14 |
15 | ngOnInit(): void {
16 | this.activatedRoute.data.subscribe(({ team }) => (this.team = team));
17 | }
18 |
19 | previousState(): void {
20 | window.history.back();
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/.jhipster/Status.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Status",
3 | "fields": [
4 | {
5 | "fieldName": "name",
6 | "fieldType": "String",
7 | "fieldValidateRules": [
8 | "required",
9 | "unique"
10 | ]
11 | },
12 | {
13 | "fieldName": "description",
14 | "fieldType": "String"
15 | }
16 | ],
17 | "relationships": [],
18 | "changelogDate": "20201003191729",
19 | "entityTableName": "status",
20 | "dto": "no",
21 | "pagination": "no",
22 | "service": "no",
23 | "jpaMetamodelFiltering": false,
24 | "fluentMethods": true,
25 | "readOnly": false,
26 | "embedded": false,
27 | "clientRootFolder": "",
28 | "applications": "*"
29 | }
30 |
--------------------------------------------------------------------------------
/cypress/integration/release-path.ts:
--------------------------------------------------------------------------------
1 | describe.only('release path', () => {
2 |
3 | before(function login() {
4 | cy.logout();
5 | cy.loginUser();
6 | })
7 |
8 | it('release path is shown', function () {
9 | cy.server();
10 | cy.route('GET', '/api/release-path/microservice/1').as('apiRequest');
11 |
12 | cy.visit('/dashboard/release-path/1');
13 |
14 | cy.wait('@apiRequest');
15 | cy.get('jhi-release-path > .p3 > .vis-network > canvas');
16 |
17 | cy.wait(1000); // dirty hack, community help is needed
18 |
19 | cy.get('jhi-release-graph > .p3 > .vis-network > canvas');
20 |
21 | cy.percySnapshot('release-path', { widths: [1024] });
22 | })
23 |
24 | })
25 |
--------------------------------------------------------------------------------
/src/main/webapp/app/core/auth/state-storage.service.ts:
--------------------------------------------------------------------------------
1 | import { Injectable } from '@angular/core';
2 | import { SessionStorageService } from 'ngx-webstorage';
3 |
4 | @Injectable({ providedIn: 'root' })
5 | export class StateStorageService {
6 | private previousUrlKey = 'previousUrl';
7 |
8 | constructor(private $sessionStorage: SessionStorageService) {}
9 |
10 | storeUrl(url: string): void {
11 | this.$sessionStorage.store(this.previousUrlKey, url);
12 | }
13 |
14 | getUrl(): string | null | undefined {
15 | return this.$sessionStorage.retrieve(this.previousUrlKey);
16 | }
17 |
18 | clearUrl(): void {
19 | this.$sessionStorage.clear(this.previousUrlKey);
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/src/main/webapp/i18n/de/audits.json:
--------------------------------------------------------------------------------
1 | {
2 | "audits": {
3 | "title": "Audits",
4 | "filter": {
5 | "title": "Nach Datum filtern",
6 | "from": "von",
7 | "to": "bis",
8 | "button": {
9 | "weeks": "Wochen",
10 | "today": "heute",
11 | "clear": "leeren",
12 | "close": "abschließen"
13 | }
14 | },
15 | "table": {
16 | "header": {
17 | "principal": "Benutzer",
18 | "date": "Datum",
19 | "status": "Stand",
20 | "data": "Extra Informationen"
21 | },
22 | "data": {
23 | "remoteAddress": "Remote-Adresse:"
24 | }
25 | },
26 | "notFound": "No audit found"
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/src/test/java/com/github/microcatalog/utils/MicroserviceBuilderTest.java:
--------------------------------------------------------------------------------
1 | package com.github.microcatalog.utils;
2 |
3 | import com.github.microcatalog.domain.Microservice;
4 | import org.junit.jupiter.api.Test;
5 |
6 | import static org.assertj.core.api.Assertions.assertThat;
7 |
8 | class MicroserviceBuilderTest {
9 |
10 | @Test
11 | void build() {
12 | MicroserviceBuilder builder = new MicroserviceBuilder();
13 | Microservice microservice = builder.withId(1L).withName("Test microservice").build();
14 | assertThat(microservice).isNotNull()
15 | .extracting(Microservice::getId, Microservice::getName).containsExactly(1L, "Test microservice");
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/src/main/java/com/github/microcatalog/security/SpringSecurityAuditorAware.java:
--------------------------------------------------------------------------------
1 | package com.github.microcatalog.security;
2 |
3 | import com.github.microcatalog.config.Constants;
4 |
5 | import java.util.Optional;
6 |
7 | import org.springframework.data.domain.AuditorAware;
8 | import org.springframework.stereotype.Component;
9 |
10 | /**
11 | * Implementation of {@link AuditorAware} based on Spring Security.
12 | */
13 | @Component
14 | public class SpringSecurityAuditorAware implements AuditorAware {
15 |
16 | @Override
17 | public Optional getCurrentAuditor() {
18 | return Optional.of(SecurityUtils.getCurrentUserLogin().orElse(Constants.SYSTEM_ACCOUNT));
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/src/main/webapp/app/entities/status/status-detail.component.ts:
--------------------------------------------------------------------------------
1 | import { Component, OnInit } from '@angular/core';
2 | import { ActivatedRoute } from '@angular/router';
3 |
4 | import { IStatus } from 'app/shared/model/status.model';
5 |
6 | @Component({
7 | selector: 'jhi-status-detail',
8 | templateUrl: './status-detail.component.html',
9 | })
10 | export class StatusDetailComponent implements OnInit {
11 | status: IStatus | null = null;
12 |
13 | constructor(protected activatedRoute: ActivatedRoute) {}
14 |
15 | ngOnInit(): void {
16 | this.activatedRoute.data.subscribe(({ status }) => (this.status = status));
17 | }
18 |
19 | previousState(): void {
20 | window.history.back();
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/src/test/java/com/github/microcatalog/MockMvcWithUser.java:
--------------------------------------------------------------------------------
1 | package com.github.microcatalog;
2 |
3 | import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
4 | import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureWebMvc;
5 | import org.springframework.security.test.context.support.WithMockUser;
6 |
7 | import java.lang.annotation.ElementType;
8 | import java.lang.annotation.Retention;
9 | import java.lang.annotation.RetentionPolicy;
10 | import java.lang.annotation.Target;
11 |
12 | @Target({ElementType.TYPE})
13 | @Retention(RetentionPolicy.RUNTIME)
14 | @AutoConfigureWebMvc
15 | @AutoConfigureMockMvc
16 | @WithMockUser
17 | public @interface MockMvcWithUser {
18 | }
19 |
--------------------------------------------------------------------------------
/src/main/java/com/github/microcatalog/utils/MicroserviceBuilder.java:
--------------------------------------------------------------------------------
1 | package com.github.microcatalog.utils;
2 |
3 | import com.github.microcatalog.domain.Microservice;
4 |
5 | public class MicroserviceBuilder {
6 | private Long id;
7 | private String name;
8 |
9 | public MicroserviceBuilder withId(Long id) {
10 | this.id = id;
11 | return this;
12 | }
13 |
14 | public MicroserviceBuilder withName(String name){
15 | this.name = name;
16 | return this;
17 | }
18 |
19 | public Microservice build() {
20 | final Microservice result = new Microservice();
21 | result.setId(id);
22 | result.setName(name);
23 | return result;
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/src/main/webapp/app/entities/microservice/microservice-dashboard/microservice-search/microservice-search.module.ts:
--------------------------------------------------------------------------------
1 | import { NgModule } from '@angular/core';
2 | import { MicroserviceSearchComponent } from './microservice-search.component';
3 | import { MicrocatalogSharedModule } from 'app/shared/shared.module';
4 | import { MicroserviceGroupFilterModule } from 'app/entities/microservice/microservice-dashboard/microservice-search/microservice-group-filter/microservice-group-filter.module';
5 |
6 | @NgModule({
7 | declarations: [MicroserviceSearchComponent],
8 | imports: [MicrocatalogSharedModule, MicroserviceGroupFilterModule],
9 | exports: [MicroserviceSearchComponent],
10 | })
11 | export class MicroserviceSearchModule {}
12 |
--------------------------------------------------------------------------------
/src/main/webapp/app/dashboard/dependency-dashboard/node-legend/graph-legend.component.ts:
--------------------------------------------------------------------------------
1 | import { Component, Input, OnInit } from '@angular/core';
2 | import { ISelectPayload } from 'app/shared/vis/events/VisEvents';
3 | import { DEVELOPMENT_COMPONENTS, GRAPH_FIXED_SEED } from 'app/app.constants';
4 |
5 | @Component({
6 | selector: 'jhi-node-legend',
7 | templateUrl: './graph-legend.component.html',
8 | })
9 | export class GraphLegendComponent implements OnInit {
10 | @Input() nodeSelection?: ISelectPayload;
11 | @Input() edgeSelection?: ISelectPayload;
12 |
13 | graphFixedSeed = GRAPH_FIXED_SEED;
14 | developmentComponents = DEVELOPMENT_COMPONENTS;
15 |
16 | constructor() {}
17 |
18 | ngOnInit(): void {}
19 | }
20 |
--------------------------------------------------------------------------------
/src/main/webapp/i18n/en/health.json:
--------------------------------------------------------------------------------
1 | {
2 | "health": {
3 | "title": "Health Checks",
4 | "refresh.button": "Refresh",
5 | "stacktrace": "Stacktrace",
6 | "details": {
7 | "details": "Details",
8 | "properties": "Properties",
9 | "name": "Name",
10 | "value": "Value",
11 | "error": "Error"
12 | },
13 | "indicator": {
14 | "diskSpace": "Disk space",
15 | "mail": "Email",
16 | "ping": "Application",
17 | "db": "Database"
18 | },
19 | "table": {
20 | "service": "Service name",
21 | "status": "Status"
22 | },
23 | "status": {
24 | "UNKNOWN": "UNKNOWN",
25 | "UP": "UP",
26 | "DOWN": "DOWN"
27 | }
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/src/main/webapp/app/dashboard/dependency-dashboard/node-legend/coordinates-e2e/coordinates-e2e.component.html:
--------------------------------------------------------------------------------
1 |
2 | Node selection:
3 |
4 | Canvas: {{nodeSelection?.pointer?.canvas?.x}},{{nodeSelection?.pointer?.canvas?.y}}
5 |
6 | DOM: {{nodeSelection?.pointer?.DOM?.x}},{{nodeSelection?.pointer?.DOM?.y}}
7 |
8 |
9 | Edge selection:
10 |
11 | Canvas: {{edgeSelection?.pointer?.canvas?.x}},{{edgeSelection?.pointer?.canvas?.y}}
12 |
13 | DOM: {{edgeSelection?.pointer?.DOM?.x}},{{edgeSelection?.pointer?.DOM?.y}}
14 |
15 |
--------------------------------------------------------------------------------
/src/main/webapp/app/dashboard/release-path-dashboard/node-colors.service.ts:
--------------------------------------------------------------------------------
1 | import { Injectable } from '@angular/core';
2 |
3 | @Injectable({
4 | providedIn: 'root',
5 | })
6 | export class NodeColorsService {
7 | private defaultColor = '#97C2FC';
8 | private activeColor = '#61dd45';
9 | private colors: string[] = ['#d33682', '#cb4b16', '#268bd2', '#2aa198', '#839496', '#b58900', '#002b36', '#9b479f'];
10 |
11 | constructor() {}
12 |
13 | getActiveColor(): string {
14 | return this.activeColor;
15 | }
16 |
17 | getColor(index: number): string {
18 | if (index < 0 || index > this.colors.length) {
19 | return this.defaultColor;
20 | } else {
21 | return this.colors[index];
22 | }
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/src/main/resources/config/liquibase/fake-data/dependency.csv:
--------------------------------------------------------------------------------
1 | id;name;description;source_id;target_id
2 | 1;1->2;../fake-data/blob/hipster.txt;1;2
3 | 2;1->8;../fake-data/blob/hipster.txt;1;8
4 | 3;9->1;../fake-data/blob/hipster.txt;9;1
5 | 4;Some old service->1;../fake-data/blob/hipster.txt;11;1
6 | 5;2->4;../fake-data/blob/hipster.txt;2;4
7 | 6;4->8;../fake-data/blob/hipster.txt;4;8
8 | 7;6->4;../fake-data/blob/hipster.txt;6;4
9 | 8;4->5;../fake-data/blob/hipster.txt;4;5
10 | 9;4->7;../fake-data/blob/hipster.txt;4;7
11 | 10;4->10;../fake-data/blob/hipster.txt;4;10
12 | 11;7->10;../fake-data/blob/hipster.txt;7;10
13 | 12;10->5;../fake-data/blob/hipster.txt;10;5
14 | 13;3->5;../fake-data/blob/hipster.txt;3;5
15 | 20;20->21;../fake-data/blob/hipster.txt;20;21
16 |
--------------------------------------------------------------------------------
/src/main/webapp/i18n/de/health.json:
--------------------------------------------------------------------------------
1 | {
2 | "health": {
3 | "title": "Gesundheit Ihrer Anwendung",
4 | "refresh.button": "Aktualisieren",
5 | "stacktrace": "Stacktrace",
6 | "details": {
7 | "details": "Details",
8 | "properties": "Properties",
9 | "name": "Name",
10 | "value": "Wert",
11 | "error": "Error"
12 | },
13 | "indicator": {
14 | "diskSpace": "Festplattenspeicher",
15 | "mail": "Email",
16 | "ping": "Application",
17 | "db": "Datenbank"
18 | },
19 | "table": {
20 | "service": "Dienst Name",
21 | "status": "Status"
22 | },
23 | "status": {
24 | "UNKNOWN": "UNKNOWN",
25 | "UP": "UP",
26 | "DOWN": "DOWN"
27 | }
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/src/test/javascript/spec/helpers/mock-state-storage.service.ts:
--------------------------------------------------------------------------------
1 | import Spy = jasmine.Spy;
2 |
3 | import { SpyObject } from './spyobject';
4 | import { StateStorageService } from 'app/core/auth/state-storage.service';
5 |
6 | export class MockStateStorageService extends SpyObject {
7 | getUrlSpy: Spy;
8 | storeUrlSpy: Spy;
9 | clearUrlSpy: Spy;
10 |
11 | constructor() {
12 | super(StateStorageService);
13 | this.getUrlSpy = this.spy('getUrl').andReturn(null);
14 | this.storeUrlSpy = this.spy('storeUrl').andReturn(this);
15 | this.clearUrlSpy = this.spy('clearUrl').andReturn(this);
16 | }
17 |
18 | setResponse(previousUrl: string | null): void {
19 | this.getUrlSpy = this.spy('getUrl').andReturn(previousUrl);
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/src/main/webapp/app/admin/logs/logs.service.ts:
--------------------------------------------------------------------------------
1 | import { Injectable } from '@angular/core';
2 | import { HttpClient } from '@angular/common/http';
3 | import { Observable } from 'rxjs';
4 |
5 | import { SERVER_API_URL } from 'app/app.constants';
6 | import { LoggersResponse, Level } from './log.model';
7 |
8 | @Injectable({ providedIn: 'root' })
9 | export class LogsService {
10 | constructor(private http: HttpClient) {}
11 |
12 | changeLevel(name: string, configuredLevel: Level): Observable<{}> {
13 | return this.http.post(SERVER_API_URL + 'management/loggers/' + name, { configuredLevel });
14 | }
15 |
16 | findAll(): Observable {
17 | return this.http.get(SERVER_API_URL + 'management/loggers');
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/src/main/webapp/i18n/de/status.json:
--------------------------------------------------------------------------------
1 | {
2 | "microcatalogApp": {
3 | "status": {
4 | "home": {
5 | "title": "Statuses",
6 | "createLabel": "Status erstellen",
7 | "createOrEditLabel": "Status erstellen oder bearbeiten",
8 | "notFound": "No Statuses found"
9 | },
10 | "created": "Status erstellt mit ID {{ param }}",
11 | "updated": "Status aktualisiert mit ID {{ param }}",
12 | "deleted": "Status gelöscht mit ID {{ param }}",
13 | "delete": {
14 | "question": "Soll Status {{ id }} wirklich dauerhaft gelöscht werden?"
15 | },
16 | "detail": {
17 | "title": "Status"
18 | },
19 | "name": "Name",
20 | "description": "Description"
21 | }
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/src/main/webapp/i18n/en/home.json:
--------------------------------------------------------------------------------
1 | {
2 | "home": {
3 | "title": "Welcome, Java Hipster!",
4 | "subtitle": "Here is microservices catalog",
5 | "logged": {
6 | "message": "You are logged in as user \"{{username}}\"."
7 | },
8 | "question": "If you have any question on microservice-catalog:",
9 | "link": {
10 | "homepage": "microservice-catalog homepage",
11 | "stackoverflow": "microservice-catalog on Stack Overflow",
12 | "bugtracker": "microservice-catalog bug tracker",
13 | "chat": "microservice-catalog public chat room",
14 | "follow": "follow @tillias on Twitter"
15 | },
16 | "like": "If you like microservice-catalog, don't forget to give us a star on",
17 | "github": "GitHub"
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/src/main/webapp/i18n/de/team.json:
--------------------------------------------------------------------------------
1 | {
2 | "microcatalogApp": {
3 | "team": {
4 | "home": {
5 | "title": "Teams",
6 | "createLabel": "Team erstellen",
7 | "createOrEditLabel": "Team erstellen oder bearbeiten",
8 | "notFound": "No Teams found"
9 | },
10 | "created": "Team erstellt mit ID {{ param }}",
11 | "updated": "Team aktualisiert mit ID {{ param }}",
12 | "deleted": "Team gelöscht mit ID {{ param }}",
13 | "delete": {
14 | "question": "Soll Team {{ id }} wirklich dauerhaft gelöscht werden?"
15 | },
16 | "detail": {
17 | "title": "Team"
18 | },
19 | "name": "Name",
20 | "teamLead": "Team Lead",
21 | "productOwner": "Product Owner"
22 | }
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/src/test/java/com/github/microcatalog/domain/TeamTest.java:
--------------------------------------------------------------------------------
1 | package com.github.microcatalog.domain;
2 |
3 | import org.junit.jupiter.api.Test;
4 | import static org.assertj.core.api.Assertions.assertThat;
5 | import com.github.microcatalog.web.rest.TestUtil;
6 |
7 | public class TeamTest {
8 |
9 | @Test
10 | public void equalsVerifier() throws Exception {
11 | TestUtil.equalsVerifier(Team.class);
12 | Team team1 = new Team();
13 | team1.setId(1L);
14 | Team team2 = new Team();
15 | team2.setId(team1.getId());
16 | assertThat(team1).isEqualTo(team2);
17 | team2.setId(2L);
18 | assertThat(team1).isNotEqualTo(team2);
19 | team1.setId(null);
20 | assertThat(team1).isNotEqualTo(team2);
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/src/main/resources/config/liquibase/data/user.csv:
--------------------------------------------------------------------------------
1 | id;login;password_hash;first_name;last_name;email;image_url;activated;lang_key;created_by;last_modified_by
2 | 1;system;$2a$10$mE.qmcV0mFU5NcKh73TZx.z4ueI/.bDWbj0T1BYyqP481kGGarKLG;System;System;system@localhost;;true;en;system;system
3 | 2;anonymoususer;$2a$10$j8S5d7Sr7.8VTOYNviDPOeWX8KcYILUVJBsYV83Y5NtECayypx9lO;Anonymous;User;anonymous@localhost;;true;en;system;system
4 | 3;admin;$2a$10$gSAhZrxMllrbgj/kkK9UceBPpChGWJA7SYIb1Mqo.n5aNLq1/oRrC;Administrator;Administrator;admin@localhost;;true;en;system;system
5 | 4;user;$2a$10$VEjxo0jq2YG9Rbk2HmX9S.k1uZBGYUHdUcid3g/vfiEl7lwWgOH/K;User;User;user@localhost;;true;en;system;system
6 | 5;import;$2a$10$kaYVCI89dXNlKdD2.x/9yu/.IlCyQMAjqB4o998EAMckI2f/zJuLK;Import;Import;import@localhost;;true;en;system;system
7 |
--------------------------------------------------------------------------------
/src/main/webapp/app/app.constants.ts:
--------------------------------------------------------------------------------
1 | // These constants are injected via webpack environment variables.
2 | // You can add more variables in webpack.common.js or in profile specific webpack..js files.
3 | // If you change the values in the webpack config files, you need to re run webpack to update the application
4 |
5 | export const VERSION = process.env.VERSION;
6 | export const DEBUG_INFO_ENABLED = Boolean(process.env.DEBUG_INFO_ENABLED);
7 | export const SERVER_API_URL = process.env.SERVER_API_URL;
8 | export const BUILD_TIMESTAMP = process.env.BUILD_TIMESTAMP;
9 | export const EXPERIMENTAL_FEATURE = process.env.EXPERIMENTAL_FEATURE;
10 | export const GRAPH_FIXED_SEED = process.env.GRAPH_FIXED_SEED;
11 | export const DEVELOPMENT_COMPONENTS = process.env.DEVELOPMENT_COMPONENTS;
12 |
--------------------------------------------------------------------------------
/src/main/webapp/app/entities/microservice/microservice-dashboard/microservice-search/microservice-search.component.html:
--------------------------------------------------------------------------------
1 |
2 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/src/main/webapp/i18n/en/status.json:
--------------------------------------------------------------------------------
1 | {
2 | "microcatalogApp": {
3 | "status": {
4 | "home": {
5 | "title": "Statuses",
6 | "createLabel": "Create a new Status",
7 | "createOrEditLabel": "Create or edit a Status",
8 | "notFound": "No Statuses found"
9 | },
10 | "created": "A new Status is created with identifier {{ param }}",
11 | "updated": "A Status is updated with identifier {{ param }}",
12 | "deleted": "A Status is deleted with identifier {{ param }}",
13 | "delete": {
14 | "question": "Are you sure you want to delete Status {{ id }}?"
15 | },
16 | "detail": {
17 | "title": "Status"
18 | },
19 | "name": "Name",
20 | "description": "Description"
21 | }
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/src/test/java/com/github/microcatalog/cucumber/CucumberContextConfiguration.java:
--------------------------------------------------------------------------------
1 | package com.github.microcatalog.cucumber;
2 |
3 | import com.github.microcatalog.MicrocatalogApp;
4 | import io.cucumber.java.Before;
5 | import org.springframework.boot.test.context.SpringBootTest;
6 | import org.springframework.test.context.ContextConfiguration;
7 | import org.springframework.test.context.web.WebAppConfiguration;
8 |
9 | @SpringBootTest
10 | @WebAppConfiguration
11 | @ContextConfiguration(classes = MicrocatalogApp.class)
12 | public class CucumberContextConfiguration {
13 |
14 | @Before
15 | public void setup_cucumber_spring_context() {
16 | // Dummy method so cucumber will recognize this class as glue
17 | // and use its context configuration.
18 | }
19 |
20 | }
21 |
--------------------------------------------------------------------------------
/src/main/java/com/github/microcatalog/service/custom/exceptions/DuplicateDependencyException.java:
--------------------------------------------------------------------------------
1 | package com.github.microcatalog.service.custom.exceptions;
2 |
3 | import com.github.microcatalog.service.dto.custom.DependencyDto;
4 |
5 | /**
6 | * Occurs when dependency with given source and target already exists
7 | */
8 | public class DuplicateDependencyException extends RuntimeException {
9 | private static final long serialVersionUID = -6123761206700419670L;
10 |
11 | private final DependencyDto dependency;
12 |
13 | public DuplicateDependencyException(String message, DependencyDto dependency) {
14 | super(message);
15 | this.dependency = dependency;
16 | }
17 |
18 | public DependencyDto getDependency() {
19 | return dependency;
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/src/main/webapp/app/account/account.route.ts:
--------------------------------------------------------------------------------
1 | import { Routes } from '@angular/router';
2 |
3 | import { activateRoute } from './activate/activate.route';
4 | import { passwordRoute } from './password/password.route';
5 | import { passwordResetFinishRoute } from './password-reset/finish/password-reset-finish.route';
6 | import { passwordResetInitRoute } from './password-reset/init/password-reset-init.route';
7 | import { registerRoute } from './register/register.route';
8 | import { settingsRoute } from './settings/settings.route';
9 |
10 | const ACCOUNT_ROUTES = [activateRoute, passwordRoute, passwordResetFinishRoute, passwordResetInitRoute, registerRoute, settingsRoute];
11 |
12 | export const accountState: Routes = [
13 | {
14 | path: '',
15 | children: ACCOUNT_ROUTES,
16 | },
17 | ];
18 |
--------------------------------------------------------------------------------
/src/main/java/com/github/microcatalog/service/custom/exceptions/SelfCircularException.java:
--------------------------------------------------------------------------------
1 | package com.github.microcatalog.service.custom.exceptions;
2 |
3 | import com.github.microcatalog.service.dto.custom.MicroserviceDto;
4 |
5 | /**
6 | * Occurs when there is attempt creating dependency with source and target pointing to the same microservice
7 | */
8 | public class SelfCircularException extends RuntimeException {
9 | private static final long serialVersionUID = 8533101069660472099L;
10 |
11 | private final MicroserviceDto source;
12 |
13 | public SelfCircularException(String message, MicroserviceDto source) {
14 | super(message);
15 |
16 | this.source = source;
17 | }
18 |
19 | public MicroserviceDto getSource() {
20 | return source;
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/src/main/java/com/github/microcatalog/service/dto/custom/DependencyDto.java:
--------------------------------------------------------------------------------
1 | package com.github.microcatalog.service.dto.custom;
2 |
3 | import java.io.Serializable;
4 |
5 | public final class DependencyDto extends BaseDto implements Serializable {
6 | private static final long serialVersionUID = 984616324705586469L;
7 |
8 | private MicroserviceDto source;
9 | private MicroserviceDto target;
10 |
11 | public MicroserviceDto getSource() {
12 | return source;
13 | }
14 |
15 | public void setSource(MicroserviceDto source) {
16 | this.source = source;
17 | }
18 |
19 | public MicroserviceDto getTarget() {
20 | return target;
21 | }
22 |
23 | public void setTarget(MicroserviceDto target) {
24 | this.target = target;
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/src/main/webapp/i18n/en/team.json:
--------------------------------------------------------------------------------
1 | {
2 | "microcatalogApp": {
3 | "team": {
4 | "home": {
5 | "title": "Teams",
6 | "createLabel": "Create a new Team",
7 | "createOrEditLabel": "Create or edit a Team",
8 | "notFound": "No Teams found"
9 | },
10 | "created": "A new Team is created with identifier {{ param }}",
11 | "updated": "A Team is updated with identifier {{ param }}",
12 | "deleted": "A Team is deleted with identifier {{ param }}",
13 | "delete": {
14 | "question": "Are you sure you want to delete Team {{ id }}?"
15 | },
16 | "detail": {
17 | "title": "Team"
18 | },
19 | "name": "Name",
20 | "teamLead": "Team Lead",
21 | "productOwner": "Product Owner"
22 | }
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/src/main/webapp/i18n/de/home.json:
--------------------------------------------------------------------------------
1 | {
2 | "home": {
3 | "title": "Willkommen, Java Hipster!",
4 | "subtitle": "Hier findest Du Microservice Katalog",
5 | "logged": {
6 | "message": "Sie sind als Benutzer \"{{username}}\" angemeldet."
7 | },
8 | "question": "Wenn Sie Fragen zu microservice-catalog haben:",
9 | "link": {
10 | "homepage": "microservice-catalog Hauptseite",
11 | "stackoverflow": "microservice-catalog auf Stack Overflow",
12 | "bugtracker": "microservice-catalog Fehlereinträge",
13 | "chat": "microservice-catalog Chat",
14 | "follow": "kontaktieren Sie uns mit @tillias auf Twitter"
15 | },
16 | "like": "Wenn Sie microservice-catalog mögen, vergessen Sie nicht uns einen Stern zu geben auf",
17 | "github": "GitHub"
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/src/main/webapp/app/shared/model/microservice.model.ts:
--------------------------------------------------------------------------------
1 | import { ITeam } from 'app/shared/model/team.model';
2 | import { IStatus } from 'app/shared/model/status.model';
3 |
4 | export interface IMicroservice {
5 | id?: number;
6 | name?: string;
7 | description?: any;
8 | imageUrl?: string;
9 | swaggerUrl?: string;
10 | gitUrl?: string;
11 | ciUrl?: string;
12 | team?: ITeam;
13 | status?: IStatus;
14 | }
15 |
16 | export class Microservice implements IMicroservice {
17 | constructor(
18 | public id?: number,
19 | public name?: string,
20 | public description?: any,
21 | public imageUrl?: string,
22 | public swaggerUrl?: string,
23 | public gitUrl?: string,
24 | public ciUrl?: string,
25 | public team?: ITeam,
26 | public status?: IStatus
27 | ) {}
28 | }
29 |
--------------------------------------------------------------------------------
/src/main/webapp/app/shared/shared-libs.module.ts:
--------------------------------------------------------------------------------
1 | import { NgModule } from '@angular/core';
2 | import { CommonModule } from '@angular/common';
3 | import { FormsModule, ReactiveFormsModule } from '@angular/forms';
4 | import { NgbModule } from '@ng-bootstrap/ng-bootstrap';
5 | import { NgJhipsterModule } from 'ng-jhipster';
6 | import { InfiniteScrollModule } from 'ngx-infinite-scroll';
7 | import { FontAwesomeModule } from '@fortawesome/angular-fontawesome';
8 | import { TranslateModule } from '@ngx-translate/core';
9 |
10 | @NgModule({
11 | exports: [
12 | FormsModule,
13 | CommonModule,
14 | NgbModule,
15 | NgJhipsterModule,
16 | InfiniteScrollModule,
17 | FontAwesomeModule,
18 | ReactiveFormsModule,
19 | TranslateModule,
20 | ],
21 | })
22 | export class MicrocatalogSharedLibsModule {}
23 |
--------------------------------------------------------------------------------
/src/test/java/com/github/microcatalog/domain/StatusTest.java:
--------------------------------------------------------------------------------
1 | package com.github.microcatalog.domain;
2 |
3 | import org.junit.jupiter.api.Test;
4 | import static org.assertj.core.api.Assertions.assertThat;
5 | import com.github.microcatalog.web.rest.TestUtil;
6 |
7 | public class StatusTest {
8 |
9 | @Test
10 | public void equalsVerifier() throws Exception {
11 | TestUtil.equalsVerifier(Status.class);
12 | Status status1 = new Status();
13 | status1.setId(1L);
14 | Status status2 = new Status();
15 | status2.setId(status1.getId());
16 | assertThat(status1).isEqualTo(status2);
17 | status2.setId(2L);
18 | assertThat(status1).isNotEqualTo(status2);
19 | status1.setId(null);
20 | assertThat(status1).isNotEqualTo(status2);
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/src/main/java/com/github/microcatalog/service/custom/exceptions/CircularDependenciesException.java:
--------------------------------------------------------------------------------
1 | package com.github.microcatalog.service.custom.exceptions;
2 |
3 | import com.github.microcatalog.service.dto.custom.MicroserviceDto;
4 |
5 | import java.util.Set;
6 |
7 | /**
8 | * Occurs when adding new dependency will introduce cycle
9 | */
10 | public class CircularDependenciesException extends RuntimeException {
11 | private static final long serialVersionUID = -8709192334943830989L;
12 |
13 | private final Set cycles;
14 |
15 | public CircularDependenciesException(String message, Set cycles) {
16 | super(message);
17 |
18 | this.cycles = cycles;
19 | }
20 |
21 | public Set getCycles() {
22 | return cycles;
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/src/main/webapp/app/dashboard/release-path-dashboard/release-path-dashboard.module.ts:
--------------------------------------------------------------------------------
1 | import { NgModule } from '@angular/core';
2 | import { RouterModule } from '@angular/router';
3 | import { releasePathDashboardRoute } from './release-path-dashboard.route';
4 | import { MicrocatalogSharedModule } from '../../shared/shared.module';
5 | import { ReleasePathDashboardComponent } from './release-path-dashboard.component';
6 | import { ReleasePathModule } from './release-path/release-path.module';
7 | import { ReleaseGraphModule } from './release-graph/release-graph.module';
8 |
9 | @NgModule({
10 | imports: [ReleasePathModule, ReleaseGraphModule, MicrocatalogSharedModule, RouterModule.forChild(releasePathDashboardRoute)],
11 | declarations: [ReleasePathDashboardComponent],
12 | })
13 | export class ReleasePathDashboardModule {}
14 |
--------------------------------------------------------------------------------
/src/main/webapp/app/entities/team/team.module.ts:
--------------------------------------------------------------------------------
1 | import { NgModule } from '@angular/core';
2 | import { RouterModule } from '@angular/router';
3 |
4 | import { MicrocatalogSharedModule } from 'app/shared/shared.module';
5 | import { TeamComponent } from './team.component';
6 | import { TeamDetailComponent } from './team-detail.component';
7 | import { TeamUpdateComponent } from './team-update.component';
8 | import { TeamDeleteDialogComponent } from './team-delete-dialog.component';
9 | import { teamRoute } from './team.route';
10 |
11 | @NgModule({
12 | imports: [MicrocatalogSharedModule, RouterModule.forChild(teamRoute)],
13 | declarations: [TeamComponent, TeamDetailComponent, TeamUpdateComponent, TeamDeleteDialogComponent],
14 | entryComponents: [TeamDeleteDialogComponent],
15 | })
16 | export class MicrocatalogTeamModule {}
17 |
--------------------------------------------------------------------------------
/microcatalog.jdl:
--------------------------------------------------------------------------------
1 | // Core entities
2 |
3 | entity Team {
4 | name String required unique,
5 | teamLead String required,
6 | productOwner String required
7 | }
8 |
9 | entity Status {
10 | name String required unique,
11 | description String
12 | }
13 |
14 | entity Microservice {
15 | name String required unique,
16 | description TextBlob required,
17 | imageUrl String required,
18 | swaggerUrl String required,
19 | gitUrl String required,
20 | ciUrl String required
21 | }
22 |
23 | entity Dependency {
24 | name String required
25 | description TextBlob
26 | }
27 |
28 |
29 | relationship ManyToOne {
30 | Microservice{team required} to Team
31 | Microservice{status required} to Status
32 | Dependency{source required} to Microservice
33 | Dependency{target required} to Microservice
34 | }
35 |
--------------------------------------------------------------------------------
/src/main/webapp/app/shared/util/request-util.ts:
--------------------------------------------------------------------------------
1 | import { HttpParams } from '@angular/common/http';
2 |
3 | export interface Pagination {
4 | page: number;
5 | size: number;
6 | sort: string[];
7 | }
8 |
9 | export interface Search {
10 | query: string;
11 | }
12 |
13 | export interface SearchWithPagination extends Search, Pagination {}
14 |
15 | export const createRequestOption = (req?: any): HttpParams => {
16 | let options: HttpParams = new HttpParams();
17 |
18 | if (req) {
19 | Object.keys(req).forEach(key => {
20 | if (key !== 'sort') {
21 | options = options.set(key, req[key]);
22 | }
23 | });
24 |
25 | if (req.sort) {
26 | req.sort.forEach((val: string) => {
27 | options = options.append('sort', val);
28 | });
29 | }
30 | }
31 |
32 | return options;
33 | };
34 |
--------------------------------------------------------------------------------
/src/main/webapp/app/dashboard/dependency-dashboard/node-legend/graph-legend.module.ts:
--------------------------------------------------------------------------------
1 | import { NgModule } from '@angular/core';
2 | import { GraphLegendComponent } from './graph-legend.component';
3 | import { MicrocatalogSharedModule } from 'app/shared/shared.module';
4 | import { VertexLegendComponent } from './vertex-legend/vertex-legend.component';
5 | import { EdgeLegendComponent } from './edge-legend/edge-legend.component';
6 | import { RouterModule } from '@angular/router';
7 | import { CoordinatesE2eComponent } from './coordinates-e2e/coordinates-e2e.component';
8 |
9 | @NgModule({
10 | declarations: [GraphLegendComponent, VertexLegendComponent, EdgeLegendComponent, CoordinatesE2eComponent],
11 | imports: [MicrocatalogSharedModule, RouterModule],
12 | exports: [GraphLegendComponent],
13 | })
14 | export class GraphLegendModule {}
15 |
--------------------------------------------------------------------------------
/src/main/webapp/app/account/activate/activate.component.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
Activation
5 |
6 |
7 |
Your user account has been activated. Please
8 |
sign in.
9 |
10 |
11 |
12 | Your user could not be activated. Please use the registration form to sign up.
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/src/test/java/com/github/microcatalog/config/NoOpMailConfiguration.java:
--------------------------------------------------------------------------------
1 | package com.github.microcatalog.config;
2 |
3 | import com.github.microcatalog.service.MailService;
4 | import org.springframework.context.annotation.Bean;
5 | import org.springframework.context.annotation.Configuration;
6 |
7 | import static org.mockito.ArgumentMatchers.any;
8 | import static org.mockito.Mockito.doNothing;
9 | import static org.mockito.Mockito.mock;
10 |
11 | @Configuration
12 | public class NoOpMailConfiguration {
13 | private final MailService mockMailService;
14 |
15 | public NoOpMailConfiguration() {
16 | mockMailService = mock(MailService.class);
17 | doNothing().when(mockMailService).sendActivationEmail(any());
18 | }
19 |
20 | @Bean
21 | public MailService mailService() {
22 | return mockMailService;
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/src/main/java/com/github/microcatalog/web/rest/errors/FieldErrorVM.java:
--------------------------------------------------------------------------------
1 | package com.github.microcatalog.web.rest.errors;
2 |
3 | import java.io.Serializable;
4 |
5 | public class FieldErrorVM implements Serializable {
6 |
7 | private static final long serialVersionUID = 1L;
8 |
9 | private final String objectName;
10 |
11 | private final String field;
12 |
13 | private final String message;
14 |
15 | public FieldErrorVM(String dto, String field, String message) {
16 | this.objectName = dto;
17 | this.field = field;
18 | this.message = message;
19 | }
20 |
21 | public String getObjectName() {
22 | return objectName;
23 | }
24 |
25 | public String getField() {
26 | return field;
27 | }
28 |
29 | public String getMessage() {
30 | return message;
31 | }
32 |
33 | }
34 |
--------------------------------------------------------------------------------
/src/main/webapp/app/layouts/error/error.route.ts:
--------------------------------------------------------------------------------
1 | import { Routes } from '@angular/router';
2 |
3 | import { ErrorComponent } from './error.component';
4 |
5 | export const errorRoute: Routes = [
6 | {
7 | path: 'error',
8 | component: ErrorComponent,
9 | data: {
10 | authorities: [],
11 | pageTitle: 'error.title',
12 | },
13 | },
14 | {
15 | path: 'accessdenied',
16 | component: ErrorComponent,
17 | data: {
18 | authorities: [],
19 | pageTitle: 'error.title',
20 | errorMessage: 'error.http.403',
21 | },
22 | },
23 | {
24 | path: '404',
25 | component: ErrorComponent,
26 | data: {
27 | authorities: [],
28 | pageTitle: 'error.title',
29 | errorMessage: 'error.http.404',
30 | },
31 | },
32 | {
33 | path: '**',
34 | redirectTo: '/404',
35 | },
36 | ];
37 |
--------------------------------------------------------------------------------
/src/main/webapp/i18n/de/dependency.json:
--------------------------------------------------------------------------------
1 | {
2 | "microcatalogApp": {
3 | "dependency": {
4 | "home": {
5 | "title": "Dependencies",
6 | "createLabel": "Dependency erstellen",
7 | "createOrEditLabel": "Dependency erstellen oder bearbeiten",
8 | "notFound": "No Dependencies found"
9 | },
10 | "created": "Dependency erstellt mit ID {{ param }}",
11 | "updated": "Dependency aktualisiert mit ID {{ param }}",
12 | "deleted": "Dependency gelöscht mit ID {{ param }}",
13 | "delete": {
14 | "question": "Soll Dependency {{ id }} wirklich dauerhaft gelöscht werden?"
15 | },
16 | "detail": {
17 | "title": "Dependency"
18 | },
19 | "name": "Name",
20 | "description": "Description",
21 | "source": "Source",
22 | "target": "Target"
23 | }
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/src/main/webapp/app/entities/status/status.module.ts:
--------------------------------------------------------------------------------
1 | import { NgModule } from '@angular/core';
2 | import { RouterModule } from '@angular/router';
3 |
4 | import { MicrocatalogSharedModule } from 'app/shared/shared.module';
5 | import { StatusComponent } from './status.component';
6 | import { StatusDetailComponent } from './status-detail.component';
7 | import { StatusUpdateComponent } from './status-update.component';
8 | import { StatusDeleteDialogComponent } from './status-delete-dialog.component';
9 | import { statusRoute } from './status.route';
10 |
11 | @NgModule({
12 | imports: [MicrocatalogSharedModule, RouterModule.forChild(statusRoute)],
13 | declarations: [StatusComponent, StatusDetailComponent, StatusUpdateComponent, StatusDeleteDialogComponent],
14 | entryComponents: [StatusDeleteDialogComponent],
15 | })
16 | export class MicrocatalogStatusModule {}
17 |
--------------------------------------------------------------------------------
/src/main/java/com/github/microcatalog/config/DateTimeFormatConfiguration.java:
--------------------------------------------------------------------------------
1 | package com.github.microcatalog.config;
2 |
3 | import org.springframework.context.annotation.Configuration;
4 | import org.springframework.format.FormatterRegistry;
5 | import org.springframework.format.datetime.standard.DateTimeFormatterRegistrar;
6 | import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
7 |
8 | /**
9 | * Configure the converters to use the ISO format for dates by default.
10 | */
11 | @Configuration
12 | public class DateTimeFormatConfiguration implements WebMvcConfigurer {
13 |
14 | @Override
15 | public void addFormatters(FormatterRegistry registry) {
16 | DateTimeFormatterRegistrar registrar = new DateTimeFormatterRegistrar();
17 | registrar.setUseIsoFormat(true);
18 | registrar.registerFormatters(registry);
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/src/main/webapp/app/dashboard/dashboard-routing.module.ts:
--------------------------------------------------------------------------------
1 | import { NgModule } from '@angular/core';
2 | import { RouterModule } from '@angular/router';
3 |
4 | @NgModule({
5 | imports: [
6 | RouterModule.forChild([
7 | {
8 | path: 'dependencies',
9 | loadChildren: () => import('./dependency-dashboard/dependency-dashboard.module').then(m => m.DependencyDashboardModule),
10 | },
11 | {
12 | path: 'release-path',
13 | loadChildren: () => import('./release-path-dashboard/release-path-dashboard.module').then(m => m.ReleasePathDashboardModule),
14 | },
15 | {
16 | path: 'impact-analysis',
17 | loadChildren: () => import('./impact-analysis/impact-analysis-dashboard.module').then(m => m.ImpactAnalysisDashboardModule),
18 | },
19 | ]),
20 | ],
21 | })
22 | export class DashboardRoutingModule {}
23 |
--------------------------------------------------------------------------------
/src/main/webapp/app/layouts/profiles/page-ribbon.component.ts:
--------------------------------------------------------------------------------
1 | import { Component, OnInit } from '@angular/core';
2 | import { Observable } from 'rxjs';
3 | import { map } from 'rxjs/operators';
4 | import { ProfileService } from './profile.service';
5 |
6 | @Component({
7 | selector: 'jhi-page-ribbon',
8 | template: `
9 |
12 | `,
13 | styleUrls: ['page-ribbon.scss'],
14 | })
15 | export class PageRibbonComponent implements OnInit {
16 | ribbonEnv$?: Observable;
17 |
18 | constructor(private profileService: ProfileService) {}
19 |
20 | ngOnInit(): void {
21 | this.ribbonEnv$ = this.profileService.getProfileInfo().pipe(map(profileInfo => profileInfo.ribbonEnv));
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/cypress/support/index.js:
--------------------------------------------------------------------------------
1 | // ***********************************************************
2 | // This example support/index.js is processed and
3 | // loaded automatically before your test files.
4 | //
5 | // This is a great place to put global configuration and
6 | // behavior that modifies Cypress.
7 | //
8 | // You can change the location of this file or turn off
9 | // automatically serving support files with the
10 | // 'supportFile' configuration option.
11 | //
12 | // You can read more here:
13 | // https://on.cypress.io/configuration
14 | // ***********************************************************
15 |
16 |
17 |
18 | // Import commands.js using ES2015 syntax:
19 | import './commands.js'
20 | import './commands.ts'
21 |
22 | require('cypress-commands');
23 | require('@percy/cypress')
24 |
25 | // Alternatively you can use CommonJS syntax:
26 | // require('./commands')
27 |
--------------------------------------------------------------------------------
/src/main/resources/banner.txt:
--------------------------------------------------------------------------------
1 |
2 | ${AnsiColor.GREEN} ██╗${AnsiColor.RED} ██╗ ██╗ ████████╗ ███████╗ ██████╗ ████████╗ ████████╗ ███████╗
3 | ${AnsiColor.GREEN} ██║${AnsiColor.RED} ██║ ██║ ╚══██╔══╝ ██╔═══██╗ ██╔════╝ ╚══██╔══╝ ██╔═════╝ ██╔═══██╗
4 | ${AnsiColor.GREEN} ██║${AnsiColor.RED} ████████║ ██║ ███████╔╝ ╚█████╗ ██║ ██████╗ ███████╔╝
5 | ${AnsiColor.GREEN}██╗ ██║${AnsiColor.RED} ██╔═══██║ ██║ ██╔════╝ ╚═══██╗ ██║ ██╔═══╝ ██╔══██║
6 | ${AnsiColor.GREEN}╚██████╔╝${AnsiColor.RED} ██║ ██║ ████████╗ ██║ ██████╔╝ ██║ ████████╗ ██║ ╚██╗
7 | ${AnsiColor.GREEN} ╚═════╝ ${AnsiColor.RED} ╚═╝ ╚═╝ ╚═══════╝ ╚═╝ ╚═════╝ ╚═╝ ╚═══════╝ ╚═╝ ╚═╝
8 |
9 | ${AnsiColor.BRIGHT_BLUE}:: JHipster 🤓 :: Running Spring Boot ${spring-boot.version} ::
10 | :: https://www.jhipster.tech ::${AnsiColor.DEFAULT}
11 |
--------------------------------------------------------------------------------
/src/main/webapp/i18n/en/reset.json:
--------------------------------------------------------------------------------
1 | {
2 | "reset": {
3 | "request": {
4 | "title": "Reset your password",
5 | "form": {
6 | "button": "Reset password"
7 | },
8 | "messages": {
9 | "info": "Enter the email address you used to register",
10 | "success": "Check your emails for details on how to reset your password."
11 | }
12 | },
13 | "finish": {
14 | "title": "Reset password",
15 | "form": {
16 | "button": "Validate new password"
17 | },
18 | "messages": {
19 | "info": "Choose a new password",
20 | "success": "Your password has been reset. Please ",
21 | "keymissing": "The reset key is missing.",
22 | "error": "Your password couldn't be reset. Remember a password request is only valid for 24 hours."
23 | }
24 | }
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/src/main/webapp/i18n/en/dependency.json:
--------------------------------------------------------------------------------
1 | {
2 | "microcatalogApp": {
3 | "dependency": {
4 | "home": {
5 | "title": "Dependencies",
6 | "createLabel": "Create a new Dependency",
7 | "createOrEditLabel": "Create or edit a Dependency",
8 | "notFound": "No Dependencies found"
9 | },
10 | "created": "A new Dependency is created with identifier {{ param }}",
11 | "updated": "A Dependency is updated with identifier {{ param }}",
12 | "deleted": "A Dependency is deleted with identifier {{ param }}",
13 | "delete": {
14 | "question": "Are you sure you want to delete Dependency {{ id }}?"
15 | },
16 | "detail": {
17 | "title": "Dependency"
18 | },
19 | "name": "Name",
20 | "description": "Description",
21 | "source": "Source",
22 | "target": "Target"
23 | }
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/src/main/webapp/i18n/en/error.json:
--------------------------------------------------------------------------------
1 | {
2 | "business": {
3 | "DuplicateDependencyException": "Dependency already exists: {{dependencyName}}",
4 | "CircularDependenciesException": "Circular dependency will be introduced. Cycle: {{microservices}}",
5 | "SelfCircularException": "Source of dependency can't be the same as target. Source: {{microserviceName}}"
6 | },
7 | "error": {
8 | "title": "Error page!",
9 | "http": {
10 | "400": "Bad request.",
11 | "403": "You are not authorized to access this page.",
12 | "404": "The page does not exist.",
13 | "405": "The HTTP verb you used is not supported for this URL.",
14 | "500": "Internal server error."
15 | },
16 | "concurrencyFailure": "Another user modified this data at the same time as you. Your changes were rejected.",
17 | "validation": "Validation error on the server."
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/src/test/java/com/github/microcatalog/domain/DependencyTest.java:
--------------------------------------------------------------------------------
1 | package com.github.microcatalog.domain;
2 |
3 | import org.junit.jupiter.api.Test;
4 | import static org.assertj.core.api.Assertions.assertThat;
5 | import com.github.microcatalog.web.rest.TestUtil;
6 |
7 | public class DependencyTest {
8 |
9 | @Test
10 | public void equalsVerifier() throws Exception {
11 | TestUtil.equalsVerifier(Dependency.class);
12 | Dependency dependency1 = new Dependency();
13 | dependency1.setId(1L);
14 | Dependency dependency2 = new Dependency();
15 | dependency2.setId(dependency1.getId());
16 | assertThat(dependency1).isEqualTo(dependency2);
17 | dependency2.setId(2L);
18 | assertThat(dependency1).isNotEqualTo(dependency2);
19 | dependency1.setId(null);
20 | assertThat(dependency1).isNotEqualTo(dependency2);
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/src/main/resources/config/application-heroku.yml:
--------------------------------------------------------------------------------
1 | # ===================================================================
2 | # Spring Boot configuration for the "heroku" profile.
3 | #
4 | # This configuration overrides the application.yml file.
5 | # ===================================================================
6 |
7 | # ===================================================================
8 | # Standard Spring Boot properties.
9 | # Full reference is available at:
10 | # http://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html
11 | # ===================================================================
12 |
13 | csp:
14 | image-src: ${CSP_IMAGE_SRC}
15 |
16 | spring:
17 | # we're running on a free tier with automatic suspension after inactivity, thus having fresh data for demo is important
18 | liquibase:
19 | drop-first: true
20 | contexts: prod, faker
21 |
--------------------------------------------------------------------------------
/src/main/webapp/app/admin/health/health.service.ts:
--------------------------------------------------------------------------------
1 | import { Injectable } from '@angular/core';
2 | import { HttpClient } from '@angular/common/http';
3 | import { Observable } from 'rxjs';
4 |
5 | import { SERVER_API_URL } from 'app/app.constants';
6 |
7 | export type HealthStatus = 'UP' | 'DOWN' | 'UNKNOWN' | 'OUT_OF_SERVICE';
8 |
9 | export type HealthKey = 'diskSpace' | 'mail' | 'ping' | 'db';
10 |
11 | export interface Health {
12 | status: HealthStatus;
13 | components: {
14 | [key in HealthKey]?: HealthDetails;
15 | };
16 | }
17 |
18 | export interface HealthDetails {
19 | status: HealthStatus;
20 | details: any;
21 | }
22 |
23 | @Injectable({ providedIn: 'root' })
24 | export class HealthService {
25 | constructor(private http: HttpClient) {}
26 |
27 | checkHealth(): Observable {
28 | return this.http.get(SERVER_API_URL + 'management/health');
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/src/main/webapp/manifest.webapp:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Microcatalog",
3 | "short_name": "Microcatalog",
4 | "icons": [
5 | {
6 | "src": "./content/images/jhipster_family_member_1_head-192.png",
7 | "sizes": "192x192",
8 | "type": "image/png"
9 | },
10 | {
11 | "src": "./content/images/jhipster_family_member_1_head-256.png",
12 | "sizes": "256x256",
13 | "type": "image/png"
14 | },
15 | {
16 | "src": "./content/images/jhipster_family_member_1_head-384.png",
17 | "sizes": "384x384",
18 | "type": "image/png"
19 | },
20 | {
21 | "src": "./content/images/jhipster_family_member_1_head-512.png",
22 | "sizes": "512x512",
23 | "type": "image/png"
24 | }
25 | ],
26 | "theme_color": "#000000",
27 | "background_color": "#e0e0e0",
28 | "start_url": ".",
29 | "display": "standalone",
30 | "orientation": "portrait"
31 | }
32 |
--------------------------------------------------------------------------------
/cypress/plugins/index.js:
--------------------------------------------------------------------------------
1 | ///
2 | // ***********************************************************
3 | // This example plugins/index.js can be used to load plugins
4 | //
5 | // You can change the location of this file or turn off loading
6 | // the plugins file with the 'pluginsFile' configuration option.
7 | //
8 | // You can read more here:
9 | // https://on.cypress.io/plugins-guide
10 | // ***********************************************************
11 |
12 | // This function is called when a project is opened or re-opened (e.g. due to
13 | // the project's config changing)
14 |
15 | let percyHealthCheck = require('@percy/cypress/task')
16 |
17 | /**
18 | * @type {Cypress.PluginConfig}
19 | */
20 | module.exports = (on, config) => {
21 | // `on` is used to hook into various events Cypress emits
22 | // `config` is the resolved Cypress config
23 | on("task", percyHealthCheck);
24 | }
25 |
--------------------------------------------------------------------------------
/.jhipster/Team.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Team",
3 | "fields": [
4 | {
5 | "fieldName": "name",
6 | "fieldType": "String",
7 | "fieldValidateRules": [
8 | "required",
9 | "unique"
10 | ]
11 | },
12 | {
13 | "fieldName": "teamLead",
14 | "fieldType": "String",
15 | "fieldValidateRules": [
16 | "required"
17 | ]
18 | },
19 | {
20 | "fieldName": "productOwner",
21 | "fieldType": "String",
22 | "fieldValidateRules": [
23 | "required"
24 | ]
25 | }
26 | ],
27 | "relationships": [],
28 | "changelogDate": "20201001051757",
29 | "entityTableName": "team",
30 | "dto": "no",
31 | "pagination": "no",
32 | "service": "no",
33 | "jpaMetamodelFiltering": false,
34 | "fluentMethods": true,
35 | "readOnly": false,
36 | "embedded": false,
37 | "clientRootFolder": "",
38 | "applications": "*"
39 | }
40 |
--------------------------------------------------------------------------------
/src/main/resources/i18n/messages_en.properties:
--------------------------------------------------------------------------------
1 | # Error page
2 | error.title=Your request cannot be processed
3 | error.subtitle=Sorry, an error has occurred.
4 | error.status=Status:
5 | error.message=Message:
6 |
7 | # Activation email
8 | email.activation.title=microcatalog account activation
9 | email.activation.greeting=Dear {0}
10 | email.activation.text1=Your microcatalog account has been created, please click on the URL below to activate it:
11 | email.activation.text2=Regards,
12 | email.signature=microcatalog Team.
13 |
14 | # Creation email
15 | email.creation.text1=Your microcatalog account has been created, please click on the URL below to access it:
16 |
17 | # Reset email
18 | email.reset.title=microcatalog password reset
19 | email.reset.greeting=Dear {0}
20 | email.reset.text1=For your microcatalog account a password reset was requested, please click on the URL below to reset it:
21 | email.reset.text2=Regards,
22 |
--------------------------------------------------------------------------------
/src/main/webapp/app/entities/team/team-delete-dialog.component.ts:
--------------------------------------------------------------------------------
1 | import { Component } from '@angular/core';
2 | import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';
3 | import { JhiEventManager } from 'ng-jhipster';
4 |
5 | import { ITeam } from 'app/shared/model/team.model';
6 | import { TeamService } from './team.service';
7 |
8 | @Component({
9 | templateUrl: './team-delete-dialog.component.html',
10 | })
11 | export class TeamDeleteDialogComponent {
12 | team?: ITeam;
13 |
14 | constructor(protected teamService: TeamService, public activeModal: NgbActiveModal, protected eventManager: JhiEventManager) {}
15 |
16 | cancel(): void {
17 | this.activeModal.dismiss();
18 | }
19 |
20 | confirmDelete(id: number): void {
21 | this.teamService.delete(id).subscribe(() => {
22 | this.eventManager.broadcast('teamListModification');
23 | this.activeModal.close();
24 | });
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/src/main/resources/i18n/messages.properties:
--------------------------------------------------------------------------------
1 | # Error page
2 | error.title=Your request cannot be processed
3 | error.subtitle=Sorry, an error has occurred.
4 | error.status=Status:
5 | error.message=Message:
6 |
7 | # Activation email
8 | email.activation.title=microcatalog account activation is required
9 | email.activation.greeting=Dear {0}
10 | email.activation.text1=Your microcatalog account has been created, please click on the URL below to activate it:
11 | email.activation.text2=Regards,
12 | email.signature=microcatalog Team.
13 |
14 | # Creation email
15 | email.creation.text1=Your microcatalog account has been created, please click on the URL below to access it:
16 |
17 | # Reset email
18 | email.reset.title=microcatalog password reset
19 | email.reset.greeting=Dear {0}
20 | email.reset.text1=For your microcatalog account a password reset was requested, please click on the URL below to reset it:
21 | email.reset.text2=Regards,
22 |
--------------------------------------------------------------------------------
/src/test/javascript/spec/helpers/mock-login.service.ts:
--------------------------------------------------------------------------------
1 | import Spy = jasmine.Spy;
2 | import { of } from 'rxjs';
3 |
4 | import { SpyObject } from './spyobject';
5 | import { LoginService } from 'app/core/login/login.service';
6 |
7 | export class MockLoginService extends SpyObject {
8 | loginSpy: Spy;
9 | logoutSpy: Spy;
10 | registerSpy: Spy;
11 | requestResetPasswordSpy: Spy;
12 | cancelSpy: Spy;
13 |
14 | constructor() {
15 | super(LoginService);
16 |
17 | this.loginSpy = this.spy('login').andReturn(of({}));
18 | this.logoutSpy = this.spy('logout').andReturn(this);
19 | this.registerSpy = this.spy('register').andReturn(this);
20 | this.requestResetPasswordSpy = this.spy('requestResetPassword').andReturn(this);
21 | this.cancelSpy = this.spy('cancel').andReturn(this);
22 | }
23 |
24 | setResponse(json: any): void {
25 | this.loginSpy = this.spy('login').andReturn(of(json));
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/src/main/java/com/github/microcatalog/service/dto/custom/requests/CreateDependencyRequest.java:
--------------------------------------------------------------------------------
1 | package com.github.microcatalog.service.dto.custom.requests;
2 |
3 | public class CreateDependencyRequest {
4 | private String dependencyName;
5 | private String sourceName;
6 | private String targetName;
7 |
8 | public String getDependencyName() {
9 | return dependencyName;
10 | }
11 |
12 | public void setDependencyName(String dependencyName) {
13 | this.dependencyName = dependencyName;
14 | }
15 |
16 | public String getSourceName() {
17 | return sourceName;
18 | }
19 |
20 | public void setSourceName(String sourceName) {
21 | this.sourceName = sourceName;
22 | }
23 |
24 | public String getTargetName() {
25 | return targetName;
26 | }
27 |
28 | public void setTargetName(String targetName) {
29 | this.targetName = targetName;
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/src/main/webapp/app/admin/metrics/metrics.service.ts:
--------------------------------------------------------------------------------
1 | import { Injectable } from '@angular/core';
2 | import { HttpClient } from '@angular/common/http';
3 | import { Observable } from 'rxjs';
4 |
5 | import { SERVER_API_URL } from 'app/app.constants';
6 |
7 | export type MetricsKey = 'jvm' | 'http.server.requests' | 'cache' | 'services' | 'databases' | 'garbageCollector' | 'processMetrics';
8 | export type Metrics = { [key in MetricsKey]: any };
9 | export type Thread = any;
10 | export type ThreadDump = { threads: Thread[] };
11 |
12 | @Injectable({ providedIn: 'root' })
13 | export class MetricsService {
14 | constructor(private http: HttpClient) {}
15 |
16 | getMetrics(): Observable {
17 | return this.http.get(SERVER_API_URL + 'management/jhimetrics');
18 | }
19 |
20 | threadDump(): Observable {
21 | return this.http.get(SERVER_API_URL + 'management/threaddump');
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/src/main/webapp/app/core/user/user.model.ts:
--------------------------------------------------------------------------------
1 | export interface IUser {
2 | id?: any;
3 | login?: string;
4 | firstName?: string;
5 | lastName?: string;
6 | email?: string;
7 | activated?: boolean;
8 | langKey?: string;
9 | authorities?: string[];
10 | createdBy?: string;
11 | createdDate?: Date;
12 | lastModifiedBy?: string;
13 | lastModifiedDate?: Date;
14 | password?: string;
15 | }
16 |
17 | export class User implements IUser {
18 | constructor(
19 | public id?: any,
20 | public login?: string,
21 | public firstName?: string,
22 | public lastName?: string,
23 | public email?: string,
24 | public activated?: boolean,
25 | public langKey?: string,
26 | public authorities?: string[],
27 | public createdBy?: string,
28 | public createdDate?: Date,
29 | public lastModifiedBy?: string,
30 | public lastModifiedDate?: Date,
31 | public password?: string
32 | ) {}
33 | }
34 |
--------------------------------------------------------------------------------
/src/test/java/com/github/microcatalog/domain/MicroserviceTest.java:
--------------------------------------------------------------------------------
1 | package com.github.microcatalog.domain;
2 |
3 | import org.junit.jupiter.api.Test;
4 | import static org.assertj.core.api.Assertions.assertThat;
5 | import com.github.microcatalog.web.rest.TestUtil;
6 |
7 | public class MicroserviceTest {
8 |
9 | @Test
10 | public void equalsVerifier() throws Exception {
11 | TestUtil.equalsVerifier(Microservice.class);
12 | Microservice microservice1 = new Microservice();
13 | microservice1.setId(1L);
14 | Microservice microservice2 = new Microservice();
15 | microservice2.setId(microservice1.getId());
16 | assertThat(microservice1).isEqualTo(microservice2);
17 | microservice2.setId(2L);
18 | assertThat(microservice1).isNotEqualTo(microservice2);
19 | microservice1.setId(null);
20 | assertThat(microservice1).isNotEqualTo(microservice2);
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/src/main/webapp/app/core/login/login.service.ts:
--------------------------------------------------------------------------------
1 | import { Injectable } from '@angular/core';
2 | import { Observable } from 'rxjs';
3 | import { flatMap } from 'rxjs/operators';
4 |
5 | import { Account } from 'app/core/user/account.model';
6 | import { AccountService } from 'app/core/auth/account.service';
7 | import { AuthServerProvider } from 'app/core/auth/auth-jwt.service';
8 | import { Login } from './login.model';
9 |
10 | @Injectable({ providedIn: 'root' })
11 | export class LoginService {
12 | constructor(private accountService: AccountService, private authServerProvider: AuthServerProvider) {}
13 |
14 | login(credentials: Login): Observable {
15 | return this.authServerProvider.login(credentials).pipe(flatMap(() => this.accountService.identity(true)));
16 | }
17 |
18 | logout(): void {
19 | this.authServerProvider.logout().subscribe(null, null, () => this.accountService.authenticate(null));
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/src/main/webapp/app/entities/dependency/dependency.module.ts:
--------------------------------------------------------------------------------
1 | import { NgModule } from '@angular/core';
2 | import { RouterModule } from '@angular/router';
3 |
4 | import { MicrocatalogSharedModule } from 'app/shared/shared.module';
5 | import { DependencyComponent } from './dependency.component';
6 | import { DependencyDetailComponent } from './dependency-detail.component';
7 | import { DependencyUpdateComponent } from './dependency-update.component';
8 | import { DependencyDeleteDialogComponent } from './dependency-delete-dialog.component';
9 | import { dependencyRoute } from './dependency.route';
10 |
11 | @NgModule({
12 | imports: [MicrocatalogSharedModule, RouterModule.forChild(dependencyRoute)],
13 | declarations: [DependencyComponent, DependencyDetailComponent, DependencyUpdateComponent, DependencyDeleteDialogComponent],
14 | entryComponents: [DependencyDeleteDialogComponent],
15 | })
16 | export class MicrocatalogDependencyModule {}
17 |
--------------------------------------------------------------------------------
/src/main/java/com/github/microcatalog/ApplicationWebXml.java:
--------------------------------------------------------------------------------
1 | package com.github.microcatalog;
2 |
3 | import io.github.jhipster.config.DefaultProfileUtil;
4 |
5 | import org.springframework.boot.builder.SpringApplicationBuilder;
6 | import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
7 |
8 | /**
9 | * This is a helper Java class that provides an alternative to creating a {@code web.xml}.
10 | * This will be invoked only when the application is deployed to a Servlet container like Tomcat, JBoss etc.
11 | */
12 | public class ApplicationWebXml extends SpringBootServletInitializer {
13 |
14 | @Override
15 | protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
16 | // set a default to use when no profile is configured.
17 | DefaultProfileUtil.addDefaultProfile(application.application());
18 | return application.sources(MicrocatalogApp.class);
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/src/main/webapp/app/entities/status/status-delete-dialog.component.ts:
--------------------------------------------------------------------------------
1 | import { Component } from '@angular/core';
2 | import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';
3 | import { JhiEventManager } from 'ng-jhipster';
4 |
5 | import { IStatus } from 'app/shared/model/status.model';
6 | import { StatusService } from './status.service';
7 |
8 | @Component({
9 | templateUrl: './status-delete-dialog.component.html',
10 | })
11 | export class StatusDeleteDialogComponent {
12 | status?: IStatus;
13 |
14 | constructor(protected statusService: StatusService, public activeModal: NgbActiveModal, protected eventManager: JhiEventManager) {}
15 |
16 | cancel(): void {
17 | this.activeModal.dismiss();
18 | }
19 |
20 | confirmDelete(id: number): void {
21 | this.statusService.delete(id).subscribe(() => {
22 | this.eventManager.broadcast('statusListModification');
23 | this.activeModal.close();
24 | });
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/src/main/webapp/app/dashboard/impact-analysis/impact-analysis-dashboard.module.ts:
--------------------------------------------------------------------------------
1 | import { NgModule } from '@angular/core';
2 | import { MicrocatalogSharedModule } from 'app/shared/shared.module';
3 | import { ImpactAnalysisDashboardComponent } from './impact-analysis-dashboard.component';
4 | import { RouterModule } from '@angular/router';
5 | import { impactAnalysisDashboardRoute } from './impact-analysis-dashboard.route';
6 | import { ImpactAnalysisGraphModule } from './impact-analysis-graph/impact-analysis-graph.module';
7 | import { ImpactAnalysisLegendModule } from './impact-analysis-legend/impact-analysis-legend.module';
8 |
9 | @NgModule({
10 | imports: [
11 | MicrocatalogSharedModule,
12 | ImpactAnalysisGraphModule,
13 | ImpactAnalysisLegendModule,
14 | RouterModule.forChild(impactAnalysisDashboardRoute),
15 | ],
16 | declarations: [ImpactAnalysisDashboardComponent],
17 | })
18 | export class ImpactAnalysisDashboardModule {}
19 |
--------------------------------------------------------------------------------
/src/main/k8s/services.yaml:
--------------------------------------------------------------------------------
1 | apiVersion: v1
2 | kind: Service
3 | metadata:
4 | name: postgres-service
5 | namespace: microservice-catalog
6 | labels:
7 | app: microservice-catalog
8 | tier: service
9 | spec:
10 | ports:
11 | - name: postgres
12 | port: 5432
13 | targetPort: 5432
14 | protocol: TCP
15 | selector:
16 | app: microservice-catalog
17 | tier: database
18 |
19 | ---
20 | apiVersion: v1
21 | kind: Service
22 | metadata:
23 | name: microservice-catalog-service
24 | namespace: microservice-catalog
25 | labels:
26 | app: microservice-catalog
27 | tier: service
28 | spec:
29 | ports:
30 | - name: microservice-catalog
31 | port: 8081
32 | targetPort: 8081
33 | protocol: TCP
34 | type: LoadBalancer
35 | selector:
36 | app: microservice-catalog
37 | tier: business
38 |
--------------------------------------------------------------------------------
/src/main/webapp/app/layouts/profiles/page-ribbon.scss:
--------------------------------------------------------------------------------
1 | /* ==========================================================================
2 | Developement Ribbon
3 | ========================================================================== */
4 | .ribbon {
5 | background-color: rgba(170, 0, 0, 0.5);
6 | left: -3.5em;
7 | -moz-transform: rotate(-45deg);
8 | -ms-transform: rotate(-45deg);
9 | -o-transform: rotate(-45deg);
10 | -webkit-transform: rotate(-45deg);
11 | transform: rotate(-45deg);
12 | overflow: hidden;
13 | position: absolute;
14 | top: 40px;
15 | white-space: nowrap;
16 | width: 15em;
17 | z-index: 9999;
18 | pointer-events: none;
19 | opacity: 0.75;
20 | a {
21 | color: #fff;
22 | display: block;
23 | font-weight: 400;
24 | margin: 1px 0;
25 | padding: 10px 50px;
26 | text-align: center;
27 | text-decoration: none;
28 | text-shadow: 0 0 5px #444;
29 | pointer-events: none;
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/tsconfig.base.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "target": "es6",
4 | "module": "esnext",
5 | "moduleResolution": "node",
6 | "sourceMap": true,
7 | "emitDecoratorMetadata": true,
8 | "experimentalDecorators": true,
9 | "strict": true,
10 | "noImplicitReturns": true,
11 | "noFallthroughCasesInSwitch": true,
12 | "suppressImplicitAnyIndexErrors": true,
13 | "skipLibCheck": true,
14 | "outDir": "target/classes/static/app",
15 | "lib": ["es7", "dom"],
16 | "baseUrl": "./",
17 | "paths": {
18 | "app/*": ["src/main/webapp/app/*"]
19 | },
20 | "importHelpers": true,
21 | "downlevelIteration": true,
22 | "declaration": false,
23 | "forceConsistentCasingInFileNames": true
24 | },
25 | "angularCompilerOptions": {
26 | "strictInjectionParameters": true,
27 | "fullTemplateTypeCheck": true,
28 | "strictTemplates": true,
29 | "preserveWhitespaces": true
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/src/main/webapp/i18n/en/register.json:
--------------------------------------------------------------------------------
1 | {
2 | "register": {
3 | "title": "Registration",
4 | "form": {
5 | "button": "Register"
6 | },
7 | "messages": {
8 | "validate": {
9 | "login": {
10 | "required": "Your username is required.",
11 | "minlength": "Your username is required to be at least 1 character.",
12 | "maxlength": "Your username cannot be longer than 50 characters.",
13 | "pattern": "Your username is invalid."
14 | }
15 | },
16 | "success": "Registration saved! Please check your email for confirmation.",
17 | "error": {
18 | "fail": "Registration failed! Please try again later.",
19 | "userexists": "Login name already registered! Please choose another one.",
20 | "emailexists": "Email is already in use! Please choose another one."
21 | }
22 | }
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/src/main/webapp/app/admin/audits/audits.service.ts:
--------------------------------------------------------------------------------
1 | import { Injectable } from '@angular/core';
2 | import { HttpClient, HttpParams, HttpResponse } from '@angular/common/http';
3 | import { Observable } from 'rxjs';
4 |
5 | import { createRequestOption, Pagination } from 'app/shared/util/request-util';
6 | import { SERVER_API_URL } from 'app/app.constants';
7 | import { Audit } from './audit.model';
8 |
9 | export interface AuditsQuery extends Pagination {
10 | fromDate: string;
11 | toDate: string;
12 | }
13 |
14 | @Injectable({ providedIn: 'root' })
15 | export class AuditsService {
16 | constructor(private http: HttpClient) {}
17 |
18 | query(req: AuditsQuery): Observable> {
19 | const params: HttpParams = createRequestOption(req);
20 |
21 | const requestURL = SERVER_API_URL + 'management/audits';
22 |
23 | return this.http.get(requestURL, {
24 | params,
25 | observe: 'response',
26 | });
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/src/main/webapp/app/home/home.scss:
--------------------------------------------------------------------------------
1 | /* ==========================================================================
2 | Main page styles
3 | ========================================================================== */
4 |
5 | .hipster {
6 | display: inline-block;
7 | width: 347px;
8 | height: 497px;
9 | background: url('../../content/images/jhipster_family_member_1.svg') no-repeat center top;
10 | background-size: contain;
11 | }
12 |
13 | /* wait autoprefixer update to allow simple generation of high pixel density media query */
14 | @media only screen and (-webkit-min-device-pixel-ratio: 2),
15 | only screen and (-moz-min-device-pixel-ratio: 2),
16 | only screen and (-o-min-device-pixel-ratio: 2/1),
17 | only screen and (min-resolution: 192dpi),
18 | only screen and (min-resolution: 2dppx) {
19 | .hipster {
20 | background: url('../../content/images/jhipster_family_member_1.svg') no-repeat center top;
21 | background-size: contain;
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/src/main/webapp/app/blocks/interceptor/errorhandler.interceptor.ts:
--------------------------------------------------------------------------------
1 | import { Injectable } from '@angular/core';
2 | import { JhiEventManager, JhiEventWithContent } from 'ng-jhipster';
3 | import { HttpInterceptor, HttpRequest, HttpErrorResponse, HttpHandler, HttpEvent } from '@angular/common/http';
4 | import { Observable } from 'rxjs';
5 | import { tap } from 'rxjs/operators';
6 |
7 | @Injectable()
8 | export class ErrorHandlerInterceptor implements HttpInterceptor {
9 | constructor(private eventManager: JhiEventManager) {}
10 |
11 | intercept(request: HttpRequest, next: HttpHandler): Observable> {
12 | return next.handle(request).pipe(
13 | tap(null, (err: HttpErrorResponse) => {
14 | if (!(err.status === 401 && (err.message === '' || (err.url && err.url.includes('api/account'))))) {
15 | this.eventManager.broadcast(new JhiEventWithContent('microcatalogApp.httpError', err));
16 | }
17 | })
18 | );
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/src/main/webapp/app/entities/microservice/microservice.module.ts:
--------------------------------------------------------------------------------
1 | import { NgModule } from '@angular/core';
2 | import { RouterModule } from '@angular/router';
3 |
4 | import { MicrocatalogSharedModule } from 'app/shared/shared.module';
5 | import { MicroserviceComponent } from './microservice.component';
6 | import { MicroserviceDetailComponent } from './microservice-detail.component';
7 | import { MicroserviceUpdateComponent } from './microservice-update.component';
8 | import { MicroserviceDeleteDialogComponent } from './microservice-delete-dialog.component';
9 | import { microserviceRoute } from './microservice.route';
10 |
11 | @NgModule({
12 | imports: [MicrocatalogSharedModule, RouterModule.forChild(microserviceRoute)],
13 | declarations: [MicroserviceComponent, MicroserviceDetailComponent, MicroserviceUpdateComponent, MicroserviceDeleteDialogComponent],
14 | entryComponents: [MicroserviceDeleteDialogComponent],
15 | })
16 | export class MicrocatalogMicroserviceModule {}
17 |
--------------------------------------------------------------------------------
/src/main/webapp/app/entities/microservice/microservice-dashboard/microservice-dashboard.module.ts:
--------------------------------------------------------------------------------
1 | import { NgModule } from '@angular/core';
2 | import { MicroserviceDashboardComponent } from './microservice-dashboard.component';
3 | import { MicrocatalogSharedModule } from 'app/shared/shared.module';
4 | import { RouterModule } from '@angular/router';
5 | import { MicroserviceCardComponent } from './microservice-card/microservice-card.component';
6 | import { MicroserviceSearchModule } from 'app/entities/microservice/microservice-dashboard/microservice-search/microservice-search.module';
7 | import { MicroserviceGroupFilterPipe } from './microservice-group-filter.pipe';
8 |
9 | @NgModule({
10 | declarations: [MicroserviceDashboardComponent, MicroserviceCardComponent, MicroserviceGroupFilterPipe],
11 | imports: [MicroserviceSearchModule, MicrocatalogSharedModule, RouterModule],
12 | exports: [MicroserviceDashboardComponent],
13 | })
14 | export class MicroserviceDashboardModule {}
15 |
--------------------------------------------------------------------------------
/cypress/support/commands.js:
--------------------------------------------------------------------------------
1 | // ***********************************************
2 | // This example commands.js shows you how to
3 | // create various custom commands and overwrite
4 | // existing commands.
5 | //
6 | // For more comprehensive examples of custom
7 | // commands please read more here:
8 | // https://on.cypress.io/custom-commands
9 | // ***********************************************
10 | //
11 | //
12 | // -- This is a parent command --
13 | // Cypress.Commands.add("login", (email, password) => { ... })
14 | //
15 | //
16 | // -- This is a child command --
17 | // Cypress.Commands.add("drag", { prevSubject: 'element'}, (subject, options) => { ... })
18 | //
19 | //
20 | // -- This is a dual command --
21 | // Cypress.Commands.add("dismiss", { prevSubject: 'optional'}, (subject, options) => { ... })
22 | //
23 | //
24 | // -- This will overwrite an existing command --
25 | // Cypress.Commands.overwrite("visit", (originalFn, url, options) => { ... })
26 |
27 | import '@percy/cypress';
28 |
--------------------------------------------------------------------------------
/src/main/java/com/github/microcatalog/security/jwt/JWTConfigurer.java:
--------------------------------------------------------------------------------
1 | package com.github.microcatalog.security.jwt;
2 |
3 | import org.springframework.security.config.annotation.SecurityConfigurerAdapter;
4 | import org.springframework.security.config.annotation.web.builders.HttpSecurity;
5 | import org.springframework.security.web.DefaultSecurityFilterChain;
6 | import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
7 |
8 | public class JWTConfigurer extends SecurityConfigurerAdapter {
9 |
10 | private final TokenProvider tokenProvider;
11 |
12 | public JWTConfigurer(TokenProvider tokenProvider) {
13 | this.tokenProvider = tokenProvider;
14 | }
15 |
16 | @Override
17 | public void configure(HttpSecurity http) {
18 | JWTFilter customFilter = new JWTFilter(tokenProvider);
19 | http.addFilterBefore(customFilter, UsernamePasswordAuthenticationFilter.class);
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/src/main/resources/i18n/messages_de.properties:
--------------------------------------------------------------------------------
1 | # Error page
2 | error.title=Ihre Anfrage kann nicht bearbeitet werden
3 | error.subtitle=Verzeihung, ein Fehler ist aufgetreten.
4 | error.status=Status:
5 | error.message=Meldung:
6 |
7 | # Activation email
8 | email.activation.title=microcatalog Aktivierung
9 | email.activation.greeting=Liebe(r) {0}
10 | email.activation.text1=Ihr microcatalog Zugang wurde angelegt, bitte klicken Sie unten auf den Link, um diesen zu aktivieren:
11 | email.activation.text2=Grüße,
12 | email.signature=microcatalog.
13 |
14 | # Creation email
15 | email.creation.text1=Ihr microcatalog Zugang wurde angelegt, bitte klicken Sie auf den Link um sich anzumelden:
16 |
17 | # Reset email
18 | email.reset.title=microcatalog Passwort zurücksetzen
19 | email.reset.greeting=Liebe(r) {0}
20 | email.reset.text1=Für Ihren microcatalog Account wurde ein neues Passwort angefordert, bitte klicken Sie unten auf den Link, um das Passwort zurückzusetzen:
21 | email.reset.text2=Grüße,
22 |
--------------------------------------------------------------------------------
/src/test/resources/config/application-testcontainers.yml:
--------------------------------------------------------------------------------
1 | # ===================================================================
2 | # Spring Boot configuration.
3 | #
4 | # This configuration is used for unit/integration tests with testcontainers database containers.
5 | #
6 | # To activate this configuration launch integration tests with the 'testcontainers' profile
7 | #
8 | # More information on database containers: https://www.testcontainers.org/modules/databases/
9 | # ===================================================================
10 |
11 | spring:
12 | datasource:
13 | type: com.zaxxer.hikari.HikariDataSource
14 | driver-class-name: org.testcontainers.jdbc.ContainerDatabaseDriver
15 | url: jdbc:tc:postgresql:latest:///microcatalog?TC_TMPFS=/testtmpfs:rw
16 | username: microcatalog
17 | password:
18 | hikari:
19 | poolName: Hikari
20 | auto-commit: false
21 | jpa:
22 | database-platform: io.github.jhipster.domain.util.FixedPostgreSQL10Dialect
23 |
--------------------------------------------------------------------------------
/src/main/webapp/i18n/de/reset.json:
--------------------------------------------------------------------------------
1 | {
2 | "reset": {
3 | "request": {
4 | "title": "Passwort zurücksetzen",
5 | "form": {
6 | "button": "Passwort zurücksetzen"
7 | },
8 | "messages": {
9 | "info": "Geben Sie die Email Adresse ein, welche Sie bei der Registrierung verwendet haben.",
10 | "success": "Eine Email mit weiteren Instruktionen für das Zurücksetzen des Passworts wurde gesendet."
11 | }
12 | },
13 | "finish": {
14 | "title": "Passwort zurücksetzen",
15 | "form": {
16 | "button": "Neues Passwort setzen"
17 | },
18 | "messages": {
19 | "info": "Wählen Sie ein neues Passwort",
20 | "success": "Ihr Passwort wurde zurückgesetzt. Bitte ",
21 | "keymissing": "Der Schlüssel zum Zurücksetzen fehlt.",
22 | "error": "Ihr Passwort konnte nicht zurückgesetzt werden. Zur Erinnerung, Ihre Anfrage ist nur 24 Stunden gültig."
23 | }
24 | }
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/angular.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "./node_modules/@angular/cli/lib/config/schema.json",
3 | "version": 1,
4 | "newProjectRoot": "projects",
5 | "projects": {
6 | "microcatalog": {
7 | "root": "",
8 | "sourceRoot": "src/main/webapp",
9 | "projectType": "application",
10 | "schematics": {
11 | "@schematics/angular:component": {
12 | "skipTests": true,
13 | "style": "scss"
14 | },
15 | "@schematics/angular:directive": {
16 | "skipTests": true
17 | },
18 | "@schematics/angular:guard": {
19 | "skipTests": true
20 | },
21 | "@schematics/angular:pipe": {
22 | "skipTests": true
23 | },
24 | "@schematics/angular:service": {
25 | "skipTests": true
26 | }
27 | },
28 | "prefix": "jhi",
29 | "architect": {}
30 | }
31 | },
32 | "defaultProject": "microcatalog",
33 | "cli": {
34 | "packageManager": "npm"
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/src/main/webapp/app/account/activate/activate.component.ts:
--------------------------------------------------------------------------------
1 | import { Component, OnInit } from '@angular/core';
2 | import { ActivatedRoute } from '@angular/router';
3 | import { flatMap } from 'rxjs/operators';
4 |
5 | import { LoginModalService } from 'app/core/login/login-modal.service';
6 | import { ActivateService } from './activate.service';
7 |
8 | @Component({
9 | selector: 'jhi-activate',
10 | templateUrl: './activate.component.html',
11 | })
12 | export class ActivateComponent implements OnInit {
13 | error = false;
14 | success = false;
15 |
16 | constructor(private activateService: ActivateService, private loginModalService: LoginModalService, private route: ActivatedRoute) {}
17 |
18 | ngOnInit(): void {
19 | this.route.queryParams.pipe(flatMap(params => this.activateService.get(params.key))).subscribe(
20 | () => (this.success = true),
21 | () => (this.error = true)
22 | );
23 | }
24 |
25 | login(): void {
26 | this.loginModalService.open();
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/src/main/webapp/app/shared/util/datepicker-adapter.ts:
--------------------------------------------------------------------------------
1 | /**
2 | * Angular bootstrap Date adapter
3 | */
4 | import { Injectable } from '@angular/core';
5 | import { NgbDateAdapter, NgbDateStruct } from '@ng-bootstrap/ng-bootstrap';
6 | import { Moment } from 'moment';
7 | import * as moment from 'moment';
8 |
9 | @Injectable()
10 | export class NgbDateMomentAdapter extends NgbDateAdapter {
11 | fromModel(date: Moment): NgbDateStruct {
12 | if (date && moment.isMoment(date) && date.isValid()) {
13 | return { year: date.year(), month: date.month() + 1, day: date.date() };
14 | }
15 | // ! can be removed after https://github.com/ng-bootstrap/ng-bootstrap/issues/1544 is resolved
16 | return null!;
17 | }
18 |
19 | toModel(date: NgbDateStruct): Moment {
20 | // ! after null can be removed after https://github.com/ng-bootstrap/ng-bootstrap/issues/1544 is resolved
21 | return date ? moment(date.year + '-' + date.month + '-' + date.day, 'YYYY-MM-DD') : null!;
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/src/main/webapp/app/admin/user-management/user-management-delete-dialog.component.ts:
--------------------------------------------------------------------------------
1 | import { Component } from '@angular/core';
2 | import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';
3 | import { JhiEventManager } from 'ng-jhipster';
4 |
5 | import { User } from 'app/core/user/user.model';
6 | import { UserService } from 'app/core/user/user.service';
7 |
8 | @Component({
9 | selector: 'jhi-user-mgmt-delete-dialog',
10 | templateUrl: './user-management-delete-dialog.component.html',
11 | })
12 | export class UserManagementDeleteDialogComponent {
13 | user?: User;
14 |
15 | constructor(private userService: UserService, public activeModal: NgbActiveModal, private eventManager: JhiEventManager) {}
16 |
17 | cancel(): void {
18 | this.activeModal.dismiss();
19 | }
20 |
21 | confirmDelete(login: string): void {
22 | this.userService.delete(login).subscribe(() => {
23 | this.eventManager.broadcast('userListModification');
24 | this.activeModal.close();
25 | });
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/src/main/webapp/i18n/de/microservice.json:
--------------------------------------------------------------------------------
1 | {
2 | "microcatalogApp": {
3 | "microservice": {
4 | "home": {
5 | "title": "Microservices",
6 | "createLabel": "Microservice erstellen",
7 | "createOrEditLabel": "Microservice erstellen oder bearbeiten",
8 | "notFound": "No Microservices found"
9 | },
10 | "created": "Microservice erstellt mit ID {{ param }}",
11 | "updated": "Microservice aktualisiert mit ID {{ param }}",
12 | "deleted": "Microservice gelöscht mit ID {{ param }}",
13 | "delete": {
14 | "question": "Soll Microservice {{ id }} wirklich dauerhaft gelöscht werden?"
15 | },
16 | "detail": {
17 | "title": "Microservice"
18 | },
19 | "name": "Name",
20 | "description": "Description",
21 | "imageUrl": "Image Url",
22 | "swaggerUrl": "Swagger Url",
23 | "gitUrl": "Git Url",
24 | "ciUrl": "Ci Url",
25 | "team": "Team",
26 | "status": "Status"
27 | }
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/src/main/webapp/i18n/en/user-management.json:
--------------------------------------------------------------------------------
1 | {
2 | "userManagement": {
3 | "home": {
4 | "title": "Users",
5 | "createLabel": "Create a new user",
6 | "createOrEditLabel": "Create or edit a user"
7 | },
8 | "created": "A new user is created with identifier {{ param }}",
9 | "updated": "A user is updated with identifier {{ param }}",
10 | "deleted": "A user is deleted with identifier {{ param }}",
11 | "delete": {
12 | "question": "Are you sure you want to delete user {{ login }}?"
13 | },
14 | "detail": {
15 | "title": "User"
16 | },
17 | "login": "Login",
18 | "firstName": "First name",
19 | "lastName": "Last name",
20 | "email": "Email",
21 | "activated": "Activated",
22 | "deactivated": "Deactivated",
23 | "profiles": "Profiles",
24 | "langKey": "Language",
25 | "createdBy": "Created by",
26 | "createdDate": "Created date",
27 | "lastModifiedBy": "Modified by",
28 | "lastModifiedDate": "Modified date"
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/src/test/java/com/github/microcatalog/utils/DependencyBuilderTest.java:
--------------------------------------------------------------------------------
1 | package com.github.microcatalog.utils;
2 |
3 | import com.github.microcatalog.domain.Dependency;
4 | import com.github.microcatalog.domain.Microservice;
5 | import org.junit.jupiter.api.Test;
6 |
7 | import static org.assertj.core.api.Assertions.assertThat;
8 |
9 | class DependencyBuilderTest {
10 |
11 | @Test
12 | void build() {
13 | DependencyBuilder builder = new DependencyBuilder();
14 | Dependency dependency = builder
15 | .withId(1L)
16 | .withName("test")
17 | .withSource(2L)
18 | .withTarget(3L)
19 | .build();
20 |
21 | assertThat(dependency).isNotNull().extracting(Dependency::getId, Dependency::getName).containsExactly(1L, "test");
22 | assertThat(dependency.getSource()).isNotNull().extracting(Microservice::getId).isEqualTo(2L);
23 | assertThat(dependency.getTarget()).isNotNull().extracting(Microservice::getId).isEqualTo(3L);
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/src/main/webapp/app/entities/entity.module.ts:
--------------------------------------------------------------------------------
1 | import { NgModule } from '@angular/core';
2 | import { RouterModule } from '@angular/router';
3 |
4 | @NgModule({
5 | imports: [
6 | RouterModule.forChild([
7 | {
8 | path: 'microservice',
9 | loadChildren: () => import('./microservice/microservice.module').then(m => m.MicrocatalogMicroserviceModule),
10 | },
11 | {
12 | path: 'team',
13 | loadChildren: () => import('./team/team.module').then(m => m.MicrocatalogTeamModule),
14 | },
15 | {
16 | path: 'status',
17 | loadChildren: () => import('./status/status.module').then(m => m.MicrocatalogStatusModule),
18 | },
19 | {
20 | path: 'dependency',
21 | loadChildren: () => import('./dependency/dependency.module').then(m => m.MicrocatalogDependencyModule),
22 | },
23 | /* jhipster-needle-add-entity-route - JHipster will add entity modules routes here */
24 | ]),
25 | ],
26 | })
27 | export class MicrocatalogEntityModule {}
28 |
--------------------------------------------------------------------------------
/src/main/webapp/app/entities/dependency/dependency-delete-dialog.component.ts:
--------------------------------------------------------------------------------
1 | import { Component } from '@angular/core';
2 | import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';
3 | import { JhiEventManager } from 'ng-jhipster';
4 |
5 | import { IDependency } from 'app/shared/model/dependency.model';
6 | import { DependencyService } from './dependency.service';
7 |
8 | @Component({
9 | templateUrl: './dependency-delete-dialog.component.html',
10 | })
11 | export class DependencyDeleteDialogComponent {
12 | dependency?: IDependency;
13 |
14 | constructor(
15 | protected dependencyService: DependencyService,
16 | public activeModal: NgbActiveModal,
17 | protected eventManager: JhiEventManager
18 | ) {}
19 |
20 | cancel(): void {
21 | this.activeModal.dismiss();
22 | }
23 |
24 | confirmDelete(id: number): void {
25 | this.dependencyService.delete(id).subscribe(() => {
26 | this.eventManager.broadcast('dependencyListModification');
27 | this.activeModal.close();
28 | });
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/src/main/webapp/app/layouts/navbar/active-menu.directive.ts:
--------------------------------------------------------------------------------
1 | import { Directive, OnInit, ElementRef, Renderer2, Input } from '@angular/core';
2 | import { TranslateService, LangChangeEvent } from '@ngx-translate/core';
3 |
4 | @Directive({
5 | selector: '[jhiActiveMenu]',
6 | })
7 | export class ActiveMenuDirective implements OnInit {
8 | @Input() jhiActiveMenu?: string;
9 |
10 | constructor(private el: ElementRef, private renderer: Renderer2, private translateService: TranslateService) {}
11 |
12 | ngOnInit(): void {
13 | this.translateService.onLangChange.subscribe((event: LangChangeEvent) => {
14 | this.updateActiveFlag(event.lang);
15 | });
16 |
17 | this.updateActiveFlag(this.translateService.currentLang);
18 | }
19 |
20 | updateActiveFlag(selectedLanguage: string): void {
21 | if (this.jhiActiveMenu === selectedLanguage) {
22 | this.renderer.addClass(this.el.nativeElement, 'active');
23 | } else {
24 | this.renderer.removeClass(this.el.nativeElement, 'active');
25 | }
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/src/main/webapp/i18n/de/register.json:
--------------------------------------------------------------------------------
1 | {
2 | "register": {
3 | "title": "Registrierung",
4 | "form": {
5 | "button": "Registrieren"
6 | },
7 | "messages": {
8 | "validate": {
9 | "login": {
10 | "required": "Ihr Benutzername wird benötigt.",
11 | "minlength": "Ihr Benutzername muss mindestens 1 Zeichen lang sein",
12 | "maxlength": "Ihr Benutzername darf nicht länger als 50 Zeichen sein",
13 | "pattern": "Your username is invalid."
14 | }
15 | },
16 | "success": "Registrierung gespeichert! Bitte überprüfen Sie Ihre Emails für die Bestätigung.",
17 | "error": {
18 | "fail": "Registrierung fehlgeschlagen! Bitte versuchen Sie es später nochmal.",
19 | "userexists": "Benutzername bereits vergeben! Bitte wählen Sie einen anderen aus.",
20 | "emailexists": "Email wird bereits verwendet! Bitte wählen Sie eine andere aus."
21 | }
22 | }
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/src/main/webapp/i18n/en/microservice.json:
--------------------------------------------------------------------------------
1 | {
2 | "microcatalogApp": {
3 | "microservice": {
4 | "home": {
5 | "title": "Microservices",
6 | "createLabel": "Create a new Microservice",
7 | "createOrEditLabel": "Create or edit a Microservice",
8 | "notFound": "No Microservices found"
9 | },
10 | "created": "A new Microservice is created with identifier {{ param }}",
11 | "updated": "A Microservice is updated with identifier {{ param }}",
12 | "deleted": "A Microservice is deleted with identifier {{ param }}",
13 | "delete": {
14 | "question": "Are you sure you want to delete Microservice {{ id }}?"
15 | },
16 | "detail": {
17 | "title": "Microservice"
18 | },
19 | "name": "Name",
20 | "description": "Description",
21 | "imageUrl": "Image Url",
22 | "swaggerUrl": "Swagger Url",
23 | "gitUrl": "Git Url",
24 | "ciUrl": "Ci Url",
25 | "team": "Team",
26 | "status": "Status"
27 | }
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/src/main/webapp/app/dashboard/impact-analysis/impact-analysis-dashboard.component.html:
--------------------------------------------------------------------------------
1 |
2 |
Impact analysis
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/src/main/java/com/github/microcatalog/web/rest/errors/ErrorConstants.java:
--------------------------------------------------------------------------------
1 | package com.github.microcatalog.web.rest.errors;
2 |
3 | import java.net.URI;
4 |
5 | public final class ErrorConstants {
6 |
7 | public static final String ERR_CONCURRENCY_FAILURE = "error.concurrencyFailure";
8 | public static final String ERR_VALIDATION = "error.validation";
9 | public static final String PROBLEM_BASE_URL = "https://www.jhipster.tech/problem";
10 | public static final URI DEFAULT_TYPE = URI.create(PROBLEM_BASE_URL + "/problem-with-message");
11 | public static final URI CONSTRAINT_VIOLATION_TYPE = URI.create(PROBLEM_BASE_URL + "/constraint-violation");
12 | public static final URI INVALID_PASSWORD_TYPE = URI.create(PROBLEM_BASE_URL + "/invalid-password");
13 | public static final URI EMAIL_ALREADY_USED_TYPE = URI.create(PROBLEM_BASE_URL + "/email-already-used");
14 | public static final URI LOGIN_ALREADY_USED_TYPE = URI.create(PROBLEM_BASE_URL + "/login-already-used");
15 |
16 | private ErrorConstants() {
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/src/main/java/com/github/microcatalog/repository/PersistenceAuditEventRepository.java:
--------------------------------------------------------------------------------
1 | package com.github.microcatalog.repository;
2 |
3 | import com.github.microcatalog.domain.PersistentAuditEvent;
4 | import org.springframework.data.domain.Page;
5 | import org.springframework.data.domain.Pageable;
6 | import org.springframework.data.jpa.repository.JpaRepository;
7 |
8 | import java.time.Instant;
9 | import java.util.List;
10 |
11 | /**
12 | * Spring Data JPA repository for the {@link PersistentAuditEvent} entity.
13 | */
14 | public interface PersistenceAuditEventRepository extends JpaRepository {
15 |
16 | List findByPrincipal(String principal);
17 |
18 | List findByPrincipalAndAuditEventDateAfterAndAuditEventType(String principal, Instant after, String type);
19 |
20 | Page findAllByAuditEventDateBetween(Instant fromDate, Instant toDate, Pageable pageable);
21 |
22 | List findByAuditEventDateBefore(Instant before);
23 | }
24 |
--------------------------------------------------------------------------------
/src/main/webapp/app/admin/user-management/user-management.module.ts:
--------------------------------------------------------------------------------
1 | import { NgModule } from '@angular/core';
2 | import { RouterModule } from '@angular/router';
3 |
4 | import { MicrocatalogSharedModule } from 'app/shared/shared.module';
5 | import { UserManagementComponent } from './user-management.component';
6 | import { UserManagementDetailComponent } from './user-management-detail.component';
7 | import { UserManagementUpdateComponent } from './user-management-update.component';
8 | import { UserManagementDeleteDialogComponent } from './user-management-delete-dialog.component';
9 | import { userManagementRoute } from './user-management.route';
10 |
11 | @NgModule({
12 | imports: [MicrocatalogSharedModule, RouterModule.forChild(userManagementRoute)],
13 | declarations: [
14 | UserManagementComponent,
15 | UserManagementDetailComponent,
16 | UserManagementUpdateComponent,
17 | UserManagementDeleteDialogComponent,
18 | ],
19 | entryComponents: [UserManagementDeleteDialogComponent],
20 | })
21 | export class UserManagementModule {}
22 |
--------------------------------------------------------------------------------
/checkstyle.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
14 |
15 |
20 |
21 |
22 |
--------------------------------------------------------------------------------
/src/main/webapp/app/entities/microservice/microservice-delete-dialog.component.ts:
--------------------------------------------------------------------------------
1 | import { Component } from '@angular/core';
2 | import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';
3 | import { JhiEventManager } from 'ng-jhipster';
4 |
5 | import { IMicroservice } from 'app/shared/model/microservice.model';
6 | import { MicroserviceService } from './microservice.service';
7 |
8 | @Component({
9 | templateUrl: './microservice-delete-dialog.component.html',
10 | })
11 | export class MicroserviceDeleteDialogComponent {
12 | microservice?: IMicroservice;
13 |
14 | constructor(
15 | protected microserviceService: MicroserviceService,
16 | public activeModal: NgbActiveModal,
17 | protected eventManager: JhiEventManager
18 | ) {}
19 |
20 | cancel(): void {
21 | this.activeModal.dismiss();
22 | }
23 |
24 | confirmDelete(id: number): void {
25 | this.microserviceService.delete(id).subscribe(() => {
26 | this.eventManager.broadcast('microserviceListModification');
27 | this.activeModal.close();
28 | });
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/src/main/java/com/github/microcatalog/web/rest/custom/IntegrationTestsCustomResource.java:
--------------------------------------------------------------------------------
1 | package com.github.microcatalog.web.rest.custom;
2 |
3 | import com.github.microcatalog.service.custom.IntegrationTestsService;
4 | import org.springframework.web.bind.annotation.PathVariable;
5 | import org.springframework.web.bind.annotation.PostMapping;
6 | import org.springframework.web.bind.annotation.RequestMapping;
7 | import org.springframework.web.bind.annotation.RestController;
8 |
9 | /**
10 | * REST controller for triggering integraion tests
11 | */
12 | @RestController
13 | @RequestMapping("/api")
14 | public class IntegrationTestsCustomResource {
15 | private final IntegrationTestsService service;
16 |
17 | public IntegrationTestsCustomResource(IntegrationTestsService service) {
18 | this.service = service;
19 | }
20 |
21 | @PostMapping("integration-tests/microservice/{microserviceId}")
22 | public void triggerIntegrationTests(@PathVariable Long microserviceId) {
23 | service.triggerIntegrationTests(microserviceId);
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/src/main/java/com/github/microcatalog/web/rest/vm/ManagedUserVM.java:
--------------------------------------------------------------------------------
1 | package com.github.microcatalog.web.rest.vm;
2 |
3 | import com.github.microcatalog.service.dto.UserDTO;
4 | import javax.validation.constraints.Size;
5 |
6 | /**
7 | * View Model extending the UserDTO, which is meant to be used in the user management UI.
8 | */
9 | public class ManagedUserVM extends UserDTO {
10 |
11 | public static final int PASSWORD_MIN_LENGTH = 4;
12 |
13 | public static final int PASSWORD_MAX_LENGTH = 100;
14 |
15 | @Size(min = PASSWORD_MIN_LENGTH, max = PASSWORD_MAX_LENGTH)
16 | private String password;
17 |
18 | public ManagedUserVM() {
19 | // Empty constructor needed for Jackson.
20 | }
21 |
22 | public String getPassword() {
23 | return password;
24 | }
25 |
26 | public void setPassword(String password) {
27 | this.password = password;
28 | }
29 |
30 | // prettier-ignore
31 | @Override
32 | public String toString() {
33 | return "ManagedUserVM{" + super.toString() + "} ";
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/src/main/webapp/app/dashboard/dependency-dashboard/dependency-dashboard.module.ts:
--------------------------------------------------------------------------------
1 | import { NgModule } from '@angular/core';
2 | import { DependencyDashboardComponent } from './dependency-dashboard.component';
3 | import { RouterModule } from '@angular/router';
4 | import { dependencyDashboardRoute } from './dependency-dashboard.route';
5 | import { MicrocatalogSharedModule } from '../../shared/shared.module';
6 | import { MicroserviceSearchModule } from '../../entities/microservice/microservice-dashboard/microservice-search/microservice-search.module';
7 | import { GraphLegendModule } from './node-legend/graph-legend.module';
8 | import { CreateDependencyDialogModule } from './create-dependency-dialog/create-dependency-dialog.module';
9 |
10 | @NgModule({
11 | imports: [
12 | MicroserviceSearchModule,
13 | MicrocatalogSharedModule,
14 | GraphLegendModule,
15 | CreateDependencyDialogModule,
16 | RouterModule.forChild(dependencyDashboardRoute),
17 | ],
18 | declarations: [DependencyDashboardComponent],
19 | })
20 | export class DependencyDashboardModule {}
21 |
--------------------------------------------------------------------------------
/src/main/webapp/i18n/de/user-management.json:
--------------------------------------------------------------------------------
1 | {
2 | "userManagement": {
3 | "home": {
4 | "title": "Benutzer",
5 | "createLabel": "Neuen Benutzer erstellen",
6 | "createOrEditLabel": "Benutzer erstellen oder bearbeiten"
7 | },
8 | "created": "Ein neuer Benutzer wurde mit ID {{ param }} erstellt",
9 | "updated": "Ein Benutzer mit ID {{ param }} wurde geändert",
10 | "deleted": "Ein Benutzer mit ID {{ param }} wurde gelöscht",
11 | "delete": {
12 | "question": "Sind Sie sicher, dass Sie den Benutzer {{ login }} löschen möchten?"
13 | },
14 | "detail": {
15 | "title": "Benutzer"
16 | },
17 | "login": "Login",
18 | "firstName": "Vorname",
19 | "lastName": "Nachname",
20 | "email": "Email",
21 | "activated": "Aktiv",
22 | "deactivated": "Deaktiviert",
23 | "profiles": "Profile",
24 | "langKey": "Sprache",
25 | "createdBy": "Erstellt von",
26 | "createdDate": "Erstellt am",
27 | "lastModifiedBy": "Bearbeitet von",
28 | "lastModifiedDate": "Zuletzt bearbeitet"
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/src/main/java/com/github/microcatalog/service/dto/PasswordChangeDTO.java:
--------------------------------------------------------------------------------
1 | package com.github.microcatalog.service.dto;
2 |
3 | /**
4 | * A DTO representing a password change required data - current and new password.
5 | */
6 | public class PasswordChangeDTO {
7 | private String currentPassword;
8 | private String newPassword;
9 |
10 | public PasswordChangeDTO() {
11 | // Empty constructor needed for Jackson.
12 | }
13 |
14 | public PasswordChangeDTO(String currentPassword, String newPassword) {
15 | this.currentPassword = currentPassword;
16 | this.newPassword = newPassword;
17 | }
18 |
19 | public String getCurrentPassword() {
20 |
21 | return currentPassword;
22 | }
23 |
24 | public void setCurrentPassword(String currentPassword) {
25 | this.currentPassword = currentPassword;
26 | }
27 |
28 | public String getNewPassword() {
29 | return newPassword;
30 | }
31 |
32 | public void setNewPassword(String newPassword) {
33 | this.newPassword = newPassword;
34 | }
35 | }
36 |
--------------------------------------------------------------------------------