mirror of
https://github.com/versia-pub/server.git
synced 2025-12-06 08:28:19 +01:00
refactor(api): ♻️ Properly reuse error messages and schemas
This commit is contained in:
parent
7112a66e4c
commit
65e2e19ff1
|
|
@ -1,10 +1,4 @@
|
||||||
import {
|
import { apiRoute, auth, withUserParam } from "@/api";
|
||||||
accountNotFound,
|
|
||||||
apiRoute,
|
|
||||||
auth,
|
|
||||||
reusedResponses,
|
|
||||||
withUserParam,
|
|
||||||
} from "@/api";
|
|
||||||
import { createRoute, z } from "@hono/zod-openapi";
|
import { createRoute, z } from "@hono/zod-openapi";
|
||||||
import {
|
import {
|
||||||
Account as AccountSchema,
|
Account as AccountSchema,
|
||||||
|
|
@ -12,6 +6,7 @@ import {
|
||||||
} from "@versia/client/schemas";
|
} from "@versia/client/schemas";
|
||||||
import { RolePermission } from "@versia/client/schemas";
|
import { RolePermission } from "@versia/client/schemas";
|
||||||
import { Relationship } from "@versia/kit/db";
|
import { Relationship } from "@versia/kit/db";
|
||||||
|
import { ApiError } from "~/classes/errors/api-error";
|
||||||
|
|
||||||
const route = createRoute({
|
const route = createRoute({
|
||||||
method: "post",
|
method: "post",
|
||||||
|
|
@ -44,8 +39,9 @@ const route = createRoute({
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
404: accountNotFound,
|
404: ApiError.accountNotFound().schema,
|
||||||
...reusedResponses,
|
401: ApiError.missingAuthentication().schema,
|
||||||
|
422: ApiError.validationFailed().schema,
|
||||||
},
|
},
|
||||||
request: {
|
request: {
|
||||||
params: z.object({
|
params: z.object({
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,4 @@
|
||||||
import {
|
import { apiRoute, auth, withUserParam } from "@/api";
|
||||||
accountNotFound,
|
|
||||||
apiRoute,
|
|
||||||
auth,
|
|
||||||
reusedResponses,
|
|
||||||
withUserParam,
|
|
||||||
} from "@/api";
|
|
||||||
import { createRoute, z } from "@hono/zod-openapi";
|
import { createRoute, z } from "@hono/zod-openapi";
|
||||||
import {
|
import {
|
||||||
Account as AccountSchema,
|
Account as AccountSchema,
|
||||||
|
|
@ -13,7 +7,7 @@ import {
|
||||||
} from "@versia/client/schemas";
|
} from "@versia/client/schemas";
|
||||||
import { RolePermission } from "@versia/client/schemas";
|
import { RolePermission } from "@versia/client/schemas";
|
||||||
import { Relationship } from "@versia/kit/db";
|
import { Relationship } from "@versia/kit/db";
|
||||||
import { ErrorSchema } from "~/types/api";
|
import { ApiError } from "~/classes/errors/api-error";
|
||||||
|
|
||||||
const route = createRoute({
|
const route = createRoute({
|
||||||
method: "post",
|
method: "post",
|
||||||
|
|
@ -51,12 +45,13 @@ const route = createRoute({
|
||||||
"Trying to follow someone that you block or that blocks you",
|
"Trying to follow someone that you block or that blocks you",
|
||||||
content: {
|
content: {
|
||||||
"application/json": {
|
"application/json": {
|
||||||
schema: ErrorSchema,
|
schema: ApiError.zodSchema,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
404: accountNotFound,
|
404: ApiError.accountNotFound().schema,
|
||||||
...reusedResponses,
|
401: ApiError.missingAuthentication().schema,
|
||||||
|
422: ApiError.validationFailed().schema,
|
||||||
},
|
},
|
||||||
request: {
|
request: {
|
||||||
params: z.object({
|
params: z.object({
|
||||||
|
|
|
||||||
|
|
@ -1,16 +1,11 @@
|
||||||
import {
|
import { apiRoute, auth, withUserParam } from "@/api";
|
||||||
accountNotFound,
|
|
||||||
apiRoute,
|
|
||||||
auth,
|
|
||||||
reusedResponses,
|
|
||||||
withUserParam,
|
|
||||||
} from "@/api";
|
|
||||||
import { createRoute, z } from "@hono/zod-openapi";
|
import { createRoute, z } from "@hono/zod-openapi";
|
||||||
import { Account as AccountSchema } from "@versia/client/schemas";
|
import { Account as AccountSchema } from "@versia/client/schemas";
|
||||||
import { RolePermission } from "@versia/client/schemas";
|
import { RolePermission } from "@versia/client/schemas";
|
||||||
import { Timeline } from "@versia/kit/db";
|
import { Timeline } from "@versia/kit/db";
|
||||||
import { Users } from "@versia/kit/tables";
|
import { Users } from "@versia/kit/tables";
|
||||||
import { and, gt, gte, lt, sql } from "drizzle-orm";
|
import { and, gt, gte, lt, sql } from "drizzle-orm";
|
||||||
|
import { ApiError } from "~/classes/errors/api-error";
|
||||||
|
|
||||||
const route = createRoute({
|
const route = createRoute({
|
||||||
method: "get",
|
method: "get",
|
||||||
|
|
@ -80,8 +75,8 @@ const route = createRoute({
|
||||||
}),
|
}),
|
||||||
}),
|
}),
|
||||||
},
|
},
|
||||||
404: accountNotFound,
|
404: ApiError.accountNotFound().schema,
|
||||||
422: reusedResponses[422],
|
422: ApiError.validationFailed().schema,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,16 +1,12 @@
|
||||||
import {
|
import { apiRoute, auth, withUserParam } from "@/api";
|
||||||
accountNotFound,
|
|
||||||
apiRoute,
|
|
||||||
auth,
|
|
||||||
reusedResponses,
|
|
||||||
withUserParam,
|
|
||||||
} from "@/api";
|
|
||||||
import { createRoute, z } from "@hono/zod-openapi";
|
import { createRoute, z } from "@hono/zod-openapi";
|
||||||
import { Account as AccountSchema } from "@versia/client/schemas";
|
import { Account as AccountSchema } from "@versia/client/schemas";
|
||||||
import { RolePermission } from "@versia/client/schemas";
|
import { RolePermission } from "@versia/client/schemas";
|
||||||
import { Timeline } from "@versia/kit/db";
|
import { Timeline } from "@versia/kit/db";
|
||||||
import { Users } from "@versia/kit/tables";
|
import { Users } from "@versia/kit/tables";
|
||||||
import { and, gt, gte, lt, sql } from "drizzle-orm";
|
import { and, gt, gte, lt, sql } from "drizzle-orm";
|
||||||
|
import { ApiError } from "~/classes/errors/api-error";
|
||||||
|
|
||||||
const route = createRoute({
|
const route = createRoute({
|
||||||
method: "get",
|
method: "get",
|
||||||
path: "/api/v1/accounts/{id}/following",
|
path: "/api/v1/accounts/{id}/following",
|
||||||
|
|
@ -79,8 +75,8 @@ const route = createRoute({
|
||||||
}),
|
}),
|
||||||
}),
|
}),
|
||||||
},
|
},
|
||||||
404: accountNotFound,
|
404: ApiError.accountNotFound().schema,
|
||||||
422: reusedResponses[422],
|
422: ApiError.validationFailed().schema,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,13 +1,8 @@
|
||||||
import {
|
import { apiRoute, auth, withUserParam } from "@/api";
|
||||||
accountNotFound,
|
|
||||||
apiRoute,
|
|
||||||
auth,
|
|
||||||
reusedResponses,
|
|
||||||
withUserParam,
|
|
||||||
} from "@/api";
|
|
||||||
import { createRoute, z } from "@hono/zod-openapi";
|
import { createRoute, z } from "@hono/zod-openapi";
|
||||||
import { Account as AccountSchema } from "@versia/client/schemas";
|
import { Account as AccountSchema } from "@versia/client/schemas";
|
||||||
import { RolePermission } from "@versia/client/schemas";
|
import { RolePermission } from "@versia/client/schemas";
|
||||||
|
import { ApiError } from "~/classes/errors/api-error";
|
||||||
|
|
||||||
const route = createRoute({
|
const route = createRoute({
|
||||||
method: "get",
|
method: "get",
|
||||||
|
|
@ -40,8 +35,8 @@ const route = createRoute({
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
404: accountNotFound,
|
404: ApiError.accountNotFound().schema,
|
||||||
422: reusedResponses[422],
|
422: ApiError.validationFailed().schema,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,4 @@
|
||||||
import {
|
import { apiRoute, auth, withUserParam } from "@/api";
|
||||||
accountNotFound,
|
|
||||||
apiRoute,
|
|
||||||
auth,
|
|
||||||
reusedResponses,
|
|
||||||
withUserParam,
|
|
||||||
} from "@/api";
|
|
||||||
import { createRoute, z } from "@hono/zod-openapi";
|
import { createRoute, z } from "@hono/zod-openapi";
|
||||||
import {
|
import {
|
||||||
Account as AccountSchema,
|
Account as AccountSchema,
|
||||||
|
|
@ -12,6 +6,7 @@ import {
|
||||||
} from "@versia/client/schemas";
|
} from "@versia/client/schemas";
|
||||||
import { RolePermission } from "@versia/client/schemas";
|
import { RolePermission } from "@versia/client/schemas";
|
||||||
import { Relationship } from "@versia/kit/db";
|
import { Relationship } from "@versia/kit/db";
|
||||||
|
import { ApiError } from "~/classes/errors/api-error";
|
||||||
|
|
||||||
const route = createRoute({
|
const route = createRoute({
|
||||||
method: "post",
|
method: "post",
|
||||||
|
|
@ -71,8 +66,9 @@ const route = createRoute({
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
404: accountNotFound,
|
404: ApiError.accountNotFound().schema,
|
||||||
...reusedResponses,
|
401: ApiError.missingAuthentication().schema,
|
||||||
|
422: ApiError.validationFailed().schema,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,4 @@
|
||||||
import {
|
import { apiRoute, auth, withUserParam } from "@/api";
|
||||||
accountNotFound,
|
|
||||||
apiRoute,
|
|
||||||
auth,
|
|
||||||
reusedResponses,
|
|
||||||
withUserParam,
|
|
||||||
} from "@/api";
|
|
||||||
import { createRoute, z } from "@hono/zod-openapi";
|
import { createRoute, z } from "@hono/zod-openapi";
|
||||||
import {
|
import {
|
||||||
Account as AccountSchema,
|
Account as AccountSchema,
|
||||||
|
|
@ -12,6 +6,7 @@ import {
|
||||||
} from "@versia/client/schemas";
|
} from "@versia/client/schemas";
|
||||||
import { RolePermission } from "@versia/client/schemas";
|
import { RolePermission } from "@versia/client/schemas";
|
||||||
import { Relationship } from "@versia/kit/db";
|
import { Relationship } from "@versia/kit/db";
|
||||||
|
import { ApiError } from "~/classes/errors/api-error";
|
||||||
|
|
||||||
const route = createRoute({
|
const route = createRoute({
|
||||||
method: "post",
|
method: "post",
|
||||||
|
|
@ -61,8 +56,9 @@ const route = createRoute({
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
404: accountNotFound,
|
404: ApiError.accountNotFound().schema,
|
||||||
...reusedResponses,
|
401: ApiError.missingAuthentication().schema,
|
||||||
|
422: ApiError.validationFailed().schema,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,15 +1,8 @@
|
||||||
import {
|
import { apiRoute, auth, withUserParam } from "@/api";
|
||||||
accountNotFound,
|
|
||||||
apiRoute,
|
|
||||||
auth,
|
|
||||||
reusedResponses,
|
|
||||||
withUserParam,
|
|
||||||
} from "@/api";
|
|
||||||
import { createRoute, z } from "@hono/zod-openapi";
|
import { createRoute, z } from "@hono/zod-openapi";
|
||||||
import { Account as AccountSchema } from "@versia/client/schemas";
|
import { Account as AccountSchema } from "@versia/client/schemas";
|
||||||
import { RolePermission } from "@versia/client/schemas";
|
import { RolePermission } from "@versia/client/schemas";
|
||||||
import { ApiError } from "~/classes/errors/api-error";
|
import { ApiError } from "~/classes/errors/api-error";
|
||||||
import { ErrorSchema } from "~/types/api";
|
|
||||||
|
|
||||||
const route = createRoute({
|
const route = createRoute({
|
||||||
method: "post",
|
method: "post",
|
||||||
|
|
@ -43,12 +36,13 @@ const route = createRoute({
|
||||||
description: "User is local",
|
description: "User is local",
|
||||||
content: {
|
content: {
|
||||||
"application/json": {
|
"application/json": {
|
||||||
schema: ErrorSchema,
|
schema: ApiError.zodSchema,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
404: accountNotFound,
|
404: ApiError.accountNotFound().schema,
|
||||||
...reusedResponses,
|
401: ApiError.missingAuthentication().schema,
|
||||||
|
422: ApiError.validationFailed().schema,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,4 @@
|
||||||
import {
|
import { apiRoute, auth, withUserParam } from "@/api";
|
||||||
accountNotFound,
|
|
||||||
apiRoute,
|
|
||||||
auth,
|
|
||||||
reusedResponses,
|
|
||||||
withUserParam,
|
|
||||||
} from "@/api";
|
|
||||||
import { createRoute, z } from "@hono/zod-openapi";
|
import { createRoute, z } from "@hono/zod-openapi";
|
||||||
import {
|
import {
|
||||||
Account as AccountSchema,
|
Account as AccountSchema,
|
||||||
|
|
@ -12,6 +6,7 @@ import {
|
||||||
} from "@versia/client/schemas";
|
} from "@versia/client/schemas";
|
||||||
import { RolePermission } from "@versia/client/schemas";
|
import { RolePermission } from "@versia/client/schemas";
|
||||||
import { Relationship } from "@versia/kit/db";
|
import { Relationship } from "@versia/kit/db";
|
||||||
|
import { ApiError } from "~/classes/errors/api-error";
|
||||||
|
|
||||||
const route = createRoute({
|
const route = createRoute({
|
||||||
method: "post",
|
method: "post",
|
||||||
|
|
@ -48,8 +43,9 @@ const route = createRoute({
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
404: accountNotFound,
|
404: ApiError.accountNotFound().schema,
|
||||||
...reusedResponses,
|
401: ApiError.missingAuthentication().schema,
|
||||||
|
422: ApiError.validationFailed().schema,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,6 @@ import {
|
||||||
import { RolePermission } from "@versia/client/schemas";
|
import { RolePermission } from "@versia/client/schemas";
|
||||||
import { Role } from "@versia/kit/db";
|
import { Role } from "@versia/kit/db";
|
||||||
import { ApiError } from "~/classes/errors/api-error";
|
import { ApiError } from "~/classes/errors/api-error";
|
||||||
import { ErrorSchema } from "~/types/api";
|
|
||||||
|
|
||||||
const routePost = createRoute({
|
const routePost = createRoute({
|
||||||
method: "post",
|
method: "post",
|
||||||
|
|
@ -31,22 +30,8 @@ const routePost = createRoute({
|
||||||
204: {
|
204: {
|
||||||
description: "Role assigned",
|
description: "Role assigned",
|
||||||
},
|
},
|
||||||
404: {
|
404: ApiError.roleNotFound().schema,
|
||||||
description: "Role not found",
|
403: ApiError.forbidden().schema,
|
||||||
content: {
|
|
||||||
"application/json": {
|
|
||||||
schema: ErrorSchema,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
403: {
|
|
||||||
description: "Forbidden",
|
|
||||||
content: {
|
|
||||||
"application/json": {
|
|
||||||
schema: ErrorSchema,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
@ -71,22 +56,8 @@ const routeDelete = createRoute({
|
||||||
204: {
|
204: {
|
||||||
description: "Role removed",
|
description: "Role removed",
|
||||||
},
|
},
|
||||||
404: {
|
404: ApiError.roleNotFound().schema,
|
||||||
description: "Role not found",
|
403: ApiError.forbidden().schema,
|
||||||
content: {
|
|
||||||
"application/json": {
|
|
||||||
schema: ErrorSchema,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
403: {
|
|
||||||
description: "Forbidden",
|
|
||||||
content: {
|
|
||||||
"application/json": {
|
|
||||||
schema: ErrorSchema,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
@ -99,7 +70,7 @@ export default apiRoute((app) => {
|
||||||
const role = await Role.fromId(role_id);
|
const role = await Role.fromId(role_id);
|
||||||
|
|
||||||
if (!role) {
|
if (!role) {
|
||||||
throw new ApiError(404, "Role not found");
|
throw ApiError.roleNotFound();
|
||||||
}
|
}
|
||||||
// Priority check
|
// Priority check
|
||||||
const userRoles = await Role.getUserRoles(user.id, user.data.isAdmin);
|
const userRoles = await Role.getUserRoles(user.id, user.data.isAdmin);
|
||||||
|
|
@ -129,7 +100,7 @@ export default apiRoute((app) => {
|
||||||
const role = await Role.fromId(role_id);
|
const role = await Role.fromId(role_id);
|
||||||
|
|
||||||
if (!role) {
|
if (!role) {
|
||||||
throw new ApiError(404, "Role not found");
|
throw ApiError.roleNotFound();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Priority check
|
// Priority check
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,4 @@
|
||||||
import {
|
import { apiRoute, auth, withUserParam } from "@/api";
|
||||||
accountNotFound,
|
|
||||||
apiRoute,
|
|
||||||
auth,
|
|
||||||
reusedResponses,
|
|
||||||
withUserParam,
|
|
||||||
} from "@/api";
|
|
||||||
import { createRoute, z } from "@hono/zod-openapi";
|
import { createRoute, z } from "@hono/zod-openapi";
|
||||||
import {
|
import {
|
||||||
Account as AccountSchema,
|
Account as AccountSchema,
|
||||||
|
|
@ -15,6 +9,7 @@ import { RolePermission } from "@versia/client/schemas";
|
||||||
import { Timeline } from "@versia/kit/db";
|
import { Timeline } from "@versia/kit/db";
|
||||||
import { Notes } from "@versia/kit/tables";
|
import { Notes } 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 { ApiError } from "~/classes/errors/api-error";
|
||||||
|
|
||||||
const route = createRoute({
|
const route = createRoute({
|
||||||
method: "get",
|
method: "get",
|
||||||
|
|
@ -87,8 +82,8 @@ const route = createRoute({
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
404: accountNotFound,
|
404: ApiError.accountNotFound().schema,
|
||||||
422: reusedResponses[422],
|
422: ApiError.validationFailed().schema,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,4 @@
|
||||||
import {
|
import { apiRoute, auth, withUserParam } from "@/api";
|
||||||
accountNotFound,
|
|
||||||
apiRoute,
|
|
||||||
auth,
|
|
||||||
reusedResponses,
|
|
||||||
withUserParam,
|
|
||||||
} from "@/api";
|
|
||||||
import { createRoute, z } from "@hono/zod-openapi";
|
import { createRoute, z } from "@hono/zod-openapi";
|
||||||
import {
|
import {
|
||||||
Account as AccountSchema,
|
Account as AccountSchema,
|
||||||
|
|
@ -12,6 +6,7 @@ import {
|
||||||
} from "@versia/client/schemas";
|
} from "@versia/client/schemas";
|
||||||
import { RolePermission } from "@versia/client/schemas";
|
import { RolePermission } from "@versia/client/schemas";
|
||||||
import { Relationship } from "@versia/kit/db";
|
import { Relationship } from "@versia/kit/db";
|
||||||
|
import { ApiError } from "~/classes/errors/api-error";
|
||||||
|
|
||||||
const route = createRoute({
|
const route = createRoute({
|
||||||
method: "post",
|
method: "post",
|
||||||
|
|
@ -48,8 +43,9 @@ const route = createRoute({
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
404: accountNotFound,
|
404: ApiError.accountNotFound().schema,
|
||||||
...reusedResponses,
|
401: ApiError.missingAuthentication().schema,
|
||||||
|
422: ApiError.validationFailed().schema,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,4 @@
|
||||||
import {
|
import { apiRoute, auth, withUserParam } from "@/api";
|
||||||
accountNotFound,
|
|
||||||
apiRoute,
|
|
||||||
auth,
|
|
||||||
reusedResponses,
|
|
||||||
withUserParam,
|
|
||||||
} from "@/api";
|
|
||||||
import { createRoute, z } from "@hono/zod-openapi";
|
import { createRoute, z } from "@hono/zod-openapi";
|
||||||
import {
|
import {
|
||||||
Account as AccountSchema,
|
Account as AccountSchema,
|
||||||
|
|
@ -12,6 +6,7 @@ import {
|
||||||
} from "@versia/client/schemas";
|
} from "@versia/client/schemas";
|
||||||
import { RolePermission } from "@versia/client/schemas";
|
import { RolePermission } from "@versia/client/schemas";
|
||||||
import { Relationship } from "@versia/kit/db";
|
import { Relationship } from "@versia/kit/db";
|
||||||
|
import { ApiError } from "~/classes/errors/api-error";
|
||||||
|
|
||||||
const route = createRoute({
|
const route = createRoute({
|
||||||
method: "post",
|
method: "post",
|
||||||
|
|
@ -48,8 +43,9 @@ const route = createRoute({
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
404: accountNotFound,
|
404: ApiError.accountNotFound().schema,
|
||||||
...reusedResponses,
|
401: ApiError.missingAuthentication().schema,
|
||||||
|
422: ApiError.validationFailed().schema,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,4 @@
|
||||||
import {
|
import { apiRoute, auth, withUserParam } from "@/api";
|
||||||
accountNotFound,
|
|
||||||
apiRoute,
|
|
||||||
auth,
|
|
||||||
reusedResponses,
|
|
||||||
withUserParam,
|
|
||||||
} from "@/api";
|
|
||||||
import { createRoute, z } from "@hono/zod-openapi";
|
import { createRoute, z } from "@hono/zod-openapi";
|
||||||
import {
|
import {
|
||||||
Account as AccountSchema,
|
Account as AccountSchema,
|
||||||
|
|
@ -12,6 +6,7 @@ import {
|
||||||
} from "@versia/client/schemas";
|
} from "@versia/client/schemas";
|
||||||
import { RolePermission } from "@versia/client/schemas";
|
import { RolePermission } from "@versia/client/schemas";
|
||||||
import { Relationship } from "@versia/kit/db";
|
import { Relationship } from "@versia/kit/db";
|
||||||
|
import { ApiError } from "~/classes/errors/api-error";
|
||||||
|
|
||||||
const route = createRoute({
|
const route = createRoute({
|
||||||
method: "post",
|
method: "post",
|
||||||
|
|
@ -47,8 +42,9 @@ const route = createRoute({
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
404: accountNotFound,
|
404: ApiError.accountNotFound().schema,
|
||||||
...reusedResponses,
|
401: ApiError.missingAuthentication().schema,
|
||||||
|
422: ApiError.validationFailed().schema,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,4 @@
|
||||||
import {
|
import { apiRoute, auth, withUserParam } from "@/api";
|
||||||
accountNotFound,
|
|
||||||
apiRoute,
|
|
||||||
auth,
|
|
||||||
reusedResponses,
|
|
||||||
withUserParam,
|
|
||||||
} from "@/api";
|
|
||||||
import { createRoute, z } from "@hono/zod-openapi";
|
import { createRoute, z } from "@hono/zod-openapi";
|
||||||
import {
|
import {
|
||||||
Account as AccountSchema,
|
Account as AccountSchema,
|
||||||
|
|
@ -12,6 +6,7 @@ import {
|
||||||
} from "@versia/client/schemas";
|
} from "@versia/client/schemas";
|
||||||
import { RolePermission } from "@versia/client/schemas";
|
import { RolePermission } from "@versia/client/schemas";
|
||||||
import { Relationship } from "@versia/kit/db";
|
import { Relationship } from "@versia/kit/db";
|
||||||
|
import { ApiError } from "~/classes/errors/api-error";
|
||||||
|
|
||||||
const route = createRoute({
|
const route = createRoute({
|
||||||
method: "post",
|
method: "post",
|
||||||
|
|
@ -48,8 +43,9 @@ const route = createRoute({
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
404: accountNotFound,
|
404: ApiError.accountNotFound().schema,
|
||||||
...reusedResponses,
|
401: ApiError.missingAuthentication().schema,
|
||||||
|
422: ApiError.validationFailed().schema,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
import { apiRoute, auth, qsQuery, reusedResponses } from "@/api";
|
import { apiRoute, auth, qsQuery } from "@/api";
|
||||||
import { createRoute, z } from "@hono/zod-openapi";
|
import { createRoute, z } from "@hono/zod-openapi";
|
||||||
import {
|
import {
|
||||||
Account as AccountSchema,
|
Account as AccountSchema,
|
||||||
|
|
@ -8,6 +8,7 @@ import { RolePermission } from "@versia/client/schemas";
|
||||||
import { User, db } from "@versia/kit/db";
|
import { User, db } from "@versia/kit/db";
|
||||||
import type { Users } from "@versia/kit/tables";
|
import type { Users } from "@versia/kit/tables";
|
||||||
import { type InferSelectModel, sql } from "drizzle-orm";
|
import { type InferSelectModel, sql } from "drizzle-orm";
|
||||||
|
import { ApiError } from "~/classes/errors/api-error";
|
||||||
|
|
||||||
const route = createRoute({
|
const route = createRoute({
|
||||||
method: "get",
|
method: "get",
|
||||||
|
|
@ -53,7 +54,8 @@ const route = createRoute({
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
...reusedResponses,
|
401: ApiError.missingAuthentication().schema,
|
||||||
|
422: ApiError.validationFailed().schema,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
import { apiRoute, auth, jsonOrForm, reusedResponses } from "@/api";
|
import { apiRoute, auth, jsonOrForm } from "@/api";
|
||||||
import { tempmailDomains } from "@/tempmail";
|
import { tempmailDomains } from "@/tempmail";
|
||||||
import { createRoute, z } from "@hono/zod-openapi";
|
import { createRoute, z } from "@hono/zod-openapi";
|
||||||
import { zBoolean } from "@versia/client/schemas";
|
import { zBoolean } from "@versia/client/schemas";
|
||||||
|
|
@ -76,7 +76,7 @@ const route = createRoute({
|
||||||
200: {
|
200: {
|
||||||
description: "Token for the created account",
|
description: "Token for the created account",
|
||||||
},
|
},
|
||||||
401: reusedResponses[401],
|
401: ApiError.missingAuthentication().schema,
|
||||||
422: {
|
422: {
|
||||||
description: "Validation failed",
|
description: "Validation failed",
|
||||||
content: {
|
content: {
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,4 @@
|
||||||
import {
|
import { apiRoute, auth, parseUserAddress } from "@/api";
|
||||||
accountNotFound,
|
|
||||||
apiRoute,
|
|
||||||
auth,
|
|
||||||
parseUserAddress,
|
|
||||||
reusedResponses,
|
|
||||||
} from "@/api";
|
|
||||||
import { createRoute, z } from "@hono/zod-openapi";
|
import { createRoute, z } from "@hono/zod-openapi";
|
||||||
import { Account as AccountSchema } from "@versia/client/schemas";
|
import { Account as AccountSchema } from "@versia/client/schemas";
|
||||||
import { RolePermission } from "@versia/client/schemas";
|
import { RolePermission } from "@versia/client/schemas";
|
||||||
|
|
@ -43,8 +37,8 @@ const route = createRoute({
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
404: accountNotFound,
|
404: ApiError.accountNotFound().schema,
|
||||||
422: reusedResponses[422],
|
422: ApiError.validationFailed().schema,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
@ -97,7 +91,7 @@ export default apiRoute((app) =>
|
||||||
const uri = await User.webFinger(manager, username, domain);
|
const uri = await User.webFinger(manager, username, domain);
|
||||||
|
|
||||||
if (!uri) {
|
if (!uri) {
|
||||||
throw new ApiError(404, "Account not found");
|
throw ApiError.accountNotFound();
|
||||||
}
|
}
|
||||||
|
|
||||||
const foundAccount = await User.resolve(uri);
|
const foundAccount = await User.resolve(uri);
|
||||||
|
|
@ -106,6 +100,6 @@ export default apiRoute((app) =>
|
||||||
return context.json(foundAccount.toApi(), 200);
|
return context.json(foundAccount.toApi(), 200);
|
||||||
}
|
}
|
||||||
|
|
||||||
throw new ApiError(404, "Account not found");
|
throw ApiError.accountNotFound();
|
||||||
}),
|
}),
|
||||||
);
|
);
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
import { apiRoute, auth, qsQuery, reusedResponses } from "@/api";
|
import { apiRoute, auth, qsQuery } from "@/api";
|
||||||
import { createRoute, z } from "@hono/zod-openapi";
|
import { createRoute, z } from "@hono/zod-openapi";
|
||||||
import {
|
import {
|
||||||
Account as AccountSchema,
|
Account as AccountSchema,
|
||||||
|
|
@ -7,6 +7,7 @@ import {
|
||||||
} from "@versia/client/schemas";
|
} from "@versia/client/schemas";
|
||||||
import { RolePermission } from "@versia/client/schemas";
|
import { RolePermission } from "@versia/client/schemas";
|
||||||
import { Relationship } from "@versia/kit/db";
|
import { Relationship } from "@versia/kit/db";
|
||||||
|
import { ApiError } from "~/classes/errors/api-error";
|
||||||
|
|
||||||
const route = createRoute({
|
const route = createRoute({
|
||||||
method: "get",
|
method: "get",
|
||||||
|
|
@ -57,7 +58,8 @@ const route = createRoute({
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
...reusedResponses,
|
401: ApiError.missingAuthentication().schema,
|
||||||
|
422: ApiError.validationFailed().schema,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
import { apiRoute, auth, jsonOrForm, reusedResponses } 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, z } from "@hono/zod-openapi";
|
import { createRoute, z } from "@hono/zod-openapi";
|
||||||
|
|
@ -162,7 +162,8 @@ const route = createRoute({
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
...reusedResponses,
|
401: ApiError.missingAuthentication().schema,
|
||||||
|
422: ApiError.validationFailed().schema,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
import { apiRoute, auth, reusedResponses } from "@/api";
|
import { apiRoute, auth } from "@/api";
|
||||||
import { createRoute } from "@hono/zod-openapi";
|
import { createRoute } from "@hono/zod-openapi";
|
||||||
import { Account } from "@versia/client/schemas";
|
import { Account } from "@versia/client/schemas";
|
||||||
|
import { ApiError } from "~/classes/errors/api-error";
|
||||||
|
|
||||||
const route = createRoute({
|
const route = createRoute({
|
||||||
method: "get",
|
method: "get",
|
||||||
|
|
@ -28,7 +29,8 @@ const route = createRoute({
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
...reusedResponses,
|
401: ApiError.missingAuthentication().schema,
|
||||||
|
422: ApiError.validationFailed().schema,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
import { apiRoute, jsonOrForm, reusedResponses } from "@/api";
|
import { apiRoute, jsonOrForm } from "@/api";
|
||||||
import { randomString } from "@/math";
|
import { randomString } from "@/math";
|
||||||
import { createRoute, z } from "@hono/zod-openapi";
|
import { createRoute, z } from "@hono/zod-openapi";
|
||||||
import {
|
import {
|
||||||
|
|
@ -6,6 +6,7 @@ import {
|
||||||
CredentialApplication as CredentialApplicationSchema,
|
CredentialApplication as CredentialApplicationSchema,
|
||||||
} from "@versia/client/schemas";
|
} from "@versia/client/schemas";
|
||||||
import { Application } from "@versia/kit/db";
|
import { Application } from "@versia/kit/db";
|
||||||
|
import { ApiError } from "~/classes/errors/api-error";
|
||||||
|
|
||||||
const route = createRoute({
|
const route = createRoute({
|
||||||
method: "post",
|
method: "post",
|
||||||
|
|
@ -55,7 +56,7 @@ const route = createRoute({
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
422: reusedResponses[422],
|
422: ApiError.validationFailed().schema,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
import { apiRoute, auth, reusedResponses } from "@/api";
|
import { apiRoute, auth } from "@/api";
|
||||||
import { createRoute } from "@hono/zod-openapi";
|
import { createRoute } from "@hono/zod-openapi";
|
||||||
import { Application as ApplicationSchema } from "@versia/client/schemas";
|
import { Application as ApplicationSchema } from "@versia/client/schemas";
|
||||||
import { RolePermission } from "@versia/client/schemas";
|
import { RolePermission } from "@versia/client/schemas";
|
||||||
|
|
@ -30,7 +30,8 @@ const route = createRoute({
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
...reusedResponses,
|
401: ApiError.missingAuthentication().schema,
|
||||||
|
422: ApiError.validationFailed().schema,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
@ -38,16 +39,12 @@ export default apiRoute((app) =>
|
||||||
app.openapi(route, async (context) => {
|
app.openapi(route, async (context) => {
|
||||||
const { token } = context.get("auth");
|
const { token } = context.get("auth");
|
||||||
|
|
||||||
if (!token) {
|
|
||||||
throw new ApiError(401, "Unauthorized");
|
|
||||||
}
|
|
||||||
|
|
||||||
const application = await Application.getFromToken(
|
const application = await Application.getFromToken(
|
||||||
token.data.accessToken,
|
token.data.accessToken,
|
||||||
);
|
);
|
||||||
|
|
||||||
if (!application) {
|
if (!application) {
|
||||||
throw new ApiError(401, "Application not found");
|
throw ApiError.applicationNotFound();
|
||||||
}
|
}
|
||||||
|
|
||||||
return context.json(application.toApi(), 200);
|
return context.json(application.toApi(), 200);
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,12 @@
|
||||||
import { apiRoute, auth, reusedResponses } from "@/api";
|
import { apiRoute, auth } from "@/api";
|
||||||
import { createRoute, z } from "@hono/zod-openapi";
|
import { createRoute, z } from "@hono/zod-openapi";
|
||||||
import { Account as AccountSchema } from "@versia/client/schemas";
|
import { Account as AccountSchema } from "@versia/client/schemas";
|
||||||
import { RolePermission } from "@versia/client/schemas";
|
import { RolePermission } from "@versia/client/schemas";
|
||||||
import { Timeline } from "@versia/kit/db";
|
import { Timeline } from "@versia/kit/db";
|
||||||
import { Users } from "@versia/kit/tables";
|
import { Users } from "@versia/kit/tables";
|
||||||
import { and, gt, gte, lt, sql } from "drizzle-orm";
|
import { and, gt, gte, lt, sql } from "drizzle-orm";
|
||||||
|
import { ApiError } from "~/classes/errors/api-error";
|
||||||
|
|
||||||
const route = createRoute({
|
const route = createRoute({
|
||||||
method: "get",
|
method: "get",
|
||||||
path: "/api/v1/blocks",
|
path: "/api/v1/blocks",
|
||||||
|
|
@ -65,7 +67,8 @@ const route = createRoute({
|
||||||
}),
|
}),
|
||||||
}),
|
}),
|
||||||
},
|
},
|
||||||
...reusedResponses,
|
401: ApiError.missingAuthentication().schema,
|
||||||
|
422: ApiError.validationFailed().schema,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,6 @@ import { createRoute } from "@hono/zod-openapi";
|
||||||
import { Challenge } from "@versia/client/schemas";
|
import { Challenge } from "@versia/client/schemas";
|
||||||
import { ApiError } from "~/classes/errors/api-error";
|
import { ApiError } from "~/classes/errors/api-error";
|
||||||
import { config } from "~/config.ts";
|
import { config } from "~/config.ts";
|
||||||
import { ErrorSchema } from "~/types/api";
|
|
||||||
|
|
||||||
const route = createRoute({
|
const route = createRoute({
|
||||||
method: "post",
|
method: "post",
|
||||||
|
|
@ -30,7 +29,7 @@ const route = createRoute({
|
||||||
description: "Challenges are disabled",
|
description: "Challenges are disabled",
|
||||||
content: {
|
content: {
|
||||||
"application/json": {
|
"application/json": {
|
||||||
schema: ErrorSchema,
|
schema: ApiError.zodSchema,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,11 @@
|
||||||
import { apiRoute, auth, reusedResponses } from "@/api";
|
import { apiRoute, auth } from "@/api";
|
||||||
import { createRoute, z } from "@hono/zod-openapi";
|
import { createRoute, z } from "@hono/zod-openapi";
|
||||||
import { CustomEmoji as CustomEmojiSchema } from "@versia/client/schemas";
|
import { CustomEmoji as CustomEmojiSchema } from "@versia/client/schemas";
|
||||||
import { RolePermission } from "@versia/client/schemas";
|
import { RolePermission } from "@versia/client/schemas";
|
||||||
import { Emoji } from "@versia/kit/db";
|
import { Emoji } from "@versia/kit/db";
|
||||||
import { Emojis } from "@versia/kit/tables";
|
import { Emojis } from "@versia/kit/tables";
|
||||||
import { and, eq, isNull, or } from "drizzle-orm";
|
import { and, eq, isNull, or } from "drizzle-orm";
|
||||||
|
import { ApiError } from "~/classes/errors/api-error";
|
||||||
|
|
||||||
const route = createRoute({
|
const route = createRoute({
|
||||||
method: "get",
|
method: "get",
|
||||||
|
|
@ -30,7 +31,7 @@ const route = createRoute({
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
422: reusedResponses[422],
|
422: ApiError.validationFailed().schema,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,17 +1,10 @@
|
||||||
import {
|
import { apiRoute, auth, jsonOrForm, withEmojiParam } from "@/api";
|
||||||
apiRoute,
|
|
||||||
auth,
|
|
||||||
jsonOrForm,
|
|
||||||
reusedResponses,
|
|
||||||
withEmojiParam,
|
|
||||||
} from "@/api";
|
|
||||||
import { mimeLookup } from "@/content_types";
|
import { mimeLookup } from "@/content_types";
|
||||||
import { createRoute, z } from "@hono/zod-openapi";
|
import { createRoute, z } from "@hono/zod-openapi";
|
||||||
import { CustomEmoji as CustomEmojiSchema } from "@versia/client/schemas";
|
import { CustomEmoji as CustomEmojiSchema } from "@versia/client/schemas";
|
||||||
import { RolePermission } from "@versia/client/schemas";
|
import { RolePermission } from "@versia/client/schemas";
|
||||||
import { ApiError } from "~/classes/errors/api-error";
|
import { ApiError } from "~/classes/errors/api-error";
|
||||||
import { config } from "~/config.ts";
|
import { config } from "~/config.ts";
|
||||||
import { ErrorSchema } from "~/types/api";
|
|
||||||
|
|
||||||
const schema = z
|
const schema = z
|
||||||
.object({
|
.object({
|
||||||
|
|
@ -72,11 +65,12 @@ const routeGet = createRoute({
|
||||||
description: "Emoji not found",
|
description: "Emoji not found",
|
||||||
content: {
|
content: {
|
||||||
"application/json": {
|
"application/json": {
|
||||||
schema: ErrorSchema,
|
schema: ApiError.zodSchema,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
...reusedResponses,
|
401: ApiError.missingAuthentication().schema,
|
||||||
|
422: ApiError.validationFailed().schema,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
@ -128,7 +122,7 @@ const routePatch = createRoute({
|
||||||
description: "Insufficient permissions",
|
description: "Insufficient permissions",
|
||||||
content: {
|
content: {
|
||||||
"application/json": {
|
"application/json": {
|
||||||
schema: ErrorSchema,
|
schema: ApiError.zodSchema,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
@ -136,11 +130,12 @@ const routePatch = createRoute({
|
||||||
description: "Emoji not found",
|
description: "Emoji not found",
|
||||||
content: {
|
content: {
|
||||||
"application/json": {
|
"application/json": {
|
||||||
schema: ErrorSchema,
|
schema: ApiError.zodSchema,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
...reusedResponses,
|
401: ApiError.missingAuthentication().schema,
|
||||||
|
422: ApiError.validationFailed().schema,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
@ -169,14 +164,7 @@ const routeDelete = createRoute({
|
||||||
204: {
|
204: {
|
||||||
description: "Emoji deleted",
|
description: "Emoji deleted",
|
||||||
},
|
},
|
||||||
404: {
|
404: ApiError.emojiNotFound().schema,
|
||||||
description: "Emoji not found",
|
|
||||||
content: {
|
|
||||||
"application/json": {
|
|
||||||
schema: ErrorSchema,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
@ -190,7 +178,7 @@ export default apiRoute((app) => {
|
||||||
!user.hasPermission(RolePermission.ManageEmojis) &&
|
!user.hasPermission(RolePermission.ManageEmojis) &&
|
||||||
emoji.data.ownerId !== user.data.id
|
emoji.data.ownerId !== user.data.id
|
||||||
) {
|
) {
|
||||||
throw new ApiError(404, "Emoji not found");
|
throw ApiError.emojiNotFound();
|
||||||
}
|
}
|
||||||
|
|
||||||
return context.json(emoji.toApi(), 200);
|
return context.json(emoji.toApi(), 200);
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
import { apiRoute, auth, jsonOrForm, reusedResponses } from "@/api";
|
import { apiRoute, auth, jsonOrForm } from "@/api";
|
||||||
import { mimeLookup } from "@/content_types";
|
import { mimeLookup } from "@/content_types";
|
||||||
import { createRoute, z } from "@hono/zod-openapi";
|
import { createRoute, z } from "@hono/zod-openapi";
|
||||||
import { CustomEmoji as CustomEmojiSchema } from "@versia/client/schemas";
|
import { CustomEmoji as CustomEmojiSchema } from "@versia/client/schemas";
|
||||||
|
|
@ -73,7 +73,8 @@ const route = createRoute({
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
...reusedResponses,
|
401: ApiError.missingAuthentication().schema,
|
||||||
|
422: ApiError.validationFailed().schema,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,11 @@
|
||||||
import { apiRoute, auth, reusedResponses } from "@/api";
|
import { apiRoute, auth } from "@/api";
|
||||||
import { createRoute, z } from "@hono/zod-openapi";
|
import { createRoute, z } from "@hono/zod-openapi";
|
||||||
import { Status as StatusSchema } from "@versia/client/schemas";
|
import { Status as StatusSchema } from "@versia/client/schemas";
|
||||||
import { RolePermission } from "@versia/client/schemas";
|
import { RolePermission } from "@versia/client/schemas";
|
||||||
import { Timeline } from "@versia/kit/db";
|
import { Timeline } from "@versia/kit/db";
|
||||||
import { Notes } from "@versia/kit/tables";
|
import { Notes } from "@versia/kit/tables";
|
||||||
import { and, gt, gte, lt, sql } from "drizzle-orm";
|
import { and, gt, gte, lt, sql } from "drizzle-orm";
|
||||||
|
import { ApiError } from "~/classes/errors/api-error";
|
||||||
|
|
||||||
const route = createRoute({
|
const route = createRoute({
|
||||||
method: "get",
|
method: "get",
|
||||||
|
|
@ -65,7 +66,8 @@ const route = createRoute({
|
||||||
}),
|
}),
|
||||||
}),
|
}),
|
||||||
},
|
},
|
||||||
...reusedResponses,
|
401: ApiError.missingAuthentication().schema,
|
||||||
|
422: ApiError.validationFailed().schema,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
import { accountNotFound, apiRoute, auth, reusedResponses } from "@/api";
|
import { apiRoute, auth } from "@/api";
|
||||||
import { createRoute, z } from "@hono/zod-openapi";
|
import { createRoute, z } from "@hono/zod-openapi";
|
||||||
import {
|
import {
|
||||||
Account as AccountSchema,
|
Account as AccountSchema,
|
||||||
|
|
@ -37,8 +37,9 @@ const route = createRoute({
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
404: accountNotFound,
|
404: ApiError.accountNotFound().schema,
|
||||||
...reusedResponses,
|
401: ApiError.missingAuthentication().schema,
|
||||||
|
422: ApiError.validationFailed().schema,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
@ -51,7 +52,7 @@ export default apiRoute((app) =>
|
||||||
const account = await User.fromId(account_id);
|
const account = await User.fromId(account_id);
|
||||||
|
|
||||||
if (!account) {
|
if (!account) {
|
||||||
throw new ApiError(404, "Account not found");
|
throw ApiError.accountNotFound();
|
||||||
}
|
}
|
||||||
|
|
||||||
const oppositeRelationship = await Relationship.fromOwnerAndSubject(
|
const oppositeRelationship = await Relationship.fromOwnerAndSubject(
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
import { accountNotFound, apiRoute, auth, reusedResponses } from "@/api";
|
import { apiRoute, auth } from "@/api";
|
||||||
import { createRoute, z } from "@hono/zod-openapi";
|
import { createRoute, z } from "@hono/zod-openapi";
|
||||||
import {
|
import {
|
||||||
Account as AccountSchema,
|
Account as AccountSchema,
|
||||||
|
|
@ -37,8 +37,9 @@ const route = createRoute({
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
404: accountNotFound,
|
404: ApiError.accountNotFound().schema,
|
||||||
...reusedResponses,
|
401: ApiError.missingAuthentication().schema,
|
||||||
|
422: ApiError.validationFailed().schema,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
@ -51,7 +52,7 @@ export default apiRoute((app) =>
|
||||||
const account = await User.fromId(account_id);
|
const account = await User.fromId(account_id);
|
||||||
|
|
||||||
if (!account) {
|
if (!account) {
|
||||||
throw new ApiError(404, "Account not found");
|
throw ApiError.accountNotFound();
|
||||||
}
|
}
|
||||||
|
|
||||||
const oppositeRelationship = await Relationship.fromOwnerAndSubject(
|
const oppositeRelationship = await Relationship.fromOwnerAndSubject(
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,11 @@
|
||||||
import { apiRoute, auth, reusedResponses } from "@/api";
|
import { apiRoute, auth } from "@/api";
|
||||||
import { createRoute, z } from "@hono/zod-openapi";
|
import { createRoute, z } from "@hono/zod-openapi";
|
||||||
import { Account as AccountSchema } from "@versia/client/schemas";
|
import { Account as AccountSchema } from "@versia/client/schemas";
|
||||||
import { RolePermission } from "@versia/client/schemas";
|
import { RolePermission } from "@versia/client/schemas";
|
||||||
import { Timeline } from "@versia/kit/db";
|
import { Timeline } from "@versia/kit/db";
|
||||||
import { Users } from "@versia/kit/tables";
|
import { Users } from "@versia/kit/tables";
|
||||||
import { and, gt, gte, lt, sql } from "drizzle-orm";
|
import { and, gt, gte, lt, sql } from "drizzle-orm";
|
||||||
|
import { ApiError } from "~/classes/errors/api-error";
|
||||||
|
|
||||||
const route = createRoute({
|
const route = createRoute({
|
||||||
method: "get",
|
method: "get",
|
||||||
|
|
@ -66,7 +67,8 @@ const route = createRoute({
|
||||||
}),
|
}),
|
||||||
}),
|
}),
|
||||||
},
|
},
|
||||||
...reusedResponses,
|
401: ApiError.missingAuthentication().schema,
|
||||||
|
422: ApiError.validationFailed().schema,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
import { apiRoute, auth, reusedResponses } from "@/api";
|
import { apiRoute, auth } from "@/api";
|
||||||
import { createRoute, z } from "@hono/zod-openapi";
|
import { createRoute, z } from "@hono/zod-openapi";
|
||||||
import {
|
import {
|
||||||
Marker as MarkerSchema,
|
Marker as MarkerSchema,
|
||||||
|
|
@ -9,6 +9,7 @@ import { RolePermission } from "@versia/client/schemas";
|
||||||
import { db } from "@versia/kit/db";
|
import { db } from "@versia/kit/db";
|
||||||
import { Markers } from "@versia/kit/tables";
|
import { Markers } from "@versia/kit/tables";
|
||||||
import { type SQL, and, eq } from "drizzle-orm";
|
import { type SQL, and, eq } from "drizzle-orm";
|
||||||
|
import { ApiError } from "~/classes/errors/api-error";
|
||||||
|
|
||||||
const MarkerResponseSchema = z.object({
|
const MarkerResponseSchema = z.object({
|
||||||
notifications: MarkerSchema.optional(),
|
notifications: MarkerSchema.optional(),
|
||||||
|
|
@ -52,7 +53,8 @@ const routeGet = createRoute({
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
...reusedResponses,
|
401: ApiError.missingAuthentication().schema,
|
||||||
|
422: ApiError.validationFailed().schema,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
@ -95,7 +97,8 @@ const routePost = createRoute({
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
...reusedResponses,
|
401: ApiError.missingAuthentication().schema,
|
||||||
|
422: ApiError.validationFailed().schema,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,9 @@
|
||||||
import { apiRoute, auth, reusedResponses } from "@/api";
|
import { apiRoute, auth } from "@/api";
|
||||||
import { createRoute, z } from "@hono/zod-openapi";
|
import { createRoute, z } from "@hono/zod-openapi";
|
||||||
import { Attachment as AttachmentSchema } from "@versia/client/schemas";
|
import { Attachment as AttachmentSchema } from "@versia/client/schemas";
|
||||||
import { RolePermission } from "@versia/client/schemas";
|
import { RolePermission } from "@versia/client/schemas";
|
||||||
import { Media } from "@versia/kit/db";
|
import { Media } from "@versia/kit/db";
|
||||||
import { ApiError } from "~/classes/errors/api-error";
|
import { ApiError } from "~/classes/errors/api-error";
|
||||||
import { ErrorSchema } from "~/types/api";
|
|
||||||
|
|
||||||
const routePut = createRoute({
|
const routePut = createRoute({
|
||||||
method: "put",
|
method: "put",
|
||||||
|
|
@ -63,11 +62,12 @@ const routePut = createRoute({
|
||||||
description: "Attachment not found",
|
description: "Attachment not found",
|
||||||
content: {
|
content: {
|
||||||
"application/json": {
|
"application/json": {
|
||||||
schema: ErrorSchema,
|
schema: ApiError.zodSchema,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
...reusedResponses,
|
401: ApiError.missingAuthentication().schema,
|
||||||
|
422: ApiError.validationFailed().schema,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
@ -105,11 +105,12 @@ const routeGet = createRoute({
|
||||||
description: "Attachment not found",
|
description: "Attachment not found",
|
||||||
content: {
|
content: {
|
||||||
"application/json": {
|
"application/json": {
|
||||||
schema: ErrorSchema,
|
schema: ApiError.zodSchema,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
...reusedResponses,
|
401: ApiError.missingAuthentication().schema,
|
||||||
|
422: ApiError.validationFailed().schema,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
@ -120,7 +121,7 @@ export default apiRoute((app) => {
|
||||||
const media = await Media.fromId(id);
|
const media = await Media.fromId(id);
|
||||||
|
|
||||||
if (!media) {
|
if (!media) {
|
||||||
throw new ApiError(404, "Media not found");
|
throw ApiError.mediaNotFound();
|
||||||
}
|
}
|
||||||
|
|
||||||
const { description, thumbnail: thumbnailFile } =
|
const { description, thumbnail: thumbnailFile } =
|
||||||
|
|
@ -145,7 +146,7 @@ export default apiRoute((app) => {
|
||||||
const attachment = await Media.fromId(id);
|
const attachment = await Media.fromId(id);
|
||||||
|
|
||||||
if (!attachment) {
|
if (!attachment) {
|
||||||
throw new ApiError(404, "Media not found");
|
throw ApiError.mediaNotFound();
|
||||||
}
|
}
|
||||||
|
|
||||||
return context.json(attachment.toApi(), 200);
|
return context.json(attachment.toApi(), 200);
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,9 @@
|
||||||
import { apiRoute, auth, reusedResponses } from "@/api";
|
import { apiRoute, auth } from "@/api";
|
||||||
import { createRoute, z } from "@hono/zod-openapi";
|
import { createRoute, z } from "@hono/zod-openapi";
|
||||||
import { Attachment as AttachmentSchema } from "@versia/client/schemas";
|
import { Attachment as AttachmentSchema } from "@versia/client/schemas";
|
||||||
import { RolePermission } from "@versia/client/schemas";
|
import { RolePermission } from "@versia/client/schemas";
|
||||||
import { Media } from "@versia/kit/db";
|
import { Media } from "@versia/kit/db";
|
||||||
import { ErrorSchema } from "~/types/api";
|
import { ApiError } from "~/classes/errors/api-error";
|
||||||
|
|
||||||
const route = createRoute({
|
const route = createRoute({
|
||||||
method: "post",
|
method: "post",
|
||||||
|
|
@ -67,7 +67,7 @@ const route = createRoute({
|
||||||
description: "File too large",
|
description: "File too large",
|
||||||
content: {
|
content: {
|
||||||
"application/json": {
|
"application/json": {
|
||||||
schema: ErrorSchema,
|
schema: ApiError.zodSchema,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
@ -75,11 +75,12 @@ const route = createRoute({
|
||||||
description: "Disallowed file type",
|
description: "Disallowed file type",
|
||||||
content: {
|
content: {
|
||||||
"application/json": {
|
"application/json": {
|
||||||
schema: ErrorSchema,
|
schema: ApiError.zodSchema,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
...reusedResponses,
|
401: ApiError.missingAuthentication().schema,
|
||||||
|
422: ApiError.validationFailed().schema,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,11 @@
|
||||||
import { apiRoute, auth, reusedResponses } from "@/api";
|
import { apiRoute, auth } from "@/api";
|
||||||
import { createRoute, z } from "@hono/zod-openapi";
|
import { createRoute, z } from "@hono/zod-openapi";
|
||||||
import { Account as AccountSchema } from "@versia/client/schemas";
|
import { Account as AccountSchema } from "@versia/client/schemas";
|
||||||
import { RolePermission } from "@versia/client/schemas";
|
import { RolePermission } from "@versia/client/schemas";
|
||||||
import { Timeline } from "@versia/kit/db";
|
import { Timeline } from "@versia/kit/db";
|
||||||
import { Users } from "@versia/kit/tables";
|
import { Users } from "@versia/kit/tables";
|
||||||
import { and, gt, gte, lt, sql } from "drizzle-orm";
|
import { and, gt, gte, lt, sql } from "drizzle-orm";
|
||||||
|
import { ApiError } from "~/classes/errors/api-error";
|
||||||
|
|
||||||
const route = createRoute({
|
const route = createRoute({
|
||||||
method: "get",
|
method: "get",
|
||||||
|
|
@ -66,7 +67,8 @@ const route = createRoute({
|
||||||
}),
|
}),
|
||||||
}),
|
}),
|
||||||
},
|
},
|
||||||
...reusedResponses,
|
401: ApiError.missingAuthentication().schema,
|
||||||
|
422: ApiError.validationFailed().schema,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
import { apiRoute, auth, reusedResponses } from "@/api";
|
import { apiRoute, auth } from "@/api";
|
||||||
import { createRoute, z } from "@hono/zod-openapi";
|
import { createRoute, z } from "@hono/zod-openapi";
|
||||||
import { Notification as NotificationSchema } from "@versia/client/schemas";
|
import { Notification as NotificationSchema } from "@versia/client/schemas";
|
||||||
import { RolePermission } from "@versia/client/schemas";
|
import { RolePermission } from "@versia/client/schemas";
|
||||||
|
|
@ -30,7 +30,8 @@ const route = createRoute({
|
||||||
200: {
|
200: {
|
||||||
description: "Notification with given ID successfully dismissed",
|
description: "Notification with given ID successfully dismissed",
|
||||||
},
|
},
|
||||||
401: reusedResponses[401],
|
401: ApiError.missingAuthentication().schema,
|
||||||
|
404: ApiError.notificationNotFound().schema,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
@ -43,7 +44,7 @@ export default apiRoute((app) =>
|
||||||
const notification = await Notification.fromId(id);
|
const notification = await Notification.fromId(id);
|
||||||
|
|
||||||
if (!notification || notification.data.notifiedId !== user.id) {
|
if (!notification || notification.data.notifiedId !== user.id) {
|
||||||
throw new ApiError(404, "Notification not found");
|
throw ApiError.notificationNotFound();
|
||||||
}
|
}
|
||||||
|
|
||||||
await notification.update({
|
await notification.update({
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,9 @@
|
||||||
import { apiRoute, auth, reusedResponses } from "@/api";
|
import { apiRoute, auth } from "@/api";
|
||||||
import { createRoute, z } from "@hono/zod-openapi";
|
import { createRoute, z } from "@hono/zod-openapi";
|
||||||
import { Notification as NotificationSchema } from "@versia/client/schemas";
|
import { Notification as NotificationSchema } from "@versia/client/schemas";
|
||||||
import { RolePermission } from "@versia/client/schemas";
|
import { RolePermission } from "@versia/client/schemas";
|
||||||
import { Notification } from "@versia/kit/db";
|
import { Notification } from "@versia/kit/db";
|
||||||
import { ApiError } from "~/classes/errors/api-error";
|
import { ApiError } from "~/classes/errors/api-error";
|
||||||
import { ErrorSchema } from "~/types/api";
|
|
||||||
|
|
||||||
const route = createRoute({
|
const route = createRoute({
|
||||||
method: "get",
|
method: "get",
|
||||||
|
|
@ -36,15 +35,8 @@ const route = createRoute({
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
404: {
|
404: ApiError.notificationNotFound().schema,
|
||||||
description: "Notification not found",
|
401: ApiError.missingAuthentication().schema,
|
||||||
content: {
|
|
||||||
"application/json": {
|
|
||||||
schema: ErrorSchema,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
401: reusedResponses[401],
|
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
@ -57,7 +49,7 @@ export default apiRoute((app) =>
|
||||||
const notification = await Notification.fromId(id, user.id);
|
const notification = await Notification.fromId(id, user.id);
|
||||||
|
|
||||||
if (!notification || notification.data.notifiedId !== user.id) {
|
if (!notification || notification.data.notifiedId !== user.id) {
|
||||||
throw new ApiError(404, "Notification not found");
|
throw ApiError.notificationNotFound();
|
||||||
}
|
}
|
||||||
|
|
||||||
return context.json(await notification.toApi(), 200);
|
return context.json(await notification.toApi(), 200);
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
import { apiRoute, auth, reusedResponses } from "@/api";
|
import { apiRoute, auth } from "@/api";
|
||||||
import { createRoute } from "@hono/zod-openapi";
|
import { createRoute } from "@hono/zod-openapi";
|
||||||
import { RolePermission } from "@versia/client/schemas";
|
import { RolePermission } from "@versia/client/schemas";
|
||||||
|
import { ApiError } from "~/classes/errors/api-error";
|
||||||
|
|
||||||
const route = createRoute({
|
const route = createRoute({
|
||||||
method: "post",
|
method: "post",
|
||||||
|
|
@ -22,7 +23,7 @@ const route = createRoute({
|
||||||
200: {
|
200: {
|
||||||
description: "Notifications successfully cleared.",
|
description: "Notifications successfully cleared.",
|
||||||
},
|
},
|
||||||
401: reusedResponses[401],
|
401: ApiError.missingAuthentication().schema,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
import { apiRoute, auth, reusedResponses } from "@/api";
|
import { apiRoute, auth } from "@/api";
|
||||||
import { createRoute, z } from "@hono/zod-openapi";
|
import { createRoute, z } from "@hono/zod-openapi";
|
||||||
import { RolePermission } from "@versia/client/schemas";
|
import { RolePermission } from "@versia/client/schemas";
|
||||||
|
import { ApiError } from "~/classes/errors/api-error";
|
||||||
|
|
||||||
const schemas = {
|
const schemas = {
|
||||||
query: z.object({
|
query: z.object({
|
||||||
|
|
@ -26,7 +27,7 @@ const route = createRoute({
|
||||||
200: {
|
200: {
|
||||||
description: "Notifications dismissed",
|
description: "Notifications dismissed",
|
||||||
},
|
},
|
||||||
401: reusedResponses[401],
|
401: ApiError.missingAuthentication().schema,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
import { apiRoute, auth, reusedResponses } from "@/api";
|
import { apiRoute, auth } from "@/api";
|
||||||
import { createRoute, z } from "@hono/zod-openapi";
|
import { createRoute, z } from "@hono/zod-openapi";
|
||||||
import {
|
import {
|
||||||
Account as AccountSchema,
|
Account as AccountSchema,
|
||||||
|
|
@ -9,6 +9,7 @@ import { RolePermission } from "@versia/client/schemas";
|
||||||
import { Timeline } from "@versia/kit/db";
|
import { Timeline } from "@versia/kit/db";
|
||||||
import { Notifications } from "@versia/kit/tables";
|
import { Notifications } 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 { ApiError } from "~/classes/errors/api-error";
|
||||||
|
|
||||||
const route = createRoute({
|
const route = createRoute({
|
||||||
method: "get",
|
method: "get",
|
||||||
|
|
@ -90,7 +91,8 @@ const route = createRoute({
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
...reusedResponses,
|
401: ApiError.missingAuthentication().schema,
|
||||||
|
422: ApiError.validationFailed().schema,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,8 @@
|
||||||
import { apiRoute, auth, reusedResponses } from "@/api";
|
import { apiRoute, auth } from "@/api";
|
||||||
import { createRoute } from "@hono/zod-openapi";
|
import { createRoute } from "@hono/zod-openapi";
|
||||||
import { Account } from "@versia/client/schemas";
|
import { Account } from "@versia/client/schemas";
|
||||||
import { RolePermission } from "@versia/client/schemas";
|
import { RolePermission } from "@versia/client/schemas";
|
||||||
|
import { ApiError } from "~/classes/errors/api-error";
|
||||||
|
|
||||||
const route = createRoute({
|
const route = createRoute({
|
||||||
method: "delete",
|
method: "delete",
|
||||||
|
|
@ -30,7 +31,8 @@ const route = createRoute({
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
...reusedResponses,
|
401: ApiError.missingAuthentication().schema,
|
||||||
|
422: ApiError.validationFailed().schema,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,8 @@
|
||||||
import { apiRoute, auth, reusedResponses } from "@/api";
|
import { apiRoute, auth } from "@/api";
|
||||||
import { createRoute } from "@hono/zod-openapi";
|
import { createRoute } from "@hono/zod-openapi";
|
||||||
import { Account } from "@versia/client/schemas";
|
import { Account } from "@versia/client/schemas";
|
||||||
import { RolePermission } from "@versia/client/schemas";
|
import { RolePermission } from "@versia/client/schemas";
|
||||||
|
import { ApiError } from "~/classes/errors/api-error";
|
||||||
|
|
||||||
const route = createRoute({
|
const route = createRoute({
|
||||||
method: "delete",
|
method: "delete",
|
||||||
|
|
@ -29,7 +30,8 @@ const route = createRoute({
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
...reusedResponses,
|
401: ApiError.missingAuthentication().schema,
|
||||||
|
422: ApiError.validationFailed().schema,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
import { apiRoute, auth, reusedResponses } from "@/api";
|
import { apiRoute, auth } from "@/api";
|
||||||
import { createRoute, z } from "@hono/zod-openapi";
|
import { createRoute, z } from "@hono/zod-openapi";
|
||||||
import { RolePermission } from "@versia/client/schemas";
|
import { RolePermission } from "@versia/client/schemas";
|
||||||
import { PushSubscription } from "@versia/kit/db";
|
import { PushSubscription } from "@versia/kit/db";
|
||||||
|
|
@ -32,7 +32,8 @@ export default apiRoute((app) =>
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
...reusedResponses,
|
401: ApiError.missingAuthentication().schema,
|
||||||
|
422: ApiError.validationFailed().schema,
|
||||||
},
|
},
|
||||||
}),
|
}),
|
||||||
async (context) => {
|
async (context) => {
|
||||||
|
|
@ -41,10 +42,7 @@ export default apiRoute((app) =>
|
||||||
const ps = await PushSubscription.fromToken(token);
|
const ps = await PushSubscription.fromToken(token);
|
||||||
|
|
||||||
if (!ps) {
|
if (!ps) {
|
||||||
throw new ApiError(
|
throw ApiError.pushSubscriptionNotFound();
|
||||||
404,
|
|
||||||
"No push subscription associated with this access token",
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
await ps.delete();
|
await ps.delete();
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
import { apiRoute, auth, reusedResponses } from "@/api";
|
import { apiRoute, auth } from "@/api";
|
||||||
import { createRoute } from "@hono/zod-openapi";
|
import { createRoute } from "@hono/zod-openapi";
|
||||||
import { WebPushSubscription as WebPushSubscriptionSchema } from "@versia/client/schemas";
|
import { WebPushSubscription as WebPushSubscriptionSchema } from "@versia/client/schemas";
|
||||||
import { RolePermission } from "@versia/client/schemas";
|
import { RolePermission } from "@versia/client/schemas";
|
||||||
|
|
@ -33,7 +33,8 @@ export default apiRoute((app) =>
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
...reusedResponses,
|
401: ApiError.missingAuthentication().schema,
|
||||||
|
422: ApiError.validationFailed().schema,
|
||||||
},
|
},
|
||||||
}),
|
}),
|
||||||
async (context) => {
|
async (context) => {
|
||||||
|
|
@ -42,10 +43,7 @@ export default apiRoute((app) =>
|
||||||
const ps = await PushSubscription.fromToken(token);
|
const ps = await PushSubscription.fromToken(token);
|
||||||
|
|
||||||
if (!ps) {
|
if (!ps) {
|
||||||
throw new ApiError(
|
throw ApiError.pushSubscriptionNotFound();
|
||||||
404,
|
|
||||||
"No push subscription associated with this access token",
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return context.json(ps.toApi(), 200);
|
return context.json(ps.toApi(), 200);
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
import { apiRoute, reusedResponses } from "@/api";
|
import { apiRoute } from "@/api";
|
||||||
import { auth, jsonOrForm } from "@/api";
|
import { auth, jsonOrForm } from "@/api";
|
||||||
import { createRoute } from "@hono/zod-openapi";
|
import { createRoute } from "@hono/zod-openapi";
|
||||||
import {
|
import {
|
||||||
|
|
@ -7,6 +7,7 @@ import {
|
||||||
} from "@versia/client/schemas";
|
} from "@versia/client/schemas";
|
||||||
import { RolePermission } from "@versia/client/schemas";
|
import { RolePermission } from "@versia/client/schemas";
|
||||||
import { PushSubscription } from "@versia/kit/db";
|
import { PushSubscription } from "@versia/kit/db";
|
||||||
|
import { ApiError } from "~/classes/errors/api-error";
|
||||||
|
|
||||||
export default apiRoute((app) =>
|
export default apiRoute((app) =>
|
||||||
app.openapi(
|
app.openapi(
|
||||||
|
|
@ -47,7 +48,8 @@ export default apiRoute((app) =>
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
...reusedResponses,
|
401: ApiError.missingAuthentication().schema,
|
||||||
|
422: ApiError.validationFailed().schema,
|
||||||
},
|
},
|
||||||
}),
|
}),
|
||||||
async (context) => {
|
async (context) => {
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
import { apiRoute, auth, jsonOrForm, reusedResponses } from "@/api";
|
import { apiRoute, auth, jsonOrForm } from "@/api";
|
||||||
import { createRoute } from "@hono/zod-openapi";
|
import { createRoute } from "@hono/zod-openapi";
|
||||||
import {
|
import {
|
||||||
WebPushSubscriptionInput,
|
WebPushSubscriptionInput,
|
||||||
|
|
@ -49,7 +49,8 @@ export default apiRoute((app) =>
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
...reusedResponses,
|
401: ApiError.missingAuthentication().schema,
|
||||||
|
422: ApiError.validationFailed().schema,
|
||||||
},
|
},
|
||||||
}),
|
}),
|
||||||
async (context) => {
|
async (context) => {
|
||||||
|
|
@ -59,10 +60,7 @@ export default apiRoute((app) =>
|
||||||
const ps = await PushSubscription.fromToken(token);
|
const ps = await PushSubscription.fromToken(token);
|
||||||
|
|
||||||
if (!ps) {
|
if (!ps) {
|
||||||
throw new ApiError(
|
throw ApiError.pushSubscriptionNotFound();
|
||||||
404,
|
|
||||||
"No push subscription associated with this access token",
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (
|
if (
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,6 @@ import { Role as RoleSchema } from "@versia/client/schemas";
|
||||||
import { RolePermission } from "@versia/client/schemas";
|
import { RolePermission } from "@versia/client/schemas";
|
||||||
import { Role } from "@versia/kit/db";
|
import { Role } from "@versia/kit/db";
|
||||||
import { ApiError } from "~/classes/errors/api-error";
|
import { ApiError } from "~/classes/errors/api-error";
|
||||||
import { ErrorSchema } from "~/types/api";
|
|
||||||
|
|
||||||
const routeGet = createRoute({
|
const routeGet = createRoute({
|
||||||
method: "get",
|
method: "get",
|
||||||
|
|
@ -29,15 +28,8 @@ const routeGet = createRoute({
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
404: ApiError.roleNotFound().schema,
|
||||||
404: {
|
403: ApiError.forbidden().schema,
|
||||||
description: "Role not found",
|
|
||||||
content: {
|
|
||||||
"application/json": {
|
|
||||||
schema: ErrorSchema,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
@ -67,23 +59,8 @@ const routePatch = createRoute({
|
||||||
204: {
|
204: {
|
||||||
description: "Role updated",
|
description: "Role updated",
|
||||||
},
|
},
|
||||||
|
404: ApiError.roleNotFound().schema,
|
||||||
404: {
|
403: ApiError.forbidden().schema,
|
||||||
description: "Role not found",
|
|
||||||
content: {
|
|
||||||
"application/json": {
|
|
||||||
schema: ErrorSchema,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
403: {
|
|
||||||
description: "Forbidden",
|
|
||||||
content: {
|
|
||||||
"application/json": {
|
|
||||||
schema: ErrorSchema,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
@ -106,23 +83,8 @@ const routeDelete = createRoute({
|
||||||
204: {
|
204: {
|
||||||
description: "Role deleted",
|
description: "Role deleted",
|
||||||
},
|
},
|
||||||
|
404: ApiError.roleNotFound().schema,
|
||||||
404: {
|
403: ApiError.forbidden().schema,
|
||||||
description: "Role not found",
|
|
||||||
content: {
|
|
||||||
"application/json": {
|
|
||||||
schema: ErrorSchema,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
403: {
|
|
||||||
description: "Forbidden",
|
|
||||||
content: {
|
|
||||||
"application/json": {
|
|
||||||
schema: ErrorSchema,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
@ -133,7 +95,7 @@ export default apiRoute((app) => {
|
||||||
const role = await Role.fromId(id);
|
const role = await Role.fromId(id);
|
||||||
|
|
||||||
if (!role) {
|
if (!role) {
|
||||||
throw new ApiError(404, "Role not found");
|
throw ApiError.roleNotFound();
|
||||||
}
|
}
|
||||||
|
|
||||||
return context.json(role.toApi(), 200);
|
return context.json(role.toApi(), 200);
|
||||||
|
|
@ -148,7 +110,7 @@ export default apiRoute((app) => {
|
||||||
const role = await Role.fromId(id);
|
const role = await Role.fromId(id);
|
||||||
|
|
||||||
if (!role) {
|
if (!role) {
|
||||||
throw new ApiError(404, "Role not found");
|
throw ApiError.roleNotFound();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Priority check
|
// Priority check
|
||||||
|
|
@ -201,7 +163,7 @@ export default apiRoute((app) => {
|
||||||
const role = await Role.fromId(id);
|
const role = await Role.fromId(id);
|
||||||
|
|
||||||
if (!role) {
|
if (!role) {
|
||||||
throw new ApiError(404, "Role not found");
|
throw ApiError.roleNotFound();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Priority check
|
// Priority check
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,6 @@ import { Role as RoleSchema } from "@versia/client/schemas";
|
||||||
import { RolePermission } from "@versia/client/schemas";
|
import { RolePermission } from "@versia/client/schemas";
|
||||||
import { Role } from "@versia/kit/db";
|
import { Role } from "@versia/kit/db";
|
||||||
import { ApiError } from "~/classes/errors/api-error";
|
import { ApiError } from "~/classes/errors/api-error";
|
||||||
import { ErrorSchema } from "~/types/api";
|
|
||||||
|
|
||||||
const routeGet = createRoute({
|
const routeGet = createRoute({
|
||||||
method: "get",
|
method: "get",
|
||||||
|
|
@ -60,7 +59,7 @@ const routePost = createRoute({
|
||||||
description: "Forbidden",
|
description: "Forbidden",
|
||||||
content: {
|
content: {
|
||||||
"application/json": {
|
"application/json": {
|
||||||
schema: ErrorSchema,
|
schema: ApiError.zodSchema,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -1,16 +1,11 @@
|
||||||
import {
|
import { apiRoute, auth, withNoteParam } from "@/api";
|
||||||
apiRoute,
|
|
||||||
auth,
|
|
||||||
noteNotFound,
|
|
||||||
reusedResponses,
|
|
||||||
withNoteParam,
|
|
||||||
} from "@/api";
|
|
||||||
import { createRoute, z } from "@hono/zod-openapi";
|
import { createRoute, z } from "@hono/zod-openapi";
|
||||||
import {
|
import {
|
||||||
Context as ContextSchema,
|
Context as ContextSchema,
|
||||||
Status as StatusSchema,
|
Status as StatusSchema,
|
||||||
} from "@versia/client/schemas";
|
} from "@versia/client/schemas";
|
||||||
import { RolePermission } from "@versia/client/schemas";
|
import { RolePermission } from "@versia/client/schemas";
|
||||||
|
import { ApiError } from "~/classes/errors/api-error";
|
||||||
|
|
||||||
const route = createRoute({
|
const route = createRoute({
|
||||||
method: "get",
|
method: "get",
|
||||||
|
|
@ -42,8 +37,8 @@ const route = createRoute({
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
404: noteNotFound,
|
404: ApiError.noteNotFound().schema,
|
||||||
401: reusedResponses[401],
|
401: ApiError.missingAuthentication().schema,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,13 +1,8 @@
|
||||||
import {
|
import { apiRoute, auth, withNoteParam } from "@/api";
|
||||||
apiRoute,
|
|
||||||
auth,
|
|
||||||
noteNotFound,
|
|
||||||
reusedResponses,
|
|
||||||
withNoteParam,
|
|
||||||
} from "@/api";
|
|
||||||
import { createRoute, z } from "@hono/zod-openapi";
|
import { createRoute, z } from "@hono/zod-openapi";
|
||||||
import { Status as StatusSchema } from "@versia/client/schemas";
|
import { Status as StatusSchema } from "@versia/client/schemas";
|
||||||
import { RolePermission } from "@versia/client/schemas";
|
import { RolePermission } from "@versia/client/schemas";
|
||||||
|
import { ApiError } from "~/classes/errors/api-error";
|
||||||
|
|
||||||
const route = createRoute({
|
const route = createRoute({
|
||||||
method: "post",
|
method: "post",
|
||||||
|
|
@ -42,8 +37,8 @@ const route = createRoute({
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
404: noteNotFound,
|
404: ApiError.noteNotFound().schema,
|
||||||
401: reusedResponses[401],
|
401: ApiError.missingAuthentication().schema,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,4 @@
|
||||||
import {
|
import { apiRoute, auth, withNoteParam } from "@/api";
|
||||||
apiRoute,
|
|
||||||
auth,
|
|
||||||
noteNotFound,
|
|
||||||
reusedResponses,
|
|
||||||
withNoteParam,
|
|
||||||
} from "@/api";
|
|
||||||
import { createRoute, z } from "@hono/zod-openapi";
|
import { createRoute, z } from "@hono/zod-openapi";
|
||||||
import {
|
import {
|
||||||
Account as AccountSchema,
|
Account as AccountSchema,
|
||||||
|
|
@ -14,6 +8,7 @@ import { RolePermission } from "@versia/client/schemas";
|
||||||
import { Timeline } from "@versia/kit/db";
|
import { Timeline } from "@versia/kit/db";
|
||||||
import { Users } from "@versia/kit/tables";
|
import { Users } from "@versia/kit/tables";
|
||||||
import { and, gt, gte, lt, sql } from "drizzle-orm";
|
import { and, gt, gte, lt, sql } from "drizzle-orm";
|
||||||
|
import { ApiError } from "~/classes/errors/api-error";
|
||||||
|
|
||||||
const route = createRoute({
|
const route = createRoute({
|
||||||
method: "get",
|
method: "get",
|
||||||
|
|
@ -81,8 +76,9 @@ const route = createRoute({
|
||||||
}),
|
}),
|
||||||
}),
|
}),
|
||||||
},
|
},
|
||||||
404: noteNotFound,
|
404: ApiError.noteNotFound().schema,
|
||||||
...reusedResponses,
|
401: ApiError.missingAuthentication().schema,
|
||||||
|
422: ApiError.validationFailed().schema,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -29,13 +29,13 @@ describe("GET /api/v1/statuses/:id", () => {
|
||||||
expect(raw.status).toBe(404);
|
expect(raw.status).toBe(404);
|
||||||
});
|
});
|
||||||
|
|
||||||
test("should return 401 when trying to delete status that is not yours", async () => {
|
test("should forbid deleting status that is not yours", async () => {
|
||||||
await using client = await generateClient(users[1]);
|
await using client = await generateClient(users[1]);
|
||||||
|
|
||||||
const { ok, raw } = await client.deleteStatus(statuses[0].id);
|
const { ok, raw } = await client.deleteStatus(statuses[0].id);
|
||||||
|
|
||||||
expect(ok).toBe(false);
|
expect(ok).toBe(false);
|
||||||
expect(raw.status).toBe(401);
|
expect(raw.status).toBe(403);
|
||||||
});
|
});
|
||||||
|
|
||||||
test("should delete status", async () => {
|
test("should delete status", async () => {
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1,4 @@
|
||||||
import {
|
import { apiRoute, auth, jsonOrForm, withNoteParam } from "@/api";
|
||||||
apiRoute,
|
|
||||||
auth,
|
|
||||||
jsonOrForm,
|
|
||||||
noteNotFound,
|
|
||||||
reusedResponses,
|
|
||||||
withNoteParam,
|
|
||||||
} from "@/api";
|
|
||||||
import { createRoute, z } from "@hono/zod-openapi";
|
import { createRoute, z } from "@hono/zod-openapi";
|
||||||
import {
|
import {
|
||||||
Attachment as AttachmentSchema,
|
Attachment as AttachmentSchema,
|
||||||
|
|
@ -109,7 +102,7 @@ const routeGet = createRoute({
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
404: noteNotFound,
|
404: ApiError.noteNotFound().schema,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
@ -147,8 +140,8 @@ const routeDelete = createRoute({
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
404: noteNotFound,
|
404: ApiError.noteNotFound().schema,
|
||||||
401: reusedResponses[401],
|
401: ApiError.missingAuthentication().schema,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
@ -200,8 +193,10 @@ const routePut = createRoute({
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
404: noteNotFound,
|
404: ApiError.noteNotFound().schema,
|
||||||
...reusedResponses,
|
403: ApiError.forbidden().schema,
|
||||||
|
401: ApiError.missingAuthentication().schema,
|
||||||
|
422: ApiError.validationFailed().schema,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
@ -218,7 +213,7 @@ export default apiRoute((app) => {
|
||||||
const note = context.get("note");
|
const note = context.get("note");
|
||||||
|
|
||||||
if (note.author.id !== user.id) {
|
if (note.author.id !== user.id) {
|
||||||
throw new ApiError(401, "Unauthorized");
|
throw ApiError.forbidden();
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Delete and redraft
|
// TODO: Delete and redraft
|
||||||
|
|
@ -234,7 +229,7 @@ export default apiRoute((app) => {
|
||||||
const note = context.get("note");
|
const note = context.get("note");
|
||||||
|
|
||||||
if (note.author.id !== user.id) {
|
if (note.author.id !== user.id) {
|
||||||
throw new ApiError(401, "Unauthorized");
|
throw ApiError.forbidden();
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Polls
|
// TODO: Polls
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,4 @@
|
||||||
import {
|
import { apiRoute, auth, withNoteParam } from "@/api";
|
||||||
apiRoute,
|
|
||||||
auth,
|
|
||||||
noteNotFound,
|
|
||||||
reusedResponses,
|
|
||||||
withNoteParam,
|
|
||||||
} from "@/api";
|
|
||||||
import { createRoute, z } from "@hono/zod-openapi";
|
import { createRoute, z } from "@hono/zod-openapi";
|
||||||
import { Status as StatusSchema } from "@versia/client/schemas";
|
import { Status as StatusSchema } from "@versia/client/schemas";
|
||||||
import { RolePermission } from "@versia/client/schemas";
|
import { RolePermission } from "@versia/client/schemas";
|
||||||
|
|
@ -47,8 +41,9 @@ const route = createRoute({
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
404: noteNotFound,
|
404: ApiError.noteNotFound().schema,
|
||||||
401: reusedResponses[401],
|
403: ApiError.forbidden().schema,
|
||||||
|
401: ApiError.missingAuthentication().schema,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
@ -58,7 +53,7 @@ export default apiRoute((app) =>
|
||||||
const note = context.get("note");
|
const note = context.get("note");
|
||||||
|
|
||||||
if (note.author.id !== user.id) {
|
if (note.author.id !== user.id) {
|
||||||
throw new ApiError(401, "Unauthorized");
|
throw ApiError.forbidden();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (
|
if (
|
||||||
|
|
@ -70,7 +65,7 @@ export default apiRoute((app) =>
|
||||||
),
|
),
|
||||||
})
|
})
|
||||||
) {
|
) {
|
||||||
throw new ApiError(422, "Already pinned");
|
return context.json(await note.toApi(user), 200);
|
||||||
}
|
}
|
||||||
|
|
||||||
await user.pin(note);
|
await user.pin(note);
|
||||||
|
|
|
||||||
|
|
@ -1,17 +1,11 @@
|
||||||
import {
|
import { apiRoute, auth, jsonOrForm, withNoteParam } from "@/api";
|
||||||
apiRoute,
|
|
||||||
auth,
|
|
||||||
jsonOrForm,
|
|
||||||
noteNotFound,
|
|
||||||
reusedResponses,
|
|
||||||
withNoteParam,
|
|
||||||
} from "@/api";
|
|
||||||
import { createRoute, z } from "@hono/zod-openapi";
|
import { createRoute, z } from "@hono/zod-openapi";
|
||||||
import { Status as StatusSchema } from "@versia/client/schemas";
|
import { Status as StatusSchema } from "@versia/client/schemas";
|
||||||
import { RolePermission } from "@versia/client/schemas";
|
import { RolePermission } from "@versia/client/schemas";
|
||||||
import { Note } from "@versia/kit/db";
|
import { Note } from "@versia/kit/db";
|
||||||
import { Notes } from "@versia/kit/tables";
|
import { Notes } from "@versia/kit/tables";
|
||||||
import { and, eq } from "drizzle-orm";
|
import { and, eq } from "drizzle-orm";
|
||||||
|
import { ApiError } from "~/classes/errors/api-error";
|
||||||
|
|
||||||
const route = createRoute({
|
const route = createRoute({
|
||||||
method: "post",
|
method: "post",
|
||||||
|
|
@ -70,8 +64,9 @@ const route = createRoute({
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
404: noteNotFound,
|
404: ApiError.noteNotFound().schema,
|
||||||
...reusedResponses,
|
401: ApiError.missingAuthentication().schema,
|
||||||
|
422: ApiError.validationFailed().schema,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,4 @@
|
||||||
import {
|
import { apiRoute, auth, withNoteParam } from "@/api";
|
||||||
apiRoute,
|
|
||||||
auth,
|
|
||||||
noteNotFound,
|
|
||||||
reusedResponses,
|
|
||||||
withNoteParam,
|
|
||||||
} from "@/api";
|
|
||||||
import { createRoute, z } from "@hono/zod-openapi";
|
import { createRoute, z } from "@hono/zod-openapi";
|
||||||
import {
|
import {
|
||||||
Account as AccountSchema,
|
Account as AccountSchema,
|
||||||
|
|
@ -14,6 +8,7 @@ import { RolePermission } from "@versia/client/schemas";
|
||||||
import { Timeline } from "@versia/kit/db";
|
import { Timeline } from "@versia/kit/db";
|
||||||
import { Users } from "@versia/kit/tables";
|
import { Users } from "@versia/kit/tables";
|
||||||
import { and, gt, gte, lt, sql } from "drizzle-orm";
|
import { and, gt, gte, lt, sql } from "drizzle-orm";
|
||||||
|
import { ApiError } from "~/classes/errors/api-error";
|
||||||
|
|
||||||
const route = createRoute({
|
const route = createRoute({
|
||||||
method: "get",
|
method: "get",
|
||||||
|
|
@ -81,8 +76,9 @@ const route = createRoute({
|
||||||
}),
|
}),
|
||||||
}),
|
}),
|
||||||
},
|
},
|
||||||
404: noteNotFound,
|
404: ApiError.noteNotFound().schema,
|
||||||
...reusedResponses,
|
401: ApiError.missingAuthentication().schema,
|
||||||
|
422: ApiError.validationFailed().schema,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,16 +1,11 @@
|
||||||
import {
|
import { apiRoute, auth, withNoteParam } from "@/api";
|
||||||
apiRoute,
|
|
||||||
auth,
|
|
||||||
noteNotFound,
|
|
||||||
reusedResponses,
|
|
||||||
withNoteParam,
|
|
||||||
} from "@/api";
|
|
||||||
import { createRoute, z } from "@hono/zod-openapi";
|
import { createRoute, z } from "@hono/zod-openapi";
|
||||||
import {
|
import {
|
||||||
Status as StatusSchema,
|
Status as StatusSchema,
|
||||||
StatusSource as StatusSourceSchema,
|
StatusSource as StatusSourceSchema,
|
||||||
} from "@versia/client/schemas";
|
} from "@versia/client/schemas";
|
||||||
import { RolePermission } from "@versia/client/schemas";
|
import { RolePermission } from "@versia/client/schemas";
|
||||||
|
import { ApiError } from "~/classes/errors/api-error";
|
||||||
|
|
||||||
const route = createRoute({
|
const route = createRoute({
|
||||||
method: "get",
|
method: "get",
|
||||||
|
|
@ -46,8 +41,8 @@ const route = createRoute({
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
404: noteNotFound,
|
404: ApiError.noteNotFound().schema,
|
||||||
401: reusedResponses[401],
|
401: ApiError.missingAuthentication().schema,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,13 +1,8 @@
|
||||||
import {
|
import { apiRoute, auth, withNoteParam } from "@/api";
|
||||||
apiRoute,
|
|
||||||
auth,
|
|
||||||
noteNotFound,
|
|
||||||
reusedResponses,
|
|
||||||
withNoteParam,
|
|
||||||
} from "@/api";
|
|
||||||
import { createRoute, z } from "@hono/zod-openapi";
|
import { createRoute, z } from "@hono/zod-openapi";
|
||||||
import { Status as StatusSchema } from "@versia/client/schemas";
|
import { Status as StatusSchema } from "@versia/client/schemas";
|
||||||
import { RolePermission } from "@versia/client/schemas";
|
import { RolePermission } from "@versia/client/schemas";
|
||||||
|
import { ApiError } from "~/classes/errors/api-error";
|
||||||
|
|
||||||
const route = createRoute({
|
const route = createRoute({
|
||||||
method: "post",
|
method: "post",
|
||||||
|
|
@ -42,8 +37,8 @@ const route = createRoute({
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
404: noteNotFound,
|
404: ApiError.noteNotFound().schema,
|
||||||
401: reusedResponses[401],
|
401: ApiError.missingAuthentication().schema,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,4 @@
|
||||||
import {
|
import { apiRoute, auth, withNoteParam } from "@/api";
|
||||||
apiRoute,
|
|
||||||
auth,
|
|
||||||
noteNotFound,
|
|
||||||
reusedResponses,
|
|
||||||
withNoteParam,
|
|
||||||
} from "@/api";
|
|
||||||
import { createRoute, z } from "@hono/zod-openapi";
|
import { createRoute, z } from "@hono/zod-openapi";
|
||||||
import { Status as StatusSchema } from "@versia/client/schemas";
|
import { Status as StatusSchema } from "@versia/client/schemas";
|
||||||
import { RolePermission } from "@versia/client/schemas";
|
import { RolePermission } from "@versia/client/schemas";
|
||||||
|
|
@ -43,8 +37,9 @@ const route = createRoute({
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
404: noteNotFound,
|
404: ApiError.noteNotFound().schema,
|
||||||
401: reusedResponses[401],
|
403: ApiError.forbidden().schema,
|
||||||
|
401: ApiError.missingAuthentication().schema,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
@ -54,13 +49,13 @@ export default apiRoute((app) =>
|
||||||
const note = context.get("note");
|
const note = context.get("note");
|
||||||
|
|
||||||
if (note.author.id !== user.id) {
|
if (note.author.id !== user.id) {
|
||||||
throw new ApiError(401, "Unauthorized");
|
throw ApiError.forbidden();
|
||||||
}
|
}
|
||||||
|
|
||||||
await user.unpin(note);
|
await user.unpin(note);
|
||||||
|
|
||||||
if (!note) {
|
if (!note) {
|
||||||
throw new ApiError(404, "Note not found");
|
throw ApiError.noteNotFound();
|
||||||
}
|
}
|
||||||
|
|
||||||
return context.json(await note.toApi(user), 200);
|
return context.json(await note.toApi(user), 200);
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,4 @@
|
||||||
import {
|
import { apiRoute, auth, withNoteParam } from "@/api";
|
||||||
apiRoute,
|
|
||||||
auth,
|
|
||||||
noteNotFound,
|
|
||||||
reusedResponses,
|
|
||||||
withNoteParam,
|
|
||||||
} from "@/api";
|
|
||||||
import { createRoute, z } from "@hono/zod-openapi";
|
import { createRoute, z } from "@hono/zod-openapi";
|
||||||
import { Status as StatusSchema } from "@versia/client/schemas";
|
import { Status as StatusSchema } from "@versia/client/schemas";
|
||||||
import { RolePermission } from "@versia/client/schemas";
|
import { RolePermission } from "@versia/client/schemas";
|
||||||
|
|
@ -46,8 +40,8 @@ const route = createRoute({
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
404: noteNotFound,
|
404: ApiError.noteNotFound().schema,
|
||||||
401: reusedResponses[401],
|
401: ApiError.missingAuthentication().schema,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
@ -74,7 +68,7 @@ export default apiRoute((app) =>
|
||||||
const newNote = await Note.fromId(id, user.id);
|
const newNote = await Note.fromId(id, user.id);
|
||||||
|
|
||||||
if (!newNote) {
|
if (!newNote) {
|
||||||
throw new ApiError(404, "Note not found");
|
throw ApiError.noteNotFound();
|
||||||
}
|
}
|
||||||
|
|
||||||
return context.json(await newNote.toApi(user), 200);
|
return context.json(await newNote.toApi(user), 200);
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
import { apiRoute, auth, jsonOrForm, reusedResponses } from "@/api";
|
import { apiRoute, auth, jsonOrForm } from "@/api";
|
||||||
import { createRoute, z } from "@hono/zod-openapi";
|
import { createRoute, z } from "@hono/zod-openapi";
|
||||||
import {
|
import {
|
||||||
Attachment as AttachmentSchema,
|
Attachment as AttachmentSchema,
|
||||||
|
|
@ -141,7 +141,8 @@ const route = createRoute({
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
...reusedResponses,
|
401: ApiError.missingAuthentication().schema,
|
||||||
|
422: ApiError.validationFailed().schema,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,11 @@
|
||||||
import { apiRoute, auth, reusedResponses } from "@/api";
|
import { apiRoute, auth } from "@/api";
|
||||||
import { createRoute, z } from "@hono/zod-openapi";
|
import { createRoute, z } from "@hono/zod-openapi";
|
||||||
import { Status as StatusSchema } from "@versia/client/schemas";
|
import { Status as StatusSchema } from "@versia/client/schemas";
|
||||||
import { RolePermission } from "@versia/client/schemas";
|
import { RolePermission } from "@versia/client/schemas";
|
||||||
import { Timeline } from "@versia/kit/db";
|
import { Timeline } from "@versia/kit/db";
|
||||||
import { Notes } from "@versia/kit/tables";
|
import { Notes } 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 { ApiError } from "~/classes/errors/api-error";
|
||||||
|
|
||||||
const route = createRoute({
|
const route = createRoute({
|
||||||
method: "get",
|
method: "get",
|
||||||
|
|
@ -70,7 +71,7 @@ const route = createRoute({
|
||||||
}),
|
}),
|
||||||
}),
|
}),
|
||||||
},
|
},
|
||||||
422: reusedResponses[422],
|
422: ApiError.validationFailed().schema,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,11 @@
|
||||||
import { apiRoute, auth, reusedResponses } from "@/api";
|
import { apiRoute, auth } from "@/api";
|
||||||
import { createRoute, z } from "@hono/zod-openapi";
|
import { createRoute, z } from "@hono/zod-openapi";
|
||||||
import { Status as StatusSchema, zBoolean } from "@versia/client/schemas";
|
import { Status as StatusSchema, zBoolean } from "@versia/client/schemas";
|
||||||
import { RolePermission } from "@versia/client/schemas";
|
import { RolePermission } from "@versia/client/schemas";
|
||||||
import { Timeline } from "@versia/kit/db";
|
import { Timeline } from "@versia/kit/db";
|
||||||
import { Notes } from "@versia/kit/tables";
|
import { Notes } 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 { ApiError } from "~/classes/errors/api-error";
|
||||||
|
|
||||||
const route = createRoute({
|
const route = createRoute({
|
||||||
method: "get",
|
method: "get",
|
||||||
|
|
@ -89,7 +90,7 @@ const route = createRoute({
|
||||||
}),
|
}),
|
||||||
}),
|
}),
|
||||||
},
|
},
|
||||||
422: reusedResponses[422],
|
422: ApiError.validationFailed().schema,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
import { apiRoute, auth, jsonOrForm, reusedResponses } from "@/api";
|
import { apiRoute, auth, jsonOrForm } from "@/api";
|
||||||
import { createRoute, z } from "@hono/zod-openapi";
|
import { createRoute, z } from "@hono/zod-openapi";
|
||||||
import {
|
import {
|
||||||
FilterKeyword as FilterKeywordSchema,
|
FilterKeyword as FilterKeywordSchema,
|
||||||
|
|
@ -10,7 +10,6 @@ import { db } from "@versia/kit/db";
|
||||||
import { FilterKeywords, Filters } from "@versia/kit/tables";
|
import { FilterKeywords, Filters } from "@versia/kit/tables";
|
||||||
import { type SQL, and, eq, inArray } from "drizzle-orm";
|
import { type SQL, and, eq, inArray } from "drizzle-orm";
|
||||||
import { ApiError } from "~/classes/errors/api-error";
|
import { ApiError } from "~/classes/errors/api-error";
|
||||||
import { ErrorSchema } from "~/types/api";
|
|
||||||
|
|
||||||
const routeGet = createRoute({
|
const routeGet = createRoute({
|
||||||
method: "get",
|
method: "get",
|
||||||
|
|
@ -44,11 +43,11 @@ const routeGet = createRoute({
|
||||||
description: "Filter not found",
|
description: "Filter not found",
|
||||||
content: {
|
content: {
|
||||||
"application/json": {
|
"application/json": {
|
||||||
schema: ErrorSchema,
|
schema: ApiError.zodSchema,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
401: reusedResponses[401],
|
401: ApiError.missingAuthentication().schema,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
@ -125,11 +124,12 @@ const routePut = createRoute({
|
||||||
description: "Filter not found",
|
description: "Filter not found",
|
||||||
content: {
|
content: {
|
||||||
"application/json": {
|
"application/json": {
|
||||||
schema: ErrorSchema,
|
schema: ApiError.zodSchema,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
...reusedResponses,
|
401: ApiError.missingAuthentication().schema,
|
||||||
|
422: ApiError.validationFailed().schema,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
@ -161,11 +161,11 @@ const routeDelete = createRoute({
|
||||||
description: "Filter not found",
|
description: "Filter not found",
|
||||||
content: {
|
content: {
|
||||||
"application/json": {
|
"application/json": {
|
||||||
schema: ErrorSchema,
|
schema: ApiError.zodSchema,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
401: reusedResponses[401],
|
401: ApiError.missingAuthentication().schema,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
import { apiRoute, auth, jsonOrForm, reusedResponses } from "@/api";
|
import { apiRoute, auth, jsonOrForm } from "@/api";
|
||||||
import { createRoute, z } from "@hono/zod-openapi";
|
import { createRoute, z } from "@hono/zod-openapi";
|
||||||
import {
|
import {
|
||||||
FilterKeyword as FilterKeywordSchema,
|
FilterKeyword as FilterKeywordSchema,
|
||||||
|
|
@ -8,6 +8,7 @@ import { RolePermission } from "@versia/client/schemas";
|
||||||
import { db } from "@versia/kit/db";
|
import { db } from "@versia/kit/db";
|
||||||
import { FilterKeywords, Filters } from "@versia/kit/tables";
|
import { FilterKeywords, Filters } from "@versia/kit/tables";
|
||||||
import type { SQL } from "drizzle-orm";
|
import type { SQL } from "drizzle-orm";
|
||||||
|
import { ApiError } from "~/classes/errors/api-error";
|
||||||
|
|
||||||
const routeGet = createRoute({
|
const routeGet = createRoute({
|
||||||
method: "get",
|
method: "get",
|
||||||
|
|
@ -34,7 +35,7 @@ const routeGet = createRoute({
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
401: reusedResponses[401],
|
401: ApiError.missingAuthentication().schema,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
@ -94,7 +95,8 @@ const routePost = createRoute({
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
...reusedResponses,
|
401: ApiError.missingAuthentication().schema,
|
||||||
|
422: ApiError.validationFailed().schema,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,9 @@
|
||||||
import { apiRoute, auth, reusedResponses } from "@/api";
|
import { apiRoute, auth } from "@/api";
|
||||||
import { createRoute, z } from "@hono/zod-openapi";
|
import { createRoute, z } from "@hono/zod-openapi";
|
||||||
import { Attachment as AttachmentSchema } from "@versia/client/schemas";
|
import { Attachment as AttachmentSchema } from "@versia/client/schemas";
|
||||||
import { RolePermission } from "@versia/client/schemas";
|
import { RolePermission } from "@versia/client/schemas";
|
||||||
import { Media } from "@versia/kit/db";
|
import { Media } from "@versia/kit/db";
|
||||||
import { ErrorSchema } from "~/types/api";
|
import { ApiError } from "~/classes/errors/api-error";
|
||||||
|
|
||||||
const route = createRoute({
|
const route = createRoute({
|
||||||
method: "post",
|
method: "post",
|
||||||
|
|
@ -76,7 +76,7 @@ const route = createRoute({
|
||||||
description: "Payload too large",
|
description: "Payload too large",
|
||||||
content: {
|
content: {
|
||||||
"application/json": {
|
"application/json": {
|
||||||
schema: ErrorSchema,
|
schema: ApiError.zodSchema,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
@ -84,11 +84,12 @@ const route = createRoute({
|
||||||
description: "Unsupported media type",
|
description: "Unsupported media type",
|
||||||
content: {
|
content: {
|
||||||
"application/json": {
|
"application/json": {
|
||||||
schema: ErrorSchema,
|
schema: ApiError.zodSchema,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
...reusedResponses,
|
401: ApiError.missingAuthentication().schema,
|
||||||
|
422: ApiError.validationFailed().schema,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,4 @@
|
||||||
import {
|
import { apiRoute, auth, parseUserAddress, userAddressValidator } from "@/api";
|
||||||
apiRoute,
|
|
||||||
auth,
|
|
||||||
parseUserAddress,
|
|
||||||
reusedResponses,
|
|
||||||
userAddressValidator,
|
|
||||||
} from "@/api";
|
|
||||||
import { createRoute, z } from "@hono/zod-openapi";
|
import { createRoute, z } from "@hono/zod-openapi";
|
||||||
import {
|
import {
|
||||||
Account as AccountSchema,
|
Account as AccountSchema,
|
||||||
|
|
@ -19,7 +13,6 @@ import { and, eq, inArray, isNull, sql } from "drizzle-orm";
|
||||||
import { ApiError } from "~/classes/errors/api-error";
|
import { ApiError } from "~/classes/errors/api-error";
|
||||||
import { searchManager } from "~/classes/search/search-manager";
|
import { searchManager } from "~/classes/search/search-manager";
|
||||||
import { config } from "~/config.ts";
|
import { config } from "~/config.ts";
|
||||||
import { ErrorSchema } from "~/types/api";
|
|
||||||
|
|
||||||
const route = createRoute({
|
const route = createRoute({
|
||||||
method: "get",
|
method: "get",
|
||||||
|
|
@ -107,7 +100,7 @@ const route = createRoute({
|
||||||
"Cannot use resolve or offset without being authenticated",
|
"Cannot use resolve or offset without being authenticated",
|
||||||
content: {
|
content: {
|
||||||
"application/json": {
|
"application/json": {
|
||||||
schema: ErrorSchema,
|
schema: ApiError.zodSchema,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
@ -115,11 +108,11 @@ const route = createRoute({
|
||||||
description: "Search is not enabled on this server",
|
description: "Search is not enabled on this server",
|
||||||
content: {
|
content: {
|
||||||
"application/json": {
|
"application/json": {
|
||||||
schema: ErrorSchema,
|
schema: ApiError.zodSchema,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
422: reusedResponses[422],
|
422: ApiError.validationFailed().schema,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,6 @@
|
||||||
import { apiRoute } from "@/api";
|
import { apiRoute } from "@/api";
|
||||||
import { createRoute, z } from "@hono/zod-openapi";
|
import { createRoute, z } from "@hono/zod-openapi";
|
||||||
import { ApiError } from "~/classes/errors/api-error";
|
import { ApiError } from "~/classes/errors/api-error";
|
||||||
import { ErrorSchema } from "~/types/api";
|
|
||||||
|
|
||||||
const schemas = {
|
const schemas = {
|
||||||
param: z.object({
|
param: z.object({
|
||||||
|
|
@ -34,7 +33,7 @@ const route = createRoute({
|
||||||
description: "File not found",
|
description: "File not found",
|
||||||
content: {
|
content: {
|
||||||
"application/json": {
|
"application/json": {
|
||||||
schema: ErrorSchema,
|
schema: ApiError.zodSchema,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,6 @@ import { proxy } from "hono/proxy";
|
||||||
import type { ContentfulStatusCode, StatusCode } from "hono/utils/http-status";
|
import type { ContentfulStatusCode, StatusCode } from "hono/utils/http-status";
|
||||||
import { ApiError } from "~/classes/errors/api-error";
|
import { ApiError } from "~/classes/errors/api-error";
|
||||||
import { config } from "~/config.ts";
|
import { config } from "~/config.ts";
|
||||||
import { ErrorSchema } from "~/types/api";
|
|
||||||
|
|
||||||
const schemas = {
|
const schemas = {
|
||||||
param: z.object({
|
param: z.object({
|
||||||
|
|
@ -34,7 +33,7 @@ const route = createRoute({
|
||||||
description: "Invalid URL to proxy",
|
description: "Invalid URL to proxy",
|
||||||
content: {
|
content: {
|
||||||
"application/json": {
|
"application/json": {
|
||||||
schema: ErrorSchema,
|
schema: ApiError.zodSchema,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,6 @@ import { Notes } from "@versia/kit/tables";
|
||||||
import { and, eq, inArray } from "drizzle-orm";
|
import { and, eq, inArray } from "drizzle-orm";
|
||||||
import { ApiError } from "~/classes/errors/api-error";
|
import { ApiError } from "~/classes/errors/api-error";
|
||||||
import { config } from "~/config.ts";
|
import { config } from "~/config.ts";
|
||||||
import { ErrorSchema } from "~/types/api";
|
|
||||||
|
|
||||||
const route = createRoute({
|
const route = createRoute({
|
||||||
method: "get",
|
method: "get",
|
||||||
|
|
@ -32,7 +31,7 @@ const route = createRoute({
|
||||||
"Entity not found, is remote, or the requester is not allowed to view it.",
|
"Entity not found, is remote, or the requester is not allowed to view it.",
|
||||||
content: {
|
content: {
|
||||||
"application/json": {
|
"application/json": {
|
||||||
schema: ErrorSchema,
|
schema: ApiError.zodSchema,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
@ -51,7 +50,7 @@ export default apiRoute((app) =>
|
||||||
);
|
);
|
||||||
|
|
||||||
if (!(note && (await note.isViewableByUser(null))) || note.isRemote()) {
|
if (!(note && (await note.isViewableByUser(null))) || note.isRemote()) {
|
||||||
throw new ApiError(404, "Note not found");
|
throw ApiError.noteNotFound();
|
||||||
}
|
}
|
||||||
|
|
||||||
// If base_url uses https and request uses http, rewrite request to use https
|
// If base_url uses https and request uses http, rewrite request to use https
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,6 @@ import { Notes } from "@versia/kit/tables";
|
||||||
import { and, eq, inArray } from "drizzle-orm";
|
import { and, eq, inArray } from "drizzle-orm";
|
||||||
import { ApiError } from "~/classes/errors/api-error";
|
import { ApiError } from "~/classes/errors/api-error";
|
||||||
import { config } from "~/config.ts";
|
import { config } from "~/config.ts";
|
||||||
import { ErrorSchema } from "~/types/api";
|
|
||||||
|
|
||||||
const route = createRoute({
|
const route = createRoute({
|
||||||
method: "get",
|
method: "get",
|
||||||
|
|
@ -37,7 +36,7 @@ const route = createRoute({
|
||||||
"Entity not found, is remote, or the requester is not allowed to view it.",
|
"Entity not found, is remote, or the requester is not allowed to view it.",
|
||||||
content: {
|
content: {
|
||||||
"application/json": {
|
"application/json": {
|
||||||
schema: ErrorSchema,
|
schema: ApiError.zodSchema,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
@ -57,7 +56,7 @@ export default apiRoute((app) =>
|
||||||
);
|
);
|
||||||
|
|
||||||
if (!(note && (await note.isViewableByUser(null))) || note.isRemote()) {
|
if (!(note && (await note.isViewableByUser(null))) || note.isRemote()) {
|
||||||
throw new ApiError(404, "Note not found");
|
throw ApiError.noteNotFound();
|
||||||
}
|
}
|
||||||
|
|
||||||
const replies = await Note.manyFromSql(
|
const replies = await Note.manyFromSql(
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,6 @@ import { Notes } from "@versia/kit/tables";
|
||||||
import { and, eq, inArray } from "drizzle-orm";
|
import { and, eq, inArray } from "drizzle-orm";
|
||||||
import { ApiError } from "~/classes/errors/api-error";
|
import { ApiError } from "~/classes/errors/api-error";
|
||||||
import { config } from "~/config.ts";
|
import { config } from "~/config.ts";
|
||||||
import { ErrorSchema } from "~/types/api";
|
|
||||||
|
|
||||||
const route = createRoute({
|
const route = createRoute({
|
||||||
method: "get",
|
method: "get",
|
||||||
|
|
@ -37,7 +36,7 @@ const route = createRoute({
|
||||||
"Entity not found, is remote, or the requester is not allowed to view it.",
|
"Entity not found, is remote, or the requester is not allowed to view it.",
|
||||||
content: {
|
content: {
|
||||||
"application/json": {
|
"application/json": {
|
||||||
schema: ErrorSchema,
|
schema: ApiError.zodSchema,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
@ -57,7 +56,7 @@ export default apiRoute((app) =>
|
||||||
);
|
);
|
||||||
|
|
||||||
if (!(note && (await note.isViewableByUser(null))) || note.isRemote()) {
|
if (!(note && (await note.isViewableByUser(null))) || note.isRemote()) {
|
||||||
throw new ApiError(404, "Note not found");
|
throw ApiError.noteNotFound();
|
||||||
}
|
}
|
||||||
|
|
||||||
const replies = await Note.manyFromSql(
|
const replies = await Note.manyFromSql(
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,7 @@ import { Likes, Notes } from "@versia/kit/tables";
|
||||||
import { and, eq, inArray, sql } from "drizzle-orm";
|
import { and, eq, inArray, sql } from "drizzle-orm";
|
||||||
import { ApiError } from "~/classes/errors/api-error";
|
import { ApiError } from "~/classes/errors/api-error";
|
||||||
import { config } from "~/config.ts";
|
import { config } from "~/config.ts";
|
||||||
import { ErrorSchema, type KnownEntity } from "~/types/api";
|
import type { KnownEntity } from "~/types/api";
|
||||||
|
|
||||||
const route = createRoute({
|
const route = createRoute({
|
||||||
method: "get",
|
method: "get",
|
||||||
|
|
@ -33,7 +33,7 @@ const route = createRoute({
|
||||||
description: "Object not found",
|
description: "Object not found",
|
||||||
content: {
|
content: {
|
||||||
"application/json": {
|
"application/json": {
|
||||||
schema: ErrorSchema,
|
schema: ApiError.zodSchema,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
@ -41,7 +41,7 @@ const route = createRoute({
|
||||||
description: "Cannot view objects from remote instances",
|
description: "Cannot view objects from remote instances",
|
||||||
content: {
|
content: {
|
||||||
"application/json": {
|
"application/json": {
|
||||||
schema: ErrorSchema,
|
schema: ApiError.zodSchema,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
import { apiRoute } from "@/api";
|
import { apiRoute } from "@/api";
|
||||||
import { createRoute, z } 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 { ApiError } from "~/classes/errors/api-error";
|
||||||
import { InboxJobType, inboxQueue } from "~/classes/queues/inbox";
|
import { InboxJobType, inboxQueue } from "~/classes/queues/inbox";
|
||||||
import { ErrorSchema } from "~/types/api";
|
|
||||||
|
|
||||||
const schemas = {
|
const schemas = {
|
||||||
param: z.object({
|
param: z.object({
|
||||||
|
|
@ -47,7 +47,7 @@ const route = createRoute({
|
||||||
description: "Bad request",
|
description: "Bad request",
|
||||||
content: {
|
content: {
|
||||||
"application/json": {
|
"application/json": {
|
||||||
schema: ErrorSchema,
|
schema: ApiError.zodSchema,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
@ -55,7 +55,7 @@ const route = createRoute({
|
||||||
description: "Signature could not be verified",
|
description: "Signature could not be verified",
|
||||||
content: {
|
content: {
|
||||||
"application/json": {
|
"application/json": {
|
||||||
schema: ErrorSchema,
|
schema: ApiError.zodSchema,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
@ -63,7 +63,7 @@ const route = createRoute({
|
||||||
description: "Cannot view users from remote instances",
|
description: "Cannot view users from remote instances",
|
||||||
content: {
|
content: {
|
||||||
"application/json": {
|
"application/json": {
|
||||||
schema: ErrorSchema,
|
schema: ApiError.zodSchema,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
@ -71,7 +71,7 @@ const route = createRoute({
|
||||||
description: "Not found",
|
description: "Not found",
|
||||||
content: {
|
content: {
|
||||||
"application/json": {
|
"application/json": {
|
||||||
schema: ErrorSchema,
|
schema: ApiError.zodSchema,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,6 @@ 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 { ApiError } from "~/classes/errors/api-error";
|
import { ApiError } from "~/classes/errors/api-error";
|
||||||
import { ErrorSchema } from "~/types/api";
|
|
||||||
|
|
||||||
const schemas = {
|
const schemas = {
|
||||||
param: z.object({
|
param: z.object({
|
||||||
|
|
@ -31,19 +30,12 @@ const route = createRoute({
|
||||||
description:
|
description:
|
||||||
"Redirect to user profile (for web browsers). Uses user-agent for detection.",
|
"Redirect to user profile (for web browsers). Uses user-agent for detection.",
|
||||||
},
|
},
|
||||||
404: {
|
404: ApiError.accountNotFound().schema,
|
||||||
description: "User not found",
|
|
||||||
content: {
|
|
||||||
"application/json": {
|
|
||||||
schema: ErrorSchema,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
403: {
|
403: {
|
||||||
description: "Cannot view users from remote instances",
|
description: "Cannot view users from remote instances",
|
||||||
content: {
|
content: {
|
||||||
"application/json": {
|
"application/json": {
|
||||||
schema: ErrorSchema,
|
schema: ApiError.zodSchema,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
@ -57,7 +49,7 @@ export default apiRoute((app) =>
|
||||||
const user = await User.fromId(uuid);
|
const user = await User.fromId(uuid);
|
||||||
|
|
||||||
if (!user) {
|
if (!user) {
|
||||||
throw new ApiError(404, "User not found");
|
throw ApiError.accountNotFound();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (user.isRemote()) {
|
if (user.isRemote()) {
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,6 @@ import { Notes } from "@versia/kit/tables";
|
||||||
import { and, eq, inArray } from "drizzle-orm";
|
import { and, eq, inArray } from "drizzle-orm";
|
||||||
import { ApiError } from "~/classes/errors/api-error";
|
import { ApiError } from "~/classes/errors/api-error";
|
||||||
import { config } from "~/config.ts";
|
import { config } from "~/config.ts";
|
||||||
import { ErrorSchema } from "~/types/api";
|
|
||||||
|
|
||||||
const schemas = {
|
const schemas = {
|
||||||
param: z.object({
|
param: z.object({
|
||||||
|
|
@ -43,7 +42,7 @@ const route = createRoute({
|
||||||
description: "User not found",
|
description: "User not found",
|
||||||
content: {
|
content: {
|
||||||
"application/json": {
|
"application/json": {
|
||||||
schema: ErrorSchema,
|
schema: ApiError.zodSchema,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
@ -51,7 +50,7 @@ const route = createRoute({
|
||||||
description: "Cannot view users from remote instances",
|
description: "Cannot view users from remote instances",
|
||||||
content: {
|
content: {
|
||||||
"application/json": {
|
"application/json": {
|
||||||
schema: ErrorSchema,
|
schema: ApiError.zodSchema,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -13,7 +13,6 @@ import { Users } from "@versia/kit/tables";
|
||||||
import { and, eq, isNull } from "drizzle-orm";
|
import { and, eq, isNull } from "drizzle-orm";
|
||||||
import { ApiError } from "~/classes/errors/api-error";
|
import { ApiError } from "~/classes/errors/api-error";
|
||||||
import { config } from "~/config.ts";
|
import { config } from "~/config.ts";
|
||||||
import { ErrorSchema } from "~/types/api";
|
|
||||||
|
|
||||||
const schemas = {
|
const schemas = {
|
||||||
query: z.object({
|
query: z.object({
|
||||||
|
|
@ -46,14 +45,7 @@ const route = createRoute({
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
404: {
|
404: ApiError.accountNotFound().schema,
|
||||||
description: "User not found",
|
|
||||||
content: {
|
|
||||||
"application/json": {
|
|
||||||
schema: ErrorSchema,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
@ -85,7 +77,7 @@ export default apiRoute((app) =>
|
||||||
);
|
);
|
||||||
|
|
||||||
if (!user) {
|
if (!user) {
|
||||||
throw new ApiError(404, "User not found");
|
throw ApiError.accountNotFound();
|
||||||
}
|
}
|
||||||
|
|
||||||
let activityPubUrl = "";
|
let activityPubUrl = "";
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,6 @@
|
||||||
|
// biome-ignore lint/correctness/noUndeclaredDependencies: Dependency of @hono/zod-openapi
|
||||||
|
import type { ResponseConfig } from "@asteasolutions/zod-to-openapi";
|
||||||
|
import { z } from "@hono/zod-openapi";
|
||||||
import type { ContentfulStatusCode } from "hono/utils/http-status";
|
import type { ContentfulStatusCode } from "hono/utils/http-status";
|
||||||
import type { JSONObject } from "hono/utils/types";
|
import type { JSONObject } from "hono/utils/types";
|
||||||
|
|
||||||
|
|
@ -9,7 +12,7 @@ import type { JSONObject } from "hono/utils/types";
|
||||||
*/
|
*/
|
||||||
export class ApiError extends Error {
|
export class ApiError extends Error {
|
||||||
/**
|
/**
|
||||||
* @param {StatusCode} status - The status code of the error
|
* @param {ContentfulStatusCode} status - The status code of the error
|
||||||
* @param {string} message - The message of the error
|
* @param {string} message - The message of the error
|
||||||
* @param {string | JSONObject} [details] - The description of the error
|
* @param {string | JSONObject} [details] - The description of the error
|
||||||
*/
|
*/
|
||||||
|
|
@ -21,4 +24,135 @@ export class ApiError extends Error {
|
||||||
super(message);
|
super(message);
|
||||||
this.name = "ApiError";
|
this.name = "ApiError";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static zodSchema = z.object({
|
||||||
|
error: z.string(),
|
||||||
|
details: z.string().or(z.record(z.string(), z.string())).optional(),
|
||||||
|
});
|
||||||
|
|
||||||
|
public get schema(): ResponseConfig {
|
||||||
|
return {
|
||||||
|
description: this.message,
|
||||||
|
content: {
|
||||||
|
"application/json": {
|
||||||
|
schema: ApiError.zodSchema,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public static missingAuthentication(): ApiError {
|
||||||
|
return new ApiError(
|
||||||
|
401,
|
||||||
|
"Missing authentication",
|
||||||
|
"The Authorization header is missing or could not be parsed.",
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static forbidden(): ApiError {
|
||||||
|
return new ApiError(
|
||||||
|
403,
|
||||||
|
"Missing permissions",
|
||||||
|
"You do not have permission to access or modify this resource.",
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static notFound(): ApiError {
|
||||||
|
return new ApiError(
|
||||||
|
404,
|
||||||
|
"Not found",
|
||||||
|
"The requested resource could not be found.",
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static noteNotFound(): ApiError {
|
||||||
|
return new ApiError(
|
||||||
|
404,
|
||||||
|
"Note not found",
|
||||||
|
"The requested note could not be found.",
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static accountNotFound(): ApiError {
|
||||||
|
return new ApiError(
|
||||||
|
404,
|
||||||
|
"Account not found",
|
||||||
|
"The requested account could not be found.",
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static roleNotFound(): ApiError {
|
||||||
|
return new ApiError(
|
||||||
|
404,
|
||||||
|
"Role not found",
|
||||||
|
"The requested role could not be found.",
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static instanceNotFound(): ApiError {
|
||||||
|
return new ApiError(
|
||||||
|
404,
|
||||||
|
"Instance not found",
|
||||||
|
"The requested instance could not be found.",
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static pushSubscriptionNotFound(): ApiError {
|
||||||
|
return new ApiError(
|
||||||
|
404,
|
||||||
|
"Push subscription not found",
|
||||||
|
"No push subscription associated with this access token",
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static tokenNotFound(): ApiError {
|
||||||
|
return new ApiError(
|
||||||
|
404,
|
||||||
|
"Token not found",
|
||||||
|
"The requested token could not be found.",
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static mediaNotFound(): ApiError {
|
||||||
|
return new ApiError(
|
||||||
|
404,
|
||||||
|
"Media not found",
|
||||||
|
"The requested media could not be found.",
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static applicationNotFound(): ApiError {
|
||||||
|
return new ApiError(
|
||||||
|
404,
|
||||||
|
"Application not found",
|
||||||
|
"The requested application could not be found.",
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static emojiNotFound(): ApiError {
|
||||||
|
return new ApiError(
|
||||||
|
404,
|
||||||
|
"Emoji not found",
|
||||||
|
"The requested emoji could not be found.",
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static notificationNotFound(): ApiError {
|
||||||
|
return new ApiError(
|
||||||
|
404,
|
||||||
|
"Notification not found",
|
||||||
|
"The requested notification could not be found.",
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static validationFailed(): ApiError {
|
||||||
|
return new ApiError(422, "Invalid values in request");
|
||||||
|
}
|
||||||
|
|
||||||
|
public static internalServerError(): ApiError {
|
||||||
|
return new ApiError(
|
||||||
|
500,
|
||||||
|
"Internal server error. This is likely a bug.",
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -55,6 +55,7 @@ export const Notification = z
|
||||||
event: z.undefined().openapi({
|
event: z.undefined().openapi({
|
||||||
description:
|
description:
|
||||||
"Versia Server does not sever relationships, so this field is always empty.",
|
"Versia Server does not sever relationships, so this field is always empty.",
|
||||||
|
type: "null",
|
||||||
}),
|
}),
|
||||||
moderation_warning: AccountWarning.optional().openapi({
|
moderation_warning: AccountWarning.optional().openapi({
|
||||||
description:
|
description:
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,6 @@ import { type SQL, eq } from "@versia/kit/drizzle";
|
||||||
import { OpenIdAccounts } from "@versia/kit/tables";
|
import { OpenIdAccounts } from "@versia/kit/tables";
|
||||||
import { ApiError } from "~/classes/errors/api-error";
|
import { ApiError } from "~/classes/errors/api-error";
|
||||||
import type { PluginType } from "~/plugins/openid";
|
import type { PluginType } from "~/plugins/openid";
|
||||||
import { ErrorSchema } from "~/types/api";
|
|
||||||
|
|
||||||
export default (plugin: PluginType): void => {
|
export default (plugin: PluginType): void => {
|
||||||
plugin.registerRoute("/api/v1/sso", (app) => {
|
plugin.registerRoute("/api/v1/sso", (app) => {
|
||||||
|
|
@ -41,14 +40,7 @@ export default (plugin: PluginType): void => {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
404: {
|
404: ApiError.accountNotFound().schema,
|
||||||
description: "Account not found",
|
|
||||||
content: {
|
|
||||||
"application/json": {
|
|
||||||
schema: ErrorSchema,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
}),
|
}),
|
||||||
async (context) => {
|
async (context) => {
|
||||||
|
|
@ -121,7 +113,7 @@ export default (plugin: PluginType): void => {
|
||||||
description: "Account not found",
|
description: "Account not found",
|
||||||
content: {
|
content: {
|
||||||
"application/json": {
|
"application/json": {
|
||||||
schema: ErrorSchema,
|
schema: ApiError.zodSchema,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,7 @@ import {
|
||||||
calculatePKCECodeChallenge,
|
calculatePKCECodeChallenge,
|
||||||
generateRandomCodeVerifier,
|
generateRandomCodeVerifier,
|
||||||
} from "oauth4webapi";
|
} from "oauth4webapi";
|
||||||
import { ErrorSchema } from "~/types/api";
|
import { ApiError } from "~/classes/errors/api-error.ts";
|
||||||
import type { PluginType } from "../../index.ts";
|
import type { PluginType } from "../../index.ts";
|
||||||
import { oauthDiscoveryRequest, oauthRedirectUri } from "../../utils.ts";
|
import { oauthDiscoveryRequest, oauthRedirectUri } from "../../utils.ts";
|
||||||
|
|
||||||
|
|
@ -91,7 +91,7 @@ export default (plugin: PluginType): void => {
|
||||||
description: "Issuer not found",
|
description: "Issuer not found",
|
||||||
content: {
|
content: {
|
||||||
"application/json": {
|
"application/json": {
|
||||||
schema: ErrorSchema,
|
schema: ApiError.zodSchema,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
import type { OpenAPIHono } from "@hono/zod-openapi";
|
import type { OpenAPIHono } from "@hono/zod-openapi";
|
||||||
import { z } from "@hono/zod-openapi";
|
import type { z } from "@hono/zod-openapi";
|
||||||
import type {
|
import type {
|
||||||
Delete,
|
Delete,
|
||||||
Follow,
|
Follow,
|
||||||
|
|
@ -18,10 +18,6 @@ import type { AuthData } from "~/classes/functions/user";
|
||||||
|
|
||||||
export type HttpVerb = "GET" | "POST" | "PUT" | "DELETE" | "PATCH" | "OPTIONS";
|
export type HttpVerb = "GET" | "POST" | "PUT" | "DELETE" | "PATCH" | "OPTIONS";
|
||||||
|
|
||||||
export const ErrorSchema = z.object({
|
|
||||||
error: z.string(),
|
|
||||||
});
|
|
||||||
|
|
||||||
export type HonoEnv = {
|
export type HonoEnv = {
|
||||||
Variables: {
|
Variables: {
|
||||||
config: z.infer<typeof ConfigSchema>;
|
config: z.infer<typeof ConfigSchema>;
|
||||||
|
|
|
||||||
42
utils/api.ts
42
utils/api.ts
|
|
@ -30,43 +30,7 @@ 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";
|
||||||
import { config } from "~/config.ts";
|
import { config } from "~/config.ts";
|
||||||
import { ErrorSchema, type HonoEnv } from "~/types/api";
|
import type { HonoEnv } from "~/types/api";
|
||||||
|
|
||||||
export const reusedResponses = {
|
|
||||||
401: {
|
|
||||||
description: "Invalid or missing Authorization header.",
|
|
||||||
content: {
|
|
||||||
"application/json": {
|
|
||||||
schema: ErrorSchema,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
422: {
|
|
||||||
description: "Invalid values in request",
|
|
||||||
content: {
|
|
||||||
"application/json": {
|
|
||||||
schema: ErrorSchema,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
export const accountNotFound = {
|
|
||||||
description: "Account does not exist",
|
|
||||||
content: {
|
|
||||||
"application/json": {
|
|
||||||
schema: ErrorSchema,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
};
|
|
||||||
export const noteNotFound = {
|
|
||||||
description: "Status does not exist",
|
|
||||||
content: {
|
|
||||||
"application/json": {
|
|
||||||
schema: ErrorSchema,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
export const apiRoute = (fn: (app: OpenAPIHono<HonoEnv>) => void): typeof fn =>
|
export const apiRoute = (fn: (app: OpenAPIHono<HonoEnv>) => void): typeof fn =>
|
||||||
fn;
|
fn;
|
||||||
|
|
@ -362,7 +326,7 @@ export const withNoteParam = every(
|
||||||
const note = await Note.fromId(id, user?.id);
|
const note = await Note.fromId(id, user?.id);
|
||||||
|
|
||||||
if (!(note && (await note.isViewableByUser(user)))) {
|
if (!(note && (await note.isViewableByUser(user)))) {
|
||||||
throw new ApiError(404, "Note not found");
|
throw ApiError.noteNotFound();
|
||||||
}
|
}
|
||||||
|
|
||||||
context.set("note", note);
|
context.set("note", note);
|
||||||
|
|
@ -435,7 +399,7 @@ export const withEmojiParam = every(
|
||||||
const emoji = await Emoji.fromId(id);
|
const emoji = await Emoji.fromId(id);
|
||||||
|
|
||||||
if (!emoji) {
|
if (!emoji) {
|
||||||
throw new ApiError(404, "Emoji not found");
|
throw ApiError.emojiNotFound();
|
||||||
}
|
}
|
||||||
|
|
||||||
context.set("emoji", emoji);
|
context.set("emoji", emoji);
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue