UNPKG

@opengis/fastify-table

Version:

core-plugins

165 lines (162 loc) 7.6 kB
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, }); }