mirror of
https://github.com/versia-pub/server.git
synced 2025-12-06 16:38:19 +01:00
Compare commits
No commits in common. "1f03017327efe7d686d3958da2d848734bc2b100" and "a211772309cbb1b358c92a4862e3860c3d62b6e3" have entirely different histories.
1f03017327
...
a211772309
2
.github/copilot-instructions.md
vendored
2
.github/copilot-instructions.md
vendored
|
|
@ -13,4 +13,4 @@ const add = (a: number, b: number): number => a + b;
|
|||
|
||||
We always write TypeScript with double quotes and four spaces for indentation, so when your responses include TypeScript code, please follow those conventions.
|
||||
|
||||
Our codebase uses Drizzle as an ORM, with custom abstractions in `classes/database/` for interacting with the database. The `@versia-server/kit/db` and `@versia-server/kit/tables` packages are aliases for these abstractions.
|
||||
Our codebase uses Drizzle as an ORM, with custom abstractions in `classes/database/` for interacting with the database. The `@versia/kit/db` and `@versia/kit/tables` packages are aliases for these abstractions.
|
||||
|
|
|
|||
|
|
@ -1,12 +1,8 @@
|
|||
import type { Status } from "@versia/client/schemas";
|
||||
import {
|
||||
fakeRequest,
|
||||
getTestStatuses,
|
||||
getTestUsers,
|
||||
} from "@versia-server/tests";
|
||||
import { bench, run } from "mitata";
|
||||
import type { z } from "zod";
|
||||
import { configureLoggers } from "@/loggers";
|
||||
import { fakeRequest, getTestStatuses, getTestUsers } from "~/tests/utils";
|
||||
|
||||
await configureLoggers(true);
|
||||
|
||||
|
|
|
|||
60
bun.lock
60
bun.lock
|
|
@ -19,9 +19,8 @@
|
|||
"@scalar/hono-api-reference": "catalog:",
|
||||
"@sentry/bun": "catalog:",
|
||||
"@versia-server/config": "workspace:*",
|
||||
"@versia-server/kit": "workspace:*",
|
||||
"@versia-server/tests": "workspace:*",
|
||||
"@versia/client": "workspace:*",
|
||||
"@versia/kit": "workspace:*",
|
||||
"@versia/sdk": "workspace:*",
|
||||
"altcha-lib": "catalog:",
|
||||
"blurhash": "catalog:",
|
||||
|
|
@ -67,7 +66,6 @@
|
|||
"zod-validation-error": "catalog:",
|
||||
},
|
||||
"devDependencies": {
|
||||
"@biomejs/biome": "catalog:",
|
||||
"@types/bun": "catalog:",
|
||||
"@types/html-to-text": "catalog:",
|
||||
"@types/markdown-it-container": "catalog:",
|
||||
|
|
@ -90,15 +88,12 @@
|
|||
"name": "@versia-server/api",
|
||||
"version": "0.9.0-alpha.0",
|
||||
"dependencies": {
|
||||
"@hono/zod-validator": "catalog:",
|
||||
"@logtape/logtape": "catalog:",
|
||||
"@scalar/hono-api-reference": "catalog:",
|
||||
"@versia-server/config": "workspace:*",
|
||||
"@versia-server/kit": "workspace:*",
|
||||
"@versia-server/tests": "workspace:*",
|
||||
"@versia/client": "workspace:*",
|
||||
"@versia/kit": "workspace:*",
|
||||
"@versia/sdk": "workspace:*",
|
||||
"altcha-lib": "catalog:",
|
||||
"bun-bagel": "catalog:",
|
||||
"chalk": "catalog:",
|
||||
"drizzle-orm": "catalog:",
|
||||
|
|
@ -108,15 +103,12 @@
|
|||
"ip-matching": "catalog:",
|
||||
"iso-639-1": "catalog:",
|
||||
"jose": "catalog:",
|
||||
"magic-regexp": "catalog:",
|
||||
"qs": "catalog:",
|
||||
"sharp": "catalog:",
|
||||
"string-comparison": "catalog:",
|
||||
"unicode-emoji-json": "catalog:",
|
||||
"youch": "catalog:",
|
||||
"zod": "catalog:",
|
||||
"zod-openapi": "catalog:",
|
||||
"zod-validation-error": "catalog:",
|
||||
},
|
||||
},
|
||||
"packages/client": {
|
||||
|
|
@ -146,11 +138,9 @@
|
|||
},
|
||||
},
|
||||
"packages/plugin-kit": {
|
||||
"name": "@versia-server/kit",
|
||||
"name": "@versia/kit",
|
||||
"version": "0.0.0",
|
||||
"dependencies": {
|
||||
"@hackmd/markdown-it-task-lists": "catalog:",
|
||||
"@hono/zod-validator": "catalog:",
|
||||
"@logtape/logtape": "catalog:",
|
||||
"@versia-server/config": "workspace:*",
|
||||
"@versia/client": "workspace:*",
|
||||
|
|
@ -161,14 +151,8 @@
|
|||
"hono": "catalog:",
|
||||
"hono-openapi": "catalog:",
|
||||
"html-to-text": "catalog:",
|
||||
"ioredis": "catalog:",
|
||||
"linkify-html": "catalog:",
|
||||
"magic-regexp": "catalog:",
|
||||
"markdown-it": "catalog:",
|
||||
"markdown-it-container": "catalog:",
|
||||
"markdown-it-toc-done-right": "catalog:",
|
||||
"mitt": "catalog:",
|
||||
"qs": "catalog:",
|
||||
"sharp": "catalog:",
|
||||
"zod": "catalog:",
|
||||
"zod-to-json-schema": "catalog:",
|
||||
|
|
@ -184,24 +168,13 @@
|
|||
"zod": "catalog:",
|
||||
},
|
||||
},
|
||||
"packages/tests": {
|
||||
"name": "@versia-server/tests",
|
||||
"version": "0.0.1",
|
||||
"dependencies": {
|
||||
"@versia-server/config": "workspace:*",
|
||||
"@versia-server/kit": "workspace:*",
|
||||
"@versia/client": "workspace:*",
|
||||
"altcha-lib": "catalog:",
|
||||
"drizzle-orm": "catalog:",
|
||||
},
|
||||
},
|
||||
"packages/worker": {
|
||||
"name": "@versia-server/worker",
|
||||
"version": "0.9.0-alpha.0",
|
||||
"dependencies": {
|
||||
"@logtape/logtape": "catalog:",
|
||||
"@versia-server/config": "workspace:*",
|
||||
"@versia-server/kit": "workspace:*",
|
||||
"@versia/kit": "workspace:*",
|
||||
"chalk": "catalog:",
|
||||
},
|
||||
},
|
||||
|
|
@ -209,7 +182,6 @@
|
|||
"trustedDependencies": [
|
||||
"sharp",
|
||||
"esbuild",
|
||||
"@biomejs/biome",
|
||||
"msgpackr-extract",
|
||||
],
|
||||
"catalog": {
|
||||
|
|
@ -339,24 +311,6 @@
|
|||
|
||||
"@badgateway/oauth2-client": ["@badgateway/oauth2-client@3.2.0", "", {}, "sha512-EHsoV6oLHot7HeYkIoSxCZApNgBjwNo1OTV9kXIDnmijGAshlVkJreVAAtexFn+sfDKPE0JW5SCPYJV1y4IoMg=="],
|
||||
|
||||
"@biomejs/biome": ["@biomejs/biome@2.0.0-beta.5", "", { "optionalDependencies": { "@biomejs/cli-darwin-arm64": "2.0.0-beta.5", "@biomejs/cli-darwin-x64": "2.0.0-beta.5", "@biomejs/cli-linux-arm64": "2.0.0-beta.5", "@biomejs/cli-linux-arm64-musl": "2.0.0-beta.5", "@biomejs/cli-linux-x64": "2.0.0-beta.5", "@biomejs/cli-linux-x64-musl": "2.0.0-beta.5", "@biomejs/cli-win32-arm64": "2.0.0-beta.5", "@biomejs/cli-win32-x64": "2.0.0-beta.5" }, "bin": { "biome": "bin/biome" } }, "sha512-1ldO4AepieVvg4aLi1ubZkA7NsefQT2UTNssbJbDiQTGem8kCHx/PZCwLxIR6UzFpGIjh0xsDzivyVvhnmqmuA=="],
|
||||
|
||||
"@biomejs/cli-darwin-arm64": ["@biomejs/cli-darwin-arm64@2.0.0-beta.5", "", { "os": "darwin", "cpu": "arm64" }, "sha512-pnJiaoDpwGo+ctGkMu4POcO8jgOgCErBdYbhutr+K9rxxJS+TlHLr0LR91GCEWbGV2O1oyZRFQcW21rYFoak4w=="],
|
||||
|
||||
"@biomejs/cli-darwin-x64": ["@biomejs/cli-darwin-x64@2.0.0-beta.5", "", { "os": "darwin", "cpu": "x64" }, "sha512-WwEZpqcmsNoFpZkUFNQcbZo52WK4hLGQ0vZk3PQ8JlZ55gJsHiyhtv6aem6fVlyVCvZgpsC0sYPLE3VvFVKNAQ=="],
|
||||
|
||||
"@biomejs/cli-linux-arm64": ["@biomejs/cli-linux-arm64@2.0.0-beta.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-lAF1de+Ki0vnq14NwDXouKkAR/iviyMNrUngSHjTGFC4z8XGVEfIw0ZMSm7fAdJZ5fAWodt9HiYmEAVs5EtHQg=="],
|
||||
|
||||
"@biomejs/cli-linux-arm64-musl": ["@biomejs/cli-linux-arm64-musl@2.0.0-beta.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-4vxNkYx1uEt211W8hLdXddc7icRHQgYENb72g6uTd/tLVPSBvIwqUAxAOkU+9Ai1E/8R4sWy7HIxREgpuFgbNA=="],
|
||||
|
||||
"@biomejs/cli-linux-x64": ["@biomejs/cli-linux-x64@2.0.0-beta.5", "", { "os": "linux", "cpu": "x64" }, "sha512-I0Pt1VHeL1mN8G7ZwV2u9AfzBd5ZKfbvHUI4x2wETUZbwcQlAu/nEzEa2LUe5HqSmnctTR36ig7RkkM9qbmIrA=="],
|
||||
|
||||
"@biomejs/cli-linux-x64-musl": ["@biomejs/cli-linux-x64-musl@2.0.0-beta.5", "", { "os": "linux", "cpu": "x64" }, "sha512-nUeKGO517GtRCxziVD9les1HiCs2s2/WIVITMN9+9RRuLOko8r+T77E8ZXEmlfLOfOIOeE6z62WITqei3oNccA=="],
|
||||
|
||||
"@biomejs/cli-win32-arm64": ["@biomejs/cli-win32-arm64@2.0.0-beta.5", "", { "os": "win32", "cpu": "arm64" }, "sha512-YXW6hgbrgBcWQ1SLO69ypWlluPchgQV5C1lTG4xOcBUWdCsfYuQirM64S6Dov7SFPqsMIoFC6LlQRW+n8qAyiA=="],
|
||||
|
||||
"@biomejs/cli-win32-x64": ["@biomejs/cli-win32-x64@2.0.0-beta.5", "", { "os": "win32", "cpu": "x64" }, "sha512-N7Yby52BJmvEdst1iMbclE5hxxefboaXKRJLm1tLfBYr4FeuoCe6j8HdiQSwhCRdIUGFFqBLaDXh//LLF6EReA=="],
|
||||
|
||||
"@bull-board/api": ["@bull-board/api@6.10.1", "", { "dependencies": { "redis-info": "^3.1.0" }, "peerDependencies": { "@bull-board/ui": "6.10.1" } }, "sha512-VPkZa2XZI2Wk2MqK1XyiiS+tOhNan54mnm2fpv2KA0fdZ92mQqNjhKkOpsykhQv9XUEc8cCRlZqGxf67YCMJbQ=="],
|
||||
|
||||
"@bull-board/hono": ["@bull-board/hono@6.10.1", "", { "dependencies": { "@bull-board/api": "6.10.1", "@bull-board/ui": "6.10.1", "ejs": "^3.1.10" }, "peerDependencies": { "hono": "^4" } }, "sha512-2I9BUS7jbtQ4tCKOJdVKQn6uW8MXJKUGIhHLK2r4X8kiXZvk2I7jjt0KZ4VNyF9nfoBblgX5WemxE4sU61kGGg=="],
|
||||
|
|
@ -739,14 +693,12 @@
|
|||
|
||||
"@versia-server/config": ["@versia-server/config@workspace:packages/config"],
|
||||
|
||||
"@versia-server/kit": ["@versia-server/kit@workspace:packages/plugin-kit"],
|
||||
|
||||
"@versia-server/tests": ["@versia-server/tests@workspace:packages/tests"],
|
||||
|
||||
"@versia-server/worker": ["@versia-server/worker@workspace:packages/worker"],
|
||||
|
||||
"@versia/client": ["@versia/client@workspace:packages/client"],
|
||||
|
||||
"@versia/kit": ["@versia/kit@workspace:packages/plugin-kit"],
|
||||
|
||||
"@versia/sdk": ["@versia/sdk@workspace:packages/sdk"],
|
||||
|
||||
"@vitejs/plugin-vue": ["@vitejs/plugin-vue@5.2.3", "", { "peerDependencies": { "vite": "^5.0.0 || ^6.0.0", "vue": "^3.2.25" } }, "sha512-IYSLEQj4LgZZuoVpdSUCw3dIynTWQgPlaRP6iAvMle4My0HdYwr5g5wQAfwOeHQBmYwEkqF70nRpSilr6PoUDg=="],
|
||||
|
|
|
|||
|
|
@ -2,4 +2,4 @@
|
|||
"@jsr" = "https://npm.jsr.io"
|
||||
|
||||
[test]
|
||||
preload = ["./packages/tests/setup.ts"]
|
||||
preload = ["./tests/setup.ts"]
|
||||
|
|
|
|||
359
classes/functions/status.ts
Normal file
359
classes/functions/status.ts
Normal file
|
|
@ -0,0 +1,359 @@
|
|||
import markdownItTaskLists from "@hackmd/markdown-it-task-lists";
|
||||
import { db, type Note, User } from "@versia/kit/db";
|
||||
import { Instances, Users } from "@versia/kit/tables";
|
||||
import type * as VersiaEntities from "@versia/sdk/entities";
|
||||
import { FederationRequester } from "@versia/sdk/http";
|
||||
import { config } from "@versia-server/config";
|
||||
import { and, eq, inArray, isNull, or, sql } from "drizzle-orm";
|
||||
import linkifyHtml from "linkify-html";
|
||||
import {
|
||||
anyOf,
|
||||
charIn,
|
||||
createRegExp,
|
||||
digit,
|
||||
exactly,
|
||||
global,
|
||||
letter,
|
||||
} from "magic-regexp";
|
||||
import MarkdownIt from "markdown-it";
|
||||
import markdownItContainer from "markdown-it-container";
|
||||
import markdownItTocDoneRight from "markdown-it-toc-done-right";
|
||||
import { mentionValidator } from "@/api";
|
||||
import { sanitizeHtml, sanitizeHtmlInline } from "@/sanitization";
|
||||
import { transformOutputToUserWithRelations, userRelations } from "./user.ts";
|
||||
|
||||
/**
|
||||
* Wrapper against the Status object to make it easier to work with
|
||||
* @param query
|
||||
* @returns
|
||||
*/
|
||||
export const findManyNotes = async (
|
||||
query: Parameters<typeof db.query.Notes.findMany>[0],
|
||||
userId?: string,
|
||||
): Promise<(typeof Note.$type)[]> => {
|
||||
const output = await db.query.Notes.findMany({
|
||||
...query,
|
||||
with: {
|
||||
...query?.with,
|
||||
attachments: {
|
||||
with: {
|
||||
media: true,
|
||||
},
|
||||
},
|
||||
reactions: {
|
||||
with: {
|
||||
emoji: {
|
||||
with: {
|
||||
instance: true,
|
||||
media: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
emojis: {
|
||||
with: {
|
||||
emoji: {
|
||||
with: {
|
||||
instance: true,
|
||||
media: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
author: {
|
||||
with: {
|
||||
...userRelations,
|
||||
},
|
||||
},
|
||||
mentions: {
|
||||
with: {
|
||||
user: {
|
||||
with: {
|
||||
instance: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
reblog: {
|
||||
with: {
|
||||
attachments: {
|
||||
with: {
|
||||
media: true,
|
||||
},
|
||||
},
|
||||
reactions: {
|
||||
with: {
|
||||
emoji: {
|
||||
with: {
|
||||
instance: true,
|
||||
media: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
emojis: {
|
||||
with: {
|
||||
emoji: {
|
||||
with: {
|
||||
instance: true,
|
||||
media: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
likes: true,
|
||||
application: true,
|
||||
mentions: {
|
||||
with: {
|
||||
user: {
|
||||
with: userRelations,
|
||||
},
|
||||
},
|
||||
},
|
||||
author: {
|
||||
with: {
|
||||
...userRelations,
|
||||
},
|
||||
},
|
||||
},
|
||||
extras: {
|
||||
pinned: userId
|
||||
? sql`EXISTS (SELECT 1 FROM "UserToPinnedNotes" WHERE "UserToPinnedNotes"."noteId" = "Notes_reblog".id AND "UserToPinnedNotes"."userId" = ${userId})`.as(
|
||||
"pinned",
|
||||
)
|
||||
: sql`false`.as("pinned"),
|
||||
reblogged: userId
|
||||
? sql`EXISTS (SELECT 1 FROM "Notes" WHERE "Notes"."authorId" = ${userId} AND "Notes"."reblogId" = "Notes_reblog".id)`.as(
|
||||
"reblogged",
|
||||
)
|
||||
: sql`false`.as("reblogged"),
|
||||
muted: userId
|
||||
? sql`EXISTS (SELECT 1 FROM "Relationships" WHERE "Relationships"."ownerId" = ${userId} AND "Relationships"."subjectId" = "Notes_reblog"."authorId" AND "Relationships"."muting" = true)`.as(
|
||||
"muted",
|
||||
)
|
||||
: sql`false`.as("muted"),
|
||||
liked: userId
|
||||
? sql`EXISTS (SELECT 1 FROM "Likes" WHERE "Likes"."likedId" = "Notes_reblog".id AND "Likes"."likerId" = ${userId})`.as(
|
||||
"liked",
|
||||
)
|
||||
: sql`false`.as("liked"),
|
||||
},
|
||||
},
|
||||
reply: true,
|
||||
quote: true,
|
||||
},
|
||||
extras: {
|
||||
pinned: userId
|
||||
? sql`EXISTS (SELECT 1 FROM "UserToPinnedNotes" WHERE "UserToPinnedNotes"."noteId" = "Notes".id AND "UserToPinnedNotes"."userId" = ${userId})`.as(
|
||||
"pinned",
|
||||
)
|
||||
: sql`false`.as("pinned"),
|
||||
reblogged: userId
|
||||
? sql`EXISTS (SELECT 1 FROM "Notes" WHERE "Notes"."authorId" = ${userId} AND "Notes"."reblogId" = "Notes".id)`.as(
|
||||
"reblogged",
|
||||
)
|
||||
: sql`false`.as("reblogged"),
|
||||
muted: userId
|
||||
? sql`EXISTS (SELECT 1 FROM "Relationships" WHERE "Relationships"."ownerId" = ${userId} AND "Relationships"."subjectId" = "Notes"."authorId" AND "Relationships"."muting" = true)`.as(
|
||||
"muted",
|
||||
)
|
||||
: sql`false`.as("muted"),
|
||||
liked: userId
|
||||
? sql`EXISTS (SELECT 1 FROM "Likes" WHERE "Likes"."likedId" = "Notes".id AND "Likes"."likerId" = ${userId})`.as(
|
||||
"liked",
|
||||
)
|
||||
: sql`false`.as("liked"),
|
||||
...query?.extras,
|
||||
},
|
||||
});
|
||||
|
||||
return output.map((post) => ({
|
||||
...post,
|
||||
author: transformOutputToUserWithRelations(post.author),
|
||||
mentions: post.mentions.map((mention) => ({
|
||||
...mention.user,
|
||||
endpoints: mention.user.endpoints,
|
||||
})),
|
||||
attachments: post.attachments.map((attachment) => attachment.media),
|
||||
emojis: (post.emojis ?? []).map((emoji) => emoji.emoji),
|
||||
reblog: post.reblog && {
|
||||
...post.reblog,
|
||||
author: transformOutputToUserWithRelations(post.reblog.author),
|
||||
mentions: post.reblog.mentions.map((mention) => ({
|
||||
...mention.user,
|
||||
endpoints: mention.user.endpoints,
|
||||
})),
|
||||
attachments: post.reblog.attachments.map(
|
||||
(attachment) => attachment.media,
|
||||
),
|
||||
emojis: (post.reblog.emojis ?? []).map((emoji) => emoji.emoji),
|
||||
pinned: Boolean(post.reblog.pinned),
|
||||
reblogged: Boolean(post.reblog.reblogged),
|
||||
muted: Boolean(post.reblog.muted),
|
||||
liked: Boolean(post.reblog.liked),
|
||||
},
|
||||
pinned: Boolean(post.pinned),
|
||||
reblogged: Boolean(post.reblogged),
|
||||
muted: Boolean(post.muted),
|
||||
liked: Boolean(post.liked),
|
||||
}));
|
||||
};
|
||||
|
||||
/**
|
||||
* Get people mentioned in the content (match @username or @username@domain.com mentions)
|
||||
* @param text The text to parse mentions from.
|
||||
* @returns An array of users mentioned in the text.
|
||||
*/
|
||||
export const parseTextMentions = async (text: string): Promise<User[]> => {
|
||||
const mentionedPeople = [...text.matchAll(mentionValidator)];
|
||||
if (mentionedPeople.length === 0) {
|
||||
return [];
|
||||
}
|
||||
|
||||
const baseUrlHost = config.http.base_url.host;
|
||||
const isLocal = (host?: string): boolean => host === baseUrlHost || !host;
|
||||
|
||||
// Find local and matching users
|
||||
const foundUsers = await db
|
||||
.select({
|
||||
id: Users.id,
|
||||
username: Users.username,
|
||||
baseUrl: Instances.baseUrl,
|
||||
})
|
||||
.from(Users)
|
||||
.leftJoin(Instances, eq(Users.instanceId, Instances.id))
|
||||
.where(
|
||||
or(
|
||||
...mentionedPeople.map((person) =>
|
||||
and(
|
||||
eq(Users.username, person[1] ?? ""),
|
||||
isLocal(person[2])
|
||||
? isNull(Users.instanceId)
|
||||
: eq(Instances.baseUrl, person[2] ?? ""),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
|
||||
// Separate found and unresolved users
|
||||
const finalList = await User.manyFromSql(
|
||||
inArray(
|
||||
Users.id,
|
||||
foundUsers.map((u) => u.id),
|
||||
),
|
||||
);
|
||||
|
||||
// Every remote user that isn't in database
|
||||
const notFoundRemoteUsers = mentionedPeople.filter(
|
||||
(p) =>
|
||||
!(
|
||||
foundUsers.some(
|
||||
(user) => user.username === p[1] && user.baseUrl === p[2],
|
||||
) || isLocal(p[2])
|
||||
),
|
||||
);
|
||||
|
||||
// Resolve remote mentions not in database
|
||||
for (const person of notFoundRemoteUsers) {
|
||||
const url = await FederationRequester.resolveWebFinger(
|
||||
person[1] ?? "",
|
||||
person[2] ?? "",
|
||||
);
|
||||
|
||||
if (url) {
|
||||
const user = await User.resolve(url);
|
||||
|
||||
if (user) {
|
||||
finalList.push(user);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return finalList;
|
||||
};
|
||||
|
||||
export const replaceTextMentions = (text: string, mentions: User[]): string => {
|
||||
return mentions.reduce((finalText, mention) => {
|
||||
const { username, instance } = mention.data;
|
||||
const { uri } = mention;
|
||||
const baseHost = config.http.base_url.host;
|
||||
const linkTemplate = (displayText: string): string =>
|
||||
`<a class="u-url mention" rel="nofollow noopener noreferrer" target="_blank" href="${uri}">${displayText}</a>`;
|
||||
|
||||
if (mention.remote) {
|
||||
return finalText.replaceAll(
|
||||
`@${username}@${instance?.baseUrl}`,
|
||||
linkTemplate(`@${username}@${instance?.baseUrl}`),
|
||||
);
|
||||
}
|
||||
|
||||
return finalText.replace(
|
||||
createRegExp(
|
||||
exactly(
|
||||
exactly(`@${username}`)
|
||||
.notBefore(anyOf(letter, digit, charIn("@")))
|
||||
.notAfter(anyOf(letter, digit, charIn("@"))),
|
||||
).or(exactly(`@${username}@${baseHost}`)),
|
||||
[global],
|
||||
),
|
||||
linkTemplate(`@${username}@${baseHost}`),
|
||||
);
|
||||
}, text);
|
||||
};
|
||||
|
||||
export const contentToHtml = async (
|
||||
content: VersiaEntities.TextContentFormat,
|
||||
mentions: User[] = [],
|
||||
inline = false,
|
||||
): Promise<string> => {
|
||||
const sanitizer = inline ? sanitizeHtmlInline : sanitizeHtml;
|
||||
let htmlContent = "";
|
||||
|
||||
if (content.data["text/html"]) {
|
||||
htmlContent = await sanitizer(content.data["text/html"].content);
|
||||
} else if (content.data["text/markdown"]) {
|
||||
htmlContent = await sanitizer(
|
||||
await markdownParse(content.data["text/markdown"].content),
|
||||
);
|
||||
} else if (content.data["text/plain"]?.content) {
|
||||
htmlContent = (await sanitizer(content.data["text/plain"].content))
|
||||
.split("\n")
|
||||
.map((line) => `<p>${line}</p>`)
|
||||
.join("\n");
|
||||
}
|
||||
|
||||
htmlContent = replaceTextMentions(htmlContent, mentions);
|
||||
|
||||
return linkifyHtml(htmlContent, {
|
||||
defaultProtocol: "https",
|
||||
validate: { email: (): false => false },
|
||||
target: "_blank",
|
||||
rel: "nofollow noopener noreferrer",
|
||||
});
|
||||
};
|
||||
|
||||
export const markdownParse = async (content: string): Promise<string> => {
|
||||
return (await getMarkdownRenderer()).render(content);
|
||||
};
|
||||
|
||||
export const getMarkdownRenderer = (): MarkdownIt => {
|
||||
const renderer = MarkdownIt({
|
||||
html: true,
|
||||
linkify: true,
|
||||
});
|
||||
|
||||
renderer.use(markdownItTocDoneRight, {
|
||||
containerClass: "toc",
|
||||
level: [1, 2, 3, 4],
|
||||
listType: "ul",
|
||||
listClass: "toc-list",
|
||||
itemClass: "toc-item",
|
||||
linkClass: "toc-link",
|
||||
});
|
||||
|
||||
renderer.use(markdownItTaskLists);
|
||||
|
||||
renderer.use(markdownItContainer);
|
||||
|
||||
return renderer;
|
||||
};
|
||||
101
classes/functions/user.ts
Normal file
101
classes/functions/user.ts
Normal file
|
|
@ -0,0 +1,101 @@
|
|||
import {
|
||||
type Application,
|
||||
db,
|
||||
type Emoji,
|
||||
type Instance,
|
||||
type Media,
|
||||
type Role,
|
||||
type Token,
|
||||
type User,
|
||||
} from "@versia/kit/db";
|
||||
import type { Users } from "@versia/kit/tables";
|
||||
import type { InferSelectModel } from "drizzle-orm";
|
||||
|
||||
export const userRelations = {
|
||||
instance: true,
|
||||
emojis: {
|
||||
with: {
|
||||
emoji: {
|
||||
with: {
|
||||
instance: true,
|
||||
media: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
avatar: true,
|
||||
header: true,
|
||||
roles: {
|
||||
with: {
|
||||
role: true,
|
||||
},
|
||||
},
|
||||
} as const;
|
||||
|
||||
export interface AuthData {
|
||||
user: User | null;
|
||||
token: Token | null;
|
||||
application: Application | null;
|
||||
}
|
||||
|
||||
export const transformOutputToUserWithRelations = (
|
||||
user: Omit<InferSelectModel<typeof Users>, "endpoints"> & {
|
||||
followerCount: unknown;
|
||||
followingCount: unknown;
|
||||
statusCount: unknown;
|
||||
avatar: typeof Media.$type | null;
|
||||
header: typeof Media.$type | null;
|
||||
emojis: {
|
||||
userId: string;
|
||||
emojiId: string;
|
||||
emoji?: typeof Emoji.$type;
|
||||
}[];
|
||||
instance: typeof Instance.$type | null;
|
||||
roles: {
|
||||
userId: string;
|
||||
roleId: string;
|
||||
role?: typeof Role.$type;
|
||||
}[];
|
||||
endpoints: unknown;
|
||||
},
|
||||
): typeof User.$type => {
|
||||
return {
|
||||
...user,
|
||||
followerCount: Number(user.followerCount),
|
||||
followingCount: Number(user.followingCount),
|
||||
statusCount: Number(user.statusCount),
|
||||
endpoints:
|
||||
user.endpoints ??
|
||||
({} as Partial<{
|
||||
dislikes: string;
|
||||
featured: string;
|
||||
likes: string;
|
||||
followers: string;
|
||||
following: string;
|
||||
inbox: string;
|
||||
outbox: string;
|
||||
}>),
|
||||
emojis: user.emojis.map(
|
||||
(emoji) =>
|
||||
(emoji as unknown as Record<string, object>)
|
||||
.emoji as typeof Emoji.$type,
|
||||
),
|
||||
roles: user.roles
|
||||
.map((role) => role.role)
|
||||
.filter(Boolean) as (typeof Role.$type)[],
|
||||
};
|
||||
};
|
||||
|
||||
export const findManyUsers = async (
|
||||
query: Parameters<typeof db.query.Users.findMany>[0],
|
||||
): Promise<(typeof User.$type)[]> => {
|
||||
const output = await db.query.Users.findMany({
|
||||
...query,
|
||||
with: {
|
||||
...userRelations,
|
||||
...query?.with,
|
||||
},
|
||||
});
|
||||
|
||||
return output.map((user) => transformOutputToUserWithRelations(user));
|
||||
};
|
||||
|
|
@ -1,9 +1,5 @@
|
|||
import { getLogger, type Logger } from "@logtape/logtape";
|
||||
import { EntitySorter, type JSONObject } from "@versia/sdk";
|
||||
import { verify } from "@versia/sdk/crypto";
|
||||
import * as VersiaEntities from "@versia/sdk/entities";
|
||||
import { config } from "@versia-server/config";
|
||||
import { ApiError } from "@versia-server/kit";
|
||||
import { ApiError } from "@versia/kit";
|
||||
import {
|
||||
type Instance,
|
||||
Like,
|
||||
|
|
@ -11,8 +7,12 @@ import {
|
|||
Reaction,
|
||||
Relationship,
|
||||
User,
|
||||
} from "@versia-server/kit/db";
|
||||
import { Likes, Notes } from "@versia-server/kit/tables";
|
||||
} from "@versia/kit/db";
|
||||
import { Likes, Notes } from "@versia/kit/tables";
|
||||
import { EntitySorter, type JSONObject } from "@versia/sdk";
|
||||
import { verify } from "@versia/sdk/crypto";
|
||||
import * as VersiaEntities from "@versia/sdk/entities";
|
||||
import { config } from "@versia-server/config";
|
||||
import type { SocketAddress } from "bun";
|
||||
import { Glob } from "bun";
|
||||
import chalk from "chalk";
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
import { describe, expect, it } from "bun:test";
|
||||
import { mockModule } from "@versia-server/tests";
|
||||
import sharp from "sharp";
|
||||
import { mockModule } from "~/tests/utils.ts";
|
||||
import { calculateBlurhash } from "./blurhash.ts";
|
||||
|
||||
describe("BlurhashPreprocessor", () => {
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
import { readdir } from "node:fs/promises";
|
||||
import { getLogger, type Logger } from "@logtape/logtape";
|
||||
import { type Manifest, manifestSchema, Plugin } from "@versia/kit";
|
||||
import { config } from "@versia-server/config";
|
||||
import { type Manifest, manifestSchema, Plugin } from "@versia-server/kit";
|
||||
import { file, sleep } from "bun";
|
||||
import chalk from "chalk";
|
||||
import { parseJSON5, parseJSONC } from "confbox";
|
||||
|
|
|
|||
|
|
@ -1,10 +1,10 @@
|
|||
import { User } from "@versia/kit/db";
|
||||
import type { JSONObject } from "@versia/sdk";
|
||||
import * as VersiaEntities from "@versia/sdk/entities";
|
||||
import { config } from "@versia-server/config";
|
||||
import { User } from "@versia-server/kit/db";
|
||||
import { connection } from "@versia-server/kit/redis";
|
||||
import { Queue, Worker } from "bullmq";
|
||||
import chalk from "chalk";
|
||||
import { connection } from "~/utils/redis.ts";
|
||||
|
||||
export enum DeliveryJobType {
|
||||
FederateEntity = "federateEntity",
|
||||
|
|
|
|||
|
|
@ -1,9 +1,9 @@
|
|||
import { Instance } from "@versia/kit/db";
|
||||
import { Instances } from "@versia/kit/tables";
|
||||
import { config } from "@versia-server/config";
|
||||
import { Instance } from "@versia-server/kit/db";
|
||||
import { connection } from "@versia-server/kit/redis";
|
||||
import { Instances } from "@versia-server/kit/tables";
|
||||
import { Queue, Worker } from "bullmq";
|
||||
import { eq } from "drizzle-orm";
|
||||
import { connection } from "~/utils/redis.ts";
|
||||
|
||||
export enum FetchJobType {
|
||||
Instance = "instance",
|
||||
|
|
|
|||
|
|
@ -1,11 +1,11 @@
|
|||
import { getLogger } from "@logtape/logtape";
|
||||
import { ApiError } from "@versia/kit";
|
||||
import { Instance, User } from "@versia/kit/db";
|
||||
import type { JSONObject } from "@versia/sdk";
|
||||
import { config } from "@versia-server/config";
|
||||
import { ApiError } from "@versia-server/kit";
|
||||
import { Instance, User } from "@versia-server/kit/db";
|
||||
import { connection } from "@versia-server/kit/redis";
|
||||
import { Queue, Worker } from "bullmq";
|
||||
import type { SocketAddress } from "bun";
|
||||
import { connection } from "~/utils/redis.ts";
|
||||
import { InboxProcessor } from "../inbox/processor.ts";
|
||||
|
||||
export enum InboxJobType {
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
import { Media } from "@versia/kit/db";
|
||||
import { config } from "@versia-server/config";
|
||||
import { Media } from "@versia-server/kit/db";
|
||||
import { connection } from "@versia-server/kit/redis";
|
||||
import { Queue, Worker } from "bullmq";
|
||||
import { connection } from "~/utils/redis.ts";
|
||||
import { calculateBlurhash } from "../media/preprocessors/blurhash.ts";
|
||||
import { convertImage } from "../media/preprocessors/image-conversion.ts";
|
||||
|
||||
|
|
|
|||
|
|
@ -1,9 +1,9 @@
|
|||
import { Note, PushSubscription, Token, User } from "@versia/kit/db";
|
||||
import { config } from "@versia-server/config";
|
||||
import { Note, PushSubscription, Token, User } from "@versia-server/kit/db";
|
||||
import { connection } from "@versia-server/kit/redis";
|
||||
import { Queue, Worker } from "bullmq";
|
||||
import { sendNotification } from "web-push";
|
||||
import { htmlToText } from "@/content_types.ts";
|
||||
import { connection } from "~/utils/redis.ts";
|
||||
|
||||
export enum PushJobType {
|
||||
Notify = "notify",
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
import { Relationship, User } from "@versia/kit/db";
|
||||
import { config } from "@versia-server/config";
|
||||
import { Relationship, User } from "@versia-server/kit/db";
|
||||
import { connection } from "@versia-server/kit/redis";
|
||||
import { Queue, Worker } from "bullmq";
|
||||
import { connection } from "~/utils/redis.ts";
|
||||
|
||||
export enum RelationshipJobType {
|
||||
Unmute = "unmute",
|
||||
|
|
|
|||
|
|
@ -4,8 +4,8 @@
|
|||
*/
|
||||
|
||||
import { getLogger } from "@logtape/logtape";
|
||||
import { db, Note, User } from "@versia/kit/db";
|
||||
import { config } from "@versia-server/config";
|
||||
import { db, Note, User } from "@versia-server/kit/db";
|
||||
import type { SQL, ValueOrArray } from "drizzle-orm";
|
||||
import {
|
||||
Ingest as SonicChannelIngest,
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@ import { friendlyErrorPlugin } from "@clerc/plugin-friendly-error";
|
|||
import { helpPlugin } from "@clerc/plugin-help";
|
||||
import { notFoundPlugin } from "@clerc/plugin-not-found";
|
||||
import { versionPlugin } from "@clerc/plugin-version";
|
||||
import { setupDatabase } from "@versia-server/kit/db";
|
||||
import { setupDatabase } from "@versia/kit/db";
|
||||
import { Clerc } from "clerc";
|
||||
import { searchManager } from "~/classes/search/search-manager.ts";
|
||||
import pkg from "~/package.json" with { type: "json" };
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
import { Instance } from "@versia-server/kit/db";
|
||||
import { Instances } from "@versia-server/kit/tables";
|
||||
import { Instance } from "@versia/kit/db";
|
||||
import { Instances } from "@versia/kit/tables";
|
||||
import chalk from "chalk";
|
||||
// @ts-expect-error - Root import is required or the Clec type definitions won't work
|
||||
// biome-ignore lint/correctness/noUnusedImports: Root import is required or the Clec type definitions won't work
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
import { User } from "@versia/kit/db";
|
||||
import { Users } from "@versia/kit/tables";
|
||||
import { config } from "@versia-server/config";
|
||||
import { User } from "@versia-server/kit/db";
|
||||
import { Users } from "@versia-server/kit/tables";
|
||||
import chalk from "chalk";
|
||||
// @ts-expect-error - Root import is required or the Clec type definitions won't work
|
||||
// biome-ignore lint/correctness/noUnusedImports: Root import is required or the Clec type definitions won't work
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
import { User } from "@versia-server/kit/db";
|
||||
import { User } from "@versia/kit/db";
|
||||
import chalk from "chalk";
|
||||
// @ts-expect-error - Root import is required or the Clec type definitions won't work
|
||||
// biome-ignore lint/correctness/noUnusedImports: Root import is required or the Clec type definitions won't work
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
import { Token } from "@versia-server/kit/db";
|
||||
import { Token } from "@versia/kit/db";
|
||||
import { randomUUIDv7 } from "bun";
|
||||
import chalk from "chalk";
|
||||
// @ts-expect-error - Root import is required or the Clec type definitions won't work
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
import { Instance, User } from "@versia-server/kit/db";
|
||||
import { parseUserAddress } from "@versia-server/kit/parsers";
|
||||
import { Users } from "@versia-server/kit/tables";
|
||||
import { Instance, User } from "@versia/kit/db";
|
||||
import { Users } from "@versia/kit/tables";
|
||||
import { and, eq, isNull } from "drizzle-orm";
|
||||
import { parseUserAddress } from "@/api";
|
||||
|
||||
export const retrieveUser = async (
|
||||
usernameOrHandle: string,
|
||||
|
|
|
|||
|
|
@ -20,11 +20,11 @@
|
|||
},
|
||||
"nixpkgs": {
|
||||
"locked": {
|
||||
"lastModified": 1749903597,
|
||||
"narHash": "sha256-jp0D4vzBcRKwNZwfY4BcWHemLGUs4JrS3X9w5k/JYDA=",
|
||||
"lastModified": 1744536153,
|
||||
"narHash": "sha256-awS2zRgF4uTwrOKwwiJcByDzDOdo3Q1rPZbiHQg/N38=",
|
||||
"owner": "nixos",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "41da1e3ea8e23e094e5e3eeb1e6b830468a7399e",
|
||||
"rev": "18dd725c29603f582cf1900e0d25f9f1063dbf11",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
|
|
|
|||
|
|
@ -21,7 +21,7 @@ in
|
|||
|
||||
pnpmDeps = pnpm.fetchDeps {
|
||||
inherit (finalAttrs) pname version src pnpmInstallFlags;
|
||||
hash = "sha256-nC1bYW+It2N0Mp8+Yh1uk3MOj8DABOCNP5E3LbMuCEQ=";
|
||||
hash = "sha256-6lcsXcMEh7UbB5aLJzgJKUzynZbSZPgdj6l9E7RVx7c=";
|
||||
};
|
||||
|
||||
nativeBuildInputs = [
|
||||
|
|
|
|||
|
|
@ -121,9 +121,7 @@
|
|||
"check": "bunx tsc -p .",
|
||||
"test": "bun test",
|
||||
"run-api": "bun run packages/api/build.ts && cd dist && ln -s ../config config && bun run packages/api/index.js",
|
||||
"run-worker": "bun run packages/worker/build.ts && cd dist && ln -s ../config config && bun run packages/worker/index.js",
|
||||
"dev": "bun run --hot packages/api/index.ts",
|
||||
"worker:dev": "bun run --hot packages/worker/index.ts"
|
||||
"run-worker": "bun run packages/worker/build.ts && cd dist && ln -s ../config config && bun run packages/worker/index.js"
|
||||
},
|
||||
"trustedDependencies": [
|
||||
"@biomejs/biome",
|
||||
|
|
@ -133,7 +131,6 @@
|
|||
"sharp"
|
||||
],
|
||||
"devDependencies": {
|
||||
"@biomejs/biome": "catalog:",
|
||||
"@types/bun": "catalog:",
|
||||
"@types/html-to-text": "catalog:",
|
||||
"@types/markdown-it-container": "catalog:",
|
||||
|
|
@ -167,9 +164,8 @@
|
|||
"@scalar/hono-api-reference": "catalog:",
|
||||
"@sentry/bun": "catalog:",
|
||||
"@versia/client": "workspace:*",
|
||||
"@versia-server/kit": "workspace:*",
|
||||
"@versia/kit": "workspace:*",
|
||||
"@versia/sdk": "workspace:*",
|
||||
"@versia-server/tests": "workspace:*",
|
||||
"@versia-server/config": "workspace:*",
|
||||
"altcha-lib": "catalog:",
|
||||
"blurhash": "catalog:",
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
import { resolve } from "node:path";
|
||||
import { getLogger } from "@logtape/logtape";
|
||||
import { Scalar } from "@scalar/hono-api-reference";
|
||||
import { ApiError } from "@versia/kit";
|
||||
import { config } from "@versia-server/config";
|
||||
import { ApiError } from "@versia-server/kit";
|
||||
import chalk from "chalk";
|
||||
import { Hono } from "hono";
|
||||
import { serveStatic } from "hono/bun";
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
import { readdir } from "node:fs/promises";
|
||||
import { $, build } from "bun";
|
||||
import { routes } from "./routes.ts";
|
||||
import { routes } from "~/packages/api/routes";
|
||||
|
||||
console.log("Building...");
|
||||
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
import { ApiError } from "@versia/kit";
|
||||
import { config } from "@versia-server/config";
|
||||
import { ApiError } from "@versia-server/kit";
|
||||
import { createMiddleware } from "hono/factory";
|
||||
|
||||
export const agentBans = createMiddleware(async (context, next) => {
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
import { ApiError } from "@versia-server/kit";
|
||||
import { ApiError } from "@versia/kit";
|
||||
import { createMiddleware } from "hono/factory";
|
||||
|
||||
export const boundaryCheck = createMiddleware(async (context, next) => {
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
import { getLogger } from "@logtape/logtape";
|
||||
import { ApiError } from "@versia/kit";
|
||||
import { config } from "@versia-server/config";
|
||||
import { ApiError } from "@versia-server/kit";
|
||||
import type { SocketAddress } from "bun";
|
||||
import { createMiddleware } from "hono/factory";
|
||||
import { matches } from "ip-matching";
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
import type { ApiError } from "@versia-server/kit";
|
||||
import type { ApiError } from "@versia/kit";
|
||||
import { env } from "bun";
|
||||
import type { MiddlewareHandler } from "hono";
|
||||
import { rateLimiter } from "hono-rate-limiter";
|
||||
|
|
|
|||
|
|
@ -43,8 +43,7 @@
|
|||
},
|
||||
"dependencies": {
|
||||
"@versia-server/config": "workspace:*",
|
||||
"@versia-server/tests": "workspace:*",
|
||||
"@versia-server/kit": "workspace:*",
|
||||
"@versia/kit": "workspace:*",
|
||||
"@versia/client": "workspace:*",
|
||||
"@versia/sdk": "workspace:*",
|
||||
"@logtape/logtape": "catalog:",
|
||||
|
|
@ -63,11 +62,6 @@
|
|||
"zod-openapi": "catalog:",
|
||||
"@scalar/hono-api-reference": "catalog:",
|
||||
"hono-rate-limiter": "catalog:",
|
||||
"ip-matching": "catalog:",
|
||||
"qs": "catalog:",
|
||||
"magic-regexp": "catalog:",
|
||||
"altcha-lib": "catalog:",
|
||||
"@hono/zod-validator": "catalog:",
|
||||
"zod-validation-error": "catalog:"
|
||||
"ip-matching": "catalog:"
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,9 +1,9 @@
|
|||
import { afterAll, describe, expect, test } from "bun:test";
|
||||
import { Application } from "@versia/kit/db";
|
||||
import { config } from "@versia-server/config";
|
||||
import { Application } from "@versia-server/kit/db";
|
||||
import { fakeRequest, getTestUsers } from "@versia-server/tests";
|
||||
import { randomUUIDv7 } from "bun";
|
||||
import { randomString } from "@/math";
|
||||
import { fakeRequest, getTestUsers } from "~/tests/utils";
|
||||
|
||||
const { users, deleteUsers, passwords } = await getTestUsers(1);
|
||||
|
||||
|
|
|
|||
|
|
@ -1,8 +1,7 @@
|
|||
import { ApiError } from "@versia/kit";
|
||||
import { Application, User } from "@versia/kit/db";
|
||||
import { Users } from "@versia/kit/tables";
|
||||
import { config } from "@versia-server/config";
|
||||
import { ApiError } from "@versia-server/kit";
|
||||
import { apiRoute, handleZodError } from "@versia-server/kit/api";
|
||||
import { Application, User } from "@versia-server/kit/db";
|
||||
import { Users } from "@versia-server/kit/tables";
|
||||
import { password as bunPassword } from "bun";
|
||||
import { eq, or } from "drizzle-orm";
|
||||
import type { Context } from "hono";
|
||||
|
|
@ -11,6 +10,7 @@ import { describeRoute } from "hono-openapi";
|
|||
import { validator } from "hono-openapi/zod";
|
||||
import { SignJWT } from "jose";
|
||||
import { z } from "zod";
|
||||
import { apiRoute, handleZodError } from "@/api";
|
||||
|
||||
const returnError = (
|
||||
context: Context,
|
||||
|
|
|
|||
|
|
@ -1,11 +1,11 @@
|
|||
import { db } from "@versia/kit/db";
|
||||
import { Applications, Tokens } from "@versia/kit/tables";
|
||||
import { config } from "@versia-server/config";
|
||||
import { apiRoute, handleZodError } from "@versia-server/kit/api";
|
||||
import { db } from "@versia-server/kit/db";
|
||||
import { Applications, Tokens } from "@versia-server/kit/tables";
|
||||
import { and, eq } from "drizzle-orm";
|
||||
import { describeRoute } from "hono-openapi";
|
||||
import { validator } from "hono-openapi/zod";
|
||||
import { z } from "zod";
|
||||
import { apiRoute, handleZodError } from "@/api";
|
||||
|
||||
/**
|
||||
* OAuth Code flow
|
||||
|
|
|
|||
|
|
@ -1,9 +1,9 @@
|
|||
import { afterAll, describe, expect, test } from "bun:test";
|
||||
import { Application } from "@versia/kit/db";
|
||||
import { config } from "@versia-server/config";
|
||||
import { Application } from "@versia-server/kit/db";
|
||||
import { fakeRequest, getTestUsers } from "@versia-server/tests";
|
||||
import { randomUUIDv7 } from "bun";
|
||||
import { randomString } from "@/math";
|
||||
import { fakeRequest, getTestUsers } from "~/tests/utils";
|
||||
|
||||
const { users, deleteUsers, passwords } = await getTestUsers(1);
|
||||
const token = randomString(32, "hex");
|
||||
|
|
|
|||
|
|
@ -1,13 +1,13 @@
|
|||
import { User } from "@versia/kit/db";
|
||||
import { Users } from "@versia/kit/tables";
|
||||
import { config } from "@versia-server/config";
|
||||
import { apiRoute, handleZodError } from "@versia-server/kit/api";
|
||||
import { User } from "@versia-server/kit/db";
|
||||
import { Users } from "@versia-server/kit/tables";
|
||||
import { password as bunPassword } from "bun";
|
||||
import { eq } from "drizzle-orm";
|
||||
import type { Context } from "hono";
|
||||
import { describeRoute } from "hono-openapi";
|
||||
import { validator } from "hono-openapi/zod";
|
||||
import { z } from "zod";
|
||||
import { apiRoute, handleZodError } from "@/api";
|
||||
|
||||
const returnError = (
|
||||
context: Context,
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
import { afterAll, describe, expect, test } from "bun:test";
|
||||
import { generateClient, getTestUsers } from "@versia-server/tests";
|
||||
import { generateClient, getTestUsers } from "~/tests/utils";
|
||||
|
||||
const { users, deleteUsers } = await getTestUsers(2);
|
||||
|
||||
|
|
|
|||
|
|
@ -2,11 +2,11 @@ import {
|
|||
Relationship as RelationshipSchema,
|
||||
RolePermission,
|
||||
} from "@versia/client/schemas";
|
||||
import { ApiError } from "@versia-server/kit";
|
||||
import { apiRoute, auth, withUserParam } from "@versia-server/kit/api";
|
||||
import { Relationship } from "@versia-server/kit/db";
|
||||
import { ApiError } from "@versia/kit";
|
||||
import { Relationship } from "@versia/kit/db";
|
||||
import { describeRoute } from "hono-openapi";
|
||||
import { resolver } from "hono-openapi/zod";
|
||||
import { apiRoute, auth, withUserParam } from "@/api";
|
||||
|
||||
export default apiRoute((app) =>
|
||||
app.post(
|
||||
|
|
|
|||
|
|
@ -1,14 +1,9 @@
|
|||
import { RolePermission } from "@versia/client/schemas";
|
||||
import { ApiError } from "@versia-server/kit";
|
||||
import {
|
||||
apiRoute,
|
||||
auth,
|
||||
handleZodError,
|
||||
withUserParam,
|
||||
} from "@versia-server/kit/api";
|
||||
import { ApiError } from "@versia/kit";
|
||||
import { describeRoute } from "hono-openapi";
|
||||
import { resolver, validator } from "hono-openapi/zod";
|
||||
import { z } from "zod";
|
||||
import { apiRoute, auth, handleZodError, withUserParam } from "@/api";
|
||||
import { getFeed } from "@/rss";
|
||||
|
||||
export default apiRoute((app) =>
|
||||
|
|
|
|||
|
|
@ -1,14 +1,9 @@
|
|||
import { RolePermission } from "@versia/client/schemas";
|
||||
import { ApiError } from "@versia-server/kit";
|
||||
import {
|
||||
apiRoute,
|
||||
auth,
|
||||
handleZodError,
|
||||
withUserParam,
|
||||
} from "@versia-server/kit/api";
|
||||
import { ApiError } from "@versia/kit";
|
||||
import { describeRoute } from "hono-openapi";
|
||||
import { resolver, validator } from "hono-openapi/zod";
|
||||
import { z } from "zod";
|
||||
import { apiRoute, auth, handleZodError, withUserParam } from "@/api";
|
||||
import { getFeed } from "@/rss";
|
||||
|
||||
export default apiRoute((app) =>
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
import { afterAll, describe, expect, test } from "bun:test";
|
||||
import { generateClient, getTestUsers } from "@versia-server/tests";
|
||||
import { generateClient, getTestUsers } from "~/tests/utils";
|
||||
|
||||
const { users, deleteUsers } = await getTestUsers(3);
|
||||
|
||||
|
|
|
|||
|
|
@ -3,17 +3,12 @@ import {
|
|||
Relationship as RelationshipSchema,
|
||||
RolePermission,
|
||||
} from "@versia/client/schemas";
|
||||
import { ApiError } from "@versia-server/kit";
|
||||
import {
|
||||
apiRoute,
|
||||
auth,
|
||||
handleZodError,
|
||||
withUserParam,
|
||||
} from "@versia-server/kit/api";
|
||||
import { Relationship } from "@versia-server/kit/db";
|
||||
import { ApiError } from "@versia/kit";
|
||||
import { Relationship } from "@versia/kit/db";
|
||||
import { describeRoute } from "hono-openapi";
|
||||
import { resolver, validator } from "hono-openapi/zod";
|
||||
import { z } from "zod";
|
||||
import { apiRoute, auth, handleZodError, withUserParam } from "@/api";
|
||||
|
||||
export default apiRoute((app) =>
|
||||
app.post(
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
import { afterAll, beforeAll, describe, expect, test } from "bun:test";
|
||||
import { generateClient, getTestUsers } from "@versia-server/tests";
|
||||
import { generateClient, getTestUsers } from "~/tests/utils";
|
||||
|
||||
const { users, deleteUsers } = await getTestUsers(5);
|
||||
|
||||
|
|
|
|||
|
|
@ -2,19 +2,14 @@ import {
|
|||
Account as AccountSchema,
|
||||
RolePermission,
|
||||
} from "@versia/client/schemas";
|
||||
import { ApiError } from "@versia-server/kit";
|
||||
import {
|
||||
apiRoute,
|
||||
auth,
|
||||
handleZodError,
|
||||
withUserParam,
|
||||
} from "@versia-server/kit/api";
|
||||
import { Timeline } from "@versia-server/kit/db";
|
||||
import { Users } from "@versia-server/kit/tables";
|
||||
import { ApiError } from "@versia/kit";
|
||||
import { Timeline } from "@versia/kit/db";
|
||||
import { Users } from "@versia/kit/tables";
|
||||
import { and, gt, gte, lt, sql } from "drizzle-orm";
|
||||
import { describeRoute } from "hono-openapi";
|
||||
import { resolver, validator } from "hono-openapi/zod";
|
||||
import { z } from "zod";
|
||||
import { apiRoute, auth, handleZodError, withUserParam } from "@/api";
|
||||
|
||||
export default apiRoute((app) =>
|
||||
app.get(
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
import { afterAll, beforeAll, describe, expect, test } from "bun:test";
|
||||
import { generateClient, getTestUsers } from "@versia-server/tests";
|
||||
import { generateClient, getTestUsers } from "~/tests/utils";
|
||||
|
||||
const { users, deleteUsers } = await getTestUsers(5);
|
||||
|
||||
|
|
|
|||
|
|
@ -2,19 +2,14 @@ import {
|
|||
Account as AccountSchema,
|
||||
RolePermission,
|
||||
} from "@versia/client/schemas";
|
||||
import { ApiError } from "@versia-server/kit";
|
||||
import {
|
||||
apiRoute,
|
||||
auth,
|
||||
handleZodError,
|
||||
withUserParam,
|
||||
} from "@versia-server/kit/api";
|
||||
import { Timeline } from "@versia-server/kit/db";
|
||||
import { Users } from "@versia-server/kit/tables";
|
||||
import { ApiError } from "@versia/kit";
|
||||
import { Timeline } from "@versia/kit/db";
|
||||
import { Users } from "@versia/kit/tables";
|
||||
import { and, gt, gte, lt, sql } from "drizzle-orm";
|
||||
import { describeRoute } from "hono-openapi";
|
||||
import { resolver, validator } from "hono-openapi/zod";
|
||||
import { z } from "zod";
|
||||
import { apiRoute, auth, handleZodError, withUserParam } from "@/api";
|
||||
|
||||
export default apiRoute((app) =>
|
||||
app.get(
|
||||
|
|
|
|||
|
|
@ -1,9 +1,5 @@
|
|||
import { afterAll, beforeAll, describe, expect, test } from "bun:test";
|
||||
import {
|
||||
generateClient,
|
||||
getTestStatuses,
|
||||
getTestUsers,
|
||||
} from "@versia-server/tests";
|
||||
import { generateClient, getTestStatuses, getTestUsers } from "~/tests/utils";
|
||||
|
||||
const { users, deleteUsers } = await getTestUsers(5);
|
||||
const timeline = (await getTestStatuses(5, users[0])).toReversed();
|
||||
|
|
|
|||
|
|
@ -2,10 +2,10 @@ import {
|
|||
Account as AccountSchema,
|
||||
RolePermission,
|
||||
} from "@versia/client/schemas";
|
||||
import { ApiError } from "@versia-server/kit";
|
||||
import { apiRoute, auth, withUserParam } from "@versia-server/kit/api";
|
||||
import { ApiError } from "@versia/kit";
|
||||
import { describeRoute } from "hono-openapi";
|
||||
import { resolver } from "hono-openapi/zod";
|
||||
import { apiRoute, auth, withUserParam } from "@/api";
|
||||
|
||||
export default apiRoute((app) =>
|
||||
app.get(
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
import { afterAll, describe, expect, test } from "bun:test";
|
||||
import { generateClient, getTestUsers } from "@versia-server/tests";
|
||||
import { generateClient, getTestUsers } from "~/tests/utils";
|
||||
|
||||
const { users, deleteUsers } = await getTestUsers(2);
|
||||
|
||||
|
|
|
|||
|
|
@ -2,17 +2,12 @@ import {
|
|||
Relationship as RelationshipSchema,
|
||||
RolePermission,
|
||||
} from "@versia/client/schemas";
|
||||
import { ApiError } from "@versia-server/kit";
|
||||
import {
|
||||
apiRoute,
|
||||
auth,
|
||||
handleZodError,
|
||||
withUserParam,
|
||||
} from "@versia-server/kit/api";
|
||||
import { Relationship } from "@versia-server/kit/db";
|
||||
import { ApiError } from "@versia/kit";
|
||||
import { Relationship } from "@versia/kit/db";
|
||||
import { describeRoute } from "hono-openapi";
|
||||
import { resolver, validator } from "hono-openapi/zod";
|
||||
import { z } from "zod";
|
||||
import { apiRoute, auth, handleZodError, withUserParam } from "@/api";
|
||||
import {
|
||||
RelationshipJobType,
|
||||
relationshipQueue,
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
import { afterAll, describe, expect, test } from "bun:test";
|
||||
import { generateClient, getTestUsers } from "@versia-server/tests";
|
||||
import { generateClient, getTestUsers } from "~/tests/utils";
|
||||
|
||||
const { users, deleteUsers } = await getTestUsers(2);
|
||||
|
||||
|
|
|
|||
|
|
@ -2,17 +2,12 @@ import {
|
|||
Relationship as RelationshipSchema,
|
||||
RolePermission,
|
||||
} from "@versia/client/schemas";
|
||||
import { ApiError } from "@versia-server/kit";
|
||||
import {
|
||||
apiRoute,
|
||||
auth,
|
||||
handleZodError,
|
||||
withUserParam,
|
||||
} from "@versia-server/kit/api";
|
||||
import { Relationship } from "@versia-server/kit/db";
|
||||
import { ApiError } from "@versia/kit";
|
||||
import { Relationship } from "@versia/kit/db";
|
||||
import { describeRoute } from "hono-openapi";
|
||||
import { resolver, validator } from "hono-openapi/zod";
|
||||
import { z } from "zod";
|
||||
import { apiRoute, auth, handleZodError, withUserParam } from "@/api";
|
||||
|
||||
export default apiRoute((app) =>
|
||||
app.post(
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
import { afterAll, describe, expect, test } from "bun:test";
|
||||
import { generateClient, getTestUsers } from "@versia-server/tests";
|
||||
import { generateClient, getTestUsers } from "~/tests/utils";
|
||||
|
||||
const { users, deleteUsers } = await getTestUsers(2);
|
||||
|
||||
|
|
|
|||
|
|
@ -2,10 +2,10 @@ import {
|
|||
Relationship as RelationshipSchema,
|
||||
RolePermission,
|
||||
} from "@versia/client/schemas";
|
||||
import { apiRoute, auth, withUserParam } from "@versia-server/kit/api";
|
||||
import { Relationship } from "@versia-server/kit/db";
|
||||
import { Relationship } from "@versia/kit/db";
|
||||
import { describeRoute } from "hono-openapi";
|
||||
import { resolver } from "hono-openapi/zod";
|
||||
import { apiRoute, auth, withUserParam } from "@/api";
|
||||
|
||||
export default apiRoute((app) =>
|
||||
app.post(
|
||||
|
|
|
|||
|
|
@ -2,11 +2,11 @@ import {
|
|||
Account as AccountSchema,
|
||||
RolePermission,
|
||||
} from "@versia/client/schemas";
|
||||
import { ApiError } from "@versia-server/kit";
|
||||
import { apiRoute, auth, withUserParam } from "@versia-server/kit/api";
|
||||
import { User } from "@versia-server/kit/db";
|
||||
import { ApiError } from "@versia/kit";
|
||||
import { User } from "@versia/kit/db";
|
||||
import { describeRoute } from "hono-openapi";
|
||||
import { resolver } from "hono-openapi/zod";
|
||||
import { apiRoute, auth, withUserParam } from "@/api";
|
||||
|
||||
export default apiRoute((app) =>
|
||||
app.post(
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
import { afterAll, beforeAll, describe, expect, test } from "bun:test";
|
||||
import { generateClient, getTestUsers } from "@versia-server/tests";
|
||||
import { generateClient, getTestUsers } from "~/tests/utils";
|
||||
|
||||
const { users, deleteUsers } = await getTestUsers(2);
|
||||
|
||||
|
|
|
|||
|
|
@ -2,11 +2,11 @@ import {
|
|||
Relationship as RelationshipSchema,
|
||||
RolePermission,
|
||||
} from "@versia/client/schemas";
|
||||
import { ApiError } from "@versia-server/kit";
|
||||
import { apiRoute, auth, withUserParam } from "@versia-server/kit/api";
|
||||
import { Relationship } from "@versia-server/kit/db";
|
||||
import { ApiError } from "@versia/kit";
|
||||
import { Relationship } from "@versia/kit/db";
|
||||
import { describeRoute } from "hono-openapi";
|
||||
import { resolver } from "hono-openapi/zod";
|
||||
import { apiRoute, auth, withUserParam } from "@/api";
|
||||
|
||||
export default apiRoute((app) =>
|
||||
app.post(
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
import { afterAll, beforeAll, describe, expect, test } from "bun:test";
|
||||
import { RolePermission } from "@versia/client/schemas";
|
||||
import { Role } from "@versia-server/kit/db";
|
||||
import { generateClient, getTestUsers } from "@versia-server/tests";
|
||||
import { Role } from "@versia/kit/db";
|
||||
import { randomUUIDv7 } from "bun";
|
||||
import { generateClient, getTestUsers } from "~/tests/utils";
|
||||
|
||||
const { users, deleteUsers } = await getTestUsers(2);
|
||||
let role: Role;
|
||||
|
|
|
|||
|
|
@ -3,17 +3,12 @@ import {
|
|||
RolePermission,
|
||||
Role as RoleSchema,
|
||||
} from "@versia/client/schemas";
|
||||
import { ApiError } from "@versia-server/kit";
|
||||
import {
|
||||
apiRoute,
|
||||
auth,
|
||||
handleZodError,
|
||||
withUserParam,
|
||||
} from "@versia-server/kit/api";
|
||||
import { Role } from "@versia-server/kit/db";
|
||||
import { ApiError } from "@versia/kit";
|
||||
import { Role } from "@versia/kit/db";
|
||||
import { describeRoute } from "hono-openapi";
|
||||
import { validator } from "hono-openapi/zod";
|
||||
import { z } from "zod";
|
||||
import { apiRoute, auth, handleZodError, withUserParam } from "@/api";
|
||||
|
||||
export default apiRoute((app) => {
|
||||
app.post(
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
import { afterAll, beforeAll, describe, expect, test } from "bun:test";
|
||||
import { RolePermission } from "@versia/client/schemas";
|
||||
import { Role } from "@versia-server/kit/db";
|
||||
import { generateClient, getTestUsers } from "@versia-server/tests";
|
||||
import { Role } from "@versia/kit/db";
|
||||
import { randomUUIDv7 } from "bun";
|
||||
import { generateClient, getTestUsers } from "~/tests/utils";
|
||||
|
||||
const { users, deleteUsers } = await getTestUsers(2);
|
||||
let role: Role;
|
||||
|
|
|
|||
|
|
@ -1,9 +1,9 @@
|
|||
import { Role as RoleSchema } from "@versia/client/schemas";
|
||||
import { apiRoute, auth, withUserParam } from "@versia-server/kit/api";
|
||||
import { Role } from "@versia-server/kit/db";
|
||||
import { Role } from "@versia/kit/db";
|
||||
import { describeRoute } from "hono-openapi";
|
||||
import { resolver } from "hono-openapi/zod";
|
||||
import { z } from "zod";
|
||||
import { apiRoute, auth, withUserParam } from "@/api";
|
||||
|
||||
export default apiRoute((app) => {
|
||||
app.get(
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@ import {
|
|||
generateClient,
|
||||
getTestStatuses,
|
||||
getTestUsers,
|
||||
} from "@versia-server/tests";
|
||||
} from "~/tests/utils.ts";
|
||||
|
||||
const { users, deleteUsers } = await getTestUsers(5);
|
||||
const timeline = (await getTestStatuses(5, users[1])).toReversed();
|
||||
|
|
|
|||
|
|
@ -3,19 +3,14 @@ import {
|
|||
Status as StatusSchema,
|
||||
zBoolean,
|
||||
} from "@versia/client/schemas";
|
||||
import { ApiError } from "@versia-server/kit";
|
||||
import {
|
||||
apiRoute,
|
||||
auth,
|
||||
handleZodError,
|
||||
withUserParam,
|
||||
} from "@versia-server/kit/api";
|
||||
import { Timeline } from "@versia-server/kit/db";
|
||||
import { Notes } from "@versia-server/kit/tables";
|
||||
import { ApiError } from "@versia/kit";
|
||||
import { Timeline } from "@versia/kit/db";
|
||||
import { Notes } from "@versia/kit/tables";
|
||||
import { and, eq, gt, gte, inArray, isNull, lt, or, sql } from "drizzle-orm";
|
||||
import { describeRoute } from "hono-openapi";
|
||||
import { resolver, validator } from "hono-openapi/zod";
|
||||
import { z } from "zod";
|
||||
import { apiRoute, auth, handleZodError, withUserParam } from "@/api";
|
||||
|
||||
export default apiRoute((app) =>
|
||||
app.get(
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
import { afterAll, describe, expect, test } from "bun:test";
|
||||
import { generateClient, getTestUsers } from "@versia-server/tests";
|
||||
import { generateClient, getTestUsers } from "~/tests/utils";
|
||||
|
||||
const { users, deleteUsers } = await getTestUsers(2);
|
||||
|
||||
|
|
|
|||
|
|
@ -2,11 +2,11 @@ import {
|
|||
Relationship as RelationshipSchema,
|
||||
RolePermission,
|
||||
} from "@versia/client/schemas";
|
||||
import { ApiError } from "@versia-server/kit";
|
||||
import { apiRoute, auth, withUserParam } from "@versia-server/kit/api";
|
||||
import { Relationship } from "@versia-server/kit/db";
|
||||
import { ApiError } from "@versia/kit";
|
||||
import { Relationship } from "@versia/kit/db";
|
||||
import { describeRoute } from "hono-openapi";
|
||||
import { resolver } from "hono-openapi/zod";
|
||||
import { apiRoute, auth, withUserParam } from "@/api";
|
||||
|
||||
export default apiRoute((app) =>
|
||||
app.post(
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
import { afterAll, describe, expect, test } from "bun:test";
|
||||
import { generateClient, getTestUsers } from "@versia-server/tests";
|
||||
import { generateClient, getTestUsers } from "~/tests/utils";
|
||||
|
||||
const { users, deleteUsers } = await getTestUsers(3);
|
||||
|
||||
|
|
|
|||
|
|
@ -2,11 +2,11 @@ import {
|
|||
Relationship as RelationshipSchema,
|
||||
RolePermission,
|
||||
} from "@versia/client/schemas";
|
||||
import { ApiError } from "@versia-server/kit";
|
||||
import { apiRoute, auth, withUserParam } from "@versia-server/kit/api";
|
||||
import { Relationship } from "@versia-server/kit/db";
|
||||
import { ApiError } from "@versia/kit";
|
||||
import { Relationship } from "@versia/kit/db";
|
||||
import { describeRoute } from "hono-openapi";
|
||||
import { resolver } from "hono-openapi/zod";
|
||||
import { apiRoute, auth, withUserParam } from "@/api";
|
||||
|
||||
export default apiRoute((app) =>
|
||||
app.post(
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
import { afterAll, beforeAll, describe, expect, test } from "bun:test";
|
||||
import { generateClient, getTestUsers } from "@versia-server/tests";
|
||||
import { generateClient, getTestUsers } from "~/tests/utils";
|
||||
|
||||
const { users, deleteUsers } = await getTestUsers(2);
|
||||
|
||||
|
|
|
|||
|
|
@ -2,11 +2,11 @@ import {
|
|||
Relationship as RelationshipSchema,
|
||||
RolePermission,
|
||||
} from "@versia/client/schemas";
|
||||
import { ApiError } from "@versia-server/kit";
|
||||
import { apiRoute, auth, withUserParam } from "@versia-server/kit/api";
|
||||
import { Relationship } from "@versia-server/kit/db";
|
||||
import { ApiError } from "@versia/kit";
|
||||
import { Relationship } from "@versia/kit/db";
|
||||
import { describeRoute } from "hono-openapi";
|
||||
import { resolver } from "hono-openapi/zod";
|
||||
import { apiRoute, auth, withUserParam } from "@/api";
|
||||
|
||||
export default apiRoute((app) =>
|
||||
app.post(
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
import { afterAll, describe, expect, test } from "bun:test";
|
||||
import { generateClient, getTestUsers } from "@versia-server/tests";
|
||||
import { generateClient, getTestUsers } from "~/tests/utils";
|
||||
|
||||
const { users, deleteUsers } = await getTestUsers(2);
|
||||
|
||||
|
|
|
|||
|
|
@ -2,11 +2,11 @@ import {
|
|||
Relationship as RelationshipSchema,
|
||||
RolePermission,
|
||||
} from "@versia/client/schemas";
|
||||
import { ApiError } from "@versia-server/kit";
|
||||
import { apiRoute, auth, withUserParam } from "@versia-server/kit/api";
|
||||
import { Relationship } from "@versia-server/kit/db";
|
||||
import { ApiError } from "@versia/kit";
|
||||
import { Relationship } from "@versia/kit/db";
|
||||
import { describeRoute } from "hono-openapi";
|
||||
import { resolver } from "hono-openapi/zod";
|
||||
import { apiRoute, auth, withUserParam } from "@/api";
|
||||
|
||||
export default apiRoute((app) =>
|
||||
app.post(
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
import { afterAll, beforeAll, describe, expect, test } from "bun:test";
|
||||
import { generateClient, getTestUsers } from "@versia-server/tests";
|
||||
import { generateClient, getTestUsers } from "~/tests/utils.ts";
|
||||
|
||||
const { users, deleteUsers } = await getTestUsers(5);
|
||||
|
||||
|
|
|
|||
|
|
@ -3,19 +3,14 @@ import {
|
|||
FamiliarFollowers as FamiliarFollowersSchema,
|
||||
RolePermission,
|
||||
} from "@versia/client/schemas";
|
||||
import { ApiError } from "@versia-server/kit";
|
||||
import {
|
||||
apiRoute,
|
||||
auth,
|
||||
handleZodError,
|
||||
qsQuery,
|
||||
} from "@versia-server/kit/api";
|
||||
import { db, User } from "@versia-server/kit/db";
|
||||
import type { Users } from "@versia-server/kit/tables";
|
||||
import { ApiError } from "@versia/kit";
|
||||
import { db, User } from "@versia/kit/db";
|
||||
import type { Users } from "@versia/kit/tables";
|
||||
import { type InferSelectModel, sql } from "drizzle-orm";
|
||||
import { describeRoute } from "hono-openapi";
|
||||
import { resolver, validator } from "hono-openapi/zod";
|
||||
import { z } from "zod";
|
||||
import { apiRoute, auth, handleZodError, qsQuery } from "@/api";
|
||||
import { rateLimit } from "../../../../../middlewares/rate-limit.ts";
|
||||
|
||||
export default apiRoute((app) =>
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
import { afterAll, describe, expect, test } from "bun:test";
|
||||
import { generateClient, getTestUsers } from "@versia-server/tests";
|
||||
import { generateClient, getTestUsers } from "~/tests/utils";
|
||||
|
||||
const { users, deleteUsers } = await getTestUsers(5);
|
||||
|
||||
|
|
|
|||
|
|
@ -1,9 +1,9 @@
|
|||
import { afterEach, describe, expect, test } from "bun:test";
|
||||
import { db } from "@versia-server/kit/db";
|
||||
import { Users } from "@versia-server/kit/tables";
|
||||
import { generateClient, getSolvedChallenge } from "@versia-server/tests";
|
||||
import { db } from "@versia/kit/db";
|
||||
import { Users } from "@versia/kit/tables";
|
||||
import { eq } from "drizzle-orm";
|
||||
import { randomString } from "@/math";
|
||||
import { generateClient, getSolvedChallenge } from "~/tests/utils";
|
||||
|
||||
const username = randomString(10, "hex");
|
||||
const username2 = randomString(10, "hex");
|
||||
|
|
|
|||
|
|
@ -1,20 +1,14 @@
|
|||
import { Account as AccountSchema, zBoolean } from "@versia/client/schemas";
|
||||
import { ApiError } from "@versia/kit";
|
||||
import { User } from "@versia/kit/db";
|
||||
import { Users } from "@versia/kit/tables";
|
||||
import { config } from "@versia-server/config";
|
||||
import { ApiError } from "@versia-server/kit";
|
||||
import {
|
||||
apiRoute,
|
||||
auth,
|
||||
handleZodError,
|
||||
jsonOrForm,
|
||||
qsQuery,
|
||||
} from "@versia-server/kit/api";
|
||||
import { User } from "@versia-server/kit/db";
|
||||
import { Users } from "@versia-server/kit/tables";
|
||||
import { and, eq, isNull } from "drizzle-orm";
|
||||
import { describeRoute } from "hono-openapi";
|
||||
import { resolver, validator } from "hono-openapi/zod";
|
||||
import ISO6391 from "iso-639-1";
|
||||
import { z } from "zod";
|
||||
import { apiRoute, auth, handleZodError, jsonOrForm, qsQuery } from "@/api";
|
||||
import { tempmailDomains } from "@/tempmail";
|
||||
import { rateLimit } from "../../../../middlewares/rate-limit.ts";
|
||||
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
import { afterAll, describe, expect, test } from "bun:test";
|
||||
import { generateClient, getTestUsers } from "@versia-server/tests";
|
||||
import { generateClient, getTestUsers } from "~/tests/utils";
|
||||
|
||||
const { users, deleteUsers } = await getTestUsers(5);
|
||||
|
||||
|
|
|
|||
|
|
@ -2,16 +2,15 @@ import {
|
|||
Account as AccountSchema,
|
||||
RolePermission,
|
||||
} from "@versia/client/schemas";
|
||||
import { ApiError } from "@versia/kit";
|
||||
import { Instance, User } from "@versia/kit/db";
|
||||
import { Users } from "@versia/kit/tables";
|
||||
import { config } from "@versia-server/config";
|
||||
import { ApiError } from "@versia-server/kit";
|
||||
import { apiRoute, auth, handleZodError } from "@versia-server/kit/api";
|
||||
import { Instance, User } from "@versia-server/kit/db";
|
||||
import { parseUserAddress } from "@versia-server/kit/parsers";
|
||||
import { Users } from "@versia-server/kit/tables";
|
||||
import { and, eq, isNull } from "drizzle-orm";
|
||||
import { describeRoute } from "hono-openapi";
|
||||
import { resolver, validator } from "hono-openapi/zod";
|
||||
import { z } from "zod";
|
||||
import { apiRoute, auth, handleZodError, parseUserAddress } from "@/api";
|
||||
import { rateLimit } from "../../../../../middlewares/rate-limit.ts";
|
||||
|
||||
export default apiRoute((app) =>
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
import { afterAll, beforeAll, describe, expect, test } from "bun:test";
|
||||
import { db } from "@versia-server/kit/db";
|
||||
import { Users } from "@versia-server/kit/tables";
|
||||
import { generateClient, getTestUsers } from "@versia-server/tests";
|
||||
import { db } from "@versia/kit/db";
|
||||
import { Users } from "@versia/kit/tables";
|
||||
import { eq } from "drizzle-orm";
|
||||
import { generateClient, getTestUsers } from "~/tests/utils";
|
||||
|
||||
const { users, deleteUsers } = await getTestUsers(5);
|
||||
|
||||
|
|
|
|||
|
|
@ -4,17 +4,12 @@ import {
|
|||
RolePermission,
|
||||
zBoolean,
|
||||
} from "@versia/client/schemas";
|
||||
import { ApiError } from "@versia-server/kit";
|
||||
import {
|
||||
apiRoute,
|
||||
auth,
|
||||
handleZodError,
|
||||
qsQuery,
|
||||
} from "@versia-server/kit/api";
|
||||
import { Relationship } from "@versia-server/kit/db";
|
||||
import { ApiError } from "@versia/kit";
|
||||
import { Relationship } from "@versia/kit/db";
|
||||
import { describeRoute } from "hono-openapi";
|
||||
import { resolver, validator } from "hono-openapi/zod";
|
||||
import { z } from "zod";
|
||||
import { apiRoute, auth, handleZodError, qsQuery } from "@/api";
|
||||
import { rateLimit } from "../../../../../middlewares/rate-limit.ts";
|
||||
|
||||
export default apiRoute((app) =>
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
import { afterAll, describe, expect, test } from "bun:test";
|
||||
import { generateClient, getTestUsers } from "@versia-server/tests";
|
||||
import { generateClient, getTestUsers } from "~/tests/utils";
|
||||
|
||||
const { users, deleteUsers } = await getTestUsers(5);
|
||||
|
||||
|
|
|
|||
|
|
@ -3,16 +3,15 @@ import {
|
|||
RolePermission,
|
||||
zBoolean,
|
||||
} from "@versia/client/schemas";
|
||||
import { ApiError } from "@versia-server/kit";
|
||||
import { apiRoute, auth, handleZodError } from "@versia-server/kit/api";
|
||||
import { User } from "@versia-server/kit/db";
|
||||
import { parseUserAddress } from "@versia-server/kit/parsers";
|
||||
import { Users } from "@versia-server/kit/tables";
|
||||
import { ApiError } from "@versia/kit";
|
||||
import { User } from "@versia/kit/db";
|
||||
import { Users } from "@versia/kit/tables";
|
||||
import { eq, ilike, not, or, sql } from "drizzle-orm";
|
||||
import { describeRoute } from "hono-openapi";
|
||||
import { resolver, validator } from "hono-openapi/zod";
|
||||
import stringComparison from "string-comparison";
|
||||
import { z } from "zod";
|
||||
import { apiRoute, auth, handleZodError, parseUserAddress } from "@/api";
|
||||
import { rateLimit } from "../../../../../middlewares/rate-limit.ts";
|
||||
|
||||
export default apiRoute((app) =>
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
import { afterAll, describe, expect, test } from "bun:test";
|
||||
import { config } from "@versia-server/config";
|
||||
import { generateClient, getTestUsers } from "@versia-server/tests";
|
||||
import { generateClient, getTestUsers } from "~/tests/utils";
|
||||
|
||||
const { users, deleteUsers } = await getTestUsers(1);
|
||||
|
||||
|
|
|
|||
|
|
@ -3,24 +3,19 @@ import {
|
|||
RolePermission,
|
||||
zBoolean,
|
||||
} from "@versia/client/schemas";
|
||||
import { ApiError } from "@versia/kit";
|
||||
import { Emoji, Media, User } from "@versia/kit/db";
|
||||
import { Users } from "@versia/kit/tables";
|
||||
import * as VersiaEntities from "@versia/sdk/entities";
|
||||
import { config } from "@versia-server/config";
|
||||
import { ApiError } from "@versia-server/kit";
|
||||
import {
|
||||
apiRoute,
|
||||
auth,
|
||||
handleZodError,
|
||||
jsonOrForm,
|
||||
} from "@versia-server/kit/api";
|
||||
import { Emoji, Media, User } from "@versia-server/kit/db";
|
||||
import { versiaTextToHtml } from "@versia-server/kit/parsers";
|
||||
import { Users } from "@versia-server/kit/tables";
|
||||
import { and, eq, isNull } from "drizzle-orm";
|
||||
import { describeRoute } from "hono-openapi";
|
||||
import { resolver, validator } from "hono-openapi/zod";
|
||||
import { z } from "zod";
|
||||
import { apiRoute, auth, handleZodError, jsonOrForm } from "@/api";
|
||||
import { mergeAndDeduplicate } from "@/lib";
|
||||
import { sanitizedHtmlStrip } from "@/sanitization";
|
||||
import { contentToHtml } from "~/classes/functions/status";
|
||||
import { rateLimit } from "../../../../../middlewares/rate-limit.ts";
|
||||
|
||||
export default apiRoute((app) =>
|
||||
|
|
@ -247,7 +242,7 @@ export default apiRoute((app) =>
|
|||
|
||||
if (note) {
|
||||
self.source.note = note;
|
||||
self.note = await versiaTextToHtml(
|
||||
self.note = await contentToHtml(
|
||||
new VersiaEntities.TextContentFormat({
|
||||
"text/markdown": {
|
||||
content: note,
|
||||
|
|
@ -334,7 +329,7 @@ export default apiRoute((app) =>
|
|||
self.source.fields = [];
|
||||
for (const field of fields_attributes) {
|
||||
// Can be Markdown or plaintext, also has emojis
|
||||
const parsedName = await versiaTextToHtml(
|
||||
const parsedName = await contentToHtml(
|
||||
new VersiaEntities.TextContentFormat({
|
||||
"text/markdown": {
|
||||
content: field.name,
|
||||
|
|
@ -345,7 +340,7 @@ export default apiRoute((app) =>
|
|||
true,
|
||||
);
|
||||
|
||||
const parsedValue = await versiaTextToHtml(
|
||||
const parsedValue = await contentToHtml(
|
||||
new VersiaEntities.TextContentFormat({
|
||||
"text/markdown": {
|
||||
content: field.value,
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
import { afterAll, describe, expect, test } from "bun:test";
|
||||
import { config } from "@versia-server/config";
|
||||
import { generateClient, getTestUsers } from "@versia-server/tests";
|
||||
import { generateClient, getTestUsers } from "~/tests/utils";
|
||||
|
||||
const { users, deleteUsers } = await getTestUsers(1);
|
||||
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
import { Account } from "@versia/client/schemas";
|
||||
import { ApiError } from "@versia-server/kit";
|
||||
import { apiRoute, auth } from "@versia-server/kit/api";
|
||||
import { ApiError } from "@versia/kit";
|
||||
import { describeRoute } from "hono-openapi";
|
||||
import { resolver } from "hono-openapi/zod";
|
||||
import { apiRoute, auth } from "@/api";
|
||||
|
||||
export default apiRoute((app) =>
|
||||
app.get(
|
||||
|
|
|
|||
|
|
@ -2,13 +2,13 @@ import {
|
|||
Application as ApplicationSchema,
|
||||
CredentialApplication as CredentialApplicationSchema,
|
||||
} from "@versia/client/schemas";
|
||||
import { ApiError } from "@versia-server/kit";
|
||||
import { apiRoute, handleZodError, jsonOrForm } from "@versia-server/kit/api";
|
||||
import { Application } from "@versia-server/kit/db";
|
||||
import { ApiError } from "@versia/kit";
|
||||
import { Application } from "@versia/kit/db";
|
||||
import { randomUUIDv7 } from "bun";
|
||||
import { describeRoute } from "hono-openapi";
|
||||
import { resolver, validator } from "hono-openapi/zod";
|
||||
import { z } from "zod";
|
||||
import { apiRoute, handleZodError, jsonOrForm } from "@/api";
|
||||
import { randomString } from "@/math";
|
||||
import { rateLimit } from "../../../../middlewares/rate-limit.ts";
|
||||
|
||||
|
|
|
|||
|
|
@ -2,11 +2,11 @@ import {
|
|||
Application as ApplicationSchema,
|
||||
RolePermission,
|
||||
} from "@versia/client/schemas";
|
||||
import { ApiError } from "@versia-server/kit";
|
||||
import { apiRoute, auth } from "@versia-server/kit/api";
|
||||
import { Application } from "@versia-server/kit/db";
|
||||
import { ApiError } from "@versia/kit";
|
||||
import { Application } from "@versia/kit/db";
|
||||
import { describeRoute } from "hono-openapi";
|
||||
import { resolver } from "hono-openapi/zod";
|
||||
import { apiRoute, auth } from "@/api";
|
||||
|
||||
export default apiRoute((app) =>
|
||||
app.get(
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
import { afterAll, describe, expect, test } from "bun:test";
|
||||
import { generateClient, getTestUsers } from "@versia-server/tests";
|
||||
import { generateClient, getTestUsers } from "~/tests/utils";
|
||||
|
||||
const { users, deleteUsers } = await getTestUsers(3);
|
||||
|
||||
|
|
|
|||
|
|
@ -2,14 +2,14 @@ import {
|
|||
Account as AccountSchema,
|
||||
RolePermission,
|
||||
} from "@versia/client/schemas";
|
||||
import { ApiError } from "@versia-server/kit";
|
||||
import { apiRoute, auth, handleZodError } from "@versia-server/kit/api";
|
||||
import { Timeline } from "@versia-server/kit/db";
|
||||
import { Users } from "@versia-server/kit/tables";
|
||||
import { ApiError } from "@versia/kit";
|
||||
import { Timeline } from "@versia/kit/db";
|
||||
import { Users } from "@versia/kit/tables";
|
||||
import { and, gt, gte, lt, sql } from "drizzle-orm";
|
||||
import { describeRoute } from "hono-openapi";
|
||||
import { resolver, validator } from "hono-openapi/zod";
|
||||
import { z } from "zod";
|
||||
import { apiRoute, auth, handleZodError } from "@/api";
|
||||
|
||||
export default apiRoute((app) =>
|
||||
app.get(
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
import { describe, expect, test } from "bun:test";
|
||||
import { generateClient } from "@versia-server/tests";
|
||||
import { generateClient } from "~/tests/utils";
|
||||
|
||||
// /api/v1/challenges
|
||||
describe("/api/v1/challenges", () => {
|
||||
|
|
|
|||
|
|
@ -1,9 +1,9 @@
|
|||
import { Challenge } from "@versia/client/schemas";
|
||||
import { ApiError } from "@versia/kit";
|
||||
import { config } from "@versia-server/config";
|
||||
import { ApiError } from "@versia-server/kit";
|
||||
import { apiRoute, auth } from "@versia-server/kit/api";
|
||||
import { describeRoute } from "hono-openapi";
|
||||
import { resolver } from "hono-openapi/zod";
|
||||
import { apiRoute, auth } from "@/api";
|
||||
import { generateChallenge } from "@/challenges";
|
||||
|
||||
export default apiRoute((app) =>
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
import { afterAll, beforeAll, describe, expect, test } from "bun:test";
|
||||
import { db } from "@versia-server/kit/db";
|
||||
import { Emojis } from "@versia-server/kit/tables";
|
||||
import { generateClient, getTestUsers } from "@versia-server/tests";
|
||||
import { db } from "@versia/kit/db";
|
||||
import { Emojis } from "@versia/kit/tables";
|
||||
import { inArray } from "drizzle-orm";
|
||||
import { generateClient, getTestUsers } from "~/tests/utils";
|
||||
|
||||
const { users, deleteUsers } = await getTestUsers(2);
|
||||
|
||||
|
|
|
|||
|
|
@ -2,14 +2,14 @@ import {
|
|||
CustomEmoji as CustomEmojiSchema,
|
||||
RolePermission,
|
||||
} from "@versia/client/schemas";
|
||||
import { ApiError } from "@versia-server/kit";
|
||||
import { apiRoute, auth } from "@versia-server/kit/api";
|
||||
import { Emoji } from "@versia-server/kit/db";
|
||||
import { Emojis } from "@versia-server/kit/tables";
|
||||
import { ApiError } from "@versia/kit";
|
||||
import { Emoji } from "@versia/kit/db";
|
||||
import { Emojis } from "@versia/kit/tables";
|
||||
import { and, eq, isNull, or } from "drizzle-orm";
|
||||
import { describeRoute } from "hono-openapi";
|
||||
import { resolver } from "hono-openapi/zod";
|
||||
import { z } from "zod";
|
||||
import { apiRoute, auth } from "@/api";
|
||||
|
||||
export default apiRoute((app) =>
|
||||
app.get(
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
import { afterAll, beforeAll, describe, expect, test } from "bun:test";
|
||||
import { db } from "@versia-server/kit/db";
|
||||
import { Emojis } from "@versia-server/kit/tables";
|
||||
import { generateClient, getTestUsers } from "@versia-server/tests";
|
||||
import { db } from "@versia/kit/db";
|
||||
import { Emojis } from "@versia/kit/tables";
|
||||
import { inArray } from "drizzle-orm";
|
||||
import { generateClient, getTestUsers } from "~/tests/utils";
|
||||
|
||||
const { users, deleteUsers } = await getTestUsers(2);
|
||||
let id = "";
|
||||
|
|
|
|||
|
|
@ -2,18 +2,18 @@ import {
|
|||
CustomEmoji as CustomEmojiSchema,
|
||||
RolePermission,
|
||||
} from "@versia/client/schemas";
|
||||
import { ApiError } from "@versia/kit";
|
||||
import { config } from "@versia-server/config";
|
||||
import { ApiError } from "@versia-server/kit";
|
||||
import { describeRoute } from "hono-openapi";
|
||||
import { resolver, validator } from "hono-openapi/zod";
|
||||
import { z } from "zod";
|
||||
import {
|
||||
apiRoute,
|
||||
auth,
|
||||
handleZodError,
|
||||
jsonOrForm,
|
||||
withEmojiParam,
|
||||
} from "@versia-server/kit/api";
|
||||
import { describeRoute } from "hono-openapi";
|
||||
import { resolver, validator } from "hono-openapi/zod";
|
||||
import { z } from "zod";
|
||||
} from "@/api";
|
||||
import { mimeLookup } from "@/content_types";
|
||||
|
||||
export default apiRoute((app) => {
|
||||
|
|
|
|||
|
|
@ -1,9 +1,9 @@
|
|||
import { afterAll, beforeAll, describe, expect, test } from "bun:test";
|
||||
import { db } from "@versia-server/kit/db";
|
||||
import { Emojis } from "@versia-server/kit/tables";
|
||||
import { generateClient, getTestUsers } from "@versia-server/tests";
|
||||
import { db } from "@versia/kit/db";
|
||||
import { Emojis } from "@versia/kit/tables";
|
||||
import { inArray } from "drizzle-orm";
|
||||
import sharp from "sharp";
|
||||
import { generateClient, getTestUsers } from "~/tests/utils";
|
||||
|
||||
const { users, deleteUsers } = await getTestUsers(3);
|
||||
|
||||
|
|
|
|||
|
|
@ -2,21 +2,16 @@ import {
|
|||
CustomEmoji as CustomEmojiSchema,
|
||||
RolePermission,
|
||||
} from "@versia/client/schemas";
|
||||
import { ApiError } from "@versia/kit";
|
||||
import { Emoji, Media } from "@versia/kit/db";
|
||||
import { Emojis } from "@versia/kit/tables";
|
||||
import { config } from "@versia-server/config";
|
||||
import { ApiError } from "@versia-server/kit";
|
||||
import {
|
||||
apiRoute,
|
||||
auth,
|
||||
handleZodError,
|
||||
jsonOrForm,
|
||||
} from "@versia-server/kit/api";
|
||||
import { Emoji, Media } from "@versia-server/kit/db";
|
||||
import { Emojis } from "@versia-server/kit/tables";
|
||||
import { randomUUIDv7 } from "bun";
|
||||
import { and, eq, isNull, or } from "drizzle-orm";
|
||||
import { describeRoute } from "hono-openapi";
|
||||
import { resolver, validator } from "hono-openapi/zod";
|
||||
import { z } from "zod";
|
||||
import { apiRoute, auth, handleZodError, jsonOrForm } from "@/api";
|
||||
import { mimeLookup } from "@/content_types";
|
||||
|
||||
export default apiRoute((app) =>
|
||||
|
|
|
|||
|
|
@ -1,12 +1,12 @@
|
|||
import { RolePermission, Status as StatusSchema } from "@versia/client/schemas";
|
||||
import { ApiError } from "@versia-server/kit";
|
||||
import { apiRoute, auth, handleZodError } from "@versia-server/kit/api";
|
||||
import { Timeline } from "@versia-server/kit/db";
|
||||
import { Notes } from "@versia-server/kit/tables";
|
||||
import { ApiError } from "@versia/kit";
|
||||
import { Timeline } from "@versia/kit/db";
|
||||
import { Notes } from "@versia/kit/tables";
|
||||
import { and, gt, gte, lt, sql } from "drizzle-orm";
|
||||
import { describeRoute } from "hono-openapi";
|
||||
import { resolver, validator } from "hono-openapi/zod";
|
||||
import { z } from "zod";
|
||||
import { apiRoute, auth, handleZodError } from "@/api";
|
||||
|
||||
export default apiRoute((app) =>
|
||||
app.get(
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue