Merge pull request 'develop' (#49) from develop into master
All checks were successful
continuous-integration/drone/push Build is passing
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #49
This commit is contained in:
commit
0508e681ab
13 changed files with 145 additions and 85 deletions
46
.drone.yml
46
.drone.yml
|
@ -29,6 +29,37 @@ trigger:
|
||||||
event:
|
event:
|
||||||
- push
|
- push
|
||||||
|
|
||||||
|
---
|
||||||
|
kind: pipeline
|
||||||
|
type: docker
|
||||||
|
name: linux-arm64
|
||||||
|
|
||||||
|
platform:
|
||||||
|
os: linux
|
||||||
|
arch: arm64
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: build
|
||||||
|
image: node:alpine
|
||||||
|
commands:
|
||||||
|
- npm install
|
||||||
|
- npm run build:ssr
|
||||||
|
- name: docker
|
||||||
|
image: plugins/docker
|
||||||
|
settings:
|
||||||
|
auto_tag: true
|
||||||
|
auto_tag_suffix: linux-arm64
|
||||||
|
repo: samuelph/universal-statuspage
|
||||||
|
username:
|
||||||
|
from_secret: USERNAME
|
||||||
|
password:
|
||||||
|
from_secret: PASSWORD
|
||||||
|
when:
|
||||||
|
branch:
|
||||||
|
- master
|
||||||
|
event:
|
||||||
|
- push
|
||||||
|
|
||||||
---
|
---
|
||||||
kind: pipeline
|
kind: pipeline
|
||||||
type: docker
|
type: docker
|
||||||
|
@ -54,11 +85,12 @@ steps:
|
||||||
from_secret: USERNAME
|
from_secret: USERNAME
|
||||||
password:
|
password:
|
||||||
from_secret: PASSWORD
|
from_secret: PASSWORD
|
||||||
when:
|
|
||||||
branch:
|
trigger:
|
||||||
- master
|
branch:
|
||||||
event:
|
- master
|
||||||
- push
|
event:
|
||||||
|
- push
|
||||||
|
|
||||||
---
|
---
|
||||||
kind: pipeline
|
kind: pipeline
|
||||||
|
@ -67,7 +99,7 @@ name: manifest
|
||||||
|
|
||||||
platform:
|
platform:
|
||||||
os: linux
|
os: linux
|
||||||
arch: arm
|
arch: arm64
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: publish
|
- name: publish
|
||||||
|
@ -79,6 +111,7 @@ steps:
|
||||||
template: samuelph/universal-statuspage:OS-ARCH
|
template: samuelph/universal-statuspage:OS-ARCH
|
||||||
platforms:
|
platforms:
|
||||||
- linux/amd64
|
- linux/amd64
|
||||||
|
- linux/arm64
|
||||||
- linux/arm
|
- linux/arm
|
||||||
username:
|
username:
|
||||||
from_secret: USERNAME
|
from_secret: USERNAME
|
||||||
|
@ -87,6 +120,7 @@ steps:
|
||||||
|
|
||||||
depends_on:
|
depends_on:
|
||||||
- linux-amd64
|
- linux-amd64
|
||||||
|
- linux-arm64
|
||||||
- linux-arm
|
- linux-arm
|
||||||
|
|
||||||
trigger:
|
trigger:
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
FROM node:14.11.0-alpine
|
FROM node:14.14.0-alpine
|
||||||
|
|
||||||
COPY dist/universal-statuspage /universal-statuspage
|
COPY dist/universal-statuspage /universal-statuspage
|
||||||
|
|
||||||
|
|
|
@ -46,7 +46,6 @@
|
||||||
"optimization": true,
|
"optimization": true,
|
||||||
"outputHashing": "all",
|
"outputHashing": "all",
|
||||||
"sourceMap": false,
|
"sourceMap": false,
|
||||||
"extractCss": true,
|
|
||||||
"namedChunks": false,
|
"namedChunks": false,
|
||||||
"extractLicenses": true,
|
"extractLicenses": true,
|
||||||
"vendorChunk": false,
|
"vendorChunk": false,
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
{
|
{
|
||||||
"extends": "../tsconfig.base.json",
|
"extends": "../tsconfig.json",
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
"outDir": "../out-tsc/e2e",
|
"outDir": "../out-tsc/e2e",
|
||||||
"module": "commonjs",
|
"module": "commonjs",
|
||||||
|
|
48
package.json
48
package.json
|
@ -15,48 +15,48 @@
|
||||||
},
|
},
|
||||||
"private": true,
|
"private": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@angular/animations": "~10.0.4",
|
"@angular/animations": "~11.0.2",
|
||||||
"@angular/cdk": "^10.0.2",
|
"@angular/cdk": "^11.0.1",
|
||||||
"@angular/common": "~10.0.4",
|
"@angular/common": "~11.0.2",
|
||||||
"@angular/compiler": "~10.0.4",
|
"@angular/compiler": "~11.0.2",
|
||||||
"@angular/core": "~10.0.4",
|
"@angular/core": "~11.0.2",
|
||||||
"@angular/forms": "~10.0.4",
|
"@angular/forms": "~11.0.2",
|
||||||
"@angular/material": "^10.0.2",
|
"@angular/material": "^11.0.1",
|
||||||
"@angular/platform-browser": "~10.0.4",
|
"@angular/platform-browser": "~11.0.2",
|
||||||
"@angular/platform-browser-dynamic": "~10.0.4",
|
"@angular/platform-browser-dynamic": "~11.0.2",
|
||||||
"@angular/platform-server": "~10.0.4",
|
"@angular/platform-server": "~11.0.2",
|
||||||
"@angular/router": "~10.0.4",
|
"@angular/router": "~11.0.2",
|
||||||
"@fortawesome/fontawesome-free": "^5.14.0",
|
"@fortawesome/fontawesome-free": "^5.15.1",
|
||||||
"@nguniversal/express-engine": "^10.1.0",
|
"@nguniversal/express-engine": "^11.0.0",
|
||||||
"bootstrap": "^4.5.2",
|
"bootstrap": "^4.5.3",
|
||||||
"express": "^4.17.1",
|
"express": "^4.17.1",
|
||||||
"jsonpath-plus": "^4.0.0",
|
"jsonpath-plus": "^4.0.0",
|
||||||
"roboto-fontface": "^0.10.0",
|
"roboto-fontface": "^0.10.0",
|
||||||
"rxjs": "~6.6.0",
|
"rxjs": "~6.6.3",
|
||||||
"tslib": "^2.0.0",
|
"tslib": "^2.0.0",
|
||||||
"zone.js": "~0.10.2"
|
"zone.js": "~0.10.2"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@angular-devkit/build-angular": "~0.1000.3",
|
"@angular-devkit/build-angular": "~0.1100.2",
|
||||||
"@angular/cli": "~10.0.3",
|
"@angular/cli": "~11.0.2",
|
||||||
"@angular/compiler-cli": "~10.0.4",
|
"@angular/compiler-cli": "~11.0.2",
|
||||||
"@angular/language-service": "~10.0.4",
|
"@angular/language-service": "~11.0.2",
|
||||||
"@nguniversal/builders": "^10.1.0",
|
"@nguniversal/builders": "^11.0.0",
|
||||||
"@types/express": "^4.17.8",
|
"@types/express": "^4.17.8",
|
||||||
"@types/node": "^14.0.23",
|
"@types/node": "^14.0.23",
|
||||||
"@types/jasmine": "~3.5.11",
|
"@types/jasmine": "~3.6.0",
|
||||||
"@types/jasminewd2": "~2.0.3",
|
"@types/jasminewd2": "~2.0.3",
|
||||||
"codelyzer": "^6.0.0",
|
"codelyzer": "^6.0.0",
|
||||||
"jasmine-core": "~3.5.0",
|
"jasmine-core": "~3.6.0",
|
||||||
"jasmine-spec-reporter": "~5.0.0",
|
"jasmine-spec-reporter": "~5.0.0",
|
||||||
"karma": "~5.1.0",
|
"karma": "~5.1.0",
|
||||||
"karma-chrome-launcher": "~3.1.0",
|
"karma-chrome-launcher": "~3.1.0",
|
||||||
"karma-coverage-istanbul-reporter": "~3.0.2",
|
"karma-coverage-istanbul-reporter": "~3.0.2",
|
||||||
"karma-jasmine": "~3.3.0",
|
"karma-jasmine": "~4.0.0",
|
||||||
"karma-jasmine-html-reporter": "^1.5.0",
|
"karma-jasmine-html-reporter": "^1.5.0",
|
||||||
"protractor": "~7.0.0",
|
"protractor": "~7.0.0",
|
||||||
"ts-node": "~8.10.2",
|
"ts-node": "~8.10.2",
|
||||||
"tslint": "~6.1.0",
|
"tslint": "~6.1.0",
|
||||||
"typescript": "~3.9.7"
|
"typescript": "~4.0.5"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,8 +9,9 @@ const routes: Routes = [{
|
||||||
|
|
||||||
@NgModule({
|
@NgModule({
|
||||||
imports: [RouterModule.forRoot(routes, {
|
imports: [RouterModule.forRoot(routes, {
|
||||||
initialNavigation: 'enabled'
|
initialNavigation: 'enabled',
|
||||||
})],
|
relativeLinkResolution: 'legacy'
|
||||||
|
})],
|
||||||
exports: [RouterModule]
|
exports: [RouterModule]
|
||||||
})
|
})
|
||||||
export class AppRoutingModule {
|
export class AppRoutingModule {
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
import { TestBed, async } from '@angular/core/testing';
|
import { TestBed, waitForAsync } from '@angular/core/testing';
|
||||||
import { RouterTestingModule } from '@angular/router/testing';
|
import { RouterTestingModule } from '@angular/router/testing';
|
||||||
import { AppComponent } from './app.component';
|
import { AppComponent } from './app.component';
|
||||||
|
|
||||||
describe('AppComponent', () => {
|
describe('AppComponent', () => {
|
||||||
beforeEach(async(() => {
|
beforeEach(waitForAsync(() => {
|
||||||
TestBed.configureTestingModule({
|
TestBed.configureTestingModule({
|
||||||
imports: [
|
imports: [
|
||||||
RouterTestingModule
|
RouterTestingModule
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
|
import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing';
|
||||||
|
|
||||||
import { StatusComponent } from './status.component';
|
import { StatusComponent } from './status.component';
|
||||||
|
|
||||||
|
@ -6,7 +6,7 @@ describe('StatusComponent', () => {
|
||||||
let component: StatusComponent;
|
let component: StatusComponent;
|
||||||
let fixture: ComponentFixture<StatusComponent>;
|
let fixture: ComponentFixture<StatusComponent>;
|
||||||
|
|
||||||
beforeEach(async(() => {
|
beforeEach(waitForAsync(() => {
|
||||||
TestBed.configureTestingModule({
|
TestBed.configureTestingModule({
|
||||||
declarations: [ StatusComponent ]
|
declarations: [ StatusComponent ]
|
||||||
})
|
})
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
import {json, Router} from 'express';
|
import {json, Router} from 'express';
|
||||||
import {CurrentStatus, State} from './app/_data/data';
|
import {CurrentStatus, Service, State} from './app/_data/data';
|
||||||
import {existsSync, readFileSync, writeFileSync} from 'fs';
|
import {existsSync, readFileSync, writeFileSync} from 'fs';
|
||||||
import {join} from 'path';
|
import {join} from 'path';
|
||||||
import {JSONPath} from 'jsonpath-plus';
|
import {JSONPath} from 'jsonpath-plus';
|
||||||
|
@ -83,7 +83,53 @@ api.post('/update/health', (req, res) => {
|
||||||
});
|
});
|
||||||
|
|
||||||
api.get('/status', (req, res) => {
|
api.get('/status', (req, res) => {
|
||||||
return res.json(cache);
|
return res.json(cache);
|
||||||
|
});
|
||||||
|
|
||||||
|
api.get('/badge', (req, res) => {
|
||||||
|
const serviceId = req.query.service as string;
|
||||||
|
if (!serviceId) {
|
||||||
|
return res.json({
|
||||||
|
"schemaVersion": 1,
|
||||||
|
"label": "sp-status",
|
||||||
|
"message": "service not provided",
|
||||||
|
"isError": true
|
||||||
|
});
|
||||||
|
}
|
||||||
|
const service = cache.groups
|
||||||
|
.map(g => g.services).reduce((x, y) => x.concat(y), [])
|
||||||
|
.find(s => s.id === serviceId);
|
||||||
|
if (!service) {
|
||||||
|
return res.json({
|
||||||
|
"schemaVersion": 1,
|
||||||
|
"label": "sp-status",
|
||||||
|
"message": "service not found",
|
||||||
|
"isError": true
|
||||||
|
});
|
||||||
|
}
|
||||||
|
const label = req.query.label || service.name;
|
||||||
|
let message;
|
||||||
|
let color;
|
||||||
|
switch (service.state) {
|
||||||
|
case 'operational':
|
||||||
|
message = req.query.operational || service.state;
|
||||||
|
color = '#7ed321';
|
||||||
|
break;
|
||||||
|
case 'outage':
|
||||||
|
message = req.query.outage || service.state;
|
||||||
|
color = '#ff6f6f';
|
||||||
|
break;
|
||||||
|
case 'maintenance':
|
||||||
|
message = req.query.maintenance || service.state;
|
||||||
|
color = '#f7ca18';
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return res.json({
|
||||||
|
"schemaVersion": 1,
|
||||||
|
"label": label,
|
||||||
|
"message": message,
|
||||||
|
"color": color
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
api.get('/info', (req, res) => {
|
api.get('/info', (req, res) => {
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
{
|
{
|
||||||
"extends": "./tsconfig.base.json",
|
"extends": "./tsconfig.json",
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
"outDir": "./out-tsc/app",
|
"outDir": "./out-tsc/app",
|
||||||
"types": []
|
"types": []
|
||||||
|
|
|
@ -1,23 +0,0 @@
|
||||||
{
|
|
||||||
"compileOnSave": false,
|
|
||||||
"compilerOptions": {
|
|
||||||
"baseUrl": "./",
|
|
||||||
"outDir": "./dist/out-tsc",
|
|
||||||
"sourceMap": true,
|
|
||||||
"declaration": false,
|
|
||||||
"downlevelIteration": true,
|
|
||||||
"experimentalDecorators": true,
|
|
||||||
"module": "es2020",
|
|
||||||
"moduleResolution": "node",
|
|
||||||
"importHelpers": true,
|
|
||||||
"target": "es2015",
|
|
||||||
"lib": [
|
|
||||||
"es2018",
|
|
||||||
"dom"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"angularCompilerOptions": {
|
|
||||||
"fullTemplateTypeCheck": true,
|
|
||||||
"strictInjectionParameters": true
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,20 +1,23 @@
|
||||||
/*
|
|
||||||
This is a "Solution Style" tsconfig.json file, and is used by editors and TypeScript’s language server to improve development experience.
|
|
||||||
It is not intended to be used to perform a compilation.
|
|
||||||
|
|
||||||
To learn more about this file see: https://angular.io/config/solution-tsconfig.
|
|
||||||
*/
|
|
||||||
{
|
{
|
||||||
"files": [],
|
"compileOnSave": false,
|
||||||
"references": [
|
"compilerOptions": {
|
||||||
{
|
"baseUrl": "./",
|
||||||
"path": "./tsconfig.app.json"
|
"outDir": "./dist/out-tsc",
|
||||||
},
|
"sourceMap": true,
|
||||||
{
|
"declaration": false,
|
||||||
"path": "./tsconfig.spec.json"
|
"downlevelIteration": true,
|
||||||
},
|
"experimentalDecorators": true,
|
||||||
{
|
"module": "es2020",
|
||||||
"path": "./tsconfig.server.json"
|
"moduleResolution": "node",
|
||||||
}
|
"importHelpers": true,
|
||||||
]
|
"target": "es2015",
|
||||||
|
"lib": [
|
||||||
|
"es2018",
|
||||||
|
"dom"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"angularCompilerOptions": {
|
||||||
|
"fullTemplateTypeCheck": true,
|
||||||
|
"strictInjectionParameters": true
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -1,5 +1,5 @@
|
||||||
{
|
{
|
||||||
"extends": "./tsconfig.base.json",
|
"extends": "./tsconfig.json",
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
"outDir": "./out-tsc/spec",
|
"outDir": "./out-tsc/spec",
|
||||||
"types": [
|
"types": [
|
||||||
|
|
Reference in a new issue