@solidxai/core 0.1.9-beta.8 → 0.1.10-alpha.0

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 (158) hide show
  1. package/LICENSE +89 -0
  2. package/README.md +3 -1
  3. package/dist/commands/run-tests.command.d.ts +2 -0
  4. package/dist/commands/run-tests.command.d.ts.map +1 -1
  5. package/dist/commands/run-tests.command.js +49 -17
  6. package/dist/commands/run-tests.command.js.map +1 -1
  7. package/dist/controllers/action-metadata.controller.js +1 -1
  8. package/dist/controllers/action-metadata.controller.js.map +1 -1
  9. package/dist/controllers/facebook-authentication.controller.js +1 -1
  10. package/dist/controllers/facebook-authentication.controller.js.map +1 -1
  11. package/dist/controllers/google-authentication.controller.js +1 -1
  12. package/dist/controllers/google-authentication.controller.js.map +1 -1
  13. package/dist/controllers/menu-item-metadata.controller.js +1 -1
  14. package/dist/controllers/menu-item-metadata.controller.js.map +1 -1
  15. package/dist/controllers/microsoft-authentication.controller.js +1 -1
  16. package/dist/controllers/microsoft-authentication.controller.js.map +1 -1
  17. package/dist/controllers/mq-message-queue.controller.js +1 -1
  18. package/dist/controllers/mq-message-queue.controller.js.map +1 -1
  19. package/dist/controllers/mq-message.controller.js +1 -1
  20. package/dist/controllers/mq-message.controller.js.map +1 -1
  21. package/dist/controllers/user.controller.d.ts.map +1 -1
  22. package/dist/controllers/user.controller.js.map +1 -1
  23. package/dist/controllers/view-metadata.controller.js +1 -1
  24. package/dist/controllers/view-metadata.controller.js.map +1 -1
  25. package/dist/helpers/bootstrap.helper.d.ts.map +1 -1
  26. package/dist/helpers/bootstrap.helper.js +2 -0
  27. package/dist/helpers/bootstrap.helper.js.map +1 -1
  28. package/dist/helpers/field-crud-managers/BigIntFieldCrudManager.js.map +1 -1
  29. package/dist/helpers/field-crud-managers/SelectionDynamicFieldCrudManager.js.map +1 -1
  30. package/dist/helpers/module-metadata-helper.service.js.map +1 -1
  31. package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.js.map +1 -1
  32. package/dist/passport-strategies/facebook-oauth.strategy.d.ts +5 -3
  33. package/dist/passport-strategies/facebook-oauth.strategy.d.ts.map +1 -1
  34. package/dist/passport-strategies/facebook-oauth.strategy.js +41 -18
  35. package/dist/passport-strategies/facebook-oauth.strategy.js.map +1 -1
  36. package/dist/repository/security-rule.repository.js.map +1 -1
  37. package/dist/seeders/module-metadata-seeder.service.js.map +1 -1
  38. package/dist/seeders/permission-metadata-seeder.service.js.map +1 -1
  39. package/dist/seeders/seed-data/solid-core-metadata.json +14 -3
  40. package/dist/services/authentication.service.d.ts +12 -13
  41. package/dist/services/authentication.service.d.ts.map +1 -1
  42. package/dist/services/authentication.service.js +42 -18
  43. package/dist/services/authentication.service.js.map +1 -1
  44. package/dist/services/chatter-message.service.js.map +1 -1
  45. package/dist/services/crud.service.js.map +1 -1
  46. package/dist/services/csv.service.js.map +1 -1
  47. package/dist/services/dashboard.service.js.map +1 -1
  48. package/dist/services/database/database-bootstrap.service.js.map +1 -1
  49. package/dist/services/excel.service.js.map +1 -1
  50. package/dist/services/export-transaction.service.js.map +1 -1
  51. package/dist/services/field-metadata.service.js +2 -2
  52. package/dist/services/field-metadata.service.js.map +1 -1
  53. package/dist/services/fixtures.service.js.map +1 -1
  54. package/dist/services/import-transaction.service.js.map +1 -1
  55. package/dist/services/list-of-values.service.js.map +1 -1
  56. package/dist/services/model-metadata.service.d.ts.map +1 -1
  57. package/dist/services/model-metadata.service.js +3 -13
  58. package/dist/services/model-metadata.service.js.map +1 -1
  59. package/dist/services/module-metadata.service.js.map +1 -1
  60. package/dist/services/queues/database-publisher.service.js +3 -3
  61. package/dist/services/queues/database-publisher.service.js.map +1 -1
  62. package/dist/services/queues/database-subscriber.service.js +3 -3
  63. package/dist/services/queues/database-subscriber.service.js.map +1 -1
  64. package/dist/services/queues/rabbitmq-publisher.service.js +3 -3
  65. package/dist/services/queues/rabbitmq-publisher.service.js.map +1 -1
  66. package/dist/services/queues/rabbitmq-subscriber.service.js +4 -4
  67. package/dist/services/queues/rabbitmq-subscriber.service.js.map +1 -1
  68. package/dist/services/queues/redis-publisher.service.d.ts.map +1 -1
  69. package/dist/services/queues/redis-publisher.service.js +4 -1
  70. package/dist/services/queues/redis-publisher.service.js.map +1 -1
  71. package/dist/services/queues/redis-subscriber.service.d.ts.map +1 -1
  72. package/dist/services/queues/redis-subscriber.service.js +4 -1
  73. package/dist/services/queues/redis-subscriber.service.js.map +1 -1
  74. package/dist/services/role-metadata.service.js.map +1 -1
  75. package/dist/services/scheduled-jobs/scheduler.service.js.map +1 -1
  76. package/dist/services/settings/default-settings-provider.service.d.ts +74 -8
  77. package/dist/services/settings/default-settings-provider.service.d.ts.map +1 -1
  78. package/dist/services/settings/default-settings-provider.service.js +96 -16
  79. package/dist/services/settings/default-settings-provider.service.js.map +1 -1
  80. package/dist/services/sms/TwilioSMSService.js.map +1 -1
  81. package/dist/services/solid-introspect.service.js.map +1 -1
  82. package/dist/services/user-activity-history.service.js.map +1 -1
  83. package/dist/services/user.service.d.ts +10 -8
  84. package/dist/services/user.service.d.ts.map +1 -1
  85. package/dist/services/user.service.js +85 -46
  86. package/dist/services/user.service.js.map +1 -1
  87. package/dist/services/view-metadata.service.d.ts.map +1 -1
  88. package/dist/services/view-metadata.service.js +17 -2
  89. package/dist/services/view-metadata.service.js.map +1 -1
  90. package/dist/solid-core.module.d.ts +1 -0
  91. package/dist/solid-core.module.d.ts.map +1 -1
  92. package/dist/solid-core.module.js +1 -0
  93. package/dist/solid-core.module.js.map +1 -1
  94. package/dist/subscribers/computed-entity-field.subscriber.js.map +1 -1
  95. package/dist/subscribers/security-rule.subscriber.d.ts.map +1 -1
  96. package/dist/subscribers/security-rule.subscriber.js.map +1 -1
  97. package/dist/subscribers/view-metadata.subscriber.js.map +1 -1
  98. package/dist/testing/core/testing-engine.js.map +1 -1
  99. package/dist/testing/reporter/webhook-reporter.d.ts +54 -0
  100. package/dist/testing/reporter/webhook-reporter.d.ts.map +1 -0
  101. package/dist/testing/reporter/webhook-reporter.js +74 -0
  102. package/dist/testing/reporter/webhook-reporter.js.map +1 -0
  103. package/package.json +6 -2
  104. package/src/commands/run-tests.command.ts +45 -17
  105. package/src/controllers/action-metadata.controller.ts +1 -1
  106. package/src/controllers/facebook-authentication.controller.ts +1 -1
  107. package/src/controllers/google-authentication.controller.ts +1 -1
  108. package/src/controllers/menu-item-metadata.controller.ts +1 -1
  109. package/src/controllers/microsoft-authentication.controller.ts +1 -1
  110. package/src/controllers/mq-message-queue.controller.ts +1 -1
  111. package/src/controllers/mq-message.controller.ts +1 -1
  112. package/src/controllers/user.controller.ts +16 -16
  113. package/src/controllers/view-metadata.controller.ts +1 -1
  114. package/src/helpers/bootstrap.helper.ts +3 -0
  115. package/src/helpers/field-crud-managers/BigIntFieldCrudManager.ts +1 -1
  116. package/src/helpers/field-crud-managers/SelectionDynamicFieldCrudManager.ts +1 -1
  117. package/src/helpers/module-metadata-helper.service.ts +1 -1
  118. package/src/jobs/database/trigger-mcp-client-subscriber-database.service.ts +1 -1
  119. package/src/passport-strategies/facebook-oauth.strategy.ts +82 -31
  120. package/src/repository/security-rule.repository.ts +1 -1
  121. package/src/seeders/module-metadata-seeder.service.ts +4 -4
  122. package/src/seeders/permission-metadata-seeder.service.ts +1 -1
  123. package/src/seeders/seed-data/solid-core-metadata.json +14 -3
  124. package/src/services/authentication.service.ts +215 -151
  125. package/src/services/chatter-message.service.ts +1 -1
  126. package/src/services/crud.service.ts +3 -3
  127. package/src/services/csv.service.ts +1 -1
  128. package/src/services/dashboard.service.ts +1 -1
  129. package/src/services/database/database-bootstrap.service.ts +1 -1
  130. package/src/services/excel.service.ts +1 -1
  131. package/src/services/export-transaction.service.ts +2 -2
  132. package/src/services/field-metadata.service.ts +3 -3
  133. package/src/services/fixtures.service.ts +2 -2
  134. package/src/services/import-transaction.service.ts +2 -2
  135. package/src/services/list-of-values.service.ts +1 -1
  136. package/src/services/model-metadata.service.ts +22 -21
  137. package/src/services/module-metadata.service.ts +7 -7
  138. package/src/services/queues/database-publisher.service.ts +4 -4
  139. package/src/services/queues/database-subscriber.service.ts +7 -7
  140. package/src/services/queues/rabbitmq-publisher.service.ts +7 -7
  141. package/src/services/queues/rabbitmq-subscriber.service.ts +13 -13
  142. package/src/services/queues/redis-publisher.service.ts +7 -4
  143. package/src/services/queues/redis-subscriber.service.ts +9 -6
  144. package/src/services/role-metadata.service.ts +1 -1
  145. package/src/services/scheduled-jobs/scheduler.service.ts +5 -5
  146. package/src/services/settings/default-settings-provider.service.ts +101 -21
  147. package/src/services/sms/TwilioSMSService.ts +2 -2
  148. package/src/services/solid-introspect.service.ts +2 -2
  149. package/src/services/user-activity-history.service.ts +1 -1
  150. package/src/services/user.service.ts +149 -77
  151. package/src/services/view-metadata.service.ts +25 -8
  152. package/src/solid-core.module.ts +1 -0
  153. package/src/subscribers/computed-entity-field.subscriber.ts +1 -1
  154. package/src/subscribers/security-rule.subscriber.ts +8 -8
  155. package/src/subscribers/view-metadata.subscriber.ts +1 -1
  156. package/src/testing/core/testing-engine.ts +2 -2
  157. package/src/testing/reporter/webhook-reporter.ts +116 -0
  158. package/dev-grooming-docs/ozzy-prompts.txt +0 -70
