@carlonicora/nextjs-jsonapi 1.5.0 → 1.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (278) hide show
  1. package/dist/{ApiResponseInterface-DDI7QQPR.d.ts → ApiResponseInterface-DMwITHYP.d.mts} +11 -2
  2. package/dist/{ApiResponseInterface-BHN5D9r5.d.mts → ApiResponseInterface-DWgIAXI-.d.ts} +11 -2
  3. package/dist/AuthComponent-hxOPs9o8.d.mts +11 -0
  4. package/dist/AuthComponent-hxOPs9o8.d.ts +11 -0
  5. package/dist/{BlockNoteEditor-G6AK2NWA.js → BlockNoteEditor-IJASTIUZ.js} +16 -23
  6. package/dist/BlockNoteEditor-IJASTIUZ.js.map +1 -0
  7. package/dist/{BlockNoteEditor-AIEEQM6A.mjs → BlockNoteEditor-M6TUP3NT.mjs} +8 -15
  8. package/dist/BlockNoteEditor-M6TUP3NT.mjs.map +1 -0
  9. package/dist/JsonApiRequest-2OM5NDAW.js +24 -0
  10. package/dist/JsonApiRequest-2OM5NDAW.js.map +1 -0
  11. package/dist/{JsonApiRequest-6UR7DIAR.mjs → JsonApiRequest-SYZ6FGCA.mjs} +2 -3
  12. package/dist/{chunk-2K3Q24UF.js → chunk-3ZPK4QOB.js} +24 -14
  13. package/dist/chunk-3ZPK4QOB.js.map +1 -0
  14. package/dist/{chunk-VET55IZO.js → chunk-4L7OWJ2P.js} +10290 -7537
  15. package/dist/chunk-4L7OWJ2P.js.map +1 -0
  16. package/dist/chunk-4U5CJA44.mjs +3435 -0
  17. package/dist/chunk-4U5CJA44.mjs.map +1 -0
  18. package/dist/chunk-AGWQ75PQ.js +142 -0
  19. package/dist/chunk-AGWQ75PQ.js.map +1 -0
  20. package/dist/{chunk-PMXG5WBC.js → chunk-CKS6SVUK.js} +160 -24
  21. package/dist/chunk-CKS6SVUK.js.map +1 -0
  22. package/dist/{chunk-YF5XQZDR.mjs → chunk-F5UNXZ3J.mjs} +1 -1
  23. package/dist/chunk-F5UNXZ3J.mjs.map +1 -0
  24. package/dist/chunk-IGOWVLJH.mjs +142 -0
  25. package/dist/chunk-IGOWVLJH.mjs.map +1 -0
  26. package/dist/{chunk-HR4H2FP7.mjs → chunk-KJ4ETLJB.mjs} +24 -14
  27. package/dist/chunk-KJ4ETLJB.mjs.map +1 -0
  28. package/dist/{chunk-IKBA4AHN.mjs → chunk-SAL7XW2G.mjs} +143 -7
  29. package/dist/chunk-SAL7XW2G.mjs.map +1 -0
  30. package/dist/chunk-TW4QRJ7D.mjs +12085 -0
  31. package/dist/chunk-TW4QRJ7D.mjs.map +1 -0
  32. package/dist/chunk-U4NADAHN.js +3435 -0
  33. package/dist/chunk-U4NADAHN.js.map +1 -0
  34. package/dist/{chunk-EFJEWLRL.js → chunk-YUO55Q5A.js} +1 -1
  35. package/dist/chunk-YUO55Q5A.js.map +1 -0
  36. package/dist/client/index.d.mts +161 -11
  37. package/dist/client/index.d.ts +161 -11
  38. package/dist/client/index.js +71 -11
  39. package/dist/client/index.js.map +1 -1
  40. package/dist/client/index.mjs +70 -10
  41. package/dist/components/index.d.mts +763 -11
  42. package/dist/components/index.d.ts +763 -11
  43. package/dist/components/index.js +462 -11
  44. package/dist/components/index.js.map +1 -1
  45. package/dist/components/index.mjs +463 -12
  46. package/dist/config-BdCV25CE.d.mts +69 -0
  47. package/dist/config-C9dt1QiR.d.ts +69 -0
  48. package/dist/content.fields-Ck5lkQ5d.d.mts +47 -0
  49. package/dist/content.fields-Ck5lkQ5d.d.ts +47 -0
  50. package/dist/{content.interface-CR2aBeAW.d.ts → content.interface-B6qP_ABq.d.mts} +2 -3
  51. package/dist/{content.interface-FpLfsaRm.d.mts → content.interface-DHAFLasV.d.ts} +2 -3
  52. package/dist/contexts/index.d.mts +13 -6
  53. package/dist/contexts/index.d.ts +13 -6
  54. package/dist/contexts/index.js +7 -11
  55. package/dist/contexts/index.js.map +1 -1
  56. package/dist/contexts/index.mjs +6 -10
  57. package/dist/core/index.d.mts +575 -8
  58. package/dist/core/index.d.ts +575 -8
  59. package/dist/core/index.js +131 -3
  60. package/dist/core/index.js.map +1 -1
  61. package/dist/core/index.mjs +132 -4
  62. package/dist/index.d.mts +95 -71
  63. package/dist/index.d.ts +95 -71
  64. package/dist/index.js +113 -7
  65. package/dist/index.js.map +1 -1
  66. package/dist/index.mjs +135 -29
  67. package/dist/notification.interface-agcMYCkg.d.mts +228 -0
  68. package/dist/notification.interface-agcMYCkg.d.ts +228 -0
  69. package/dist/request-GBLBPYFM.js +8 -0
  70. package/dist/request-GBLBPYFM.js.map +1 -0
  71. package/dist/request-XABCMU25.mjs +8 -0
  72. package/dist/s3.service-DYnmymEd.d.mts +350 -0
  73. package/dist/s3.service-DyXjKTqr.d.ts +350 -0
  74. package/dist/server/index.d.mts +69 -4
  75. package/dist/server/index.d.ts +69 -4
  76. package/dist/server/index.js +211 -5
  77. package/dist/server/index.js.map +1 -1
  78. package/dist/server/index.mjs +211 -5
  79. package/dist/server/index.mjs.map +1 -1
  80. package/dist/token-2UWQJY5T.js +8 -0
  81. package/dist/token-2UWQJY5T.js.map +1 -0
  82. package/dist/token-EOK3N45S.mjs +8 -0
  83. package/dist/{useSocket-L-An7_Mr.d.mts → useSocket-91s8M4Xd.d.mts} +1 -1
  84. package/dist/{useSocket-BV6yMdWS.d.ts → useSocket-DSR7vaXj.d.ts} +1 -1
  85. package/package.json +12 -52
  86. package/src/client/JsonApiClient.ts +248 -0
  87. package/src/client/config.ts +78 -0
  88. package/src/client/index.ts +6 -1
  89. package/src/components/containers/TabsContainer.tsx +1 -1
  90. package/src/components/editors/BlockNoteEditor.tsx +3 -1
  91. package/src/components/index.ts +4 -0
  92. package/src/components/navigations/Breadcrumb.tsx +1 -1
  93. package/src/components/navigations/Header.tsx +2 -2
  94. package/src/contexts/CommonContext.tsx +1 -1
  95. package/src/contexts/SocketContext.tsx +1 -1
  96. package/src/contexts/index.ts +3 -0
  97. package/src/core/abstracts/ClientAbstractService.ts +255 -0
  98. package/src/core/abstracts/ServerAbstractService.ts +180 -0
  99. package/src/core/abstracts/index.ts +2 -0
  100. package/src/core/index.ts +35 -3
  101. package/src/discord/config.ts +15 -0
  102. package/src/discord/index.ts +1 -0
  103. package/src/features/auth/components/details/LandingComponent.tsx +2 -2
  104. package/src/features/auth/components/forms/AcceptInvitation.tsx +1 -1
  105. package/src/features/auth/components/forms/ActivateAccount.tsx +1 -1
  106. package/src/features/auth/components/forms/Cookies.tsx +2 -1
  107. package/src/features/auth/components/forms/ForgotPassword.tsx +1 -1
  108. package/src/features/auth/components/forms/Login.tsx +1 -1
  109. package/src/features/auth/components/forms/Logout.tsx +1 -1
  110. package/src/features/auth/components/forms/RefreshUser.tsx +2 -1
  111. package/src/features/auth/components/forms/Register.tsx +1 -1
  112. package/src/features/auth/components/forms/ResetPassword.tsx +1 -1
  113. package/src/features/auth/data/auth.service.ts +1 -1
  114. package/src/features/auth/utils/AuthCookies.ts +1 -1
  115. package/src/features/company/components/forms/CompanyConfigurationEditor.tsx +4 -2
  116. package/src/features/company/components/forms/CompanyDeleter.tsx +2 -1
  117. package/src/features/company/components/forms/CompanyEditor.tsx +6 -3
  118. package/src/features/company/components/forms/CompanyLicense.tsx +4 -2
  119. package/src/features/company/components/lists/CompaniesList.tsx +2 -1
  120. package/src/features/content/components/lists/ContentsListById.tsx +2 -1
  121. package/src/features/content/components/lists/RelevantContentsList.tsx +2 -1
  122. package/src/features/notification/components/lists/NotificationsList.tsx +2 -1
  123. package/src/features/notification/contexts/NotificationContext.tsx +2 -1
  124. package/src/features/role/components/forms/RemoveUserFromRole.tsx +4 -2
  125. package/src/features/role/components/forms/UserRoleAdd.tsx +2 -1
  126. package/src/features/role/components/lists/RolesList.tsx +2 -1
  127. package/src/features/role/components/lists/UserRolesList.tsx +2 -1
  128. package/src/features/user/components/forms/RoleUserAdd.tsx +4 -2
  129. package/src/features/user/components/forms/UserDeleter.tsx +2 -1
  130. package/src/features/user/components/forms/UserEditor.tsx +6 -3
  131. package/src/features/user/components/forms/UserMultiSelect.tsx +2 -1
  132. package/src/features/user/components/forms/UserReactivator.tsx +2 -1
  133. package/src/features/user/components/forms/UserResentInvitationEmail.tsx +2 -1
  134. package/src/features/user/components/forms/UserSelector.tsx +2 -1
  135. package/src/features/user/components/lists/AdminUsersList.tsx +2 -1
  136. package/src/features/user/components/lists/CompanyUsersList.tsx +2 -1
  137. package/src/features/user/components/lists/RelevantUsersList.tsx +2 -1
  138. package/src/features/user/components/lists/RoleUsersList.tsx +2 -1
  139. package/src/features/user/components/lists/UsersListByContentIds.tsx +2 -1
  140. package/src/features/user/hooks/useUserSearch.ts +2 -1
  141. package/src/hooks/useDataListRetriever.ts +4 -4
  142. package/src/hooks/usePageTracker.ts +1 -1
  143. package/src/hooks/usePushNotifications.ts +3 -2
  144. package/src/hooks/useSocket.ts +1 -1
  145. package/src/index.ts +7 -2
  146. package/src/roles/config.ts +0 -15
  147. package/src/roles/index.ts +1 -9
  148. package/src/server/JsonApiServer.ts +249 -0
  149. package/src/server/cache.ts +1 -1
  150. package/src/server/index.ts +13 -0
  151. package/src/server/request.ts +32 -18
  152. package/src/server/token.ts +1 -1
  153. package/dist/AbstractService-BsY6W3Ej.d.mts +0 -109
  154. package/dist/AbstractService-wLid8dB0.d.ts +0 -109
  155. package/dist/ApiData-DPKNfY-9.d.mts +0 -10
  156. package/dist/ApiData-DPKNfY-9.d.ts +0 -10
  157. package/dist/ApiDataInterface-DPP8s46n.d.mts +0 -21
  158. package/dist/ApiDataInterface-DPP8s46n.d.ts +0 -21
  159. package/dist/AuthComponent-B_Ps2Vb9.d.ts +0 -78
  160. package/dist/AuthComponent-CxnGgvoh.d.mts +0 -78
  161. package/dist/BlockNoteEditor-AIEEQM6A.mjs.map +0 -1
  162. package/dist/BlockNoteEditor-G6AK2NWA.js.map +0 -1
  163. package/dist/JsonApiRequest-UJ7FGIVI.js +0 -25
  164. package/dist/JsonApiRequest-UJ7FGIVI.js.map +0 -1
  165. package/dist/atoms/index.d.mts +0 -12
  166. package/dist/atoms/index.d.ts +0 -12
  167. package/dist/atoms/index.js +0 -9
  168. package/dist/atoms/index.js.map +0 -1
  169. package/dist/atoms/index.mjs +0 -9
  170. package/dist/chunk-2K3Q24UF.js.map +0 -1
  171. package/dist/chunk-32HM6MDD.js +0 -98
  172. package/dist/chunk-32HM6MDD.js.map +0 -1
  173. package/dist/chunk-3FBCC4G3.js +0 -8
  174. package/dist/chunk-3FBCC4G3.js.map +0 -1
  175. package/dist/chunk-3UELCPIN.js +0 -46
  176. package/dist/chunk-3UELCPIN.js.map +0 -1
  177. package/dist/chunk-5IET37O4.js +0 -4210
  178. package/dist/chunk-5IET37O4.js.map +0 -1
  179. package/dist/chunk-AGAJMJ4T.js +0 -147
  180. package/dist/chunk-AGAJMJ4T.js.map +0 -1
  181. package/dist/chunk-AYHKQWHH.js +0 -68
  182. package/dist/chunk-AYHKQWHH.js.map +0 -1
  183. package/dist/chunk-DEYKTLA3.js +0 -1131
  184. package/dist/chunk-DEYKTLA3.js.map +0 -1
  185. package/dist/chunk-EFJEWLRL.js.map +0 -1
  186. package/dist/chunk-FMBQZAIP.mjs +0 -490
  187. package/dist/chunk-FMBQZAIP.mjs.map +0 -1
  188. package/dist/chunk-HAG77QBV.mjs +0 -98
  189. package/dist/chunk-HAG77QBV.mjs.map +0 -1
  190. package/dist/chunk-HR4H2FP7.mjs.map +0 -1
  191. package/dist/chunk-IKBA4AHN.mjs.map +0 -1
  192. package/dist/chunk-J7YDGYSW.mjs +0 -9332
  193. package/dist/chunk-J7YDGYSW.mjs.map +0 -1
  194. package/dist/chunk-JGFWIT2E.mjs +0 -1131
  195. package/dist/chunk-JGFWIT2E.mjs.map +0 -1
  196. package/dist/chunk-P2F54I7Q.mjs +0 -4210
  197. package/dist/chunk-P2F54I7Q.mjs.map +0 -1
  198. package/dist/chunk-PMXG5WBC.js.map +0 -1
  199. package/dist/chunk-Q2N6SQYW.mjs +0 -8
  200. package/dist/chunk-Q2N6SQYW.mjs.map +0 -1
  201. package/dist/chunk-Q4FXESVT.js +0 -490
  202. package/dist/chunk-Q4FXESVT.js.map +0 -1
  203. package/dist/chunk-RBIVEH2K.mjs +0 -147
  204. package/dist/chunk-RBIVEH2K.mjs.map +0 -1
  205. package/dist/chunk-SM63SZCP.mjs +0 -68
  206. package/dist/chunk-SM63SZCP.mjs.map +0 -1
  207. package/dist/chunk-SZZYEG3P.mjs +0 -46
  208. package/dist/chunk-SZZYEG3P.mjs.map +0 -1
  209. package/dist/chunk-VET55IZO.js.map +0 -1
  210. package/dist/chunk-YF5XQZDR.mjs.map +0 -1
  211. package/dist/config-BmnK65TD.d.mts +0 -35
  212. package/dist/config-BmnK65TD.d.ts +0 -35
  213. package/dist/config-DQeAo9Kf.d.mts +0 -49
  214. package/dist/config-DQeAo9Kf.d.ts +0 -49
  215. package/dist/content.fields-cHPdM8GJ.d.mts +0 -27
  216. package/dist/content.fields-cHPdM8GJ.d.ts +0 -27
  217. package/dist/d3.link.interface-ClC4Irqp.d.mts +0 -21
  218. package/dist/d3.link.interface-ClC4Irqp.d.ts +0 -21
  219. package/dist/features/index.d.mts +0 -477
  220. package/dist/features/index.d.ts +0 -477
  221. package/dist/features/index.js +0 -108
  222. package/dist/features/index.js.map +0 -1
  223. package/dist/features/index.mjs +0 -108
  224. package/dist/hooks/index.d.mts +0 -69
  225. package/dist/hooks/index.d.ts +0 -69
  226. package/dist/hooks/index.js +0 -55
  227. package/dist/hooks/index.js.map +0 -1
  228. package/dist/hooks/index.mjs +0 -55
  229. package/dist/hooks/index.mjs.map +0 -1
  230. package/dist/interfaces/index.d.mts +0 -4
  231. package/dist/interfaces/index.d.ts +0 -4
  232. package/dist/interfaces/index.js +0 -2
  233. package/dist/interfaces/index.js.map +0 -1
  234. package/dist/interfaces/index.mjs +0 -2
  235. package/dist/interfaces/index.mjs.map +0 -1
  236. package/dist/notification.interface-B2BrLoDA.d.mts +0 -14
  237. package/dist/notification.interface-DlZLnAfg.d.ts +0 -14
  238. package/dist/permissions/index.d.mts +0 -41
  239. package/dist/permissions/index.d.ts +0 -41
  240. package/dist/permissions/index.js +0 -14
  241. package/dist/permissions/index.js.map +0 -1
  242. package/dist/permissions/index.mjs +0 -14
  243. package/dist/permissions/index.mjs.map +0 -1
  244. package/dist/request-7FE3LJLV.mjs +0 -9
  245. package/dist/request-7FE3LJLV.mjs.map +0 -1
  246. package/dist/request-QFS7NEIE.js +0 -9
  247. package/dist/request-QFS7NEIE.js.map +0 -1
  248. package/dist/roles/index.d.mts +0 -39
  249. package/dist/roles/index.d.ts +0 -39
  250. package/dist/roles/index.js +0 -18
  251. package/dist/roles/index.js.map +0 -1
  252. package/dist/roles/index.mjs +0 -18
  253. package/dist/roles/index.mjs.map +0 -1
  254. package/dist/shadcnui/index.d.mts +0 -698
  255. package/dist/shadcnui/index.d.ts +0 -698
  256. package/dist/shadcnui/index.js +0 -468
  257. package/dist/shadcnui/index.js.map +0 -1
  258. package/dist/shadcnui/index.mjs +0 -467
  259. package/dist/shadcnui/index.mjs.map +0 -1
  260. package/dist/token-IJSPOMW6.mjs +0 -9
  261. package/dist/token-IJSPOMW6.mjs.map +0 -1
  262. package/dist/token-UYE7CV6X.js +0 -9
  263. package/dist/token-UYE7CV6X.js.map +0 -1
  264. package/dist/types-B2QRyqyK.d.ts +0 -39
  265. package/dist/types-CgvNmxTd.d.mts +0 -39
  266. package/dist/types-t2PyXhDu.d.mts +0 -116
  267. package/dist/types-t2PyXhDu.d.ts +0 -116
  268. package/dist/user.interface-CooB1R79.d.mts +0 -85
  269. package/dist/user.interface-KnIT9pVY.d.ts +0 -85
  270. package/dist/utils/index.d.mts +0 -224
  271. package/dist/utils/index.d.ts +0 -224
  272. package/dist/utils/index.js +0 -46
  273. package/dist/utils/index.js.map +0 -1
  274. package/dist/utils/index.mjs +0 -46
  275. package/dist/utils/index.mjs.map +0 -1
  276. /package/dist/{JsonApiRequest-6UR7DIAR.mjs.map → JsonApiRequest-SYZ6FGCA.mjs.map} +0 -0
  277. /package/dist/{atoms/index.mjs.map → request-XABCMU25.mjs.map} +0 -0
  278. /package/dist/{features/index.mjs.map → token-EOK3N45S.mjs.map} +0 -0
