mirror of
https://github.com/frappe/books.git
synced 2024-09-20 03:29:00 +00:00
chore: remove unused files; main to .ts
This commit is contained in:
parent
3d4275ef34
commit
761dd641bf
@ -1,235 +0,0 @@
|
||||
const frappe = require('frappe');
|
||||
const Observable = require('frappe/utils/observable');
|
||||
const triggerEvent = (name) => frappe.events.trigger(`http:${name}`);
|
||||
|
||||
module.exports = class HTTPClient extends Observable {
|
||||
constructor({ server, protocol = 'http' }) {
|
||||
super();
|
||||
|
||||
this.server = server;
|
||||
this.protocol = protocol;
|
||||
frappe.config.serverURL = this.getURL();
|
||||
|
||||
// if the backend is http, then always client!
|
||||
frappe.isServer = false;
|
||||
|
||||
this.initTypeMap();
|
||||
}
|
||||
|
||||
connect() {}
|
||||
|
||||
async insert(doctype, doc) {
|
||||
doc.doctype = doctype;
|
||||
let filesToUpload = this.getFilesToUpload(doc);
|
||||
let url = this.getURL('/api/resource', doctype);
|
||||
|
||||
const responseDoc = await this.fetch(url, {
|
||||
method: 'POST',
|
||||
body: JSON.stringify(doc),
|
||||
});
|
||||
|
||||
await this.uploadFilesAndUpdateDoc(filesToUpload, doctype, responseDoc);
|
||||
|
||||
return responseDoc;
|
||||
}
|
||||
|
||||
async get(doctype, name) {
|
||||
name = encodeURIComponent(name);
|
||||
let url = this.getURL('/api/resource', doctype, name);
|
||||
return await this.fetch(url, {
|
||||
method: 'GET',
|
||||
headers: this.getHeaders(),
|
||||
});
|
||||
}
|
||||
|
||||
async getAll({ doctype, fields, filters, start, limit, sortBy, order }) {
|
||||
let url = this.getURL('/api/resource', doctype);
|
||||
|
||||
url =
|
||||
url +
|
||||
'?' +
|
||||
frappe.getQueryString({
|
||||
fields: JSON.stringify(fields),
|
||||
filters: JSON.stringify(filters),
|
||||
start: start,
|
||||
limit: limit,
|
||||
sortBy: sortBy,
|
||||
order: order,
|
||||
});
|
||||
|
||||
return await this.fetch(url, {
|
||||
method: 'GET',
|
||||
});
|
||||
}
|
||||
|
||||
async update(doctype, doc) {
|
||||
doc.doctype = doctype;
|
||||
let filesToUpload = this.getFilesToUpload(doc);
|
||||
let url = this.getURL('/api/resource', doctype, doc.name);
|
||||
|
||||
const responseDoc = await this.fetch(url, {
|
||||
method: 'PUT',
|
||||
body: JSON.stringify(doc),
|
||||
});
|
||||
|
||||
await this.uploadFilesAndUpdateDoc(filesToUpload, doctype, responseDoc);
|
||||
|
||||
return responseDoc;
|
||||
}
|
||||
|
||||
async delete(doctype, name) {
|
||||
let url = this.getURL('/api/resource', doctype, name);
|
||||
|
||||
return await this.fetch(url, {
|
||||
method: 'DELETE',
|
||||
});
|
||||
}
|
||||
|
||||
async deleteMany(doctype, names) {
|
||||
let url = this.getURL('/api/resource', doctype);
|
||||
|
||||
return await this.fetch(url, {
|
||||
method: 'DELETE',
|
||||
body: JSON.stringify(names),
|
||||
});
|
||||
}
|
||||
|
||||
async exists(doctype, name) {
|
||||
return (await this.getValue(doctype, name, 'name')) ? true : false;
|
||||
}
|
||||
|
||||
async getValue(doctype, name, fieldname) {
|
||||
let url = this.getURL('/api/resource', doctype, name, fieldname);
|
||||
|
||||
return (
|
||||
await this.fetch(url, {
|
||||
method: 'GET',
|
||||
})
|
||||
).value;
|
||||
}
|
||||
|
||||
async fetch(url, args) {
|
||||
triggerEvent('ajaxStart');
|
||||
|
||||
args.headers = this.getHeaders();
|
||||
let response = await frappe.fetch(url, args);
|
||||
|
||||
triggerEvent('ajaxStop');
|
||||
|
||||
if (response.status === 200) {
|
||||
let data = await response.json();
|
||||
return data;
|
||||
}
|
||||
|
||||
if (response.status === 401) {
|
||||
triggerEvent('unauthorized');
|
||||
}
|
||||
|
||||
throw Error(await response.text());
|
||||
}
|
||||
|
||||
getFilesToUpload(doc) {
|
||||
const meta = frappe.getMeta(doc.doctype);
|
||||
const fileFields = meta.getFieldsWith({ fieldtype: 'File' });
|
||||
const filesToUpload = [];
|
||||
|
||||
if (fileFields.length > 0) {
|
||||
fileFields.forEach((df) => {
|
||||
const files = doc[df.fieldname] || [];
|
||||
if (files.length) {
|
||||
filesToUpload.push({
|
||||
fieldname: df.fieldname,
|
||||
files: files,
|
||||
});
|
||||
}
|
||||
delete doc[df.fieldname];
|
||||
});
|
||||
}
|
||||
|
||||
return filesToUpload;
|
||||
}
|
||||
|
||||
async uploadFilesAndUpdateDoc(filesToUpload, doctype, doc) {
|
||||
if (filesToUpload.length > 0) {
|
||||
// upload files
|
||||
for (const fileToUpload of filesToUpload) {
|
||||
const files = await this.uploadFiles(
|
||||
fileToUpload.files,
|
||||
doctype,
|
||||
doc.name,
|
||||
fileToUpload.fieldname
|
||||
);
|
||||
doc[fileToUpload.fieldname] = files[0].name;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
async uploadFiles(fileList, doctype, name, fieldname) {
|
||||
let url = this.getURL('/api/upload', doctype, name, fieldname);
|
||||
|
||||
let formData = new FormData();
|
||||
for (const file of fileList) {
|
||||
formData.append('files', file, file.name);
|
||||
}
|
||||
|
||||
let response = await frappe.fetch(url, {
|
||||
method: 'POST',
|
||||
body: formData,
|
||||
});
|
||||
|
||||
const data = await response.json();
|
||||
if (response.status !== 200) {
|
||||
throw Error(data.error);
|
||||
}
|
||||
return data;
|
||||
}
|
||||
|
||||
getURL(...parts) {
|
||||
return this.protocol + '://' + this.server + (parts || []).join('/');
|
||||
}
|
||||
|
||||
getHeaders() {
|
||||
const headers = {
|
||||
Accept: 'application/json',
|
||||
'Content-Type': 'application/json',
|
||||
};
|
||||
if (frappe.session && frappe.session.token) {
|
||||
headers.token = frappe.session.token;
|
||||
}
|
||||
return headers;
|
||||
}
|
||||
|
||||
initTypeMap() {
|
||||
this.typeMap = {
|
||||
AutoComplete: true,
|
||||
Currency: true,
|
||||
Int: true,
|
||||
Float: true,
|
||||
Percent: true,
|
||||
Check: true,
|
||||
'Small Text': true,
|
||||
'Long Text': true,
|
||||
Code: true,
|
||||
'Text Editor': true,
|
||||
Date: true,
|
||||
Datetime: true,
|
||||
Time: true,
|
||||
Text: true,
|
||||
Data: true,
|
||||
Link: true,
|
||||
DynamicLink: true,
|
||||
Password: true,
|
||||
Select: true,
|
||||
'Read Only': true,
|
||||
File: true,
|
||||
Attach: true,
|
||||
'Attach Image': true,
|
||||
Signature: true,
|
||||
Color: true,
|
||||
Barcode: true,
|
||||
Geolocation: true,
|
||||
};
|
||||
}
|
||||
|
||||
close() {}
|
||||
};
|
@ -1,238 +0,0 @@
|
||||
const frappe = require('frappe');
|
||||
const mysql = require('mysql');
|
||||
const Database = require('./database');
|
||||
const debug = false;
|
||||
|
||||
module.exports = class mysqlDatabase extends Database {
|
||||
constructor({ db_name, username, password, host }) {
|
||||
super();
|
||||
this.db_name = db_name;
|
||||
this.username = username;
|
||||
this.password = password;
|
||||
this.host = host;
|
||||
this.init_typeMap();
|
||||
}
|
||||
|
||||
connect(db_name) {
|
||||
if (db_name) {
|
||||
this.db_name = db_name;
|
||||
}
|
||||
return new Promise((resolve) => {
|
||||
this.conn = new mysql.createConnection({
|
||||
host: this.host,
|
||||
user: this.username,
|
||||
password: this.password,
|
||||
database: this.db_name,
|
||||
});
|
||||
() => {
|
||||
if (debug) {
|
||||
this.conn.on('trace', (trace) => console.log(trace));
|
||||
}
|
||||
};
|
||||
resolve();
|
||||
});
|
||||
}
|
||||
|
||||
async tableExists(table) {
|
||||
const name = await this.sql(`SELECT table_name
|
||||
FROM information_schema.tables
|
||||
WHERE table_schema = '${this.db_name}'
|
||||
AND table_name = '${table}'`);
|
||||
return name && name.length ? true : false;
|
||||
}
|
||||
|
||||
async runCreateTableQuery(doctype, columns, values) {
|
||||
const query = `CREATE TABLE IF NOT EXISTS ${doctype} (
|
||||
${columns.join(', ')})`;
|
||||
|
||||
return await this.run(query, values);
|
||||
}
|
||||
|
||||
updateColumnDefinition(df, columns, indexes) {
|
||||
columns.push(
|
||||
`${df.fieldname} ${this.typeMap[df.fieldtype]} ${
|
||||
df.required && !df.default ? 'not null' : ''
|
||||
} ${df.default ? `default '${df.default}'` : ''}`
|
||||
);
|
||||
}
|
||||
|
||||
async getTableColumns(doctype) {
|
||||
return (await this.sql(`SHOW COLUMNS FROM ${doctype}`)).map((d) => d.Field);
|
||||
}
|
||||
|
||||
async runAddColumnQuery(doctype, fields) {
|
||||
await this.run(
|
||||
`ALTER TABLE ${doctype} ADD COLUMN ${this.get_column_definition(doctype)}`
|
||||
);
|
||||
}
|
||||
|
||||
getOne(doctype, name, fields = '*') {
|
||||
fields = this.prepareFields(fields);
|
||||
|
||||
return new Promise((resolve, reject) => {
|
||||
this.conn.get(
|
||||
`select ${fields} from ${doctype}
|
||||
where name = ?`,
|
||||
name,
|
||||
(err, row) => {
|
||||
resolve(row || {});
|
||||
}
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
async insertOne(doctype, doc) {
|
||||
let fields = this.get_keys(doctype);
|
||||
let placeholders = fields.map((d) => '?').join(', ');
|
||||
|
||||
if (!doc.name) {
|
||||
doc.name = frappe.getRandomString();
|
||||
}
|
||||
|
||||
return await this.run(
|
||||
`insert into ${doctype}
|
||||
(${fields.map((field) => field.fieldname).join(', ')})
|
||||
values (${placeholders})`,
|
||||
this.getFormattedValues(fields, doc)
|
||||
);
|
||||
}
|
||||
|
||||
async updateOne(doctype, doc) {
|
||||
let fields = this.getKeys(doctype);
|
||||
let assigns = fields.map((field) => `${field.fieldname} = ?`);
|
||||
let values = this.getFormattedValues(fields, doc);
|
||||
|
||||
// additional name for where clause
|
||||
values.push(doc.name);
|
||||
|
||||
return await this.run(
|
||||
`update ${doctype}
|
||||
set ${assigns.join(', ')} where name=?`,
|
||||
values
|
||||
);
|
||||
}
|
||||
|
||||
async runDeleteOtherChildren(field, added) {
|
||||
await this.run(
|
||||
`delete from ${field.childtype}
|
||||
where
|
||||
parent = ? and
|
||||
name not in (${added
|
||||
.slice(1)
|
||||
.map((d) => '?')
|
||||
.join(', ')})`,
|
||||
added
|
||||
);
|
||||
}
|
||||
|
||||
async deleteOne(doctype, name) {
|
||||
return await this.run(`delete from ${doctype} where name=?`, name);
|
||||
}
|
||||
|
||||
async deleteChildren(parenttype, parent) {
|
||||
await this.run(`delete from ${parent} where parent=?`, parent);
|
||||
}
|
||||
|
||||
getAll({
|
||||
doctype,
|
||||
fields,
|
||||
filters,
|
||||
start,
|
||||
limit,
|
||||
order_by = 'modified',
|
||||
order = 'desc',
|
||||
} = {}) {
|
||||
if (!fields) {
|
||||
fields = frappe.getMeta(doctype).getKeywordFields();
|
||||
}
|
||||
return new Promise((resolve, reject) => {
|
||||
let conditions = this.getFilterConditions(filters);
|
||||
|
||||
this.conn.all(
|
||||
`select ${fields.join(', ')}
|
||||
from ${doctype}
|
||||
${conditions.conditions ? 'where' : ''} ${conditions.conditions}
|
||||
${order_by ? 'order by ' + order_by : ''} ${
|
||||
order_by ? order || 'asc' : ''
|
||||
}
|
||||
${limit ? 'limit ' + limit : ''} ${
|
||||
start ? 'offset ' + start : ''
|
||||
}`,
|
||||
conditions.values,
|
||||
(err, rows) => {
|
||||
if (err) {
|
||||
reject(err);
|
||||
} else {
|
||||
resolve(rows);
|
||||
}
|
||||
}
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
run(query, params) {
|
||||
// TODO promisify
|
||||
return new Promise((resolve, reject) => {
|
||||
this.conn.query(query, params, (err) => {
|
||||
if (err) {
|
||||
if (debug) {
|
||||
console.error(err);
|
||||
}
|
||||
reject(err);
|
||||
} else {
|
||||
resolve();
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
sql(query, params) {
|
||||
return new Promise((resolve) => {
|
||||
this.conn.query(query, params, (err, rows) => {
|
||||
resolve(rows);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
async commit() {
|
||||
try {
|
||||
await this.run('commit');
|
||||
} catch (e) {
|
||||
if (e.errno !== 1) {
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
init_typeMap() {
|
||||
this.typeMap = {
|
||||
AutoComplete: 'VARCHAR(140)',
|
||||
Currency: 'real',
|
||||
Int: 'INT',
|
||||
Float: 'decimal(18,6)',
|
||||
Percent: 'real',
|
||||
Check: 'INT(1)',
|
||||
'Small Text': 'text',
|
||||
'Long Text': 'text',
|
||||
Code: 'text',
|
||||
'Text Editor': 'text',
|
||||
Date: 'DATE',
|
||||
Datetime: 'DATETIME',
|
||||
Time: 'TIME',
|
||||
Text: 'text',
|
||||
Data: 'VARCHAR(140)',
|
||||
Link: ' varchar(140)',
|
||||
DynamicLink: 'text',
|
||||
Password: 'varchar(140)',
|
||||
Select: 'VARCHAR(140)',
|
||||
'Read Only': 'varchar(140)',
|
||||
File: 'text',
|
||||
Attach: 'text',
|
||||
'Attach Image': 'text',
|
||||
Signature: 'text',
|
||||
Color: 'text',
|
||||
Barcode: 'text',
|
||||
Geolocation: 'text',
|
||||
};
|
||||
}
|
||||
};
|
@ -5,8 +5,8 @@ module.exports = {
|
||||
pluginOptions: {
|
||||
electronBuilder: {
|
||||
nodeIntegration: true,
|
||||
disableMainProcessTypescript: true,
|
||||
mainProcessTypeChecking: false,
|
||||
disableMainProcessTypescript: false,
|
||||
mainProcessTypeChecking: true,
|
||||
chainWebpackRendererProcess: (config) => {
|
||||
config.target('electron-renderer');
|
||||
config.resolve.alias.set('frappe', path.resolve(__dirname, './frappe'));
|
||||
|
Loading…
Reference in New Issue
Block a user