@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.
- package/dist/helpers/chat.d.ts +2 -3
- package/dist/helpers/chat.js +21 -7
- package/dist/helpers/sessions.d.ts +20 -21
- package/dist/helpers/sessions.js +234 -112
- package/dist/types/herd_module.js +4 -4
- package/package.json +1 -1
package/dist/helpers/chat.d.ts
CHANGED
|
@@ -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
|
|
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
|
|
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;
|
package/dist/helpers/chat.js
CHANGED
|
@@ -1,29 +1,43 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
19
|
-
const
|
|
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
|
-
|
|
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 {
|
|
2
|
-
import {
|
|
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
|
|
15
|
-
export declare function
|
|
16
|
-
export declare function
|
|
17
|
-
export declare function
|
|
18
|
-
export declare function
|
|
19
|
-
export declare function
|
|
20
|
-
export declare function
|
|
21
|
-
export declare function
|
|
22
|
-
export declare function
|
|
23
|
-
export declare function
|
|
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
|
|
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
|
|
35
|
-
export declare function
|
|
36
|
-
export declare function
|
|
37
|
-
export declare function
|
|
38
|
-
export declare function
|
|
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>>;
|
package/dist/helpers/sessions.js
CHANGED
|
@@ -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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
110
|
-
|
|
111
|
-
results.push(
|
|
154
|
+
const updateResult = await server_upsert_session(sessionData);
|
|
155
|
+
if (updateResult.status === EnumWebResponse.SUCCESS && updateResult.data) {
|
|
156
|
+
results.push(updateResult.data);
|
|
112
157
|
}
|
|
113
|
-
|
|
114
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
174
|
-
|
|
175
|
-
results.push(
|
|
235
|
+
const updateResult = await server_upsert_connectivity(connectivityData);
|
|
236
|
+
if (updateResult.status === EnumWebResponse.SUCCESS && updateResult.data) {
|
|
237
|
+
results.push(updateResult.data);
|
|
176
238
|
}
|
|
177
|
-
|
|
178
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
201
|
-
|
|
202
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
231
|
-
|
|
232
|
-
|
|
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
|
-
|
|
243
|
-
|
|
316
|
+
server_get_connectivity_by_session_id(sessionId),
|
|
317
|
+
server_get_events_by_session_id(sessionId),
|
|
244
318
|
]);
|
|
245
|
-
|
|
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
|
|
248
|
-
events
|
|
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
|
|
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
|
-
|
|
259
|
-
|
|
260
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
290
|
-
|
|
291
|
-
|
|
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
|
-
|
|
302
|
-
|
|
303
|
-
|
|
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
|
-
|
|
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
|
|
308
|
-
eventsWithTags
|
|
309
|
-
totalEvents
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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 {
|
|
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
|
-
|
|
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
|
: [];
|