fix lint.

This commit is contained in:
Simon Larsen
2022-12-15 12:07:15 +05:30
parent 8ab6836fbd
commit 41d03ec596
18 changed files with 206 additions and 227 deletions

View File

@@ -1,18 +1,17 @@
import Email from '../Types/Email';
import { JSONObject } from '../Types/JSON'
import posthog from 'posthog-js'
export default class Analytics {
import { JSONObject } from '../Types/JSON';
import posthog from 'posthog-js';
export default class Analytics {
public constructor(apiHost: string, apiKey: string) {
posthog.init(apiKey, { api_host: apiHost})
posthog.init(apiKey, { api_host: apiHost });
}
public userAuth(email: Email): void {
public userAuth(email: Email): void {
posthog.identify(email.toString());
}
public capture(eventName: string, data: JSONObject): void {
posthog.capture(eventName, data);
}
}
}

View File

@@ -120,8 +120,6 @@ export default class StatusPageAPI extends BaseAPI<
}
);
this.router.post(
`/${new this.entityType()
.getCrudApiPath()
@@ -404,7 +402,6 @@ export default class StatusPageAPI extends BaseAPI<
return monitor.monitorId!;
});
const startDate: Date = OneUptimeDate.getSomeDaysAgo(90);
const endDate: Date = OneUptimeDate.getCurrentDate();
@@ -445,8 +442,6 @@ export default class StatusPageAPI extends BaseAPI<
});
}
// check if status page has active incident.
let activeIncidents: Array<Incident> = [];
if (monitorsOnStatusPage.length > 0) {
@@ -520,7 +515,7 @@ export default class StatusPageAPI extends BaseAPI<
let incidentStateTimelines: Array<IncidentStateTimeline> =
[];
console.log("HERE");
console.log('HERE');
if (incidentsOnStausPage.length > 0) {
incidentStateTimelines =
await IncidentStateTimelineService.findBy({

View File

@@ -1,4 +1,3 @@
import StatusPageSubscriber from 'Model/Models/StatusPageSubscriber';
import StatusPageSubscriberService, {
Service as StatusPageSubscriberServiceType,
@@ -19,14 +18,15 @@ export default class StatusPageSubscriberAPI extends BaseAPI<
super(StatusPageSubscriber, StatusPageSubscriberService);
this.router.get(
`/${new this.entityType().getCrudApiPath()?.toString()}/unsubscribe/:id`,
`/${new this.entityType()
.getCrudApiPath()
?.toString()}/unsubscribe/:id`,
async (
req: ExpressRequest,
res: ExpressResponse,
next: NextFunction
) => {
try {
await this.service.updateOneBy({
query: {
_id: req.params['id'] as string,
@@ -37,18 +37,18 @@ export default class StatusPageSubscriberAPI extends BaseAPI<
props: {
isRoot: true,
ignoreHooks: true,
}
},
});
return Response.sendHtmlResponse(req, res, '<html><body><p> You have been unsubscribed.</p><body><html>');
return Response.sendHtmlResponse(
req,
res,
'<html><body><p> You have been unsubscribed.</p><body><html>'
);
} catch (err) {
next(err);
}
}
);
}
}

View File

@@ -147,4 +147,4 @@ export const SubscriptionPlans: Array<SubscriptionPlan> =
SubscriptionPlan.getSubscriptionPlans();
export const AnalyticsKey: string = process.env['ANALYTICS_KEY'] || '';
export const AnalyticsHost: string = process.env['ANALYTICS_HOST'] || '';
export const AnalyticsHost: string = process.env['ANALYTICS_HOST'] || '';

View File

@@ -25,6 +25,7 @@ export default class Database {
username: DatabaseUsername,
password: DatabasePassword,
database: DatabaseName,
migrationsTableName: 'migrations',
entities: Entities,
//logging: 'all',
synchronize:

View File

@@ -20,9 +20,8 @@ export class Service extends DatabaseService<Model> {
protected override async onBeforeCreate(
data: CreateBy<Model>
): Promise<OnCreate<Model>> {
if (!data.data.statusPageId) {
throw new BadDataException("Status Page ID is required.")
throw new BadDataException('Status Page ID is required.');
}
const statuspage = await StatusPageService.findOneById({
@@ -31,33 +30,33 @@ export class Service extends DatabaseService<Model> {
projectId: true,
pageTitle: true,
name: true,
isPublicStatusPage: true
isPublicStatusPage: true,
},
props: {
isRoot: true,
ignoreHooks: true,
}
},
});
if (!statuspage || !statuspage.projectId) {
throw new BadDataException("Status Page not found");
throw new BadDataException('Status Page not found');
}
data.data.projectId = statuspage.projectId;
return { createBy: data, carryForward: statuspage };
}
protected override async onCreateSuccess(
onCreate: OnCreate<Model>,
createdItem: Model
): Promise<Model> {
if (createdItem.statusPageId && createdItem.subscriberEmail && createdItem._id) {
// Call mail service and send an email.
if (
createdItem.statusPageId &&
createdItem.subscriberEmail &&
createdItem._id
) {
// Call mail service and send an email.
// get status page domain for this status page.
// if the domain is not found, use the internal sttaus page preview link.
@@ -65,28 +64,38 @@ export class Service extends DatabaseService<Model> {
const domains = await StatusPageDomainService.findBy({
query: {
statusPageId: createdItem.statusPageId,
isSslProvisioned: true
isSslProvisioned: true,
},
select: {
fullDomain: true
fullDomain: true,
},
skip: 0,
limit: LIMIT_PER_PROJECT,
props: {
isRoot: true,
ignoreHooks: true,
}
},
});
let statusPageURL: string = domains.map((d) => d.fullDomain).join(", ");
let statusPageURL: string = domains
.map((d) => {
return d.fullDomain;
})
.join(', ');
if (domains.length === 0) {
// 'https://local.oneuptime.com/status-page/40092fb5-cc33-4995-b532-b4e49c441c98'
statusPageURL = new URL(HttpProtocol, Domain).addRoute("/status-page/" + createdItem.statusPageId.toString()).toString();
statusPageURL = new URL(HttpProtocol, Domain)
.addRoute(
'/status-page/' + createdItem.statusPageId.toString()
)
.toString();
}
const statusPageName: string = onCreate.carryForward.pageTitle || onCreate.carryForward.name || 'Status Page';
const statusPageName: string =
onCreate.carryForward.pageTitle ||
onCreate.carryForward.name ||
'Status Page';
MailService.sendMail({
toEmail: createdItem.subscriberEmail,
@@ -94,8 +103,14 @@ export class Service extends DatabaseService<Model> {
vars: {
statusPageName: statusPageName,
statusPageUrl: statusPageURL,
isPublicStatusPage: onCreate.carryForward.isPublicStatusPage,
unsubscribeUrl: new URL(HttpProtocol, Domain).addRoute("/api/status-page-subscriber/unsubscribe/" + createdItem._id.toString()).toString()
isPublicStatusPage:
onCreate.carryForward.isPublicStatusPage,
unsubscribeUrl: new URL(HttpProtocol, Domain)
.addRoute(
'/api/status-page-subscriber/unsubscribe/' +
createdItem._id.toString()
)
.toString(),
},
subject: 'You have been subscribed to ' + statusPageName,
}).catch((err: Error) => {

View File

@@ -264,7 +264,6 @@ export default class Response {
this.logResponse(req, res, { text: text as string });
}
public static sendHtmlResponse(
req: ExpressRequest,
res: ExpressResponse,
@@ -281,7 +280,7 @@ export default class Response {
oneUptimeResponse.set('Pod-Id', process.env['POD_NAME']);
oneUptimeResponse.logBody = { html: html as string };
oneUptimeResponse.writeHead(200, { 'Content-Type':'text/html'});
oneUptimeResponse.writeHead(200, { 'Content-Type': 'text/html' });
oneUptimeResponse.end(html);
this.logResponse(req, res, { html: html as string });
}

View File

@@ -66,7 +66,6 @@ const Footer: FunctionComponent<ComponentProps> = (
props.links.filter((link: FooterLink) => {
return !link.showOnRightIfNoCopyright;
}).length > 0 && (
<p>
{props.links &&
props.links
@@ -101,7 +100,6 @@ const Footer: FunctionComponent<ComponentProps> = (
}
)}
</p>
)}
</div>
{props.links &&

View File

@@ -9,7 +9,8 @@ export const env: Function = (key: string): string => {
return process.env[key] || '';
};
export const HTTP_PROTOCOL: Protocol = env('HTTP_PROTOCOL') === "http" ? Protocol.HTTP : Protocol.HTTPS;
export const HTTP_PROTOCOL: Protocol =
env('HTTP_PROTOCOL') === 'http' ? Protocol.HTTP : Protocol.HTTPS;
export const DOMAIN: string = env('DOMAIN') || '';
@@ -41,46 +42,32 @@ export const ACCOUNTS_ROUTE: Route = new Route(env('ACCOUNTS_ROUTE'));
export const HOME_ROUTE: Route = new Route(env('HOME_ROUTE'));
export const DASHBOARD_API_HOSTNAME: Hostname = Hostname.fromString(
env('DOMAIN')
env('DOMAIN')
);
export const IDENTITY_HOSTNAME: Hostname = Hostname.fromString(
env('DOMAIN')
);
export const IDENTITY_HOSTNAME: Hostname = Hostname.fromString(env('DOMAIN'));
export const DASHBOARD_HOSTNAME: Hostname = Hostname.fromString(
env('DOMAIN')
);
export const DASHBOARD_HOSTNAME: Hostname = Hostname.fromString(env('DOMAIN'));
export const INTEGRATION_HOSTNAME: Hostname = Hostname.fromString(
env('DOMAIN')
env('DOMAIN')
);
export const STATUS_PAGE_HOSTNAME: Hostname = Hostname.fromString(
env('DOMAIN')
env('DOMAIN')
);
export const HELM_HOSTNAME: Hostname = Hostname.fromString(
env('DOMAIN')
);
export const HELM_HOSTNAME: Hostname = Hostname.fromString(env('DOMAIN'));
export const API_DOCS_HOSTNAME: Hostname = Hostname.fromString(
env('DOMAIN')
);
export const API_DOCS_HOSTNAME: Hostname = Hostname.fromString(env('DOMAIN'));
export const ADMIN_DASHBOARD_HOSTNAME: Hostname = Hostname.fromString(
env('DOMAIN')
);
export const ACCOUNTS_HOSTNAME: Hostname = Hostname.fromString(
env('DOMAIN')
);
export const HOME_HOSTNAME: Hostname = Hostname.fromString(
env('DOMAIN')
env('DOMAIN')
);
export const ACCOUNTS_HOSTNAME: Hostname = Hostname.fromString(env('DOMAIN'));
export const HOME_HOSTNAME: Hostname = Hostname.fromString(env('DOMAIN'));
export const FILE_HOSTNAME: Hostname = Hostname.fromString(
env('DOMAIN')
);
export const FILE_HOSTNAME: Hostname = Hostname.fromString(env('DOMAIN'));
export const DASHBOARD_API_URL: URL = new URL(
HTTP_PROTOCOL,
@@ -141,4 +128,4 @@ export const StatusPageCNameRecord: string =
env('STATUS_PAGE_CNAME_RECORD') || '';
export const AnalyticsKey: string = env('ANALYTICS_KEY') || '';
export const AnalyticsHost: string = env('ANALYTICS_HOST');
export const AnalyticsHost: string = env('ANALYTICS_HOST');

View File

@@ -32,27 +32,26 @@ const DashboardProjectPicker: FunctionComponent<ComponentProps> = (
);
const getFooter = (): ReactElement => {
if (!BILLING_ENABLED) {
return <></>;
}
return (<div
className="show-as-link"
onClick={() => {
setIsSubscriptionPlanYearly(
!isSubsriptionPlanYearly
);
refreshFields();
}}
>
{isSubsriptionPlanYearly ? (
<span>Switch to monthly pricing?</span>
) : (
<span> Switch to yearly pricing?</span>
)}
</div>);
}
return (
<div
className="show-as-link"
onClick={() => {
setIsSubscriptionPlanYearly(!isSubsriptionPlanYearly);
refreshFields();
}}
>
{isSubsriptionPlanYearly ? (
<span>Switch to monthly pricing?</span>
) : (
<span> Switch to yearly pricing?</span>
)}
</div>
);
};
const [isSubsriptionPlanYearly, setIsSubscriptionPlanYearly] =
useState<boolean>(true);
@@ -238,9 +237,7 @@ const DashboardProjectPicker: FunctionComponent<ComponentProps> = (
fields: [...fields],
formType: FormType.Create,
}}
footer={
getFooter()
}
footer={getFooter()}
/>
) : (
<></>

View File

@@ -131,27 +131,10 @@ const StatusPageDelete: FunctionComponent<PageComponentProps> = (
getElement: (item: JSONObject): ReactElement => {
if (item['isUnsubscribed']) {
return (
<Pill
color={
Red
}
text={
"Unsubscribed"
}
/>
);
} else {
return (
<Pill
color={
Green
}
text={
"Subscribed"
}
/>
<Pill color={Red} text={'Unsubscribed'} />
);
}
return <Pill color={Green} text={'Subscribed'} />;
},
},
{

View File

@@ -30,7 +30,6 @@ import StatusPagePrivateUserService, {
Service as StatusPagePrivateUserServiceType,
} from 'CommonServer/Services/StatusPagePrivateUserService';
import StatusPageFooterLink from 'Model/Models/StatusPageFooterLink';
import StatusPageFooterLinkService, {
Service as StatusPageFooterLinkServiceType,
@@ -287,7 +286,6 @@ app.use(
).getRouter()
);
app.use(
new BaseAPI<StatusPagePrivateUser, StatusPagePrivateUserServiceType>(
StatusPagePrivateUser,

View File

@@ -24,7 +24,11 @@ import CanAccessIfCanReadOn from 'Common/Types/Database/CanAccessIfCanReadOn';
@CanAccessIfCanReadOn('statusPage')
@TenantColumn('projectId')
@TableAccessControl({
create: [Permission.ProjectOwner, Permission.CanCreateStatusPageSubscriber, Permission.Public],
create: [
Permission.ProjectOwner,
Permission.CanCreateStatusPageSubscriber,
Permission.Public,
],
read: [Permission.ProjectOwner, Permission.CanReadStatusPageSubscriber],
delete: [Permission.ProjectOwner, Permission.CanDeleteStatusPageSubscriber],
update: [Permission.ProjectOwner, Permission.CanEditStatusPageSubscriber],
@@ -132,7 +136,7 @@ export default class StatusPageSubscriber extends BaseModel {
create: [
Permission.ProjectOwner,
Permission.CanCreateStatusPageSubscriber,
Permission.Public
Permission.Public,
],
read: [Permission.ProjectOwner, Permission.CanReadStatusPageSubscriber],
update: [
@@ -153,7 +157,7 @@ export default class StatusPageSubscriber extends BaseModel {
create: [
Permission.ProjectOwner,
Permission.CanCreateStatusPageSubscriber,
Permission.Public
Permission.Public,
],
read: [Permission.ProjectOwner, Permission.CanReadStatusPageSubscriber],
update: [
@@ -174,7 +178,7 @@ export default class StatusPageSubscriber extends BaseModel {
create: [
Permission.ProjectOwner,
Permission.CanCreateStatusPageSubscriber,
Permission.Public
Permission.Public,
],
read: [Permission.ProjectOwner, Permission.CanReadStatusPageSubscriber],
update: [
@@ -257,7 +261,6 @@ export default class StatusPageSubscriber extends BaseModel {
@JoinColumn({ name: 'deletedByUserId' })
public deletedByUser?: User = undefined;
@ColumnAccessControl({
create: [],
read: [Permission.CurrentUser],

View File

@@ -14,9 +14,8 @@ export interface ComponentProps {
const StatusPageHeader: FunctionComponent<ComponentProps> = (
props: ComponentProps
): ReactElement => {
if (!props.banner && !props.logo && props.links.length === 0) {
return <></>
return <></>;
}
return (

View File

@@ -49,22 +49,21 @@ const DashboardMasterPage: FunctionComponent<ComponentProps> = (
);
if (id) {
return new ObjectID(id);
} else {
// get status page id by hostname.
const response: HTTPResponse<JSONObject> =
await BaseAPI.post<JSONObject>(
URL.fromString(DASHBOARD_API_URL.toString()).addRoute(
`/status-page/domain`
),
{
domain: Navigation.getHostname().toString()
},
{}
);
}
// get status page id by hostname.
const response: HTTPResponse<JSONObject> =
await BaseAPI.post<JSONObject>(
URL.fromString(DASHBOARD_API_URL.toString()).addRoute(
`/status-page/domain`
),
{
domain: Navigation.getHostname().toString(),
},
{}
);
if (response.data && response.data['statusPageId']) {
return new ObjectID(response.data['statusPageId'] as string);
}
if (response.data && response.data['statusPageId']) {
return new ObjectID(response.data['statusPageId'] as string);
}
throw new BadDataException('Status Page ID not found');

View File

@@ -575,12 +575,12 @@ const Overview: FunctionComponent<PageComponentProps> = (
eventViewRoute={RouteUtil.populateRouteParams(
props.isPreviewPage
? (RouteMap[
PageMap
.PREVIEW_INCIDENT_DETAIL
] as Route)
PageMap
.PREVIEW_INCIDENT_DETAIL
] as Route)
: (RouteMap[
PageMap.INCIDENT_DETAIL
] as Route),
PageMap.INCIDENT_DETAIL
] as Route),
incidentGroup.incident.id!
)}
/>
@@ -621,12 +621,12 @@ const Overview: FunctionComponent<PageComponentProps> = (
eventViewRoute={RouteUtil.populateRouteParams(
props.isPreviewPage
? (RouteMap[
PageMap
.PREVIEW_SCHEDULED_EVENT_DETAIL
] as Route)
PageMap
.PREVIEW_SCHEDULED_EVENT_DETAIL
] as Route)
: (RouteMap[
PageMap.SCHEDULED_EVENT_DETAIL
] as Route),
PageMap.SCHEDULED_EVENT_DETAIL
] as Route),
scheduledEventGroup.scheduledMaintenance
.id!
)}
@@ -638,10 +638,11 @@ const Overview: FunctionComponent<PageComponentProps> = (
<div>
{currentStatus && statusPageResources.length > 0 && (
<Alert
title={`${currentStatus.isOperationalState
title={`${
currentStatus.isOperationalState
? `All`
: 'Some'
} Resources are ${currentStatus.name}`}
} Resources are ${currentStatus.name}`}
color={currentStatus.color}
doNotShowIcon={true}
size={AlertSize.Large}
@@ -649,64 +650,75 @@ const Overview: FunctionComponent<PageComponentProps> = (
)}
</div>
{statusPageResources.length > 0 && <div>
<AccordianGroup>
{statusPageResources.filter(
(resources: StatusPageResource) => {
return !resources.statusPageGroupId;
}
).length > 0 ? (
<Accordian
key={Math.random()}
title={undefined}
isLastElement={resourceGroups.length === 0}
>
{getMonitorOverviewListInGroup(null)}
</Accordian>
) : (
<></>
)}
<div
key={Math.random()}
style={{
padding: '0px',
}}
>
{resourceGroups.length > 0 &&
resourceGroups.map(
(
resourceGroup: StatusPageGroup,
i: number
) => {
return (
<Accordian
key={i}
rightElement={getRightAccordianElement(
resourceGroup
)}
isInitiallyExpanded={
resourceGroup.isExpandedByDefault
}
isLastElement={
resourceGroups.length -
1 ===
i
}
title={resourceGroup.name!}
>
{getMonitorOverviewListInGroup(
resourceGroup
)}
</Accordian>
);
{statusPageResources.length > 0 && (
<div>
<AccordianGroup>
{statusPageResources.filter(
(resources: StatusPageResource) => {
return !resources.statusPageGroupId;
}
).length > 0 ? (
<Accordian
key={Math.random()}
title={undefined}
isLastElement={
resourceGroups.length === 0
}
)}
</div>
</AccordianGroup>
</div>}
{statusPageResources.length === 0 && <p> No resources added to this Status Page, please add some resources from OneUptime dashboard.</p>}
>
{getMonitorOverviewListInGroup(null)}
</Accordian>
) : (
<></>
)}
<div
key={Math.random()}
style={{
padding: '0px',
}}
>
{resourceGroups.length > 0 &&
resourceGroups.map(
(
resourceGroup: StatusPageGroup,
i: number
) => {
return (
<Accordian
key={i}
rightElement={getRightAccordianElement(
resourceGroup
)}
isInitiallyExpanded={
resourceGroup.isExpandedByDefault
}
isLastElement={
resourceGroups.length -
1 ===
i
}
title={
resourceGroup.name!
}
>
{getMonitorOverviewListInGroup(
resourceGroup
)}
</Accordian>
);
}
)}
</div>
</AccordianGroup>
</div>
)}
{statusPageResources.length === 0 && (
<p>
{' '}
No resources added to this Status Page, please add
some resources from OneUptime dashboard.
</p>
)}
</div>
) : (
<></>

View File

@@ -16,10 +16,7 @@ const PageNotFound: FunctionComponent<PageComponentProps> = (
return (
<Page>
<div
className='justify-center'
>
<div className="justify-center">
<div>
<p>Subscribe.</p>
@@ -30,8 +27,6 @@ const PageNotFound: FunctionComponent<PageComponentProps> = (
}}
/> */}
{currentTab === 'Email' ? (
<ModelForm<StatusPageSubscriber>
modelType={StatusPageSubscriber}
@@ -51,7 +46,9 @@ const PageNotFound: FunctionComponent<PageComponentProps> = (
]}
formType={FormType.Create}
submitButtonText={'Subscribe'}
onBeforeCreate={async (item: StatusPageSubscriber) => {
onBeforeCreate={async (
item: StatusPageSubscriber
) => {
const id: ObjectID = LocalStorage.getItem(
'statusPageId'
) as ObjectID;

View File

@@ -365,25 +365,23 @@ RunCron(
const key: string = JSON.parse(cert.blob || '{}').privateKeyPem;
let crt: string = JSON.parse(certBlob.blob || '{}').cert;
// Add chain to crt.
console.log("Lookign for chain");
// Add chain to crt.
console.log('Lookign for chain');
console.log(JSON.parse(certBlob.blob || '{}'));
if (JSON.parse(certBlob.blob || '{}').chain) {
console.log("Chain found");
crt += '\n' +
'\n' +
JSON.parse(certBlob.blob || '{}').chain;
console.log('Chain found');
crt += '\n' + '\n' + JSON.parse(certBlob.blob || '{}').chain;
}
// Write to disk.
fs.writeFileSync(
`/usr/src/Certs/StatusPageCerts/${cert.key}.crt`,
crt,
crt
);
fs.writeFileSync(
`/usr/src/Certs/StatusPageCerts/${cert.key}.key`,
key,
key
);
}
}
@@ -452,7 +450,6 @@ const checkCnameValidation: Function = async (
fulldomain: string,
token: string
): Promise<boolean> => {
try {
const agent: https.Agent = new https.Agent({
rejectUnauthorized: false,
@@ -460,9 +457,9 @@ const checkCnameValidation: Function = async (
const result: AxiosResponse = await axios.get(
'https://' +
fulldomain +
'/status-page-api/cname-verification/' +
token,
fulldomain +
'/status-page-api/cname-verification/' +
token,
{ httpsAgent: agent }
);
@@ -482,9 +479,9 @@ const isSslProvisioned: Function = async (
try {
const result: AxiosResponse = await axios.get(
'https://' +
fulldomain +
'/status-page-api/cname-verification/' +
token
fulldomain +
'/status-page-api/cname-verification/' +
token
);
if (result.status === 200) {