kschema-fs-api-gen-post-actions 1.11.2 → 1.11.3

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.
Files changed (67) hide show
  1. package/bin/v11/tasks/actions/InsertGenPk/steps/createActionFolder.js +31 -0
  2. package/bin/v11/tasks/actions/InsertGenPk/steps/generateRestIfRequested.js +44 -0
  3. package/bin/v11/tasks/actions/InsertGenPk/steps/showLog.js +9 -0
  4. package/bin/v11/tasks/actions/InsertGenPk/steps/updateEndPointsJs.js +34 -0
  5. package/bin/v11/tasks/actions/InsertGenPk/template/v1/helpers/getData.js +11 -0
  6. package/bin/v11/tasks/actions/InsertGenPk/template/v1/helpers/getSchema.js +11 -0
  7. package/bin/v11/tasks/actions/InsertGenPk/template/v1/insertGenPk.js +2 -2
  8. package/bin/v11/tasks/actions/InsertGenPk/template/v1/rest.http +8 -7
  9. package/bin/v11/tasks/actions/InsertGenPk/template/v1/service.js +1 -8
  10. package/bin/v11/tasks/actions/InsertGenPk-/steps/UpdateRoutesJs/common/readFile.js +8 -0
  11. package/bin/v11/tasks/actions/InsertGenPk-/steps/UpdateRoutesJs/common/writeFile.js +10 -0
  12. package/bin/v11/tasks/actions/InsertGenPk-/steps/UpdateRoutesJs/updateImports/buildImport.js +9 -0
  13. package/bin/v11/tasks/actions/InsertGenPk-/steps/UpdateRoutesJs/updateImports/checkDuplicate.js +8 -0
  14. package/bin/v11/tasks/actions/InsertGenPk-/steps/UpdateRoutesJs/updateImports/findInsertIndex.js +10 -0
  15. package/bin/v11/tasks/actions/InsertGenPk-/steps/UpdateRoutesJs/updateImports/index.js +47 -0
  16. package/bin/v11/tasks/actions/InsertGenPk-/steps/UpdateRoutesJs/updateUse/buildUseLine.js +5 -0
  17. package/bin/v11/tasks/actions/InsertGenPk-/steps/UpdateRoutesJs/updateUse/checkDuplicate.js +9 -0
  18. package/bin/v11/tasks/actions/InsertGenPk-/steps/UpdateRoutesJs/updateUse/findInsertIndex.js +10 -0
  19. package/bin/v11/tasks/actions/InsertGenPk-/steps/UpdateRoutesJs/updateUse/index.js +56 -0
  20. package/bin/v11/tasks/actions/InsertGenPk-/steps/announce.js +9 -0
  21. package/bin/v11/tasks/actions/InsertGenPk-/steps/createFolder.js +7 -0
  22. package/bin/v11/tasks/actions/InsertGenPk-/steps/decideTemplate.js +3 -0
  23. package/bin/v11/tasks/actions/InsertGenPk-/steps/locateDestination.js +7 -0
  24. package/bin/v11/tasks/actions/InsertGenPk-/steps/locateSource.js +18 -0
  25. package/bin/v11/tasks/actions/InsertGenPk-/steps/resolveFolderName.js +20 -0
  26. package/bin/v11/tasks/actions/InsertGenPk-/steps/updateAppJs.js +7 -0
  27. package/bin/v11/tasks/actions/InsertGenPk-/steps/updateEndPointsFile.js +30 -0
  28. package/bin/v11/tasks/actions/InsertGenPk-/template/v1/insertGenPk.js +31 -0
  29. package/bin/v11/tasks/actions/InsertGenPk-/template/v1/rest.http +7 -0
  30. package/bin/v11/tasks/actions/InsertGenPk-/template/v1/service.js +16 -0
  31. package/bin/v11/tasks/actions/InsertGenPk-/template/v2/config/getSchema.js +20 -0
  32. package/bin/v11/tasks/actions/InsertGenPk-/template/v2/controller.js +27 -0
  33. package/bin/v11/tasks/actions/InsertGenPk-/template/v2/errors.js +11 -0
  34. package/bin/v11/tasks/actions/InsertGenPk-/template/v2/helpers/pkHelper.js +19 -0
  35. package/bin/v11/tasks/actions/InsertGenPk-/template/v2/insertBase.js +9 -0
  36. package/bin/v11/tasks/actions/insertGenPk copy.js +63 -0
  37. package/bin/v11/tasks/actions/insertGenPk.js +51 -29
  38. package/index.js +15 -12
  39. package/package.json +1 -1
  40. /package/bin/v11/tasks/actions/{InsertGenPk → InsertGenPk-}/actions.json +0 -0
  41. /package/bin/v11/tasks/actions/{InsertGenPk/template/v2 → InsertGenPk-/template/v1}/config/getSchema.js +0 -0
  42. /package/bin/v11/tasks/actions/{InsertGenPk/template/v2 → InsertGenPk-/template/v1}/controller.js +0 -0
  43. /package/bin/v11/tasks/actions/{InsertGenPk/template/v2 → InsertGenPk-/template/v1}/errors.js +0 -0
  44. /package/bin/v11/tasks/actions/{InsertGenPk → InsertGenPk-}/template/v1/getData.js +0 -0
  45. /package/bin/v11/tasks/actions/{InsertGenPk → InsertGenPk-}/template/v1/getSchema.js +0 -0
  46. /package/bin/v11/tasks/actions/{InsertGenPk → InsertGenPk-}/template/v1/helpers/buildMutate.js +0 -0
  47. /package/bin/v11/tasks/actions/{InsertGenPk → InsertGenPk-}/template/v1/helpers/buildQuery.js +0 -0
  48. /package/bin/v11/tasks/actions/{InsertGenPk → InsertGenPk-}/template/v1/helpers/file/read.js +0 -0
  49. /package/bin/v11/tasks/actions/{InsertGenPk → InsertGenPk-}/template/v1/helpers/file/write.js +0 -0
  50. /package/bin/v11/tasks/actions/{InsertGenPk/template/v2 → InsertGenPk-/template/v1}/helpers/pkHelper.js +0 -0
  51. /package/bin/v11/tasks/actions/{InsertGenPk → InsertGenPk-}/template/v1/helpers/validate.js +0 -0
  52. /package/bin/v11/tasks/actions/{InsertGenPk → InsertGenPk-}/template/v1/helpers/validateHelper.js +0 -0
  53. /package/bin/v11/tasks/actions/{InsertGenPk → InsertGenPk-}/template/v1/helpers/validators/default.js +0 -0
  54. /package/bin/v11/tasks/actions/{InsertGenPk → InsertGenPk-}/template/v1/helpers/validators/enum.js +0 -0
  55. /package/bin/v11/tasks/actions/{InsertGenPk → InsertGenPk-}/template/v1/helpers/validators/length.js +0 -0
  56. /package/bin/v11/tasks/actions/{InsertGenPk → InsertGenPk-}/template/v1/helpers/validators/minMax.js +0 -0
  57. /package/bin/v11/tasks/actions/{InsertGenPk → InsertGenPk-}/template/v1/helpers/validators/pattern.js +0 -0
  58. /package/bin/v11/tasks/actions/{InsertGenPk → InsertGenPk-}/template/v1/helpers/validators/required.js +0 -0
  59. /package/bin/v11/tasks/actions/{InsertGenPk → InsertGenPk-}/template/v1/helpers/validators/type.js +0 -0
  60. /package/bin/v11/tasks/actions/{InsertGenPk → InsertGenPk-}/template/v1/helpers/validators/unique.js +0 -0
  61. /package/bin/v11/tasks/actions/{InsertGenPk/template/v2 → InsertGenPk-/template/v1}/insertBase.js +0 -0
  62. /package/bin/v11/tasks/actions/{InsertGenPk → InsertGenPk-}/template/v1/middleware.js +0 -0
  63. /package/bin/v11/tasks/actions/{InsertGenPk → InsertGenPk-}/template/v2/helpers/getData.js +0 -0
  64. /package/bin/v11/tasks/actions/{InsertGenPk → InsertGenPk-}/template/v2/helpers/getSchema.js +0 -0
  65. /package/bin/v11/tasks/actions/{InsertGenPk → InsertGenPk-}/template/v2/insertGenPk.js +0 -0
  66. /package/bin/v11/tasks/actions/{InsertGenPk → InsertGenPk-}/template/v2/rest.http +0 -0
  67. /package/bin/v11/tasks/actions/{InsertGenPk → InsertGenPk-}/template/v2/service.js +0 -0
