From 4ac633d4a28803145a7708efc41da911dfff56d8 Mon Sep 17 00:00:00 2001 From: Rizky Date: Wed, 13 Mar 2024 15:04:49 +0700 Subject: [PATCH] wip add batch update --- bun.lockb | Bin 140232 -> 140947 bytes pkgs/utils/query.ts | 151 +++++++++++++++++++++++++++++--------------- 2 files changed, 99 insertions(+), 52 deletions(-) diff --git a/bun.lockb b/bun.lockb index d19c9b3abbbeb3a4d849cfbc824920886a49cbee..4451255050569bda702743153b7962e5802e3db3 100755 GIT binary patch delta 7524 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 P8EGXm=X*;N-DUp;!+HYI delta 7132 zcmeI1eUMjG8OQJCMVAHSRhHLTgn&pU&_P^DGEo8nlguIo5{=}g1r`K(S+^fKHJLRA z{bu@!kb*TDI{5o%=W~D0&RiI3fM)EUeP%!Rd(Ly8 zbMCq4o_l}Ky<6N`@!Q{2to-=k#k>E0{cCCE!&AdH#fjZ|<8n=(euc zzIfKS4K@8+B-*@HldD^dm~-FKrENF1t82SyMb(Na#g$d93MaBtQmBAd&@SrjQB7?L z9j#z$CG>>OFa$KUHJoMzQ|Z0mXY<@+yudE(sM%2}`IBIcK!OmueSG7JXbawbv{d1yzBz17L;8E+q z>w7I|s_h%BU^&euG4D7$AUo@FRFeER?Lf;Lp)IV=dMT?1z8Tata009cZM{9Z<2LXN zehgY(_1~U(%WC``QCB_igHg|`agE_WlG^V>6WO?&ACADh+QB2?&#Mi875==Y#Xd`_ zi^G?6FJ7{wW5He@2YY!U^hs1xT@HV+f~m%Bvx2F%-(dw)owr?9Fx64K2)5e|T29NC zD(5&nAnRZcUORX>+gn!ad&B=q_*GZbU&H@)`19(3-T`%g(^ArE>OasT*wtfc z`C&tWTIM)(B@<#qNO@1;AX?bxhRQyoAqyVQOB$z@j>+u=F(f~n2fWi}Q0EYm5f1s|?; zU@p*{T^=c`WMZNBS~yUb^y&Dmv={2#N+k;k81Zfdw;dqeRXRb7i)s#-O6ZFzO=OXDqZTWx7%ZF+X$gM(%BF8CsMfj7kEaaT0ey)$|kfL$6fCa`-V?y~Ti-^>W# zl<=94&WiHXP?O|=<+wsJEu3b-?aR*OOW`vk?ifA?Wzjc@d7w=XpKrf?bzoP7&&B(Z z%#$QnhR>hL0pa^{<|BjlouTQ~$I8{f6=BNEz`%d~;>2LGXQ`60*K6S{t(gk&CuTC4-aVOjbKZW|z;<|Kl zI=!^DF0CHmH82DBXRroF!YANt7zKXi8CdGHAniZ6EyZ@=+B^w5fNQdr=5xWdI3IeJ zrY%T^_8Ua;qc9jg2Cf2^tV`4-c_1y_y&&yY@E!Nh@E7of_;L2R3LgSLIW)q(a35?0 zSEIjDYvFccSD{N`8F+2H7K_1!Q|JMmz*V>cz7E&H zH{n}wJ$xH(0GDrFY1zVbP@$gU9GDHWU?xn5sqh6D4d=n9VJ!GsI0S~m8ywE}_$Meo zgYJN5;W>C7cEVNcdjQ>w-hz%tm!mFt7I-2180VM2YH)S;gf6h3z<+=rR(;vM5nSmj zVHLQ*UC<>M0hhtW;D1egX}*;{)}U))9r%%MJow%9U3d=;_}`KDDf|mQfOlXxoB@6@ zehHp}r(ruh15d(M_&wYKKY1|N^AnaOu3Tn>|A9BgOj4Aj8k z&=tN+@UFjreSVhRM)^)y4Nd#kQ?77%VtwngCqZM^#cB77%1QNQ@4kCV uqZ`tJjn_4#Ylm0Xxa6^#jg8lAOh>nDLcz3JZ=Ifg|5 diff --git a/pkgs/utils/query.ts b/pkgs/utils/query.ts index 21e7e15..c08e570 100644 --- a/pkgs/utils/query.ts +++ b/pkgs/utils/query.ts @@ -13,6 +13,35 @@ export type DBArg = { export const execQuery = async (args: DBArg, prisma: any) => { const { table, action, params } = args; + if (action === "batch_update") { + const { table, batch } = params as unknown as { + table: string; + batch: { data: any; where: any }[]; + }; + + const promises = [] as any[]; + + const tableInstance = prisma[table]; + if (tableInstance) { + try { + for (const item of batch) { + if ( + Object.entries(item.where).length > 0 && + Object.entries(item.data).length > 0 + ) { + promises.push( + tableInstance.updateMany({ where: item.where, data: item.data }) + ); + } + } + await Promise.all(promises); + } catch (e: any) { + throw new Error(e.message); + } + } + + return; + } if (action.startsWith("schema_")) { const schema_path = dir("app/db/prisma/schema.prisma"); const schema = createPrismaSchemaBuilder(await readAsync(schema_path)); @@ -28,73 +57,85 @@ export const execQuery = async (args: DBArg, prisma: any) => { type: string; optional: boolean; db_type: string; - default?: any + default?: any; } >; - const rels = {} as Record + const rels = {} as Record< + string, + | { + type: "has-many"; + to: { table: string; fields: string[] }; + from: { table: string; fields: string[] }; + } + | { + type: "has-one"; + to: { table: string; fields: string[] }; + from: { table: string; fields: string[] }; + } + >; if (schema_table) { if (action === "schema_rels") { for (const col of schema_table.properties) { if ( col.type === "field" && - (!!col.array || - col.attributes && - col.attributes?.length > 0) + (!!col.array || (col.attributes && col.attributes?.length > 0)) ) { if (col.array) { - if (typeof col.fieldType === 'string') { - const target = schema.findByType('model', { name: col.fieldType }) + if (typeof col.fieldType === "string") { + const target = schema.findByType("model", { + name: col.fieldType, + }); if (target) { - const field = target.properties.find(e => { - if (e.type === 'field' - && e.fieldType === table) { + const field = target.properties.find((e) => { + if (e.type === "field" && e.fieldType === table) { return true; } }); - if (field && field.type === 'field') { - const rel = field.attributes?.find(e => e.kind === 'field'); + if (field && field.type === "field") { + const rel = field.attributes?.find( + (e) => e.kind === "field" + ); if (rel && rel.args) { - const { field, ref } = getFieldAndRef(rel, target, table); + const { field, ref } = getFieldAndRef( + rel, + target, + table + ); if (target && ref) { rels[col.name] = { - type: 'has-many', + type: "has-many", to: field, - from: ref - } + from: ref, + }; } - } } } } } else if (col.attributes) { - const rel = col.attributes.find(e => e.type === 'attribute' && e.name === 'relation'); - if (rel && typeof col.fieldType === 'string') { - const target = schema.findByType('model', { name: col.fieldType }); + const rel = col.attributes.find( + (e) => e.type === "attribute" && e.name === "relation" + ); + if (rel && typeof col.fieldType === "string") { + const target = schema.findByType("model", { + name: col.fieldType, + }); const { field, ref } = getFieldAndRef(rel, target, table); rels[col.name] = { - type: 'has-one', + type: "has-one", to: { table: field.table, - fields: ref.fields + fields: ref.fields, }, from: { table: ref.table, - fields: field.fields - } - } + fields: field.fields, + }, + }; } } } @@ -108,10 +149,14 @@ export const execQuery = async (args: DBArg, prisma: any) => { col.attributes && col.attributes?.length > 0 ) { - const attr = col.attributes.find(e => e.name !== 'id' && e.name !== 'default'); + const attr = col.attributes.find( + (e) => e.name !== "id" && e.name !== "default" + ); - const default_val = col.attributes.find(e => e.name === 'default'); - const is_pk = col.attributes.find(e => e.name === 'id'); + const default_val = col.attributes.find( + (e) => e.name === "default" + ); + const is_pk = col.attributes.find((e) => e.name === "id"); if (attr && attr.name !== "relation") { let type = "String"; @@ -122,7 +167,7 @@ export const execQuery = async (args: DBArg, prisma: any) => { type: type.toLowerCase(), optional: !!col.optional, db_type: attr.name.toLowerCase(), - default: default_val + default: default_val, }; } } @@ -165,27 +210,29 @@ export const execQuery = async (args: DBArg, prisma: any) => { }; const getFieldAndRef = (rel: any, target: any, table: string) => { - let field = null as unknown as { table: string, fields: string[] }; - let ref = null as unknown as { table: string, fields: string[] }; + let field = null as unknown as { table: string; fields: string[] }; + let ref = null as unknown as { table: string; fields: string[] }; for (const e of rel.args) { - if (typeof e.value === 'object' - && !Array.isArray(e.value) - && e.value.type === 'keyValue' - && typeof e.value.value === 'object' - && !Array.isArray(e.value.value) - && e.value.value.type === 'array') { - if (e.value.key === 'fields') { + if ( + typeof e.value === "object" && + !Array.isArray(e.value) && + e.value.type === "keyValue" && + typeof e.value.value === "object" && + !Array.isArray(e.value.value) && + e.value.value.type === "array" + ) { + if (e.value.key === "fields") { field = { table: target.name, - fields: e.value.value.args - } - } else if (e.value.key === 'references') { + fields: e.value.value.args, + }; + } else if (e.value.key === "references") { ref = { table: table, - fields: e.value.value.args - } + fields: e.value.value.args, + }; } } } return { field, ref }; -} \ No newline at end of file +};