dashboard CRUD operations done

This commit is contained in:
Atridad Lahiji 2023-11-21 18:08:19 -07:00
parent 57940b8000
commit 4c73ee78ce
No known key found for this signature in database
6 changed files with 103 additions and 41 deletions

View file

@ -0,0 +1,36 @@
import { getAuth } from "@clerk/remix/ssr.server";
import { ActionFunctionArgs, json } from "@remix-run/node";
import { createId } from "@paralleldrive/cuid2";
import { db } from "~/services/db";
import { emitter } from "~/services/emitter.server";
import { rooms } from "~/services/schema";
export async function action({ request, params, context }: ActionFunctionArgs) {
const { userId } = await getAuth({ context, params, request });
const data = await request.json();
const room = await db
.insert(rooms)
.values({
id: `room_${createId()}`,
created_at: Date.now().toString(),
userId: userId || "",
roomName: data.name,
storyName: "First Story!",
scale: "0.5,1,2,3,5,8",
visible: 0,
})
.returning();
const success = room.length > 0;
if (success) {
emitter.emit("roomlist");
return json(room, {
status: 200,
statusText: "SUCCESS",
});
}
}

View file

@ -0,0 +1,35 @@
import { getAuth } from "@clerk/remix/ssr.server";
import { ActionFunctionArgs, json } from "@remix-run/node";
import { eq } from "drizzle-orm";
import { db } from "~/services/db";
import { emitter } from "~/services/emitter.server";
import { rooms } from "~/services/schema";
export async function action({ request, params, context }: ActionFunctionArgs) {
const { userId } = await getAuth({ context, params, request });
const roomId = params.roomId;
if (!roomId) {
return json("RoomId Missing!", {
status: 400,
statusText: "BAD REQUEST!",
});
}
const deletedRoom = await db
.delete(rooms)
.where(eq(rooms.id, roomId))
.returning();
const success = deletedRoom.length > 0;
if (success) {
emitter.emit("roomlist");
return json(deletedRoom, {
status: 200,
statusText: "SUCCESS",
});
}
}

View file

