Make APIs more similar

This commit is contained in:
Darren Clarke 2026-02-15 10:29:52 +01:00
parent 9f0e1f8b61
commit c40d7d056e
57 changed files with 3994 additions and 1801 deletions

View file

@ -0,0 +1,130 @@
import { createLogger } from "@link-stack/logger";
import { Hono } from "hono";
import type SignalService from "./service.ts";
const logger = createLogger("bridge-signal-routes");
const errorMessage = (error: unknown): string => (error instanceof Error ? error.message : String(error));
export function createRoutes(service: SignalService): Hono {
const app = new Hono();
// Start device linking
app.post("/api/bots/:id/register", async (c) => {
const id = c.req.param("id");
const { phoneNumber, deviceName } = await c.req.json<{
phoneNumber: string;
deviceName?: string;
}>();
try {
const result = await service.register(id, phoneNumber, deviceName);
logger.info({ id }, "Device linking started");
return c.json(result);
} catch (error) {
logger.error({ id, error: errorMessage(error) }, "Failed to start device linking");
return c.json({ error: errorMessage(error) }, 500);
}
});
// Bot status
app.get("/api/bots/:id", async (c) => {
const id = c.req.param("id");
try {
return c.json(await service.getBot(id));
} catch (error) {
return c.json({ error: errorMessage(error) }, 500);
}
});
// Send message
app.post("/api/bots/:id/send", async (c) => {
const id = c.req.param("id");
const { recipient, message, attachments, autoGroup } = await c.req.json<{
recipient: string;
message: string;
attachments?: Array<{ data: string; filename: string; mime_type: string }>;
autoGroup?: { ticketNumber: string };
}>();
try {
const result = await service.send(id, recipient, message, attachments, autoGroup);
logger.info({ id, recipient: result.recipient, attachmentCount: attachments?.length || 0 }, "Sent message");
return c.json({ result });
} catch (error) {
logger.error({ id, error: errorMessage(error) }, "Failed to send message");
return c.json({ error: errorMessage(error) }, 500);
}
});
// Unregister bot
app.post("/api/bots/:id/unregister", async (c) => {
const id = c.req.param("id");
try {
await service.unregister(id);
logger.info({ id }, "Bot unregistered");
return c.body(null, 200);
} catch (error) {
logger.error({ id, error: errorMessage(error) }, "Failed to unregister bot");
return c.json({ error: errorMessage(error) }, 500);
}
});
// Create group
app.post("/api/bots/:id/groups", async (c) => {
const id = c.req.param("id");
const { name, members, description } = await c.req.json<{
name: string;
members: string[];
description?: string;
}>();
try {
const result = await service.createGroup(id, name, members, description);
logger.info({ id, groupId: result.groupId }, "Group created");
return c.json(result);
} catch (error) {
logger.error({ id, error: errorMessage(error) }, "Failed to create group");
return c.json({ error: errorMessage(error) }, 500);
}
});
// Update group
app.put("/api/bots/:id/groups/:groupId", async (c) => {
const id = c.req.param("id");
const groupId = c.req.param("groupId");
const { name, description } = await c.req.json<{
name?: string;
description?: string;
}>();
try {
await service.updateGroup(id, groupId, name, description);
logger.info({ id, groupId }, "Group updated");
return c.json({ success: true });
} catch (error) {
logger.error({ id, error: errorMessage(error) }, "Failed to update group");
return c.json({ error: errorMessage(error) }, 500);
}
});
// List groups
app.get("/api/bots/:id/groups", async (c) => {
const id = c.req.param("id");
try {
const groups = await service.listGroups(id);
return c.json(groups);
} catch (error) {
logger.error({ id, error: errorMessage(error) }, "Failed to list groups");
return c.json({ error: errorMessage(error) }, 500);
}
});
// Health check
app.get("/api/health", (c) => {
return c.json({ status: "ok" });
});
return app;
}