@solidstarters/solid-core 1.2.187 → 1.2.188

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 (63) hide show
  1. package/dist/config/iam.config.d.ts +0 -13
  2. package/dist/config/iam.config.d.ts.map +1 -1
  3. package/dist/config/iam.config.js +2 -12
  4. package/dist/config/iam.config.js.map +1 -1
  5. package/dist/config/jwt.config.d.ts +14 -0
  6. package/dist/config/jwt.config.d.ts.map +1 -0
  7. package/dist/config/jwt.config.js +15 -0
  8. package/dist/config/jwt.config.js.map +1 -0
  9. package/dist/decorators/active-user.decorator.d.ts +1 -1
  10. package/dist/guards/access-token.guard.d.ts +1 -1
  11. package/dist/guards/access-token.guard.d.ts.map +1 -1
  12. package/dist/guards/access-token.guard.js +2 -2
  13. package/dist/guards/access-token.guard.js.map +1 -1
  14. package/dist/interfaces.d.ts +16 -1
  15. package/dist/interfaces.d.ts.map +1 -1
  16. package/dist/interfaces.js.map +1 -1
  17. package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.d.ts.map +1 -1
  18. package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.js +7 -0
  19. package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.js.map +1 -1
  20. package/dist/services/authentication.service.d.ts +8 -7
  21. package/dist/services/authentication.service.d.ts.map +1 -1
  22. package/dist/services/authentication.service.js +12 -11
  23. package/dist/services/authentication.service.js.map +1 -1
  24. package/dist/services/crud.service.d.ts +1 -0
  25. package/dist/services/crud.service.d.ts.map +1 -1
  26. package/dist/services/crud.service.js +14 -12
  27. package/dist/services/crud.service.js.map +1 -1
  28. package/dist/services/dashboard-question.service.d.ts.map +1 -1
  29. package/dist/services/dashboard-question.service.js +23 -2
  30. package/dist/services/dashboard-question.service.js.map +1 -1
  31. package/dist/services/genai/mcp-handlers/solid-add-button-to-form-view-mcp-handler.service.d.ts +16 -0
  32. package/dist/services/genai/mcp-handlers/solid-add-button-to-form-view-mcp-handler.service.d.ts.map +1 -0
  33. package/dist/services/genai/mcp-handlers/solid-add-button-to-form-view-mcp-handler.service.js +151 -0
  34. package/dist/services/genai/mcp-handlers/solid-add-button-to-form-view-mcp-handler.service.js.map +1 -0
  35. package/dist/services/genai/mcp-handlers/solid-add-controller-handler-method-mcp-handler.service.d.ts +1 -0
  36. package/dist/services/genai/mcp-handlers/solid-add-controller-handler-method-mcp-handler.service.d.ts.map +1 -1
  37. package/dist/services/genai/mcp-handlers/solid-add-controller-handler-method-mcp-handler.service.js +8 -1
  38. package/dist/services/genai/mcp-handlers/solid-add-controller-handler-method-mcp-handler.service.js.map +1 -1
  39. package/dist/services/genai/mcp-handlers/solid-create-custom-form-view-widget-mcp-handler.service.d.ts +14 -0
  40. package/dist/services/genai/mcp-handlers/solid-create-custom-form-view-widget-mcp-handler.service.d.ts.map +1 -0
  41. package/dist/services/genai/mcp-handlers/solid-create-custom-form-view-widget-mcp-handler.service.js +73 -0
  42. package/dist/services/genai/mcp-handlers/solid-create-custom-form-view-widget-mcp-handler.service.js.map +1 -0
  43. package/dist/services/setting.service.d.ts.map +1 -1
  44. package/dist/services/setting.service.js +3 -2
  45. package/dist/services/setting.service.js.map +1 -1
  46. package/dist/solid-core.module.d.ts.map +1 -1
  47. package/dist/solid-core.module.js +7 -2
  48. package/dist/solid-core.module.js.map +1 -1
  49. package/dist/tsconfig.tsbuildinfo +1 -1
  50. package/package.json +1 -1
  51. package/src/config/iam.config.ts +1 -11
  52. package/src/config/jwt.config.ts +13 -0
  53. package/src/guards/access-token.guard.ts +1 -1
  54. package/src/interfaces.ts +17 -1
  55. package/src/jobs/database/trigger-mcp-client-subscriber-database.service.ts +18 -0
  56. package/src/services/authentication.service.ts +17 -17
  57. package/src/services/crud.service.ts +17 -31
  58. package/src/services/dashboard-question.service.ts +29 -2
  59. package/src/services/genai/mcp-handlers/solid-add-button-to-form-view-mcp-handler.service.ts +137 -0
  60. package/src/services/genai/mcp-handlers/solid-add-controller-handler-method-mcp-handler.service.ts +21 -7
  61. package/src/services/genai/mcp-handlers/solid-create-custom-form-view-widget-mcp-handler.service.ts +72 -0
  62. package/src/services/setting.service.ts +3 -2
  63. package/src/solid-core.module.ts +7 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"solid-add-button-to-form-view-mcp-handler.service.js","sourceRoot":"","sources":["../../../../src/services/genai/mcp-handlers/solid-add-button-to-form-view-mcp-handler.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Injectable, Logger } from \"@nestjs/common\";\nimport { AiInteraction } from \"src/entities/ai-interaction.entity\";\nimport { IMcpToolResponseHandler, McpComputedProviderResponse, PlanStep } from \"../../../interfaces\";\nimport { SolidTsMorphService } from \"src/services/solid-ts-morph.service\";\nimport { ModuleMetadataHelperService } from \"src/helpers/module-metadata-helper.service\";\nimport * as fs from \"fs/promises\";\n\nconst RESTART_TOUCH_FILE = process.env.MCP_RESTART_TOUCH_FILE || \"tmp/restart.touch\";\n\n@Injectable()\nexport class SolidAddButtonToFormViewMcpHandler implements IMcpToolResponseHandler {\n private readonly logger = new Logger(SolidAddButtonToFormViewMcpHandler.name);\n\n constructor(\n private readonly tsMorph: SolidTsMorphService,\n private readonly moduleMetadataHelperService: ModuleMetadataHelperService,\n\n ) { }\n\n async apply(aiInteraction: AiInteraction) {\n const raw = this.safeParse(aiInteraction.message);\n const payload: McpComputedProviderResponse | undefined = (raw?.data?.plan ? raw.data : raw) as McpComputedProviderResponse;\n\n if (!payload || !Array.isArray(payload.plan)) {\n throw new Error(\"SolidAddButtonToFormViewMcpHandler: invalid MCP response; missing plan[]\");\n }\n\n // Batch all plan steps in a single txn so nodemon restarts only once.\n this.tsMorph.begin();\n try {\n for (const step of payload.plan as PlanStep[]) {\n switch (step.type) {\n case \"createNewFile\": {\n const overwrite = step.overwrite ?? false;\n this.tsMorph.createNewFile(step.path, step.content, overwrite);\n break;\n }\n case \"registerSolidXExtensionComponent\": {\n this.tsMorph.registerSolidUiExtension(\n step.path,\n step.content,\n );\n this.tsMorph.addImport(\n step.path,\n step.importExtensionComponent,\n );\n break;\n }\n case \"addFormViewButton\": {\n\n const filePath =\n await this.moduleMetadataHelperService.getModuleMetadataFilePath(\n step.moduleName\n );\n try {\n await fs.access(filePath);\n } catch {\n this.logger.error(`Metadata file not found: ${filePath}`);\n return;\n }\n const metaData =\n await this.moduleMetadataHelperService.getModuleMetadataConfiguration(\n filePath\n );\n // Remove, update or insert logic\n\n\n // Find the existing view of type \"list\" for the given module & model\n const existingViewIndex = metaData.views.findIndex(\n (view: any) =>\n view.type === \"form\" &&\n view.moduleUserKey === step.moduleName &&\n view.modelUserKey === step.modelName\n );\n\n if (existingViewIndex !== -1) {\n const view = metaData.views[existingViewIndex];\n\n // Ensure layout & attrs exist\n view.layout = view.layout || {};\n view.layout.attrs = view.layout.attrs || {};\n\n // Initialize rowButtons or headerButtons if not present\n if (!Array.isArray(view.layout.attrs[step.buttonType])) {\n view.layout.attrs[step.buttonType] = [];\n }\n let buttonContent = step.content;\n // Parse only if it’s a string\n if (typeof buttonContent === \"string\") {\n try {\n buttonContent = JSON.parse(buttonContent);\n } catch (err) {\n this.logger.error(\"❌ Failed to parse step.content JSON:\", err);\n return;\n }\n }\n // Push the new button content\n view.layout.attrs[step.buttonType].push(buttonContent);\n\n console.log(`Added ${step.buttonType} to view: ${view.name}`);\n } else {\n console.warn(`No matching list view found for module=${step.moduleName} and model=${step.modelName}`);\n }\n\n const updatedContent = JSON.stringify(metaData, null, 2);\n await fs.writeFile(filePath, updatedContent);\n this.logger.log(`Updated list view in ${filePath}`);\n\n break;\n }\n default:\n throw new Error(`Unsupported plan step type: ${(step as any).type}`);\n }\n }\n\n const result = await this.tsMorph.commit();\n\n return {\n seedingRequired: true,\n serverRebooting: false,\n };\n } catch (err) {\n this.logger.error(`Apply failed; rolling back. ${String(err)}`);\n this.tsMorph.rollback();\n throw err;\n }\n }\n\n private safeParse(str: string): any {\n try {\n return JSON.parse(str);\n } catch {\n const unescaped = str.replace(/\\\\'/g, \"'\");\n return JSON.parse(unescaped);\n }\n }\n}"]}
