infoalloggi-monorepo/apps/infoalloggi/src/server/controllers/storage.controller.ts

192 lines
4.1 KiB
TypeScript
Raw Normal View History

2025-08-04 17:45:44 +02:00
import { TRPCError } from "@trpc/server";
2025-08-28 18:27:07 +02:00
import { jsonArrayFrom } from "kysely/helpers/postgres";
2025-08-04 17:45:44 +02:00
import type {
2025-08-28 18:27:07 +02:00
Storageindex,
StorageindexId,
2025-08-04 17:45:44 +02:00
} from "~/schemas/public/Storageindex";
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
import {
2025-08-28 18:27:07 +02:00
addUserStorageJunc,
deleteFile,
deleteUserStorageJunc,
2025-08-04 17:45:44 +02:00
} from "~/server/services/storage.service";
export const getAllHandler = async ({ db }: { db: Querier }) => {
2025-08-28 18:27:07 +02:00
return await db.selectFrom("storageindex").selectAll().execute();
2025-08-04 17:45:44 +02:00
};
export const getFromIdHandler = async ({
2025-08-28 18:27:07 +02:00
db,
storage_id,
2025-08-04 17:45:44 +02:00
}: {
2025-08-28 18:27:07 +02:00
db: Querier;
storage_id: StorageindexId;
2025-08-04 17:45:44 +02:00
}) => {
2025-08-28 18:27:07 +02:00
return await db
.selectFrom("storageindex")
.selectAll()
.where("id", "=", storage_id)
.executeTakeFirst();
2025-08-04 17:45:44 +02:00
};
export const getUserStorageHandler = async ({
2025-08-28 18:27:07 +02:00
db,
userId,
2025-08-04 17:45:44 +02:00
}: {
2025-08-28 18:27:07 +02:00
db: Querier;
userId: UsersId;
2025-08-04 17:45:44 +02:00
}): Promise<Storageindex[]> => {
2025-08-28 18:27:07 +02:00
try {
return await db
.selectFrom("storageindex")
.selectAll("storageindex")
.rightJoin("users_storage", "users_storage.storageid", "storageindex.id")
.where("users_storage.userid", "=", userId)
.orderBy("created_at", "desc")
.execute();
} catch {
throw new TRPCError({
code: "INTERNAL_SERVER_ERROR",
message: "Error while getting user storage",
});
}
2025-08-04 17:45:44 +02:00
};
export const addUserStorageHandler = 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 addUserStorageJunc({
db,
userId,
storageId,
});
2025-08-04 17:45:44 +02:00
2025-08-28 18:27:07 +02:00
return "ok";
} 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 deleteUserStorageHandler = 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 {
const file = await db
.selectFrom("users_storage")
.selectAll()
.where("userid", "=", userId)
.where("storageid", "=", storageId)
.executeTakeFirst();
if (!file) {
return "no file";
}
2025-08-04 17:45:44 +02:00
2025-08-28 18:27:07 +02:00
await deleteFile({
db,
fileId: file.storageid,
cb: async (fileId) => {
await db.transaction().execute(async (trx) => {
await deleteUserStorageJunc({
db: trx,
userId,
storageId: fileId,
});
2025-08-04 17:45:44 +02:00
2025-08-28 18:27:07 +02:00
await trx
.deleteFrom("storageindex")
.where("id", "=", fileId)
.execute();
});
},
});
return "ok";
} catch {
throw new TRPCError({
code: "INTERNAL_SERVER_ERROR",
message: "Error while deleting user storage",
});
}
2025-08-04 17:45:44 +02:00
};
// export const deleteAllUserStorageHandler = async ({
// db,
// userId,
// }: {
// db: Querier;
// userId: UsersId;
// }) => {
// try {
// const files = await db
// .selectFrom("users_storage")
// .select("storageid")
// .where("userid", "=", userId)
// .execute();
// if (!files || files.length === 0) {
// return "no files";
// }
// await deleteFiles({
// db,
// refs: files,
// cb: async (fileIds) => {
// const ids = fileIds.map((file) => file.storageid);
// await db.transaction().execute(async (trx) => {
// await trx
// .deleteFrom("users_storage")
// .where("userid", "=", userId)
// .where("storageid", "in", ids)
// .execute();
// await trx.deleteFrom("storageindex").where("id", "in", ids).execute();
// });
// },
// });
// return "ok";
// } catch {
// throw new TRPCError({
// code: "INTERNAL_SERVER_ERROR",
// message: "Error while deleting user storage",
// });
// }
// };
export const getMultipleWithRelations = async ({
2025-08-28 18:27:07 +02:00
db,
ids,
2025-08-04 17:45:44 +02:00
}: {
2025-08-28 18:27:07 +02:00
db: Querier;
ids: StorageindexId[];
2025-08-04 17:45:44 +02:00
}) => {
2025-08-28 18:27:07 +02:00
return await db
.selectFrom("storageindex")
.selectAll("storageindex")
.select((eb) => [
jsonArrayFrom(
eb
.selectFrom("users_storage")
.leftJoin("users", "users.id", "users_storage.userid")
.select(["users.username"])
.whereRef("users_storage.storageid", "=", "storageindex.id")
.selectAll("users_storage"),
).as("users_storages"),
])
.where("id", "in", ids)
.execute();
2025-08-04 17:45:44 +02:00
};