fix phone number

This commit is contained in:
Simon Larsen
2023-08-22 09:37:39 +01:00
parent bdc4c5f4f2
commit 4dc7741289
16 changed files with 198 additions and 70 deletions

View File

@@ -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;
}
}

View File

@@ -1,5 +1,5 @@
enum AnalyticsTableEngine {
MergeTree = 'MergeTree'
MergeTree = 'MergeTree',
}
export default AnalyticsTableEngine;
export default AnalyticsTableEngine;

View File

@@ -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##########"));
}
}

View File

@@ -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';

View File

@@ -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) {

View File

@@ -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);
}
}

View File

@@ -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;

View File

@@ -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();

View 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;
}

View File

@@ -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);

View File

@@ -223,7 +223,4 @@ export default [
IncidentTemplateOwnerUser,
];
export const AnalyticsModels: Array<typeof AnalyticsBaseModel> = [
Log
];
export const AnalyticsModels: Array<typeof AnalyticsBaseModel> = [Log];

View File

@@ -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'],
});
}
}
}

View File

@@ -97,7 +97,7 @@ const init: () => Promise<void> = async (): Promise<void> => {
);
await RunDatabaseMigrations();
// create tables in analytics database
await AnalyticsTableManagement.createTables();

View File

@@ -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());
}
}
}
}

View File

@@ -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}

View File

@@ -27,6 +27,9 @@ services:
service: redis
clickhouse:
ports:
- '9034:9000'
- '8189:8123'
extends:
file: ./docker-compose.base.yml
service: clickhouse