@adventurelabs/scout-core 1.4.85 → 1.4.87

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.
@@ -0,0 +1,10 @@
1
+ import { Database } from "../types/supabase";
2
+ import { IContact, ContactInsert, ContactUpdate } from "../types/db";
3
+ import { IWebResponseCompatible } from "../types/requests";
4
+ import { SupabaseClient } from "@supabase/supabase-js";
5
+ export declare function get_contacts_by_herd_id(client: SupabaseClient<Database>, herd_id: number, options?: {
6
+ include_inactive?: boolean;
7
+ }): Promise<IWebResponseCompatible<IContact[]>>;
8
+ export declare function get_contact_by_id(client: SupabaseClient<Database>, contact_id: number): Promise<IWebResponseCompatible<IContact | null>>;
9
+ export declare function create_contact(client: SupabaseClient<Database>, row: ContactInsert): Promise<IWebResponseCompatible<IContact | null>>;
10
+ export declare function update_contact(client: SupabaseClient<Database>, contact_id: number, patch: ContactUpdate): Promise<IWebResponseCompatible<IContact | null>>;
@@ -0,0 +1,71 @@
1
+ import { IWebResponse } from "../types/requests";
2
+ export async function get_contacts_by_herd_id(client, herd_id, options) {
3
+ let query = client.from("contacts").select("*").eq("herd_id", herd_id);
4
+ if (!options?.include_inactive) {
5
+ query = query.eq("lifecycle", "active");
6
+ }
7
+ const { data, error } = await query.order("name");
8
+ if (error) {
9
+ return IWebResponse.error(error.message).to_compatible();
10
+ }
11
+ return IWebResponse.success(data ?? []).to_compatible();
12
+ }
13
+ export async function get_contact_by_id(client, contact_id) {
14
+ const { data, error } = await client
15
+ .from("contacts")
16
+ .select("*")
17
+ .eq("id", contact_id)
18
+ .maybeSingle();
19
+ if (error) {
20
+ return IWebResponse.error(error.message).to_compatible();
21
+ }
22
+ if (!data) {
23
+ return IWebResponse.error("Contact not found")
24
+ .to_compatible();
25
+ }
26
+ return IWebResponse.success(data).to_compatible();
27
+ }
28
+ export async function create_contact(client, row) {
29
+ if (row.herd_id == null) {
30
+ return IWebResponse.error("herd_id is required")
31
+ .to_compatible();
32
+ }
33
+ if (!row.name?.trim()) {
34
+ return IWebResponse.error("name is required")
35
+ .to_compatible();
36
+ }
37
+ const { data, error } = await client
38
+ .from("contacts")
39
+ .insert([row])
40
+ .select("*")
41
+ .single();
42
+ if (error) {
43
+ return IWebResponse.error(error.message).to_compatible();
44
+ }
45
+ if (!data) {
46
+ return IWebResponse.error("Failed to create contact")
47
+ .to_compatible();
48
+ }
49
+ return IWebResponse.success(data).to_compatible();
50
+ }
51
+ export async function update_contact(client, contact_id, patch) {
52
+ const { id: _id, herd_id: _hid, created_at: _ca, ...updateData } = patch;
53
+ if (Object.keys(updateData).length === 0) {
54
+ return IWebResponse.error("No valid fields to update")
55
+ .to_compatible();
56
+ }
57
+ const { data, error } = await client
58
+ .from("contacts")
59
+ .update(updateData)
60
+ .eq("id", contact_id)
61
+ .select("*")
62
+ .single();
63
+ if (error) {
64
+ return IWebResponse.error(error.message).to_compatible();
65
+ }
66
+ if (!data) {
67
+ return IWebResponse.error("Contact not found")
68
+ .to_compatible();
69
+ }
70
+ return IWebResponse.success(data).to_compatible();
71
+ }
@@ -0,0 +1,7 @@
1
+ import { IDocumentTemplate, DocumentTemplateInsert, DocumentTemplateUpdate } from "../types/db";
2
+ import { IWebResponseCompatible } from "../types/requests";
3
+ export declare function server_get_document_templates(): Promise<IWebResponseCompatible<IDocumentTemplate[]>>;
4
+ export declare function server_get_document_template_by_id(template_id: number): Promise<IWebResponseCompatible<IDocumentTemplate | null>>;
5
+ export declare function server_get_document_templates_by_localization(localization_id: number): Promise<IWebResponseCompatible<IDocumentTemplate[]>>;
6
+ export declare function server_create_document_template(row: DocumentTemplateInsert): Promise<IWebResponseCompatible<IDocumentTemplate | null>>;
7
+ export declare function server_update_document_template(template_id: number, updates: DocumentTemplateUpdate): Promise<IWebResponseCompatible<IDocumentTemplate | null>>;
@@ -0,0 +1,63 @@
1
+ "use server";
2
+ import { newServerClient } from "../supabase/server";
3
+ import { EnumWebResponse, IWebResponse, } from "../types/requests";
4
+ export async function server_get_document_templates() {
5
+ const supabase = await newServerClient();
6
+ const { data, error } = await supabase
7
+ .from("document_templates")
8
+ .select("*")
9
+ .order("name");
10
+ if (error) {
11
+ return { status: EnumWebResponse.ERROR, msg: error.message, data: [] };
12
+ }
13
+ return IWebResponse.success(data ?? []).to_compatible();
14
+ }
15
+ export async function server_get_document_template_by_id(template_id) {
16
+ const supabase = await newServerClient();
17
+ const { data, error } = await supabase
18
+ .from("document_templates")
19
+ .select("*")
20
+ .eq("id", template_id)
21
+ .maybeSingle();
22
+ if (error) {
23
+ return { status: EnumWebResponse.ERROR, msg: error.message, data: null };
24
+ }
25
+ return IWebResponse.success(data).to_compatible();
26
+ }
27
+ export async function server_get_document_templates_by_localization(localization_id) {
28
+ const supabase = await newServerClient();
29
+ const { data, error } = await supabase
30
+ .from("document_templates")
31
+ .select("*")
32
+ .eq("localization_id", localization_id)
33
+ .order("name");
34
+ if (error) {
35
+ return { status: EnumWebResponse.ERROR, msg: error.message, data: [] };
36
+ }
37
+ return IWebResponse.success(data ?? []).to_compatible();
38
+ }
39
+ export async function server_create_document_template(row) {
40
+ const supabase = await newServerClient();
41
+ const { data, error } = await supabase
42
+ .from("document_templates")
43
+ .insert(row)
44
+ .select("*")
45
+ .single();
46
+ if (error) {
47
+ return { status: EnumWebResponse.ERROR, msg: error.message, data: null };
48
+ }
49
+ return IWebResponse.success(data).to_compatible();
50
+ }
51
+ export async function server_update_document_template(template_id, updates) {
52
+ const supabase = await newServerClient();
53
+ const { data, error } = await supabase
54
+ .from("document_templates")
55
+ .update(updates)
56
+ .eq("id", template_id)
57
+ .select("*")
58
+ .single();
59
+ if (error) {
60
+ return { status: EnumWebResponse.ERROR, msg: error.message, data: null };
61
+ }
62
+ return IWebResponse.success(data).to_compatible();
63
+ }
@@ -0,0 +1,12 @@
1
+ import { Database } from "../types/supabase";
2
+ import { IDocument, DocumentInsert, DocumentUpdate } from "../types/db";
3
+ import { IWebResponseCompatible } from "../types/requests";
4
+ import { SupabaseClient } from "@supabase/supabase-js";
5
+ export declare function get_documents_by_herd_id(client: SupabaseClient<Database>, herd_id: number): Promise<IWebResponseCompatible<IDocument[]>>;
6
+ export declare function get_documents_by_device_id(client: SupabaseClient<Database>, device_id: number): Promise<IWebResponseCompatible<IDocument[]>>;
7
+ export declare function get_documents_by_user_id(client: SupabaseClient<Database>, user_id: string): Promise<IWebResponseCompatible<IDocument[]>>;
8
+ export declare function get_documents_by_product_id(client: SupabaseClient<Database>, product_id: number): Promise<IWebResponseCompatible<IDocument[]>>;
9
+ export declare function get_document_by_id(client: SupabaseClient<Database>, document_id: number): Promise<IWebResponseCompatible<IDocument | null>>;
10
+ export declare function create_document(client: SupabaseClient<Database>, row: DocumentInsert): Promise<IWebResponseCompatible<IDocument | null>>;
11
+ export declare function update_document(client: SupabaseClient<Database>, document_id: number, patch: DocumentUpdate): Promise<IWebResponseCompatible<IDocument | null>>;
12
+ export declare function delete_document(client: SupabaseClient<Database>, document_id: number): Promise<IWebResponseCompatible<IDocument | null>>;
@@ -0,0 +1,107 @@
1
+ import { IWebResponse } from "../types/requests";
2
+ function assert_document_insert(row) {
3
+ if (!row.uri?.trim()) {
4
+ return IWebResponse.error("uri is required")
5
+ .to_compatible();
6
+ }
7
+ const owners = [row.user_id, row.herd_id, row.device_id, row.product_id];
8
+ const owner_count = owners.filter((owner) => owner != null).length;
9
+ if (owner_count !== 1) {
10
+ return IWebResponse.error("exactly one of user_id, herd_id, device_id, or product_id is required").to_compatible();
11
+ }
12
+ return null;
13
+ }
14
+ async function get_documents_by(client, column, value) {
15
+ const { data, error } = await client
16
+ .from("documents")
17
+ .select("*")
18
+ .eq(column, value)
19
+ .order("created_at", { ascending: false });
20
+ if (error) {
21
+ return IWebResponse.error(error.message).to_compatible();
22
+ }
23
+ return IWebResponse.success(data ?? []).to_compatible();
24
+ }
25
+ export async function get_documents_by_herd_id(client, herd_id) {
26
+ return get_documents_by(client, "herd_id", herd_id);
27
+ }
28
+ export async function get_documents_by_device_id(client, device_id) {
29
+ return get_documents_by(client, "device_id", device_id);
30
+ }
31
+ export async function get_documents_by_user_id(client, user_id) {
32
+ return get_documents_by(client, "user_id", user_id);
33
+ }
34
+ export async function get_documents_by_product_id(client, product_id) {
35
+ return get_documents_by(client, "product_id", product_id);
36
+ }
37
+ export async function get_document_by_id(client, document_id) {
38
+ const { data, error } = await client
39
+ .from("documents")
40
+ .select("*")
41
+ .eq("id", document_id)
42
+ .maybeSingle();
43
+ if (error) {
44
+ return IWebResponse.error(error.message).to_compatible();
45
+ }
46
+ if (!data) {
47
+ return IWebResponse.error("Document not found")
48
+ .to_compatible();
49
+ }
50
+ return IWebResponse.success(data).to_compatible();
51
+ }
52
+ export async function create_document(client, row) {
53
+ const invalid = assert_document_insert(row);
54
+ if (invalid) {
55
+ return invalid;
56
+ }
57
+ const { data, error } = await client
58
+ .from("documents")
59
+ .insert([row])
60
+ .select("*")
61
+ .single();
62
+ if (error) {
63
+ return IWebResponse.error(error.message).to_compatible();
64
+ }
65
+ if (!data) {
66
+ return IWebResponse.error("Failed to create document")
67
+ .to_compatible();
68
+ }
69
+ return IWebResponse.success(data).to_compatible();
70
+ }
71
+ export async function update_document(client, document_id, patch) {
72
+ const { id: _id, created_at: _ca, created_by: _cb, ...updateData } = patch;
73
+ if (Object.keys(updateData).length === 0) {
74
+ return IWebResponse.error("No valid fields to update")
75
+ .to_compatible();
76
+ }
77
+ const { data, error } = await client
78
+ .from("documents")
79
+ .update(updateData)
80
+ .eq("id", document_id)
81
+ .select("*")
82
+ .single();
83
+ if (error) {
84
+ return IWebResponse.error(error.message).to_compatible();
85
+ }
86
+ if (!data) {
87
+ return IWebResponse.error("Document not found")
88
+ .to_compatible();
89
+ }
90
+ return IWebResponse.success(data).to_compatible();
91
+ }
92
+ export async function delete_document(client, document_id) {
93
+ const { data, error } = await client
94
+ .from("documents")
95
+ .delete()
96
+ .eq("id", document_id)
97
+ .select("*")
98
+ .single();
99
+ if (error) {
100
+ return IWebResponse.error(error.message).to_compatible();
101
+ }
102
+ if (!data) {
103
+ return IWebResponse.error("Document not found")
104
+ .to_compatible();
105
+ }
106
+ return IWebResponse.success(data).to_compatible();
107
+ }
@@ -16,6 +16,15 @@ export * from "./herds";
16
16
  export * from "./location";
17
17
  export * from "./lifecycle";
18
18
  export * from "./models";
19
+ export * from "./manufacturers";
20
+ export * from "./products";
21
+ export * from "./product_numbers";
22
+ export * from "./localizations";
23
+ export * from "./issuers";
24
+ export * from "./document_templates";
25
+ export * from "./documents";
26
+ export * from "./maintenance_requests";
27
+ export * from "./contacts";
19
28
  export * from "./plans";
20
29
  export * from "./sessions";
21
30
  export * from "./segmentations_sam3";
@@ -16,6 +16,15 @@ export * from "./herds";
16
16
  export * from "./location";
17
17
  export * from "./lifecycle";
18
18
  export * from "./models";
19
+ export * from "./manufacturers";
20
+ export * from "./products";
21
+ export * from "./product_numbers";
22
+ export * from "./localizations";
23
+ export * from "./issuers";
24
+ export * from "./document_templates";
25
+ export * from "./documents";
26
+ export * from "./maintenance_requests";
27
+ export * from "./contacts";
19
28
  export * from "./plans";
20
29
  export * from "./sessions";
21
30
  export * from "./segmentations_sam3";
@@ -0,0 +1,7 @@
1
+ import { IIssuer, IssuerInsert, IssuerUpdate } from "../types/db";
2
+ import { IWebResponseCompatible } from "../types/requests";
3
+ export declare function server_get_issuers(): Promise<IWebResponseCompatible<IIssuer[]>>;
4
+ export declare function server_get_issuer_by_id(issuer_id: number): Promise<IWebResponseCompatible<IIssuer | null>>;
5
+ export declare function server_get_issuers_by_localization(localization_id: number): Promise<IWebResponseCompatible<IIssuer[]>>;
6
+ export declare function server_create_issuer(row: IssuerInsert): Promise<IWebResponseCompatible<IIssuer | null>>;
7
+ export declare function server_update_issuer(issuer_id: number, updates: IssuerUpdate): Promise<IWebResponseCompatible<IIssuer | null>>;
@@ -0,0 +1,63 @@
1
+ "use server";
2
+ import { newServerClient } from "../supabase/server";
3
+ import { EnumWebResponse, IWebResponse, } from "../types/requests";
4
+ export async function server_get_issuers() {
5
+ const supabase = await newServerClient();
6
+ const { data, error } = await supabase
7
+ .from("issuers")
8
+ .select("*")
9
+ .order("name");
10
+ if (error) {
11
+ return { status: EnumWebResponse.ERROR, msg: error.message, data: [] };
12
+ }
13
+ return IWebResponse.success(data ?? []).to_compatible();
14
+ }
15
+ export async function server_get_issuer_by_id(issuer_id) {
16
+ const supabase = await newServerClient();
17
+ const { data, error } = await supabase
18
+ .from("issuers")
19
+ .select("*")
20
+ .eq("id", issuer_id)
21
+ .maybeSingle();
22
+ if (error) {
23
+ return { status: EnumWebResponse.ERROR, msg: error.message, data: null };
24
+ }
25
+ return IWebResponse.success(data).to_compatible();
26
+ }
27
+ export async function server_get_issuers_by_localization(localization_id) {
28
+ const supabase = await newServerClient();
29
+ const { data, error } = await supabase
30
+ .from("issuers")
31
+ .select("*")
32
+ .eq("localization_id", localization_id)
33
+ .order("name");
34
+ if (error) {
35
+ return { status: EnumWebResponse.ERROR, msg: error.message, data: [] };
36
+ }
37
+ return IWebResponse.success(data ?? []).to_compatible();
38
+ }
39
+ export async function server_create_issuer(row) {
40
+ const supabase = await newServerClient();
41
+ const { data, error } = await supabase
42
+ .from("issuers")
43
+ .insert(row)
44
+ .select("*")
45
+ .single();
46
+ if (error) {
47
+ return { status: EnumWebResponse.ERROR, msg: error.message, data: null };
48
+ }
49
+ return IWebResponse.success(data).to_compatible();
50
+ }
51
+ export async function server_update_issuer(issuer_id, updates) {
52
+ const supabase = await newServerClient();
53
+ const { data, error } = await supabase
54
+ .from("issuers")
55
+ .update(updates)
56
+ .eq("id", issuer_id)
57
+ .select("*")
58
+ .single();
59
+ if (error) {
60
+ return { status: EnumWebResponse.ERROR, msg: error.message, data: null };
61
+ }
62
+ return IWebResponse.success(data).to_compatible();
63
+ }
@@ -1,6 +1,6 @@
1
1
  import { SupabaseClient } from "@supabase/supabase-js";
