refactor(api): 🔥 Remove all useless route metadata objects

This commit is contained in:
Jesse Wierzbinski 2024-12-30 20:18:48 +01:00
parent a9ea5eb672
commit 4926d6ff5d
No known key found for this signature in database
137 changed files with 410 additions and 1830 deletions

View file

@ -3,7 +3,6 @@ import { randomString } from "@/math";
import { Application } from "@versia/kit/db";
import { config } from "~/packages/config-manager";
import { fakeRequest, getTestUsers } from "~/tests/utils";
import { meta } from "./index.ts";
const { users, deleteUsers, passwords } = await getTestUsers(1);
@ -22,7 +21,7 @@ afterAll(async () => {
});
// /api/auth/login
describe(meta.route, () => {
describe("/api/auth/login", () => {
test("should get a JWT with email", async () => {
const formData = new FormData();

View file

@ -1,4 +1,4 @@
import { apiRoute, applyConfig } from "@/api";
import { apiRoute } from "@/api";
import { createRoute } from "@hono/zod-openapi";
import { Application, User } from "@versia/kit/db";
import { Users } from "@versia/kit/tables";
@ -10,17 +10,6 @@ import { z } from "zod";
import { ApiError } from "~/classes/errors/api-error";
import { config } from "~/packages/config-manager";
export const meta = applyConfig({
ratelimits: {
max: 4,
duration: 60,
},
route: "/api/auth/login",
auth: {
required: false,
},
});
export const schemas = {
form: z.object({
identifier: z

View file

@ -1,4 +1,4 @@
import { apiRoute, applyConfig } from "@/api";
import { apiRoute } from "@/api";
import { createRoute } from "@hono/zod-openapi";
import { db } from "@versia/kit/db";
import { Applications, Tokens } from "@versia/kit/tables";
@ -6,17 +6,6 @@ import { and, eq } from "drizzle-orm";
import { z } from "zod";
import { config } from "~/packages/config-manager";
export const meta = applyConfig({
ratelimits: {
max: 4,
duration: 60,
},
route: "/api/auth/redirect",
auth: {
required: false,
},
});
export const schemas = {
query: z.object({
redirect_uri: z.string().url(),

View file

@ -3,7 +3,6 @@ import { randomString } from "@/math";
import { Application } from "@versia/kit/db";
import { config } from "~/packages/config-manager";
import { fakeRequest, getTestUsers } from "~/tests/utils";
import { meta } from "./index.ts";
const { users, deleteUsers, passwords } = await getTestUsers(1);
const token = randomString(32, "hex");
@ -24,7 +23,7 @@ afterAll(async () => {
});
// /api/auth/reset
describe(meta.route, () => {
describe("/api/auth/reset", () => {
test("should login with normal password", async () => {
const formData = new FormData();

View file

@ -1,4 +1,4 @@
import { apiRoute, applyConfig } from "@/api";
import { apiRoute } from "@/api";
import { createRoute } from "@hono/zod-openapi";
import { User } from "@versia/kit/db";
import { Users } from "@versia/kit/tables";
@ -7,17 +7,6 @@ import type { Context } from "hono";
import { z } from "zod";
import { config } from "~/packages/config-manager";
export const meta = applyConfig({
ratelimits: {
max: 4,
duration: 60,
},
route: "/api/auth/reset",
auth: {
required: false,
},
});
export const schemas = {
form: z.object({
token: z.string().min(1),

View file

@ -1,7 +1,6 @@
import { afterAll, describe, expect, test } from "bun:test";
import type { Relationship as ApiRelationship } from "@versia/client/types";
import { fakeRequest, getTestUsers } from "~/tests/utils";
import { meta } from "./block.ts";
const { users, tokens, deleteUsers } = await getTestUsers(2);
@ -10,10 +9,10 @@ afterAll(async () => {
});
// /api/v1/accounts/:id/block
describe(meta.route, () => {
describe("/api/v1/accounts/:id/block", () => {
test("should return 401 if not authenticated", async () => {
const response = await fakeRequest(
meta.route.replace(":id", users[1].id),
`/api/v1/accounts/${users[1].id}/block`,
{
method: "POST",
},
@ -23,7 +22,7 @@ describe(meta.route, () => {
test("should return 404 if user not found", async () => {
const response = await fakeRequest(
meta.route.replace(":id", "00000000-0000-0000-0000-000000000000"),
"/api/v1/accounts/00000000-0000-0000-0000-000000000000/block",
{
method: "POST",
headers: {
@ -36,7 +35,7 @@ describe(meta.route, () => {
test("should block user", async () => {
const response = await fakeRequest(
meta.route.replace(":id", users[1].id),
`/api/v1/accounts/${users[1].id}/block`,
{
method: "POST",
headers: {
@ -52,7 +51,7 @@ describe(meta.route, () => {
test("should return 200 if user already blocked", async () => {
const response = await fakeRequest(
meta.route.replace(":id", users[1].id),
`/api/v1/accounts/${users[1].id}/block`,
{
method: "POST",
headers: {

View file

@ -1,4 +1,4 @@
import { apiRoute, applyConfig, auth } from "@/api";
import { apiRoute, auth } from "@/api";
import { createRoute } from "@hono/zod-openapi";
import { Relationship, User } from "@versia/kit/db";
import { RolePermissions } from "@versia/kit/tables";
@ -6,24 +6,6 @@ import { z } from "zod";
import { ApiError } from "~/classes/errors/api-error";
import { ErrorSchema } from "~/types/api";
export const meta = applyConfig({
ratelimits: {
max: 30,
duration: 60,
},
route: "/api/v1/accounts/:id/block",
auth: {
required: true,
oauthPermissions: ["write:blocks"],
},
permissions: {
required: [
RolePermissions.ManageOwnBlocks,
RolePermissions.ViewAccounts,
],
},
});
export const schemas = {
param: z.object({
id: z.string().uuid(),

View file

@ -1,7 +1,6 @@
import { afterAll, describe, expect, test } from "bun:test";
import type { Relationship as ApiRelationship } from "@versia/client/types";
import { fakeRequest, getTestUsers } from "~/tests/utils";
import { meta } from "./follow.ts";
const { users, tokens, deleteUsers } = await getTestUsers(2);
@ -10,10 +9,10 @@ afterAll(async () => {
});
// /api/v1/accounts/:id/follow
describe(meta.route, () => {
describe("/api/v1/accounts/:id/follow", () => {
test("should return 401 if not authenticated", async () => {
const response = await fakeRequest(
meta.route.replace(":id", users[1].id),
`/api/v1/accounts/${users[1].id}/follow`,
{
method: "POST",
headers: {
@ -27,7 +26,7 @@ describe(meta.route, () => {
test("should return 404 if user not found", async () => {
const response = await fakeRequest(
meta.route.replace(":id", "00000000-0000-0000-0000-000000000000"),
"/api/v1/accounts/00000000-0000-0000-0000-000000000000/follow",
{
method: "POST",
headers: {
@ -42,7 +41,7 @@ describe(meta.route, () => {
test("should follow user", async () => {
const response = await fakeRequest(
meta.route.replace(":id", users[1].id),
`/api/v1/accounts/${users[1].id}/follow`,
{
method: "POST",
headers: {
@ -60,7 +59,7 @@ describe(meta.route, () => {
test("should return 200 if user already followed", async () => {
const response = await fakeRequest(
meta.route.replace(":id", users[1].id),
`/api/v1/accounts/${users[1].id}/follow`,
{
method: "POST",
headers: {

View file

@ -1,4 +1,4 @@
import { apiRoute, applyConfig, auth } from "@/api";
import { apiRoute, auth } from "@/api";
import { createRoute } from "@hono/zod-openapi";
import { Relationship, User } from "@versia/kit/db";
import { RolePermissions } from "@versia/kit/tables";
@ -7,24 +7,6 @@ import { z } from "zod";
import { ApiError } from "~/classes/errors/api-error";
import { ErrorSchema } from "~/types/api";
export const meta = applyConfig({
ratelimits: {
max: 30,
duration: 60,
},
route: "/api/v1/accounts/:id/follow",
auth: {
required: true,
oauthPermissions: ["write:follows"],
},
permissions: {
required: [
RolePermissions.ManageOwnFollows,
RolePermissions.ViewAccounts,
],
},
});
export const schemas = {
param: z.object({
id: z.string().uuid(),

View file

@ -1,7 +1,6 @@
import { afterAll, beforeAll, describe, expect, test } from "bun:test";
import type { Account as ApiAccount } from "@versia/client/types";
import { fakeRequest, getTestUsers } from "~/tests/utils";
import { meta } from "./followers.ts";
const { users, tokens, deleteUsers } = await getTestUsers(5);
@ -27,10 +26,10 @@ beforeAll(async () => {
});
// /api/v1/accounts/:id/followers
describe(meta.route, () => {
describe("/api/v1/accounts/:id/followers", () => {
test("should return 200 with followers", async () => {
const response = await fakeRequest(
meta.route.replace(":id", users[1].id),
`/api/v1/accounts/${users[1].id}/followers`,
{
headers: {
Authorization: `Bearer ${tokens[0].data.accessToken}`,
@ -62,7 +61,7 @@ describe(meta.route, () => {
expect(response.status).toBe(200);
const response2 = await fakeRequest(
meta.route.replace(":id", users[1].id),
`/api/v1/accounts/${users[1].id}/followers`,
{
headers: {
Authorization: `Bearer ${tokens[0].data.accessToken}`,

View file

@ -1,4 +1,4 @@
import { apiRoute, applyConfig, auth, idValidator } from "@/api";
import { apiRoute, auth, idValidator } from "@/api";
import { createRoute } from "@hono/zod-openapi";
import { Timeline, User } from "@versia/kit/db";
import { RolePermissions, Users } from "@versia/kit/tables";
@ -7,24 +7,6 @@ import { z } from "zod";
import { ApiError } from "~/classes/errors/api-error";
import { ErrorSchema } from "~/types/api";
export const meta = applyConfig({
ratelimits: {
max: 60,
duration: 60,
},
route: "/api/v1/accounts/:id/followers",
auth: {
required: false,
oauthPermissions: ["read:accounts"],
},
permissions: {
required: [
RolePermissions.ViewAccountFollows,
RolePermissions.ViewAccounts,
],
},
});
export const schemas = {
query: z.object({
max_id: z.string().regex(idValidator).optional(),

View file

@ -1,7 +1,6 @@
import { afterAll, beforeAll, describe, expect, test } from "bun:test";
import type { Account as ApiAccount } from "@versia/client/types";
import { fakeRequest, getTestUsers } from "~/tests/utils";
import { meta } from "./following.ts";
const { users, tokens, deleteUsers } = await getTestUsers(5);
@ -27,10 +26,10 @@ beforeAll(async () => {
});
// /api/v1/accounts/:id/following
describe(meta.route, () => {
describe("/api/v1/accounts/:id/following", () => {
test("should return 200 with following", async () => {
const response = await fakeRequest(
meta.route.replace(":id", users[0].id),
`/api/v1/accounts/${users[0].id}/following`,
{
headers: {
Authorization: `Bearer ${tokens[1].data.accessToken}`,
@ -62,7 +61,7 @@ describe(meta.route, () => {
expect(response.status).toBe(200);
const response2 = await fakeRequest(
meta.route.replace(":id", users[0].id),
`/api/v1/accounts/${users[0].id}/following`,
{
headers: {
Authorization: `Bearer ${tokens[1].data.accessToken}`,

View file

@ -1,4 +1,4 @@
import { apiRoute, applyConfig, auth, idValidator } from "@/api";
import { apiRoute, auth, idValidator } from "@/api";
import { createRoute } from "@hono/zod-openapi";
import { Timeline, User } from "@versia/kit/db";
import { RolePermissions, Users } from "@versia/kit/tables";
@ -7,24 +7,6 @@ import { z } from "zod";
import { ApiError } from "~/classes/errors/api-error";
import { ErrorSchema } from "~/types/api";
export const meta = applyConfig({
ratelimits: {
max: 60,
duration: 60,
},
route: "/api/v1/accounts/:id/following",
auth: {
required: false,
oauthPermissions: ["read:accounts"],
},
permissions: {
required: [
RolePermissions.ViewAccountFollows,
RolePermissions.ViewAccounts,
],
},
});
export const schemas = {
query: z.object({
max_id: z.string().regex(idValidator).optional(),

View file

@ -1,7 +1,6 @@
import { afterAll, beforeAll, describe, expect, test } from "bun:test";
import type { Account as ApiAccount } from "@versia/client/types";
import { fakeRequest, getTestStatuses, getTestUsers } from "~/tests/utils";
import { meta } from "./index.ts";
const { users, tokens, deleteUsers } = await getTestUsers(5);
const timeline = (await getTestStatuses(40, users[0])).toReversed();
@ -24,18 +23,14 @@ beforeAll(async () => {
});
// /api/v1/accounts/:id
describe(meta.route, () => {
describe("/api/v1/accounts/:id", () => {
test("should return 404 if ID is invalid", async () => {
const response = await fakeRequest(
meta.route.replace(":id", "invalid"),
);
const response = await fakeRequest("/api/v1/accounts/invalid-id");
expect(response.status).toBe(422);
});
test("should return user", async () => {
const response = await fakeRequest(
meta.route.replace(":id", users[0].id),
);
const response = await fakeRequest(`/api/v1/accounts/${users[0].id}`);
expect(response.status).toBe(200);

View file

@ -1,4 +1,4 @@
import { apiRoute, applyConfig, auth } from "@/api";
import { apiRoute, auth } from "@/api";
import { createRoute } from "@hono/zod-openapi";
import { User } from "@versia/kit/db";
import { RolePermissions } from "@versia/kit/tables";
@ -6,21 +6,6 @@ import { z } from "zod";
import { ApiError } from "~/classes/errors/api-error";
import { ErrorSchema } from "~/types/api";
export const meta = applyConfig({
ratelimits: {
max: 30,
duration: 60,
},
route: "/api/v1/accounts/:id",
auth: {
required: false,
oauthPermissions: [],
},
permissions: {
required: [RolePermissions.ViewAccounts],
},
});
export const schemas = {
param: z.object({
id: z.string().uuid(),

View file

@ -1,7 +1,6 @@
import { afterAll, describe, expect, test } from "bun:test";
import type { Relationship as ApiRelationship } from "@versia/client/types";
import { fakeRequest, getTestUsers } from "~/tests/utils";
import { meta } from "./mute.ts";
const { users, tokens, deleteUsers } = await getTestUsers(2);
@ -10,10 +9,10 @@ afterAll(async () => {
});
// /api/v1/accounts/:id/mute
describe(meta.route, () => {
describe("/api/v1/accounts/:id/mute", () => {
test("should return 401 if not authenticated", async () => {
const response = await fakeRequest(
meta.route.replace(":id", users[1].id),
`/api/v1/accounts/${users[1].id}/mute`,
{
method: "POST",
headers: {
@ -27,7 +26,7 @@ describe(meta.route, () => {
test("should return 404 if user not found", async () => {
const response = await fakeRequest(
meta.route.replace(":id", "00000000-0000-0000-0000-000000000000"),
"/api/v1/accounts/00000000-0000-0000-0000-000000000000/mute",
{
method: "POST",
headers: {
@ -42,7 +41,7 @@ describe(meta.route, () => {
test("should mute user", async () => {
const response = await fakeRequest(
meta.route.replace(":id", users[1].id),
`/api/v1/accounts/${users[1].id}/mute`,
{
method: "POST",
headers: {
@ -60,7 +59,7 @@ describe(meta.route, () => {
test("should return 200 if user already muted", async () => {
const response = await fakeRequest(
meta.route.replace(":id", users[1].id),
`/api/v1/accounts/${users[1].id}/mute`,
{
method: "POST",
headers: {

View file

@ -1,4 +1,4 @@
import { apiRoute, applyConfig, auth } from "@/api";
import { apiRoute, auth } from "@/api";
import { createRoute } from "@hono/zod-openapi";
import { Relationship, User } from "@versia/kit/db";
import { RolePermissions } from "@versia/kit/tables";
@ -6,24 +6,6 @@ import { z } from "zod";
import { ApiError } from "~/classes/errors/api-error";
import { ErrorSchema } from "~/types/api";
export const meta = applyConfig({
ratelimits: {
max: 30,
duration: 60,
},
route: "/api/v1/accounts/:id/mute",
auth: {
required: true,
oauthPermissions: ["write:mutes"],
},
permissions: {
required: [
RolePermissions.ManageOwnMutes,
RolePermissions.ViewAccounts,
],
},
});
export const schemas = {
param: z.object({
id: z.string().uuid(),

View file

@ -1,4 +1,4 @@
import { apiRoute, applyConfig, auth } from "@/api";
import { apiRoute, auth } from "@/api";
import { createRoute } from "@hono/zod-openapi";
import { Relationship, User } from "@versia/kit/db";
import { RolePermissions } from "@versia/kit/tables";
@ -6,24 +6,6 @@ import { z } from "zod";
import { ApiError } from "~/classes/errors/api-error";
import { ErrorSchema } from "~/types/api";
export const meta = applyConfig({
ratelimits: {
max: 30,
duration: 60,
},
route: "/api/v1/accounts/:id/note",
auth: {
required: true,
oauthPermissions: ["write:accounts"],
},
permissions: {
required: [
RolePermissions.ManageOwnAccount,
RolePermissions.ViewAccounts,
],
},
});
export const schemas = {
param: z.object({
id: z.string().uuid(),

View file

@ -1,4 +1,4 @@
import { apiRoute, applyConfig, auth } from "@/api";
import { apiRoute, auth } from "@/api";
import { createRoute } from "@hono/zod-openapi";
import { Relationship, User } from "@versia/kit/db";
import { RolePermissions } from "@versia/kit/tables";
@ -6,24 +6,6 @@ import { z } from "zod";
import { ApiError } from "~/classes/errors/api-error";
import { ErrorSchema } from "~/types/api";
export const meta = applyConfig({
ratelimits: {
max: 30,
duration: 60,
},
route: "/api/v1/accounts/:id/pin",
auth: {
required: true,
oauthPermissions: ["write:accounts"],
},
permissions: {
required: [
RolePermissions.ManageOwnAccount,
RolePermissions.ViewAccounts,
],
},
});
export const schemas = {
param: z.object({
id: z.string().uuid(),

View file

@ -1,4 +1,4 @@
import { apiRoute, applyConfig, auth } from "@/api";
import { apiRoute, auth } from "@/api";
import { createRoute } from "@hono/zod-openapi";
import { User } from "@versia/kit/db";
import { RolePermissions } from "@versia/kit/tables";
@ -6,21 +6,6 @@ import { z } from "zod";
import { ApiError } from "~/classes/errors/api-error";
import { ErrorSchema } from "~/types/api";
export const meta = applyConfig({
ratelimits: {
max: 4,
duration: 60,
},
route: "/api/v1/accounts/:id/refetch",
auth: {
required: true,
oauthPermissions: ["write:accounts"],
},
permissions: {
required: [RolePermissions.ViewAccounts],
},
});
export const schemas = {
param: z.object({
id: z.string().uuid(),

View file

@ -1,4 +1,4 @@
import { apiRoute, applyConfig, auth } from "@/api";
import { apiRoute, auth } from "@/api";
import { createRoute } from "@hono/zod-openapi";
import { Relationship, User } from "@versia/kit/db";
import { RolePermissions } from "@versia/kit/tables";
@ -6,24 +6,6 @@ import { z } from "zod";
import { ApiError } from "~/classes/errors/api-error";
import { ErrorSchema } from "~/types/api";
export const meta = applyConfig({
ratelimits: {
max: 30,
duration: 60,
},
route: "/api/v1/accounts/:id/remove_from_followers",
auth: {
required: true,
oauthPermissions: ["write:follows"],
},
permissions: {
required: [
RolePermissions.ManageOwnFollows,
RolePermissions.ViewAccounts,
],
},
});
export const schemas = {
param: z.object({
id: z.string().uuid(),

View file

@ -1,4 +1,4 @@
import { apiRoute, applyConfig, auth } from "@/api";
import { apiRoute, auth } from "@/api";
import { createRoute } from "@hono/zod-openapi";
import { Role, User } from "@versia/kit/db";
import { RolePermissions } from "@versia/kit/tables";
@ -6,24 +6,6 @@ import { z } from "zod";
import { ApiError } from "~/classes/errors/api-error";
import { ErrorSchema } from "~/types/api";
export const meta = applyConfig({
auth: {
required: true,
},
ratelimits: {
duration: 60,
max: 20,
},
route: "/api/v1/accounts/:id/roles/:role_id",
permissions: {
required: [],
methodOverrides: {
POST: [RolePermissions.ManageRoles],
DELETE: [RolePermissions.ManageRoles],
},
},
});
export const schemas = {
param: z.object({
id: z.string().uuid(),

View file

@ -1,24 +1,10 @@
import { apiRoute, applyConfig, auth } from "@/api";
import { apiRoute, auth } from "@/api";
import { createRoute } from "@hono/zod-openapi";
import { Role, User } from "@versia/kit/db";
import { z } from "zod";
import { ApiError } from "~/classes/errors/api-error";
import { ErrorSchema } from "~/types/api";
export const meta = applyConfig({
auth: {
required: false,
},
ratelimits: {
duration: 60,
max: 20,
},
route: "/api/v1/accounts/:id/roles",
permissions: {
required: [],
},
});
export const schemas = {
param: z.object({
id: z.string().uuid(),

View file

@ -1,7 +1,6 @@
import { afterAll, beforeAll, describe, expect, test } from "bun:test";
import type { Status as ApiStatus } from "@versia/client/types";
import { fakeRequest, getTestStatuses, getTestUsers } from "~/tests/utils.ts";
import { meta } from "./statuses.ts";
const { users, tokens, deleteUsers } = await getTestUsers(5);
const timeline = (await getTestStatuses(40, users[1])).toReversed();
@ -26,11 +25,10 @@ beforeAll(async () => {
});
// /api/v1/accounts/:id/statuses
describe(meta.route, () => {
describe("/api/v1/accounts/:id/statuses", () => {
test("should return 200 with statuses", async () => {
const response = await fakeRequest(
meta.route.replace(":id", users[1].id),
`/api/v1/accounts/${users[1].id}/statuses`,
{
headers: {
Authorization: `Bearer ${tokens[0].data.accessToken}`,
@ -49,8 +47,7 @@ describe(meta.route, () => {
test("should exclude reblogs", async () => {
const response = await fakeRequest(
`${meta.route.replace(":id", users[1].id)}?exclude_reblogs=true`,
`/api/v1/accounts/${users[1].id}/statuses?exclude_reblogs=true`,
{
headers: {
Authorization: `Bearer ${tokens[0].data.accessToken}`,
@ -84,8 +81,7 @@ describe(meta.route, () => {
expect(replyResponse.status).toBe(201);
const response = await fakeRequest(
`${meta.route.replace(":id", users[1].id)}?exclude_replies=true`,
`/api/v1/accounts/${users[1].id}/statuses?exclude_replies=true`,
{
headers: {
Authorization: `Bearer ${tokens[0].data.accessToken}`,
@ -104,8 +100,7 @@ describe(meta.route, () => {
test("should only include pins", async () => {
const response = await fakeRequest(
`${meta.route.replace(":id", users[1].id)}?pinned=true`,
`/api/v1/accounts/${users[1].id}/statuses?pinned=true`,
{
headers: {
Authorization: `Bearer ${tokens[0].data.accessToken}`,
@ -134,8 +129,7 @@ describe(meta.route, () => {
expect(pinResponse.status).toBe(200);
const response2 = await fakeRequest(
`${meta.route.replace(":id", users[1].id)}?pinned=true`,
`/api/v1/accounts/${users[1].id}/statuses?pinned=true`,
{
headers: {
Authorization: `Bearer ${tokens[0].data.accessToken}`,

View file

@ -1,4 +1,4 @@
import { apiRoute, applyConfig, auth, idValidator } from "@/api";
import { apiRoute, auth, idValidator } from "@/api";
import { createRoute } from "@hono/zod-openapi";
import { Note, Timeline, User } from "@versia/kit/db";
import { Notes, RolePermissions } from "@versia/kit/tables";
@ -7,21 +7,6 @@ import { z } from "zod";
import { ApiError } from "~/classes/errors/api-error";
import { ErrorSchema } from "~/types/api";
export const meta = applyConfig({
ratelimits: {
max: 30,
duration: 60,
},
route: "/api/v1/accounts/:id/statuses",
auth: {
required: false,
oauthPermissions: ["read:statuses"],
},
permissions: {
required: [RolePermissions.ViewNotes, RolePermissions.ViewAccounts],
},
});
export const schemas = {
param: z.object({
id: z.string().uuid(),

View file

@ -1,4 +1,4 @@
import { apiRoute, applyConfig, auth } from "@/api";
import { apiRoute, auth } from "@/api";
import { createRoute } from "@hono/zod-openapi";
import { Relationship, User } from "@versia/kit/db";
import { RolePermissions } from "@versia/kit/tables";
@ -6,24 +6,6 @@ import { z } from "zod";
import { ApiError } from "~/classes/errors/api-error";
import { ErrorSchema } from "~/types/api";
export const meta = applyConfig({
ratelimits: {
max: 30,
duration: 60,
},
route: "/api/v1/accounts/:id/unblock",
auth: {
required: true,
oauthPermissions: ["write:blocks"],
},
permissions: {
required: [
RolePermissions.ManageOwnBlocks,
RolePermissions.ViewAccounts,
],
},
});
export const schemas = {
param: z.object({
id: z.string().uuid(),

View file

@ -1,4 +1,4 @@
import { apiRoute, applyConfig, auth } from "@/api";
import { apiRoute, auth } from "@/api";
import { createRoute } from "@hono/zod-openapi";
import { Relationship, User } from "@versia/kit/db";
import { RolePermissions } from "@versia/kit/tables";
@ -6,24 +6,6 @@ import { z } from "zod";
import { ApiError } from "~/classes/errors/api-error";
import { ErrorSchema } from "~/types/api";
export const meta = applyConfig({
ratelimits: {
max: 30,
duration: 60,
},
route: "/api/v1/accounts/:id/unfollow",
auth: {
required: true,
oauthPermissions: ["write:follows"],
},
permissions: {
required: [
RolePermissions.ManageOwnFollows,
RolePermissions.ViewAccounts,
],
},
});
export const schemas = {
param: z.object({
id: z.string().uuid(),

View file

@ -1,7 +1,6 @@
import { afterAll, beforeAll, describe, expect, test } from "bun:test";
import type { Relationship as ApiRelationship } from "@versia/client/types";
import { fakeRequest, getTestUsers } from "~/tests/utils";
import { meta } from "./unmute.ts";
const { users, tokens, deleteUsers } = await getTestUsers(2);
@ -19,10 +18,10 @@ beforeAll(async () => {
});
// /api/v1/accounts/:id/unmute
describe(meta.route, () => {
describe("/api/v1/accounts/:id/unmute", () => {
test("should return 401 if not authenticated", async () => {
const response = await fakeRequest(
meta.route.replace(":id", users[1].id),
`/api/v1/accounts/${users[1].id}/unmute`,
{
method: "POST",
},
@ -32,7 +31,7 @@ describe(meta.route, () => {
test("should return 404 if user not found", async () => {
const response = await fakeRequest(
meta.route.replace(":id", "00000000-0000-0000-0000-000000000000"),
"/api/v1/accounts/00000000-0000-0000-0000-000000000000/unmute",
{
method: "POST",
headers: {
@ -45,7 +44,7 @@ describe(meta.route, () => {
test("should unmute user", async () => {
const response = await fakeRequest(
meta.route.replace(":id", users[1].id),
`/api/v1/accounts/${users[1].id}/unmute`,
{
method: "POST",
headers: {
@ -61,7 +60,7 @@ describe(meta.route, () => {
test("should return 200 if user already unmuted", async () => {
const response = await fakeRequest(
meta.route.replace(":id", users[1].id),
`/api/v1/accounts/${users[1].id}/unmute`,
{
method: "POST",
headers: {

View file

@ -1,4 +1,4 @@
import { apiRoute, applyConfig, auth } from "@/api";
import { apiRoute, auth } from "@/api";
import { createRoute } from "@hono/zod-openapi";
import { Relationship, User } from "@versia/kit/db";
import { RolePermissions } from "@versia/kit/tables";
@ -6,24 +6,6 @@ import { z } from "zod";
import { ApiError } from "~/classes/errors/api-error";
import { ErrorSchema } from "~/types/api";
export const meta = applyConfig({
ratelimits: {
max: 30,
duration: 60,
},
route: "/api/v1/accounts/:id/unmute",
auth: {
required: true,
oauthPermissions: ["write:mutes"],
},
permissions: {
required: [
RolePermissions.ManageOwnMutes,
RolePermissions.ViewAccounts,
],
},
});
export const schemas = {
param: z.object({
id: z.string().uuid(),

View file

@ -1,4 +1,4 @@
import { apiRoute, applyConfig, auth } from "@/api";
import { apiRoute, auth } from "@/api";
import { createRoute } from "@hono/zod-openapi";
import { Relationship, User } from "@versia/kit/db";
import { RolePermissions } from "@versia/kit/tables";
@ -6,24 +6,6 @@ import { z } from "zod";
import { ApiError } from "~/classes/errors/api-error";
import { ErrorSchema } from "~/types/api";
export const meta = applyConfig({
ratelimits: {
max: 30,
duration: 60,
},
route: "/api/v1/accounts/:id/unpin",
auth: {
required: true,
oauthPermissions: ["write:accounts"],
},
permissions: {
required: [
RolePermissions.ManageOwnAccount,
RolePermissions.ViewAccounts,
],
},
});
export const schemas = {
param: z.object({
id: z.string().uuid(),

View file

@ -1,6 +1,5 @@
import { afterAll, beforeAll, describe, expect, test } from "bun:test";
import { fakeRequest, getTestUsers } from "~/tests/utils.ts";
import { meta } from "./index.ts";
const { users, tokens, deleteUsers } = await getTestUsers(5);
@ -83,13 +82,16 @@ afterAll(async () => {
await deleteUsers();
});
describe(meta.route, () => {
describe("/api/v1/accounts/familiar_followers", () => {
test("should return 0 familiar followers", async () => {
const response = await fakeRequest(`${meta.route}?id=${users[4].id}`, {
headers: {
Authorization: `Bearer ${tokens[0].data.accessToken}`,
const response = await fakeRequest(
`/api/v1/accounts/familiar_followers?id=${users[4].id}`,
{
headers: {
Authorization: `Bearer ${tokens[0].data.accessToken}`,
},
},
});
);
expect(response.status).toBe(200);
@ -100,11 +102,14 @@ describe(meta.route, () => {
});
test("should return 1 familiar follower", async () => {
const response = await fakeRequest(`${meta.route}?id=${users[2].id}`, {
headers: {
Authorization: `Bearer ${tokens[0].data.accessToken}`,
const response = await fakeRequest(
`/api/v1/accounts/familiar_followers?id=${users[2].id}`,
{
headers: {
Authorization: `Bearer ${tokens[0].data.accessToken}`,
},
},
});
);
expect(response.status).toBe(200);
@ -115,11 +120,14 @@ describe(meta.route, () => {
});
test("should return 2 familiar followers", async () => {
const response = await fakeRequest(`${meta.route}?id=${users[3].id}`, {
headers: {
Authorization: `Bearer ${tokens[0].data.accessToken}`,
const response = await fakeRequest(
`/api/v1/accounts/familiar_followers?id=${users[3].id}`,
{
headers: {
Authorization: `Bearer ${tokens[0].data.accessToken}`,
},
},
});
);
expect(response.status).toBe(200);
@ -133,7 +141,7 @@ describe(meta.route, () => {
test("should work with multiple ids", async () => {
const response = await fakeRequest(
`${meta.route}?id[]=${users[2].id}&id[]=${users[3].id}&id[]=${users[4].id}`,
`/api/v1/accounts/familiar_followers?id[]=${users[2].id}&id[]=${users[3].id}&id[]=${users[4].id}`,
{
headers: {
Authorization: `Bearer ${tokens[0].data.accessToken}`,

View file

@ -1,25 +1,10 @@
import { apiRoute, applyConfig, auth, qsQuery } from "@/api";
import { apiRoute, auth, qsQuery } from "@/api";
import { createRoute } from "@hono/zod-openapi";
import { User, db } from "@versia/kit/db";
import { RolePermissions, type Users } from "@versia/kit/tables";
import { type InferSelectModel, sql } from "drizzle-orm";
import { z } from "zod";
export const meta = applyConfig({
route: "/api/v1/accounts/familiar_followers",
ratelimits: {
max: 5,
duration: 60,
},
auth: {
required: true,
oauthPermissions: ["read:follows"],
},
permissions: {
required: [RolePermissions.ManageOwnFollows],
},
});
export const schemas = {
query: z.object({
id: z

View file

@ -1,7 +1,6 @@
import { afterAll, describe, expect, test } from "bun:test";
import type { Account as ApiAccount } from "@versia/client/types";
import { fakeRequest, getTestUsers } from "~/tests/utils";
import { meta } from "./index.ts";
const { users, deleteUsers } = await getTestUsers(5);
@ -10,10 +9,10 @@ afterAll(async () => {
});
// /api/v1/accounts/id
describe(meta.route, () => {
describe("/api/v1/accounts/id", () => {
test("should correctly get user from username", async () => {
const response = await fakeRequest(
`${meta.route}?username=${users[0].data.username}`,
`/api/v1/accounts/id?username=${users[0].data.username}`,
);
expect(response.status).toBe(200);
@ -25,7 +24,7 @@ describe(meta.route, () => {
test("should return 404 for non-existent user", async () => {
const response = await fakeRequest(
`${meta.route}?username=${users[0].data.username}-nonexistent`,
`/api/v1/accounts/id?username=${users[0].data.username}-nonexistent`,
);
expect(response.status).toBe(404);

View file

@ -1,4 +1,4 @@
import { apiRoute, applyConfig, auth } from "@/api";
import { apiRoute, auth } from "@/api";
import { createRoute } from "@hono/zod-openapi";
import { User } from "@versia/kit/db";
import { RolePermissions, Users } from "@versia/kit/tables";
@ -7,21 +7,6 @@ import { z } from "zod";
import { ApiError } from "~/classes/errors/api-error";
import { ErrorSchema } from "~/types/api";
export const meta = applyConfig({
ratelimits: {
max: 30,
duration: 60,
},
route: "/api/v1/accounts/id",
auth: {
required: false,
oauthPermissions: [],
},
permissions: {
required: [RolePermissions.Search],
},
});
export const schemas = {
query: z.object({
username: z.string().min(1).max(512).toLowerCase(),

View file

@ -4,7 +4,6 @@ import { db } from "@versia/kit/db";
import { Users } from "@versia/kit/tables";
import { eq } from "drizzle-orm";
import { fakeRequest, getSolvedChallenge } from "~/tests/utils";
import { meta } from "./index.ts";
const username = randomString(10, "hex");
const username2 = randomString(10, "hex");
@ -15,9 +14,9 @@ afterEach(async () => {
});
// /api/v1/statuses
describe(meta.route, () => {
describe("/api/v1/accounts", () => {
test("should create a new account", async () => {
const response = await fakeRequest(meta.route, {
const response = await fakeRequest("/api/v1/accounts", {
method: "POST",
headers: {
"Content-Type": "application/json",
@ -38,7 +37,7 @@ describe(meta.route, () => {
});
test("should refuse invalid emails", async () => {
const response = await fakeRequest(meta.route, {
const response = await fakeRequest("/api/v1/accounts", {
method: "POST",
headers: {
"Content-Type": "application/json",
@ -58,7 +57,7 @@ describe(meta.route, () => {
});
test("should require a password", async () => {
const response = await fakeRequest(meta.route, {
const response = await fakeRequest("/api/v1/accounts", {
method: "POST",
headers: {
"Content-Type": "application/json",
@ -77,7 +76,7 @@ describe(meta.route, () => {
});
test("should not allow a previously registered email", async () => {
await fakeRequest(meta.route, {
await fakeRequest("/api/v1/accounts", {
method: "POST",
headers: {
"Content-Type": "application/json",
@ -93,7 +92,7 @@ describe(meta.route, () => {
}),
});
const response = await fakeRequest(meta.route, {
const response = await fakeRequest("/api/v1/accounts", {
method: "POST",
headers: {
"Content-Type": "application/json",
@ -113,7 +112,7 @@ describe(meta.route, () => {
});
test("should not allow a previously registered email (case insensitive)", async () => {
await fakeRequest(meta.route, {
await fakeRequest("/api/v1/accounts", {
method: "POST",
headers: {
"Content-Type": "application/json",
@ -129,7 +128,7 @@ describe(meta.route, () => {
}),
});
const response = await fakeRequest(meta.route, {
const response = await fakeRequest("/api/v1/accounts", {
method: "POST",
headers: {
"Content-Type": "application/json",
@ -149,7 +148,7 @@ describe(meta.route, () => {
});
test("should not allow invalid usernames (not a-z_0-9)", async () => {
const response1 = await fakeRequest(meta.route, {
const response1 = await fakeRequest("/api/v1/accounts", {
method: "POST",
headers: {
"Content-Type": "application/json",
@ -167,7 +166,7 @@ describe(meta.route, () => {
expect(response1.status).toBe(422);
const response2 = await fakeRequest(meta.route, {
const response2 = await fakeRequest("/api/v1/accounts", {
method: "POST",
headers: {
"Content-Type": "application/json",
@ -185,7 +184,7 @@ describe(meta.route, () => {
expect(response2.status).toBe(422);
const response3 = await fakeRequest(meta.route, {
const response3 = await fakeRequest("/api/v1/accounts", {
method: "POST",
headers: {
"Content-Type": "application/json",
@ -203,7 +202,7 @@ describe(meta.route, () => {
expect(response3.status).toBe(422);
const response4 = await fakeRequest(meta.route, {
const response4 = await fakeRequest("/api/v1/accounts", {
method: "POST",
headers: {
"Content-Type": "application/json",

View file

@ -1,4 +1,4 @@
import { apiRoute, applyConfig, auth, jsonOrForm } from "@/api";
import { apiRoute, auth, jsonOrForm } from "@/api";
import { tempmailDomains } from "@/tempmail";
import { createRoute } from "@hono/zod-openapi";
import { User } from "@versia/kit/db";
@ -9,21 +9,6 @@ import { z } from "zod";
import { ApiError } from "~/classes/errors/api-error";
import { config } from "~/packages/config-manager";
export const meta = applyConfig({
route: "/api/v1/accounts",
ratelimits: {
max: 2,
duration: 60,
},
auth: {
required: false,
oauthPermissions: ["write:accounts"],
},
challenge: {
required: true,
},
});
export const schemas = {
json: z.object({
username: z.string(),

View file

@ -1,7 +1,6 @@
import { afterAll, describe, expect, test } from "bun:test";
import type { Account as ApiAccount } from "@versia/client/types";
import { fakeRequest, getTestUsers } from "~/tests/utils";
import { meta } from "./index.ts";
const { users, tokens, deleteUsers } = await getTestUsers(5);
@ -10,10 +9,10 @@ afterAll(async () => {
});
// /api/v1/accounts/lookup
describe(meta.route, () => {
describe("/api/v1/accounts/lookup", () => {
test("should return 200 with users", async () => {
const response = await fakeRequest(
`${meta.route}?acct=${users[0].data.username}`,
`/api/v1/accounts/lookup?acct=${users[0].data.username}`,
{
headers: {
Authorization: `Bearer ${tokens[0].data.accessToken}`,
@ -37,7 +36,7 @@ describe(meta.route, () => {
test("should automatically lowercase the acct", async () => {
const response = await fakeRequest(
`${meta.route}?acct=${users[0].data.username.toUpperCase()}`,
`/api/v1/accounts/lookup?acct=${users[0].data.username.toUpperCase()}`,
{
headers: {
Authorization: `Bearer ${tokens[0].data.accessToken}`,

View file

@ -1,4 +1,4 @@
import { apiRoute, applyConfig, auth, parseUserAddress } from "@/api";
import { apiRoute, auth, parseUserAddress } from "@/api";
import { createRoute } from "@hono/zod-openapi";
import { Instance, User } from "@versia/kit/db";
import { RolePermissions, Users } from "@versia/kit/tables";
@ -8,21 +8,6 @@ import { ApiError } from "~/classes/errors/api-error";
import { config } from "~/packages/config-manager";
import { ErrorSchema } from "~/types/api";
export const meta = applyConfig({
ratelimits: {
max: 30,
duration: 60,
},
route: "/api/v1/accounts/lookup",
auth: {
required: false,
oauthPermissions: [],
},
permissions: {
required: [RolePermissions.Search],
},
});
export const schemas = {
query: z.object({
acct: z.string().min(1).max(512).toLowerCase(),

View file

@ -3,7 +3,6 @@ import { db } from "@versia/kit/db";
import { Users } from "@versia/kit/tables";
import { eq } from "drizzle-orm";
import { fakeRequest, getTestUsers } from "~/tests/utils";
import { meta } from "./index.ts";
const { users, tokens, deleteUsers } = await getTestUsers(5);
@ -44,16 +43,18 @@ afterAll(async () => {
});
// /api/v1/accounts/relationships
describe(meta.route, () => {
describe("/api/v1/accounts/relationships", () => {
test("should return 401 if not authenticated", async () => {
const response = await fakeRequest(`${meta.route}?id[]=${users[2].id}`);
const response = await fakeRequest(
`/api/v1/accounts/relationships?id[]=${users[2].id}`,
);
expect(response.status).toBe(401);
});
test("should return relationships", async () => {
const response = await fakeRequest(
`${meta.route}?id[]=${users[2].id}`,
`/api/v1/accounts/relationships?id[]=${users[2].id}`,
{
headers: {
Authorization: `Bearer ${tokens[0].data.accessToken}`,
@ -83,7 +84,7 @@ describe(meta.route, () => {
test("should be requested_by user1", async () => {
const response = await fakeRequest(
`${meta.route}?id[]=${users[1].id}`,
`/api/v1/accounts/relationships?id[]=${users[1].id}`,
{
headers: {
Authorization: `Bearer ${tokens[0].data.accessToken}`,

View file

@ -1,24 +1,9 @@
import { apiRoute, applyConfig, auth, qsQuery } from "@/api";
import { apiRoute, auth, qsQuery } from "@/api";
import { createRoute } from "@hono/zod-openapi";
import { Relationship } from "@versia/kit/db";
import { RolePermissions } from "@versia/kit/tables";
import { z } from "zod";
export const meta = applyConfig({
route: "/api/v1/accounts/relationships",
ratelimits: {
max: 30,
duration: 60,
},
auth: {
required: true,
oauthPermissions: ["read:follows"],
},
permissions: {
required: [RolePermissions.ManageOwnFollows],
},
});
export const schemas = {
query: z.object({
id: z.array(z.string().uuid()).min(1).max(10).or(z.string().uuid()),

View file

@ -1,7 +1,6 @@
import { afterAll, describe, expect, test } from "bun:test";
import type { Account as ApiAccount } from "@versia/client/types";
import { fakeRequest, getTestUsers } from "~/tests/utils";
import { meta } from "./index.ts";
const { users, tokens, deleteUsers } = await getTestUsers(5);
@ -10,10 +9,10 @@ afterAll(async () => {
});
// /api/v1/accounts/search
describe(meta.route, () => {
describe("/api/v1/accounts/search", () => {
test("should return 200 with users", async () => {
const response = await fakeRequest(
`${meta.route}?q=${users[0].data.username}`,
`/api/v1/accounts/search?q=${users[0].data.username}`,
{
headers: {
Authorization: `Bearer ${tokens[0].data.accessToken}`,

View file

@ -1,10 +1,4 @@
import {
apiRoute,
applyConfig,
auth,
parseUserAddress,
userAddressValidator,
} from "@/api";
import { apiRoute, auth, parseUserAddress, userAddressValidator } from "@/api";
import { createRoute } from "@hono/zod-openapi";
import { User } from "@versia/kit/db";
import { RolePermissions, Users } from "@versia/kit/tables";
@ -13,21 +7,6 @@ import stringComparison from "string-comparison";
import { z } from "zod";
import { ApiError } from "~/classes/errors/api-error";
export const meta = applyConfig({
route: "/api/v1/accounts/search",
ratelimits: {
max: 100,
duration: 60,
},
auth: {
required: false,
oauthPermissions: ["read:accounts"],
},
permissions: {
required: [RolePermissions.Search, RolePermissions.ViewAccounts],
},
});
export const schemas = {
query: z.object({
q: z.string().min(1).max(512).regex(userAddressValidator),

View file

@ -2,7 +2,6 @@ import { afterAll, describe, expect, test } from "bun:test";
import type { Account as APIAccount } from "@versia/client/types";
import { config } from "~/packages/config-manager/index.ts";
import { fakeRequest, getTestUsers } from "~/tests/utils";
import { meta } from "./index.ts";
const { tokens, deleteUsers } = await getTestUsers(1);
@ -11,18 +10,21 @@ afterAll(async () => {
});
// /api/v1/accounts/update_credentials
describe(meta.route, () => {
describe("/api/v1/accounts/update_credentials", () => {
describe("HTML injection testing", () => {
test("should not allow HTML injection", async () => {
const response = await fakeRequest(meta.route, {
method: "PATCH",
headers: {
Authorization: `Bearer ${tokens[0].data.accessToken}`,
const response = await fakeRequest(
"/api/v1/accounts/update_credentials",
{
method: "PATCH",
headers: {
Authorization: `Bearer ${tokens[0].data.accessToken}`,
},
body: new URLSearchParams({
note: "Hi! <script>alert('Hello, world!');</script>",
}),
},
body: new URLSearchParams({
note: "Hi! <script>alert('Hello, world!');</script>",
}),
});
);
expect(response.status).toBe(200);
expect(response.headers.get("content-type")).toContain(
@ -37,15 +39,18 @@ describe(meta.route, () => {
});
test("should rewrite all image and video src to go through proxy", async () => {
const response = await fakeRequest(meta.route, {
method: "PATCH",
headers: {
Authorization: `Bearer ${tokens[0].data.accessToken}`,
const response = await fakeRequest(
"/api/v1/accounts/update_credentials",
{
method: "PATCH",
headers: {
Authorization: `Bearer ${tokens[0].data.accessToken}`,
},
body: new URLSearchParams({
note: "<img src='https://example.com/image.jpg'> <video src='https://example.com/video.mp4'> Test!",
}),
},
body: new URLSearchParams({
note: "<img src='https://example.com/image.jpg'> <video src='https://example.com/video.mp4'> Test!",
}),
});
);
expect(response.status).toBe(200);
expect(response.headers.get("content-type")).toContain(

View file

@ -1,4 +1,4 @@
import { apiRoute, applyConfig, auth, jsonOrForm } from "@/api";
import { apiRoute, auth, jsonOrForm } from "@/api";
import { mimeLookup } from "@/content_types";
import { mergeAndDeduplicate } from "@/lib";
import { sanitizedHtmlStrip } from "@/sanitization";
@ -14,21 +14,6 @@ import { MediaManager } from "~/classes/media/media-manager";
import { config } from "~/packages/config-manager/index.ts";
import { ErrorSchema } from "~/types/api";
export const meta = applyConfig({
route: "/api/v1/accounts/update_credentials",
ratelimits: {
max: 2,
duration: 60,
},
auth: {
required: true,
oauthPermissions: ["write:accounts"],
},
permissions: {
required: [RolePermissions.ManageOwnAccount],
},
});
export const schemas = {
json: z.object({
display_name: z

View file

@ -1,19 +1,7 @@
import { apiRoute, applyConfig, auth } from "@/api";
import { apiRoute, auth } from "@/api";
import { createRoute } from "@hono/zod-openapi";
import { User } from "@versia/kit/db";
export const meta = applyConfig({
route: "/api/v1/accounts/verify_credentials",
ratelimits: {
max: 100,
duration: 60,
},
auth: {
required: true,
oauthPermissions: ["read:accounts"],
},
});
const route = createRoute({
method: "get",
path: "/api/v1/accounts/verify_credentials",

View file

@ -1,24 +1,9 @@
import { apiRoute, applyConfig, jsonOrForm } from "@/api";
import { apiRoute, jsonOrForm } from "@/api";
import { randomString } from "@/math";
import { createRoute } from "@hono/zod-openapi";
import { Application } from "@versia/kit/db";
import { RolePermissions } from "@versia/kit/tables";
import { z } from "zod";
export const meta = applyConfig({
route: "/api/v1/apps",
ratelimits: {
max: 2,
duration: 60,
},
auth: {
required: false,
},
permissions: {
required: [RolePermissions.ManageOwnApps],
},
});
export const schemas = {
json: z.object({
client_name: z.string().trim().min(1).max(100),

View file

@ -1,24 +1,10 @@
import { apiRoute, applyConfig, auth } from "@/api";
import { apiRoute, auth } from "@/api";
import { createRoute } from "@hono/zod-openapi";
import { Application } from "@versia/kit/db";
import { RolePermissions } from "@versia/kit/tables";
import { ApiError } from "~/classes/errors/api-error";
import { ErrorSchema } from "~/types/api";
export const meta = applyConfig({
route: "/api/v1/apps/verify_credentials",
ratelimits: {
max: 100,
duration: 60,
},
auth: {
required: true,
},
permissions: {
required: [RolePermissions.ManageOwnApps],
},
});
const route = createRoute({
method: "get",
path: "/api/v1/apps/verify_credentials",

View file

@ -1,25 +1,10 @@
import { apiRoute, applyConfig, auth, idValidator } from "@/api";
import { apiRoute, auth, idValidator } from "@/api";
import { createRoute } from "@hono/zod-openapi";
import { Timeline, User } from "@versia/kit/db";
import { RolePermissions, Users } from "@versia/kit/tables";
import { and, gt, gte, lt, sql } from "drizzle-orm";
import { z } from "zod";
export const meta = applyConfig({
route: "/api/v1/blocks",
ratelimits: {
max: 100,
duration: 60,
},
auth: {
required: true,
oauthPermissions: ["read:blocks"],
},
permissions: {
required: [RolePermissions.ManageOwnBlocks],
},
});
export const schemas = {
query: z.object({
max_id: z.string().regex(idValidator).optional(),

View file

@ -1,11 +1,10 @@
import { describe, expect, test } from "bun:test";
import { fakeRequest } from "~/tests/utils";
import { meta } from "./index.ts";
// /api/v1/challenges
describe(meta.route, () => {
describe("/api/v1/challenges", () => {
test("should get a challenge", async () => {
const response = await fakeRequest(meta.route, {
const response = await fakeRequest("/api/v1/challenges", {
method: "POST",
});

View file

@ -1,24 +1,10 @@
import { apiRoute, applyConfig, auth } from "@/api";
import { apiRoute, auth } from "@/api";
import { generateChallenge } from "@/challenges";
import { createRoute, z } from "@hono/zod-openapi";
import { ApiError } from "~/classes/errors/api-error";
import { config } from "~/packages/config-manager";
import { ErrorSchema } from "~/types/api";
export const meta = applyConfig({
route: "/api/v1/challenges",
ratelimits: {
max: 10,
duration: 60,
},
auth: {
required: false,
},
permissions: {
required: [],
},
});
const route = createRoute({
method: "post",
path: "/api/v1/challenges",

View file

@ -3,7 +3,6 @@ import { db } from "@versia/kit/db";
import { Emojis } from "@versia/kit/tables";
import { inArray } from "drizzle-orm";
import { fakeRequest, getTestUsers } from "~/tests/utils";
import { meta } from "./index.ts";
const { users, tokens, deleteUsers } = await getTestUsers(2);
@ -60,9 +59,9 @@ afterAll(async () => {
.where(inArray(Emojis.shortcode, ["test1", "test2", "test3"]));
});
describe(meta.route, () => {
describe("/api/v1/custom_emojis", () => {
test("should return all global emojis", async () => {
const response = await fakeRequest(meta.route, {
const response = await fakeRequest("/api/v1/custom_emojis", {
headers: {
Authorization: `Bearer ${tokens[1].data.accessToken}`,
},
@ -94,7 +93,7 @@ describe(meta.route, () => {
});
test("should return all user emojis", async () => {
const response = await fakeRequest(meta.route, {
const response = await fakeRequest("/api/v1/custom_emojis", {
headers: {
Authorization: `Bearer ${tokens[0].data.accessToken}`,
},
@ -126,7 +125,7 @@ describe(meta.route, () => {
});
test("should return all global emojis when signed out", async () => {
const response = await fakeRequest(meta.route);
const response = await fakeRequest("/api/v1/custom_emojis");
expect(response.status).toBe(200);
expect(response.headers.get("content-type")).toContain(

View file

@ -1,23 +1,9 @@
import { apiRoute, applyConfig, auth } from "@/api";
import { apiRoute, auth } from "@/api";
import { createRoute, z } from "@hono/zod-openapi";
import { Emoji } from "@versia/kit/db";
import { Emojis, RolePermissions } from "@versia/kit/tables";
import { and, eq, isNull, or } from "drizzle-orm";
export const meta = applyConfig({
route: "/api/v1/custom_emojis",
ratelimits: {
max: 100,
duration: 60,
},
auth: {
required: false,
},
permissions: {
required: [RolePermissions.ViewEmojis],
},
});
const route = createRoute({
method: "get",
path: "/api/v1/custom_emojis",

View file

@ -3,7 +3,6 @@ import { db } from "@versia/kit/db";
import { Emojis } from "@versia/kit/tables";
import { inArray } from "drizzle-orm";
import { fakeRequest, getTestUsers } from "~/tests/utils";
import { meta } from "./index.ts";
const { users, tokens, deleteUsers } = await getTestUsers(2);
let id = "";
@ -40,9 +39,9 @@ afterAll(async () => {
});
// /api/v1/emojis/:id (PATCH, DELETE, GET)
describe(meta.route, () => {
describe("/api/v1/emojis/:id", () => {
test("should return 401 if not authenticated", async () => {
const response = await fakeRequest(meta.route.replace(":id", id), {
const response = await fakeRequest(`/api/v1/emojis/${id}`, {
method: "GET",
});
@ -51,8 +50,7 @@ describe(meta.route, () => {
test("should return 404 if emoji does not exist", async () => {
const response = await fakeRequest(
meta.route.replace(":id", "00000000-0000-0000-0000-000000000000"),
"/api/v1/emojis/00000000-0000-0000-0000-000000000000",
{
headers: {
Authorization: `Bearer ${tokens[1].data.accessToken}`,
@ -65,7 +63,7 @@ describe(meta.route, () => {
});
test("should not work if the user is trying to update an emoji they don't own", async () => {
const response = await fakeRequest(meta.route.replace(":id", id), {
const response = await fakeRequest(`/api/v1/emojis/${id}`, {
headers: {
Authorization: `Bearer ${tokens[0].data.accessToken}`,
"Content-Type": "application/json",
@ -80,7 +78,7 @@ describe(meta.route, () => {
});
test("should return the emoji", async () => {
const response = await fakeRequest(meta.route.replace(":id", id), {
const response = await fakeRequest(`/api/v1/emojis/${id}`, {
headers: {
Authorization: `Bearer ${tokens[1].data.accessToken}`,
},
@ -93,7 +91,7 @@ describe(meta.route, () => {
});
test("should update the emoji", async () => {
const response = await fakeRequest(meta.route.replace(":id", id), {
const response = await fakeRequest(`/api/v1/emojis/${id}`, {
headers: {
Authorization: `Bearer ${tokens[1].data.accessToken}`,
"Content-Type": "application/json",
@ -110,7 +108,7 @@ describe(meta.route, () => {
});
test("should update the emoji with another url, but keep the shortcode", async () => {
const response = await fakeRequest(meta.route.replace(":id", id), {
const response = await fakeRequest(`/api/v1/emojis/${id}`, {
headers: {
Authorization: `Bearer ${tokens[1].data.accessToken}`,
"Content-Type": "application/json",
@ -127,7 +125,7 @@ describe(meta.route, () => {
});
test("should update the emoji to be non-global", async () => {
const response = await fakeRequest(meta.route.replace(":id", id), {
const response = await fakeRequest(`/api/v1/emojis/${id}`, {
headers: {
Authorization: `Bearer ${tokens[1].data.accessToken}`,
"Content-Type": "application/json",
@ -154,7 +152,7 @@ describe(meta.route, () => {
});
test("should delete the emoji", async () => {
const response = await fakeRequest(meta.route.replace(":id", id), {
const response = await fakeRequest(`/api/v1/emojis/${id}`, {
headers: {
Authorization: `Bearer ${tokens[1].data.accessToken}`,
},

View file

@ -1,4 +1,4 @@
import { apiRoute, applyConfig, auth, emojiValidator, jsonOrForm } from "@/api";
import { apiRoute, auth, emojiValidator, jsonOrForm } from "@/api";
import { mimeLookup } from "@/content_types";
import { createRoute } from "@hono/zod-openapi";
import { Attachment, Emoji, db } from "@versia/kit/db";
@ -10,20 +10,6 @@ import { MediaManager } from "~/classes/media/media-manager";
import { config } from "~/packages/config-manager";
import { ErrorSchema } from "~/types/api";
export const meta = applyConfig({
route: "/api/v1/emojis/:id",
ratelimits: {
max: 30,
duration: 60,
},
auth: {
required: true,
},
permissions: {
required: [RolePermissions.ManageOwnEmojis, RolePermissions.ViewEmojis],
},
});
export const schemas = {
param: z.object({
id: z.string().uuid(),

View file

@ -4,7 +4,6 @@ import { Emojis } from "@versia/kit/tables";
import { inArray } from "drizzle-orm";
import sharp from "sharp";
import { fakeRequest, getTestUsers } from "~/tests/utils";
import { meta } from "./index.ts";
const { users, tokens, deleteUsers } = await getTestUsers(3);
@ -38,9 +37,9 @@ const createImage = async (name: string): Promise<File> => {
});
};
describe(meta.route, () => {
describe("/api/v1/emojis", () => {
test("should return 401 if not authenticated", async () => {
const response = await fakeRequest(meta.route, {
const response = await fakeRequest("/api/v1/emojis", {
method: "POST",
headers: {
"Content-Type": "application/json",
@ -61,7 +60,7 @@ describe(meta.route, () => {
formData.append("element", await createImage("test.png"));
formData.append("global", "true");
const response = await fakeRequest(meta.route, {
const response = await fakeRequest("/api/v1/emojis", {
method: "POST",
headers: {
Authorization: `Bearer ${tokens[1].data.accessToken}`,
@ -80,7 +79,7 @@ describe(meta.route, () => {
formData.append("shortcode", "test2");
formData.append("element", new File(["test"], "test.txt"));
const response = await fakeRequest(meta.route, {
const response = await fakeRequest("/api/v1/emojis", {
method: "POST",
headers: {
Authorization: `Bearer ${tokens[1].data.accessToken}`,
@ -92,7 +91,7 @@ describe(meta.route, () => {
});
test("should upload an emoji by url", async () => {
const response = await fakeRequest(meta.route, {
const response = await fakeRequest("/api/v1/emojis", {
method: "POST",
headers: {
Authorization: `Bearer ${tokens[1].data.accessToken}`,
@ -115,7 +114,7 @@ describe(meta.route, () => {
formData.append("shortcode", "test1");
formData.append("element", await createImage("test-image.png"));
const response = await fakeRequest(meta.route, {
const response = await fakeRequest("/api/v1/emojis", {
method: "POST",
headers: {
Authorization: `Bearer ${tokens[1].data.accessToken}`,
@ -133,7 +132,7 @@ describe(meta.route, () => {
formData.append("shortcode", "test4");
formData.append("element", await createImage("test-image.png"));
const response = await fakeRequest(meta.route, {
const response = await fakeRequest("/api/v1/emojis", {
method: "POST",
headers: {
Authorization: `Bearer ${tokens[0].data.accessToken}`,
@ -152,7 +151,7 @@ describe(meta.route, () => {
formData.append("shortcode", "test1");
formData.append("element", await createImage("test-image.png"));
const response = await fakeRequest(meta.route, {
const response = await fakeRequest("/api/v1/emojis", {
method: "POST",
headers: {
Authorization: `Bearer ${tokens[0].data.accessToken}`,
@ -168,7 +167,7 @@ describe(meta.route, () => {
formData.append("shortcode", "test4");
formData.append("element", await createImage("test-image.png"));
const response = await fakeRequest(meta.route, {
const response = await fakeRequest("/api/v1/emojis", {
method: "POST",
headers: {
Authorization: `Bearer ${tokens[2].data.accessToken}`,

View file

@ -1,4 +1,4 @@
import { apiRoute, applyConfig, auth, emojiValidator, jsonOrForm } from "@/api";
import { apiRoute, auth, emojiValidator, jsonOrForm } from "@/api";
import { mimeLookup } from "@/content_types";
import { createRoute } from "@hono/zod-openapi";
import { Attachment, Emoji } from "@versia/kit/db";
@ -10,20 +10,6 @@ import { MediaManager } from "~/classes/media/media-manager";
import { config } from "~/packages/config-manager";
import { ErrorSchema } from "~/types/api";
export const meta = applyConfig({
route: "/api/v1/emojis",
ratelimits: {
max: 30,
duration: 60,
},
auth: {
required: true,
},
permissions: {
required: [RolePermissions.ManageOwnEmojis, RolePermissions.ViewEmojis],
},
});
export const schemas = {
json: z.object({
shortcode: z

View file

@ -1,24 +1,10 @@
import { apiRoute, applyConfig, auth, idValidator } from "@/api";
import { apiRoute, auth, idValidator } from "@/api";
import { createRoute } from "@hono/zod-openapi";
import { Note, Timeline } from "@versia/kit/db";
import { Notes, RolePermissions } from "@versia/kit/tables";
import { and, gt, gte, lt, sql } from "drizzle-orm";
import { z } from "zod";
export const meta = applyConfig({
route: "/api/v1/favourites",
ratelimits: {
max: 100,
duration: 60,
},
auth: {
required: true,
},
permissions: {
required: [RolePermissions.ManageOwnLikes],
},
});
export const schemas = {
query: z.object({
max_id: z.string().regex(idValidator).optional(),

View file

@ -1,4 +1,4 @@
import { apiRoute, applyConfig, auth } from "@/api";
import { apiRoute, auth } from "@/api";
import { createRoute } from "@hono/zod-openapi";
import { Relationship, User } from "@versia/kit/db";
import { RolePermissions } from "@versia/kit/tables";
@ -6,20 +6,6 @@ import { z } from "zod";
import { ApiError } from "~/classes/errors/api-error";
import { ErrorSchema } from "~/types/api";
export const meta = applyConfig({
route: "/api/v1/follow_requests/:account_id/authorize",
ratelimits: {
max: 100,
duration: 60,
},
auth: {
required: true,
},
permissions: {
required: [RolePermissions.ManageOwnFollows],
},
});
export const schemas = {
param: z.object({
account_id: z.string().uuid(),

View file

@ -1,4 +1,4 @@
import { apiRoute, applyConfig, auth } from "@/api";
import { apiRoute, auth } from "@/api";
import { createRoute } from "@hono/zod-openapi";
import { Relationship, User } from "@versia/kit/db";
import { RolePermissions } from "@versia/kit/tables";
@ -6,20 +6,6 @@ import { z } from "zod";
import { ApiError } from "~/classes/errors/api-error";
import { ErrorSchema } from "~/types/api";
export const meta = applyConfig({
route: "/api/v1/follow_requests/:account_id/reject",
ratelimits: {
max: 100,
duration: 60,
},
auth: {
required: true,
},
permissions: {
required: [RolePermissions.ManageOwnFollows],
},
});
export const schemas = {
param: z.object({
account_id: z.string().uuid(),

View file

@ -1,24 +1,10 @@
import { apiRoute, applyConfig, auth, idValidator } from "@/api";
import { apiRoute, auth, idValidator } from "@/api";
import { createRoute } from "@hono/zod-openapi";
import { Timeline, User } from "@versia/kit/db";
import { RolePermissions, Users } from "@versia/kit/tables";
import { and, gt, gte, lt, sql } from "drizzle-orm";
import { z } from "zod";
export const meta = applyConfig({
route: "/api/v1/follow_requests",
ratelimits: {
max: 100,
duration: 60,
},
auth: {
required: true,
},
permissions: {
required: [RolePermissions.ManageOwnFollows],
},
});
export const schemas = {
query: z.object({
max_id: z.string().regex(idValidator).optional(),

View file

@ -1,18 +1,7 @@
import { apiRoute, applyConfig } from "@/api";
import { apiRoute } from "@/api";
import { createRoute, z } from "@hono/zod-openapi";
import { config } from "~/packages/config-manager";
export const meta = applyConfig({
auth: {
required: false,
},
ratelimits: {
duration: 60,
max: 120,
},
route: "/api/v1/frontend/config",
});
const route = createRoute({
method: "get",
path: "/api/v1/frontend/config",

View file

@ -1,11 +1,12 @@
import { describe, expect, test } from "bun:test";
import { fakeRequest } from "~/tests/utils";
import { meta } from "./extended_description.ts";
// /api/v1/instance/extended_description
describe(meta.route, () => {
describe("/api/v1/instance/extended_description", () => {
test("should return extended description", async () => {
const response = await fakeRequest(meta.route);
const response = await fakeRequest(
"/api/v1/instance/extended_description",
);
expect(response.status).toBe(200);

View file

@ -1,19 +1,8 @@
import { apiRoute, applyConfig } from "@/api";
import { apiRoute } from "@/api";
import { renderMarkdownInPath } from "@/markdown";
import { createRoute, z } from "@hono/zod-openapi";
import { config } from "~/packages/config-manager";
export const meta = applyConfig({
route: "/api/v1/instance/extended_description",
ratelimits: {
max: 300,
duration: 60,
},
auth: {
required: false,
},
});
const route = createRoute({
method: "get",
path: "/api/v1/instance/extended_description",

View file

@ -1,4 +1,4 @@
import { apiRoute, applyConfig, auth } from "@/api";
import { apiRoute, auth } from "@/api";
import { proxyUrl } from "@/response";
import { createRoute, z } from "@hono/zod-openapi";
import { Instance, Note, User } from "@versia/kit/db";
@ -7,17 +7,6 @@ import { and, eq, isNull } from "drizzle-orm";
import manifest from "~/package.json";
import { config } from "~/packages/config-manager";
export const meta = applyConfig({
route: "/api/v1/instance",
ratelimits: {
max: 300,
duration: 60,
},
auth: {
required: false,
},
});
const route = createRoute({
method: "get",
path: "/api/v1/instance",

View file

@ -1,11 +1,10 @@
import { describe, expect, test } from "bun:test";
import { fakeRequest } from "~/tests/utils";
import { meta } from "./privacy_policy.ts";
// /api/v1/instance/privacy_policy
describe(meta.route, () => {
describe("/api/v1/instance/privacy_policy", () => {
test("should return privacy policy", async () => {
const response = await fakeRequest(meta.route);
const response = await fakeRequest("/api/v1/instance/privacy_policy");
expect(response.status).toBe(200);

View file

@ -1,19 +1,8 @@
import { apiRoute, applyConfig, auth } from "@/api";
import { apiRoute, auth } from "@/api";
import { renderMarkdownInPath } from "@/markdown";
import { createRoute, z } from "@hono/zod-openapi";
import { config } from "~/packages/config-manager";
export const meta = applyConfig({
route: "/api/v1/instance/privacy_policy",
ratelimits: {
max: 300,
duration: 60,
},
auth: {
required: false,
},
});
const route = createRoute({
method: "get",
path: "/api/v1/instance/privacy_policy",

View file

@ -1,12 +1,11 @@
import { describe, expect, test } from "bun:test";
import { config } from "~/packages/config-manager/index.ts";
import { fakeRequest } from "~/tests/utils";
import { meta } from "./rules.ts";
// /api/v1/instance/rules
describe(meta.route, () => {
describe("/api/v1/instance/rules", () => {
test("should return rules", async () => {
const response = await fakeRequest(meta.route);
const response = await fakeRequest("/api/v1/instance/rules");
expect(response.status).toBe(200);

View file

@ -1,18 +1,7 @@
import { apiRoute, applyConfig, auth } from "@/api";
import { apiRoute, auth } from "@/api";
import { createRoute, z } from "@hono/zod-openapi";
import { config } from "~/packages/config-manager";
export const meta = applyConfig({
route: "/api/v1/instance/rules",
ratelimits: {
max: 300,
duration: 60,
},
auth: {
required: false,
},
});
const route = createRoute({
method: "get",
path: "/api/v1/instance/rules",

View file

@ -1,11 +1,10 @@
import { describe, expect, test } from "bun:test";
import { fakeRequest } from "~/tests/utils";
import { meta } from "./tos.ts";
// /api/v1/instance/tos
describe(meta.route, () => {
describe("/api/v1/instance/tos", () => {
test("should return terms of service", async () => {
const response = await fakeRequest(meta.route);
const response = await fakeRequest("/api/v1/instance/tos");
expect(response.status).toBe(200);

View file

@ -1,19 +1,8 @@
import { apiRoute, applyConfig, auth } from "@/api";
import { apiRoute, auth } from "@/api";
import { renderMarkdownInPath } from "@/markdown";
import { createRoute, z } from "@hono/zod-openapi";
import { config } from "~/packages/config-manager";
export const meta = applyConfig({
route: "/api/v1/instance/tos",
ratelimits: {
max: 300,
duration: 60,
},
auth: {
required: false,
},
});
const route = createRoute({
method: "get",
path: "/api/v1/instance/tos",

View file

@ -1,6 +1,5 @@
import { afterAll, describe, expect, test } from "bun:test";
import { fakeRequest, getTestStatuses, getTestUsers } from "~/tests/utils";
import { meta } from "./index.ts";
const { users, tokens, deleteUsers } = await getTestUsers(1);
const timeline = await getTestStatuses(10, users[0]);
@ -10,9 +9,9 @@ afterAll(async () => {
});
// /api/v1/markers
describe(meta.route, () => {
describe("/api/v1/markers", () => {
test("should return 401 if not authenticated", async () => {
const response = await fakeRequest(meta.route, {
const response = await fakeRequest("/api/v1/markers", {
method: "GET",
});
expect(response.status).toBe(401);
@ -20,7 +19,7 @@ describe(meta.route, () => {
test("should return empty markers", async () => {
const response = await fakeRequest(
`${meta.route}?${new URLSearchParams([
`/api/v1/markers?${new URLSearchParams([
["timeline[]", "home"],
["timeline[]", "notifications"],
])}`,
@ -38,7 +37,7 @@ describe(meta.route, () => {
test("should create markers", async () => {
const response = await fakeRequest(
`${meta.route}?${new URLSearchParams({
`/api/v1/markers?${new URLSearchParams({
"home[last_read_id]": timeline[0].id,
})}`,
@ -62,7 +61,7 @@ describe(meta.route, () => {
test("should return markers", async () => {
const response = await fakeRequest(
`${meta.route}?${new URLSearchParams([
`/api/v1/markers?${new URLSearchParams([
["timeline[]", "home"],
["timeline[]", "notifications"],
])}`,

View file

@ -1,4 +1,4 @@
import { apiRoute, applyConfig, auth, idValidator } from "@/api";
import { apiRoute, auth, idValidator } from "@/api";
import { createRoute } from "@hono/zod-openapi";
import type { Marker as ApiMarker } from "@versia/client/types";
import { db } from "@versia/kit/db";
@ -6,21 +6,6 @@ import { Markers, RolePermissions } from "@versia/kit/tables";
import { type SQL, and, eq } from "drizzle-orm";
import { z } from "zod";
export const meta = applyConfig({
route: "/api/v1/markers",
ratelimits: {
max: 100,
duration: 60,
},
auth: {
required: true,
oauthPermissions: ["read:blocks"],
},
permissions: {
required: [RolePermissions.ManageOwnAccount],
},
});
export const schemas = {
markers: z.object({
home: z

View file

@ -1,4 +1,4 @@
import { apiRoute, applyConfig, auth } from "@/api";
import { apiRoute, auth } from "@/api";
import { createRoute } from "@hono/zod-openapi";
import { Attachment } from "@versia/kit/db";
import { RolePermissions } from "@versia/kit/tables";
@ -8,21 +8,6 @@ import { MediaManager } from "~/classes/media/media-manager";
import { config } from "~/packages/config-manager/index.ts";
import { ErrorSchema } from "~/types/api";
export const meta = applyConfig({
ratelimits: {
max: 10,
duration: 60,
},
route: "/api/v1/media/:id",
auth: {
required: true,
oauthPermissions: ["write:media"],
},
permissions: {
required: [RolePermissions.ManageOwnMedia],
},
});
export const schemas = {
param: z.object({
id: z.string().uuid(),

View file

@ -1,4 +1,4 @@
import { apiRoute, applyConfig, auth } from "@/api";
import { apiRoute, auth } from "@/api";
import { createRoute } from "@hono/zod-openapi";
import { Attachment } from "@versia/kit/db";
import { RolePermissions } from "@versia/kit/tables";
@ -9,21 +9,6 @@ import { MediaManager } from "~/classes/media/media-manager";
import { config } from "~/packages/config-manager/index.ts";
import { ErrorSchema } from "~/types/api";
export const meta = applyConfig({
ratelimits: {
max: 10,
duration: 60,
},
route: "/api/v1/media",
auth: {
required: true,
oauthPermissions: ["write:media"],
},
permissions: {
required: [RolePermissions.ManageOwnMedia],
},
});
export const schemas = {
form: z.object({
file: z.instanceof(File),

View file

@ -1,6 +1,5 @@
import { afterAll, beforeAll, describe, expect, test } from "bun:test";
import { fakeRequest, getTestUsers } from "~/tests/utils";
import { meta } from "./index.ts";
const { users, tokens, deleteUsers } = await getTestUsers(3);
@ -9,27 +8,22 @@ afterAll(async () => {
});
beforeAll(async () => {
const response = await fakeRequest(
`/api/v1/accounts/${users[1].id}/mute`,
{
method: "POST",
headers: {
Authorization: `Bearer ${tokens[0].data.accessToken}`,
"Content-Type": "application/json",
},
body: JSON.stringify({}),
const response = await fakeRequest(`/api/v1/accounts/${users[1].id}/mute`, {
method: "POST",
headers: {
Authorization: `Bearer ${tokens[0].data.accessToken}`,
"Content-Type": "application/json",
},
);
body: JSON.stringify({}),
});
expect(response.status).toBe(200);
});
// /api/v1/mutes
describe(meta.route, () => {
describe("/api/v1/mutes", () => {
test("should return 401 if not authenticated", async () => {
const response = await fakeRequest(
meta.route.replace(":id", users[1].id),
"/api/v1/mutes".replace(":id", users[1].id),
{
method: "GET",
},
@ -38,7 +32,7 @@ describe(meta.route, () => {
});
test("should return mutes", async () => {
const response = await fakeRequest(meta.route, {
const response = await fakeRequest("/api/v1/mutes", {
method: "GET",
headers: {
Authorization: `Bearer ${tokens[0].data.accessToken}`,
@ -58,7 +52,6 @@ describe(meta.route, () => {
test("should return mutes after unmute", async () => {
const response = await fakeRequest(
`/api/v1/accounts/${users[1].id}/unmute`,
{
method: "POST",
headers: {
@ -70,7 +63,7 @@ describe(meta.route, () => {
);
expect(response.status).toBe(200);
const response2 = await fakeRequest(meta.route, {
const response2 = await fakeRequest("/api/v1/mutes", {
method: "GET",
headers: {
Authorization: `Bearer ${tokens[0].data.accessToken}`,

View file

@ -1,25 +1,10 @@
import { apiRoute, applyConfig, auth, idValidator } from "@/api";
import { apiRoute, auth, idValidator } from "@/api";
import { createRoute } from "@hono/zod-openapi";
import { Timeline, User } from "@versia/kit/db";
import { RolePermissions, Users } from "@versia/kit/tables";
import { and, gt, gte, lt, sql } from "drizzle-orm";
import { z } from "zod";
export const meta = applyConfig({
route: "/api/v1/mutes",
ratelimits: {
max: 100,
duration: 60,
},
auth: {
required: true,
oauthPermissions: ["read:mutes"],
},
permissions: {
required: [RolePermissions.ManageOwnMutes],
},
});
export const schemas = {
query: z.object({
max_id: z.string().regex(idValidator).optional(),

View file

@ -1,7 +1,6 @@
import { afterAll, beforeAll, describe, expect, test } from "bun:test";
import type { Notification as ApiNotification } from "@versia/client/types";
import { fakeRequest, getTestUsers } from "~/tests/utils";
import { meta } from "./dismiss.ts";
const { users, tokens, deleteUsers } = await getTestUsers(2);
let notifications: ApiNotification[] = [];
@ -30,11 +29,10 @@ afterAll(async () => {
await deleteUsers();
});
// /api/v1/notifications/:id/dismiss
describe(meta.route, () => {
describe("/api/v1/notifications/:id/dismiss", () => {
test("should return 401 if not authenticated", async () => {
const response = await fakeRequest(
meta.route.replace(":id", notifications[0].id),
`/api/v1/notifications/${notifications[0].id}/dismiss`,
{
method: "POST",
},
@ -45,7 +43,7 @@ describe(meta.route, () => {
test("should dismiss notification", async () => {
const response = await fakeRequest(
meta.route.replace(":id", notifications[0].id),
`/api/v1/notifications/${notifications[0].id}/dismiss`,
{
method: "POST",
headers: {
@ -73,7 +71,7 @@ describe(meta.route, () => {
test("should not be able to dismiss other user's notifications", async () => {
const response = await fakeRequest(
meta.route.replace(":id", notifications[0].id),
`/api/v1/notifications/${notifications[0].id}/dismiss`,
{
method: "POST",
headers: {

View file

@ -1,25 +1,10 @@
import { apiRoute, applyConfig, auth } from "@/api";
import { apiRoute, auth } from "@/api";
import { createRoute } from "@hono/zod-openapi";
import { Notification } from "@versia/kit/db";
import { RolePermissions } from "@versia/kit/tables";
import { z } from "zod";
import { ApiError } from "~/classes/errors/api-error";
export const meta = applyConfig({
route: "/api/v1/notifications/:id/dismiss",
ratelimits: {
max: 100,
duration: 60,
},
auth: {
required: true,
oauthPermissions: ["write:notifications"],
},
permissions: {
required: [RolePermissions.ManageOwnNotifications],
},
});
export const schemas = {
param: z.object({
id: z.string().uuid(),

View file

@ -1,7 +1,6 @@
import { afterAll, beforeAll, describe, expect, test } from "bun:test";
import type { Notification as ApiNotification } from "@versia/client/types";
import { fakeRequest, getTestUsers } from "~/tests/utils";
import { meta } from "./index.ts";
const { users, tokens, deleteUsers } = await getTestUsers(2);
let notifications: ApiNotification[] = [];
@ -31,30 +30,27 @@ afterAll(async () => {
});
// /api/v1/notifications/:id
describe(meta.route, () => {
describe("/api/v1/notifications/:id", () => {
test("should return 401 if not authenticated", async () => {
const response = await fakeRequest(
meta.route.replace(":id", "00000000-0000-0000-0000-000000000000"),
"/api/v1/notifications/00000000-0000-0000-0000-000000000000",
);
expect(response.status).toBe(401);
});
test("should return 422 if ID is invalid", async () => {
const response = await fakeRequest(
meta.route.replace(":id", "invalid"),
{
headers: {
Authorization: `Bearer ${tokens[0].data.accessToken}`,
},
const response = await fakeRequest("/api/v1/notifications/invalid", {
headers: {
Authorization: `Bearer ${tokens[0].data.accessToken}`,
},
);
});
expect(response.status).toBe(422);
});
test("should return 404 if notification not found", async () => {
const response = await fakeRequest(
meta.route.replace(":id", "00000000-0000-0000-0000-000000000000"),
"/api/v1/notifications/00000000-0000-0000-0000-000000000000",
{
headers: {
Authorization: `Bearer ${tokens[0].data.accessToken}`,
@ -67,7 +63,7 @@ describe(meta.route, () => {
test("should return notification", async () => {
const response = await fakeRequest(
meta.route.replace(":id", notifications[0].id),
`/api/v1/notifications/${notifications[0].id}`,
{
headers: {
Authorization: `Bearer ${tokens[0].data.accessToken}`,
@ -88,7 +84,7 @@ describe(meta.route, () => {
test("should not be able to view other user's notifications", async () => {
const response = await fakeRequest(
meta.route.replace(":id", notifications[0].id),
`/api/v1/notifications/${notifications[0].id}`,
{
headers: {
Authorization: `Bearer ${tokens[1].data.accessToken}`,

View file

@ -1,4 +1,4 @@
import { apiRoute, applyConfig, auth } from "@/api";
import { apiRoute, auth } from "@/api";
import { createRoute } from "@hono/zod-openapi";
import { Notification } from "@versia/kit/db";
import { RolePermissions } from "@versia/kit/tables";
@ -6,21 +6,6 @@ import { z } from "zod";
import { ApiError } from "~/classes/errors/api-error";
import { ErrorSchema } from "~/types/api";
export const meta = applyConfig({
route: "/api/v1/notifications/:id",
ratelimits: {
max: 100,
duration: 60,
},
auth: {
required: true,
oauthPermissions: ["read:notifications"],
},
permissions: {
required: [RolePermissions.ManageOwnNotifications],
},
});
export const schemas = {
param: z.object({
id: z.string().uuid(),

View file

@ -1,7 +1,6 @@
import { afterAll, beforeAll, describe, expect, test } from "bun:test";
import type { Notification as ApiNotification } from "@versia/client/types";
import { fakeRequest, getTestUsers } from "~/tests/utils";
import { meta } from "./index.ts";
const { users, tokens, deleteUsers } = await getTestUsers(2);
let notifications: ApiNotification[] = [];
@ -31,9 +30,9 @@ afterAll(async () => {
});
// /api/v1/notifications/clear
describe(meta.route, () => {
describe("/api/v1/notifications/clear", () => {
test("should return 401 if not authenticated", async () => {
const response = await fakeRequest(meta.route, {
const response = await fakeRequest("/api/v1/notifications/clear", {
method: "POST",
});
@ -41,7 +40,7 @@ describe(meta.route, () => {
});
test("should clear notifications", async () => {
const response = await fakeRequest(meta.route, {
const response = await fakeRequest("/api/v1/notifications/clear", {
method: "POST",
headers: {
Authorization: `Bearer ${tokens[0].data.accessToken}`,

View file

@ -1,22 +1,7 @@
import { apiRoute, applyConfig, auth } from "@/api";
import { apiRoute, auth } from "@/api";
import { createRoute } from "@hono/zod-openapi";
import { RolePermissions } from "@versia/kit/tables";
export const meta = applyConfig({
route: "/api/v1/notifications/clear",
ratelimits: {
max: 100,
duration: 60,
},
auth: {
required: true,
oauthPermissions: ["write:notifications"],
},
permissions: {
required: [RolePermissions.ManageOwnNotifications],
},
});
const route = createRoute({
method: "post",
path: "/api/v1/notifications/clear",

View file

@ -1,7 +1,6 @@
import { afterAll, beforeAll, describe, expect, test } from "bun:test";
import type { Notification as ApiNotification } from "@versia/client/types";
import { fakeRequest, getTestStatuses, getTestUsers } from "~/tests/utils";
import { meta } from "./index.ts";
const { users, tokens, deleteUsers } = await getTestUsers(2);
const statuses = await getTestStatuses(40, users[0]);
@ -43,10 +42,10 @@ afterAll(async () => {
});
// /api/v1/notifications/destroy_multiple
describe(meta.route, () => {
describe("/api/v1/notifications/destroy_multiple", () => {
test("should return 401 if not authenticated", async () => {
const response = await fakeRequest(
`${meta.route}?${new URLSearchParams(
`/api/v1/notifications/destroy_multiple?${new URLSearchParams(
notifications.slice(1).map((n) => ["ids[]", n.id]),
).toString()}`,
{
@ -59,7 +58,7 @@ describe(meta.route, () => {
test("should dismiss notifications", async () => {
const response = await fakeRequest(
`${meta.route}?${new URLSearchParams(
`/api/v1/notifications/destroy_multiple?${new URLSearchParams(
notifications.slice(1).map((n) => ["ids[]", n.id]),
).toString()}`,
{

View file

@ -1,23 +1,8 @@
import { apiRoute, applyConfig, auth } from "@/api";
import { apiRoute, auth } from "@/api";
import { createRoute } from "@hono/zod-openapi";
import { RolePermissions } from "@versia/kit/tables";
import { z } from "zod";
export const meta = applyConfig({
route: "/api/v1/notifications/destroy_multiple",
ratelimits: {
max: 100,
duration: 60,
},
auth: {
required: true,
oauthPermissions: ["write:notifications"],
},
permissions: {
required: [RolePermissions.ManageOwnNotifications],
},
});
export const schemas = {
query: z.object({
"ids[]": z.array(z.string().uuid()),

View file

@ -1,7 +1,6 @@
import { afterAll, beforeAll, describe, expect, test } from "bun:test";
import type { Notification as ApiNotification } from "@versia/client/types";
import { fakeRequest, getTestStatuses, getTestUsers } from "~/tests/utils";
import { meta } from "./index.ts";
const getFormData = (
object: Record<string, string | number | boolean>,
@ -73,15 +72,15 @@ afterAll(async () => {
});
// /api/v1/notifications
describe(meta.route, () => {
describe("/api/v1/notifications", () => {
test("should return 401 if not authenticated", async () => {
const response = await fakeRequest(meta.route);
const response = await fakeRequest("/api/v1/notifications");
expect(response.status).toBe(401);
});
test("should return 200 with notifications", async () => {
const response = await fakeRequest(meta.route, {
const response = await fakeRequest("/api/v1/notifications", {
headers: {
Authorization: `Bearer ${tokens[0].data.accessToken}`,
},
@ -130,7 +129,7 @@ describe(meta.route, () => {
expect(filterResponse.status).toBe(200);
const response = await fakeRequest(`${meta.route}?limit=20`, {
const response = await fakeRequest("/api/v1/notifications?limit=20", {
headers: {
Authorization: `Bearer ${tokens[0].data.accessToken}`,
},

View file

@ -1,28 +1,10 @@
import { apiRoute, applyConfig, auth, idValidator } from "@/api";
import { apiRoute, auth, idValidator } from "@/api";
import { createRoute } from "@hono/zod-openapi";
import { Notification, Timeline } from "@versia/kit/db";
import { Notifications, RolePermissions } from "@versia/kit/tables";
import { and, eq, gt, gte, inArray, lt, not, sql } from "drizzle-orm";
import { z } from "zod";
export const meta = applyConfig({
route: "/api/v1/notifications",
ratelimits: {
max: 100,
duration: 60,
},
auth: {
required: true,
oauthPermissions: ["read:notifications"],
},
permissions: {
required: [
RolePermissions.ManageOwnNotifications,
RolePermissions.ViewPrivateTimelines,
],
},
});
export const schemas = {
query: z
.object({

View file

@ -1,22 +1,8 @@
import { apiRoute, applyConfig, auth } from "@/api";
import { apiRoute, auth } from "@/api";
import { createRoute } from "@hono/zod-openapi";
import { User } from "@versia/kit/db";
import { RolePermissions } from "@versia/kit/tables";
export const meta = applyConfig({
ratelimits: {
max: 10,
duration: 60,
},
route: "/api/v1/profile/avatar",
auth: {
required: true,
},
permissions: {
required: [RolePermissions.ManageOwnAccount],
},
});
const route = createRoute({
method: "delete",
path: "/api/v1/profile/avatar",

View file

@ -1,22 +1,8 @@
import { apiRoute, applyConfig, auth } from "@/api";
import { apiRoute, auth } from "@/api";
import { createRoute } from "@hono/zod-openapi";
import { User } from "@versia/kit/db";
import { RolePermissions } from "@versia/kit/tables";
export const meta = applyConfig({
ratelimits: {
max: 10,
duration: 60,
},
route: "/api/v1/profile/header",
auth: {
required: true,
},
permissions: {
required: [RolePermissions.ManageOwnAccount],
},
});
const route = createRoute({
method: "delete",
path: "/api/v1/profile/header",

View file

@ -1,4 +1,4 @@
import { apiRoute, applyConfig, auth } from "@/api";
import { apiRoute, auth } from "@/api";
import { createRoute } from "@hono/zod-openapi";
import { Role } from "@versia/kit/db";
import { RolePermissions } from "@versia/kit/tables";
@ -6,24 +6,6 @@ import { z } from "zod";
import { ApiError } from "~/classes/errors/api-error";
import { ErrorSchema } from "~/types/api";
export const meta = applyConfig({
auth: {
required: true,
},
ratelimits: {
duration: 60,
max: 20,
},
route: "/api/v1/roles/:id",
permissions: {
required: [],
methodOverrides: {
POST: [RolePermissions.ManageRoles],
DELETE: [RolePermissions.ManageRoles],
},
},
});
export const schemas = {
param: z.object({
id: z.string().uuid(),

View file

@ -3,7 +3,6 @@ import { Role } from "@versia/kit/db";
import { RolePermissions } from "@versia/kit/tables";
import { config } from "~/packages/config-manager/index.ts";
import { fakeRequest, getTestUsers } from "~/tests/utils";
import { meta } from "./index.ts";
const { users, deleteUsers, tokens } = await getTestUsers(1);
let role: Role;
@ -31,9 +30,9 @@ afterAll(async () => {
});
// /api/v1/roles
describe(meta.route, () => {
describe("/api/v1/roles", () => {
test("should return 401 if not authenticated", async () => {
const response = await fakeRequest(meta.route, {
const response = await fakeRequest("/api/v1/roles", {
method: "GET",
});
@ -41,7 +40,7 @@ describe(meta.route, () => {
});
test("should return a list of roles", async () => {
const response = await fakeRequest(meta.route, {
const response = await fakeRequest("/api/v1/roles", {
method: "GET",
headers: {
Authorization: `Bearer ${tokens[0].data.accessToken}`,
@ -71,7 +70,7 @@ describe(meta.route, () => {
});
test("should create a new role", async () => {
const response = await fakeRequest(meta.route, {
const response = await fakeRequest("/api/v1/roles", {
method: "POST",
headers: {
Authorization: `Bearer ${tokens[0].data.accessToken}`,
@ -107,7 +106,7 @@ describe(meta.route, () => {
});
test("should return 403 if user tries to create a role with higher priority", async () => {
const response = await fakeRequest(meta.route, {
const response = await fakeRequest("/api/v1/roles", {
method: "POST",
headers: {
Authorization: `Bearer ${tokens[0].data.accessToken}`,
@ -131,7 +130,7 @@ describe(meta.route, () => {
});
test("should return 403 if user tries to create a role with permissions they do not have", async () => {
const response = await fakeRequest(meta.route, {
const response = await fakeRequest("/api/v1/roles", {
method: "POST",
headers: {
Authorization: `Bearer ${tokens[0].data.accessToken}`,

View file

@ -1,30 +1,10 @@
import { apiRoute, applyConfig, auth } from "@/api";
import { apiRoute, auth } from "@/api";
import { createRoute, z } from "@hono/zod-openapi";
import { Role } from "@versia/kit/db";
import { ApiError } from "~/classes/errors/api-error";
import { RolePermissions } from "~/drizzle/schema";
import { ErrorSchema } from "~/types/api";
export const meta = applyConfig({
auth: {
required: false,
methodOverrides: {
POST: true,
},
},
ratelimits: {
duration: 60,
max: 20,
},
route: "/api/v1/roles",
permissions: {
required: [],
methodOverrides: {
POST: [RolePermissions.ManageRoles],
},
},
});
const routeGet = createRoute({
method: "get",
path: "/api/v1/roles",

View file

@ -1,4 +1,4 @@
import { apiRoute, applyConfig, auth } from "@/api";
import { apiRoute, auth } from "@/api";
import { createRoute } from "@hono/zod-openapi";
import { Note } from "@versia/kit/db";
import { RolePermissions } from "@versia/kit/tables";
@ -6,20 +6,6 @@ import { z } from "zod";
import { ApiError } from "~/classes/errors/api-error";
import { ErrorSchema } from "~/types/api";
export const meta = applyConfig({
ratelimits: {
max: 8,
duration: 60,
},
route: "/api/v1/statuses/:id/context",
auth: {
required: false,
},
permissions: {
required: [RolePermissions.ViewNotes],
},
});
export const schemas = {
param: z.object({
id: z.string().uuid(),

View file

@ -1,7 +1,6 @@
import { afterAll, describe, expect, test } from "bun:test";
import type { Status as ApiStatus } from "@versia/client/types";
import { fakeRequest, getTestStatuses, getTestUsers } from "~/tests/utils";
import { meta } from "./favourite.ts";
const { users, tokens, deleteUsers } = await getTestUsers(5);
const timeline = (await getTestStatuses(2, users[0])).toReversed();
@ -11,10 +10,10 @@ afterAll(async () => {
});
// /api/v1/statuses/:id/favourite
describe(meta.route, () => {
describe("/api/v1/statuses/:id/favourite", () => {
test("should return 401 if not authenticated", async () => {
const response = await fakeRequest(
meta.route.replace(":id", timeline[0].id),
`/api/v1/statuses/${timeline[0].id}/favourite`,
{
method: "POST",
},
@ -25,7 +24,7 @@ describe(meta.route, () => {
test("should favourite post", async () => {
const response = await fakeRequest(
meta.route.replace(":id", timeline[0].id),
`/api/v1/statuses/${timeline[0].id}/favourite`,
{
method: "POST",
headers: {

View file

@ -1,4 +1,4 @@
import { apiRoute, applyConfig, auth } from "@/api";
import { apiRoute, auth } from "@/api";
import { createRoute } from "@hono/zod-openapi";
import { Note } from "@versia/kit/db";
import { RolePermissions } from "@versia/kit/tables";
@ -6,20 +6,6 @@ import { z } from "zod";
import { ApiError } from "~/classes/errors/api-error";
import { ErrorSchema } from "~/types/api";
export const meta = applyConfig({
ratelimits: {
max: 100,
duration: 60,
},
route: "/api/v1/statuses/:id/favourite",
auth: {
required: true,
},
permissions: {
required: [RolePermissions.ManageOwnLikes, RolePermissions.ViewNotes],
},
});
export const schemas = {
param: z.object({
id: z.string().uuid(),

View file

@ -1,7 +1,6 @@
import { afterAll, beforeAll, describe, expect, test } from "bun:test";
import type { Account as ApiAccount } from "@versia/client/types";
import { fakeRequest, getTestStatuses, getTestUsers } from "~/tests/utils";
import { meta } from "./favourited_by.ts";
const { users, tokens, deleteUsers } = await getTestUsers(5);
const timeline = (await getTestStatuses(40, users[0])).toReversed();
@ -22,10 +21,10 @@ beforeAll(async () => {
});
// /api/v1/statuses/:id/favourited_by
describe(meta.route, () => {
describe("/api/v1/statuses/:id/favourited_by", () => {
test("should return 401 if not authenticated", async () => {
const response = await fakeRequest(
meta.route.replace(":id", timeline[0].id),
`/api/v1/statuses/${timeline[0].id}/favourited_by`,
);
expect(response.status).toBe(401);
@ -33,7 +32,7 @@ describe(meta.route, () => {
test("should return 200 with users", async () => {
const response = await fakeRequest(
meta.route.replace(":id", timeline[0].id),
`/api/v1/statuses/${timeline[0].id}/favourited_by`,
{
headers: {
Authorization: `Bearer ${tokens[0].data.accessToken}`,

View file

@ -1,4 +1,4 @@
import { apiRoute, applyConfig, auth, idValidator } from "@/api";
import { apiRoute, auth, idValidator } from "@/api";
import { createRoute } from "@hono/zod-openapi";
import { Note, Timeline, User } from "@versia/kit/db";
import { RolePermissions, Users } from "@versia/kit/tables";
@ -7,20 +7,6 @@ import { z } from "zod";
import { ApiError } from "~/classes/errors/api-error";
import { ErrorSchema } from "~/types/api";
export const meta = applyConfig({
ratelimits: {
max: 100,
duration: 60,
},
route: "/api/v1/statuses/:id/favourited_by",
auth: {
required: true,
},
permissions: {
required: [RolePermissions.ViewNotes, RolePermissions.ViewNoteLikes],
},
});
export const schemas = {
query: z.object({
max_id: z.string().regex(idValidator).optional(),

View file

@ -1,4 +1,4 @@
import { apiRoute, applyConfig, auth, idValidator, jsonOrForm } from "@/api";
import { apiRoute, auth, idValidator, jsonOrForm } from "@/api";
import { createRoute } from "@hono/zod-openapi";
import { Attachment, Note } from "@versia/kit/db";
import { RolePermissions } from "@versia/kit/tables";
@ -8,28 +8,6 @@ import { ApiError } from "~/classes/errors/api-error";
import { config } from "~/packages/config-manager/index.ts";
import { ErrorSchema } from "~/types/api";
export const meta = applyConfig({
ratelimits: {
max: 100,
duration: 60,
},
route: "/api/v1/statuses/:id",
auth: {
required: false,
methodOverrides: {
DELETE: true,
PUT: true,
},
},
permissions: {
required: [RolePermissions.ViewNotes],
methodOverrides: {
DELETE: [RolePermissions.ManageOwnNotes, RolePermissions.ViewNotes],
PUT: [RolePermissions.ManageOwnNotes, RolePermissions.ViewNotes],
},
},
});
export const schemas = {
param: z.object({
id: z.string().regex(idValidator),

View file

@ -1,4 +1,4 @@
import { apiRoute, applyConfig, auth, idValidator } from "@/api";
import { apiRoute, auth, idValidator } from "@/api";
import { createRoute } from "@hono/zod-openapi";
import { Note, db } from "@versia/kit/db";
import { RolePermissions } from "@versia/kit/tables";
@ -7,20 +7,6 @@ import { z } from "zod";
import { ApiError } from "~/classes/errors/api-error";
import { ErrorSchema } from "~/types/api";
export const meta = applyConfig({
ratelimits: {
max: 100,
duration: 60,
},
route: "/api/v1/statuses/:id/pin",
auth: {
required: true,
},
permissions: {
required: [RolePermissions.ManageOwnNotes, RolePermissions.ViewNotes],
},
});
export const schemas = {
param: z.object({
id: z.string().regex(idValidator),

View file

@ -1,4 +1,4 @@
import { apiRoute, applyConfig, auth, jsonOrForm } from "@/api";
import { apiRoute, auth, jsonOrForm } from "@/api";
import { createRoute } from "@hono/zod-openapi";
import { Note } from "@versia/kit/db";
import { Notes, RolePermissions } from "@versia/kit/tables";
@ -7,20 +7,6 @@ import { z } from "zod";
import { ApiError } from "~/classes/errors/api-error";
import { ErrorSchema } from "~/types/api";
export const meta = applyConfig({
ratelimits: {
max: 100,
duration: 60,
},
route: "/api/v1/statuses/:id/reblog",
auth: {
required: true,
},
permissions: {
required: [RolePermissions.ManageOwnBoosts, RolePermissions.ViewNotes],
},
});
export const schemas = {
param: z.object({
id: z.string().uuid(),

View file

@ -1,7 +1,6 @@
import { afterAll, beforeAll, describe, expect, test } from "bun:test";
import type { Account as ApiAccount } from "@versia/client/types";
import { fakeRequest, getTestStatuses, getTestUsers } from "~/tests/utils";
import { meta } from "./reblogged_by.ts";
const { users, tokens, deleteUsers } = await getTestUsers(5);
const timeline = (await getTestStatuses(40, users[0])).toReversed();
@ -22,10 +21,10 @@ beforeAll(async () => {
});
// /api/v1/statuses/:id/reblogged_by
describe(meta.route, () => {
describe("/api/v1/statuses/:id/reblogged_by", () => {
test("should return 401 if not authenticated", async () => {
const response = await fakeRequest(
meta.route.replace(":id", timeline[0].id),
`/api/v1/statuses/${timeline[0].id}/reblogged_by`,
);
expect(response.status).toBe(401);
@ -33,7 +32,7 @@ describe(meta.route, () => {
test("should return 200 with users", async () => {
const response = await fakeRequest(
meta.route.replace(":id", timeline[0].id),
`/api/v1/statuses/${timeline[0].id}/reblogged_by`,
{
headers: {
Authorization: `Bearer ${tokens[0].data.accessToken}`,

Some files were not shown because too many files have changed in this diff Show more