├── 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 |
5 |
6 | {{d.name}} 7 |
8 |
9 | -------------------------------------------------------------------------------- /src/main/webapp/app/dashboard/dependency-dashboard/node-legend/vertex-legend/vertex-legend.component.html: -------------------------------------------------------------------------------- 1 |
2 |
Selected microservices:
3 |
4 |
5 |
6 | {{m.name}} 7 |
8 |
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 |
10 | {{ ribbonEnv }} 11 |
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 | --------------------------------------------------------------------------------