feat(api): 🏷️ Port Account OpenAPI schemas from Mastodon API docs

This commit is contained in:
Jesse Wierzbinski 2025-02-05 21:49:39 +01:00
parent 76d1ccc859
commit 2aeada4904
No known key found for this signature in database
95 changed files with 610 additions and 388 deletions

View file

@ -1,12 +1,11 @@
import { apiRoute } from "@/api"; import { apiRoute } from "@/api";
import { createRoute } from "@hono/zod-openapi"; import { createRoute, z } from "@hono/zod-openapi";
import { Application, User } from "@versia/kit/db"; import { Application, User } from "@versia/kit/db";
import { Users } from "@versia/kit/tables"; import { Users } from "@versia/kit/tables";
import { eq, or } from "drizzle-orm"; import { eq, or } from "drizzle-orm";
import type { Context } from "hono"; import type { Context } from "hono";
import { setCookie } from "hono/cookie"; import { setCookie } from "hono/cookie";
import { SignJWT } from "jose"; import { SignJWT } from "jose";
import { z } from "zod";
import { ApiError } from "~/classes/errors/api-error"; import { ApiError } from "~/classes/errors/api-error";
import { config } from "~/packages/config-manager"; import { config } from "~/packages/config-manager";

View file

@ -1,9 +1,8 @@
import { apiRoute } from "@/api"; import { apiRoute } from "@/api";
import { createRoute } from "@hono/zod-openapi"; import { createRoute, z } from "@hono/zod-openapi";
import { db } from "@versia/kit/db"; import { db } from "@versia/kit/db";
import { Applications, Tokens } from "@versia/kit/tables"; import { Applications, Tokens } from "@versia/kit/tables";
import { and, eq } from "drizzle-orm"; import { and, eq } from "drizzle-orm";
import { z } from "zod";
import { config } from "~/packages/config-manager"; import { config } from "~/packages/config-manager";
const schemas = { const schemas = {

View file

@ -1,10 +1,9 @@
import { apiRoute } from "@/api"; import { apiRoute } from "@/api";
import { createRoute } from "@hono/zod-openapi"; import { createRoute, z } from "@hono/zod-openapi";
import { User } from "@versia/kit/db"; import { User } from "@versia/kit/db";
import { Users } from "@versia/kit/tables"; import { Users } from "@versia/kit/tables";
import { eq } from "drizzle-orm"; import { eq } from "drizzle-orm";
import type { Context } from "hono"; import type { Context } from "hono";
import { z } from "zod";
import { config } from "~/packages/config-manager"; import { config } from "~/packages/config-manager";
const schemas = { const schemas = {

View file

@ -1,8 +1,7 @@
import { apiRoute, auth, withUserParam } from "@/api"; import { apiRoute, auth, withUserParam } from "@/api";
import { createRoute } from "@hono/zod-openapi"; import { createRoute, z } from "@hono/zod-openapi";
import { Relationship } from "@versia/kit/db"; import { Relationship } from "@versia/kit/db";
import { RolePermissions } from "@versia/kit/tables"; import { RolePermissions } from "@versia/kit/tables";
import { z } from "zod";
const route = createRoute({ const route = createRoute({
method: "post", method: "post",

View file

@ -1,9 +1,8 @@
import { apiRoute, auth, withUserParam } from "@/api"; import { apiRoute, auth, withUserParam } from "@/api";
import { createRoute } from "@hono/zod-openapi"; import { createRoute, z } from "@hono/zod-openapi";
import { Relationship } from "@versia/kit/db"; import { Relationship } from "@versia/kit/db";
import { RolePermissions } from "@versia/kit/tables"; import { RolePermissions } from "@versia/kit/tables";
import ISO6391 from "iso-639-1"; import ISO6391 from "iso-639-1";
import { z } from "zod";
const schemas = { const schemas = {
param: z.object({ param: z.object({

View file

@ -1,9 +1,9 @@
import { apiRoute, auth, withUserParam } from "@/api"; import { apiRoute, auth, withUserParam } from "@/api";
import { createRoute } from "@hono/zod-openapi"; import { createRoute, z } from "@hono/zod-openapi";
import { Timeline, User } from "@versia/kit/db"; import { Timeline } from "@versia/kit/db";
import { RolePermissions, Users } from "@versia/kit/tables"; import { RolePermissions, Users } from "@versia/kit/tables";
import { and, gt, gte, lt, sql } from "drizzle-orm"; import { and, gt, gte, lt, sql } from "drizzle-orm";
import { z } from "zod"; import { Account } from "~/classes/schemas/account";
const schemas = { const schemas = {
query: z.object({ query: z.object({
@ -43,7 +43,7 @@ const route = createRoute({
description: "A list of accounts that follow the specified account", description: "A list of accounts that follow the specified account",
content: { content: {
"application/json": { "application/json": {
schema: z.array(User.schema), schema: z.array(Account),
}, },
}, },
headers: { headers: {

View file

@ -1,9 +1,9 @@
import { apiRoute, auth, withUserParam } from "@/api"; import { apiRoute, auth, withUserParam } from "@/api";
import { createRoute } from "@hono/zod-openapi"; import { createRoute, z } from "@hono/zod-openapi";
import { Timeline, User } from "@versia/kit/db"; import { Timeline } from "@versia/kit/db";
import { RolePermissions, Users } from "@versia/kit/tables"; import { RolePermissions, Users } from "@versia/kit/tables";
import { and, gt, gte, lt, sql } from "drizzle-orm"; import { and, gt, gte, lt, sql } from "drizzle-orm";
import { z } from "zod"; import { Account } from "~/classes/schemas/account";
const schemas = { const schemas = {
query: z.object({ query: z.object({
@ -44,7 +44,7 @@ const route = createRoute({
"A list of accounts that the specified account follows", "A list of accounts that the specified account follows",
content: { content: {
"application/json": { "application/json": {
schema: z.array(User.schema), schema: z.array(Account),
}, },
}, },
headers: { headers: {

View file

@ -1,8 +1,7 @@
import { apiRoute, auth, withUserParam } from "@/api"; import { apiRoute, auth, withUserParam } from "@/api";
import { createRoute } from "@hono/zod-openapi"; import { createRoute, z } from "@hono/zod-openapi";
import { User } from "@versia/kit/db";
import { RolePermissions } from "@versia/kit/tables"; import { RolePermissions } from "@versia/kit/tables";
import { z } from "zod"; import { Account } from "~/classes/schemas/account";
const route = createRoute({ const route = createRoute({
method: "get", method: "get",
@ -26,7 +25,7 @@ const route = createRoute({
description: "Account data", description: "Account data",
content: { content: {
"application/json": { "application/json": {
schema: User.schema, schema: Account,
}, },
}, },
}, },

View file

@ -1,8 +1,7 @@
import { apiRoute, auth, withUserParam } from "@/api"; import { apiRoute, auth, withUserParam } from "@/api";
import { createRoute } from "@hono/zod-openapi"; import { createRoute, z } from "@hono/zod-openapi";
import { Relationship } from "@versia/kit/db"; import { Relationship } from "@versia/kit/db";
import { RolePermissions } from "@versia/kit/tables"; import { RolePermissions } from "@versia/kit/tables";
import { z } from "zod";
const schemas = { const schemas = {
param: z.object({ param: z.object({

View file

@ -1,8 +1,7 @@
import { apiRoute, auth, withUserParam } from "@/api"; import { apiRoute, auth, withUserParam } from "@/api";
import { createRoute } from "@hono/zod-openapi"; import { createRoute, z } from "@hono/zod-openapi";
import { Relationship } from "@versia/kit/db"; import { Relationship } from "@versia/kit/db";
import { RolePermissions } from "@versia/kit/tables"; import { RolePermissions } from "@versia/kit/tables";
import { z } from "zod";
const schemas = { const schemas = {
param: z.object({ param: z.object({

View file

@ -1,8 +1,7 @@
import { apiRoute, auth, withUserParam } from "@/api"; import { apiRoute, auth, withUserParam } from "@/api";
import { createRoute } from "@hono/zod-openapi"; import { createRoute, z } from "@hono/zod-openapi";
import { Relationship } from "@versia/kit/db"; import { Relationship } from "@versia/kit/db";
import { RolePermissions } from "@versia/kit/tables"; import { RolePermissions } from "@versia/kit/tables";
import { z } from "zod";
const route = createRoute({ const route = createRoute({
method: "post", method: "post",

View file

@ -1,9 +1,8 @@
import { apiRoute, auth, withUserParam } from "@/api"; import { apiRoute, auth, withUserParam } from "@/api";
import { createRoute } from "@hono/zod-openapi"; import { createRoute, z } from "@hono/zod-openapi";
import { User } from "@versia/kit/db";
import { RolePermissions } from "@versia/kit/tables"; import { RolePermissions } from "@versia/kit/tables";
import { z } from "zod";
import { ApiError } from "~/classes/errors/api-error"; import { ApiError } from "~/classes/errors/api-error";
import { Account } from "~/classes/schemas/account";
import { ErrorSchema } from "~/types/api"; import { ErrorSchema } from "~/types/api";
const route = createRoute({ const route = createRoute({
@ -29,7 +28,7 @@ const route = createRoute({
description: "Updated user data", description: "Updated user data",
content: { content: {
"application/json": { "application/json": {
schema: User.schema, schema: Account,
}, },
}, },
}, },

View file

@ -1,8 +1,7 @@
import { apiRoute, auth, withUserParam } from "@/api"; import { apiRoute, auth, withUserParam } from "@/api";
import { createRoute } from "@hono/zod-openapi"; import { createRoute, z } from "@hono/zod-openapi";
import { Relationship } from "@versia/kit/db"; import { Relationship } from "@versia/kit/db";
import { RolePermissions } from "@versia/kit/tables"; import { RolePermissions } from "@versia/kit/tables";
import { z } from "zod";
const route = createRoute({ const route = createRoute({
method: "post", method: "post",

View file

@ -1,8 +1,7 @@
import { apiRoute, auth, withUserParam } from "@/api"; import { apiRoute, auth, withUserParam } from "@/api";
import { createRoute } from "@hono/zod-openapi"; import { createRoute, z } from "@hono/zod-openapi";
import { Role } from "@versia/kit/db"; import { Role } from "@versia/kit/db";
import { RolePermissions } from "@versia/kit/tables"; import { RolePermissions } from "@versia/kit/tables";
import { z } from "zod";
import { ApiError } from "~/classes/errors/api-error"; import { ApiError } from "~/classes/errors/api-error";
import { ErrorSchema } from "~/types/api"; import { ErrorSchema } from "~/types/api";

View file

@ -1,7 +1,6 @@
import { apiRoute, auth, withUserParam } from "@/api"; import { apiRoute, auth, withUserParam } from "@/api";
import { createRoute } from "@hono/zod-openapi"; import { createRoute, z } from "@hono/zod-openapi";
import { Role } from "@versia/kit/db"; import { Role } from "@versia/kit/db";
import { z } from "zod";
const route = createRoute({ const route = createRoute({
method: "get", method: "get",

View file

@ -1,9 +1,8 @@
import { apiRoute, auth, withUserParam } from "@/api"; import { apiRoute, auth, withUserParam } from "@/api";
import { createRoute } from "@hono/zod-openapi"; import { createRoute, z } from "@hono/zod-openapi";
import { Note, Timeline } from "@versia/kit/db"; import { Note, Timeline } from "@versia/kit/db";
import { Notes, RolePermissions } from "@versia/kit/tables"; import { Notes, RolePermissions } from "@versia/kit/tables";
import { and, eq, gt, gte, inArray, isNull, lt, or, sql } from "drizzle-orm"; import { and, eq, gt, gte, inArray, isNull, lt, or, sql } from "drizzle-orm";
import { z } from "zod";
const schemas = { const schemas = {
param: z.object({ param: z.object({

View file

@ -1,8 +1,7 @@
import { apiRoute, auth, withUserParam } from "@/api"; import { apiRoute, auth, withUserParam } from "@/api";
import { createRoute } from "@hono/zod-openapi"; import { createRoute, z } from "@hono/zod-openapi";
import { Relationship } from "@versia/kit/db"; import { Relationship } from "@versia/kit/db";
import { RolePermissions } from "@versia/kit/tables"; import { RolePermissions } from "@versia/kit/tables";
import { z } from "zod";
const route = createRoute({ const route = createRoute({
method: "post", method: "post",

View file

@ -1,8 +1,7 @@
import { apiRoute, auth, withUserParam } from "@/api"; import { apiRoute, auth, withUserParam } from "@/api";
import { createRoute } from "@hono/zod-openapi"; import { createRoute, z } from "@hono/zod-openapi";
import { Relationship } from "@versia/kit/db"; import { Relationship } from "@versia/kit/db";
import { RolePermissions } from "@versia/kit/tables"; import { RolePermissions } from "@versia/kit/tables";
import { z } from "zod";
import { ErrorSchema } from "~/types/api"; import { ErrorSchema } from "~/types/api";
const route = createRoute({ const route = createRoute({

View file

@ -1,8 +1,7 @@
import { apiRoute, auth, withUserParam } from "@/api"; import { apiRoute, auth, withUserParam } from "@/api";
import { createRoute } from "@hono/zod-openapi"; import { createRoute, z } from "@hono/zod-openapi";
import { Relationship } from "@versia/kit/db"; import { Relationship } from "@versia/kit/db";
import { RolePermissions } from "@versia/kit/tables"; import { RolePermissions } from "@versia/kit/tables";
import { z } from "zod";
const route = createRoute({ const route = createRoute({
method: "post", method: "post",

View file

@ -1,8 +1,7 @@
import { apiRoute, auth, withUserParam } from "@/api"; import { apiRoute, auth, withUserParam } from "@/api";
import { createRoute } from "@hono/zod-openapi"; import { createRoute, z } from "@hono/zod-openapi";
import { Relationship } from "@versia/kit/db"; import { Relationship } from "@versia/kit/db";
import { RolePermissions } from "@versia/kit/tables"; import { RolePermissions } from "@versia/kit/tables";
import { z } from "zod";
const route = createRoute({ const route = createRoute({
method: "post", method: "post",

View file

@ -1,9 +1,9 @@
import { apiRoute, auth, qsQuery } from "@/api"; import { apiRoute, auth, qsQuery } from "@/api";
import { createRoute } from "@hono/zod-openapi"; import { createRoute, z } from "@hono/zod-openapi";
import { User, db } from "@versia/kit/db"; import { User, db } from "@versia/kit/db";
import { RolePermissions, type Users } from "@versia/kit/tables"; import { RolePermissions, type Users } from "@versia/kit/tables";
import { type InferSelectModel, sql } from "drizzle-orm"; import { type InferSelectModel, sql } from "drizzle-orm";
import { z } from "zod"; import { Account } from "~/classes/schemas/account";
const schemas = { const schemas = {
query: z.object({ query: z.object({
@ -41,7 +41,7 @@ const route = createRoute({
schema: z.array( schema: z.array(
z.object({ z.object({
id: z.string().uuid(), id: z.string().uuid(),
accounts: z.array(User.schema), accounts: z.array(Account),
}), }),
), ),
}, },

View file

@ -1,10 +1,10 @@
import { apiRoute, auth } from "@/api"; import { apiRoute, auth } from "@/api";
import { createRoute } from "@hono/zod-openapi"; import { createRoute, z } from "@hono/zod-openapi";
import { User } from "@versia/kit/db"; import { User } from "@versia/kit/db";
import { RolePermissions, Users } from "@versia/kit/tables"; import { RolePermissions, Users } from "@versia/kit/tables";
import { and, eq, isNull } from "drizzle-orm"; import { and, eq, isNull } from "drizzle-orm";
import { z } from "zod";
import { ApiError } from "~/classes/errors/api-error"; import { ApiError } from "~/classes/errors/api-error";
import { Account } from "~/classes/schemas/account";
import { ErrorSchema } from "~/types/api"; import { ErrorSchema } from "~/types/api";
const schemas = { const schemas = {
@ -32,7 +32,7 @@ const route = createRoute({
description: "Account", description: "Account",
content: { content: {
"application/json": { "application/json": {
schema: User.schema, schema: Account,
}, },
}, },
}, },

View file

@ -1,11 +1,10 @@
import { apiRoute, auth, jsonOrForm } from "@/api"; import { apiRoute, auth, jsonOrForm } from "@/api";
import { tempmailDomains } from "@/tempmail"; import { tempmailDomains } from "@/tempmail";
import { createRoute } from "@hono/zod-openapi"; import { createRoute, z } from "@hono/zod-openapi";
import { User } from "@versia/kit/db"; import { User } from "@versia/kit/db";
import { Users } from "@versia/kit/tables"; import { Users } from "@versia/kit/tables";
import { and, eq, isNull } from "drizzle-orm"; import { and, eq, isNull } from "drizzle-orm";
import ISO6391 from "iso-639-1"; import ISO6391 from "iso-639-1";
import { z } from "zod";
import { ApiError } from "~/classes/errors/api-error"; import { ApiError } from "~/classes/errors/api-error";
import { config } from "~/packages/config-manager"; import { config } from "~/packages/config-manager";

View file

@ -1,10 +1,10 @@
import { apiRoute, auth, parseUserAddress } from "@/api"; import { apiRoute, auth, parseUserAddress } from "@/api";
import { createRoute } from "@hono/zod-openapi"; import { createRoute, z } from "@hono/zod-openapi";
import { Instance, User } from "@versia/kit/db"; import { Instance, User } from "@versia/kit/db";
import { RolePermissions, Users } from "@versia/kit/tables"; import { RolePermissions, Users } from "@versia/kit/tables";
import { and, eq, isNull } from "drizzle-orm"; import { and, eq, isNull } from "drizzle-orm";
import { z } from "zod";
import { ApiError } from "~/classes/errors/api-error"; import { ApiError } from "~/classes/errors/api-error";
import { Account } from "~/classes/schemas/account";
import { config } from "~/packages/config-manager"; import { config } from "~/packages/config-manager";
import { ErrorSchema } from "~/types/api"; import { ErrorSchema } from "~/types/api";
@ -33,7 +33,7 @@ const route = createRoute({
description: "Account", description: "Account",
content: { content: {
"application/json": { "application/json": {
schema: User.schema, schema: Account,
}, },
}, },
}, },

View file

@ -1,8 +1,7 @@
import { apiRoute, auth, qsQuery } from "@/api"; import { apiRoute, auth, qsQuery } from "@/api";
import { createRoute } from "@hono/zod-openapi"; import { createRoute, z } from "@hono/zod-openapi";
import { Relationship } from "@versia/kit/db"; import { Relationship } from "@versia/kit/db";
import { RolePermissions } from "@versia/kit/tables"; import { RolePermissions } from "@versia/kit/tables";
import { z } from "zod";
const schemas = { const schemas = {
query: z.object({ query: z.object({

View file

@ -1,11 +1,11 @@
import { apiRoute, auth, parseUserAddress, userAddressValidator } from "@/api"; import { apiRoute, auth, parseUserAddress, userAddressValidator } from "@/api";
import { createRoute } from "@hono/zod-openapi"; import { createRoute, z } from "@hono/zod-openapi";
import { User } from "@versia/kit/db"; import { User } from "@versia/kit/db";
import { RolePermissions, Users } from "@versia/kit/tables"; import { RolePermissions, Users } from "@versia/kit/tables";
import { eq, ilike, not, or, sql } from "drizzle-orm"; import { eq, ilike, not, or, sql } from "drizzle-orm";
import stringComparison from "string-comparison"; import stringComparison from "string-comparison";
import { z } from "zod";
import { ApiError } from "~/classes/errors/api-error"; import { ApiError } from "~/classes/errors/api-error";
import { Account } from "~/classes/schemas/account";
const schemas = { const schemas = {
query: z.object({ query: z.object({
@ -43,7 +43,7 @@ export const route = createRoute({
description: "Accounts", description: "Accounts",
content: { content: {
"application/json": { "application/json": {
schema: z.array(User.schema), schema: z.array(Account),
}, },
}, },
}, },

View file

@ -1,134 +1,72 @@
import { apiRoute, auth, jsonOrForm } from "@/api"; import { apiRoute, auth, jsonOrForm } from "@/api";
import { mergeAndDeduplicate } from "@/lib"; import { mergeAndDeduplicate } from "@/lib";
import { sanitizedHtmlStrip } from "@/sanitization"; import { sanitizedHtmlStrip } from "@/sanitization";
import { createRoute } from "@hono/zod-openapi"; import { createRoute, z } from "@hono/zod-openapi";
import { Emoji, User } from "@versia/kit/db"; import { Emoji, User } from "@versia/kit/db";
import { RolePermissions, Users } from "@versia/kit/tables"; import { RolePermissions, Users } from "@versia/kit/tables";
import { and, eq, isNull } from "drizzle-orm"; import { and, eq, isNull } from "drizzle-orm";
import ISO6391 from "iso-639-1";
import { z } from "zod";
import { ApiError } from "~/classes/errors/api-error"; import { ApiError } from "~/classes/errors/api-error";
import { contentToHtml } from "~/classes/functions/status"; import { contentToHtml } from "~/classes/functions/status";
import { Account } from "~/classes/schemas/account";
import { config } from "~/packages/config-manager/index.ts"; import { config } from "~/packages/config-manager/index.ts";
import { ErrorSchema } from "~/types/api"; import { ErrorSchema } from "~/types/api";
const schemas = { const schemas = {
json: z.object({ json: z
display_name: z .object({
.string() display_name: Account.shape.display_name,
.min(3) username: Account.shape.username,
.trim() note: Account.shape.note,
.max(config.validation.max_displayname_size) avatar: z
.refine( .string()
(s) => .trim()
!config.filters.displayname.some((filter) => .min(1)
s.match(filter), .max(2000)
), .url()
"Display name contains blocked words", .transform((a) => new URL(a))
) .or(
.optional(), z
username: z .instanceof(File)
.string() .refine(
.min(3) (v) => v.size <= config.validation.max_avatar_size,
.trim() `Avatar must be less than ${config.validation.max_avatar_size} bytes`,
.max(config.validation.max_username_size) ),
.toLowerCase() ),
.regex( header: z
/^[a-z0-9_-]+$/, .string()
"Username can only contain letters, numbers, underscores and hyphens", .trim()
) .min(1)
.refine( .max(2000)
(s) => .url()
!config.filters.username.some((filter) => s.match(filter)), .transform((v) => new URL(v))
"Username contains blocked words", .or(
) z
.optional(), .instanceof(File)
note: z .refine(
.string() (v) => v.size <= config.validation.max_header_size,
.min(0) `Header must be less than ${config.validation.max_header_size} bytes`,
.max(config.validation.max_bio_size) ),
.trim() ),
.refine( locked: Account.shape.locked,
(s) => !config.filters.bio.some((filter) => s.match(filter)), bot: Account.shape.bot,
"Bio contains blocked words", discoverable: Account.shape.discoverable,
) source: z
.optional(), .object({
avatar: z privacy: Account.shape.source.unwrap().shape.privacy,
.string() sensitive: Account.shape.source.unwrap().shape.sensitive,
.trim() language: Account.shape.source.unwrap().shape.language,
.min(1) })
.max(2000) .partial(),
.url() fields_attributes: z
.transform((a) => new URL(a)) .array(
.or( z.object({
z name: Account.shape.fields.element.shape.name,
.instanceof(File) value: Account.shape.fields.element.shape.value,
.refine( }),
(v) => v.size <= config.validation.max_avatar_size, )
`Avatar must be less than ${config.validation.max_avatar_size} bytes`, .max(config.validation.max_field_count),
), })
) .partial(),
.optional(),
header: z
.string()
.trim()
.min(1)
.max(2000)
.url()
.transform((v) => new URL(v))
.or(
z
.instanceof(File)
.refine(
(v) => v.size <= config.validation.max_header_size,
`Header must be less than ${config.validation.max_header_size} bytes`,
),
)
.optional(),
locked: z
.string()
.transform((v) => ["true", "1", "on"].includes(v.toLowerCase()))
.optional(),
bot: z
.string()
.transform((v) => ["true", "1", "on"].includes(v.toLowerCase()))
.optional(),
discoverable: z
.string()
.transform((v) => ["true", "1", "on"].includes(v.toLowerCase()))
.optional(),
source: z
.object({
privacy: z
.enum(["public", "unlisted", "private", "direct"])
.optional(),
sensitive: z
.string()
.transform((v) =>
["true", "1", "on"].includes(v.toLowerCase()),
)
.optional(),
language: z
.enum(ISO6391.getAllCodes() as [string, ...string[]])
.optional(),
})
.optional(),
fields_attributes: z
.array(
z.object({
name: z
.string()
.trim()
.max(config.validation.max_field_name_size),
value: z
.string()
.trim()
.max(config.validation.max_field_value_size),
}),
)
.max(config.validation.max_field_count)
.optional(),
}),
}; };
const route = createRoute({ const route = createRoute({
@ -158,7 +96,7 @@ const route = createRoute({
description: "Updated user", description: "Updated user",
content: { content: {
"application/json": { "application/json": {
schema: User.schema, schema: Account,
}, },
}, },
}, },

View file

@ -1,6 +1,6 @@
import { apiRoute, auth } from "@/api"; import { apiRoute, auth } from "@/api";
import { createRoute } from "@hono/zod-openapi"; import { createRoute } from "@hono/zod-openapi";
import { User } from "@versia/kit/db"; import { Account } from "~/classes/schemas/account";
const route = createRoute({ const route = createRoute({
method: "get", method: "get",
@ -18,7 +18,7 @@ const route = createRoute({
description: "Account", description: "Account",
content: { content: {
"application/json": { "application/json": {
schema: User.schema, schema: Account,
}, },
}, },
}, },

View file

@ -1,8 +1,7 @@
import { apiRoute, jsonOrForm } from "@/api"; import { apiRoute, jsonOrForm } from "@/api";
import { randomString } from "@/math"; import { randomString } from "@/math";
import { createRoute } from "@hono/zod-openapi"; import { createRoute, z } from "@hono/zod-openapi";
import { Application } from "@versia/kit/db"; import { Application } from "@versia/kit/db";
import { z } from "zod";
const schemas = { const schemas = {
json: z.object({ json: z.object({

View file

@ -1,9 +1,9 @@
import { apiRoute, auth } from "@/api"; import { apiRoute, auth } from "@/api";
import { createRoute } from "@hono/zod-openapi"; import { createRoute, z } from "@hono/zod-openapi";
import { Timeline, User } from "@versia/kit/db"; import { Timeline } from "@versia/kit/db";
import { RolePermissions, Users } from "@versia/kit/tables"; import { RolePermissions, Users } from "@versia/kit/tables";
import { and, gt, gte, lt, sql } from "drizzle-orm"; import { and, gt, gte, lt, sql } from "drizzle-orm";
import { z } from "zod"; import { Account } from "~/classes/schemas/account";
const schemas = { const schemas = {
query: z.object({ query: z.object({
@ -34,7 +34,7 @@ const route = createRoute({
description: "Blocks", description: "Blocks",
content: { content: {
"application/json": { "application/json": {
schema: z.array(User.schema), schema: z.array(Account),
}, },
}, },
}, },

View file

@ -1,9 +1,8 @@
import { apiRoute, auth, emojiValidator, jsonOrForm } from "@/api"; import { apiRoute, auth, emojiValidator, jsonOrForm } from "@/api";
import { mimeLookup } from "@/content_types"; import { mimeLookup } from "@/content_types";
import { createRoute } from "@hono/zod-openapi"; import { createRoute, z } from "@hono/zod-openapi";
import { Emoji } from "@versia/kit/db"; import { Emoji } from "@versia/kit/db";
import { RolePermissions } from "@versia/kit/tables"; import { RolePermissions } from "@versia/kit/tables";
import { z } from "zod";
import { ApiError } from "~/classes/errors/api-error"; import { ApiError } from "~/classes/errors/api-error";
import { config } from "~/packages/config-manager"; import { config } from "~/packages/config-manager";
import { ErrorSchema } from "~/types/api"; import { ErrorSchema } from "~/types/api";

View file

@ -1,10 +1,9 @@
import { apiRoute, auth, emojiValidator, jsonOrForm } from "@/api"; import { apiRoute, auth, emojiValidator, jsonOrForm } from "@/api";
import { mimeLookup } from "@/content_types"; import { mimeLookup } from "@/content_types";
import { createRoute } from "@hono/zod-openapi"; import { createRoute, z } from "@hono/zod-openapi";
import { Emoji, Media } from "@versia/kit/db"; import { Emoji, Media } from "@versia/kit/db";
import { Emojis, RolePermissions } from "@versia/kit/tables"; import { Emojis, RolePermissions } from "@versia/kit/tables";
import { and, eq, isNull, or } from "drizzle-orm"; import { and, eq, isNull, or } from "drizzle-orm";
import { z } from "zod";
import { ApiError } from "~/classes/errors/api-error"; import { ApiError } from "~/classes/errors/api-error";
import { config } from "~/packages/config-manager"; import { config } from "~/packages/config-manager";
import { ErrorSchema } from "~/types/api"; import { ErrorSchema } from "~/types/api";

View file

@ -1,9 +1,8 @@
import { apiRoute, auth } from "@/api"; import { apiRoute, auth } from "@/api";
import { createRoute } from "@hono/zod-openapi"; import { createRoute, z } from "@hono/zod-openapi";
import { Note, Timeline } from "@versia/kit/db"; import { Note, Timeline } from "@versia/kit/db";
import { Notes, RolePermissions } from "@versia/kit/tables"; import { Notes, RolePermissions } from "@versia/kit/tables";
import { and, gt, gte, lt, sql } from "drizzle-orm"; import { and, gt, gte, lt, sql } from "drizzle-orm";
import { z } from "zod";
const schemas = { const schemas = {
query: z.object({ query: z.object({

View file

@ -1,8 +1,7 @@
import { apiRoute, auth } from "@/api"; import { apiRoute, auth } from "@/api";
import { createRoute } from "@hono/zod-openapi"; import { createRoute, z } from "@hono/zod-openapi";
import { Relationship, User } from "@versia/kit/db"; import { Relationship, User } from "@versia/kit/db";
import { RolePermissions } from "@versia/kit/tables"; import { RolePermissions } from "@versia/kit/tables";
import { z } from "zod";
import { ApiError } from "~/classes/errors/api-error"; import { ApiError } from "~/classes/errors/api-error";
import { ErrorSchema } from "~/types/api"; import { ErrorSchema } from "~/types/api";

View file

@ -1,8 +1,7 @@
import { apiRoute, auth } from "@/api"; import { apiRoute, auth } from "@/api";
import { createRoute } from "@hono/zod-openapi"; import { createRoute, z } from "@hono/zod-openapi";
import { Relationship, User } from "@versia/kit/db"; import { Relationship, User } from "@versia/kit/db";
import { RolePermissions } from "@versia/kit/tables"; import { RolePermissions } from "@versia/kit/tables";
import { z } from "zod";
import { ApiError } from "~/classes/errors/api-error"; import { ApiError } from "~/classes/errors/api-error";
import { ErrorSchema } from "~/types/api"; import { ErrorSchema } from "~/types/api";

View file

@ -1,9 +1,9 @@
import { apiRoute, auth } from "@/api"; import { apiRoute, auth } from "@/api";
import { createRoute } from "@hono/zod-openapi"; import { createRoute, z } from "@hono/zod-openapi";
import { Timeline, User } from "@versia/kit/db"; import { Timeline } from "@versia/kit/db";
import { RolePermissions, Users } from "@versia/kit/tables"; import { RolePermissions, Users } from "@versia/kit/tables";
import { and, gt, gte, lt, sql } from "drizzle-orm"; import { and, gt, gte, lt, sql } from "drizzle-orm";
import { z } from "zod"; import { Account } from "~/classes/schemas/account";
const schemas = { const schemas = {
query: z.object({ query: z.object({
@ -32,7 +32,7 @@ const route = createRoute({
description: "Follow requests", description: "Follow requests",
content: { content: {
"application/json": { "application/json": {
schema: z.array(User.schema), schema: z.array(Account),
}, },
}, },
}, },

View file

@ -1,10 +1,9 @@
import { apiRoute, auth } from "@/api"; import { apiRoute, auth } from "@/api";
import { createRoute } from "@hono/zod-openapi"; import { createRoute, z } from "@hono/zod-openapi";
import type { Marker as ApiMarker } from "@versia/client/types"; import type { Marker as ApiMarker } from "@versia/client/types";
import { db } from "@versia/kit/db"; import { db } from "@versia/kit/db";
import { Markers, RolePermissions } from "@versia/kit/tables"; import { Markers, RolePermissions } from "@versia/kit/tables";
import { type SQL, and, eq } from "drizzle-orm"; import { type SQL, and, eq } from "drizzle-orm";
import { z } from "zod";
const schemas = { const schemas = {
markers: z.object({ markers: z.object({

View file

@ -1,8 +1,7 @@
import { apiRoute, auth } from "@/api"; import { apiRoute, auth } from "@/api";
import { createRoute } from "@hono/zod-openapi"; import { createRoute, z } from "@hono/zod-openapi";
import { Media } from "@versia/kit/db"; import { Media } from "@versia/kit/db";
import { RolePermissions } from "@versia/kit/tables"; import { RolePermissions } from "@versia/kit/tables";
import { z } from "zod";
import { ApiError } from "~/classes/errors/api-error"; import { ApiError } from "~/classes/errors/api-error";
import { config } from "~/packages/config-manager/index.ts"; import { config } from "~/packages/config-manager/index.ts";
import { ErrorSchema } from "~/types/api"; import { ErrorSchema } from "~/types/api";

View file

@ -1,8 +1,7 @@
import { apiRoute, auth } from "@/api"; import { apiRoute, auth } from "@/api";
import { createRoute } from "@hono/zod-openapi"; import { createRoute, z } from "@hono/zod-openapi";
import { Media } from "@versia/kit/db"; import { Media } from "@versia/kit/db";
import { RolePermissions } from "@versia/kit/tables"; import { RolePermissions } from "@versia/kit/tables";
import { z } from "zod";
import { config } from "~/packages/config-manager/index.ts"; import { config } from "~/packages/config-manager/index.ts";
import { ErrorSchema } from "~/types/api"; import { ErrorSchema } from "~/types/api";

View file

@ -1,9 +1,9 @@
import { apiRoute, auth } from "@/api"; import { apiRoute, auth } from "@/api";
import { createRoute } from "@hono/zod-openapi"; import { createRoute, z } from "@hono/zod-openapi";
import { Timeline, User } from "@versia/kit/db"; import { Timeline } from "@versia/kit/db";
import { RolePermissions, Users } from "@versia/kit/tables"; import { RolePermissions, Users } from "@versia/kit/tables";
import { and, gt, gte, lt, sql } from "drizzle-orm"; import { and, gt, gte, lt, sql } from "drizzle-orm";
import { z } from "zod"; import { Account } from "~/classes/schemas/account";
const schemas = { const schemas = {
query: z.object({ query: z.object({
@ -33,7 +33,7 @@ const route = createRoute({
description: "Muted users", description: "Muted users",
content: { content: {
"application/json": { "application/json": {
schema: z.array(User.schema), schema: z.array(Account),
}, },
}, },
}, },

View file

@ -1,8 +1,7 @@
import { apiRoute, auth } from "@/api"; import { apiRoute, auth } from "@/api";
import { createRoute } from "@hono/zod-openapi"; import { createRoute, z } from "@hono/zod-openapi";
import { Notification } from "@versia/kit/db"; import { Notification } from "@versia/kit/db";
import { RolePermissions } from "@versia/kit/tables"; import { RolePermissions } from "@versia/kit/tables";
import { z } from "zod";
import { ApiError } from "~/classes/errors/api-error"; import { ApiError } from "~/classes/errors/api-error";
const route = createRoute({ const route = createRoute({

View file

@ -1,8 +1,7 @@
import { apiRoute, auth } from "@/api"; import { apiRoute, auth } from "@/api";
import { createRoute } from "@hono/zod-openapi"; import { createRoute, z } from "@hono/zod-openapi";
import { Notification } from "@versia/kit/db"; import { Notification } from "@versia/kit/db";
import { RolePermissions } from "@versia/kit/tables"; import { RolePermissions } from "@versia/kit/tables";
import { z } from "zod";
import { ApiError } from "~/classes/errors/api-error"; import { ApiError } from "~/classes/errors/api-error";
import { ErrorSchema } from "~/types/api"; import { ErrorSchema } from "~/types/api";

View file

@ -1,7 +1,6 @@
import { apiRoute, auth } from "@/api"; import { apiRoute, auth } from "@/api";
import { createRoute } from "@hono/zod-openapi"; import { createRoute, z } from "@hono/zod-openapi";
import { RolePermissions } from "@versia/kit/tables"; import { RolePermissions } from "@versia/kit/tables";
import { z } from "zod";
const schemas = { const schemas = {
query: z.object({ query: z.object({

View file

@ -1,9 +1,8 @@
import { apiRoute, auth } from "@/api"; import { apiRoute, auth } from "@/api";
import { createRoute } from "@hono/zod-openapi"; import { createRoute, z } from "@hono/zod-openapi";
import { Notification, Timeline } from "@versia/kit/db"; import { Notification, Timeline } from "@versia/kit/db";
import { Notifications, RolePermissions } from "@versia/kit/tables"; import { Notifications, RolePermissions } from "@versia/kit/tables";
import { and, eq, gt, gte, inArray, lt, not, sql } from "drizzle-orm"; import { and, eq, gt, gte, inArray, lt, not, sql } from "drizzle-orm";
import { z } from "zod";
const schemas = { const schemas = {
query: z query: z

View file

@ -1,7 +1,7 @@
import { apiRoute, auth } from "@/api"; import { apiRoute, auth } from "@/api";
import { createRoute } from "@hono/zod-openapi"; import { createRoute } from "@hono/zod-openapi";
import { User } from "@versia/kit/db";
import { RolePermissions } from "@versia/kit/tables"; import { RolePermissions } from "@versia/kit/tables";
import { Account } from "~/classes/schemas/account";
const route = createRoute({ const route = createRoute({
method: "delete", method: "delete",
@ -19,7 +19,7 @@ const route = createRoute({
description: "User", description: "User",
content: { content: {
"application/json": { "application/json": {
schema: User.schema, schema: Account,
}, },
}, },
}, },

View file

@ -1,7 +1,7 @@
import { apiRoute, auth } from "@/api"; import { apiRoute, auth } from "@/api";
import { createRoute } from "@hono/zod-openapi"; import { createRoute } from "@hono/zod-openapi";
import { User } from "@versia/kit/db";
import { RolePermissions } from "@versia/kit/tables"; import { RolePermissions } from "@versia/kit/tables";
import { Account } from "~/classes/schemas/account";
const route = createRoute({ const route = createRoute({
method: "delete", method: "delete",
@ -19,7 +19,7 @@ const route = createRoute({
description: "User", description: "User",
content: { content: {
"application/json": { "application/json": {
schema: User.schema, schema: Account,
}, },
}, },
}, },

View file

@ -1,8 +1,7 @@
import { apiRoute, auth } from "@/api"; import { apiRoute, auth } from "@/api";
import { createRoute } from "@hono/zod-openapi"; import { createRoute, z } from "@hono/zod-openapi";
import { Role } from "@versia/kit/db"; import { Role } from "@versia/kit/db";
import { RolePermissions } from "@versia/kit/tables"; import { RolePermissions } from "@versia/kit/tables";
import { z } from "zod";
import { ApiError } from "~/classes/errors/api-error"; import { ApiError } from "~/classes/errors/api-error";
import { ErrorSchema } from "~/types/api"; import { ErrorSchema } from "~/types/api";

View file

@ -1,8 +1,7 @@
import { apiRoute, auth, withNoteParam } from "@/api"; import { apiRoute, auth, withNoteParam } from "@/api";
import { createRoute } from "@hono/zod-openapi"; import { createRoute, z } from "@hono/zod-openapi";
import { Note } from "@versia/kit/db"; import { Note } from "@versia/kit/db";
import { RolePermissions } from "@versia/kit/tables"; import { RolePermissions } from "@versia/kit/tables";
import { z } from "zod";
import { ErrorSchema } from "~/types/api"; import { ErrorSchema } from "~/types/api";
const route = createRoute({ const route = createRoute({

View file

@ -1,8 +1,7 @@
import { apiRoute, auth, withNoteParam } from "@/api"; import { apiRoute, auth, withNoteParam } from "@/api";
import { createRoute } from "@hono/zod-openapi"; import { createRoute, z } from "@hono/zod-openapi";
import { Note } from "@versia/kit/db"; import { Note } from "@versia/kit/db";
import { RolePermissions } from "@versia/kit/tables"; import { RolePermissions } from "@versia/kit/tables";
import { z } from "zod";
const route = createRoute({ const route = createRoute({
method: "post", method: "post",

View file

@ -1,9 +1,9 @@
import { apiRoute, auth, withNoteParam } from "@/api"; import { apiRoute, auth, withNoteParam } from "@/api";
import { createRoute } from "@hono/zod-openapi"; import { createRoute, z } from "@hono/zod-openapi";
import { Timeline, User } from "@versia/kit/db"; import { Timeline } from "@versia/kit/db";
import { RolePermissions, Users } from "@versia/kit/tables"; import { RolePermissions, Users } from "@versia/kit/tables";
import { and, gt, gte, lt, sql } from "drizzle-orm"; import { and, gt, gte, lt, sql } from "drizzle-orm";
import { z } from "zod"; import { Account } from "~/classes/schemas/account";
const schemas = { const schemas = {
query: z.object({ query: z.object({
@ -40,7 +40,7 @@ const route = createRoute({
description: "Users who favourited a status", description: "Users who favourited a status",
content: { content: {
"application/json": { "application/json": {
schema: z.array(User.schema), schema: z.array(Account),
}, },
}, },
}, },

View file

@ -1,9 +1,8 @@
import { apiRoute, auth, jsonOrForm, withNoteParam } from "@/api"; import { apiRoute, auth, jsonOrForm, withNoteParam } from "@/api";
import { createRoute } from "@hono/zod-openapi"; import { createRoute, z } from "@hono/zod-openapi";
import { Media, Note } from "@versia/kit/db"; import { Media, Note } from "@versia/kit/db";
import { RolePermissions } from "@versia/kit/tables"; import { RolePermissions } from "@versia/kit/tables";
import ISO6391 from "iso-639-1"; import ISO6391 from "iso-639-1";
import { z } from "zod";
import { ApiError } from "~/classes/errors/api-error"; import { ApiError } from "~/classes/errors/api-error";
import { config } from "~/packages/config-manager/index.ts"; import { config } from "~/packages/config-manager/index.ts";
import { ErrorSchema } from "~/types/api"; import { ErrorSchema } from "~/types/api";

View file

@ -1,9 +1,8 @@
import { apiRoute, auth, withNoteParam } from "@/api"; import { apiRoute, auth, withNoteParam } from "@/api";
import { createRoute } from "@hono/zod-openapi"; import { createRoute, z } from "@hono/zod-openapi";
import { Note, db } from "@versia/kit/db"; import { Note, db } from "@versia/kit/db";
import { RolePermissions } from "@versia/kit/tables"; import { RolePermissions } from "@versia/kit/tables";
import type { SQL } from "drizzle-orm"; import type { SQL } from "drizzle-orm";
import { z } from "zod";
import { ApiError } from "~/classes/errors/api-error"; import { ApiError } from "~/classes/errors/api-error";
import { ErrorSchema } from "~/types/api"; import { ErrorSchema } from "~/types/api";

View file

@ -1,9 +1,8 @@
import { apiRoute, auth, jsonOrForm, withNoteParam } from "@/api"; import { apiRoute, auth, jsonOrForm, withNoteParam } from "@/api";
import { createRoute } from "@hono/zod-openapi"; import { createRoute, z } from "@hono/zod-openapi";
import { Note } from "@versia/kit/db"; import { Note } from "@versia/kit/db";
import { Notes, RolePermissions } from "@versia/kit/tables"; import { Notes, RolePermissions } from "@versia/kit/tables";
import { and, eq } from "drizzle-orm"; import { and, eq } from "drizzle-orm";
import { z } from "zod";
import { ApiError } from "~/classes/errors/api-error"; import { ApiError } from "~/classes/errors/api-error";
import { ErrorSchema } from "~/types/api"; import { ErrorSchema } from "~/types/api";

View file

@ -1,9 +1,9 @@
import { apiRoute, auth, withNoteParam } from "@/api"; import { apiRoute, auth, withNoteParam } from "@/api";
import { createRoute } from "@hono/zod-openapi"; import { createRoute, z } from "@hono/zod-openapi";
import { Timeline, User } from "@versia/kit/db"; import { Timeline } from "@versia/kit/db";
import { RolePermissions, Users } from "@versia/kit/tables"; import { RolePermissions, Users } from "@versia/kit/tables";
import { and, gt, gte, lt, sql } from "drizzle-orm"; import { and, gt, gte, lt, sql } from "drizzle-orm";
import { z } from "zod"; import { Account } from "~/classes/schemas/account";
const schemas = { const schemas = {
param: z.object({ param: z.object({
@ -40,7 +40,7 @@ const route = createRoute({
description: "Users who reblogged a status", description: "Users who reblogged a status",
content: { content: {
"application/json": { "application/json": {
schema: z.array(User.schema), schema: z.array(Account),
}, },
}, },
}, },

View file

@ -1,8 +1,7 @@
import { apiRoute, auth, withNoteParam } from "@/api"; import { apiRoute, auth, withNoteParam } from "@/api";
import { createRoute } from "@hono/zod-openapi"; import { createRoute, z } from "@hono/zod-openapi";
import type { StatusSource as ApiStatusSource } from "@versia/client/types"; import type { StatusSource as ApiStatusSource } from "@versia/client/types";
import { RolePermissions } from "@versia/kit/tables"; import { RolePermissions } from "@versia/kit/tables";
import { z } from "zod";
const route = createRoute({ const route = createRoute({
method: "get", method: "get",

View file

@ -1,8 +1,7 @@
import { apiRoute, auth, withNoteParam } from "@/api"; import { apiRoute, auth, withNoteParam } from "@/api";
import { createRoute } from "@hono/zod-openapi"; import { createRoute, z } from "@hono/zod-openapi";
import { Note } from "@versia/kit/db"; import { Note } from "@versia/kit/db";
import { RolePermissions } from "@versia/kit/tables"; import { RolePermissions } from "@versia/kit/tables";
import { z } from "zod";
const route = createRoute({ const route = createRoute({
method: "post", method: "post",

View file

@ -1,8 +1,7 @@
import { apiRoute, auth, withNoteParam } from "@/api"; import { apiRoute, auth, withNoteParam } from "@/api";
import { createRoute } from "@hono/zod-openapi"; import { createRoute, z } from "@hono/zod-openapi";
import { Note } from "@versia/kit/db"; import { Note } from "@versia/kit/db";
import { RolePermissions } from "@versia/kit/tables"; import { RolePermissions } from "@versia/kit/tables";
import { z } from "zod";
import { ApiError } from "~/classes/errors/api-error"; import { ApiError } from "~/classes/errors/api-error";
import { ErrorSchema } from "~/types/api"; import { ErrorSchema } from "~/types/api";

View file

@ -1,9 +1,8 @@
import { apiRoute, auth, withNoteParam } from "@/api"; import { apiRoute, auth, withNoteParam } from "@/api";
import { createRoute } from "@hono/zod-openapi"; import { createRoute, z } from "@hono/zod-openapi";
import { Note } from "@versia/kit/db"; import { Note } from "@versia/kit/db";
import { Notes, RolePermissions } from "@versia/kit/tables"; import { Notes, RolePermissions } from "@versia/kit/tables";
import { and, eq } from "drizzle-orm"; import { and, eq } from "drizzle-orm";
import { z } from "zod";
import { ApiError } from "~/classes/errors/api-error"; import { ApiError } from "~/classes/errors/api-error";
import { ErrorSchema } from "~/types/api"; import { ErrorSchema } from "~/types/api";

View file

@ -1,9 +1,8 @@
import { apiRoute, auth, jsonOrForm } from "@/api"; import { apiRoute, auth, jsonOrForm } from "@/api";
import { createRoute } from "@hono/zod-openapi"; import { createRoute, z } from "@hono/zod-openapi";
import { Media, Note } from "@versia/kit/db"; import { Media, Note } from "@versia/kit/db";
import { RolePermissions } from "@versia/kit/tables"; import { RolePermissions } from "@versia/kit/tables";
import ISO6391 from "iso-639-1"; import ISO6391 from "iso-639-1";
import { z } from "zod";
import { ApiError } from "~/classes/errors/api-error"; import { ApiError } from "~/classes/errors/api-error";
import { config } from "~/packages/config-manager/index.ts"; import { config } from "~/packages/config-manager/index.ts";
import { ErrorSchema } from "~/types/api"; import { ErrorSchema } from "~/types/api";

View file

@ -1,9 +1,8 @@
import { apiRoute, auth } from "@/api"; import { apiRoute, auth } from "@/api";
import { createRoute } from "@hono/zod-openapi"; import { createRoute, z } from "@hono/zod-openapi";
import { Note, Timeline } from "@versia/kit/db"; import { Note, Timeline } from "@versia/kit/db";
import { Notes, RolePermissions } from "@versia/kit/tables"; import { Notes, RolePermissions } from "@versia/kit/tables";
import { and, eq, gt, gte, inArray, lt, or, sql } from "drizzle-orm"; import { and, eq, gt, gte, inArray, lt, or, sql } from "drizzle-orm";
import { z } from "zod";
const schemas = { const schemas = {
query: z.object({ query: z.object({

View file

@ -1,9 +1,8 @@
import { apiRoute, auth } from "@/api"; import { apiRoute, auth } from "@/api";
import { createRoute } from "@hono/zod-openapi"; import { createRoute, z } from "@hono/zod-openapi";
import { Note, Timeline } from "@versia/kit/db"; import { Note, Timeline } from "@versia/kit/db";
import { Notes, RolePermissions } from "@versia/kit/tables"; import { Notes, RolePermissions } from "@versia/kit/tables";
import { and, eq, gt, gte, inArray, lt, or, sql } from "drizzle-orm"; import { and, eq, gt, gte, inArray, lt, or, sql } from "drizzle-orm";
import { z } from "zod";
const schemas = { const schemas = {
query: z.object({ query: z.object({

View file

@ -1,9 +1,8 @@
import { apiRoute, auth, jsonOrForm } from "@/api"; import { apiRoute, auth, jsonOrForm } from "@/api";
import { createRoute } from "@hono/zod-openapi"; import { createRoute, z } from "@hono/zod-openapi";
import { db } from "@versia/kit/db"; import { db } from "@versia/kit/db";
import { FilterKeywords, Filters, RolePermissions } from "@versia/kit/tables"; import { FilterKeywords, Filters, RolePermissions } from "@versia/kit/tables";
import { type SQL, and, eq, inArray } from "drizzle-orm"; import { type SQL, and, eq, inArray } from "drizzle-orm";
import { z } from "zod";
import { ApiError } from "~/classes/errors/api-error"; import { ApiError } from "~/classes/errors/api-error";
import { ErrorSchema } from "~/types/api"; import { ErrorSchema } from "~/types/api";

View file

@ -1,9 +1,8 @@
import { apiRoute, auth, jsonOrForm } from "@/api"; import { apiRoute, auth, jsonOrForm } from "@/api";
import { createRoute } from "@hono/zod-openapi"; import { createRoute, z } from "@hono/zod-openapi";
import { db } from "@versia/kit/db"; import { db } from "@versia/kit/db";
import { FilterKeywords, Filters, RolePermissions } from "@versia/kit/tables"; import { FilterKeywords, Filters, RolePermissions } from "@versia/kit/tables";
import type { SQL } from "drizzle-orm"; import type { SQL } from "drizzle-orm";
import { z } from "zod";
const schemas = { const schemas = {
json: z.object({ json: z.object({

View file

@ -4,6 +4,7 @@ import { createRoute, z } from "@hono/zod-openapi";
import { User } from "@versia/kit/db"; import { User } from "@versia/kit/db";
import { Users } from "@versia/kit/tables"; import { Users } from "@versia/kit/tables";
import { and, eq, isNull } from "drizzle-orm"; import { and, eq, isNull } from "drizzle-orm";
import { Account } from "~/classes/schemas/account";
import manifest from "~/package.json"; import manifest from "~/package.json";
import { config } from "~/packages/config-manager"; import { config } from "~/packages/config-manager";
@ -83,7 +84,7 @@ const route = createRoute({
}), }),
contact: z.object({ contact: z.object({
email: z.string().nullable(), email: z.string().nullable(),
account: User.schema.nullable(), account: Account.nullable(),
}), }),
rules: z.array( rules: z.array(
z.object({ z.object({

View file

@ -1,8 +1,7 @@
import { apiRoute, auth } from "@/api"; import { apiRoute, auth } from "@/api";
import { createRoute } from "@hono/zod-openapi"; import { createRoute, z } from "@hono/zod-openapi";
import { Media } from "@versia/kit/db"; import { Media } from "@versia/kit/db";
import { RolePermissions } from "@versia/kit/tables"; import { RolePermissions } from "@versia/kit/tables";
import { z } from "zod";
import { config } from "~/packages/config-manager/index.ts"; import { config } from "~/packages/config-manager/index.ts";
import { ErrorSchema } from "~/types/api"; import { ErrorSchema } from "~/types/api";

View file

@ -1,10 +1,10 @@
import { apiRoute, auth, parseUserAddress, userAddressValidator } from "@/api"; import { apiRoute, auth, parseUserAddress, userAddressValidator } from "@/api";
import { createRoute } from "@hono/zod-openapi"; import { createRoute, z } from "@hono/zod-openapi";
import { Note, User, db } from "@versia/kit/db"; import { Note, User, db } from "@versia/kit/db";
import { Instances, Notes, RolePermissions, Users } from "@versia/kit/tables"; import { Instances, Notes, RolePermissions, Users } from "@versia/kit/tables";
import { and, eq, inArray, isNull, sql } from "drizzle-orm"; import { and, eq, inArray, isNull, sql } from "drizzle-orm";
import { z } from "zod";
import { ApiError } from "~/classes/errors/api-error"; import { ApiError } from "~/classes/errors/api-error";
import { Account } from "~/classes/schemas/account";
import { searchManager } from "~/classes/search/search-manager"; import { searchManager } from "~/classes/search/search-manager";
import { config } from "~/packages/config-manager"; import { config } from "~/packages/config-manager";
import { ErrorSchema } from "~/types/api"; import { ErrorSchema } from "~/types/api";
@ -47,7 +47,7 @@ const route = createRoute({
content: { content: {
"application/json": { "application/json": {
schema: z.object({ schema: z.object({
accounts: z.array(User.schema), accounts: z.array(Account),
statuses: z.array(Note.schema), statuses: z.array(Note.schema),
hashtags: z.array(z.string()), hashtags: z.array(z.string()),
}), }),

View file

@ -1,7 +1,6 @@
import { apiRoute } from "@/api"; import { apiRoute } from "@/api";
import { createRoute } from "@hono/zod-openapi"; import { createRoute, z } from "@hono/zod-openapi";
import type { Entity } from "@versia/federation/types"; import type { Entity } from "@versia/federation/types";
import { z } from "zod";
import { InboxJobType, inboxQueue } from "~/classes/queues/inbox"; import { InboxJobType, inboxQueue } from "~/classes/queues/inbox";
const schemas = { const schemas = {

View file

@ -1,6 +1,5 @@
import { apiRoute } from "@/api"; import { apiRoute } from "@/api";
import { createRoute } from "@hono/zod-openapi"; import { createRoute, z } from "@hono/zod-openapi";
import { z } from "zod";
import { ApiError } from "~/classes/errors/api-error"; import { ApiError } from "~/classes/errors/api-error";
import { ErrorSchema } from "~/types/api"; import { ErrorSchema } from "~/types/api";

View file

@ -1,7 +1,6 @@
import { apiRoute } from "@/api"; import { apiRoute } from "@/api";
import { createRoute } from "@hono/zod-openapi"; import { createRoute, z } from "@hono/zod-openapi";
import type { ContentfulStatusCode, StatusCode } from "hono/utils/http-status"; import type { ContentfulStatusCode, StatusCode } from "hono/utils/http-status";
import { z } from "zod";
import { ApiError } from "~/classes/errors/api-error"; import { ApiError } from "~/classes/errors/api-error";
import { config } from "~/packages/config-manager"; import { config } from "~/packages/config-manager";
import { ErrorSchema } from "~/types/api"; import { ErrorSchema } from "~/types/api";

View file

@ -1,8 +1,7 @@
import { apiRoute } from "@/api"; import { apiRoute } from "@/api";
import { createRoute } from "@hono/zod-openapi"; import { createRoute, z } from "@hono/zod-openapi";
import { getLogger } from "@logtape/logtape"; import { getLogger } from "@logtape/logtape";
import chalk from "chalk"; import chalk from "chalk";
import { z } from "zod";
const route = createRoute({ const route = createRoute({
method: "post", method: "post",

View file

@ -1,5 +1,5 @@
import { apiRoute } from "@/api"; import { apiRoute } from "@/api";
import { createRoute } from "@hono/zod-openapi"; import { createRoute, z } from "@hono/zod-openapi";
import { import {
LikeExtension as LikeSchema, LikeExtension as LikeSchema,
Note as NoteSchema, Note as NoteSchema,
@ -7,7 +7,6 @@ import {
import { Like, Note, User } from "@versia/kit/db"; import { Like, Note, User } from "@versia/kit/db";
import { Likes, Notes } from "@versia/kit/tables"; import { Likes, Notes } from "@versia/kit/tables";
import { and, eq, inArray, sql } from "drizzle-orm"; import { and, eq, inArray, sql } from "drizzle-orm";
import { z } from "zod";
import { ApiError } from "~/classes/errors/api-error"; import { ApiError } from "~/classes/errors/api-error";
import { config } from "~/packages/config-manager"; import { config } from "~/packages/config-manager";
import { ErrorSchema, type KnownEntity } from "~/types/api"; import { ErrorSchema, type KnownEntity } from "~/types/api";

View file

@ -1,7 +1,6 @@
import { apiRoute } from "@/api"; import { apiRoute } from "@/api";
import { createRoute } from "@hono/zod-openapi"; import { createRoute, z } from "@hono/zod-openapi";
import type { Entity } from "@versia/federation/types"; import type { Entity } from "@versia/federation/types";
import { z } from "zod";
import { InboxJobType, inboxQueue } from "~/classes/queues/inbox"; import { InboxJobType, inboxQueue } from "~/classes/queues/inbox";
import { ErrorSchema } from "~/types/api"; import { ErrorSchema } from "~/types/api";

View file

@ -1,8 +1,7 @@
import { apiRoute } from "@/api"; import { apiRoute } from "@/api";
import { createRoute } from "@hono/zod-openapi"; import { createRoute, z } from "@hono/zod-openapi";
import { User as UserSchema } from "@versia/federation/schemas"; import { User as UserSchema } from "@versia/federation/schemas";
import { User } from "@versia/kit/db"; import { User } from "@versia/kit/db";
import { z } from "zod";
import { ApiError } from "~/classes/errors/api-error"; import { ApiError } from "~/classes/errors/api-error";
import { ErrorSchema } from "~/types/api"; import { ErrorSchema } from "~/types/api";

View file

@ -1,5 +1,5 @@
import { apiRoute } from "@/api"; import { apiRoute } from "@/api";
import { createRoute } from "@hono/zod-openapi"; import { createRoute, z } from "@hono/zod-openapi";
import { import {
Collection as CollectionSchema, Collection as CollectionSchema,
Note as NoteSchema, Note as NoteSchema,
@ -7,7 +7,6 @@ import {
import { Note, User, db } from "@versia/kit/db"; import { Note, User, db } from "@versia/kit/db";
import { Notes } from "@versia/kit/tables"; import { Notes } from "@versia/kit/tables";
import { and, eq, inArray } from "drizzle-orm"; import { and, eq, inArray } from "drizzle-orm";
import { z } from "zod";
import { ApiError } from "~/classes/errors/api-error"; import { ApiError } from "~/classes/errors/api-error";
import { config } from "~/packages/config-manager"; import { config } from "~/packages/config-manager";
import { ErrorSchema } from "~/types/api"; import { ErrorSchema } from "~/types/api";

View file

@ -4,14 +4,13 @@ import {
parseUserAddress, parseUserAddress,
webfingerMention, webfingerMention,
} from "@/api"; } from "@/api";
import { createRoute } from "@hono/zod-openapi"; import { createRoute, z } from "@hono/zod-openapi";
import { getLogger } from "@logtape/logtape"; import { getLogger } from "@logtape/logtape";
import type { ResponseError } from "@versia/federation"; import type { ResponseError } from "@versia/federation";
import { WebFinger } from "@versia/federation/schemas"; import { WebFinger } from "@versia/federation/schemas";
import { User } from "@versia/kit/db"; import { User } from "@versia/kit/db";
import { Users } from "@versia/kit/tables"; import { Users } from "@versia/kit/tables";
import { and, eq, isNull } from "drizzle-orm"; import { and, eq, isNull } from "drizzle-orm";
import { z } from "zod";
import { ApiError } from "~/classes/errors/api-error"; import { ApiError } from "~/classes/errors/api-error";
import { config } from "~/packages/config-manager"; import { config } from "~/packages/config-manager";
import { ErrorSchema } from "~/types/api"; import { ErrorSchema } from "~/types/api";

View file

@ -1,3 +1,4 @@
import { z } from "@hono/zod-openapi";
import type { Application as APIApplication } from "@versia/client/types"; import type { Application as APIApplication } from "@versia/client/types";
import { Token, db } from "@versia/kit/db"; import { Token, db } from "@versia/kit/db";
import { Applications } from "@versia/kit/tables"; import { Applications } from "@versia/kit/tables";
@ -9,7 +10,6 @@ import {
eq, eq,
inArray, inArray,
} from "drizzle-orm"; } from "drizzle-orm";
import { z } from "zod";
import { BaseInterface } from "./base.ts"; import { BaseInterface } from "./base.ts";
type ApplicationType = InferSelectModel<typeof Applications>; type ApplicationType = InferSelectModel<typeof Applications>;

View file

@ -1,5 +1,6 @@
import { emojiValidatorWithColons, emojiValidatorWithIdentifiers } from "@/api"; import { emojiValidatorWithColons, emojiValidatorWithIdentifiers } from "@/api";
import { proxyUrl } from "@/response"; import { proxyUrl } from "@/response";
import { z } from "@hono/zod-openapi";
import type { Emoji as APIEmoji } from "@versia/client/types"; import type { Emoji as APIEmoji } from "@versia/client/types";
import type { CustomEmojiExtension } from "@versia/federation/types"; import type { CustomEmojiExtension } from "@versia/federation/types";
import { type Instance, Media, db } from "@versia/kit/db"; import { type Instance, Media, db } from "@versia/kit/db";
@ -14,7 +15,6 @@ import {
inArray, inArray,
isNull, isNull,
} from "drizzle-orm"; } from "drizzle-orm";
import { z } from "zod";
import { BaseInterface } from "./base.ts"; import { BaseInterface } from "./base.ts";
type EmojiType = InferSelectModel<typeof Emojis> & { type EmojiType = InferSelectModel<typeof Emojis> & {

View file

@ -1,3 +1,4 @@
import { z } from "@hono/zod-openapi";
import { RolePermission } from "@versia/client/types"; import { RolePermission } from "@versia/client/types";
import type { Delete, LikeExtension } from "@versia/federation/types"; import type { Delete, LikeExtension } from "@versia/federation/types";
import { db } from "@versia/kit/db"; import { db } from "@versia/kit/db";
@ -16,7 +17,6 @@ import {
eq, eq,
inArray, inArray,
} from "drizzle-orm"; } from "drizzle-orm";
import { z } from "zod";
import { config } from "~/packages/config-manager/index.ts"; import { config } from "~/packages/config-manager/index.ts";
import { BaseInterface } from "./base.ts"; import { BaseInterface } from "./base.ts";
import { Note } from "./note.ts"; import { Note } from "./note.ts";

View file

@ -1,6 +1,7 @@
import { join } from "node:path"; import { join } from "node:path";
import { mimeLookup } from "@/content_types.ts"; import { mimeLookup } from "@/content_types.ts";
import { proxyUrl } from "@/response"; import { proxyUrl } from "@/response";
import { z } from "@hono/zod-openapi";
import type { Attachment as ApiAttachment } from "@versia/client/types"; import type { Attachment as ApiAttachment } from "@versia/client/types";
import type { ContentFormat } from "@versia/federation/types"; import type { ContentFormat } from "@versia/federation/types";
import { db } from "@versia/kit/db"; import { db } from "@versia/kit/db";
@ -15,7 +16,6 @@ import {
inArray, inArray,
} from "drizzle-orm"; } from "drizzle-orm";
import sharp from "sharp"; import sharp from "sharp";
import { z } from "zod";
import { MediaBackendType } from "~/packages/config-manager/config.type"; import { MediaBackendType } from "~/packages/config-manager/config.type";
import { config } from "~/packages/config-manager/index.ts"; import { config } from "~/packages/config-manager/index.ts";
import { ApiError } from "../errors/api-error.ts"; import { ApiError } from "../errors/api-error.ts";

View file

@ -3,6 +3,7 @@ import { localObjectUri } from "@/constants";
import { mergeAndDeduplicate } from "@/lib.ts"; import { mergeAndDeduplicate } from "@/lib.ts";
import { sanitizedHtmlStrip } from "@/sanitization"; import { sanitizedHtmlStrip } from "@/sanitization";
import { sentry } from "@/sentry"; import { sentry } from "@/sentry";
import { z } from "@hono/zod-openapi";
import { getLogger } from "@logtape/logtape"; import { getLogger } from "@logtape/logtape";
import type { import type {
Attachment as ApiAttachment, Attachment as ApiAttachment,
@ -35,7 +36,6 @@ import {
} from "drizzle-orm"; } from "drizzle-orm";
import { htmlToText } from "html-to-text"; import { htmlToText } from "html-to-text";
import { createRegExp, exactly, global } from "magic-regexp"; import { createRegExp, exactly, global } from "magic-regexp";
import { z } from "zod";
import { import {
contentToHtml, contentToHtml,
findManyNotes, findManyNotes,
@ -43,6 +43,7 @@ import {
} from "~/classes/functions/status"; } from "~/classes/functions/status";
import { config } from "~/packages/config-manager"; import { config } from "~/packages/config-manager";
import { DeliveryJobType, deliveryQueue } from "../queues/delivery.ts"; import { DeliveryJobType, deliveryQueue } from "../queues/delivery.ts";
import { Account } from "../schemas/account.ts";
import { Application } from "./application.ts"; import { Application } from "./application.ts";
import { BaseInterface } from "./base.ts"; import { BaseInterface } from "./base.ts";
import { Emoji } from "./emoji.ts"; import { Emoji } from "./emoji.ts";
@ -84,7 +85,7 @@ export class Note extends BaseInterface<typeof Notes, NoteTypeWithRelations> {
id: z.string().uuid(), id: z.string().uuid(),
uri: z.string().url(), uri: z.string().url(),
url: z.string().url(), url: z.string().url(),
account: z.lazy(() => User.schema), account: Account,
in_reply_to_id: z.string().uuid().nullable(), in_reply_to_id: z.string().uuid().nullable(),
in_reply_to_account_id: z.string().uuid().nullable(), in_reply_to_account_id: z.string().uuid().nullable(),
reblog: z.lazy(() => Note.schema).nullable(), reblog: z.lazy(() => Note.schema).nullable(),
@ -162,7 +163,7 @@ export class Note extends BaseInterface<typeof Notes, NoteTypeWithRelations> {
name: z.string(), name: z.string(),
url: z.string().url().optional(), url: z.string().url().optional(),
static_url: z.string().url().optional(), static_url: z.string().url().optional(),
accounts: z.array(z.lazy(() => User.schema)).optional(), accounts: z.array(Account).optional(),
account_ids: z.array(z.string().uuid()).optional(), account_ids: z.array(z.string().uuid()).optional(),
}), }),
), ),

View file

@ -1,3 +1,4 @@
import { z } from "@hono/zod-openapi";
import type { Notification as APINotification } from "@versia/client/types"; import type { Notification as APINotification } from "@versia/client/types";
import { Note, User, db } from "@versia/kit/db"; import { Note, User, db } from "@versia/kit/db";
import { Notifications } from "@versia/kit/tables"; import { Notifications } from "@versia/kit/tables";
@ -9,12 +10,12 @@ import {
eq, eq,
inArray, inArray,
} from "drizzle-orm"; } from "drizzle-orm";
import { z } from "zod";
import { import {
transformOutputToUserWithRelations, transformOutputToUserWithRelations,
userExtrasTemplate, userExtrasTemplate,
userRelations, userRelations,
} from "../functions/user.ts"; } from "../functions/user.ts";
import { Account } from "../schemas/account.ts";
import { BaseInterface } from "./base.ts"; import { BaseInterface } from "./base.ts";
export type NotificationType = InferSelectModel<typeof Notifications> & { export type NotificationType = InferSelectModel<typeof Notifications> & {
@ -27,7 +28,7 @@ export class Notification extends BaseInterface<
NotificationType NotificationType
> { > {
public static schema: z.ZodType<APINotification> = z.object({ public static schema: z.ZodType<APINotification> = z.object({
account: z.lazy(() => User.schema).nullable(), account: Account.nullable(),
created_at: z.string(), created_at: z.string(),
id: z.string().uuid(), id: z.string().uuid(),
status: z.lazy(() => Note.schema).optional(), status: z.lazy(() => Note.schema).optional(),
@ -54,7 +55,7 @@ export class Notification extends BaseInterface<
"group_favourite", "group_favourite",
"user_approved", "user_approved",
]), ]),
target: z.lazy(() => User.schema).optional(), target: Account.optional(),
}); });
public async reload(): Promise<void> { public async reload(): Promise<void> {

View file

@ -1,3 +1,4 @@
import { z } from "@hono/zod-openapi";
import type { Emoji as APIEmoji } from "@versia/client/types"; import type { Emoji as APIEmoji } from "@versia/client/types";
import type { ReactionExtension } from "@versia/federation/types"; import type { ReactionExtension } from "@versia/federation/types";
import { Emoji, Instance, Note, User, db } from "@versia/kit/db"; import { Emoji, Instance, Note, User, db } from "@versia/kit/db";
@ -10,7 +11,6 @@ import {
eq, eq,
inArray, inArray,
} from "drizzle-orm"; } from "drizzle-orm";
import { z } from "zod";
import { config } from "~/packages/config-manager/index.ts"; import { config } from "~/packages/config-manager/index.ts";
import { BaseInterface } from "./base.ts"; import { BaseInterface } from "./base.ts";

View file

@ -1,3 +1,4 @@
import { z } from "@hono/zod-openapi";
import type { Relationship as APIRelationship } from "@versia/client/types"; import type { Relationship as APIRelationship } from "@versia/client/types";
import { db } from "@versia/kit/db"; import { db } from "@versia/kit/db";
import { Relationships } from "@versia/kit/tables"; import { Relationships } from "@versia/kit/tables";
@ -10,7 +11,6 @@ import {
eq, eq,
inArray, inArray,
} from "drizzle-orm"; } from "drizzle-orm";
import { z } from "zod";
import { BaseInterface } from "./base.ts"; import { BaseInterface } from "./base.ts";
import type { User } from "./user.ts"; import type { User } from "./user.ts";

View file

@ -1,4 +1,5 @@
import { proxyUrl } from "@/response"; import { proxyUrl } from "@/response";
import { z } from "@hono/zod-openapi";
import { import {
type VersiaRole as APIRole, type VersiaRole as APIRole,
RolePermission, RolePermission,
@ -14,7 +15,6 @@ import {
eq, eq,
inArray, inArray,
} from "drizzle-orm"; } from "drizzle-orm";
import { z } from "zod";
import { config } from "~/packages/config-manager/index.ts"; import { config } from "~/packages/config-manager/index.ts";
import { BaseInterface } from "./base.ts"; import { BaseInterface } from "./base.ts";

View file

@ -1,3 +1,4 @@
import { z } from "@hono/zod-openapi";
import type { Token as ApiToken } from "@versia/client/types"; import type { Token as ApiToken } from "@versia/client/types";
import { type Application, User, db } from "@versia/kit/db"; import { type Application, User, db } from "@versia/kit/db";
import { Tokens } from "@versia/kit/tables"; import { Tokens } from "@versia/kit/tables";
@ -9,7 +10,6 @@ import {
eq, eq,
inArray, inArray,
} from "drizzle-orm"; } from "drizzle-orm";
import { z } from "zod";
import { BaseInterface } from "./base.ts"; import { BaseInterface } from "./base.ts";
type TokenType = InferSelectModel<typeof Tokens> & { type TokenType = InferSelectModel<typeof Tokens> & {

View file

@ -4,10 +4,7 @@ import { randomString } from "@/math";
import { proxyUrl } from "@/response"; import { proxyUrl } from "@/response";
import { sentry } from "@/sentry"; import { sentry } from "@/sentry";
import { getLogger } from "@logtape/logtape"; import { getLogger } from "@logtape/logtape";
import type { import type { Mention as ApiMention } from "@versia/client/types";
Account as ApiAccount,
Mention as ApiMention,
} from "@versia/client/types";
import { import {
EntityValidator, EntityValidator,
FederationRequester, FederationRequester,
@ -48,13 +45,14 @@ import {
sql, sql,
} from "drizzle-orm"; } from "drizzle-orm";
import { htmlToText } from "html-to-text"; import { htmlToText } from "html-to-text";
import { z } from "zod"; import type { z } from "zod";
import { findManyUsers } from "~/classes/functions/user"; import { findManyUsers } from "~/classes/functions/user";
import { searchManager } from "~/classes/search/search-manager"; import { searchManager } from "~/classes/search/search-manager";
import { type Config, config } from "~/packages/config-manager"; import { type Config, config } from "~/packages/config-manager";
import type { KnownEntity } from "~/types/api.ts"; import type { KnownEntity } from "~/types/api.ts";
import { DeliveryJobType, deliveryQueue } from "../queues/delivery.ts"; import { DeliveryJobType, deliveryQueue } from "../queues/delivery.ts";
import { PushJobType, pushQueue } from "../queues/push.ts"; import { PushJobType, pushQueue } from "../queues/push.ts";
import type { Account } from "../schemas/account.ts";
import { BaseInterface } from "./base.ts"; import { BaseInterface } from "./base.ts";
import { Emoji } from "./emoji.ts"; import { Emoji } from "./emoji.ts";
import { Instance } from "./instance.ts"; import { Instance } from "./instance.ts";
@ -81,74 +79,6 @@ type UserWithRelations = UserWithInstance & {
* Gives helpers to fetch users from database in a nice format * Gives helpers to fetch users from database in a nice format
*/ */
export class User extends BaseInterface<typeof Users, UserWithRelations> { export class User extends BaseInterface<typeof Users, UserWithRelations> {
// @ts-expect-error Roles are weird
public static schema: z.ZodType<ApiAccount> = z.object({
id: z.string(),
username: z.string(),
acct: z.string(),
display_name: z.string(),
locked: z.boolean(),
discoverable: z.boolean().optional(),
group: z.boolean().nullable(),
noindex: z.boolean().nullable(),
suspended: z.boolean().nullable(),
limited: z.boolean().nullable(),
created_at: z.string(),
followers_count: z.number(),
following_count: z.number(),
statuses_count: z.number(),
note: z.string(),
uri: z.string(),
url: z.string(),
avatar: z.string(),
avatar_static: z.string(),
header: z.string(),
header_static: z.string(),
emojis: z.array(Emoji.schema),
fields: z.array(
z.object({
name: z.string(),
value: z.string(),
verified: z.boolean().optional(),
verified_at: z.string().nullable().optional(),
}),
),
// FIXME: Use a proper type
moved: z.lazy(() => User.schema).nullable(),
bot: z.boolean().nullable(),
source: z
.object({
privacy: z.string().nullable(),
sensitive: z.boolean().nullable(),
language: z.string().nullable(),
note: z.string(),
fields: z.array(
z.object({
name: z.string(),
value: z.string(),
}),
),
avatar: z
.object({
content_type: z.string(),
})
.optional(),
header: z
.object({
content_type: z.string(),
})
.optional(),
})
.optional(),
role: z
.object({
name: z.string(),
})
.optional(),
roles: z.array(Role.schema),
mute_expires_at: z.string().optional(),
});
public static $type: UserWithRelations; public static $type: UserWithRelations;
public avatar: Media | null; public avatar: Media | null;
@ -1175,7 +1105,7 @@ export class User extends BaseInterface<typeof Users, UserWithRelations> {
return { ok: true }; return { ok: true };
} }
public toApi(isOwnAccount = false): ApiAccount { public toApi(isOwnAccount = false): z.infer<typeof Account> {
const user = this.data; const user = this.data;
return { return {
id: user.id, id: user.id,
@ -1199,6 +1129,7 @@ export class User extends BaseInterface<typeof Users, UserWithRelations> {
fields: user.fields.map((field) => ({ fields: user.fields.map((field) => ({
name: htmlToText(getBestContentType(field.key).content), name: htmlToText(getBestContentType(field.key).content),
value: getBestContentType(field.value).content, value: getBestContentType(field.value).content,
verified_at: null,
})), })),
bot: user.isBot, bot: user.isBot,
source: isOwnAccount ? user.source : undefined, source: isOwnAccount ? user.source : undefined,
@ -1213,8 +1144,8 @@ export class User extends BaseInterface<typeof Users, UserWithRelations> {
moved: null, moved: null,
noindex: false, noindex: false,
suspended: false, suspended: false,
discoverable: undefined, discoverable: null,
mute_expires_at: undefined, mute_expires_at: null,
roles: user.roles roles: user.roles
.map((role) => new Role(role)) .map((role) => new Role(role))
.concat( .concat(

403
classes/schemas/account.ts Normal file
View file

@ -0,0 +1,403 @@
import { z } from "@hono/zod-openapi";
import type { Account as ApiAccount } from "@versia/client/types";
import ISO6391 from "iso-639-1";
import { config } from "~/packages/config-manager";
import { zBoolean } from "~/packages/config-manager/config.type";
import { Emoji } from "../database/emoji.ts";
import { Role } from "../database/role.ts";
export const Field = z.object({
name: z
.string()
.trim()
.min(1)
.max(config.validation.max_field_name_size)
.openapi({
description: "The key of a given fields key-value pair.",
example: "Freak level",
externalDocs: {
url: "https://docs.joinmastodon.org/entities/Account/#name",
},
}),
value: z
.string()
.trim()
.min(1)
.max(config.validation.max_field_value_size)
.openapi({
description: "The value associated with the name key.",
example: "<p>High</p>",
externalDocs: {
url: "https://docs.joinmastodon.org/entities/Account/#value",
},
}),
verified_at: z
.string()
.datetime()
.nullable()
.openapi({
description:
"Timestamp of when the server verified a URL value for a rel=“me” link.",
example: null,
externalDocs: {
url: "https://docs.joinmastodon.org/entities/Account/#verified_at",
},
}),
});
export const Source = z
.object({
privacy: z.enum(["public", "unlisted", "private", "direct"]).openapi({
description:
"The default post privacy to be used for new statuses.",
example: "unlisted",
externalDocs: {
url: "https://docs.joinmastodon.org/entities/Account/#source-privacy",
},
}),
sensitive: zBoolean.openapi({
description:
"Whether new statuses should be marked sensitive by default.",
example: false,
externalDocs: {
url: "https://docs.joinmastodon.org/entities/Account/#source-sensitive",
},
}),
language: z
.enum(ISO6391.getAllCodes() as [string, ...string[]])
.openapi({
description: "The default posting language for new statuses.",
example: "en",
externalDocs: {
url: "https://docs.joinmastodon.org/entities/Account/#source-language",
},
}),
follow_requests_count: z
.number()
.int()
.optional()
.openapi({
description: "The number of pending follow requests.",
example: 3,
externalDocs: {
url: "https://docs.joinmastodon.org/entities/Account/#follow_requests_count",
},
}),
note: z
.string()
.trim()
.min(0)
.max(config.validation.max_bio_size)
.refine(
(s) => !config.filters.bio.some((filter) => s.match(filter)),
"Bio contains blocked words",
)
.openapi({
description: "Profile bio, in plain-text instead of in HTML.",
example: "ermmm what the meow meow",
externalDocs: {
url: "https://docs.joinmastodon.org/entities/Account/#source-note",
},
}),
fields: z.array(Field).max(config.validation.max_field_count).openapi({
description: "Metadata about the account.",
}),
})
.openapi({
description:
"An extra attribute that contains source values to be used with API methods that verify credentials and update credentials.",
externalDocs: {
url: "https://docs.joinmastodon.org/entities/Account/#source",
},
});
export const Account = z.object({
id: z
.string()
.uuid()
.openapi({
description: "The account id.",
example: "9e84842b-4db6-4a9b-969d-46ab408278da",
externalDocs: {
url: "https://docs.joinmastodon.org/entities/Account/#id",
},
}),
username: z
.string()
.min(3)
.trim()
.max(config.validation.max_username_size)
.toLowerCase()
.regex(
/^[a-z0-9_-]+$/,
"Username can only contain letters, numbers, underscores and hyphens",
)
.refine(
(s) => !config.filters.username.some((filter) => s.match(filter)),
"Username contains blocked words",
)
.openapi({
description: "The username of the account, not including domain.",
example: "lexi",
externalDocs: {
url: "https://docs.joinmastodon.org/entities/Account/#username",
},
}),
acct: z.string().openapi({
description:
"The Webfinger account URI. Equal to username for local users, or username@domain for remote users.",
example: "lexi@beta.versia.social",
externalDocs: {
url: "https://docs.joinmastodon.org/entities/Account/#acct",
},
}),
url: z
.string()
.url()
.openapi({
description: "The location of the users profile page.",
example: "https://beta.versia.social/@lexi",
externalDocs: {
url: "https://docs.joinmastodon.org/entities/Account/#url",
},
}),
display_name: z
.string()
.min(3)
.trim()
.max(config.validation.max_displayname_size)
.refine(
(s) =>
!config.filters.displayname.some((filter) => s.match(filter)),
"Display name contains blocked words",
)
.openapi({
description: "The profiles display name.",
example: "Lexi :flower:",
externalDocs: {
url: "https://docs.joinmastodon.org/entities/Account/#display_name",
},
}),
note: z
.string()
.min(0)
.max(config.validation.max_bio_size)
.trim()
.refine(
(s) => !config.filters.bio.some((filter) => s.match(filter)),
"Bio contains blocked words",
)
.openapi({
description: "The profiles bio or description.",
example: "<p>ermmm what the meow meow</p>",
externalDocs: {
url: "https://docs.joinmastodon.org/entities/Account/#note",
},
}),
avatar: z
.string()
.url()
.openapi({
description:
"An image icon that is shown next to statuses and in the profile.",
example:
"https://cdn.versia.social/avatars/cff9aea0-0000-43fe-8b5e-e7c7ea69a488/lexi.webp",
externalDocs: {
url: "https://docs.joinmastodon.org/entities/Account/#avatar",
},
}),
avatar_static: z
.string()
.url()
.openapi({
description:
"A static version of the avatar. Equal to avatar if its value is a static image; different if avatar is an animated GIF.",
example:
"https://cdn.versia.social/avatars/cff9aea0-0000-43fe-8b5e-e7c7ea69a488/lexi.webp",
externalDocs: {
url: "https://docs.joinmastodon.org/entities/Account/#avatar_static",
},
}),
header: z
.string()
.url()
.openapi({
description:
"An image banner that is shown above the profile and in profile cards.",
example:
"https://cdn.versia.social/headers/a049f8e3-878c-4faa-ae4c-a6bcceddbd9d/femboy_2.webp",
externalDocs: {
url: "https://docs.joinmastodon.org/entities/Account/#header",
},
}),
header_static: z
.string()
.url()
.openapi({
description:
"A static version of the header. Equal to header if its value is a static image; different if header is an animated GIF.",
example:
"https://cdn.versia.social/headers/a049f8e3-878c-4faa-ae4c-a6bcceddbd9d/femboy_2.webp",
externalDocs: {
url: "https://docs.joinmastodon.org/entities/Account/#header_static",
},
}),
locked: zBoolean.openapi({
description: "Whether the account manually approves follow requests.",
example: false,
externalDocs: {
url: "https://docs.joinmastodon.org/entities/Account/#locked",
},
}),
fields: z
.array(Field)
.max(config.validation.max_field_count)
.openapi({
description:
"Additional metadata attached to a profile as name-value pairs.",
externalDocs: {
url: "https://docs.joinmastodon.org/entities/Account/#fields",
},
}),
emojis: z.array(Emoji.schema).openapi({
description:
"Custom emoji entities to be used when rendering the profile.",
externalDocs: {
url: "https://docs.joinmastodon.org/entities/Account/#emojis",
},
}),
bot: zBoolean.openapi({
description:
"Indicates that the account may perform automated actions, may not be monitored, or identifies as a robot.",
example: false,
externalDocs: {
url: "https://docs.joinmastodon.org/entities/Account/#bot",
},
}),
group: z.literal(false).openapi({
description: "Indicates that the account represents a Group actor.",
example: false,
externalDocs: {
url: "https://docs.joinmastodon.org/entities/Account/#group",
},
}),
discoverable: zBoolean.nullable().openapi({
description:
"Whether the account has opted into discovery features such as the profile directory.",
example: true,
externalDocs: {
url: "https://docs.joinmastodon.org/entities/Account/#discoverable",
},
}),
noindex: zBoolean
.nullable()
.optional()
.openapi({
description:
"Whether the local user has opted out of being indexed by search engines.",
example: false,
externalDocs: {
url: "https://docs.joinmastodon.org/entities/Account/#noindex",
},
}),
// FIXME: Use a proper type
moved: z
.lazy((): z.ZodType<ApiAccount> => Account as z.ZodType<ApiAccount>)
.nullable()
.optional()
.openapi({
description:
"Indicates that the profile is currently inactive and that its user has moved to a new account.",
example: null,
externalDocs: {
url: "https://docs.joinmastodon.org/entities/Account/#moved",
},
}),
suspended: zBoolean.optional().openapi({
description:
"An extra attribute returned only when an account is suspended.",
example: false,
externalDocs: {
url: "https://docs.joinmastodon.org/entities/Account/#suspended",
},
}),
limited: zBoolean.optional().openapi({
description:
"An extra attribute returned only when an account is silenced. If true, indicates that the account should be hidden behind a warning screen.",
example: false,
externalDocs: {
url: "https://docs.joinmastodon.org/entities/Account/#limited",
},
}),
created_at: z
.string()
.datetime()
.openapi({
description: "When the account was created.",
example: "2024-10-15T22:00:00.000Z",
externalDocs: {
url: "https://docs.joinmastodon.org/entities/Account/#created_at",
},
}),
// TODO
last_status_at: z
.literal(null)
.openapi({
description: "When the most recent status was posted.",
example: null,
externalDocs: {
url: "https://docs.joinmastodon.org/entities/Account/#last_status_at",
},
})
.nullable(),
statuses_count: z
.number()
.min(0)
.int()
.openapi({
description: "How many statuses are attached to this account.",
example: 42,
externalDocs: {
url: "https://docs.joinmastodon.org/entities/Account/#statuses_count",
},
}),
followers_count: z
.number()
.min(0)
.int()
.openapi({
description: "The reported followers of this profile.",
example: 6,
externalDocs: {
url: "https://docs.joinmastodon.org/entities/Account/#followers_count",
},
}),
following_count: z
.number()
.min(0)
.int()
.openapi({
description: "The reported follows of this profile.",
example: 23,
externalDocs: {
url: "https://docs.joinmastodon.org/entities/Account/#following_count",
},
}),
uri: z.string().url().openapi({
description:
"The location of the user's Versia profile page, as opposed to the local representation.",
example:
"https://beta.versia.social/users/9e84842b-4db6-4a9b-969d-46ab408278da",
}),
source: Source.optional(),
role: z
.object({
name: z.string(),
})
.optional(),
roles: z.array(Role.schema),
mute_expires_at: z.string().datetime().nullable().openapi({
description: "When a timed mute will expire, if applicable.",
example: "2025-03-01T14:00:00.000Z",
}),
});

View file

@ -1,10 +1,10 @@
import { z } from "@hono/zod-openapi";
import { import {
ADMIN_ROLES, ADMIN_ROLES,
DEFAULT_ROLES, DEFAULT_ROLES,
RolePermissions, RolePermissions,
} from "@versia/kit/tables"; } from "@versia/kit/tables";
import { types as mimeTypes } from "mime-types"; import { types as mimeTypes } from "mime-types";
import { z } from "zod";
export enum MediaBackendType { export enum MediaBackendType {
Local = "local", Local = "local",
@ -26,6 +26,11 @@ const zUrl = z
.transform((arg) => arg.replace(/\/$/, "")) .transform((arg) => arg.replace(/\/$/, ""))
.transform((arg) => new URL(arg)); .transform((arg) => new URL(arg));
export const zBoolean = z
.string()
.transform((v) => ["true", "1", "on"].includes(v.toLowerCase()))
.or(z.boolean());
export const configValidator = z export const configValidator = z
.object({ .object({
database: z database: z

View file

@ -1,4 +1,4 @@
import { z } from "zod"; import { z } from "@hono/zod-openapi";
import { Hooks } from "./hooks.ts"; import { Hooks } from "./hooks.ts";
import { Plugin } from "./plugin.ts"; import { Plugin } from "./plugin.ts";

View file

@ -1,4 +1,4 @@
import { z } from "zod"; import { z } from "@hono/zod-openapi";
export const manifestSchema = z.object({ export const manifestSchema = z.object({
// biome-ignore lint/style/useNamingConvention: <explanation> // biome-ignore lint/style/useNamingConvention: <explanation>

View file

@ -1,10 +1,10 @@
import { z } from "@hono/zod-openapi";
import { Hooks, Plugin } from "@versia/kit"; import { Hooks, Plugin } from "@versia/kit";
import { User } from "@versia/kit/db"; import { User } from "@versia/kit/db";
import chalk from "chalk"; import chalk from "chalk";
import { getCookie } from "hono/cookie"; import { getCookie } from "hono/cookie";
import { jwtVerify } from "jose"; import { jwtVerify } from "jose";
import { JOSEError, JWTExpired } from "jose/errors"; import { JOSEError, JWTExpired } from "jose/errors";
import { z } from "zod";
import { ApiError } from "~/classes/errors/api-error.ts"; import { ApiError } from "~/classes/errors/api-error.ts";
import { RolePermissions } from "~/drizzle/schema.ts"; import { RolePermissions } from "~/drizzle/schema.ts";
import authorizeRoute from "./routes/authorize.ts"; import authorizeRoute from "./routes/authorize.ts";

View file

@ -1,10 +1,10 @@
import { auth, jsonOrForm } from "@/api"; import { auth, jsonOrForm } from "@/api";
import { randomString } from "@/math"; import { randomString } from "@/math";
import { z } from "@hono/zod-openapi";
import { Application, Token, User } from "@versia/kit/db"; import { Application, Token, User } from "@versia/kit/db";
import { RolePermissions } from "@versia/kit/tables"; import { RolePermissions } from "@versia/kit/tables";
import { type JWTPayload, SignJWT, jwtVerify } from "jose"; import { type JWTPayload, SignJWT, jwtVerify } from "jose";
import { JOSEError } from "jose/errors"; import { JOSEError } from "jose/errors";
import { z } from "zod";
import { errorRedirect, errors } from "../errors.ts"; import { errorRedirect, errors } from "../errors.ts";
import type { PluginType } from "../index.ts"; import type { PluginType } from "../index.ts";

View file

@ -1,11 +1,11 @@
import { auth } from "@/api"; import { auth } from "@/api";
import { z } from "@hono/zod-openapi";
import { Application, db } from "@versia/kit/db"; import { Application, db } from "@versia/kit/db";
import { OpenIdLoginFlows, RolePermissions } from "@versia/kit/tables"; import { OpenIdLoginFlows, RolePermissions } from "@versia/kit/tables";
import { import {
calculatePKCECodeChallenge, calculatePKCECodeChallenge,
generateRandomCodeVerifier, generateRandomCodeVerifier,
} from "oauth4webapi"; } from "oauth4webapi";
import { z } from "zod";
import { ErrorSchema } from "~/types/api"; import { ErrorSchema } from "~/types/api";
import type { PluginType } from "../../index.ts"; import type { PluginType } from "../../index.ts";
import { oauthDiscoveryRequest, oauthRedirectUri } from "../../utils.ts"; import { oauthDiscoveryRequest, oauthRedirectUri } from "../../utils.ts";

View file

@ -1,4 +1,5 @@
import type { OpenAPIHono } from "@hono/zod-openapi"; import type { OpenAPIHono } from "@hono/zod-openapi";
import { z } from "@hono/zod-openapi";
import type { import type {
Delete, Delete,
Follow, Follow,
@ -12,7 +13,6 @@ import type {
} from "@versia/federation/types"; } from "@versia/federation/types";
import type { SocketAddress } from "bun"; import type { SocketAddress } from "bun";
import type { RouterRoute } from "hono/types"; import type { RouterRoute } from "hono/types";
import { z } from "zod";
import type { AuthData } from "~/classes/functions/user"; import type { AuthData } from "~/classes/functions/user";
import type { Config } from "~/packages/config-manager"; import type { Config } from "~/packages/config-manager";

View file

@ -1,4 +1,5 @@
import type { OpenAPIHono } from "@hono/zod-openapi"; import type { OpenAPIHono } from "@hono/zod-openapi";
import { z } from "@hono/zod-openapi";
import { zValidator } from "@hono/zod-validator"; import { zValidator } from "@hono/zod-validator";
import { getLogger } from "@logtape/logtape"; import { getLogger } from "@logtape/logtape";
import { Application, Note, Token, User, db } from "@versia/kit/db"; import { Application, Note, Token, User, db } from "@versia/kit/db";
@ -24,7 +25,6 @@ import {
oneOrMore, oneOrMore,
} from "magic-regexp"; } from "magic-regexp";
import { type ParsedQs, parse } from "qs"; import { type ParsedQs, parse } from "qs";
import { z } from "zod";
import { fromZodError } from "zod-validation-error"; import { fromZodError } from "zod-validation-error";
import { ApiError } from "~/classes/errors/api-error"; import { ApiError } from "~/classes/errors/api-error";
import type { AuthData } from "~/classes/functions/user"; import type { AuthData } from "~/classes/functions/user";