@oneuptime/common 11.0.10 → 11.0.12

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 (125) hide show
  1. package/Models/DatabaseModels/CephCluster.ts +134 -0
  2. package/Models/DatabaseModels/CloudResource.ts +134 -0
  3. package/Models/DatabaseModels/DockerHost.ts +134 -0
  4. package/Models/DatabaseModels/DockerSwarmCluster.ts +134 -0
  5. package/Models/DatabaseModels/Host.ts +134 -0
  6. package/Models/DatabaseModels/KubernetesCluster.ts +134 -0
  7. package/Models/DatabaseModels/PodmanHost.ts +134 -0
  8. package/Models/DatabaseModels/ProxmoxCluster.ts +134 -0
  9. package/Models/DatabaseModels/RumApplication.ts +134 -0
  10. package/Models/DatabaseModels/ServerlessFunction.ts +134 -0
  11. package/Models/DatabaseModels/Service.ts +134 -0
  12. package/README.md +1 -1
  13. package/Scripts/generate-service-worker.js +46 -36
  14. package/Server/Infrastructure/Postgres/DataSourceOptions.ts +4 -2
  15. package/Server/Infrastructure/Postgres/SchemaMigrations/1782600000000-AddArchiveToResources.ts +331 -0
  16. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +2 -0
  17. package/Server/Infrastructure/Postgres/SchemaMigrations/Readme.md +3 -3
  18. package/Server/Services/AIAgentService.ts +9 -4
  19. package/Server/Services/AnalyticsDatabaseService.ts +89 -56
  20. package/Server/Services/CephClusterService.ts +6 -4
  21. package/Server/Services/CloudResourceService.ts +6 -4
  22. package/Server/Services/DatabaseService.ts +126 -0
  23. package/Server/Services/DockerHostService.ts +6 -4
  24. package/Server/Services/DockerSwarmClusterService.ts +6 -4
  25. package/Server/Services/HostService.ts +6 -4
  26. package/Server/Services/KubernetesClusterService.ts +6 -4
  27. package/Server/Services/PodmanHostService.ts +6 -4
  28. package/Server/Services/ProbeService.ts +10 -4
  29. package/Server/Services/ProxmoxClusterService.ts +6 -4
  30. package/Server/Services/RumApplicationService.ts +6 -4
  31. package/Server/Services/ServerlessFunctionService.ts +6 -4
  32. package/Server/Services/ServiceService.ts +17 -4
  33. package/Server/Utils/AnalyticsDatabase/StatementGenerator.ts +1 -1
  34. package/Server/Utils/Monitor/MonitorResource.ts +24 -10
  35. package/Server/Utils/Telemetry/EntityRegistry.ts +10 -5
  36. package/Server/Utils/Workspace/Slack/app-manifest.json +86 -92
  37. package/Tests/Server/Services/UpdateColumnsByIdWithoutHooks.test.ts +154 -0
  38. package/Tests/Server/Utils/AnalyticsDatabase/StatementGenerator.test.ts +12 -9
  39. package/Tests/Types/DiskSize.test.ts +49 -0
  40. package/Types/Dashboard/DashboardComponents/DashboardTableComponent.ts +11 -0
  41. package/Types/Icon/IconProp.ts +1 -0
  42. package/Types/Monitor/MonitorType.ts +15 -31
  43. package/Types/Monitor/schema.json +32 -35
  44. package/UI/Components/BulkUpdate/BulkArchiveActions.tsx +150 -0
  45. package/UI/Components/Icon/Icon.tsx +42 -126
  46. package/UI/Components/Navbar/NavBarMenuModal.tsx +2 -5
  47. package/UI/esbuild-config.js +136 -110
  48. package/Utils/ClientAPI/README.md +1 -1
  49. package/build/dist/Models/DatabaseModels/CephCluster.js +136 -0
  50. package/build/dist/Models/DatabaseModels/CephCluster.js.map +1 -1
  51. package/build/dist/Models/DatabaseModels/CloudResource.js +136 -0
  52. package/build/dist/Models/DatabaseModels/CloudResource.js.map +1 -1
  53. package/build/dist/Models/DatabaseModels/DockerHost.js +136 -0
  54. package/build/dist/Models/DatabaseModels/DockerHost.js.map +1 -1
  55. package/build/dist/Models/DatabaseModels/DockerSwarmCluster.js +136 -0
  56. package/build/dist/Models/DatabaseModels/DockerSwarmCluster.js.map +1 -1
  57. package/build/dist/Models/DatabaseModels/Host.js +136 -0
  58. package/build/dist/Models/DatabaseModels/Host.js.map +1 -1
  59. package/build/dist/Models/DatabaseModels/KubernetesCluster.js +136 -0
  60. package/build/dist/Models/DatabaseModels/KubernetesCluster.js.map +1 -1
  61. package/build/dist/Models/DatabaseModels/PodmanHost.js +136 -0
  62. package/build/dist/Models/DatabaseModels/PodmanHost.js.map +1 -1
  63. package/build/dist/Models/DatabaseModels/ProxmoxCluster.js +136 -0
  64. package/build/dist/Models/DatabaseModels/ProxmoxCluster.js.map +1 -1
  65. package/build/dist/Models/DatabaseModels/RumApplication.js +136 -0
  66. package/build/dist/Models/DatabaseModels/RumApplication.js.map +1 -1
  67. package/build/dist/Models/DatabaseModels/ServerlessFunction.js +136 -0
  68. package/build/dist/Models/DatabaseModels/ServerlessFunction.js.map +1 -1
  69. package/build/dist/Models/DatabaseModels/Service.js +136 -0
  70. package/build/dist/Models/DatabaseModels/Service.js.map +1 -1
  71. package/build/dist/Server/Infrastructure/Postgres/DataSourceOptions.js +4 -2
  72. package/build/dist/Server/Infrastructure/Postgres/DataSourceOptions.js.map +1 -1
  73. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1782600000000-AddArchiveToResources.js +120 -0
  74. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1782600000000-AddArchiveToResources.js.map +1 -0
  75. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +2 -0
  76. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  77. package/build/dist/Server/Services/AIAgentService.js +9 -4
  78. package/build/dist/Server/Services/AIAgentService.js.map +1 -1
  79. package/build/dist/Server/Services/AnalyticsDatabaseService.js +52 -17
  80. package/build/dist/Server/Services/AnalyticsDatabaseService.js.map +1 -1
  81. package/build/dist/Server/Services/CephClusterService.js +6 -4
  82. package/build/dist/Server/Services/CephClusterService.js.map +1 -1
  83. package/build/dist/Server/Services/CloudResourceService.js +6 -4
  84. package/build/dist/Server/Services/CloudResourceService.js.map +1 -1
  85. package/build/dist/Server/Services/DatabaseService.js +101 -0
  86. package/build/dist/Server/Services/DatabaseService.js.map +1 -1
  87. package/build/dist/Server/Services/DockerHostService.js +6 -4
  88. package/build/dist/Server/Services/DockerHostService.js.map +1 -1
  89. package/build/dist/Server/Services/DockerSwarmClusterService.js +6 -4
  90. package/build/dist/Server/Services/DockerSwarmClusterService.js.map +1 -1
  91. package/build/dist/Server/Services/HostService.js +6 -4
  92. package/build/dist/Server/Services/HostService.js.map +1 -1
  93. package/build/dist/Server/Services/KubernetesClusterService.js +6 -4
  94. package/build/dist/Server/Services/KubernetesClusterService.js.map +1 -1
  95. package/build/dist/Server/Services/PodmanHostService.js +6 -4
  96. package/build/dist/Server/Services/PodmanHostService.js.map +1 -1
  97. package/build/dist/Server/Services/ProbeService.js +10 -4
  98. package/build/dist/Server/Services/ProbeService.js.map +1 -1
  99. package/build/dist/Server/Services/ProxmoxClusterService.js +6 -4
  100. package/build/dist/Server/Services/ProxmoxClusterService.js.map +1 -1
  101. package/build/dist/Server/Services/RumApplicationService.js +6 -4
  102. package/build/dist/Server/Services/RumApplicationService.js.map +1 -1
  103. package/build/dist/Server/Services/ServerlessFunctionService.js +6 -4
  104. package/build/dist/Server/Services/ServerlessFunctionService.js.map +1 -1
  105. package/build/dist/Server/Services/ServiceService.js +17 -4
  106. package/build/dist/Server/Services/ServiceService.js.map +1 -1
  107. package/build/dist/Server/Utils/Monitor/MonitorResource.js +24 -10
  108. package/build/dist/Server/Utils/Monitor/MonitorResource.js.map +1 -1
  109. package/build/dist/Server/Utils/Telemetry/EntityRegistry.js +10 -5
  110. package/build/dist/Server/Utils/Telemetry/EntityRegistry.js.map +1 -1
  111. package/build/dist/Server/Utils/Workspace/Slack/app-manifest.json +3 -9
  112. package/build/dist/Types/Dashboard/DashboardComponents/DashboardTableComponent.js.map +1 -1
  113. package/build/dist/Types/Icon/IconProp.js +1 -0
  114. package/build/dist/Types/Icon/IconProp.js.map +1 -1
  115. package/build/dist/Types/Monitor/MonitorType.js +15 -31
  116. package/build/dist/Types/Monitor/MonitorType.js.map +1 -1
  117. package/build/dist/UI/Components/BulkUpdate/BulkArchiveActions.js +96 -0
  118. package/build/dist/UI/Components/BulkUpdate/BulkArchiveActions.js.map +1 -0
  119. package/build/dist/UI/Components/Icon/Icon.js +17 -41
  120. package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
  121. package/build/dist/UI/Components/Navbar/NavBarMenuModal.js +2 -3
  122. package/build/dist/UI/Components/Navbar/NavBarMenuModal.js.map +1 -1
  123. package/jest.config.json +47 -66
  124. package/package.json +1 -1
  125. package/tsconfig.json +109 -113