@@ -134,6 +134,7 @@ export class ViewMetadataService extends CRUDService<ViewMetadata> {
134
134
  let viewModes = [];
135
135
  const menuItemModelId = menuItem?.action?.model?.id;
136
136
  const menuItemModuleId = menuItem?.module?.id;
137
+ const collectionViewTypes = ['card', 'list', 'kanban', 'tree'];
137
138
  if (menuItemModelId && menuItemModuleId) {
138
139
  const actionQb = await this.actionMetadataService.repo.createSecurityRuleAwareQueryBuilder('action');
139
140
  const actionsForViewModes = await actionQb
@@ -142,16 +143,32 @@ export class ViewMetadataService extends CRUDService<ViewMetadata> {
142
143
  .leftJoinAndSelect('action.view', 'view')
143
144
  .where('model.id = :modelId', { modelId: menuItemModelId })
144
145
  .andWhere('module.id = :moduleId', { moduleId: menuItemModuleId })
145
- .andWhere('view.type IN (:...viewTypes)', { viewTypes: ['card', 'list', 'kanban', 'tree'] })
146
+ .andWhere('view.type IN (:...viewTypes)', { viewTypes: collectionViewTypes })
146
147
  .getMany();
147
148
 
148
- viewModes = actionsForViewModes.map(actionItem => ({
149
- type: actionItem.view?.type ?? '',
150
- menuItemId: menuItem.id,
151
- menuItemName: menuItem.displayName,
152
- actionId: actionItem.id ?? '',
153
- actionName: actionItem.displayName ?? '',
154
- }));
149
+ const canonicalActionsByViewType = new Map();
150
+ for (const actionItem of actionsForViewModes) {
151
+ const resolvedViewType = actionItem.view?.type;
152
+ if (!resolvedViewType || canonicalActionsByViewType.has(resolvedViewType)) {
153
+ continue;
154
+ }
155
+ canonicalActionsByViewType.set(resolvedViewType, actionItem);
156
+ }
157
+
158
+ if (action?.view?.type && collectionViewTypes.includes(action.view.type) && action?.id) {
159
+ canonicalActionsByViewType.set(action.view.type, action);
160
+ }
161
+
162
+ viewModes = collectionViewTypes
163
+ .map((resolvedViewType) => canonicalActionsByViewType.get(resolvedViewType))
164
+ .filter(Boolean)
165
+ .map(actionItem => ({
166
+ type: actionItem.view?.type ?? '',
167
+ menuItemId: menuItem.id,
168
+ menuItemName: menuItem.displayName,
169
+ actionId: actionItem.id ?? '',
170
+ actionName: actionItem.displayName ?? '',
171
+ }));
155
172
  }
156
173
 
157
174
  const viewId = action?.view?.id
@@ -1,3 +1,4 @@
1
+ import 'multer';
1
2
  import { Global, MiddlewareConsumer, Module, NestModule } from '@nestjs/common';
2
3
  import * as express from 'express';
3
4
  import { ConfigModule, ConfigService } from '@nestjs/config';
@@ -142,7 +142,7 @@ export class ComputedEntityFieldSubscriber implements EntitySubscriberInterface
142
142
  const providerInstance = provider.instance as IEntityPreComputeFieldProvider<any, any, any>; // IEntityComputedFieldProvider
143
143
  const computedValue = await providerInstance.preComputeValue(entity, computedFieldMetadata); //FIXME There should some way to check/assert if the provider actually has a postComputeAndSaveValue
144
144
  return computedValue; //TODO: This line here is just for backward compatibility, once the pre compute interface is change to return void, we will get rid of it.
145
- } catch (error) {
145
+ } catch (error: any) {
146
146
  throw new InternalServerErrorException(`Error evaluating computed field ${computedFieldMetadata.fieldName} for model ${computedFieldMetadata.modelName} for triggered entity ${entity.constructor.name}: ${error.message}`);
147
147
  }
148
148
  }
