@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.
Files changed (37) hide show
  1. package/Models/AnalyticsModels/ExceptionInstance.ts +2 -2
  2. package/Models/DatabaseModels/OnCallDutyPolicyEscalationRuleSchedule.ts +2 -2
  3. package/Models/DatabaseModels/OnCallDutyPolicyEscalationRuleTeam.ts +2 -2
  4. package/Models/DatabaseModels/OnCallDutyPolicyEscalationRuleUser.ts +2 -2
  5. package/Models/DatabaseModels/OnCallDutyPolicyTimeLog.ts +2 -2
  6. package/Models/DatabaseModels/Probe.ts +7 -1
  7. package/Models/DatabaseModels/ServiceCatalog.ts +2 -2
  8. package/Models/DatabaseModels/ServiceCopilotCodeRepository.ts +2 -2
  9. package/Server/Utils/OpenAPI.ts +564 -2
  10. package/Utils/Schema/AnalyticsModelSchema.ts +764 -0
  11. package/Utils/Schema/BaseSchema.ts +450 -0
  12. package/Utils/Schema/ModelSchema.ts +176 -407
  13. package/build/dist/Models/AnalyticsModels/ExceptionInstance.js +2 -2
  14. package/build/dist/Models/AnalyticsModels/ExceptionInstance.js.map +1 -1
  15. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyEscalationRuleSchedule.js +2 -2
  16. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyEscalationRuleSchedule.js.map +1 -1
  17. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyEscalationRuleTeam.js +2 -2
  18. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyEscalationRuleTeam.js.map +1 -1
  19. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyEscalationRuleUser.js +2 -2
  20. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyEscalationRuleUser.js.map +1 -1
  21. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyTimeLog.js +2 -2
  22. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyTimeLog.js.map +1 -1
  23. package/build/dist/Models/DatabaseModels/Probe.js +7 -1
  24. package/build/dist/Models/DatabaseModels/Probe.js.map +1 -1
  25. package/build/dist/Models/DatabaseModels/ServiceCatalog.js +2 -2
  26. package/build/dist/Models/DatabaseModels/ServiceCatalog.js.map +1 -1
  27. package/build/dist/Models/DatabaseModels/ServiceCopilotCodeRepository.js +2 -2
  28. package/build/dist/Models/DatabaseModels/ServiceCopilotCodeRepository.js.map +1 -1
  29. package/build/dist/Server/Utils/OpenAPI.js +445 -2
  30. package/build/dist/Server/Utils/OpenAPI.js.map +1 -1
  31. package/build/dist/Utils/Schema/AnalyticsModelSchema.js +636 -0
  32. package/build/dist/Utils/Schema/AnalyticsModelSchema.js.map +1 -0
  33. package/build/dist/Utils/Schema/BaseSchema.js +295 -0
  34. package/build/dist/Utils/Schema/BaseSchema.js.map +1 -0
  35. package/build/dist/Utils/Schema/ModelSchema.js +155 -337
  36. package/build/dist/Utils/Schema/ModelSchema.js.map +1 -1
  37. package/package.json +1 -1
@@ -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.includes(Permission.Public) ||
30
- permissions.includes(Permission.CurrentUser)
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
  }