dn-react-router-toolkit 0.9.0 → 0.9.2

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 (103) hide show
  1. package/dist/api/default_api_handler.d.mts +13 -0
  2. package/dist/api/default_api_handler.d.ts +13 -0
  3. package/dist/api/{create_handler.js → default_api_handler.js} +49 -52
  4. package/dist/api/{create_handler.mjs → default_api_handler.mjs} +45 -48
  5. package/dist/api/index.d.mts +8 -7
  6. package/dist/api/index.d.ts +8 -7
  7. package/dist/api/index.js +233 -147
  8. package/dist/api/index.mjs +238 -151
  9. package/dist/api/put_resource_handler.d.mts +25 -0
  10. package/dist/api/put_resource_handler.d.ts +25 -0
  11. package/dist/api/put_resource_handler.js +214 -0
  12. package/dist/api/put_resource_handler.mjs +194 -0
  13. package/dist/api/resource_handler.d.mts +26 -0
  14. package/dist/api/resource_handler.d.ts +26 -0
  15. package/dist/api/resource_handler.js +280 -0
  16. package/dist/api/resource_handler.mjs +265 -0
  17. package/dist/auth/cookie_manager.d.mts +1 -1
  18. package/dist/auth/cookie_manager.d.ts +1 -1
  19. package/dist/auth/index.d.mts +2 -2
  20. package/dist/auth/index.d.ts +2 -2
  21. package/dist/auth/index.js +18 -18
  22. package/dist/auth/index.mjs +18 -18
  23. package/dist/auth/with_auth.d.mts +2 -2
  24. package/dist/auth/with_auth.d.ts +2 -2
  25. package/dist/auth/with_auth.js +18 -18
  26. package/dist/auth/with_auth.mjs +18 -18
  27. package/dist/client/editor.d.mts +2 -2
  28. package/dist/client/editor.d.ts +2 -2
  29. package/dist/client/editor.js +9 -3
  30. package/dist/client/editor.mjs +9 -3
  31. package/dist/client/index.d.mts +2 -2
  32. package/dist/client/index.d.ts +2 -2
  33. package/dist/client/index.js +9 -3
  34. package/dist/client/index.mjs +9 -3
  35. package/dist/crud/crud_form.js +22 -4
  36. package/dist/crud/crud_form.mjs +11 -3
  37. package/dist/crud/crud_form_provider.js +16 -3
  38. package/dist/crud/crud_form_provider.mjs +14 -1
  39. package/dist/crud/index.js +22 -4
  40. package/dist/crud/index.mjs +11 -3
  41. package/dist/db/backup/index.d.mts +1 -1
  42. package/dist/db/backup/index.d.ts +1 -1
  43. package/dist/form/create_form_component.js +21 -2
  44. package/dist/form/create_form_component.mjs +10 -1
  45. package/dist/form/form_components.js +21 -2
  46. package/dist/form/form_components.mjs +10 -1
  47. package/dist/form/index.js +21 -2
  48. package/dist/form/index.mjs +10 -1
  49. package/dist/post/editor_toolbar.js +20 -3
  50. package/dist/post/editor_toolbar.mjs +9 -2
  51. package/dist/post/index.js +31 -11
  52. package/dist/post/index.mjs +19 -9
  53. package/dist/post/post_form_page.js +29 -11
  54. package/dist/post/post_form_page.mjs +17 -9
  55. package/dist/post/thumbnail_picker.js +21 -2
  56. package/dist/post/thumbnail_picker.mjs +10 -1
  57. package/dist/table/buttons.js +11 -14
  58. package/dist/table/buttons.mjs +10 -13
  59. package/dist/table/index.js +14 -18
  60. package/dist/table/index.mjs +13 -17
  61. package/dist/table/table.js +10 -4
  62. package/dist/table/table.mjs +5 -1
  63. package/dist/table/table_form.js +12 -18
  64. package/dist/table/table_form.mjs +9 -15
  65. package/dist/utils/cn.d.mts +3 -0
  66. package/dist/utils/cn.d.ts +3 -0
  67. package/dist/utils/cn.js +32 -0
  68. package/dist/utils/cn.mjs +7 -0
  69. package/dist/utils/date.d.mts +5 -0
  70. package/dist/utils/date.d.ts +5 -0
  71. package/dist/utils/date.js +65 -0
  72. package/dist/utils/date.mjs +29 -0
  73. package/dist/utils/index.d.mts +7 -0
  74. package/dist/utils/index.d.ts +7 -0
  75. package/dist/utils/index.js +116 -0
  76. package/dist/utils/index.mjs +73 -0
  77. package/dist/utils/korean.d.mts +6 -0
  78. package/dist/utils/korean.d.ts +6 -0
  79. package/dist/utils/korean.js +41 -0
  80. package/dist/utils/korean.mjs +16 -0
  81. package/dist/utils/singleton.d.mts +3 -0
  82. package/dist/utils/singleton.d.ts +3 -0
  83. package/dist/utils/singleton.js +37 -0
  84. package/dist/utils/singleton.mjs +12 -0
  85. package/dist/utils/sleep.d.mts +3 -0
  86. package/dist/utils/sleep.d.ts +3 -0
  87. package/dist/utils/sleep.js +32 -0
  88. package/dist/utils/sleep.mjs +7 -0
  89. package/dist/utils/slug.d.mts +3 -0
  90. package/dist/utils/slug.d.ts +3 -0
  91. package/dist/utils/slug.js +32 -0
  92. package/dist/utils/slug.mjs +7 -0
  93. package/package.json +8 -4
  94. package/dist/api/create_api_handler.d.mts +0 -30
  95. package/dist/api/create_api_handler.d.ts +0 -30
  96. package/dist/api/create_api_handler.js +0 -155
  97. package/dist/api/create_api_handler.mjs +0 -139
  98. package/dist/api/create_handler.d.mts +0 -13
  99. package/dist/api/create_handler.d.ts +0 -13
  100. package/dist/api/item_api_handler.d.mts +0 -21
  101. package/dist/api/item_api_handler.d.ts +0 -21
  102. package/dist/api/item_api_handler.js +0 -63
  103. package/dist/api/item_api_handler.mjs +0 -38
