@adventurelabs/scout-core 1.0.74 → 1.0.77

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.
@@ -1,11 +1,10 @@
1
1
  import { IWebResponseCompatible } from "../types/requests";
2
- import { SupabaseClient } from "@supabase/supabase-js";
3
2
  import { TablesInsert } from "../types/supabase";
4
3
  export type ChatMessageInsert = TablesInsert<"chat">;
5
- export declare function insert_chat_message(supabaseClient: SupabaseClient, message: string, herd_id: number, sender?: string): Promise<IWebResponseCompatible<{
4
+ export declare function server_insert_chat_message(message: string, herd_id: number, sender?: string): Promise<IWebResponseCompatible<{
6
5
  id: number;
7
6
  }>>;
8
- export declare function get_chat_messages(supabaseClient: SupabaseClient, limit: number | undefined, offset: number | undefined, herd_id: number): Promise<IWebResponseCompatible<Array<{
7
+ export declare function server_get_chat_messages(limit: number | undefined, offset: number | undefined, herd_id: number): Promise<IWebResponseCompatible<Array<{
9
8
  id: number;
10
9
  message: string;
11
10
  sender: string | null;
@@ -1,29 +1,43 @@
1
- import { IWebResponse } from "../types/requests";
2
- export async function insert_chat_message(supabaseClient, message, herd_id, sender) {
1
+ "use server";
2
+ import { newServerClient } from "../supabase/server";
3
+ import { IWebResponse, EnumWebResponse } from "../types/requests";
4
+ export async function server_insert_chat_message(message, herd_id, sender) {
5
+ const supabase = await newServerClient();
3
6
  const chatMessage = {
4
7
  message,
5
8
  herd_id,
6
9
  sender: sender || null,
7
10
  };
8
- const { data, error } = await supabaseClient
11
+ const { data, error } = await supabase
9
12
  .from("chat")
10
13
  .insert(chatMessage)
11
14
  .select("id")
12
15
  .single();
13
16
  if (error) {
14
- return IWebResponse.error(`Failed to insert chat message: ${error.message}`).to_compatible();
17
+ console.warn("Error inserting chat message:", error.message);
18
+ return {
19
+ status: EnumWebResponse.ERROR,
20
+ msg: `Failed to insert chat message: ${error.message}`,
21
+ data: null,
22
+ };
15
23
  }
16
24
  return IWebResponse.success({ id: data.id }).to_compatible();
17
25
  }
18
- export async function get_chat_messages(supabaseClient, limit = 50, offset = 0, herd_id) {
19
- const { data, error } = await supabaseClient
26
+ export async function server_get_chat_messages(limit = 50, offset = 0, herd_id) {
27
+ const supabase = await newServerClient();
28
+ const { data, error } = await supabase
20
29
  .from("chat")
21
30
  .select("id, message, sender, created_at")
22
31
  .order("created_at", { ascending: false })
23
32
  .range(offset, offset + limit - 1)
24
33
  .eq("herd_id", herd_id);
25
34
  if (error) {
26
- return IWebResponse.error(`Failed to fetch chat messages: ${error.message}`).to_compatible();
35
+ console.warn("Error fetching chat messages:", error.message);
36
+ return {
37
+ status: EnumWebResponse.ERROR,
38
+ msg: `Failed to fetch chat messages: ${error.message}`,
39
+ data: [],
40
+ };
27
41
  }
28
42
  return IWebResponse.success(data || []).to_compatible();
29
43
  }
@@ -1,6 +1,5 @@
1
- import { SupabaseClient } from "@supabase/supabase-js";
2
- import { Database } from "../types/supabase";
3
- import { ISession, IConnectivity, IEvent, ISessionWithCoordinates, IConnectivityWithCoordinates, IEventAndTagsPrettyLocation, ScoutDatabaseClient } from "../types/db";
1
+ import { ISession, IConnectivity, IEvent, ISessionWithCoordinates, IConnectivityWithCoordinates, IEventAndTagsPrettyLocation } from "../types/db";
2
+ import { IWebResponseCompatible } from "../types/requests";
4
3
  export type SessionInput = Omit<ISession, "id" | "inserted_at">;
5
4
  export type SessionUpdateInput = Partial<SessionInput> & {
6
5
  id: number;
@@ -11,28 +10,28 @@ export type ConnectivityUpdateInput = Partial<ConnectivityInput> & {
11
10
  id: number;
12
11
  };
13
12
  export type ConnectivityUpsertInput = ConnectivityInput | ConnectivityUpdateInput;
14
- export declare function getSessionsByHerdId(supabase: SupabaseClient<Database, "public">, herdId: number): Promise<ISessionWithCoordinates[]>;
15
- export declare function getConnectivityBySessionId(supabase: SupabaseClient<Database, "public">, sessionId: number): Promise<IConnectivityWithCoordinates[]>;
16
- export declare function getEventsBySessionId(supabase: SupabaseClient<Database, "public">, sessionId: number): Promise<IEvent[]>;
17
- export declare function getEventsAndTagsBySessionId(supabase: SupabaseClient<Database, "public">, sessionId: number, limit?: number, offset?: number): Promise<IEventAndTagsPrettyLocation[]>;
18
- export declare function getTotalEventsForSession(supabase: SupabaseClient<Database, "public">, sessionId: number): Promise<number>;
19
- export declare function upsertSession(supabase: SupabaseClient<Database, "public">, sessionData: SessionUpsertInput): Promise<ISession>;
20
- export declare function upsertSessions(supabase: SupabaseClient<Database, "public">, sessionsData: SessionUpsertInput[]): Promise<ISession[]>;
21
- export declare function upsertConnectivity(supabase: SupabaseClient<Database, "public">, connectivityData: ConnectivityUpsertInput): Promise<IConnectivity>;
22
- export declare function upsertConnectivityBatch(supabase: SupabaseClient<Database, "public">, connectivityDataArray: ConnectivityUpsertInput[]): Promise<IConnectivity[]>;
23
- export declare function getSessionWithConnectivityAndEvents(supabase: ScoutDatabaseClient, sessionId: number, herdId?: number): Promise<{
13
+ export declare function server_get_sessions_by_herd_id(herdId: number): Promise<IWebResponseCompatible<ISessionWithCoordinates[]>>;
14
+ export declare function server_get_connectivity_by_session_id(sessionId: number): Promise<IWebResponseCompatible<IConnectivityWithCoordinates[]>>;
15
+ export declare function server_get_events_by_session_id(sessionId: number): Promise<IWebResponseCompatible<IEvent[]>>;
16
+ export declare function server_get_events_and_tags_by_session_id(sessionId: number, limit?: number, offset?: number): Promise<IWebResponseCompatible<IEventAndTagsPrettyLocation[]>>;
17
+ export declare function server_get_total_events_for_session(sessionId: number): Promise<IWebResponseCompatible<number>>;
18
+ export declare function server_upsert_session(sessionData: SessionUpsertInput): Promise<IWebResponseCompatible<ISession>>;
19
+ export declare function server_upsert_sessions(sessionsData: SessionUpsertInput[]): Promise<IWebResponseCompatible<ISession[]>>;
20
+ export declare function server_upsert_connectivity(connectivityData: ConnectivityUpsertInput): Promise<IWebResponseCompatible<IConnectivity>>;
21
+ export declare function server_upsert_connectivity_batch(connectivityDataArray: ConnectivityUpsertInput[]): Promise<IWebResponseCompatible<IConnectivity[]>>;
22
+ export declare function server_get_session_with_connectivity_and_events(sessionId: number, herdId?: number): Promise<IWebResponseCompatible<{
24
23
  session: ISessionWithCoordinates | null;
25
24
  connectivity: IConnectivityWithCoordinates[];
26
25
  events: IEvent[];
27
- }>;
28
- export declare function getSessionWithConnectivityAndEventsWithTags(supabase: ScoutDatabaseClient, sessionId: number, limit?: number, offset?: number, herdId?: number): Promise<{
26
+ }>>;
27
+ export declare function server_get_session_with_connectivity_and_events_with_tags(sessionId: number, limit?: number, offset?: number, herdId?: number): Promise<IWebResponseCompatible<{
29
28
  session: ISessionWithCoordinates | null;
30
29
  connectivity: IConnectivityWithCoordinates[];
31
30
  eventsWithTags: IEventAndTagsPrettyLocation[];
32
31
  totalEvents: number;
33
- }>;
34
- export declare function getSessionsByDeviceId(supabase: ScoutDatabaseClient, deviceId: number): Promise<ISessionWithCoordinates[]>;
35
- export declare function deleteSession(supabase: ScoutDatabaseClient, sessionId: number): Promise<void>;
36
- export declare function deleteSessions(supabase: ScoutDatabaseClient, sessionIds: number[]): Promise<void>;
37
- export declare function deleteConnectivity(supabase: ScoutDatabaseClient, connectivityId: number): Promise<void>;
38
- export declare function deleteConnectivityBatch(supabase: ScoutDatabaseClient, connectivityIds: number[]): Promise<void>;
32
+ }>>;
33
+ export declare function server_get_sessions_by_device_id(deviceId: number): Promise<IWebResponseCompatible<ISessionWithCoordinates[]>>;
34
+ export declare function server_delete_session(sessionId: number): Promise<IWebResponseCompatible<boolean>>;
35
+ export declare function server_delete_sessions(sessionIds: number[]): Promise<IWebResponseCompatible<boolean>>;
36
+ export declare function server_delete_connectivity(connectivityId: number): Promise<IWebResponseCompatible<boolean>>;
37
+ export declare function server_delete_connectivity_batch(connectivityIds: number[]): Promise<IWebResponseCompatible<boolean>>;
@@ -1,10 +1,19 @@
1
+ "use server";
2
+ import { newServerClient } from "../supabase/server";
3
+ import { EnumWebResponse, IWebResponse, } from "../types/requests";
1
4
  // Get sessions by herd id using RPC function with coordinates
2
- export async function getSessionsByHerdId(supabase, herdId) {
5
+ export async function server_get_sessions_by_herd_id(herdId) {
6
+ const supabase = await newServerClient();
3
7
  const { data, error } = await supabase.rpc("get_sessions_with_coordinates", {
4
8
  herd_id_caller: herdId,
5
9
  });
6
10
  if (error) {
7
- throw new Error(`Failed to get sessions by herd id: ${error.message}`);
11
+ console.warn("Error fetching sessions by herd id:", error.message);
12
+ return {
13
+ status: EnumWebResponse.ERROR,
14
+ msg: error.message,
15
+ data: [],
16
+ };
8
17
  }
9
18
  // Sort by timestamp_start in descending order
10
19
  const sortedSessions = (data || []).sort((a, b) => {
@@ -13,13 +22,19 @@ export async function getSessionsByHerdId(supabase, herdId) {
13
22
  return (new Date(b.timestamp_start).getTime() -
14
23
  new Date(a.timestamp_start).getTime());
15
24
  });
16
- return sortedSessions;
25
+ return IWebResponse.success(sortedSessions).to_compatible();
17
26
  }
18
27
  // Get connectivity by session id using RPC function with coordinates
19
- export async function getConnectivityBySessionId(supabase, sessionId) {
28
+ export async function server_get_connectivity_by_session_id(sessionId) {
29
+ const supabase = await newServerClient();
20
30
  const { data, error } = await supabase.rpc("get_connectivity_with_coordinates", { session_id_caller: sessionId });
21
31
  if (error) {
22
- throw new Error(`Failed to get connectivity by session id: ${error.message}`);
32
+ console.warn("Error fetching connectivity by session id:", error.message);
33
+ return {
34
+ status: EnumWebResponse.ERROR,
35
+ msg: error.message,
36
+ data: [],
37
+ };
23
38
  }
24
39
  // Sort by timestamp_start in ascending order
25
40
  const sortedConnectivity = (data || []).sort((a, b) => {
@@ -28,44 +43,63 @@ export async function getConnectivityBySessionId(supabase, sessionId) {
28
43
  return (new Date(a.timestamp_start).getTime() -
29
44
  new Date(b.timestamp_start).getTime());
30
45
  });
31
- return sortedConnectivity;
46
+ return IWebResponse.success(sortedConnectivity).to_compatible();
32
47
  }
33
48
  // Get events by session id
34
- export async function getEventsBySessionId(supabase, sessionId) {
49
+ export async function server_get_events_by_session_id(sessionId) {
50
+ const supabase = await newServerClient();
35
51
  const { data, error } = await supabase
36
52
  .from("events")
37
53
  .select("*")
38
54
  .eq("session_id", sessionId)
39
55
  .order("timestamp_observation", { ascending: true });
40
56
  if (error) {
41
- throw new Error(`Failed to get events by session id: ${error.message}`);
57
+ console.warn("Error fetching events by session id:", error.message);
58
+ return {
59
+ status: EnumWebResponse.ERROR,
60
+ msg: error.message,
61
+ data: [],
62
+ };
42
63
  }
43
- return data || [];
64
+ return IWebResponse.success(data || []).to_compatible();
44
65
  }
45
66
  // Get events with tags by session id using RPC function
46
- export async function getEventsAndTagsBySessionId(supabase, sessionId, limit = 50, offset = 0) {
67
+ export async function server_get_events_and_tags_by_session_id(sessionId, limit = 50, offset = 0) {
68
+ const supabase = await newServerClient();
47
69
  const { data, error } = await supabase.rpc("get_events_and_tags_for_session", {
48
70
  session_id_caller: sessionId,
49
71
  limit_caller: limit,
50
72
  offset_caller: offset,
51
73
  });
52
74
  if (error) {
53
- throw new Error(`Failed to get events and tags by session id: ${error.message}`);
75
+ console.warn("Error fetching events and tags by session id:", error.message);
76
+ return {
77
+ status: EnumWebResponse.ERROR,
78
+ msg: error.message,
79
+ data: [],
80
+ };
54
81
  }
55
- return data || [];
82
+ return IWebResponse.success(data || []).to_compatible();
56
83
  }
57
84
  // Get total count of events for a session
58
- export async function getTotalEventsForSession(supabase, sessionId) {
85
+ export async function server_get_total_events_for_session(sessionId) {
86
+ const supabase = await newServerClient();
59
87
  const { data, error } = await supabase.rpc("get_total_events_for_session", {
60
88
  session_id_caller: sessionId,
61
89
  });
62
90
  if (error) {
63
- throw new Error(`Failed to get total events for session: ${error.message}`);
91
+ console.warn("Error fetching total events for session:", error.message);
92
+ return {
93
+ status: EnumWebResponse.ERROR,
94
+ msg: error.message,
95
+ data: 0,
96
+ };
64
97
  }
65
- return data || 0;
98
+ return IWebResponse.success(data || 0).to_compatible();
66
99
  }
67
100
  // Create or update session
68
- export async function upsertSession(supabase, sessionData) {
101
+ export async function server_upsert_session(sessionData) {
102
+ const supabase = await newServerClient();
69
103
  const isUpdate = "id" in sessionData;
70
104
  if (isUpdate) {
71
105
  // Update existing session
@@ -77,9 +111,14 @@ export async function upsertSession(supabase, sessionData) {
77
111
  .select()
78
112
  .single();
79
113
  if (error) {
80
- throw new Error(`Failed to update session: ${error.message}`);
114
+ console.warn("Error updating session:", error.message);
115
+ return {
116
+ status: EnumWebResponse.ERROR,
117
+ msg: error.message,
118
+ data: null,
119
+ };
81
120
  }
82
- return data;
121
+ return IWebResponse.success(data).to_compatible();
83
122
  }
84
123
  else {
85
124
  // Create new session
@@ -89,15 +128,21 @@ export async function upsertSession(supabase, sessionData) {
89
128
  .select()
90
129
  .single();
91
130
  if (error) {
92
- throw new Error(`Failed to create session: ${error.message}`);
131
+ console.warn("Error creating session:", error.message);
132
+ return {
133
+ status: EnumWebResponse.ERROR,
134
+ msg: error.message,
135
+ data: null,
136
+ };
93
137
  }
94
- return data;
138
+ return IWebResponse.success(data).to_compatible();
95
139
  }
96
140
  }
97
141
  // Batch upsert sessions
98
- export async function upsertSessions(supabase, sessionsData) {
142
+ export async function server_upsert_sessions(sessionsData) {
143
+ const supabase = await newServerClient();
99
144
  if (sessionsData.length === 0) {
100
- return [];
145
+ return IWebResponse.success([]).to_compatible();
101
146
  }
102
147
  // Separate updates and inserts
103
148
  const updates = sessionsData.filter((s) => "id" in s);
@@ -106,12 +151,12 @@ export async function upsertSessions(supabase, sessionsData) {
106
151
  // Handle updates
107
152
  if (updates.length > 0) {
108
153
  for (const sessionData of updates) {
109
- try {
110
- const result = await upsertSession(supabase, sessionData);
111
- results.push(result);
154
+ const updateResult = await server_upsert_session(sessionData);
155
+ if (updateResult.status === EnumWebResponse.SUCCESS && updateResult.data) {
156
+ results.push(updateResult.data);
112
157
  }
113
- catch (error) {
114
- throw new Error(`Failed to update session ${sessionData.id}: ${error}`);
158
+ else {
159
+ console.warn(`Failed to update session ${sessionData.id}:`, updateResult.msg);
115
160
  }
116
161
  }
117
162
  }
@@ -122,14 +167,20 @@ export async function upsertSessions(supabase, sessionsData) {
122
167
  .insert(inserts)
123
168
  .select();
124
169
  if (error) {
125
- throw new Error(`Failed to create sessions: ${error.message}`);
170
+ console.warn("Error creating sessions:", error.message);
171
+ return {
172
+ status: EnumWebResponse.ERROR,
173
+ msg: error.message,
174
+ data: results,
175
+ };
126
176
  }
127
177
  results.push(...(data || []));
128
178
  }
129
- return results;
179
+ return IWebResponse.success(results).to_compatible();
130
180
  }
131
181
  // Create or update connectivity
132
- export async function upsertConnectivity(supabase, connectivityData) {
182
+ export async function server_upsert_connectivity(connectivityData) {
183
+ const supabase = await newServerClient();
133
184
  const isUpdate = "id" in connectivityData;
134
185
  if (isUpdate) {
135
186
  // Update existing connectivity
@@ -141,9 +192,14 @@ export async function upsertConnectivity(supabase, connectivityData) {
141
192
  .select()
142
193
  .single();
143
194
  if (error) {
144
- throw new Error(`Failed to update connectivity: ${error.message}`);
195
+ console.warn("Error updating connectivity:", error.message);
196
+ return {
197
+ status: EnumWebResponse.ERROR,
198
+ msg: error.message,
199
+ data: null,
200
+ };
145
201
  }
146
- return data;
202
+ return IWebResponse.success(data).to_compatible();
147
203
  }
148
204
  else {
149
205
  // Create new connectivity
@@ -153,15 +209,21 @@ export async function upsertConnectivity(supabase, connectivityData) {
153
209
  .select()
154
210
  .single();
155
211
  if (error) {
156
- throw new Error(`Failed to create connectivity: ${error.message}`);
212
+ console.warn("Error creating connectivity:", error.message);
213
+ return {
214
+ status: EnumWebResponse.ERROR,
215
+ msg: error.message,
216
+ data: null,
217
+ };
157
218
  }
158
- return data;
219
+ return IWebResponse.success(data).to_compatible();
159
220
  }
160
221
  }
161
222
  // Batch upsert connectivity
162
- export async function upsertConnectivityBatch(supabase, connectivityDataArray) {
223
+ export async function server_upsert_connectivity_batch(connectivityDataArray) {
224
+ const supabase = await newServerClient();
163
225
  if (connectivityDataArray.length === 0) {
164
- return [];
226
+ return IWebResponse.success([]).to_compatible();
165
227
  }
166
228
  // Separate updates and inserts
167
229
  const updates = connectivityDataArray.filter((c) => "id" in c);
@@ -170,12 +232,12 @@ export async function upsertConnectivityBatch(supabase, connectivityDataArray) {
170
232
  // Handle updates
171
233
  if (updates.length > 0) {
172
234
  for (const connectivityData of updates) {
173
- try {
174
- const result = await upsertConnectivity(supabase, connectivityData);
175
- results.push(result);
235
+ const updateResult = await server_upsert_connectivity(connectivityData);
236
+ if (updateResult.status === EnumWebResponse.SUCCESS && updateResult.data) {
237
+ results.push(updateResult.data);
176
238
  }
177
- catch (error) {
178
- throw new Error(`Failed to update connectivity ${connectivityData.id}: ${error}`);
239
+ else {
240
+ console.warn(`Failed to update connectivity ${connectivityData.id}:`, updateResult.msg);
179
241
  }
180
242
  }
181
243
  }
@@ -186,27 +248,27 @@ export async function upsertConnectivityBatch(supabase, connectivityDataArray) {
186
248
  .insert(inserts)
187
249
  .select();
188
250
  if (error) {
189
- throw new Error(`Failed to create connectivity entries: ${error.message}`);
251
+ console.warn("Error creating connectivity entries:", error.message);
252
+ return {
253
+ status: EnumWebResponse.ERROR,
254
+ msg: error.message,
255
+ data: results,
256
+ };
190
257
  }
191
258
  results.push(...(data || []));
192
259
  }
193
- return results;
260
+ return IWebResponse.success(results).to_compatible();
194
261
  }
195
262
  // Get session with connectivity and events using RPC functions
196
- export async function getSessionWithConnectivityAndEvents(supabase, sessionId, herdId) {
263
+ export async function server_get_session_with_connectivity_and_events(sessionId, herdId) {
264
+ const supabase = await newServerClient();
197
265
  let sessionWithCoords = null;
198
266
  if (herdId) {
199
267
  // Use provided herd ID directly
200
- // Get sessions with coordinates for the herd and find our specific session
201
- const { data: allSessionsWithCoords, error: sessionsError } = await supabase.rpc("get_sessions_with_coordinates", {
202
- herd_id_caller: herdId,
203
- });
204
- if (sessionsError) {
205
- throw new Error(`Failed to get session with coordinates: ${sessionsError.message}`);
268
+ const sessionsResult = await server_get_sessions_by_herd_id(herdId);
269
+ if (sessionsResult.status === EnumWebResponse.SUCCESS && sessionsResult.data) {
270
+ sessionWithCoords = sessionsResult.data.find((s) => s.id === sessionId) || null;
206
271
  }
207
- // Find the specific session in the results
208
- sessionWithCoords =
209
- allSessionsWithCoords?.find((s) => s.id === sessionId) || null;
210
272
  }
211
273
  else {
212
274
  // Get the session from the sessions table first to get the device_id
@@ -216,7 +278,16 @@ export async function getSessionWithConnectivityAndEvents(supabase, sessionId, h
216
278
  .eq("id", sessionId)
217
279
  .single();
218
280
  if (sessionError) {
219
- throw new Error(`Failed to get session: ${sessionError.message}`);
281
+ console.warn("Error getting session:", sessionError.message);
282
+ return {
283
+ status: EnumWebResponse.ERROR,
284
+ msg: sessionError.message,
285
+ data: {
286
+ session: null,
287
+ connectivity: [],
288
+ events: [],
289
+ },
290
+ };
220
291
  }
221
292
  // Get the device to find its herd_id
222
293
  const { data: device, error: deviceError } = await supabase
@@ -225,46 +296,46 @@ export async function getSessionWithConnectivityAndEvents(supabase, sessionId, h
225
296
  .eq("id", sessionData.device_id)
226
297
  .single();
227
298
  if (deviceError) {
228
- throw new Error(`Failed to get device: ${deviceError.message}`);
299
+ console.warn("Error getting device:", deviceError.message);
300
+ return {
301
+ status: EnumWebResponse.ERROR,
302
+ msg: deviceError.message,
303
+ data: {
304
+ session: null,
305
+ connectivity: [],
306
+ events: [],
307
+ },
308
+ };
229
309
  }
230
- // Get sessions with coordinates for the herd and find our specific session
231
- const { data: allSessionsWithCoords, error: sessionsError } = await supabase.rpc("get_sessions_with_coordinates", {
232
- herd_id_caller: device.herd_id,
233
- });
234
- if (sessionsError) {
235
- throw new Error(`Failed to get session with coordinates: ${sessionsError.message}`);
310
+ const sessionsResult = await server_get_sessions_by_herd_id(device.herd_id);
311
+ if (sessionsResult.status === EnumWebResponse.SUCCESS && sessionsResult.data) {
312
+ sessionWithCoords = sessionsResult.data.find((s) => s.id === sessionId) || null;
236
313
  }
237
- // Find the specific session in the results
238
- sessionWithCoords =
239
- allSessionsWithCoords?.find((s) => s.id === sessionId) || null;
240
314
  }
241
315
  const [connectivityResult, eventsResult] = await Promise.all([
242
- getConnectivityBySessionId(supabase, sessionId),
243
- getEventsBySessionId(supabase, sessionId),
316
+ server_get_connectivity_by_session_id(sessionId),
317
+ server_get_events_by_session_id(sessionId),
244
318
  ]);
245
- return {
319
+ const connectivity = connectivityResult.status === EnumWebResponse.SUCCESS ? connectivityResult.data || [] : [];
320
+ const events = eventsResult.status === EnumWebResponse.SUCCESS ? eventsResult.data || [] : [];
321
+ return IWebResponse.success({
246
322
  session: sessionWithCoords,
247
- connectivity: connectivityResult,
248
- events: eventsResult,
249
- };
323
+ connectivity,
324
+ events,
325
+ }).to_compatible();
250
326
  }
251
327
  // Get session with connectivity and events with tags using RPC functions
252
- export async function getSessionWithConnectivityAndEventsWithTags(supabase, sessionId, limit = 50, offset = 0, herdId) {
328
+ export async function server_get_session_with_connectivity_and_events_with_tags(sessionId, limit = 50, offset = 0, herdId) {
329
+ const supabase = await newServerClient();
253
330
  let sessionWithCoords = null;
254
331
  let actualHerdId;
255
332
  if (herdId) {
256
333
  // Use provided herd ID directly
257
334
  actualHerdId = herdId;
258
- // Get sessions with coordinates for the herd and find our specific session
259
- const { data: allSessionsWithCoords, error: sessionsError } = await supabase.rpc("get_sessions_with_coordinates", {
260
- herd_id_caller: actualHerdId,
261
- });
262
- if (sessionsError) {
263
- throw new Error(`Failed to get session with coordinates: ${sessionsError.message}`);
335
+ const sessionsResult = await server_get_sessions_by_herd_id(herdId);
336
+ if (sessionsResult.status === EnumWebResponse.SUCCESS && sessionsResult.data) {
337
+ sessionWithCoords = sessionsResult.data.find((s) => s.id === sessionId) || null;
264
338
  }
265
- // Find the specific session in the results
266
- sessionWithCoords =
267
- allSessionsWithCoords?.find((s) => s.id === sessionId) || null;
268
339
  }
269
340
  else {
270
341
  // Get the session from the sessions table first to get the device_id
@@ -274,7 +345,17 @@ export async function getSessionWithConnectivityAndEventsWithTags(supabase, sess
274
345
  .eq("id", sessionId)
275
346
  .single();
276
347
  if (sessionError) {
277
- throw new Error(`Failed to get session: ${sessionError.message}`);
348
+ console.warn("Error getting session:", sessionError.message);
349
+ return {
350
+ status: EnumWebResponse.ERROR,
351
+ msg: sessionError.message,
352
+ data: {
353
+ session: null,
354
+ connectivity: [],
355
+ eventsWithTags: [],
356
+ totalEvents: 0,
357
+ },
358
+ };
278
359
  }
279
360
  // Get the device to find its herd_id
280
361
  const { data: device, error: deviceError } = await supabase
@@ -283,85 +364,126 @@ export async function getSessionWithConnectivityAndEventsWithTags(supabase, sess
283
364
  .eq("id", sessionData.device_id)
284
365
  .single();
285
366
  if (deviceError) {
286
- throw new Error(`Failed to get device: ${deviceError.message}`);
367
+ console.warn("Error getting device:", deviceError.message);
368
+ return {
369
+ status: EnumWebResponse.ERROR,
370
+ msg: deviceError.message,
371
+ data: {
372
+ session: null,
373
+ connectivity: [],
374
+ eventsWithTags: [],
375
+ totalEvents: 0,
376
+ },
377
+ };
287
378
  }
288
379
  actualHerdId = device.herd_id;
289
- // Get sessions with coordinates for the herd and find our specific session
290
- const { data: allSessionsWithCoords, error: sessionsError } = await supabase.rpc("get_sessions_with_coordinates", {
291
- herd_id_caller: actualHerdId,
292
- });
293
- if (sessionsError) {
294
- throw new Error(`Failed to get session with coordinates: ${sessionsError.message}`);
380
+ const sessionsResult = await server_get_sessions_by_herd_id(device.herd_id);
381
+ if (sessionsResult.status === EnumWebResponse.SUCCESS && sessionsResult.data) {
382
+ sessionWithCoords = sessionsResult.data.find((s) => s.id === sessionId) || null;
295
383
  }
296
- // Find the specific session in the results
297
- sessionWithCoords =
298
- allSessionsWithCoords?.find((s) => s.id === sessionId) || null;
299
384
  }
300
385
  const [connectivityResult, eventsWithTagsResult, totalEventsResult] = await Promise.all([
301
- getConnectivityBySessionId(supabase, sessionId),
302
- getEventsAndTagsBySessionId(supabase, sessionId, limit, offset),
303
- getTotalEventsForSession(supabase, sessionId),
386
+ server_get_connectivity_by_session_id(sessionId),
387
+ server_get_events_and_tags_by_session_id(sessionId, limit, offset),
388
+ server_get_total_events_for_session(sessionId),
304
389
  ]);
305
- return {
390
+ const connectivity = connectivityResult.status === EnumWebResponse.SUCCESS ? connectivityResult.data || [] : [];
391
+ const eventsWithTags = eventsWithTagsResult.status === EnumWebResponse.SUCCESS ? eventsWithTagsResult.data || [] : [];
392
+ const totalEvents = totalEventsResult.status === EnumWebResponse.SUCCESS ? totalEventsResult.data || 0 : 0;
393
+ return IWebResponse.success({
306
394
  session: sessionWithCoords,
307
- connectivity: connectivityResult,
308
- eventsWithTags: eventsWithTagsResult,
309
- totalEvents: totalEventsResult,
310
- };
395
+ connectivity,
396
+ eventsWithTags,
397
+ totalEvents,
398
+ }).to_compatible();
311
399
  }
312
400
  // Get sessions for a device using RPC function
313
- export async function getSessionsByDeviceId(supabase, deviceId) {
401
+ export async function server_get_sessions_by_device_id(deviceId) {
402
+ const supabase = await newServerClient();
314
403
  const { data, error } = await supabase.rpc("get_sessions_with_coordinates_by_device", {
315
404
  device_id_caller: deviceId,
316
405
  });
317
406
  if (error) {
318
- throw new Error(`Failed to get sessions by device id: ${error.message}`);
407
+ console.warn("Error fetching sessions by device id:", error.message);
408
+ return {
409
+ status: EnumWebResponse.ERROR,
410
+ msg: error.message,
411
+ data: [],
412
+ };
319
413
  }
320
- return data || [];
414
+ return IWebResponse.success(data || []).to_compatible();
321
415
  }
322
416
  // Delete session and all related data
323
- export async function deleteSession(supabase, sessionId) {
417
+ export async function server_delete_session(sessionId) {
418
+ const supabase = await newServerClient();
324
419
  const { error } = await supabase
325
420
  .from("sessions")
326
421
  .delete()
327
422
  .eq("id", sessionId);
328
423
  if (error) {
329
- throw new Error(`Failed to delete session: ${error.message}`);
424
+ console.warn("Error deleting session:", error.message);
425
+ return {
426
+ status: EnumWebResponse.ERROR,
427
+ msg: error.message,
428
+ data: false,
429
+ };
330
430
  }
431
+ return IWebResponse.success(true).to_compatible();
331
432
  }
332
433
  // Batch delete sessions
333
- export async function deleteSessions(supabase, sessionIds) {
434
+ export async function server_delete_sessions(sessionIds) {
435
+ const supabase = await newServerClient();
334
436
  if (sessionIds.length === 0) {
335
- return;
437
+ return IWebResponse.success(true).to_compatible();
336
438
  }
337
439
  const { error } = await supabase
338
440
  .from("sessions")
339
441
  .delete()
340
442
  .in("id", sessionIds);
341
443
  if (error) {
342
- throw new Error(`Failed to delete sessions: ${error.message}`);
444
+ console.warn("Error deleting sessions:", error.message);
445
+ return {
446
+ status: EnumWebResponse.ERROR,
447
+ msg: error.message,
448
+ data: false,
449
+ };
343
450
  }
451
+ return IWebResponse.success(true).to_compatible();
344
452
  }
345
453
  // Delete connectivity entry
346
- export async function deleteConnectivity(supabase, connectivityId) {
454
+ export async function server_delete_connectivity(connectivityId) {
455
+ const supabase = await newServerClient();
347
456
  const { error } = await supabase
348
457
  .from("connectivity")
349
458
  .delete()
350
459
  .eq("id", connectivityId);
351
460
  if (error) {
352
- throw new Error(`Failed to delete connectivity: ${error.message}`);
461
+ console.warn("Error deleting connectivity:", error.message);
462
+ return {
463
+ status: EnumWebResponse.ERROR,
464
+ msg: error.message,
465
+ data: false,
466
+ };
353
467
  }
468
+ return IWebResponse.success(true).to_compatible();
354
469
  }
355
470
  // Batch delete connectivity entries
356
- export async function deleteConnectivityBatch(supabase, connectivityIds) {
471
+ export async function server_delete_connectivity_batch(connectivityIds) {
472
+ const supabase = await newServerClient();
357
473
  if (connectivityIds.length === 0) {
358
- return;
474
+ return IWebResponse.success(true).to_compatible();
359
475
  }
360
476
  const { error } = await supabase
361
477
  .from("connectivity")
362
478
  .delete()
363
479
  .in("id", connectivityIds);
364
480
  if (error) {
365
- throw new Error(`Failed to delete connectivity entries: ${error.message}`);
481
+ console.warn("Error deleting connectivity entries:", error.message);
482
+ return {
483
+ status: EnumWebResponse.ERROR,
484
+ msg: error.message,
485
+ data: false,
486
+ };
366
487
  }
488
+ return IWebResponse.success(true).to_compatible();
367
489
  }
@@ -9,7 +9,7 @@ import { server_get_users_with_herd_access } from "../helpers/users";
9
9
  import { EnumWebResponse } from "./requests";
10
10
  import { server_get_more_zones_and_actions_for_herd } from "../helpers/zones";
11
11
  import { server_list_api_keys_batch } from "../api_keys/actions";
12
- import { getSessionsByHerdId } from "../helpers/sessions";
12
+ import { server_get_sessions_by_herd_id } from "../helpers/sessions";
13
13
  export var EnumHerdModulesLoadingState;
14
14
  (function (EnumHerdModulesLoadingState) {
15
15
  EnumHerdModulesLoadingState["NOT_LOADING"] = "NOT_LOADING";
@@ -112,9 +112,9 @@ export class HerdModule {
112
112
  console.warn(`[HerdModule] Failed to get plans:`, error);
113
113
  return { status: EnumWebResponse.ERROR, data: null };
114
114
  }),
115
- getSessionsByHerdId(client, herd.id).catch((error) => {
115
+ server_get_sessions_by_herd_id(herd.id).catch((error) => {
116
116
  console.warn(`[HerdModule] Failed to get sessions:`, error);
117
- return [];
117
+ return { status: EnumWebResponse.ERROR, data: [], msg: error.message };
118
118
  }),
119
119
  server_get_layers_by_herd(herd.id).catch((error) => {
120
120
  console.warn(`[HerdModule] Failed to get layers:`, error);
@@ -148,7 +148,7 @@ export class HerdModule {
148
148
  const plans = res_plans.status === "fulfilled" && res_plans.value?.data
149
149
  ? res_plans.value.data
150
150
  : [];
151
- const sessions = res_sessions.status === "fulfilled" ? res_sessions.value : [];
151
+ const sessions = res_sessions.status === "fulfilled" && res_sessions.value?.data ? res_sessions.value.data : [];
152
152
  const layers = res_layers.status === "fulfilled" && res_layers.value?.data
153
153
  ? res_layers.value.data
154
154
  : [];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@adventurelabs/scout-core",
3
- "version": "1.0.74",
3
+ "version": "1.0.77",
4
4
  "description": "Core utilities and helpers for Adventure Labs Scout applications",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",