diff --git a/apps/web/__tests__/unit/caption-tracks.test.ts b/apps/web/__tests__/unit/caption-tracks.test.ts index 74b208b8d07..5a3f1a15e37 100644 --- a/apps/web/__tests__/unit/caption-tracks.test.ts +++ b/apps/web/__tests__/unit/caption-tracks.test.ts @@ -76,11 +76,11 @@ function createCueList(text: string): TextTrackCueList { function createVideo( textTracks: FakeTextTrackList, trackElements: FakeTrackElement[], -): HTMLVideoElement { +): HTMLVideoElement & FakeVideo { return new FakeVideo( textTracks, trackElements, - ) as unknown as HTMLVideoElement; + ) as unknown as HTMLVideoElement & FakeVideo; } describe("bindCaptionTrackCueText", () => { diff --git a/apps/web/app/(site)/Footer.tsx b/apps/web/app/(site)/Footer.tsx index 035f5b986ba..fa85b0d54ca 100644 --- a/apps/web/app/(site)/Footer.tsx +++ b/apps/web/app/(site)/Footer.tsx @@ -1,7 +1,6 @@ "use client"; import { Logo } from "@cap/ui"; -import type { IconDefinition } from "@fortawesome/fontawesome-svg-core"; import { faDiscord, faLinkedinIn, @@ -13,6 +12,8 @@ import Link from "next/link"; import type { ReactNode } from "react"; import { useState } from "react"; +type IconDefinition = typeof faDiscord; + type FooterLink = { label: string; href: string; diff --git a/apps/web/app/api/video/ai/route.ts b/apps/web/app/api/video/ai/route.ts index f3dc57b35d9..cab430729f5 100644 --- a/apps/web/app/api/video/ai/route.ts +++ b/apps/web/app/api/video/ai/route.ts @@ -2,13 +2,10 @@ import { db } from "@cap/database"; import { getCurrentUser } from "@cap/database/auth/session"; import { users, videos } from "@cap/database/schema"; import type { VideoMetadata } from "@cap/database/types"; -import { provideOptionalAuth, VideosPolicy } from "@cap/web-backend"; -import { Policy, type Video } from "@cap/web-domain"; -import { eq } from "drizzle-orm"; -import { Effect, Exit } from "effect"; +import type { Video } from "@cap/web-domain"; +import { and, eq } from "drizzle-orm"; import type { NextRequest } from "next/server"; import { startAiGeneration } from "@/lib/generate-ai"; -import * as EffectRuntime from "@/lib/server"; import { isAiGenerationEnabled } from "@/utils/flags"; export const dynamic = "force-dynamic"; @@ -30,30 +27,21 @@ export async function GET(request: NextRequest) { ); } - const exit = await Effect.gen(function* () { - const videosPolicy = yield* VideosPolicy; - - return yield* Effect.promise(() => - db().select().from(videos).where(eq(videos.id, videoId)), - ).pipe(Policy.withPublicPolicy(videosPolicy.canView(videoId))); - }).pipe(provideOptionalAuth, EffectRuntime.runPromiseExit); - - if (Exit.isFailure(exit)) { - return Response.json( - { error: true, message: "Video not found" }, - { status: 404 }, - ); - } - - const result = exit.value; - if (result.length === 0 || !result[0]) { + const [video] = await db() + .select({ + ownerId: videos.ownerId, + metadata: videos.metadata, + transcriptionStatus: videos.transcriptionStatus, + }) + .from(videos) + .where(and(eq(videos.id, videoId), eq(videos.ownerId, user.id))) + .limit(1); + if (!video) { return Response.json( { error: true, message: "Video not found" }, { status: 404 }, ); } - - const video = result[0]; const metadata: VideoMetadata = (video.metadata as VideoMetadata) || {}; if (metadata.summary || metadata.chapters) {