diff --git a/next-app/app/api/spaces/route.ts b/next-app/app/api/spaces/route.ts new file mode 100644 index 0000000..7726931 --- /dev/null +++ b/next-app/app/api/spaces/route.ts @@ -0,0 +1,168 @@ +import { NextRequest, NextResponse } from "next/server"; +import prisma from "@/lib/db"; +import { authOptions } from "@/lib/auth-options"; +import { getServerSession } from "next-auth"; + +export async function POST(req: NextRequest) { + try { + + const session = await getServerSession(authOptions); + + + if (!session?.user?.id) { + return NextResponse.json( + { success: false, message: "You must be logged in to create a space" }, + { status: 401 } + ); + } + + + const data = await req.json(); + + + if (!data.spaceName) { + return NextResponse.json( + { success: false, message: "Space name is required" }, + { status: 400 } + ); + } + + + const space = await prisma.space.create({ + data: { + name: data.spaceName, + hostId: session.user.id, + }, + }); + + + return NextResponse.json( + { success: true, message: "Space created successfully", space }, + { status: 201 } + ); + } catch (error: any) { + + if (error.message === "Unauthenticated Request") { + return NextResponse.json( + { success: false, message: "You must be logged in to create a space" }, + { status: 401 } + ); + } + + + return NextResponse.json( + { success: false, message: `An unexpected error occurred: ${error.message}` }, + { status: 500 } + ); + } +} + + + +export async function DELETE(req:NextRequest) { + try { + const spaceId = req.nextUrl.searchParams.get("spaceId"); + const session = await getServerSession(authOptions); + if (!session?.user?.id) { + return NextResponse.json( + { success: false, message: "You must be logged in to delete a space" }, + { status: 401 } + ); + } + + if(!spaceId){ + return NextResponse.json( + { success: false, message: "Space Id is required" }, + { status: 401 } + ); + } + console.log(spaceId) + const space = await prisma.space.findUnique({ + where: { id: spaceId }, + }); + + if (!space) { + return NextResponse.json( + { success: false, message: "Space not found" }, + { status: 404 } + ); + } + + + if (space.hostId !== session.user.id) { + return NextResponse.json( + { success: false, message: "You are not authorized to delete this space" }, + { status: 403 } + ); + } + + + await prisma.space.delete({ + where: { id: spaceId }, + }); + + + return NextResponse.json( + { success: true, message: "Space deleted successfully" }, + { status: 200 } + ); + } catch (error: any) { + + console.error("Error deleting space:", error); + return NextResponse.json( + { success: false, message: `Error deleting space: ${error.message}` }, + { status: 500 } + ); + } +} + +export async function GET(req:NextRequest) { + try { + const session = await getServerSession(authOptions); + if (!session?.user?.id) { + return NextResponse.json( + { success: false, message: "You must be logged in to retrieve space information" }, + { status: 401 } + ); + } + const spaceId = req.nextUrl.searchParams.get("spaceId"); + + // If spaceId exist return the hostId + if (spaceId) { + const space = await prisma.space.findUnique({ + where: { id: spaceId }, + select: { hostId: true }, + }); + + if (!space) { + return NextResponse.json( + { success: false, message: "Space not found" }, + { status: 404 } + ); + } + + return NextResponse.json( + { success: true, message: "Host ID retrieved successfully", hostId: space.hostId }, + { status: 200 } + ); + } + + // If no spaceId is provided, retrieve all spaces + const spaces=await prisma.space.findMany({ + where:{ + hostId:session.user.id + } + }) + return NextResponse.json( + { success: true, message: "Spaces retrieved successfully", spaces }, + { status: 200 }) + + } catch (error:any) { + console.error("Error retrieving space:", error); + return NextResponse.json( + { success: false, message: `Error retrieving space: ${error.message}` }, + { status: 500 } + ); + + } +} diff --git a/next-app/app/api/streams/empty-queue/route.ts b/next-app/app/api/streams/empty-queue/route.ts index 58372c5..a765563 100644 --- a/next-app/app/api/streams/empty-queue/route.ts +++ b/next-app/app/api/streams/empty-queue/route.ts @@ -1,9 +1,9 @@ import { authOptions } from "@/lib/auth-options"; import db from "@/lib/db"; import { getServerSession } from "next-auth"; -import { NextResponse } from "next/server"; +import { NextRequest, NextResponse } from "next/server"; -export async function POST() { +export async function POST(req:NextRequest) { const session = await getServerSession(authOptions); if (!session?.user) { @@ -17,12 +17,14 @@ export async function POST() { ); } const user = session.user; + const data = await req.json() try { await db.stream.updateMany({ where: { userId: user.id, played: false, + spaceId:data.spaceId }, data: { played: true, diff --git a/next-app/app/api/streams/next/route.ts b/next-app/app/api/streams/next/route.ts index 2346bf1..74f286f 100644 --- a/next-app/app/api/streams/next/route.ts +++ b/next-app/app/api/streams/next/route.ts @@ -1,9 +1,10 @@ import { authOptions } from "@/lib/auth-options"; import db from "@/lib/db"; +import { randomUUID } from "crypto"; import { getServerSession } from "next-auth"; -import { NextResponse } from "next/server"; +import { NextRequest, NextResponse } from "next/server"; -export async function GET() { +export async function GET(req: NextRequest) { const session = await getServerSession(authOptions); if (!session?.user.id) { @@ -17,11 +18,13 @@ export async function GET() { ); } const user = session.user; + const spaceId = req.nextUrl.searchParams.get("spaceId"); const mostUpvotedStream = await db.stream.findFirst({ where: { userId: user.id, played: false, + spaceId:spaceId }, orderBy: { upvotes: { @@ -33,15 +36,17 @@ export async function GET() { await Promise.all([ db.currentStream.upsert({ where: { - userId: user.id, + spaceId:spaceId as string }, update: { userId: user.id, streamId: mostUpvotedStream?.id, + spaceId:spaceId }, create: { userId: user.id, streamId: mostUpvotedStream?.id, + spaceId:spaceId }, }), db.stream.update({ diff --git a/next-app/app/api/streams/remove/route.ts b/next-app/app/api/streams/remove/route.ts index 62a60d8..35f6ea9 100644 --- a/next-app/app/api/streams/remove/route.ts +++ b/next-app/app/api/streams/remove/route.ts @@ -6,6 +6,7 @@ import { z } from "zod"; const RemoveStreamSchema = z.object({ streamId: z.string(), + spaceId:z.string() }); export async function DELETE(req: NextRequest) { @@ -26,6 +27,7 @@ export async function DELETE(req: NextRequest) { try { const { searchParams } = new URL(req.url); const streamId = searchParams.get("streamId"); + const spaceId = searchParams.get('spaceId') if (!streamId) { return NextResponse.json( @@ -42,6 +44,7 @@ export async function DELETE(req: NextRequest) { where: { id: streamId, userId: user.id, + spaceId:spaceId }, }); diff --git a/next-app/app/api/streams/route.ts b/next-app/app/api/streams/route.ts index 2140fe0..6914077 100644 --- a/next-app/app/api/streams/route.ts +++ b/next-app/app/api/streams/route.ts @@ -7,9 +7,11 @@ import { YT_REGEX } from "@/lib/utils"; import { getServerSession } from "next-auth"; import { authOptions } from "@/lib/auth-options"; + const CreateStreamSchema = z.object({ creatorId: z.string(), url: z.string(), + spaceId:z.string() }); const MAX_QUEUE_LEN = 20; @@ -137,7 +139,7 @@ export async function POST(req: NextRequest) { const existingActiveStreams = await db.stream.count({ where: { - userId: data.creatorId, + spaceId: data.spaceId, played: false, }, }); @@ -169,6 +171,7 @@ export async function POST(req: NextRequest) { bigImg: thumbnails[thumbnails.length - 1].url ?? "https://cdn.pixabay.com/photo/2024/02/28/07/42/european-shorthair-8601492_640.jpg", + spaceId:data.spaceId }, }); @@ -191,9 +194,8 @@ export async function POST(req: NextRequest) { } export async function GET(req: NextRequest) { - const creatorId = req.nextUrl.searchParams.get("creatorId"); + const spaceId = req.nextUrl.searchParams.get("spaceId"); const session = await getServerSession(authOptions); - if (!session?.user.id) { return NextResponse.json( { @@ -206,56 +208,69 @@ export async function GET(req: NextRequest) { } const user = session.user; - if (!creatorId) { - return NextResponse.json( - { - message: "Error", - }, - { - status: 411, - }, - ); - } + if (!spaceId) { + return NextResponse.json({ + message: "Error" + }, { + status: 411 + }) +} - const [streams, activeStream] = await Promise.all([ - db.stream.findMany({ + const [space, activeStream] = await Promise.all([ + db.space.findUnique({ where: { - userId: creatorId, - played: false, + id: spaceId, }, include: { - _count: { - select: { - upvotes: true, - }, - }, - upvotes: { - where: { - userId: user.id, + streams: { + include: { + _count: { + select: { + upvotes: true + } + }, + upvotes: { + where: { + userId: session?.user.id + } + } + + }, + where:{ + played:false + } }, - }, - }, - }), - db.currentStream.findFirst({ + _count: { + select: { + streams: true + } + }, + + } + + }), + db.currentStream.findFirst({ where: { - userId: creatorId, + spaceId: spaceId }, include: { - stream: true, - }, - }), + stream: true + } + }) ]); - const isCreator = user.id === creatorId; + const hostId =space?.hostId; + const isCreator = session.user.id=== hostId return NextResponse.json({ - streams: streams.map(({ _count, ...rest }) => ({ - ...rest, - upvotes: _count.upvotes, - haveUpvoted: rest.upvotes.length ? true : false, + streams: space?.streams.map(({_count, ...rest}) => ({ + ...rest, + upvotes: _count.upvotes, + haveUpvoted: rest.upvotes.length ? true : false })), activeStream, - creatorId, + hostId, isCreator, - }); + spaceName:space?.name +}); } diff --git a/next-app/app/api/streams/upvote/route.ts b/next-app/app/api/streams/upvote/route.ts index 1263515..e09aeeb 100644 --- a/next-app/app/api/streams/upvote/route.ts +++ b/next-app/app/api/streams/upvote/route.ts @@ -6,6 +6,7 @@ import { z } from "zod"; const UpvoteSchema = z.object({ streamId: z.string(), + spaceId:z.string() }); export async function POST(req: NextRequest) { diff --git a/next-app/app/dashboard/[spaceId]/page.tsx b/next-app/app/dashboard/[spaceId]/page.tsx new file mode 100644 index 0000000..973f999 --- /dev/null +++ b/next-app/app/dashboard/[spaceId]/page.tsx @@ -0,0 +1,113 @@ +"use client"; +import { useEffect, useState } from "react"; +import { useSocket } from "@/context/socket-context"; +import useRedirect from "@/hooks/useRedirect"; +import jwt from "jsonwebtoken"; +import OldStreamView from "@/components/OldStreamView"; +import StreamView from "@/components/StreamView"; +import { useSession } from "next-auth/react"; +import ErrorScreen from "@/components/ErrorScreen"; +import LoadingScreen from "@/components/LoadingScreen"; + + + +export default function Component({params:{spaceId}}:{params:{spaceId:string}}) { + + + // const { socket, user, loading, setUser, connectionError } = useSocket(); + + + const [creatorId,setCreatorId]=useState(""); + const [loading1, setLoading1] = useState(true); + const session = useSession(); + + + console.log(spaceId) + + useEffect(()=>{ + async function fetchHostId(){ + try { + const response = await fetch(`/api/spaces/?spaceId=${spaceId}`,{ + method:"GET" + }); + const data = await response.json() + if (!response.ok || !data.success) { + throw new Error(data.message || "Failed to retreive space's host id"); + } + setCreatorId(data.hostId) + + + } catch (error) { + + } + finally{ + setLoading1(false) + } + } + fetchHostId(); + },[spaceId]) + + + + // useEffect(() => { + // if (user && !user.token) { + // const token = jwt.sign( + // { + // creatorId: user?.id, + // userId: user?.id, + // }, + // process.env.NEXT_PUBLIC_SECRET || "", + // { + // expiresIn: "24h", + // } + // ); + + // socket?.send( + // JSON.stringify({ + // type: "join-room", + // data: { + // token, + // }, + // }) + // ); + // setUser({ ...user, token }); + // } + // }, [user]); + + // if (connectionError) { + // return Cannot connect to socket server; + // } + + // if (loading) { + // return ; + // } + + // if (!user) { + // return Please Log in....; + // } + if(loading1){ +return + } + + + if(session.data?.user.id!=creatorId){ + return You are not the creator of this space + } + + + + if (session.status === "loading") { + return
Loading...
; + } + + if (!session.data?.user.id) { + return

Please Log in....

; + } + + return ; + + // return ; + +} + +export const dynamic = "auto"; diff --git a/next-app/app/dashboard/page.tsx b/next-app/app/dashboard/page.tsx deleted file mode 100644 index 5b095c6..0000000 --- a/next-app/app/dashboard/page.tsx +++ /dev/null @@ -1,54 +0,0 @@ -"use client"; -import { useEffect } from "react"; -import { useSocket } from "@/context/socket-context"; -import useRedirect from "../../hooks/useRedirect"; -import jwt from "jsonwebtoken"; -import StreamView from "../../components/StreamView"; -import ErrorScreen from "@/components/ErrorScreen"; -import LoadingScreen from "@/components/LoadingScreen"; - -export default function Component() { - const { socket, user, loading, setUser, connectionError } = useSocket(); - useRedirect(); - - useEffect(() => { - if (user && !user.token) { - const token = jwt.sign( - { - creatorId: user?.id, - userId: user?.id, - }, - process.env.NEXT_PUBLIC_SECRET || "", - { - expiresIn: "24h", - } - ); - - socket?.send( - JSON.stringify({ - type: "join-room", - data: { - token, - }, - }) - ); - setUser({ ...user, token }); - } - }, [user]); - - if (connectionError) { - return Cannot connect to socket server; - } - - if (loading) { - return ; - } - - if (!user) { - return Please Log in....; - } - - return ; -} - -export const dynamic = "auto"; diff --git a/next-app/app/home/page.tsx b/next-app/app/home/page.tsx new file mode 100644 index 0000000..a98191f --- /dev/null +++ b/next-app/app/home/page.tsx @@ -0,0 +1,15 @@ +import HomeView from "@/components/HomeView"; +import { authOptions } from "@/lib/auth-options"; +import { getServerSession } from "next-auth"; + + + +export default async function Home(){ + const session =await getServerSession(authOptions); + + if (!session?.user.id) { + return

Please Log in....

; + } + return + +} \ No newline at end of file diff --git a/next-app/app/layout.tsx b/next-app/app/layout.tsx index 457b344..fda94fc 100644 --- a/next-app/app/layout.tsx +++ b/next-app/app/layout.tsx @@ -3,7 +3,19 @@ import { Inter } from "next/font/google"; import { Providers, ThemeProvider } from "../components/provider"; import "./globals.css"; +import { ToastContainer, toast, ToastContainerProps, Bounce } from 'react-toastify'; +import 'react-toastify/dist/ReactToastify.css'; +const globalToastOptions: ToastContainerProps = { + position: "top-right", + autoClose: 5000, + hideProgressBar: false, + closeOnClick: true, + pauseOnHover: true, + draggable: true, + theme: "light", + transition: Bounce, +}; const inter = Inter({ subsets: ["latin"] }); export const metadata: Metadata = { @@ -19,6 +31,7 @@ export default function RootLayout({ return ( + diff --git a/next-app/app/spaces/[spaceId]/page.tsx b/next-app/app/spaces/[spaceId]/page.tsx new file mode 100644 index 0000000..3a05937 --- /dev/null +++ b/next-app/app/spaces/[spaceId]/page.tsx @@ -0,0 +1,45 @@ +"use client" +import OldStreamView from "@/components/OldStreamView"; +import useRedirect from "@/hooks/useRedirect"; +import { authOptions } from "@/lib/auth-options"; +import { getServerSession } from "next-auth"; +import { useSession } from "next-auth/react"; +import { redirect } from "next/navigation"; +import { useRouter } from "next/navigation"; +import { useState, useEffect } from "react"; + +// Use this when using old stream view for spaces +export default function Creator({params:{spaceId}}:{params:{spaceId:string}}) { +const [creatorId,setCreatorId]=useState("invalid"); +const session = useSession(); +const router = useRouter(); + + +useEffect(()=>{ + + async function fetchHostId(){ + try { + const response = await fetch(`/api/spaces/?spaceId=${spaceId}`,{ + method:"GET" + }); + const data = await response.json() + if (!response.ok || !data.success) { + throw new Error(data.message || "Failed to retreive space's host id"); + } + setCreatorId(data.hostId) + + + } catch (error) { + + } + } + fetchHostId(); +},[spaceId]) + + if(session.data?.user.id==creatorId){ + router.push(`/dashboard/${spaceId}`) + } + return
+ +
+} \ No newline at end of file diff --git a/next-app/components/Appbar.tsx b/next-app/components/Appbar.tsx index e4f5fa7..14ae4dc 100644 --- a/next-app/components/Appbar.tsx +++ b/next-app/components/Appbar.tsx @@ -1,23 +1,27 @@ "use client"; import { signIn, signOut, useSession } from "next-auth/react"; import { Button } from "@/components/ui/button"; +import { useRouter } from "next/navigation"; import { ThemeSwitcher } from "./ThemeSwitcher"; export function Appbar({ showThemeSwitch = true }) { const session = useSession(); + const router= useRouter(); const isUserLoggedIn = session.data?.user; const buttonTitle = isUserLoggedIn ? "Logout" : "Login"; const handleButtonClick = () => { isUserLoggedIn ? signOut({ callbackUrl: "/" }) - : signIn("google", { callbackUrl: "/dashboard" }); + : signIn("google", { callbackUrl: "/home" });// Use /dashboard for web socket or new stream version }; return (
{ + router.push('/home') // If using oldstream view this goes to home where you can see all the spaces + }} className={`flex flex-col hover:cursor-pointer justify-center text-lg font-bold ${showThemeSwitch ? "" : "text-white"}`} > Muzer
diff --git a/next-app/components/HomeView.tsx b/next-app/components/HomeView.tsx new file mode 100644 index 0000000..8e64327 --- /dev/null +++ b/next-app/components/HomeView.tsx @@ -0,0 +1,212 @@ +"use client"; +import { Bounce, toast } from "react-toastify"; +import { Appbar } from "../components/Appbar"; +import { Card, CardHeader, CardContent } from "@/components/ui/card"; +import { Button } from "@/components/ui/button"; +import { + Dialog, + DialogContent, + DialogHeader, + DialogTitle, + DialogDescription, + DialogFooter, +} from "@/components/ui/dialog"; +import React, { useEffect, useState } from "react"; +import { useRouter } from "next/navigation"; +import CardSkeleton from "./ui/cardSkeleton"; + + +interface Space { + endTime?: Date | null; + hostId: string; + id: string; + isActive: boolean; + name: string; + startTime: Date | null; +} + +export default function HomeView() { + const [isCreateSpaceOpen, setIsCreateSpaceOpen] = useState(false); + const [spaceName, setSpaceName] = useState(""); + const [spaces, setSpaces] = useState(null); + const [loading, setIsLoading] = useState(false); + const router = useRouter(); + useEffect(() => { + const fetchSpaces = async () => { + setIsLoading(true); + try { + const response = await fetch('/api/spaces', { + method: 'GET', + }); + + const data = await response.json(); + + if (!response.ok || !data.success) { + throw new Error(data.message || "Failed to fetch spaces"); + } + const fetchedSpaces: Space[] = data.spaces; + setSpaces(fetchedSpaces); + + } catch (error) { + toast.error("Error fetching spaces"); + } + finally { + setIsLoading(false); + } + }; + fetchSpaces(); + }, []); + + const handleCreateSpace = async () => { + setIsCreateSpaceOpen(false); + try { + const response = await fetch(`/api/spaces`,{ + method:"POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ + spaceName:spaceName + }), + }) + const data = await response.json(); + + if (!response.ok || !data.success) { + throw new Error(data.message || "Failed to create space"); + } + const newSpace=data.space; + setSpaces((prev) => { + + const updatedSpaces: Space[] = prev ? [...prev, newSpace] : [newSpace]; + return updatedSpaces; + }); + toast.success(data.message); + + } catch (error:any) { + toast.error(error.message || "Error Creating Space"); + } + + }; + + const handleDeleteSpace=async(spaceId:string)=>{ + try { + const response = await fetch(`/api/spaces/?spaceId=${spaceId}`,{ + method:"DELETE", + }) + const data = await response.json(); + + if (!response.ok || !data.success) { + throw new Error(data.message || "Failed to delete space"); + } + setSpaces((prev) => { + + const updatedSpaces: Space[] = prev ? prev.filter(space => space.id !== spaceId) : []; + return updatedSpaces; + }); + toast.success(data.message); + } catch (error:any) { + toast.error(error.message || "Error Deleting Space"); + } + + } + + return ( +
+ +
+
Spaces
+ + +
+ {loading &&
} + {loading &&
} + + {!loading && + spaces && + spaces.map((space) => { + return ( + + +
{space.name}
+
+ + Card background +
+ + + +
+
+
+ ); + })} +
+
+ + + + + + Create new space + +
+ + ) => { + setSpaceName(e.target.value); + }} + /> +
+
+ + + + +
+
+
+ ); +} diff --git a/next-app/components/OldStreamView.tsx b/next-app/components/OldStreamView.tsx index 749834e..2e9912c 100644 --- a/next-app/components/OldStreamView.tsx +++ b/next-app/components/OldStreamView.tsx @@ -35,6 +35,7 @@ interface Video { userId: string; upvotes: number; haveUpvoted: boolean; + spaceId:string } interface CustomSession extends Omit { @@ -51,9 +52,11 @@ const REFRESH_INTERVAL_MS = 10 * 1000; export default function StreamView({ creatorId, playVideo = false, + spaceId }: { creatorId: string; playVideo: boolean; + spaceId:string; }) { const [inputLink, setInputLink] = useState(""); const [queue, setQueue] = useState([]); @@ -65,11 +68,12 @@ export default function StreamView({ const [creatorUserId, setCreatorUserId] = useState(null); const [isCreator, setIsCreator] = useState(false); const [isEmptyQueueDialogOpen, setIsEmptyQueueDialogOpen] = useState(false); + const [spaceName,setSpaceName]=useState("") const [isOpen, setIsOpen] = useState(false); async function refreshStreams() { try { - const res = await fetch(`/api/streams/?creatorId=${creatorId}`, { + const res = await fetch(`/api/streams/?spaceId=${spaceId}`, { credentials: "include", }); const json = await res.json(); @@ -93,6 +97,7 @@ export default function StreamView({ // Set the creator's ID setCreatorUserId(json.creatorUserId); setIsCreator(json.isCreator); + setSpaceName(json.spaceName) } catch (error) { console.error("Error refreshing streams:", error); setQueue([]); @@ -104,7 +109,7 @@ export default function StreamView({ refreshStreams(); const interval = setInterval(refreshStreams, REFRESH_INTERVAL_MS); return () => clearInterval(interval); - }, [creatorId]); + }, [spaceId]); useEffect(() => { if (!videoPlayerRef.current || !currentVideo) return; @@ -145,6 +150,7 @@ export default function StreamView({ body: JSON.stringify({ creatorId, url: inputLink, + spaceId:spaceId }), }); const data = await res.json(); @@ -184,6 +190,7 @@ export default function StreamView({ method: "POST", body: JSON.stringify({ streamId: id, + spaceId:spaceId }), }); }; @@ -192,7 +199,7 @@ export default function StreamView({ if (queue.length > 0) { try { setPlayNextLoader(true); - const data = await fetch("/api/streams/next", { + const data = await fetch(`/api/streams/next?spaceId=${spaceId}`, { method: "GET", }); const json = await data.json(); @@ -207,7 +214,7 @@ export default function StreamView({ }; const handleShare = (platform: 'whatsapp' | 'twitter' | 'instagram' | 'clipboard') => { - const shareableLink = `${window.location.hostname}/creator/${creatorId}` + const shareableLink = `${window.location.hostname}/spaces/${spaceId}` if (platform === 'clipboard') { navigator.clipboard.writeText(shareableLink).then(() => { @@ -265,6 +272,12 @@ export default function StreamView({ try { const res = await fetch("/api/streams/empty-queue", { method: "POST", + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + spaceId:spaceId + }) }); const data = await res.json(); if (res.ok) { @@ -282,7 +295,7 @@ export default function StreamView({ const removeSong = async (streamId: string) => { try { - const res = await fetch(`/api/streams/remove?streamId=${streamId}`, { + const res = await fetch(`/api/streams/remove?streamId=${streamId}&spaceId=${spaceId}`, { method: "DELETE", }); if (res.ok) { @@ -299,6 +312,9 @@ export default function StreamView({ return (
+
+ {spaceName} +
diff --git a/next-app/components/SignInComponent.tsx b/next-app/components/SignInComponent.tsx index 8053c12..44e12f6 100644 --- a/next-app/components/SignInComponent.tsx +++ b/next-app/components/SignInComponent.tsx @@ -29,7 +29,7 @@ const SignInComponent = () => { className="gap-2 font-semibold" variant="outline" onClick={async () => { - await signIn("google", { callbackUrl: "/dashboard" }); + await signIn("google", { callbackUrl: "/home" }); // use /dashboard for websocket }} > google diff --git a/next-app/components/ui/cardSkeleton.tsx b/next-app/components/ui/cardSkeleton.tsx new file mode 100644 index 0000000..2daa2ba --- /dev/null +++ b/next-app/components/ui/cardSkeleton.tsx @@ -0,0 +1,14 @@ +import { Skeleton } from "@/components/ui/skeleton" +import React from "react"; + +export default function CardSkeleton() { + return ( +
+ +
+ + +
+
+ ); +} diff --git a/next-app/components/ui/progress.tsx b/next-app/components/ui/progress.tsx new file mode 100644 index 0000000..5c87ea4 --- /dev/null +++ b/next-app/components/ui/progress.tsx @@ -0,0 +1,28 @@ +"use client" + +import * as React from "react" +import * as ProgressPrimitive from "@radix-ui/react-progress" + +import { cn } from "@/lib/utils" + +const Progress = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, value, ...props }, ref) => ( + + + +)) +Progress.displayName = ProgressPrimitive.Root.displayName + +export { Progress } diff --git a/next-app/components/ui/skeleton.tsx b/next-app/components/ui/skeleton.tsx new file mode 100644 index 0000000..01b8b6d --- /dev/null +++ b/next-app/components/ui/skeleton.tsx @@ -0,0 +1,15 @@ +import { cn } from "@/lib/utils" + +function Skeleton({ + className, + ...props +}: React.HTMLAttributes) { + return ( +
+ ) +} + +export { Skeleton } diff --git a/next-app/hooks/useRedirect.ts b/next-app/hooks/useRedirect.ts index 6a803df..3d57662 100644 --- a/next-app/hooks/useRedirect.ts +++ b/next-app/hooks/useRedirect.ts @@ -10,8 +10,11 @@ export default function useRedirect() { useEffect(() => { if (session.status === "unauthenticated") { router.push("/"); - } else if (!pathname.includes("creator")) { - router.push("/dashboard"); - } + }// else if (!pathname.includes("creator")) { + // router.push("/dashboard"); // If using websocket with StreamView + // } + // } else if (!pathname.includes("creator")) { + // router.push("/home"); // If using spaces with old stream view to go to home where all the spaces are + // } }, [session]); } diff --git a/next-app/package.json b/next-app/package.json index b0c4630..87217a7 100644 --- a/next-app/package.json +++ b/next-app/package.json @@ -29,7 +29,7 @@ "next-auth": "^4.24.7", "next-themes": "^0.3.0", "prisma": "^5.19.0", - "react": "^18", + "react": "^18.3.1", "react-dom": "^18", "react-lite-youtube-embed": "^2.4.0", "react-toastify": "^10.0.5", diff --git a/next-app/pnpm-lock.yaml b/next-app/pnpm-lock.yaml index 7e67826..08ea19c 100644 --- a/next-app/pnpm-lock.yaml +++ b/next-app/pnpm-lock.yaml @@ -14,6 +14,12 @@ importers: '@radix-ui/react-dialog': specifier: ^1.1.1 version: 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-dropdown-menu': + specifier: ^2.1.1 + version: 2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-progress': + specifier: ^1.1.0 + version: 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-slot': specifier: ^1.1.0 version: 1.1.0(@types/react@18.3.5)(react@18.3.1) @@ -45,7 +51,7 @@ importers: specifier: ^5.19.0 version: 5.19.1 react: - specifier: ^18 + specifier: ^18.3.1 version: 18.3.1 react-dom: specifier: ^18 @@ -137,6 +143,21 @@ packages: resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@floating-ui/core@1.6.7': + resolution: {integrity: sha512-yDzVT/Lm101nQ5TCVeK65LtdN7Tj4Qpr9RTXJ2vPFLqtLxwOrpoxAHAJI8J3yYWUc40J0BDBheaitK5SJmno2g==} + + '@floating-ui/dom@1.6.10': + resolution: {integrity: sha512-fskgCFv8J8OamCmyun8MfjB1Olfn+uZKjOKZ0vhYF3gRmEUXcGOjxWL8bBr7i4kIuPZ2KD2S3EUIOxnjC8kl2A==} + + '@floating-ui/react-dom@2.1.1': + resolution: {integrity: sha512-4h84MJt3CHrtG18mGsXuLCHMrug49d7DFkU0RMIyshRveBeyV2hmV/pDaF2Uxtu8kgq5r46llp5E5FQiR0K2Yg==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@floating-ui/utils@0.2.7': + resolution: {integrity: sha512-X8R8Oj771YRl/w+c1HqAC1szL8zWQRwFvgDwT129k9ACdBoud/+/rX9V0qiMl6LWUdP9voC2nDVZYPMQQsb6eA==} + '@humanwhocodes/config-array@0.11.14': resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} engines: {node: '>=10.10.0'} @@ -282,6 +303,32 @@ packages: '@radix-ui/primitive@1.1.0': resolution: {integrity: sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==} + '@radix-ui/react-arrow@1.1.0': + resolution: {integrity: sha512-FmlW1rCg7hBpEBwFbjHwCW6AmWLQM6g/v0Sn8XbP9NvmSZ2San1FpQeyPtufzOMSIx7Y4dzjlHoifhp+7NkZhw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-collection@1.1.0': + resolution: {integrity: sha512-GZsZslMJEyo1VKm5L1ZJY8tGDxZNPAoUeQUIbKeJfoi7Q4kmig5AsgLMYYuyYbfjd8fBmFORAIwYAkXMnXZgZw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-compose-refs@1.1.0': resolution: {integrity: sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==} peerDependencies: @@ -313,6 +360,15 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-direction@1.1.0': + resolution: {integrity: sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-dismissable-layer@1.1.0': resolution: {integrity: sha512-/UovfmmXGptwGcBQawLzvn2jOfM0t4z3/uKffoBlj724+n3FvBbZ7M0aaBOmkp6pqFYpO4yx8tSVJjx3Fl2jig==} peerDependencies: @@ -326,6 +382,19 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-dropdown-menu@2.1.1': + resolution: {integrity: sha512-y8E+x9fBq9qvteD2Zwa4397pUVhYsh9iq44b5RD5qu1GMJWBCBuVg1hMyItbc6+zH00TxGRqd9Iot4wzf3OoBQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-focus-guards@1.1.0': resolution: {integrity: sha512-w6XZNUPVv6xCpZUqb/yN9DL6auvpGX3C/ee6Hdi16v2UUy25HV2Q5bcflsiDyT/g5RwbPQ/GIT1vLkeRb+ITBw==} peerDependencies: @@ -357,6 +426,32 @@ packages: '@types/react': optional: true + '@radix-ui/react-menu@2.1.1': + resolution: {integrity: sha512-oa3mXRRVjHi6DZu/ghuzdylyjaMXLymx83irM7hTxutQbD+7IhPKdMdRHD26Rm+kHRrWcrUkkRPv5pd47a2xFQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-popper@1.2.0': + resolution: {integrity: sha512-ZnRMshKF43aBxVWPWvbj21+7TQCvhuULWJ4gNIKYpRlQt5xGRhLx66tMp8pya2UkGHTSlhpXwmjqltDYHhw7Vg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-portal@1.1.1': resolution: {integrity: sha512-A3UtLk85UtqhzFqtoC8Q0KvR2GbXF3mtPgACSazajqq6A41mEQgo53iPzY4i6BwDxlIFqWIhiQ2G729n+2aw/g==} peerDependencies: @@ -396,6 +491,32 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-progress@1.1.0': + resolution: {integrity: sha512-aSzvnYpP725CROcxAOEBVZZSIQVQdHgBr2QQFKySsaD14u8dNT0batuXI+AAGDdAHfXH8rbnHmjYFqVJ21KkRg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-roving-focus@1.1.0': + resolution: {integrity: sha512-EA6AMGeq9AEeQDeSH0aZgG198qkfHSbvWTf1HvoDmOB5bBG/qTxjYMWUKMnYiV6J/iP/J8MEFSuB2zRU2n7ODA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-slot@1.1.0': resolution: {integrity: sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==} peerDependencies: @@ -441,6 +562,27 @@ packages: '@types/react': optional: true + '@radix-ui/react-use-rect@1.1.0': + resolution: {integrity: sha512-0Fmkebhr6PiseyZlYAOtLS+nb7jLmpqTrJyv61Pe68MKYW6OWdRE2kI70TaYY27u7H0lajqM3hSMMLFq18Z7nQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-size@1.1.0': + resolution: {integrity: sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/rect@1.1.0': + resolution: {integrity: sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg==} + '@rtsao/scc@1.1.0': resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} @@ -2153,6 +2295,23 @@ snapshots: '@eslint/js@8.57.0': {} + '@floating-ui/core@1.6.7': + dependencies: + '@floating-ui/utils': 0.2.7 + + '@floating-ui/dom@1.6.10': + dependencies: + '@floating-ui/core': 1.6.7 + '@floating-ui/utils': 0.2.7 + + '@floating-ui/react-dom@2.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@floating-ui/dom': 1.6.10 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@floating-ui/utils@0.2.7': {} + '@humanwhocodes/config-array@0.11.14': dependencies: '@humanwhocodes/object-schema': 2.0.3 @@ -2270,6 +2429,27 @@ snapshots: '@radix-ui/primitive@1.1.0': {} + '@radix-ui/react-arrow@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.5 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-collection@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.1.0(@types/react@18.3.5)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.5 + '@types/react-dom': 18.3.0 + '@radix-ui/react-compose-refs@1.1.0(@types/react@18.3.5)(react@18.3.1)': dependencies: react: 18.3.1 @@ -2304,6 +2484,12 @@ snapshots: '@types/react': 18.3.5 '@types/react-dom': 18.3.0 + '@radix-ui/react-direction@1.1.0(@types/react@18.3.5)(react@18.3.1)': + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.5 + '@radix-ui/react-dismissable-layer@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.0 @@ -2317,6 +2503,21 @@ snapshots: '@types/react': 18.3.5 '@types/react-dom': 18.3.0 + '@radix-ui/react-dropdown-menu@2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-menu': 2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.5)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.5 + '@types/react-dom': 18.3.0 + '@radix-ui/react-focus-guards@1.1.0(@types/react@18.3.5)(react@18.3.1)': dependencies: react: 18.3.1 @@ -2341,6 +2542,50 @@ snapshots: optionalDependencies: '@types/react': 18.3.5 + '@radix-ui/react-menu@2.1.1(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-focus-guards': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-roving-focus': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.5)(react@18.3.1) + aria-hidden: 1.2.4 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-remove-scroll: 2.5.7(@types/react@18.3.5)(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.5 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-popper@1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@floating-ui/react-dom': 2.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-arrow': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-use-rect': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/rect': 1.1.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.5 + '@types/react-dom': 18.3.0 + '@radix-ui/react-portal@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -2370,6 +2615,33 @@ snapshots: '@types/react': 18.3.5 '@types/react-dom': 18.3.0 + '@radix-ui/react-progress@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-context': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.5 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-roving-focus@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.0 + '@radix-ui/react-collection': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-context': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.5)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.5)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.5 + '@types/react-dom': 18.3.0 + '@radix-ui/react-slot@1.1.0(@types/react@18.3.5)(react@18.3.1)': dependencies: '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.5)(react@18.3.1) @@ -2403,6 +2675,22 @@ snapshots: optionalDependencies: '@types/react': 18.3.5 + '@radix-ui/react-use-rect@1.1.0(@types/react@18.3.5)(react@18.3.1)': + dependencies: + '@radix-ui/rect': 1.1.0 + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.5 + + '@radix-ui/react-use-size@1.1.0(@types/react@18.3.5)(react@18.3.1)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.5)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.5 + + '@radix-ui/rect@1.1.0': {} + '@rtsao/scc@1.1.0': {} '@rushstack/eslint-patch@1.10.4': {} @@ -2916,7 +3204,7 @@ snapshots: eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0(eslint@8.57.0))(eslint@8.57.0) - eslint-plugin-import: 2.30.0(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.0) + eslint-plugin-import: 2.30.0(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) eslint-plugin-jsx-a11y: 6.10.0(eslint@8.57.0) eslint-plugin-react: 7.35.2(eslint@8.57.0) eslint-plugin-react-hooks: 4.6.2(eslint@8.57.0) @@ -2947,7 +3235,7 @@ snapshots: is-bun-module: 1.2.1 is-glob: 4.0.3 optionalDependencies: - eslint-plugin-import: 2.30.0(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.0) + eslint-plugin-import: 2.30.0(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) transitivePeerDependencies: - '@typescript-eslint/parser' - eslint-import-resolver-node @@ -2965,7 +3253,7 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-import@2.30.0(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.0): + eslint-plugin-import@2.30.0(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.8 @@ -4295,4 +4583,4 @@ snapshots: transitivePeerDependencies: - debug - zod@3.23.8: {} \ No newline at end of file + zod@3.23.8: {} diff --git a/next-app/prisma/migrations/20240914062749_added_spaces/migration.sql b/next-app/prisma/migrations/20240914062749_added_spaces/migration.sql new file mode 100644 index 0000000..af06cd2 --- /dev/null +++ b/next-app/prisma/migrations/20240914062749_added_spaces/migration.sql @@ -0,0 +1,38 @@ +/* + Warnings: + + - The primary key for the `CurrentStream` table will be changed. If it partially fails, the table could be left without primary key constraint. + - A unique constraint covering the columns `[spaceId]` on the table `CurrentStream` will be added. If there are existing duplicate values, this will fail. + - The required column `id` was added to the `CurrentStream` table with a prisma-level default value. This is not possible if the table is not empty. Please add this column as optional, then populate it before making it required. + +*/ +-- AlterTable +ALTER TABLE "CurrentStream" DROP CONSTRAINT "CurrentStream_pkey", +ADD COLUMN "id" UUID DEFAULT gen_random_uuid(), +ADD COLUMN "spaceId" TEXT, +ADD CONSTRAINT "CurrentStream_pkey" PRIMARY KEY ("id"); + +-- AlterTable +ALTER TABLE "Stream" ADD COLUMN "spaceId" TEXT; + +-- CreateTable +CREATE TABLE "Space" ( + "id" TEXT NOT NULL, + "name" TEXT NOT NULL, + "hostId" TEXT NOT NULL, + "isActive" BOOLEAN NOT NULL DEFAULT true, + + CONSTRAINT "Space_pkey" PRIMARY KEY ("id") +); + +-- CreateIndex +CREATE UNIQUE INDEX "CurrentStream_spaceId_key" ON "CurrentStream"("spaceId"); + +-- AddForeignKey +ALTER TABLE "Stream" ADD CONSTRAINT "Stream_spaceId_fkey" FOREIGN KEY ("spaceId") REFERENCES "Space"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "CurrentStream" ADD CONSTRAINT "CurrentStream_spaceId_fkey" FOREIGN KEY ("spaceId") REFERENCES "Space"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Space" ADD CONSTRAINT "Space_hostId_fkey" FOREIGN KEY ("hostId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/next-app/prisma/migrations/20240914070128_on_delete_cascade_for_spaces/migration.sql b/next-app/prisma/migrations/20240914070128_on_delete_cascade_for_spaces/migration.sql new file mode 100644 index 0000000..221f978 --- /dev/null +++ b/next-app/prisma/migrations/20240914070128_on_delete_cascade_for_spaces/migration.sql @@ -0,0 +1,23 @@ +/* + Warnings: + + - The primary key for the `CurrentStream` table will be changed. If it partially fails, the table could be left without primary key constraint. + +*/ +-- DropForeignKey +ALTER TABLE "CurrentStream" DROP CONSTRAINT "CurrentStream_spaceId_fkey"; + +-- DropForeignKey +ALTER TABLE "Stream" DROP CONSTRAINT "Stream_spaceId_fkey"; + +-- AlterTable +ALTER TABLE "CurrentStream" DROP CONSTRAINT "CurrentStream_pkey", +ALTER COLUMN "id" DROP DEFAULT, +ALTER COLUMN "id" SET DATA TYPE TEXT, +ADD CONSTRAINT "CurrentStream_pkey" PRIMARY KEY ("id"); + +-- AddForeignKey +ALTER TABLE "Stream" ADD CONSTRAINT "Stream_spaceId_fkey" FOREIGN KEY ("spaceId") REFERENCES "Space"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "CurrentStream" ADD CONSTRAINT "CurrentStream_spaceId_fkey" FOREIGN KEY ("spaceId") REFERENCES "Space"("id") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/next-app/prisma/schema.prisma b/next-app/prisma/schema.prisma index fa7dbda..1ef1b78 100644 --- a/next-app/prisma/schema.prisma +++ b/next-app/prisma/schema.prisma @@ -20,6 +20,7 @@ model User { streams Stream[] @relation("user") upvotes Upvote[] addedStreams Stream[] @relation("addedBy") + hostedSpaces Space[] @relation("hostedBy") } model Stream { @@ -40,12 +41,17 @@ model Stream { currentStream CurrentStream? addedBy String addedByUser User @relation("addedBy", fields: [addedBy], references: [id]) + spaceId String? + space Space? @relation("spaceStreams", fields: [spaceId], references: [id],onDelete: Cascade) } model CurrentStream { - userId String @id + id String @id @default(uuid()) + userId String streamId String? @unique stream Stream? @relation(fields: [streamId], references: [id]) + spaceId String? @unique + space Space? @relation(fields: [spaceId], references: [id],onDelete: Cascade) } model Upvote { @@ -57,7 +63,15 @@ model Upvote { @@unique([userId, streamId]) } - +model Space { + id String @id @default(uuid()) + name String + streams Stream[] @relation("spaceStreams") + hostId String + host User @relation("hostedBy", fields: [hostId], references: [id]) + isActive Boolean @default(true) + currentStream CurrentStream? +} enum StreamType { Spotify Youtube diff --git a/next-app/tailwind.config.ts b/next-app/tailwind.config.ts index 41668a3..aa1ed4b 100644 --- a/next-app/tailwind.config.ts +++ b/next-app/tailwind.config.ts @@ -1,5 +1,6 @@ import type { Config } from "tailwindcss"; + const config = { darkMode: ["class"], content: [ diff --git a/ws/pnpm-lock.yaml b/ws/pnpm-lock.yaml deleted file mode 100644 index 853ac31..0000000 --- a/ws/pnpm-lock.yaml +++ /dev/null @@ -1,1037 +0,0 @@ -lockfileVersion: '9.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -importers: - - .: - dependencies: - '@prisma/client': - specifier: ^5.19.1 - version: 5.19.1(prisma@5.19.1) - axios: - specifier: ^1.7.7 - version: 1.7.7 - bufferutil: - specifier: ^4.0.1 - version: 4.0.8 - bullmq: - specifier: ^5.12.14 - version: 5.12.15 - cors: - specifier: ^2.8.5 - version: 2.8.5 - dotenv: - specifier: ^16.4.5 - version: 16.4.5 - jsonwebtoken: - specifier: ^8.5.1 - version: 8.5.1 - prisma: - specifier: ^5.19.1 - version: 5.19.1 - redis: - specifier: ^4.7.0 - version: 4.7.0 - utf-8-validate: - specifier: ^5.0.2 - version: 5.0.10 - ws: - specifier: ^8.18.0 - version: 8.18.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) - youtube-search-api: - specifier: ^1.2.2 - version: 1.2.2 - devDependencies: - '@types/jsonwebtoken': - specifier: ^9.0.6 - version: 9.0.6 - '@types/ws': - specifier: ^8.5.12 - version: 8.5.12 - nodemon: - specifier: ^3.1.4 - version: 3.1.4 - ts-node: - specifier: ^10.9.2 - version: 10.9.2(@types/node@22.5.4)(typescript@5.6.2) - typescript: - specifier: ^5.6.2 - version: 5.6.2 - -packages: - - '@cspotcode/source-map-support@0.8.1': - resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} - engines: {node: '>=12'} - - '@ioredis/commands@1.2.0': - resolution: {integrity: sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==} - - '@jridgewell/resolve-uri@3.1.2': - resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} - engines: {node: '>=6.0.0'} - - '@jridgewell/sourcemap-codec@1.5.0': - resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} - - '@jridgewell/trace-mapping@0.3.9': - resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} - - '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.3': - resolution: {integrity: sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw==} - cpu: [arm64] - os: [darwin] - - '@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.3': - resolution: {integrity: sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw==} - cpu: [x64] - os: [darwin] - - '@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.3': - resolution: {integrity: sha512-YxQL+ax0XqBJDZiKimS2XQaf+2wDGVa1enVRGzEvLLVFeqa5kx2bWbtcSXgsxjQB7nRqqIGFIcLteF/sHeVtQg==} - cpu: [arm64] - os: [linux] - - '@msgpackr-extract/msgpackr-extract-linux-arm@3.0.3': - resolution: {integrity: sha512-fg0uy/dG/nZEXfYilKoRe7yALaNmHoYeIoJuJ7KJ+YyU2bvY8vPv27f7UKhGRpY6euFYqEVhxCFZgAUNQBM3nw==} - cpu: [arm] - os: [linux] - - '@msgpackr-extract/msgpackr-extract-linux-x64@3.0.3': - resolution: {integrity: sha512-cvwNfbP07pKUfq1uH+S6KJ7dT9K8WOE4ZiAcsrSes+UY55E/0jLYc+vq+DO7jlmqRb5zAggExKm0H7O/CBaesg==} - cpu: [x64] - os: [linux] - - '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.3': - resolution: {integrity: sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ==} - cpu: [x64] - os: [win32] - - '@prisma/client@5.19.1': - resolution: {integrity: sha512-x30GFguInsgt+4z5I4WbkZP2CGpotJMUXy+Gl/aaUjHn2o1DnLYNTA+q9XdYmAQZM8fIIkvUiA2NpgosM3fneg==} - engines: {node: '>=16.13'} - peerDependencies: - prisma: '*' - peerDependenciesMeta: - prisma: - optional: true - - '@prisma/debug@5.19.1': - resolution: {integrity: sha512-lAG6A6QnG2AskAukIEucYJZxxcSqKsMK74ZFVfCTOM/7UiyJQi48v6TQ47d6qKG3LbMslqOvnTX25dj/qvclGg==} - - '@prisma/engines-version@5.19.1-2.69d742ee20b815d88e17e54db4a2a7a3b30324e3': - resolution: {integrity: sha512-xR6rt+z5LnNqTP5BBc+8+ySgf4WNMimOKXRn6xfNRDSpHvbOEmd7+qAOmzCrddEc4Cp8nFC0txU14dstjH7FXA==} - - '@prisma/engines@5.19.1': - resolution: {integrity: sha512-kR/PoxZDrfUmbbXqqb8SlBBgCjvGaJYMCOe189PEYzq9rKqitQ2fvT/VJ8PDSe8tTNxhc2KzsCfCAL+Iwm/7Cg==} - - '@prisma/fetch-engine@5.19.1': - resolution: {integrity: sha512-pCq74rtlOVJfn4pLmdJj+eI4P7w2dugOnnTXpRilP/6n5b2aZiA4ulJlE0ddCbTPkfHmOL9BfaRgA8o+1rfdHw==} - - '@prisma/get-platform@5.19.1': - resolution: {integrity: sha512-sCeoJ+7yt0UjnR+AXZL7vXlg5eNxaFOwC23h0KvW1YIXUoa7+W2ZcAUhoEQBmJTW4GrFqCuZ8YSP0mkDa4k3Zg==} - - '@redis/bloom@1.2.0': - resolution: {integrity: sha512-HG2DFjYKbpNmVXsa0keLHp/3leGJz1mjh09f2RLGGLQZzSHpkmZWuwJbAvo3QcRY8p80m5+ZdXZdYOSBLlp7Cg==} - peerDependencies: - '@redis/client': ^1.0.0 - - '@redis/client@1.6.0': - resolution: {integrity: sha512-aR0uffYI700OEEH4gYnitAnv3vzVGXCFvYfdpu/CJKvk4pHfLPEy/JSZyrpQ+15WhXe1yJRXLtfQ84s4mEXnPg==} - engines: {node: '>=14'} - - '@redis/graph@1.1.1': - resolution: {integrity: sha512-FEMTcTHZozZciLRl6GiiIB4zGm5z5F3F6a6FZCyrfxdKOhFlGkiAqlexWMBzCi4DcRoyiOsuLfW+cjlGWyExOw==} - peerDependencies: - '@redis/client': ^1.0.0 - - '@redis/json@1.0.7': - resolution: {integrity: sha512-6UyXfjVaTBTJtKNG4/9Z8PSpKE6XgSyEb8iwaqDcy+uKrd/DGYHTWkUdnQDyzm727V7p21WUMhsqz5oy65kPcQ==} - peerDependencies: - '@redis/client': ^1.0.0 - - '@redis/search@1.2.0': - resolution: {integrity: sha512-tYoDBbtqOVigEDMAcTGsRlMycIIjwMCgD8eR2t0NANeQmgK/lvxNAvYyb6bZDD4frHRhIHkJu2TBRvB0ERkOmw==} - peerDependencies: - '@redis/client': ^1.0.0 - - '@redis/time-series@1.1.0': - resolution: {integrity: sha512-c1Q99M5ljsIuc4YdaCwfUEXsofakb9c8+Zse2qxTadu8TalLXuAESzLvFAvNVbkmSlvlzIQOLpBCmWI9wTOt+g==} - peerDependencies: - '@redis/client': ^1.0.0 - - '@tsconfig/node10@1.0.11': - resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} - - '@tsconfig/node12@1.0.11': - resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} - - '@tsconfig/node14@1.0.3': - resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} - - '@tsconfig/node16@1.0.4': - resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} - - '@types/jsonwebtoken@9.0.6': - resolution: {integrity: sha512-/5hndP5dCjloafCXns6SZyESp3Ldq7YjH3zwzwczYnjxIT0Fqzk5ROSYVGfFyczIue7IUEj8hkvLbPoLQ18vQw==} - - '@types/node@22.5.4': - resolution: {integrity: sha512-FDuKUJQm/ju9fT/SeX/6+gBzoPzlVCzfzmGkwKvRHQVxi4BntVbyIwf6a4Xn62mrvndLiml6z/UBXIdEVjQLXg==} - - '@types/ws@8.5.12': - resolution: {integrity: sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ==} - - acorn-walk@8.3.4: - resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} - engines: {node: '>=0.4.0'} - - acorn@8.12.1: - resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} - engines: {node: '>=0.4.0'} - hasBin: true - - anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - - arg@4.1.3: - resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} - - asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - - axios@0.21.4: - resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==} - - axios@1.7.7: - resolution: {integrity: sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==} - - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} - engines: {node: '>=8'} - - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - - braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} - - buffer-equal-constant-time@1.0.1: - resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} - - bufferutil@4.0.8: - resolution: {integrity: sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==} - engines: {node: '>=6.14.2'} - - bullmq@5.12.15: - resolution: {integrity: sha512-hUSLsHHLWeHmg/qN6t6ncR/JxCEULySEAEijspy3m1Tr+zW+RQuK215nEho+rjGeob1Ow+2XDvlI81MDotfX4g==} - - chokidar@3.6.0: - resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} - engines: {node: '>= 8.10.0'} - - cluster-key-slot@1.1.2: - resolution: {integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==} - engines: {node: '>=0.10.0'} - - combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} - - concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - - cors@2.8.5: - resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} - engines: {node: '>= 0.10'} - - create-require@1.1.1: - resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} - - cron-parser@4.9.0: - resolution: {integrity: sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q==} - engines: {node: '>=12.0.0'} - - debug@4.3.7: - resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} - - denque@2.1.0: - resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} - engines: {node: '>=0.10'} - - detect-libc@2.0.3: - resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} - engines: {node: '>=8'} - - diff@4.0.2: - resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} - engines: {node: '>=0.3.1'} - - dotenv@16.4.5: - resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} - engines: {node: '>=12'} - - ecdsa-sig-formatter@1.0.11: - resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} - - fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} - - follow-redirects@1.15.9: - resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true - - form-data@4.0.0: - resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} - engines: {node: '>= 6'} - - fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - - generic-pool@3.9.0: - resolution: {integrity: sha512-hymDOu5B53XvN4QT9dBmZxPX4CWhBPPLguTZ9MMFeFa/Kg0xWVfylOVNlJji/E7yTZWFd/q9GO5TxDLq156D7g==} - engines: {node: '>= 4'} - - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - - has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} - - ignore-by-default@1.0.1: - resolution: {integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==} - - ioredis@5.4.1: - resolution: {integrity: sha512-2YZsvl7jopIa1gaePkeMtd9rAcSjOOjPtpcLlOeusyO+XH2SK5ZcT+UCrElPP+WVIInh2TzeI4XW9ENaSLVVHA==} - engines: {node: '>=12.22.0'} - - is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - jsonwebtoken@8.5.1: - resolution: {integrity: sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==} - engines: {node: '>=4', npm: '>=1.4.28'} - - jwa@1.4.1: - resolution: {integrity: sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==} - - jws@3.2.2: - resolution: {integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==} - - lodash.defaults@4.2.0: - resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} - - lodash.includes@4.3.0: - resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==} - - lodash.isarguments@3.1.0: - resolution: {integrity: sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==} - - lodash.isboolean@3.0.3: - resolution: {integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==} - - lodash.isinteger@4.0.4: - resolution: {integrity: sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==} - - lodash.isnumber@3.0.3: - resolution: {integrity: sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==} - - lodash.isplainobject@4.0.6: - resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} - - lodash.isstring@4.0.1: - resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==} - - lodash.once@4.1.1: - resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} - - luxon@3.5.0: - resolution: {integrity: sha512-rh+Zjr6DNfUYR3bPwJEnuwDdqMbxZW7LOQfUN4B54+Cl+0o5zaU9RJ6bcidfDtC1cWCZXQ+nvX8bf6bAji37QQ==} - engines: {node: '>=12'} - - make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - - mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} - - mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} - - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - - ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - - msgpackr-extract@3.0.3: - resolution: {integrity: sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==} - hasBin: true - - msgpackr@1.11.0: - resolution: {integrity: sha512-I8qXuuALqJe5laEBYoFykChhSXLikZmUhccjGsPuSJ/7uPip2TJ7lwdIQwWSAi0jGZDXv4WOP8Qg65QZRuXxXw==} - - node-abort-controller@3.1.1: - resolution: {integrity: sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==} - - node-gyp-build-optional-packages@5.2.2: - resolution: {integrity: sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==} - hasBin: true - - node-gyp-build@4.8.2: - resolution: {integrity: sha512-IRUxE4BVsHWXkV/SFOut4qTlagw2aM8T5/vnTsmrHJvVoKueJHRc/JaFND7QDDc61kLYUJ6qlZM3sqTSyx2dTw==} - hasBin: true - - nodemon@3.1.4: - resolution: {integrity: sha512-wjPBbFhtpJwmIeY2yP7QF+UKzPfltVGtfce1g/bB15/8vCGZj8uxD62b/b9M9/WVgme0NZudpownKN+c0plXlQ==} - engines: {node: '>=10'} - hasBin: true - - normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - - object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} - - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - - prisma@5.19.1: - resolution: {integrity: sha512-c5K9MiDaa+VAAyh1OiYk76PXOme9s3E992D7kvvIOhCrNsBQfy2mP2QAQtX0WNj140IgG++12kwZpYB9iIydNQ==} - engines: {node: '>=16.13'} - hasBin: true - - proxy-from-env@1.1.0: - resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} - - pstree.remy@1.1.8: - resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} - - readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - - redis-errors@1.2.0: - resolution: {integrity: sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==} - engines: {node: '>=4'} - - redis-parser@3.0.0: - resolution: {integrity: sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==} - engines: {node: '>=4'} - - redis@4.7.0: - resolution: {integrity: sha512-zvmkHEAdGMn+hMRXuMBtu4Vo5P6rHQjLoHftu+lBqq8ZTA3RCVC/WzD790bkKKiNFp7d5/9PcSD19fJyyRvOdQ==} - - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - - semver@5.7.2: - resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} - hasBin: true - - semver@7.6.3: - resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} - engines: {node: '>=10'} - hasBin: true - - simple-update-notifier@2.0.0: - resolution: {integrity: sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==} - engines: {node: '>=10'} - - standard-as-callback@2.1.0: - resolution: {integrity: sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==} - - supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} - - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - - touch@3.1.1: - resolution: {integrity: sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==} - hasBin: true - - ts-node@10.9.2: - resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} - hasBin: true - peerDependencies: - '@swc/core': '>=1.2.50' - '@swc/wasm': '>=1.2.50' - '@types/node': '*' - typescript: '>=2.7' - peerDependenciesMeta: - '@swc/core': - optional: true - '@swc/wasm': - optional: true - - tslib@2.7.0: - resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==} - - typescript@5.6.2: - resolution: {integrity: sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==} - engines: {node: '>=14.17'} - hasBin: true - - undefsafe@2.0.5: - resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} - - undici-types@6.19.8: - resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} - - utf-8-validate@5.0.10: - resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} - engines: {node: '>=6.14.2'} - - uuid@9.0.1: - resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} - hasBin: true - - v8-compile-cache-lib@3.0.1: - resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} - - vary@1.1.2: - resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} - engines: {node: '>= 0.8'} - - ws@8.18.0: - resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - - yn@3.1.1: - resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} - engines: {node: '>=6'} - - youtube-search-api@1.2.2: - resolution: {integrity: sha512-zvC+3pDS5Cclv+n+EFunaHzTMAAgt88x5Cth5KpT1xL5Pic30U5oSN2HwFL7rofT8ffDrkitAmBK5UOo9JzjlA==} - -snapshots: - - '@cspotcode/source-map-support@0.8.1': - dependencies: - '@jridgewell/trace-mapping': 0.3.9 - - '@ioredis/commands@1.2.0': {} - - '@jridgewell/resolve-uri@3.1.2': {} - - '@jridgewell/sourcemap-codec@1.5.0': {} - - '@jridgewell/trace-mapping@0.3.9': - dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.0 - - '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.3': - optional: true - - '@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.3': - optional: true - - '@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.3': - optional: true - - '@msgpackr-extract/msgpackr-extract-linux-arm@3.0.3': - optional: true - - '@msgpackr-extract/msgpackr-extract-linux-x64@3.0.3': - optional: true - - '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.3': - optional: true - - '@prisma/client@5.19.1(prisma@5.19.1)': - optionalDependencies: - prisma: 5.19.1 - - '@prisma/debug@5.19.1': {} - - '@prisma/engines-version@5.19.1-2.69d742ee20b815d88e17e54db4a2a7a3b30324e3': {} - - '@prisma/engines@5.19.1': - dependencies: - '@prisma/debug': 5.19.1 - '@prisma/engines-version': 5.19.1-2.69d742ee20b815d88e17e54db4a2a7a3b30324e3 - '@prisma/fetch-engine': 5.19.1 - '@prisma/get-platform': 5.19.1 - - '@prisma/fetch-engine@5.19.1': - dependencies: - '@prisma/debug': 5.19.1 - '@prisma/engines-version': 5.19.1-2.69d742ee20b815d88e17e54db4a2a7a3b30324e3 - '@prisma/get-platform': 5.19.1 - - '@prisma/get-platform@5.19.1': - dependencies: - '@prisma/debug': 5.19.1 - - '@redis/bloom@1.2.0(@redis/client@1.6.0)': - dependencies: - '@redis/client': 1.6.0 - - '@redis/client@1.6.0': - dependencies: - cluster-key-slot: 1.1.2 - generic-pool: 3.9.0 - yallist: 4.0.0 - - '@redis/graph@1.1.1(@redis/client@1.6.0)': - dependencies: - '@redis/client': 1.6.0 - - '@redis/json@1.0.7(@redis/client@1.6.0)': - dependencies: - '@redis/client': 1.6.0 - - '@redis/search@1.2.0(@redis/client@1.6.0)': - dependencies: - '@redis/client': 1.6.0 - - '@redis/time-series@1.1.0(@redis/client@1.6.0)': - dependencies: - '@redis/client': 1.6.0 - - '@tsconfig/node10@1.0.11': {} - - '@tsconfig/node12@1.0.11': {} - - '@tsconfig/node14@1.0.3': {} - - '@tsconfig/node16@1.0.4': {} - - '@types/jsonwebtoken@9.0.6': - dependencies: - '@types/node': 22.5.4 - - '@types/node@22.5.4': - dependencies: - undici-types: 6.19.8 - - '@types/ws@8.5.12': - dependencies: - '@types/node': 22.5.4 - - acorn-walk@8.3.4: - dependencies: - acorn: 8.12.1 - - acorn@8.12.1: {} - - anymatch@3.1.3: - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - - arg@4.1.3: {} - - asynckit@0.4.0: {} - - axios@0.21.4: - dependencies: - follow-redirects: 1.15.9 - transitivePeerDependencies: - - debug - - axios@1.7.7: - dependencies: - follow-redirects: 1.15.9 - form-data: 4.0.0 - proxy-from-env: 1.1.0 - transitivePeerDependencies: - - debug - - balanced-match@1.0.2: {} - - binary-extensions@2.3.0: {} - - brace-expansion@1.1.11: - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - braces@3.0.3: - dependencies: - fill-range: 7.1.1 - - buffer-equal-constant-time@1.0.1: {} - - bufferutil@4.0.8: - dependencies: - node-gyp-build: 4.8.2 - - bullmq@5.12.15: - dependencies: - cron-parser: 4.9.0 - ioredis: 5.4.1 - msgpackr: 1.11.0 - node-abort-controller: 3.1.1 - semver: 7.6.3 - tslib: 2.7.0 - uuid: 9.0.1 - transitivePeerDependencies: - - supports-color - - chokidar@3.6.0: - dependencies: - anymatch: 3.1.3 - braces: 3.0.3 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - - cluster-key-slot@1.1.2: {} - - combined-stream@1.0.8: - dependencies: - delayed-stream: 1.0.0 - - concat-map@0.0.1: {} - - cors@2.8.5: - dependencies: - object-assign: 4.1.1 - vary: 1.1.2 - - create-require@1.1.1: {} - - cron-parser@4.9.0: - dependencies: - luxon: 3.5.0 - - debug@4.3.7(supports-color@5.5.0): - dependencies: - ms: 2.1.3 - optionalDependencies: - supports-color: 5.5.0 - - delayed-stream@1.0.0: {} - - denque@2.1.0: {} - - detect-libc@2.0.3: - optional: true - - diff@4.0.2: {} - - dotenv@16.4.5: {} - - ecdsa-sig-formatter@1.0.11: - dependencies: - safe-buffer: 5.2.1 - - fill-range@7.1.1: - dependencies: - to-regex-range: 5.0.1 - - follow-redirects@1.15.9: {} - - form-data@4.0.0: - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 - - fsevents@2.3.3: - optional: true - - generic-pool@3.9.0: {} - - glob-parent@5.1.2: - dependencies: - is-glob: 4.0.3 - - has-flag@3.0.0: {} - - ignore-by-default@1.0.1: {} - - ioredis@5.4.1: - dependencies: - '@ioredis/commands': 1.2.0 - cluster-key-slot: 1.1.2 - debug: 4.3.7(supports-color@5.5.0) - denque: 2.1.0 - lodash.defaults: 4.2.0 - lodash.isarguments: 3.1.0 - redis-errors: 1.2.0 - redis-parser: 3.0.0 - standard-as-callback: 2.1.0 - transitivePeerDependencies: - - supports-color - - is-binary-path@2.1.0: - dependencies: - binary-extensions: 2.3.0 - - is-extglob@2.1.1: {} - - is-glob@4.0.3: - dependencies: - is-extglob: 2.1.1 - - is-number@7.0.0: {} - - jsonwebtoken@8.5.1: - dependencies: - jws: 3.2.2 - lodash.includes: 4.3.0 - lodash.isboolean: 3.0.3 - lodash.isinteger: 4.0.4 - lodash.isnumber: 3.0.3 - lodash.isplainobject: 4.0.6 - lodash.isstring: 4.0.1 - lodash.once: 4.1.1 - ms: 2.1.3 - semver: 5.7.2 - - jwa@1.4.1: - dependencies: - buffer-equal-constant-time: 1.0.1 - ecdsa-sig-formatter: 1.0.11 - safe-buffer: 5.2.1 - - jws@3.2.2: - dependencies: - jwa: 1.4.1 - safe-buffer: 5.2.1 - - lodash.defaults@4.2.0: {} - - lodash.includes@4.3.0: {} - - lodash.isarguments@3.1.0: {} - - lodash.isboolean@3.0.3: {} - - lodash.isinteger@4.0.4: {} - - lodash.isnumber@3.0.3: {} - - lodash.isplainobject@4.0.6: {} - - lodash.isstring@4.0.1: {} - - lodash.once@4.1.1: {} - - luxon@3.5.0: {} - - make-error@1.3.6: {} - - mime-db@1.52.0: {} - - mime-types@2.1.35: - dependencies: - mime-db: 1.52.0 - - minimatch@3.1.2: - dependencies: - brace-expansion: 1.1.11 - - ms@2.1.3: {} - - msgpackr-extract@3.0.3: - dependencies: - node-gyp-build-optional-packages: 5.2.2 - optionalDependencies: - '@msgpackr-extract/msgpackr-extract-darwin-arm64': 3.0.3 - '@msgpackr-extract/msgpackr-extract-darwin-x64': 3.0.3 - '@msgpackr-extract/msgpackr-extract-linux-arm': 3.0.3 - '@msgpackr-extract/msgpackr-extract-linux-arm64': 3.0.3 - '@msgpackr-extract/msgpackr-extract-linux-x64': 3.0.3 - '@msgpackr-extract/msgpackr-extract-win32-x64': 3.0.3 - optional: true - - msgpackr@1.11.0: - optionalDependencies: - msgpackr-extract: 3.0.3 - - node-abort-controller@3.1.1: {} - - node-gyp-build-optional-packages@5.2.2: - dependencies: - detect-libc: 2.0.3 - optional: true - - node-gyp-build@4.8.2: {} - - nodemon@3.1.4: - dependencies: - chokidar: 3.6.0 - debug: 4.3.7(supports-color@5.5.0) - ignore-by-default: 1.0.1 - minimatch: 3.1.2 - pstree.remy: 1.1.8 - semver: 7.6.3 - simple-update-notifier: 2.0.0 - supports-color: 5.5.0 - touch: 3.1.1 - undefsafe: 2.0.5 - - normalize-path@3.0.0: {} - - object-assign@4.1.1: {} - - picomatch@2.3.1: {} - - prisma@5.19.1: - dependencies: - '@prisma/engines': 5.19.1 - optionalDependencies: - fsevents: 2.3.3 - - proxy-from-env@1.1.0: {} - - pstree.remy@1.1.8: {} - - readdirp@3.6.0: - dependencies: - picomatch: 2.3.1 - - redis-errors@1.2.0: {} - - redis-parser@3.0.0: - dependencies: - redis-errors: 1.2.0 - - redis@4.7.0: - dependencies: - '@redis/bloom': 1.2.0(@redis/client@1.6.0) - '@redis/client': 1.6.0 - '@redis/graph': 1.1.1(@redis/client@1.6.0) - '@redis/json': 1.0.7(@redis/client@1.6.0) - '@redis/search': 1.2.0(@redis/client@1.6.0) - '@redis/time-series': 1.1.0(@redis/client@1.6.0) - - safe-buffer@5.2.1: {} - - semver@5.7.2: {} - - semver@7.6.3: {} - - simple-update-notifier@2.0.0: - dependencies: - semver: 7.6.3 - - standard-as-callback@2.1.0: {} - - supports-color@5.5.0: - dependencies: - has-flag: 3.0.0 - - to-regex-range@5.0.1: - dependencies: - is-number: 7.0.0 - - touch@3.1.1: {} - - ts-node@10.9.2(@types/node@22.5.4)(typescript@5.6.2): - dependencies: - '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.11 - '@tsconfig/node12': 1.0.11 - '@tsconfig/node14': 1.0.3 - '@tsconfig/node16': 1.0.4 - '@types/node': 22.5.4 - acorn: 8.12.1 - acorn-walk: 8.3.4 - arg: 4.1.3 - create-require: 1.1.1 - diff: 4.0.2 - make-error: 1.3.6 - typescript: 5.6.2 - v8-compile-cache-lib: 3.0.1 - yn: 3.1.1 - - tslib@2.7.0: {} - - typescript@5.6.2: {} - - undefsafe@2.0.5: {} - - undici-types@6.19.8: {} - - utf-8-validate@5.0.10: - dependencies: - node-gyp-build: 4.8.2 - - uuid@9.0.1: {} - - v8-compile-cache-lib@3.0.1: {} - - vary@1.1.2: {} - - ws@8.18.0(bufferutil@4.0.8)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.0.8 - utf-8-validate: 5.0.10 - - yallist@4.0.0: {} - - yn@3.1.1: {} - - youtube-search-api@1.2.2: - dependencies: - axios: 0.21.4 - transitivePeerDependencies: - - debug