@oneuptime/common 11.0.9 → 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.
- package/Models/DatabaseModels/CephCluster.ts +134 -0
- package/Models/DatabaseModels/CloudResource.ts +134 -0
- package/Models/DatabaseModels/DockerHost.ts +134 -0
- package/Models/DatabaseModels/DockerSwarmCluster.ts +134 -0
- package/Models/DatabaseModels/Host.ts +134 -0
- package/Models/DatabaseModels/KubernetesCluster.ts +134 -0
- package/Models/DatabaseModels/PodmanHost.ts +134 -0
- package/Models/DatabaseModels/ProxmoxCluster.ts +134 -0
- package/Models/DatabaseModels/RumApplication.ts +134 -0
- package/Models/DatabaseModels/ServerlessFunction.ts +134 -0
- package/Models/DatabaseModels/Service.ts +134 -0
- package/README.md +1 -1
- package/Scripts/generate-service-worker.js +46 -36
- package/Server/Infrastructure/Postgres/DataSourceOptions.ts +4 -2
- package/Server/Infrastructure/Postgres/SchemaMigrations/1782600000000-AddArchiveToResources.ts +331 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +2 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Readme.md +3 -3
- package/Server/Services/AIAgentService.ts +9 -4
- package/Server/Services/AnalyticsDatabaseService.ts +89 -56
- package/Server/Services/CephClusterService.ts +6 -4
- package/Server/Services/CloudResourceService.ts +6 -4
- package/Server/Services/DatabaseService.ts +126 -0
- package/Server/Services/DockerHostService.ts +6 -4
- package/Server/Services/DockerSwarmClusterService.ts +6 -4
- package/Server/Services/HostService.ts +6 -4
- package/Server/Services/KubernetesClusterService.ts +6 -4
- package/Server/Services/PodmanHostService.ts +6 -4
- package/Server/Services/ProbeService.ts +10 -4
- package/Server/Services/ProxmoxClusterService.ts +6 -4
- package/Server/Services/RumApplicationService.ts +6 -4
- package/Server/Services/ServerlessFunctionService.ts +6 -4
- package/Server/Services/ServiceService.ts +17 -4
- package/Server/Utils/AnalyticsDatabase/StatementGenerator.ts +1 -1
- package/Server/Utils/Monitor/MonitorResource.ts +24 -10
- package/Server/Utils/Telemetry/EntityRegistry.ts +10 -5
- package/Server/Utils/Workspace/Slack/app-manifest.json +86 -92
- package/Tests/Server/Services/UpdateColumnsByIdWithoutHooks.test.ts +154 -0
- package/Tests/Server/Utils/AnalyticsDatabase/StatementGenerator.test.ts +12 -9
- package/Tests/Types/DiskSize.test.ts +49 -0
- package/Types/Dashboard/DashboardComponents/DashboardTableComponent.ts +11 -0
- package/Types/Icon/IconProp.ts +1 -0
- package/Types/Monitor/MonitorType.ts +15 -31
- package/Types/Monitor/schema.json +32 -35
- package/UI/Components/BulkUpdate/BulkArchiveActions.tsx +150 -0
- package/UI/Components/Icon/Icon.tsx +42 -126
- package/UI/Components/Navbar/NavBarMenuModal.tsx +2 -5
- package/UI/esbuild-config.js +136 -110
- package/Utils/ClientAPI/README.md +1 -1
- package/build/dist/Models/DatabaseModels/CephCluster.js +136 -0
- package/build/dist/Models/DatabaseModels/CephCluster.js.map +1 -1
- package/build/dist/Models/DatabaseModels/CloudResource.js +136 -0
- package/build/dist/Models/DatabaseModels/CloudResource.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DockerHost.js +136 -0
- package/build/dist/Models/DatabaseModels/DockerHost.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DockerSwarmCluster.js +136 -0
- package/build/dist/Models/DatabaseModels/DockerSwarmCluster.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Host.js +136 -0
- package/build/dist/Models/DatabaseModels/Host.js.map +1 -1
- package/build/dist/Models/DatabaseModels/KubernetesCluster.js +136 -0
- package/build/dist/Models/DatabaseModels/KubernetesCluster.js.map +1 -1
- package/build/dist/Models/DatabaseModels/PodmanHost.js +136 -0
- package/build/dist/Models/DatabaseModels/PodmanHost.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ProxmoxCluster.js +136 -0
- package/build/dist/Models/DatabaseModels/ProxmoxCluster.js.map +1 -1
- package/build/dist/Models/DatabaseModels/RumApplication.js +136 -0
- package/build/dist/Models/DatabaseModels/RumApplication.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ServerlessFunction.js +136 -0
- package/build/dist/Models/DatabaseModels/ServerlessFunction.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Service.js +136 -0
- package/build/dist/Models/DatabaseModels/Service.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/DataSourceOptions.js +4 -2
- package/build/dist/Server/Infrastructure/Postgres/DataSourceOptions.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1782600000000-AddArchiveToResources.js +120 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1782600000000-AddArchiveToResources.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +2 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Services/AIAgentService.js +9 -4
- package/build/dist/Server/Services/AIAgentService.js.map +1 -1
- package/build/dist/Server/Services/AnalyticsDatabaseService.js +52 -17
- package/build/dist/Server/Services/AnalyticsDatabaseService.js.map +1 -1
- package/build/dist/Server/Services/CephClusterService.js +6 -4
- package/build/dist/Server/Services/CephClusterService.js.map +1 -1
- package/build/dist/Server/Services/CloudResourceService.js +6 -4
- package/build/dist/Server/Services/CloudResourceService.js.map +1 -1
- package/build/dist/Server/Services/DatabaseService.js +101 -0
- package/build/dist/Server/Services/DatabaseService.js.map +1 -1
- package/build/dist/Server/Services/DockerHostService.js +6 -4
- package/build/dist/Server/Services/DockerHostService.js.map +1 -1
- package/build/dist/Server/Services/DockerSwarmClusterService.js +6 -4
- package/build/dist/Server/Services/DockerSwarmClusterService.js.map +1 -1
- package/build/dist/Server/Services/HostService.js +6 -4
- package/build/dist/Server/Services/HostService.js.map +1 -1
- package/build/dist/Server/Services/KubernetesClusterService.js +6 -4
- package/build/dist/Server/Services/KubernetesClusterService.js.map +1 -1
- package/build/dist/Server/Services/PodmanHostService.js +6 -4
- package/build/dist/Server/Services/PodmanHostService.js.map +1 -1
- package/build/dist/Server/Services/ProbeService.js +10 -4
- package/build/dist/Server/Services/ProbeService.js.map +1 -1
- package/build/dist/Server/Services/ProxmoxClusterService.js +6 -4
- package/build/dist/Server/Services/ProxmoxClusterService.js.map +1 -1
- package/build/dist/Server/Services/RumApplicationService.js +6 -4
- package/build/dist/Server/Services/RumApplicationService.js.map +1 -1
- package/build/dist/Server/Services/ServerlessFunctionService.js +6 -4
- package/build/dist/Server/Services/ServerlessFunctionService.js.map +1 -1
- package/build/dist/Server/Services/ServiceService.js +17 -4
- package/build/dist/Server/Services/ServiceService.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorResource.js +24 -10
- package/build/dist/Server/Utils/Monitor/MonitorResource.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/EntityRegistry.js +10 -5
- package/build/dist/Server/Utils/Telemetry/EntityRegistry.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/Slack/app-manifest.json +3 -9
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardTableComponent.js.map +1 -1
- package/build/dist/Types/Icon/IconProp.js +1 -0
- package/build/dist/Types/Icon/IconProp.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorType.js +15 -31
- package/build/dist/Types/Monitor/MonitorType.js.map +1 -1
- package/build/dist/UI/Components/BulkUpdate/BulkArchiveActions.js +96 -0
- package/build/dist/UI/Components/BulkUpdate/BulkArchiveActions.js.map +1 -0
- package/build/dist/UI/Components/Icon/Icon.js +17 -41
- package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
- package/build/dist/UI/Components/Navbar/NavBarMenuModal.js +2 -3
- package/build/dist/UI/Components/Navbar/NavBarMenuModal.js.map +1 -1
- package/jest.config.json +47 -66
- package/package.json +1 -1
- package/tsconfig.json +109 -113
|
@@ -77,6 +77,7 @@ import {
|
|
|
77
77
|
* device — a per-device row would be a cardinality disaster.
|
|
78
78
|
*/
|
|
79
79
|
@Index(["projectId", "appIdentifier"], { unique: true })
|
|
80
|
+
@Index(["projectId", "isArchived"])
|
|
80
81
|
@TableMetadata({
|
|
81
82
|
tableName: "RumApplication",
|
|
82
83
|
singularName: "RUM Application",
|
|
@@ -665,6 +666,139 @@ export default class RumApplication extends BaseModel {
|
|
|
665
666
|
})
|
|
666
667
|
public createdByUserId?: ObjectID = undefined;
|
|
667
668
|
|
|
669
|
+
@ColumnAccessControl({
|
|
670
|
+
create: [
|
|
671
|
+
Permission.ProjectOwner,
|
|
672
|
+
Permission.ProjectAdmin,
|
|
673
|
+
Permission.ProjectMember,
|
|
674
|
+
Permission.SettingsAdmin,
|
|
675
|
+
Permission.SettingsMember,
|
|
676
|
+
Permission.CreateRumApplication,
|
|
677
|
+
],
|
|
678
|
+
read: [
|
|
679
|
+
Permission.ProjectOwner,
|
|
680
|
+
Permission.ProjectAdmin,
|
|
681
|
+
Permission.ProjectMember,
|
|
682
|
+
Permission.Viewer,
|
|
683
|
+
Permission.SettingsAdmin,
|
|
684
|
+
Permission.SettingsMember,
|
|
685
|
+
Permission.SettingsViewer,
|
|
686
|
+
Permission.ReadRumApplication,
|
|
687
|
+
],
|
|
688
|
+
update: [
|
|
689
|
+
Permission.ProjectOwner,
|
|
690
|
+
Permission.ProjectAdmin,
|
|
691
|
+
Permission.ProjectMember,
|
|
692
|
+
Permission.SettingsAdmin,
|
|
693
|
+
Permission.SettingsMember,
|
|
694
|
+
Permission.EditRumApplication,
|
|
695
|
+
],
|
|
696
|
+
})
|
|
697
|
+
@TableColumn({
|
|
698
|
+
isDefaultValueColumn: true,
|
|
699
|
+
required: true,
|
|
700
|
+
type: TableColumnType.Boolean,
|
|
701
|
+
title: "Is Archived",
|
|
702
|
+
description:
|
|
703
|
+
"Is this RUM application archived? Archived RUM applications are hidden from lists but keep collecting telemetry.",
|
|
704
|
+
defaultValue: false,
|
|
705
|
+
})
|
|
706
|
+
@Column({
|
|
707
|
+
type: ColumnType.Boolean,
|
|
708
|
+
nullable: false,
|
|
709
|
+
default: false,
|
|
710
|
+
})
|
|
711
|
+
public isArchived?: boolean = undefined;
|
|
712
|
+
|
|
713
|
+
@ColumnAccessControl({
|
|
714
|
+
create: [],
|
|
715
|
+
read: [
|
|
716
|
+
Permission.ProjectOwner,
|
|
717
|
+
Permission.ProjectAdmin,
|
|
718
|
+
Permission.ProjectMember,
|
|
719
|
+
Permission.Viewer,
|
|
720
|
+
Permission.SettingsAdmin,
|
|
721
|
+
Permission.SettingsMember,
|
|
722
|
+
Permission.SettingsViewer,
|
|
723
|
+
Permission.ReadRumApplication,
|
|
724
|
+
],
|
|
725
|
+
update: [],
|
|
726
|
+
})
|
|
727
|
+
@TableColumn({
|
|
728
|
+
required: false,
|
|
729
|
+
type: TableColumnType.Date,
|
|
730
|
+
title: "Archived At",
|
|
731
|
+
description: "When was this RUM application archived?",
|
|
732
|
+
})
|
|
733
|
+
@Column({
|
|
734
|
+
type: ColumnType.Date,
|
|
735
|
+
nullable: true,
|
|
736
|
+
})
|
|
737
|
+
public archivedAt?: Date = undefined;
|
|
738
|
+
|
|
739
|
+
@ColumnAccessControl({
|
|
740
|
+
create: [],
|
|
741
|
+
read: [
|
|
742
|
+
Permission.ProjectOwner,
|
|
743
|
+
Permission.ProjectAdmin,
|
|
744
|
+
Permission.ProjectMember,
|
|
745
|
+
Permission.Viewer,
|
|
746
|
+
Permission.SettingsAdmin,
|
|
747
|
+
Permission.SettingsMember,
|
|
748
|
+
Permission.SettingsViewer,
|
|
749
|
+
Permission.ReadRumApplication,
|
|
750
|
+
],
|
|
751
|
+
update: [],
|
|
752
|
+
})
|
|
753
|
+
@TableColumn({
|
|
754
|
+
manyToOneRelationColumn: "archivedByUserId",
|
|
755
|
+
type: TableColumnType.Entity,
|
|
756
|
+
modelType: User,
|
|
757
|
+
title: "Archived by User",
|
|
758
|
+
description:
|
|
759
|
+
"Relation to User who archived this object (if this object was archived by a User)",
|
|
760
|
+
})
|
|
761
|
+
@ManyToOne(
|
|
762
|
+
() => {
|
|
763
|
+
return User;
|
|
764
|
+
},
|
|
765
|
+
{
|
|
766
|
+
eager: false,
|
|
767
|
+
nullable: true,
|
|
768
|
+
onDelete: "SET NULL",
|
|
769
|
+
orphanedRowAction: "nullify",
|
|
770
|
+
},
|
|
771
|
+
)
|
|
772
|
+
@JoinColumn({ name: "archivedByUserId" })
|
|
773
|
+
public archivedByUser?: User = undefined;
|
|
774
|
+
|
|
775
|
+
@ColumnAccessControl({
|
|
776
|
+
create: [],
|
|
777
|
+
read: [
|
|
778
|
+
Permission.ProjectOwner,
|
|
779
|
+
Permission.ProjectAdmin,
|
|
780
|
+
Permission.ProjectMember,
|
|
781
|
+
Permission.Viewer,
|
|
782
|
+
Permission.SettingsAdmin,
|
|
783
|
+
Permission.SettingsMember,
|
|
784
|
+
Permission.SettingsViewer,
|
|
785
|
+
Permission.ReadRumApplication,
|
|
786
|
+
],
|
|
787
|
+
update: [],
|
|
788
|
+
})
|
|
789
|
+
@TableColumn({
|
|
790
|
+
type: TableColumnType.ObjectID,
|
|
791
|
+
title: "Archived by User ID",
|
|
792
|
+
description:
|
|
793
|
+
"User ID who archived this object (if this object was archived by a User)",
|
|
794
|
+
})
|
|
795
|
+
@Column({
|
|
796
|
+
type: ColumnType.ObjectID,
|
|
797
|
+
nullable: true,
|
|
798
|
+
transformer: ObjectID.getDatabaseTransformer(),
|
|
799
|
+
})
|
|
800
|
+
public archivedByUserId?: ObjectID = undefined;
|
|
801
|
+
|
|
668
802
|
@ColumnAccessControl({
|
|
669
803
|
create: [],
|
|
670
804
|
read: [
|
|
@@ -77,6 +77,7 @@ import {
|
|
|
77
77
|
* function collapse into a single row instead of racing to create duplicates.
|
|
78
78
|
*/
|
|
79
79
|
@Index(["projectId", "functionIdentifier"], { unique: true })
|
|
80
|
+
@Index(["projectId", "isArchived"])
|
|
80
81
|
@TableMetadata({
|
|
81
82
|
tableName: "ServerlessFunction",
|
|
82
83
|
singularName: "Serverless Function",
|
|
@@ -815,6 +816,139 @@ export default class ServerlessFunction extends BaseModel {
|
|
|
815
816
|
})
|
|
816
817
|
public createdByUserId?: ObjectID = undefined;
|
|
817
818
|
|
|
819
|
+
@ColumnAccessControl({
|
|
820
|
+
create: [
|
|
821
|
+
Permission.ProjectOwner,
|
|
822
|
+
Permission.ProjectAdmin,
|
|
823
|
+
Permission.ProjectMember,
|
|
824
|
+
Permission.SettingsAdmin,
|
|
825
|
+
Permission.SettingsMember,
|
|
826
|
+
Permission.CreateServerlessFunction,
|
|
827
|
+
],
|
|
828
|
+
read: [
|
|
829
|
+
Permission.ProjectOwner,
|
|
830
|
+
Permission.ProjectAdmin,
|
|
831
|
+
Permission.ProjectMember,
|
|
832
|
+
Permission.Viewer,
|
|
833
|
+
Permission.SettingsAdmin,
|
|
834
|
+
Permission.SettingsMember,
|
|
835
|
+
Permission.SettingsViewer,
|
|
836
|
+
Permission.ReadServerlessFunction,
|
|
837
|
+
],
|
|
838
|
+
update: [
|
|
839
|
+
Permission.ProjectOwner,
|
|
840
|
+
Permission.ProjectAdmin,
|
|
841
|
+
Permission.ProjectMember,
|
|
842
|
+
Permission.SettingsAdmin,
|
|
843
|
+
Permission.SettingsMember,
|
|
844
|
+
Permission.EditServerlessFunction,
|
|
845
|
+
],
|
|
846
|
+
})
|
|
847
|
+
@TableColumn({
|
|
848
|
+
isDefaultValueColumn: true,
|
|
849
|
+
required: true,
|
|
850
|
+
type: TableColumnType.Boolean,
|
|
851
|
+
title: "Is Archived",
|
|
852
|
+
description:
|
|
853
|
+
"Is this serverless function archived? Archived serverless functions are hidden from lists but keep collecting telemetry.",
|
|
854
|
+
defaultValue: false,
|
|
855
|
+
})
|
|
856
|
+
@Column({
|
|
857
|
+
type: ColumnType.Boolean,
|
|
858
|
+
nullable: false,
|
|
859
|
+
default: false,
|
|
860
|
+
})
|
|
861
|
+
public isArchived?: boolean = undefined;
|
|
862
|
+
|
|
863
|
+
@ColumnAccessControl({
|
|
864
|
+
create: [],
|
|
865
|
+
read: [
|
|
866
|
+
Permission.ProjectOwner,
|
|
867
|
+
Permission.ProjectAdmin,
|
|
868
|
+
Permission.ProjectMember,
|
|
869
|
+
Permission.Viewer,
|
|
870
|
+
Permission.SettingsAdmin,
|
|
871
|
+
Permission.SettingsMember,
|
|
872
|
+
Permission.SettingsViewer,
|
|
873
|
+
Permission.ReadServerlessFunction,
|
|
874
|
+
],
|
|
875
|
+
update: [],
|
|
876
|
+
})
|
|
877
|
+
@TableColumn({
|
|
878
|
+
required: false,
|
|
879
|
+
type: TableColumnType.Date,
|
|
880
|
+
title: "Archived At",
|
|
881
|
+
description: "When was this serverless function archived?",
|
|
882
|
+
})
|
|
883
|
+
@Column({
|
|
884
|
+
type: ColumnType.Date,
|
|
885
|
+
nullable: true,
|
|
886
|
+
})
|
|
887
|
+
public archivedAt?: Date = undefined;
|
|
888
|
+
|
|
889
|
+
@ColumnAccessControl({
|
|
890
|
+
create: [],
|
|
891
|
+
read: [
|
|
892
|
+
Permission.ProjectOwner,
|
|
893
|
+
Permission.ProjectAdmin,
|
|
894
|
+
Permission.ProjectMember,
|
|
895
|
+
Permission.Viewer,
|
|
896
|
+
Permission.SettingsAdmin,
|
|
897
|
+
Permission.SettingsMember,
|
|
898
|
+
Permission.SettingsViewer,
|
|
899
|
+
Permission.ReadServerlessFunction,
|
|
900
|
+
],
|
|
901
|
+
update: [],
|
|
902
|
+
})
|
|
903
|
+
@TableColumn({
|
|
904
|
+
manyToOneRelationColumn: "archivedByUserId",
|
|
905
|
+
type: TableColumnType.Entity,
|
|
906
|
+
modelType: User,
|
|
907
|
+
title: "Archived by User",
|
|
908
|
+
description:
|
|
909
|
+
"Relation to User who archived this object (if this object was archived by a User)",
|
|
910
|
+
})
|
|
911
|
+
@ManyToOne(
|
|
912
|
+
() => {
|
|
913
|
+
return User;
|
|
914
|
+
},
|
|
915
|
+
{
|
|
916
|
+
eager: false,
|
|
917
|
+
nullable: true,
|
|
918
|
+
onDelete: "SET NULL",
|
|
919
|
+
orphanedRowAction: "nullify",
|
|
920
|
+
},
|
|
921
|
+
)
|
|
922
|
+
@JoinColumn({ name: "archivedByUserId" })
|
|
923
|
+
public archivedByUser?: User = undefined;
|
|
924
|
+
|
|
925
|
+
@ColumnAccessControl({
|
|
926
|
+
create: [],
|
|
927
|
+
read: [
|
|
928
|
+
Permission.ProjectOwner,
|
|
929
|
+
Permission.ProjectAdmin,
|
|
930
|
+
Permission.ProjectMember,
|
|
931
|
+
Permission.Viewer,
|
|
932
|
+
Permission.SettingsAdmin,
|
|
933
|
+
Permission.SettingsMember,
|
|
934
|
+
Permission.SettingsViewer,
|
|
935
|
+
Permission.ReadServerlessFunction,
|
|
936
|
+
],
|
|
937
|
+
update: [],
|
|
938
|
+
})
|
|
939
|
+
@TableColumn({
|
|
940
|
+
type: TableColumnType.ObjectID,
|
|
941
|
+
title: "Archived by User ID",
|
|
942
|
+
description:
|
|
943
|
+
"User ID who archived this object (if this object was archived by a User)",
|
|
944
|
+
})
|
|
945
|
+
@Column({
|
|
946
|
+
type: ColumnType.ObjectID,
|
|
947
|
+
nullable: true,
|
|
948
|
+
transformer: ObjectID.getDatabaseTransformer(),
|
|
949
|
+
})
|
|
950
|
+
public archivedByUserId?: ObjectID = undefined;
|
|
951
|
+
|
|
818
952
|
@ColumnAccessControl({
|
|
819
953
|
create: [],
|
|
820
954
|
read: [
|
|
@@ -100,6 +100,7 @@ import {
|
|
|
100
100
|
* winning row.
|
|
101
101
|
*/
|
|
102
102
|
@Index(["projectId", "name"], { unique: true })
|
|
103
|
+
@Index(["projectId", "isArchived"])
|
|
103
104
|
@TableMetadata({
|
|
104
105
|
tableName: "Service",
|
|
105
106
|
singularName: "Service",
|
|
@@ -421,6 +422,139 @@ export default class Service extends BaseModel {
|
|
|
421
422
|
})
|
|
422
423
|
public createdByUserId?: ObjectID = undefined;
|
|
423
424
|
|
|
425
|
+
@ColumnAccessControl({
|
|
426
|
+
create: [
|
|
427
|
+
Permission.ProjectOwner,
|
|
428
|
+
Permission.ProjectAdmin,
|
|
429
|
+
Permission.ProjectMember,
|
|
430
|
+
Permission.SettingsAdmin,
|
|
431
|
+
Permission.SettingsMember,
|
|
432
|
+
Permission.CreateService,
|
|
433
|
+
],
|
|
434
|
+
read: [
|
|
435
|
+
Permission.ProjectOwner,
|
|
436
|
+
Permission.ProjectAdmin,
|
|
437
|
+
Permission.ProjectMember,
|
|
438
|
+
Permission.Viewer,
|
|
439
|
+
Permission.SettingsAdmin,
|
|
440
|
+
Permission.SettingsMember,
|
|
441
|
+
Permission.SettingsViewer,
|
|
442
|
+
Permission.ReadService,
|
|
443
|
+
],
|
|
444
|
+
update: [
|
|
445
|
+
Permission.ProjectOwner,
|
|
446
|
+
Permission.ProjectAdmin,
|
|
447
|
+
Permission.ProjectMember,
|
|
448
|
+
Permission.SettingsAdmin,
|
|
449
|
+
Permission.SettingsMember,
|
|
450
|
+
Permission.EditService,
|
|
451
|
+
],
|
|
452
|
+
})
|
|
453
|
+
@TableColumn({
|
|
454
|
+
isDefaultValueColumn: true,
|
|
455
|
+
required: true,
|
|
456
|
+
type: TableColumnType.Boolean,
|
|
457
|
+
title: "Is Archived",
|
|
458
|
+
description:
|
|
459
|
+
"Is this service archived? Archived services are hidden from lists but keep collecting telemetry.",
|
|
460
|
+
defaultValue: false,
|
|
461
|
+
})
|
|
462
|
+
@Column({
|
|
463
|
+
type: ColumnType.Boolean,
|
|
464
|
+
nullable: false,
|
|
465
|
+
default: false,
|
|
466
|
+
})
|
|
467
|
+
public isArchived?: boolean = undefined;
|
|
468
|
+
|
|
469
|
+
@ColumnAccessControl({
|
|
470
|
+
create: [],
|
|
471
|
+
read: [
|
|
472
|
+
Permission.ProjectOwner,
|
|
473
|
+
Permission.ProjectAdmin,
|
|
474
|
+
Permission.ProjectMember,
|
|
475
|
+
Permission.Viewer,
|
|
476
|
+
Permission.SettingsAdmin,
|
|
477
|
+
Permission.SettingsMember,
|
|
478
|
+
Permission.SettingsViewer,
|
|
479
|
+
Permission.ReadService,
|
|
480
|
+
],
|
|
481
|
+
update: [],
|
|
482
|
+
})
|
|
483
|
+
@TableColumn({
|
|
484
|
+
required: false,
|
|
485
|
+
type: TableColumnType.Date,
|
|
486
|
+
title: "Archived At",
|
|
487
|
+
description: "When was this service archived?",
|
|
488
|
+
})
|
|
489
|
+
@Column({
|
|
490
|
+
type: ColumnType.Date,
|
|
491
|
+
nullable: true,
|
|
492
|
+
})
|
|
493
|
+
public archivedAt?: Date = undefined;
|
|
494
|
+
|
|
495
|
+
@ColumnAccessControl({
|
|
496
|
+
create: [],
|
|
497
|
+
read: [
|
|
498
|
+
Permission.ProjectOwner,
|
|
499
|
+
Permission.ProjectAdmin,
|
|
500
|
+
Permission.ProjectMember,
|
|
501
|
+
Permission.Viewer,
|
|
502
|
+
Permission.SettingsAdmin,
|
|
503
|
+
Permission.SettingsMember,
|
|
504
|
+
Permission.SettingsViewer,
|
|
505
|
+
Permission.ReadService,
|
|
506
|
+
],
|
|
507
|
+
update: [],
|
|
508
|
+
})
|
|
509
|
+
@TableColumn({
|
|
510
|
+
manyToOneRelationColumn: "archivedByUserId",
|
|
511
|
+
type: TableColumnType.Entity,
|
|
512
|
+
modelType: User,
|
|
513
|
+
title: "Archived by User",
|
|
514
|
+
description:
|
|
515
|
+
"Relation to User who archived this object (if this object was archived by a User)",
|
|
516
|
+
})
|
|
517
|
+
@ManyToOne(
|
|
518
|
+
() => {
|
|
519
|
+
return User;
|
|
520
|
+
},
|
|
521
|
+
{
|
|
522
|
+
eager: false,
|
|
523
|
+
nullable: true,
|
|
524
|
+
onDelete: "SET NULL",
|
|
525
|
+
orphanedRowAction: "nullify",
|
|
526
|
+
},
|
|
527
|
+
)
|
|
528
|
+
@JoinColumn({ name: "archivedByUserId" })
|
|
529
|
+
public archivedByUser?: User = undefined;
|
|
530
|
+
|
|
531
|
+
@ColumnAccessControl({
|
|
532
|
+
create: [],
|
|
533
|
+
read: [
|
|
534
|
+
Permission.ProjectOwner,
|
|
535
|
+
Permission.ProjectAdmin,
|
|
536
|
+
Permission.ProjectMember,
|
|
537
|
+
Permission.Viewer,
|
|
538
|
+
Permission.SettingsAdmin,
|
|
539
|
+
Permission.SettingsMember,
|
|
540
|
+
Permission.SettingsViewer,
|
|
541
|
+
Permission.ReadService,
|
|
542
|
+
],
|
|
543
|
+
update: [],
|
|
544
|
+
})
|
|
545
|
+
@TableColumn({
|
|
546
|
+
type: TableColumnType.ObjectID,
|
|
547
|
+
title: "Archived by User ID",
|
|
548
|
+
description:
|
|
549
|
+
"User ID who archived this object (if this object was archived by a User)",
|
|
550
|
+
})
|
|
551
|
+
@Column({
|
|
552
|
+
type: ColumnType.ObjectID,
|
|
553
|
+
nullable: true,
|
|
554
|
+
transformer: ObjectID.getDatabaseTransformer(),
|
|
555
|
+
})
|
|
556
|
+
public archivedByUserId?: ObjectID = undefined;
|
|
557
|
+
|
|
424
558
|
@ColumnAccessControl({
|
|
425
559
|
create: [],
|
|
426
560
|
read: [
|
package/README.md
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
# OneUptime Common UI Library
|
|
2
2
|
|
|
3
|
-
The OneUptime Common UI Library is a collection of shared components, utilities that are used across the OneUptime platform. It is designed to be easy to install and use, and to be extensible. This library is built with React and TypeScript. It includes components like buttons, modals, and form elements. It also includes utilities like date formatting, and string manipulation.
|
|
3
|
+
The OneUptime Common UI Library is a collection of shared components, utilities that are used across the OneUptime platform. It is designed to be easy to install and use, and to be extensible. This library is built with React and TypeScript. It includes components like buttons, modals, and form elements. It also includes utilities like date formatting, and string manipulation.
|
|
@@ -2,24 +2,24 @@
|
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* Universal Service Worker Generator for OneUptime Services
|
|
5
|
-
*
|
|
5
|
+
*
|
|
6
6
|
* This script can be used by any OneUptime service to generate
|
|
7
7
|
* a service worker from a template with dynamic versioning.
|
|
8
|
-
*
|
|
8
|
+
*
|
|
9
9
|
* Usage:
|
|
10
10
|
* node generate-service-worker.js [template-path] [output-path]
|
|
11
|
-
*
|
|
11
|
+
*
|
|
12
12
|
* Example:
|
|
13
13
|
* node generate-service-worker.js sw.js.template public/sw.js
|
|
14
14
|
*/
|
|
15
15
|
|
|
16
|
-
const fs = require(
|
|
17
|
-
const path = require(
|
|
18
|
-
const crypto = require(
|
|
16
|
+
const fs = require("fs");
|
|
17
|
+
const path = require("path");
|
|
18
|
+
const crypto = require("crypto");
|
|
19
19
|
|
|
20
20
|
// Default values
|
|
21
|
-
const DEFAULT_APP_VERSION =
|
|
22
|
-
const DEFAULT_GIT_SHA =
|
|
21
|
+
const DEFAULT_APP_VERSION = "1.0.0";
|
|
22
|
+
const DEFAULT_GIT_SHA = "local";
|
|
23
23
|
|
|
24
24
|
/**
|
|
25
25
|
* Get app version from environment or package.json
|
|
@@ -29,13 +29,13 @@ function getAppVersion(packageJsonPath) {
|
|
|
29
29
|
if (process.env.APP_VERSION) {
|
|
30
30
|
return process.env.APP_VERSION;
|
|
31
31
|
}
|
|
32
|
-
|
|
32
|
+
|
|
33
33
|
// Fallback to package.json version
|
|
34
34
|
try {
|
|
35
|
-
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath,
|
|
35
|
+
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, "utf8"));
|
|
36
36
|
return packageJson.version || DEFAULT_APP_VERSION;
|
|
37
37
|
} catch (error) {
|
|
38
|
-
console.warn(
|
|
38
|
+
console.warn("Could not read package.json, using default version");
|
|
39
39
|
return DEFAULT_APP_VERSION;
|
|
40
40
|
}
|
|
41
41
|
}
|
|
@@ -48,16 +48,18 @@ function getGitSha() {
|
|
|
48
48
|
if (process.env.GIT_SHA) {
|
|
49
49
|
return process.env.GIT_SHA.substring(0, 8); // Short SHA
|
|
50
50
|
}
|
|
51
|
-
|
|
51
|
+
|
|
52
52
|
// Try to get from git command if available
|
|
53
53
|
try {
|
|
54
|
-
const { execSync } = require(
|
|
55
|
-
const gitSha = execSync(
|
|
54
|
+
const { execSync } = require("child_process");
|
|
55
|
+
const gitSha = execSync("git rev-parse --short HEAD", {
|
|
56
|
+
encoding: "utf8",
|
|
57
|
+
}).trim();
|
|
56
58
|
return gitSha;
|
|
57
59
|
} catch (error) {
|
|
58
60
|
// Fallback to timestamp-based hash for local development
|
|
59
61
|
const timestamp = Date.now().toString();
|
|
60
|
-
const hash = crypto.createHash(
|
|
62
|
+
const hash = crypto.createHash("md5").update(timestamp).digest("hex");
|
|
61
63
|
return hash.substring(0, 8);
|
|
62
64
|
}
|
|
63
65
|
}
|
|
@@ -65,34 +67,38 @@ function getGitSha() {
|
|
|
65
67
|
/**
|
|
66
68
|
* Generate service worker from template
|
|
67
69
|
*/
|
|
68
|
-
function generateServiceWorker(
|
|
70
|
+
function generateServiceWorker(
|
|
71
|
+
templatePath,
|
|
72
|
+
outputPath,
|
|
73
|
+
serviceName = "OneUptime",
|
|
74
|
+
) {
|
|
69
75
|
// Check if template exists
|
|
70
76
|
if (!fs.existsSync(templatePath)) {
|
|
71
|
-
console.error(
|
|
77
|
+
console.error("❌ Service worker template not found:", templatePath);
|
|
72
78
|
process.exit(1);
|
|
73
79
|
}
|
|
74
|
-
|
|
80
|
+
|
|
75
81
|
// Read template
|
|
76
|
-
const template = fs.readFileSync(templatePath,
|
|
77
|
-
|
|
82
|
+
const template = fs.readFileSync(templatePath, "utf8");
|
|
83
|
+
|
|
78
84
|
// Get version information
|
|
79
|
-
const packageJsonPath = path.join(path.dirname(templatePath),
|
|
85
|
+
const packageJsonPath = path.join(path.dirname(templatePath), "package.json");
|
|
80
86
|
const appVersion = getAppVersion(packageJsonPath);
|
|
81
87
|
const gitSha = getGitSha();
|
|
82
88
|
const buildTimestamp = new Date().toISOString();
|
|
83
|
-
|
|
89
|
+
|
|
84
90
|
console.log(`🔧 Generating service worker for ${serviceName}...`);
|
|
85
91
|
console.log(` App Version: ${appVersion}`);
|
|
86
92
|
console.log(` Git SHA: ${gitSha}`);
|
|
87
93
|
console.log(` Build Time: ${buildTimestamp}`);
|
|
88
|
-
|
|
94
|
+
|
|
89
95
|
// Replace placeholders
|
|
90
96
|
const generatedContent = template
|
|
91
97
|
.replace(/\{\{APP_VERSION\}\}/g, appVersion)
|
|
92
98
|
.replace(/\{\{GIT_SHA\}\}/g, gitSha)
|
|
93
99
|
.replace(/\{\{BUILD_TIMESTAMP\}\}/g, buildTimestamp)
|
|
94
100
|
.replace(/\{\{SERVICE_NAME\}\}/g, serviceName);
|
|
95
|
-
|
|
101
|
+
|
|
96
102
|
// Add generation comment at the top
|
|
97
103
|
const header = `/*
|
|
98
104
|
* Generated Service Worker for ${serviceName}
|
|
@@ -106,37 +112,41 @@ function generateServiceWorker(templatePath, outputPath, serviceName = 'OneUptim
|
|
|
106
112
|
*/
|
|
107
113
|
|
|
108
114
|
`;
|
|
109
|
-
|
|
115
|
+
|
|
110
116
|
const finalContent = header + generatedContent;
|
|
111
|
-
|
|
117
|
+
|
|
112
118
|
// Ensure output directory exists
|
|
113
119
|
const outputDir = path.dirname(outputPath);
|
|
114
120
|
if (!fs.existsSync(outputDir)) {
|
|
115
121
|
fs.mkdirSync(outputDir, { recursive: true });
|
|
116
122
|
}
|
|
117
|
-
|
|
123
|
+
|
|
118
124
|
// Write generated service worker
|
|
119
|
-
fs.writeFileSync(outputPath, finalContent,
|
|
120
|
-
|
|
121
|
-
console.log(
|
|
125
|
+
fs.writeFileSync(outputPath, finalContent, "utf8");
|
|
126
|
+
|
|
127
|
+
console.log("✅ Service worker generated successfully:", outputPath);
|
|
122
128
|
console.log(` Cache version: oneuptime-v${appVersion}-${gitSha}`);
|
|
123
129
|
}
|
|
124
130
|
|
|
125
131
|
// Command line interface
|
|
126
132
|
if (require.main === module) {
|
|
127
133
|
const args = process.argv.slice(2);
|
|
128
|
-
const templatePath = args[0] ||
|
|
129
|
-
const outputPath = args[1] ||
|
|
134
|
+
const templatePath = args[0] || "sw.js.template";
|
|
135
|
+
const outputPath = args[1] || "public/sw.js";
|
|
130
136
|
const serviceName = args[2] || path.basename(process.cwd());
|
|
131
|
-
|
|
137
|
+
|
|
132
138
|
try {
|
|
133
139
|
// Resolve paths relative to current working directory
|
|
134
140
|
const resolvedTemplatePath = path.resolve(templatePath);
|
|
135
141
|
const resolvedOutputPath = path.resolve(outputPath);
|
|
136
|
-
|
|
137
|
-
generateServiceWorker(
|
|
142
|
+
|
|
143
|
+
generateServiceWorker(
|
|
144
|
+
resolvedTemplatePath,
|
|
145
|
+
resolvedOutputPath,
|
|
146
|
+
serviceName,
|
|
147
|
+
);
|
|
138
148
|
} catch (error) {
|
|
139
|
-
console.error(
|
|
149
|
+
console.error("❌ Failed to generate service worker:", error.message);
|
|
140
150
|
process.exit(1);
|
|
141
151
|
}
|
|
142
152
|
}
|
|
@@ -34,8 +34,10 @@ const dataSourceOptions: DataSourceOptions = {
|
|
|
34
34
|
database: DatabaseName,
|
|
35
35
|
migrationsTableName: "migrations",
|
|
36
36
|
migrations: Migrations,
|
|
37
|
-
|
|
38
|
-
|
|
37
|
+
/*
|
|
38
|
+
* Schema migrations run on connect unless disabled (e.g. runtime pods when a
|
|
39
|
+
* dedicated migrate Job owns migrations). See RunDatabaseMigrationsOnBoot.
|
|
40
|
+
*/
|
|
39
41
|
migrationsRun: RunDatabaseMigrationsOnBoot,
|
|
40
42
|
entities: Entities,
|
|
41
43
|
applicationName: "oneuptime",
|