@@ -0,0 +1,249 @@
1
+ // Server-only utilities (NOT server actions - these cannot be called from client components)
2
+
3
+ import { JsonApiDataFactory } from "../core/factories/JsonApiDataFactory";
4
+ import { ApiRequestDataTypeInterface } from "../core/interfaces/ApiRequestDataTypeInterface";
5
+ import { ApiResponseInterface } from "../core/interfaces/ApiResponseInterface";
6
+ import { translateResponse } from "../core/utils/translateResponse";
7
+ import { ModuleWithPermissions } from "../permissions/types";
8
+ import { serverRequest } from "./request";
9
+ import { getServerToken } from "./token";
10
+
11
+ // Config storage for server contexts
12
+ let _serverConfig: {
13
+ apiUrl: string;
14
+ appUrl?: string;
15
+ trackablePages?: ModuleWithPermissions[];
16
+ bootstrapper?: () => void;
17
+ additionalHeaders?: Record<string, string>;
18
+ } | null = null;
19
+
20
+ /**
21
+ * Configure the JSON:API server client.
22
+ * Call this in your Bootstrapper or server initialization.
23
+ */
24
+ export function configureServerJsonApi(config: {
25
+ apiUrl: string;
26
+ appUrl?: string;
27
+ trackablePages?: ModuleWithPermissions[];
28
+ bootstrapper?: () => void;
29
+ additionalHeaders?: Record<string, string>;
30
+ }): void {
31
+ _serverConfig = config;
32
+ if (config.bootstrapper) {
33
+ config.bootstrapper();
34
+ }
35
+ }
36
+
37
+ export function getServerApiUrl(): string {
38
+ if (_serverConfig?.apiUrl) {
39
+ return _serverConfig.apiUrl;
40
+ }
41
+ const envUrl = process.env.NEXT_PUBLIC_API_URL;
42
+ if (!envUrl) {
43
+ throw new Error("API URL not configured. Use configureServerJsonApi() or set NEXT_PUBLIC_API_URL environment variable.");
44
+ }
45
+ return envUrl;
46
+ }
47
+
48
+ export function getServerAppUrl(): string {
49
+ if (_serverConfig?.appUrl) {
50
+ return _serverConfig.appUrl;
51
+ }
52
+ const envUrl = process.env.NEXT_PUBLIC_ADDRESS;
53
+ if (!envUrl) {
54
+ throw new Error("App URL not configured. Use configureServerJsonApi({ appUrl }) or set NEXT_PUBLIC_ADDRESS environment variable.");
55
+ }
56
+ return envUrl.trim().replace(/\/+$/, "");
57
+ }
58
+
59
+ export function getServerTrackablePages(): ModuleWithPermissions[] {
60
+ return _serverConfig?.trackablePages ?? [];
61
+ }
62
+
63
+ function runServerBootstrapper(): void {
64
+ if (_serverConfig?.bootstrapper) {
65
+ _serverConfig.bootstrapper();
66
+ }
67
+ }
68
+
69
+ function buildServerUrl(endpoint: string): string {
70
+ const apiUrl = getServerApiUrl();
71
+ return endpoint.startsWith("http") ? endpoint : `${apiUrl}${endpoint}`;
72
+ }
73
+
74
+ export async function ServerJsonApiGet(params: {
75
+ classKey: ApiRequestDataTypeInterface;
76
+ endpoint: string;
77
+ companyId?: string;
78
+ language: string;
79
+ }): Promise<ApiResponseInterface> {
80
+ runServerBootstrapper();
81
+ const token = await getServerToken();
82
+
83
+ const apiResponse = await serverRequest({
84
+ method: "GET",
85
+ url: buildServerUrl(params.endpoint),
86
+ token,
87
+ cache: params.classKey.cache,
88
+ companyId: params.companyId,
89
+ language: params.language,
90
+ additionalHeaders: _serverConfig?.additionalHeaders,
91
+ });
92
+
93
+ return translateResponse({
94
+ classKey: params.classKey,
95
+ apiResponse,
96
+ companyId: params.companyId,
97
+ language: params.language,
98
+ paginationHandler: async (endpoint: string) =>
99
+ ServerJsonApiGet({
100
+ classKey: params.classKey,
101
+ endpoint,
102
+ companyId: params.companyId,
103
+ language: params.language,
104
+ }),
105
+ });
106
+ }
107
+
108
+ export async function ServerJsonApiPost(params: {
109
+ classKey: ApiRequestDataTypeInterface;
110
+ endpoint: string;
111
+ companyId?: string;
112
+ body?: any;
113
+ overridesJsonApiCreation?: boolean;
114
+ files?: { [key: string]: File | Blob } | File | Blob;
115
+ language: string;
116
+ responseType?: ApiRequestDataTypeInterface;
117
+ }): Promise<ApiResponseInterface> {
118
+ runServerBootstrapper();
119
+ const token = await getServerToken();
120
+
121
+ let body = params.body;
122
+ if (!body) {
123
+ body = {};
124
+ } else if (params.overridesJsonApiCreation !== true) {
125
+ body = JsonApiDataFactory.create(params.classKey, body);
126
+ }
127
+
128
+ const apiResponse = await serverRequest({
129
+ method: "POST",
130
+ url: buildServerUrl(params.endpoint),
131
+ token,
132
+ body,
133
+ files: params.files,
134
+ companyId: params.companyId,
135
+ language: params.language,
136
+ additionalHeaders: _serverConfig?.additionalHeaders,
137
+ });
138
+
139
+ return translateResponse({
140
+ classKey: params.responseType ?? params.classKey,
141
+ apiResponse,
142
+ companyId: params.companyId,
143
+ language: params.language,
144
+ });
145
+ }
146
+
147
+ export async function ServerJsonApiPut(params: {
148
+ classKey: ApiRequestDataTypeInterface;
149
+ endpoint: string;
150
+ companyId?: string;
151
+ body?: any;
152
+ files?: { [key: string]: File | Blob } | File | Blob;
153
+ language: string;
154
+ responseType?: ApiRequestDataTypeInterface;
155
+ }): Promise<ApiResponseInterface> {
156
+ runServerBootstrapper();
157
+ const token = await getServerToken();
158
+
159
+ let body = params.body;
160
+ if (!body) {
161
+ body = {};
162
+ } else {
163
+ body = JsonApiDataFactory.create(params.classKey, body);
164
+ }
165
+
166
+ const apiResponse = await serverRequest({
167
+ method: "PUT",
168
+ url: buildServerUrl(params.endpoint),
169
+ token,
170
+ body,
171
+ files: params.files,
172
+ companyId: params.companyId,
173
+ language: params.language,
174
+ additionalHeaders: _serverConfig?.additionalHeaders,
175
+ });
176
+
177
+ return translateResponse({
178
+ classKey: params.responseType ?? params.classKey,
179
+ apiResponse,
180
+ companyId: params.companyId,
181
+ language: params.language,
182
+ });
183
+ }
184
+
185
+ export async function ServerJsonApiPatch(params: {
186
+ classKey: ApiRequestDataTypeInterface;
187
+ endpoint: string;
188
+ companyId?: string;
189
+ body?: any;
190
+ files?: { [key: string]: File | Blob } | File | Blob;
191
+ overridesJsonApiCreation?: boolean;
192
+ responseType?: ApiRequestDataTypeInterface;
193
+ language: string;
194
+ }): Promise<ApiResponseInterface> {
195
+ runServerBootstrapper();
196
+ const token = await getServerToken();
197
+
198
+ let body = params.body;
199
+ if (!body) {
200
+ body = {};
201
+ } else if (params.overridesJsonApiCreation !== true) {
202
+ body = JsonApiDataFactory.create(params.classKey, body);
203
+ }
204
+
205
+ const apiResponse = await serverRequest({
206
+ method: "PATCH",
207
+ url: buildServerUrl(params.endpoint),
208
+ token,
209
+ body,
210
+ files: params.files,
211
+ companyId: params.companyId,
212
+ language: params.language,
213
+ additionalHeaders: _serverConfig?.additionalHeaders,
214
+ });
215
+
216
+ return translateResponse({
217
+ classKey: params.responseType ?? params.classKey,
218
+ apiResponse,
219
+ companyId: params.companyId,
220
+ language: params.language,
221
+ });
222
+ }
223
+
224
+ export async function ServerJsonApiDelete(params: {
225
+ classKey: ApiRequestDataTypeInterface;
226
+ endpoint: string;
227
+ companyId?: string;
228
+ language: string;
229
+ responseType?: ApiRequestDataTypeInterface;
230
+ }): Promise<ApiResponseInterface> {
231
+ runServerBootstrapper();
232
+ const token = await getServerToken();
233
+
234
+ const apiResponse = await serverRequest({
235
+ method: "DELETE",
236
+ url: buildServerUrl(params.endpoint),
237
+ token,
238
+ companyId: params.companyId,
239
+ language: params.language,
240
+ additionalHeaders: _serverConfig?.additionalHeaders,
241
+ });
242
+
243
+ return translateResponse({
244
+ classKey: params.responseType ?? params.classKey,
245
+ apiResponse,
246
+ companyId: params.companyId,
247
+ language: params.language,
248
+ });
249
+ }
@@ -1,4 +1,4 @@
1
- "use server";
1
+ // Server-only utilities (NOT server actions - these cannot be called from client components)
2
2
 