package/dist/api/index.js CHANGED
@@ -1,7 +1,9 @@
1
1
  "use strict";
2
+ var __create = Object.create;
2
3
  var __defProp = Object.defineProperty;
3
4
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
5
  var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
5
7
  var __hasOwnProp = Object.prototype.hasOwnProperty;
6
8
  var __export = (target, all) => {
7
9
  for (var name in all)
@@ -15,20 +17,27 @@ var __copyProps = (to, from, except, desc) => {
15
17
  }
16
18
  return to;
17
19
  };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
18
28
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
29
 
20
30
  // src/api/index.ts
21
31
  var api_exports = {};
22
32
  __export(api_exports, {
23
- apiHandler: () => apiHandler,
24
- createAPIHandler: () => createAPIHandler,
25
- itemApiHandler: () => itemApiHandler
33
+ defaultAPIHandler: () => defaultAPIHandler,
34
+ putResourceHandler: () => putResourceHandler,
35
+ resourceHandler: () => resourceHandler
26
36
  });
27
37
  module.exports = __toCommonJS(api_exports);
28
38
 
29
- // src/api/create_handler.ts
30
- var import_http = require("dn-react-toolkit/http");
31
- var import_server = require("dn-react-toolkit/auth/server");
39
+ // src/api/default_api_handler.ts
40
+ var import_server = require("gw-auth/server");
32
41
 
33
42
  // src/auth/with_auth.ts
