@adventurelabs/scout-core 1.5.4 → 2.0.0

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 (219) hide show
  1. package/README.md +47 -0
  2. package/dist/api_keys/actions.d.ts +0 -1
  3. package/dist/api_keys/actions.js +0 -14
  4. package/dist/client/index.d.ts +75 -0
  5. package/dist/client/index.js +82 -0
  6. package/dist/constants/index.d.ts +1 -0
  7. package/dist/constants/index.js +1 -0
  8. package/dist/helpers/analysis_usage/jobs_server.d.ts +25 -0
  9. package/dist/helpers/analysis_usage/jobs_server.js +10 -0
  10. package/dist/helpers/analysis_usage/tasks_server.d.ts +63 -0
  11. package/dist/helpers/analysis_usage/tasks_server.js +14 -0
  12. package/dist/helpers/artifacts.d.ts +0 -1
  13. package/dist/helpers/artifacts.js +10 -147
  14. package/dist/helpers/artifacts.queries.d.ts +26 -0
  15. package/dist/helpers/{artifacts.internal.js → artifacts.queries.js} +24 -41
  16. package/dist/helpers/auth.d.ts +1 -1
  17. package/dist/helpers/auth.js +2 -3
  18. package/dist/helpers/auth_server.d.ts +2 -0
  19. package/dist/helpers/auth_server.js +10 -0
  20. package/dist/helpers/certificates_server.d.ts +101 -0
  21. package/dist/helpers/certificates_server.js +42 -0
  22. package/dist/helpers/chat.d.ts +1 -2
  23. package/dist/helpers/chat.js +3 -38
  24. package/dist/helpers/chat.queries.d.ts +13 -0
  25. package/dist/helpers/chat.queries.js +39 -0
  26. package/dist/helpers/client_abilities_jwt_keys.js +0 -1
  27. package/dist/helpers/client_abilities_token_server.d.ts +1 -0
  28. package/dist/helpers/client_abilities_token_server.js +5 -2
  29. package/dist/helpers/connectivity.d.ts +1 -5
  30. package/dist/helpers/connectivity.js +7 -140
  31. package/dist/helpers/connectivity.queries.d.ts +18 -0
  32. package/dist/helpers/connectivity.queries.js +121 -0
  33. package/dist/helpers/contacts_server.d.ts +63 -0
  34. package/dist/helpers/contacts_server.js +18 -0
  35. package/dist/helpers/deviceTransfer.js +2 -11
  36. package/dist/helpers/deviceTransfer.queries.d.ts +4 -0
  37. package/dist/helpers/deviceTransfer.queries.js +11 -0
  38. package/dist/helpers/devices.js +4 -61
  39. package/dist/helpers/devices.queries.d.ts +4 -1
  40. package/dist/helpers/devices.queries.js +52 -0
  41. package/dist/helpers/document_templates.js +6 -52
  42. package/dist/helpers/document_templates.queries.d.ts +9 -0
  43. package/dist/helpers/document_templates.queries.js +56 -0
  44. package/dist/helpers/documents_server.d.ts +226 -0
  45. package/dist/helpers/documents_server.js +38 -0
  46. package/dist/helpers/email.d.ts +0 -6
  47. package/dist/helpers/email.js +1 -19
  48. package/dist/helpers/embeddings.d.ts +0 -5
  49. package/dist/helpers/embeddings.js +2 -19
  50. package/dist/helpers/embeddings.queries.d.ts +7 -0
  51. package/dist/helpers/{embeddings.internal.js → embeddings.queries.js} +2 -2
  52. package/dist/helpers/eventUtils.d.ts +3 -12
  53. package/dist/helpers/eventUtils.js +0 -10
  54. package/dist/helpers/events.d.ts +0 -1
  55. package/dist/helpers/events.js +7 -107
  56. package/dist/helpers/events.queries.d.ts +17 -0
  57. package/dist/helpers/{events.internal.js → events.queries.js} +24 -15
  58. package/dist/helpers/health_metrics.js +3 -38
  59. package/dist/helpers/health_metrics.queries.d.ts +12 -0
  60. package/dist/helpers/health_metrics.queries.js +39 -0
  61. package/dist/helpers/heartbeats.js +4 -83
  62. package/dist/helpers/heartbeats.queries.d.ts +11 -0
  63. package/dist/helpers/heartbeats.queries.js +76 -0
  64. package/dist/helpers/herd_allowed_domains.js +2 -12
  65. package/dist/helpers/{herd_allowed_domains_internal.d.ts → herd_allowed_domains.queries.d.ts} +1 -1
  66. package/dist/helpers/{herd_allowed_domains_internal.js → herd_allowed_domains.queries.js} +2 -2
  67. package/dist/helpers/herd_credentials_server.d.ts +76 -0
  68. package/dist/helpers/herd_credentials_server.js +22 -0
  69. package/dist/helpers/herd_modules.queries.js +10 -7
  70. package/dist/helpers/herd_roles.js +13 -148
  71. package/dist/helpers/herd_roles.queries.d.ts +18 -0
  72. package/dist/helpers/{herd_roles_internal.js → herd_roles.queries.js} +28 -28
  73. package/dist/helpers/herds.js +5 -47
  74. package/dist/helpers/herds.queries.d.ts +8 -1
  75. package/dist/helpers/herds.queries.js +48 -0
  76. package/dist/helpers/invitations.js +7 -58
  77. package/dist/helpers/invitations.queries.d.ts +10 -0
  78. package/dist/helpers/{invitations_internal.js → invitations.queries.js} +12 -12
  79. package/dist/helpers/issuers.js +6 -52
  80. package/dist/helpers/issuers.queries.d.ts +9 -0
  81. package/dist/helpers/issuers.queries.js +53 -0
  82. package/dist/helpers/layers.js +2 -20
  83. package/dist/helpers/layers.queries.d.ts +2 -1
  84. package/dist/helpers/layers.queries.js +9 -13
  85. package/dist/helpers/lifecycle_server.d.ts +175 -0
  86. package/dist/helpers/lifecycle_server.js +38 -0
  87. package/dist/helpers/localizations.js +5 -42
  88. package/dist/helpers/localizations.queries.d.ts +8 -0
  89. package/dist/helpers/localizations.queries.js +45 -0
  90. package/dist/helpers/maintenance_requests_server.d.ts +124 -0
  91. package/dist/helpers/maintenance_requests_server.js +34 -0
  92. package/dist/helpers/manufacturers.js +5 -43
  93. package/dist/helpers/manufacturers.queries.d.ts +10 -0
  94. package/dist/helpers/manufacturers.queries.js +46 -0
  95. package/dist/helpers/media_urls.d.ts +13 -0
  96. package/dist/helpers/media_urls.js +21 -0
  97. package/dist/helpers/models.js +8 -80
  98. package/dist/helpers/models.queries.d.ts +13 -0
  99. package/dist/helpers/models.queries.js +79 -0
  100. package/dist/helpers/observations_server.d.ts +51 -0
  101. package/dist/helpers/observations_server.js +22 -0
  102. package/dist/helpers/operating_contexts.js +39 -154
  103. package/dist/helpers/operating_contexts.queries.d.ts +48 -0
  104. package/dist/helpers/operating_contexts.queries.js +223 -0
  105. package/dist/helpers/operators.js +4 -57
  106. package/dist/helpers/operators.queries.d.ts +7 -0
  107. package/dist/helpers/operators.queries.js +55 -0
  108. package/dist/helpers/parts.d.ts +0 -87
  109. package/dist/helpers/parts.js +4 -90
  110. package/dist/helpers/parts_server.d.ts +260 -0
  111. package/dist/helpers/parts_server.js +71 -0
  112. package/dist/helpers/pins_server.d.ts +118 -0
  113. package/dist/helpers/pins_server.js +38 -0
  114. package/dist/helpers/plans.js +4 -56
  115. package/dist/helpers/plans.queries.d.ts +4 -1
  116. package/dist/helpers/plans.queries.js +39 -12
  117. package/dist/helpers/points_for_user_server.d.ts +9 -0
  118. package/dist/helpers/points_for_user_server.js +14 -0
  119. package/dist/helpers/product_compatibilities.js +6 -78
  120. package/dist/helpers/product_compatibilities.queries.d.ts +9 -0
  121. package/dist/helpers/product_compatibilities.queries.js +83 -0
  122. package/dist/helpers/product_numbers.js +6 -55
  123. package/dist/helpers/product_numbers.queries.d.ts +9 -0
  124. package/dist/helpers/product_numbers.queries.js +58 -0
  125. package/dist/helpers/products.js +6 -54
  126. package/dist/helpers/products.queries.d.ts +11 -0
  127. package/dist/helpers/products.queries.js +58 -0
  128. package/dist/helpers/providers.js +5 -71
  129. package/dist/helpers/providers.queries.d.ts +5 -1
  130. package/dist/helpers/providers.queries.js +52 -11
  131. package/dist/helpers/pubsub_token_server.d.ts +1 -0
  132. package/dist/helpers/pubsub_token_server.js +5 -2
  133. package/dist/helpers/segmentations_sam3.js +5 -78
  134. package/dist/helpers/segmentations_sam3.queries.d.ts +16 -0
  135. package/dist/helpers/segmentations_sam3.queries.js +81 -0
  136. package/dist/helpers/sensor_poses_server.d.ts +98 -0
  137. package/dist/helpers/sensor_poses_server.js +26 -0
  138. package/dist/helpers/session_incidents_server.d.ts +106 -0
  139. package/dist/helpers/session_incidents_server.js +22 -0
  140. package/dist/helpers/session_summaries.d.ts +2 -0
  141. package/dist/helpers/session_summaries.js +7 -23
  142. package/dist/helpers/session_summaries.queries.d.ts +6 -3
  143. package/dist/helpers/session_summaries.queries.js +27 -0
  144. package/dist/helpers/sessions.js +8 -122
  145. package/dist/helpers/sessions.queries.d.ts +14 -2
  146. package/dist/helpers/sessions.queries.js +88 -1
  147. package/dist/helpers/storage.js +0 -1
  148. package/dist/helpers/supabase_auth.d.ts +6 -0
  149. package/dist/helpers/supabase_auth.js +37 -0
  150. package/dist/helpers/tags.d.ts +0 -1
  151. package/dist/helpers/tags.js +13 -559
  152. package/dist/helpers/tags.queries.d.ts +33 -0
  153. package/dist/helpers/tags.queries.js +454 -0
  154. package/dist/helpers/user_credentials_server.d.ts +76 -0
  155. package/dist/helpers/user_credentials_server.js +22 -0
  156. package/dist/helpers/users.d.ts +2 -2
  157. package/dist/helpers/users.js +8 -107
  158. package/dist/helpers/users.queries.d.ts +9 -1
  159. package/dist/helpers/users.queries.js +107 -0
  160. package/dist/helpers/versions_software.d.ts +3 -1
  161. package/dist/helpers/versions_software.js +24 -0
  162. package/dist/helpers/versions_software_server.d.ts +83 -4
  163. package/dist/helpers/versions_software_server.js +23 -50
  164. package/dist/helpers/zones.d.ts +1 -16
  165. package/dist/helpers/zones.js +4 -104
  166. package/dist/helpers/zones.queries.d.ts +6 -0
  167. package/dist/helpers/zones.queries.js +78 -0
  168. package/dist/hooks/useAuthorizedRealtimeTopics.js +8 -2
  169. package/dist/hooks/useInfiniteQuery.js +18 -14
  170. package/dist/hooks/useScoutRealtimeBroadcast.js +8 -6
  171. package/dist/hooks/useScoutRealtimeDocuments.js +3 -2
  172. package/dist/hooks/useScoutRefresh.d.ts +9 -25
  173. package/dist/hooks/useScoutRefresh.js +33 -213
  174. package/dist/providers/ScoutRefreshProvider.d.ts +1 -1
  175. package/dist/providers/ScoutRefreshProvider.js +56 -13
  176. package/dist/server/index.d.ts +77 -0
  177. package/dist/server/index.js +79 -0
  178. package/dist/server/middleware.d.ts +2 -0
  179. package/dist/server/middleware.js +2 -0
  180. package/dist/server/supabase.d.ts +2 -0
  181. package/dist/server/supabase.js +2 -0
  182. package/dist/store/api.d.ts +40 -40
  183. package/dist/store/api.js +38 -109
  184. package/dist/store/configureStore.d.ts +0 -55
  185. package/dist/store/configureStore.js +1 -8
  186. package/dist/store/hooks.js +1 -0
  187. package/dist/supabase/client.d.ts +3 -0
  188. package/dist/supabase/client.js +10 -0
  189. package/dist/supabase/middleware.d.ts +1 -0
  190. package/dist/supabase/middleware.js +6 -20
  191. package/dist/supabase/server.d.ts +7 -2
  192. package/dist/supabase/server.js +13 -1
  193. package/dist/types/db.d.ts +2 -2
  194. package/dist/types/index.d.ts +5 -0
  195. package/dist/types/index.js +5 -0
  196. package/package.json +53 -4
  197. package/dist/api_keys/index.d.ts +0 -1
  198. package/dist/api_keys/index.js +0 -1
  199. package/dist/helpers/artifacts.internal.d.ts +0 -22
  200. package/dist/helpers/client_abilities_jwt_keys_internal.d.ts +0 -9
  201. package/dist/helpers/client_abilities_jwt_keys_internal.js +0 -20
  202. package/dist/helpers/connectivity.internal.d.ts +0 -10
  203. package/dist/helpers/connectivity.internal.js +0 -47
  204. package/dist/helpers/credentials.d.ts +0 -9
  205. package/dist/helpers/credentials.js +0 -92
  206. package/dist/helpers/embeddings.internal.d.ts +0 -5
  207. package/dist/helpers/events.internal.d.ts +0 -13
  208. package/dist/helpers/herd_roles_internal.d.ts +0 -18
  209. package/dist/helpers/index.d.ts +0 -56
  210. package/dist/helpers/index.js +0 -56
  211. package/dist/helpers/invitations_internal.d.ts +0 -10
  212. package/dist/helpers/versions_software_internal.d.ts +0 -6
  213. package/dist/helpers/versions_software_internal.js +0 -53
  214. package/dist/hooks/useDeviceDisplayName.d.ts +0 -8
  215. package/dist/hooks/useDeviceDisplayName.js +0 -49
  216. package/dist/index.d.ts +0 -108
  217. package/dist/index.js +0 -114
  218. package/dist/supabase/index.d.ts +0 -2
  219. package/dist/supabase/index.js +0 -2
