diff --git a/quartz-manager-backend/pom.xml b/quartz-manager-backend/pom.xml index e3dea41..54f4f27 100644 --- a/quartz-manager-backend/pom.xml +++ b/quartz-manager-backend/pom.xml @@ -141,6 +141,11 @@ org.springframework.boot spring-boot-starter-aop + + org.yaml + snakeyaml + + diff --git a/quartz-manager-backend/src/main/java/it/fabioformosa/quartzmanager/configuration/SchedulerConfig.java b/quartz-manager-backend/src/main/java/it/fabioformosa/quartzmanager/configuration/SchedulerConfig.java index 5075c89..bcf5e35 100644 --- a/quartz-manager-backend/src/main/java/it/fabioformosa/quartzmanager/configuration/SchedulerConfig.java +++ b/quartz-manager-backend/src/main/java/it/fabioformosa/quartzmanager/configuration/SchedulerConfig.java @@ -43,7 +43,7 @@ public class SchedulerConfig { factoryBean.setRepeatInterval(pollFrequencyMs); factoryBean.setRepeatCount(repeatCount); factoryBean - .setMisfireInstruction(SimpleTrigger.MISFIRE_INSTRUCTION_RESCHEDULE_NEXT_WITH_EXISTING_COUNT);// in case of misfire, ignore all missed triggers and continue + .setMisfireInstruction(SimpleTrigger.MISFIRE_INSTRUCTION_RESCHEDULE_NEXT_WITH_EXISTING_COUNT);// in case of misfire, ignore all missed triggers and continue return factoryBean; } diff --git a/quartz-manager-backend/src/main/resources/application.properties b/quartz-manager-backend/src/main/resources/application.properties deleted file mode 100644 index 53cebd9..0000000 --- a/quartz-manager-backend/src/main/resources/application.properties +++ /dev/null @@ -1,20 +0,0 @@ -server.context-path=/quartz-manager -server.port=8080 -server.session.timeout=28800 - -spring.thymeleaf.cache=false -spring.thymeleaf.mode=LEGACYHTML5 - -quartz.enabled=true - -job.frequency=4000 -job.repeatCount=19 - -logging.level.org.springframework.web=WARN -logging.level.it.fabioformosa=INFO - -app.name: quartz-manager -jwt.header: Authorization -jwt.expires_in: 600 -jwt.secret: queenvictoria -jwt.cookie: AUTH-TOKEN \ No newline at end of file diff --git a/quartz-manager-backend/src/main/resources/application.yml b/quartz-manager-backend/src/main/resources/application.yml new file mode 100644 index 0000000..d1a31e8 --- /dev/null +++ b/quartz-manager-backend/src/main/resources/application.yml @@ -0,0 +1,30 @@ +server: + context-path: /quartz-manager + port: 8080 + session.timeout : 28800 + +spring: + thymeleaf: + cache: false + mode: LEGACYHTML5 + +quartz: + enabled: true + +job: + frequency: 4000 + repeatCount: 19 + +logging: + level: + org.springframework.web: WARN + it.fabioformosa: INFO + +app: + name: quartz-manager + +jwt: + header: Authorization + expires_in: 600 # 10 minutes + secret: queenvictoria + cookie: AUTH-TOKEN \ No newline at end of file diff --git a/quartz-manager-frontend/src/app/app-routing.module.ts b/quartz-manager-frontend/src/app/app-routing.module.ts index 6c2d5a1..6905f1a 100644 --- a/quartz-manager-frontend/src/app/app-routing.module.ts +++ b/quartz-manager-frontend/src/app/app-routing.module.ts @@ -10,6 +10,8 @@ import { NotFoundComponent } from './not-found'; import { ChangePasswordComponent } from './change-password'; import { ForbiddenComponent } from './forbidden'; import { SignupComponent } from './signup'; + +import { ManagerComponent } from './manager'; export const routes: Routes = [ { @@ -17,6 +19,12 @@ export const routes: Routes = [ component: HomeComponent, pathMatch: 'full' }, + { + path: 'manager', + component: ManagerComponent, + canActivate: [AdminGuard], + pathMatch: 'full' + }, { path:'signup', component: SignupComponent, diff --git a/quartz-manager-frontend/src/app/app.component.spec.ts b/quartz-manager-frontend/src/app/app.component.spec.ts index f5a514e..8ab6c09 100644 --- a/quartz-manager-frontend/src/app/app.component.spec.ts +++ b/quartz-manager-frontend/src/app/app.component.spec.ts @@ -3,6 +3,7 @@ import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; import { RouterTestingModule } from '@angular/router/testing'; import { AppComponent } from './app.component'; import { HomeComponent } from './home'; +import { ManagerComponent } from './manager'; import { LoginComponent } from './login'; import { MockApiService } from './service/mocks/api.service.mock'; diff --git a/quartz-manager-frontend/src/app/app.module.ts b/quartz-manager-frontend/src/app/app.module.ts index e492f88..70742ab 100644 --- a/quartz-manager-frontend/src/app/app.module.ts +++ b/quartz-manager-frontend/src/app/app.module.ts @@ -20,15 +20,20 @@ import { FlexLayoutModule } from '@angular/flex-layout'; import { AppComponent } from './app.component'; import { AppRoutingModule } from './app-routing.module'; import { HomeComponent } from './home'; +import { ManagerComponent } from './manager'; import { LoginComponent } from './login'; import { LoginGuard, GuestGuard, AdminGuard } from './guard'; import { NotFoundComponent } from './not-found'; import { AccountMenuComponent } from './component/header/account-menu/account-menu.component'; + import { HeaderComponent, ApiCardComponent, FooterComponent, - GithubComponent + GithubComponent, + SchedulerConfigComponent, + LogsPanelComponent, + ProgressPanelComponent } from './component'; import { @@ -54,10 +59,14 @@ export function initUserFactory(userService: UserService) { FooterComponent, ApiCardComponent, HomeComponent, + ManagerComponent, GithubComponent, LoginComponent, NotFoundComponent, AccountMenuComponent, + SchedulerConfigComponent, + LogsPanelComponent, + ProgressPanelComponent, ChangePasswordComponent, ForbiddenComponent, AdminComponent, diff --git a/quartz-manager-frontend/src/app/component/index.ts b/quartz-manager-frontend/src/app/component/index.ts index 3209f56..1463cfd 100644 --- a/quartz-manager-frontend/src/app/component/index.ts +++ b/quartz-manager-frontend/src/app/component/index.ts @@ -2,3 +2,6 @@ export * from './header'; export * from './github'; export * from './footer'; export * from './api-card'; +export * from './logs-panel'; +export * from './scheduler-config'; +export * from './progress-panel'; diff --git a/quartz-manager-frontend/src/app/component/logs-panel/index.ts b/quartz-manager-frontend/src/app/component/logs-panel/index.ts new file mode 100644 index 0000000..e9b1c03 --- /dev/null +++ b/quartz-manager-frontend/src/app/component/logs-panel/index.ts @@ -0,0 +1 @@ +export * from './logs-panel.component'; diff --git a/quartz-manager-frontend/src/app/component/logs-panel/logs-panel.component.html b/quartz-manager-frontend/src/app/component/logs-panel/logs-panel.component.html new file mode 100644 index 0000000..2cda319 --- /dev/null +++ b/quartz-manager-frontend/src/app/component/logs-panel/logs-panel.component.html @@ -0,0 +1 @@ +LOGS PANEL HERE!!! diff --git a/quartz-manager-frontend/src/app/component/logs-panel/logs-panel.component.scss b/quartz-manager-frontend/src/app/component/logs-panel/logs-panel.component.scss new file mode 100644 index 0000000..903036c --- /dev/null +++ b/quartz-manager-frontend/src/app/component/logs-panel/logs-panel.component.scss @@ -0,0 +1,63 @@ +:host { + text-align: center; + max-width: 350px; +} + +mat-card { + text-align: left; + .response-success { + background-color: #dff0d8; + border-color: #d6e9c6; + color: #3c763d; + } + .response-error { + background-color: #f2dede; + border-color: #ebccd1; + color: #a94442; + } + + .response { + max-height: 0; + transition: max-height 1s; + margin-left: -16px; + margin-right: -16px; + border-radius: 4px; + overflow: hidden; + margin-bottom: -16px; + padding-bottom: 0; + } + + .expand { + padding: 15px; + border: 1px solid transparent; + max-height: 999px; + margin-top: 8px; + } + + mat-card-actions { + margin-bottom: 0; + padding-bottom: 0; + } + + pre { + display: block; + padding: 9.5px; + margin: 0 0 10px; + font-size: 13px; + line-height: 1.42857143; + color: #333; + word-break: break-all; + word-wrap: break-word; + white-space: pre-wrap; + background-color: #f5f5f5; + border: 1px solid #ccc; + border-radius: 4px; + } +} + + +@media screen and (max-width: 599px) { + :host { + max-width: 999px; + } +} diff --git a/quartz-manager-frontend/src/app/component/logs-panel/logs-panel.component.ts b/quartz-manager-frontend/src/app/component/logs-panel/logs-panel.component.ts new file mode 100644 index 0000000..cef64da --- /dev/null +++ b/quartz-manager-frontend/src/app/component/logs-panel/logs-panel.component.ts @@ -0,0 +1,16 @@ +import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core'; + +@Component({ + selector: 'logs-panel', + templateUrl: './logs-panel.component.html', + styleUrls: ['./logs-panel.component.scss'] +}) +export class LogsPanelComponent implements OnInit { + + + constructor() { } + + ngOnInit() { + } + +} diff --git a/quartz-manager-frontend/src/app/component/progress-panel/index.ts b/quartz-manager-frontend/src/app/component/progress-panel/index.ts new file mode 100644 index 0000000..28a222f --- /dev/null +++ b/quartz-manager-frontend/src/app/component/progress-panel/index.ts @@ -0,0 +1 @@ +export * from './progress-panel.component'; diff --git a/quartz-manager-frontend/src/app/component/progress-panel/progress-panel.component.html b/quartz-manager-frontend/src/app/component/progress-panel/progress-panel.component.html new file mode 100644 index 0000000..16a4b30 --- /dev/null +++ b/quartz-manager-frontend/src/app/component/progress-panel/progress-panel.component.html @@ -0,0 +1 @@ +PROGRESS PANEL HERE!!! diff --git a/quartz-manager-frontend/src/app/component/progress-panel/progress-panel.component.scss b/quartz-manager-frontend/src/app/component/progress-panel/progress-panel.component.scss new file mode 100644 index 0000000..903036c --- /dev/null +++ b/quartz-manager-frontend/src/app/component/progress-panel/progress-panel.component.scss @@ -0,0 +1,63 @@ +:host { + text-align: center; + max-width: 350px; +} + +mat-card { + text-align: left; + .response-success { + background-color: #dff0d8; + border-color: #d6e9c6; + color: #3c763d; + } + .response-error { + background-color: #f2dede; + border-color: #ebccd1; + color: #a94442; + } + + .response { + max-height: 0; + transition: max-height 1s; + margin-left: -16px; + margin-right: -16px; + border-radius: 4px; + overflow: hidden; + margin-bottom: -16px; + padding-bottom: 0; + } + + .expand { + padding: 15px; + border: 1px solid transparent; + max-height: 999px; + margin-top: 8px; + } + + mat-card-actions { + margin-bottom: 0; + padding-bottom: 0; + } + + pre { + display: block; + padding: 9.5px; + margin: 0 0 10px; + font-size: 13px; + line-height: 1.42857143; + color: #333; + word-break: break-all; + word-wrap: break-word; + white-space: pre-wrap; + background-color: #f5f5f5; + border: 1px solid #ccc; + border-radius: 4px; + } +} + + +@media screen and (max-width: 599px) { + :host { + max-width: 999px; + } +} diff --git a/quartz-manager-frontend/src/app/component/progress-panel/progress-panel.component.ts b/quartz-manager-frontend/src/app/component/progress-panel/progress-panel.component.ts new file mode 100644 index 0000000..88eea5d --- /dev/null +++ b/quartz-manager-frontend/src/app/component/progress-panel/progress-panel.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core'; + +@Component({ + selector: 'progress-panel', + templateUrl: './progress-panel.component.html', + styleUrls: ['./progress-panel.component.scss'] +}) +export class ProgressPanelComponent implements OnInit { + + constructor() { } + + ngOnInit() { + } + +} diff --git a/quartz-manager-frontend/src/app/component/scheduler-config/index.ts b/quartz-manager-frontend/src/app/component/scheduler-config/index.ts new file mode 100644 index 0000000..d8d3e69 --- /dev/null +++ b/quartz-manager-frontend/src/app/component/scheduler-config/index.ts @@ -0,0 +1 @@ +export * from './scheduler-config.component'; diff --git a/quartz-manager-frontend/src/app/component/scheduler-config/scheduler-config.component.html b/quartz-manager-frontend/src/app/component/scheduler-config/scheduler-config.component.html new file mode 100644 index 0000000..9bff02c --- /dev/null +++ b/quartz-manager-frontend/src/app/component/scheduler-config/scheduler-config.component.html @@ -0,0 +1 @@ +SCHEDULER CONFIG HERE!!! diff --git a/quartz-manager-frontend/src/app/component/scheduler-config/scheduler-config.component.scss b/quartz-manager-frontend/src/app/component/scheduler-config/scheduler-config.component.scss new file mode 100644 index 0000000..903036c --- /dev/null +++ b/quartz-manager-frontend/src/app/component/scheduler-config/scheduler-config.component.scss @@ -0,0 +1,63 @@ +:host { + text-align: center; + max-width: 350px; +} + +mat-card { + text-align: left; + .response-success { + background-color: #dff0d8; + border-color: #d6e9c6; + color: #3c763d; + } + .response-error { + background-color: #f2dede; + border-color: #ebccd1; + color: #a94442; + } + + .response { + max-height: 0; + transition: max-height 1s; + margin-left: -16px; + margin-right: -16px; + border-radius: 4px; + overflow: hidden; + margin-bottom: -16px; + padding-bottom: 0; + } + + .expand { + padding: 15px; + border: 1px solid transparent; + max-height: 999px; + margin-top: 8px; + } + + mat-card-actions { + margin-bottom: 0; + padding-bottom: 0; + } + + pre { + display: block; + padding: 9.5px; + margin: 0 0 10px; + font-size: 13px; + line-height: 1.42857143; + color: #333; + word-break: break-all; + word-wrap: break-word; + white-space: pre-wrap; + background-color: #f5f5f5; + border: 1px solid #ccc; + border-radius: 4px; + } +} + + +@media screen and (max-width: 599px) { + :host { + max-width: 999px; + } +} diff --git a/quartz-manager-frontend/src/app/component/scheduler-config/scheduler-config.component.ts b/quartz-manager-frontend/src/app/component/scheduler-config/scheduler-config.component.ts new file mode 100644 index 0000000..6de350f --- /dev/null +++ b/quartz-manager-frontend/src/app/component/scheduler-config/scheduler-config.component.ts @@ -0,0 +1,16 @@ +import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core'; + +@Component({ + selector: 'scheduler-config', + templateUrl: './scheduler-config.component.html', + styleUrls: ['./scheduler-config.component.scss'] +}) +export class SchedulerConfigComponent implements OnInit { + + + constructor() { } + + ngOnInit() { + } + +} diff --git a/quartz-manager-frontend/src/app/manager/index.ts b/quartz-manager-frontend/src/app/manager/index.ts new file mode 100644 index 0000000..729d041 --- /dev/null +++ b/quartz-manager-frontend/src/app/manager/index.ts @@ -0,0 +1 @@ +export * from './manager.component'; diff --git a/quartz-manager-frontend/src/app/manager/manager.component.html b/quartz-manager-frontend/src/app/manager/manager.component.html new file mode 100644 index 0000000..4a10114 --- /dev/null +++ b/quartz-manager-frontend/src/app/manager/manager.component.html @@ -0,0 +1,22 @@ +
+ +
+ + +
+ +
+
+
+ + +
+ +
+ + +
+
+
+ +
diff --git a/quartz-manager-frontend/src/app/manager/manager.component.scss b/quartz-manager-frontend/src/app/manager/manager.component.scss new file mode 100644 index 0000000..7192410 --- /dev/null +++ b/quartz-manager-frontend/src/app/manager/manager.component.scss @@ -0,0 +1,42 @@ +app-api-card { + margin: 0 50px 0 0; + &.last { + margin: 0 0 0 0; + } +} + +app-github { + margin: 50px -70px -50px; +} + +@media screen and (min-width: 600px) and (max-width: 1279px) { + app-api-card { + margin: 0 4px 0 0; + &.last { + margin: 0 0 0 0; + } + } + + app-github { + margin: 20px -30px -20px; + } +} + +@media screen and (max-width: 599px) { + + .content { + /* https://github.com/angular/flex-layout/issues/295 */ + display: block !important; + } + + app-api-card { + /* https://github.com/angular/flex-layout/issues/295 */ + display: block !important; + margin: 0 0 12px 0; + } + + app-github { + margin: 8px -12px -8px; + } + +} diff --git a/quartz-manager-frontend/src/app/manager/manager.component.spec.ts b/quartz-manager-frontend/src/app/manager/manager.component.spec.ts new file mode 100644 index 0000000..d4ce3a8 --- /dev/null +++ b/quartz-manager-frontend/src/app/manager/manager.component.spec.ts @@ -0,0 +1,58 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { HomeComponent } from './home.component'; +import { ApiCardComponent, GithubComponent } from '../component'; +import { MockApiService } from '../service/mocks/api.service.mock'; + +import { + MatButtonModule, + MatCardModule +} from '@angular/material'; +import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; + +import { + ApiService, + AuthService, + UserService, + FooService, + ConfigService +} from '../service'; + +describe('HomeComponent', () => { + let component: HomeComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ + HomeComponent, + ApiCardComponent, + GithubComponent + ], + imports: [ + MatButtonModule, + MatCardModule + ], + providers: [ + { + provide: ApiService, + useClass: MockApiService + }, + AuthService, + UserService, + FooService, + ConfigService + ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(HomeComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/quartz-manager-frontend/src/app/manager/manager.component.ts b/quartz-manager-frontend/src/app/manager/manager.component.ts new file mode 100644 index 0000000..8cea7f1 --- /dev/null +++ b/quartz-manager-frontend/src/app/manager/manager.component.ts @@ -0,0 +1,27 @@ +import { Component, OnInit } from '@angular/core'; +import { + FooService, + ConfigService, + UserService +} from '../service'; + +@Component({ + selector: 'manager', + templateUrl: './manager.component.html', + styleUrls: ['./manager.component.scss'] +}) +export class ManagerComponent implements OnInit { + + fooResponse = {}; + whoamIResponse = {}; + allUserResponse = {}; + constructor( + private config: ConfigService, + private fooService: FooService, + private userService: UserService + ) { } + + ngOnInit() { + } + +}