@@ -74,6 +74,7 @@ import {
74
74
  })
75
75
  @CrudApiEndpoint(new Route("/host"))
76
76
  @SlugifyColumn("name", "slug")
77
+ @Index(["projectId", "isArchived"])
77
78
  @TableMetadata({
78
79
  tableName: "Host",
79
80
  singularName: "Host",
@@ -1036,6 +1037,139 @@ export default class Host extends BaseModel {
1036
1037
  })
1037
1038
  public createdByUserId?: ObjectID = undefined;
1038
1039
 
1040
+ @ColumnAccessControl({
1041
+ create: [
1042
+ Permission.ProjectOwner,
1043
+ Permission.ProjectAdmin,
1044
+ Permission.ProjectMember,
1045
+ Permission.SettingsAdmin,
1046
+ Permission.SettingsMember,
1047
+ Permission.CreateHost,
1048
+ ],
1049
+ read: [
1050
+ Permission.ProjectOwner,
1051
+ Permission.ProjectAdmin,
1052
+ Permission.ProjectMember,
1053
+ Permission.Viewer,
1054
+ Permission.SettingsAdmin,
1055
+ Permission.SettingsMember,
1056
+ Permission.SettingsViewer,
1057
+ Permission.ReadHost,
1058
+ ],
1059
+ update: [
1060
+ Permission.ProjectOwner,
1061
+ Permission.ProjectAdmin,
1062
+ Permission.ProjectMember,
1063
+ Permission.SettingsAdmin,
1064
+ Permission.SettingsMember,
1065
+ Permission.EditHost,
1066
+ ],
1067
+ })
1068
+ @TableColumn({
1069
+ isDefaultValueColumn: true,
1070
+ required: true,
1071
+ type: TableColumnType.Boolean,
1072
+ title: "Is Archived",
1073
+ description:
1074
+ "Is this host archived? Archived hosts are hidden from lists but keep collecting telemetry.",
1075
+ defaultValue: false,
1076
+ })
1077
+ @Column({
1078
+ type: ColumnType.Boolean,
1079
+ nullable: false,
1080
+ default: false,
1081
+ })
1082
+ public isArchived?: boolean = undefined;
1083
+
1084
+ @ColumnAccessControl({
1085
+ create: [],
1086
+ read: [
1087
+ Permission.ProjectOwner,
1088
+ Permission.ProjectAdmin,
1089
+ Permission.ProjectMember,
1090
+ Permission.Viewer,
1091
+ Permission.SettingsAdmin,
1092
+ Permission.SettingsMember,
1093
+ Permission.SettingsViewer,
1094
+ Permission.ReadHost,
1095
+ ],
1096
+ update: [],
1097
+ })
1098
+ @TableColumn({
1099
+ required: false,
1100
+ type: TableColumnType.Date,
1101
+ title: "Archived At",
1102
+ description: "When was this host archived?",
1103
+ })
1104
+ @Column({
1105
+ type: ColumnType.Date,
1106
+ nullable: true,
1107
+ })
1108
+ public archivedAt?: Date = undefined;
1109
+
1110
+ @ColumnAccessControl({
1111
+ create: [],
1112
+ read: [
1113
+ Permission.ProjectOwner,
1114
+ Permission.ProjectAdmin,
1115
+ Permission.ProjectMember,
1116
+ Permission.Viewer,
1117
+ Permission.SettingsAdmin,
1118
+ Permission.SettingsMember,
1119
+ Permission.SettingsViewer,
1120
+ Permission.ReadHost,
1121
+ ],
1122
+ update: [],
1123
+ })
1124
+ @TableColumn({
1125
+ manyToOneRelationColumn: "archivedByUserId",
1126
+ type: TableColumnType.Entity,
1127
+ modelType: User,
1128
+ title: "Archived by User",
1129
+ description:
1130
+ "Relation to User who archived this object (if this object was archived by a User)",
1131
+ })
1132
+ @ManyToOne(
1133
+ () => {
1134
+ return User;
1135
+ },
1136
+ {
1137
+ eager: false,
1138
+ nullable: true,
1139
+ onDelete: "SET NULL",
1140
+ orphanedRowAction: "nullify",
1141
+ },
1142
+ )
1143
+ @JoinColumn({ name: "archivedByUserId" })
1144
+ public archivedByUser?: User = undefined;
1145
+
1146
+ @ColumnAccessControl({
1147
+ create: [],
1148
+ read: [
1149
+ Permission.ProjectOwner,
1150
+ Permission.ProjectAdmin,
1151
+ Permission.ProjectMember,
1152
+ Permission.Viewer,
1153
+ Permission.SettingsAdmin,
1154
+ Permission.SettingsMember,
1155
+ Permission.SettingsViewer,
1156
+ Permission.ReadHost,
1157
+ ],
1158
+ update: [],
1159
+ })
1160
+ @TableColumn({
1161
+ type: TableColumnType.ObjectID,
1162
+ title: "Archived by User ID",
1163
+ description:
1164
+ "User ID who archived this object (if this object was archived by a User)",
1165
+ })
1166
+ @Column({
1167
+ type: ColumnType.ObjectID,
1168
+ nullable: true,
1169
+ transformer: ObjectID.getDatabaseTransformer(),
1170
+ })
1171
+ public archivedByUserId?: ObjectID = undefined;
1172
+
1039
1173
  @ColumnAccessControl({
1040
1174
  create: [],
1041
1175
  read: [
@@ -78,6 +78,7 @@ import {
78
78
  * update) race in findOrCreateByClusterIdentifier and create duplicate rows.
79
79
  */
80
80
  @Index(["projectId", "clusterIdentifier"], { unique: true })
81
+ @Index(["projectId", "isArchived"])
81
82
  @TableMetadata({
82
83
  tableName: "KubernetesCluster",
83
84
  singularName: "Kubernetes Cluster",
@@ -642,6 +643,139 @@ export default class KubernetesCluster extends BaseModel {
642
643
  })
643
644
  public createdByUserId?: ObjectID = undefined;
644
645
 
646
+ @ColumnAccessControl({
647
+ create: [
648
+ Permission.ProjectOwner,
649
+ Permission.ProjectAdmin,
650
+ Permission.ProjectMember,
651
+ Permission.SettingsAdmin,
652
+ Permission.SettingsMember,
653
+ Permission.CreateKubernetesCluster,
654
+ ],
655
+ read: [
656
+ Permission.ProjectOwner,
657
+ Permission.ProjectAdmin,
658
+ Permission.ProjectMember,
659
+ Permission.Viewer,
660
+ Permission.SettingsAdmin,
661
+ Permission.SettingsMember,
662
+ Permission.SettingsViewer,
663
+ Permission.ReadKubernetesCluster,
664
+ ],
665
+ update: [
666
+ Permission.ProjectOwner,
667
+ Permission.ProjectAdmin,
668
+ Permission.ProjectMember,
669
+ Permission.SettingsAdmin,
670
+ Permission.SettingsMember,
671
+ Permission.EditKubernetesCluster,
672
+ ],
673
+ })
674
+ @TableColumn({
675
+ isDefaultValueColumn: true,
676
+ required: true,
677
+ type: TableColumnType.Boolean,
678
+ title: "Is Archived",
679
+ description:
680
+ "Is this Kubernetes cluster archived? Archived Kubernetes clusters are hidden from lists but keep collecting telemetry.",
681
+ defaultValue: false,
682
+ })
683
+ @Column({
684
+ type: ColumnType.Boolean,
685
+ nullable: false,
686
+ default: false,
687
+ })
688
+ public isArchived?: boolean = undefined;
689
+
690
+ @ColumnAccessControl({
691
+ create: [],
692
+ read: [
693
+ Permission.ProjectOwner,
694
+ Permission.ProjectAdmin,
695
+ Permission.ProjectMember,
696
+ Permission.Viewer,
697
+ Permission.SettingsAdmin,
698
+ Permission.SettingsMember,
699
+ Permission.SettingsViewer,
700
+ Permission.ReadKubernetesCluster,
701
+ ],
702
+ update: [],
703
+ })
704
+ @TableColumn({
705
+ required: false,
706
+ type: TableColumnType.Date,
707
+ title: "Archived At",
708
+ description: "When was this Kubernetes cluster archived?",
709
+ })
710
+ @Column({
711
+ type: ColumnType.Date,
712
+ nullable: true,
713
+ })
714
+ public archivedAt?: Date = undefined;
715
+
716
+ @ColumnAccessControl({
717
+ create: [],
718
+ read: [
719
+ Permission.ProjectOwner,
720
+ Permission.ProjectAdmin,
721
+ Permission.ProjectMember,
722
+ Permission.Viewer,
723
+ Permission.SettingsAdmin,
724
+ Permission.SettingsMember,
725
+ Permission.SettingsViewer,
726
+ Permission.ReadKubernetesCluster,
727
+ ],
728
+ update: [],
729
+ })
730
+ @TableColumn({
731
+ manyToOneRelationColumn: "archivedByUserId",
732
+ type: TableColumnType.Entity,
733
+ modelType: User,
734
+ title: "Archived by User",
735
+ description:
736
+ "Relation to User who archived this object (if this object was archived by a User)",
737
+ })
738
+ @ManyToOne(
739
+ () => {
740
+ return User;
741
+ },
742
+ {
743
+ eager: false,
744
+ nullable: true,
745
+ onDelete: "SET NULL",
746
+ orphanedRowAction: "nullify",
747
+ },
748
+ )
749
+ @JoinColumn({ name: "archivedByUserId" })
750
+ public archivedByUser?: User = undefined;
751
+
752
+ @ColumnAccessControl({
753
+ create: [],
754
+ read: [
755
+ Permission.ProjectOwner,
756
+ Permission.ProjectAdmin,
757
+ Permission.ProjectMember,
758
+ Permission.Viewer,
759
+ Permission.SettingsAdmin,
760
+ Permission.SettingsMember,
761
+ Permission.SettingsViewer,
762
+ Permission.ReadKubernetesCluster,
763
+ ],
764
+ update: [],
765
+ })
766
+ @TableColumn({
767
+ type: TableColumnType.ObjectID,
768
+ title: "Archived by User ID",
769
+ description:
770
+ "User ID who archived this object (if this object was archived by a User)",
771
+ })
772
+ @Column({
773
+ type: ColumnType.ObjectID,
774
+ nullable: true,
775
+ transformer: ObjectID.getDatabaseTransformer(),
776
+ })
777
+ public archivedByUserId?: ObjectID = undefined;
778
+
645
779
  @ColumnAccessControl({
646
780
  create: [],
647
781
  read: [
@@ -71,6 +71,7 @@ import {
71
71
  })
72
72
  @CrudApiEndpoint(new Route("/podman-host"))
73
73
  @SlugifyColumn("name", "slug")
74
+ @Index(["projectId", "isArchived"])
74
75
  @TableMetadata({
75
76
  tableName: "PodmanHost",
76
77
  singularName: "Podman Host",
@@ -656,6 +657,139 @@ export default class PodmanHost extends BaseModel {
656
657
  })
657
658
  public createdByUserId?: ObjectID = undefined;
658
659
 
660
+ @ColumnAccessControl({
661
+ create: [
662
+ Permission.ProjectOwner,
663
+ Permission.ProjectAdmin,
664
+ Permission.ProjectMember,
665
+ Permission.SettingsAdmin,
666
+ Permission.SettingsMember,
667
+ Permission.CreatePodmanHost,
668
+ ],
669
+ read: [
670
+ Permission.ProjectOwner,
671
+ Permission.ProjectAdmin,
672
+ Permission.ProjectMember,
673
+ Permission.Viewer,
674
+ Permission.SettingsAdmin,
675
+ Permission.SettingsMember,
676
+ Permission.SettingsViewer,
677
+ Permission.ReadPodmanHost,
678
+ ],
679
+ update: [
680
+ Permission.ProjectOwner,
681
+ Permission.ProjectAdmin,
682
+ Permission.ProjectMember,
683
+ Permission.SettingsAdmin,
684
+ Permission.SettingsMember,
685
+ Permission.EditPodmanHost,
686
+ ],
687
+ })
688
+ @TableColumn({
689
+ isDefaultValueColumn: true,
690
+ required: true,
691
+ type: TableColumnType.Boolean,
692
+ title: "Is Archived",
693
+ description:
694
+ "Is this Podman host archived? Archived Podman hosts are hidden from lists but keep collecting telemetry.",
695
+ defaultValue: false,
696
+ })
697
+ @Column({
698
+ type: ColumnType.Boolean,
699
+ nullable: false,
700
+ default: false,
701
+ })
702
+ public isArchived?: boolean = undefined;
703
+
704
+ @ColumnAccessControl({
705
+ create: [],
706
+ read: [
707
+ Permission.ProjectOwner,
708
+ Permission.ProjectAdmin,
709
+ Permission.ProjectMember,
710
+ Permission.Viewer,
711
+ Permission.SettingsAdmin,
712
+ Permission.SettingsMember,
713
+ Permission.SettingsViewer,
714
+ Permission.ReadPodmanHost,
715
+ ],
716
+ update: [],
717
+ })
718
+ @TableColumn({
719
+ required: false,
720
+ type: TableColumnType.Date,
721
+ title: "Archived At",
722
+ description: "When was this Podman host archived?",
723
+ })
724
+ @Column({
725
+ type: ColumnType.Date,
726
+ nullable: true,
727
+ })
728
+ public archivedAt?: Date = undefined;
729
+
730
+ @ColumnAccessControl({
731
+ create: [],
732
+ read: [
733
+ Permission.ProjectOwner,
734
+ Permission.ProjectAdmin,
735
+ Permission.ProjectMember,
736
+ Permission.Viewer,
737
+ Permission.SettingsAdmin,
738
+ Permission.SettingsMember,
739
+ Permission.SettingsViewer,
740
+ Permission.ReadPodmanHost,
741
+ ],
742
+ update: [],
743
+ })
744
+ @TableColumn({
745
+ manyToOneRelationColumn: "archivedByUserId",
746
+ type: TableColumnType.Entity,
747
+ modelType: User,
748
+ title: "Archived by User",
749
+ description:
750
+ "Relation to User who archived this object (if this object was archived by a User)",
751
+ })
752
+ @ManyToOne(
753
+ () => {
754
+ return User;
755
+ },
756
+ {
757
+ eager: false,
758
+ nullable: true,
759
+ onDelete: "SET NULL",
760
+ orphanedRowAction: "nullify",
761
+ },
762
+ )
763
+ @JoinColumn({ name: "archivedByUserId" })
764
+ public archivedByUser?: User = undefined;
765
+
766
+ @ColumnAccessControl({
767
+ create: [],
768
+ read: [
769
+ Permission.ProjectOwner,
770
+ Permission.ProjectAdmin,
771
+ Permission.ProjectMember,
772
+ Permission.Viewer,
773
+ Permission.SettingsAdmin,
774
+ Permission.SettingsMember,
775
+ Permission.SettingsViewer,
776
+ Permission.ReadPodmanHost,
777
+ ],
778
+ update: [],
779
+ })
780
+ @TableColumn({
781
+ type: TableColumnType.ObjectID,
782
+ title: "Archived by User ID",
783
+ description:
784
+ "User ID who archived this object (if this object was archived by a User)",
785
+ })
786
+ @Column({
787
+ type: ColumnType.ObjectID,
788
+ nullable: true,
789
+ transformer: ObjectID.getDatabaseTransformer(),
790
+ })
791
+ public archivedByUserId?: ObjectID = undefined;
792
+
659
793
  @ColumnAccessControl({
660
794
  create: [],
661
795
  read: [
@@ -80,6 +80,7 @@ import {
80
80
  * (projectId, clusterIdentifier) unique index.
81
81
  */
82
82
  @Index(["projectId", "name"], { unique: true })
83
+ @Index(["projectId", "isArchived"])
83
84
  @TableMetadata({
84
85
  tableName: "ProxmoxCluster",
85
86
  singularName: "Proxmox Cluster",
@@ -740,6 +741,139 @@ export default class ProxmoxCluster extends BaseModel {
740
741
  })
741
742
  public createdByUserId?: ObjectID = undefined;
742
743
 
744
+ @ColumnAccessControl({
745
+ create: [
746
+ Permission.ProjectOwner,
747
+ Permission.ProjectAdmin,
748
+ Permission.ProjectMember,
749
+ Permission.SettingsAdmin,
750
+ Permission.SettingsMember,
751
+ Permission.CreateProxmoxCluster,
752
+ ],
753
+ read: [
754
+ Permission.ProjectOwner,
755
+ Permission.ProjectAdmin,
756
+ Permission.ProjectMember,
757
+ Permission.Viewer,
758
+ Permission.SettingsAdmin,
759
+ Permission.SettingsMember,
760
+ Permission.SettingsViewer,
761
+ Permission.ReadProxmoxCluster,
762
+ ],
763
+ update: [
764
+ Permission.ProjectOwner,
765
+ Permission.ProjectAdmin,
766
+ Permission.ProjectMember,
767
+ Permission.SettingsAdmin,
768
+ Permission.SettingsMember,
769
+ Permission.EditProxmoxCluster,
770
+ ],
771
+ })
772
+ @TableColumn({
773
+ isDefaultValueColumn: true,
774
+ required: true,
775
+ type: TableColumnType.Boolean,
776
+ title: "Is Archived",
777
+ description:
778
+ "Is this Proxmox cluster archived? Archived Proxmox clusters are hidden from lists but keep collecting telemetry.",
779
+ defaultValue: false,
780
+ })
781
+ @Column({
782
+ type: ColumnType.Boolean,
783
+ nullable: false,
784
+ default: false,
785
+ })
786
+ public isArchived?: boolean = undefined;
787
+
788
+ @ColumnAccessControl({
789
+ create: [],
790
+ read: [
791
+ Permission.ProjectOwner,
792
+ Permission.ProjectAdmin,
793
+ Permission.ProjectMember,
794
+ Permission.Viewer,
795
+ Permission.SettingsAdmin,
796
+ Permission.SettingsMember,
797
+ Permission.SettingsViewer,
798
+ Permission.ReadProxmoxCluster,
799
+ ],
800
+ update: [],
801
+ })
802
+ @TableColumn({
803
+ required: false,
804
+ type: TableColumnType.Date,
805
+ title: "Archived At",
806
+ description: "When was this Proxmox cluster archived?",
807
+ })
808
+ @Column({
809
+ type: ColumnType.Date,
810
+ nullable: true,
811
+ })
812
+ public archivedAt?: Date = undefined;
813
+
814
+ @ColumnAccessControl({
815
+ create: [],
816
+ read: [
817
+ Permission.ProjectOwner,
818
+ Permission.ProjectAdmin,
819
+ Permission.ProjectMember,
820
+ Permission.Viewer,
821
+ Permission.SettingsAdmin,
822
+ Permission.SettingsMember,
823
+ Permission.SettingsViewer,
824
+ Permission.ReadProxmoxCluster,
825
+ ],
826
+ update: [],
827
+ })
828
+ @TableColumn({
829
+ manyToOneRelationColumn: "archivedByUserId",
830
+ type: TableColumnType.Entity,
831
+ modelType: User,
832
+ title: "Archived by User",
833
+ description:
834
+ "Relation to User who archived this object (if this object was archived by a User)",
835
+ })
836
+ @ManyToOne(
837
+ () => {
838
+ return User;
839
+ },
840
+ {
841
+ eager: false,
842
+ nullable: true,
843
+ onDelete: "SET NULL",
844
+ orphanedRowAction: "nullify",
845
+ },
846
+ )
847
+ @JoinColumn({ name: "archivedByUserId" })
848
+ public archivedByUser?: User = undefined;
849
+
850
+ @ColumnAccessControl({
851
+ create: [],
852
+ read: [
853
+ Permission.ProjectOwner,
854
+ Permission.ProjectAdmin,
855
+ Permission.ProjectMember,
856
+ Permission.Viewer,
857
+ Permission.SettingsAdmin,
858
+ Permission.SettingsMember,
859
+ Permission.SettingsViewer,
860
+ Permission.ReadProxmoxCluster,
861
+ ],
862
+ update: [],
863
+ })
864
+ @TableColumn({
865
+ type: TableColumnType.ObjectID,
866
+ title: "Archived by User ID",
867
+ description:
868
+ "User ID who archived this object (if this object was archived by a User)",
869
+ })
870
+ @Column({
871
+ type: ColumnType.ObjectID,
872
+ nullable: true,
873
+ transformer: ObjectID.getDatabaseTransformer(),
874
+ })
875
+ public archivedByUserId?: ObjectID = undefined;
876
+
743
877
  @ColumnAccessControl({
744
878
  create: [],
745
879
  read: [