@@ -1,5 +1,13 @@
1
1
  import { SupabaseClient } from "@supabase/supabase-js";
2
- import { IUserAndRole } from "../types/db";
2
+ import { IUser, IUserAndRole, IUserProfileRow, IUserRolePerHerd } from "../types/db";
3
3
  import { Database } from "../types/supabase";
4
4
  import { IWebResponseCompatible } from "../types/requests";
5
+ export type UserProfileUpdate = Database["public"]["Tables"]["users"]["Update"];
6
+ export declare function get_user_roles_query(client: SupabaseClient<Database>, herd_id: number): Promise<IWebResponseCompatible<IUserRolePerHerd[]>>;
7
+ export declare function get_user_query(client: SupabaseClient<Database>): Promise<IWebResponseCompatible<IUser | null>>;
8
+ export declare function get_users_with_herd_access_query(client: SupabaseClient<Database>, herd_id: number): Promise<IWebResponseCompatible<IUserAndRole[]>>;
5
9
  export declare function get_users_with_herd_access_batch_query(client: SupabaseClient<Database>, herd_ids: number[]): Promise<IWebResponseCompatible<Record<number, IUserAndRole[]>>>;
10
+ export declare function upsert_user_herd_role_query(client: SupabaseClient<Database>, herd_id: number, username: string, herd_role_id: number): Promise<IWebResponseCompatible<IUserAndRole | null>>;
11
+ export declare function update_user_profile_query(client: SupabaseClient<Database>, user_id: string, patch: UserProfileUpdate): Promise<IWebResponseCompatible<IUserProfileRow | null>>;
12
+ export declare function leave_herd_for_current_user_query(client: SupabaseClient<Database>, herd_id: number): Promise<IWebResponseCompatible<IUserRolePerHerd | null>>;
13
+ export declare function remove_user_from_herd_for_admin_query(client: SupabaseClient<Database>, herd_id: number, user_id: string): Promise<IWebResponseCompatible<IUserRolePerHerd | null>>;
@@ -1,4 +1,42 @@
1
1
  import { EnumWebResponse, IWebResponse, } from "../types/requests";
