
* Add Odoo App and Icon * Add Auth for Odoo * Authorise with API key, the password would also work, but we should encourage an API key. * Odoo Verify Credentials method * Add the xmlrpc dependency so the backend can communicate with Odoo's API. * Add a port to the auth fields to establish a connection that might not be over HTTPS. * Add still verified method * Currently no need to keep uid, so remove it from the auth data. * Await the callback from the xmlrpc method call to ensure we don't verify credentials before the callback has been executed. * Add Odoo create-lead action * Provide basic functionality to create a lead. * Add Odoo type option * Let the user decide if the lead should be a "lead" or "opportunity" in the create-lead action. * Add documentation for Odoo app * Follow project standards * Change indents to 2 spaces * Use single quotes instead of double * Commonise the authentication method (DRY) * Use latest for API doc link * refactor(odoo): abstract and organize implementation --------- Co-authored-by: Ali BARIN <ali.barin53@gmail.com>
68 lines
1.5 KiB
TypeScript
68 lines
1.5 KiB
TypeScript
import { join } from 'node:path';
|
|
import xmlrpc from 'xmlrpc';
|
|
import { IGlobalVariable } from "@automatisch/types";
|
|
|
|
type AsyncMethodCallPayload = {
|
|
method: string;
|
|
params: any[];
|
|
path?: string;
|
|
}
|
|
|
|
export const asyncMethodCall = async <T = number>($: IGlobalVariable, { method, params, path }: AsyncMethodCallPayload): Promise<T> => {
|
|
return new Promise(
|
|
(resolve, reject) => {
|
|
const client = getClient($, { path });
|
|
|
|
client.methodCall(
|
|
method,
|
|
params,
|
|
(error, response) => {
|
|
if (error != null) {
|
|
// something went wrong on the server side, display the error returned by Odoo
|
|
reject(error);
|
|
}
|
|
|
|
resolve(response);
|
|
}
|
|
)
|
|
}
|
|
);
|
|
}
|
|
|
|
export const getClient = ($: IGlobalVariable, { path = 'common' }) => {
|
|
const host = $.auth.data.host as string;
|
|
const port = Number($.auth.data.port as string);
|
|
|
|
return xmlrpc.createClient(
|
|
{
|
|
host,
|
|
port,
|
|
path: join('/xmlrpc/2', path),
|
|
}
|
|
);
|
|
}
|
|
|
|
export const authenticate = async ($: IGlobalVariable) => {
|
|
const uid = await asyncMethodCall(
|
|
$,
|
|
{
|
|
method: 'authenticate',
|
|
params: [
|
|
$.auth.data.databaseName,
|
|
$.auth.data.email,
|
|
$.auth.data.apiKey,
|
|
[]
|
|
]
|
|
}
|
|
);
|
|
|
|
if (!Number.isInteger(uid)) {
|
|
// failed to authenticate
|
|
throw new Error(
|
|
'Failed to connect to the Odoo server. Please, check the credentials!'
|
|
);
|
|
}
|
|
|
|
return uid;
|
|
}
|