@opengis/fastify-table
Version:
core-plugins
165 lines (162 loc) • 7.6 kB
JavaScript
import getMeta from "../../../plugins/pg/funcs/getMeta.js";
import getToken from "../../../plugins/crud/funcs/getToken.js";
import pgClients from "../../../plugins/pg/pgClients.js";
const galleryExtList = [
"png",
"svg",
"jpg",
"jpeg",
"gif",
"mp4",
"mov",
"avi",
];
const username = "coalesce(u.sur_name,'')||coalesce(' '||u.user_name,'') ||coalesce(' '||u.father_name,'')";
const pkList = {
comment: "communication_id",
checklist: "checklist_id",
file: "file_id",
gallery: "file_id",
reaction: "reaction_id",
};
/**
* Дістає CRM для widget
*
*/
export default async function widgetGet({ pg = pgClients.client, user = {}, params = {}, query = {}, unittest }, reply) {
const param = user?.uid
? await getToken({
token: params.objectid,
mode: "w",
uid: user.uid,
})
: null;
const objectid = param ? JSON.parse(param)?.id : params.objectid;
if (!objectid) {
return reply.status(400).send("not enough params: id");
}
const sqls = {
comment: pg.pk["admin.users"]
? `select communication_id, entity_id, body, subject, c.cdate, c.uid,
${username} as username, u.login, u.avatar
from crm.communications c
left join admin.users u on u.uid=c.uid
where entity_id=$1 order by cdate desc`
: "select communication_id, entity_id, body, subject, cdate, uid from crm.communications where entity_id=$1 order by cdate desc",
history: `select * from (
SELECT change_id, entity_id, entity_type, change_type, change_date, a.change_user_id, a.uid, a.cdate, b.json_agg as changes,
${username} as username, u.login, u.avatar
FROM log.table_changes a
left join admin.users u on a.change_user_id = u.uid
left join lateral(
select json_agg(row_to_json(q)) from (
select change_data_id, entity_key, value_new, value_old from log.table_changes_data
where change_id=a.change_id
)q
)b on 1=1
where b.json_agg is not null and (entity_id=$1 or entity_id in (
select communication_id as comments from crm.communications where entity_id=$1
union all select checklist_id from crm.checklists where entity_id=$1)
)
union all
select change_id, entity_id, entity_type, change_type, change_date, a.change_user_id, a.uid, a.cdate, b.json_agg as changes,
${username} as username, u.login, u.avatar
FROM log.table_changes a
left join admin.users u on a.change_user_id = u.uid
left join lateral(
select json_agg(o) from (
select json_object_agg(entity_key, coalesce(value_new, value_old)) as o from log.table_changes_data
where change_id=a.change_id and entity_key not in ('uid', 'file_status', 'editor_id', 'cdate', 'editor_date', 'entity_id')
)q
)b on 1=1
where a.change_type in ('INSERT', 'DELETE') and a.entity_id in (select file_id from crm.files where entity_id=$1)
limit 100
)q order by cdate desc limit 100`,
checklist: pg.pk["admin.users"]
? `SELECT checklist_id, entity_id, subject, is_done, done_date, c.uid, c.cdate, ${username} as username, u.login, u.avatar
FROM crm.checklists c
left join admin.users u on u.uid=c.uid
where entity_id=$1 order by cdate desc`
: "SELECT checklist_id, entity_id, subject, is_done, done_date, uid, cdate FROM crm.checklists where entity_id=$1 order by cdate desc",
file: pg.pk["admin.users"]
? `SELECT file_id, entity_id, entity_type, file_path, uploaded_name, ext, size, c.uid, c.cdate, file_type, c.ismain,
${username} as username, u.login, isverified, u.avatar, u.uid as author, file_status
FROM crm.files c
left join admin.users u on u.uid=c.uid
where entity_id=$1 and file_status<>3 order by cdate desc`
: `SELECT file_id, entity_id, entity_type, file_path, uploaded_name, ext, size, uid, cdate, file_type, ismain,
isverified, uid as author, file_status FROM crm.files c where entity_id=$1 and file_status<>3 order by cdate desc`,
gallery: pg.pk["admin.users"]
? `SELECT file_id, entity_id, entity_type, file_path, uploaded_name, ext, size, c.uid, c.cdate, file_type, c.ismain,
${username} as username, u.login, u.avatar, isverified, u.avatar, c.uid as author, file_status
FROM crm.files c
left join admin.users u on u.uid=c.uid
where entity_id=$1 and file_status<>3 and ext = any($2) order by cdate desc`
: `SELECT file_id, entity_id, entity_type, file_path, uploaded_name, ext, size, c.uid, c.cdate, file_type, ismain,
isverified, uid as author, file_status FROM crm.files c where entity_id=$1 and file_status<>3 and ext = any($2) order by cdate desc`,
reaction: "SELECT count(*), reaction_type FROM crm.reactions c where entity_id=$1 group by reaction_type",
};
const q = sqls[params.type];
if (!q) {
return reply.status(400).send("invalid widget type");
}
/* data */
const t1 = Date.now();
const { rows = [] } = await pg.query(q, [objectid, params.type === "gallery" ? galleryExtList : null].filter((el) => el));
rows.forEach((row) => Object.assign(row, { username: row.username?.trim?.() || row.login }));
/* reactions */
const widgetPkey = pkList[params.type];
if (params.type === "comment" && widgetPkey) {
const reactions = rows.length && user.uid
? await pg
.query("select json_object_agg(entity_id, reaction_type) from crm.reactions where entity_id=any($1) and created_by=$2", [rows.map((row) => row[widgetPkey]), user.uid])
.then((el) => el.rows?.[0]?.json_object_agg || {})
: {};
rows
.filter((row) => reactions[row[widgetPkey]])
.forEach((row) => {
Object.assign(row, { reaction: reactions[row[widgetPkey]] });
});
}
/* Object info */
const { tableName } = pg.pk["log.table_changes"]
? await pg
.query('select entity_type as "tableName" from log.table_changes where entity_id=$1 limit 1', [objectid])
.then((el) => el.rows?.[0] || {})
: {};
const { pk, columns = [] } = await getMeta({ pg, table: tableName });
const authorIdColumn = columns.find((col) => ["uid", "created_by"].includes(col.name))?.name;
if (!pk && params.type === "history" && !unittest) {
return reply.status(404).send("log table not found");
}
const q1 = `select ${username} as author, u.login, a.cdate, a.editor_date from ${tableName} a
left join admin.users u on a.${authorIdColumn}=u.uid where a.${pk}=$1 limit 1`;
const data = pg.pk["admin.users"] && pk && tableName
? await pg
.query(q, [
objectid,
params.type === "gallery" ? galleryExtList : null,
].filter((el) => el))
.then((el) => el.rows?.[0] || {})
: {};
if (query.debug && user?.user_type === "admin") {
return {
q,
type: params.type,
q1,
id: objectid,
data,
};
}
return reply.status(200).send({
time: { data: Date.now() - t1 },
rows,
user: { uid: user?.uid, name: user?.user_name },
data: {
author: data?.author,
cdate: data?.cdate,
edate: data?.editor_date,
},
objectid: params.objectid,
});
}