3
3
  import { revalidateTag } from "next/cache";
4
4
 
@@ -2,3 +2,16 @@ export * from "./cache";
2
2
  export * from "./request";
3
3
  export * from "./ServerSession";
4
4
  export * from "./token";
5
+ export * from "./JsonApiServer";
6
+
7
+ // Server-side services for use in RSC and server actions
8
+ // Re-exported from unified services with Server prefix aliases
9
+ export { AuthService as ServerAuthService } from "../features/auth/data/auth.service";
10
+ export { UserService as ServerUserService } from "../features/user/data/user.service";
11
+ export { CompanyService as ServerCompanyService } from "../features/company/data/company.service";
12
+ export { RoleService as ServerRoleService } from "../features/role/data/role.service";
13
+ export { ContentService as ServerContentService } from "../features/content/data/content.service";
14
+ export { NotificationService as ServerNotificationService } from "../features/notification/data/notification.service";
15
+ export { FeatureService as ServerFeatureService } from "../features/feature/data/feature.service";
16
+ export { PushService as ServerPushService } from "../features/push/data/push.service";
17
+ export { S3Service as ServerS3Service } from "../features/s3/data/s3.service";
@@ -1,8 +1,6 @@
1
- "use server";
1
+ // Server-only utilities (NOT server actions - these cannot be called from client components)
2
2
 
