mirror of
https://github.com/OneUptime/oneuptime.git
synced 2026-04-06 00:32:12 +02:00
fix phone number
This commit is contained in:
@@ -20,24 +20,21 @@ export default class AnalyticsDataModel {
|
||||
this._tableName = v;
|
||||
}
|
||||
|
||||
|
||||
private _tableEngine : AnalyticsTableEngine = AnalyticsTableEngine.MergeTree;
|
||||
public get tableEngine() : AnalyticsTableEngine {
|
||||
private _tableEngine: AnalyticsTableEngine = AnalyticsTableEngine.MergeTree;
|
||||
public get tableEngine(): AnalyticsTableEngine {
|
||||
return this._tableEngine;
|
||||
}
|
||||
public set tableEngine(v : AnalyticsTableEngine) {
|
||||
public set tableEngine(v: AnalyticsTableEngine) {
|
||||
this._tableEngine = v;
|
||||
}
|
||||
|
||||
|
||||
private _primaryKeys : Array<string> = [];
|
||||
public get primaryKeys() : Array<string> {
|
||||
private _primaryKeys: Array<string> = [];
|
||||
public get primaryKeys(): Array<string> {
|
||||
return this._primaryKeys;
|
||||
}
|
||||
public set primaryKeys(v : Array<string>) {
|
||||
public set primaryKeys(v: Array<string>) {
|
||||
this._primaryKeys = v;
|
||||
}
|
||||
|
||||
|
||||
public constructor(data: {
|
||||
tableName: string;
|
||||
@@ -45,13 +42,12 @@ export default class AnalyticsDataModel {
|
||||
tableColumns: Array<AnalyticsTableColumn>;
|
||||
primaryKeys: Array<string>; // this should be the subset of tableColumns
|
||||
}) {
|
||||
|
||||
let columns: Array<AnalyticsTableColumn> = [...data.tableColumns];
|
||||
const columns: Array<AnalyticsTableColumn> = [...data.tableColumns];
|
||||
|
||||
this.tableName = data.tableName;
|
||||
|
||||
if(data.tableEngine){
|
||||
this.tableEngine = data.tableEngine;
|
||||
if (data.tableEngine) {
|
||||
this.tableEngine = data.tableEngine;
|
||||
}
|
||||
|
||||
columns.push(
|
||||
@@ -84,8 +80,8 @@ export default class AnalyticsDataModel {
|
||||
})
|
||||
);
|
||||
|
||||
if(!data.primaryKeys || data.primaryKeys.length === 0){
|
||||
throw new BadDataException("Primary keys are required");
|
||||
if (!data.primaryKeys || data.primaryKeys.length === 0) {
|
||||
throw new BadDataException('Primary keys are required');
|
||||
}
|
||||
|
||||
// check if primary keys are subset of tableColumns
|
||||
@@ -93,13 +89,18 @@ export default class AnalyticsDataModel {
|
||||
console.log(columns);
|
||||
|
||||
data.primaryKeys.forEach((primaryKey) => {
|
||||
if(!columns.find((column) => column.key === primaryKey)){
|
||||
throw new BadDataException("Primary key "+primaryKey+" is not part of tableColumns");
|
||||
if (
|
||||
!columns.find((column) => {
|
||||
return column.key === primaryKey;
|
||||
})
|
||||
) {
|
||||
throw new BadDataException(
|
||||
'Primary key ' + primaryKey + ' is not part of tableColumns'
|
||||
);
|
||||
}
|
||||
});
|
||||
|
||||
this.primaryKeys = data.primaryKeys;
|
||||
this.tableColumns = columns;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
enum AnalyticsTableEngine {
|
||||
MergeTree = 'MergeTree'
|
||||
MergeTree = 'MergeTree',
|
||||
}
|
||||
|
||||
export default AnalyticsTableEngine;
|
||||
export default AnalyticsTableEngine;
|
||||
|
||||
@@ -29,6 +29,6 @@ export default class Faker {
|
||||
}
|
||||
|
||||
public static generatePhone(): Phone {
|
||||
return new Phone(faker.phone.number());
|
||||
return new Phone(faker.phone.number("+1##########"));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -217,7 +217,7 @@ export const ClickhousePort: Port = new Port(
|
||||
);
|
||||
|
||||
export const ClickhouseUsername: string =
|
||||
process.env['CLICKHOUSE_USERNAME'] || 'default';
|
||||
process.env['CLICKHOUSE_USER'] || 'default';
|
||||
|
||||
export const ClickhousePassword: string =
|
||||
process.env['CLICKHOUSE_PASSWORD'] || 'password';
|
||||
|
||||
@@ -36,7 +36,6 @@ export default class ClickhouseDatabase {
|
||||
let retry: number = 0;
|
||||
|
||||
try {
|
||||
|
||||
const connectToDatabase: Function =
|
||||
async (): Promise<ClickhouseClient> => {
|
||||
try {
|
||||
@@ -46,11 +45,15 @@ export default class ClickhouseDatabase {
|
||||
|
||||
const result = await clickhouseClient.ping();
|
||||
|
||||
if(result.success === false){
|
||||
throw new DatabaseNotConnectedException("Clickhouse Database is not connected")
|
||||
if (result.success === false) {
|
||||
throw new DatabaseNotConnectedException(
|
||||
'Clickhouse Database is not connected'
|
||||
);
|
||||
}
|
||||
|
||||
logger.info(`Clickhouse Database Connected: ${dataSourceOptions.host?.toString()}`);
|
||||
logger.info(
|
||||
`Clickhouse Database Connected: ${dataSourceOptions.host?.toString()}`
|
||||
);
|
||||
|
||||
return clickhouseClient;
|
||||
} catch (err) {
|
||||
|
||||
@@ -1,18 +1,24 @@
|
||||
import TableColumnType from "Common/Types/BaseDatabase/TableColumnType";
|
||||
import ClickhouseDatabase, { ClickhouseAppInstance, ClickhouseClient } from "../Infrastructure/ClickhouseDatabase";
|
||||
import BaseService from "./BaseService";
|
||||
import AnalyticsBaseModel from "Common/Models/AnalyticsBaseModel";
|
||||
import BadDataException from "Common/Types/Exception/BadDataException";
|
||||
import TableColumnType from 'Common/Types/BaseDatabase/TableColumnType';
|
||||
import ClickhouseDatabase, {
|
||||
ClickhouseAppInstance,
|
||||
ClickhouseClient,
|
||||
} from '../Infrastructure/ClickhouseDatabase';
|
||||
import BaseService from './BaseService';
|
||||
import AnalyticsBaseModel from 'Common/Models/AnalyticsBaseModel';
|
||||
import BadDataException from 'Common/Types/Exception/BadDataException';
|
||||
import logger from '../Utils/Logger';
|
||||
// import CreateBy from "../Types/AnalyticsDatabase/CreateBy";
|
||||
|
||||
export default class AnalyticsDatabaseService<TBaseModel extends AnalyticsBaseModel> extends BaseService {
|
||||
|
||||
public modelType!: { new(): TBaseModel };
|
||||
export default class AnalyticsDatabaseService<
|
||||
TBaseModel extends AnalyticsBaseModel
|
||||
> extends BaseService {
|
||||
public modelType!: { new (): TBaseModel };
|
||||
public database!: ClickhouseDatabase;
|
||||
public model!: TBaseModel;
|
||||
public databaseClient!: ClickhouseClient;
|
||||
|
||||
public constructor(data: {
|
||||
modelType: { new(): TBaseModel },
|
||||
modelType: { new (): TBaseModel };
|
||||
database?: ClickhouseDatabase | undefined;
|
||||
}) {
|
||||
super();
|
||||
@@ -20,18 +26,36 @@ export default class AnalyticsDatabaseService<TBaseModel extends AnalyticsBaseMo
|
||||
this.model = new this.modelType();
|
||||
if (data.database) {
|
||||
this.database = data.database;
|
||||
this.databaseClient = this.database.getDataSource() as ClickhouseClient;
|
||||
this.databaseClient =
|
||||
this.database.getDataSource() as ClickhouseClient;
|
||||
}
|
||||
}
|
||||
|
||||
public toTableCreateStatement(): string {
|
||||
return `CREATE TABLE ${this.model.tableName} IF NOT EXISTS
|
||||
if (!this.database) {
|
||||
this.useDefaultDatabase();
|
||||
}
|
||||
|
||||
const statement: string = `CREATE TABLE IF NOT EXISTS ${
|
||||
this.database.getDatasourceOptions().database
|
||||
}.${this.model.tableName}
|
||||
(
|
||||
${this.toColumnsCreateStatement()}
|
||||
)
|
||||
ENGINE = ${this.model.tableEngine}
|
||||
PRIMARY KEY (${this.model.primaryKeys.map((key) => key).join(', ')}
|
||||
`
|
||||
PRIMARY KEY (
|
||||
${this.model.primaryKeys
|
||||
.map(key => {
|
||||
return key;
|
||||
})
|
||||
.join(', ')}
|
||||
)
|
||||
`;
|
||||
|
||||
logger.info(`${this.model.tableName} Table Create Statement`);
|
||||
logger.info(statement);
|
||||
|
||||
return statement;
|
||||
}
|
||||
|
||||
public useDefaultDatabase(): void {
|
||||
@@ -40,22 +64,116 @@ export default class AnalyticsDatabaseService<TBaseModel extends AnalyticsBaseMo
|
||||
}
|
||||
|
||||
public async execute(query: string): Promise<void> {
|
||||
|
||||
if(!this.databaseClient){
|
||||
if (!this.databaseClient) {
|
||||
this.useDefaultDatabase();
|
||||
}
|
||||
|
||||
await this.databaseClient.exec({
|
||||
query: query,
|
||||
})
|
||||
});
|
||||
}
|
||||
|
||||
// public async create(createBy: CreateBy<TBaseModel>): Promise<TBaseModel> {
|
||||
|
||||
// const onCreate: OnCreate<TBaseModel> = createBy.props.ignoreHooks
|
||||
// ? { createBy, carryForward: [] }
|
||||
// : await this._onBeforeCreate(createBy);
|
||||
|
||||
// let _createdBy: CreateBy<TBaseModel> = onCreate.createBy;
|
||||
|
||||
// const carryForward: any = onCreate.carryForward;
|
||||
|
||||
// _createdBy = this.generateSlug(_createdBy);
|
||||
|
||||
// let data: TBaseModel = _createdBy.data;
|
||||
|
||||
// // add tenantId if present.
|
||||
// const tenantColumnName: string | null = data.getTenantColumn();
|
||||
|
||||
// if (tenantColumnName && _createdBy.props.tenantId) {
|
||||
// data.setColumnValue(tenantColumnName, _createdBy.props.tenantId);
|
||||
// }
|
||||
|
||||
// data = this.generateDefaultValues(data);
|
||||
// data = this.checkRequiredFields(data);
|
||||
|
||||
// if (!this.isValid(data)) {
|
||||
// throw new BadDataException('Data is not valid');
|
||||
// }
|
||||
|
||||
// // check total items by.
|
||||
|
||||
// await this.checkTotalItemsBy(_createdBy);
|
||||
|
||||
// // Encrypt data
|
||||
// data = this.encrypt(data);
|
||||
|
||||
// // hash data
|
||||
// data = await this.hash(data);
|
||||
|
||||
// ModelPermission.checkCreatePermissions(
|
||||
// this.entityType,
|
||||
// data,
|
||||
// _createdBy.props
|
||||
// );
|
||||
|
||||
// createBy.data = data;
|
||||
|
||||
// // check uniqueColumns by:
|
||||
// createBy = await this.checkUniqueColumnBy(createBy);
|
||||
|
||||
// // serialize.
|
||||
// createBy.data = (await this.sanitizeCreateOrUpdate(
|
||||
// createBy.data,
|
||||
// createBy.props
|
||||
// )) as TBaseModel;
|
||||
|
||||
// try {
|
||||
// createBy.data = await this.getRepository().save(createBy.data);
|
||||
|
||||
// if (!createBy.props.ignoreHooks) {
|
||||
// createBy.data = await this.onCreateSuccess(
|
||||
// {
|
||||
// createBy,
|
||||
// carryForward,
|
||||
// },
|
||||
// createBy.data
|
||||
// );
|
||||
// }
|
||||
|
||||
// // hit workflow.;
|
||||
// if (this.getModel().enableWorkflowOn?.create) {
|
||||
// let tenantId: ObjectID | undefined = createBy.props.tenantId;
|
||||
|
||||
// if (!tenantId && this.getModel().getTenantColumn()) {
|
||||
// tenantId = createBy.data.getValue<ObjectID>(
|
||||
// this.getModel().getTenantColumn()!
|
||||
// );
|
||||
// }
|
||||
|
||||
// if (tenantId) {
|
||||
// await this.onTrigger(
|
||||
// createBy.data.id!,
|
||||
// tenantId,
|
||||
// 'on-create'
|
||||
// );
|
||||
// }
|
||||
// }
|
||||
|
||||
// return createBy.data;
|
||||
// } catch (error) {
|
||||
// await this.onCreateError(error as Exception);
|
||||
// throw this.getException(error as Exception);
|
||||
// }
|
||||
// }
|
||||
|
||||
public toColumnsCreateStatement(): string {
|
||||
let columns: string = '';
|
||||
|
||||
this.model.tableColumns.forEach((column) => {
|
||||
columns += `${column.key} ${this.toColumnType(column.type)} ${column.required ? 'NOT NULL' : ' NULL'},\n`;
|
||||
columns += `${column.key} ${this.toColumnType(column.type)} ${
|
||||
column.required ? 'NOT NULL' : ' NULL'
|
||||
},\n`;
|
||||
});
|
||||
|
||||
return columns;
|
||||
@@ -86,7 +204,6 @@ export default class AnalyticsDatabaseService<TBaseModel extends AnalyticsBaseMo
|
||||
return 'Int32';
|
||||
}
|
||||
|
||||
|
||||
if (type === TableColumnType.BigNumber) {
|
||||
return 'Int64';
|
||||
}
|
||||
@@ -99,6 +216,6 @@ export default class AnalyticsDatabaseService<TBaseModel extends AnalyticsBaseMo
|
||||
return 'Array';
|
||||
}
|
||||
|
||||
throw new BadDataException("Unknown column type: " + type);
|
||||
throw new BadDataException('Unknown column type: ' + type);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -220,8 +220,8 @@ const services: Array<BaseService> = [
|
||||
WorkflowVariablesService,
|
||||
];
|
||||
|
||||
export const AnalyticsServices: Array<AnalyticsDatabaseService<AnalyticsBaseModel>> = [
|
||||
LogService
|
||||
]
|
||||
export const AnalyticsServices: Array<
|
||||
AnalyticsDatabaseService<AnalyticsBaseModel>
|
||||
> = [LogService];
|
||||
|
||||
export default services;
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
|
||||
import Log from 'Model/Models/Log';
|
||||
import AnalyticsDatabaseService from './AnalyticsDatabaseService';
|
||||
import ClickhouseDatabase from '../Infrastructure/ClickhouseDatabase';
|
||||
@@ -7,6 +6,5 @@ export class Service extends AnalyticsDatabaseService<Log> {
|
||||
public constructor(clickhouseDatabase?: ClickhouseDatabase | undefined) {
|
||||
super({ modelType: Log, database: clickhouseDatabase });
|
||||
}
|
||||
|
||||
}
|
||||
export default new Service();
|
||||
|
||||
7
CommonServer/Types/AnalyticsDatabase/CreateBy.ts
Normal file
7
CommonServer/Types/AnalyticsDatabase/CreateBy.ts
Normal file
@@ -0,0 +1,7 @@
|
||||
import AnalyticsBaseModel from 'Common/Models/AnalyticsBaseModel';
|
||||
import DatabaseCommonInteractionProps from 'Common/Types/Database/DatabaseCommonInteractionProps';
|
||||
|
||||
export default interface CreateBy<TBaseModel extends AnalyticsBaseModel> {
|
||||
data: TBaseModel;
|
||||
props: DatabaseCommonInteractionProps;
|
||||
}
|
||||
@@ -963,7 +963,6 @@ const init: () => Promise<void> = async (): Promise<void> => {
|
||||
await ClickhouseAppInstance.connect(
|
||||
ClickhouseAppInstance.getDatasourceOptions()
|
||||
);
|
||||
|
||||
} catch (err) {
|
||||
logger.error('App Init Failed:');
|
||||
logger.error(err);
|
||||
|
||||
@@ -223,7 +223,4 @@ export default [
|
||||
IncidentTemplateOwnerUser,
|
||||
];
|
||||
|
||||
|
||||
export const AnalyticsModels: Array<typeof AnalyticsBaseModel> = [
|
||||
Log
|
||||
];
|
||||
export const AnalyticsModels: Array<typeof AnalyticsBaseModel> = [Log];
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import AnalyticsBaseModel from "Common/Models/AnalyticsBaseModel";
|
||||
import AnalyticsTableColumn from "Common/Types/AnalyticsDatabase/TableColumn";
|
||||
import TableColumnType from "Common/Types/BaseDatabase/TableColumnType";
|
||||
import AnalyticsTableEngine from "Common/Types/AnalyticsDatabase/AnalyticsTableEngine";
|
||||
import AnalyticsBaseModel from 'Common/Models/AnalyticsBaseModel';
|
||||
import AnalyticsTableColumn from 'Common/Types/AnalyticsDatabase/TableColumn';
|
||||
import TableColumnType from 'Common/Types/BaseDatabase/TableColumnType';
|
||||
import AnalyticsTableEngine from 'Common/Types/AnalyticsDatabase/AnalyticsTableEngine';
|
||||
|
||||
export default class Log extends AnalyticsBaseModel {
|
||||
public constructor() {
|
||||
@@ -31,9 +31,7 @@ export default class Log extends AnalyticsBaseModel {
|
||||
type: TableColumnType.VeryLongText,
|
||||
}),
|
||||
],
|
||||
primaryKeys: [
|
||||
'projectId', 'logContainerId', 'createdAt'
|
||||
]
|
||||
})
|
||||
primaryKeys: ['projectId', 'logContainerId', 'createdAt'],
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -97,7 +97,7 @@ const init: () => Promise<void> = async (): Promise<void> => {
|
||||
);
|
||||
|
||||
await RunDatabaseMigrations();
|
||||
|
||||
|
||||
// create tables in analytics database
|
||||
await AnalyticsTableManagement.createTables();
|
||||
|
||||
|
||||
@@ -1,11 +1,10 @@
|
||||
import { AnalyticsServices } from "CommonServer/Services/Index";
|
||||
import { AnalyticsServices } from 'CommonServer/Services/Index';
|
||||
|
||||
export default class AnalyticsTableManagement {
|
||||
public static async createTables(): Promise<void> {
|
||||
for(const service of AnalyticsServices){
|
||||
|
||||
public static async createTables(): Promise<void> {
|
||||
for (const service of AnalyticsServices) {
|
||||
// create a table if it does not exist
|
||||
await service.execute(service.toTableCreateStatement());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -88,6 +88,12 @@ x-common-server-variables: &common-server-variables
|
||||
WORKFLOW_ROUTE: ${WORKFLOW_ROUTE}
|
||||
STATUS_PAGE_ROUTE: ${STATUS_PAGE_ROUTE}
|
||||
|
||||
CLICKHOUSE_USER: ${CLICKHOUSE_USER}
|
||||
CLICKHOUSE_PASSWORD: ${CLICKHOUSE_PASSWORD}
|
||||
CLICKHOUSE_DATABASE: ${CLICKHOUSE_DATABASE}
|
||||
CLICKHOUSE_HOST: ${CLICKHOUSE_HOST}
|
||||
CLICKHOUSE_PORT: ${CLICKHOUSE_PORT}
|
||||
|
||||
IS_SERVER: true
|
||||
|
||||
DISABLE_AUTOMATIC_INCIDENT_CREATION: ${DISABLE_AUTOMATIC_INCIDENT_CREATION}
|
||||
|
||||
@@ -27,6 +27,9 @@ services:
|
||||
service: redis
|
||||
|
||||
clickhouse:
|
||||
ports:
|
||||
- '9034:9000'
|
||||
- '8189:8123'
|
||||
extends:
|
||||
file: ./docker-compose.base.yml
|
||||
service: clickhouse
|
||||
|
||||
Reference in New Issue
Block a user