commit 8733b2e05d2ac758979fdc70625b8455d82f645b
Author: minerva-jupiter <ryouturn@gmail.com>
Date: Sat, 13 Dec 2025 19:54:52 +0900
init
Diffstat:
| A | index.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>