mirror of
https://github.com/versia-pub/server.git
synced 2025-12-06 16:38:19 +01:00
refactor(api): 🔥 Remove all useless route metadata objects
This commit is contained in:
parent
a9ea5eb672
commit
4926d6ff5d
|
|
@ -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();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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(),
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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),
|
||||||
|
|
|
||||||
|
|
@ -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: {
|
||||||
|
|
|
||||||
|
|
@ -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(),
|
||||||
|
|
|
||||||
|
|
@ -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: {
|
||||||
|
|
|
||||||
|
|
@ -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(),
|
||||||
|
|
|
||||||
|
|
@ -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}`,
|
||||||
|
|
|
||||||
|
|
@ -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(),
|
||||||
|
|
|
||||||
|
|
@ -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}`,
|
||||||
|
|
|
||||||
|
|
@ -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(),
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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(),
|
||||||
|
|
|
||||||
|
|
@ -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: {
|
||||||
|
|
|
||||||
|
|
@ -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(),
|
||||||
|
|
|
||||||
|
|
@ -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(),
|
||||||
|
|
|
||||||
|
|
@ -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(),
|
||||||
|
|
|
||||||
|
|
@ -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(),
|
||||||
|
|
|
||||||
|
|
@ -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(),
|
||||||
|
|
|
||||||
|
|
@ -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(),
|
||||||
|
|
|
||||||
|
|
@ -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(),
|
||||||
|
|
|
||||||
|
|
@ -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}`,
|
||||||
|
|
|
||||||
|
|
@ -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(),
|
||||||
|
|
|
||||||
|
|
@ -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(),
|
||||||
|
|
|
||||||
|
|
@ -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(),
|
||||||
|
|
|
||||||
|
|
@ -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: {
|
||||||
|
|
|
||||||
|
|
@ -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(),
|
||||||
|
|
|
||||||
|
|
@ -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(),
|
||||||
|
|
|
||||||
|
|
@ -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}`,
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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(),
|
||||||
|
|
|
||||||
|
|
@ -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",
|
||||||
|
|
|
||||||
|
|
@ -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(),
|
||||||
|
|
|
||||||
|
|
@ -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}`,
|
||||||
|
|
|
||||||
|
|
@ -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(),
|
||||||
|
|
|
||||||
|
|
@ -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}`,
|
||||||
|
|
|
||||||
|
|
@ -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()),
|
||||||
|
|
|
||||||
|
|
@ -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}`,
|
||||||
|
|
|
||||||
|
|
@ -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),
|
||||||
|
|
|
||||||
|
|
@ -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(
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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",
|
||||||
|
|
|
||||||
|
|
@ -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),
|
||||||
|
|
|
||||||
|
|
@ -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",
|
||||||
|
|
|
||||||
|
|
@ -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(),
|
||||||
|
|
|
||||||
|
|
@ -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",
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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",
|
||||||
|
|
|
||||||
|
|
@ -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(
|
||||||
|
|
|
||||||
|
|
@ -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",
|
||||||
|
|
|
||||||
|
|
@ -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}`,
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -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(),
|
||||||
|
|
|
||||||
|
|
@ -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}`,
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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(),
|
||||||
|
|
|
||||||
|
|
@ -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(),
|
||||||
|
|
|
||||||
|
|
@ -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(),
|
||||||
|
|
|
||||||
|
|
@ -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(),
|
||||||
|
|
|
||||||
|
|
@ -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",
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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",
|
||||||
|
|
|
||||||
|
|
@ -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",
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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",
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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",
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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",
|
||||||
|
|
|
||||||
|
|
@ -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"],
|
||||||
])}`,
|
])}`,
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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(),
|
||||||
|
|
|
||||||
|
|
@ -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),
|
||||||
|
|
|
||||||
|
|
@ -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}`,
|
||||||
|
|
|
||||||
|
|
@ -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(),
|
||||||
|
|
|
||||||
|
|
@ -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: {
|
||||||
|
|
|
||||||
|
|
@ -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(),
|
||||||
|
|
|
||||||
|
|
@ -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}`,
|
||||||
|
|
|
||||||
|
|
@ -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(),
|
||||||
|
|
|
||||||
|
|
@ -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}`,
|
||||||
|
|
|
||||||
|
|
@ -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",
|
||||||
|
|
|
||||||
|
|
@ -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()}`,
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -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()),
|
||||||
|
|
|
||||||
|
|
@ -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}`,
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -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({
|
||||||
|
|
|
||||||
|
|
@ -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",
|
||||||
|
|
|
||||||
|
|
@ -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",
|
||||||
|
|
|
||||||
|
|
@ -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(),
|
||||||
|
|
|
||||||
|
|
@ -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}`,
|
||||||
|
|
|
||||||
|
|
@ -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",
|
||||||
|
|
|
||||||
|
|
@ -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(),
|
||||||
|
|
|
||||||
|
|
@ -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: {
|
||||||
|
|
|
||||||
|
|
@ -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(),
|
||||||
|
|
|
||||||
|
|
@ -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}`,
|
||||||
|
|
|
||||||
|
|
@ -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(),
|
||||||
|
|
|
||||||
|
|
@ -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),
|
||||||
|
|
|
||||||
|
|
@ -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),
|
||||||
|
|
|
||||||
|
|
@ -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(),
|
||||||
|
|
|
||||||
|
|
@ -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
Loading…
Reference in a new issue