2022-03-31 09:04:30 +00:00
|
|
|
import { DatabaseDemux } from '@/demux/db';
|
2022-03-22 09:28:36 +00:00
|
|
|
import { Frappe } from 'frappe/core/frappe';
|
2022-03-31 11:43:20 +00:00
|
|
|
import Money from 'pesa/dist/types/src/money';
|
|
|
|
import { getSchemas } from 'schemas';
|
|
|
|
import { FieldType, FieldTypeEnum, RawValue, SchemaMap } from 'schemas/types';
|
2022-03-31 09:04:30 +00:00
|
|
|
import { DatabaseBase, GetAllOptions } from 'utils/db/types';
|
2022-03-31 11:43:20 +00:00
|
|
|
import { DocValue, DocValueMap, RawValueMap, SingleValue } from './types';
|
2022-03-22 09:28:36 +00:00
|
|
|
|
2022-03-31 09:04:30 +00:00
|
|
|
export class DatabaseHandler extends DatabaseBase {
|
|
|
|
#frappe: Frappe;
|
|
|
|
#demux: DatabaseDemux;
|
2022-03-31 11:43:20 +00:00
|
|
|
// #schemaMap: Readonly<SchemaMap>;
|
2022-03-22 09:28:36 +00:00
|
|
|
|
|
|
|
constructor(frappe: Frappe) {
|
2022-03-31 09:04:30 +00:00
|
|
|
super();
|
|
|
|
this.#frappe = frappe;
|
|
|
|
this.#demux = new DatabaseDemux(frappe.isElectron);
|
2022-03-22 09:28:36 +00:00
|
|
|
}
|
|
|
|
|
2022-03-31 09:04:30 +00:00
|
|
|
async createNewDatabase(dbPath: string, countryCode?: string) {
|
|
|
|
await this.#demux.createNewDatabase(dbPath, countryCode);
|
2022-03-22 09:28:36 +00:00
|
|
|
}
|
|
|
|
|
2022-03-31 09:04:30 +00:00
|
|
|
async connectToDatabase(dbPath: string, countryCode?: string) {
|
|
|
|
await this.#demux.connectToDatabase(dbPath, countryCode);
|
2022-03-22 09:28:36 +00:00
|
|
|
}
|
2022-03-31 09:04:30 +00:00
|
|
|
|
|
|
|
init() {
|
|
|
|
// do nothing
|
2022-03-31 11:43:20 +00:00
|
|
|
// this.#schemaMap = getSchemas();
|
2022-03-31 09:04:30 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
async insert(
|
|
|
|
schemaName: string,
|
|
|
|
docValueMap: DocValueMap
|
|
|
|
): Promise<DocValueMap> {
|
2022-03-31 11:43:20 +00:00
|
|
|
let rawValueMap = this.#toRawValueMap(
|
2022-03-31 09:04:30 +00:00
|
|
|
schemaName,
|
|
|
|
docValueMap
|
|
|
|
) as RawValueMap;
|
|
|
|
rawValueMap = (await this.#demux.call(
|
|
|
|
'insert',
|
|
|
|
schemaName,
|
|
|
|
rawValueMap
|
|
|
|
)) as RawValueMap;
|
2022-03-31 11:43:20 +00:00
|
|
|
return this.#toDocValueMap(schemaName, rawValueMap) as DocValueMap;
|
2022-03-31 09:04:30 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// Read
|
|
|
|
async get(
|
|
|
|
schemaName: string,
|
|
|
|
name: string,
|
|
|
|
fields?: string | string[]
|
|
|
|
): Promise<DocValueMap> {
|
|
|
|
const rawValueMap = (await this.#demux.call(
|
|
|
|
'get',
|
|
|
|
schemaName,
|
|
|
|
name,
|
|
|
|
fields
|
|
|
|
)) as RawValueMap;
|
2022-03-31 11:43:20 +00:00
|
|
|
return this.#toDocValueMap(schemaName, rawValueMap) as DocValueMap;
|
2022-03-31 09:04:30 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
async getAll(
|
|
|
|
schemaName: string,
|
|
|
|
options: GetAllOptions
|
|
|
|
): Promise<DocValueMap[]> {
|
|
|
|
const rawValueMap = (await this.#demux.call(
|
|
|
|
'getAll',
|
|
|
|
schemaName,
|
|
|
|
options
|
|
|
|
)) as RawValueMap[];
|
|
|
|
|
2022-03-31 11:43:20 +00:00
|
|
|
return this.#toDocValueMap(schemaName, rawValueMap) as DocValueMap[];
|
2022-03-31 09:04:30 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
async getSingleValues(
|
|
|
|
...fieldnames: ({ fieldname: string; parent?: string } | string)[]
|
2022-03-31 11:43:20 +00:00
|
|
|
): Promise<SingleValue<DocValue>> {
|
|
|
|
const rawSingleValue = (await this.#demux.call(
|
|
|
|
'getSingleValues',
|
|
|
|
...fieldnames
|
|
|
|
)) as SingleValue<RawValue>;
|
2022-03-31 09:04:30 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// Update
|
|
|
|
async rename(
|
|
|
|
schemaName: string,
|
|
|
|
oldName: string,
|
|
|
|
newName: string
|
|
|
|
): Promise<void> {
|
|
|
|
await this.#demux.call('rename', schemaName, oldName, newName);
|
|
|
|
}
|
|
|
|
|
|
|
|
async update(schemaName: string, docValueMap: DocValueMap): Promise<void> {
|
2022-03-31 11:43:20 +00:00
|
|
|
const rawValueMap = this.#toRawValueMap(schemaName, docValueMap);
|
2022-03-31 09:04:30 +00:00
|
|
|
await this.#demux.call('update', schemaName, rawValueMap);
|
|
|
|
}
|
|
|
|
|
|
|
|
// Delete
|
|
|
|
async delete(schemaName: string, name: string): Promise<void> {
|
|
|
|
await this.#demux.call('delete', schemaName, name);
|
|
|
|
}
|
|
|
|
|
|
|
|
// Other
|
|
|
|
async close(): Promise<void> {
|
|
|
|
await this.#demux.call('close');
|
|
|
|
}
|
|
|
|
|
|
|
|
async exists(schemaName: string, name?: string): Promise<boolean> {
|
|
|
|
return (await this.#demux.call('exists', schemaName, name)) as boolean;
|
|
|
|
}
|
|
|
|
|
2022-03-31 11:43:20 +00:00
|
|
|
#toDocValueMap(
|
2022-03-31 09:04:30 +00:00
|
|
|
schemaName: string,
|
|
|
|
rawValueMap: RawValueMap | RawValueMap[]
|
|
|
|
): DocValueMap | DocValueMap[] {}
|
2022-03-31 11:43:20 +00:00
|
|
|
#toRawValueMap(
|
2022-03-31 09:04:30 +00:00
|
|
|
schemaName: string,
|
|
|
|
docValueMap: DocValueMap | DocValueMap[]
|
|
|
|
): RawValueMap | RawValueMap[] {}
|
2022-03-31 11:43:20 +00:00
|
|
|
|
|
|
|
#toDocValue(value: RawValue, fieldtype: FieldType): DocValue {
|
|
|
|
switch (fieldtype) {
|
|
|
|
case FieldTypeEnum.Currency:
|
|
|
|
return this.#frappe.pesa((value ?? 0) as string | number);
|
|
|
|
case FieldTypeEnum.Date:
|
|
|
|
return new Date(value as string);
|
|
|
|
case FieldTypeEnum.Datetime:
|
|
|
|
return new Date(value as string);
|
|
|
|
case FieldTypeEnum.Int:
|
|
|
|
return +(value as string | number);
|
|
|
|
case FieldTypeEnum.Float:
|
|
|
|
return +(value as string | number);
|
|
|
|
case FieldTypeEnum.Check:
|
|
|
|
return Boolean(value as number);
|
|
|
|
default:
|
|
|
|
return String(value);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#toRawValue(value: DocValue, fieldtype: FieldType): RawValue {
|
|
|
|
switch (fieldtype) {
|
|
|
|
case FieldTypeEnum.Currency:
|
|
|
|
return (value as Money).store;
|
|
|
|
case FieldTypeEnum.Date:
|
|
|
|
return (value as Date).toISOString().split('T')[0];
|
|
|
|
case FieldTypeEnum.Datetime:
|
|
|
|
return (value as Date).toISOString();
|
|
|
|
case FieldTypeEnum.Int: {
|
|
|
|
if (typeof value === 'string') {
|
|
|
|
return parseInt(value);
|
|
|
|
}
|
|
|
|
|
|
|
|
return Math.floor(value as number);
|
|
|
|
}
|
|
|
|
case FieldTypeEnum.Float: {
|
|
|
|
if (typeof value === 'string') {
|
|
|
|
return parseFloat(value);
|
|
|
|
}
|
|
|
|
|
|
|
|
return value as number;
|
|
|
|
}
|
|
|
|
case FieldTypeEnum.Check:
|
|
|
|
return Number(value);
|
|
|
|
default:
|
|
|
|
return String(value);
|
|
|
|
}
|
|
|
|
}
|
2022-03-22 09:28:36 +00:00
|
|
|
}
|