@@ -12,5 +12,6 @@ export declare class SolidAddControllerHandlerMcpHandler implements IMcpToolResp
12
12
  wroteFiles: number;
13
13
  }>;
14
14
  private safeParse;
15
+ private handleAddMethodToExistingClass;
15
16
  }
16
17
  //# sourceMappingURL=solid-add-controller-handler-method-mcp-handler.service.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"solid-add-controller-handler-method-mcp-handler.service.d.ts","sourceRoot":"","sources":["../../../../src/services/genai/mcp-handlers/solid-add-controller-handler-method-mcp-handler.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AACnE,OAAO,EAAE,uBAAuB,EAAyC,MAAM,qBAAqB,CAAC;AACrG,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAE1E,qBACa,mCAAoC,YAAW,uBAAuB;IAGrE,OAAO,CAAC,QAAQ,CAAC,OAAO;IAFpC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAwD;gBAElD,OAAO,EAAE,mBAAmB;IAEnD,KAAK,CAAC,aAAa,EAAE,aAAa;;;;;;IA+CxC,OAAO,CAAC,SAAS;CAQlB"}
1
+ {"version":3,"file":"solid-add-controller-handler-method-mcp-handler.service.d.ts","sourceRoot":"","sources":["../../../../src/services/genai/mcp-handlers/solid-add-controller-handler-method-mcp-handler.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AACnE,OAAO,EAAgC,uBAAuB,EAAyC,MAAM,qBAAqB,CAAC;AACnI,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAE1E,qBACa,mCAAoC,YAAW,uBAAuB;IAGrE,OAAO,CAAC,QAAQ,CAAC,OAAO;IAFpC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAwD;gBAElD,OAAO,EAAE,mBAAmB;IAEnD,KAAK,CAAC,aAAa,EAAE,aAAa;;;;;;IA0CxC,OAAO,CAAC,SAAS;IASjB,OAAO,CAAC,8BAA8B;CAkBvC"}
@@ -34,7 +34,7 @@ let SolidAddControllerHandlerMcpHandler = SolidAddControllerHandlerMcpHandler_1
34
34
  break;
35
35
  }
36
36
  case "addMethodToExistingClass": {
37
- this.tsMorph.addMethodToExistingClass(step.path, step.className, step.methodName, step.content);
37
+ this.handleAddMethodToExistingClass(step);
38
38
  break;
39
39
  }
40
40
  default:
@@ -64,6 +64,13 @@ let SolidAddControllerHandlerMcpHandler = SolidAddControllerHandlerMcpHandler_1
64
64
  return JSON.parse(unescaped);
65
65
  }
66
66
  }
67
+ handleAddMethodToExistingClass(step) {
68
+ const addMethodStep = step;
69
+ if (addMethodStep.importStatements && addMethodStep.importStatements.length > 0) {
70
+ this.tsMorph.addImport(addMethodStep.path, (addMethodStep.importStatements || []).join('\n'));
71
+ }
72
+ this.tsMorph.addMethodToExistingClass(addMethodStep.path, addMethodStep.className, addMethodStep.methodName, addMethodStep.content);
73
+ }
67
74
  };
68
75
  exports.SolidAddControllerHandlerMcpHandler = SolidAddControllerHandlerMcpHandler;