@@ -27,19 +27,19 @@ export class SecurityRuleSubscriber implements EntitySubscriberInterface<Securit
27
27
  async afterInsert(event: InsertEvent<SecurityRule>) {
28
28
  await this.saveSecurityRules(event);
29
29
  }
30
-
30
+
31
31
  async afterUpdate(event: UpdateEvent<SecurityRule>) {
32
32
  await this.saveSecurityRules(event);
33
33
  }
34
34
 
35
- async saveSecurityRules(event: UpdateEvent<SecurityRule>| InsertEvent<SecurityRule>) {
35
+ async saveSecurityRules(event: UpdateEvent<SecurityRule> | InsertEvent<SecurityRule>) {
36
36
  const securityRule = event.entity as SecurityRule;
37
37
  const modelMetadata = event.entity.modelMetadata;
38
38
  if (!modelMetadata) {
39
39
  this.logger.error(`Model metadata not found for security rule with id ${event.entity.id}`);
40
40
  return;
41
41
  }
42
-
42
+
43
43
  const modelMetadataRepo = this.dataSource.getRepository(ModelMetadata);
44
44
  const populatedModelMetadata = await modelMetadataRepo.findOne({
45
45
  where: {
@@ -58,7 +58,7 @@ export class SecurityRuleSubscriber implements EntitySubscriberInterface<Securit
58
58
  const filePath = await this.moduleMetadataHelperService.getModuleMetadataFilePath(populatedModelMetadata.module.name);
59
59
  try {
60
60
  await fs.access(filePath);
61
- } catch (error) {
61
+ } catch (error: any) {
62
62
  // FIXME - Should we actually delete the security rule here, if the file is not found?
63
63
  this.logger.error(`File not found at path: ${filePath}`);
64
64
  return;
@@ -67,13 +67,13 @@ export class SecurityRuleSubscriber implements EntitySubscriberInterface<Securit
67
67
 
68
68
  if (metaData.securityRules) {
69
69
  const securityRuleIndex = metaData.securityRules?.findIndex((ruleFromFile: { name: string }) => ruleFromFile.name === securityRule.name);
70
- const {id, roleId, modelMetadataId, ...requiredDto} = await this.securityRuleRepo.toDto(securityRule)
71
- metaData.securityRules[securityRuleIndex] = {...requiredDto, securityRuleConfig: JSON.parse(securityRule.securityRuleConfig)}
70
+ const { id, roleId, modelMetadataId, ...requiredDto } = await this.securityRuleRepo.toDto(securityRule)
71
+ metaData.securityRules[securityRuleIndex] = { ...requiredDto, securityRuleConfig: JSON.parse(securityRule.securityRuleConfig) }
72
72
  }
73
73
  else {
74
74
  const securityRules = []
75
- const {id, roleId, modelMetadataId, ...requiredDto} = await this.securityRuleRepo.toDto(securityRule)
76
- securityRules.push({...requiredDto, securityRuleConfig: JSON.parse(securityRule.securityRuleConfig)})
75
+ const { id, roleId, modelMetadataId, ...requiredDto } = await this.securityRuleRepo.toDto(securityRule)
76
+ securityRules.push({ ...requiredDto, securityRuleConfig: JSON.parse(securityRule.securityRuleConfig) })
77
77
  metaData.securityRules = securityRules
78
78
  }
79
79
  // Write the updated object back to the file
@@ -43,7 +43,7 @@ export class ViewMetadataSubsciber implements EntitySubscriberInterface<ViewMeta
43
43
  const filePath = await this.moduleMetadataHelperService.getModuleMetadataFilePath(viewMetadata.model.module.name);
44
44
  try {
45
45
  await fs.access(filePath);
46
- } catch (error) {
46
+ } catch (error: any) {
47
47
  this.logger.error(`File not found at path: ${filePath}`);
48
48
  return;
49
49
  }
@@ -57,7 +57,7 @@ export class TestingEngine {
57
57
  } else {
58
58
  await execute();
59
59
  }
60
- } catch (err) {
60
+ } catch (err: any) {
61
61
  scenarioError = err;
62
62
  } finally {
63
63
  const durationMs = Date.now() - scenarioStart;
@@ -108,7 +108,7 @@ export class TestingEngine {
108
108
  // console.log(`Step ${resolvedStep.name} attempting to saveAs ${resolvedStep.saveAs}`, JSON.stringify(result));
109
109
  ctx.resources.set(resolvedStep.saveAs, result);
110
110
  }
111
- } catch (err) {
111
+ } catch (err: any) {
112
112
  stepError = err;
113
113
  throw err;
114
114
  } finally {
@@ -0,0 +1,116 @@
1
+ import { ConsoleReporter } from "./console-reporter";
2
+ import type { OpStep, ScenarioSpec } from "../contracts/testing-metadata.types";
3
+ import type { StepPhase } from "../contracts/runtime-context.types";
4
+
5
+ interface TestStepResult {
6
+ phase: string;
7
+ operation: string;
8
+ name?: string;
9
+ ok: boolean;
10
+ durationMs: number;
11
+ error?: string;
12
+ }
13
+
14
+ interface TestScenarioResult {
15
+ id: string;
16
+ name?: string;
17
+ ok: boolean;
18
+ durationMs: number;
19
+ error?: string;
20
+ steps: TestStepResult[];
21
+ }
22
+
23
+ export interface TestRunPayload {
24
+ runName: string;
25
+ startedAt: string;
26
+ completedAt: string;
27
+ durationMs: number;
28
+ exitCode: number;
29
+ total: number;
30
+ passed: number;
31
+ failed: number;
32
+ scenarios: TestScenarioResult[];
33
+ }
34
+
35
+ function formatError(err: unknown): string {
36
+ if (!err) return "";
37
+ if (err instanceof Error) return err.stack || err.message;
38
+ return String(err);
39
+ }
40
+
41
+ export class WebhookReporter extends ConsoleReporter {
42
+ private readonly startedAt = new Date();
43
+ private readonly accumulated: TestScenarioResult[] = [];
44
+ private currentSteps: TestStepResult[] = [];
45
+
46
+ constructor(
47
+ private readonly webhookUrl: string,
48
+ private readonly runName: string,
49
+ ) {
50
+ super();
51
+ }
52
+
53
+ override onStepEnd(args: {
54
+ scenarioId: string;
55
+ phase: StepPhase;
56
+ step: OpStep;
57
+ ok: boolean;
58
+ error?: unknown;
59
+ durationMs: number;
60
+ }): void {
61
+ super.onStepEnd(args);
62
+ this.currentSteps.push({
63
+ phase: String(args.phase),
64
+ operation: args.step.op,
65
+ name: args.step.name,
66
+ ok: args.ok,
67
+ durationMs: args.durationMs,
68
+ error: args.error ? formatError(args.error) : undefined,
69
+ });
70
+ }
71
+
72
+ override onScenarioEnd(
73
+ scenario: ScenarioSpec,
74
+ result: { ok: boolean; error?: unknown; durationMs: number },
75
+ ): void {
76
+ super.onScenarioEnd(scenario, result);
77
+ this.accumulated.push({
78
+ id: scenario.id,
79
+ name: scenario.name,
80
+ ok: result.ok,
81
+ durationMs: result.durationMs,
82
+ error: result.error ? formatError(result.error) : undefined,
83
+ steps: [...this.currentSteps],
84
+ });
85
+ this.currentSteps = [];
86
+ }
87
+
88
+ async flush(exitCode: number): Promise<void> {
89
+ const completedAt = new Date();
90
+ const payload: TestRunPayload = {
91
+ runName: this.runName,
92
+ startedAt: this.startedAt.toISOString(),
93
+ completedAt: completedAt.toISOString(),
94
+ durationMs: completedAt.getTime() - this.startedAt.getTime(),
95
+ exitCode,
96
+ total: this.accumulated.length,
97
+ passed: this.accumulated.filter((s) => s.ok).length,
98
+ failed: this.accumulated.filter((s) => !s.ok).length,
99
+ scenarios: this.accumulated,
100
+ };
101
+
102
+ try {
103
+ const response = await fetch(this.webhookUrl, {
104
+ method: "POST",
105
+ headers: { "Content-Type": "application/json" },
106
+ body: JSON.stringify(payload),
107
+ signal: AbortSignal.timeout(10_000),
108
+ });
109
+ if (!response.ok) {
110
+ console.warn(`[WebhookReporter] Webhook returned ${response.status}`);
111
+ }
112
+ } catch (err: any) {
113
+ console.warn(`[WebhookReporter] Failed to deliver test results: ${err}`);
114
+ }
115
+ }
116
+ }
@@ -1,70 +0,0 @@
1
- Hi Ozzy,
2
- Can you give me instructions to create a new model in the fees portal module, you can call it address-master.
3
- This model needs to have the following fields.
4
- 1. address1 - shortText
5
- 2. address2 - shortText
6
- 3. addressType - selectionStatic with values - home, office & other.
7
- 4. city - many2one with the city model
8
- 5. state - many2one with the state model
9
- 6. pincode - many2one with the state model.
10
-
11
- After I add this model I want to start storing student address.
12
-
13
- To do this if you can also give me instructions on how to add a relation field to the student model, you can call this field studentAddress.
14
-
15
-
16
-
17
-
18
-
19
-
20
- Can you now create a new computed field provider.
21
- - You can call this provider: StateTotalCitiesComputedFieldProvider
22
- - This will be a post computation provider and will depend on the city model being inserted, deleted, updated.
23
- - The implementation simply needs to take a count of cities that belong to the same state as the city being mutated and update the state totalCities field.
24
-
25
-
26
- Can you now create a new computed field provider.
27
- - You can call this provider: StateTotalPopulationComputedFieldProvider
28
- - This will be a post computation provider and will depend on the city model being inserted, deleted, updated.
29
- - The implementation simply needs to take a sum of population of each city that belong to the same state as the city being mutated and update the state totalPopulation field.
30
-
31
-
32
- Can you now create a new computed field provider.
33
- - You can call this provider: StateTotalGdpComputedFieldProvider
34
- - This will be a post computation provider and will depend on the city model being inserted, deleted, updated.
35
- - The implementation simply needs to take a sum of gdp of each city that belong to the same state as the city being mutated and update the state totalGdp field.
36
- - I will add the totalGdp field to the state model after I have the computed provider TS code.
37
-
38
-
39
- # Testing prompt sequence
40
-
41
- ## Create Module
42
- Can you create a new module called address-master. This will be used to store address master data.
43
-
44
- ## Add Model - Country
45
- Can you add a new model to the address-master module called country.
46
- This will have name, description (richText), countryCode. You can assume name & countryCode to be unique. But only name will be used as a userkey.
47
- Also enable audit tracking on the model and all its fields.
48
- Make sure the table name is properly prefixed with the module name snake case.
49
-
50
- ## Add Model - Language
51
- Can you add a new model to the address-master module called language.
52
- This will have language, languageIsoCode. You can assume language to be unique.
53
- Also for the languageIsoCode, can you create a field with type staticSelection add a bunch (20 odd, include at-least 7-8 indian languages also) of commonly spoken languages with their respective language codes as values.
54
- Also enable audit tracking on the model and all its fields.
55
- Make sure the table name is properly prefixed with the module name snake case.
56
-
57
- ## Add Model - Country Language
58
-
59
- Can you now add a new model called CountrySpokenLanguages, this model will have 2 many-to-one fields.
60
- 1. country - many-to-one with the country model.
61
- 2. spokenLanguage - many-to-one with the language model.
62
- 3. spokenBy - int field storing data representing how many people speak that language.
63
- Also enable audit tracking on the model and all its fields.
64
- Make sure the table name is properly prefixed with the module name snake case.
65
-
66
- ## Add Model - Country Population Trend
67
- Can you add a model called CountryPopulationTrend, this model has the following fields.
68
- 1. country - many-to-one with the country model.
69
- 2. entryDate - date field.
70
- 3. populationAsOnDate - int field storing the population of that country as on that date.