gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[taler-typescript-core] branch master updated: fix #9509


From: Admin
Subject: [taler-typescript-core] branch master updated: fix #9509
Date: Tue, 11 Feb 2025 21:46:50 +0100

This is an automated email from the git hooks/post-receive script.

sebasjm pushed a commit to branch master
in repository taler-typescript-core.

The following commit(s) were added to refs/heads/master by this push:
     new a945c2fe7 fix #9509
a945c2fe7 is described below

commit a945c2fe7934fd258f7aa96fe8c623def8f4ca75
Author: Sebastian <sebasjm@gmail.com>
AuthorDate: Tue Feb 11 17:46:41 2025 -0300

    fix #9509
---
 .../paths/instance/webhooks/create/CreatePage.tsx  | 53 +++++++++++++++-------
 .../paths/instance/webhooks/update/UpdatePage.tsx  | 46 +++++++++++++++++--
 .../src/paths/instance/webhooks/update/index.tsx   | 24 +++++-----
 packages/taler-util/src/http-client/merchant.ts    |  2 +-
 4 files changed, 91 insertions(+), 34 deletions(-)

diff --git 
a/packages/merchant-backoffice-ui/src/paths/instance/webhooks/create/CreatePage.tsx
 
b/packages/merchant-backoffice-ui/src/paths/instance/webhooks/create/CreatePage.tsx
index a1493394c..5786ee6d6 100644
--- 
a/packages/merchant-backoffice-ui/src/paths/instance/webhooks/create/CreatePage.tsx
+++ 
b/packages/merchant-backoffice-ui/src/paths/instance/webhooks/create/CreatePage.tsx
@@ -39,6 +39,7 @@ interface Props {
   onBack?: () => void;
 }
 
+const validType = ["pay", "refund"];
 const validMethod = ["GET", "POST", "PUT", "PATCH", "HEAD"];
 
 export function CreatePage({ onCreate, onBack }: Props): VNode {
@@ -50,15 +51,19 @@ export function CreatePage({ onCreate, onBack }: Props): 
VNode {
     webhook_id: !state.webhook_id ? i18n.str`Required` : undefined,
     event_type: !state.event_type
       ? i18n.str`Required`
-      : state.event_type !== "pay" && state.event_type !== "refund"
-        ? i18n.str`Must be "pay" or "refund"`
+      : validType.indexOf(state.event_type) === -1
+        ? i18n.str`Must be one of '${validType.join(", ")}'`
         : undefined,
     http_method: !state.http_method
       ? i18n.str`Required`
-      : !validMethod.includes(state.http_method)
+      : validMethod.indexOf(state.http_method) === -1
         ? i18n.str`Must be one of '${validMethod.join(", ")}'`
         : undefined,
-    url: !state.url ? i18n.str`Required` : undefined,
+    url: !state.url
+      ? i18n.str`Required`
+      : isInvalidUrl(state.url)
+        ? i18n.str`URL is invalid`
+        : undefined,
   });
 
   const hasErrors = errors !== undefined;
@@ -87,24 +92,29 @@ export function CreatePage({ onCreate, onBack }: Props): 
VNode {
               <InputSelector
                 name="event_type"
                 label={i18n.str`Event`}
-                values={[
-                  i18n.str`Choose one...`,
-                  i18n.str`Pay`,
-                  i18n.str`Refund`,
-                ]}
+                values={["choose", ...validType]}
+                toStr={(v) => {
+                  const idx = validType.indexOf(v);
+                  if (idx === -1) return i18n.str`Choose one...`;
+                  return [i18n.str`Pay`, i18n.str`Refund`][idx];
+                }}
                 tooltip={i18n.str`The event of the webhook: why the webhook is 
used`}
               />
               <InputSelector
                 name="http_method"
                 label={i18n.str`Method`}
-                values={[
-                  i18n.str`Choose one...`,
-                  i18n.str`GET`,
-                  i18n.str`POST`,
-                  i18n.str`PUT`,
-                  i18n.str`PATCH`,
-                  i18n.str`HEAD`,
-                ]}
+                toStr={(v) => {
+                  const idx = validMethod.indexOf(v);
+                  if (idx === -1) return i18n.str`Choose one...`;
+                  return [
+                    i18n.str`GET`,
+                    i18n.str`POST`,
+                    i18n.str`PUT`,
+                    i18n.str`PATCH`,
+                    i18n.str`HEAD`,
+                  ][idx];
+                }}
+                values={["choose", ...validMethod]}
                 tooltip={i18n.str`Method used by the webhook`}
               />
 
@@ -228,3 +238,12 @@ export function CreatePage({ onCreate, onBack }: Props): 
VNode {
     </div>
   );
 }
