mirror of
https://github.com/nestriness/nestri.git
synced 2025-12-12 08:45:38 +02:00
Merging this prematurely to make sure the team is on the same boat... like dang! We need to find a better way to do this. Plus it has become too big
95 lines
3.3 KiB
TypeScript
95 lines
3.3 KiB
TypeScript
import { z } from "zod";
|
|
import { Hono } from "hono";
|
|
import { notPublic } from "./auth";
|
|
import { describeRoute } from "hono-openapi";
|
|
import { User } from "@nestri/core/user/index";
|
|
import { Team } from "@nestri/core/team/index";
|
|
import { Examples } from "@nestri/core/examples";
|
|
import { Member } from "@nestri/core/member/index";
|
|
import { assertActor, withActor } from "@nestri/core/actor";
|
|
import { ErrorResponses, Result, validator } from "./common";
|
|
|
|
export module TeamApi {
|
|
export const route = new Hono()
|
|
.use(notPublic)
|
|
.get("/",
|
|
describeRoute({
|
|
tags: ["Team"],
|
|
summary: "List teams",
|
|
description: "List the teams associated with the current user",
|
|
responses: {
|
|
200: {
|
|
content: {
|
|
"application/json": {
|
|
schema: Result(
|
|
Team.Info.array().openapi({
|
|
description: "List of teams",
|
|
example: [Examples.Team]
|
|
})
|
|
),
|
|
},
|
|
},
|
|
description: "List of teams"
|
|
},
|
|
}
|
|
}),
|
|
async (c) => {
|
|
return c.json({
|
|
data: await User.teams()
|
|
}, 200);
|
|
},
|
|
)
|
|
.post("/",
|
|
describeRoute({
|
|
tags: ["Team"],
|
|
summary: "Create a team",
|
|
description: "Create a team for the current user",
|
|
responses: {
|
|
200: {
|
|
content: {
|
|
"application/json": {
|
|
schema: Result(
|
|
z.literal("ok")
|
|
)
|
|
}
|
|
},
|
|
description: "Team created succesfully"
|
|
},
|
|
400: ErrorResponses[400],
|
|
409: ErrorResponses[409],
|
|
429: ErrorResponses[429],
|
|
500: ErrorResponses[500],
|
|
}
|
|
}),
|
|
validator(
|
|
"json",
|
|
Team.create.schema.omit({ id: true }).openapi({
|
|
description: "Details of the team to create",
|
|
//@ts-expect-error
|
|
example: { ...Examples.Team, id: undefined }
|
|
})
|
|
),
|
|
async (c) => {
|
|
const body = c.req.valid("json")
|
|
const actor = assertActor("user");
|
|
|
|
const teamID = await Team.create(body);
|
|
|
|
await withActor(
|
|
{
|
|
type: "system",
|
|
properties: {
|
|
teamID,
|
|
},
|
|
},
|
|
() =>
|
|
Member.create({
|
|
first: true,
|
|
email: actor.properties.email,
|
|
}),
|
|
);
|
|
|
|
return c.json({ data: "ok" })
|
|
}
|
|
)
|
|
} |