2
0
mirror of https://github.com/frappe/books.git synced 2024-09-20 11:29:00 +00:00
books/frappe/core/dbHandler.ts

171 lines
4.6 KiB
TypeScript
Raw Normal View History

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
}