gnunet-svn
[Top][All Lists]
Advanced

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

[taler-merchant-backoffice] branch master updated: use management api wh


From: gnunet
Subject: [taler-merchant-backoffice] branch master updated: use management api when updating instance details from default instance credentials
Date: Tue, 03 Aug 2021 17:53:39 +0200

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

sebasjm pushed a commit to branch master
in repository merchant-backoffice.

The following commit(s) were added to refs/heads/master by this push:
     new cc02ab3  use management api when updating instance details from 
default instance credentials
cc02ab3 is described below

commit cc02ab3992055ee43c904231e8ac96f9a783437e
Author: Sebastian <sebasjm@gmail.com>
AuthorDate: Tue Aug 3 12:53:23 2021 -0300

    use management api when updating instance details from default instance 
credentials
---
 packages/frontend/src/ApplicationReadyRoutes.tsx   |  7 +--
 packages/frontend/src/InstanceRoutes.tsx           | 10 ++--
 packages/frontend/src/context/backend.ts           | 16 ++++--
 packages/frontend/src/hooks/instance.ts            | 66 +++++++++++++++++++++-
 packages/frontend/src/index.tsx                    |  5 +-
 .../frontend/src/paths/admin/list/TableDeleted.tsx | 12 ++--
 packages/frontend/src/paths/admin/list/View.tsx    |  7 ++-
 .../frontend/src/paths/instance/update/index.tsx   | 16 +++++-
 8 files changed, 109 insertions(+), 30 deletions(-)

diff --git a/packages/frontend/src/ApplicationReadyRoutes.tsx 
b/packages/frontend/src/ApplicationReadyRoutes.tsx
index d9bd75d..994226a 100644
--- a/packages/frontend/src/ApplicationReadyRoutes.tsx
+++ b/packages/frontend/src/ApplicationReadyRoutes.tsx
@@ -29,16 +29,11 @@ import { NotYetReadyAppMenu, Menu, NotificationCard } from 
'./components/menu';
 import { useTranslator } from './i18n';
 import { createHashHistory } from 'history';
 import { useState } from 'preact/hooks';
