refactor: Rewrite functions into packages

This commit is contained in:
Jesse Wierzbinski 2024-03-07 19:34:50 -10:00
parent 847e679a10
commit 78f216092b
No known key found for this signature in database
21 changed files with 1426 additions and 70 deletions

View file

@ -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;

View file

@ -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;

View file

@ -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;

View file

@ -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
View 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>;