prostgles-server 4.2.662 → 4.2.664
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Audit/AuditTable.d.ts +1 -1
- package/dist/DboBuilder/DboBuilder.d.ts +7 -6
- package/dist/DboBuilder/DboBuilder.d.ts.map +1 -1
- package/dist/DboBuilder/DboBuilder.js +13 -10
- package/dist/DboBuilder/DboBuilder.js.map +1 -1
- package/dist/ExecutionContext.d.ts +12 -1
- package/dist/ExecutionContext.d.ts.map +1 -1
- package/dist/ExecutionContext.js +22 -3
- package/dist/ExecutionContext.js.map +1 -1
- package/dist/Jobs/JobManager.d.ts +0 -1
- package/dist/Jobs/JobManager.d.ts.map +1 -1
- package/dist/Jobs/JobManager.js +10 -56
- package/dist/Jobs/JobManager.js.map +1 -1
- package/dist/Jobs/JobTypes.d.ts +22 -11
- package/dist/Jobs/JobTypes.d.ts.map +1 -1
- package/dist/Jobs/JobTypes.js +6 -1
- package/dist/Jobs/JobTypes.js.map +1 -1
- package/dist/Jobs/claimJob.d.ts +7 -6
- package/dist/Jobs/claimJob.d.ts.map +1 -1
- package/dist/Jobs/claimJob.js +9 -7
- package/dist/Jobs/claimJob.js.map +1 -1
- package/dist/Jobs/controlJob.d.ts +8 -0
- package/dist/Jobs/controlJob.d.ts.map +1 -0
- package/dist/Jobs/controlJob.js +97 -0
- package/dist/Jobs/controlJob.js.map +1 -0
- package/dist/Jobs/createJobControlFunctionDefiner.d.ts +49 -0
- package/dist/Jobs/createJobControlFunctionDefiner.d.ts.map +1 -0
- package/dist/Jobs/createJobControlFunctionDefiner.js +24 -0
- package/dist/Jobs/createJobControlFunctionDefiner.js.map +1 -0
- package/dist/Jobs/createJobsAPI.d.ts +4 -0
- package/dist/Jobs/createJobsAPI.d.ts.map +1 -0
- package/dist/Jobs/createJobsAPI.js +92 -0
- package/dist/Jobs/createJobsAPI.js.map +1 -0
- package/dist/Jobs/enqueueJob.d.ts +2 -2
- package/dist/Jobs/enqueueJob.d.ts.map +1 -1
- package/dist/Jobs/enqueueJob.js +21 -24
- package/dist/Jobs/enqueueJob.js.map +1 -1
- package/dist/Jobs/getJobControlBinding.d.ts +5 -0
- package/dist/Jobs/getJobControlBinding.d.ts.map +1 -0
- package/dist/Jobs/getJobControlBinding.js +33 -0
- package/dist/Jobs/getJobControlBinding.js.map +1 -0
- package/dist/Jobs/getJobTableHooks.js +5 -5
- package/dist/Jobs/getJobTableHooks.js.map +1 -1
- package/dist/Jobs/jobTableConfig.d.ts +22 -8
- package/dist/Jobs/jobTableConfig.d.ts.map +1 -1
- package/dist/Jobs/jobTableConfig.js +9 -4
- package/dist/Jobs/jobTableConfig.js.map +1 -1
- package/dist/Jobs/jobUtils.d.ts +1 -1
- package/dist/Jobs/jobUtils.d.ts.map +1 -1
- package/dist/Jobs/jobUtils.js +2 -1
- package/dist/Jobs/jobUtils.js.map +1 -1
- package/dist/Jobs/runJob.d.ts.map +1 -1
- package/dist/Jobs/runJob.js +21 -15
- package/dist/Jobs/runJob.js.map +1 -1
- package/dist/PublishParser/defineServerFunction.d.ts +2 -1
- package/dist/PublishParser/defineServerFunction.d.ts.map +1 -1
- package/dist/PublishParser/defineServerFunction.js.map +1 -1
- package/dist/WebsocketAPI/getClientHandlers.js +4 -4
- package/dist/WebsocketAPI/getClientHandlers.js.map +1 -1
- package/dist/WebsocketAPI/getClientSchema.d.ts.map +1 -1
- package/dist/WebsocketAPI/getClientSchema.js +3 -2
- package/dist/WebsocketAPI/getClientSchema.js.map +1 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claimJob.js","sourceRoot":"","sources":["../../lib/Jobs/claimJob.ts"],"names":[],"mappings":";;;AAAA,6CAAyC;AAGzC,6DAA0D;AAEnD,MAAM,QAAQ,GAAG,KAAK,EAAE,SAAoB,EAAE,IAAY,EAAE,WAAmB,EAAE,EAAE;IACxF,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC;IACzC,OAAO,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE;QACjD,MAAM,IAAI,GAAG,IAAA,uCAAkB,EAAC,SAAS,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;QACvD,MAAM,CAAC,CAAC,GAAG,CAAC,
|
|
1
|
+
{"version":3,"file":"claimJob.js","sourceRoot":"","sources":["../../lib/Jobs/claimJob.ts"],"names":[],"mappings":";;;AAAA,6CAAyC;AAGzC,6DAA0D;AAEnD,MAAM,QAAQ,GAAG,KAAK,EAAE,SAAoB,EAAE,IAAY,EAAE,WAAmB,EAAE,EAAE;IACxF,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC;IACzC,OAAO,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE;QACjD,MAAM,IAAI,GAAG,IAAA,uCAAkB,EAAC,SAAS,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;QACvD,MAAM,CAAC,CAAC,GAAG,CAAC,uEAAuE,EAAE;YACnF,eAAe,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;SAClD,CAAC,CAAC;QACH,MAAM,CAAC,CAAC,IAAI,CACV,UAAU,QAAQ;;;;+FAIuE,EACzF,EAAE,OAAO,EAAE,IAAI,EAAE,CAClB,CAAC;QACF,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;QACtE,IAAI,CAAC,KAAK,IAAI,WAAW;YAAE,OAAO;QAClC,OAAO,CAAC,CAAC,SAAS,CAChB;;2BAEqB,QAAQ;;;4BAGP,QAAQ;;;;;;;eAOrB,QAAQ;;;KAGlB,EACC,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,IAAA,wBAAU,GAAE,EAAE,CAC5C,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AArCW,QAAA,QAAQ,YAqCnB"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type AnyObject } from "prostgles-types";
|
|
2
|
+
import type { Prostgles } from "../Prostgles";
|
|
3
|
+
import type { AuthClientRequest } from "../Auth/AuthTypes";
|
|
4
|
+
import type { JobControlOptions, JobTransaction } from "./JobTypes";
|
|
5
|
+
export declare const controlJob: <S, Row extends AnyObject>(prostgles: Prostgles, transaction: JobTransaction, clientReq: AuthClientRequest, name: string, options: JobControlOptions<S, Row>) => Promise<{
|
|
6
|
+
jobId: string;
|
|
7
|
+
}>;
|
|
8
|
+
//# sourceMappingURL=controlJob.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"controlJob.d.ts","sourceRoot":"","sources":["../../lib/Jobs/controlJob.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6B,KAAK,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAG5E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAK3D,OAAO,KAAK,EAAE,iBAAiB,EAAa,cAAc,EAAE,MAAM,YAAY,CAAC;AAG/E,eAAO,MAAM,UAAU,GAAU,CAAC,EAAE,GAAG,SAAS,SAAS,EACvD,WAAW,SAAS,EACpB,aAAa,cAAc,EAC3B,WAAW,iBAAiB,EAC5B,MAAM,MAAM,EACZ,SAAS,iBAAiB,CAAC,CAAC,EAAE,GAAG,CAAC;;EAyGnC,CAAC"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.controlJob = void 0;
|
|
4
|
+
const prostgles_types_1 = require("prostgles-types");
|
|
5
|
+
const ExecutionContext_1 = require("../ExecutionContext");
|
|
6
|
+
const runClientRequest_1 = require("../runClientRequest");
|
|
7
|
+
const enqueueJob_1 = require("./enqueueJob");
|
|
8
|
+
const getJobDefinition_1 = require("./getJobDefinition");
|
|
9
|
+
const getJobTableHandler_1 = require("./getJobTableHandler");
|
|
10
|
+
const JobTypes_1 = require("./JobTypes");
|
|
11
|
+
const controlJob = async (prostgles, transaction, clientReq, name, options) => {
|
|
12
|
+
const { definition } = (0, getJobDefinition_1.getJobDefinition)(prostgles, name);
|
|
13
|
+
const { trigger } = definition;
|
|
14
|
+
if (trigger.type !== "row" || !trigger.jobIdColumn) {
|
|
15
|
+
throw new Error(`Job control requires a row job with jobIdColumn: ${name}`);
|
|
16
|
+
}
|
|
17
|
+
const findReadableRows = (filter) => runClientRequest_1.runClientRequest.call(prostgles, {
|
|
18
|
+
tableName: trigger.table,
|
|
19
|
+
command: "find",
|
|
20
|
+
param1: filter,
|
|
21
|
+
param2: { limit: 1 },
|
|
22
|
+
param3: undefined,
|
|
23
|
+
}, clientReq, undefined, transaction.dbx);
|
|
24
|
+
const rowTable = transaction.dbx[trigger.table];
|
|
25
|
+
const primaryKeys = rowTable.columns
|
|
26
|
+
.filter((column) => column.is_pkey)
|
|
27
|
+
.map((column) => column.name);
|
|
28
|
+
if (!primaryKeys.length || !primaryKeys.every((key) => options.row[key] !== undefined)) {
|
|
29
|
+
throw new Error("Job row primary key is unavailable");
|
|
30
|
+
}
|
|
31
|
+
const filter = Object.fromEntries(primaryKeys.map((key) => [key, { $eq: options.row[key] }]));
|
|
32
|
+
const rows = await findReadableRows(filter);
|
|
33
|
+
if (rows.length !== 1) {
|
|
34
|
+
throw new Error("Job lookup must reference one readable row");
|
|
35
|
+
}
|
|
36
|
+
const targetRowPkey = (0, prostgles_types_1.pickKeys)(rows[0], primaryKeys);
|
|
37
|
+
if (!primaryKeys.every((key) => key in targetRowPkey)) {
|
|
38
|
+
throw new Error("Job row primary key is unavailable");
|
|
39
|
+
}
|
|
40
|
+
const sourceRow = await rowTable.findOne({ $and: [targetRowPkey, filter] });
|
|
41
|
+
if (!sourceRow) {
|
|
42
|
+
throw new Error("Job row is unavailable");
|
|
43
|
+
}
|
|
44
|
+
const jobIdColumn = trigger.jobIdColumn;
|
|
45
|
+
const previousJobId = sourceRow[jobIdColumn];
|
|
46
|
+
return (0, ExecutionContext_1.runJobControl)(rowTable, targetRowPkey, { jobName: name, operation: options.operation }, async () => {
|
|
47
|
+
// A competing control or row trigger changes the link before this claim can commit.
|
|
48
|
+
const row = await rowTable.findOne({ $and: [targetRowPkey, filter, { [jobIdColumn]: previousJobId }] }, { forUpdate: true });
|
|
49
|
+
if (!row) {
|
|
50
|
+
throw new Error("Job row changed; retry the operation");
|
|
51
|
+
}
|
|
52
|
+
// Recheck publish filters after the claim, including changes made in this transaction.
|
|
53
|
+
if ((await findReadableRows({ $and: [targetRowPkey, filter] })).length !== 1) {
|
|
54
|
+
throw new Error("Job row is no longer readable");
|
|
55
|
+
}
|
|
56
|
+
const dbx = transaction.dbx;
|
|
57
|
+
const job = previousJobId ?
|
|
58
|
+
await (0, getJobTableHandler_1.getJobTableHandler)(prostgles, transaction).findOne({ id: previousJobId })
|
|
59
|
+
: undefined;
|
|
60
|
+
if (previousJobId &&
|
|
61
|
+
(!job ||
|
|
62
|
+
job.job_name !== name ||
|
|
63
|
+
job.target_table !== trigger.table ||
|
|
64
|
+
(0, prostgles_types_1.stableStringify)(job.target_row_pkey) !== (0, prostgles_types_1.stableStringify)(targetRowPkey))) {
|
|
65
|
+
throw new Error("Linked job does not match the target row");
|
|
66
|
+
}
|
|
67
|
+
if (job && !JobTypes_1.jobControlStatuses[options.operation].includes(job.status)) {
|
|
68
|
+
throw new Error(`Job control is not allowed while the job is ${job.status}`);
|
|
69
|
+
}
|
|
70
|
+
if (!job && options.operation !== "startOrRetry") {
|
|
71
|
+
throw new Error("Job has not started");
|
|
72
|
+
}
|
|
73
|
+
await options.run?.(row, dbx);
|
|
74
|
+
if (!(await rowTable.findOne({ $and: [targetRowPkey, { [jobIdColumn]: previousJobId }] }))) {
|
|
75
|
+
throw new Error("Job control must preserve the target row and job link");
|
|
76
|
+
}
|
|
77
|
+
if (options.operation === "cancel") {
|
|
78
|
+
await prostgles.jobs.api.withTransaction(transaction.dbx).cancel(job.id);
|
|
79
|
+
return { jobId: job.id };
|
|
80
|
+
}
|
|
81
|
+
if (!job &&
|
|
82
|
+
trigger.when &&
|
|
83
|
+
!(await rowTable.findOne({ $and: [targetRowPkey, trigger.when] }))) {
|
|
84
|
+
throw new Error("Job row does not satisfy its trigger condition");
|
|
85
|
+
}
|
|
86
|
+
const { jobId, targetRow } = await (0, enqueueJob_1.enqueueJob)(prostgles, transaction, name, targetRowPkey, {
|
|
87
|
+
userId: prostgles.getExecution()?.user?.id,
|
|
88
|
+
reason: job ? "rerun" : "trigger",
|
|
89
|
+
params: job?.params,
|
|
90
|
+
});
|
|
91
|
+
if (!targetRow)
|
|
92
|
+
throw new Error("Job row is unavailable");
|
|
93
|
+
return { jobId };
|
|
94
|
+
});
|
|
95
|
+
};
|
|
96
|
+
exports.controlJob = controlJob;
|
|
97
|
+
//# sourceMappingURL=controlJob.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"controlJob.js","sourceRoot":"","sources":["../../lib/Jobs/controlJob.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { AnyObject, MaybePromise } from "prostgles-types";
|
|
2
|
+
import type { SessionUser } from "../Auth/AuthTypes";
|
|
3
|
+
import type { DBTableHandlersFromSchema } from "../DBSchemaBuilder/DBSchemaBuilder";
|
|
4
|
+
import type { ServerFunctionContextMarker, UnrestrictedFunctionContext } from "../PublishParser/defineServerFunction";
|
|
5
|
+
import type { JobControlOperation, JobsConfig } from "./JobTypes";
|
|
6
|
+
/** Bind controls to configured jobs. Published-function access and row read access are required. */
|
|
7
|
+
export declare const createJobControlFunctionDefiner: <S = void, Context = undefined, SUser extends SessionUser = SessionUser>() => <Definitions extends JobsConfig<S, Context>>(jobs: Definitions) => <Name extends RowJobName<Definitions>>(definition: {
|
|
8
|
+
jobName: Name;
|
|
9
|
+
operation: JobControlOperation;
|
|
10
|
+
description?: string;
|
|
11
|
+
/** Validate and prepare the locked row before the operation. Throw to roll back everything. */
|
|
12
|
+
run?: (context: JobControlFunctionContext<S, SUser, Context, JobRow<Definitions, Name>>) => MaybePromise<void>;
|
|
13
|
+
}) => {
|
|
14
|
+
input: {
|
|
15
|
+
row: {
|
|
16
|
+
type: "RowLookup";
|
|
17
|
+
table: ((S extends import("prostgles-types").DBSchema ? keyof S & string : string) & undefined) | ((S extends import("prostgles-types").DBSchema ? keyof S & string : string) & string);
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
description: string | undefined;
|
|
21
|
+
unrestrictedDbAccess: true;
|
|
22
|
+
jobControl: {
|
|
23
|
+
jobName: Name;
|
|
24
|
+
rowArg: "row";
|
|
25
|
+
operation: JobControlOperation;
|
|
26
|
+
};
|
|
27
|
+
run: (input: {
|
|
28
|
+
row: AnyObject;
|
|
29
|
+
}, context: UnrestrictedFunctionContext<S, SUser, Context>) => Promise<{
|
|
30
|
+
jobId: string;
|
|
31
|
+
}>;
|
|
32
|
+
} & ServerFunctionContextMarker<S, SUser, Context>;
|
|
33
|
+
type RowJobName<Definitions> = {
|
|
34
|
+
[Name in keyof Definitions]: Definitions[Name] extends {
|
|
35
|
+
trigger: {
|
|
36
|
+
type: "row";
|
|
37
|
+
};
|
|
38
|
+
} ? Name : never;
|
|
39
|
+
}[keyof Definitions] & string;
|
|
40
|
+
type JobRow<Definitions extends Record<string, {
|
|
41
|
+
run: (...args: any[]) => unknown;
|
|
42
|
+
}>, Name extends keyof Definitions> = NonNullable<Parameters<Definitions[Name]["run"]>[0]["row"]>;
|
|
43
|
+
type JobControlFunctionContext<S, SUser extends SessionUser, Context, Row> = Omit<UnrestrictedFunctionContext<S, SUser, Context>, "dbo" | "db" | "sql"> & {
|
|
44
|
+
row: Row;
|
|
45
|
+
/** Transactional handlers for validation and preparation writes. */
|
|
46
|
+
dbx: DBTableHandlersFromSchema<S>;
|
|
47
|
+
};
|
|
48
|
+
export {};
|
|
49
|
+
//# sourceMappingURL=createJobControlFunctionDefiner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createJobControlFunctionDefiner.d.ts","sourceRoot":"","sources":["../../lib/Jobs/createJobControlFunctionDefiner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,oCAAoC,CAAC;AACpF,OAAO,KAAK,EACV,2BAA2B,EAC3B,2BAA2B,EAC5B,MAAM,uCAAuC,CAAC;AAC/C,OAAO,KAAK,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAElE,oGAAoG;AACpG,eAAO,MAAM,+BAA+B,GACzC,CAAC,GAAG,IAAI,EAAE,OAAO,GAAG,SAAS,EAAE,KAAK,SAAS,WAAW,GAAG,WAAW,QACtE,WAAW,SAAS,UAAU,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,MAAM,WAAW,MAC7D,IAAI,SAAS,UAAU,CAAC,WAAW,CAAC,EAAE,YAAY;IACjD,OAAO,EAAE,IAAI,CAAC;IACd,SAAS,EAAE,mBAAmB,CAAC;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+FAA+F;IAC/F,GAAG,CAAC,EAAE,CACJ,OAAO,EAAE,yBAAyB,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,KAC7E,YAAY,CAAC,IAAI,CAAC,CAAC;CACzB,KAkB8B;;;;;;;;;;;;;;iBARd;QAAE,GAAG,EAAE,SAAS,CAAA;KAAE,WAAW,2BAA2B,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC;;;IASxF,2BAA2B,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAChD,CAAC;AAEJ,KAAK,UAAU,CAAC,WAAW,IAAI;KAC5B,IAAI,IAAI,MAAM,WAAW,GAAG,WAAW,CAAC,IAAI,CAAC,SAAS;QAAE,OAAO,EAAE;YAAE,IAAI,EAAE,KAAK,CAAA;SAAE,CAAA;KAAE,GAAG,IAAI,GACxF,KAAK;CACR,CAAC,MAAM,WAAW,CAAC,GAClB,MAAM,CAAC;AAET,KAAK,MAAM,CACT,WAAW,SAAS,MAAM,CAAC,MAAM,EAAE;IAAE,GAAG,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAA;CAAE,CAAC,EACxE,IAAI,SAAS,MAAM,WAAW,IAC5B,WAAW,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;AAEhE,KAAK,yBAAyB,CAAC,CAAC,EAAE,KAAK,SAAS,WAAW,EAAE,OAAO,EAAE,GAAG,IAAI,IAAI,CAC/E,2BAA2B,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,EAC9C,KAAK,GAAG,IAAI,GAAG,KAAK,CACrB,GAAG;IACF,GAAG,EAAE,GAAG,CAAC;IACT,oEAAoE;IACpE,GAAG,EAAE,yBAAyB,CAAC,CAAC,CAAC,CAAC;CACnC,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createJobControlFunctionDefiner = void 0;
|
|
4
|
+
/** Bind controls to configured jobs. Published-function access and row read access are required. */
|
|
5
|
+
const createJobControlFunctionDefiner = () => (jobs) => (definition) => {
|
|
6
|
+
const { jobName, operation, description, run } = definition;
|
|
7
|
+
const trigger = jobs[jobName].trigger;
|
|
8
|
+
if (trigger.type !== "row" || !trigger.jobIdColumn)
|
|
9
|
+
throw new Error(`Job control requires a row job with jobIdColumn: ${jobName}`);
|
|
10
|
+
const functionDefinition = {
|
|
11
|
+
input: { row: { type: "RowLookup", table: trigger.table } },
|
|
12
|
+
description,
|
|
13
|
+
unrestrictedDbAccess: true,
|
|
14
|
+
jobControl: { jobName, rowArg: "row", operation },
|
|
15
|
+
run: (input, context) => context.jobs.control(jobName, {
|
|
16
|
+
row: input.row,
|
|
17
|
+
operation,
|
|
18
|
+
run: run && ((row, dbx) => run({ ...context, row, dbx, jobs: context.jobs.withTransaction(dbx) })),
|
|
19
|
+
}),
|
|
20
|
+
};
|
|
21
|
+
return functionDefinition;
|
|
22
|
+
};
|
|
23
|
+
exports.createJobControlFunctionDefiner = createJobControlFunctionDefiner;
|
|
24
|
+
//# sourceMappingURL=createJobControlFunctionDefiner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createJobControlFunctionDefiner.js","sourceRoot":"","sources":["../../lib/Jobs/createJobControlFunctionDefiner.ts"],"names":[],"mappings":";;;AASA,oGAAoG;AAC7F,MAAM,+BAA+B,GAC1C,GAA2E,EAAE,CAC7E,CAA6C,IAAiB,EAAE,EAAE,CAClE,CAAuC,UAQtC,EAAE,EAAE;IACH,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,EAAE,GAAG,UAAU,CAAC;IAC5D,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAE,CAAC,OAAO,CAAC;IACvC,IAAI,OAAO,CAAC,IAAI,KAAK,KAAK,IAAI,CAAC,OAAO,CAAC,WAAW;QAChD,MAAM,IAAI,KAAK,CAAC,oDAAoD,OAAO,EAAE,CAAC,CAAC;IACjF,MAAM,kBAAkB,GAAG;QACzB,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,WAAoB,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,EAAE;QACpE,WAAW;QACX,oBAAoB,EAAE,IAAa;QACnC,UAAU,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,KAAc,EAAE,SAAS,EAAE;QAC1D,GAAG,EAAE,CAAC,KAAyB,EAAE,OAAuD,EAAE,EAAE,CAC1F,OAAO,CAAC,IAAI,CAAC,OAAO,CAA+B,OAAO,EAAE;YAC1D,GAAG,EAAE,KAAK,CAAC,GAAG;YACd,SAAS;YACT,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CACxB,GAAG,CAAC,EAAE,GAAG,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;SAC1E,CAAC;KACL,CAAC;IACF,OAAO,kBACyC,CAAC;AACnD,CAAC,CAAC;AA/BS,QAAA,+BAA+B,mCA+BxC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createJobsAPI.d.ts","sourceRoot":"","sources":["../../lib/Jobs/createJobsAPI.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAK9C,OAAO,KAAK,EAAa,IAAI,EAAkB,MAAM,YAAY,CAAC;AAElE,eAAO,MAAM,aAAa,GAAI,WAAW,SAAS,EAAE,KAAK,MAAM,GAAG,SAAS,KAAG,IAsF7E,CAAC"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createJobsAPI = void 0;
|
|
4
|
+
const serverSideRequest_1 = require("../Auth/utils/serverSideRequest");
|
|
5
|
+
const ExecutionContext_1 = require("../ExecutionContext");
|
|
6
|
+
const runClientRequest_1 = require("../runClientRequest");
|
|
7
|
+
const controlJob_1 = require("./controlJob");
|
|
8
|
+
const enqueueJob_1 = require("./enqueueJob");
|
|
9
|
+
const getJobTableHandler_1 = require("./getJobTableHandler");
|
|
10
|
+
const createJobsAPI = (prostgles, dbx) => {
|
|
11
|
+
const runInTransaction = async (callback) => {
|
|
12
|
+
prostgles.checkNotDestroyed();
|
|
13
|
+
const builder = prostgles.dboBuilder;
|
|
14
|
+
if (!dbx)
|
|
15
|
+
return builder.getTX((dbx, t) => callback({ dbx, t }));
|
|
16
|
+
const { dbTX, t } = builder.getTransactionForHandlers(dbx);
|
|
17
|
+
try {
|
|
18
|
+
return await callback({ dbx: dbTX, t });
|
|
19
|
+
}
|
|
20
|
+
catch (error) {
|
|
21
|
+
builder.failTransaction(t, error);
|
|
22
|
+
throw error;
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
return {
|
|
26
|
+
withTransaction: (dbx) => {
|
|
27
|
+
prostgles.dboBuilder.getTransactionForHandlers(dbx);
|
|
28
|
+
return (0, exports.createJobsAPI)(prostgles, dbx);
|
|
29
|
+
},
|
|
30
|
+
get: async (id, options) => {
|
|
31
|
+
const read = async (transaction) => {
|
|
32
|
+
const clientReq = getClientRequest(prostgles, options?.userId);
|
|
33
|
+
if (!clientReq)
|
|
34
|
+
return (0, getJobTableHandler_1.getJobTableHandler)(prostgles, transaction).findOne({ id });
|
|
35
|
+
return runClientRequest_1.runClientRequest.call(prostgles, {
|
|
36
|
+
tableName: prostgles.jobs.tableName,
|
|
37
|
+
command: "findOne",
|
|
38
|
+
param1: { id },
|
|
39
|
+
param2: undefined,
|
|
40
|
+
param3: undefined,
|
|
41
|
+
}, clientReq, undefined, transaction?.dbx);
|
|
42
|
+
};
|
|
43
|
+
return dbx ? runInTransaction(read) : read(undefined);
|
|
44
|
+
},
|
|
45
|
+
cancel: (id) => runInTransaction(async (transaction) => {
|
|
46
|
+
const job = await (0, getJobTableHandler_1.getJobTableHandler)(prostgles, transaction).findOne({ id });
|
|
47
|
+
if (!job)
|
|
48
|
+
throw new Error("Job not found");
|
|
49
|
+
await transaction.t.none(`UPDATE ${prostgles.jobs.tableSQL}
|
|
50
|
+
SET
|
|
51
|
+
cancel_requested = TRUE,
|
|
52
|
+
status = CASE WHEN status = 'pending' THEN 'cancelled' ELSE status END,
|
|
53
|
+
finished_at = CASE WHEN status = 'pending' THEN clock_timestamp() ELSE finished_at END
|
|
54
|
+
WHERE id = \${jobId}
|
|
55
|
+
AND status IN ('pending', 'running')`, { jobId: id });
|
|
56
|
+
}),
|
|
57
|
+
rerun: (id, params = {}, options) => runInTransaction(async (transaction) => {
|
|
58
|
+
const clientReq = getClientRequest(prostgles, options?.userId);
|
|
59
|
+
const userId = clientReq ?
|
|
60
|
+
(await prostgles.publishParser.getPublishParams(clientReq, undefined)).user?.id
|
|
61
|
+
: undefined;
|
|
62
|
+
const job = await (0, getJobTableHandler_1.getJobTableHandler)(prostgles, transaction).findOne({ id });
|
|
63
|
+
if (!job)
|
|
64
|
+
throw new Error("Job not found");
|
|
65
|
+
const enqueue = () => (0, enqueueJob_1.enqueueJob)(prostgles, transaction, job.job_name, job.target_row_pkey, {
|
|
66
|
+
params: { ...job.params, ...params },
|
|
67
|
+
reason: "rerun",
|
|
68
|
+
userId,
|
|
69
|
+
});
|
|
70
|
+
const { jobId } = await (job.target_table ?
|
|
71
|
+
(0, ExecutionContext_1.runJobControl)(transaction.dbx[job.target_table], job.target_row_pkey, { jobName: job.job_name, operation: "rerun" }, enqueue)
|
|
72
|
+
: enqueue());
|
|
73
|
+
return { jobId };
|
|
74
|
+
}),
|
|
75
|
+
control: (name, options) => runInTransaction((transaction) => {
|
|
76
|
+
const clientReq = getClientRequest(prostgles, undefined);
|
|
77
|
+
if (!clientReq)
|
|
78
|
+
throw new Error("Job control requires a user");
|
|
79
|
+
return (0, controlJob_1.controlJob)(prostgles, transaction, clientReq, name, options);
|
|
80
|
+
}),
|
|
81
|
+
};
|
|
82
|
+
};
|
|
83
|
+
exports.createJobsAPI = createJobsAPI;
|
|
84
|
+
const getClientRequest = (prostgles, userId) => {
|
|
85
|
+
const execution = prostgles.getExecution();
|
|
86
|
+
if (userId !== undefined)
|
|
87
|
+
return (0, serverSideRequest_1.createServerSideRequest)(prostgles, userId);
|
|
88
|
+
if (execution?.clientReq)
|
|
89
|
+
return execution.clientReq;
|
|
90
|
+
return execution?.user ? (0, serverSideRequest_1.createServerSideRequest)(prostgles, execution.user.id) : undefined;
|
|
91
|
+
};
|
|
92
|
+
//# sourceMappingURL=createJobsAPI.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createJobsAPI.js","sourceRoot":"","sources":["../../lib/Jobs/createJobsAPI.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import type { Prostgles } from "../Prostgles";
|
|
2
2
|
import type { JobRecord, JobTransaction } from "./JobTypes";
|
|
3
3
|
/** Called only by configured triggers and reruns, inside their originating transaction. */
|
|
4
|
-
export declare const enqueueJob: (prostgles: Prostgles, transaction: JobTransaction, name: string,
|
|
4
|
+
export declare const enqueueJob: (prostgles: Prostgles, transaction: JobTransaction, name: string, targetRowPkey: JobRecord["target_row_pkey"], options?: {
|
|
5
5
|
userId?: string;
|
|
6
6
|
params?: Record<string, unknown>;
|
|
7
7
|
reason?: "trigger" | "rerun";
|
|
8
8
|
occurrence?: Date;
|
|
9
9
|
}) => Promise<{
|
|
10
10
|
jobId: string;
|
|
11
|
-
|
|
11
|
+
targetRow: import("prostgles-types").AnyObject | undefined;
|
|
12
12
|
}>;
|
|
13
13
|
//# sourceMappingURL=enqueueJob.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"enqueueJob.d.ts","sourceRoot":"","sources":["../../lib/Jobs/enqueueJob.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9C,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"enqueueJob.d.ts","sourceRoot":"","sources":["../../lib/Jobs/enqueueJob.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9C,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAI5D,2FAA2F;AAC3F,eAAO,MAAM,UAAU,GACrB,WAAW,SAAS,EACpB,aAAa,cAAc,EAC3B,MAAM,MAAM,EACZ,eAAe,SAAS,CAAC,iBAAiB,CAAC,EAC3C,UAAS;IACP,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,MAAM,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC;IAC7B,UAAU,CAAC,EAAE,IAAI,CAAC;CACd;;;EAuFP,CAAC"}
|
package/dist/Jobs/enqueueJob.js
CHANGED
|
@@ -6,9 +6,8 @@ const node_crypto_1 = require("node:crypto");
|
|
|
6
6
|
const getJobDefinition_1 = require("./getJobDefinition");
|
|
7
7
|
const getJobTableHandler_1 = require("./getJobTableHandler");
|
|
8
8
|
const getJobParams_1 = require("./getJobParams");
|
|
9
|
-
const ExecutionContext_1 = require("../ExecutionContext");
|
|
10
9
|
/** Called only by configured triggers and reruns, inside their originating transaction. */
|
|
11
|
-
const enqueueJob = async (prostgles, transaction, name,
|
|
10
|
+
const enqueueJob = async (prostgles, transaction, name, targetRowPkey, options = {}) => {
|
|
12
11
|
const { definition } = (0, getJobDefinition_1.getJobDefinition)(prostgles, name);
|
|
13
12
|
if (definition.runAs === "user" && !options.userId) {
|
|
14
13
|
throw new Error(`User job ${name} requires a user`);
|
|
@@ -19,40 +18,38 @@ const enqueueJob = async (prostgles, transaction, name, owner, options = {}) =>
|
|
|
19
18
|
const tableSQL = prostgles.jobs.tableSQL;
|
|
20
19
|
const jobIdColumn = definition.trigger.type === "row" ? definition.trigger.jobIdColumn : undefined;
|
|
21
20
|
const rowTable = jobIdColumn !== undefined && table !== null ? transaction.dbx[table] : undefined;
|
|
22
|
-
const
|
|
23
|
-
{ id:
|
|
21
|
+
const targetRowFilter = table !== null && prostgles.isMedia(table) ?
|
|
22
|
+
{ id: targetRowPkey.id }
|
|
24
23
|
: {
|
|
25
|
-
$and: Object.entries(
|
|
24
|
+
$and: Object.entries(targetRowPkey).map(([column, value]) => ({
|
|
25
|
+
[column]: { $eq: value },
|
|
26
|
+
})),
|
|
26
27
|
};
|
|
27
28
|
if (rowTable && options.reason === "rerun") {
|
|
28
|
-
// Match row-trigger lock ordering: the
|
|
29
|
-
await rowTable.find(
|
|
29
|
+
// Match row-trigger lock ordering: the target row before the job advisory lock.
|
|
30
|
+
await rowTable.find(targetRowFilter, { select: "", limit: null, forUpdate: true });
|
|
30
31
|
}
|
|
31
32
|
const setJobId = async (jobId) => {
|
|
32
33
|
if (!rowTable || jobIdColumn === undefined)
|
|
33
|
-
return { jobId,
|
|
34
|
-
const
|
|
35
|
-
|
|
36
|
-
const ownerRow = options.reason === "rerun" ?
|
|
37
|
-
await (0, ExecutionContext_1.runTableHook)(rowTable, [owner], updateOwner, { hookKey: `job:${name}` })
|
|
38
|
-
: await updateOwner();
|
|
39
|
-
return { jobId, ownerRow: ownerRow || undefined };
|
|
34
|
+
return { jobId, targetRow: undefined };
|
|
35
|
+
const targetRow = await rowTable.update(targetRowFilter, { [jobIdColumn]: jobId }, { returning: "*", multi: false });
|
|
36
|
+
return { jobId, targetRow: targetRow || undefined };
|
|
40
37
|
};
|
|
41
38
|
// Serialize conflicts for this row without serializing writes to unrelated rows.
|
|
42
|
-
await transaction.t.one("SELECT pg_advisory_xact_lock(hashtextextended($
|
|
43
|
-
(0, prostgles_types_1.stableStringify)([tableSQL, name, table,
|
|
44
|
-
|
|
39
|
+
await transaction.t.one("SELECT pg_advisory_xact_lock(hashtextextended(${advisoryLockKey}, 0))", {
|
|
40
|
+
advisoryLockKey: (0, prostgles_types_1.stableStringify)([tableSQL, name, table, targetRowPkey]),
|
|
41
|
+
});
|
|
45
42
|
if (options.occurrence) {
|
|
46
43
|
const existing = await jobs.findOne({
|
|
47
44
|
job_name: name,
|
|
48
45
|
occurrence: options.occurrence.toISOString(),
|
|
49
46
|
});
|
|
50
47
|
if (existing)
|
|
51
|
-
return { jobId: existing.id,
|
|
48
|
+
return { jobId: existing.id, targetRow: undefined };
|
|
52
49
|
}
|
|
53
50
|
const active = await jobs.findOne({
|
|
54
51
|
$and: [
|
|
55
|
-
{ job_name: name, target_table: table,
|
|
52
|
+
{ job_name: name, target_table: table, target_row_pkey: targetRowPkey },
|
|
56
53
|
{ $or: [{ status: "pending" }, { status: "running" }] },
|
|
57
54
|
],
|
|
58
55
|
}, { orderBy: { created_at: 1 } });
|
|
@@ -66,17 +63,17 @@ const enqueueJob = async (prostgles, transaction, name, owner, options = {}) =>
|
|
|
66
63
|
status = CASE WHEN status = 'pending' THEN 'cancelled' ELSE status END,
|
|
67
64
|
finished_at = CASE WHEN status = 'pending' THEN clock_timestamp() ELSE finished_at END
|
|
68
65
|
WHERE
|
|
69
|
-
job_name =
|
|
70
|
-
AND target_table IS NOT DISTINCT FROM
|
|
71
|
-
AND
|
|
72
|
-
AND status IN ('pending', 'running')`,
|
|
66
|
+
job_name = \${jobName}
|
|
67
|
+
AND target_table IS NOT DISTINCT FROM \${targetTable}
|
|
68
|
+
AND target_row_pkey = \${targetRowPkey:json}
|
|
69
|
+
AND status IN ('pending', 'running')`, { jobName: name, targetTable: table, targetRowPkey });
|
|
73
70
|
}
|
|
74
71
|
const jobId = (0, node_crypto_1.randomUUID)();
|
|
75
72
|
await jobs.insert({
|
|
76
73
|
id: jobId,
|
|
77
74
|
job_name: name,
|
|
78
75
|
target_table: table,
|
|
79
|
-
|
|
76
|
+
target_row_pkey: targetRowPkey,
|
|
80
77
|
params,
|
|
81
78
|
user_id: options.userId ?? null,
|
|
82
79
|
occurrence: options.occurrence?.toISOString() ?? null,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"enqueueJob.js","sourceRoot":"","sources":["../../lib/Jobs/enqueueJob.ts"],"names":[],"mappings":";;;AAAA,qDAAkD;AAClD,6CAAyC;AAEzC,yDAAsD;AAEtD,6DAA0D;AAC1D,iDAA8C;
|
|
1
|
+
{"version":3,"file":"enqueueJob.js","sourceRoot":"","sources":["../../lib/Jobs/enqueueJob.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { Prostgles } from "../Prostgles";
|
|
2
|
+
import type { ServerFunctionDefinition } from "../PublishParser/defineServerFunction";
|
|
3
|
+
import { type JobControlBinding } from "./JobTypes";
|
|
4
|
+
export declare const getJobControlBinding: (prostgles: Prostgles, method: ServerFunctionDefinition) => JobControlBinding | undefined;
|
|
5
|
+
//# sourceMappingURL=getJobControlBinding.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getJobControlBinding.d.ts","sourceRoot":"","sources":["../../lib/Jobs/getJobControlBinding.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,uCAAuC,CAAC;AAEtF,OAAO,EAAsB,KAAK,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAExE,eAAO,MAAM,oBAAoB,GAC/B,WAAW,SAAS,EACpB,QAAQ,wBAAwB,KAC/B,iBAAiB,GAAG,SA0BtB,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getJobControlBinding = void 0;
|
|
4
|
+
const getJobDefinition_1 = require("./getJobDefinition");
|
|
5
|
+
const JobTypes_1 = require("./JobTypes");
|
|
6
|
+
const getJobControlBinding = (prostgles, method) => {
|
|
7
|
+
const control = method.jobControl;
|
|
8
|
+
if (!control)
|
|
9
|
+
return;
|
|
10
|
+
const { jobName, operation } = control;
|
|
11
|
+
const { trigger } = (0, getJobDefinition_1.getJobDefinition)(prostgles, jobName).definition;
|
|
12
|
+
if (trigger.type !== "row" || !trigger.jobIdColumn) {
|
|
13
|
+
throw new Error(`Job control requires a row job with jobIdColumn: ${jobName}`);
|
|
14
|
+
}
|
|
15
|
+
const lookup = method.input?.row;
|
|
16
|
+
if (!lookup ||
|
|
17
|
+
typeof lookup === "string" ||
|
|
18
|
+
lookup.type !== "RowLookup" ||
|
|
19
|
+
lookup.table !== trigger.table) {
|
|
20
|
+
throw new Error(`Job control lookup must reference ${trigger.table}`);
|
|
21
|
+
}
|
|
22
|
+
if (!Object.hasOwn(JobTypes_1.jobControlStatuses, operation)) {
|
|
23
|
+
throw new Error(`Invalid job control operation: ${operation}`);
|
|
24
|
+
}
|
|
25
|
+
return {
|
|
26
|
+
...control,
|
|
27
|
+
tableName: prostgles.jobs.tableName,
|
|
28
|
+
columnName: trigger.jobIdColumn,
|
|
29
|
+
allowedStatuses: JobTypes_1.jobControlStatuses[operation],
|
|
30
|
+
};
|
|
31
|
+
};
|
|
32
|
+
exports.getJobControlBinding = getJobControlBinding;
|
|
33
|
+
//# sourceMappingURL=getJobControlBinding.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getJobControlBinding.js","sourceRoot":"","sources":["../../lib/Jobs/getJobControlBinding.ts"],"names":[],"mappings":";;;AAEA,yDAAsD;AACtD,yCAAwE;AAEjE,MAAM,oBAAoB,GAAG,CAClC,SAAoB,EACpB,MAAgC,EACD,EAAE;IACjC,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC;IAClC,IAAI,CAAC,OAAO;QAAE,OAAO;IACrB,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;IACvC,MAAM,EAAE,OAAO,EAAE,GAAG,IAAA,mCAAgB,EAAC,SAAS,EAAE,OAAO,CAAC,CAAC,UAAU,CAAC;IACpE,IAAI,OAAO,CAAC,IAAI,KAAK,KAAK,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;QACnD,MAAM,IAAI,KAAK,CAAC,oDAAoD,OAAO,EAAE,CAAC,CAAC;IACjF,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC;IACjC,IACE,CAAC,MAAM;QACP,OAAO,MAAM,KAAK,QAAQ;QAC1B,MAAM,CAAC,IAAI,KAAK,WAAW;QAC3B,MAAM,CAAC,KAAK,KAAK,OAAO,CAAC,KAAK,EAC9B,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,qCAAqC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;IACxE,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,6BAAkB,EAAE,SAAS,CAAC,EAAE,CAAC;QAClD,MAAM,IAAI,KAAK,CAAC,kCAAkC,SAAS,EAAE,CAAC,CAAC;IACjE,CAAC;IACD,OAAO;QACL,GAAG,OAAO;QACV,SAAS,EAAE,SAAS,CAAC,IAAI,CAAC,SAAS;QACnC,UAAU,EAAE,OAAO,CAAC,WAAW;QAC/B,eAAe,EAAE,6BAAkB,CAAC,SAAS,CAAC;KAC/C,CAAC;AACJ,CAAC,CAAC;AA7BW,QAAA,oBAAoB,wBA6B/B"}
|
|
@@ -23,18 +23,18 @@ const getJobTableHooks = (prostgles, tableHooks) => {
|
|
|
23
23
|
const primaryKeyNames = table.columns
|
|
24
24
|
.filter((column) => column.is_pkey)
|
|
25
25
|
.map((column) => column.name);
|
|
26
|
-
const
|
|
27
|
-
if (trigger.when && !(await table.findOne({ $and: [
|
|
26
|
+
const targetRowPkey = (0, prostgles_types_1.pickKeys)(row, primaryKeyNames);
|
|
27
|
+
if (trigger.when && !(await table.findOne({ $and: [targetRowPkey, trigger.when] })))
|
|
28
28
|
return;
|
|
29
|
-
const {
|
|
29
|
+
const { targetRow } = await (0, enqueueJob_1.enqueueJob)(prostgles, { t: transaction.t, dbx }, name, targetRowPkey, {
|
|
30
30
|
userId: prostgles.getExecution()?.user?.id,
|
|
31
31
|
}).catch((error) => {
|
|
32
32
|
// A caught enqueue error must not commit the originating row without its job.
|
|
33
33
|
table.dboBuilder.failTransaction(transaction.t, error);
|
|
34
34
|
throw error;
|
|
35
35
|
});
|
|
36
|
-
if (
|
|
37
|
-
Object.assign(row,
|
|
36
|
+
if (targetRow)
|
|
37
|
+
Object.assign(row, targetRow);
|
|
38
38
|
},
|
|
39
39
|
};
|
|
40
40
|
const hooks = mergedHooks[trigger.table];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getJobTableHooks.js","sourceRoot":"","sources":["../../lib/Jobs/getJobTableHooks.ts"],"names":[],"mappings":";;;AAAA,qDAA2D;AAK3D,6CAA0C;AAGnC,MAAM,gBAAgB,GAAG,CAC9B,SAAoB,EACpB,UAA6C,EAC7C,EAAE;IACF,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI;QAAE,OAAO,UAAU,CAAC;IAC5C,MAAM,WAAW,GAA0B,EAAE,GAAG,UAAU,EAAE,CAAC;IAC7D,mFAAmF;IACnF,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,CACtE,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,SAAS,CAAC,CACnE,CAAC;IACF,KAAK,MAAM,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,CAAC,IAAI,WAAW,EAAE,CAAC;QAC9C,IAAI,OAAO,CAAC,IAAI,KAAK,KAAK;YAAE,SAAS;QACrC,MAAM,IAAI,GAAG;YACX,OAAO,EAAE,OAAO,IAAI,EAAE;YACtB,QAAQ,EAAE,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAU,CAAC,CAAC,CAAC;YAChF,aAAa,EAAE,OAAO,CAAC,OAAO;YAC9B,gBAAgB,EAAE,IAAI;YACtB,QAAQ,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,WAAW,EAAE,EAAE,EAAE;gBAC5C,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,CAAE,CAAC;gBAClC,MAAM,WAAW,GAAG,KAAK,CAAC,cAAc,CAAC,WAAW,CAAE,CAAC;gBACvD,MAAM,eAAe,GAAG,KAAK,CAAC,OAAO;qBAClC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC;qBAClC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBAChC,MAAM,
|
|
1
|
+
{"version":3,"file":"getJobTableHooks.js","sourceRoot":"","sources":["../../lib/Jobs/getJobTableHooks.ts"],"names":[],"mappings":"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"}
|