infoalloggi-monorepo/apps/infoalloggi/src/server/services/storage.service.ts

185 lines
3.9 KiB
TypeScript
Raw Normal View History

2025-08-28 18:27:07 +02:00
import { TRPCError } from "@trpc/server";
import { env } from "~/env.mjs";
2025-08-04 17:45:44 +02:00
import type {
2025-08-28 18:27:07 +02:00
StorageindexId,
StorageindexUpdate,
2025-08-04 17:45:44 +02:00
} from "~/schemas/public/Storageindex";
import type { TempTokensToken } from "~/schemas/public/TempTokens";
import type { UsersId } from "~/schemas/public/Users";
2025-08-28 18:27:07 +02:00
import type { Querier } from "~/server/db";
2025-08-04 17:45:44 +02:00
export const getNewTokenHandler = async ({
2025-08-28 18:27:07 +02:00
db,
num,
2025-08-04 17:45:44 +02:00
}: {
2025-08-28 18:27:07 +02:00
db: Querier;
num?: number;
2025-08-04 17:45:44 +02:00
}): Promise<TempTokensToken[]> => {
2025-08-28 18:27:07 +02:00
const tokens: TempTokensToken[] = [];
if (num && num > 1) {
for (let i = 0; i < num; i++) {
const tok = await newToken({ db });
2025-08-04 17:45:44 +02:00
2025-08-28 18:27:07 +02:00
tokens.push(tok.token);
}
return tokens;
}
const tok = await newToken({ db });
return [tok.token];
2025-08-04 17:45:44 +02:00
};
const newToken = async ({ db }: { db: Querier }) => {
2025-08-28 18:27:07 +02:00
try {
return await db
.insertInto("temp_tokens")
.defaultValues()
.returning("token")
.executeTakeFirstOrThrow();
} catch {
throw new TRPCError({
code: "INTERNAL_SERVER_ERROR",
message: "Error while creating token",
});
}
2025-08-04 17:45:44 +02:00
};
export const deleteFile = async ({
2025-08-28 18:27:07 +02:00
db,
fileId,
cb,
2025-08-04 17:45:44 +02:00
}: {
2025-08-28 18:27:07 +02:00
db: Querier;
fileId: StorageindexId;
cb?: (fileId: StorageindexId) => Promise<void>;
2025-08-04 17:45:44 +02:00
}) => {
2025-08-28 18:27:07 +02:00
try {
const storage = await db
.selectFrom("storageindex")
.select(["id", "ext"])
.where("id", "=", fileId)
.executeTakeFirstOrThrow();
2025-08-04 17:45:44 +02:00
2025-08-28 18:27:07 +02:00
const authToken = (await getNewTokenHandler({ db }))[0];
if (!authToken) {
throw new TRPCError({
code: "INTERNAL_SERVER_ERROR",
message: "Error while getting auth token",
});
}
const url = `${env.BACKENDSERVER_URL}/storage/delete/${storage.id}${storage.ext}?token=${authToken}`;
const response = await fetch(url, {
method: "DELETE",
});
2025-08-04 17:45:44 +02:00
2025-08-28 18:27:07 +02:00
if (!response.ok) {
throw new Error("File remove failed");
}
if (cb) {
await cb(fileId);
}
} catch (error) {
console.error("Error:", error);
throw new TRPCError({
code: "INTERNAL_SERVER_ERROR",
message: "Error while deleting file",
});
}
2025-08-04 17:45:44 +02:00
};
// export const deleteFiles = async ({
// db,
// refs,
// cb,
// }: {
// db: Querier;
// refs: { storageid: StorageindexId }[];
// cb?: (refs: { storageid: StorageindexId }[]) => Promise<void>;
// }) => {
// try {
// await Promise.all(
// refs.map((ref) => deleteFile({ db, fileId: ref.storageid })),
// );
// if (cb) {
// await cb(refs);
// }
// } catch (error) {
// console.error("Error deleting files:", error);
// throw new TRPCError({
// code: "INTERNAL_SERVER_ERROR",
// message: "Error while deleting files",
// });
// }
// };
export const updateFile = async ({
2025-08-28 18:27:07 +02:00
db,
fileId,
data,
2025-08-04 17:45:44 +02:00
}: {
2025-08-28 18:27:07 +02:00
db: Querier;
fileId: StorageindexId;
data: StorageindexUpdate;
2025-08-04 17:45:44 +02:00
}) => {
2025-08-28 18:27:07 +02:00
try {
await db
.updateTable("storageindex")
.set(data)
.where("id", "=", fileId)
.execute();
return "ok";
} catch (e) {
throw new TRPCError({
code: "INTERNAL_SERVER_ERROR",
message: `Error while updating file: ${(e as Error).message}`,
});
}
2025-08-04 17:45:44 +02:00
};
export const addUserStorageJunc = async ({
2025-08-28 18:27:07 +02:00
db,
userId,
storageId,
2025-08-04 17:45:44 +02:00
}: {
2025-08-28 18:27:07 +02:00
db: Querier;
userId: UsersId;
storageId: StorageindexId;
2025-08-04 17:45:44 +02:00
}) => {
2025-08-28 18:27:07 +02:00
try {
return await db
.insertInto("users_storage")
2025-08-29 16:18:32 +02:00
.values({ storageid: storageId, userid: userId })
2025-08-28 18:27:07 +02:00
.onConflict((oc) => oc.columns(["userid", "storageid"]).doNothing())
.returningAll()
.execute();
} catch (e) {
throw new TRPCError({
code: "INTERNAL_SERVER_ERROR",
message: `Error while adding user storage: ${(e as Error).message}`,
});
}
2025-08-04 17:45:44 +02:00
};
export const deleteUserStorageJunc = async ({
2025-08-28 18:27:07 +02:00
db,
userId,
storageId,
2025-08-04 17:45:44 +02:00
}: {
2025-08-28 18:27:07 +02:00
db: Querier;
userId: UsersId;
storageId: StorageindexId;
2025-08-04 17:45:44 +02:00
}) => {
2025-08-28 18:27:07 +02:00
try {
await db
.deleteFrom("users_storage")
.where("userid", "=", userId)
.where("storageid", "=", storageId)
.execute();
return "ok";
} catch (e) {
throw new TRPCError({
code: "INTERNAL_SERVER_ERROR",
message: `Error while deleting user storage: ${(e as Error).message}`,
});
}
2025-08-04 17:45:44 +02:00
};