69
76
  exports.SolidAddControllerHandlerMcpHandler = SolidAddControllerHandlerMcpHandler = SolidAddControllerHandlerMcpHandler_1 = __decorate([
@@ -1 +1 @@
1
- {"version":3,"file":"solid-add-controller-handler-method-mcp-handler.service.js","sourceRoot":"","sources":["../../../../src/services/genai/mcp-handlers/solid-add-controller-handler-method-mcp-handler.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,2CAAoD;AAGpD,yEAA0E;AAGnE,IAAM,mCAAmC,2CAAzC,MAAM,mCAAmC;IAG9C,YAA6B,OAA4B;QAA5B,YAAO,GAAP,OAAO,CAAqB;QAFxC,WAAM,GAAG,IAAI,eAAM,CAAC,qCAAmC,CAAC,IAAI,CAAC,CAAC;IAElB,CAAC;IAE9D,KAAK,CAAC,KAAK,CAAC,aAA4B;QACtC,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QAClD,MAAM,OAAO,GAA4C,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAgC,CAAC;QAE3H,IAAI,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7C,MAAM,IAAI,KAAK,CAAC,iFAAiF,CAAC,CAAC;QACrG,CAAC;QAGD,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACrB,IAAI,CAAC;YACH,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,IAAkB,EAAE,CAAC;gBAC9C,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;oBAClB,KAAK,eAAe,CAAC,CAAC,CAAC;wBACrB,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC;wBAC1C,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;wBAC/D,MAAM;oBACR,CAAC;oBACD,KAAK,0BAA0B,CAAC,CAAC,CAAC;wBAChC,IAAI,CAAC,OAAO,CAAC,wBAAwB,CACnC,IAAI,CAAC,IAAI,EACT,IAAI,CAAC,SAAS,EACd,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,OAAO,CACb,CAAC;wBACF,MAAM;oBACR,CAAC;oBACD;wBACE,MAAM,IAAI,KAAK,CAAC,+BAAgC,IAAY,CAAC,IAAI,EAAE,CAAC,CAAC;gBACzE,CAAC;YACH,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YAE3C,OAAO;gBACL,eAAe,EAAE,IAAI;gBACrB,eAAe,EAAE,IAAI;gBACrB,YAAY,EAAE,OAAO,CAAC,IAAI,CAAC,MAAM;gBACjC,UAAU,EAAE,MAAM,CAAC,KAAK;aACzB,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,+BAA+B,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChE,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;YACxB,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IAEO,SAAS,CAAC,GAAW;QAC3B,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;YAC3C,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;CACF,CAAA;AA5DY,kFAAmC;8CAAnC,mCAAmC;IAD/C,IAAA,mBAAU,GAAE;qCAI2B,4CAAmB;GAH9C,mCAAmC,CA4D/C","sourcesContent":["import { Injectable, Logger } from \"@nestjs/common\";\nimport { AiInteraction } from \"src/entities/ai-interaction.entity\";\nimport { IMcpToolResponseHandler, McpComputedProviderResponse, PlanStep } from \"../../../interfaces\";\nimport { SolidTsMorphService } from \"src/services/solid-ts-morph.service\";\n\n@Injectable()\nexport class SolidAddControllerHandlerMcpHandler implements IMcpToolResponseHandler {\n private readonly logger = new Logger(SolidAddControllerHandlerMcpHandler.name);\n\n constructor(private readonly tsMorph: SolidTsMorphService) { }\n\n async apply(aiInteraction: AiInteraction) {\n const raw = this.safeParse(aiInteraction.message);\n const payload: McpComputedProviderResponse | undefined = (raw?.data?.plan ? raw.data : raw) as McpComputedProviderResponse;\n\n if (!payload || !Array.isArray(payload.plan)) {\n throw new Error(\"SolidAddControllerHandlerMethodMcpHandler: invalid MCP response; missing plan[]\");\n }\n\n // Batch all plan steps in a single txn so nodemon restarts only once.\n this.tsMorph.begin();\n try {\n for (const step of payload.plan as PlanStep[]) {\n switch (step.type) {\n case \"createNewFile\": {\n const overwrite = step.overwrite ?? false;\n this.tsMorph.createNewFile(step.path, step.content, overwrite);\n break;\n }\n case \"addMethodToExistingClass\": {\n this.tsMorph.addMethodToExistingClass(\n step.path,\n step.className,\n step.methodName,\n step.content,\n );\n break;\n }\n default:\n throw new Error(`Unsupported plan step type: ${(step as any).type}`);\n }\n }\n\n const result = await this.tsMorph.commit();\n\n return {\n seedingRequired: true,\n serverRebooting: true,\n appliedSteps: payload.plan.length,\n wroteFiles: result.wrote,\n };\n } catch (err) {\n this.logger.error(`Apply failed; rolling back. ${String(err)}`);\n this.tsMorph.rollback();\n throw err;\n }\n }\n\n private safeParse(str: string): any {\n try {\n return JSON.parse(str);\n } catch {\n const unescaped = str.replace(/\\\\'/g, \"'\");\n return JSON.parse(unescaped);\n }\n }\n}"]}
1
+ {"version":3,"file":"solid-add-controller-handler-method-mcp-handler.service.js","sourceRoot":"","sources":["../../../../src/services/genai/mcp-handlers/solid-add-controller-handler-method-mcp-handler.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,2CAAoD;AAGpD,yEAA0E;AAGnE,IAAM,mCAAmC,2CAAzC,MAAM,mCAAmC;IAG9C,YAA6B,OAA4B;QAA5B,YAAO,GAAP,OAAO,CAAqB;QAFxC,WAAM,GAAG,IAAI,eAAM,CAAC,qCAAmC,CAAC,IAAI,CAAC,CAAC;IAElB,CAAC;IAE9D,KAAK,CAAC,KAAK,CAAC,aAA4B;QACtC,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QAClD,MAAM,OAAO,GAA4C,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAgC,CAAC;QAE3H,IAAI,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7C,MAAM,IAAI,KAAK,CAAC,iFAAiF,CAAC,CAAC;QACrG,CAAC;QAGD,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACrB,IAAI,CAAC;YACH,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,IAAkB,EAAE,CAAC;gBAC9C,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;oBAClB,KAAK,eAAe,CAAC,CAAC,CAAC;wBACrB,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC;wBAC1C,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;wBAC/D,MAAM;oBACR,CAAC;oBACD,KAAK,0BAA0B,CAAC,CAAC,CAAC;wBAChC,IAAI,CAAC,8BAA8B,CAAC,IAAI,CAAC,CAAC;wBAC1C,MAAM;oBACR,CAAC;oBACD;wBACE,MAAM,IAAI,KAAK,CAAC,+BAAgC,IAAY,CAAC,IAAI,EAAE,CAAC,CAAC;gBACzE,CAAC;YACH,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YAE3C,OAAO;gBACL,eAAe,EAAE,IAAI;gBACrB,eAAe,EAAE,IAAI;gBACrB,YAAY,EAAE,OAAO,CAAC,IAAI,CAAC,MAAM;gBACjC,UAAU,EAAE,MAAM,CAAC,KAAK;aACzB,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,+BAA+B,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChE,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;YACxB,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IAEO,SAAS,CAAC,GAAW;QAC3B,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;YAC3C,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IAEO,8BAA8B,CAAC,IAAc;QAEnD,MAAM,aAAa,GAAG,IAAoC,CAAA;QAE1D,IAAI,aAAa,CAAC,gBAAgB,IAAI,aAAa,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChF,IAAI,CAAC,OAAO,CAAC,SAAS,CACpB,aAAa,CAAC,IAAI,EAClB,CAAC,aAAa,CAAC,gBAAgB,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAClD,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,wBAAwB,CACnC,aAAa,CAAC,IAAI,EAClB,aAAa,CAAC,SAAS,EACvB,aAAa,CAAC,UAAU,EACxB,aAAa,CAAC,OAAO,CACtB,CAAC;IACJ,CAAC;CACF,CAAA;AA1EY,kFAAmC;8CAAnC,mCAAmC;IAD/C,IAAA,mBAAU,GAAE;qCAI2B,4CAAmB;GAH9C,mCAAmC,CA0E/C","sourcesContent":["import { Injectable, Logger } from \"@nestjs/common\";\nimport { AiInteraction } from \"src/entities/ai-interaction.entity\";\nimport { AddMethodToExistingClassStep, IMcpToolResponseHandler, McpComputedProviderResponse, PlanStep } from \"../../../interfaces\";\nimport { SolidTsMorphService } from \"src/services/solid-ts-morph.service\";\n\n@Injectable()\nexport class SolidAddControllerHandlerMcpHandler implements IMcpToolResponseHandler {\n private readonly logger = new Logger(SolidAddControllerHandlerMcpHandler.name);\n\n constructor(private readonly tsMorph: SolidTsMorphService) { }\n\n async apply(aiInteraction: AiInteraction) {\n const raw = this.safeParse(aiInteraction.message);\n const payload: McpComputedProviderResponse | undefined = (raw?.data?.plan ? raw.data : raw) as McpComputedProviderResponse;\n\n if (!payload || !Array.isArray(payload.plan)) {\n throw new Error(\"SolidAddControllerHandlerMethodMcpHandler: invalid MCP response; missing plan[]\");\n }\n\n // Batch all plan steps in a single txn so nodemon restarts only once.\n this.tsMorph.begin();\n try {\n for (const step of payload.plan as PlanStep[]) {\n switch (step.type) {\n case \"createNewFile\": {\n const overwrite = step.overwrite ?? false;\n this.tsMorph.createNewFile(step.path, step.content, overwrite);\n break;\n }\n case \"addMethodToExistingClass\": {\n this.handleAddMethodToExistingClass(step);\n break;\n }\n default:\n throw new Error(`Unsupported plan step type: ${(step as any).type}`);\n }\n }\n\n const result = await this.tsMorph.commit();\n\n return {\n seedingRequired: true,\n serverRebooting: true,\n appliedSteps: payload.plan.length,\n wroteFiles: result.wrote,\n };\n } catch (err) {\n this.logger.error(`Apply failed; rolling back. ${String(err)}`);\n this.tsMorph.rollback();\n throw err;\n }\n }\n\n private safeParse(str: string): any {\n try {\n return JSON.parse(str);\n } catch {\n const unescaped = str.replace(/\\\\'/g, \"'\");\n return JSON.parse(unescaped);\n }\n }\n\n private handleAddMethodToExistingClass(step: PlanStep) {\n // Cast step to the appropriate type if necessary\n const addMethodStep = step as AddMethodToExistingClassStep\n // Add the import statement to the specified file\n if (addMethodStep.importStatements && addMethodStep.importStatements.length > 0) {\n this.tsMorph.addImport(\n addMethodStep.path,\n (addMethodStep.importStatements || []).join('\\n'),\n );\n }\n // Add the method content to the specified class in the file\n this.tsMorph.addMethodToExistingClass(\n addMethodStep.path,\n addMethodStep.className,\n addMethodStep.methodName,\n addMethodStep.content,\n );\n }\n}"]}
@@ -0,0 +1,14 @@
1
+ import { AiInteraction } from "src/entities/ai-interaction.entity";
2
+ import { IMcpToolResponseHandler } from "../../../interfaces";
3
+ import { SolidTsMorphService } from "src/services/solid-ts-morph.service";
4
+ export declare class SolidCreateCustomFormViewWidgetMcpHandler implements IMcpToolResponseHandler {
5
+ private readonly tsMorph;
6
+ private readonly logger;
7
+ constructor(tsMorph: SolidTsMorphService);
8
+ apply(aiInteraction: AiInteraction): Promise<{
9
+ seedingRequired: boolean;
10
+ serverRebooting: boolean;
11
+ }>;
12
+ private safeParse;
13
+ }
14
+ //# sourceMappingURL=solid-create-custom-form-view-widget-mcp-handler.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"solid-create-custom-form-view-widget-mcp-handler.service.d.ts","sourceRoot":"","sources":["../../../../src/services/genai/mcp-handlers/solid-create-custom-form-view-widget-mcp-handler.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AACnE,OAAO,EAAE,uBAAuB,EAAyC,MAAM,qBAAqB,CAAC;AACrG,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAI1E,qBACa,yCAA0C,YAAW,uBAAuB;IAIjF,OAAO,CAAC,QAAQ,CAAC,OAAO;IAH5B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA8D;gBAGhE,OAAO,EAAE,mBAAmB;IAI3C,KAAK,CAAC,aAAa,EAAE,aAAa;;;;IA+CxC,OAAO,CAAC,SAAS;CAQpB"}
@@ -0,0 +1,73 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var SolidCreateCustomFormViewWidgetMcpHandler_1;
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.SolidCreateCustomFormViewWidgetMcpHandler = void 0;
14
+ const common_1 = require("@nestjs/common");
15
+ const solid_ts_morph_service_1 = require("../../solid-ts-morph.service");
16
+ const RESTART_TOUCH_FILE = process.env.MCP_RESTART_TOUCH_FILE || "tmp/restart.touch";
17
+ let SolidCreateCustomFormViewWidgetMcpHandler = SolidCreateCustomFormViewWidgetMcpHandler_1 = class SolidCreateCustomFormViewWidgetMcpHandler {
18
+ constructor(tsMorph) {
19
+ this.tsMorph = tsMorph;
20
+ this.logger = new common_1.Logger(SolidCreateCustomFormViewWidgetMcpHandler_1.name);
21
+ }
22
+ async apply(aiInteraction) {
23
+ const raw = this.safeParse(aiInteraction.message);
24
+ const payload = (raw?.data?.plan ? raw.data : raw);
25
+ if (!payload || !Array.isArray(payload.plan)) {
26
+ throw new Error("SolidCreateCustomFormViewWidgetMcpHandler: invalid MCP response; missing plan[]");
27
+ }
28
+ this.tsMorph.begin();
29
+ try {
30
+ for (const step of payload.plan) {
31
+ switch (step.type) {
32
+ case "createNewFile": {
33
+ const overwrite = step.overwrite ?? false;
34
+ this.tsMorph.createNewFile(step.path, step.content, overwrite);
35
+ break;
36
+ }
37
+ case "registerSolidXExtensionComponent": {
38
+ this.tsMorph.registerSolidUiExtension(step.path, step.content);
39
+ this.tsMorph.addImport(step.path, step.importExtensionComponent);
40
+ break;
41
+ }
42
+ default:
43
+ throw new Error(`Unsupported plan step type: ${step.type}`);
44
+ }
45
+ }
46
+ const result = await this.tsMorph.commit();
47
+ return {
48
+ seedingRequired: true,
49
+ serverRebooting: false,
50
+ };
51
+ }
52
+ catch (err) {
53
+ this.logger.error(`Apply failed; rolling back. ${String(err)}`);
54
+ this.tsMorph.rollback();
55
+ throw err;
56
+ }
57
+ }
58
+ safeParse(str) {
59
+ try {
60
+ return JSON.parse(str);
61
+ }
62
+ catch {
63
+ const unescaped = str.replace(/\\'/g, "'");
64
+ return JSON.parse(unescaped);
65
+ }
66
+ }
67
+ };
68
+ exports.SolidCreateCustomFormViewWidgetMcpHandler = SolidCreateCustomFormViewWidgetMcpHandler;
69
+ exports.SolidCreateCustomFormViewWidgetMcpHandler = SolidCreateCustomFormViewWidgetMcpHandler = SolidCreateCustomFormViewWidgetMcpHandler_1 = __decorate([
70
+ (0, common_1.Injectable)(),
71
+ __metadata("design:paramtypes", [solid_ts_morph_service_1.SolidTsMorphService])
72
+ ], SolidCreateCustomFormViewWidgetMcpHandler);
73
+ //# sourceMappingURL=solid-create-custom-form-view-widget-mcp-handler.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"solid-create-custom-form-view-widget-mcp-handler.service.js","sourceRoot":"","sources":["../../../../src/services/genai/mcp-handlers/solid-create-custom-form-view-widget-mcp-handler.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,2CAAoD;AAGpD,yEAA0E;AAE1E,MAAM,kBAAkB,GAAG,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,mBAAmB,CAAC;AAG9E,IAAM,yCAAyC,iDAA/C,MAAM,yCAAyC;IAGlD,YACqB,OAA4B;QAA5B,YAAO,GAAP,OAAO,CAAqB;QAHhC,WAAM,GAAG,IAAI,eAAM,CAAC,2CAAyC,CAAC,IAAI,CAAC,CAAC;IAKjF,CAAC;IAEL,KAAK,CAAC,KAAK,CAAC,aAA4B;QACpC,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QAClD,MAAM,OAAO,GAA4C,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAgC,CAAC;QAE3H,IAAI,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3C,MAAM,IAAI,KAAK,CAAC,iFAAiF,CAAC,CAAC;QACvG,CAAC;QAGD,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACrB,IAAI,CAAC;YACD,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,IAAkB,EAAE,CAAC;gBAC5C,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;oBAChB,KAAK,eAAe,CAAC,CAAC,CAAC;wBACnB,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC;wBAC1C,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;wBAC/D,MAAM;oBACV,CAAC;oBACD,KAAK,kCAAkC,CAAC,CAAC,CAAC;wBACtC,IAAI,CAAC,OAAO,CAAC,wBAAwB,CACjC,IAAI,CAAC,IAAI,EACT,IAAI,CAAC,OAAO,CACf,CAAC;wBACF,IAAI,CAAC,OAAO,CAAC,SAAS,CAClB,IAAI,CAAC,IAAI,EACT,IAAI,CAAC,wBAAwB,CAChC,CAAC;wBACF,MAAM;oBACV,CAAC;oBACD;wBACI,MAAM,IAAI,KAAK,CAAC,+BAAgC,IAAY,CAAC,IAAI,EAAE,CAAC,CAAC;gBAC7E,CAAC;YACL,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YAE3C,OAAO;gBACH,eAAe,EAAE,IAAI;gBACrB,eAAe,EAAE,KAAK;aACzB,CAAC;QACN,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,+BAA+B,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChE,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;YACxB,MAAM,GAAG,CAAC;QACd,CAAC;IACL,CAAC;IAEO,SAAS,CAAC,GAAW;QACzB,IAAI,CAAC;YACD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC3B,CAAC;QAAC,MAAM,CAAC;YACL,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;YAC3C,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACjC,CAAC;IACL,CAAC;CACJ,CAAA;AA/DY,8FAAyC;oDAAzC,yCAAyC;IADrD,IAAA,mBAAU,GAAE;qCAKqB,4CAAmB;GAJxC,yCAAyC,CA+DrD","sourcesContent":["import { Injectable, Logger } from \"@nestjs/common\";\nimport { AiInteraction } from \"src/entities/ai-interaction.entity\";\nimport { IMcpToolResponseHandler, McpComputedProviderResponse, PlanStep } from \"../../../interfaces\";\nimport { SolidTsMorphService } from \"src/services/solid-ts-morph.service\";\n\nconst RESTART_TOUCH_FILE = process.env.MCP_RESTART_TOUCH_FILE || \"tmp/restart.touch\";\n\n@Injectable()\nexport class SolidCreateCustomFormViewWidgetMcpHandler implements IMcpToolResponseHandler {\n private readonly logger = new Logger(SolidCreateCustomFormViewWidgetMcpHandler.name);\n\n constructor(\n private readonly tsMorph: SolidTsMorphService,\n\n ) { }\n\n async apply(aiInteraction: AiInteraction) {\n const raw = this.safeParse(aiInteraction.message);\n const payload: McpComputedProviderResponse | undefined = (raw?.data?.plan ? raw.data : raw) as McpComputedProviderResponse;\n\n if (!payload || !Array.isArray(payload.plan)) {\n throw new Error(\"SolidCreateCustomFormViewWidgetMcpHandler: invalid MCP response; missing plan[]\");\n }\n\n // Batch all plan steps in a single txn so nodemon restarts only once.\n this.tsMorph.begin();\n try {\n for (const step of payload.plan as PlanStep[]) {\n switch (step.type) {\n case \"createNewFile\": {\n const overwrite = step.overwrite ?? false;\n this.tsMorph.createNewFile(step.path, step.content, overwrite);\n break;\n }\n case \"registerSolidXExtensionComponent\": {\n this.tsMorph.registerSolidUiExtension(\n step.path,\n step.content,\n );\n this.tsMorph.addImport(\n step.path,\n step.importExtensionComponent,\n );\n break;\n }\n default:\n throw new Error(`Unsupported plan step type: ${(step as any).type}`);\n }\n }\n\n const result = await this.tsMorph.commit();\n\n return {\n seedingRequired: true,\n serverRebooting: false,\n };\n } catch (err) {\n this.logger.error(`Apply failed; rolling back. ${String(err)}`);\n this.tsMorph.rollback();\n throw err;\n }\n }\n\n private safeParse(str: string): any {\n try {\n return JSON.parse(str);\n } catch {\n const unescaped = str.replace(/\\\\'/g, \"'\");\n return JSON.parse(unescaped);\n }\n }\n}"]}
@@ -1 +1 @@
1
- {"version":3,"file":"setting.service.d.ts","sourceRoot":"","sources":["../../src/services/setting.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE3D,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAEpD,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAC3E,OAAO,EAAE,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAC7E,OAAO,YAAY,MAAM,0BAA0B,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AACrD,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,IAAI,EAAE,MAAM,0BAA0B,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAE/D,qBACa,cAAe,SAAQ,WAAW,CAAC,OAAO,CAAC;IAEpD,QAAQ,CAAC,oBAAoB,EAAE,oBAAoB;IACnD,QAAQ,CAAC,qBAAqB,EAAE,qBAAqB;IACrD,QAAQ,CAAC,aAAa,EAAE,aAAa;IACrC,QAAQ,CAAC,WAAW,EAAE,WAAW;IACjC,QAAQ,CAAC,gBAAgB,EAAE,gBAAgB;IAC3C,QAAQ,CAAC,iBAAiB,EAAE,iBAAiB;IACtB,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IAExD,OAAO,CAAC,QAAQ,CAAC,mBAAmB;IAEpC,QAAQ,CAAC,aAAa,EAAE,aAAa;IAErC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC,OAAO,CAAC;IAClC,QAAQ,CAAC,SAAS,EAAE,SAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,qBAAqB;IACd,OAAO,CAAC,QAAQ,CAAC,cAAc;gBAf9C,oBAAoB,EAAE,oBAAoB,EAC1C,qBAAqB,EAAE,qBAAqB,EAC5C,aAAa,EAAE,aAAa,EAC5B,WAAW,EAAE,WAAW,EACxB,gBAAgB,EAAE,gBAAgB,EAClC,iBAAiB,EAAE,iBAAiB,EACL,gBAAgB,EAAE,UAAU,CAAC,OAAO,SAAS,CAAC,EAErE,mBAAmB,EAAE,UAAU,CAAC,OAAO,YAAY,CAAC,EAE5D,aAAa,EAAE,aAAa,EAE5B,IAAI,EAAE,UAAU,CAAC,OAAO,CAAC,EACzB,SAAS,EAAE,SAAS,EACZ,qBAAqB,EAAE,qBAAqB,EACpB,cAAc,EAAE,UAAU,CAAC,IAAI,CAAC;IAMrE,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC;IA4DpC,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAkDlD,OAAO,CAAC,kBAAkB;IA2CpB,cAAc,CAAC,UAAU,EAAE,MAAM;IA8BjC,cAAc,CAClB,QAAQ,GAAE,gBAAgB,EAAO,EACjC,aAAa,GAAE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAM,GAC7C,OAAO,CAAC,OAAO,EAAE,CAAC;IA0Ff,cAAc,IAAI,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;KAAE,CAAC;CAmC5F"}
1
+ {"version":3,"file":"setting.service.d.ts","sourceRoot":"","sources":["../../src/services/setting.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE3D,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAEpD,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAC3E,OAAO,EAAE,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAC7E,OAAO,YAAY,MAAM,0BAA0B,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AACrD,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,IAAI,EAAE,MAAM,0BAA0B,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAE/D,qBACa,cAAe,SAAQ,WAAW,CAAC,OAAO,CAAC;IAEpD,QAAQ,CAAC,oBAAoB,EAAE,oBAAoB;IACnD,QAAQ,CAAC,qBAAqB,EAAE,qBAAqB;IACrD,QAAQ,CAAC,aAAa,EAAE,aAAa;IACrC,QAAQ,CAAC,WAAW,EAAE,WAAW;IACjC,QAAQ,CAAC,gBAAgB,EAAE,gBAAgB;IAC3C,QAAQ,CAAC,iBAAiB,EAAE,iBAAiB;IACtB,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IAExD,OAAO,CAAC,QAAQ,CAAC,mBAAmB;IAEpC,QAAQ,CAAC,aAAa,EAAE,aAAa;IAErC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC,OAAO,CAAC;IAClC,QAAQ,CAAC,SAAS,EAAE,SAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,qBAAqB;IACd,OAAO,CAAC,QAAQ,CAAC,cAAc;gBAf9C,oBAAoB,EAAE,oBAAoB,EAC1C,qBAAqB,EAAE,qBAAqB,EAC5C,aAAa,EAAE,aAAa,EAC5B,WAAW,EAAE,WAAW,EACxB,gBAAgB,EAAE,gBAAgB,EAClC,iBAAiB,EAAE,iBAAiB,EACL,gBAAgB,EAAE,UAAU,CAAC,OAAO,SAAS,CAAC,EAErE,mBAAmB,EAAE,UAAU,CAAC,OAAO,YAAY,CAAC,EAE5D,aAAa,EAAE,aAAa,EAE5B,IAAI,EAAE,UAAU,CAAC,OAAO,CAAC,EACzB,SAAS,EAAE,SAAS,EACZ,qBAAqB,EAAE,qBAAqB,EACpB,cAAc,EAAE,UAAU,CAAC,IAAI,CAAC;IAMrE,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC;IA6DpC,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAkDlD,OAAO,CAAC,kBAAkB;IA2CpB,cAAc,CAAC,UAAU,EAAE,MAAM;IA8BjC,cAAc,CAClB,QAAQ,GAAE,gBAAgB,EAAO,EACjC,aAAa,GAAE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAM,GAC7C,OAAO,CAAC,OAAO,EAAE,CAAC;IA0Ff,cAAc,IAAI,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;KAAE,CAAC;CAmC5F"}
@@ -85,7 +85,8 @@ let SettingService = class SettingService extends crud_service_1.CRUDService {
85
85
  defaultProvider: "",
86
86
  availableProviders: []
87
87
  }),
88
- showNameFieldsForRegistration: this.iamConfiguration.showNameFieldsForRegistration
88
+ showNameFieldsForRegistration: this.iamConfiguration.showNameFieldsForRegistration,
89
+ forceChangePasswordOnFirstLogin: this.iamConfiguration.forceChangePasswordOnFirstLogin
89
90
  };
90
91
  const existingSettings = await this.repo.find();
91
92
  const existingKeys = new Set(existingSettings.map(s => s.key));
@@ -164,7 +165,7 @@ let SettingService = class SettingService extends crud_service_1.CRUDService {
164
165
  shouldQueueSms: this.commonConfiguration.shouldQueueSms,
165
166
  enableDarkMode: true,
166
167
  copyright: null,
167
- forceChangePasswordOnFirstLogin: true,
168
+ forceChangePasswordOnFirstLogin: this.iamConfiguration.forceChangePasswordOnFirstLogin,
168
169
  enableUsername: true,
169
170
  enabledNotification: true,
170
171
  contactSupportEmail: null,
@@ -1 +1 @@
1
- {"version":3,"file":"setting.service.js","sourceRoot":"","sources":["../../src/services/setting.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Inject, Injectable } from '@nestjs/common';\nimport { DiscoveryService, ModuleRef } from \"@nestjs/core\";\nimport { InjectEntityManager, InjectRepository } from '@nestjs/typeorm';\nimport { EntityManager, Repository } from 'typeorm';\n\nimport { ConfigService, ConfigType } from '@nestjs/config';\nimport { CrudHelperService } from 'src/services/crud-helper.service';\nimport { CRUDService } from 'src/services/crud.service';\nimport { FileService } from 'src/services/file.service';\nimport { ModelMetadataService } from 'src/services/model-metadata.service';\nimport { ModuleMetadataService } from 'src/services/module-metadata.service';\nimport commonConfig from 'src/config/common.config';\nimport { iamConfig } from 'src/config/iam.config';\nimport { Setting } from '../entities/setting.entity';\nimport { RequestContextService } from './request-context.service';\nimport { User } from 'src/entities/user.entity';\nimport { CreateSettingDto } from 'src/dtos/create-setting.dto';\n\n@Injectable()\nexport class SettingService extends CRUDService<Setting> {\n constructor(\n readonly modelMetadataService: ModelMetadataService,\n readonly moduleMetadataService: ModuleMetadataService,\n readonly configService: ConfigService,\n readonly fileService: FileService,\n readonly discoveryService: DiscoveryService,\n readonly crudHelperService: CrudHelperService,\n @Inject(iamConfig.KEY) private readonly iamConfiguration: ConfigType<typeof iamConfig>,\n @Inject(commonConfig.KEY)\n private readonly commonConfiguration: ConfigType<typeof commonConfig>,\n @InjectEntityManager()\n readonly entityManager: EntityManager,\n @InjectRepository(Setting, 'default')\n readonly repo: Repository<Setting>,\n readonly moduleRef: ModuleRef,\n private readonly requestContextService: RequestContextService,\n @InjectRepository(User) private readonly userRepository: Repository<User>,\n ) {\n super(modelMetadataService, moduleMetadataService, configService, fileService, discoveryService, crudHelperService, entityManager, repo, 'setting', 'solid-core', moduleRef\n );\n }\n\n async seedDefaultSettings(): Promise<void> {\n const settingsSeederData = {\n allowPublicRegistration: this.iamConfiguration.allowPublicRegistration,\n iamPasswordRegistrationEnabled: this.iamConfiguration.iamPasswordRegistrationEnabled,\n passwordlessRegistration: this.iamConfiguration.passwordlessRegistration,\n activateUserOnRegistration: this.iamConfiguration.activateUserOnRegistration,\n iamGoogleOAuthEnabled: false,\n authPagesLayout: \"center\",\n authPagesTheme: \"light\",\n appLogo: null,\n companylogo: null,\n favicon: null,\n appLogoPosition: \"in_form_view\",\n showAuthContent: false,\n appTitle: process.env.SOLID_APP_NAME || \"Solid App\",\n appSubtitle: process.env.SOLID_APP_SUBTITLE || \"Lorem Ipsum\",\n appDescription: process.env.SOLID_APP_DESCRIPTION || \"lorem ipsum\",\n showLegalLinks: false,\n appTnc: null,\n appPrivacyPolicy: null,\n defaultRole: this.iamConfiguration.defaultRole,\n shouldQueueEmails: this.commonConfiguration.shouldQueueEmails,\n shouldQueueSms: this.commonConfiguration.shouldQueueSms,\n enableDarkMode: true,\n copyright: null,\n enableUsername: true,\n enabledNotification: true,\n contactSupportEmail : null,\n contactSupportDisplayName: null,\n contactSupportIcon: null,\n authScreenRightBackgroundImage: null,\n authScreenLeftBackgroundImage: null,\n authScreenCenterBackgroundImage: null,\n solidXGenAiCodeBuilderConfig: JSON.stringify({\n defaultProvider: \"\",\n availableProviders: []\n }),\n showNameFieldsForRegistration:this.iamConfiguration.showNameFieldsForRegistration\n };\n\n const existingSettings = await this.repo.find();\n const existingKeys = new Set(existingSettings.map(s => s.key));\n\n const settingsToInsert: Setting[] = [];\n for (const [key, value] of Object.entries(settingsSeederData)) {\n if (!existingKeys.has(key)) {\n const setting = new Setting();\n setting.key = key;\n setting.value = typeof value === 'boolean' ? value.toString() :\n Array.isArray(value) ? value.join(',') :\n value === null || value === undefined ? '' : String(value);\n settingsToInsert.push(setting);\n }\n }\n\n if (settingsToInsert.length > 0) {\n await this.repo.save(settingsToInsert);\n }\n }\n\n async wrapSettings(): Promise<Record<string, any>> {\n const settingsArray: Setting[] = await this.repo.find();\n\n if (!settingsArray || settingsArray.length === 0) {\n return this.getDefaultSettings();\n }\n\n const settingsMap: Record<string, any> = {};\n for (const setting of settingsArray) {\n if (setting.key && setting.value !== undefined && setting.value !== null) {\n let value = setting.value;\n try {\n settingsMap[setting.key] = JSON.parse(value);\n } catch {\n if (value === 'true' || value === 'false') {\n settingsMap[setting.key] = value === 'true';\n } else if (!isNaN(Number(value)) && value.trim() !== '') {\n settingsMap[setting.key] = Number(value);\n } else if (value.includes(',')) {\n settingsMap[setting.key] = value.split(',').map(item => item.trim());\n } else {\n settingsMap[setting.key] = value;\n }\n }\n\n // if (value === 'true' || value === 'false') {\n // settingsMap[setting.key] = value === 'true';\n // }\n // else if (!isNaN(Number(value)) && value.trim() !== '') {\n // settingsMap[setting.key] = Number(value);\n // }\n // else if (value.includes(',')) {\n // settingsMap[setting.key] = value.split(',').map(item => item.trim());\n // }\n // else {\n // settingsMap[setting.key] = value;\n // }\n }\n } \n\n const defaultSettings = this.getDefaultSettings();\n\n const mergedSettings = Object.keys(defaultSettings).reduce((acc, key) => {\n acc[key] = settingsMap[key] !== undefined ? settingsMap[key] : defaultSettings[key];\n return acc;\n }, {} as Record<string, any>);\n\n return mergedSettings;\n }\n\n private getDefaultSettings(): Record<string, any> {\n return {\n allowPublicRegistration: this.iamConfiguration.allowPublicRegistration,\n iamPasswordRegistrationEnabled: this.iamConfiguration.iamPasswordRegistrationEnabled,\n passwordlessRegistration: this.iamConfiguration.passwordlessRegistration,\n activateUserOnRegistration: this.iamConfiguration.activateUserOnRegistration,\n iamGoogleOAuthEnabled: false,\n authPagesLayout: \"center\",\n authPagesTheme: \"light\",\n appLogo: null,\n companylogo: null,\n favicon: null,\n appLogoPosition: \"in_form_view\", //in_form_view | in_image_view\n showAuthContent: false,\n appTitle: process.env.SOLID_APP_NAME || \"Solid App\",\n appSubtitle: null,\n appDescription: null,\n showLegalLinks: false,\n appTnc: null,\n appPrivacyPolicy: null,\n defaultRole: this.iamConfiguration.defaultRole,\n shouldQueueEmails: this.commonConfiguration.shouldQueueEmails,\n shouldQueueSms: this.commonConfiguration.shouldQueueSms,\n enableDarkMode: true,\n copyright: null,\n forceChangePasswordOnFirstLogin: true,\n enableUsername: true,\n enabledNotification: true,\n contactSupportEmail : null,\n contactSupportDisplayName: null,\n contactSupportIcon: null,\n authScreenRightBackgroundImage: null,\n authScreenLeftBackgroundImage: null,\n authScreenCenterBackgroundImage: null,\n solidXGenAiCodeBuilderConfig: JSON.stringify({\n defaultProvider: \"\",\n availableProviders: []\n }),\n iamAutoGeneratedPassword:this.iamConfiguration.iamAutoGeneratedPassword,\n showNameFieldsForRegistration:this.iamConfiguration.showNameFieldsForRegistration\n };\n }\n\n async getConfigValue(settingKey: string) {\n try {\n const settingsArray: Setting[] = await this.repo.find();\n const settingEntry = settingsArray.find(setting => setting.key === settingKey);\n\n if (settingEntry && settingEntry.value !== null && settingEntry.value !== undefined) {\n const value = settingEntry.value;\n\n if (value === 'true' || value === 'false') {\n return value === 'true';\n }\n else if (!isNaN(Number(value)) && value.trim() !== '') {\n return Number(value);\n }\n else if (value.includes(',')) {\n return value.split(',').map(item => item.trim());\n }\n else {\n return value;\n }\n }\n\n const defaultSettings = this.getDefaultSettings();\n return defaultSettings[settingKey];\n } catch (error) {\n const defaultSettings = this.getDefaultSettings();\n return defaultSettings[settingKey];\n }\n }\n\n async updateSettings(\n settings: CreateSettingDto[] = [],\n uploadedFiles: Array<Express.Multer.File> = []\n ): Promise<Setting[]> {\n const activeUser = this.requestContextService.getActiveUser();\n const userId = activeUser?.sub;\n\n const existingSettings = await this.repo.find();\n\n const settingsToUpdate: Setting[] = [];\n const settingsToCreate: Setting[] = [];\n\n let user: User | null = null;\n const hasUserSettings = settings.some(dto => dto.type === 'user');\n if (hasUserSettings && userId) {\n user = await this.userRepository.findOne({ where: { id: userId } });\n }\n\n // Handle uploaded files\n if (uploadedFiles?.length) {\n for (const file of uploadedFiles) {\n const settingKey = file.fieldname;\n const relativeFileName = `${file.filename}-${file.originalname}`;\n const storagePath = `${this.configService.get('app-builder.fileStorageDir')}/${relativeFileName}`;\n const baseUrl = process.env.BASE_URL || '';\n const fileUrl = `${baseUrl}/${storagePath}`;\n\n await this.fileService.copyFile(file.path, storagePath);\n await this.fileService.deleteFile(file.path);\n\n const matchedDto = settings.find(dto => dto.key === settingKey);\n const settingType = matchedDto?.type ?? 'system';\n\n const existingSetting = existingSettings.find(s => s.key === settingKey);\n if (existingSetting) {\n existingSetting.value = fileUrl;\n existingSetting.type = settingType;\n settingsToUpdate.push(existingSetting);\n } else {\n const newSetting = new Setting();\n newSetting.key = settingKey;\n newSetting.value = fileUrl;\n newSetting.type = settingType;\n\n if (settingType === 'user' && user) {\n newSetting.user = user;\n }\n\n settingsToCreate.push(newSetting);\n }\n }\n }\n\n // Handle non-file settings\n for (const settingDto of settings) {\n if (uploadedFiles?.some(file => file.fieldname === settingDto.key)) {\n continue; // skip if already handled via file\n }\n\n const key = settingDto.key;\n const value = settingDto.value ?? '';\n const settingType = settingDto.type ?? 'system';\n\n const existingSetting = existingSettings.find(s => s.key === key);\n if (existingSetting) {\n existingSetting.value = value;\n existingSetting.type = settingType;\n settingsToUpdate.push(existingSetting);\n } else {\n const newSetting = new Setting();\n newSetting.key = key;\n newSetting.value = value;\n newSetting.type = settingType;\n\n if (settingType === 'user' && user) {\n newSetting.user = user;\n }\n\n settingsToCreate.push(newSetting);\n }\n }\n\n if (settingsToUpdate.length > 0) {\n await this.repo.save(settingsToUpdate);\n }\n\n if (settingsToCreate.length > 0) {\n await this.repo.save(settingsToCreate);\n }\n\n return [...settingsToUpdate, ...settingsToCreate];\n }\n\n async getAllSettings(): Promise<{ system: Record<string, any>, user: Record<string, any> }> {\n const settingsArray = await this.repo.find({ relations: ['user'] });\n\n const system: Record<string, any> = {};\n const user: Record<string, any> = {};\n\n for (const setting of settingsArray) {\n if (setting.key && setting.value !== undefined && setting.value !== null) {\n const value = setting.value;\n let parsedValue: any;\n\n try {\n parsedValue = JSON.parse(value);\n } catch {\n if (value === 'true' || value === 'false') {\n parsedValue = value === 'true';\n } else if (!isNaN(Number(value)) && value.trim() !== '') {\n parsedValue = Number(value);\n } else if (value.includes(',')) {\n parsedValue = value.split(',').map(item => item.trim());\n } else {\n parsedValue = value;\n }\n }\n if (setting.type === 'user') {\n user[setting.key] = parsedValue;\n } else {\n system[setting.key] = parsedValue;\n }\n }\n }\n\n return { system, user };\n }\n\n}\n"]}
1
+ {"version":3,"file":"setting.service.js","sourceRoot":"","sources":["../../src/services/setting.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Inject, Injectable } from '@nestjs/common';\nimport { DiscoveryService, ModuleRef } from \"@nestjs/core\";\nimport { InjectEntityManager, InjectRepository } from '@nestjs/typeorm';\nimport { EntityManager, Repository } from 'typeorm';\n\nimport { ConfigService, ConfigType } from '@nestjs/config';\nimport { CrudHelperService } from 'src/services/crud-helper.service';\nimport { CRUDService } from 'src/services/crud.service';\nimport { FileService } from 'src/services/file.service';\nimport { ModelMetadataService } from 'src/services/model-metadata.service';\nimport { ModuleMetadataService } from 'src/services/module-metadata.service';\nimport commonConfig from 'src/config/common.config';\nimport { iamConfig } from 'src/config/iam.config';\nimport { Setting } from '../entities/setting.entity';\nimport { RequestContextService } from './request-context.service';\nimport { User } from 'src/entities/user.entity';\nimport { CreateSettingDto } from 'src/dtos/create-setting.dto';\n\n@Injectable()\nexport class SettingService extends CRUDService<Setting> {\n constructor(\n readonly modelMetadataService: ModelMetadataService,\n readonly moduleMetadataService: ModuleMetadataService,\n readonly configService: ConfigService,\n readonly fileService: FileService,\n readonly discoveryService: DiscoveryService,\n readonly crudHelperService: CrudHelperService,\n @Inject(iamConfig.KEY) private readonly iamConfiguration: ConfigType<typeof iamConfig>,\n @Inject(commonConfig.KEY)\n private readonly commonConfiguration: ConfigType<typeof commonConfig>,\n @InjectEntityManager()\n readonly entityManager: EntityManager,\n @InjectRepository(Setting, 'default')\n readonly repo: Repository<Setting>,\n readonly moduleRef: ModuleRef,\n private readonly requestContextService: RequestContextService,\n @InjectRepository(User) private readonly userRepository: Repository<User>,\n ) {\n super(modelMetadataService, moduleMetadataService, configService, fileService, discoveryService, crudHelperService, entityManager, repo, 'setting', 'solid-core', moduleRef\n );\n }\n\n async seedDefaultSettings(): Promise<void> {\n const settingsSeederData = {\n allowPublicRegistration: this.iamConfiguration.allowPublicRegistration,\n iamPasswordRegistrationEnabled: this.iamConfiguration.iamPasswordRegistrationEnabled,\n passwordlessRegistration: this.iamConfiguration.passwordlessRegistration,\n activateUserOnRegistration: this.iamConfiguration.activateUserOnRegistration,\n iamGoogleOAuthEnabled: false,\n authPagesLayout: \"center\",\n authPagesTheme: \"light\",\n appLogo: null,\n companylogo: null,\n favicon: null,\n appLogoPosition: \"in_form_view\",\n showAuthContent: false,\n appTitle: process.env.SOLID_APP_NAME || \"Solid App\",\n appSubtitle: process.env.SOLID_APP_SUBTITLE || \"Lorem Ipsum\",\n appDescription: process.env.SOLID_APP_DESCRIPTION || \"lorem ipsum\",\n showLegalLinks: false,\n appTnc: null,\n appPrivacyPolicy: null,\n defaultRole: this.iamConfiguration.defaultRole,\n shouldQueueEmails: this.commonConfiguration.shouldQueueEmails,\n shouldQueueSms: this.commonConfiguration.shouldQueueSms,\n enableDarkMode: true,\n copyright: null,\n enableUsername: true,\n enabledNotification: true,\n contactSupportEmail : null,\n contactSupportDisplayName: null,\n contactSupportIcon: null,\n authScreenRightBackgroundImage: null,\n authScreenLeftBackgroundImage: null,\n authScreenCenterBackgroundImage: null,\n solidXGenAiCodeBuilderConfig: JSON.stringify({\n defaultProvider: \"\",\n availableProviders: []\n }),\n showNameFieldsForRegistration:this.iamConfiguration.showNameFieldsForRegistration,\n forceChangePasswordOnFirstLogin: this.iamConfiguration.forceChangePasswordOnFirstLogin\n };\n\n const existingSettings = await this.repo.find();\n const existingKeys = new Set(existingSettings.map(s => s.key));\n\n const settingsToInsert: Setting[] = [];\n for (const [key, value] of Object.entries(settingsSeederData)) {\n if (!existingKeys.has(key)) {\n const setting = new Setting();\n setting.key = key;\n setting.value = typeof value === 'boolean' ? value.toString() :\n Array.isArray(value) ? value.join(',') :\n value === null || value === undefined ? '' : String(value);\n settingsToInsert.push(setting);\n }\n }\n\n if (settingsToInsert.length > 0) {\n await this.repo.save(settingsToInsert);\n }\n }\n\n async wrapSettings(): Promise<Record<string, any>> {\n const settingsArray: Setting[] = await this.repo.find();\n\n if (!settingsArray || settingsArray.length === 0) {\n return this.getDefaultSettings();\n }\n\n const settingsMap: Record<string, any> = {};\n for (const setting of settingsArray) {\n if (setting.key && setting.value !== undefined && setting.value !== null) {\n let value = setting.value;\n try {\n settingsMap[setting.key] = JSON.parse(value);\n } catch {\n if (value === 'true' || value === 'false') {\n settingsMap[setting.key] = value === 'true';\n } else if (!isNaN(Number(value)) && value.trim() !== '') {\n settingsMap[setting.key] = Number(value);\n } else if (value.includes(',')) {\n settingsMap[setting.key] = value.split(',').map(item => item.trim());\n } else {\n settingsMap[setting.key] = value;\n }\n }\n\n // if (value === 'true' || value === 'false') {\n // settingsMap[setting.key] = value === 'true';\n // }\n // else if (!isNaN(Number(value)) && value.trim() !== '') {\n // settingsMap[setting.key] = Number(value);\n // }\n // else if (value.includes(',')) {\n // settingsMap[setting.key] = value.split(',').map(item => item.trim());\n // }\n // else {\n // settingsMap[setting.key] = value;\n // }\n }\n } \n\n const defaultSettings = this.getDefaultSettings();\n\n const mergedSettings = Object.keys(defaultSettings).reduce((acc, key) => {\n acc[key] = settingsMap[key] !== undefined ? settingsMap[key] : defaultSettings[key];\n return acc;\n }, {} as Record<string, any>);\n\n return mergedSettings;\n }\n\n private getDefaultSettings(): Record<string, any> {\n return {\n allowPublicRegistration: this.iamConfiguration.allowPublicRegistration,\n iamPasswordRegistrationEnabled: this.iamConfiguration.iamPasswordRegistrationEnabled,\n passwordlessRegistration: this.iamConfiguration.passwordlessRegistration,\n activateUserOnRegistration: this.iamConfiguration.activateUserOnRegistration,\n iamGoogleOAuthEnabled: false,\n authPagesLayout: \"center\",\n authPagesTheme: \"light\",\n appLogo: null,\n companylogo: null,\n favicon: null,\n appLogoPosition: \"in_form_view\", //in_form_view | in_image_view\n showAuthContent: false,\n appTitle: process.env.SOLID_APP_NAME || \"Solid App\",\n appSubtitle: null,\n appDescription: null,\n showLegalLinks: false,\n appTnc: null,\n appPrivacyPolicy: null,\n defaultRole: this.iamConfiguration.defaultRole,\n shouldQueueEmails: this.commonConfiguration.shouldQueueEmails,\n shouldQueueSms: this.commonConfiguration.shouldQueueSms,\n enableDarkMode: true,\n copyright: null,\n forceChangePasswordOnFirstLogin: this.iamConfiguration.forceChangePasswordOnFirstLogin,\n enableUsername: true,\n enabledNotification: true,\n contactSupportEmail : null,\n contactSupportDisplayName: null,\n contactSupportIcon: null,\n authScreenRightBackgroundImage: null,\n authScreenLeftBackgroundImage: null,\n authScreenCenterBackgroundImage: null,\n solidXGenAiCodeBuilderConfig: JSON.stringify({\n defaultProvider: \"\",\n availableProviders: []\n }),\n iamAutoGeneratedPassword:this.iamConfiguration.iamAutoGeneratedPassword,\n showNameFieldsForRegistration:this.iamConfiguration.showNameFieldsForRegistration\n };\n }\n\n async getConfigValue(settingKey: string) {\n try {\n const settingsArray: Setting[] = await this.repo.find();\n const settingEntry = settingsArray.find(setting => setting.key === settingKey);\n\n if (settingEntry && settingEntry.value !== null && settingEntry.value !== undefined) {\n const value = settingEntry.value;\n\n if (value === 'true' || value === 'false') {\n return value === 'true';\n }\n else if (!isNaN(Number(value)) && value.trim() !== '') {\n return Number(value);\n }\n else if (value.includes(',')) {\n return value.split(',').map(item => item.trim());\n }\n else {\n return value;\n }\n }\n\n const defaultSettings = this.getDefaultSettings();\n return defaultSettings[settingKey];\n } catch (error) {\n const defaultSettings = this.getDefaultSettings();\n return defaultSettings[settingKey];\n }\n }\n\n async updateSettings(\n settings: CreateSettingDto[] = [],\n uploadedFiles: Array<Express.Multer.File> = []\n ): Promise<Setting[]> {\n const activeUser = this.requestContextService.getActiveUser();\n const userId = activeUser?.sub;\n\n const existingSettings = await this.repo.find();\n\n const settingsToUpdate: Setting[] = [];\n const settingsToCreate: Setting[] = [];\n\n let user: User | null = null;\n const hasUserSettings = settings.some(dto => dto.type === 'user');\n if (hasUserSettings && userId) {\n user = await this.userRepository.findOne({ where: { id: userId } });\n }\n\n // Handle uploaded files\n if (uploadedFiles?.length) {\n for (const file of uploadedFiles) {\n const settingKey = file.fieldname;\n const relativeFileName = `${file.filename}-${file.originalname}`;\n const storagePath = `${this.configService.get('app-builder.fileStorageDir')}/${relativeFileName}`;\n const baseUrl = process.env.BASE_URL || '';\n const fileUrl = `${baseUrl}/${storagePath}`;\n\n await this.fileService.copyFile(file.path, storagePath);\n await this.fileService.deleteFile(file.path);\n\n const matchedDto = settings.find(dto => dto.key === settingKey);\n const settingType = matchedDto?.type ?? 'system';\n\n const existingSetting = existingSettings.find(s => s.key === settingKey);\n if (existingSetting) {\n existingSetting.value = fileUrl;\n existingSetting.type = settingType;\n settingsToUpdate.push(existingSetting);\n } else {\n const newSetting = new Setting();\n newSetting.key = settingKey;\n newSetting.value = fileUrl;\n newSetting.type = settingType;\n\n if (settingType === 'user' && user) {\n newSetting.user = user;\n }\n\n settingsToCreate.push(newSetting);\n }\n }\n }\n\n // Handle non-file settings\n for (const settingDto of settings) {\n if (uploadedFiles?.some(file => file.fieldname === settingDto.key)) {\n continue; // skip if already handled via file\n }\n\n const key = settingDto.key;\n const value = settingDto.value ?? '';\n const settingType = settingDto.type ?? 'system';\n\n const existingSetting = existingSettings.find(s => s.key === key);\n if (existingSetting) {\n existingSetting.value = value;\n existingSetting.type = settingType;\n settingsToUpdate.push(existingSetting);\n } else {\n const newSetting = new Setting();\n newSetting.key = key;\n newSetting.value = value;\n newSetting.type = settingType;\n\n if (settingType === 'user' && user) {\n newSetting.user = user;\n }\n\n settingsToCreate.push(newSetting);\n }\n }\n\n if (settingsToUpdate.length > 0) {\n await this.repo.save(settingsToUpdate);\n }\n\n if (settingsToCreate.length > 0) {\n await this.repo.save(settingsToCreate);\n }\n\n return [...settingsToUpdate, ...settingsToCreate];\n }\n\n async getAllSettings(): Promise<{ system: Record<string, any>, user: Record<string, any> }> {\n const settingsArray = await this.repo.find({ relations: ['user'] });\n\n const system: Record<string, any> = {};\n const user: Record<string, any> = {};\n\n for (const setting of settingsArray) {\n if (setting.key && setting.value !== undefined && setting.value !== null) {\n const value = setting.value;\n let parsedValue: any;\n\n try {\n parsedValue = JSON.parse(value);\n } catch {\n if (value === 'true' || value === 'false') {\n parsedValue = value === 'true';\n } else if (!isNaN(Number(value)) && value.trim() !== '') {\n parsedValue = Number(value);\n } else if (value.includes(',')) {\n parsedValue = value.split(',').map(item => item.trim());\n } else {\n parsedValue = value;\n }\n }\n if (setting.type === 'user') {\n user[setting.key] = parsedValue;\n } else {\n system[setting.key] = parsedValue;\n }\n }\n }\n\n return { system, user };\n }\n\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"solid-core.module.d.ts","sourceRoot":"","sources":["../src/solid-core.module.ts"],"names":[],"mappings":"AAgTA,qBA+Za,eAAe;CAAI"}
1
+ {"version":3,"file":"solid-core.module.d.ts","sourceRoot":"","sources":["../src/solid-core.module.ts"],"names":[],"mappings":"AAmTA,qBAkaa,eAAe;CAAI"}
@@ -58,6 +58,7 @@ const jwt_1 = require("@nestjs/jwt");
58
58
  const seed_command_1 = require("./commands/seed.command");
59
59
  const common_config_1 = __importDefault(require("./config/common.config"));
60
60
  const iam_config_1 = require("./config/iam.config");
61
+ const jwt_config_1 = require("./config/jwt.config");
61
62
  const authentication_controller_1 = require("./controllers/authentication.controller");
62
63
  const email_template_controller_1 = require("./controllers/email-template.controller");
63
64
  const google_authentication_controller_1 = require("./controllers/google-authentication.controller");
@@ -293,6 +294,8 @@ const solid_add_question_to_dashboard_mcp_handler_service_1 = require("./service
293
294
  const solid_add_custom_service_method_mcp_handler_service_1 = require("./services/genai/mcp-handlers/solid-add-custom-service-method-mcp-handler.service");
294
295
  const solid_add_header_button_or_row_button_to_list_view_mcp_handler_service_1 = require("./services/genai/mcp-handlers/solid-add-header-button-or-row-button-to-list-view-mcp-handler.service");
295
296
  const solid_add_controller_handler_method_mcp_handler_service_1 = require("./services/genai/mcp-handlers/solid-add-controller-handler-method-mcp-handler.service");
297
+ const solid_add_button_to_form_view_mcp_handler_service_1 = require("./services/genai/mcp-handlers/solid-add-button-to-form-view-mcp-handler.service");
298
+ const solid_create_custom_form_view_widget_mcp_handler_service_1 = require("./services/genai/mcp-handlers/solid-create-custom-form-view-widget-mcp-handler.service");
296
299
  let SolidCoreModule = class SolidCoreModule {
297
300
  };
298
301
  exports.SolidCoreModule = SolidCoreModule;
@@ -341,8 +344,8 @@ exports.SolidCoreModule = SolidCoreModule = __decorate([
341
344
  config_1.ConfigModule.forFeature(app_builder_config_1.default),
342
345
  config_1.ConfigModule.forFeature(common_config_1.default),
343
346
  config_1.ConfigModule.forFeature(iam_config_1.iamConfig),
344
- config_1.ConfigModule.forFeature(iam_config_1.jwtConfig),
345
- jwt_1.JwtModule.registerAsync(iam_config_1.jwtConfig.asProvider()),
347
+ config_1.ConfigModule.forFeature(jwt_config_1.jwtConfig),
348
+ jwt_1.JwtModule.registerAsync(jwt_config_1.jwtConfig.asProvider()),
346
349
  schedule_1.ScheduleModule.forRoot(),
347
350
  serve_static_1.ServeStaticModule.forRoot({
348
351
  rootPath: (0, path_1.join)(process.cwd(), 'media-files-storage'),
@@ -616,6 +619,8 @@ exports.SolidCoreModule = SolidCoreModule = __decorate([
616
619
  solid_add_custom_service_method_mcp_handler_service_1.SolidAddCustomServiceMethodMcpHandler,
617
620
  solid_add_header_button_or_row_button_to_list_view_mcp_handler_service_1.SolidAddHeaderButtonOrRowButtonToListViewMcpHandler,
618
621
  solid_add_controller_handler_method_mcp_handler_service_1.SolidAddControllerHandlerMcpHandler,
622
+ solid_add_button_to_form_view_mcp_handler_service_1.SolidAddButtonToFormViewMcpHandler,
623
+ solid_create_custom_form_view_widget_mcp_handler_service_1.SolidCreateCustomFormViewWidgetMcpHandler,
619
624
  solid_ts_morph_service_1.SolidTsMorphService,
620
625
  view_metadata_repository_1.ViewMetadataRepository,
621
626
  scheduled_job_repository_1.ScheduledJobRepository,