@ -6,35 +6,26 @@ import { db } from "~/services/db";
import { emitter } from "~/services/emitter.server"; import { emitter } from "~/services/emitter.server";
import { rooms } from "~/services/schema"; import { rooms } from "~/services/schema";
// Get Room List
export async function loader({ context, params, request }: LoaderFunctionArgs) { export async function loader({ context, params, request }: LoaderFunctionArgs) {
const { userId } = await getAuth({ context, params, request }); const { userId } = await getAuth({ context, params, request });
const roomList = await db.query.rooms.findMany({
where: eq(rooms.userId, userId || ""),
});
console.log(roomList);
// return NextResponse.json(roomList, {
// status: 200,
// statusText: "SUCCESS",
// });
return eventStream(request.signal, function setup(send) { return eventStream(request.signal, function setup(send) {
function handler( async function handler() {
roomList: { const roomList = await db.query.rooms.findMany({
userId: string; where: eq(rooms.userId, userId || ""),
id: string; });
created_at: string | null;
roomName: string | null;
storyName: string | null;
visible: number;
scale: string;
}[]
) {
send({ event: "roomlist", data: JSON.stringify(roomList) }); send({ event: "roomlist", data: JSON.stringify(roomList) });
} }
send({ event: "roomlist", data: JSON.stringify(roomList) }); // Initial fetch
db.query.rooms
.findMany({
where: eq(rooms.userId, userId || ""),
})
.then((roomList) => {
send({ event: "roomlist", data: JSON.stringify(roomList) });
});
emitter.on("roomlist", handler); emitter.on("roomlist", handler);

View file

@ -35,16 +35,14 @@ type RoomsResponse =
| undefined; | undefined;
export default function Index() { export default function Index() {
const { user } = useUser(); let roomsFromDb = useEventSource("/api/room/get/all", { event: "roomlist" });
let roomsFromDb = useEventSource("/api/room", { event: "roomlist" });
let roomsFromDbParsed = JSON.parse(roomsFromDb!) as RoomsResponse; let roomsFromDbParsed = JSON.parse(roomsFromDb!) as RoomsResponse;
const [roomName, setRoomName] = useState<string>(""); const [roomName, setRoomName] = useState<string>("");
// const [roomsFromDb, setRoomsFromDb] = useState<RoomsResponse>(undefined);
const createRoomHandler = async () => { const createRoomHandler = async () => {
await fetch("/api/room", { await fetch("/api/room/create", {
cache: "no-cache", cache: "no-cache",
method: "POST", method: "POST",
body: JSON.stringify({ name: roomName }), body: JSON.stringify({ name: roomName }),
@ -56,26 +54,13 @@ export default function Index() {
false; false;
}; };
// const getRoomsHandler = async () => {
// const dbRoomsResponse = await fetch("/api/room", {
// cache: "no-cache",
// method: "GET",
// });
// const dbRooms = (await dbRoomsResponse.json()) as RoomsResponse;
// setRoomsFromDb(dbRooms);
// };
const deleteRoomHandler = async (roomId: string) => { const deleteRoomHandler = async (roomId: string) => {
await fetch(`/api/room/${roomId}`, { await fetch(`/api/room/delete/${roomId}`, {
cache: "no-cache", cache: "no-cache",
method: "DELETE", method: "DELETE",
}); });
}; };
// useEffect(() => {
// void getRoomsHandler();
// }, []);
return ( return (
<div className="flex flex-col items-center justify-center gap-8"> <div className="flex flex-col items-center justify-center gap-8">
{/* Modal for Adding Rooms */} {/* Modal for Adding Rooms */}
@ -163,7 +148,7 @@ export default function Index() {
New Room New Room
</label> </label>
{roomsFromDb === undefined && <LoadingIndicator />} {!roomsFromDbParsed && <LoadingIndicator />}
</div> </div>
); );
} }

View file

@ -13,6 +13,7 @@
"dependencies": { "dependencies": {
"@clerk/remix": "^3.1.5", "@clerk/remix": "^3.1.5",
"@libsql/client": "0.4.0-pre.2", "@libsql/client": "0.4.0-pre.2",
"@paralleldrive/cuid2": "^2.2.2",
"@remix-run/css-bundle": "^2.3.0", "@remix-run/css-bundle": "^2.3.0",
"@remix-run/node": "^2.3.0", "@remix-run/node": "^2.3.0",
"@remix-run/react": "^2.3.0", "@remix-run/react": "^2.3.0",

14
pnpm-lock.yaml generated
View file

@ -11,6 +11,9 @@ dependencies:
'@libsql/client': '@libsql/client':
specifier: 0.4.0-pre.2 specifier: 0.4.0-pre.2
version: 0.4.0-pre.2 version: 0.4.0-pre.2
'@paralleldrive/cuid2':
specifier: ^2.2.2
version: 2.2.2
'@remix-run/css-bundle': '@remix-run/css-bundle':
specifier: ^2.3.0 specifier: ^2.3.0
version: 2.3.0 version: 2.3.0
@ -1498,6 +1501,11 @@ packages:
eslint-scope: 5.1.1 eslint-scope: 5.1.1
dev: true dev: true
/@noble/hashes@1.3.2:
resolution: {integrity: sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==}
engines: {node: '>= 16'}
dev: false
/@nodelib/fs.scandir@2.1.5: /@nodelib/fs.scandir@2.1.5:
resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
engines: {node: '>= 8'} engines: {node: '>= 8'}
@ -1564,6 +1572,12 @@ packages:
which: 3.0.1 which: 3.0.1
dev: true dev: true
/@paralleldrive/cuid2@2.2.2:
resolution: {integrity: sha512-ZOBkgDwEdoYVlSeRbYYXs0S9MejQofiVYoTbKzy/6GQa39/q5tQU2IX46+shYnUkpEl3wc+J6wRlar7r2EK2xA==}
dependencies:
'@noble/hashes': 1.3.2
dev: false
/@peculiar/asn1-schema@2.3.8: /@peculiar/asn1-schema@2.3.8:
resolution: {integrity: sha512-ULB1XqHKx1WBU/tTFIA+uARuRoBVZ4pNdOA878RDrRbBfBGcSzi5HBkdScC6ZbHn8z7L8gmKCgPC1LHRrP46tA==} resolution: {integrity: sha512-ULB1XqHKx1WBU/tTFIA+uARuRoBVZ4pNdOA878RDrRbBfBGcSzi5HBkdScC6ZbHn8z7L8gmKCgPC1LHRrP46tA==}
dependencies: dependencies: