add thumbnails for images and videos, fix delete route not seing query, fix not using reservation in user info route and add file and folder count

This commit is contained in:
creations 2025-03-11 21:23:10 -04:00
parent f917849f4e
commit 6a55f9f5a9
Signed by: creations
GPG key ID: 8F553AA4320FC711
11 changed files with 296 additions and 19 deletions

View file

@ -125,7 +125,7 @@ async function handler(
}
const isAdmin: boolean = request.session.roles.includes("admin");
const { file } = request.params as { file: string };
const { query: file } = request.params as { query: string };
let { files } = requestBody as { files: string[] | string };
// const { password } = request.query as { password: string };
@ -133,7 +133,7 @@ async function handler(
const successfulFiles: string[] = [];
try {
if (file) {
if (file && !(typeof file === "string" && file.length === 0)) {
await processFile(
request,
file,
@ -145,6 +145,16 @@ async function handler(
files = Array.isArray(files)
? files
: files.split(/[, ]+/).filter(Boolean);
for (const file of files) {
await processFile(
request,
file,
isAdmin,
failedFiles,
successfulFiles,
);
}
}
} catch (error) {
logger.error(["Unexpected error", error as Error]);
@ -161,7 +171,7 @@ async function handler(
return Response.json({
success: true,
code: 200,
files: successfulFiles,
deleted: successfulFiles,
failed: failedFiles,
});
}

View file

@ -18,6 +18,7 @@ import {
getNewTimeUTC,
nameWithoutExtension,
supportsExif,
supportsThumbnail,
} from "@/helpers/char";
import { logger } from "@/helpers/logger";
@ -100,10 +101,7 @@ async function removeExifData(
"-overwrite_original",
]);
const modifiedBuffer: ArrayBuffer =
await Bun.file(tempInputPath).arrayBuffer();
return modifiedBuffer;
return await Bun.file(tempInputPath).arrayBuffer();
} catch (error) {
logger.error(["Error modifying EXIF data:", error as Error]);
return fileBuffer;
@ -438,6 +436,29 @@ async function handler(request: ExtendedRequest): Promise<Response> {
}
}
const filesThatSupportThumbnails: FileUpload[] = successfulFiles.filter(
(file: FileUpload): boolean =>
supportsThumbnail(file.mime_type as string),
);
if (
(await getSetting("enable_thumbnails")) === "true" &&
filesThatSupportThumbnails.length > 0
) {
try {
const worker: Worker = new Worker(
"./src/helpers/workers/thumbnails.ts",
{
type: "module",
},
);
worker.postMessage({
files: filesThatSupportThumbnails,
});
} catch (error) {
logger.error(["Error starting thumbnail worker:", error as Error]);
}
}
return Response.json({
success: true,
code: 200,

View file

@ -1,5 +1,5 @@
import { isValidUsername } from "@config/sql/users";
import { sql } from "bun";
import { type ReservedSQL, sql } from "bun";
import { isUUID } from "@/helpers/char";
import { logger } from "@/helpers/logger";
@ -12,7 +12,9 @@ const routeDef: RouteDef = {
async function handler(request: ExtendedRequest): Promise<Response> {
const { query } = request.params as { query: string };
const { invites: showInvites } = request.query as { invites: string };
const { invites: showInvites } = request.query as {
invites: string;
};
if (!query) {
return Response.json(
@ -44,10 +46,12 @@ async function handler(request: ExtendedRequest): Promise<Response> {
);
}
const reservation: ReservedSQL = await sql.reserve();
try {
const result: GetUser[] = isId
? await sql`SELECT * FROM users WHERE id = ${normalized}`
: await sql`SELECT * FROM users WHERE username = ${normalized}`;
? await reservation`SELECT * FROM users WHERE id = ${normalized}`
: await reservation`SELECT * FROM users WHERE username = ${normalized}`;
if (result.length === 0) {
return Response.json(
@ -61,15 +65,23 @@ async function handler(request: ExtendedRequest): Promise<Response> {
}
user = result[0];
isSelf = request.session ? user.id === request.session.id : false;
const files: { count: bigint }[] =
await reservation`SELECT COUNT(*) FROM files WHERE owner = ${user.id}`;
const folders: { count: bigint }[] =
await reservation`SELECT COUNT(*) FROM folders WHERE owner = ${user.id}`;
if (files) user.files = Number(files[0].count);
if (folders) user.folders = Number(folders[0].count);
if (
(showInvites === "true" || showInvites === "1") &&
(isAdmin || isSelf)
) {
const invites: Invite[] =
await sql`SELECT * FROM invites WHERE created_by = ${user.id}`;
user.invites = invites;
user.invites =
await reservation`SELECT * FROM invites WHERE created_by = ${user.id}`;
}
} catch (error) {
logger.error([
@ -85,6 +97,19 @@ async function handler(request: ExtendedRequest): Promise<Response> {
},
{ status: 500 },
);
} finally {
reservation.release();
}
if (!user) {
return Response.json(
{
success: false,
code: 404,
error: "User not found",
},
{ status: 404 },
);
}
delete user.password;