mirror of
https://github.com/versia-pub/server.git
synced 2026-03-13 13:59:16 +01:00
refactor(api): 🎨 Finish Hono refactor
This commit is contained in:
parent
826a260e90
commit
959dd27ad6
20 changed files with 309 additions and 316 deletions
|
|
@ -105,10 +105,10 @@ describe(meta.route, () => {
|
|||
headers: {
|
||||
Authorization: `Bearer ${tokens[1].accessToken}`,
|
||||
},
|
||||
body: getFormData({
|
||||
body: new URLSearchParams({
|
||||
status: "Reply",
|
||||
in_reply_to_id: timeline[0].id,
|
||||
federate: false,
|
||||
federate: "false",
|
||||
}),
|
||||
}),
|
||||
);
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
import { applyConfig, auth, handleZodError, idValidator } from "@api";
|
||||
import { applyConfig, auth, handleZodError, idValidator, qsQuery } from "@api";
|
||||
import { zValidator } from "@hono/zod-validator";
|
||||
import { errorResponse, jsonResponse } from "@response";
|
||||
import { inArray } from "drizzle-orm";
|
||||
|
|
@ -23,7 +23,7 @@ export const meta = applyConfig({
|
|||
|
||||
export const schemas = {
|
||||
query: z.object({
|
||||
"id[]": z.array(z.string().uuid()).min(1).max(10),
|
||||
id: z.array(z.string().uuid()).min(1).max(10).or(z.string().uuid()),
|
||||
}),
|
||||
};
|
||||
|
||||
|
|
@ -31,11 +31,12 @@ export default (app: Hono) =>
|
|||
app.on(
|
||||
meta.allowedMethods,
|
||||
meta.route,
|
||||
qsQuery(),
|
||||
zValidator("query", schemas.query, handleZodError),
|
||||
auth(meta.auth),
|
||||
async (context) => {
|
||||
const { user: self } = context.req.valid("header");
|
||||
const { "id[]": ids } = context.req.valid("query");
|
||||
const { id: ids } = context.req.valid("query");
|
||||
|
||||
if (!self) return errorResponse("Unauthorized", 401);
|
||||
|
||||
|
|
@ -46,7 +47,10 @@ export default (app: Hono) =>
|
|||
},
|
||||
where: (relationship, { inArray, and, eq }) =>
|
||||
and(
|
||||
inArray(relationship.subjectId, ids),
|
||||
inArray(
|
||||
relationship.subjectId,
|
||||
Array.isArray(ids) ? ids : [ids],
|
||||
),
|
||||
eq(relationship.following, true),
|
||||
),
|
||||
});
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
import { applyConfig, auth, handleZodError, idValidator } from "@api";
|
||||
import { applyConfig, auth, handleZodError, idValidator, qsQuery } from "@api";
|
||||
import { zValidator } from "@hono/zod-validator";
|
||||
import { errorResponse, jsonResponse } from "@response";
|
||||
import type { Hono } from "hono";
|
||||
|
|
@ -25,7 +25,7 @@ export const meta = applyConfig({
|
|||
|
||||
export const schemas = {
|
||||
query: z.object({
|
||||
"id[]": z.array(z.string().uuid()).min(1).max(10),
|
||||
id: z.array(z.string().uuid()).min(1).max(10).or(z.string().uuid()),
|
||||
}),
|
||||
};
|
||||
|
||||
|
|
@ -33,11 +33,14 @@ export default (app: Hono) =>
|
|||
app.on(
|
||||
meta.allowedMethods,
|
||||
meta.route,
|
||||
qsQuery(),
|
||||
zValidator("query", schemas.query, handleZodError),
|
||||
auth(meta.auth),
|
||||
async (context) => {
|
||||
const { user: self } = context.req.valid("header");
|
||||
const { "id[]": ids } = context.req.valid("query");
|
||||
const { id } = context.req.valid("query");
|
||||
|
||||
const ids = Array.isArray(id) ? id : [id];
|
||||
|
||||
if (!self) return errorResponse("Unauthorized", 401);
|
||||
|
||||
|
|
|
|||
|
|
@ -83,10 +83,10 @@ beforeAll(async () => {
|
|||
headers: {
|
||||
Authorization: `Bearer ${tokens[1].accessToken}`,
|
||||
},
|
||||
body: getFormData({
|
||||
body: new URLSearchParams({
|
||||
status: `@${users[0].getUser().username} test mention`,
|
||||
visibility: "direct",
|
||||
federate: false,
|
||||
federate: "false",
|
||||
}),
|
||||
}),
|
||||
);
|
||||
|
|
|
|||
|
|
@ -27,7 +27,7 @@ describe(meta.route, () => {
|
|||
const response = await sendTestRequest(
|
||||
new Request(new URL(meta.route, config.http.base_url), {
|
||||
method: "POST",
|
||||
body: new FormData(),
|
||||
body: new URLSearchParams(),
|
||||
}),
|
||||
);
|
||||
|
||||
|
|
@ -41,7 +41,7 @@ describe(meta.route, () => {
|
|||
headers: {
|
||||
Authorization: `Bearer ${tokens[0].accessToken}`,
|
||||
},
|
||||
body: new FormData(),
|
||||
body: new URLSearchParams(),
|
||||
}),
|
||||
);
|
||||
|
||||
|
|
@ -55,9 +55,9 @@ describe(meta.route, () => {
|
|||
headers: {
|
||||
Authorization: `Bearer ${tokens[0].accessToken}`,
|
||||
},
|
||||
body: getFormData({
|
||||
body: new URLSearchParams({
|
||||
status: "a".repeat(config.validation.max_note_size + 1),
|
||||
federate: false,
|
||||
federate: "false",
|
||||
}),
|
||||
}),
|
||||
);
|
||||
|
|
@ -72,10 +72,10 @@ describe(meta.route, () => {
|
|||
headers: {
|
||||
Authorization: `Bearer ${tokens[0].accessToken}`,
|
||||
},
|
||||
body: getFormData({
|
||||
body: new URLSearchParams({
|
||||
status: "Hello, world!",
|
||||
visibility: "invalid",
|
||||
federate: false,
|
||||
federate: "false",
|
||||
}),
|
||||
}),
|
||||
);
|
||||
|
|
@ -90,10 +90,10 @@ describe(meta.route, () => {
|
|||
headers: {
|
||||
Authorization: `Bearer ${tokens[0].accessToken}`,
|
||||
},
|
||||
body: getFormData({
|
||||
body: new URLSearchParams({
|
||||
status: "Hello, world!",
|
||||
scheduled_at: "invalid",
|
||||
federate: false,
|
||||
federate: "false",
|
||||
}),
|
||||
}),
|
||||
);
|
||||
|
|
@ -108,10 +108,10 @@ describe(meta.route, () => {
|
|||
headers: {
|
||||
Authorization: `Bearer ${tokens[0].accessToken}`,
|
||||
},
|
||||
body: getFormData({
|
||||
body: new URLSearchParams({
|
||||
status: "Hello, world!",
|
||||
in_reply_to_id: "invalid",
|
||||
federate: false,
|
||||
federate: "false",
|
||||
}),
|
||||
}),
|
||||
);
|
||||
|
|
@ -126,10 +126,10 @@ describe(meta.route, () => {
|
|||
headers: {
|
||||
Authorization: `Bearer ${tokens[0].accessToken}`,
|
||||
},
|
||||
body: getFormData({
|
||||
body: new URLSearchParams({
|
||||
status: "Hello, world!",
|
||||
quote_id: "invalid",
|
||||
federate: false,
|
||||
federate: "false",
|
||||
}),
|
||||
}),
|
||||
);
|
||||
|
|
@ -144,10 +144,10 @@ describe(meta.route, () => {
|
|||
headers: {
|
||||
Authorization: `Bearer ${tokens[0].accessToken}`,
|
||||
},
|
||||
body: getFormData({
|
||||
body: new URLSearchParams({
|
||||
status: "Hello, world!",
|
||||
"media_ids[]": "invalid",
|
||||
federate: false,
|
||||
federate: "false",
|
||||
}),
|
||||
}),
|
||||
);
|
||||
|
|
@ -162,9 +162,9 @@ describe(meta.route, () => {
|
|||
headers: {
|
||||
Authorization: `Bearer ${tokens[0].accessToken}`,
|
||||
},
|
||||
body: getFormData({
|
||||
body: new URLSearchParams({
|
||||
status: "Hello, world!",
|
||||
federate: false,
|
||||
federate: "false",
|
||||
}),
|
||||
}),
|
||||
);
|
||||
|
|
@ -184,10 +184,10 @@ describe(meta.route, () => {
|
|||
headers: {
|
||||
Authorization: `Bearer ${tokens[0].accessToken}`,
|
||||
},
|
||||
body: getFormData({
|
||||
body: new URLSearchParams({
|
||||
status: "Hello, world!",
|
||||
visibility: "unlisted",
|
||||
federate: false,
|
||||
federate: "false",
|
||||
}),
|
||||
}),
|
||||
);
|
||||
|
|
@ -208,9 +208,9 @@ describe(meta.route, () => {
|
|||
headers: {
|
||||
Authorization: `Bearer ${tokens[0].accessToken}`,
|
||||
},
|
||||
body: getFormData({
|
||||
body: new URLSearchParams({
|
||||
status: "Hello, world!",
|
||||
federate: false,
|
||||
federate: "false",
|
||||
}),
|
||||
}),
|
||||
);
|
||||
|
|
@ -223,10 +223,10 @@ describe(meta.route, () => {
|
|||
headers: {
|
||||
Authorization: `Bearer ${tokens[0].accessToken}`,
|
||||
},
|
||||
body: getFormData({
|
||||
body: new URLSearchParams({
|
||||
status: "Hello, world again!",
|
||||
in_reply_to_id: object.id,
|
||||
federate: false,
|
||||
federate: "false",
|
||||
}),
|
||||
}),
|
||||
);
|
||||
|
|
@ -247,9 +247,9 @@ describe(meta.route, () => {
|
|||
headers: {
|
||||
Authorization: `Bearer ${tokens[0].accessToken}`,
|
||||
},
|
||||
body: getFormData({
|
||||
body: new URLSearchParams({
|
||||
status: "Hello, world!",
|
||||
federate: false,
|
||||
federate: "false",
|
||||
}),
|
||||
}),
|
||||
);
|
||||
|
|
@ -262,10 +262,10 @@ describe(meta.route, () => {
|
|||
headers: {
|
||||
Authorization: `Bearer ${tokens[0].accessToken}`,
|
||||
},
|
||||
body: getFormData({
|
||||
body: new URLSearchParams({
|
||||
status: "Hello, world again!",
|
||||
quote_id: object.id,
|
||||
federate: false,
|
||||
federate: "false",
|
||||
}),
|
||||
}),
|
||||
);
|
||||
|
|
@ -290,9 +290,9 @@ describe(meta.route, () => {
|
|||
headers: {
|
||||
Authorization: `Bearer ${tokens[0].accessToken}`,
|
||||
},
|
||||
body: getFormData({
|
||||
body: new URLSearchParams({
|
||||
status: `Hello, @${users[1].getUser().username}!`,
|
||||
federate: false,
|
||||
federate: "false",
|
||||
}),
|
||||
}),
|
||||
);
|
||||
|
|
@ -319,11 +319,11 @@ describe(meta.route, () => {
|
|||
headers: {
|
||||
Authorization: `Bearer ${tokens[0].accessToken}`,
|
||||
},
|
||||
body: getFormData({
|
||||
body: new URLSearchParams({
|
||||
status: `Hello, @${users[1].getUser().username}@${
|
||||
new URL(config.http.base_url).host
|
||||
}!`,
|
||||
federate: false,
|
||||
federate: "false",
|
||||
}),
|
||||
}),
|
||||
);
|
||||
|
|
@ -352,9 +352,9 @@ describe(meta.route, () => {
|
|||
headers: {
|
||||
Authorization: `Bearer ${tokens[0].accessToken}`,
|
||||
},
|
||||
body: getFormData({
|
||||
body: new URLSearchParams({
|
||||
status: "Hi! <script>alert('Hello, world!');</script>",
|
||||
federate: false,
|
||||
federate: "false",
|
||||
}),
|
||||
}),
|
||||
);
|
||||
|
|
@ -378,11 +378,11 @@ describe(meta.route, () => {
|
|||
headers: {
|
||||
Authorization: `Bearer ${tokens[0].accessToken}`,
|
||||
},
|
||||
body: getFormData({
|
||||
body: new URLSearchParams({
|
||||
status: "Hello, world!",
|
||||
spoiler_text:
|
||||
"uwu <script>alert('Hello, world!');</script>",
|
||||
federate: false,
|
||||
federate: "false",
|
||||
}),
|
||||
}),
|
||||
);
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
import { applyConfig, auth, handleZodError } from "@api";
|
||||
import { applyConfig, auth, handleZodError, qs } from "@api";
|
||||
import { zValidator } from "@hono/zod-validator";
|
||||
import { errorResponse, jsonResponse } from "@response";
|
||||
import { config } from "config-manager";
|
||||
|
|
@ -30,7 +30,7 @@ export const schemas = {
|
|||
.optional(),
|
||||
// TODO: Add regex to validate
|
||||
content_type: z.string().optional().default("text/plain"),
|
||||
"media_ids[]": z
|
||||
media_ids: z
|
||||
.array(z.string().uuid())
|
||||
.max(config.validation.max_media_attachments)
|
||||
.optional(),
|
||||
|
|
@ -83,6 +83,7 @@ export default (app: Hono) =>
|
|||
app.on(
|
||||
meta.allowedMethods,
|
||||
meta.route,
|
||||
qs(),
|
||||
zValidator("form", schemas.form, handleZodError),
|
||||
auth(meta.auth),
|
||||
async (context) => {
|
||||
|
|
@ -92,7 +93,7 @@ export default (app: Hono) =>
|
|||
|
||||
const {
|
||||
status,
|
||||
"media_ids[]": media_ids,
|
||||
media_ids,
|
||||
"poll[options]": options,
|
||||
in_reply_to_id,
|
||||
quote_id,
|
||||
|
|
|
|||
|
|
@ -29,13 +29,11 @@ export const schemas = {
|
|||
.enum(["none", "login", "consent", "select_account"])
|
||||
.optional()
|
||||
.default("none"),
|
||||
max_age: z
|
||||
max_age: z.coerce
|
||||
.number()
|
||||
.int()
|
||||
.optional()
|
||||
.default(60 * 60 * 24 * 7),
|
||||
}),
|
||||
body: z.object({
|
||||
scope: z.string().optional(),
|
||||
redirect_uri: z.string().url().optional(),
|
||||
response_type: z.enum([
|
||||
|
|
@ -77,7 +75,6 @@ export default (app: Hono) =>
|
|||
meta.allowedMethods,
|
||||
meta.route,
|
||||
zValidator("query", schemas.query, handleZodError),
|
||||
zValidator("json", schemas.body, handleZodError),
|
||||
async (context) => {
|
||||
const {
|
||||
scope,
|
||||
|
|
@ -87,8 +84,8 @@ export default (app: Hono) =>
|
|||
state,
|
||||
code_challenge,
|
||||
code_challenge_method,
|
||||
} = context.req.valid("json");
|
||||
const body = context.req.valid("json");
|
||||
} = context.req.valid("query");
|
||||
const body = context.req.valid("query");
|
||||
|
||||
const cookie = context.req.header("Cookie");
|
||||
|
||||
|
|
|
|||
|
|
@ -20,7 +20,7 @@ export const meta = applyConfig({
|
|||
});
|
||||
|
||||
export const schemas = {
|
||||
json: z.object({
|
||||
form: z.object({
|
||||
code: z.string().optional(),
|
||||
code_verifier: z.string().optional(),
|
||||
grant_type: z.enum([
|
||||
|
|
@ -63,10 +63,10 @@ export default (app: Hono) =>
|
|||
app.on(
|
||||
meta.allowedMethods,
|
||||
meta.route,
|
||||
zValidator("json", schemas.json, handleZodError),
|
||||
zValidator("form", schemas.form, handleZodError),
|
||||
async (context) => {
|
||||
const { grant_type, code, redirect_uri, client_id, client_secret } =
|
||||
context.req.valid("json");
|
||||
context.req.valid("form");
|
||||
|
||||
switch (grant_type) {
|
||||
case "authorization_code": {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue