@htlkg/data 0.0.15 → 0.0.16

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.
@@ -43,3 +43,12 @@ export {
43
43
 
44
44
  // Server-side query helpers
45
45
  export { executeServerQuery, executePublicQuery } from "./server-helpers";
46
+
47
+ // SystemSettings queries
48
+ export {
49
+ getSystemSettings,
50
+ getSoftDeleteRetentionDays,
51
+ checkRestoreEligibility,
52
+ SYSTEM_SETTINGS_KEY,
53
+ DEFAULT_SOFT_DELETE_RETENTION_DAYS,
54
+ } from "./systemSettings";
@@ -0,0 +1,115 @@
1
+ /**
2
+ * SystemSettings Query Functions
3
+ *
4
+ * Provides query functions for fetching system settings from the GraphQL API.
5
+ */
6
+
7
+ import type { SystemSettings } from "@htlkg/core/types";
8
+
9
+ /** Default retention days if no settings exist */
10
+ export const DEFAULT_SOFT_DELETE_RETENTION_DAYS = 30;
11
+
12
+ /** The key used for global system settings */
13
+ export const SYSTEM_SETTINGS_KEY = "GLOBAL";
14
+
15
+ /**
16
+ * Get system settings
17
+ *
18
+ * @example
19
+ * ```typescript
20
+ * import { getSystemSettings } from '@htlkg/data/queries';
21
+ * import { generateClient } from '@htlkg/data/client';
22
+ *
23
+ * const client = generateClient<Schema>();
24
+ * const settings = await getSystemSettings(client);
25
+ * ```
26
+ */
27
+ export async function getSystemSettings<TClient = any>(
28
+ client: TClient,
29
+ ): Promise<SystemSettings | null> {
30
+ try {
31
+ const { data, errors } = await (client as any).models.SystemSettings.get({
32
+ key: SYSTEM_SETTINGS_KEY,
33
+ });
34
+
35
+ if (errors) {
36
+ console.error("[getSystemSettings] GraphQL errors:", errors);
37
+ return null;
38
+ }
39
+
40
+ return data as SystemSettings;
41
+ } catch (error) {
42
+ console.error("[getSystemSettings] Error fetching system settings:", error);
43
+ throw error;
44
+ }
45
+ }
46
+
47
+ /**
48
+ * Get the soft delete retention days from system settings
49
+ * Returns the default (30 days) if settings don't exist
50
+ *
51
+ * @example
52
+ * ```typescript
53
+ * import { getSoftDeleteRetentionDays } from '@htlkg/data/queries';
54
+ * import { generateClient } from '@htlkg/data/client';
55
+ *
56
+ * const client = generateClient<Schema>();
57
+ * const days = await getSoftDeleteRetentionDays(client);
58
+ * ```
59
+ */
60
+ export async function getSoftDeleteRetentionDays<TClient = any>(
61
+ client: TClient,
62
+ ): Promise<number> {
63
+ const settings = await getSystemSettings(client);
64
+ return settings?.softDeleteRetentionDays ?? DEFAULT_SOFT_DELETE_RETENTION_DAYS;
65
+ }
66
+
67
+ /**
68
+ * Check if a soft-deleted item can still be restored based on retention period
69
+ *
70
+ * @param deletedAt - The ISO date string when the item was deleted
71
+ * @param retentionDays - Number of days items can be restored
72
+ * @returns Object with canRestore flag and daysRemaining/daysExpired
73
+ */
74
+ export function checkRestoreEligibility(
75
+ deletedAt: string | undefined | null,
76
+ retentionDays: number,
77
+ ): {
78
+ canRestore: boolean;
79
+ daysRemaining: number;
80
+ daysExpired: number;
81
+ expiresAt: Date | null;
82
+ } {
83
+ if (!deletedAt) {
84
+ return {
85
+ canRestore: false,
86
+ daysRemaining: 0,
87
+ daysExpired: 0,
88
+ expiresAt: null,
89
+ };
90
+ }
91
+
92
+ const deletedDate = new Date(deletedAt);
93
+ const expiresAt = new Date(deletedDate);
94
+ expiresAt.setDate(expiresAt.getDate() + retentionDays);
95
+
96
+ const now = new Date();
97
+ const msRemaining = expiresAt.getTime() - now.getTime();
98
+ const daysRemaining = Math.ceil(msRemaining / (1000 * 60 * 60 * 24));
99
+
100
+ if (daysRemaining <= 0) {
101
+ return {
102
+ canRestore: false,
103
+ daysRemaining: 0,
104
+ daysExpired: Math.abs(daysRemaining),
105
+ expiresAt,
106
+ };
107
+ }
108
+
109
+ return {
110
+ canRestore: true,
111
+ daysRemaining,
112
+ daysExpired: 0,
113
+ expiresAt,
114
+ };
115
+ }