diff --git a/src/routes/api/auth/register.ts b/src/routes/api/auth/register.ts index ca14995..edaf1dc 100644 --- a/src/routes/api/auth/register.ts +++ b/src/routes/api/auth/register.ts @@ -91,8 +91,7 @@ async function handler( roles.push("user"); if (firstUser) roles.push("admin"); - const result: { usernameExists: boolean; emailExists: boolean }[] = - await reservation` + const [result] = await reservation` SELECT EXISTS(SELECT 1 FROM users WHERE LOWER(username) = LOWER(${normalizedUsername})) AS "usernameExists", EXISTS(SELECT 1 FROM users WHERE LOWER(email) = LOWER(${email})) AS "emailExists"; @@ -105,14 +104,12 @@ async function handler( } if (invite && !firstUser) { - const result: Invite[] = + [inviteData] = await reservation`SELECT * FROM invites WHERE id = ${invite};`; - if (!result || result.length === 0) { + if (!inviteData) { errors.push("Invalid invite"); } - - inviteData = result[0]; } } catch (error) { errors.push("An error occurred while checking for existing users"); @@ -140,13 +137,13 @@ async function handler( : (await getSetting("default_timezone", reservation)) || "UTC"; try { - const result: User[] = await reservation` + [user] = await reservation` INSERT INTO users (username, email, password, invited_by, roles, timezone) VALUES (${normalizedUsername}, ${email}, ${hashedPassword}, ${inviteData?.created_by}, ARRAY[${roles.join(",")}]::TEXT[], ${setTimezone}) RETURNING *; `; - if (result.length === 0) { + if (!user) { logger.error("User was not created"); return Response.json( { @@ -158,8 +155,6 @@ async function handler( ); } - user = result[0]; - if (!user) { logger.error("User was not created"); return Response.json( diff --git a/src/routes/api/files/upload.ts b/src/routes/api/files/upload.ts index 0d8b3d5..ef12d63 100644 --- a/src/routes/api/files/upload.ts +++ b/src/routes/api/files/upload.ts @@ -296,7 +296,7 @@ async function processFile( } try { - const result: FileUpload[] = await sql` + const [result] = await sql` INSERT INTO files ( id, owner, folder, name, original_name, mime_type, extension, size, max_views, password, favorite, tags, expires_at ) VALUES ( ${uploadEntry.id}, ${uploadEntry.owner}, ${folder_identifier}, ${uploadEntry.name}, @@ -308,7 +308,7 @@ async function processFile( RETURNING id; `; - if (result.length === 0) { + if (!result) { failedFiles.push({ reason: "Failed to create file entry", file: key, diff --git a/src/routes/api/invite/create.ts b/src/routes/api/invite/create.ts index 23f9bd5..30f214d 100644 --- a/src/routes/api/invite/create.ts +++ b/src/routes/api/invite/create.ts @@ -75,13 +75,13 @@ async function handler( let invite: Invite | null = null; try { - const result: Invite[] = await sql` + [invite] = await sql` INSERT INTO invites (created_by, expiration, max_uses, role, id) VALUES (${request.session.id}, ${expirationDate}, ${maxUses}, ${inviteRole}, ${generateRandomString(15)}) RETURNING *; `; - if (result.length === 0) { + if (!invite) { logger.error("Invite failed to create"); return Response.json( @@ -93,8 +93,6 @@ async function handler( { status: 500 }, ); } - - invite = result[0]; } catch (error) { logger.error(["Error creating invite:", error as Error]); diff --git a/src/routes/api/invite/delete[invite].ts b/src/routes/api/invite/delete[invite].ts index bf5617f..fbbd38e 100644 --- a/src/routes/api/invite/delete[invite].ts +++ b/src/routes/api/invite/delete[invite].ts @@ -52,10 +52,10 @@ async function handler(request: ExtendedRequest): Promise { let inviteData: Invite | null = null; try { - const result: Invite[] = + [inviteData] = await reservation`SELECT * FROM invites WHERE id = ${invite};`; - if (result.length === 0) { + if (!inviteData) { return Response.json( { success: false, @@ -66,8 +66,6 @@ async function handler(request: ExtendedRequest): Promise { ); } - inviteData = result[0]; - if (!isAdmin && inviteData.created_by !== request.session.id) { return Response.json( { diff --git a/src/routes/api/user/files.ts b/src/routes/api/user/files.ts new file mode 100644 index 0000000..0559c75 --- /dev/null +++ b/src/routes/api/user/files.ts @@ -0,0 +1,158 @@ +// import { type ReservedSQL, sql } from "bun"; +// +// import { isUUID } from "@/helpers/char"; +// import { logger } from "@/helpers/logger"; +// +// function isValidSort(sortBy: string): boolean { +// const validSorts: string[] = [ +// "size", +// "created_at", +// "expires_at", +// "views", +// "name", +// "original_name", +// "mime_type", +// "extension", +// ]; +// return validSorts.includes(sortBy); +// } +// +// function validSortOrder(sortOrder: string): string { +// const validSortOrder: { [key: string]: string } = { +// asc: "ASC", +// desc: "DESC", +// ascending: "ASC", +// descending: "DESC", +// }; +// +// return validSortOrder[sortOrder.toLowerCase()] || "DESC"; +// } +// +// const escapeLike: (value: string) => string = (value: string): string => +// value.replace(/[%_\\]/g, "\\$&"); +// +// const routeDef: RouteDef = { +// method: "GET", +// accepts: "*/*", +// returns: "application/json", +// }; +// +// async function handler(request: ExtendedRequest): Promise { +// const { +// user: user_id, +// count = "25", +// page = "0", +// sort_by = "created_at", +// sort_order = "DESC", +// search_value, +// } = request.query as { +// user: string; +// count: string; +// page: string; +// sort_by: string; +// sort_order: string; +// search_value: string; +// }; +// +// if (!isValidSort(sort_by)) { +// return Response.json( +// { +// success: false, +// code: 400, +// error: "Invalid sort_by value", +// }, +// { status: 400 }, +// ); +// } +// +// const userLookup: string | undefined = user_id || request.session?.id; +// +// if (!userLookup) { +// return Response.json( +// { +// success: false, +// code: 400, +// error: "Please provide a user ID or log in", +// }, +// { status: 400 }, +// ); +// } +// +// const isId: boolean = isUUID(userLookup); +// +// if (!isId) { +// return Response.json( +// { +// success: false, +// code: 400, +// error: "Invalid user ID", +// }, +// { status: 400 }, +// ); +// } +// +// const isSelf: boolean = request.session?.id === userLookup; +// const isAdmin: boolean = request.session +// ? request.session.roles.includes("admin") +// : false; +// +// if (!isSelf && !isAdmin) { +// return Response.json( +// { +// success: false, +// code: 403, +// error: "Unauthorized", +// }, +// { status: 403 }, +// ); +// } +// +// const safeCount: number = Math.min(parseInt(count) || 25, 100); +// const safePage: number = Math.max(parseInt(page) || 0, 0); +// const offset: number = safePage * safeCount; +// let files: FileEntry[]; +// +// const reservation: ReservedSQL = await sql.reserve(); +// +// // ! figure out why it wont accept DESC or ASC unless it's hardcoded +// try { +// if (sort_by === "created_at" || sort_by === "expires_at") { +// } +// +// if (!files.length) { +// return Response.json( +// { +// success: true, +// code: 200, +// count: 0, +// files: [], +// }, +// { status: 200 }, +// ); +// } +// } catch (error) { +// logger.error(["Error fetching files", error as Error]); +// return Response.json( +// { +// success: false, +// code: 500, +// error: "Internal server error", +// }, +// { status: 500 }, +// ); +// } finally { +// reservation.release(); +// } +// +// return Response.json( +// { +// success: true, +// code: 200, +// count: files.length, +// files, +// }, +// { status: 200 }, +// ); +// } +// +// export { handler, routeDef }; diff --git a/src/routes/api/user/info[query].ts b/src/routes/api/user/info[query].ts index 96fb226..78158d1 100644 --- a/src/routes/api/user/info[query].ts +++ b/src/routes/api/user/info[query].ts @@ -49,11 +49,11 @@ async function handler(request: ExtendedRequest): Promise { const reservation: ReservedSQL = await sql.reserve(); try { - const result: GetUser[] = isId + [user] = isId ? await reservation`SELECT * FROM users WHERE id = ${normalized}` : await reservation`SELECT * FROM users WHERE username = ${normalized}`; - if (result.length === 0) { + if (!user) { return Response.json( { success: false, @@ -64,8 +64,6 @@ async function handler(request: ExtendedRequest): Promise { ); } - user = result[0]; - isSelf = request.session ? user.id === request.session.id : false; const files: { count: bigint }[] =