kaneo (minimalist kanban) fork to experiment adding a tangled integration
github.com/usekaneo/kaneo
1import { Hono } from "hono";
2import { describeRoute, resolver, validator } from "hono-openapi";
3import * as v from "valibot";
4import getInvitationDetailsController from "./controllers/get-invitation-details";
5import getUserPendingInvitations from "./controllers/get-user-pending-invitations";
6
7const invitation = new Hono<{
8 Variables: {
9 userId: string;
10 userEmail: string;
11 };
12}>()
13 .get(
14 "/pending",
15 describeRoute({
16 operationId: "getUserPendingInvitations",
17 tags: ["Invitations"],
18 description: "Get all pending invitations for the current user",
19 responses: {
20 200: {
21 description: "List of pending invitations",
22 content: {
23 "application/json": {
24 schema: resolver(
25 v.array(
26 v.object({
27 id: v.string(),
28 email: v.string(),
29 workspaceId: v.string(),
30 workspaceName: v.string(),
31 inviterName: v.string(),
32 expiresAt: v.string(),
33 createdAt: v.string(),
34 status: v.string(),
35 }),
36 ),
37 ),
38 },
39 },
40 },
41 },
42 }),
43 async (c) => {
44 const userEmail = c.get("userEmail");
45 const invitations = await getUserPendingInvitations(userEmail);
46 return c.json(invitations);
47 },
48 )
49 .get(
50 "/:id",
51 describeRoute({
52 operationId: "getInvitationDetails",
53 tags: ["Invitations"],
54 description: "Get details of a specific invitation by ID",
55 responses: {
56 200: {
57 description: "Invitation details",
58 content: {
59 "application/json": {
60 schema: resolver(
61 v.object({
62 valid: v.boolean(),
63 invitation: v.optional(
64 v.object({
65 id: v.string(),
66 email: v.string(),
67 workspaceName: v.string(),
68 inviterName: v.string(),
69 expiresAt: v.string(),
70 status: v.string(),
71 expired: v.boolean(),
72 }),
73 ),
74 error: v.optional(v.string()),
75 }),
76 ),
77 },
78 },
79 },
80 },
81 }),
82 validator("param", v.object({ id: v.string() })),
83 async (c) => {
84 const { id } = c.req.valid("param");
85 const result = await getInvitationDetailsController(id);
86 return c.json(result);
87 },
88 );
89
90export default invitation;