refactor(api): 🎨 Finish Hono refactor

This commit is contained in:
Jesse Wierzbinski 2024-05-06 08:19:42 +00:00
parent 826a260e90
commit 959dd27ad6
No known key found for this signature in database
20 changed files with 309 additions and 316 deletions

View file

@ -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",
}),
}),
);

View file

@ -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),
),
});

View file

@ -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);

View file

@ -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",
}),
}),
);

View file

@ -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",
}),
}),
);

View file

@ -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,

View file

@ -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");

View file

@ -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": {