34
43
  var toResponse = (result) => {
@@ -54,31 +63,31 @@ function createWithStrictAuthHandler({ authService }) {
54
63
  arg.request
55
64
  );
56
65
  if (accessToken) {
57
- const payload = await authService.accessTokenManager.verify(accessToken);
58
- if (payload) {
59
- return respond(payload);
66
+ const verifyResult = await authService.accessTokenManager.verify(accessToken);
67
+ if (verifyResult.isOk) {
68
+ const payload = verifyResult.value;
69
+ if (payload) {
70
+ return respond(payload);
71
+ }
60
72
  }
61
73
  }
62
74
  const refreshToken = await authService.getRefreshTokenFromCookies(
63
75
  arg.request
64
76
  );
65
77
  if (refreshToken) {
66
- try {
67
- const newAccessToken = await authService.refreshAccessToken(refreshToken);
68
- const setCookieHeader = await authService.getAccessTokenSetCookie(
69
- newAccessToken
70
- );
71
- const headers = new Headers();
72
- headers.append("Set-Cookie", setCookieHeader);
73
- const payload = authService.accessTokenManager.decode(newAccessToken);
74
- return respond(payload, headers);
75
- } catch (e) {
76
- console.log(e);
77
- const setCookieHeader = await authService.getRefreshTokenSetCookie(void 0);
78
- const headers = new Headers();
79
- headers.append("Set-Cookie", setCookieHeader);
80
- return respond(void 0, headers);
78
+ const refreshResult = await authService.refreshAccessToken(refreshToken);
79
+ if (refreshResult.isErr) {
80
+ const setCookieHeader2 = await authService.getRefreshTokenSetCookie(void 0);
81
+ const headers2 = new Headers();
82
+ headers2.append("Set-Cookie", setCookieHeader2);
83
+ return respond(void 0, headers2);
81
84
  }
85
+ const newAccessToken = refreshResult.value;
86
+ const setCookieHeader = await authService.getAccessTokenSetCookie(newAccessToken);
87
+ const headers = new Headers();
88
+ headers.append("Set-Cookie", setCookieHeader);
89
+ const payload = authService.accessTokenManager.decode(newAccessToken);
90
+ return respond(payload, headers);
82
91
  }
83
92
  return respond(void 0);
84
93
  };
@@ -89,13 +98,14 @@ function createWithStrictAuthHandler({ authService }) {
89
98
  // src/auth/cookie_manager.ts
90
99
  var import_react_router = require("react-router");
91
100
 
92
- // src/api/create_handler.ts
93
- var import_server2 = require("dn-react-toolkit/file/server");
94
- var createAPIHandler = ({
101
+ // src/api/default_api_handler.ts
102
+ var import_server2 = require("gw-file/server");
103
+ var import_gw_response = require("gw-response");
104
+ var defaultAPIHandler = ({
95
105
  authService,
96
106
  fileService,
97
107
  passwordRecoveryService,
98
- getThirdPartyAuth,
108
+ authProviders,
99
109
  signupTokenManager
100
110
  }) => {
101
111
  const handler = async (args) => {
@@ -110,7 +120,7 @@ var createAPIHandler = ({
110
120
  switch (method) {
111
121
  case "GET": {
112
122
  return withAuth(
113
- (auth) => ({ request: request2 }) => (0, import_server.findAuthHandler)(auth)(request2)
123
+ (auth) => ({ request: request2 }) => (0, import_server.findAuthHandler)(auth)()
114
124
  );
115
125
  }
116
126
  }
@@ -130,13 +140,10 @@ var createAPIHandler = ({
130
140
  const provider = slug[2];
131
141
  switch (method) {
132
142
  case "POST": {
133
- return (0, import_server.loginWithThirdPartyHandler)(
134
- request,
135
- {
136
- provider,
137
- getThirdPartyAuth
138
- }
139
- );
143
+ return (0, import_server.loginWithThirdPartyHandler)(request, {
144
+ provider,
145
+ authProviders
146
+ });
140
147
  }
141
148
  }
142
149
  }
@@ -175,14 +182,11 @@ var createAPIHandler = ({
175
182
  default: {
176
183
  switch (method) {
177
184
  case "POST": {
178
- return (0, import_server.signUpWithThirdpartyHandler)(
179
- request,
180
- {
181
- authService,
182
- fileService,
183
- signupTokenManager
184
- }
185
- );
185
+ return (0, import_server.signUpWithThirdpartyHandler)(request, {
186
+ authService,
187
+ fileService,
188
+ signupTokenManager
189
+ });
186
190
  }
187
191
  }
188
192
  }
@@ -195,7 +199,7 @@ var createAPIHandler = ({
195
199
  return (0, import_server.thirdpartyAuthCallbackHandler)(request, {
196
200
  provider,
197
201
  authService,
198
- getThirdPartyAuth
202
+ authProviders
199
203
  });
200
204
  }
201
205
  }
@@ -218,9 +222,9 @@ var createAPIHandler = ({
218
222
  switch (method) {
219
223
  case "POST": {
220
224
  return withAuth(
221
- (auth) => ({ request: request2 }) => (0, import_server2.uploadFileHandler)({ fileService })(
222
- auth
223
- )(request2)
225
+ (auth) => ({ request: request2 }) => (0, import_server2.uploadFileHandler)({ fileService })(request2, {
226
+ userId: auth?.userId
227
+ })
224
228
  )(args);
225
229
  }
226
230
  }
@@ -232,7 +236,7 @@ var createAPIHandler = ({
232
236
  return withAuth(
233
237
  (auth) => () => (0, import_server2.deleteFileHandler)({
234
238
  fileRepository: fileService.fileRepository
235
- })({ fileId })(auth)()
239
+ })({ fileId, userId: auth?.userId })()
236
240
  );
237
241
  }
238
242
  }
@@ -240,17 +244,27 @@ var createAPIHandler = ({
240
244
  }
241
245
  }
242
246
  default: {
243
- return (0, import_http.NOT_FOUND)();
247
+ return (0, import_gw_response.httpNotFound)({
248
+ code: "RESOURCE_NOT_FOUND",
249
+ message: "\uB9AC\uC18C\uC2A4\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4."
250
+ });
244
251
  }
245
252
  }
246
253
  };
247
254
  return handler;
248
255
  };
249
256
 
250
- // src/api/create_api_handler.ts
251
- var import_http2 = require("dn-react-toolkit/http");
252
- var import_drizzle_orm = require("drizzle-orm");
253
- var import_uuid = require("uuid");
257
+ // src/api/resource_handler.ts
258
+ var import_gw_response3 = require("gw-response");
259
+ var import_gw_result = require("gw-result");
260
+
261
+ // src/api/put_resource_handler.ts
262
+ var import_gw_response2 = require("gw-response");
263
+
264
+ // src/crud/crud_form_provider.tsx
265
+ var import_react_router2 = require("react-router");
266
+ var import_react_store_input = require("react-store-input");
267
+ var import_react = require("react");
254
268
 
255
269
  // src/crud/serialize.ts
256
270
  function deserialize(data) {
@@ -289,119 +303,191 @@ function deserialize(data) {
289
303
  return void 0;
290
304
  }
291
305
 
292
- // src/api/create_api_handler.ts
293
- function apiHandler({
294
- withAuthAction,
306
+ // src/crud/crud_form_provider.tsx
307
+ var import_jsx_runtime = require("react/jsx-runtime");
308
+ var FormContext = (0, import_react.createContext)({});
309
+
310
+ // src/form/create_form_component.tsx
311
+ var import_react2 = require("react");
312
+
313
+ // src/utils/cn.ts
314
+ function cn(...classes) {
315
+ return classes.filter(Boolean).join(" ").trim();
316
+ }
317
+
318
+ // src/utils/date.ts
319
+ var import_moment_timezone = __toESM(require("moment-timezone"));
320
+
321
+ // src/form/create_form_component.tsx
322
+ var import_jsx_runtime2 = require("react/jsx-runtime");
323
+ function createComponent(tag, options) {
324
+ return function FormComponent({ className, ...props }) {
325
+ const Tag = tag;
326
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Tag, { ...props, className: cn(options.className, className) });
327
+ };
328
+ }
329
+
330
+ // src/form/form_components.tsx
331
+ var FormEntry = createComponent("div", {
332
+ className: "flex-1"
333
+ });
334
+ var FormRow = createComponent("div", {
335
+ className: "flex-1 flex gap-4 mb-6"
336
+ });
337
+ var FormLabel = createComponent("label", {
338
+ className: "flex-1 font-semibold mb-2.5 block"
339
+ });
340
+
341
+ // src/crud/crud_form.tsx
342
+ var import_react_store_input3 = require("react-store-input");
343
+
344
+ // src/client/env_loader.tsx
345
+ var import_react_router3 = require("react-router");
346
+ var import_jsx_runtime3 = require("react/jsx-runtime");
347
+
348
+ // src/client/file_input.tsx
349
+ var import_react3 = require("react");
350
+ var import_jsx_runtime4 = require("react/jsx-runtime");
351
+
352
+ // src/client/use_user_agent.tsx
353
+ var import_react_router4 = require("react-router");
354
+
355
+ // src/client/store_text_editor.tsx
356
+ var import_dn_react_text_editor = require("dn-react-text-editor");
357
+ var import_react_store_input2 = require("react-store-input");
358
+ var import_react4 = require("react");
359
+ var import_jsx_runtime5 = require("react/jsx-runtime");
360
+
361
+ // src/client/editor.tsx
362
+ var import_client = require("gw-file/client");
363
+
364
+ // src/crud/crud_form.tsx
365
+ var import_jsx_runtime6 = require("react/jsx-runtime");
366
+
367
+ // src/api/put_resource_handler.ts
368
+ var import_drizzle_orm = require("drizzle-orm");
369
+ var import_uuid = require("uuid");
370
+ function putResourceHandler({
295
371
  repository,
296
372
  validators,
297
373
  existingConditions,
298
374
  injectUserId,
299
- roles
375
+ isOwnedBy
300
376
  }) {
301
- const loader = async ({ request }) => {
302
- return {};
303
- };
304
- const action = withAuthAction((auth) => async ({ request }) => {
305
- if (roles && roles.length > 0 && (!auth || !roles.includes(auth.role))) {
306
- throw (0, import_http2.UNAUTHORIZED)();
377
+ return async (auth, request) => {
378
+ const serilaizedParams = await request.json();
379
+ const params = deserialize(serilaizedParams);
380
+ const itemId = params.id || (0, import_uuid.v4)();
381
+ if (params.id) {
382
+ const existing = await repository.find(itemId);
383
+ if (!existing) {
384
+ return (0, import_gw_response2.httpNotFound)();
385
+ }
386
+ if (isOwnedBy && (!auth || !isOwnedBy(auth, existing))) {
387
+ return (0, import_gw_response2.httpForbidden)();
388
+ }
307
389
  }
308
- switch (request.method) {
309
- case "POST":
310
- case "PUT": {
311
- try {
312
- const serilaizedParams = await request.json();
313
- const params = deserialize(serilaizedParams);
314
- if (validators) {
315
- const paramsForValidation = Object.keys(validators).filter(
316
- (key) => Object.prototype.hasOwnProperty.call(validators, key)
317
- );
318
- for (const paramKey of paramsForValidation) {
319
- const value = params[paramKey];
320
- const validator = validators[paramKey];
321
- if (validator?.validate && !validator.validate(value)) {
322
- throw (0, import_http2.BAD_REQUEST)(
323
- validator.message ? validator.message(value) : void 0
324
- );
325
- }
326
- }
327
- }
328
- const itemId = params.id || (0, import_uuid.v4)();
329
- if (!params.id && existingConditions) {
330
- const paramsForExistenceCheck = Object.keys(
331
- existingConditions
332
- ).filter(
333
- (key) => Object.prototype.hasOwnProperty.call(params, key)
334
- );
335
- if (paramsForExistenceCheck.length > 0) {
336
- const where = (0, import_drizzle_orm.and)(
337
- ...paramsForExistenceCheck.reduce((acc, key) => {
338
- const condition = existingConditions[key];
339
- if (condition) {
340
- acc.push(condition(params[key]));
341
- }
342
- return acc;
343
- }, [])
344
- );
345
- const existing = await repository.findAll({
346
- limit: 1,
347
- where
348
- });
349
- if (existing.length > 0) {
350
- throw (0, import_http2.CONFLICT)("\uC790\uB8CC\uAC00 \uC774\uBBF8 \uC874\uC7AC\uD569\uB2C8\uB2E4.");
351
- }
390
+ if (validators) {
391
+ const paramsForValidation = Object.keys(validators).filter(
392
+ (key) => Object.prototype.hasOwnProperty.call(validators, key)
393
+ );
394
+ for (const paramKey of paramsForValidation) {
395
+ const value = params[paramKey];
396
+ const validator = validators[paramKey];
397
+ if (validator?.validate && !validator.validate(value)) {
398
+ return (0, import_gw_response2.httpBadRequest)({
399
+ code: "BAD_REQUEST",
400
+ message: validator.message ? validator.message(value) : "\uC798\uBABB\uB41C \uC694\uCCAD\uC785\uB2C8\uB2E4."
401
+ });
402
+ }
403
+ }
404
+ }
405
+ if (!params.id && existingConditions) {
406
+ const paramsForExistenceCheck = Object.keys(existingConditions).filter(
407
+ (key) => Object.prototype.hasOwnProperty.call(params, key)
408
+ );
409
+ if (paramsForExistenceCheck.length > 0) {
410
+ const where = (0, import_drizzle_orm.and)(
411
+ ...paramsForExistenceCheck.reduce((acc, key) => {
412
+ const condition = existingConditions[key];
413
+ if (condition) {
414
+ acc.push(condition(params[key]));
352
415
  }
353
- }
354
- const values = {
355
- id: itemId,
356
- userId: injectUserId ? auth?.userId : void 0,
357
- ...params
358
- };
359
- const item = await repository.save(values);
360
- return (0, import_http2.CREATED)(item);
361
- } catch (error) {
362
- if (error instanceof Error) {
363
- throw (0, import_http2.INTERNAL_SERVER_ERROR)(error.message);
364
- }
365
- throw error;
416
+ return acc;
417
+ }, [])
418
+ );
419
+ const existing = await repository.findAll({
420
+ limit: 1,
421
+ where
422
+ });
423
+ if (existing.length > 0) {
424
+ return (0, import_gw_response2.httpConflict)();
366
425
  }
367
426
  }
368
- default:
369
- throw (0, import_http2.METHOD_NOT_ALLOWED)();
370
427
  }
371
- });
372
- return {
373
- loader,
374
- action
428
+ const values = {
429
+ id: itemId,
430
+ userId: injectUserId ? auth?.userId : void 0,
431
+ ...params
432
+ };
433
+ const item = await repository.save(values);
434
+ return (0, import_gw_response2.httpCreated)(item);
375
435
  };
376
436
  }
377
437
 
378
- // src/api/item_api_handler.ts
379
- var import_http3 = require("dn-react-toolkit/http");
380
- function itemApiHandler({
438
+ // src/api/resource_handler.ts
439
+ function resourceHandler({
381
440
  withAuthAction,
382
441
  repository,
383
- isOwnedBy,
384
- roles
442
+ validators,
443
+ existingConditions,
444
+ injectUserId,
445
+ roles,
446
+ isOwnedBy
385
447
  }) {
386
448
  const loader = async ({ request }) => {
387
- return {};
449
+ return (0, import_gw_result.ok)({});
388
450
  };
389
- const action = withAuthAction((auth) => async ({ params, request }) => {
451
+ const action = withAuthAction((auth) => async ({ request, params }) => {
390
452
  if (roles && roles.length > 0 && (!auth || !roles.includes(auth.role))) {
391
- throw (0, import_http3.UNAUTHORIZED)();
453
+ return (0, import_gw_response3.httpForbidden)({
454
+ code: "FORBIDDEN",
455
+ message: "\uAD8C\uD55C\uC774 \uC5C6\uC2B5\uB2C8\uB2E4."
456
+ });
392
457
  }
393
458
  const itemId = params.itemId;
394
- const existing = await repository.find(itemId);
395
- if (!existing) {
396
- throw (0, import_http3.NOT_FOUND)();
397
- }
398
- if (isOwnedBy && !isOwnedBy(existing, auth)) {
399
- throw (0, import_http3.FORBIDDEN)();
459
+ if (itemId) {
460
+ const existing = await repository.find(itemId);
461
+ if (!existing) {
462
+ return (0, import_gw_response3.httpNotFound)();
463
+ }
464
+ if (isOwnedBy && (!auth || !isOwnedBy(auth, existing))) {
465
+ return (0, import_gw_response3.httpForbidden)();
466
+ }
467
+ switch (request.method) {
468
+ case "DELETE": {
469
+ await repository.delete(itemId);
470
+ return (0, import_gw_response3.httpNoContent)();
471
+ }
472
+ default: {
473
+ return (0, import_gw_response3.httpMethodNotAllowed)();
474
+ }
475
+ }
400
476
  }
401
477
  switch (request.method) {
402
- case "DELETE": {
403
- await repository.delete(itemId);
404
- return {};
478
+ case "POST":
479
+ case "PUT": {
480
+ const handler = putResourceHandler({
481
+ repository,
482
+ validators,
483
+ existingConditions,
484
+ injectUserId,
485
+ isOwnedBy
486
+ });
487
+ return handler(auth, request);
488
+ }
489
+ default: {
490
+ return (0, import_gw_response3.httpMethodNotAllowed)();
405
491
  }
406
492
  }
407
493
  });
@@ -412,7 +498,7 @@ function itemApiHandler({
412
498
  }
413
499
  // Annotate the CommonJS export names for ESM import in node:
414
500
  0 && (module.exports = {
415
- apiHandler,
416
- createAPIHandler,
417
- itemApiHandler
501
+ defaultAPIHandler,
502
+ putResourceHandler,
503
+ resourceHandler
418
504
  });