synapse-admin-api

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

commit 8733b2e05d2ac758979fdc70625b8455d82f645b
Author: minerva-jupiter <ryouturn@gmail.com>
Date:   Sat, 13 Dec 2025 19:54:52 +0900

init

Diffstat:
Aindex.html | 245+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 245 insertions(+), 0 deletions(-)

diff --git a/index.html b/index.html @@ -0,0 +1,245 @@ +<!doctype html> +<html lang="en"> + <head> + <meta charset="UTF-8" /> + <title>Synapse Admin API Tester</title> + </head> + <body class="container"> + <h1>Synapse Admin API</h1> + + <form id="apiForm"> + <article> + <label for="accessToken">Admin Access Token:</label> + <input id="accessToken" type="password" required /> + </article> + <article> + <label for="synapseDomain">Synapse Domain:</label> + <select id="synapseDomain" required> + <option value="https://synapse-edge.pim.gr.jp"> + https://synapse-edge.pim.gr.jp + </option> + </select> + </article> + <article> + <label for="apiTemplate">API Template:</label> + <select id="apiTemplate" onchange="updateApiTemplate()"> + <option value="" selected disabled> + Select an API Template + </option> + <option value="listTokens">List Registration Tokens</option> + <option value="getToken">Get Registration Token</option> + <option value="createToken"> + Create Registration Token + </option> + <option value="deleteToken"> + Delete Registration Token + </option> + </select> + </article> + <article> + <label for="method">Method:</label> + <select id="method"> + <option value="GET">GET</option> + <option value="POST">POST</option> + <option value="PUT">PUT</option> + <option value="DELETE">DELETE</option> + </select> + </article> + <article> + <label for="endpoint">Endpoint:</label> + <input + id="endpoint" + type="text" + value="/_synapse/admin/v2/users" + required + placeholder="/_synapse/admin/v2/users/..." + style="width: 80%" + /> + </article> + <article id="payloadContainer" style="display: none"> + <label for="payload">JSON Payload:</label> + <textarea + id="payload" + rows="10" + placeholder='{"displayname": "New User Name"}' + ></textarea> + </article> + <article> + <button type="submit">Execute API Call</button> + </article> + </form> + + <hr /> + + <div id="response-container"> + <h2>API Response</h2> + <p>Status: <span id="response-status">---</span></p> + <p id="error-message" style="color: red; font-weight: bold"></p> + <h3>Body:</h3> + <pre id="response-body">Waiting for response...</pre> + </div> + + <script> + document.addEventListener("DOMContentLoaded", () => { + const form = document.getElementById("apiForm"); + const methodSelect = document.getElementById("method"); + const payloadContainer = + document.getElementById("payloadContainer"); + const responseStatus = + document.getElementById("response-status"); + const responseBody = document.getElementById("response-body"); + const errorMessage = document.getElementById("error-message"); + + const updatePayloadVisibility = () => { + const method = methodSelect.value; + if (method === "POST" || method === "PUT") { + payloadContainer.style.display = "block"; + } else { + payloadContainer.style.display = "none"; + } + }; + methodSelect.addEventListener( + "change", + updatePayloadVisibility, + ); + updatePayloadVisibility(); + + window.updateApiTemplate = () => { + const apiTemplate = + document.getElementById("apiTemplate").value; + const methodField = document.getElementById("method"); + const endpointField = document.getElementById("endpoint"); + const payloadField = document.getElementById("payload"); + const payloadContainer = + document.getElementById("payloadContainer"); + + switch (apiTemplate) { + case "listTokens": + methodField.value = "GET"; + endpointField.value = + "/_synapse/admin/v1/registration_tokens"; + payloadField.value = ""; + payloadContainer.style.display = "none"; + break; + case "getToken": + methodField.value = "GET"; + endpointField.value = + "/_synapse/admin/v1/registration_tokens/{token}"; + payloadField.value = ""; + payloadContainer.style.display = "none"; + break; + case "createToken": + methodField.value = "POST"; + endpointField.value = + "/_synapse/admin/v1/registration_tokens/new"; + payloadField.value = JSON.stringify( + { + uses_allowed: 1, + expiry_time: Date.now() + 86400000, + }, + null, + 2, + ); + payloadContainer.style.display = "block"; + break; + case "deleteToken": + methodField.value = "DELETE"; + endpointField.value = + "/_synapse/admin/v1/registration_tokens/{token}"; + payloadField.value = ""; + payloadContainer.style.display = "none"; + break; + default: + methodField.value = "GET"; + endpointField.value = ""; + payloadField.value = ""; + payloadContainer.style.display = "none"; + } + }; + + form.addEventListener("submit", async (event) => { + event.preventDefault(); + + responseStatus.textContent = "Executing..."; + responseBody.textContent = "Processing..."; + errorMessage.textContent = ""; + + const accessToken = + document.getElementById("accessToken").value; + const synapseDomain = document + .getElementById("synapseDomain") + .value.replace(/\/+$/, ""); + const method = methodSelect.value; + const endpoint = document + .getElementById("endpoint") + .value.trim(); + let payload = document.getElementById("payload").value; + + const fullUrl = `${synapseDomain}${endpoint.startsWith("/") ? "" : "/"}${endpoint}`; + + const headers = { + Authorization: `Bearer ${accessToken}`, + "Content-Type": "application/json", + }; + + const config = { + method: method, + headers: headers, + credentials: "include", + }; + + // Process payload for POST/PUT methods + if (method === "POST" || method === "PUT") { + if (payload) { + try { + config.body = JSON.stringify( + JSON.parse(payload), + ); + } catch (e) { + errorMessage.textContent = + "Error: Invalid JSON payload"; + responseStatus.textContent = "Failed"; + responseBody.textContent = + "Invalid JSON payload format."; + return; + } + } + } + + try { + const apiResponse = await fetch(fullUrl, config); + + let responseText = await apiResponse.text(); + let responseJson; + + try { + responseJson = JSON.parse(responseText); + + responseBody.textContent = JSON.stringify( + responseJson, + null, + 2, + ); + } catch (e) { + responseBody.textContent = + responseText || "(No response body)"; + } + + responseStatus.textContent = `${apiResponse.status} ${apiResponse.statusText}`; + if (!apiResponse.ok) { + responseStatus.style.color = "red"; + } else { + responseStatus.style.color = "green"; + } + } catch (e) { + errorMessage.textContent = `Fetch Error: ${e.message}`; + responseStatus.textContent = "Network Error"; + responseStatus.style.color = "red"; + responseBody.textContent = + "A network error occurred during the API call."; + } + }); + }); + </script> + </body> +</html>