3
3
  import { ApiData } from "../core/interfaces/ApiData";
4
- import { cacheLife } from "next/dist/server/use-cache/cache-life";
5
- import { cacheTag } from "next/dist/server/use-cache/cache-tag";
6
4
 
7
5
  export interface ServerRequestParams {
8
6
  method: string;
@@ -16,13 +14,22 @@ export interface ServerRequestParams {
16
14
  additionalHeaders?: Record<string, string>;
17
15
  }
18
16
 
17
+ // Map cache configuration names to revalidation times in seconds
18
+ const cacheLifeToSeconds: Record<string, number> = {
19
+ seconds: 1,
20
+ minutes: 60,
21
+ hours: 3600,
22
+ days: 86400,
23
+ weeks: 604800,
24
+ max: 31536000, // 1 year
25
+ default: 60,
26
+ };
27
+
19
28
  /**
20
29
  * Server-side request with Next.js caching support.
21
- * Uses "use cache" directive for automatic caching.
30
+ * Uses fetch's native caching options for Next.js compatibility.
22
31
  */
23
32
  export async function serverRequest(params: ServerRequestParams): Promise<ApiData> {
24
- "use cache";
25
-
26
33
  const response: ApiData = {
27
34
  data: undefined,
28
35
  ok: false,
@@ -30,17 +37,6 @@ export async function serverRequest(params: ServerRequestParams): Promise<ApiDat
30
37
  statusText: "",
31
38
  };
32
39
 
33
- // Apply caching configuration
34
- if (params.cache) {
35
- if (["days", "default", "hours", "max", "minutes", "seconds", "weeks"].includes(params.cache)) {
36
- cacheLife(params.cache as any);
37
- } else {
38
- cacheTag(params.cache);
39
- }
40
- } else {
41
- cacheLife("seconds");
42
- }
43
-
44
40
  const additionalHeaders: Record<string, string> = { ...params.additionalHeaders };
45
41
 
46
42
  if (params.companyId) {
@@ -79,9 +75,27 @@ export async function serverRequest(params: ServerRequestParams): Promise<ApiDat
79
75
  additionalHeaders["Content-Type"] = "application/json";
80
76
  }
81
77
 
82
- const options: RequestInit = {
78
+ // Build Next.js fetch caching options
79
+ const nextOptions: { revalidate?: number; tags?: string[] } = {};
80
+
81
+ if (params.cache) {
82
+ // Check if it's a predefined cache life name
83
+ if (params.cache in cacheLifeToSeconds) {
84
+ nextOptions.revalidate = cacheLifeToSeconds[params.cache];
85
+ } else {
86
+ // Treat as a cache tag
87
+ nextOptions.tags = [params.cache];
88
+ nextOptions.revalidate = 60; // Default revalidation time for tagged caches
89
+ }
90
+ } else {
91
+ // Default to short caching
92
+ nextOptions.revalidate = 1;
93
+ }
94
+
95
+ const options: RequestInit & { next?: { revalidate?: number; tags?: string[] } } = {
83
96
  method: params.method,
84
97
  headers: { Accept: "application/json", ...additionalHeaders },
98
+ next: nextOptions,
85
99
  };
86
100
 
87
101
  if (requestBody !== undefined) {
@@ -1,4 +1,4 @@
1
- "use server";
1
+ // Server-only utilities (NOT server actions - these cannot be called from client components)
2
2
 
3
3
  /**
4
4
  * Get the authentication token from cookies (server-side)
@@ -1,109 +0,0 @@
1
- import { A as ApiDataInterface, J as JsonApiHydratedDataInterface } from './ApiDataInterface-DPP8s46n.mjs';
2
- import { A as ApiRequestDataTypeInterface } from './types-t2PyXhDu.mjs';
3
-
4
- declare abstract class AbstractApiData implements ApiDataInterface {
5
- protected _jsonApi?: any;
6
- protected _included?: any[];
7
- protected _id?: string;
8
- protected _type?: string;
9
- protected _createdAt?: Date;
10
- protected _updatedAt?: Date;
11
- protected _self?: string;
12
- get type(): string;
13
- get id(): string;
14
- get self(): string | undefined;
15
- get createdAt(): Date;
16
- get updatedAt(): Date;
17
- get included(): any[];
18
- get jsonApi(): any;
19
- ingestJsonApi(_data: JsonApiHydratedDataInterface): void;
20
- generateApiUrl(_params?: any): string;
21
- createJsonApi(_data?: any): any;
22
- protected _readIncluded<T extends ApiDataInterface>(data: JsonApiHydratedDataInterface, type: string, dataType: ApiRequestDataTypeInterface): T | T[] | undefined;
23
- dehydrate(): JsonApiHydratedDataInterface;
24
- rehydrate(data: JsonApiHydratedDataInterface): this;
25
- }
26
-
27
- declare enum HttpMethod {
28
- GET = "GET",
29
- POST = "POST",
30
- PUT = "PUT",
31
- PATCH = "PATCH",
32
- DELETE = "DELETE"
33
- }
34
- interface NextRef {
35
- next?: string;
36
- }
37
- interface PreviousRef {
38
- previous?: string;
39
- }
40
- interface SelfRef {
41
- self?: string;
42
- }
43
- /**
44
- * Set a global error handler for API errors (client-side only).
45
- * This handler will be called instead of throwing errors.
46
- */
47
- declare function setGlobalErrorHandler(handler: (status: number, message: string) => void): void;
48
- /**
49
- * Get the current global error handler.
50
- */
51
- declare function getGlobalErrorHandler(): ((status: number, message: string) => void) | null;
52
- /**
53
- * Abstract base class for services that interact with the JSON:API.
54
- * Extend this class to create feature-specific services.
55
- */
56
- declare abstract class AbstractService {
57
- /**
58
- * Extract locale from client-side URL pathname
59
- * URL structure: /{locale}/route-path (e.g., /it/accounts)
60
- * Fallback chain: URL locale → navigator.language → "en"
61
- */
62
- private static getClientLocale;
63
- static next<T>(params: {
64
- type: ApiRequestDataTypeInterface;
65
- endpoint: string;
66
- next?: NextRef;
67
- previous?: PreviousRef;
68
- self?: SelfRef;
69
- }): Promise<T>;
70
- /**
71
- * Fetch the previous page of results.
72
- */
73
- static previous<T>(params: {
74
- type: ApiRequestDataTypeInterface;
75
- endpoint: string;
76
- next?: NextRef;
77
- previous?: PreviousRef;
78
- self?: SelfRef;
79
- }): Promise<T>;
80
- /**
81
- * Make an API call with automatic environment detection and error handling.
82
- */
83
- protected static callApi<T>(params: {
84
- type: ApiRequestDataTypeInterface;
85
- method: HttpMethod;
86
- endpoint: string;
87
- companyId?: string;
88
- input?: any;
89
- overridesJsonApiCreation?: boolean;
90
- next?: NextRef;
91
- previous?: PreviousRef;
92
- self?: SelfRef;
93
- responseType?: ApiRequestDataTypeInterface;
94
- files?: {
95
- [key: string]: File | Blob;
96
- } | File | Blob;
97
- }): Promise<T>;
98
- /**
99
- * Get raw JSON:API response data without deserialization.
100
- */
101
- protected static getRawData(params: {
102
- type: ApiRequestDataTypeInterface;
103
- method: HttpMethod;
104
- endpoint: string;
105
- companyId?: string;
106
- }): Promise<any>;
107
- }
108
-
109
- export { AbstractApiData as A, HttpMethod as H, type NextRef as N, type PreviousRef as P, type SelfRef as S, AbstractService as a, getGlobalErrorHandler as g, setGlobalErrorHandler as s };
@@ -1,109 +0,0 @@
1
- import { A as ApiDataInterface, J as JsonApiHydratedDataInterface } from './ApiDataInterface-DPP8s46n.js';
2
- import { A as ApiRequestDataTypeInterface } from './types-t2PyXhDu.js';
3
-
4
- declare abstract class AbstractApiData implements ApiDataInterface {
5
- protected _jsonApi?: any;
6
- protected _included?: any[];
7
- protected _id?: string;
8
- protected _type?: string;
9
- protected _createdAt?: Date;
10
- protected _updatedAt?: Date;
11
- protected _self?: string;
12
- get type(): string;
13
- get id(): string;
14
- get self(): string | undefined;
15
- get createdAt(): Date;
16
- get updatedAt(): Date;
17
- get included(): any[];
18
- get jsonApi(): any;
19
- ingestJsonApi(_data: JsonApiHydratedDataInterface): void;
20
- generateApiUrl(_params?: any): string;
21
- createJsonApi(_data?: any): any;
22
- protected _readIncluded<T extends ApiDataInterface>(data: JsonApiHydratedDataInterface, type: string, dataType: ApiRequestDataTypeInterface): T | T[] | undefined;
23
- dehydrate(): JsonApiHydratedDataInterface;
24
- rehydrate(data: JsonApiHydratedDataInterface): this;
25
- }
26
-
27
- declare enum HttpMethod {
28
- GET = "GET",
29
- POST = "POST",
30
- PUT = "PUT",
31
- PATCH = "PATCH",
32
- DELETE = "DELETE"
33
- }
34
- interface NextRef {
35
- next?: string;
36
- }
37
- interface PreviousRef {
38
- previous?: string;
39
- }
40
- interface SelfRef {
41
- self?: string;
42
- }
43
- /**
44
- * Set a global error handler for API errors (client-side only).
45
- * This handler will be called instead of throwing errors.
46
- */
47
- declare function setGlobalErrorHandler(handler: (status: number, message: string) => void): void;
48
- /**
49
- * Get the current global error handler.
50
- */
51
- declare function getGlobalErrorHandler(): ((status: number, message: string) => void) | null;
52
- /**
53
- * Abstract base class for services that interact with the JSON:API.
54
- * Extend this class to create feature-specific services.
55
- */
56
- declare abstract class AbstractService {
57
- /**
58
- * Extract locale from client-side URL pathname
59
- * URL structure: /{locale}/route-path (e.g., /it/accounts)
60
- * Fallback chain: URL locale → navigator.language → "en"
61
- */
62
- private static getClientLocale;
63
- static next<T>(params: {
64
- type: ApiRequestDataTypeInterface;
65
- endpoint: string;
66
- next?: NextRef;
67
- previous?: PreviousRef;
68
- self?: SelfRef;
69
- }): Promise<T>;
70
- /**
71
- * Fetch the previous page of results.
72
- */
73
- static previous<T>(params: {
74
- type: ApiRequestDataTypeInterface;
75
- endpoint: string;
76
- next?: NextRef;
77
- previous?: PreviousRef;
78
- self?: SelfRef;
79
- }): Promise<T>;
80
- /**
81
- * Make an API call with automatic environment detection and error handling.
82
- */
83
- protected static callApi<T>(params: {
84
- type: ApiRequestDataTypeInterface;
85
- method: HttpMethod;
86
- endpoint: string;
87
- companyId?: string;
88
- input?: any;
89
- overridesJsonApiCreation?: boolean;
90
- next?: NextRef;
91
- previous?: PreviousRef;
92
- self?: SelfRef;
93
- responseType?: ApiRequestDataTypeInterface;
94
- files?: {
95
- [key: string]: File | Blob;
96
- } | File | Blob;
97
- }): Promise<T>;
98
- /**
99
- * Get raw JSON:API response data without deserialization.
100
- */
101
- protected static getRawData(params: {
102
- type: ApiRequestDataTypeInterface;
103
- method: HttpMethod;
104
- endpoint: string;
105
- companyId?: string;
106
- }): Promise<any>;
107
- }
108
-
109
- export { AbstractApiData as A, HttpMethod as H, type NextRef as N, type PreviousRef as P, type SelfRef as S, AbstractService as a, getGlobalErrorHandler as g, setGlobalErrorHandler as s };
@@ -1,10 +0,0 @@
1
- type ApiData = {
2
- data: any;
3
- ok: boolean;
4
- status: number;
5
- statusText: string;
6
- token?: string;
7
- refreshToken?: string;
8
- };
9
-
10
- export type { ApiData as A };
@@ -1,10 +0,0 @@
1
- type ApiData = {
2
- data: any;
3
- ok: boolean;
4
- status: number;
5
- statusText: string;
6
- token?: string;
7
- refreshToken?: string;
8
- };
9
-
10
- export type { ApiData as A };
@@ -1,21 +0,0 @@
1
- interface JsonApiHydratedDataInterface {
2
- jsonApi: any;
3
- included: any[];
4
- allData?: any[];
5
- }
6
-
7
- interface ApiDataInterface {
8
- get included(): any[];
9
- get type(): string;
10
- get id(): string;
11
- get createdAt(): Date;
12
- get updatedAt(): Date;
13
- get self(): string | undefined;
14
- get jsonApi(): any;
15
- generateApiUrl(params?: any): string;
16
- dehydrate(): JsonApiHydratedDataInterface;
17
- rehydrate(data: JsonApiHydratedDataInterface): this;
18
- createJsonApi(data: any): any;
19
- }
20
-
21
- export type { ApiDataInterface as A, JsonApiHydratedDataInterface as J };
@@ -1,21 +0,0 @@
1
- interface JsonApiHydratedDataInterface {
2
- jsonApi: any;
3
- included: any[];
4
- allData?: any[];
5
- }
6
-
7
- interface ApiDataInterface {
8
- get included(): any[];
9
- get type(): string;
10
- get id(): string;
11
- get createdAt(): Date;
12
- get updatedAt(): Date;
13
- get self(): string | undefined;
14
- get jsonApi(): any;
15
- generateApiUrl(params?: any): string;
16
- dehydrate(): JsonApiHydratedDataInterface;
17
- rehydrate(data: JsonApiHydratedDataInterface): this;
18
- createJsonApi(data: any): any;
19
- }
20
-
21
- export type { ApiDataInterface as A, JsonApiHydratedDataInterface as J };