2
2
  import { Database } from "../types/supabase";
3
- import { EntityLifecycle, IArtifact, IDeviceRow, IEvent, IHerdAllowedDomain, IPart, ISession, IUserProfileRow, IUserRolePerHerd } from "../types/db";
3
+ import { EntityLifecycle, IArtifact, IContact, IDeviceRow, IEvent, IHerdAllowedDomain, IPart, ISession, IUserProfileRow, IUserRolePerHerd } from "../types/db";
4
4
  import { IWebResponseCompatible } from "../types/requests";
5
5
  export interface LifecycleUpdateOptions {
6
6
  lifecycle_reason?: string | null;
@@ -15,4 +15,5 @@ export declare function update_part_lifecycle(client: SupabaseClient<Database>,
15
15
  export declare function update_event_lifecycle(client: SupabaseClient<Database>, event_id: number, lifecycle: EntityLifecycle, options?: LifecycleUpdateOptions): Promise<IWebResponseCompatible<IEvent | null>>;
16
16
  export declare function update_artifact_lifecycle(client: SupabaseClient<Database>, artifact_id: number, lifecycle: EntityLifecycle, options?: LifecycleUpdateOptions): Promise<IWebResponseCompatible<IArtifact | null>>;
17
17
  export declare function update_user_role_per_herd_lifecycle(client: SupabaseClient<Database>, membership_id: number, lifecycle: EntityLifecycle, options?: LifecycleUpdateOptions): Promise<IWebResponseCompatible<IUserRolePerHerd | null>>;
18
+ export declare function update_contact_lifecycle(client: SupabaseClient<Database>, contact_id: number, lifecycle: EntityLifecycle, options?: LifecycleUpdateOptions): Promise<IWebResponseCompatible<IContact | null>>;
18
19
  export declare function update_herd_allowed_domain_lifecycle(client: SupabaseClient<Database>, domain_id: number, lifecycle: EntityLifecycle, options?: LifecycleUpdateOptions): Promise<IWebResponseCompatible<IHerdAllowedDomain | null>>;
@@ -83,6 +83,15 @@ export async function update_user_role_per_herd_lifecycle(client, membership_id,
83
83
  .single();
84
84
  return lifecycle_result(data, error, "Herd membership not found or lifecycle update failed");
85
85
  }
86
+ export async function update_contact_lifecycle(client, contact_id, lifecycle, options) {
87
+ const { data, error } = await client
88
+ .from("contacts")
89
+ .update(build_lifecycle_patch(lifecycle, options))
90
+ .eq("id", contact_id)
91
+ .select("*")
92
+ .single();
93
+ return lifecycle_result(data, error, "Contact not found or lifecycle update failed");
94
+ }
86
95
  export async function update_herd_allowed_domain_lifecycle(client, domain_id, lifecycle, options) {
87
96
  const { data, error } = await client
88
97
  .from("herd_allowed_domains")
@@ -0,0 +1,6 @@
1
+ import { ILocalization, LocalizationInsert, LocalizationUpdate } from "../types/db";
2
+ import { IWebResponseCompatible } from "../types/requests";
3
+ export declare function server_get_localizations(): Promise<IWebResponseCompatible<ILocalization[]>>;
4
+ export declare function server_get_localization_by_id(localization_id: number): Promise<IWebResponseCompatible<ILocalization | null>>;
5
+ export declare function server_create_localization(row: LocalizationInsert): Promise<IWebResponseCompatible<ILocalization | null>>;
6
+ export declare function server_update_localization(localization_id: number, updates: LocalizationUpdate): Promise<IWebResponseCompatible<ILocalization | null>>;
@@ -0,0 +1,51 @@
1
+ "use server";
2
+ import { newServerClient } from "../supabase/server";
3
+ import { EnumWebResponse, IWebResponse, } from "../types/requests";
4
+ export async function server_get_localizations() {
5
+ const supabase = await newServerClient();
6
+ const { data, error } = await supabase
7
+ .from("localizations")
8
+ .select("*")
9
+ .order("region");
10
+ if (error) {
11
+ return { status: EnumWebResponse.ERROR, msg: error.message, data: [] };
12
+ }
13
+ return IWebResponse.success(data ?? []).to_compatible();
14
+ }
15
+ export async function server_get_localization_by_id(localization_id) {
16
+ const supabase = await newServerClient();
17
+ const { data, error } = await supabase
18
+ .from("localizations")
19
+ .select("*")
20
+ .eq("id", localization_id)
21
+ .maybeSingle();
22
+ if (error) {
23
+ return { status: EnumWebResponse.ERROR, msg: error.message, data: null };
24
+ }
25
+ return IWebResponse.success(data).to_compatible();
26
+ }
27
+ export async function server_create_localization(row) {
28
+ const supabase = await newServerClient();
29
+ const { data, error } = await supabase
30
+ .from("localizations")
31
+ .insert(row)
32
+ .select("*")
33
+ .single();
34
+ if (error) {
35
+ return { status: EnumWebResponse.ERROR, msg: error.message, data: null };
36
+ }
37
+ return IWebResponse.success(data).to_compatible();
38
+ }
39
+ export async function server_update_localization(localization_id, updates) {
40
+ const supabase = await newServerClient();
41
+ const { data, error } = await supabase
42
+ .from("localizations")
43
+ .update(updates)
44
+ .eq("id", localization_id)
45
+ .select("*")
46
+ .single();
47
+ if (error) {
48
+ return { status: EnumWebResponse.ERROR, msg: error.message, data: null };
49
+ }
50
+ return IWebResponse.success(data).to_compatible();
51
+ }
@@ -0,0 +1,15 @@
1
+ import { Database } from "../types/supabase";
2
+ import { IMaintenanceRequest, MaintenanceRequestInsert, MaintenanceRequestUpdate } from "../types/db";
3
+ import { IWebResponseCompatible } from "../types/requests";
4
+ import { SupabaseClient } from "@supabase/supabase-js";
5
+ export declare function get_maintenance_requests_by_device_id(client: SupabaseClient<Database>, device_id: number): Promise<IWebResponseCompatible<IMaintenanceRequest[]>>;
6
+ export declare function get_maintenance_requests_by_part_id(client: SupabaseClient<Database>, part_id: number): Promise<IWebResponseCompatible<IMaintenanceRequest[]>>;
7
+ export declare function get_maintenance_requests_by_herd_id(client: SupabaseClient<Database>, herd_id: number, options?: {
8
+ limit?: number;
9
+ offset?: number;
10
+ }): Promise<IWebResponseCompatible<IMaintenanceRequest[]>>;
11
+ export declare function get_maintenance_requests_count_by_herd_id(client: SupabaseClient<Database>, herd_id: number): Promise<IWebResponseCompatible<number>>;
12
+ export declare function get_maintenance_request_by_id(client: SupabaseClient<Database>, request_id: number): Promise<IWebResponseCompatible<IMaintenanceRequest | null>>;
13
+ export declare function create_maintenance_request(client: SupabaseClient<Database>, row: MaintenanceRequestInsert): Promise<IWebResponseCompatible<IMaintenanceRequest | null>>;
14
+ export declare function update_maintenance_request(client: SupabaseClient<Database>, request_id: number, patch: MaintenanceRequestUpdate): Promise<IWebResponseCompatible<IMaintenanceRequest | null>>;
15
+ export declare function delete_maintenance_request(client: SupabaseClient<Database>, request_id: number): Promise<IWebResponseCompatible<IMaintenanceRequest | null>>;
@@ -0,0 +1,128 @@
1
+ import { IWebResponse } from "../types/requests";
2
+ function assert_maintenance_request_insert(row) {
3
+ if (!row.description?.trim()) {
4
+ return IWebResponse.error("description is required").to_compatible();
5
+ }
6
+ if (!row.defect_timestamp) {
7
+ return IWebResponse.error("defect_timestamp is required").to_compatible();
8
+ }
9
+ const targets = [row.device_id, row.part_id];
10
+ const target_count = targets.filter((target) => target != null).length;
11
+ if (target_count !== 1) {
12
+ return IWebResponse.error("exactly one of device_id or part_id is required").to_compatible();
13
+ }
14
+ return null;
15
+ }
16
+ export async function get_maintenance_requests_by_device_id(client, device_id) {
17
+ const { data, error } = await client
18
+ .from("maintenance_requests")
19
+ .select("*")
20
+ .eq("device_id", device_id)
21
+ .order("created_at", { ascending: false });
22
+ if (error) {
23
+ return IWebResponse.error(error.message)
24
+ .to_compatible();
25
+ }
26
+ return IWebResponse.success(data ?? []).to_compatible();
27
+ }
28
+ export async function get_maintenance_requests_by_part_id(client, part_id) {
29
+ const { data, error } = await client
30
+ .from("maintenance_requests")
31
+ .select("*")
32
+ .eq("part_id", part_id)
33
+ .order("created_at", { ascending: false });
34
+ if (error) {
35
+ return IWebResponse.error(error.message)
36
+ .to_compatible();
37
+ }
38
+ return IWebResponse.success(data ?? []).to_compatible();
39
+ }
40
+ export async function get_maintenance_requests_by_herd_id(client, herd_id, options) {
41
+ const { data, error } = await client.rpc("get_maintenance_requests_for_herd", {
42
+ herd_id_caller: herd_id,
43
+ limit_caller: options?.limit ?? 50,
44
+ offset_caller: options?.offset ?? 0,
45
+ });
46
+ if (error) {
47
+ return IWebResponse.error(error.message)
48
+ .to_compatible();
49
+ }
50
+ return IWebResponse.success(data ?? []).to_compatible();
51
+ }
52
+ export async function get_maintenance_requests_count_by_herd_id(client, herd_id) {
53
+ const { data, error } = await client.rpc("get_total_maintenance_requests_for_herd", { herd_id_caller: herd_id });
54
+ if (error) {
55
+ return IWebResponse.error(error.message).to_compatible();
56
+ }
57
+ return IWebResponse.success(data ?? 0).to_compatible();
58
+ }
59
+ export async function get_maintenance_request_by_id(client, request_id) {
60
+ const { data, error } = await client
61
+ .from("maintenance_requests")
62
+ .select("*")
63
+ .eq("id", request_id)
64
+ .maybeSingle();
65
+ if (error) {
66
+ return IWebResponse.error(error.message)
67
+ .to_compatible();
68
+ }
69
+ if (!data) {
70
+ return IWebResponse.error("Maintenance request not found").to_compatible();
71
+ }
72
+ return IWebResponse.success(data).to_compatible();
73
+ }
74
+ export async function create_maintenance_request(client, row) {
75
+ const invalid = assert_maintenance_request_insert(row);
76
+ if (invalid) {
77
+ return invalid;
78
+ }
79
+ const { data, error } = await client
80
+ .from("maintenance_requests")
81
+ .insert([row])
82
+ .select("*")
83
+ .single();
84
+ if (error) {
85
+ return IWebResponse.error(error.message)
86
+ .to_compatible();
87
+ }
88
+ if (!data) {
89
+ return IWebResponse.error("Failed to create maintenance request").to_compatible();
90
+ }
91
+ return IWebResponse.success(data).to_compatible();
92
+ }
93
+ export async function update_maintenance_request(client, request_id, patch) {
94
+ const { id: _id, created_at: _ca, ...updateData } = patch;
95
+ if (Object.keys(updateData).length === 0) {
96
+ return IWebResponse.error("No valid fields to update").to_compatible();
97
+ }
98
+ const { data, error } = await client
99
+ .from("maintenance_requests")
100
+ .update(updateData)
101
+ .eq("id", request_id)
102
+ .select("*")
103
+ .single();
104
+ if (error) {
105
+ return IWebResponse.error(error.message)
106
+ .to_compatible();
107
+ }
108
+ if (!data) {
109
+ return IWebResponse.error("Maintenance request not found").to_compatible();
110
+ }
111
+ return IWebResponse.success(data).to_compatible();
112
+ }
113
+ export async function delete_maintenance_request(client, request_id) {
114
+ const { data, error } = await client
115
+ .from("maintenance_requests")
116
+ .delete()
117
+ .eq("id", request_id)
118
+ .select("*")
119
+ .single();
120
+ if (error) {
121
+ return IWebResponse.error(error.message)
122
+ .to_compatible();
123
+ }
124
+ if (!data) {
125
+ return IWebResponse.error("Maintenance request not found").to_compatible();
126
+ }
127
+ return IWebResponse.success(data).to_compatible();
128
+ }
@@ -0,0 +1,8 @@
1
+ import { IManufacturer, ManufacturerInsert, ManufacturerUpdate } from "../types/db";
2
+ import { IWebResponseCompatible } from "../types/requests";
3
+ export declare function server_get_manufacturers(options?: {
4
+ include_inactive?: boolean;
5
+ }): Promise<IWebResponseCompatible<IManufacturer[]>>;
6
+ export declare function server_get_manufacturer_by_id(manufacturer_id: number): Promise<IWebResponseCompatible<IManufacturer | null>>;
7
+ export declare function server_create_manufacturer(row: ManufacturerInsert): Promise<IWebResponseCompatible<IManufacturer | null>>;
8
+ export declare function server_update_manufacturer(manufacturer_id: number, updates: ManufacturerUpdate): Promise<IWebResponseCompatible<IManufacturer | null>>;