@opengis/fastify-table
Version:
core-plugins
69 lines (68 loc) • 2.25 kB
JavaScript
import { config, logger, dataInsert, pgClients } from "../../../../utils.js";
function checkValueType(val) {
if (val && typeof val === "object") {
return "property_json";
}
if (val &&
typeof val === "number" &&
!/\D/.test(val.toString()) &&
val.toString().length < 10) {
return "property_int";
}
return "property_text";
}
export default async function postAppSettings({ pg = pgClients.client, body, user, params, }, reply) {
const { uid } = user || {};
if ((!params?.entity || params.entity === "app") &&
!user?.user_type?.includes?.("admin") &&
!config.local) {
return reply.status(403).send("access restricted");
}
if (!pg) {
return reply.status(500).send("empty pg");
}
if (!pg?.pk?.["admin.properties"]) {
return reply.status(404).send("table not found");
}
const { key, val } = body;
if ((!key || !val) && !Object.keys(body).length) {
return reply.status(400).send("not enough body params");
}
const keys = Object.keys(body);
const entity = params?.entity === "user" ? user.uid : params?.entity || "app";
const client = await pg.connect();
try {
await client.query("begin;");
await client.query("delete from admin.properties where property_entity=$1 and property_key=any($2)", [entity, keys]);
await Promise.all(keys
.filter((el) => body[el])
.map(async (el) => {
const columnType = checkValueType(body[el]);
await dataInsert({
pg: client,
table: "admin.properties",
data: {
property_key: el,
[columnType]: body[el],
property_entity: entity,
},
uid,
});
}));
await client.query("commit;");
return reply.status(200).send("ok");
}
catch (err) {
logger.file("properties/error", {
error: err.toString(),
stack: err.stack,
body,
user,
entity,
});
return reply.status(500).send(err.toString());
}
finally {
client.release();
}
}