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 { Application } from "@versia/kit/db";
import { config } from "~/packages/config-manager"; import { config } from "~/packages/config-manager";
import { fakeRequest, getTestUsers } from "~/tests/utils"; import { fakeRequest, getTestUsers } from "~/tests/utils";
import { meta } from "./index.ts";
const { users, deleteUsers, passwords } = await getTestUsers(1); const { users, deleteUsers, passwords } = await getTestUsers(1);
@ -22,7 +21,7 @@ afterAll(async () => {
}); });
// /api/auth/login // /api/auth/login
describe(meta.route, () => { describe("/api/auth/login", () => {
test("should get a JWT with email", async () => { test("should get a JWT with email", async () => {
const formData = new FormData(); 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 { createRoute } from "@hono/zod-openapi";
import { Application, User } from "@versia/kit/db"; import { Application, User } from "@versia/kit/db";
import { Users } from "@versia/kit/tables"; import { Users } from "@versia/kit/tables";
@ -10,17 +10,6 @@ import { z } from "zod";
import { ApiError } from "~/classes/errors/api-error"; import { ApiError } from "~/classes/errors/api-error";
import { config } from "~/packages/config-manager"; import { config } from "~/packages/config-manager";
export const meta = applyConfig({
ratelimits: {
max: 4,
duration: 60,
},
route: "/api/auth/login",
auth: {
required: false,
},
});
export const schemas = { export const schemas = {
form: z.object({ form: z.object({
identifier: z identifier: z

View file

@ -1,4 +1,4 @@
import { apiRoute, applyConfig } from "@/api"; import { apiRoute } from "@/api";
import { createRoute } from "@hono/zod-openapi"; import { createRoute } from "@hono/zod-openapi";
import { db } from "@versia/kit/db"; import { db } from "@versia/kit/db";
import { Applications, Tokens } from "@versia/kit/tables"; import { Applications, Tokens } from "@versia/kit/tables";
@ -6,17 +6,6 @@ import { and, eq } from "drizzle-orm";
import { z } from "zod"; import { z } from "zod";
import { config } from "~/packages/config-manager"; 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 = { export const schemas = {
query: z.object({ query: z.object({
redirect_uri: z.string().url(), redirect_uri: z.string().url(),

View file

@ -3,7 +3,6 @@ import { randomString } from "@/math";
import { Application } from "@versia/kit/db"; import { Application } from "@versia/kit/db";
import { config } from "~/packages/config-manager"; import { config } from "~/packages/config-manager";
import { fakeRequest, getTestUsers } from "~/tests/utils"; import { fakeRequest, getTestUsers } from "~/tests/utils";
import { meta } from "./index.ts";
const { users, deleteUsers, passwords } = await getTestUsers(1); const { users, deleteUsers, passwords } = await getTestUsers(1);
const token = randomString(32, "hex"); const token = randomString(32, "hex");
@ -24,7 +23,7 @@ afterAll(async () => {
}); });
// /api/auth/reset // /api/auth/reset
describe(meta.route, () => { describe("/api/auth/reset", () => {
test("should login with normal password", async () => { test("should login with normal password", async () => {
const formData = new FormData(); 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 { createRoute } from "@hono/zod-openapi";
import { User } from "@versia/kit/db"; import { User } from "@versia/kit/db";
import { Users } from "@versia/kit/tables"; import { Users } from "@versia/kit/tables";
@ -7,17 +7,6 @@ import type { Context } from "hono";
import { z } from "zod"; import { z } from "zod";
import { config } from "~/packages/config-manager"; 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 = { export const schemas = {
form: z.object({ form: z.object({
token: z.string().min(1), token: z.string().min(1),

View file

@ -1,7 +1,6 @@
import { afterAll, describe, expect, test } from "bun:test"; import { afterAll, describe, expect, test } from "bun:test";
import type { Relationship as ApiRelationship } from "@versia/client/types"; import type { Relationship as ApiRelationship } from "@versia/client/types";
import { fakeRequest, getTestUsers } from "~/tests/utils"; import { fakeRequest, getTestUsers } from "~/tests/utils";
import { meta } from "./block.ts";
const { users, tokens, deleteUsers } = await getTestUsers(2); const { users, tokens, deleteUsers } = await getTestUsers(2);
@ -10,10 +9,10 @@ afterAll(async () => {
}); });
// /api/v1/accounts/:id/block // /api/v1/accounts/:id/block
describe(meta.route, () => { describe("/api/v1/accounts/:id/block", () => {
test("should return 401 if not authenticated", async () => { test("should return 401 if not authenticated", async () => {
const response = await fakeRequest( const response = await fakeRequest(
meta.route.replace(":id", users[1].id), `/api/v1/accounts/${users[1].id}/block`,
{ {
method: "POST", method: "POST",
}, },
@ -23,7 +22,7 @@ describe(meta.route, () => {
test("should return 404 if user not found", async () => { test("should return 404 if user not found", async () => {
const response = await fakeRequest( const response = await fakeRequest(
meta.route.replace(":id", "00000000-0000-0000-0000-000000000000"), "/api/v1/accounts/00000000-0000-0000-0000-000000000000/block",
{ {
method: "POST", method: "POST",
headers: { headers: {
@ -36,7 +35,7 @@ describe(meta.route, () => {
test("should block user", async () => { test("should block user", async () => {
const response = await fakeRequest( const response = await fakeRequest(
meta.route.replace(":id", users[1].id), `/api/v1/accounts/${users[1].id}/block`,
{ {
method: "POST", method: "POST",
headers: { headers: {
@ -52,7 +51,7 @@ describe(meta.route, () => {
test("should return 200 if user already blocked", async () => { test("should return 200 if user already blocked", async () => {
const response = await fakeRequest( const response = await fakeRequest(
meta.route.replace(":id", users[1].id), `/api/v1/accounts/${users[1].id}/block`,
{ {
method: "POST", method: "POST",
headers: { 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 { createRoute } from "@hono/zod-openapi";
import { Relationship, User } from "@versia/kit/db"; import { Relationship, User } from "@versia/kit/db";
import { RolePermissions } from "@versia/kit/tables"; import { RolePermissions } from "@versia/kit/tables";
@ -6,24 +6,6 @@ import { z } from "zod";
import { ApiError } from "~/classes/errors/api-error"; import { ApiError } from "~/classes/errors/api-error";
import { ErrorSchema } from "~/types/api"; import { ErrorSchema } from "~/types/api";
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 = { export const schemas = {
param: z.object({ param: z.object({
id: z.string().uuid(), id: z.string().uuid(),

View file

@ -1,7 +1,6 @@
import { afterAll, describe, expect, test } from "bun:test"; import { afterAll, describe, expect, test } from "bun:test";
import type { Relationship as ApiRelationship } from "@versia/client/types"; import type { Relationship as ApiRelationship } from "@versia/client/types";
import { fakeRequest, getTestUsers } from "~/tests/utils"; import { fakeRequest, getTestUsers } from "~/tests/utils";
import { meta } from "./follow.ts";
const { users, tokens, deleteUsers } = await getTestUsers(2); const { users, tokens, deleteUsers } = await getTestUsers(2);
@ -10,10 +9,10 @@ afterAll(async () => {
}); });
// /api/v1/accounts/:id/follow // /api/v1/accounts/:id/follow
describe(meta.route, () => { describe("/api/v1/accounts/:id/follow", () => {
test("should return 401 if not authenticated", async () => { test("should return 401 if not authenticated", async () => {
const response = await fakeRequest( const response = await fakeRequest(
meta.route.replace(":id", users[1].id), `/api/v1/accounts/${users[1].id}/follow`,
{ {
method: "POST", method: "POST",
headers: { headers: {
@ -27,7 +26,7 @@ describe(meta.route, () => {
test("should return 404 if user not found", async () => { test("should return 404 if user not found", async () => {
const response = await fakeRequest( const response = await fakeRequest(
meta.route.replace(":id", "00000000-0000-0000-0000-000000000000"), "/api/v1/accounts/00000000-0000-0000-0000-000000000000/follow",
{ {
method: "POST", method: "POST",
headers: { headers: {
@ -42,7 +41,7 @@ describe(meta.route, () => {
test("should follow user", async () => { test("should follow user", async () => {
const response = await fakeRequest( const response = await fakeRequest(
meta.route.replace(":id", users[1].id), `/api/v1/accounts/${users[1].id}/follow`,
{ {
method: "POST", method: "POST",
headers: { headers: {
@ -60,7 +59,7 @@ describe(meta.route, () => {
test("should return 200 if user already followed", async () => { test("should return 200 if user already followed", async () => {
const response = await fakeRequest( const response = await fakeRequest(
meta.route.replace(":id", users[1].id), `/api/v1/accounts/${users[1].id}/follow`,
{ {
method: "POST", method: "POST",
headers: { 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 { createRoute } from "@hono/zod-openapi";
import { Relationship, User } from "@versia/kit/db"; import { Relationship, User } from "@versia/kit/db";
import { RolePermissions } from "@versia/kit/tables"; import { RolePermissions } from "@versia/kit/tables";
@ -7,24 +7,6 @@ import { z } from "zod";
import { ApiError } from "~/classes/errors/api-error"; import { ApiError } from "~/classes/errors/api-error";
import { ErrorSchema } from "~/types/api"; import { ErrorSchema } from "~/types/api";
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 = { export const schemas = {
param: z.object({ param: z.object({
id: z.string().uuid(), id: z.string().uuid(),

View file

@ -1,7 +1,6 @@
import { afterAll, beforeAll, describe, expect, test } from "bun:test"; import { afterAll, beforeAll, describe, expect, test } from "bun:test";
import type { Account as ApiAccount } from "@versia/client/types"; import type { Account as ApiAccount } from "@versia/client/types";
import { fakeRequest, getTestUsers } from "~/tests/utils"; import { fakeRequest, getTestUsers } from "~/tests/utils";
import { meta } from "./followers.ts";
const { users, tokens, deleteUsers } = await getTestUsers(5); const { users, tokens, deleteUsers } = await getTestUsers(5);
@ -27,10 +26,10 @@ beforeAll(async () => {
}); });
// /api/v1/accounts/:id/followers // /api/v1/accounts/:id/followers
describe(meta.route, () => { describe("/api/v1/accounts/:id/followers", () => {
test("should return 200 with followers", async () => { test("should return 200 with followers", async () => {
const response = await fakeRequest( const response = await fakeRequest(
meta.route.replace(":id", users[1].id), `/api/v1/accounts/${users[1].id}/followers`,
{ {
headers: { headers: {
Authorization: `Bearer ${tokens[0].data.accessToken}`, Authorization: `Bearer ${tokens[0].data.accessToken}`,
@ -62,7 +61,7 @@ describe(meta.route, () => {
expect(response.status).toBe(200); expect(response.status).toBe(200);
const response2 = await fakeRequest( const response2 = await fakeRequest(
meta.route.replace(":id", users[1].id), `/api/v1/accounts/${users[1].id}/followers`,
{ {
headers: { headers: {
Authorization: `Bearer ${tokens[0].data.accessToken}`, 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 { createRoute } from "@hono/zod-openapi";
import { Timeline, User } from "@versia/kit/db"; import { Timeline, User } from "@versia/kit/db";
import { RolePermissions, Users } from "@versia/kit/tables"; import { RolePermissions, Users } from "@versia/kit/tables";
@ -7,24 +7,6 @@ import { z } from "zod";
import { ApiError } from "~/classes/errors/api-error"; import { ApiError } from "~/classes/errors/api-error";
import { ErrorSchema } from "~/types/api"; import { ErrorSchema } from "~/types/api";
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 = { export const schemas = {
query: z.object({ query: z.object({
max_id: z.string().regex(idValidator).optional(), max_id: z.string().regex(idValidator).optional(),

View file

@ -1,7 +1,6 @@
import { afterAll, beforeAll, describe, expect, test } from "bun:test"; import { afterAll, beforeAll, describe, expect, test } from "bun:test";
import type { Account as ApiAccount } from "@versia/client/types"; import type { Account as ApiAccount } from "@versia/client/types";
import { fakeRequest, getTestUsers } from "~/tests/utils"; import { fakeRequest, getTestUsers } from "~/tests/utils";
import { meta } from "./following.ts";
const { users, tokens, deleteUsers } = await getTestUsers(5); const { users, tokens, deleteUsers } = await getTestUsers(5);
@ -27,10 +26,10 @@ beforeAll(async () => {
}); });
// /api/v1/accounts/:id/following // /api/v1/accounts/:id/following
describe(meta.route, () => { describe("/api/v1/accounts/:id/following", () => {
test("should return 200 with following", async () => { test("should return 200 with following", async () => {
const response = await fakeRequest( const response = await fakeRequest(
meta.route.replace(":id", users[0].id), `/api/v1/accounts/${users[0].id}/following`,
{ {
headers: { headers: {
Authorization: `Bearer ${tokens[1].data.accessToken}`, Authorization: `Bearer ${tokens[1].data.accessToken}`,
@ -62,7 +61,7 @@ describe(meta.route, () => {
expect(response.status).toBe(200); expect(response.status).toBe(200);
const response2 = await fakeRequest( const response2 = await fakeRequest(
meta.route.replace(":id", users[0].id), `/api/v1/accounts/${users[0].id}/following`,
{ {
headers: { headers: {
Authorization: `Bearer ${tokens[1].data.accessToken}`, 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 { createRoute } from "@hono/zod-openapi";
import { Timeline, User } from "@versia/kit/db"; import { Timeline, User } from "@versia/kit/db";
import { RolePermissions, Users } from "@versia/kit/tables"; import { RolePermissions, Users } from "@versia/kit/tables";
@ -7,24 +7,6 @@ import { z } from "zod";
import { ApiError } from "~/classes/errors/api-error"; import { ApiError } from "~/classes/errors/api-error";
import { ErrorSchema } from "~/types/api"; import { ErrorSchema } from "~/types/api";
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 = { export const schemas = {
query: z.object({ query: z.object({
max_id: z.string().regex(idValidator).optional(), max_id: z.string().regex(idValidator).optional(),

View file

@ -1,7 +1,6 @@
import { afterAll, beforeAll, describe, expect, test } from "bun:test"; import { afterAll, beforeAll, describe, expect, test } from "bun:test";
import type { Account as ApiAccount } from "@versia/client/types"; import type { Account as ApiAccount } from "@versia/client/types";
import { fakeRequest, getTestStatuses, getTestUsers } from "~/tests/utils"; import { fakeRequest, getTestStatuses, getTestUsers } from "~/tests/utils";
import { meta } from "./index.ts";
const { users, tokens, deleteUsers } = await getTestUsers(5); const { users, tokens, deleteUsers } = await getTestUsers(5);
const timeline = (await getTestStatuses(40, users[0])).toReversed(); const timeline = (await getTestStatuses(40, users[0])).toReversed();
@ -24,18 +23,14 @@ beforeAll(async () => {
}); });
// /api/v1/accounts/:id // /api/v1/accounts/:id
describe(meta.route, () => { describe("/api/v1/accounts/:id", () => {
test("should return 404 if ID is invalid", async () => { test("should return 404 if ID is invalid", async () => {
const response = await fakeRequest( const response = await fakeRequest("/api/v1/accounts/invalid-id");
meta.route.replace(":id", "invalid"),
);
expect(response.status).toBe(422); expect(response.status).toBe(422);
}); });
test("should return user", async () => { test("should return user", async () => {
const response = await fakeRequest( const response = await fakeRequest(`/api/v1/accounts/${users[0].id}`);
meta.route.replace(":id", users[0].id),
);
expect(response.status).toBe(200); 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 { createRoute } from "@hono/zod-openapi";
import { User } from "@versia/kit/db"; import { User } from "@versia/kit/db";
import { RolePermissions } from "@versia/kit/tables"; import { RolePermissions } from "@versia/kit/tables";
@ -6,21 +6,6 @@ import { z } from "zod";
import { ApiError } from "~/classes/errors/api-error"; import { ApiError } from "~/classes/errors/api-error";
import { ErrorSchema } from "~/types/api"; import { ErrorSchema } from "~/types/api";
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 = { export const schemas = {
param: z.object({ param: z.object({
id: z.string().uuid(), id: z.string().uuid(),

View file

@ -1,7 +1,6 @@
import { afterAll, describe, expect, test } from "bun:test"; import { afterAll, describe, expect, test } from "bun:test";
import type { Relationship as ApiRelationship } from "@versia/client/types"; import type { Relationship as ApiRelationship } from "@versia/client/types";
import { fakeRequest, getTestUsers } from "~/tests/utils"; import { fakeRequest, getTestUsers } from "~/tests/utils";
import { meta } from "./mute.ts";
const { users, tokens, deleteUsers } = await getTestUsers(2); const { users, tokens, deleteUsers } = await getTestUsers(2);
@ -10,10 +9,10 @@ afterAll(async () => {
}); });
// /api/v1/accounts/:id/mute // /api/v1/accounts/:id/mute
describe(meta.route, () => { describe("/api/v1/accounts/:id/mute", () => {
test("should return 401 if not authenticated", async () => { test("should return 401 if not authenticated", async () => {
const response = await fakeRequest( const response = await fakeRequest(
meta.route.replace(":id", users[1].id), `/api/v1/accounts/${users[1].id}/mute`,
{ {
method: "POST", method: "POST",
headers: { headers: {
@ -27,7 +26,7 @@ describe(meta.route, () => {
test("should return 404 if user not found", async () => { test("should return 404 if user not found", async () => {
const response = await fakeRequest( const response = await fakeRequest(
meta.route.replace(":id", "00000000-0000-0000-0000-000000000000"), "/api/v1/accounts/00000000-0000-0000-0000-000000000000/mute",
{ {
method: "POST", method: "POST",
headers: { headers: {
@ -42,7 +41,7 @@ describe(meta.route, () => {
test("should mute user", async () => { test("should mute user", async () => {
const response = await fakeRequest( const response = await fakeRequest(
meta.route.replace(":id", users[1].id), `/api/v1/accounts/${users[1].id}/mute`,
{ {
method: "POST", method: "POST",
headers: { headers: {
@ -60,7 +59,7 @@ describe(meta.route, () => {
test("should return 200 if user already muted", async () => { test("should return 200 if user already muted", async () => {
const response = await fakeRequest( const response = await fakeRequest(
meta.route.replace(":id", users[1].id), `/api/v1/accounts/${users[1].id}/mute`,
{ {
method: "POST", method: "POST",
headers: { 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 { createRoute } from "@hono/zod-openapi";
import { Relationship, User } from "@versia/kit/db"; import { Relationship, User } from "@versia/kit/db";
import { RolePermissions } from "@versia/kit/tables"; import { RolePermissions } from "@versia/kit/tables";
@ -6,24 +6,6 @@ import { z } from "zod";
import { ApiError } from "~/classes/errors/api-error"; import { ApiError } from "~/classes/errors/api-error";
import { ErrorSchema } from "~/types/api"; import { ErrorSchema } from "~/types/api";
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 = { export const schemas = {
param: z.object({ param: z.object({
id: z.string().uuid(), 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 { createRoute } from "@hono/zod-openapi";
import { Relationship, User } from "@versia/kit/db"; import { Relationship, User } from "@versia/kit/db";
import { RolePermissions } from "@versia/kit/tables"; import { RolePermissions } from "@versia/kit/tables";
@ -6,24 +6,6 @@ import { z } from "zod";
import { ApiError } from "~/classes/errors/api-error"; import { ApiError } from "~/classes/errors/api-error";
import { ErrorSchema } from "~/types/api"; import { ErrorSchema } from "~/types/api";
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 = { export const schemas = {
param: z.object({ param: z.object({
id: z.string().uuid(), 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 { createRoute } from "@hono/zod-openapi";
import { Relationship, User } from "@versia/kit/db"; import { Relationship, User } from "@versia/kit/db";
import { RolePermissions } from "@versia/kit/tables"; import { RolePermissions } from "@versia/kit/tables";
@ -6,24 +6,6 @@ import { z } from "zod";
import { ApiError } from "~/classes/errors/api-error"; import { ApiError } from "~/classes/errors/api-error";
import { ErrorSchema } from "~/types/api"; import { ErrorSchema } from "~/types/api";
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 = { export const schemas = {
param: z.object({ param: z.object({
id: z.string().uuid(), 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 { createRoute } from "@hono/zod-openapi";
import { User } from "@versia/kit/db"; import { User } from "@versia/kit/db";
import { RolePermissions } from "@versia/kit/tables"; import { RolePermissions } from "@versia/kit/tables";
@ -6,21 +6,6 @@ import { z } from "zod";
import { ApiError } from "~/classes/errors/api-error"; import { ApiError } from "~/classes/errors/api-error";
import { ErrorSchema } from "~/types/api"; import { ErrorSchema } from "~/types/api";
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 = { export const schemas = {
param: z.object({ param: z.object({
id: z.string().uuid(), 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 { createRoute } from "@hono/zod-openapi";
import { Relationship, User } from "@versia/kit/db"; import { Relationship, User } from "@versia/kit/db";
import { RolePermissions } from "@versia/kit/tables"; import { RolePermissions } from "@versia/kit/tables";
@ -6,24 +6,6 @@ import { z } from "zod";
import { ApiError } from "~/classes/errors/api-error"; import { ApiError } from "~/classes/errors/api-error";
import { ErrorSchema } from "~/types/api"; import { ErrorSchema } from "~/types/api";
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 = { export const schemas = {
param: z.object({ param: z.object({
id: z.string().uuid(), 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 { createRoute } from "@hono/zod-openapi";
import { Role, User } from "@versia/kit/db"; import { Role, User } from "@versia/kit/db";
import { RolePermissions } from "@versia/kit/tables"; import { RolePermissions } from "@versia/kit/tables";
@ -6,24 +6,6 @@ import { z } from "zod";
import { ApiError } from "~/classes/errors/api-error"; import { ApiError } from "~/classes/errors/api-error";
import { ErrorSchema } from "~/types/api"; import { ErrorSchema } from "~/types/api";
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 = { export const schemas = {
param: z.object({ param: z.object({
id: z.string().uuid(), 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 { createRoute } from "@hono/zod-openapi";
import { Role, User } from "@versia/kit/db"; import { Role, User } from "@versia/kit/db";
import { z } from "zod"; import { z } from "zod";
import { ApiError } from "~/classes/errors/api-error"; import { ApiError } from "~/classes/errors/api-error";
import { ErrorSchema } from "~/types/api"; import { ErrorSchema } from "~/types/api";
export const meta = applyConfig({
auth: {
required: false,
},
ratelimits: {
duration: 60,
max: 20,
},
route: "/api/v1/accounts/:id/roles",
permissions: {
required: [],
},
});
export const schemas = { export const schemas = {
param: z.object({ param: z.object({
id: z.string().uuid(), id: z.string().uuid(),

View file

@ -1,7 +1,6 @@
import { afterAll, beforeAll, describe, expect, test } from "bun:test"; import { afterAll, beforeAll, describe, expect, test } from "bun:test";
import type { Status as ApiStatus } from "@versia/client/types"; import type { Status as ApiStatus } from "@versia/client/types";
import { fakeRequest, getTestStatuses, getTestUsers } from "~/tests/utils.ts"; import { fakeRequest, getTestStatuses, getTestUsers } from "~/tests/utils.ts";
import { meta } from "./statuses.ts";
const { users, tokens, deleteUsers } = await getTestUsers(5); const { users, tokens, deleteUsers } = await getTestUsers(5);
const timeline = (await getTestStatuses(40, users[1])).toReversed(); const timeline = (await getTestStatuses(40, users[1])).toReversed();
@ -26,11 +25,10 @@ beforeAll(async () => {
}); });
// /api/v1/accounts/:id/statuses // /api/v1/accounts/:id/statuses
describe(meta.route, () => { describe("/api/v1/accounts/:id/statuses", () => {
test("should return 200 with statuses", async () => { test("should return 200 with statuses", async () => {
const response = await fakeRequest( const response = await fakeRequest(
meta.route.replace(":id", users[1].id), `/api/v1/accounts/${users[1].id}/statuses`,
{ {
headers: { headers: {
Authorization: `Bearer ${tokens[0].data.accessToken}`, Authorization: `Bearer ${tokens[0].data.accessToken}`,
@ -49,8 +47,7 @@ describe(meta.route, () => {
test("should exclude reblogs", async () => { test("should exclude reblogs", async () => {
const response = await fakeRequest( 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: { headers: {
Authorization: `Bearer ${tokens[0].data.accessToken}`, Authorization: `Bearer ${tokens[0].data.accessToken}`,
@ -84,8 +81,7 @@ describe(meta.route, () => {
expect(replyResponse.status).toBe(201); expect(replyResponse.status).toBe(201);
const response = await fakeRequest( 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: { headers: {
Authorization: `Bearer ${tokens[0].data.accessToken}`, Authorization: `Bearer ${tokens[0].data.accessToken}`,
@ -104,8 +100,7 @@ describe(meta.route, () => {
test("should only include pins", async () => { test("should only include pins", async () => {
const response = await fakeRequest( const response = await fakeRequest(
`${meta.route.replace(":id", users[1].id)}?pinned=true`, `/api/v1/accounts/${users[1].id}/statuses?pinned=true`,
{ {
headers: { headers: {
Authorization: `Bearer ${tokens[0].data.accessToken}`, Authorization: `Bearer ${tokens[0].data.accessToken}`,
@ -134,8 +129,7 @@ describe(meta.route, () => {
expect(pinResponse.status).toBe(200); expect(pinResponse.status).toBe(200);
const response2 = await fakeRequest( const response2 = await fakeRequest(
`${meta.route.replace(":id", users[1].id)}?pinned=true`, `/api/v1/accounts/${users[1].id}/statuses?pinned=true`,
{ {
headers: { headers: {
Authorization: `Bearer ${tokens[0].data.accessToken}`, 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 { createRoute } from "@hono/zod-openapi";
import { Note, Timeline, User } from "@versia/kit/db"; import { Note, Timeline, User } from "@versia/kit/db";
import { Notes, RolePermissions } from "@versia/kit/tables"; import { Notes, RolePermissions } from "@versia/kit/tables";
@ -7,21 +7,6 @@ import { z } from "zod";
import { ApiError } from "~/classes/errors/api-error"; import { ApiError } from "~/classes/errors/api-error";
import { ErrorSchema } from "~/types/api"; import { ErrorSchema } from "~/types/api";
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 = { export const schemas = {
param: z.object({ param: z.object({
id: z.string().uuid(), 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 { createRoute } from "@hono/zod-openapi";
import { Relationship, User } from "@versia/kit/db"; import { Relationship, User } from "@versia/kit/db";
import { RolePermissions } from "@versia/kit/tables"; import { RolePermissions } from "@versia/kit/tables";
@ -6,24 +6,6 @@ import { z } from "zod";
import { ApiError } from "~/classes/errors/api-error"; import { ApiError } from "~/classes/errors/api-error";
import { ErrorSchema } from "~/types/api"; import { ErrorSchema } from "~/types/api";
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 = { export const schemas = {
param: z.object({ param: z.object({
id: z.string().uuid(), 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 { createRoute } from "@hono/zod-openapi";
import { Relationship, User } from "@versia/kit/db"; import { Relationship, User } from "@versia/kit/db";
import { RolePermissions } from "@versia/kit/tables"; import { RolePermissions } from "@versia/kit/tables";
@ -6,24 +6,6 @@ import { z } from "zod";
import { ApiError } from "~/classes/errors/api-error"; import { ApiError } from "~/classes/errors/api-error";
import { ErrorSchema } from "~/types/api"; import { ErrorSchema } from "~/types/api";
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 = { export const schemas = {
param: z.object({ param: z.object({
id: z.string().uuid(), id: z.string().uuid(),

View file

@ -1,7 +1,6 @@
import { afterAll, beforeAll, describe, expect, test } from "bun:test"; import { afterAll, beforeAll, describe, expect, test } from "bun:test";
import type { Relationship as ApiRelationship } from "@versia/client/types"; import type { Relationship as ApiRelationship } from "@versia/client/types";
import { fakeRequest, getTestUsers } from "~/tests/utils"; import { fakeRequest, getTestUsers } from "~/tests/utils";
import { meta } from "./unmute.ts";
const { users, tokens, deleteUsers } = await getTestUsers(2); const { users, tokens, deleteUsers } = await getTestUsers(2);
@ -19,10 +18,10 @@ beforeAll(async () => {
}); });
// /api/v1/accounts/:id/unmute // /api/v1/accounts/:id/unmute
describe(meta.route, () => { describe("/api/v1/accounts/:id/unmute", () => {
test("should return 401 if not authenticated", async () => { test("should return 401 if not authenticated", async () => {
const response = await fakeRequest( const response = await fakeRequest(
meta.route.replace(":id", users[1].id), `/api/v1/accounts/${users[1].id}/unmute`,
{ {
method: "POST", method: "POST",
}, },
@ -32,7 +31,7 @@ describe(meta.route, () => {
test("should return 404 if user not found", async () => { test("should return 404 if user not found", async () => {
const response = await fakeRequest( const response = await fakeRequest(
meta.route.replace(":id", "00000000-0000-0000-0000-000000000000"), "/api/v1/accounts/00000000-0000-0000-0000-000000000000/unmute",
{ {
method: "POST", method: "POST",
headers: { headers: {
@ -45,7 +44,7 @@ describe(meta.route, () => {
test("should unmute user", async () => { test("should unmute user", async () => {
const response = await fakeRequest( const response = await fakeRequest(
meta.route.replace(":id", users[1].id), `/api/v1/accounts/${users[1].id}/unmute`,
{ {
method: "POST", method: "POST",
headers: { headers: {
@ -61,7 +60,7 @@ describe(meta.route, () => {
test("should return 200 if user already unmuted", async () => { test("should return 200 if user already unmuted", async () => {
const response = await fakeRequest( const response = await fakeRequest(
meta.route.replace(":id", users[1].id), `/api/v1/accounts/${users[1].id}/unmute`,
{ {
method: "POST", method: "POST",
headers: { 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 { createRoute } from "@hono/zod-openapi";
import { Relationship, User } from "@versia/kit/db"; import { Relationship, User } from "@versia/kit/db";
import { RolePermissions } from "@versia/kit/tables"; import { RolePermissions } from "@versia/kit/tables";
@ -6,24 +6,6 @@ import { z } from "zod";
import { ApiError } from "~/classes/errors/api-error"; import { ApiError } from "~/classes/errors/api-error";
import { ErrorSchema } from "~/types/api"; import { ErrorSchema } from "~/types/api";
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 = { export const schemas = {
param: z.object({ param: z.object({
id: z.string().uuid(), 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 { createRoute } from "@hono/zod-openapi";
import { Relationship, User } from "@versia/kit/db"; import { Relationship, User } from "@versia/kit/db";
import { RolePermissions } from "@versia/kit/tables"; import { RolePermissions } from "@versia/kit/tables";
@ -6,24 +6,6 @@ import { z } from "zod";
import { ApiError } from "~/classes/errors/api-error"; import { ApiError } from "~/classes/errors/api-error";
import { ErrorSchema } from "~/types/api"; import { ErrorSchema } from "~/types/api";
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 = { export const schemas = {
param: z.object({ param: z.object({
id: z.string().uuid(), id: z.string().uuid(),

View file

@ -1,6 +1,5 @@
import { afterAll, beforeAll, describe, expect, test } from "bun:test"; import { afterAll, beforeAll, describe, expect, test } from "bun:test";
import { fakeRequest, getTestUsers } from "~/tests/utils.ts"; import { fakeRequest, getTestUsers } from "~/tests/utils.ts";
import { meta } from "./index.ts";
const { users, tokens, deleteUsers } = await getTestUsers(5); const { users, tokens, deleteUsers } = await getTestUsers(5);
@ -83,13 +82,16 @@ afterAll(async () => {
await deleteUsers(); await deleteUsers();
}); });
describe(meta.route, () => { describe("/api/v1/accounts/familiar_followers", () => {
test("should return 0 familiar followers", async () => { test("should return 0 familiar followers", async () => {
const response = await fakeRequest(`${meta.route}?id=${users[4].id}`, { const response = await fakeRequest(
`/api/v1/accounts/familiar_followers?id=${users[4].id}`,
{
headers: { headers: {
Authorization: `Bearer ${tokens[0].data.accessToken}`, Authorization: `Bearer ${tokens[0].data.accessToken}`,
}, },
}); },
);
expect(response.status).toBe(200); expect(response.status).toBe(200);
@ -100,11 +102,14 @@ describe(meta.route, () => {
}); });
test("should return 1 familiar follower", async () => { test("should return 1 familiar follower", async () => {
const response = await fakeRequest(`${meta.route}?id=${users[2].id}`, { const response = await fakeRequest(
`/api/v1/accounts/familiar_followers?id=${users[2].id}`,
{
headers: { headers: {
Authorization: `Bearer ${tokens[0].data.accessToken}`, Authorization: `Bearer ${tokens[0].data.accessToken}`,
}, },
}); },
);
expect(response.status).toBe(200); expect(response.status).toBe(200);
@ -115,11 +120,14 @@ describe(meta.route, () => {
}); });
test("should return 2 familiar followers", async () => { test("should return 2 familiar followers", async () => {
const response = await fakeRequest(`${meta.route}?id=${users[3].id}`, { const response = await fakeRequest(
`/api/v1/accounts/familiar_followers?id=${users[3].id}`,
{
headers: { headers: {
Authorization: `Bearer ${tokens[0].data.accessToken}`, Authorization: `Bearer ${tokens[0].data.accessToken}`,
}, },
}); },
);
expect(response.status).toBe(200); expect(response.status).toBe(200);
@ -133,7 +141,7 @@ describe(meta.route, () => {
test("should work with multiple ids", async () => { test("should work with multiple ids", async () => {
const response = await fakeRequest( 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: { headers: {
Authorization: `Bearer ${tokens[0].data.accessToken}`, 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 { createRoute } from "@hono/zod-openapi";
import { User, db } from "@versia/kit/db"; import { User, db } from "@versia/kit/db";
import { RolePermissions, type Users } from "@versia/kit/tables"; import { RolePermissions, type Users } from "@versia/kit/tables";
import { type InferSelectModel, sql } from "drizzle-orm"; import { type InferSelectModel, sql } from "drizzle-orm";
import { z } from "zod"; import { 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 = { export const schemas = {
query: z.object({ query: z.object({
id: z id: z

View file

@ -1,7 +1,6 @@
import { afterAll, describe, expect, test } from "bun:test"; import { afterAll, describe, expect, test } from "bun:test";
import type { Account as ApiAccount } from "@versia/client/types"; import type { Account as ApiAccount } from "@versia/client/types";
import { fakeRequest, getTestUsers } from "~/tests/utils"; import { fakeRequest, getTestUsers } from "~/tests/utils";
import { meta } from "./index.ts";
const { users, deleteUsers } = await getTestUsers(5); const { users, deleteUsers } = await getTestUsers(5);
@ -10,10 +9,10 @@ afterAll(async () => {
}); });
// /api/v1/accounts/id // /api/v1/accounts/id
describe(meta.route, () => { describe("/api/v1/accounts/id", () => {
test("should correctly get user from username", async () => { test("should correctly get user from username", async () => {
const response = await fakeRequest( 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); expect(response.status).toBe(200);
@ -25,7 +24,7 @@ describe(meta.route, () => {
test("should return 404 for non-existent user", async () => { test("should return 404 for non-existent user", async () => {
const response = await fakeRequest( 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); 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 { createRoute } from "@hono/zod-openapi";
import { User } from "@versia/kit/db"; import { User } from "@versia/kit/db";
import { RolePermissions, Users } from "@versia/kit/tables"; import { RolePermissions, Users } from "@versia/kit/tables";
@ -7,21 +7,6 @@ import { z } from "zod";
import { ApiError } from "~/classes/errors/api-error"; import { ApiError } from "~/classes/errors/api-error";
import { ErrorSchema } from "~/types/api"; import { ErrorSchema } from "~/types/api";
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 = { export const schemas = {
query: z.object({ query: z.object({
username: z.string().min(1).max(512).toLowerCase(), 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 { Users } from "@versia/kit/tables";
import { eq } from "drizzle-orm"; import { eq } from "drizzle-orm";
import { fakeRequest, getSolvedChallenge } from "~/tests/utils"; import { fakeRequest, getSolvedChallenge } from "~/tests/utils";
import { meta } from "./index.ts";
const username = randomString(10, "hex"); const username = randomString(10, "hex");
const username2 = randomString(10, "hex"); const username2 = randomString(10, "hex");
@ -15,9 +14,9 @@ afterEach(async () => {
}); });
// /api/v1/statuses // /api/v1/statuses
describe(meta.route, () => { describe("/api/v1/accounts", () => {
test("should create a new account", async () => { test("should create a new account", async () => {
const response = await fakeRequest(meta.route, { const response = await fakeRequest("/api/v1/accounts", {
method: "POST", method: "POST",
headers: { headers: {
"Content-Type": "application/json", "Content-Type": "application/json",
@ -38,7 +37,7 @@ describe(meta.route, () => {
}); });
test("should refuse invalid emails", async () => { test("should refuse invalid emails", async () => {
const response = await fakeRequest(meta.route, { const response = await fakeRequest("/api/v1/accounts", {
method: "POST", method: "POST",
headers: { headers: {
"Content-Type": "application/json", "Content-Type": "application/json",
@ -58,7 +57,7 @@ describe(meta.route, () => {
}); });
test("should require a password", async () => { test("should require a password", async () => {
const response = await fakeRequest(meta.route, { const response = await fakeRequest("/api/v1/accounts", {
method: "POST", method: "POST",
headers: { headers: {
"Content-Type": "application/json", "Content-Type": "application/json",
@ -77,7 +76,7 @@ describe(meta.route, () => {
}); });
test("should not allow a previously registered email", async () => { test("should not allow a previously registered email", async () => {
await fakeRequest(meta.route, { await fakeRequest("/api/v1/accounts", {
method: "POST", method: "POST",
headers: { headers: {
"Content-Type": "application/json", "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", method: "POST",
headers: { headers: {
"Content-Type": "application/json", "Content-Type": "application/json",
@ -113,7 +112,7 @@ describe(meta.route, () => {
}); });
test("should not allow a previously registered email (case insensitive)", async () => { test("should not allow a previously registered email (case insensitive)", async () => {
await fakeRequest(meta.route, { await fakeRequest("/api/v1/accounts", {
method: "POST", method: "POST",
headers: { headers: {
"Content-Type": "application/json", "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", method: "POST",
headers: { headers: {
"Content-Type": "application/json", "Content-Type": "application/json",
@ -149,7 +148,7 @@ describe(meta.route, () => {
}); });
test("should not allow invalid usernames (not a-z_0-9)", async () => { 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", method: "POST",
headers: { headers: {
"Content-Type": "application/json", "Content-Type": "application/json",
@ -167,7 +166,7 @@ describe(meta.route, () => {
expect(response1.status).toBe(422); expect(response1.status).toBe(422);
const response2 = await fakeRequest(meta.route, { const response2 = await fakeRequest("/api/v1/accounts", {
method: "POST", method: "POST",
headers: { headers: {
"Content-Type": "application/json", "Content-Type": "application/json",
@ -185,7 +184,7 @@ describe(meta.route, () => {
expect(response2.status).toBe(422); expect(response2.status).toBe(422);
const response3 = await fakeRequest(meta.route, { const response3 = await fakeRequest("/api/v1/accounts", {
method: "POST", method: "POST",
headers: { headers: {
"Content-Type": "application/json", "Content-Type": "application/json",
@ -203,7 +202,7 @@ describe(meta.route, () => {
expect(response3.status).toBe(422); expect(response3.status).toBe(422);
const response4 = await fakeRequest(meta.route, { const response4 = await fakeRequest("/api/v1/accounts", {
method: "POST", method: "POST",
headers: { headers: {
"Content-Type": "application/json", "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 { tempmailDomains } from "@/tempmail";
import { createRoute } from "@hono/zod-openapi"; import { createRoute } from "@hono/zod-openapi";
import { User } from "@versia/kit/db"; import { User } from "@versia/kit/db";
@ -9,21 +9,6 @@ import { z } from "zod";
import { ApiError } from "~/classes/errors/api-error"; import { ApiError } from "~/classes/errors/api-error";
import { config } from "~/packages/config-manager"; import { config } from "~/packages/config-manager";
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 = { export const schemas = {
json: z.object({ json: z.object({
username: z.string(), username: z.string(),

View file

@ -1,7 +1,6 @@
import { afterAll, describe, expect, test } from "bun:test"; import { afterAll, describe, expect, test } from "bun:test";
import type { Account as ApiAccount } from "@versia/client/types"; import type { Account as ApiAccount } from "@versia/client/types";
import { fakeRequest, getTestUsers } from "~/tests/utils"; import { fakeRequest, getTestUsers } from "~/tests/utils";
import { meta } from "./index.ts";
const { users, tokens, deleteUsers } = await getTestUsers(5); const { users, tokens, deleteUsers } = await getTestUsers(5);
@ -10,10 +9,10 @@ afterAll(async () => {
}); });
// /api/v1/accounts/lookup // /api/v1/accounts/lookup
describe(meta.route, () => { describe("/api/v1/accounts/lookup", () => {
test("should return 200 with users", async () => { test("should return 200 with users", async () => {
const response = await fakeRequest( const response = await fakeRequest(
`${meta.route}?acct=${users[0].data.username}`, `/api/v1/accounts/lookup?acct=${users[0].data.username}`,
{ {
headers: { headers: {
Authorization: `Bearer ${tokens[0].data.accessToken}`, Authorization: `Bearer ${tokens[0].data.accessToken}`,
@ -37,7 +36,7 @@ describe(meta.route, () => {
test("should automatically lowercase the acct", async () => { test("should automatically lowercase the acct", async () => {
const response = await fakeRequest( const response = await fakeRequest(
`${meta.route}?acct=${users[0].data.username.toUpperCase()}`, `/api/v1/accounts/lookup?acct=${users[0].data.username.toUpperCase()}`,
{ {
headers: { headers: {
Authorization: `Bearer ${tokens[0].data.accessToken}`, 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 { createRoute } from "@hono/zod-openapi";
import { Instance, User } from "@versia/kit/db"; import { Instance, User } from "@versia/kit/db";
import { RolePermissions, Users } from "@versia/kit/tables"; import { RolePermissions, Users } from "@versia/kit/tables";
@ -8,21 +8,6 @@ import { ApiError } from "~/classes/errors/api-error";
import { config } from "~/packages/config-manager"; import { config } from "~/packages/config-manager";
import { ErrorSchema } from "~/types/api"; import { ErrorSchema } from "~/types/api";
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 = { export const schemas = {
query: z.object({ query: z.object({
acct: z.string().min(1).max(512).toLowerCase(), 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 { Users } from "@versia/kit/tables";
import { eq } from "drizzle-orm"; import { eq } from "drizzle-orm";
import { fakeRequest, getTestUsers } from "~/tests/utils"; import { fakeRequest, getTestUsers } from "~/tests/utils";
import { meta } from "./index.ts";
const { users, tokens, deleteUsers } = await getTestUsers(5); const { users, tokens, deleteUsers } = await getTestUsers(5);
@ -44,16 +43,18 @@ afterAll(async () => {
}); });
// /api/v1/accounts/relationships // /api/v1/accounts/relationships
describe(meta.route, () => { describe("/api/v1/accounts/relationships", () => {
test("should return 401 if not authenticated", async () => { 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); expect(response.status).toBe(401);
}); });
test("should return relationships", async () => { test("should return relationships", async () => {
const response = await fakeRequest( const response = await fakeRequest(
`${meta.route}?id[]=${users[2].id}`, `/api/v1/accounts/relationships?id[]=${users[2].id}`,
{ {
headers: { headers: {
Authorization: `Bearer ${tokens[0].data.accessToken}`, Authorization: `Bearer ${tokens[0].data.accessToken}`,
@ -83,7 +84,7 @@ describe(meta.route, () => {
test("should be requested_by user1", async () => { test("should be requested_by user1", async () => {
const response = await fakeRequest( const response = await fakeRequest(
`${meta.route}?id[]=${users[1].id}`, `/api/v1/accounts/relationships?id[]=${users[1].id}`,
{ {
headers: { headers: {
Authorization: `Bearer ${tokens[0].data.accessToken}`, 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 { createRoute } from "@hono/zod-openapi";
import { Relationship } from "@versia/kit/db"; import { Relationship } from "@versia/kit/db";
import { RolePermissions } from "@versia/kit/tables"; import { RolePermissions } from "@versia/kit/tables";
import { z } from "zod"; import { 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 = { export const schemas = {
query: z.object({ query: z.object({
id: z.array(z.string().uuid()).min(1).max(10).or(z.string().uuid()), 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 { afterAll, describe, expect, test } from "bun:test";
import type { Account as ApiAccount } from "@versia/client/types"; import type { Account as ApiAccount } from "@versia/client/types";
import { fakeRequest, getTestUsers } from "~/tests/utils"; import { fakeRequest, getTestUsers } from "~/tests/utils";
import { meta } from "./index.ts";
const { users, tokens, deleteUsers } = await getTestUsers(5); const { users, tokens, deleteUsers } = await getTestUsers(5);
@ -10,10 +9,10 @@ afterAll(async () => {
}); });
// /api/v1/accounts/search // /api/v1/accounts/search
describe(meta.route, () => { describe("/api/v1/accounts/search", () => {
test("should return 200 with users", async () => { test("should return 200 with users", async () => {
const response = await fakeRequest( const response = await fakeRequest(
`${meta.route}?q=${users[0].data.username}`, `/api/v1/accounts/search?q=${users[0].data.username}`,
{ {
headers: { headers: {
Authorization: `Bearer ${tokens[0].data.accessToken}`, Authorization: `Bearer ${tokens[0].data.accessToken}`,

View file

@ -1,10 +1,4 @@
import { import { apiRoute, auth, parseUserAddress, userAddressValidator } from "@/api";
apiRoute,
applyConfig,
auth,
parseUserAddress,
userAddressValidator,
} from "@/api";
import { createRoute } from "@hono/zod-openapi"; import { createRoute } from "@hono/zod-openapi";
import { User } from "@versia/kit/db"; import { User } from "@versia/kit/db";
import { RolePermissions, Users } from "@versia/kit/tables"; import { RolePermissions, Users } from "@versia/kit/tables";
@ -13,21 +7,6 @@ import stringComparison from "string-comparison";
import { z } from "zod"; import { z } from "zod";
import { ApiError } from "~/classes/errors/api-error"; 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 = { export const schemas = {
query: z.object({ query: z.object({
q: z.string().min(1).max(512).regex(userAddressValidator), 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 type { Account as APIAccount } from "@versia/client/types";
import { config } from "~/packages/config-manager/index.ts"; import { config } from "~/packages/config-manager/index.ts";
import { fakeRequest, getTestUsers } from "~/tests/utils"; import { fakeRequest, getTestUsers } from "~/tests/utils";
import { meta } from "./index.ts";
const { tokens, deleteUsers } = await getTestUsers(1); const { tokens, deleteUsers } = await getTestUsers(1);
@ -11,10 +10,12 @@ afterAll(async () => {
}); });
// /api/v1/accounts/update_credentials // /api/v1/accounts/update_credentials
describe(meta.route, () => { describe("/api/v1/accounts/update_credentials", () => {
describe("HTML injection testing", () => { describe("HTML injection testing", () => {
test("should not allow HTML injection", async () => { test("should not allow HTML injection", async () => {
const response = await fakeRequest(meta.route, { const response = await fakeRequest(
"/api/v1/accounts/update_credentials",
{
method: "PATCH", method: "PATCH",
headers: { headers: {
Authorization: `Bearer ${tokens[0].data.accessToken}`, Authorization: `Bearer ${tokens[0].data.accessToken}`,
@ -22,7 +23,8 @@ describe(meta.route, () => {
body: new URLSearchParams({ body: new URLSearchParams({
note: "Hi! <script>alert('Hello, world!');</script>", note: "Hi! <script>alert('Hello, world!');</script>",
}), }),
}); },
);
expect(response.status).toBe(200); expect(response.status).toBe(200);
expect(response.headers.get("content-type")).toContain( expect(response.headers.get("content-type")).toContain(
@ -37,7 +39,9 @@ describe(meta.route, () => {
}); });
test("should rewrite all image and video src to go through proxy", async () => { test("should rewrite all image and video src to go through proxy", async () => {
const response = await fakeRequest(meta.route, { const response = await fakeRequest(
"/api/v1/accounts/update_credentials",
{
method: "PATCH", method: "PATCH",
headers: { headers: {
Authorization: `Bearer ${tokens[0].data.accessToken}`, Authorization: `Bearer ${tokens[0].data.accessToken}`,
@ -45,7 +49,8 @@ describe(meta.route, () => {
body: new URLSearchParams({ body: new URLSearchParams({
note: "<img src='https://example.com/image.jpg'> <video src='https://example.com/video.mp4'> Test!", note: "<img src='https://example.com/image.jpg'> <video src='https://example.com/video.mp4'> Test!",
}), }),
}); },
);
expect(response.status).toBe(200); expect(response.status).toBe(200);
expect(response.headers.get("content-type")).toContain( 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 { mimeLookup } from "@/content_types";
import { mergeAndDeduplicate } from "@/lib"; import { mergeAndDeduplicate } from "@/lib";
import { sanitizedHtmlStrip } from "@/sanitization"; import { sanitizedHtmlStrip } from "@/sanitization";
@ -14,21 +14,6 @@ import { MediaManager } from "~/classes/media/media-manager";
import { config } from "~/packages/config-manager/index.ts"; import { config } from "~/packages/config-manager/index.ts";
import { ErrorSchema } from "~/types/api"; import { ErrorSchema } from "~/types/api";
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 = { export const schemas = {
json: z.object({ json: z.object({
display_name: z 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 { createRoute } from "@hono/zod-openapi";
import { User } from "@versia/kit/db"; 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({ const route = createRoute({
method: "get", method: "get",
path: "/api/v1/accounts/verify_credentials", 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 { randomString } from "@/math";
import { createRoute } from "@hono/zod-openapi"; import { createRoute } from "@hono/zod-openapi";
import { Application } from "@versia/kit/db"; import { Application } from "@versia/kit/db";
import { RolePermissions } from "@versia/kit/tables";
import { z } from "zod"; 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 = { export const schemas = {
json: z.object({ json: z.object({
client_name: z.string().trim().min(1).max(100), 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 { createRoute } from "@hono/zod-openapi";
import { Application } from "@versia/kit/db"; import { Application } from "@versia/kit/db";
import { RolePermissions } from "@versia/kit/tables"; import { RolePermissions } from "@versia/kit/tables";
import { ApiError } from "~/classes/errors/api-error"; import { ApiError } from "~/classes/errors/api-error";
import { ErrorSchema } from "~/types/api"; 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({ const route = createRoute({
method: "get", method: "get",
path: "/api/v1/apps/verify_credentials", 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 { createRoute } from "@hono/zod-openapi";
import { Timeline, User } from "@versia/kit/db"; import { Timeline, User } from "@versia/kit/db";
import { RolePermissions, Users } from "@versia/kit/tables"; import { RolePermissions, Users } from "@versia/kit/tables";
import { and, gt, gte, lt, sql } from "drizzle-orm"; import { and, gt, gte, lt, sql } from "drizzle-orm";
import { z } from "zod"; import { 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 = { export const schemas = {
query: z.object({ query: z.object({
max_id: z.string().regex(idValidator).optional(), max_id: z.string().regex(idValidator).optional(),

View file

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

View file

@ -1,24 +1,10 @@
import { apiRoute, applyConfig, auth } from "@/api"; import { apiRoute, auth } from "@/api";
import { generateChallenge } from "@/challenges"; import { generateChallenge } from "@/challenges";
import { createRoute, z } from "@hono/zod-openapi"; import { createRoute, z } from "@hono/zod-openapi";
import { ApiError } from "~/classes/errors/api-error"; import { ApiError } from "~/classes/errors/api-error";
import { config } from "~/packages/config-manager"; import { config } from "~/packages/config-manager";
import { ErrorSchema } from "~/types/api"; 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({ const route = createRoute({
method: "post", method: "post",
path: "/api/v1/challenges", path: "/api/v1/challenges",

View file

@ -3,7 +3,6 @@ import { db } from "@versia/kit/db";
import { Emojis } from "@versia/kit/tables"; import { Emojis } from "@versia/kit/tables";
import { inArray } from "drizzle-orm"; import { inArray } from "drizzle-orm";
import { fakeRequest, getTestUsers } from "~/tests/utils"; import { fakeRequest, getTestUsers } from "~/tests/utils";
import { meta } from "./index.ts";
const { users, tokens, deleteUsers } = await getTestUsers(2); const { users, tokens, deleteUsers } = await getTestUsers(2);
@ -60,9 +59,9 @@ afterAll(async () => {
.where(inArray(Emojis.shortcode, ["test1", "test2", "test3"])); .where(inArray(Emojis.shortcode, ["test1", "test2", "test3"]));
}); });
describe(meta.route, () => { describe("/api/v1/custom_emojis", () => {
test("should return all global emojis", async () => { test("should return all global emojis", async () => {
const response = await fakeRequest(meta.route, { const response = await fakeRequest("/api/v1/custom_emojis", {
headers: { headers: {
Authorization: `Bearer ${tokens[1].data.accessToken}`, Authorization: `Bearer ${tokens[1].data.accessToken}`,
}, },
@ -94,7 +93,7 @@ describe(meta.route, () => {
}); });
test("should return all user emojis", async () => { test("should return all user emojis", async () => {
const response = await fakeRequest(meta.route, { const response = await fakeRequest("/api/v1/custom_emojis", {
headers: { headers: {
Authorization: `Bearer ${tokens[0].data.accessToken}`, Authorization: `Bearer ${tokens[0].data.accessToken}`,
}, },
@ -126,7 +125,7 @@ describe(meta.route, () => {
}); });
test("should return all global emojis when signed out", async () => { 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.status).toBe(200);
expect(response.headers.get("content-type")).toContain( 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 { createRoute, z } from "@hono/zod-openapi";
import { Emoji } from "@versia/kit/db"; import { Emoji } from "@versia/kit/db";
import { Emojis, RolePermissions } from "@versia/kit/tables"; import { Emojis, RolePermissions } from "@versia/kit/tables";
import { and, eq, isNull, or } from "drizzle-orm"; import { and, eq, isNull, or } from "drizzle-orm";
export const meta = applyConfig({
route: "/api/v1/custom_emojis",
ratelimits: {
max: 100,
duration: 60,
},
auth: {
required: false,
},
permissions: {
required: [RolePermissions.ViewEmojis],
},
});
const route = createRoute({ const route = createRoute({
method: "get", method: "get",
path: "/api/v1/custom_emojis", path: "/api/v1/custom_emojis",

View file

@ -3,7 +3,6 @@ import { db } from "@versia/kit/db";
import { Emojis } from "@versia/kit/tables"; import { Emojis } from "@versia/kit/tables";
import { inArray } from "drizzle-orm"; import { inArray } from "drizzle-orm";
import { fakeRequest, getTestUsers } from "~/tests/utils"; import { fakeRequest, getTestUsers } from "~/tests/utils";
import { meta } from "./index.ts";
const { users, tokens, deleteUsers } = await getTestUsers(2); const { users, tokens, deleteUsers } = await getTestUsers(2);
let id = ""; let id = "";
@ -40,9 +39,9 @@ afterAll(async () => {
}); });
// /api/v1/emojis/:id (PATCH, DELETE, GET) // /api/v1/emojis/:id (PATCH, DELETE, GET)
describe(meta.route, () => { describe("/api/v1/emojis/:id", () => {
test("should return 401 if not authenticated", async () => { 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", method: "GET",
}); });
@ -51,8 +50,7 @@ describe(meta.route, () => {
test("should return 404 if emoji does not exist", async () => { test("should return 404 if emoji does not exist", async () => {
const response = await fakeRequest( const response = await fakeRequest(
meta.route.replace(":id", "00000000-0000-0000-0000-000000000000"), "/api/v1/emojis/00000000-0000-0000-0000-000000000000",
{ {
headers: { headers: {
Authorization: `Bearer ${tokens[1].data.accessToken}`, 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 () => { 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: { headers: {
Authorization: `Bearer ${tokens[0].data.accessToken}`, Authorization: `Bearer ${tokens[0].data.accessToken}`,
"Content-Type": "application/json", "Content-Type": "application/json",
@ -80,7 +78,7 @@ describe(meta.route, () => {
}); });
test("should return the emoji", async () => { test("should return the emoji", async () => {
const response = await fakeRequest(meta.route.replace(":id", id), { const response = await fakeRequest(`/api/v1/emojis/${id}`, {
headers: { headers: {
Authorization: `Bearer ${tokens[1].data.accessToken}`, Authorization: `Bearer ${tokens[1].data.accessToken}`,
}, },
@ -93,7 +91,7 @@ describe(meta.route, () => {
}); });
test("should update the emoji", async () => { test("should update the emoji", async () => {
const response = await fakeRequest(meta.route.replace(":id", id), { const response = await fakeRequest(`/api/v1/emojis/${id}`, {
headers: { headers: {
Authorization: `Bearer ${tokens[1].data.accessToken}`, Authorization: `Bearer ${tokens[1].data.accessToken}`,
"Content-Type": "application/json", "Content-Type": "application/json",
@ -110,7 +108,7 @@ describe(meta.route, () => {
}); });
test("should update the emoji with another url, but keep the shortcode", async () => { 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: { headers: {
Authorization: `Bearer ${tokens[1].data.accessToken}`, Authorization: `Bearer ${tokens[1].data.accessToken}`,
"Content-Type": "application/json", "Content-Type": "application/json",
@ -127,7 +125,7 @@ describe(meta.route, () => {
}); });
test("should update the emoji to be non-global", async () => { 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: { headers: {
Authorization: `Bearer ${tokens[1].data.accessToken}`, Authorization: `Bearer ${tokens[1].data.accessToken}`,
"Content-Type": "application/json", "Content-Type": "application/json",
@ -154,7 +152,7 @@ describe(meta.route, () => {
}); });
test("should delete the emoji", async () => { test("should delete the emoji", async () => {
const response = await fakeRequest(meta.route.replace(":id", id), { const response = await fakeRequest(`/api/v1/emojis/${id}`, {
headers: { headers: {
Authorization: `Bearer ${tokens[1].data.accessToken}`, 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 { mimeLookup } from "@/content_types";
import { createRoute } from "@hono/zod-openapi"; import { createRoute } from "@hono/zod-openapi";
import { Attachment, Emoji, db } from "@versia/kit/db"; 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 { config } from "~/packages/config-manager";
import { ErrorSchema } from "~/types/api"; 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 = { export const schemas = {
param: z.object({ param: z.object({
id: z.string().uuid(), id: z.string().uuid(),

View file

@ -4,7 +4,6 @@ import { Emojis } from "@versia/kit/tables";
import { inArray } from "drizzle-orm"; import { inArray } from "drizzle-orm";
import sharp from "sharp"; import sharp from "sharp";
import { fakeRequest, getTestUsers } from "~/tests/utils"; import { fakeRequest, getTestUsers } from "~/tests/utils";
import { meta } from "./index.ts";
const { users, tokens, deleteUsers } = await getTestUsers(3); 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 () => { test("should return 401 if not authenticated", async () => {
const response = await fakeRequest(meta.route, { const response = await fakeRequest("/api/v1/emojis", {
method: "POST", method: "POST",
headers: { headers: {
"Content-Type": "application/json", "Content-Type": "application/json",
@ -61,7 +60,7 @@ describe(meta.route, () => {
formData.append("element", await createImage("test.png")); formData.append("element", await createImage("test.png"));
formData.append("global", "true"); formData.append("global", "true");
const response = await fakeRequest(meta.route, { const response = await fakeRequest("/api/v1/emojis", {
method: "POST", method: "POST",
headers: { headers: {
Authorization: `Bearer ${tokens[1].data.accessToken}`, Authorization: `Bearer ${tokens[1].data.accessToken}`,
@ -80,7 +79,7 @@ describe(meta.route, () => {
formData.append("shortcode", "test2"); formData.append("shortcode", "test2");
formData.append("element", new File(["test"], "test.txt")); formData.append("element", new File(["test"], "test.txt"));
const response = await fakeRequest(meta.route, { const response = await fakeRequest("/api/v1/emojis", {
method: "POST", method: "POST",
headers: { headers: {
Authorization: `Bearer ${tokens[1].data.accessToken}`, Authorization: `Bearer ${tokens[1].data.accessToken}`,
@ -92,7 +91,7 @@ describe(meta.route, () => {
}); });
test("should upload an emoji by url", async () => { test("should upload an emoji by url", async () => {
const response = await fakeRequest(meta.route, { const response = await fakeRequest("/api/v1/emojis", {
method: "POST", method: "POST",
headers: { headers: {
Authorization: `Bearer ${tokens[1].data.accessToken}`, Authorization: `Bearer ${tokens[1].data.accessToken}`,
@ -115,7 +114,7 @@ describe(meta.route, () => {
formData.append("shortcode", "test1"); formData.append("shortcode", "test1");
formData.append("element", await createImage("test-image.png")); formData.append("element", await createImage("test-image.png"));
const response = await fakeRequest(meta.route, { const response = await fakeRequest("/api/v1/emojis", {
method: "POST", method: "POST",
headers: { headers: {
Authorization: `Bearer ${tokens[1].data.accessToken}`, Authorization: `Bearer ${tokens[1].data.accessToken}`,
@ -133,7 +132,7 @@ describe(meta.route, () => {
formData.append("shortcode", "test4"); formData.append("shortcode", "test4");
formData.append("element", await createImage("test-image.png")); formData.append("element", await createImage("test-image.png"));
const response = await fakeRequest(meta.route, { const response = await fakeRequest("/api/v1/emojis", {
method: "POST", method: "POST",
headers: { headers: {
Authorization: `Bearer ${tokens[0].data.accessToken}`, Authorization: `Bearer ${tokens[0].data.accessToken}`,
@ -152,7 +151,7 @@ describe(meta.route, () => {
formData.append("shortcode", "test1"); formData.append("shortcode", "test1");
formData.append("element", await createImage("test-image.png")); formData.append("element", await createImage("test-image.png"));
const response = await fakeRequest(meta.route, { const response = await fakeRequest("/api/v1/emojis", {
method: "POST", method: "POST",
headers: { headers: {
Authorization: `Bearer ${tokens[0].data.accessToken}`, Authorization: `Bearer ${tokens[0].data.accessToken}`,
@ -168,7 +167,7 @@ describe(meta.route, () => {
formData.append("shortcode", "test4"); formData.append("shortcode", "test4");
formData.append("element", await createImage("test-image.png")); formData.append("element", await createImage("test-image.png"));
const response = await fakeRequest(meta.route, { const response = await fakeRequest("/api/v1/emojis", {
method: "POST", method: "POST",
headers: { headers: {
Authorization: `Bearer ${tokens[2].data.accessToken}`, 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 { mimeLookup } from "@/content_types";
import { createRoute } from "@hono/zod-openapi"; import { createRoute } from "@hono/zod-openapi";
import { Attachment, Emoji } from "@versia/kit/db"; 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 { config } from "~/packages/config-manager";
import { ErrorSchema } from "~/types/api"; 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 = { export const schemas = {
json: z.object({ json: z.object({
shortcode: z 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 { createRoute } from "@hono/zod-openapi";
import { Note, Timeline } from "@versia/kit/db"; import { Note, Timeline } from "@versia/kit/db";
import { Notes, RolePermissions } from "@versia/kit/tables"; import { Notes, RolePermissions } from "@versia/kit/tables";
import { and, gt, gte, lt, sql } from "drizzle-orm"; import { and, gt, gte, lt, sql } from "drizzle-orm";
import { z } from "zod"; 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 = { export const schemas = {
query: z.object({ query: z.object({
max_id: z.string().regex(idValidator).optional(), 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 { createRoute } from "@hono/zod-openapi";
import { Relationship, User } from "@versia/kit/db"; import { Relationship, User } from "@versia/kit/db";
import { RolePermissions } from "@versia/kit/tables"; import { RolePermissions } from "@versia/kit/tables";
@ -6,20 +6,6 @@ import { z } from "zod";
import { ApiError } from "~/classes/errors/api-error"; import { ApiError } from "~/classes/errors/api-error";
import { ErrorSchema } from "~/types/api"; import { ErrorSchema } from "~/types/api";
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 = { export const schemas = {
param: z.object({ param: z.object({
account_id: z.string().uuid(), 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 { createRoute } from "@hono/zod-openapi";
import { Relationship, User } from "@versia/kit/db"; import { Relationship, User } from "@versia/kit/db";
import { RolePermissions } from "@versia/kit/tables"; import { RolePermissions } from "@versia/kit/tables";
@ -6,20 +6,6 @@ import { z } from "zod";
import { ApiError } from "~/classes/errors/api-error"; import { ApiError } from "~/classes/errors/api-error";
import { ErrorSchema } from "~/types/api"; import { ErrorSchema } from "~/types/api";
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 = { export const schemas = {
param: z.object({ param: z.object({
account_id: z.string().uuid(), 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 { createRoute } from "@hono/zod-openapi";
import { Timeline, User } from "@versia/kit/db"; import { Timeline, User } from "@versia/kit/db";
import { RolePermissions, Users } from "@versia/kit/tables"; import { RolePermissions, Users } from "@versia/kit/tables";
import { and, gt, gte, lt, sql } from "drizzle-orm"; import { and, gt, gte, lt, sql } from "drizzle-orm";
import { z } from "zod"; import { 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 = { export const schemas = {
query: z.object({ query: z.object({
max_id: z.string().regex(idValidator).optional(), 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 { createRoute, z } from "@hono/zod-openapi";
import { config } from "~/packages/config-manager"; 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({ const route = createRoute({
method: "get", method: "get",
path: "/api/v1/frontend/config", path: "/api/v1/frontend/config",

View file

@ -1,11 +1,12 @@
import { describe, expect, test } from "bun:test"; import { describe, expect, test } from "bun:test";
import { fakeRequest } from "~/tests/utils"; import { fakeRequest } from "~/tests/utils";
import { meta } from "./extended_description.ts";
// /api/v1/instance/extended_description // /api/v1/instance/extended_description
describe(meta.route, () => { describe("/api/v1/instance/extended_description", () => {
test("should return extended description", async () => { 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); 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 { renderMarkdownInPath } from "@/markdown";
import { createRoute, z } from "@hono/zod-openapi"; import { createRoute, z } from "@hono/zod-openapi";
import { config } from "~/packages/config-manager"; 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({ const route = createRoute({
method: "get", method: "get",
path: "/api/v1/instance/extended_description", 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 { proxyUrl } from "@/response";
import { createRoute, z } from "@hono/zod-openapi"; import { createRoute, z } from "@hono/zod-openapi";
import { Instance, Note, User } from "@versia/kit/db"; 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 manifest from "~/package.json";
import { config } from "~/packages/config-manager"; 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({ const route = createRoute({
method: "get", method: "get",
path: "/api/v1/instance", path: "/api/v1/instance",

View file

@ -1,11 +1,10 @@
import { describe, expect, test } from "bun:test"; import { describe, expect, test } from "bun:test";
import { fakeRequest } from "~/tests/utils"; import { fakeRequest } from "~/tests/utils";
import { meta } from "./privacy_policy.ts";
// /api/v1/instance/privacy_policy // /api/v1/instance/privacy_policy
describe(meta.route, () => { describe("/api/v1/instance/privacy_policy", () => {
test("should return privacy policy", async () => { 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); 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 { renderMarkdownInPath } from "@/markdown";
import { createRoute, z } from "@hono/zod-openapi"; import { createRoute, z } from "@hono/zod-openapi";
import { config } from "~/packages/config-manager"; 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({ const route = createRoute({
method: "get", method: "get",
path: "/api/v1/instance/privacy_policy", path: "/api/v1/instance/privacy_policy",

View file

@ -1,12 +1,11 @@
import { describe, expect, test } from "bun:test"; import { describe, expect, test } from "bun:test";
import { config } from "~/packages/config-manager/index.ts"; import { config } from "~/packages/config-manager/index.ts";
import { fakeRequest } from "~/tests/utils"; import { fakeRequest } from "~/tests/utils";
import { meta } from "./rules.ts";
// /api/v1/instance/rules // /api/v1/instance/rules
describe(meta.route, () => { describe("/api/v1/instance/rules", () => {
test("should return rules", async () => { test("should return rules", async () => {
const response = await fakeRequest(meta.route); const response = await fakeRequest("/api/v1/instance/rules");
expect(response.status).toBe(200); 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 { createRoute, z } from "@hono/zod-openapi";
import { config } from "~/packages/config-manager"; 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({ const route = createRoute({
method: "get", method: "get",
path: "/api/v1/instance/rules", path: "/api/v1/instance/rules",

View file

@ -1,11 +1,10 @@
import { describe, expect, test } from "bun:test"; import { describe, expect, test } from "bun:test";
import { fakeRequest } from "~/tests/utils"; import { fakeRequest } from "~/tests/utils";
import { meta } from "./tos.ts";
// /api/v1/instance/tos // /api/v1/instance/tos
describe(meta.route, () => { describe("/api/v1/instance/tos", () => {
test("should return terms of service", async () => { 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); 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 { renderMarkdownInPath } from "@/markdown";
import { createRoute, z } from "@hono/zod-openapi"; import { createRoute, z } from "@hono/zod-openapi";
import { config } from "~/packages/config-manager"; 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({ const route = createRoute({
method: "get", method: "get",
path: "/api/v1/instance/tos", path: "/api/v1/instance/tos",

View file

@ -1,6 +1,5 @@
import { afterAll, describe, expect, test } from "bun:test"; import { afterAll, describe, expect, test } from "bun:test";
import { fakeRequest, getTestStatuses, getTestUsers } from "~/tests/utils"; import { fakeRequest, getTestStatuses, getTestUsers } from "~/tests/utils";
import { meta } from "./index.ts";
const { users, tokens, deleteUsers } = await getTestUsers(1); const { users, tokens, deleteUsers } = await getTestUsers(1);
const timeline = await getTestStatuses(10, users[0]); const timeline = await getTestStatuses(10, users[0]);
@ -10,9 +9,9 @@ afterAll(async () => {
}); });
// /api/v1/markers // /api/v1/markers
describe(meta.route, () => { describe("/api/v1/markers", () => {
test("should return 401 if not authenticated", async () => { test("should return 401 if not authenticated", async () => {
const response = await fakeRequest(meta.route, { const response = await fakeRequest("/api/v1/markers", {
method: "GET", method: "GET",
}); });
expect(response.status).toBe(401); expect(response.status).toBe(401);
@ -20,7 +19,7 @@ describe(meta.route, () => {
test("should return empty markers", async () => { test("should return empty markers", async () => {
const response = await fakeRequest( const response = await fakeRequest(
`${meta.route}?${new URLSearchParams([ `/api/v1/markers?${new URLSearchParams([
["timeline[]", "home"], ["timeline[]", "home"],
["timeline[]", "notifications"], ["timeline[]", "notifications"],
])}`, ])}`,
@ -38,7 +37,7 @@ describe(meta.route, () => {
test("should create markers", async () => { test("should create markers", async () => {
const response = await fakeRequest( const response = await fakeRequest(
`${meta.route}?${new URLSearchParams({ `/api/v1/markers?${new URLSearchParams({
"home[last_read_id]": timeline[0].id, "home[last_read_id]": timeline[0].id,
})}`, })}`,
@ -62,7 +61,7 @@ describe(meta.route, () => {
test("should return markers", async () => { test("should return markers", async () => {
const response = await fakeRequest( const response = await fakeRequest(
`${meta.route}?${new URLSearchParams([ `/api/v1/markers?${new URLSearchParams([
["timeline[]", "home"], ["timeline[]", "home"],
["timeline[]", "notifications"], ["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 { createRoute } from "@hono/zod-openapi";
import type { Marker as ApiMarker } from "@versia/client/types"; import type { Marker as ApiMarker } from "@versia/client/types";
import { db } from "@versia/kit/db"; import { db } from "@versia/kit/db";
@ -6,21 +6,6 @@ import { Markers, RolePermissions } from "@versia/kit/tables";
import { type SQL, and, eq } from "drizzle-orm"; import { type SQL, and, eq } from "drizzle-orm";
import { z } from "zod"; 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 = { export const schemas = {
markers: z.object({ markers: z.object({
home: z 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 { createRoute } from "@hono/zod-openapi";
import { Attachment } from "@versia/kit/db"; import { Attachment } from "@versia/kit/db";
import { RolePermissions } from "@versia/kit/tables"; 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 { config } from "~/packages/config-manager/index.ts";
import { ErrorSchema } from "~/types/api"; 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 = { export const schemas = {
param: z.object({ param: z.object({
id: z.string().uuid(), 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 { createRoute } from "@hono/zod-openapi";
import { Attachment } from "@versia/kit/db"; import { Attachment } from "@versia/kit/db";
import { RolePermissions } from "@versia/kit/tables"; 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 { config } from "~/packages/config-manager/index.ts";
import { ErrorSchema } from "~/types/api"; 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 = { export const schemas = {
form: z.object({ form: z.object({
file: z.instanceof(File), file: z.instanceof(File),

View file

@ -1,6 +1,5 @@
import { afterAll, beforeAll, describe, expect, test } from "bun:test"; import { afterAll, beforeAll, describe, expect, test } from "bun:test";
import { fakeRequest, getTestUsers } from "~/tests/utils"; import { fakeRequest, getTestUsers } from "~/tests/utils";
import { meta } from "./index.ts";
const { users, tokens, deleteUsers } = await getTestUsers(3); const { users, tokens, deleteUsers } = await getTestUsers(3);
@ -9,27 +8,22 @@ afterAll(async () => {
}); });
beforeAll(async () => { beforeAll(async () => {
const response = await fakeRequest( const response = await fakeRequest(`/api/v1/accounts/${users[1].id}/mute`, {
`/api/v1/accounts/${users[1].id}/mute`,
{
method: "POST", method: "POST",
headers: { headers: {
Authorization: `Bearer ${tokens[0].data.accessToken}`, Authorization: `Bearer ${tokens[0].data.accessToken}`,
"Content-Type": "application/json", "Content-Type": "application/json",
}, },
body: JSON.stringify({}), body: JSON.stringify({}),
}, });
);
expect(response.status).toBe(200); expect(response.status).toBe(200);
}); });
// /api/v1/mutes // /api/v1/mutes
describe(meta.route, () => { describe("/api/v1/mutes", () => {
test("should return 401 if not authenticated", async () => { test("should return 401 if not authenticated", async () => {
const response = await fakeRequest( const response = await fakeRequest(
meta.route.replace(":id", users[1].id), "/api/v1/mutes".replace(":id", users[1].id),
{ {
method: "GET", method: "GET",
}, },
@ -38,7 +32,7 @@ describe(meta.route, () => {
}); });
test("should return mutes", async () => { test("should return mutes", async () => {
const response = await fakeRequest(meta.route, { const response = await fakeRequest("/api/v1/mutes", {
method: "GET", method: "GET",
headers: { headers: {
Authorization: `Bearer ${tokens[0].data.accessToken}`, Authorization: `Bearer ${tokens[0].data.accessToken}`,
@ -58,7 +52,6 @@ describe(meta.route, () => {
test("should return mutes after unmute", async () => { test("should return mutes after unmute", async () => {
const response = await fakeRequest( const response = await fakeRequest(
`/api/v1/accounts/${users[1].id}/unmute`, `/api/v1/accounts/${users[1].id}/unmute`,
{ {
method: "POST", method: "POST",
headers: { headers: {
@ -70,7 +63,7 @@ describe(meta.route, () => {
); );
expect(response.status).toBe(200); expect(response.status).toBe(200);
const response2 = await fakeRequest(meta.route, { const response2 = await fakeRequest("/api/v1/mutes", {
method: "GET", method: "GET",
headers: { headers: {
Authorization: `Bearer ${tokens[0].data.accessToken}`, 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 { createRoute } from "@hono/zod-openapi";
import { Timeline, User } from "@versia/kit/db"; import { Timeline, User } from "@versia/kit/db";
import { RolePermissions, Users } from "@versia/kit/tables"; import { RolePermissions, Users } from "@versia/kit/tables";
import { and, gt, gte, lt, sql } from "drizzle-orm"; import { and, gt, gte, lt, sql } from "drizzle-orm";
import { z } from "zod"; import { 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 = { export const schemas = {
query: z.object({ query: z.object({
max_id: z.string().regex(idValidator).optional(), max_id: z.string().regex(idValidator).optional(),

View file

@ -1,7 +1,6 @@
import { afterAll, beforeAll, describe, expect, test } from "bun:test"; import { afterAll, beforeAll, describe, expect, test } from "bun:test";
import type { Notification as ApiNotification } from "@versia/client/types"; import type { Notification as ApiNotification } from "@versia/client/types";
import { fakeRequest, getTestUsers } from "~/tests/utils"; import { fakeRequest, getTestUsers } from "~/tests/utils";
import { meta } from "./dismiss.ts";
const { users, tokens, deleteUsers } = await getTestUsers(2); const { users, tokens, deleteUsers } = await getTestUsers(2);
let notifications: ApiNotification[] = []; let notifications: ApiNotification[] = [];
@ -30,11 +29,10 @@ afterAll(async () => {
await deleteUsers(); await deleteUsers();
}); });
// /api/v1/notifications/:id/dismiss describe("/api/v1/notifications/:id/dismiss", () => {
describe(meta.route, () => {
test("should return 401 if not authenticated", async () => { test("should return 401 if not authenticated", async () => {
const response = await fakeRequest( const response = await fakeRequest(
meta.route.replace(":id", notifications[0].id), `/api/v1/notifications/${notifications[0].id}/dismiss`,
{ {
method: "POST", method: "POST",
}, },
@ -45,7 +43,7 @@ describe(meta.route, () => {
test("should dismiss notification", async () => { test("should dismiss notification", async () => {
const response = await fakeRequest( const response = await fakeRequest(
meta.route.replace(":id", notifications[0].id), `/api/v1/notifications/${notifications[0].id}/dismiss`,
{ {
method: "POST", method: "POST",
headers: { headers: {
@ -73,7 +71,7 @@ describe(meta.route, () => {
test("should not be able to dismiss other user's notifications", async () => { test("should not be able to dismiss other user's notifications", async () => {
const response = await fakeRequest( const response = await fakeRequest(
meta.route.replace(":id", notifications[0].id), `/api/v1/notifications/${notifications[0].id}/dismiss`,
{ {
method: "POST", method: "POST",
headers: { 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 { createRoute } from "@hono/zod-openapi";
import { Notification } from "@versia/kit/db"; import { Notification } from "@versia/kit/db";
import { RolePermissions } from "@versia/kit/tables"; import { RolePermissions } from "@versia/kit/tables";
import { z } from "zod"; import { z } from "zod";
import { ApiError } from "~/classes/errors/api-error"; 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 = { export const schemas = {
param: z.object({ param: z.object({
id: z.string().uuid(), id: z.string().uuid(),

View file

@ -1,7 +1,6 @@
import { afterAll, beforeAll, describe, expect, test } from "bun:test"; import { afterAll, beforeAll, describe, expect, test } from "bun:test";
import type { Notification as ApiNotification } from "@versia/client/types"; import type { Notification as ApiNotification } from "@versia/client/types";
import { fakeRequest, getTestUsers } from "~/tests/utils"; import { fakeRequest, getTestUsers } from "~/tests/utils";
import { meta } from "./index.ts";
const { users, tokens, deleteUsers } = await getTestUsers(2); const { users, tokens, deleteUsers } = await getTestUsers(2);
let notifications: ApiNotification[] = []; let notifications: ApiNotification[] = [];
@ -31,30 +30,27 @@ afterAll(async () => {
}); });
// /api/v1/notifications/:id // /api/v1/notifications/:id
describe(meta.route, () => { describe("/api/v1/notifications/:id", () => {
test("should return 401 if not authenticated", async () => { test("should return 401 if not authenticated", async () => {
const response = await fakeRequest( 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); expect(response.status).toBe(401);
}); });
test("should return 422 if ID is invalid", async () => { test("should return 422 if ID is invalid", async () => {
const response = await fakeRequest( const response = await fakeRequest("/api/v1/notifications/invalid", {
meta.route.replace(":id", "invalid"),
{
headers: { headers: {
Authorization: `Bearer ${tokens[0].data.accessToken}`, Authorization: `Bearer ${tokens[0].data.accessToken}`,
}, },
}, });
);
expect(response.status).toBe(422); expect(response.status).toBe(422);
}); });
test("should return 404 if notification not found", async () => { test("should return 404 if notification not found", async () => {
const response = await fakeRequest( const response = await fakeRequest(
meta.route.replace(":id", "00000000-0000-0000-0000-000000000000"), "/api/v1/notifications/00000000-0000-0000-0000-000000000000",
{ {
headers: { headers: {
Authorization: `Bearer ${tokens[0].data.accessToken}`, Authorization: `Bearer ${tokens[0].data.accessToken}`,
@ -67,7 +63,7 @@ describe(meta.route, () => {
test("should return notification", async () => { test("should return notification", async () => {
const response = await fakeRequest( const response = await fakeRequest(
meta.route.replace(":id", notifications[0].id), `/api/v1/notifications/${notifications[0].id}`,
{ {
headers: { headers: {
Authorization: `Bearer ${tokens[0].data.accessToken}`, 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 () => { test("should not be able to view other user's notifications", async () => {
const response = await fakeRequest( const response = await fakeRequest(
meta.route.replace(":id", notifications[0].id), `/api/v1/notifications/${notifications[0].id}`,
{ {
headers: { headers: {
Authorization: `Bearer ${tokens[1].data.accessToken}`, 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 { createRoute } from "@hono/zod-openapi";
import { Notification } from "@versia/kit/db"; import { Notification } from "@versia/kit/db";
import { RolePermissions } from "@versia/kit/tables"; import { RolePermissions } from "@versia/kit/tables";
@ -6,21 +6,6 @@ import { z } from "zod";
import { ApiError } from "~/classes/errors/api-error"; import { ApiError } from "~/classes/errors/api-error";
import { ErrorSchema } from "~/types/api"; import { ErrorSchema } from "~/types/api";
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 = { export const schemas = {
param: z.object({ param: z.object({
id: z.string().uuid(), id: z.string().uuid(),

View file

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

View file

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

View file

@ -1,7 +1,6 @@
import { afterAll, beforeAll, describe, expect, test } from "bun:test"; import { afterAll, beforeAll, describe, expect, test } from "bun:test";
import type { Notification as ApiNotification } from "@versia/client/types"; import type { Notification as ApiNotification } from "@versia/client/types";
import { fakeRequest, getTestStatuses, getTestUsers } from "~/tests/utils"; import { fakeRequest, getTestStatuses, getTestUsers } from "~/tests/utils";
import { meta } from "./index.ts";
const getFormData = ( const getFormData = (
object: Record<string, string | number | boolean>, object: Record<string, string | number | boolean>,
@ -73,15 +72,15 @@ afterAll(async () => {
}); });
// /api/v1/notifications // /api/v1/notifications
describe(meta.route, () => { describe("/api/v1/notifications", () => {
test("should return 401 if not authenticated", async () => { 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); expect(response.status).toBe(401);
}); });
test("should return 200 with notifications", async () => { test("should return 200 with notifications", async () => {
const response = await fakeRequest(meta.route, { const response = await fakeRequest("/api/v1/notifications", {
headers: { headers: {
Authorization: `Bearer ${tokens[0].data.accessToken}`, Authorization: `Bearer ${tokens[0].data.accessToken}`,
}, },
@ -130,7 +129,7 @@ describe(meta.route, () => {
expect(filterResponse.status).toBe(200); expect(filterResponse.status).toBe(200);
const response = await fakeRequest(`${meta.route}?limit=20`, { const response = await fakeRequest("/api/v1/notifications?limit=20", {
headers: { headers: {
Authorization: `Bearer ${tokens[0].data.accessToken}`, 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 { createRoute } from "@hono/zod-openapi";
import { Notification, Timeline } from "@versia/kit/db"; import { Notification, Timeline } from "@versia/kit/db";
import { Notifications, RolePermissions } from "@versia/kit/tables"; import { Notifications, RolePermissions } from "@versia/kit/tables";
import { and, eq, gt, gte, inArray, lt, not, sql } from "drizzle-orm"; import { and, eq, gt, gte, inArray, lt, not, sql } from "drizzle-orm";
import { z } from "zod"; 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 = { export const schemas = {
query: z query: z
.object({ .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 { createRoute } from "@hono/zod-openapi";
import { User } from "@versia/kit/db"; import { User } from "@versia/kit/db";
import { RolePermissions } from "@versia/kit/tables"; 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({ const route = createRoute({
method: "delete", method: "delete",
path: "/api/v1/profile/avatar", 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 { createRoute } from "@hono/zod-openapi";
import { User } from "@versia/kit/db"; import { User } from "@versia/kit/db";
import { RolePermissions } from "@versia/kit/tables"; 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({ const route = createRoute({
method: "delete", method: "delete",
path: "/api/v1/profile/header", 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 { createRoute } from "@hono/zod-openapi";
import { Role } from "@versia/kit/db"; import { Role } from "@versia/kit/db";
import { RolePermissions } from "@versia/kit/tables"; import { RolePermissions } from "@versia/kit/tables";
@ -6,24 +6,6 @@ import { z } from "zod";
import { ApiError } from "~/classes/errors/api-error"; import { ApiError } from "~/classes/errors/api-error";
import { ErrorSchema } from "~/types/api"; import { ErrorSchema } from "~/types/api";
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 = { export const schemas = {
param: z.object({ param: z.object({
id: z.string().uuid(), id: z.string().uuid(),

View file

@ -3,7 +3,6 @@ import { Role } from "@versia/kit/db";
import { RolePermissions } from "@versia/kit/tables"; import { RolePermissions } from "@versia/kit/tables";
import { config } from "~/packages/config-manager/index.ts"; import { config } from "~/packages/config-manager/index.ts";
import { fakeRequest, getTestUsers } from "~/tests/utils"; import { fakeRequest, getTestUsers } from "~/tests/utils";
import { meta } from "./index.ts";
const { users, deleteUsers, tokens } = await getTestUsers(1); const { users, deleteUsers, tokens } = await getTestUsers(1);
let role: Role; let role: Role;
@ -31,9 +30,9 @@ afterAll(async () => {
}); });
// /api/v1/roles // /api/v1/roles
describe(meta.route, () => { describe("/api/v1/roles", () => {
test("should return 401 if not authenticated", async () => { test("should return 401 if not authenticated", async () => {
const response = await fakeRequest(meta.route, { const response = await fakeRequest("/api/v1/roles", {
method: "GET", method: "GET",
}); });
@ -41,7 +40,7 @@ describe(meta.route, () => {
}); });
test("should return a list of roles", async () => { test("should return a list of roles", async () => {
const response = await fakeRequest(meta.route, { const response = await fakeRequest("/api/v1/roles", {
method: "GET", method: "GET",
headers: { headers: {
Authorization: `Bearer ${tokens[0].data.accessToken}`, Authorization: `Bearer ${tokens[0].data.accessToken}`,
@ -71,7 +70,7 @@ describe(meta.route, () => {
}); });
test("should create a new role", async () => { test("should create a new role", async () => {
const response = await fakeRequest(meta.route, { const response = await fakeRequest("/api/v1/roles", {
method: "POST", method: "POST",
headers: { headers: {
Authorization: `Bearer ${tokens[0].data.accessToken}`, 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 () => { 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", method: "POST",
headers: { headers: {
Authorization: `Bearer ${tokens[0].data.accessToken}`, 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 () => { 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", method: "POST",
headers: { headers: {
Authorization: `Bearer ${tokens[0].data.accessToken}`, 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 { createRoute, z } from "@hono/zod-openapi";
import { Role } from "@versia/kit/db"; import { Role } from "@versia/kit/db";
import { ApiError } from "~/classes/errors/api-error"; import { ApiError } from "~/classes/errors/api-error";
import { RolePermissions } from "~/drizzle/schema"; import { RolePermissions } from "~/drizzle/schema";
import { ErrorSchema } from "~/types/api"; 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({ const routeGet = createRoute({
method: "get", method: "get",
path: "/api/v1/roles", 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 { createRoute } from "@hono/zod-openapi";
import { Note } from "@versia/kit/db"; import { Note } from "@versia/kit/db";
import { RolePermissions } from "@versia/kit/tables"; import { RolePermissions } from "@versia/kit/tables";
@ -6,20 +6,6 @@ import { z } from "zod";
import { ApiError } from "~/classes/errors/api-error"; import { ApiError } from "~/classes/errors/api-error";
import { ErrorSchema } from "~/types/api"; import { ErrorSchema } from "~/types/api";
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 = { export const schemas = {
param: z.object({ param: z.object({
id: z.string().uuid(), id: z.string().uuid(),

View file

@ -1,7 +1,6 @@
import { afterAll, describe, expect, test } from "bun:test"; import { afterAll, describe, expect, test } from "bun:test";
import type { Status as ApiStatus } from "@versia/client/types"; import type { Status as ApiStatus } from "@versia/client/types";
import { fakeRequest, getTestStatuses, getTestUsers } from "~/tests/utils"; import { fakeRequest, getTestStatuses, getTestUsers } from "~/tests/utils";
import { meta } from "./favourite.ts";
const { users, tokens, deleteUsers } = await getTestUsers(5); const { users, tokens, deleteUsers } = await getTestUsers(5);
const timeline = (await getTestStatuses(2, users[0])).toReversed(); const timeline = (await getTestStatuses(2, users[0])).toReversed();
@ -11,10 +10,10 @@ afterAll(async () => {
}); });
// /api/v1/statuses/:id/favourite // /api/v1/statuses/:id/favourite
describe(meta.route, () => { describe("/api/v1/statuses/:id/favourite", () => {
test("should return 401 if not authenticated", async () => { test("should return 401 if not authenticated", async () => {
const response = await fakeRequest( const response = await fakeRequest(
meta.route.replace(":id", timeline[0].id), `/api/v1/statuses/${timeline[0].id}/favourite`,
{ {
method: "POST", method: "POST",
}, },
@ -25,7 +24,7 @@ describe(meta.route, () => {
test("should favourite post", async () => { test("should favourite post", async () => {
const response = await fakeRequest( const response = await fakeRequest(
meta.route.replace(":id", timeline[0].id), `/api/v1/statuses/${timeline[0].id}/favourite`,
{ {
method: "POST", method: "POST",
headers: { 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 { createRoute } from "@hono/zod-openapi";
import { Note } from "@versia/kit/db"; import { Note } from "@versia/kit/db";
import { RolePermissions } from "@versia/kit/tables"; import { RolePermissions } from "@versia/kit/tables";
@ -6,20 +6,6 @@ import { z } from "zod";
import { ApiError } from "~/classes/errors/api-error"; import { ApiError } from "~/classes/errors/api-error";
import { ErrorSchema } from "~/types/api"; import { ErrorSchema } from "~/types/api";
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 = { export const schemas = {
param: z.object({ param: z.object({
id: z.string().uuid(), id: z.string().uuid(),

View file

@ -1,7 +1,6 @@
import { afterAll, beforeAll, describe, expect, test } from "bun:test"; import { afterAll, beforeAll, describe, expect, test } from "bun:test";
import type { Account as ApiAccount } from "@versia/client/types"; import type { Account as ApiAccount } from "@versia/client/types";
import { fakeRequest, getTestStatuses, getTestUsers } from "~/tests/utils"; import { fakeRequest, getTestStatuses, getTestUsers } from "~/tests/utils";
import { meta } from "./favourited_by.ts";
const { users, tokens, deleteUsers } = await getTestUsers(5); const { users, tokens, deleteUsers } = await getTestUsers(5);
const timeline = (await getTestStatuses(40, users[0])).toReversed(); const timeline = (await getTestStatuses(40, users[0])).toReversed();
@ -22,10 +21,10 @@ beforeAll(async () => {
}); });
// /api/v1/statuses/:id/favourited_by // /api/v1/statuses/:id/favourited_by
describe(meta.route, () => { describe("/api/v1/statuses/:id/favourited_by", () => {
test("should return 401 if not authenticated", async () => { test("should return 401 if not authenticated", async () => {
const response = await fakeRequest( const response = await fakeRequest(
meta.route.replace(":id", timeline[0].id), `/api/v1/statuses/${timeline[0].id}/favourited_by`,
); );
expect(response.status).toBe(401); expect(response.status).toBe(401);
@ -33,7 +32,7 @@ describe(meta.route, () => {
test("should return 200 with users", async () => { test("should return 200 with users", async () => {
const response = await fakeRequest( const response = await fakeRequest(
meta.route.replace(":id", timeline[0].id), `/api/v1/statuses/${timeline[0].id}/favourited_by`,
{ {
headers: { headers: {
Authorization: `Bearer ${tokens[0].data.accessToken}`, 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 { createRoute } from "@hono/zod-openapi";
import { Note, Timeline, User } from "@versia/kit/db"; import { Note, Timeline, User } from "@versia/kit/db";
import { RolePermissions, Users } from "@versia/kit/tables"; import { RolePermissions, Users } from "@versia/kit/tables";
@ -7,20 +7,6 @@ import { z } from "zod";
import { ApiError } from "~/classes/errors/api-error"; import { ApiError } from "~/classes/errors/api-error";
import { ErrorSchema } from "~/types/api"; import { ErrorSchema } from "~/types/api";
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 = { export const schemas = {
query: z.object({ query: z.object({
max_id: z.string().regex(idValidator).optional(), 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 { createRoute } from "@hono/zod-openapi";
import { Attachment, Note } from "@versia/kit/db"; import { Attachment, Note } from "@versia/kit/db";
import { RolePermissions } from "@versia/kit/tables"; 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 { config } from "~/packages/config-manager/index.ts";
import { ErrorSchema } from "~/types/api"; 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 = { export const schemas = {
param: z.object({ param: z.object({
id: z.string().regex(idValidator), 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 { createRoute } from "@hono/zod-openapi";
import { Note, db } from "@versia/kit/db"; import { Note, db } from "@versia/kit/db";
import { RolePermissions } from "@versia/kit/tables"; import { RolePermissions } from "@versia/kit/tables";
@ -7,20 +7,6 @@ import { z } from "zod";
import { ApiError } from "~/classes/errors/api-error"; import { ApiError } from "~/classes/errors/api-error";
import { ErrorSchema } from "~/types/api"; import { ErrorSchema } from "~/types/api";
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 = { export const schemas = {
param: z.object({ param: z.object({
id: z.string().regex(idValidator), 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 { createRoute } from "@hono/zod-openapi";
import { Note } from "@versia/kit/db"; import { Note } from "@versia/kit/db";
import { Notes, RolePermissions } from "@versia/kit/tables"; import { Notes, RolePermissions } from "@versia/kit/tables";
@ -7,20 +7,6 @@ import { z } from "zod";
import { ApiError } from "~/classes/errors/api-error"; import { ApiError } from "~/classes/errors/api-error";
import { ErrorSchema } from "~/types/api"; import { ErrorSchema } from "~/types/api";
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 = { export const schemas = {
param: z.object({ param: z.object({
id: z.string().uuid(), id: z.string().uuid(),

View file

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

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