synapse-admin-api

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs

index.html (10541B)


      1 <!doctype html>
      2 <html lang="en">
      3     <head>
      4         <meta charset="UTF-8" />
      5         <title>Synapse Admin API Tester</title>
      6     </head>
      7     <body class="container">
      8         <h1>Synapse Admin API</h1>
      9 
     10         <form id="apiForm">
     11             <article>
     12                 <label for="accessToken">Admin Access Token:</label>
     13                 <input id="accessToken" type="password" required />
     14             </article>
     15             <article>
     16                 <label for="synapseDomain">Synapse Domain:</label>
     17                 <select id="synapseDomain" required>
     18                     <option value="https://docker-synapse.minervajuppiter.net">
     19                         https://docker-synapse.minervajuppiter.net/
     20                     </option>
     21                 </select>
     22             </article>
     23             <article>
     24                 <label for="apiTemplate">API Template:</label>
     25                 <select id="apiTemplate" onchange="updateApiTemplate()">
     26                     <option value="" selected disabled>
     27                         Select an API Template
     28                     </option>
     29                     <option value="listTokens">List Registration Tokens</option>
     30                     <option value="getToken">Get Registration Token</option>
     31                     <option value="createToken">
     32                         Create Registration Token
     33                     </option>
     34                     <option value="deleteToken">
     35                         Delete Registration Token
     36                     </option>
     37                 </select>
     38             </article>
     39             <article>
     40                 <label for="method">Method:</label>
     41                 <select id="method">
     42                     <option value="GET">GET</option>
     43                     <option value="POST">POST</option>
     44                     <option value="PUT">PUT</option>
     45                     <option value="DELETE">DELETE</option>
     46                 </select>
     47             </article>
     48             <article>
     49                 <label for="endpoint">Endpoint:</label>
     50                 <input
     51                     id="endpoint"
     52                     type="text"
     53                     value="/_synapse/admin/v2/users"
     54                     required
     55                     placeholder="/_synapse/admin/v2/users/..."
     56                     style="width: 80%"
     57                 />
     58             </article>
     59             <article id="payloadContainer" style="display: none">
     60                 <label for="payload">JSON Payload:</label>
     61                 <textarea
     62                     id="payload"
     63                     rows="10"
     64                     placeholder='{"displayname": "New User Name"}'
     65                 ></textarea>
     66             </article>
     67             <article>
     68                 <button type="submit">Execute API Call</button>
     69             </article>
     70         </form>
     71 
     72         <hr />
     73 
     74         <div id="response-container">
     75             <h2>API Response</h2>
     76             <p>Status: <span id="response-status">---</span></p>
     77             <p id="error-message" style="color: red; font-weight: bold"></p>
     78             <h3>Body:</h3>
     79             <pre id="response-body">Waiting for response...</pre>
     80         </div>
     81 
     82         <script>
     83             document.addEventListener("DOMContentLoaded", () => {
     84                 const form = document.getElementById("apiForm");
     85                 const methodSelect = document.getElementById("method");
     86                 const payloadContainer =
     87                     document.getElementById("payloadContainer");
     88                 const responseStatus =
     89                     document.getElementById("response-status");
     90                 const responseBody = document.getElementById("response-body");
     91                 const errorMessage = document.getElementById("error-message");
     92 
     93                 const updatePayloadVisibility = () => {
     94                     const method = methodSelect.value;
     95                     if (method === "POST" || method === "PUT") {
     96                         payloadContainer.style.display = "block";
     97                     } else {
     98                         payloadContainer.style.display = "none";
     99                     }
    100                 };
    101                 methodSelect.addEventListener(
    102                     "change",
    103                     updatePayloadVisibility,
    104                 );
    105                 updatePayloadVisibility();
    106 
    107                 window.updateApiTemplate = () => {
    108                     const apiTemplate =
    109                         document.getElementById("apiTemplate").value;
    110                     const methodField = document.getElementById("method");
    111                     const endpointField = document.getElementById("endpoint");
    112                     const payloadField = document.getElementById("payload");
    113                     const payloadContainer =
    114                         document.getElementById("payloadContainer");
    115 
    116                     switch (apiTemplate) {
    117                         case "listTokens":
    118                             methodField.value = "GET";
    119                             endpointField.value =
    120                                 "/_synapse/admin/v1/registration_tokens";
    121                             payloadField.value = "";
    122                             payloadContainer.style.display = "none";
    123                             break;
    124                         case "getToken":
    125                             methodField.value = "GET";
    126                             endpointField.value =
    127                                 "/_synapse/admin/v1/registration_tokens/{token}";
    128                             payloadField.value = "";
    129                             payloadContainer.style.display = "none";
    130                             break;
    131                         case "createToken":
    132                             methodField.value = "POST";
    133                             endpointField.value =
    134                                 "/_synapse/admin/v1/registration_tokens/new";
    135                             payloadField.value = JSON.stringify(
    136                                 {
    137                                     uses_allowed: 1,
    138                                     expiry_time: Date.now() + 86400000,
    139                                 },
    140                                 null,
    141                                 2,
    142                             );
    143                             payloadContainer.style.display = "block";
    144                             break;
    145                         case "deleteToken":
    146                             methodField.value = "DELETE";
    147                             endpointField.value =
    148                                 "/_synapse/admin/v1/registration_tokens/{token}";
    149                             payloadField.value = "";
    150                             payloadContainer.style.display = "none";
    151                             break;
    152                         default:
    153                             methodField.value = "GET";
    154                             endpointField.value = "";
    155                             payloadField.value = "";
    156                             payloadContainer.style.display = "none";
    157                     }
    158                 };
    159 
    160                 form.addEventListener("submit", async (event) => {
    161                     event.preventDefault();
    162 
    163                     responseStatus.textContent = "Executing...";
    164                     responseBody.textContent = "Processing...";
    165                     errorMessage.textContent = "";
    166 
    167                     const accessToken =
    168                         document.getElementById("accessToken").value;
    169                     const synapseDomain = document
    170                         .getElementById("synapseDomain")
    171                         .value.replace(/\/+$/, "");
    172                     const method = methodSelect.value;
    173                     const endpoint = document
    174                         .getElementById("endpoint")
    175                         .value.trim();
    176                     let payload = document.getElementById("payload").value;
    177 
    178                     const fullUrl = `${synapseDomain}${endpoint.startsWith("/") ? "" : "/"}${endpoint}`;
    179 
    180                     const headers = {
    181                         Authorization: `Bearer ${accessToken}`,
    182                         "Content-Type": "application/json",
    183                     };
    184 
    185                     const config = {
    186                         method: method,
    187                         headers: headers,
    188                     };
    189 
    190                     if (method === "POST" || method === "PUT") {
    191                         if (payload) {
    192                             try {
    193                                 config.body = JSON.stringify(
    194                                     JSON.parse(payload),
    195                                 );
    196                             } catch (e) {
    197                                 errorMessage.textContent =
    198                                     "Error: Invalid JSON payload";
    199                                 responseStatus.textContent = "Failed";
    200                                 responseBody.textContent =
    201                                     "Invalid JSON payload format.";
    202                                 return;
    203                             }
    204                         }
    205                     }
    206 
    207                     try {
    208                         const apiResponse = await fetch(fullUrl, config);
    209 
    210                         let responseText = await apiResponse.text();
    211                         let responseJson;
    212 
    213                         try {
    214                             responseJson = JSON.parse(responseText);
    215 
    216                             responseBody.textContent = JSON.stringify(
    217                                 responseJson,
    218                                 null,
    219                                 2,
    220                             );
    221                         } catch (e) {
    222                             responseBody.textContent =
    223                                 responseText || "(No response body)";
    224                         }
    225 
    226                         responseStatus.textContent = `${apiResponse.status} ${apiResponse.statusText}`;
    227                         if (!apiResponse.ok) {
    228                             responseStatus.style.color = "red";
    229                         } else {
    230                             responseStatus.style.color = "green";
    231                         }
    232                     } catch (e) {
    233                         errorMessage.textContent = `Fetch Error: ${e.message}`;
    234                         responseStatus.textContent = "Network Error";
    235                         responseStatus.style.color = "red";
    236                         responseBody.textContent =
    237                             "A network error occurred during the API call.";
    238                     }
    239                 });
    240             });
    241         </script>
    242     </body>
    243 </html>