@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.
@@ -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
- export declare function insertApproval(dataSourceId: string, dbName: string | null, sqlText: string, submittedBy: string): Promise<Record<string, unknown> | undefined>;
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,wBAAgB,cAAc,CAAC,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,gDAE/G;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"}
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;CACtB;AAED,wBAAsB,YAAY,CAAC,GAAG,EAAE,oBAAoB,EAAE,KAAK,EAAE,YAAY,kBAUhF;AAED,wBAAsB,WAAW,CAAC,GAAG,EAAE,cAAc,EAAE,KAAK,EAAE,YAAY,kBAKzE;AAED,wBAAsB,cAAc,CAAC,GAAG,EAAE,oBAAoB,EAAE,KAAK,EAAE,YAAY,kBAQlF;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"}
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"}
@@ -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,gHAGP,CAAC;AAEb,eAAO,MAAM,aAAa,cAId,CAAC;AAEb,eAAO,MAAM,gBAAgB,cAGhB,CAAC;AAEd,eAAO,MAAM,aAAa,cAGb,CAAC"}
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
@@ -1,2 +1,3 @@
1
1
  export { approvalList, approvalGet, approvalCreate, approvalApprove, approvalReject, approvalExecute, } from "./approvals.service.js";
2
+ export { getApprovalById, setExecuting, setExecuteResult } from "./approvals.model.js";
2
3
  //# sourceMappingURL=index.d.ts.map
@@ -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: mine === "true" ? req.user.id : void 0,
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 approval = await insertApproval(dataSourceId, database ?? null, sql, req.user.id);
134
- req.log.info("Approval submitted (user=%s)", req.user.id);
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: mine === "true" ? req.user.id : void 0,
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 approval = await insertApproval(dataSourceId, database ?? null, sql, req.user.id);
103
- req.log.info("Approval submitted (user=%s)", req.user.id);
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.7.2",
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": "d06a1293647cb401ff35e86252c9e96154a7b070"
39
+ "gitHead": "ba1108598de594155e02b0800796d13a4e7b7449"
40
40
  }