2
+ export async function get_user_roles_query(client, herd_id) {
3
+ const { data } = await client
4
+ .from("users_roles_per_herd")
5
+ .select("*")
6
+ .eq("herd_id", herd_id);
7
+ if (!data) {
8
+ return {
9
+ status: EnumWebResponse.ERROR,
10
+ msg: `No user role found for herd ${herd_id}`,
11
+ data: null,
12
+ };
13
+ }
14
+ return IWebResponse.success(data).to_compatible();
15
+ }
16
+ export async function get_user_query(client) {
17
+ const { data } = await client.auth.getUser();
18
+ const new_user = data.user;
19
+ return IWebResponse.success(new_user).to_compatible();
20
+ }
21
+ export async function get_users_with_herd_access_query(client, herd_id) {
22
+ const { data, error } = await client
23
+ .from("users_roles_per_herd")
24
+ .select(`
25
+ herd_role_id,
26
+ herd_roles (*),
27
+ users!users_roles_per_herd_user_id_fkey (*)
28
+ `)
29
+ .eq("herd_id", herd_id);
30
+ if (error) {
31
+ return { status: EnumWebResponse.ERROR, msg: error.message, data: null };
32
+ }
33
+ const transformedData = (data ?? []).map((item) => ({
34
+ user: item.users,
35
+ herd_role_id: item.herd_role_id,
36
+ herd_role: item.herd_roles,
37
+ }));
38
+ return IWebResponse.success(transformedData).to_compatible();
39
+ }
2
40
  export async function get_users_with_herd_access_batch_query(client, herd_ids) {
3
41
  var _a;
4
42
  if (herd_ids.length === 0) {
@@ -28,3 +66,72 @@ export async function get_users_with_herd_access_batch_query(client, herd_ids) {
28
66
  }
29
67
  return IWebResponse.success(grouped).to_compatible();
30
68
  }
69
+ export async function upsert_user_herd_role_query(client, herd_id, username, herd_role_id) {
70
+ const { data: user, error: user_error } = await client
71
+ .from("users")
72
+ .select("*")
73
+ .eq("username", username)
74
+ .single();
75
+ if (user_error) {
76
+ return IWebResponse.error("Unable to fetch user with provided username").to_compatible();
77
+ }
78
+ if (!user) {
79
+ return IWebResponse.error("User not found").to_compatible();
80
+ }
81
+ const { data: herdRole, error: role_error } = await client
82
+ .from("herd_roles")
83
+ .select("*")
84
+ .eq("id", herd_role_id)
85
+ .eq("herd_id", herd_id)
86
+ .single();
87
+ if (role_error || !herdRole) {
88
+ return IWebResponse.error("Invalid herd role for this herd").to_compatible();
89
+ }
90
+ const { error } = await client.from("users_roles_per_herd").upsert({
91
+ user_id: user.id,
92
+ herd_id,
93
+ herd_role_id,
94
+ });
95
+ if (error) {
96
+ return IWebResponse.error("Unable to update or add user with provided username. Ensure you have sufficient permissions.").to_compatible();
97
+ }
98
+ return IWebResponse.success({
99
+ user,
100
+ herd_role_id,
101
+ herd_role: herdRole,
102
+ }).to_compatible();
103
+ }
104
+ export async function update_user_profile_query(client, user_id, patch) {
105
+ const { data, error } = await client
106
+ .from("users")
107
+ .update(patch)
108
+ .eq("id", user_id)
109
+ .select("*")
110
+ .single();
111
+ if (error) {
112
+ return IWebResponse.error(error.message).to_compatible();
113
+ }
114
+ if (!data) {
115
+ return IWebResponse.error("User not found or profile update failed").to_compatible();
116
+ }
117
+ return IWebResponse.success(data).to_compatible();
118
+ }
119
+ export async function leave_herd_for_current_user_query(client, herd_id) {
120
+ const { data, error } = await client.rpc("leave_herd_for_current_user", {
121
+ p_herd_id: herd_id,
122
+ });
123
+ if (error) {
124
+ return IWebResponse.error(error.message).to_compatible();
125
+ }
126
+ return IWebResponse.success(data).to_compatible();
127
+ }
128
+ export async function remove_user_from_herd_for_admin_query(client, herd_id, user_id) {
129
+ const { data, error } = await client.rpc("remove_user_from_herd_for_admin", {
130
+ p_herd_id: herd_id,
131
+ p_user_id: user_id,
132
+ });
133
+ if (error) {
134
+ return IWebResponse.error(error.message).to_compatible();
135
+ }
136
+ return IWebResponse.success(data).to_compatible();
137
+ }
@@ -1,9 +1,11 @@
1
1
  import { Database } from "../types/supabase";
2
- import { IVersionsSoftware, VersionsSoftwareInsert } from "../types/db";
2
+ import { IVersionsSoftware, IVersionsSoftwareWithBuildUrl, VersionsSoftwareInsert } from "../types/db";
3
3
  import { IWebResponseCompatible } from "../types/requests";
4
4
  import { SupabaseClient } from "@supabase/supabase-js";
5
5
  export declare function get_versions_software(client: SupabaseClient<Database>): Promise<IWebResponseCompatible<IVersionsSoftware[]>>;
6
6
  export declare function get_versions_software_by_system(client: SupabaseClient<Database>, system: string): Promise<IWebResponseCompatible<IVersionsSoftware[]>>;
7
+ export declare function get_versions_software_with_build_urls(client: SupabaseClient<Database>): Promise<IWebResponseCompatible<IVersionsSoftwareWithBuildUrl[]>>;
8
+ export declare function get_versions_software_by_system_with_build_urls(client: SupabaseClient<Database>, system: string): Promise<IWebResponseCompatible<IVersionsSoftwareWithBuildUrl[]>>;
7
9
  export declare function create_version_software(client: SupabaseClient<Database>, newVersionSoftware: VersionsSoftwareInsert): Promise<IWebResponseCompatible<IVersionsSoftware | null>>;
8
10
  export declare function update_version_software(client: SupabaseClient<Database>, version_id: number, updatedVersionSoftware: Partial<VersionsSoftwareInsert>): Promise<IWebResponseCompatible<IVersionsSoftware | null>>;
9
11
  export declare function delete_version_software(client: SupabaseClient<Database>, version_id: number): Promise<IWebResponseCompatible<IVersionsSoftware | null>>;
@@ -1,4 +1,14 @@
1
1
  import { IWebResponse } from "../types/requests";
2
+ import { createSignedUrlMap } from "./media_urls";
3
+ async function attachBuildArtifactUrls(client, versions) {
4
+ const urlsByPath = await createSignedUrlMap(client, versions.map((version) => version.path_build_artifact));
5
+ return versions.map((version) => ({
6
+ ...version,
7
+ build_artifact_url: version.path_build_artifact
8
+ ? urlsByPath.get(version.path_build_artifact) ?? null
9
+ : null,
10
+ }));
11
+ }
2
12
  export async function get_versions_software(client) {
3
13
  const { data, error } = await client
4
14
  .from("versions_software")
@@ -26,6 +36,20 @@ export async function get_versions_software_by_system(client, system) {
26
36
  }
27
37
  return IWebResponse.success(data).to_compatible();
28
38
  }
39
+ export async function get_versions_software_with_build_urls(client) {
40
+ const response = await get_versions_software(client);
41
+ if (!response.data) {
42
+ return IWebResponse.error(response.msg ?? "No software versions found").to_compatible();
43
+ }
44
+ return IWebResponse.success(await attachBuildArtifactUrls(client, response.data)).to_compatible();
45
+ }
46
+ export async function get_versions_software_by_system_with_build_urls(client, system) {
47
+ const response = await get_versions_software_by_system(client, system);
48
+ if (!response.data) {
49
+ return IWebResponse.error(response.msg ?? `No software versions found for system: ${system}`).to_compatible();
50
+ }
51
+ return IWebResponse.success(await attachBuildArtifactUrls(client, response.data)).to_compatible();
52
+ }
29
53
  export async function create_version_software(client, newVersionSoftware) {
30
54
  const { data, error } = await client
31
55
  .from("versions_software")
@@ -1,4 +1,83 @@
1
- import { IVersionsSoftwareWithBuildUrl } from "../types/db";
2
- import { IWebResponseCompatible } from "../types/requests";
3
- export declare function server_get_versions_software(): Promise<IWebResponseCompatible<IVersionsSoftwareWithBuildUrl[]>>;
4
- export declare function server_get_versions_software_by_system(system: string): Promise<IWebResponseCompatible<IVersionsSoftwareWithBuildUrl[]>>;
1
+ import { VersionsSoftwareInsert } from "../types/db";
2
+ export declare function server_get_versions_software(): Promise<import("../types").IWebResponseCompatible<{
3
+ broken: boolean;
4
+ commit_hash: string | null;
5
+ created_at: string;
6
+ description: string;
7
+ hyperlink: string | null;
8
+ id: number;
9
+ min: boolean;
10
+ path_build_artifact: string | null;
11
+ pre: boolean;
12
+ stable: boolean;
13
+ system: string;
14
+ title: string | null;
15
+ updated_at: string | null;
16
+ version: string;
17
+ }[]>>;
18
+ export declare function server_get_versions_software_by_system(system: string): Promise<import("../types").IWebResponseCompatible<{
19
+ broken: boolean;
20
+ commit_hash: string | null;
21
+ created_at: string;
22
+ description: string;
23
+ hyperlink: string | null;
24
+ id: number;
25
+ min: boolean;
26
+ path_build_artifact: string | null;
27
+ pre: boolean;
28
+ stable: boolean;
29
+ system: string;
30
+ title: string | null;
31
+ updated_at: string | null;
32
+ version: string;
33
+ }[]>>;
34
+ export declare function server_get_versions_software_with_build_urls(): Promise<import("../types").IWebResponseCompatible<import("../types").IVersionsSoftwareWithBuildUrl[]>>;
35
+ export declare function server_get_versions_software_by_system_with_build_urls(system: string): Promise<import("../types").IWebResponseCompatible<import("../types").IVersionsSoftwareWithBuildUrl[]>>;
36
+ export declare function server_create_version_software(newVersionSoftware: VersionsSoftwareInsert): Promise<import("../types").IWebResponseCompatible<{
37
+ broken: boolean;
38
+ commit_hash: string | null;
39
+ created_at: string;
40
+ description: string;
41
+ hyperlink: string | null;
42
+ id: number;
43
+ min: boolean;
44
+ path_build_artifact: string | null;
45
+ pre: boolean;
46
+ stable: boolean;
47
+ system: string;
48
+ title: string | null;
49
+ updated_at: string | null;
50
+ version: string;
51
+ } | null>>;
52
+ export declare function server_update_version_software(version_id: number, updatedVersionSoftware: Partial<VersionsSoftwareInsert>): Promise<import("../types").IWebResponseCompatible<{
53
+ broken: boolean;
54
+ commit_hash: string | null;
55
+ created_at: string;
56
+ description: string;
57
+ hyperlink: string | null;
58
+ id: number;
59
+ min: boolean;
60
+ path_build_artifact: string | null;
61
+ pre: boolean;
62
+ stable: boolean;
63
+ system: string;
64
+ title: string | null;
65
+ updated_at: string | null;
66
+ version: string;
67
+ } | null>>;
68
+ export declare function server_delete_version_software(version_id: number): Promise<import("../types").IWebResponseCompatible<{
69
+ broken: boolean;
70
+ commit_hash: string | null;
71
+ created_at: string;
72
+ description: string;
73
+ hyperlink: string | null;
74
+ id: number;
75
+ min: boolean;
76
+ path_build_artifact: string | null;
77
+ pre: boolean;
78
+ stable: boolean;
79
+ system: string;
80
+ title: string | null;
81
+ updated_at: string | null;
82
+ version: string;
83
+ } | null>>;
@@ -1,57 +1,30 @@
1
- "use server";
2
1
  import { newServerClient } from "../supabase/server";
3
- import { IWebResponse } from "../types/requests";
4
- import { generateSignedUrlsBatchWithClient } from "./storage_internal";
5
- async function attachBuildArtifactUrls(client, data) {
6
- const uniquePaths = Array.from(new Set(data
7
- .map((version) => version.path_build_artifact)
8
- .filter((path) => !!path)));
9
- if (uniquePaths.length === 0) {
10
- return data.map((version) => ({
11
- ...version,
12
- build_artifact_url: null,
13
- }));
14
- }
15
- const signedUrls = await generateSignedUrlsBatchWithClient(client, uniquePaths);
16
- const urlMap = new Map();
17
- uniquePaths.forEach((path, index) => {
18
- urlMap.set(path, signedUrls[index]);
19
- });
20
- return data.map((version) => ({
21
- ...version,
22
- build_artifact_url: version.path_build_artifact
23
- ? urlMap.get(version.path_build_artifact) ?? null
24
- : null,
25
- }));
26
- }
2
+ import { create_version_software, delete_version_software, get_versions_software, get_versions_software_by_system, get_versions_software_by_system_with_build_urls, get_versions_software_with_build_urls, update_version_software, } from "./versions_software";
27
3
  export async function server_get_versions_software() {
28
4
  const client = await newServerClient();
29
- const { data, error } = await client
30
- .from("versions_software")
31
- .select("*")
32
- .order("created_at", { ascending: false });
33
- if (error) {
34
- return IWebResponse.error(error.message).to_compatible();
35
- }
36
- if (!data) {
37
- return IWebResponse.error("No software versions found").to_compatible();
38
- }
39
- const withUrls = await attachBuildArtifactUrls(client, data);
40
- return IWebResponse.success(withUrls).to_compatible();
5
+ return get_versions_software(client);
41
6
  }
42
7
  export async function server_get_versions_software_by_system(system) {
43
8
  const client = await newServerClient();
44
- const { data, error } = await client
45
- .from("versions_software")
46
- .select("*")
47
- .eq("system", system)
48
- .order("created_at", { ascending: false });
49
- if (error) {
50
- return IWebResponse.error(error.message).to_compatible();
51
- }
52
- if (!data) {
53
- return IWebResponse.error(`No software versions found for system: ${system}`).to_compatible();
54
- }
55
- const withUrls = await attachBuildArtifactUrls(client, data);
56
- return IWebResponse.success(withUrls).to_compatible();
9
+ return get_versions_software_by_system(client, system);
10
+ }
11
+ export async function server_get_versions_software_with_build_urls() {
12
+ const client = await newServerClient();
13
+ return get_versions_software_with_build_urls(client);
14
+ }
15
+ export async function server_get_versions_software_by_system_with_build_urls(system) {
16
+ const client = await newServerClient();
17
+ return get_versions_software_by_system_with_build_urls(client, system);
18
+ }
19
+ export async function server_create_version_software(newVersionSoftware) {
20
+ const client = await newServerClient();
21
+ return create_version_software(client, newVersionSoftware);
22
+ }
23
+ export async function server_update_version_software(version_id, updatedVersionSoftware) {
24
+ const client = await newServerClient();
25
+ return update_version_software(client, version_id, updatedVersionSoftware);
26
+ }
27
+ export async function server_delete_version_software(version_id) {
28
+ const client = await newServerClient();
29
+ return delete_version_software(client, version_id);
57
30
  }
@@ -1,19 +1,4 @@
1
1
  import { IZoneWithActions } from "../types/db";
2
2
  import { IWebResponseCompatible } from "../types/requests";
3
- import { SupabaseClient } from "@supabase/supabase-js";
4
- /**
5
- * Get more zones and actions for a herd
6
- * @param herd_id - The ID of the herd to get zones and actions for
7
- * @param offset - The offset to start the query from
8
- * @param page_count - The number of zones and actions to return
9
- * @returns A list of zones and actions
10
- * @throws An error if the zones or actions are not fetched
11
- */
12
- export declare function server_get_more_zones_and_actions_for_herd(herd_id: number, offset: number, page_count?: number, client?: SupabaseClient): Promise<IWebResponseCompatible<IZoneWithActions[]>>;
13
- /**
14
- * Create zones and actions for a herd
15
- * @param zones - The zones to create
16
- * @returns A list of zones and actions
17
- * @throws An error if the zones or actions are not created
18
- */
3
+ export declare function server_get_more_zones_and_actions_for_herd(herd_id: number, offset: number, page_count?: number): Promise<IWebResponseCompatible<IZoneWithActions[]>>;
19
4
  export declare function server_create_zones_with_actions(zones: IZoneWithActions[]): Promise<IWebResponseCompatible<IZoneWithActions[]>>;
@@ -1,108 +1,8 @@
1
1
  import { newServerClient } from "../supabase/server";
2
- import { EnumWebResponse, IWebResponse, } from "../types/requests";
3
- /**
4
- * Get more zones and actions for a herd
5
- * @param herd_id - The ID of the herd to get zones and actions for
6
- * @param offset - The offset to start the query from
7
- * @param page_count - The number of zones and actions to return
8
- * @returns A list of zones and actions
9
- * @throws An error if the zones or actions are not fetched
10
- */
11
- export async function server_get_more_zones_and_actions_for_herd(herd_id, offset, page_count = 10, client) {
12
- const from = offset * page_count;
13
- const to = from + page_count - 1;
14
- const supabase = client || (await newServerClient());
15
- // make rpc call to get_events_with_tags_for_herd(herd_id, offset, limit)
16
- const { data, error } = await supabase.rpc("get_zones_and_actions_for_herd", {
17
- herd_id_caller: herd_id,
18
- offset_caller: from,
19
- limit_caller: page_count,
20
- });
21
- if (error) {
22
- console.warn("Error fetching zones and actions for herd:", error.message);
23
- return {
24
- status: EnumWebResponse.ERROR,
25
- msg: error.message,
26
- data: [],
27
- };
28
- }
29
- return IWebResponse.success(data.map((zone) => ({
30
- ...zone,
31
- actions: zone.actions ?? [],
32
- }))).to_compatible();
2
+ import { create_zones_with_actions_query, get_more_zones_and_actions_for_herd_query, } from "./zones.queries";
3
+ export async function server_get_more_zones_and_actions_for_herd(herd_id, offset, page_count = 10) {
4
+ return get_more_zones_and_actions_for_herd_query(await newServerClient(), herd_id, offset, page_count);
33
5
  }
34
- /**
35
- * Create zones and actions for a herd
36
- * @param zones - The zones to create
37
- * @returns A list of zones and actions
38
- * @throws An error if the zones or actions are not created
39
- */
40
6
  export async function server_create_zones_with_actions(zones) {
41
- // loop through plans and format
42
- let actions = zones.flatMap((zone) => zone.actions);
43
- let formatted_zones = zones.map((zone) => {
44
- let formatted_zone = { ...zone };
45
- delete formatted_zone.id;
46
- delete formatted_zone.inserted_at;
47
- delete formatted_zone.actions;
48
- return formatted_zone;
49
- });
50
- let formatted_actions = actions.map((action) => {
51
- let formatted_action = { ...action };
52
- delete formatted_action.id;
53
- delete formatted_action.zone_id;
54
- delete formatted_action.inserted_at;
55
- return formatted_action;
56
- });
57
- const supabase = await newServerClient();
58
- // insert data and return the response
59
- const { data, error } = await supabase
60
- .from("zones")
61
- .insert(formatted_zones)
62
- .select("*");
63
- if (error) {
64
- let msg = `Error creating zones: ${error.message}`;
65
- return {
66
- status: EnumWebResponse.ERROR,
67
- msg: msg,
68
- data: null,
69
- };
70
- }
71
- // get zone id
72
- let zone_ids = data.map((zone) => {
73
- return zone.id;
74
- });
75
- // if zone ids length is zero, return error
76
- if (zone_ids.length === 0) {
77
- return {
78
- status: EnumWebResponse.ERROR,
79
- msg: "No zones created",
80
- data: null,
81
- };
82
- }
83
- // add zone id to formatted actions
84
- formatted_actions.forEach((action) => {
85
- action.zone_id = zone_ids[0];
86
- });
87
- // insert actions
88
- const { data: data_actions, error: error_actions } = await supabase
89
- .from("actions")
90
- .insert(formatted_actions)
91
- .select("*");
92
- if (error_actions) {
93
- let msg = `Error creating actions: ${error_actions.message}`;
94
- return {
95
- status: EnumWebResponse.ERROR,
96
- msg: msg,
97
- data: null,
98
- };
99
- }
100
- // merge data and data_actions
101
- const merged_data = data.map((zone) => {
102
- return {
103
- ...zone,
104
- actions: data_actions.filter((action) => action.zone_id === zone.id),
105
- };
106
- });
107
- return IWebResponse.success(merged_data).to_compatible();
7
+ return create_zones_with_actions_query(await newServerClient(), zones);
108
8
  }
@@ -0,0 +1,6 @@
1
+ import { SupabaseClient } from "@supabase/supabase-js";
2
+ import { IZoneWithActions } from "../types/db";
3
+ import { IWebResponseCompatible } from "../types/requests";
4
+ import { Database } from "../types/supabase";
5
+ export declare function get_more_zones_and_actions_for_herd_query(client: SupabaseClient<Database>, herd_id: number, offset: number, page_count?: number): Promise<IWebResponseCompatible<IZoneWithActions[]>>;
6
+ export declare function create_zones_with_actions_query(client: SupabaseClient<Database>, zones: IZoneWithActions[]): Promise<IWebResponseCompatible<IZoneWithActions[]>>;
@@ -0,0 +1,78 @@
1
+ import { EnumWebResponse, IWebResponse, } from "../types/requests";
2
+ export async function get_more_zones_and_actions_for_herd_query(client, herd_id, offset, page_count = 10) {
3
+ const from = offset * page_count;
4
+ const { data, error } = await client.rpc("get_zones_and_actions_for_herd", {
5
+ herd_id_caller: herd_id,
6
+ offset_caller: from,
7
+ limit_caller: page_count,
8
+ });
9
+ if (error) {
10
+ console.warn("Error fetching zones and actions for herd:", error.message);
11
+ return {
12
+ status: EnumWebResponse.ERROR,
13
+ msg: error.message,
14
+ data: [],
15
+ };
16
+ }
17
+ return IWebResponse.success((data ?? []).map((zone) => ({
18
+ ...zone,
19
+ actions: zone.actions ?? [],
20
+ }))).to_compatible();
21
+ }
22
+ export async function create_zones_with_actions_query(client, zones) {
23
+ const actions = zones.flatMap((zone) => zone.actions);
24
+ const formatted_zones = zones.map((zone) => {
25
+ const formatted_zone = { ...zone };
26
+ delete formatted_zone.id;
27
+ delete formatted_zone.inserted_at;
28
+ delete formatted_zone.actions;
29
+ return formatted_zone;
30
+ });
31
+ const formatted_actions = actions.map((action) => {
32
+ const formatted_action = { ...action };
33
+ delete formatted_action.id;
34
+ delete formatted_action.zone_id;
35
+ delete formatted_action.inserted_at;
36
+ return formatted_action;
37
+ });
38
+ const { data, error } = await client
39
+ .from("zones")
40
+ .insert(formatted_zones)
41
+ .select("*");
42
+ if (error) {
43
+ const msg = `Error creating zones: ${error.message}`;
44
+ return {
45
+ status: EnumWebResponse.ERROR,
46
+ msg,
47
+ data: null,
48
+ };
49
+ }
50
+ const zone_ids = data.map((zone) => zone.id);
51
+ if (zone_ids.length === 0) {
52
+ return {
53
+ status: EnumWebResponse.ERROR,
54
+ msg: "No zones created",
55
+ data: null,
56
+ };
57
+ }
58
+ formatted_actions.forEach((action) => {
59
+ action.zone_id = zone_ids[0];
60
+ });
61
+ const { data: data_actions, error: error_actions } = await client
62
+ .from("actions")
63
+ .insert(formatted_actions)
64
+ .select("*");
65
+ if (error_actions) {
66
+ const msg = `Error creating actions: ${error_actions.message}`;
67
+ return {
68
+ status: EnumWebResponse.ERROR,
69
+ msg,
70
+ data: null,
71
+ };
72
+ }
73
+ const merged_data = data.map((zone) => ({
74
+ ...zone,
75
+ actions: data_actions.filter((action) => action.zone_id === zone.id),
76
+ }));
77
+ return IWebResponse.success(merged_data).to_compatible();
78
+ }
@@ -1,14 +1,20 @@
1
1
  "use client";
2
- import { useMemo } from "react";
2
+ import { useMemo, useRef } from "react";
3
3
  import { filter_realtime_topics } from "../helpers/realtime_topic_access";
4
4
  import { useOptionalClientAbilitiesMint } from "../providers/ScoutRefreshProvider";
5
5
  export function useAuthorizedRealtimeTopics(topics) {
6
6
  const abilities = useOptionalClientAbilitiesMint();
7
7
  const topicsKey = topics.join("|");
8
- return useMemo(() => {
8
+ const filteredTopics = useMemo(() => {
9
9
  const requested = topicsKey.split("|").filter(Boolean);
10
10
  if (!abilities)
11
11
  return requested;
12
12
  return filter_realtime_topics(abilities.status, abilities.mint, requested);
13
13
  }, [abilities, topicsKey]);
14
+ const filteredKey = filteredTopics.join("|");
15
+ const stableTopicsRef = useRef({ key: filteredKey, topics: filteredTopics });
16
+ if (stableTopicsRef.current.key !== filteredKey) {
17
+ stableTopicsRef.current = { key: filteredKey, topics: filteredTopics };
18
+ }
19
+ return stableTopicsRef.current.topics;
14
20
  }
@@ -1,3 +1,4 @@
1
+ "use client";
1
2
  import { useState, useCallback, useMemo, useEffect, useRef } from "react";
2
3
  import { useGetSessionsInfiniteByHerdQuery, useGetSessionsInfiniteByDeviceQuery, useGetEventsInfiniteByHerdQuery, useGetEventsInfiniteByDeviceQuery, useGetArtifactsInfiniteByHerdQuery, useGetArtifactsInfiniteByDeviceQuery, useGetFeedInfiniteByHerdQuery, useGetFeedInfiniteByDeviceQuery, useGetAnalysisJobsInfiniteQuery, useGetAnalysisTasksInfiniteQuery, } from "../store/api";
3
4
  function useInfiniteFiltersKey(options) {
@@ -773,10 +774,13 @@ export const useInfiniteFeedByDevice = (deviceId, options) => {
773
774
  }
774
775
  return prev;
775
776
  });
776
- if (hasMore && nextCursor != null) {
777
- setCurrentCursor(nextCursor);
778
- }
779
- }, [currentQuery.data, currentQuery.isLoading, cursorForQuery, pages.length, options.limit]);
777
+ }, [
778
+ currentQuery.data,
779
+ currentQuery.isLoading,
780
+ cursorForQuery,
781
+ pages.length,
782
+ options.limit,
783
+ ]);
780
784
  const loadMore = useCallback(() => {
781
785
  if (lastResult?.hasMore &&
782
786
  lastResult.nextCursor != null &&
@@ -952,26 +956,26 @@ export const useInfiniteAnalysisTasks = (options) => {
952
956
  error: currentQuery.error,
953
957
  };
954
958
  };
955
- // =====================================================
956
- // INTERSECTION OBSERVER HOOK FOR AUTO-LOADING
957
- // =====================================================
958
959
  export const useIntersectionObserver = (callback, options = {}) => {
959
960
  const [element, setElement] = useState(null);
961
+ const root = options.root ?? null;
962
+ const rootMargin = options.rootMargin ?? "0px";
963
+ const thresholdKey = (Array.isArray(options.threshold)
964
+ ? options.threshold
965
+ : [options.threshold ?? 0.1]).join(",");
960
966
  useEffect(() => {
961
967
  if (!element)
962
968
  return;
969
+ const thresholds = thresholdKey.split(",").map(Number);
970
+ const threshold = thresholds.length === 1 ? thresholds[0] : thresholds;
963
971
  const observer = new IntersectionObserver((entries) => {
964
972
  const first = entries[0];
965
973
  if (first.isIntersecting) {
966
974
  callback();
967
975
  }
968
- }, { threshold: 0.1, ...options });
976
+ }, { root, rootMargin, threshold });
969
977
  observer.observe(element);
970
- return () => {
971
- if (element) {
972
- observer.unobserve(element);
973
- }
974
- };
975
- }, [element, callback, options]);
978
+ return () => observer.disconnect();
979
+ }, [element, callback, root, rootMargin, thresholdKey]);
976
980
  return setElement;
977
981
  };