add find by

This commit is contained in:
Simon Larsen
2023-10-02 12:13:37 +01:00
parent 31a41fed60
commit 62db38520f
46 changed files with 359 additions and 57 deletions

View File

@@ -1,9 +1,11 @@
import { ColumnAccessControl } from '../BaseDatabase/AccessControl';
import ColumnBillingAccessControl from '../BaseDatabase/ColumnBillingAccessControl';
import TableColumnType from '../BaseDatabase/TableColumnType';
import { JSONValue } from '../JSON';
export default class AnalyticsTableColumn {
private _key: string = 'id';
public get key(): string {
return this._key;
}
@@ -65,13 +67,21 @@ export default class AnalyticsTableColumn {
this._forceGetDefaultValueOnCreate = v;
}
private _isDefaultValueColumn: boolean = false;
private _defaultValue : JSONValue | undefined;
public get defaultValue() : JSONValue {
return this._defaultValue;
}
public set defaultValue(v : JSONValue) {
this._defaultValue = v;
}
public get isDefaultValueColumn(): boolean {
return this._isDefaultValueColumn;
}
public set isDefaultValueColumn(v: boolean) {
this._isDefaultValueColumn = v;
return Boolean(this.defaultValue !== undefined);
}
private _billingAccessControl?: ColumnBillingAccessControl | undefined;
public get billingAccessControl(): ColumnBillingAccessControl | undefined {
@@ -102,9 +112,9 @@ export default class AnalyticsTableColumn {
title: string;
description: string;
required: boolean;
defaultValue?: JSONValue | undefined;
type: TableColumnType;
billingAccessControl?: ColumnBillingAccessControl | undefined;
isDefaultValueColumn?: boolean | undefined;
isTenantId?: boolean | undefined;
accessControl?: ColumnAccessControl | undefined;
allowAccessIfSubscriptionIsUnpaid?: boolean | undefined;
@@ -120,7 +130,7 @@ export default class AnalyticsTableColumn {
this.type = data.type;
this.isTenantId = data.isTenantId || false;
this.forceGetDefaultValueOnCreate = data.forceGetDefaultValueOnCreate;
this.isDefaultValueColumn = data.isDefaultValueColumn || false;
this.defaultValue = data.defaultValue;
this.billingAccessControl = data.billingAccessControl;
this.allowAccessIfSubscriptionIsUnpaid =
data.allowAccessIfSubscriptionIsUnpaid || false;

View File

@@ -30,7 +30,7 @@ import MonitorStatusService from '../Services/MonitorStatusService';
import OneUptimeDate from 'Common/Types/Date';
import MonitorStatusTimelineService from '../Services/MonitorStatusTimelineService';
import QueryHelper from '../Types/Database/QueryHelper';
import SortOrder from 'Common/Types/Database/SortOrder';
import SortOrder from 'Common/Types/BaseDatabase/SortOrder';
import IncidentService from '../Services/IncidentService';
import IncidentPublicNote from 'Model/Models/IncidentPublicNote';
import IncidentPublicNoteService from '../Services/IncidentPublicNoteService';

View File

@@ -12,6 +12,9 @@ import CreateBy from '../Types/AnalyticsDatabase/CreateBy';
import {
DatabaseTriggerType,
OnCreate,
OnDelete,
OnFind,
OnUpdate,
} from '../Types/AnalyticsDatabase/Hooks';
import Typeof from 'Common/Types/Typeof';
import ModelPermission from '../Types/AnalyticsDatabase/ModelPermission';
@@ -25,6 +28,10 @@ import Route from 'Common/Types/API/Route';
import { WorkflowRoute } from 'Common/ServiceRoute';
import Text from 'Common/Types/Text';
import ClusterKeyAuthorization from '../Middleware/ClusterKeyAuthorization';
import DeleteBy from '../Types/AnalyticsDatabase/DeleteBy';
import UpdateBy from '../Types/AnalyticsDatabase/UpdateBy';
import FindBy from '../Types/AnalyticsDatabase/FindBy';
import PositiveNumber from 'Common/Types/PositiveNumber';
export default class AnalyticsDatabaseService<
TBaseModel extends AnalyticsBaseModel
@@ -48,6 +55,118 @@ export default class AnalyticsDatabaseService<
}
}
public async findBy(
findBy: FindBy<TBaseModel>
): Promise<Array<TBaseModel>> {
return await this._findBy(findBy);
}
private async _findBy(
findBy: FindBy<TBaseModel>,
withDeleted?: boolean | undefined
): Promise<Array<TBaseModel>> {
try {
let automaticallyAddedCreatedAtInSelect: boolean = false;
if (!findBy.sort || Object.keys(findBy.sort).length === 0) {
findBy.sort = {
createdAt: SortOrder.Descending,
};
if (!findBy.select) {
findBy.select = {} as any;
}
if (!(findBy.select as any)['createdAt']) {
(findBy.select as any)['createdAt'] = true;
automaticallyAddedCreatedAtInSelect = true;
}
}
const onFind: OnFind<TBaseModel> = findBy.props.ignoreHooks
? { findBy, carryForward: [] }
: await this.onBeforeFind(findBy);
const onBeforeFind: FindBy<TBaseModel> = { ...onFind.findBy };
const carryForward: any = onFind.carryForward;
if (
!onBeforeFind.select ||
Object.keys(onBeforeFind.select).length === 0
) {
onBeforeFind.select = {} as any;
}
if (!(onBeforeFind.select as any)['_id']) {
(onBeforeFind.select as any)['_id'] = true;
}
const result: {
query: Query<TBaseModel>;
select: Select<TBaseModel> | null;
relationSelect: RelationSelect<TBaseModel> | null;
} = await ModelPermission.checkReadPermission(
this.modelType,
onBeforeFind.query,
onBeforeFind.select || null,
onBeforeFind.props
);
onBeforeFind.query = result.query;
onBeforeFind.select = result.select || undefined;
if (!(onBeforeFind.skip instanceof PositiveNumber)) {
onBeforeFind.skip = new PositiveNumber(onBeforeFind.skip);
}
if (!(onBeforeFind.limit instanceof PositiveNumber)) {
onBeforeFind.limit = new PositiveNumber(onBeforeFind.limit);
}
const items: Array<TBaseModel> = await this.getRepository().find({
skip: onBeforeFind.skip.toNumber(),
take: onBeforeFind.limit.toNumber(),
where: onBeforeFind.query as any,
order: onBeforeFind.sort as any,
relations: result.relationSelect as any,
select: onBeforeFind.select as any,
withDeleted: withDeleted || false,
});
let decryptedItems: Array<TBaseModel> = [];
for (const item of items) {
decryptedItems.push(this.decrypt(item));
}
decryptedItems = this.sanitizeFindByItems(
decryptedItems,
onBeforeFind
);
for (const item of decryptedItems) {
if (automaticallyAddedCreatedAtInSelect) {
delete (item as any).createdAt;
}
}
if (!findBy.props.ignoreHooks) {
decryptedItems = await (
await this.onFindSuccess(
{ findBy, carryForward },
decryptedItems
)
).carryForward;
}
return decryptedItems;
} catch (error) {
await this.onFindError(error as Exception);
throw this.getException(error as Exception);
}
}
public toTableCreateStatement(): string {
if (!this.database) {
this.useDefaultDatabase();
@@ -75,6 +194,28 @@ export default class AnalyticsDatabaseService<
return statement;
}
protected async onBeforeDelete(
deleteBy: DeleteBy<TBaseModel>
): Promise<OnDelete<TBaseModel>> {
// A place holder method used for overriding.
return Promise.resolve({ deleteBy, carryForward: null });
}
protected async onBeforeUpdate(
updateBy: UpdateBy<TBaseModel>
): Promise<OnUpdate<TBaseModel>> {
// A place holder method used for overriding.
return Promise.resolve({ updateBy, carryForward: null });
}
protected async onBeforeFind(
findBy: FindBy<TBaseModel>
): Promise<OnFind<TBaseModel>> {
// A place holder method used for overriding.
return Promise.resolve({ findBy, carryForward: null });
}
public toCreateStatement(data: { item: TBaseModel }): string {
if (!data.item) {
throw new BadDataException('Item cannot be null');
@@ -137,6 +278,57 @@ export default class AnalyticsDatabaseService<
});
}
protected async onUpdateSuccess(
onUpdate: OnUpdate<TBaseModel>,
_updatedItemIds: Array<ObjectID>
): Promise<OnUpdate<TBaseModel>> {
// A place holder method used for overriding.
return Promise.resolve(onUpdate);
}
protected async onUpdateError(error: Exception): Promise<Exception> {
// A place holder method used for overriding.
return Promise.resolve(error);
}
protected async onDeleteSuccess(
onDelete: OnDelete<TBaseModel>,
_itemIdsBeforeDelete: Array<ObjectID>
): Promise<OnDelete<TBaseModel>> {
// A place holder method used for overriding.
return Promise.resolve(onDelete);
}
protected async onDeleteError(error: Exception): Promise<Exception> {
// A place holder method used for overriding.
return Promise.resolve(error);
}
protected async onFindSuccess(
onFind: OnFind<TBaseModel>,
items: Array<TBaseModel>
): Promise<OnFind<TBaseModel>> {
// A place holder method used for overriding.
return Promise.resolve({ ...onFind, carryForward: items });
}
protected async onFindError(error: Exception): Promise<Exception> {
// A place holder method used for overriding.
return Promise.resolve(error);
}
protected async onCountSuccess(
count: PositiveNumber
): Promise<PositiveNumber> {
// A place holder method used for overriding.
return Promise.resolve(count);
}
protected async onCountError(error: Exception): Promise<Exception> {
// A place holder method used for overriding.
return Promise.resolve(error);
}
protected async onCreateSuccess(
_onCreate: OnCreate<TBaseModel>,
createdItem: TBaseModel

View File

@@ -22,7 +22,7 @@ import PostgresDatabase, {
} from '../Infrastructure/PostgresDatabase';
import { DataSource, Repository, SelectQueryBuilder } from 'typeorm';
import ObjectID from 'Common/Types/ObjectID';
import SortOrder from 'Common/Types/Database/SortOrder';
import SortOrder from 'Common/Types/BaseDatabase/SortOrder';
import { EncryptionSecret, WorkflowHostname } from '../EnvironmentConfig';
import { WorkflowRoute } from 'Common/ServiceRoute';
import HashedString from 'Common/Types/HashedString';

View File

@@ -25,7 +25,7 @@ import UserService from './UserService';
import { JSONObject } from 'Common/Types/JSON';
import OnCallDutyPolicyService from './OnCallDutyPolicyService';
import UserNotificationEventType from 'Common/Types/UserNotification/UserNotificationEventType';
import SortOrder from 'Common/Types/Database/SortOrder';
import SortOrder from 'Common/Types/BaseDatabase/SortOrder';
import DatabaseConfig from '../DatabaseConfig';
import MonitorStatus from 'Model/Models/MonitorStatus';
import MonitorStatusService from './MonitorStatusService';

View File

@@ -7,7 +7,7 @@ import LIMIT_MAX from 'Common/Types/Database/LimitMax';
import ObjectID from 'Common/Types/ObjectID';
import BadDataException from 'Common/Types/Exception/BadDataException';
import QueryHelper from '../Types/Database/QueryHelper';
import SortOrder from 'Common/Types/Database/SortOrder';
import SortOrder from 'Common/Types/BaseDatabase/SortOrder';
import UpdateBy from '../Types/Database/UpdateBy';
import DeleteBy from '../Types/Database/DeleteBy';

View File

@@ -7,7 +7,7 @@ import LIMIT_MAX from 'Common/Types/Database/LimitMax';
import ObjectID from 'Common/Types/ObjectID';
import BadDataException from 'Common/Types/Exception/BadDataException';
import QueryHelper from '../Types/Database/QueryHelper';
import SortOrder from 'Common/Types/Database/SortOrder';
import SortOrder from 'Common/Types/BaseDatabase/SortOrder';
import UpdateBy from '../Types/Database/UpdateBy';
import DeleteBy from '../Types/Database/DeleteBy';

View File

@@ -8,7 +8,7 @@ import IncidentService from './IncidentService';
import DeleteBy from '../Types/Database/DeleteBy';
import ObjectID from 'Common/Types/ObjectID';
import PositiveNumber from 'Common/Types/PositiveNumber';
import SortOrder from 'Common/Types/Database/SortOrder';
import SortOrder from 'Common/Types/BaseDatabase/SortOrder';
import IncidentState from 'Model/Models/IncidentState';
import IncidentStateService from './IncidentStateService';
import MonitorStatusTimeline from 'Model/Models/MonitorStatusTimeline';

View File

@@ -2,9 +2,9 @@ import Log from 'Model/AnalyticsModels/Log';
import AnalyticsDatabaseService from './AnalyticsDatabaseService';
import ClickhouseDatabase from '../Infrastructure/ClickhouseDatabase';
export class Service extends AnalyticsDatabaseService<Log> {
export class LogService extends AnalyticsDatabaseService<Log> {
public constructor(clickhouseDatabase?: ClickhouseDatabase | undefined) {
super({ modelType: Log, database: clickhouseDatabase });
}
}
export default new Service();
export default new LogService();

View File

@@ -27,7 +27,7 @@ import TeamMemberService from './TeamMemberService';
import User from 'Model/Models/User';
import URL from 'Common/Types/API/URL';
import { JSONObject } from 'Common/Types/JSON';
import SortOrder from 'Common/Types/Database/SortOrder';
import SortOrder from 'Common/Types/BaseDatabase/SortOrder';
import DatabaseConfig from '../DatabaseConfig';
export class Service extends DatabaseService<Model> {

View File

@@ -9,7 +9,7 @@ import ObjectID from 'Common/Types/ObjectID';
import UpdateBy from '../Types/Database/UpdateBy';
import QueryHelper from '../Types/Database/QueryHelper';
import LIMIT_MAX from 'Common/Types/Database/LimitMax';
import SortOrder from 'Common/Types/Database/SortOrder';
import SortOrder from 'Common/Types/BaseDatabase/SortOrder';
export class Service extends DatabaseService<Model> {
public constructor(postgresDatabase?: PostgresDatabase) {

View File

@@ -7,7 +7,7 @@ import BadDataException from 'Common/Types/Exception/BadDataException';
import DeleteBy from '../Types/Database/DeleteBy';
import MonitorStatusTimeline from 'Model/Models/MonitorStatusTimeline';
import ObjectID from 'Common/Types/ObjectID';
import SortOrder from 'Common/Types/Database/SortOrder';
import SortOrder from 'Common/Types/BaseDatabase/SortOrder';
import PositiveNumber from 'Common/Types/PositiveNumber';
import CreateBy from '../Types/Database/CreateBy';
import UserService from './UserService';

View File

@@ -8,7 +8,7 @@ import QueryHelper from '../Types/Database/QueryHelper';
import DeleteBy from '../Types/Database/DeleteBy';
import ObjectID from 'Common/Types/ObjectID';
import LIMIT_MAX, { LIMIT_PER_PROJECT } from 'Common/Types/Database/LimitMax';
import SortOrder from 'Common/Types/Database/SortOrder';
import SortOrder from 'Common/Types/BaseDatabase/SortOrder';
import UpdateBy from '../Types/Database/UpdateBy';
import Query from '../Types/Database/Query';
import PositiveNumber from 'Common/Types/PositiveNumber';

View File

@@ -21,7 +21,7 @@ import ScheduledMaintenanceOwnerTeam from 'Model/Models/ScheduledMaintenanceOwne
import TeamMemberService from './TeamMemberService';
import User from 'Model/Models/User';
import URL from 'Common/Types/API/URL';
import SortOrder from 'Common/Types/Database/SortOrder';
import SortOrder from 'Common/Types/BaseDatabase/SortOrder';
import DatabaseConfig from '../DatabaseConfig';
export class Service extends DatabaseService<Model> {

View File

@@ -7,7 +7,7 @@ import LIMIT_MAX from 'Common/Types/Database/LimitMax';
import ObjectID from 'Common/Types/ObjectID';
import BadDataException from 'Common/Types/Exception/BadDataException';
import QueryHelper from '../Types/Database/QueryHelper';
import SortOrder from 'Common/Types/Database/SortOrder';
import SortOrder from 'Common/Types/BaseDatabase/SortOrder';
import UpdateBy from '../Types/Database/UpdateBy';
import DeleteBy from '../Types/Database/DeleteBy';

View File

@@ -8,7 +8,7 @@ import ScheduledMaintenanceService from './ScheduledMaintenanceService';
import DeleteBy from '../Types/Database/DeleteBy';
import ObjectID from 'Common/Types/ObjectID';
import PositiveNumber from 'Common/Types/PositiveNumber';
import SortOrder from 'Common/Types/Database/SortOrder';
import SortOrder from 'Common/Types/BaseDatabase/SortOrder';
import ScheduledMaintenanceState from 'Model/Models/ScheduledMaintenanceState';
import ScheduledMaintenanceStateService from './ScheduledMaintenanceStateService';
import ScheduledMaintenance from 'Model/Models/ScheduledMaintenance';

View File

@@ -11,7 +11,7 @@ import DeleteBy from '../Types/Database/DeleteBy';
import ObjectID from 'Common/Types/ObjectID';
import UpdateBy from '../Types/Database/UpdateBy';
import LIMIT_MAX from 'Common/Types/Database/LimitMax';
import SortOrder from 'Common/Types/Database/SortOrder';
import SortOrder from 'Common/Types/BaseDatabase/SortOrder';
export class Service extends DatabaseService<Model> {
public constructor(postgresDatabase?: PostgresDatabase) {

View File

@@ -9,7 +9,7 @@ import ObjectID from 'Common/Types/ObjectID';
import UpdateBy from '../Types/Database/UpdateBy';
import QueryHelper from '../Types/Database/QueryHelper';
import LIMIT_MAX from 'Common/Types/Database/LimitMax';
import SortOrder from 'Common/Types/Database/SortOrder';
import SortOrder from 'Common/Types/BaseDatabase/SortOrder';
import PositiveNumber from 'Common/Types/PositiveNumber';
export class Service extends DatabaseService<Model> {

View File

@@ -11,7 +11,7 @@ import DeleteBy from '../Types/Database/DeleteBy';
import ObjectID from 'Common/Types/ObjectID';
import UpdateBy from '../Types/Database/UpdateBy';
import LIMIT_MAX from 'Common/Types/Database/LimitMax';
import SortOrder from 'Common/Types/Database/SortOrder';
import SortOrder from 'Common/Types/BaseDatabase/SortOrder';
export class Service extends DatabaseService<Model> {
public constructor(postgresDatabase?: PostgresDatabase) {

View File

@@ -8,7 +8,7 @@ import QueryHelper from '../Types/Database/QueryHelper';
import DeleteBy from '../Types/Database/DeleteBy';
import ObjectID from 'Common/Types/ObjectID';
import LIMIT_MAX from 'Common/Types/Database/LimitMax';
import SortOrder from 'Common/Types/Database/SortOrder';
import SortOrder from 'Common/Types/BaseDatabase/SortOrder';
import UpdateBy from '../Types/Database/UpdateBy';
import Query from '../Types/Database/Query';
import PositiveNumber from 'Common/Types/PositiveNumber';

View File

@@ -0,0 +1,12 @@
import Query from './Query';
import Select from './Select';
import Sort from './Sort';
import BaseModel from 'Common/AnalyticsModels/BaseModel';
import DatabaseCommonInteractionProps from 'Common/Types/BaseDatabase/DatabaseCommonInteractionProps';
export default interface FindOneBy<TBaseModel extends BaseModel> {
query: Query<TBaseModel>;
select?: Select<TBaseModel> | undefined;
sort?: Sort<TBaseModel> | undefined;
props: DatabaseCommonInteractionProps;
}

View File

@@ -3,10 +3,6 @@ import { JSONObject, JSONValue } from 'Common/Types/JSON';
export type QueryPropertyOptions = JSONValue | JSONObject;
/**
* Select find options.
*/
export declare type QueryOptions<Entity> = {
[P in keyof Entity]?: QueryPropertyOptions;
};

View File

@@ -0,0 +1,12 @@
import BaseModel from 'Common/AnalyticsModels/BaseModel';
import SortOrder from 'Common/Types/BaseDatabase/SortOrder';
/**
* Order by find options.
*/
export declare type FindOrder<Entity> = {
[P in keyof Entity]?: SortOrder;
};
type Sort<TBaseModel extends BaseModel> = FindOrder<TBaseModel>;
export default Sort;

View File

@@ -1,7 +1,7 @@
import BaseModel from 'Common/Models/BaseModel';
import DatabaseProperty from 'Common/Types/Database/DatabaseProperty';
import { FindOptionsOrderProperty, FindOptionsOrderValue } from 'typeorm';
import SortOrder from 'Common/Types/Database/SortOrder';
import SortOrder from 'Common/Types/BaseDatabase/SortOrder';
export declare type FindOrderProperty<Property> =
Property extends DatabaseProperty

View File

@@ -30,7 +30,7 @@ import { LIMIT_PER_PROJECT } from 'Common/Types/Database/LimitMax';
import Dictionary from 'Common/Types/Dictionary';
import IncidentSeverity from 'Model/Models/IncidentSeverity';
import IncidentSeverityService from '../../Services/IncidentSeverityService';
import SortOrder from 'Common/Types/Database/SortOrder';
import SortOrder from 'Common/Types/BaseDatabase/SortOrder';
import OnCallDutyPolicy from 'Model/Models/OnCallDutyPolicy';
import IncomingMonitorRequest from 'Common/Types/Monitor/IncomingMonitor/IncomingMonitorRequest';
import MonitorType from 'Common/Types/Monitor/MonitorType';

View File

@@ -19,7 +19,7 @@ import ModelFormModal from '../ModelFormModal/ModelFormModal';
import IconProp from 'Common/Types/Icon/IconProp';
import { FormType, ModelField } from '../Forms/ModelForm';
import SortOrder from 'Common/Types/Database/SortOrder';
import SortOrder from 'Common/Types/BaseDatabase/SortOrder';
import FieldType from '../Types/FieldType';
import Dictionary from 'Common/Types/Dictionary';
import ActionButtonSchema from '../ActionButton/ActionButtonSchema';

View File

@@ -4,7 +4,7 @@ import TableBody from './TableBody';
import TableHeader from './TableHeader';
import Columns from './Types/Columns';
import Pagination from '../Pagination/Pagination';
import SortOrder from 'Common/Types/Database/SortOrder';
import SortOrder from 'Common/Types/BaseDatabase/SortOrder';
import ActionButtonSchema from '../ActionButton/ActionButtonSchema';
import ErrorMessage from '../ErrorMessage/ErrorMessage';
import ComponentLoader from '../ComponentLoader/ComponentLoader';

View File

@@ -3,7 +3,7 @@ import Column from './Types/Column';
import Columns from './Types/Columns';
import Icon, { ThickProp } from '../Icon/Icon';
import IconProp from 'Common/Types/Icon/IconProp';
import SortOrder from 'Common/Types/Database/SortOrder';
import SortOrder from 'Common/Types/BaseDatabase/SortOrder';
import FieldType from '../Types/FieldType';
export interface ComponentProps {

View File

@@ -1,5 +1,5 @@
import BaseModel from 'Common/Models/BaseModel';
import SortOrder from 'Common/Types/Database/SortOrder';
import SortOrder from 'Common/Types/BaseDatabase/SortOrder';
import { JSONObject } from 'Common/Types/JSON';
type Sort<TBaseModel extends BaseModel | JSONObject> = {

View File

@@ -17,7 +17,7 @@ import IncidentSeverity from 'Model/Models/IncidentSeverity';
import HorizontalRule from 'CommonUI/src/Components/HorizontalRule/HorizontalRule';
import FieldLabelElement from 'CommonUI/src/Components/Forms/Fields/FieldLabel';
import ObjectID from 'Common/Types/ObjectID';
import SortOrder from 'Common/Types/Database/SortOrder';
import SortOrder from 'Common/Types/BaseDatabase/SortOrder';
import OnCallDutyPolicy from 'Model/Models/OnCallDutyPolicy';
import useAsyncEffect from 'use-async-effect';

View File

@@ -23,7 +23,7 @@ import OneUptimeDate from 'Common/Types/Date';
import useAsyncEffect from 'use-async-effect';
import InBetween from 'Common/Types/Database/InBetween';
import { LIMIT_PER_PROJECT } from 'Common/Types/Database/LimitMax';
import SortOrder from 'Common/Types/Database/SortOrder';
import SortOrder from 'Common/Types/BaseDatabase/SortOrder';
import ModelAPI, { ListResult } from 'CommonUI/src/Utils/ModelAPI/ModelAPI';
import MonitorStatusTimeline from 'Model/Models/MonitorStatusTimeline';
import JSONFunctions from 'Common/Types/JSONFunctions';

View File

@@ -19,7 +19,7 @@ import FieldType from 'CommonUI/src/Components/Types/FieldType';
import Team from 'Model/Models/Team';
import ProjectUser from '../../../Utils/ProjectUser';
import CardModelDetail from 'CommonUI/src/Components/ModelDetail/CardModelDetail';
import SortOrder from 'Common/Types/Database/SortOrder';
import SortOrder from 'Common/Types/BaseDatabase/SortOrder';
import { JSONObject } from 'Common/Types/JSON';
import TeamView from '../../../Components/OnCallPolicy/EscalationRule/TeamView';
import UserView from '../../../Components/OnCallPolicy/EscalationRule/UserView';

View File

@@ -14,7 +14,7 @@ import FieldType from 'CommonUI/src/Components/Types/FieldType';
import { JSONObject } from 'Common/Types/JSON';
import Pill from 'CommonUI/src/Components/Pill/Pill';
import Color from 'Common/Types/Color';
import SortOrder from 'Common/Types/Database/SortOrder';
import SortOrder from 'Common/Types/BaseDatabase/SortOrder';
import Navigation from 'CommonUI/src/Utils/Navigation';
const IncidentSeverityPage: FunctionComponent<PageComponentProps> = (
_props: PageComponentProps

View File

@@ -14,7 +14,7 @@ import FieldType from 'CommonUI/src/Components/Types/FieldType';
import { JSONObject } from 'Common/Types/JSON';
import Pill from 'CommonUI/src/Components/Pill/Pill';
import Color from 'Common/Types/Color';
import SortOrder from 'Common/Types/Database/SortOrder';
import SortOrder from 'Common/Types/BaseDatabase/SortOrder';
import BadDataException from 'Common/Types/Exception/BadDataException';
import Navigation from 'CommonUI/src/Utils/Navigation';
const IncidentsPage: FunctionComponent<PageComponentProps> = (

View File

@@ -15,7 +15,7 @@ import { JSONObject } from 'Common/Types/JSON';
import StatusBubble from 'CommonUI/src/Components/StatusBubble/StatusBubble';
import Color from 'Common/Types/Color';
import BadDataException from 'Common/Types/Exception/BadDataException';
import SortOrder from 'Common/Types/Database/SortOrder';
import SortOrder from 'Common/Types/BaseDatabase/SortOrder';
import DashboardNavigation from '../../Utils/Navigation';
import Navigation from 'CommonUI/src/Utils/Navigation';
import ObjectID from 'Common/Types/ObjectID';

View File

@@ -14,7 +14,7 @@ import FieldType from 'CommonUI/src/Components/Types/FieldType';
import { JSONObject } from 'Common/Types/JSON';
import Pill from 'CommonUI/src/Components/Pill/Pill';
import Color from 'Common/Types/Color';
import SortOrder from 'Common/Types/Database/SortOrder';
import SortOrder from 'Common/Types/BaseDatabase/SortOrder';
import BadDataException from 'Common/Types/Exception/BadDataException';
import Navigation from 'CommonUI/src/Utils/Navigation';
const ScheduledMaintenancesPage: FunctionComponent<PageComponentProps> = (

View File

@@ -13,7 +13,7 @@ import FormFieldSchemaType from 'CommonUI/src/Components/Forms/Types/FormFieldSc
import FieldType from 'CommonUI/src/Components/Types/FieldType';
import ModelTable from 'CommonUI/src/Components/ModelTable/ModelTable';
import StatusPageFooterLink from 'Model/Models/StatusPageFooterLink';
import SortOrder from 'Common/Types/Database/SortOrder';
import SortOrder from 'Common/Types/BaseDatabase/SortOrder';
import BadDataException from 'Common/Types/Exception/BadDataException';
import Navigation from 'CommonUI/src/Utils/Navigation';

View File

@@ -12,7 +12,7 @@ import ModelTable from 'CommonUI/src/Components/ModelTable/ModelTable';
import BadDataException from 'Common/Types/Exception/BadDataException';
import FormFieldSchemaType from 'CommonUI/src/Components/Forms/Types/FormFieldSchemaType';
import FieldType from 'CommonUI/src/Components/Types/FieldType';
import SortOrder from 'Common/Types/Database/SortOrder';
import SortOrder from 'Common/Types/BaseDatabase/SortOrder';
import Navigation from 'CommonUI/src/Utils/Navigation';
import StatusPage from 'Model/Models/StatusPage';

View File

@@ -13,7 +13,7 @@ import FormFieldSchemaType from 'CommonUI/src/Components/Forms/Types/FormFieldSc
import FieldType from 'CommonUI/src/Components/Types/FieldType';
import ModelTable from 'CommonUI/src/Components/ModelTable/ModelTable';
import StatusPageHeaderLink from 'Model/Models/StatusPageHeaderLink';
import SortOrder from 'Common/Types/Database/SortOrder';
import SortOrder from 'Common/Types/BaseDatabase/SortOrder';
import BadDataException from 'Common/Types/Exception/BadDataException';
import Navigation from 'CommonUI/src/Utils/Navigation';

View File

@@ -16,7 +16,7 @@ import StatusPageResource from 'Model/Models/StatusPageResource';
import FieldType from 'CommonUI/src/Components/Types/FieldType';
import FormFieldSchemaType from 'CommonUI/src/Components/Forms/Types/FormFieldSchemaType';
import ModelTable from 'CommonUI/src/Components/ModelTable/ModelTable';
import SortOrder from 'Common/Types/Database/SortOrder';
import SortOrder from 'Common/Types/BaseDatabase/SortOrder';
import BadDataException from 'Common/Types/Exception/BadDataException';
import Monitor from 'Model/Models/Monitor';
import { JSONObject } from 'Common/Types/JSON';

View File

@@ -30,7 +30,7 @@ import NotifyAfterDropdownOptions from '../../Components/NotificationRule/Notify
import FieldType from 'CommonUI/src/Components/Types/FieldType';
import { JSONObject } from 'Common/Types/JSON';
import NotificationRuleType from 'Common/Types/NotificationRule/NotificationRuleType';
import SortOrder from 'Common/Types/Database/SortOrder';
import SortOrder from 'Common/Types/BaseDatabase/SortOrder';
import NotificationMethodView from '../../Components/NotificationMethods/NotificationMethod';
const Settings: FunctionComponent<PageComponentProps> = (

View File

@@ -379,6 +379,9 @@ import UserNotificationSettingService, {
Service as UserNotificationSettingServiceType,
} from 'CommonServer/Services/UserNotificationSettingService';
import Log from 'Model/AnalyticsModels/Log';
import LogService from 'CommonServer/Services/LogService';
const app: ExpressApplication = Express.getExpressApp();
const APP_NAME: string = 'api';
@@ -1016,6 +1019,18 @@ const init: () => Promise<void> = async (): Promise<void> => {
await ClickhouseAppInstance.connect(
ClickhouseAppInstance.getDatasourceOptions()
);
// add a log statement
const log: Log = new Log();
log.severity = 'info';
log.message = 'App Initialized';
log.timestamp = new Date();
LogService.create({
data: log,
props: {
isRoot: true
}
});
} catch (err) {
logger.error('App Init Failed:');
logger.error(err);

View File

@@ -11,6 +11,7 @@ export default class Log extends AnalyticsBaseModel {
singularName: 'Log',
pluralName: 'Logs',
tableColumns: [
new AnalyticsTableColumn({
key: 'projectId',
title: 'Project ID',
@@ -18,22 +19,86 @@ export default class Log extends AnalyticsBaseModel {
required: true,
type: TableColumnType.ObjectID,
}),
new AnalyticsTableColumn({
key: 'logContainerId',
title: 'Log Container ID',
description: 'ID of the log container',
key: 'sourceId',
title: 'Source ID',
description: 'ID of the Log Source',
required: true,
type: TableColumnType.ObjectID,
}),
new AnalyticsTableColumn({
key: 'logData',
title: 'Log Data',
description: 'Data of the log container',
key: 'message',
title: 'Log Message',
description: 'Log message',
required: true,
type: TableColumnType.VeryLongText,
}),
new AnalyticsTableColumn({
key: 'timestamp',
title: 'Timestamp',
description: 'When was the log created?',
required: true,
type: TableColumnType.Date,
}),
new AnalyticsTableColumn({
key: 'severity',
title: 'Severity',
description: 'Log Severity',
required: true,
type: TableColumnType.ShortText,
}),
],
primaryKeys: ['projectId', 'logContainerId', 'createdAt'],
primaryKeys: ['projectId', 'sourceId', 'timestamp'],
});
}
public get severity() : string | undefined {
return this.getColumnValue('severity') as string | undefined;
}
public set severity(v : string | undefined) {
this.setColumnValue('severity', v);
}
public get timestamp() : Date | undefined {
return this.getColumnValue('timestamp') as Date | undefined;
}
public set timestamp(v : Date | undefined) {
this.setColumnValue('timestamp', v);
}
public get log() : string | undefined {
return this.getColumnValue('log') as string | undefined;
}
public set log(v : string | undefined) {
this.setColumnValue('log', v);
}
public get sourceId() : string | undefined {
return this.getColumnValue('sourceId') as string | undefined;
}
public set sourceId(v : string | undefined) {
this.setColumnValue('sourceId', v);
}
public get projectId() : string | undefined {
return this.getColumnValue('projectId') as string | undefined;
}
public set projectId(v : string | undefined) {
this.setColumnValue('projectId', v);
}
public get message() : string | undefined {
return this.getColumnValue('message') as string | undefined;
}
public set message(v : string | undefined) {
this.setColumnValue('message', v);
}
}

View File

@@ -21,7 +21,7 @@ import SubscriptionStatus from 'Common/Types/Billing/SubscriptionStatus';
import ObjectID from 'Common/Types/ObjectID';
import ClusterKeyAuthorization from 'CommonServer/Middleware/ClusterKeyAuthorization';
import LIMIT_MAX from 'Common/Types/Database/LimitMax';
import SortOrder from 'Common/Types/Database/SortOrder';
import SortOrder from 'Common/Types/BaseDatabase/SortOrder';
import Query from 'CommonServer/Types/Database/Query';
import JSONFunctions from 'Common/Types/JSONFunctions';
import logger from 'CommonServer/Utils/Logger';

View File

@@ -50,7 +50,7 @@
"save-logs": "export $(grep -v '^#' config.env | xargs) && docker compose logs --tail=100000 $npm_config_services > logs.txt",
"logs": "export $(grep -v '^#' config.env | xargs) && docker compose logs --tail=100 -f $npm_config_services",
"write-logs": "export $(grep -v '^#' config.env | xargs) && docker compose logs -f $npm_config_services > logs.txt",
"build": "docker compose build -f docker-compose.dev.yml $npm_config_services",
"build": "export $(grep -v '^#' config.env | xargs) && docker compose -f docker-compose.dev.yml build $npm_config_services",
"force-build": "export $(grep -v '^#' config.env | xargs) && npm run prerun && docker compose -f docker-compose.dev.yml build --no-cache $npm_config_services",
"force-build-dev": "npm run config-to-dev && npm run force-build",
"kill": "npm run stop",