87 lines
2.2 KiB
TypeScript
87 lines
2.2 KiB
TypeScript
import { getAuth } from "@clerk/remix/ssr.server";
|
|
import { type ActionFunctionArgs, json } from "@remix-run/node";
|
|
import { createId } from "@paralleldrive/cuid2";
|
|
import { db } from "~/services/db.server";
|
|
import { emitter } from "~/services/emitter.server";
|
|
import { logs, rooms, votes } from "~/services/schema.server";
|
|
import { eq } from "drizzle-orm";
|
|
|
|
export async function action({ request, params, context }: ActionFunctionArgs) {
|
|
const { userId } = await getAuth({ context, params, request });
|
|
|
|
if (!userId) {
|
|
return json("Not Signed In!", {
|
|
status: 403,
|
|
statusText: "UNAUTHORIZED!",
|
|
});
|
|
}
|
|
|
|
const data = await request.json();
|
|
const roomId = params.roomId;
|
|
|
|
if (data.log) {
|
|
const oldRoom = await db.query.rooms.findFirst({
|
|
where: eq(rooms.id, params.roomId || ""),
|
|
with: {
|
|
votes: true,
|
|
logs: true,
|
|
},
|
|
});
|
|
|
|
oldRoom &&
|
|
(await db.insert(logs).values({
|
|
id: `log_${createId()}`,
|
|
created_at: Date.now().toString(),
|
|
userId: userId || "",
|
|
roomId: roomId || "",
|
|
scale: oldRoom.scale,
|
|
votes: JSON.stringify(
|
|
oldRoom.votes.map((vote) => {
|
|
return {
|
|
name: vote.userId,
|
|
value: vote.value,
|
|
};
|
|
})
|
|
),
|
|
roomName: oldRoom.roomName,
|
|
topicName: oldRoom.topicName,
|
|
}));
|
|
}
|
|
|
|
if (data.reset) {
|
|
await db.delete(votes).where(eq(votes.roomId, params.roomId || ""));
|
|
}
|
|
|
|
const newRoom = data.reset
|
|
? await db
|
|
.update(rooms)
|
|
.set({
|
|
topicName: data.name,
|
|
visible: data.visible,
|
|
scale: [...new Set(data.scale.split(","))]
|
|
.filter((item) => item !== "")
|
|
.toString(),
|
|
})
|
|
.where(eq(rooms.id, params.roomId || ""))
|
|
.returning()
|
|
: await db
|
|
.update(rooms)
|
|
.set({
|
|
visible: data.visible,
|
|
})
|
|
.where(eq(rooms.id, params.roomId || ""))
|
|
.returning();
|
|
|
|
const success = newRoom.length > 0;
|
|
|
|
if (success) {
|
|
console.log(success);
|
|
emitter.emit("nodes", "room");
|
|
emitter.emit("nodes", "votes");
|
|
|
|
return json(newRoom, {
|
|
status: 200,
|
|
statusText: "SUCCESS",
|
|
});
|
|
}
|
|
}
|