@heyhru/business-dms-approval 0.7.2 → 0.8.1
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/approvals.model.d.ts +8 -1
- package/dist/approvals.model.d.ts.map +1 -1
- package/dist/approvals.service.d.ts +1 -0
- package/dist/approvals.service.d.ts.map +1 -1
- package/dist/approvals.sql.d.ts +1 -1
- package/dist/approvals.sql.d.ts.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +25 -10
- package/dist/index.mjs +21 -9
- package/package.json +2 -2
|
@@ -7,7 +7,14 @@ interface ApprovalFilters {
|
|
|
7
7
|
export declare function countApprovals(filters?: ApprovalFilters): Promise<number>;
|
|
8
8
|
export declare function listApprovals(filters?: ApprovalFilters): Promise<Record<string, unknown>[]>;
|
|
9
9
|
export declare function getApprovalById(id: string): Promise<Record<string, unknown> | undefined>;
|
|
10
|
-
|
|
10
|
+
interface InsertApprovalParams {
|
|
11
|
+
dataSourceId: string;
|
|
12
|
+
dbName: string | null;
|
|
13
|
+
sqlText: string;
|
|
14
|
+
submittedBy: string;
|
|
15
|
+
sqlType?: string;
|
|
16
|
+
}
|
|
17
|
+
export declare function insertApproval({ dataSourceId, dbName, sqlText, submittedBy, sqlType }: InsertApprovalParams): Promise<Record<string, unknown> | undefined>;
|
|
11
18
|
export declare function updateReview(id: string, status: string, reviewedBy: string, rejectReason: string | null): Promise<Record<string, unknown> | undefined>;
|
|
12
19
|
export declare function setExecuting(id: string): Promise<{
|
|
13
20
|
changes: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"approvals.model.d.ts","sourceRoot":"","sources":["../src/approvals.model.ts"],"names":[],"mappings":"AAGA,UAAU,eAAe;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAgBD,wBAAsB,cAAc,CAAC,OAAO,CAAC,EAAE,eAAe,mBAO7D;AAED,wBAAsB,aAAa,CAAC,OAAO,CAAC,EAAE,eAAe,sCAS5D;AAED,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,gDAEzC;AAED,
|
|
1
|
+
{"version":3,"file":"approvals.model.d.ts","sourceRoot":"","sources":["../src/approvals.model.ts"],"names":[],"mappings":"AAGA,UAAU,eAAe;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAgBD,wBAAsB,cAAc,CAAC,OAAO,CAAC,EAAE,eAAe,mBAO7D;AAED,wBAAsB,aAAa,CAAC,OAAO,CAAC,EAAE,eAAe,sCAS5D;AAED,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,gDAEzC;AAED,UAAU,oBAAoB;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,cAAc,CAAC,EAAE,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,OAAe,EAAE,EAAE,oBAAoB,gDAEnH;AAED,wBAAgB,YAAY,CAC1B,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,GAAG,IAAI,gDAG5B;AAED,wBAAgB,YAAY,CAAC,EAAE,EAAE,MAAM;;GAEtC;AAED,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;;GAE1E"}
|
|
@@ -2,6 +2,7 @@ import { type FastifyRequest, type FastifyReply } from "fastify";
|
|
|
2
2
|
interface AuthenticatedRequest extends FastifyRequest {
|
|
3
3
|
user: {
|
|
4
4
|
id: string;
|
|
5
|
+
role: string;
|
|
5
6
|
};
|
|
6
7
|
}
|
|
7
8
|
export declare function approvalList(req: AuthenticatedRequest, reply: FastifyReply): Promise<never>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"approvals.service.d.ts","sourceRoot":"","sources":["../src/approvals.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAAE,KAAK,YAAY,EAA0B,MAAM,SAAS,CAAC;AAazF,UAAU,oBAAqB,SAAQ,cAAc;IACnD,IAAI,EAAE;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"approvals.service.d.ts","sourceRoot":"","sources":["../src/approvals.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAAE,KAAK,YAAY,EAA0B,MAAM,SAAS,CAAC;AAazF,UAAU,oBAAqB,SAAQ,cAAc;IACnD,IAAI,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CACpC;AAED,wBAAsB,YAAY,CAAC,GAAG,EAAE,oBAAoB,EAAE,KAAK,EAAE,YAAY,kBAYhF;AAED,wBAAsB,WAAW,CAAC,GAAG,EAAE,cAAc,EAAE,KAAK,EAAE,YAAY,kBAKzE;AAED,wBAAsB,cAAc,CAAC,GAAG,EAAE,oBAAoB,EAAE,KAAK,EAAE,YAAY,kBAWlF;AAkBD,wBAAsB,eAAe,CAAC,GAAG,EAAE,oBAAoB,EAAE,KAAK,EAAE,YAAY,kBAUnF;AAED,wBAAsB,cAAc,CAAC,GAAG,EAAE,oBAAoB,EAAE,KAAK,EAAE,YAAY,kBAUlF;AAED,wBAAgB,eAAe,CAAC,aAAa,EAAE,MAAM,IACrC,KAAK,oBAAoB,EAAE,OAAO,YAAY,oBAY7D"}
|
package/dist/approvals.sql.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export declare const FIND_BY_ID = "\nSELECT *\nFROM approvals\nWHERE id = ?";
|
|
2
|
-
export declare const CREATE = "\nINSERT INTO approvals (data_source_id, db_name, sql_text, submitted_by)\nVALUES (?, ?, ?, ?)\nRETURNING *";
|
|
2
|
+
export declare const CREATE = "\nINSERT INTO approvals (data_source_id, db_name, sql_text, submitted_by, sql_type)\nVALUES (?, ?, ?, ?, ?)\nRETURNING *";
|
|
3
3
|
export declare const UPDATE_REVIEW: () => string;
|
|
4
4
|
export declare const UPDATE_EXECUTING: () => string;
|
|
5
5
|
export declare const UPDATE_RESULT: () => string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"approvals.sql.d.ts","sourceRoot":"","sources":["../src/approvals.sql.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,UAAU,6CAGV,CAAC;AAEd,eAAO,MAAM,MAAM,
|
|
1
|
+
{"version":3,"file":"approvals.sql.d.ts","sourceRoot":"","sources":["../src/approvals.sql.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,UAAU,6CAGV,CAAC;AAEd,eAAO,MAAM,MAAM,6HAGP,CAAC;AAEb,eAAO,MAAM,aAAa,cAId,CAAC;AAEb,eAAO,MAAM,gBAAgB,cAGhB,CAAC;AAEd,eAAO,MAAM,aAAa,cAGb,CAAC"}
|
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,WAAW,EACX,cAAc,EACd,eAAe,EACf,cAAc,EACd,eAAe,GAChB,MAAM,wBAAwB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,WAAW,EACX,cAAc,EACd,eAAe,EACf,cAAc,EACd,eAAe,GAChB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -25,7 +25,10 @@ __export(index_exports, {
|
|
|
25
25
|
approvalExecute: () => approvalExecute,
|
|
26
26
|
approvalGet: () => approvalGet,
|
|
27
27
|
approvalList: () => approvalList,
|
|
28
|
-
approvalReject: () => approvalReject
|
|
28
|
+
approvalReject: () => approvalReject,
|
|
29
|
+
getApprovalById: () => getApprovalById,
|
|
30
|
+
setExecuteResult: () => setExecuteResult,
|
|
31
|
+
setExecuting: () => setExecuting
|
|
29
32
|
});
|
|
30
33
|
module.exports = __toCommonJS(index_exports);
|
|
31
34
|
|
|
@@ -42,8 +45,8 @@ SELECT *
|
|
|
42
45
|
FROM approvals
|
|
43
46
|
WHERE id = ?`;
|
|
44
47
|
var CREATE = `
|
|
45
|
-
INSERT INTO approvals (data_source_id, db_name, sql_text, submitted_by)
|
|
46
|
-
VALUES (?, ?, ?, ?)
|
|
48
|
+
INSERT INTO approvals (data_source_id, db_name, sql_text, submitted_by, sql_type)
|
|
49
|
+
VALUES (?, ?, ?, ?, ?)
|
|
47
50
|
RETURNING *`;
|
|
48
51
|
var UPDATE_REVIEW = () => `
|
|
49
52
|
UPDATE approvals
|
|
@@ -94,8 +97,8 @@ WHERE 1=1`;
|
|
|
94
97
|
function getApprovalById(id) {
|
|
95
98
|
return (0, import_server_plugin_pg.getPgDb)().queryOne(FIND_BY_ID, [id]);
|
|
96
99
|
}
|
|
97
|
-
function insertApproval(dataSourceId, dbName, sqlText, submittedBy) {
|
|
98
|
-
return (0, import_server_plugin_pg.getPgDb)().queryOne(CREATE, [dataSourceId, dbName, sqlText, submittedBy]);
|
|
100
|
+
function insertApproval({ dataSourceId, dbName, sqlText, submittedBy, sqlType = "DML" }) {
|
|
101
|
+
return (0, import_server_plugin_pg.getPgDb)().queryOne(CREATE, [dataSourceId, dbName, sqlText, submittedBy, sqlType]);
|
|
99
102
|
}
|
|
100
103
|
function updateReview(id, status, reviewedBy, rejectReason) {
|
|
101
104
|
return (0, import_server_plugin_pg.getPgDb)().queryOne(UPDATE_REVIEW(), [status, reviewedBy, rejectReason, id]);
|
|
@@ -110,9 +113,11 @@ function setExecuteResult(id, status, result) {
|
|
|
110
113
|
// src/approvals.service.ts
|
|
111
114
|
async function approvalList(req, reply) {
|
|
112
115
|
const { status, mine, limit, offset } = req.body ?? {};
|
|
116
|
+
const isDeveloper = req.user.role === "developer";
|
|
117
|
+
const ownOnly = isDeveloper || String(mine) === "true";
|
|
113
118
|
const filters = {
|
|
114
119
|
status,
|
|
115
|
-
submittedBy:
|
|
120
|
+
submittedBy: ownOnly ? req.user.id : void 0,
|
|
116
121
|
limit: limit ? Number(limit) : void 0,
|
|
117
122
|
offset: offset ? Number(offset) : void 0
|
|
118
123
|
};
|
|
@@ -126,12 +131,19 @@ async function approvalGet(req, reply) {
|
|
|
126
131
|
return reply.send(approval);
|
|
127
132
|
}
|
|
128
133
|
async function approvalCreate(req, reply) {
|
|
129
|
-
const { dataSourceId, database, sql } = req.body ?? {};
|
|
134
|
+
const { dataSourceId, database, sql, sqlType } = req.body ?? {};
|
|
130
135
|
if (!dataSourceId || !sql) {
|
|
131
136
|
return reply.code(400).send({ error: "Data source ID and SQL are required" });
|
|
132
137
|
}
|
|
133
|
-
const
|
|
134
|
-
|
|
138
|
+
const type = sqlType === "EXPORT" ? "EXPORT" : "DML";
|
|
139
|
+
const approval = await insertApproval({
|
|
140
|
+
dataSourceId,
|
|
141
|
+
dbName: database ?? null,
|
|
142
|
+
sqlText: sql,
|
|
143
|
+
submittedBy: req.user.id,
|
|
144
|
+
sqlType: type
|
|
145
|
+
});
|
|
146
|
+
req.log.info("Approval submitted (user=%s, type=%s)", req.user.id, type);
|
|
135
147
|
return reply.code(201).send(approval);
|
|
136
148
|
}
|
|
137
149
|
async function reviewApproval(id, reviewerId, decision, rejectReason) {
|
|
@@ -221,5 +233,8 @@ async function doExecuteApproval({ id, userId, ip, encryptionKey }, log) {
|
|
|
221
233
|
approvalExecute,
|
|
222
234
|
approvalGet,
|
|
223
235
|
approvalList,
|
|
224
|
-
approvalReject
|
|
236
|
+
approvalReject,
|
|
237
|
+
getApprovalById,
|
|
238
|
+
setExecuteResult,
|
|
239
|
+
setExecuting
|
|
225
240
|
});
|
package/dist/index.mjs
CHANGED
|
@@ -11,8 +11,8 @@ SELECT *
|
|
|
11
11
|
FROM approvals
|
|
12
12
|
WHERE id = ?`;
|
|
13
13
|
var CREATE = `
|
|
14
|
-
INSERT INTO approvals (data_source_id, db_name, sql_text, submitted_by)
|
|
15
|
-
VALUES (?, ?, ?, ?)
|
|
14
|
+
INSERT INTO approvals (data_source_id, db_name, sql_text, submitted_by, sql_type)
|
|
15
|
+
VALUES (?, ?, ?, ?, ?)
|
|
16
16
|
RETURNING *`;
|
|
17
17
|
var UPDATE_REVIEW = () => `
|
|
18
18
|
UPDATE approvals
|
|
@@ -63,8 +63,8 @@ WHERE 1=1`;
|
|
|
63
63
|
function getApprovalById(id) {
|
|
64
64
|
return getPgDb().queryOne(FIND_BY_ID, [id]);
|
|
65
65
|
}
|
|
66
|
-
function insertApproval(dataSourceId, dbName, sqlText, submittedBy) {
|
|
67
|
-
return getPgDb().queryOne(CREATE, [dataSourceId, dbName, sqlText, submittedBy]);
|
|
66
|
+
function insertApproval({ dataSourceId, dbName, sqlText, submittedBy, sqlType = "DML" }) {
|
|
67
|
+
return getPgDb().queryOne(CREATE, [dataSourceId, dbName, sqlText, submittedBy, sqlType]);
|
|
68
68
|
}
|
|
69
69
|
function updateReview(id, status, reviewedBy, rejectReason) {
|
|
70
70
|
return getPgDb().queryOne(UPDATE_REVIEW(), [status, reviewedBy, rejectReason, id]);
|
|
@@ -79,9 +79,11 @@ function setExecuteResult(id, status, result) {
|
|
|
79
79
|
// src/approvals.service.ts
|
|
80
80
|
async function approvalList(req, reply) {
|
|
81
81
|
const { status, mine, limit, offset } = req.body ?? {};
|
|
82
|
+
const isDeveloper = req.user.role === "developer";
|
|
83
|
+
const ownOnly = isDeveloper || String(mine) === "true";
|
|
82
84
|
const filters = {
|
|
83
85
|
status,
|
|
84
|
-
submittedBy:
|
|
86
|
+
submittedBy: ownOnly ? req.user.id : void 0,
|
|
85
87
|
limit: limit ? Number(limit) : void 0,
|
|
86
88
|
offset: offset ? Number(offset) : void 0
|
|
87
89
|
};
|
|
@@ -95,12 +97,19 @@ async function approvalGet(req, reply) {
|
|
|
95
97
|
return reply.send(approval);
|
|
96
98
|
}
|
|
97
99
|
async function approvalCreate(req, reply) {
|
|
98
|
-
const { dataSourceId, database, sql } = req.body ?? {};
|
|
100
|
+
const { dataSourceId, database, sql, sqlType } = req.body ?? {};
|
|
99
101
|
if (!dataSourceId || !sql) {
|
|
100
102
|
return reply.code(400).send({ error: "Data source ID and SQL are required" });
|
|
101
103
|
}
|
|
102
|
-
const
|
|
103
|
-
|
|
104
|
+
const type = sqlType === "EXPORT" ? "EXPORT" : "DML";
|
|
105
|
+
const approval = await insertApproval({
|
|
106
|
+
dataSourceId,
|
|
107
|
+
dbName: database ?? null,
|
|
108
|
+
sqlText: sql,
|
|
109
|
+
submittedBy: req.user.id,
|
|
110
|
+
sqlType: type
|
|
111
|
+
});
|
|
112
|
+
req.log.info("Approval submitted (user=%s, type=%s)", req.user.id, type);
|
|
104
113
|
return reply.code(201).send(approval);
|
|
105
114
|
}
|
|
106
115
|
async function reviewApproval(id, reviewerId, decision, rejectReason) {
|
|
@@ -189,5 +198,8 @@ export {
|
|
|
189
198
|
approvalExecute,
|
|
190
199
|
approvalGet,
|
|
191
200
|
approvalList,
|
|
192
|
-
approvalReject
|
|
201
|
+
approvalReject,
|
|
202
|
+
getApprovalById,
|
|
203
|
+
setExecuteResult,
|
|
204
|
+
setExecuting
|
|
193
205
|
};
|
package/package.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"publishConfig": {
|
|
4
4
|
"access": "public"
|
|
5
5
|
},
|
|
6
|
-
"version": "0.
|
|
6
|
+
"version": "0.8.1",
|
|
7
7
|
"description": "DMS approval workflow domain logic: service, model, sql",
|
|
8
8
|
"main": "./dist/index.js",
|
|
9
9
|
"module": "./dist/index.mjs",
|
|
@@ -36,5 +36,5 @@
|
|
|
36
36
|
"typescript": "^6.0.2",
|
|
37
37
|
"vitest": "^4.1.4"
|
|
38
38
|
},
|
|
39
|
-
"gitHead": "
|
|
39
|
+
"gitHead": "ba1108598de594155e02b0800796d13a4e7b7449"
|
|
40
40
|
}
|