@@ -0,0 +1,31 @@
1
+ import { createFolder } from "../../../../core/createFolder.js";
2
+ import { showLog } from "./showLog.js";
3
+
4
+ export const createActionFolder = ({
5
+ source,
6
+ destination,
7
+ isAnnounce,
8
+ checkBeforeCreate,
9
+ showLog: isShowLog
10
+ }) => {
11
+ showLog({
12
+ enabled: isShowLog,
13
+ message: "Copying WithMail template.",
14
+ data: { source, destination }
15
+ });
16
+
17
+ const response = createFolder({
18
+ source,
19
+ destination,
20
+ isAnnounce,
21
+ checkBeforeCreate
22
+ });
23
+
24
+ showLog({
25
+ enabled: isShowLog,
26
+ message: response.KTF ? "Template copy completed." : "Template copy skipped.",
27
+ data: response
28
+ });
29
+
30
+ return response;
31
+ };
@@ -0,0 +1,44 @@
1
+ import path from "path";
2
+ import generateRest from "kschema-fs-api-gen-rest";
3
+ import { showLog } from "./showLog.js";
4
+
5
+ export const generateRestIfRequested = ({
6
+ inGenerateRest,
7
+ toConfigPath,
8
+ inTargetPath,
9
+ toPath,
10
+ resolvedFolderName,
11
+ isShowLog, inPort
12
+ }) => {
13
+ if (!inGenerateRest) {
14
+ showLog({
15
+ enabled: isShowLog,
16
+ message: "REST generation not requested."
17
+ });
18
+
19
+ return;
20
+ };
21
+
22
+ const restTargetPath = path.join(toPath, resolvedFolderName);
23
+
24
+ showLog({
25
+ enabled: isShowLog,
26
+ message: "Generating REST files.",
27
+ data: { toConfigPath, inTargetPath, toPath: restTargetPath }
28
+ });
29
+
30
+ const response = generateRest({
31
+ toConfigPath,
32
+ inTargetPath,
33
+ toPath: restTargetPath,
34
+ inPort
35
+ });
36
+
37
+ showLog({
38
+ enabled: isShowLog,
39
+ message: "REST generation completed.",
40
+ data: response
41
+ });
42
+
43
+ return response;
44
+ };
@@ -0,0 +1,9 @@
1
+ export const showLog = ({ enabled, message, data }) => {
2
+ if (!enabled) return;
3
+
4
+ console.log(`[withMail] ${message}`);
5
+
6
+ if (data === undefined) return;
7
+
8
+ console.log(data);
9
+ };
@@ -0,0 +1,34 @@
1
+ import path from "path";
2
+ import fixEndpointsJs from "express-fix-endpoints-post-js";
3
+ import { showLog } from "./showLog.js";
4
+
5
+ export const updateEndPointsJs = async ({
6
+ toPath,
7
+ cmd,
8
+ inFolderName,
9
+ showLog: isShowLog
10
+ }) => {
11
+ const endPointsJsPath = path.join(toPath, "end-points.js");
12
+
13
+ showLog({
14
+ enabled: isShowLog,
15
+ message: "Updating end-points.js for body parsing.",
16
+ data: { endPointsJsPath, cmd, inFolderName }
17
+ });
18
+
19
+ const response = await fixEndpointsJs({
20
+ endPointsJsPath,
21
+ showLog: isShowLog,
22
+ inActionName: cmd,
23
+ inFolderName,
24
+ inGetType: "bodyParse"
25
+ });
26
+
27
+ showLog({
28
+ enabled: isShowLog,
29
+ message: "end-points.js update completed.",
30
+ data: response
31
+ });
32
+
33
+ return response;
34
+ };
@@ -0,0 +1,11 @@
1
+ import { JSONFilePreset } from 'lowdb/node'
2
+
3
+ const startFunc = async ({ inTablePath }) => {
4
+ const db = await JSONFilePreset(inTablePath, []);
5
+
6
+ await db.read();
7
+
8
+ return await db.data;
9
+ };
10
+
11
+ export default startFunc;
@@ -0,0 +1,11 @@
1
+ import { JSONFilePreset } from 'lowdb/node'
2
+
3
+ const startFunc = async ({ inConfigPath }) => {
4
+ const db = await JSONFilePreset(inConfigPath, {});
5
+
6
+ await db.read();
7
+
8
+ return await db.data;
9
+ };
10
+
11
+ export default startFunc;
@@ -1,6 +1,6 @@
1
1
  import insertBase from "./insertBase.js";
