mirror of
https://github.com/versia-pub/server.git
synced 2026-03-13 22:09:16 +01:00
refactor: Rewrite functions into packages
This commit is contained in:
parent
847e679a10
commit
78f216092b
21 changed files with 1426 additions and 70 deletions
|
|
@ -1,11 +1,11 @@
|
|||
import { getConfig } from "~classes/configmanager";
|
||||
import { parseRequest } from "@request";
|
||||
import { jsonResponse } from "@response";
|
||||
import { tempmailDomains } from "@tempmail";
|
||||
import { applyConfig } from "@api";
|
||||
import { client } from "~database/datasource";
|
||||
import { createNewLocalUser } from "~database/entities/User";
|
||||
import ISO6391 from "iso-639-1";
|
||||
import type { RouteHandler } from "~server/api/routes.type";
|
||||
|
||||
export const meta = applyConfig({
|
||||
allowedMethods: ["POST"],
|
||||
|
|
@ -19,20 +19,17 @@ export const meta = applyConfig({
|
|||
},
|
||||
});
|
||||
|
||||
/**
|
||||
* Creates a new user
|
||||
*/
|
||||
export default async (req: Request): Promise<Response> => {
|
||||
const handler: RouteHandler<{
|
||||
username: string;
|
||||
email: string;
|
||||
password: string;
|
||||
agreement: boolean;
|
||||
locale: string;
|
||||
reason: string;
|
||||
}> = async (req, matchedRoute, extraData) => {
|
||||
// TODO: Add Authorization check
|
||||
|
||||
const body = await parseRequest<{
|
||||
username: string;
|
||||
email: string;
|
||||
password: string;
|
||||
agreement: boolean;
|
||||
locale: string;
|
||||
reason: string;
|
||||
}>(req);
|
||||
const body = extraData.parsedRequest;
|
||||
|
||||
const config = getConfig();
|
||||
|
||||
|
|
@ -94,8 +91,8 @@ export default async (req: Request): Promise<Response> => {
|
|||
|
||||
// Check if username doesnt match filters
|
||||
if (
|
||||
config.filters.username_filters.some(
|
||||
filter => body.username?.match(filter)
|
||||
config.filters.username_filters.some(filter =>
|
||||
body.username?.match(filter)
|
||||
)
|
||||
) {
|
||||
errors.details.username.push({
|
||||
|
|
@ -204,3 +201,8 @@ export default async (req: Request): Promise<Response> => {
|
|||
status: 200,
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* Creates a new user
|
||||
*/
|
||||
export default handler;
|
||||
|
|
|
|||
|
|
@ -1,12 +1,8 @@
|
|||
import { errorResponse, jsonResponse } from "@response";
|
||||
import {
|
||||
getFromRequest,
|
||||
userRelations,
|
||||
userToAPI,
|
||||
} from "~database/entities/User";
|
||||
import { userRelations, userToAPI } from "~database/entities/User";
|
||||
import { applyConfig } from "@api";
|
||||
import { parseRequest } from "@request";
|
||||
import { client } from "~database/datasource";
|
||||
import type { RouteHandler } from "~server/api/routes.type";
|
||||
|
||||
export const meta = applyConfig({
|
||||
allowedMethods: ["GET"],
|
||||
|
|
@ -20,10 +16,16 @@ export const meta = applyConfig({
|
|||
},
|
||||
});
|
||||
|
||||
export default async (req: Request): Promise<Response> => {
|
||||
const handler: RouteHandler<{
|
||||
q?: string;
|
||||
limit?: number;
|
||||
offset?: number;
|
||||
resolve?: boolean;
|
||||
following?: boolean;
|
||||
}> = async (req, matchedRoute, extraData) => {
|
||||
// TODO: Add checks for disabled or not email verified accounts
|
||||
|
||||
const { user } = await getFromRequest(req);
|
||||
const { user } = extraData.auth;
|
||||
|
||||
if (!user) return errorResponse("Unauthorized", 401);
|
||||
|
||||
|
|
@ -32,13 +34,7 @@ export default async (req: Request): Promise<Response> => {
|
|||
limit = 40,
|
||||
offset,
|
||||
q,
|
||||
} = await parseRequest<{
|
||||
q?: string;
|
||||
limit?: number;
|
||||
offset?: number;
|
||||
resolve?: boolean;
|
||||
following?: boolean;
|
||||
}>(req);
|
||||
} = extraData.parsedRequest;
|
||||
|
||||
if (limit < 1 || limit > 80) {
|
||||
return errorResponse("Limit must be between 1 and 80", 400);
|
||||
|
|
@ -66,7 +62,7 @@ export default async (req: Request): Promise<Response> => {
|
|||
ownerId: user.id,
|
||||
following,
|
||||
},
|
||||
}
|
||||
}
|
||||
: undefined,
|
||||
},
|
||||
take: Number(limit),
|
||||
|
|
@ -76,3 +72,5 @@ export default async (req: Request): Promise<Response> => {
|
|||
|
||||
return jsonResponse(accounts.map(acct => userToAPI(acct)));
|
||||
};
|
||||
|
||||
export default handler;
|
||||
|
|
|
|||
|
|
@ -1,11 +1,6 @@
|
|||
import { getConfig } from "~classes/configmanager";
|
||||
import { parseRequest } from "@request";
|
||||
import { errorResponse, jsonResponse } from "@response";
|
||||
import {
|
||||
userRelations,
|
||||
userToAPI,
|
||||
type AuthData,
|
||||
} from "~database/entities/User";
|
||||
import { userRelations, userToAPI } from "~database/entities/User";
|
||||
import { applyConfig } from "@api";
|
||||
import { sanitize } from "isomorphic-dompurify";
|
||||
import { sanitizeHtml } from "@sanitization";
|
||||
|
|
@ -15,7 +10,7 @@ import { parseEmojis } from "~database/entities/Emoji";
|
|||
import { client } from "~database/datasource";
|
||||
import type { APISource } from "~types/entities/source";
|
||||
import { convertTextToHtml } from "@formatting";
|
||||
import type { MatchedRoute } from "bun";
|
||||
import type { RouteHandler } from "~server/api/routes.type";
|
||||
|
||||
export const meta = applyConfig({
|
||||
allowedMethods: ["PATCH"],
|
||||
|
|
@ -29,15 +24,19 @@ export const meta = applyConfig({
|
|||
},
|
||||
});
|
||||
|
||||
/**
|
||||
* Patches a user
|
||||
*/
|
||||
export default async (
|
||||
req: Request,
|
||||
matchedRoute: MatchedRoute,
|
||||
auth: AuthData
|
||||
): Promise<Response> => {
|
||||
const { user } = auth;
|
||||
const handler: RouteHandler<{
|
||||
display_name: string;
|
||||
note: string;
|
||||
avatar: File;
|
||||
header: File;
|
||||
locked: string;
|
||||
bot: string;
|
||||
discoverable: string;
|
||||
"source[privacy]": string;
|
||||
"source[sensitive]": string;
|
||||
"source[language]": string;
|
||||
}> = async (req, matchedRoute, extraData) => {
|
||||
const { user } = extraData.auth;
|
||||
|
||||
if (!user) return errorResponse("Unauthorized", 401);
|
||||
|
||||
|
|
@ -54,18 +53,7 @@ export default async (
|
|||
"source[privacy]": source_privacy,
|
||||
"source[sensitive]": source_sensitive,
|
||||
"source[language]": source_language,
|
||||
} = await parseRequest<{
|
||||
display_name: string;
|
||||
note: string;
|
||||
avatar: File;
|
||||
header: File;
|
||||
locked: string;
|
||||
bot: string;
|
||||
discoverable: string;
|
||||
"source[privacy]": string;
|
||||
"source[sensitive]": string;
|
||||
"source[language]": string;
|
||||
}>(req);
|
||||
} = extraData.parsedRequest;
|
||||
|
||||
const sanitizedNote = await sanitizeHtml(note ?? "");
|
||||
|
||||
|
|
@ -147,7 +135,7 @@ export default async (
|
|||
}
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
|
||||
(user.source as any).privacy = source_privacy;
|
||||
user.source.privacy = source_privacy;
|
||||
}
|
||||
|
||||
if (source_sensitive && user.source) {
|
||||
|
|
@ -157,7 +145,7 @@ export default async (
|
|||
}
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
|
||||
(user.source as any).sensitive = source_sensitive === "true";
|
||||
user.source.sensitive = source_sensitive === "true";
|
||||
}
|
||||
|
||||
if (source_language && user.source) {
|
||||
|
|
@ -169,7 +157,7 @@ export default async (
|
|||
}
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
|
||||
(user.source as any).language = source_language;
|
||||
user.source.language = source_language;
|
||||
}
|
||||
|
||||
if (avatar) {
|
||||
|
|
@ -264,3 +252,5 @@ export default async (
|
|||
|
||||
return jsonResponse(userToAPI(output));
|
||||
};
|
||||
|
||||
export default handler;
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
import { errorResponse, jsonResponse } from "@response";
|
||||
import { getFromRequest, userToAPI } from "~database/entities/User";
|
||||
import { userToAPI } from "~database/entities/User";
|
||||
import { applyConfig } from "@api";
|
||||
import type { RouteHandler } from "~server/api/routes.type";
|
||||
|
||||
export const meta = applyConfig({
|
||||
allowedMethods: ["GET"],
|
||||
|
|
@ -14,10 +15,12 @@ export const meta = applyConfig({
|
|||
},
|
||||
});
|
||||
|
||||
export default async (req: Request): Promise<Response> => {
|
||||
const handler: RouteHandler<> = (req, matchedRoute, extraData) => {};
|
||||
|
||||
const handler: RouteHandler<""> = (req, matchedRoute, extraData) => {
|
||||
// TODO: Add checks for disabled or not email verified accounts
|
||||
|
||||
const { user } = await getFromRequest(req);
|
||||
const { user } = extraData.auth;
|
||||
|
||||
if (!user) return errorResponse("Unauthorized", 401);
|
||||
|
||||
|
|
@ -25,3 +28,5 @@ export default async (req: Request): Promise<Response> => {
|
|||
...userToAPI(user, true),
|
||||
});
|
||||
};
|
||||
|
||||
export default handler;
|
||||
|
|
|
|||
13
server/api/routes.type.ts
Normal file
13
server/api/routes.type.ts
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
import type { MatchedRoute } from "bun";
|
||||
import type { ConfigManager } from "config-manager";
|
||||
import type { AuthData } from "~database/entities/User";
|
||||
|
||||
export type RouteHandler<T> = (
|
||||
req: Request,
|
||||
matchedRoute: MatchedRoute,
|
||||
extraData: {
|
||||
auth: AuthData;
|
||||
parsedRequest: Partial<T>;
|
||||
configManager: ConfigManager;
|
||||
}
|
||||
) => Response | Promise<Response>;
|
||||
Loading…
Add table
Add a link
Reference in a new issue