@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.
- package/LICENSE +89 -0
- package/README.md +3 -1
- package/dist/commands/run-tests.command.d.ts +2 -0
- package/dist/commands/run-tests.command.d.ts.map +1 -1
- package/dist/commands/run-tests.command.js +49 -17
- package/dist/commands/run-tests.command.js.map +1 -1
- package/dist/controllers/action-metadata.controller.js +1 -1
- package/dist/controllers/action-metadata.controller.js.map +1 -1
- package/dist/controllers/facebook-authentication.controller.js +1 -1
- package/dist/controllers/facebook-authentication.controller.js.map +1 -1
- package/dist/controllers/google-authentication.controller.js +1 -1
- package/dist/controllers/google-authentication.controller.js.map +1 -1
- package/dist/controllers/menu-item-metadata.controller.js +1 -1
- package/dist/controllers/menu-item-metadata.controller.js.map +1 -1
- package/dist/controllers/microsoft-authentication.controller.js +1 -1
- package/dist/controllers/microsoft-authentication.controller.js.map +1 -1
- package/dist/controllers/mq-message-queue.controller.js +1 -1
- package/dist/controllers/mq-message-queue.controller.js.map +1 -1
- package/dist/controllers/mq-message.controller.js +1 -1
- package/dist/controllers/mq-message.controller.js.map +1 -1
- package/dist/controllers/user.controller.d.ts.map +1 -1
- package/dist/controllers/user.controller.js.map +1 -1
- package/dist/controllers/view-metadata.controller.js +1 -1
- package/dist/controllers/view-metadata.controller.js.map +1 -1
- package/dist/helpers/bootstrap.helper.d.ts.map +1 -1
- package/dist/helpers/bootstrap.helper.js +2 -0
- package/dist/helpers/bootstrap.helper.js.map +1 -1
- package/dist/helpers/field-crud-managers/BigIntFieldCrudManager.js.map +1 -1
- package/dist/helpers/field-crud-managers/SelectionDynamicFieldCrudManager.js.map +1 -1
- package/dist/helpers/module-metadata-helper.service.js.map +1 -1
- package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.js.map +1 -1
- package/dist/passport-strategies/facebook-oauth.strategy.d.ts +5 -3
- package/dist/passport-strategies/facebook-oauth.strategy.d.ts.map +1 -1
- package/dist/passport-strategies/facebook-oauth.strategy.js +41 -18
- package/dist/passport-strategies/facebook-oauth.strategy.js.map +1 -1
- package/dist/repository/security-rule.repository.js.map +1 -1
- package/dist/seeders/module-metadata-seeder.service.js.map +1 -1
- package/dist/seeders/permission-metadata-seeder.service.js.map +1 -1
- package/dist/seeders/seed-data/solid-core-metadata.json +14 -3
- package/dist/services/authentication.service.d.ts +12 -13
- package/dist/services/authentication.service.d.ts.map +1 -1
- package/dist/services/authentication.service.js +42 -18
- package/dist/services/authentication.service.js.map +1 -1
- package/dist/services/chatter-message.service.js.map +1 -1
- package/dist/services/crud.service.js.map +1 -1
- package/dist/services/csv.service.js.map +1 -1
- package/dist/services/dashboard.service.js.map +1 -1
- package/dist/services/database/database-bootstrap.service.js.map +1 -1
- package/dist/services/excel.service.js.map +1 -1
- package/dist/services/export-transaction.service.js.map +1 -1
- package/dist/services/field-metadata.service.js +2 -2
- package/dist/services/field-metadata.service.js.map +1 -1
- package/dist/services/fixtures.service.js.map +1 -1
- package/dist/services/import-transaction.service.js.map +1 -1
- package/dist/services/list-of-values.service.js.map +1 -1
- package/dist/services/model-metadata.service.d.ts.map +1 -1
- package/dist/services/model-metadata.service.js +3 -13
- package/dist/services/model-metadata.service.js.map +1 -1
- package/dist/services/module-metadata.service.js.map +1 -1
- package/dist/services/queues/database-publisher.service.js +3 -3
- package/dist/services/queues/database-publisher.service.js.map +1 -1
- package/dist/services/queues/database-subscriber.service.js +3 -3
- package/dist/services/queues/database-subscriber.service.js.map +1 -1
- package/dist/services/queues/rabbitmq-publisher.service.js +3 -3
- package/dist/services/queues/rabbitmq-publisher.service.js.map +1 -1
- package/dist/services/queues/rabbitmq-subscriber.service.js +4 -4
- package/dist/services/queues/rabbitmq-subscriber.service.js.map +1 -1
- package/dist/services/queues/redis-publisher.service.d.ts.map +1 -1
- package/dist/services/queues/redis-publisher.service.js +4 -1
- package/dist/services/queues/redis-publisher.service.js.map +1 -1
- package/dist/services/queues/redis-subscriber.service.d.ts.map +1 -1
- package/dist/services/queues/redis-subscriber.service.js +4 -1
- package/dist/services/queues/redis-subscriber.service.js.map +1 -1
- package/dist/services/role-metadata.service.js.map +1 -1
- package/dist/services/scheduled-jobs/scheduler.service.js.map +1 -1
- package/dist/services/settings/default-settings-provider.service.d.ts +74 -8
- package/dist/services/settings/default-settings-provider.service.d.ts.map +1 -1
- package/dist/services/settings/default-settings-provider.service.js +96 -16
- package/dist/services/settings/default-settings-provider.service.js.map +1 -1
- package/dist/services/sms/TwilioSMSService.js.map +1 -1
- package/dist/services/solid-introspect.service.js.map +1 -1
- package/dist/services/user-activity-history.service.js.map +1 -1
- package/dist/services/user.service.d.ts +10 -8
- package/dist/services/user.service.d.ts.map +1 -1
- package/dist/services/user.service.js +85 -46
- package/dist/services/user.service.js.map +1 -1
- package/dist/services/view-metadata.service.d.ts.map +1 -1
- package/dist/services/view-metadata.service.js +17 -2
- package/dist/services/view-metadata.service.js.map +1 -1
- package/dist/solid-core.module.d.ts +1 -0
- package/dist/solid-core.module.d.ts.map +1 -1
- package/dist/solid-core.module.js +1 -0
- package/dist/solid-core.module.js.map +1 -1
- package/dist/subscribers/computed-entity-field.subscriber.js.map +1 -1
- package/dist/subscribers/security-rule.subscriber.d.ts.map +1 -1
- package/dist/subscribers/security-rule.subscriber.js.map +1 -1
- package/dist/subscribers/view-metadata.subscriber.js.map +1 -1
- package/dist/testing/core/testing-engine.js.map +1 -1
- package/dist/testing/reporter/webhook-reporter.d.ts +54 -0
- package/dist/testing/reporter/webhook-reporter.d.ts.map +1 -0
- package/dist/testing/reporter/webhook-reporter.js +74 -0
- package/dist/testing/reporter/webhook-reporter.js.map +1 -0
- package/package.json +6 -2
- package/src/commands/run-tests.command.ts +45 -17
- package/src/controllers/action-metadata.controller.ts +1 -1
- package/src/controllers/facebook-authentication.controller.ts +1 -1
- package/src/controllers/google-authentication.controller.ts +1 -1
- package/src/controllers/menu-item-metadata.controller.ts +1 -1
- package/src/controllers/microsoft-authentication.controller.ts +1 -1
- package/src/controllers/mq-message-queue.controller.ts +1 -1
- package/src/controllers/mq-message.controller.ts +1 -1
- package/src/controllers/user.controller.ts +16 -16
- package/src/controllers/view-metadata.controller.ts +1 -1
- package/src/helpers/bootstrap.helper.ts +3 -0
- package/src/helpers/field-crud-managers/BigIntFieldCrudManager.ts +1 -1
- package/src/helpers/field-crud-managers/SelectionDynamicFieldCrudManager.ts +1 -1
- package/src/helpers/module-metadata-helper.service.ts +1 -1
- package/src/jobs/database/trigger-mcp-client-subscriber-database.service.ts +1 -1
- package/src/passport-strategies/facebook-oauth.strategy.ts +82 -31
- package/src/repository/security-rule.repository.ts +1 -1
- package/src/seeders/module-metadata-seeder.service.ts +4 -4
- package/src/seeders/permission-metadata-seeder.service.ts +1 -1
- package/src/seeders/seed-data/solid-core-metadata.json +14 -3
- package/src/services/authentication.service.ts +215 -151
- package/src/services/chatter-message.service.ts +1 -1
- package/src/services/crud.service.ts +3 -3
- package/src/services/csv.service.ts +1 -1
- package/src/services/dashboard.service.ts +1 -1
- package/src/services/database/database-bootstrap.service.ts +1 -1
- package/src/services/excel.service.ts +1 -1
- package/src/services/export-transaction.service.ts +2 -2
- package/src/services/field-metadata.service.ts +3 -3
- package/src/services/fixtures.service.ts +2 -2
- package/src/services/import-transaction.service.ts +2 -2
- package/src/services/list-of-values.service.ts +1 -1
- package/src/services/model-metadata.service.ts +22 -21
- package/src/services/module-metadata.service.ts +7 -7
- package/src/services/queues/database-publisher.service.ts +4 -4
- package/src/services/queues/database-subscriber.service.ts +7 -7
- package/src/services/queues/rabbitmq-publisher.service.ts +7 -7
- package/src/services/queues/rabbitmq-subscriber.service.ts +13 -13
- package/src/services/queues/redis-publisher.service.ts +7 -4
- package/src/services/queues/redis-subscriber.service.ts +9 -6
- package/src/services/role-metadata.service.ts +1 -1
- package/src/services/scheduled-jobs/scheduler.service.ts +5 -5
- package/src/services/settings/default-settings-provider.service.ts +101 -21
- package/src/services/sms/TwilioSMSService.ts +2 -2
- package/src/services/solid-introspect.service.ts +2 -2
- package/src/services/user-activity-history.service.ts +1 -1
- package/src/services/user.service.ts +149 -77
- package/src/services/view-metadata.service.ts +25 -8
- package/src/solid-core.module.ts +1 -0
- package/src/subscribers/computed-entity-field.subscriber.ts +1 -1
- package/src/subscribers/security-rule.subscriber.ts +8 -8
- package/src/subscribers/view-metadata.subscriber.ts +1 -1
- package/src/testing/core/testing-engine.ts +2 -2
- package/src/testing/reporter/webhook-reporter.ts +116 -0
- 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:
|
|
146
|
+
.andWhere('view.type IN (:...viewTypes)', { viewTypes: collectionViewTypes })
|
|
146
147
|
.getMany();
|
|
147
148
|
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
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
|
package/src/solid-core.module.ts
CHANGED
|
@@ -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
|
|
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.
|