2
- import getData from "./getData.js";
3
- import getSchema from "./getSchema.js";
2
+ import getData from "./helpers/getData.js";
3
+ import getSchema from "./helpers/getSchema.js";
4
4
  import { getPrimaryKey, attachPrimaryKey } from "./helpers/pkHelper.js";
5
5
 
6
6
  const validateInput = ({ record }) => {
@@ -1,7 +1,8 @@
1
-
2
- POST http://localhost:3001/Api/v1/StockItems/WithMail
3
- Content-Type: application/json
4
-
5
- {
6
- "StockItemName":"Rope 1 kg"
7
- }
1
+ POST http://localhost:3000/api/v1/StockItems/withMail
2
+ Content-Type: application/json
3
+
4
+ {
5
+ "StockItemName": "Item1",
6
+ "StockGstApplicable": "",
7
+ "StockBaseUnits": ""
8
+ }
@@ -1,16 +1,9 @@
1
1
  import insertGenPk from "./insertGenPk.js";
2
- import sendMail from "./Mail/sendMailCC.js";
3
2
 
4
3
  const startFunc = async ({ inRequestBody, inTablePath, inConfigPath }) => {
5
4
  const insertedPk = await insertGenPk({ inRequestBody, inTablePath, inConfigPath });
6
5
 
7
- const info = await sendMail();
8
-
9
- return await {
10
- insertedPk,
11
- isMailSent: info.accepted.length > 0 &&
12
- info.rejected.length === 0
13
- };
6
+ return insertedPk;
14
7
  };
15
8
 
16
9
  export { startFunc };
@@ -0,0 +1,8 @@
1
+ import fs from "fs";
2
+
3
+ const readFile = (inAppJsPath) => {
4
+ const localPath = inAppJsPath;
5
+ return fs.readFileSync(localPath, "utf-8");
6
+ };
7
+
8
+ export default readFile;
@@ -0,0 +1,10 @@
1
+ import fs from "fs";
2
+
3
+ const writeFile = (inAppJsPath, inContent) => {
4
+ const localPath = inAppJsPath;
5
+ const localContent = inContent;
6
+
7
+ fs.writeFileSync(localPath, localContent);
8
+ };
9
+
10
+ export default writeFile;
@@ -0,0 +1,9 @@
1
+ const buildImport = ({ inFuncName, inEndpoint }) => {
2
+ const localEndpoint = inEndpoint;
3
+
4
+ const safeName = localEndpoint.replace(/[^a-zA-Z0-9]/g, "_");
5
+
6
+ return `import { ${inFuncName} } from "./${localEndpoint}/controller.js";`;
7
+ };
8
+
9
+ export default buildImport;
@@ -0,0 +1,8 @@
1
+ const checkUseDuplicate = ({ inContent, inFuncName }) => {
2
+ const localContent = inContent;
3
+ const toCheckLine = `import { ${inFuncName} } from`;
4
+
5
+ return localContent.includes(toCheckLine);
6
+ };
7
+
8
+ export default checkUseDuplicate;
@@ -0,0 +1,10 @@
1
+ const findInsertIndex = (inContent) => {
2
+ const localContent = inContent;
3
+
4
+ const matches = [...localContent.matchAll(/^\s*import.*$/gm)];
5
+ const last = matches.at(-1);
6
+
7
+ return last ? last.index + last[0].length : 0;
8
+ };
9
+
10
+ export default findInsertIndex;
@@ -0,0 +1,47 @@
1
+ import readFile from "../common/readFile.js";
2
+ import buildImport from "./buildImport.js";
3
+ import checkDuplicate from "./checkDuplicate.js";
4
+ import findInsertIndex from "./findInsertIndex.js";
5
+ import writeFile from "../common/writeFile.js";
6
+
7
+ const updateImports = ({ appJsPath, endpoint, showLog, inFuncName }) => {
8
+ const summary = {
9
+ import: { added: false, line: null },
10
+ };
11
+
12
+ const content = readFile(appJsPath);
13
+
14
+ const importLine = buildImport({
15
+ inEndpoint: endpoint,
16
+ inFuncName
17
+ });
18
+
19
+ const fromCheckDuplicate = checkDuplicate({ inContent: content, inFuncName });
20
+
21
+ if (fromCheckDuplicate) {
22
+ summary.import.skipped = true;
23
+
24
+ if (showLog) console.log(summary);
25
+
26
+ return summary;
27
+ };
28
+
29
+ const index = findInsertIndex(content);
30
+
31
+ const before = content.slice(0, index);
32
+ const lineNumber = before.split("\n").length + 1;
33
+
34
+ const updated =
35
+ before + "\n" + importLine + content.slice(index);
36
+
37
+ writeFile(appJsPath, updated);
38
+
39
+ summary.import.added = true;
40
+ summary.import.line = lineNumber;
41
+
42
+ if (showLog) console.log(summary);
43
+
44
+ return summary;
45
+ };
46
+
47
+ export default updateImports;
@@ -0,0 +1,5 @@
1
+ const buildUseLine = ({ inAppOrRouter, inEndpoint, inFuncName }) => {
2
+ return `${inAppOrRouter}.get('/${inEndpoint}', (req, res) => ${inFuncName}({ res, inTableName : tableName}));`;
3
+ };
4
+
5
+ export default buildUseLine;
@@ -0,0 +1,9 @@
1
+ const checkDuplicate = ({ inContent, inEndpoint, inAppOrRouter }) => {
2
+ const localContent = inContent;
3
+ const localEndpoint = inEndpoint;
4
+ const stringToSearch = `${inAppOrRouter}.get('/${localEndpoint}'`;
5
+
6
+ return localContent.includes(stringToSearch);
7
+ };
8
+
9
+ export default checkDuplicate;
@@ -0,0 +1,10 @@
1
+ const findUseInsertIndex = (inContent) => {
2
+ const localContent = inContent;
3
+
4
+ const matches = [...localContent.matchAll(/const\s+router\s*=\s*express\.Router\(\)/g)];
5
+ const match = matches.at(0);
6
+
7
+ return match ? match.index + match[0].length : localContent.length;
8
+ };
9
+
10
+ export default findUseInsertIndex;
@@ -0,0 +1,56 @@
1
+ import readFile from "../common/readFile.js";
2
+ import writeFile from "../common/writeFile.js";
3
+
4
+ import buildUseLine from "./buildUseLine.js";
5
+ import checkDuplicate from "./checkDuplicate.js";
6
+ import findUseInsertIndex from "./findInsertIndex.js";
7
+
8
+ const appOrRouter = "router";
9
+
10
+ const updateAppUse = ({ appJsPath, endpoint, showLog, inFuncName }) => {
11
+ const summary = {
12
+ use: { added: false, skipped: false, line: null }
13
+ };
14
+
15
+ const content = readFile(appJsPath);
16
+
17
+ const useLine = buildUseLine({
18
+ inAppOrRouter: appOrRouter,
19
+ inEndpoint: endpoint,
20
+ inFuncName
21
+ });
22
+
23
+ const fromCheckDuplicate = checkDuplicate({
24
+ inContent: content,
25
+ inEndpoint: endpoint,
26
+ inAppOrRouter: appOrRouter
27
+ });
28
+ console.log("fromCheckDuplicate : ", fromCheckDuplicate);
29
+
30
+ if (fromCheckDuplicate) {
31
+ summary.use.skipped = true;
32
+
33
+ if (showLog) console.log(summary);
34
+
35
+ return summary;
36
+ };
37
+
38
+ const index = findUseInsertIndex(content);
39
+
40
+ const before = content.slice(0, index);
41
+ const lineNumber = before.split("\n").length + 1;
42
+
43
+ const updated =
44
+ before + "\n" + useLine + content.slice(index);
45
+
46
+ writeFile(appJsPath, updated);
47
+
48
+ summary.use.added = true;
49
+ summary.use.line = lineNumber;
50
+
51
+ if (showLog) console.log(summary);
52
+
53
+ return summary;
54
+ };
55
+
56
+ export default updateAppUse;
@@ -0,0 +1,9 @@
1
+ export const announce = ({ inResolvedFolderName }) => {
2
+ console.log(`[keshavsoft] Folder created: ${inResolvedFolderName}`);
3
+
4
+ console.log("");
5
+ console.log("Next:");
6
+ console.log("");
7
+ console.log(`cd ${inResolvedFolderName}`);
8
+ console.log(`npx kschema-api-gen AddSubRoute`);
9
+ };
@@ -0,0 +1,7 @@
1
+ import fs from "fs";
2
+
3
+ export const createFolder = ({ source, destination }) => {
4
+ fs.mkdirSync(destination, { recursive: true });
5
+
6
+ fs.cpSync(source, destination, { recursive: true });
7
+ };
@@ -0,0 +1,3 @@
1
+ export const decideTemplate = ({ inTemplate }) => {
2
+ return inTemplate || "basic";
3
+ };
@@ -0,0 +1,7 @@
1
+ import path from "path";
2
+
3
+ export const locateDestination = ({ inResolvedFolderName, toPath }) => {
4
+ const localToPath = toPath;
5
+
6
+ return path.join(localToPath, inResolvedFolderName);
7
+ };
@@ -0,0 +1,18 @@
1
+ import fs from "fs";
2
+ import path from "path";
3
+ import { fileURLToPath } from "url";
4
+
5
+ const __filename = fileURLToPath(import.meta.url);
6
+ const __dirname = path.dirname(__filename);
7
+
8
+ export const locateSource = () => {
9
+ const templatePath = path.join(__dirname, "..", "template");
10
+
11
+ const versions = fs.readdirSync(templatePath);
12
+
13
+ const maxVersion = Math.max(
14
+ ...versions.map(v => Number(v.replace("v", "")))
15
+ );
16
+
17
+ return path.join(templatePath, `v${maxVersion}`);
18
+ };
@@ -0,0 +1,20 @@
1
+ import fs from "fs";
2
+
3
+ export default function resolveFolderName({ name, inDefaultFolderName = "InsertGenPk" }) {
4
+ const defaultFolderName = inDefaultFolderName;
5
+
6
+ // case 1: force new → timestamp
7
+ if (name === null) {
8
+ name = defaultFolderName;
9
+ };
10
+
11
+ // case 2: user provided → strict
12
+ if (fs.existsSync(name)) {
13
+ return {
14
+ KTF: false,
15
+ KReason: `Folder already exists : ${name}`
16
+ };
17
+ };
18
+
19
+ return name;
20
+ };
@@ -0,0 +1,7 @@
1
+ import updateImports from "./UpdateRoutesJs/updateImports/index.js";
2
+ import updateAppUse from "./UpdateRoutesJs/updateUse/index.js";
3
+
4
+ export default ({ appJsPath, endpoint }) => {
5
+ updateImports({ appJsPath, endpoint });
6
+ updateAppUse({ appJsPath, endpoint });
7
+ };
@@ -0,0 +1,30 @@
1
+ import fs from 'fs';
2
+
3
+ function updateEndPointsFile({ filePath, inTableName }) {
4
+ try {
5
+ let content = readFile(filePath);
6
+
7
+ content = content.replace("<TABLE_NAME>", inTableName);
8
+
9
+ writeFile(filePath, content);
10
+ } catch (e) {
11
+ handleError(e);
12
+ };
13
+ };
14
+
15
+ // read
16
+ function readFile(filePath) {
17
+ return fs.readFileSync(filePath, "utf-8");
18
+ };
19
+
20
+ // write
21
+ function writeFile(filePath, content) {
22
+ fs.writeFileSync(filePath, content);
23
+ };
24
+
25
+ // error handler
26
+ function handleError(e) {
27
+ console.error("ROUTE USE ERROR:", e.message);
28
+ };
29
+
30
+ export { updateEndPointsFile };
@@ -0,0 +1,31 @@
1
+ import insertBase from "./insertBase.js";
2
+ import getData from "./getData.js";
3
+ import getSchema from "./getSchema.js";
4
+ import { getPrimaryKey, attachPrimaryKey } from "./helpers/pkHelper.js";
5
+
6
+ const validateInput = ({ record }) => {
7
+ if (!record || typeof record !== "object") throw new Error("record must be object");
8
+ };
9
+
10
+ const insertGenPk = async ({ inRequestBody, inTablePath, inConfigPath }) => {
11
+ validateInput({ record: inRequestBody });
12
+
13
+ const schema = await getSchema({ inConfigPath });
14
+ const pk = getPrimaryKey(schema.columnsConfig);
15
+
16
+ if (inRequestBody[pk] !== undefined) {
17
+ return insertBase({ inRequestBody, inTablePath });
18
+ };
19
+
20
+ const data = await getData({ inTablePath });
21
+ const newRecord = attachPrimaryKey(inRequestBody, pk, data);
22
+
23
+ await insertBase({
24
+ inRequestBody: newRecord,
25
+ inTablePath
26
+ });
27
+
28
+ return newRecord[pk];
29
+ };
30
+
31
+ export default insertGenPk;
@@ -0,0 +1,7 @@
1
+
2
+ POST http://localhost:3001/Api/v1/StockItems/WithMail
3
+ Content-Type: application/json
4
+
5
+ {
6
+ "StockItemName":"Rope 1 kg"
7
+ }
@@ -0,0 +1,16 @@
1
+ import insertGenPk from "./insertGenPk.js";
2
+ import sendMail from "./Mail/sendMailCC.js";
3
+
4
+ const startFunc = async ({ inRequestBody, inTablePath, inConfigPath }) => {
5
+ const insertedPk = await insertGenPk({ inRequestBody, inTablePath, inConfigPath });
6
+
7
+ const info = await sendMail();
8
+
9
+ return await {
10
+ insertedPk,
11
+ isMailSent: info.accepted.length > 0 &&
12
+ info.rejected.length === 0
13
+ };
14
+ };
15
+
16
+ export { startFunc };
@@ -0,0 +1,20 @@
1
+ import fs from "fs";
2
+ import path from "path";
3
+ import { getConfig } from "../../core/configStore.js";
4
+
5
+ export const getSchema = (table) => {
6
+ const config = getConfig();
7
+
8
+ const schemaPath = path.join(config.SchemaPath, `${table}.json`);
9
+
10
+ if (!fs.existsSync(schemaPath)) {
11
+ throw new Error(`Schema not found for table "${table}" at ${schemaPath}`);
12
+ }
13
+
14
+ try {
15
+ const schema = fs.readFileSync(schemaPath, "utf-8");
16
+ return JSON.parse(schema);
17
+ } catch (err) {
18
+ throw new Error(`Invalid schema JSON for "${table}": ${err.message}`);
19
+ };
20
+ };
@@ -0,0 +1,27 @@
1
+ import { startFunc as Service } from "./service.js";
2
+ import { ConflictError, StorageError } from "./errors.js";
3
+
4
+ const postFunc = async ({ req, res, inTablePath, inConfigPath }) => {
5
+ try {
6
+ const inRequestBody = req.body;
7
+
8
+ const fromService = await Service({
9
+ inRequestBody, inTablePath,
10
+ inConfigPath
11
+ });
12
+
13
+ res.type("application/json").send(fromService);
14
+ } catch (err) {
15
+
16
+ if (err instanceof ConflictError)
17
+ return res.status(409).send(err.message);
18
+
19
+ if (err instanceof StorageError)
20
+ return res.status(500).send("Failed to persist data");
21
+
22
+ console.error(err);
23
+ res.status(500).send("Unexpected error");
24
+ }
25
+ };
26
+
27
+ export default postFunc;
@@ -0,0 +1,11 @@
1
+ class AppError extends Error {
2
+ constructor(message) {
3
+ super(message);
4
+ this.name = this.constructor.name;
5
+ }
6
+ }
7
+
8
+ class ConflictError extends AppError { }
9
+ class StorageError extends AppError { }
10
+
11
+ export { AppError, ConflictError, StorageError };
@@ -0,0 +1,19 @@
1
+ export const getPrimaryKey = (columns) => {
2
+ const pkColumn = columns.find(c => c.primary);
3
+ if (!pkColumn) throw new Error("Primary key not defined");
4
+ return pkColumn.field;
5
+ };
6
+
7
+ export const attachPrimaryKey = (record, pk, data) => {
8
+ let maxId = 0;
9
+
10
+ for (const row of data) {
11
+ const val = Number(row[pk]) || 0;
12
+ if (val > maxId) maxId = val;
13
+ }
14
+
15
+ return {
16
+ ...record,
17
+ [pk]: maxId + 1
18
+ };
19
+ };
@@ -0,0 +1,9 @@
1
+ import { JSONFilePreset } from 'lowdb/node'
2
+
3
+ const insertBase = async ({ inRequestBody, inTablePath }) => {
4
+ const db = await JSONFilePreset(inTablePath, []);
5
+
6
+ await db.update((posts) => posts.push(inRequestBody))
7
+ };
8
+
9
+ export default insertBase;
@@ -0,0 +1,63 @@
1
+ import path from "path";
2
+
3
+ import generateRest from "kschema-fs-api-gen-rest";
4
+ import fixEndpointsJs from "express-fix-endpoints-post-js";
5
+
6
+ import { locateSource } from "./InsertGenPk/steps/locateSource.js";
7
+ import { locateDestination } from "./InsertGenPk/steps/locateDestination.js";
8
+ import { createFolder } from "../../core/createFolder.js";
9
+
10
+ import { announce } from "./InsertGenPk/steps/announce.js";
11
+
12
+ import resolveFolderName from "./InsertGenPk/steps/resolveFolderName.js";
13
+ import actions from "./InsertGenPk/actions.json" with { type: "json" };
14
+
15
+ const startFunc = async ({ cmd = "", toPath, isAnnounce = true, checkBeforeCreate = true,
16
+ toConfigPath, inTargetPath, inFolderName, inGenerateRest = false
17
+ }) => {
18
+
19
+ const matched = actions;
20
+
21
+ const localToPath = toPath;
22
+
23
+ const resolvedFolderName = resolveFolderName({
24
+ name: cmd
25
+ });
26
+
27
+ if (resolvedFolderName.KTF === false) {
28
+ console.log(resolvedFolderName.KReason);
29
+
30
+ return;
31
+ };
32
+
33
+ const source = locateSource();
34
+ const destination = locateDestination({
35
+ inResolvedFolderName: resolvedFolderName,
36
+ toPath: localToPath
37
+ });
38
+
39
+ const createFolderResponse = createFolder({
40
+ source, destination,
41
+ isAnnounce, checkBeforeCreate
42
+ });
43
+
44
+ if (createFolderResponse.KTF) {
45
+ const fromEndPointsJs = await fixEndpointsJs({
46
+ endPointsJsPath: path.join(localToPath, "end-points.js"),
47
+ inActionName: cmd, inFolderName, inGetType: "bodyParse"
48
+ });
49
+
50
+ if (inGenerateRest) {
51
+ generateRest({
52
+ toConfigPath, inTargetPath,
53
+ toPath: path.join(localToPath, resolvedFolderName),
54
+ });
55
+ };
56
+ };
57
+
58
+ if (isAnnounce) announce({ inResolvedFolderName: resolvedFolderName });
59
+
60
+ return resolvedFolderName;
61
+ };
62
+
63
+ export default startFunc;
@@ -1,30 +1,35 @@
1
- import path from "path";
2
-
3
- import generateRest from "kschema-fs-api-gen-rest";
4
- import fixEndpointsJs from "express-fix-endpoints-post-js";
5
-
6
1
  import { locateSource } from "./InsertGenPk/steps/locateSource.js";
7
2
  import { locateDestination } from "./InsertGenPk/steps/locateDestination.js";
8
- import { createFolder } from "../../core/createFolder.js";
9
-
10
3
  import { announce } from "./InsertGenPk/steps/announce.js";
11
-
12
4
  import resolveFolderName from "./InsertGenPk/steps/resolveFolderName.js";
13
- import actions from "./InsertGenPk/actions.json" with { type: "json" };
14
-
15
- const startFunc = async ({ cmd = "", toPath, isAnnounce = true, checkBeforeCreate = true,
16
- toConfigPath, inTargetPath, inFolderName, inGenerateRest = false
5
+ import { createActionFolder } from "./InsertGenPk/steps/createActionFolder.js";
6
+ import { updateEndPointsJs } from "./InsertGenPk/steps/updateEndPointsJs.js";
7
+ import { generateRestIfRequested } from "./InsertGenPk/steps/generateRestIfRequested.js";
8
+ import { showLog as writeLog } from "./InsertGenPk/steps/showLog.js";
9
+
10
+ const startFunc = async ({ toPath, isAnnounce = true, checkBeforeCreate = true,
11
+ toConfigPath, inTargetPath, inFolderName, inGenerateRest = false, showLog = false,
12
+ inPort
17
13
  }) => {
14
+ const cmd = "insertGenPk";
18
15
 
19
- const matched = actions;
20
-
21
- const localToPath = toPath;
16
+ writeLog({
17
+ enabled: showLog,
18
+ message: "Starting WithMail action.",
19
+ data: { cmd: inFolderName, toPath, inFolderName, inGenerateRest }
20
+ });
22
21
 
23
22
  const resolvedFolderName = resolveFolderName({
24
- name: cmd
23
+ name: inFolderName
25
24
  });
26
25
 
27
26
  if (resolvedFolderName.KTF === false) {
27
+ writeLog({
28
+ enabled: showLog,
29
+ message: "Folder name validation failed.",
30
+ data: resolvedFolderName
31
+ });
32
+
28
33
  console.log(resolvedFolderName.KReason);
29
34
 
30
35
  return;
@@ -33,31 +38,48 @@ const startFunc = async ({ cmd = "", toPath, isAnnounce = true, checkBeforeCreat
33
38
  const source = locateSource();
34
39
  const destination = locateDestination({
35
40
  inResolvedFolderName: resolvedFolderName,
36
- toPath: localToPath
41
+ toPath
42
+ });
43
+
44
+ writeLog({
45
+ enabled: showLog,
46
+ message: "Resolved source and destination.",
47
+ data: { source, destination }
37
48
  });
38
49
 
39
- const createFolderResponse = createFolder({
50
+ const createFolderResponse = createActionFolder({
40
51
  source, destination,
41
- isAnnounce, checkBeforeCreate
52
+ isAnnounce, checkBeforeCreate, showLog
42
53
  });
43
54
 
44
55
  if (createFolderResponse.KTF) {
45
- const fromEndPointsJs = await fixEndpointsJs({
46
- endPointsJsPath: path.join(localToPath, "end-points.js"),
47
- inActionName: cmd, inFolderName, inGetType: "bodyParse"
56
+ await updateEndPointsJs({
57
+ toPath,
58
+ cmd,
59
+ inFolderName,
60
+ showLog
48
61
  });
49
62
 
50
- if (inGenerateRest) {
51
- generateRest({
52
- toConfigPath, inTargetPath,
53
- toPath: path.join(localToPath, resolvedFolderName),
54
- });
55
- };
63
+ generateRestIfRequested({
64
+ inGenerateRest,
65
+ toConfigPath,
66
+ inTargetPath,
67
+ toPath,
68
+ resolvedFolderName,
69
+ isShowLog: showLog,
70
+ inPort
71
+ });
56
72
  };
57
73
 
58
74
  if (isAnnounce) announce({ inResolvedFolderName: resolvedFolderName });
59
75
 
76
+ writeLog({
77
+ enabled: showLog,
78
+ message: "WithMail action completed.",
79
+ data: { resolvedFolderName }
80
+ });
81
+
60
82
  return resolvedFolderName;
61
83
  };
62
84
 
63
- export default startFunc;
85
+ export default startFunc;
package/index.js CHANGED
@@ -9,22 +9,25 @@ const load = async (cmd) => {
9
9
  const withMail = async ({ toPath, showLog, toConfigPath, inTargetPath, inGenerateRest }) => {
10
10
  const commandToSend = "withMail";
11
11
 
12
- const commandFunction = await load(commandToSend);
13
- // console.log(" ...args :", args);
14
- await commandFunction({
15
- toPath, cmd: commandToSend, toConfigPath, inTargetPath,
16
- inFolderName: commandToSend, inGenerateRest, showLog
17
- });
18
- };
19
-
20
- const insertGenPk = async ({ toPath, showLog, toConfigPath, inTargetPath, inGenerateRest }) => {
12
+ const commandFunction = await load(commandToSend);
13
+ // console.log(" ...args :", args);
14
+ await commandFunction({
15
+ toPath, cmd: commandToSend, toConfigPath, inTargetPath,
16
+ inFolderName: commandToSend, inGenerateRest, showLog
17
+ });
18
+ };
19
+
20
+ const insertGenPk = async ({ toPath, showLog, toConfigPath, inTargetPath,
21
+ inGenerateRest, inPort }) => {
22
+
21
23
  const commandToSend = "insertGenPk";
22
24
 
23
25
  const commandFunction = await load(commandToSend);
24
26
  // console.log(" ...args :", args);
25
27
  await commandFunction({
26
- toPath, cmd: commandToSend, toConfigPath, inTargetPath,
27
- inFolderName: commandToSend, inGenerateRest
28
+ toPath, toConfigPath, inTargetPath,
29
+ inFolderName: commandToSend, inGenerateRest,
30
+ showLog, inPort
28
31
  });
29
32
  };
30
33
 
@@ -41,4 +44,4 @@ const insertAsIs = async ({ toPath, showLog, toConfigPath, inTargetPath, inGener
41
44
 
42
45
  export {
43
46
  withMail, insertGenPk, insertAsIs
44
- };
47
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kschema-fs-api-gen-post-actions",
3
- "version": "1.11.2",
3
+ "version": "1.11.3",
4
4
  "description": "start from end points js, generate post methods",
5
5
  "keywords": [
6
6
  "cli",