@adventurelabs/scout-core 1.5.0 → 1.5.1
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/dist/helpers/documents.d.ts +1 -0
- package/dist/helpers/documents.js +11 -2
- package/dist/helpers/index.d.ts +1 -0
- package/dist/helpers/index.js +1 -0
- package/dist/helpers/operating_contexts.d.ts +43 -0
- package/dist/helpers/operating_contexts.js +222 -0
- package/dist/helpers/realtime_topic_access.d.ts +5 -0
- package/dist/helpers/realtime_topic_access.js +55 -0
- package/dist/hooks/index.d.ts +2 -1
- package/dist/hooks/index.js +2 -1
- package/dist/hooks/useAuthorizedRealtimeTopics.d.ts +1 -0
- package/dist/hooks/useAuthorizedRealtimeTopics.js +14 -0
- package/dist/hooks/useScoutRealtimeAnalysisJobs.d.ts +2 -1
- package/dist/hooks/useScoutRealtimeAnalysisJobs.js +3 -5
- package/dist/hooks/useScoutRealtimeAnalysisTasks.d.ts +2 -1
- package/dist/hooks/useScoutRealtimeAnalysisTasks.js +3 -5
- package/dist/hooks/useScoutRealtimeBroadcast.d.ts +9 -5
- package/dist/hooks/useScoutRealtimeBroadcast.js +118 -25
- package/dist/hooks/useScoutRealtimeConnectivity.d.ts +2 -1
- package/dist/hooks/useScoutRealtimeConnectivity.js +18 -76
- package/dist/hooks/useScoutRealtimeContacts.d.ts +2 -1
- package/dist/hooks/useScoutRealtimeContacts.js +3 -3
- package/dist/hooks/useScoutRealtimeDevices.d.ts +2 -1
- package/dist/hooks/useScoutRealtimeDevices.js +3 -64
- package/dist/hooks/useScoutRealtimeDocuments.d.ts +3 -3
- package/dist/hooks/useScoutRealtimeDocuments.js +7 -5
- package/dist/hooks/useScoutRealtimeEvents.d.ts +2 -1
- package/dist/hooks/useScoutRealtimeEvents.js +3 -69
- package/dist/hooks/useScoutRealtimeMaintenanceRequests.d.ts +2 -1
- package/dist/hooks/useScoutRealtimeMaintenanceRequests.js +3 -3
- package/dist/hooks/useScoutRealtimeOperatingContexts.d.ts +12 -0
- package/dist/hooks/useScoutRealtimeOperatingContexts.js +26 -0
- package/dist/hooks/useScoutRealtimeParts.d.ts +2 -1
- package/dist/hooks/useScoutRealtimeParts.js +3 -3
- package/dist/hooks/useScoutRealtimePins.d.ts +2 -1
- package/dist/hooks/useScoutRealtimePins.js +3 -69
- package/dist/hooks/useScoutRealtimePlans.d.ts +2 -1
- package/dist/hooks/useScoutRealtimePlans.js +3 -3
- package/dist/hooks/useScoutRealtimeSessionIncidents.d.ts +2 -1
- package/dist/hooks/useScoutRealtimeSessionIncidents.js +3 -3
- package/dist/hooks/useScoutRealtimeSessions.d.ts +2 -1
- package/dist/hooks/useScoutRealtimeSessions.js +3 -69
- package/dist/hooks/useScoutRealtimeTags.d.ts +2 -1
- package/dist/hooks/useScoutRealtimeTags.js +3 -69
- package/dist/hooks/useScoutRealtimeVersionsSoftware.d.ts +2 -1
- package/dist/hooks/useScoutRealtimeVersionsSoftware.js +3 -5
- package/dist/index.d.ts +2 -0
- package/dist/index.js +2 -0
- package/dist/providers/ScoutRefreshProvider.d.ts +1 -0
- package/dist/providers/ScoutRefreshProvider.js +3 -0
- package/dist/types/db.d.ts +82 -0
- package/dist/types/realtime.d.ts +1 -0
- package/dist/types/supabase.d.ts +919 -100
- package/dist/types/supabase.js +26 -1
- package/package.json +1 -1
|
@@ -6,6 +6,7 @@ export declare function get_documents_by_herd_id(client: SupabaseClient<Database
|
|
|
6
6
|
export declare function get_documents_by_device_id(client: SupabaseClient<Database>, device_id: number): Promise<IWebResponseCompatible<IDocument[]>>;
|
|
7
7
|
export declare function get_documents_by_user_id(client: SupabaseClient<Database>, user_id: string): Promise<IWebResponseCompatible<IDocument[]>>;
|
|
8
8
|
export declare function get_documents_by_product_id(client: SupabaseClient<Database>, product_id: number): Promise<IWebResponseCompatible<IDocument[]>>;
|
|
9
|
+
export declare function get_documents_by_operating_context_id(client: SupabaseClient<Database>, operating_context_id: number): Promise<IWebResponseCompatible<IDocument[]>>;
|
|
9
10
|
export declare function get_document_by_id(client: SupabaseClient<Database>, document_id: number): Promise<IWebResponseCompatible<IDocument | null>>;
|
|
10
11
|
export declare function create_document(client: SupabaseClient<Database>, row: DocumentInsert): Promise<IWebResponseCompatible<IDocument | null>>;
|
|
11
12
|
export declare function update_document(client: SupabaseClient<Database>, document_id: number, patch: DocumentUpdate): Promise<IWebResponseCompatible<IDocument | null>>;
|
|
@@ -4,10 +4,16 @@ function assert_document_insert(row) {
|
|
|
4
4
|
return IWebResponse.error("uri is required")
|
|
5
5
|
.to_compatible();
|
|
6
6
|
}
|
|
7
|
-
const owners = [
|
|
7
|
+
const owners = [
|
|
8
|
+
row.user_id,
|
|
9
|
+
row.herd_id,
|
|
10
|
+
row.device_id,
|
|
11
|
+
row.product_id,
|
|
12
|
+
row.operating_context_id,
|
|
13
|
+
];
|
|
8
14
|
const owner_count = owners.filter((owner) => owner != null).length;
|
|
9
15
|
if (owner_count !== 1) {
|
|
10
|
-
return IWebResponse.error("exactly one
|
|
16
|
+
return IWebResponse.error("exactly one document owner is required").to_compatible();
|
|
11
17
|
}
|
|
12
18
|
return null;
|
|
13
19
|
}
|
|
@@ -34,6 +40,9 @@ export async function get_documents_by_user_id(client, user_id) {
|
|
|
34
40
|
export async function get_documents_by_product_id(client, product_id) {
|
|
35
41
|
return get_documents_by(client, "product_id", product_id);
|
|
36
42
|
}
|
|
43
|
+
export async function get_documents_by_operating_context_id(client, operating_context_id) {
|
|
44
|
+
return get_documents_by(client, "operating_context_id", operating_context_id);
|
|
45
|
+
}
|
|
37
46
|
export async function get_document_by_id(client, document_id) {
|
|
38
47
|
const { data, error } = await client
|
|
39
48
|
.from("documents")
|
package/dist/helpers/index.d.ts
CHANGED
|
@@ -26,6 +26,7 @@ export * from "./documents";
|
|
|
26
26
|
export * from "./maintenance_requests";
|
|
27
27
|
export * from "./session_incidents";
|
|
28
28
|
export * from "./contacts";
|
|
29
|
+
export * from "./operating_contexts";
|
|
29
30
|
export * from "./plans";
|
|
30
31
|
export * from "./sessions";
|
|
31
32
|
export * from "./segmentations_sam3";
|
package/dist/helpers/index.js
CHANGED
|
@@ -26,6 +26,7 @@ export * from "./documents";
|
|
|
26
26
|
export * from "./maintenance_requests";
|
|
27
27
|
export * from "./session_incidents";
|
|
28
28
|
export * from "./contacts";
|
|
29
|
+
export * from "./operating_contexts";
|
|
29
30
|
export * from "./plans";
|
|
30
31
|
export * from "./sessions";
|
|
31
32
|
export * from "./segmentations_sam3";
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { DocumentConditionCreateInput, DocumentConditionUpdateInput, IDocumentCondition, IOperatingContext, IOperatingContextEquipmentCategory, IOperatingContextEquipmentItem, IOperatingContextEquipmentRequirement, IOperatingContextPayload, IOperatingContextRegion, IOperatingContextRisk, IOperatingContextRole, IOperatingContextRoleAssignment, IOperatingContextType, IOperatingContextWeatherSnapshot, OperatingContextCreateInput, OperatingContextEquipmentCategoryCreateInput, OperatingContextEquipmentCategoryUpdateInput, OperatingContextEquipmentItemCreateInput, OperatingContextEquipmentItemUpdateInput, OperatingContextEquipmentRequirementCreateInput, OperatingContextEquipmentRequirementUpdateInput, OperatingContextListOptions, OperatingContextPayloadCreateInput, OperatingContextPayloadUpdateInput, OperatingContextRegionCreateInput, OperatingContextRegionUpdateInput, OperatingContextRiskCreateInput, OperatingContextRiskUpdateInput, OperatingContextRoleAssignmentCreateInput, OperatingContextRoleAssignmentUpdateInput, OperatingContextRoleCreateInput, OperatingContextRoleUpdateInput, OperatingContextTypeCreateInput, OperatingContextTypeUpdateInput, OperatingContextUpdateInput } from "../types/db";
|
|
2
|
+
import { IWebResponseCompatible } from "../types/requests";
|
|
3
|
+
export declare function server_get_document_conditions_by_localization(localization_id: number, options?: OperatingContextListOptions): Promise<IWebResponseCompatible<IDocumentCondition[]>>;
|
|
4
|
+
export declare function server_create_document_condition(row: DocumentConditionCreateInput): Promise<IWebResponseCompatible<IDocumentCondition | null>>;
|
|
5
|
+
export declare function server_update_document_condition(id: number, updates: DocumentConditionUpdateInput): Promise<IWebResponseCompatible<IDocumentCondition | null>>;
|
|
6
|
+
export declare function server_get_operating_context_types_by_localization(localization_id: number, options?: OperatingContextListOptions): Promise<IWebResponseCompatible<IOperatingContextType[]>>;
|
|
7
|
+
export declare function server_create_operating_context_type(row: OperatingContextTypeCreateInput): Promise<IWebResponseCompatible<IOperatingContextType | null>>;
|
|
8
|
+
export declare function server_update_operating_context_type(id: number, updates: OperatingContextTypeUpdateInput): Promise<IWebResponseCompatible<IOperatingContextType | null>>;
|
|
9
|
+
export declare function server_get_operating_context_roles_by_localization(localization_id: number, options?: OperatingContextListOptions): Promise<IWebResponseCompatible<IOperatingContextRole[]>>;
|
|
10
|
+
export declare function server_create_operating_context_role(row: OperatingContextRoleCreateInput): Promise<IWebResponseCompatible<IOperatingContextRole | null>>;
|
|
11
|
+
export declare function server_update_operating_context_role(id: number, updates: OperatingContextRoleUpdateInput): Promise<IWebResponseCompatible<IOperatingContextRole | null>>;
|
|
12
|
+
export declare function server_get_operating_context_equipment_categories_by_localization(localization_id: number, options?: OperatingContextListOptions): Promise<IWebResponseCompatible<IOperatingContextEquipmentCategory[]>>;
|
|
13
|
+
export declare function server_create_operating_context_equipment_category(row: OperatingContextEquipmentCategoryCreateInput): Promise<IWebResponseCompatible<IOperatingContextEquipmentCategory | null>>;
|
|
14
|
+
export declare function server_update_operating_context_equipment_category(id: number, updates: OperatingContextEquipmentCategoryUpdateInput): Promise<IWebResponseCompatible<IOperatingContextEquipmentCategory | null>>;
|
|
15
|
+
export declare function server_get_operating_context_equipment_items_by_category(equipment_category_id: number, options?: OperatingContextListOptions): Promise<IWebResponseCompatible<IOperatingContextEquipmentItem[]>>;
|
|
16
|
+
export declare function server_create_operating_context_equipment_item(row: OperatingContextEquipmentItemCreateInput): Promise<IWebResponseCompatible<IOperatingContextEquipmentItem | null>>;
|
|
17
|
+
export declare function server_update_operating_context_equipment_item(id: number, updates: OperatingContextEquipmentItemUpdateInput): Promise<IWebResponseCompatible<IOperatingContextEquipmentItem | null>>;
|
|
18
|
+
export declare function server_get_operating_contexts_by_herd(herd_id: number, options?: OperatingContextListOptions): Promise<IWebResponseCompatible<IOperatingContext[]>>;
|
|
19
|
+
export declare function server_get_operating_context_by_id(id: number): Promise<IWebResponseCompatible<IOperatingContext | null>>;
|
|
20
|
+
export declare function server_create_operating_context(row: OperatingContextCreateInput): Promise<IWebResponseCompatible<IOperatingContext | null>>;
|
|
21
|
+
export declare function server_update_operating_context(id: number, updates: OperatingContextUpdateInput): Promise<IWebResponseCompatible<IOperatingContext | null>>;
|
|
22
|
+
export declare function server_get_operating_context_payloads_by_operating_context(operating_context_id: number, options?: OperatingContextListOptions): Promise<IWebResponseCompatible<IOperatingContextPayload[]>>;
|
|
23
|
+
export declare function server_create_operating_context_payload(row: OperatingContextPayloadCreateInput): Promise<IWebResponseCompatible<IOperatingContextPayload | null>>;
|
|
24
|
+
export declare function server_update_operating_context_payload(id: number, updates: OperatingContextPayloadUpdateInput): Promise<IWebResponseCompatible<IOperatingContextPayload | null>>;
|
|
25
|
+
export declare function server_get_operating_context_role_assignments_by_operating_context(operating_context_id: number, options?: OperatingContextListOptions): Promise<IWebResponseCompatible<IOperatingContextRoleAssignment[]>>;
|
|
26
|
+
export declare function server_create_operating_context_role_assignment(row: OperatingContextRoleAssignmentCreateInput): Promise<IWebResponseCompatible<IOperatingContextRoleAssignment | null>>;
|
|
27
|
+
export declare function server_update_operating_context_role_assignment(id: number, updates: OperatingContextRoleAssignmentUpdateInput): Promise<IWebResponseCompatible<IOperatingContextRoleAssignment | null>>;
|
|
28
|
+
export declare function server_get_operating_context_equipment_requirements_by_operating_context(operating_context_id: number, options?: OperatingContextListOptions): Promise<IWebResponseCompatible<IOperatingContextEquipmentRequirement[]>>;
|
|
29
|
+
export declare function server_create_operating_context_equipment_requirement(row: OperatingContextEquipmentRequirementCreateInput): Promise<IWebResponseCompatible<IOperatingContextEquipmentRequirement | null>>;
|
|
30
|
+
export declare function server_update_operating_context_equipment_requirement(id: number, updates: OperatingContextEquipmentRequirementUpdateInput): Promise<IWebResponseCompatible<IOperatingContextEquipmentRequirement | null>>;
|
|
31
|
+
export declare function server_get_operating_context_regions_by_operating_context(operating_context_id: number, options?: OperatingContextListOptions): Promise<IWebResponseCompatible<IOperatingContextRegion[]>>;
|
|
32
|
+
export declare function server_create_operating_context_region(row: OperatingContextRegionCreateInput): Promise<IWebResponseCompatible<IOperatingContextRegion | null>>;
|
|
33
|
+
export declare function server_update_operating_context_region(id: number, updates: OperatingContextRegionUpdateInput): Promise<IWebResponseCompatible<IOperatingContextRegion | null>>;
|
|
34
|
+
export declare function server_get_operating_context_risks_by_operating_context(operating_context_id: number, options?: OperatingContextListOptions): Promise<IWebResponseCompatible<IOperatingContextRisk[]>>;
|
|
35
|
+
export declare function server_create_operating_context_risk(row: OperatingContextRiskCreateInput): Promise<IWebResponseCompatible<IOperatingContextRisk | null>>;
|
|
36
|
+
export declare function server_update_operating_context_risk(id: number, updates: OperatingContextRiskUpdateInput): Promise<IWebResponseCompatible<IOperatingContextRisk | null>>;
|
|
37
|
+
export declare function server_get_operating_context_weather_snapshots(operating_context_id: number, options?: {
|
|
38
|
+
limit?: number;
|
|
39
|
+
cursor?: {
|
|
40
|
+
collected_at: string;
|
|
41
|
+
id: number;
|
|
42
|
+
};
|
|
43
|
+
}): Promise<IWebResponseCompatible<IOperatingContextWeatherSnapshot[]>>;
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
"use server";
|
|
2
|
+
import { newServerClient } from "../supabase/server";
|
|
3
|
+
import { IWebResponse } from "../types/requests";
|
|
4
|
+
function error(message) {
|
|
5
|
+
return IWebResponse.error(message).to_compatible();
|
|
6
|
+
}
|
|
7
|
+
function page_limit(options) {
|
|
8
|
+
const limit = options?.limit ?? 100;
|
|
9
|
+
return limit < 1 || limit > 500 ? null : limit;
|
|
10
|
+
}
|
|
11
|
+
async function authenticated_user_id(client) {
|
|
12
|
+
const { data, error: authError } = await client.auth.getUser();
|
|
13
|
+
return authError ? null : (data.user?.id ?? null);
|
|
14
|
+
}
|
|
15
|
+
function with_lifecycle_actor(updates, user_id) {
|
|
16
|
+
return updates.lifecycle
|
|
17
|
+
? { ...updates, lifecycle_changed_by: user_id }
|
|
18
|
+
: updates;
|
|
19
|
+
}
|
|
20
|
+
function with_update_actor(updates, user_id) {
|
|
21
|
+
return { ...with_lifecycle_actor(updates, user_id), updated_by: user_id };
|
|
22
|
+
}
|
|
23
|
+
function update_error(updates) {
|
|
24
|
+
if (Object.keys(updates).length === 0)
|
|
25
|
+
return "no fields to update";
|
|
26
|
+
if (updates.lifecycle_reason !== undefined && updates.lifecycle === undefined) {
|
|
27
|
+
return "lifecycle_reason requires lifecycle";
|
|
28
|
+
}
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
async function list_by(table, column, value, options) {
|
|
32
|
+
const limit = page_limit(options);
|
|
33
|
+
if (limit == null)
|
|
34
|
+
return error("limit must be between 1 and 500");
|
|
35
|
+
const supabase = await newServerClient();
|
|
36
|
+
let query = supabase
|
|
37
|
+
.from(table)
|
|
38
|
+
.select("*")
|
|
39
|
+
.eq(column, value)
|
|
40
|
+
.order("id")
|
|
41
|
+
.limit(limit);
|
|
42
|
+
if (!options?.include_inactive)
|
|
43
|
+
query = query.eq("lifecycle", "active");
|
|
44
|
+
if (options?.after_id != null)
|
|
45
|
+
query = query.gt("id", options.after_id);
|
|
46
|
+
const { data, error: queryError } = await query;
|
|
47
|
+
return queryError
|
|
48
|
+
? error(queryError.message)
|
|
49
|
+
: IWebResponse.success((data ?? [])).to_compatible();
|
|
50
|
+
}
|
|
51
|
+
async function insert_row(table, row) {
|
|
52
|
+
const supabase = await newServerClient();
|
|
53
|
+
const { data, error: queryError } = await supabase
|
|
54
|
+
.from(table)
|
|
55
|
+
.insert(row)
|
|
56
|
+
.select("*")
|
|
57
|
+
.single();
|
|
58
|
+
return queryError
|
|
59
|
+
? error(queryError.message)
|
|
60
|
+
: IWebResponse.success(data).to_compatible();
|
|
61
|
+
}
|
|
62
|
+
async function insert_with_creator(table, row) {
|
|
63
|
+
const supabase = await newServerClient();
|
|
64
|
+
const user_id = await authenticated_user_id(supabase);
|
|
65
|
+
if (!user_id)
|
|
66
|
+
return error("authentication required");
|
|
67
|
+
const { data, error: queryError } = await supabase
|
|
68
|
+
.from(table)
|
|
69
|
+
.insert({ ...row, created_by: user_id })
|
|
70
|
+
.select("*")
|
|
71
|
+
.single();
|
|
72
|
+
return queryError
|
|
73
|
+
? error(queryError.message)
|
|
74
|
+
: IWebResponse.success(data).to_compatible();
|
|
75
|
+
}
|
|
76
|
+
async function patch_row(table, id, updates, actor) {
|
|
77
|
+
const invalid = update_error(updates);
|
|
78
|
+
if (invalid)
|
|
79
|
+
return error(invalid);
|
|
80
|
+
const supabase = await newServerClient();
|
|
81
|
+
const user_id = await authenticated_user_id(supabase);
|
|
82
|
+
if (!user_id)
|
|
83
|
+
return error("authentication required");
|
|
84
|
+
const payload = actor === "update"
|
|
85
|
+
? with_update_actor(updates, user_id)
|
|
86
|
+
: with_lifecycle_actor(updates, user_id);
|
|
87
|
+
const { data, error: queryError } = await supabase
|
|
88
|
+
.from(table)
|
|
89
|
+
.update(payload)
|
|
90
|
+
.eq("id", id)
|
|
91
|
+
.select("*")
|
|
92
|
+
.single();
|
|
93
|
+
return queryError
|
|
94
|
+
? error(queryError.message)
|
|
95
|
+
: IWebResponse.success(data).to_compatible();
|
|
96
|
+
}
|
|
97
|
+
export async function server_get_document_conditions_by_localization(localization_id, options) {
|
|
98
|
+
return list_by("document_conditions", "localization_id", localization_id, options);
|
|
99
|
+
}
|
|
100
|
+
export async function server_create_document_condition(row) {
|
|
101
|
+
return insert_row("document_conditions", row);
|
|
102
|
+
}
|
|
103
|
+
export async function server_update_document_condition(id, updates) {
|
|
104
|
+
return patch_row("document_conditions", id, updates, "lifecycle");
|
|
105
|
+
}
|
|
106
|
+
export async function server_get_operating_context_types_by_localization(localization_id, options) {
|
|
107
|
+
return list_by("operating_context_types", "localization_id", localization_id, options);
|
|
108
|
+
}
|
|
109
|
+
export async function server_create_operating_context_type(row) {
|
|
110
|
+
return insert_row("operating_context_types", row);
|
|
111
|
+
}
|
|
112
|
+
export async function server_update_operating_context_type(id, updates) {
|
|
113
|
+
return patch_row("operating_context_types", id, updates, "lifecycle");
|
|
114
|
+
}
|
|
115
|
+
export async function server_get_operating_context_roles_by_localization(localization_id, options) {
|
|
116
|
+
return list_by("operating_context_roles", "localization_id", localization_id, options);
|
|
117
|
+
}
|
|
118
|
+
export async function server_create_operating_context_role(row) {
|
|
119
|
+
return insert_row("operating_context_roles", row);
|
|
120
|
+
}
|
|
121
|
+
export async function server_update_operating_context_role(id, updates) {
|
|
122
|
+
return patch_row("operating_context_roles", id, updates, "lifecycle");
|
|
123
|
+
}
|
|
124
|
+
export async function server_get_operating_context_equipment_categories_by_localization(localization_id, options) {
|
|
125
|
+
return list_by("operating_context_equipment_categories", "localization_id", localization_id, options);
|
|
126
|
+
}
|
|
127
|
+
export async function server_create_operating_context_equipment_category(row) {
|
|
128
|
+
return insert_row("operating_context_equipment_categories", row);
|
|
129
|
+
}
|
|
130
|
+
export async function server_update_operating_context_equipment_category(id, updates) {
|
|
131
|
+
return patch_row("operating_context_equipment_categories", id, updates, "lifecycle");
|
|
132
|
+
}
|
|
133
|
+
export async function server_get_operating_context_equipment_items_by_category(equipment_category_id, options) {
|
|
134
|
+
return list_by("operating_context_equipment_items", "equipment_category_id", equipment_category_id, options);
|
|
135
|
+
}
|
|
136
|
+
export async function server_create_operating_context_equipment_item(row) {
|
|
137
|
+
return insert_row("operating_context_equipment_items", row);
|
|
138
|
+
}
|
|
139
|
+
export async function server_update_operating_context_equipment_item(id, updates) {
|
|
140
|
+
return patch_row("operating_context_equipment_items", id, updates, "lifecycle");
|
|
141
|
+
}
|
|
142
|
+
export async function server_get_operating_contexts_by_herd(herd_id, options) {
|
|
143
|
+
return list_by("operating_contexts", "herd_id", herd_id, options);
|
|
144
|
+
}
|
|
145
|
+
export async function server_get_operating_context_by_id(id) {
|
|
146
|
+
const supabase = await newServerClient();
|
|
147
|
+
const { data, error: queryError } = await supabase
|
|
148
|
+
.from("operating_contexts")
|
|
149
|
+
.select("*")
|
|
150
|
+
.eq("id", id)
|
|
151
|
+
.maybeSingle();
|
|
152
|
+
return queryError
|
|
153
|
+
? error(queryError.message)
|
|
154
|
+
: IWebResponse.success(data).to_compatible();
|
|
155
|
+
}
|
|
156
|
+
export async function server_create_operating_context(row) {
|
|
157
|
+
return insert_with_creator("operating_contexts", row);
|
|
158
|
+
}
|
|
159
|
+
export async function server_update_operating_context(id, updates) {
|
|
160
|
+
return patch_row("operating_contexts", id, updates, "update");
|
|
161
|
+
}
|
|
162
|
+
export async function server_get_operating_context_payloads_by_operating_context(operating_context_id, options) {
|
|
163
|
+
return list_by("operating_context_payloads", "operating_context_id", operating_context_id, options);
|
|
164
|
+
}
|
|
165
|
+
export async function server_create_operating_context_payload(row) {
|
|
166
|
+
return insert_with_creator("operating_context_payloads", row);
|
|
167
|
+
}
|
|
168
|
+
export async function server_update_operating_context_payload(id, updates) {
|
|
169
|
+
return patch_row("operating_context_payloads", id, updates, "update");
|
|
170
|
+
}
|
|
171
|
+
export async function server_get_operating_context_role_assignments_by_operating_context(operating_context_id, options) {
|
|
172
|
+
return list_by("operating_context_role_assignments", "operating_context_id", operating_context_id, options);
|
|
173
|
+
}
|
|
174
|
+
export async function server_create_operating_context_role_assignment(row) {
|
|
175
|
+
return insert_row("operating_context_role_assignments", row);
|
|
176
|
+
}
|
|
177
|
+
export async function server_update_operating_context_role_assignment(id, updates) {
|
|
178
|
+
return patch_row("operating_context_role_assignments", id, updates, "lifecycle");
|
|
179
|
+
}
|
|
180
|
+
export async function server_get_operating_context_equipment_requirements_by_operating_context(operating_context_id, options) {
|
|
181
|
+
return list_by("operating_context_equipment_requirements", "operating_context_id", operating_context_id, options);
|
|
182
|
+
}
|
|
183
|
+
export async function server_create_operating_context_equipment_requirement(row) {
|
|
184
|
+
return insert_row("operating_context_equipment_requirements", row);
|
|
185
|
+
}
|
|
186
|
+
export async function server_update_operating_context_equipment_requirement(id, updates) {
|
|
187
|
+
return patch_row("operating_context_equipment_requirements", id, updates, "lifecycle");
|
|
188
|
+
}
|
|
189
|
+
export async function server_get_operating_context_regions_by_operating_context(operating_context_id, options) {
|
|
190
|
+
return list_by("operating_context_regions", "operating_context_id", operating_context_id, options);
|
|
191
|
+
}
|
|
192
|
+
export async function server_create_operating_context_region(row) {
|
|
193
|
+
return insert_with_creator("operating_context_regions", row);
|
|
194
|
+
}
|
|
195
|
+
export async function server_update_operating_context_region(id, updates) {
|
|
196
|
+
return patch_row("operating_context_regions", id, updates, "update");
|
|
197
|
+
}
|
|
198
|
+
export async function server_get_operating_context_risks_by_operating_context(operating_context_id, options) {
|
|
199
|
+
return list_by("operating_context_risks", "operating_context_id", operating_context_id, options);
|
|
200
|
+
}
|
|
201
|
+
export async function server_create_operating_context_risk(row) {
|
|
202
|
+
return insert_with_creator("operating_context_risks", row);
|
|
203
|
+
}
|
|
204
|
+
export async function server_update_operating_context_risk(id, updates) {
|
|
205
|
+
return patch_row("operating_context_risks", id, updates, "update");
|
|
206
|
+
}
|
|
207
|
+
export async function server_get_operating_context_weather_snapshots(operating_context_id, options) {
|
|
208
|
+
if (options?.limit != null &&
|
|
209
|
+
(options.limit < 1 || options.limit > 500)) {
|
|
210
|
+
return error("limit must be between 1 and 500");
|
|
211
|
+
}
|
|
212
|
+
const supabase = await newServerClient();
|
|
213
|
+
const { data, error: queryError } = await supabase.rpc("get_operating_context_weather_snapshots", {
|
|
214
|
+
operating_context_id_caller: operating_context_id,
|
|
215
|
+
limit_caller: options?.limit,
|
|
216
|
+
cursor_collected_at: options?.cursor?.collected_at,
|
|
217
|
+
cursor_id: options?.cursor?.id,
|
|
218
|
+
});
|
|
219
|
+
return queryError
|
|
220
|
+
? error(queryError.message)
|
|
221
|
+
: IWebResponse.success(data ?? []).to_compatible();
|
|
222
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { IClientAbilitiesTokenMint } from "../types/client_abilities_token";
|
|
2
|
+
import { EnumJwtMintStatus } from "../types/jwt_mint";
|
|
3
|
+
export declare function realtime_topic_ability(topic: string): string;
|
|
4
|
+
export declare function can_access_realtime_topic(mint: IClientAbilitiesTokenMint | null | undefined, topic: string): boolean;
|
|
5
|
+
export declare function filter_realtime_topics(status: EnumJwtMintStatus, mint: IClientAbilitiesTokenMint | null | undefined, topics: string[]): string[];
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { can_herd_ability, } from "../types/client_abilities_token";
|
|
2
|
+
import { EnumJwtMintStatus } from "../types/jwt_mint";
|
|
3
|
+
export function realtime_topic_ability(topic) {
|
|
4
|
+
const channel = topic.slice(topic.indexOf("-") + 1);
|
|
5
|
+
switch (channel) {
|
|
6
|
+
case "contacts":
|
|
7
|
+
return "contacts.read";
|
|
8
|
+
case "maintenance_requests":
|
|
9
|
+
return "maintenance_requests.read";
|
|
10
|
+
case "herd_documents":
|
|
11
|
+
return "herd_documents.read";
|
|
12
|
+
case "device_documents":
|
|
13
|
+
return "device_documents.read";
|
|
14
|
+
case "user_documents":
|
|
15
|
+
return "user_documents.read";
|
|
16
|
+
case "operating_contexts":
|
|
17
|
+
case "operating_context_documents":
|
|
18
|
+
return "operating_contexts.read";
|
|
19
|
+
default:
|
|
20
|
+
return "content.read";
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
export function can_access_realtime_topic(mint, topic) {
|
|
24
|
+
if (topic === "versions_software_changes" ||
|
|
25
|
+
/^user_[0-9a-f-]+-documents$/i.test(topic)) {
|
|
26
|
+
return true;
|
|
27
|
+
}
|
|
28
|
+
const isProductDocuments = topic === "product_documents_changes";
|
|
29
|
+
const isAnalysis = topic === "analysis_jobs_changes" ||
|
|
30
|
+
topic === "analysis_tasks_changes";
|
|
31
|
+
const herd_match = /^(\d+)-/.exec(topic);
|
|
32
|
+
if (!isProductDocuments && !isAnalysis && !herd_match)
|
|
33
|
+
return true;
|
|
34
|
+
if (!mint?.token || mint.exp <= Math.floor(Date.now() / 1000))
|
|
35
|
+
return false;
|
|
36
|
+
if (isProductDocuments) {
|
|
37
|
+
return (mint.platform_superadmin ||
|
|
38
|
+
mint.herds.some((herd) => herd.abilities.includes("content.read")));
|
|
39
|
+
}
|
|
40
|
+
if (isAnalysis)
|
|
41
|
+
return mint.platform_superadmin;
|
|
42
|
+
if (!herd_match)
|
|
43
|
+
return true;
|
|
44
|
+
return can_herd_ability(mint, Number(herd_match[1]), realtime_topic_ability(topic));
|
|
45
|
+
}
|
|
46
|
+
export function filter_realtime_topics(status, mint, topics) {
|
|
47
|
+
if (status === EnumJwtMintStatus.IDLE)
|
|
48
|
+
return topics;
|
|
49
|
+
if (!mint?.token) {
|
|
50
|
+
return status === EnumJwtMintStatus.LOADING
|
|
51
|
+
? topics.filter((topic) => can_access_realtime_topic(mint, topic))
|
|
52
|
+
: topics;
|
|
53
|
+
}
|
|
54
|
+
return topics.filter((topic) => can_access_realtime_topic(mint, topic));
|
|
55
|
+
}
|
package/dist/hooks/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export { useScoutRefresh, type UseScoutRefreshOptions, } from "./useScoutRefresh";
|
|
2
|
-
export { useScoutRealtimeBroadcast } from "./useScoutRealtimeBroadcast";
|
|
2
|
+
export { useScoutRealtimeBroadcast, type ScoutRealtimeBroadcastOptions, type ScoutRealtimeAuthErrorMode, } from "./useScoutRealtimeBroadcast";
|
|
3
3
|
export { useScoutRealtimeConnectivity } from "./useScoutRealtimeConnectivity";
|
|
4
4
|
export { useScoutRealtimeDevices } from "./useScoutRealtimeDevices";
|
|
5
5
|
export { useScoutRealtimeVersionsSoftware } from "./useScoutRealtimeVersionsSoftware";
|
|
@@ -15,5 +15,6 @@ export { useScoutRealtimeDocuments, type DocumentRealtimeChannel, } from "./useS
|
|
|
15
15
|
export { useScoutRealtimeMaintenanceRequests } from "./useScoutRealtimeMaintenanceRequests";
|
|
16
16
|
export { useScoutRealtimeContacts } from "./useScoutRealtimeContacts";
|
|
17
17
|
export { useScoutRealtimeSessionIncidents } from "./useScoutRealtimeSessionIncidents";
|
|
18
|
+
export { useScoutRealtimeOperatingContexts, type OperatingContextRealtimeData, type OperatingContextRealtimeRow, } from "./useScoutRealtimeOperatingContexts";
|
|
18
19
|
export { useInfiniteSessionsByHerd, useInfiniteSessionsByDevice, useInfiniteEventsByHerd, useInfiniteEventsByDevice, useInfiniteArtifactsByHerd, useInfiniteArtifactsByDevice, useInfiniteFeedByHerd, useInfiniteFeedByDevice, useInfiniteAnalysisJobs, useInfiniteAnalysisTasks, useIntersectionObserver, type UseInfiniteScrollOptions, type UseAnalysisJobsInfiniteOptions, type UseAnalysisTasksInfiniteOptions, } from "./useInfiniteQuery";
|
|
19
20
|
export { useLoadingPerformance, useSessionSummariesByHerd, useHasSessionSummaries, } from "../store/hooks";
|
package/dist/hooks/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export { useScoutRefresh, } from "./useScoutRefresh";
|
|
2
|
-
export { useScoutRealtimeBroadcast } from "./useScoutRealtimeBroadcast";
|
|
2
|
+
export { useScoutRealtimeBroadcast, } from "./useScoutRealtimeBroadcast";
|
|
3
3
|
export { useScoutRealtimeConnectivity } from "./useScoutRealtimeConnectivity";
|
|
4
4
|
export { useScoutRealtimeDevices } from "./useScoutRealtimeDevices";
|
|
5
5
|
export { useScoutRealtimeVersionsSoftware } from "./useScoutRealtimeVersionsSoftware";
|
|
@@ -15,6 +15,7 @@ export { useScoutRealtimeDocuments, } from "./useScoutRealtimeDocuments";
|
|
|
15
15
|
export { useScoutRealtimeMaintenanceRequests } from "./useScoutRealtimeMaintenanceRequests";
|
|
16
16
|
export { useScoutRealtimeContacts } from "./useScoutRealtimeContacts";
|
|
17
17
|
export { useScoutRealtimeSessionIncidents } from "./useScoutRealtimeSessionIncidents";
|
|
18
|
+
export { useScoutRealtimeOperatingContexts, } from "./useScoutRealtimeOperatingContexts";
|
|
18
19
|
// RTK Query infinite scroll hooks
|
|
19
20
|
export { useInfiniteSessionsByHerd, useInfiniteSessionsByDevice, useInfiniteEventsByHerd, useInfiniteEventsByDevice, useInfiniteArtifactsByHerd, useInfiniteArtifactsByDevice, useInfiniteFeedByHerd, useInfiniteFeedByDevice, useInfiniteAnalysisJobs, useInfiniteAnalysisTasks, useIntersectionObserver, } from "./useInfiniteQuery";
|
|
20
21
|
// Session summaries and performance hooks
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function useAuthorizedRealtimeTopics(topics: string[]): string[];
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useMemo } from "react";
|
|
3
|
+
import { filter_realtime_topics } from "../helpers/realtime_topic_access";
|
|
4
|
+
import { useOptionalClientAbilitiesMint } from "../providers/ScoutRefreshProvider";
|
|
5
|
+
export function useAuthorizedRealtimeTopics(topics) {
|
|
6
|
+
const abilities = useOptionalClientAbilitiesMint();
|
|
7
|
+
const topicsKey = topics.join("|");
|
|
8
|
+
return useMemo(() => {
|
|
9
|
+
const requested = topicsKey.split("|").filter(Boolean);
|
|
10
|
+
if (!abilities)
|
|
11
|
+
return requested;
|
|
12
|
+
return filter_realtime_topics(abilities.status, abilities.mint, requested);
|
|
13
|
+
}, [abilities, topicsKey]);
|
|
14
|
+
}
|
|
@@ -2,4 +2,5 @@ import { SupabaseClient } from "@supabase/supabase-js";
|
|
|
2
2
|
import { Database } from "../types/supabase";
|
|
3
3
|
import { IAnalysisJob } from "../types/db";
|
|
4
4
|
import { RealtimeData } from "../types/realtime";
|
|
5
|
-
|
|
5
|
+
import { ScoutRealtimeBroadcastOptions } from "./useScoutRealtimeBroadcast";
|
|
6
|
+
export declare function useScoutRealtimeAnalysisJobs(scoutSupabase: SupabaseClient<Database>, options?: ScoutRealtimeBroadcastOptions): [RealtimeData<IAnalysisJob> | null, () => void];
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { useScoutRealtimeBroadcast } from "./useScoutRealtimeBroadcast";
|
|
3
|
-
export function useScoutRealtimeAnalysisJobs(scoutSupabase) {
|
|
4
|
-
return useScoutRealtimeBroadcast(scoutSupabase, [
|
|
5
|
-
"analysis_jobs_changes",
|
|
6
|
-
]);
|
|
2
|
+
import { useScoutRealtimeBroadcast, } from "./useScoutRealtimeBroadcast";
|
|
3
|
+
export function useScoutRealtimeAnalysisJobs(scoutSupabase, options) {
|
|
4
|
+
return useScoutRealtimeBroadcast(scoutSupabase, ["analysis_jobs_changes"], options);
|
|
7
5
|
}
|
|
@@ -2,4 +2,5 @@ import { SupabaseClient } from "@supabase/supabase-js";
|
|
|
2
2
|
import { Database } from "../types/supabase";
|
|
3
3
|
import { IAnalysisTask } from "../types/db";
|
|
4
4
|
import { RealtimeData } from "../types/realtime";
|
|
5
|
-
|
|
5
|
+
import { ScoutRealtimeBroadcastOptions } from "./useScoutRealtimeBroadcast";
|
|
6
|
+
export declare function useScoutRealtimeAnalysisTasks(scoutSupabase: SupabaseClient<Database>, options?: ScoutRealtimeBroadcastOptions): [RealtimeData<IAnalysisTask> | null, () => void];
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { useScoutRealtimeBroadcast } from "./useScoutRealtimeBroadcast";
|
|
3
|
-
export function useScoutRealtimeAnalysisTasks(scoutSupabase) {
|
|
4
|
-
return useScoutRealtimeBroadcast(scoutSupabase, [
|
|
5
|
-
"analysis_tasks_changes",
|
|
6
|
-
]);
|
|
2
|
+
import { useScoutRealtimeBroadcast, } from "./useScoutRealtimeBroadcast";
|
|
3
|
+
export function useScoutRealtimeAnalysisTasks(scoutSupabase, options) {
|
|
4
|
+
return useScoutRealtimeBroadcast(scoutSupabase, ["analysis_tasks_changes"], options);
|
|
7
5
|
}
|
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
import { SupabaseClient } from "@supabase/supabase-js";
|
|
2
2
|
import { Database } from "../types/supabase";
|
|
3
3
|
import { RealtimeData } from "../types/realtime";
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
4
|
+
export type ScoutRealtimeAuthErrorMode = "stop" | "backoff";
|
|
5
|
+
export type ScoutRealtimeBroadcastOptions = {
|
|
6
|
+
/** `stop` prevents Phoenix rejoin loops on auth failure. */
|
|
7
|
+
authErrorRetry?: ScoutRealtimeAuthErrorMode;
|
|
8
|
+
backoffInitialMs?: number;
|
|
9
|
+
backoffMaxMs?: number;
|
|
10
|
+
backoffMaxAttempts?: number;
|
|
11
|
+
};
|
|
12
|
+
export declare function useScoutRealtimeBroadcast<T>(scoutSupabase: SupabaseClient<Database>, topics: string[], options?: ScoutRealtimeBroadcastOptions, rowFilter?: (row: T) => boolean): [RealtimeData<T> | null, () => void];
|