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>