+
+function isInvalidUrl(url: string) {
+  try {
+    const asd = new URL("./", url);
+    return false;
+  } catch (e) {
+    return true;
+  }
+}
diff --git 
a/packages/merchant-backoffice-ui/src/paths/instance/webhooks/update/UpdatePage.tsx
 
b/packages/merchant-backoffice-ui/src/paths/instance/webhooks/update/UpdatePage.tsx
index 1c1d0da79..75029eec3 100644
--- 
a/packages/merchant-backoffice-ui/src/paths/instance/webhooks/update/UpdatePage.tsx
+++ 
b/packages/merchant-backoffice-ui/src/paths/instance/webhooks/update/UpdatePage.tsx
@@ -31,6 +31,7 @@ import {
 import { Input } from "../../../../components/form/Input.js";
 import { WithId } from "../../../../declaration.js";
 import { undefinedIfEmpty } from "../../../../utils/table.js";
+import { InputSelector } from "../../../../components/form/InputSelector.js";
 
 type Entity = TalerMerchantApi.WebhookPatchDetails & WithId;
 
@@ -39,6 +40,7 @@ interface Props {
   onBack?: () => void;
   webhook: Entity;
 }
+const validType = ["pay", "refund"];
 const validMethod = ["GET", "POST", "PUT", "PATCH", "HEAD"];
 
 export function UpdatePage({ webhook, onUpdate, onBack }: Props): VNode {
@@ -47,13 +49,21 @@ export function UpdatePage({ webhook, onUpdate, onBack }: 
Props): VNode {
   const [state, setState] = useState<Partial<Entity>>(webhook);
 
   const errors = undefinedIfEmpty<FormErrors<Entity>>({
-    event_type: !state.event_type ? i18n.str`Required` : undefined,
+    event_type: !state.event_type
+      ? i18n.str`Required`
+      : validType.indexOf(state.event_type) === -1
+        ? i18n.str`Must be one of '${validType.join(", ")}'`
+        : undefined,
     http_method: !state.http_method
       ? i18n.str`Required`
-      : !validMethod.includes(state.http_method)
+      : validMethod.indexOf(state.http_method) === -1
         ? i18n.str`Must be one of '${validMethod.join(", ")}'`
         : undefined,
-    url: !state.url ? i18n.str`Required` : undefined,
+    url: !state.url
+      ? i18n.str`Required`
+      : isInvalidUrl(state.url)
+        ? i18n.str`URL is invalid`
+        : undefined,
   });
 
   const hasErrors = errors !== undefined;
@@ -89,14 +99,32 @@ export function UpdatePage({ webhook, onUpdate, onBack }: 
Props): VNode {
                 valueHandler={setState}
                 errors={errors}
               >
-                <Input<Entity>
+                <InputSelector<Entity>
                   name="event_type"
                   label={i18n.str`Event`}
+                  values={["choose", ...validType]}
+                  toStr={(v) => {
+                    const idx = validType.indexOf(v);
+                    if (idx === -1) return i18n.str`Choose one...`;
+                    return [i18n.str`Pay`, i18n.str`Refund`][idx];
+                  }}
                   tooltip={i18n.str`The event of the webhook: why the webhook 
is used`}
                 />
-                <Input<Entity>
+                <InputSelector<Entity>
                   name="http_method"
                   label={i18n.str`Method`}
+                  toStr={(v) => {
+                    const idx = validMethod.indexOf(v);
+                    if (idx === -1) return i18n.str`Choose one...`;
+                    return [
+                      i18n.str`GET`,
+                      i18n.str`POST`,
+                      i18n.str`PUT`,
+                      i18n.str`PATCH`,
+                      i18n.str`HEAD`,
+                    ][idx];
+                  }}
+                  values={["choose", ...validMethod]}
                   tooltip={i18n.str`Method used by the webhook`}
                 />
                 <Input<Entity>
@@ -143,3 +171,11 @@ export function UpdatePage({ webhook, onUpdate, onBack }: 
Props): VNode {
     </div>
   );
 }
+function isInvalidUrl(url: string) {
+  try {
+    const asd = new URL("./", url);
+    return false;
+  } catch (e) {
+    return true;
+  }
+}
diff --git 
a/packages/merchant-backoffice-ui/src/paths/instance/webhooks/update/index.tsx 
b/packages/merchant-backoffice-ui/src/paths/instance/webhooks/update/index.tsx
index 82f1463f9..188656adf 100644
--- 
a/packages/merchant-backoffice-ui/src/paths/instance/webhooks/update/index.tsx
+++ 
b/packages/merchant-backoffice-ui/src/paths/instance/webhooks/update/index.tsx
@@ -19,10 +19,13 @@
  * @author Sebastian Javier Marchano (sebasjm)
  */
 
-import { HttpStatusCode, TalerError, TalerMerchantApi, assertUnreachable } 
from "@gnu-taler/taler-util";
 import {
-  useTranslationContext
-} from "@gnu-taler/web-util/browser";
+  HttpStatusCode,
+  TalerError,
+  TalerMerchantApi,
+  assertUnreachable,
+} from "@gnu-taler/taler-util";
+import { useTranslationContext } from "@gnu-taler/web-util/browser";
 import { Fragment, VNode, h } from "preact";
 import { useState } from "preact/hooks";
 import { ErrorLoadingMerchant } from 
"../../../../components/ErrorLoadingMerchant.js";
@@ -30,9 +33,7 @@ import { Loading } from 
"../../../../components/exception/loading.js";
 import { NotificationCard } from "../../../../components/menu/index.js";
 import { useSessionContext } from "../../../../context/session.js";
 import { WithId } from "../../../../declaration.js";
-import {
-  useWebhookDetails,
-} from "../../../../hooks/webhooks.js";
+import { useWebhookDetails } from "../../../../hooks/webhooks.js";
 import { Notification } from "../../../../utils/types.js";
 import { LoginPage } from "../../../login/index.js";
 import { NotFoundPageOrAdminCreate } from "../../../notfound/index.js";
@@ -66,7 +67,7 @@ export default function UpdateWebhook({
         return <NotFoundPageOrAdminCreate />;
       }
       case HttpStatusCode.Unauthorized: {
-        return <LoginPage />
+        return <LoginPage />;
       }
       default: {
         assertUnreachable(result);
@@ -81,28 +82,29 @@ export default function UpdateWebhook({
         webhook={{ ...result.body, id: tid }}
         onBack={onBack}
         onUpdate={async (data) => {
-          return lib.instance.updateWebhook(state.token, tid, data)
+          return lib.instance
+            .updateWebhook(state.token, tid, data)
             .then((resp) => {
               if (resp.type === "ok") {
                 setNotif({
                   message: i18n.str`Webhook updated`,
                   type: "SUCCESS",
                 });
-                onConfirm()  
+                onConfirm();
               } else {
                 setNotif({
                   message: i18n.str`Could not update webhook`,
                   type: "ERROR",
                   description: resp.detail?.hint,
                 });
-  
               }
             })
             .catch((error) => {
               setNotif({
                 message: i18n.str`Could not update webhook`,
                 type: "ERROR",
-                description: error instanceof Error ? error.message : 
String(error),
+                description:
+                  error instanceof Error ? error.message : String(error),
               });
             });
         }}
diff --git a/packages/taler-util/src/http-client/merchant.ts 
b/packages/taler-util/src/http-client/merchant.ts
index 477f9c442..1a16cc0c0 100644
--- a/packages/taler-util/src/http-client/merchant.ts
+++ b/packages/taler-util/src/http-client/merchant.ts
@@ -2115,7 +2115,7 @@ export class TalerMerchantInstanceHttpClient {
       headers,
     });
     switch (resp.status) {
-      case HttpStatusCode.NoContent:
+      case HttpStatusCode.Ok:
         return opSuccessFromHttp(resp, codecForWebhookDetails());
       case HttpStatusCode.Unauthorized: // FIXME: missing in docs
         return opKnownHttpFailure(resp.status, resp);

-- 
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]