pollo/app/api/internal/room/[roomId]/vote/route.ts

67 lines
1.5 KiB
TypeScript
Raw Normal View History

2023-09-24 23:49:24 -06:00
import { type NextRequest, NextResponse } from "next/server";
import { db } from "@/_lib/db";
import { votes } from "@/_lib/schema";
import { createId } from "@paralleldrive/cuid2";
import { publishToChannel } from "@/_lib/ably";
import { EventTypes } from "@/_utils/types";
import { getAuth } from "@clerk/nextjs/server";
export async function PUT(
request: Request,
{ params }: { params: { roomId: string } }
) {
const { userId } = getAuth(request as NextRequest);
if (!params.roomId) {
return new NextResponse("RoomId Missing!", {
status: 400,
statusText: "BAD REQUEST!",
});
}
const reqBody = (await request.json()) as { value: string };
const upsertResult = await db
.insert(votes)
.values({
id: `vote_${createId()}`,
2023-10-03 00:58:00 -06:00
created_at: Date.now().toString(),
2023-09-24 23:49:24 -06:00
value: reqBody.value,
userId: userId || "",
roomId: params.roomId,
})
.onConflictDoUpdate({
target: [votes.userId, votes.roomId],
set: {
2023-10-03 00:58:00 -06:00
created_at: Date.now().toString(),
2023-09-24 23:49:24 -06:00
value: reqBody.value,
userId: userId || "",
roomId: params.roomId,
},
});
2023-10-02 19:29:35 -06:00
const success = upsertResult.rowsAffected > 0;
2023-09-24 23:49:24 -06:00
if (success) {
await publishToChannel(
`${params.roomId}`,
EventTypes.VOTE_UPDATE,
reqBody.value
);
return NextResponse.json(upsertResult, {
status: 200,
statusText: "SUCCESS",
});
}
return NextResponse.json(
{ error: "Failed to set vote!" },
{
status: 500,
statusText: "ERROR",
}
);
}