-import { CreateStockNoRestock } from './components/form/InputStock.stories';
 
 export function ApplicationReadyRoutes(): VNode {
   const i18n = useTranslator();
-  const { url: backendURL, changeBackend, updateToken, clearAllTokens } = 
useBackendContext();
+  const { url: backendURL, updateLoginStatus, clearAllTokens } = 
useBackendContext();
 
-  const updateLoginStatus = (url: string, token?: string) => {
-    changeBackend(url);
-    if (token) updateToken(token);
-  };
   const result = useBackendInstancesTestForAdmin()
 
   const clearTokenAndGoToRoot = () => {
diff --git a/packages/frontend/src/InstanceRoutes.tsx 
b/packages/frontend/src/InstanceRoutes.tsx
index 2914f5f..588cfb4 100644
--- a/packages/frontend/src/InstanceRoutes.tsx
+++ b/packages/frontend/src/InstanceRoutes.tsx
@@ -42,7 +42,7 @@ import TransferCreatePage from 
'./paths/instance/transfers/create';
 import ReservesCreatePage from './paths/instance/reserves/create';
 import ReservesDetailsPage from './paths/instance/reserves/details';
 import ReservesListPage from './paths/instance/reserves/list';
-import InstanceUpdatePage, { Props as InstanceUpdatePageProps } from 
"./paths/instance/update";
+import InstanceUpdatePage, { Props as InstanceUpdatePageProps, AdminUpdate as 
InstanceAdminUpdatePage } from "./paths/instance/update";
 import LoginPage from './paths/login';
 import NotFoundPage from './paths/notfound';
 import { Notification } from './utils/types';
@@ -86,7 +86,7 @@ export interface Props {
 export function InstanceRoutes({ id, admin, setInstanceName }: Props): VNode {
   const [_, updateDefaultToken] = useBackendDefaultToken()
   const [token, updateToken] = useBackendInstanceToken(id);
-  const { changeBackend, addTokenCleaner } = useBackendContext();
+  const { updateLoginStatus: changeBackend, addTokenCleaner } = 
useBackendContext();
   const cleaner = useCallback(() => { updateToken(undefined); }, [id]);
   const i18n = useTranslator();
   const [globalNotification, setGlobalNotification] = useState<Notification & 
{ to: string } | undefined>(undefined)
@@ -302,7 +302,7 @@ export function Redirect({ to }: { to: string }): null {
 
 function AdminInstanceUpdatePage({ id, ...rest }: { id: string } & 
InstanceUpdatePageProps) {
   const [token, changeToken] = useBackendInstanceToken(id);
-  const { changeBackend } = useBackendContext();
+  const { updateLoginStatus: changeBackend } = useBackendContext();
   const updateLoginStatus = (url: string, token?: string) => {
     changeBackend(url);
     if (token)
@@ -310,8 +310,10 @@ function AdminInstanceUpdatePage({ id, ...rest }: { id: 
string } & InstanceUpdat
   };
   const value = useMemo(() => ({ id, token, admin: true, changeToken }), [id, 
token])
   const i18n = useTranslator();
+
   return <InstanceContextProvider value={value}>
-    <InstanceUpdatePage {...rest}
+    <InstanceAdminUpdatePage {...rest}
+      instanceId={id}
       onLoadError={(error: HttpError) => {
         return <Fragment>
           <NotificationCard notification={{
diff --git a/packages/frontend/src/context/backend.ts 
b/packages/frontend/src/context/backend.ts
index 1a7cd72..9168d32 100644
--- a/packages/frontend/src/context/backend.ts
+++ b/packages/frontend/src/context/backend.ts
@@ -27,25 +27,23 @@ interface BackendContextType {
   url: string;
   token?: string;
   triedToLog: boolean;
-  changeBackend: (url: string) => void;
   resetBackend: () => void;
   clearAllTokens: () => void;
   addTokenCleaner: (c: () => void) => void;
-  updateToken: (token?:string) => void;
+  updateLoginStatus: (url: string, token?: string) => void;
 }
 
 const BackendContext = createContext<BackendContextType>({
   url: '',
   token: undefined,
   triedToLog: false,
-  changeBackend: () => null,
   resetBackend: () => null,
   clearAllTokens: () => null,
   addTokenCleaner: () => null,
-  updateToken: () => null,
+  updateLoginStatus: () => null,
 })
 
-export function useBackendContextState(defaultUrl?:string): BackendContextType 
{
+function useBackendContextState(defaultUrl?:string): BackendContextType {
   const [url, triedToLog, changeBackend, resetBackend] = 
useBackendURL(defaultUrl);
   const [token, _updateToken] = useBackendDefaultToken();
   const updateToken = (t?:string) => {
@@ -66,7 +64,13 @@ export function useBackendContextState(defaultUrl?:string): 
BackendContextType {
     resetBackend()
   }
 
-  return { url, token, triedToLog, changeBackend, updateToken, resetBackend, 
clearAllTokens, addTokenCleaner: addTokenCleanerMemo }
+  const updateLoginStatus = (url: string, token?: string) => {
+    changeBackend(url);
+    if (token) updateToken(token);
+  };
+
+
+  return { url, token, triedToLog, updateLoginStatus, resetBackend, 
clearAllTokens, addTokenCleaner: addTokenCleanerMemo }
 }
 
 export const BackendContextProvider = ({children, defaultUrl}:{children:any, 
defaultUrl?:string}):VNode => {
diff --git a/packages/frontend/src/hooks/instance.ts 
b/packages/frontend/src/hooks/instance.ts
index 462870f..4ac0b4f 100644
--- a/packages/frontend/src/hooks/instance.ts
+++ b/packages/frontend/src/hooks/instance.ts
@@ -27,6 +27,51 @@ interface InstanceAPI {
   setNewToken: (token: string) => Promise<void>;
 }
 
+export function useManagementAPI(instanceId: string) : InstanceAPI {
+  const { url, token } = useBackendContext()
+
+  const updateInstance = async (instance: 
MerchantBackend.Instances.InstanceReconfigurationMessage): Promise<void> => {
+    await request(`${url}/private/instances/${instanceId}`, {
+      method: 'patch',
+      token,
+      data: instance
+    })
+
+    mutate([`/private/`, token, url], null)
+  };
+
+  const deleteInstance = async (): Promise<void> => {
+    await request(`${url}/private/instances/${instanceId}`, {
+      method: 'delete',
+      token,
+    })
+
+    mutate([`/private/`, token, url], null)
+  }
+
+  const clearToken = async (): Promise<void> => {
+    await request(`${url}/private/instances/${instanceId}/auth`, {
+      method: 'post',
+      token,
+      data: { method: 'external' }
+    })
+
+    mutate([`/private/`, token, url], null)
+  }
+
+  const setNewToken = async (newToken: string): Promise<void> => {
+    await request(`${url}/private/instances/${instanceId}/auth`, {
+      method: 'post',
+      token,
+      data: { method: 'token', token: newToken }
+    })
+
+    mutate([`/private/`, token, url], null)
+  }
+
+  return { updateInstance, deleteInstance, setNewToken, clearToken }
+}
+
 export function useInstanceAPI(): InstanceAPI {
   const { url: baseUrl, token: adminToken } = useBackendContext()
   const { token: instanceToken, id, admin } = useInstanceContext()
@@ -109,6 +154,26 @@ export function useInstanceDetails(): 
HttpResponse<MerchantBackend.Instances.Que
   return {loading: true}
 }
 
+export function useManagedInstanceDetails(instanceId: string): 
HttpResponse<MerchantBackend.Instances.QueryInstancesResponse> {
+  const { url, token } = useBackendContext();
+
+  const { data, error, isValidating } = 
useSWR<HttpResponseOk<MerchantBackend.Instances.QueryInstancesResponse>, 
HttpError>([`/private/instances/${instanceId}`, token, url], fetcher, {
+    refreshInterval:0,
+    refreshWhenHidden: false,
+    revalidateOnFocus: false,
+    revalidateOnReconnect: false,
+    refreshWhenOffline: false,
+    errorRetryCount: 0,
+    errorRetryInterval: 1,
+    shouldRetryOnError: false,
+  })
+
+  if (isValidating) return {loading:true, data: data?.data}
+  if (data) return data
+  if (error) return error
+  return {loading: true}
+}
+
 export function useBackendInstances(): 
HttpResponse<MerchantBackend.Instances.InstancesResponse> {
   const { url } = useBackendContext()
   const { token } = useInstanceContext();
@@ -120,4 +185,3 @@ export function useBackendInstances(): 
HttpResponse<MerchantBackend.Instances.In
   if (error) return error
   return {loading: true}
 }
-
diff --git a/packages/frontend/src/index.tsx b/packages/frontend/src/index.tsx
index 0a77533..26dcc3e 100644
--- a/packages/frontend/src/index.tsx
+++ b/packages/frontend/src/index.tsx
@@ -47,13 +47,12 @@ export default function Application(): VNode {
 }
 
 function ApplicationStatusRoutes(): VNode {
-  const { changeBackend, triedToLog, updateToken } = useBackendContext()
+  const { updateLoginStatus, triedToLog } = useBackendContext()
   const result = useBackendConfig();
   const i18n = useTranslator()
 
   const updateLoginInfoAndGoToRoot = (url: string, token?: string) => {
-    changeBackend(url)
-    if (token) updateToken(token)
+    updateLoginStatus(url, token)
     route('/')
   }
 
diff --git a/packages/frontend/src/paths/admin/list/TableDeleted.tsx 
b/packages/frontend/src/paths/admin/list/TableDeleted.tsx
index 667ff19..95bfede 100644
--- a/packages/frontend/src/paths/admin/list/TableDeleted.tsx
+++ b/packages/frontend/src/paths/admin/list/TableDeleted.tsx
@@ -27,9 +27,10 @@ import { Translate, useTranslator } from "../../../i18n";
 interface Props {
   instances: MerchantBackend.Instances.Instance[];
   onPurge: (id: MerchantBackend.Instances.Instance) => void;
+  setInstanceName: (s: string) => void;
 }
 
-export function CardTable({ instances, onPurge }: Props): VNode {
+export function CardTable({ instances, onPurge, setInstanceName }: Props): 
VNode {
 
   const i18n = useTranslator()
 
@@ -42,7 +43,7 @@ export function CardTable({ instances, onPurge }: Props): 
VNode {
       <div class="b-table has-pagination">
         <div class="table-wrapper has-mobile-cards">
           {instances.length > 0 ?
-            <Table instances={instances} onPurge={onPurge} /> :
+            <Table instances={instances} onPurge={onPurge} 
setInstanceName={setInstanceName} /> :
             <EmptyTable />
           }
         </div>
@@ -53,13 +54,14 @@ export function CardTable({ instances, onPurge }: Props): 
VNode {
 interface TableProps {
   instances: MerchantBackend.Instances.Instance[];
   onPurge: (id: MerchantBackend.Instances.Instance) => void;
+  setInstanceName: (s: string) => void;
 }
 
 function toggleSelected<T>(id: T): (prev: T[]) => T[] {
   return (prev: T[]): T[] => prev.indexOf(id) == -1 ? [...prev, id] : 
prev.filter(e => e != id)
 }
 
-function Table({ instances, onPurge }: TableProps): VNode {
+function Table({ instances, onPurge, setInstanceName }: TableProps): VNode {
   return (
     <div class="table-container">
       <table class="table is-fullwidth is-striped is-hoverable is-fullwidth">
@@ -77,7 +79,9 @@ function Table({ instances, onPurge }: TableProps): VNode {
             return <tr key={i.id}>
               <td class="is-checkbox-cell">
               </td>
-              <td>{i.id}</td>
+              <td><a href={`#/orders?instance=${i.id}`} onClick={(e) => {
+                setInstanceName(i.id);
+              }}>{i.id}</a></td>
               <td >{i.name}</td>
               <td class="is-actions-cell right-sticky">
                 <div class="buttons is-right">
diff --git a/packages/frontend/src/paths/admin/list/View.tsx 
b/packages/frontend/src/paths/admin/list/View.tsx
index e7413c1..a5df3c4 100644
--- a/packages/frontend/src/paths/admin/list/View.tsx
+++ b/packages/frontend/src/paths/admin/list/View.tsx
@@ -35,6 +35,7 @@ interface Props {
 }
 
 export function View({ instances, onCreate, onDelete, onPurge, onUpdate, 
setInstanceName, selected }: Props): VNode {
+  const deletedInstances = instances.filter(i => i.deleted);
 
   return <div id="app">
 
@@ -42,9 +43,9 @@ export function View({ instances, onCreate, onDelete, 
onPurge, onUpdate, setInst
       <CardTableActive instances={instances.filter(i => !i.deleted)} 
onDelete={onDelete} setInstanceName={setInstanceName} onUpdate={onUpdate} 
selected={selected} onCreate={onCreate} />
     </section>
 
-    <section class="section is-main-section">
-      <CardTableDeleted instances={instances.filter(i => i.deleted)} 
onPurge={onPurge} />
-    </section>
+    {deletedInstances.length > 0 && <section class="section is-main-section">
+      <CardTableDeleted instances={deletedInstances} onPurge={onPurge} 
setInstanceName={setInstanceName}/>
+    </section> }
 
   </div >
 }
\ No newline at end of file
diff --git a/packages/frontend/src/paths/instance/update/index.tsx 
b/packages/frontend/src/paths/instance/update/index.tsx
index b226af0..33dc476 100644
--- a/packages/frontend/src/paths/instance/update/index.tsx
+++ b/packages/frontend/src/paths/instance/update/index.tsx
@@ -17,8 +17,8 @@ import { Fragment, h, VNode } from "preact";
 import { Loading } from "../../../components/exception/loading";
 import { useInstanceContext } from "../../../context/instance";
 import { MerchantBackend } from "../../../declaration";
-import { HttpError } from "../../../hooks/backend";
-import { useInstanceAPI, useInstanceDetails } from "../../../hooks/instance";
+import { HttpError, HttpResponse } from "../../../hooks/backend";
+import { useInstanceAPI, useInstanceDetails, useManagedInstanceDetails, 
useManagementAPI } from "../../../hooks/instance";
 import { UpdatePage } from "./UpdatePage";
 
 export interface Props {
@@ -32,9 +32,19 @@ export interface Props {
 
 }
 
-export default function Update({ onBack, onConfirm, onLoadError, onNotFound, 
onUpdateError, onUnauthorized }: Props): VNode {
+export default function Update(props: Props): VNode {
   const { updateInstance, clearToken, setNewToken } = useInstanceAPI();
   const result = useInstanceDetails()
+  return CommonUpdate(props, result, updateInstance, clearToken, setNewToken)
+}
+
+export function AdminUpdate(props:Props & {instanceId:string}): VNode {
+  const { updateInstance, clearToken, setNewToken } = 
useManagementAPI(props.instanceId);
+  const result = useManagedInstanceDetails(props.instanceId)
+  return CommonUpdate(props, result, updateInstance, clearToken, setNewToken)
+}
+
+function CommonUpdate({ onBack, onConfirm, onLoadError, onNotFound, 
onUpdateError, onUnauthorized }: Props, result: 
HttpResponse<MerchantBackend.Instances.QueryInstancesResponse>, updateInstance: 
any, clearToken: any, setNewToken: any): VNode {
   const { changeToken } = useInstanceContext()
 
   if (result.clientError && result.isUnauthorized) return onUnauthorized()

-- 
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]