@oneuptime/common 7.0.4358 → 7.0.4372
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/Models/AnalyticsModels/ExceptionInstance.ts +2 -2
- package/Models/DatabaseModels/OnCallDutyPolicyEscalationRuleSchedule.ts +2 -2
- package/Models/DatabaseModels/OnCallDutyPolicyEscalationRuleTeam.ts +2 -2
- package/Models/DatabaseModels/OnCallDutyPolicyEscalationRuleUser.ts +2 -2
- package/Models/DatabaseModels/OnCallDutyPolicyTimeLog.ts +2 -2
- package/Models/DatabaseModels/Probe.ts +7 -1
- package/Models/DatabaseModels/ServiceCatalog.ts +2 -2
- package/Models/DatabaseModels/ServiceCopilotCodeRepository.ts +2 -2
- package/Server/Utils/OpenAPI.ts +564 -2
- package/Utils/Schema/AnalyticsModelSchema.ts +764 -0
- package/Utils/Schema/BaseSchema.ts +450 -0
- package/Utils/Schema/ModelSchema.ts +176 -407
- package/build/dist/Models/AnalyticsModels/ExceptionInstance.js +2 -2
- package/build/dist/Models/AnalyticsModels/ExceptionInstance.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyEscalationRuleSchedule.js +2 -2
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyEscalationRuleSchedule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyEscalationRuleTeam.js +2 -2
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyEscalationRuleTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyEscalationRuleUser.js +2 -2
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyEscalationRuleUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyTimeLog.js +2 -2
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyTimeLog.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Probe.js +7 -1
- package/build/dist/Models/DatabaseModels/Probe.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ServiceCatalog.js +2 -2
- package/build/dist/Models/DatabaseModels/ServiceCatalog.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ServiceCopilotCodeRepository.js +2 -2
- package/build/dist/Models/DatabaseModels/ServiceCopilotCodeRepository.js.map +1 -1
- package/build/dist/Server/Utils/OpenAPI.js +445 -2
- package/build/dist/Server/Utils/OpenAPI.js.map +1 -1
- package/build/dist/Utils/Schema/AnalyticsModelSchema.js +636 -0
- package/build/dist/Utils/Schema/AnalyticsModelSchema.js.map +1 -0
- package/build/dist/Utils/Schema/BaseSchema.js +295 -0
- package/build/dist/Utils/Schema/BaseSchema.js.map +1 -0
- package/build/dist/Utils/Schema/ModelSchema.js +155 -337
- package/build/dist/Utils/Schema/ModelSchema.js.map +1 -1
- package/package.json +1 -1
package/Server/Utils/OpenAPI.ts
CHANGED
|
@@ -4,9 +4,15 @@ import {
|
|
|
4
4
|
} from "@asteasolutions/zod-to-openapi";
|
|
5
5
|
import DatabaseBaseModel from "../../Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel";
|
|
6
6
|
import Models from "../../Models/DatabaseModels/Index";
|
|
7
|
+
import AnalyticsBaseModel from "../../Models/AnalyticsModels/AnalyticsBaseModel/AnalyticsBaseModel";
|
|
8
|
+
import AnalyticsModels from "../../Models/AnalyticsModels/Index";
|
|
7
9
|
import { JSONObject, JSONValue } from "../../Types/JSON";
|
|
8
10
|
import logger from "./Logger";
|
|
9
11
|
import { ModelSchema, ModelSchemaType } from "../../Utils/Schema/ModelSchema";
|
|
12
|
+
import {
|
|
13
|
+
AnalyticsModelSchema,
|
|
14
|
+
AnalyticsModelSchemaType,
|
|
15
|
+
} from "../../Utils/Schema/AnalyticsModelSchema";
|
|
10
16
|
import LocalCache from "../Infrastructure/LocalCache";
|
|
11
17
|
import { Host, HttpProtocol } from "../EnvironmentConfig";
|
|
12
18
|
import Permission from "../../Types/Permission";
|
|
@@ -26,8 +32,13 @@ export default class OpenAPIUtil {
|
|
|
26
32
|
}
|
|
27
33
|
|
|
28
34
|
return (
|
|
29
|
-
permissions.
|
|
30
|
-
permissions.
|
|
35
|
+
permissions.length > 0 &&
|
|
36
|
+
permissions.every((permission: Permission) => {
|
|
37
|
+
return (
|
|
38
|
+
permission === Permission.Public ||
|
|
39
|
+
permission === Permission.CurrentUser
|
|
40
|
+
);
|
|
41
|
+
})
|
|
31
42
|
);
|
|
32
43
|
}
|
|
33
44
|
|
|
@@ -44,6 +55,7 @@ export default class OpenAPIUtil {
|
|
|
44
55
|
}
|
|
45
56
|
|
|
46
57
|
const registry: OpenAPIRegistry = new OpenAPIRegistry();
|
|
58
|
+
const tags: Array<{ name: string; description: string }> = [];
|
|
47
59
|
|
|
48
60
|
// Register schemas and paths for all models
|
|
49
61
|
for (const ModelClass of Models) {
|
|
@@ -70,6 +82,14 @@ export default class OpenAPIUtil {
|
|
|
70
82
|
continue;
|
|
71
83
|
}
|
|
72
84
|
|
|
85
|
+
// Add tag for this model
|
|
86
|
+
const singularModelName: string = model.singularName || modelName;
|
|
87
|
+
tags.push({
|
|
88
|
+
name: singularModelName,
|
|
89
|
+
description:
|
|
90
|
+
model.tableDescription || `API endpoints for ${singularModelName}`,
|
|
91
|
+
});
|
|
92
|
+
|
|
73
93
|
// register the model schema
|
|
74
94
|
OpenAPIUtil.registerModelSchemas(registry, model);
|
|
75
95
|
|
|
@@ -100,6 +120,64 @@ export default class OpenAPIUtil {
|
|
|
100
120
|
});
|
|
101
121
|
}
|
|
102
122
|
|
|
123
|
+
// Register schemas and paths for all Analytics models
|
|
124
|
+
for (const AnalyticsModelClass of AnalyticsModels) {
|
|
125
|
+
const analyticsModel: AnalyticsBaseModel = new AnalyticsModelClass();
|
|
126
|
+
const modelName: string | null = analyticsModel.tableName;
|
|
127
|
+
|
|
128
|
+
if (!modelName) {
|
|
129
|
+
continue;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
if (!analyticsModel.crudApiPath) {
|
|
133
|
+
logger.debug(
|
|
134
|
+
`Skipping OpenAPI documentation for Analytics model ${modelName} as it does not have a CRUD API path defined.`,
|
|
135
|
+
);
|
|
136
|
+
continue;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// Add tag for this model
|
|
140
|
+
const singularModelName: string =
|
|
141
|
+
analyticsModel.singularName || modelName;
|
|
142
|
+
tags.push({
|
|
143
|
+
name: singularModelName,
|
|
144
|
+
description: `API endpoints for ${singularModelName}`,
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
// register the analytics model schema
|
|
148
|
+
OpenAPIUtil.registerAnalyticsModelSchemas(registry, analyticsModel);
|
|
149
|
+
|
|
150
|
+
this.generateAnalyticsListApiSpec({
|
|
151
|
+
modelType: AnalyticsModelClass,
|
|
152
|
+
registry,
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
this.generateAnalyticsCountApiSpec({
|
|
156
|
+
modelType: AnalyticsModelClass,
|
|
157
|
+
registry,
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
this.generateAnalyticsCreateApiSpec({
|
|
161
|
+
modelType: AnalyticsModelClass,
|
|
162
|
+
registry,
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
this.generateAnalyticsGetApiSpec({
|
|
166
|
+
modelType: AnalyticsModelClass,
|
|
167
|
+
registry,
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
this.generateAnalyticsUpdateApiSpec({
|
|
171
|
+
modelType: AnalyticsModelClass,
|
|
172
|
+
registry,
|
|
173
|
+
});
|
|
174
|
+
|
|
175
|
+
this.generateAnalyticsDeleteApiSpec({
|
|
176
|
+
modelType: AnalyticsModelClass,
|
|
177
|
+
registry,
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
|
|
103
181
|
const generator: OpenApiGeneratorV3 = new OpenApiGeneratorV3(
|
|
104
182
|
registry.definitions,
|
|
105
183
|
);
|
|
@@ -118,6 +196,9 @@ export default class OpenAPIUtil {
|
|
|
118
196
|
description: "API Server",
|
|
119
197
|
},
|
|
120
198
|
],
|
|
199
|
+
tags: tags.sort((a: any, b: any) => {
|
|
200
|
+
return a.name.localeCompare(b.name);
|
|
201
|
+
}),
|
|
121
202
|
}) as unknown as JSONObject;
|
|
122
203
|
|
|
123
204
|
LocalCache.setJSON("openapi", "spec", spec as JSONObject);
|
|
@@ -145,6 +226,7 @@ export default class OpenAPIUtil {
|
|
|
145
226
|
path: `${model.crudApiPath}/get-list`,
|
|
146
227
|
summary: `List ${singularModelName}`,
|
|
147
228
|
description: `Endpoint to list all ${singularModelName} items`,
|
|
229
|
+
tags: [singularModelName],
|
|
148
230
|
requestBody: {
|
|
149
231
|
required: false,
|
|
150
232
|
content: {
|
|
@@ -203,6 +285,7 @@ export default class OpenAPIUtil {
|
|
|
203
285
|
path: `${model.crudApiPath}/count`,
|
|
204
286
|
summary: `Count ${singularModelName}`,
|
|
205
287
|
description: `Endpoint to count ${singularModelName} items`,
|
|
288
|
+
tags: [singularModelName],
|
|
206
289
|
requestBody: {
|
|
207
290
|
required: false,
|
|
208
291
|
content: {
|
|
@@ -259,6 +342,7 @@ export default class OpenAPIUtil {
|
|
|
259
342
|
path: `${model.crudApiPath}`,
|
|
260
343
|
summary: `Create ${singularModelName}`,
|
|
261
344
|
description: `Endpoint to create a new ${singularModelName}`,
|
|
345
|
+
tags: [singularModelName],
|
|
262
346
|
requestBody: {
|
|
263
347
|
required: true,
|
|
264
348
|
content: {
|
|
@@ -365,6 +449,7 @@ export default class OpenAPIUtil {
|
|
|
365
449
|
path: `${model.crudApiPath}/{id}`,
|
|
366
450
|
summary: `Get ${singularModelName}`,
|
|
367
451
|
description: `Endpoint to retrieve a single ${singularModelName} by ID`,
|
|
452
|
+
tags: [singularModelName],
|
|
368
453
|
parameters: [
|
|
369
454
|
...(OpenAPIUtil.getDefaultApiHeaders() as Array<any>),
|
|
370
455
|
{
|
|
@@ -449,6 +534,7 @@ export default class OpenAPIUtil {
|
|
|
449
534
|
path: `${model.crudApiPath}/{id}`,
|
|
450
535
|
summary: `Update ${singularModelName}`,
|
|
451
536
|
description: `Endpoint to update an existing ${singularModelName}`,
|
|
537
|
+
tags: [singularModelName],
|
|
452
538
|
parameters: [
|
|
453
539
|
...(OpenAPIUtil.getDefaultApiHeaders() as Array<any>),
|
|
454
540
|
{
|
|
@@ -519,6 +605,7 @@ export default class OpenAPIUtil {
|
|
|
519
605
|
path: `${model.crudApiPath}/{id}`,
|
|
520
606
|
summary: `Delete ${singularModelName}`,
|
|
521
607
|
description: `Endpoint to delete a ${singularModelName}`,
|
|
608
|
+
tags: [singularModelName],
|
|
522
609
|
parameters: [
|
|
523
610
|
...(OpenAPIUtil.getDefaultApiHeaders() as Array<any>),
|
|
524
611
|
{
|
|
@@ -634,4 +721,479 @@ export default class OpenAPIUtil {
|
|
|
634
721
|
registry.register(sortSchemaName, sortSchema);
|
|
635
722
|
registry.register(groupBySchemaName, groupBySchema);
|
|
636
723
|
}
|
|
724
|
+
|
|
725
|
+
// Analytics-specific methods
|
|
726
|
+
|
|
727
|
+
private static registerAnalyticsModelSchemas(
|
|
728
|
+
registry: OpenAPIRegistry,
|
|
729
|
+
model: AnalyticsBaseModel,
|
|
730
|
+
): void {
|
|
731
|
+
const tableName: string = model.tableName || "UnknownAnalyticsModel";
|
|
732
|
+
const modelType: new () => AnalyticsBaseModel =
|
|
733
|
+
model.constructor as new () => AnalyticsBaseModel;
|
|
734
|
+
|
|
735
|
+
// Register the main analytics model schema
|
|
736
|
+
const modelSchema: AnalyticsModelSchemaType =
|
|
737
|
+
AnalyticsModelSchema.getModelSchema({
|
|
738
|
+
modelType: modelType,
|
|
739
|
+
});
|
|
740
|
+
registry.register(tableName, modelSchema);
|
|
741
|
+
|
|
742
|
+
// Register operation-specific schemas based on permissions
|
|
743
|
+
this.registerAnalyticsOperationSpecificSchemas(
|
|
744
|
+
registry,
|
|
745
|
+
tableName,
|
|
746
|
+
modelType,
|
|
747
|
+
model,
|
|
748
|
+
);
|
|
749
|
+
|
|
750
|
+
// Register query, select, and sort schemas
|
|
751
|
+
this.registerAnalyticsQuerySchemas(registry, tableName, modelType);
|
|
752
|
+
}
|
|
753
|
+
|
|
754
|
+
private static registerAnalyticsOperationSpecificSchemas(
|
|
755
|
+
registry: OpenAPIRegistry,
|
|
756
|
+
tableName: string,
|
|
757
|
+
modelType: new () => AnalyticsBaseModel,
|
|
758
|
+
model: AnalyticsBaseModel,
|
|
759
|
+
): void {
|
|
760
|
+
// Check if model has create permissions and should not exclude API generation
|
|
761
|
+
if (!this.shouldExcludeApiForPermissions(model.getCreatePermissions())) {
|
|
762
|
+
const createSchema: AnalyticsModelSchemaType =
|
|
763
|
+
AnalyticsModelSchema.getCreateModelSchema({
|
|
764
|
+
modelType,
|
|
765
|
+
});
|
|
766
|
+
registry.register(`${tableName}CreateSchema`, createSchema);
|
|
767
|
+
}
|
|
768
|
+
|
|
769
|
+
// Check if model has read permissions and should not exclude API generation
|
|
770
|
+
if (!this.shouldExcludeApiForPermissions(model.getReadPermissions())) {
|
|
771
|
+
const readSchema: AnalyticsModelSchemaType =
|
|
772
|
+
AnalyticsModelSchema.getModelSchema({
|
|
773
|
+
modelType,
|
|
774
|
+
});
|
|
775
|
+
registry.register(`${tableName}ReadSchema`, readSchema);
|
|
776
|
+
}
|
|
777
|
+
|
|
778
|
+
// Check if model has update permissions and should not exclude API generation
|
|
779
|
+
if (!this.shouldExcludeApiForPermissions(model.getUpdatePermissions())) {
|
|
780
|
+
const updateSchema: AnalyticsModelSchemaType =
|
|
781
|
+
AnalyticsModelSchema.getCreateModelSchema({
|
|
782
|
+
modelType,
|
|
783
|
+
});
|
|
784
|
+
registry.register(`${tableName}UpdateSchema`, updateSchema);
|
|
785
|
+
}
|
|
786
|
+
|
|
787
|
+
// Check if model has delete permissions and should not exclude API generation
|
|
788
|
+
if (!this.shouldExcludeApiForPermissions(model.getDeletePermissions())) {
|
|
789
|
+
const deleteSchema: AnalyticsModelSchemaType =
|
|
790
|
+
AnalyticsModelSchema.getModelSchema({
|
|
791
|
+
modelType,
|
|
792
|
+
});
|
|
793
|
+
registry.register(`${tableName}DeleteSchema`, deleteSchema);
|
|
794
|
+
}
|
|
795
|
+
}
|
|
796
|
+
|
|
797
|
+
private static registerAnalyticsQuerySchemas(
|
|
798
|
+
registry: OpenAPIRegistry,
|
|
799
|
+
tableName: string,
|
|
800
|
+
modelType: new () => AnalyticsBaseModel,
|
|
801
|
+
): void {
|
|
802
|
+
const querySchemaName: string = `${tableName}QuerySchema`;
|
|
803
|
+
const selectSchemaName: string = `${tableName}SelectSchema`;
|
|
804
|
+
const sortSchemaName: string = `${tableName}SortSchema`;
|
|
805
|
+
const groupBySchemaName: string = `${tableName}GroupBySchema`;
|
|
806
|
+
|
|
807
|
+
const querySchema: AnalyticsModelSchemaType =
|
|
808
|
+
AnalyticsModelSchema.getQueryModelSchema({
|
|
809
|
+
modelType: modelType,
|
|
810
|
+
});
|
|
811
|
+
const selectSchema: AnalyticsModelSchemaType =
|
|
812
|
+
AnalyticsModelSchema.getSelectModelSchema({
|
|
813
|
+
modelType: modelType,
|
|
814
|
+
});
|
|
815
|
+
const sortSchema: AnalyticsModelSchemaType =
|
|
816
|
+
AnalyticsModelSchema.getSortModelSchema({
|
|
817
|
+
modelType: modelType,
|
|
818
|
+
});
|
|
819
|
+
const groupBySchema: AnalyticsModelSchemaType =
|
|
820
|
+
AnalyticsModelSchema.getGroupByModelSchema({
|
|
821
|
+
modelType: modelType,
|
|
822
|
+
});
|
|
823
|
+
|
|
824
|
+
registry.register(querySchemaName, querySchema);
|
|
825
|
+
registry.register(selectSchemaName, selectSchema);
|
|
826
|
+
registry.register(sortSchemaName, sortSchema);
|
|
827
|
+
registry.register(groupBySchemaName, groupBySchema);
|
|
828
|
+
}
|
|
829
|
+
|
|
830
|
+
// Analytics API generation methods
|
|
831
|
+
|
|
832
|
+
private static generateAnalyticsListApiSpec(data: {
|
|
833
|
+
modelType: new () => AnalyticsBaseModel;
|
|
834
|
+
registry: OpenAPIRegistry;
|
|
835
|
+
}): void {
|
|
836
|
+
const modelType: new () => AnalyticsBaseModel = data.modelType;
|
|
837
|
+
const model: AnalyticsBaseModel = new modelType();
|
|
838
|
+
const tableName: string = model.tableName || "UnknownAnalyticsModel";
|
|
839
|
+
const singularModelName: string = model.singularName || tableName;
|
|
840
|
+
|
|
841
|
+
// Use schema names that are already registered
|
|
842
|
+
const querySchemaName: string = `${tableName}QuerySchema`;
|
|
843
|
+
const selectSchemaName: string = `${tableName}SelectSchema`;
|
|
844
|
+
const sortSchemaName: string = `${tableName}SortSchema`;
|
|
845
|
+
const groupBySchemaName: string = `${tableName}GroupBySchema`;
|
|
846
|
+
|
|
847
|
+
data.registry.registerPath({
|
|
848
|
+
method: "post",
|
|
849
|
+
path: `${model.crudApiPath}/get-list`,
|
|
850
|
+
summary: `List ${singularModelName}`,
|
|
851
|
+
description: `Endpoint to list all ${singularModelName} items`,
|
|
852
|
+
tags: [singularModelName],
|
|
853
|
+
requestBody: {
|
|
854
|
+
required: false,
|
|
855
|
+
content: {
|
|
856
|
+
"application/json": {
|
|
857
|
+
schema: {
|
|
858
|
+
type: "object",
|
|
859
|
+
properties: {
|
|
860
|
+
query: { $ref: `#/components/schemas/${querySchemaName}` },
|
|
861
|
+
select: { $ref: `#/components/schemas/${selectSchemaName}` },
|
|
862
|
+
sort: { $ref: `#/components/schemas/${sortSchemaName}` },
|
|
863
|
+
groupBy: { $ref: `#/components/schemas/${groupBySchemaName}` },
|
|
864
|
+
},
|
|
865
|
+
},
|
|
866
|
+
},
|
|
867
|
+
},
|
|
868
|
+
},
|
|
869
|
+
responses: {
|
|
870
|
+
"200": {
|
|
871
|
+
description: "Successful response",
|
|
872
|
+
content: {
|
|
873
|
+
"application/json": {
|
|
874
|
+
schema: {
|
|
875
|
+
type: "object",
|
|
876
|
+
properties: {
|
|
877
|
+
data: {
|
|
878
|
+
type: "array",
|
|
879
|
+
items: {
|
|
880
|
+
$ref: `#/components/schemas/${tableName}`,
|
|
881
|
+
},
|
|
882
|
+
},
|
|
883
|
+
count: { type: "number" },
|
|
884
|
+
},
|
|
885
|
+
},
|
|
886
|
+
},
|
|
887
|
+
},
|
|
888
|
+
},
|
|
889
|
+
...this.getGenericStatusResponseSchema(),
|
|
890
|
+
},
|
|
891
|
+
});
|
|
892
|
+
}
|
|
893
|
+
|
|
894
|
+
private static generateAnalyticsCountApiSpec(data: {
|
|
895
|
+
modelType: new () => AnalyticsBaseModel;
|
|
896
|
+
registry: OpenAPIRegistry;
|
|
897
|
+
}): void {
|
|
898
|
+
const modelType: new () => AnalyticsBaseModel = data.modelType;
|
|
899
|
+
const model: AnalyticsBaseModel = new modelType();
|
|
900
|
+
const tableName: string = model.tableName || "UnknownAnalyticsModel";
|
|
901
|
+
const singularModelName: string = model.singularName || tableName;
|
|
902
|
+
|
|
903
|
+
// Use schema name that is already registered
|
|
904
|
+
const querySchemaName: string = `${tableName}QuerySchema`;
|
|
905
|
+
|
|
906
|
+
data.registry.registerPath({
|
|
907
|
+
method: "post",
|
|
908
|
+
path: `${model.crudApiPath}/count`,
|
|
909
|
+
summary: `Count ${singularModelName}`,
|
|
910
|
+
description: `Endpoint to count ${singularModelName} items`,
|
|
911
|
+
tags: [singularModelName],
|
|
912
|
+
requestBody: {
|
|
913
|
+
required: false,
|
|
914
|
+
content: {
|
|
915
|
+
"application/json": {
|
|
916
|
+
schema: {
|
|
917
|
+
type: "object",
|
|
918
|
+
properties: {
|
|
919
|
+
query: { $ref: `#/components/schemas/${querySchemaName}` },
|
|
920
|
+
},
|
|
921
|
+
},
|
|
922
|
+
},
|
|
923
|
+
},
|
|
924
|
+
},
|
|
925
|
+
responses: {
|
|
926
|
+
"200": {
|
|
927
|
+
description: "Successful response",
|
|
928
|
+
content: {
|
|
929
|
+
"application/json": {
|
|
930
|
+
schema: {
|
|
931
|
+
type: "object",
|
|
932
|
+
properties: {
|
|
933
|
+
count: { type: "number" },
|
|
934
|
+
},
|
|
935
|
+
},
|
|
936
|
+
},
|
|
937
|
+
},
|
|
938
|
+
},
|
|
939
|
+
...this.getGenericStatusResponseSchema(),
|
|
940
|
+
},
|
|
941
|
+
});
|
|
942
|
+
}
|
|
943
|
+
|
|
944
|
+
private static generateAnalyticsCreateApiSpec(data: {
|
|
945
|
+
modelType: new () => AnalyticsBaseModel;
|
|
946
|
+
registry: OpenAPIRegistry;
|
|
947
|
+
}): void {
|
|
948
|
+
const modelType: new () => AnalyticsBaseModel = data.modelType;
|
|
949
|
+
const model: AnalyticsBaseModel = new modelType();
|
|
950
|
+
const tableName: string = model.tableName || "UnknownAnalyticsModel";
|
|
951
|
+
const singularModelName: string = model.singularName || tableName;
|
|
952
|
+
|
|
953
|
+
// Skip generating create API if model has no create permissions or contains Public/CurrentUser permissions
|
|
954
|
+
if (this.shouldExcludeApiForPermissions(model.getCreatePermissions())) {
|
|
955
|
+
return;
|
|
956
|
+
}
|
|
957
|
+
|
|
958
|
+
// Use schema names that are already registered
|
|
959
|
+
const createSchemaName: string = `${tableName}CreateSchema`;
|
|
960
|
+
const selectSchemaName: string = `${tableName}SelectSchema`;
|
|
961
|
+
const readSchemaName: string = `${tableName}ReadSchema`;
|
|
962
|
+
|
|
963
|
+
data.registry.registerPath({
|
|
964
|
+
method: "post",
|
|
965
|
+
path: `${model.crudApiPath}`,
|
|
966
|
+
summary: `Create ${singularModelName}`,
|
|
967
|
+
description: `Endpoint to create a new ${singularModelName}`,
|
|
968
|
+
tags: [singularModelName],
|
|
969
|
+
requestBody: {
|
|
970
|
+
required: true,
|
|
971
|
+
content: {
|
|
972
|
+
"application/json": {
|
|
973
|
+
schema: {
|
|
974
|
+
type: "object",
|
|
975
|
+
properties: {
|
|
976
|
+
data: {
|
|
977
|
+
$ref: `#/components/schemas/${createSchemaName}`,
|
|
978
|
+
},
|
|
979
|
+
miscDataProps: {
|
|
980
|
+
type: "object",
|
|
981
|
+
description: "Additional data properties for creation",
|
|
982
|
+
additionalProperties: true,
|
|
983
|
+
},
|
|
984
|
+
select: { $ref: `#/components/schemas/${selectSchemaName}` },
|
|
985
|
+
},
|
|
986
|
+
required: ["data"],
|
|
987
|
+
},
|
|
988
|
+
},
|
|
989
|
+
},
|
|
990
|
+
},
|
|
991
|
+
responses: {
|
|
992
|
+
"201": {
|
|
993
|
+
description: "Created successfully",
|
|
994
|
+
content: {
|
|
995
|
+
"application/json": {
|
|
996
|
+
schema: {
|
|
997
|
+
type: "object",
|
|
998
|
+
properties: {
|
|
999
|
+
data: {
|
|
1000
|
+
$ref: `#/components/schemas/${readSchemaName}`,
|
|
1001
|
+
},
|
|
1002
|
+
},
|
|
1003
|
+
},
|
|
1004
|
+
},
|
|
1005
|
+
},
|
|
1006
|
+
},
|
|
1007
|
+
...this.getGenericStatusResponseSchema(),
|
|
1008
|
+
},
|
|
1009
|
+
});
|
|
1010
|
+
}
|
|
1011
|
+
|
|
1012
|
+
private static generateAnalyticsGetApiSpec(data: {
|
|
1013
|
+
modelType: new () => AnalyticsBaseModel;
|
|
1014
|
+
registry: OpenAPIRegistry;
|
|
1015
|
+
}): void {
|
|
1016
|
+
const modelType: new () => AnalyticsBaseModel = data.modelType;
|
|
1017
|
+
const model: AnalyticsBaseModel = new modelType();
|
|
1018
|
+
const tableName: string = model.tableName || "UnknownAnalyticsModel";
|
|
1019
|
+
const singularModelName: string = model.singularName || tableName;
|
|
1020
|
+
|
|
1021
|
+
// Skip generating get API if model has no read permissions or contains Public/CurrentUser permissions
|
|
1022
|
+
if (this.shouldExcludeApiForPermissions(model.getReadPermissions())) {
|
|
1023
|
+
return;
|
|
1024
|
+
}
|
|
1025
|
+
|
|
1026
|
+
// Use schema name that is already registered
|
|
1027
|
+
const selectSchemaName: string = `${tableName}SelectSchema`;
|
|
1028
|
+
|
|
1029
|
+
data.registry.registerPath({
|
|
1030
|
+
method: "post",
|
|
1031
|
+
path: `${model.crudApiPath}/{id}`,
|
|
1032
|
+
summary: `Get ${singularModelName}`,
|
|
1033
|
+
description: `Endpoint to retrieve a single ${singularModelName} by ID`,
|
|
1034
|
+
tags: [singularModelName],
|
|
1035
|
+
parameters: [
|
|
1036
|
+
...(OpenAPIUtil.getDefaultApiHeaders() as Array<any>),
|
|
1037
|
+
{
|
|
1038
|
+
name: "id",
|
|
1039
|
+
in: "path",
|
|
1040
|
+
required: true,
|
|
1041
|
+
schema: {
|
|
1042
|
+
type: "string",
|
|
1043
|
+
format: "uuid",
|
|
1044
|
+
},
|
|
1045
|
+
description: `ID of the ${singularModelName} to retrieve`,
|
|
1046
|
+
},
|
|
1047
|
+
],
|
|
1048
|
+
requestBody: {
|
|
1049
|
+
required: false,
|
|
1050
|
+
content: {
|
|
1051
|
+
"application/json": {
|
|
1052
|
+
schema: {
|
|
1053
|
+
type: "object",
|
|
1054
|
+
properties: {
|
|
1055
|
+
select: { $ref: `#/components/schemas/${selectSchemaName}` },
|
|
1056
|
+
},
|
|
1057
|
+
},
|
|
1058
|
+
},
|
|
1059
|
+
},
|
|
1060
|
+
},
|
|
1061
|
+
responses: {
|
|
1062
|
+
"200": {
|
|
1063
|
+
description: "Successful response",
|
|
1064
|
+
content: {
|
|
1065
|
+
"application/json": {
|
|
1066
|
+
schema: {
|
|
1067
|
+
type: "object",
|
|
1068
|
+
properties: {
|
|
1069
|
+
data: {
|
|
1070
|
+
$ref: `#/components/schemas/${tableName}`,
|
|
1071
|
+
},
|
|
1072
|
+
},
|
|
1073
|
+
},
|
|
1074
|
+
},
|
|
1075
|
+
},
|
|
1076
|
+
},
|
|
1077
|
+
...this.getGenericStatusResponseSchema(),
|
|
1078
|
+
},
|
|
1079
|
+
});
|
|
1080
|
+
}
|
|
1081
|
+
|
|
1082
|
+
private static generateAnalyticsUpdateApiSpec(data: {
|
|
1083
|
+
modelType: new () => AnalyticsBaseModel;
|
|
1084
|
+
registry: OpenAPIRegistry;
|
|
1085
|
+
}): void {
|
|
1086
|
+
const modelType: new () => AnalyticsBaseModel = data.modelType;
|
|
1087
|
+
const model: AnalyticsBaseModel = new modelType();
|
|
1088
|
+
const tableName: string = model.tableName || "UnknownAnalyticsModel";
|
|
1089
|
+
const singularModelName: string = model.singularName || tableName;
|
|
1090
|
+
|
|
1091
|
+
// Skip generating update API if model has no update permissions or contains Public/CurrentUser permissions
|
|
1092
|
+
if (this.shouldExcludeApiForPermissions(model.getUpdatePermissions())) {
|
|
1093
|
+
return;
|
|
1094
|
+
}
|
|
1095
|
+
|
|
1096
|
+
// Use schema names that are already registered
|
|
1097
|
+
const updateSchemaName: string = `${tableName}UpdateSchema`;
|
|
1098
|
+
const selectSchemaName: string = `${tableName}SelectSchema`;
|
|
1099
|
+
const readSchemaName: string = `${tableName}ReadSchema`;
|
|
1100
|
+
|
|
1101
|
+
data.registry.registerPath({
|
|
1102
|
+
method: "put",
|
|
1103
|
+
path: `${model.crudApiPath}/{id}`,
|
|
1104
|
+
summary: `Update ${singularModelName}`,
|
|
1105
|
+
description: `Endpoint to update an existing ${singularModelName}`,
|
|
1106
|
+
tags: [singularModelName],
|
|
1107
|
+
parameters: [
|
|
1108
|
+
...(OpenAPIUtil.getDefaultApiHeaders() as Array<any>),
|
|
1109
|
+
{
|
|
1110
|
+
name: "id",
|
|
1111
|
+
in: "path",
|
|
1112
|
+
required: true,
|
|
1113
|
+
schema: {
|
|
1114
|
+
type: "string",
|
|
1115
|
+
format: "uuid",
|
|
1116
|
+
},
|
|
1117
|
+
description: `ID of the ${singularModelName} to update`,
|
|
1118
|
+
},
|
|
1119
|
+
],
|
|
1120
|
+
requestBody: {
|
|
1121
|
+
required: true,
|
|
1122
|
+
content: {
|
|
1123
|
+
"application/json": {
|
|
1124
|
+
schema: {
|
|
1125
|
+
type: "object",
|
|
1126
|
+
properties: {
|
|
1127
|
+
data: {
|
|
1128
|
+
$ref: `#/components/schemas/${updateSchemaName}`,
|
|
1129
|
+
},
|
|
1130
|
+
select: { $ref: `#/components/schemas/${selectSchemaName}` },
|
|
1131
|
+
},
|
|
1132
|
+
required: ["data"],
|
|
1133
|
+
},
|
|
1134
|
+
},
|
|
1135
|
+
},
|
|
1136
|
+
},
|
|
1137
|
+
responses: {
|
|
1138
|
+
"200": {
|
|
1139
|
+
description: "Updated successfully",
|
|
1140
|
+
content: {
|
|
1141
|
+
"application/json": {
|
|
1142
|
+
schema: {
|
|
1143
|
+
type: "object",
|
|
1144
|
+
properties: {
|
|
1145
|
+
data: {
|
|
1146
|
+
$ref: `#/components/schemas/${readSchemaName}`,
|
|
1147
|
+
},
|
|
1148
|
+
},
|
|
1149
|
+
},
|
|
1150
|
+
},
|
|
1151
|
+
},
|
|
1152
|
+
},
|
|
1153
|
+
...this.getGenericStatusResponseSchema(),
|
|
1154
|
+
},
|
|
1155
|
+
});
|
|
1156
|
+
}
|
|
1157
|
+
|
|
1158
|
+
private static generateAnalyticsDeleteApiSpec(data: {
|
|
1159
|
+
modelType: new () => AnalyticsBaseModel;
|
|
1160
|
+
registry: OpenAPIRegistry;
|
|
1161
|
+
}): void {
|
|
1162
|
+
const modelType: new () => AnalyticsBaseModel = data.modelType;
|
|
1163
|
+
const model: AnalyticsBaseModel = new modelType();
|
|
1164
|
+
const tableName: string = model.tableName || "UnknownAnalyticsModel";
|
|
1165
|
+
const singularModelName: string = model.singularName || tableName;
|
|
1166
|
+
|
|
1167
|
+
// Skip generating delete API if model has no delete permissions or contains Public/CurrentUser permissions
|
|
1168
|
+
if (this.shouldExcludeApiForPermissions(model.getDeletePermissions())) {
|
|
1169
|
+
return;
|
|
1170
|
+
}
|
|
1171
|
+
|
|
1172
|
+
data.registry.registerPath({
|
|
1173
|
+
method: "delete",
|
|
1174
|
+
path: `${model.crudApiPath}/{id}`,
|
|
1175
|
+
summary: `Delete ${singularModelName}`,
|
|
1176
|
+
description: `Endpoint to delete a ${singularModelName}`,
|
|
1177
|
+
tags: [singularModelName],
|
|
1178
|
+
parameters: [
|
|
1179
|
+
...(OpenAPIUtil.getDefaultApiHeaders() as Array<any>),
|
|
1180
|
+
{
|
|
1181
|
+
name: "id",
|
|
1182
|
+
in: "path",
|
|
1183
|
+
required: true,
|
|
1184
|
+
schema: {
|
|
1185
|
+
type: "string",
|
|
1186
|
+
format: "uuid",
|
|
1187
|
+
},
|
|
1188
|
+
description: `ID of the ${singularModelName} to delete`,
|
|
1189
|
+
},
|
|
1190
|
+
],
|
|
1191
|
+
responses: {
|
|
1192
|
+
"200": {
|
|
1193
|
+
description: "Deleted successfully",
|
|
1194
|
+
},
|
|
1195
|
+
...this.getGenericStatusResponseSchema(),
|
|
1196
|
+
},
|
|
1197
|
+
});
|
|
1198
|
+
}
|
|
637
1199
|
}
|