From 4a2801e04a4d1a22015d108fe48120f4f65fda67 Mon Sep 17 00:00:00 2001 From: mogita Date: Wed, 27 Aug 2025 14:31:37 +0800 Subject: [PATCH 01/12] feat: generated signed url for assets by default --- apps/web/app/api/video/playlistUrl/route.ts | 14 +++++++-- .../[videoId]/_components/EmbedVideo.tsx | 7 ++--- .../s/[videoId]/_components/ShareVideo.tsx | 7 ++--- apps/web/utils/s3.ts | 30 ++++++++++--------- 4 files changed, 31 insertions(+), 27 deletions(-) diff --git a/apps/web/app/api/video/playlistUrl/route.ts b/apps/web/app/api/video/playlistUrl/route.ts index 712de88fcf..4285ce0628 100644 --- a/apps/web/app/api/video/playlistUrl/route.ts +++ b/apps/web/app/api/video/playlistUrl/route.ts @@ -1,10 +1,10 @@ import { db } from "@cap/database"; -import { videos } from "@cap/database/schema"; +import { s3Buckets, videos } from "@cap/database/schema"; import { serverEnv } from "@cap/env"; -import { S3_BUCKET_URL } from "@cap/utils"; import { eq } from "drizzle-orm"; import type { NextRequest } from "next/server"; import { CACHE_CONTROL_HEADERS, getHeaders } from "@/utils/helpers"; +import { createBucketProvider } from "@/utils/s3"; export const revalidate = 0; @@ -60,7 +60,15 @@ export async function GET(request: NextRequest) { } if (video.jobStatus === "COMPLETE") { - const playlistUrl = `${S3_BUCKET_URL}/${video.ownerId}/${video.id}/output/video_recording_000_output.m3u8`; + const [customBucket] = await db() + .select() + .from(s3Buckets) + .where(eq(s3Buckets.ownerId, video.ownerId)); + + const bucketProvider = await createBucketProvider(customBucket); + const playlistKey = `${video.ownerId}/${video.id}/output/video_recording_000_output.m3u8`; + const playlistUrl = await bucketProvider.getSignedObjectUrl(playlistKey); + return new Response( JSON.stringify({ playlistOne: playlistUrl, playlistTwo: null }), { diff --git a/apps/web/app/embed/[videoId]/_components/EmbedVideo.tsx b/apps/web/app/embed/[videoId]/_components/EmbedVideo.tsx index 264258eca2..5468308721 100644 --- a/apps/web/app/embed/[videoId]/_components/EmbedVideo.tsx +++ b/apps/web/app/embed/[videoId]/_components/EmbedVideo.tsx @@ -21,7 +21,6 @@ import { parseVTT, type TranscriptEntry, } from "@/app/s/[videoId]/_components/utils/transcript-utils"; -import { usePublicEnv } from "@/utils/public-env"; declare global { interface Window { @@ -147,8 +146,6 @@ export const EmbedVideo = forwardRef< } }, [chapters]); - const publicEnv = usePublicEnv(); - let videoSrc: string; let enableCrossOrigin = false; @@ -163,9 +160,9 @@ export const EmbedVideo = forwardRef< ) { videoSrc = `/api/playlist?userId=${data.ownerId}&videoId=${data.id}&videoType=master`; } else if (data.source.type === "MediaConvert") { - videoSrc = `${publicEnv.s3BucketUrl}/${data.ownerId}/${data.id}/output/video_recording_000.m3u8`; + videoSrc = `/api/playlist?userId=${data.ownerId}&videoId=${data.id}&videoType=video`; } else { - videoSrc = `${publicEnv.s3BucketUrl}/${data.ownerId}/${data.id}/combined-source/stream.m3u8`; + videoSrc = `/api/playlist?userId=${data.ownerId}&videoId=${data.id}&videoType=video`; } useEffect(() => { diff --git a/apps/web/app/s/[videoId]/_components/ShareVideo.tsx b/apps/web/app/s/[videoId]/_components/ShareVideo.tsx index fbd9611b3a..d342d8fd81 100644 --- a/apps/web/app/s/[videoId]/_components/ShareVideo.tsx +++ b/apps/web/app/s/[videoId]/_components/ShareVideo.tsx @@ -12,7 +12,6 @@ import { useState, } from "react"; import { UpgradeModal } from "@/components/UpgradeModal"; -import { usePublicEnv } from "@/utils/public-env"; import { CapVideoPlayer } from "./CapVideoPlayer"; import { HLSVideoPlayer } from "./HLSVideoPlayer"; import { @@ -123,8 +122,6 @@ export const ShareVideo = forwardRef< } }, [chapters]); - const publicEnv = usePublicEnv(); - let videoSrc: string; let enableCrossOrigin = false; @@ -139,9 +136,9 @@ export const ShareVideo = forwardRef< ) { videoSrc = `/api/playlist?userId=${data.ownerId}&videoId=${data.id}&videoType=master`; } else if (data.source.type === "MediaConvert") { - videoSrc = `${publicEnv.s3BucketUrl}/${data.ownerId}/${data.id}/output/video_recording_000.m3u8`; + videoSrc = `/api/playlist?userId=${data.ownerId}&videoId=${data.id}&videoType=video`; } else { - videoSrc = `${publicEnv.s3BucketUrl}/${data.ownerId}/${data.id}/combined-source/stream.m3u8`; + videoSrc = `/api/playlist?userId=${data.ownerId}&videoId=${data.id}&videoType=video`; } return ( diff --git a/apps/web/utils/s3.ts b/apps/web/utils/s3.ts index 9002809dac..32ada2562f 100644 --- a/apps/web/utils/s3.ts +++ b/apps/web/utils/s3.ts @@ -19,7 +19,6 @@ import { type ListObjectsV2Output, type ObjectIdentifier, PutObjectCommand, - PutObjectCommandInput, type PutObjectCommandOutput, type PutObjectRequest, S3Client, @@ -262,13 +261,14 @@ function createS3Provider( ), ); }, - headObject: (key) => - getClient(true).then((client) => - client.send(new HeadObjectCommand({ Bucket: bucket, Key: key })), - ), - putObject: (key, body, fields) => - getClient(true).then((client) => - client.send( + async headObject(key: string) { + return await getClient(true).then((c) => + c.send(new HeadObjectCommand({ Bucket: bucket, Key: key })), + ); + }, + async putObject(key: string, body, fields) { + return await getClient(true).then((c) => + c.send( new PutObjectCommand({ Bucket: bucket, Key: key, @@ -276,10 +276,11 @@ function createS3Provider( ContentType: fields?.contentType, }), ), - ), - copyObject: (source, key, args) => - getClient(true).then((client) => - client.send( + ); + }, + async copyObject(source: string, key: string, args) { + return await getClient(true).then((c) => + c.send( new CopyObjectCommand({ Bucket: bucket, CopySource: source, @@ -287,8 +288,9 @@ function createS3Provider( ...args, }), ), - ), - deleteObject: (key) => + ); + }, + deleteObject: (key: string) => getClient(true).then((client) => client.send(new DeleteObjectCommand({ Bucket: bucket, Key: key })), ), From 0c95141836a6f33f4c2649f8880f03b2f8e0e23d Mon Sep 17 00:00:00 2001 From: mogita Date: Wed, 27 Aug 2025 16:50:46 +0800 Subject: [PATCH 02/12] chore: add generated migration files --- .../migrations/0008_fixed_deathbird.sql | 4 + .../migrations/meta/0008_snapshot.json | 3692 +++++++++-------- .../database/migrations/meta/_journal.json | 129 +- 3 files changed, 2017 insertions(+), 1808 deletions(-) create mode 100644 packages/database/migrations/0008_fixed_deathbird.sql diff --git a/packages/database/migrations/0008_fixed_deathbird.sql b/packages/database/migrations/0008_fixed_deathbird.sql new file mode 100644 index 0000000000..d460e5b932 --- /dev/null +++ b/packages/database/migrations/0008_fixed_deathbird.sql @@ -0,0 +1,4 @@ +ALTER TABLE `videos` ADD `duration` float;--> statement-breakpoint +ALTER TABLE `videos` ADD `width` int;--> statement-breakpoint +ALTER TABLE `videos` ADD `height` int;--> statement-breakpoint +ALTER TABLE `videos` ADD `fps` int; \ No newline at end of file diff --git a/packages/database/migrations/meta/0008_snapshot.json b/packages/database/migrations/meta/0008_snapshot.json index 4946a96733..3cdf67e880 100644 --- a/packages/database/migrations/meta/0008_snapshot.json +++ b/packages/database/migrations/meta/0008_snapshot.json @@ -1,1748 +1,1946 @@ { - "version": "5", - "dialect": "mysql", - "id": "6dee9a50-52c1-4900-a05d-b3fa7f6fcb27", - "prevId": "ccef8ed8-2472-41a3-bf54-900db6ce8b08", - "tables": { - "accounts": { - "name": "accounts", - "columns": { - "id": { - "name": "id", - "type": "varchar(15)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "userId": { - "name": "userId", - "type": "varchar(15)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "type": { - "name": "type", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "provider": { - "name": "provider", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "providerAccountId": { - "name": "providerAccountId", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "access_token": { - "name": "access_token", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "expires_in": { - "name": "expires_in", - "type": "int", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "id_token": { - "name": "id_token", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "refresh_token": { - "name": "refresh_token", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "refresh_token_expires_in": { - "name": "refresh_token_expires_in", - "type": "int", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "scope": { - "name": "scope", - "type": "varchar(255)", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "token_type": { - "name": "token_type", - "type": "varchar(255)", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "createdAt": { - "name": "createdAt", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "(now())" - }, - "updatedAt": { - "name": "updatedAt", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "onUpdate": true, - "default": "(now())" - }, - "tempColumn": { - "name": "tempColumn", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "user_id_idx": { - "name": "user_id_idx", - "columns": ["userId"], - "isUnique": false - }, - "provider_account_id_idx": { - "name": "provider_account_id_idx", - "columns": ["providerAccountId"], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": { - "accounts_id": { - "name": "accounts_id", - "columns": ["id"] - } - }, - "uniqueConstraints": { - "accounts_id_unique": { - "name": "accounts_id_unique", - "columns": ["id"] - } - }, - "checkConstraint": {} - }, - "auth_api_keys": { - "name": "auth_api_keys", - "columns": { - "id": { - "name": "id", - "type": "varchar(36)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "userId": { - "name": "userId", - "type": "varchar(15)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "createdAt": { - "name": "createdAt", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "(now())" - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": { - "auth_api_keys_id": { - "name": "auth_api_keys_id", - "columns": ["id"] - } - }, - "uniqueConstraints": { - "auth_api_keys_id_unique": { - "name": "auth_api_keys_id_unique", - "columns": ["id"] - } - }, - "checkConstraint": {} - }, - "comments": { - "name": "comments", - "columns": { - "id": { - "name": "id", - "type": "varchar(15)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "type": { - "name": "type", - "type": "varchar(6)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "content": { - "name": "content", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "timestamp": { - "name": "timestamp", - "type": "float", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "authorId": { - "name": "authorId", - "type": "varchar(15)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "videoId": { - "name": "videoId", - "type": "varchar(15)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "createdAt": { - "name": "createdAt", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "(now())" - }, - "updatedAt": { - "name": "updatedAt", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "onUpdate": true, - "default": "(now())" - }, - "parentCommentId": { - "name": "parentCommentId", - "type": "varchar(15)", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "video_id_idx": { - "name": "video_id_idx", - "columns": ["videoId"], - "isUnique": false - }, - "author_id_idx": { - "name": "author_id_idx", - "columns": ["authorId"], - "isUnique": false - }, - "parent_comment_id_idx": { - "name": "parent_comment_id_idx", - "columns": ["parentCommentId"], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": { - "comments_id": { - "name": "comments_id", - "columns": ["id"] - } - }, - "uniqueConstraints": { - "comments_id_unique": { - "name": "comments_id_unique", - "columns": ["id"] - } - }, - "checkConstraint": {} - }, - "folders": { - "name": "folders", - "columns": { - "id": { - "name": "id", - "type": "varchar(15)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "color": { - "name": "color", - "type": "varchar(16)", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "'normal'" - }, - "organizationId": { - "name": "organizationId", - "type": "varchar(15)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "createdById": { - "name": "createdById", - "type": "varchar(15)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "parentId": { - "name": "parentId", - "type": "varchar(15)", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "spaceId": { - "name": "spaceId", - "type": "varchar(15)", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "createdAt": { - "name": "createdAt", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "(now())" - }, - "updatedAt": { - "name": "updatedAt", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "onUpdate": true, - "default": "(now())" - } - }, - "indexes": { - "organization_id_idx": { - "name": "organization_id_idx", - "columns": ["organizationId"], - "isUnique": false - }, - "created_by_id_idx": { - "name": "created_by_id_idx", - "columns": ["createdById"], - "isUnique": false - }, - "parent_id_idx": { - "name": "parent_id_idx", - "columns": ["parentId"], - "isUnique": false - }, - "space_id_idx": { - "name": "space_id_idx", - "columns": ["spaceId"], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": { - "folders_id": { - "name": "folders_id", - "columns": ["id"] - } - }, - "uniqueConstraints": { - "folders_id_unique": { - "name": "folders_id_unique", - "columns": ["id"] - } - }, - "checkConstraint": {} - }, - "notifications": { - "name": "notifications", - "columns": { - "id": { - "name": "id", - "type": "varchar(15)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "orgId": { - "name": "orgId", - "type": "varchar(15)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "recipientId": { - "name": "recipientId", - "type": "varchar(15)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "type": { - "name": "type", - "type": "varchar(10)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "data": { - "name": "data", - "type": "json", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "readAt": { - "name": "readAt", - "type": "timestamp", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "createdAt": { - "name": "createdAt", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "(now())" - } - }, - "indexes": { - "recipient_id_idx": { - "name": "recipient_id_idx", - "columns": ["recipientId"], - "isUnique": false - }, - "org_id_idx": { - "name": "org_id_idx", - "columns": ["orgId"], - "isUnique": false - }, - "type_idx": { - "name": "type_idx", - "columns": ["type"], - "isUnique": false - }, - "read_at_idx": { - "name": "read_at_idx", - "columns": ["readAt"], - "isUnique": false - }, - "created_at_idx": { - "name": "created_at_idx", - "columns": ["createdAt"], - "isUnique": false - }, - "recipient_read_idx": { - "name": "recipient_read_idx", - "columns": ["recipientId", "readAt"], - "isUnique": false - }, - "recipient_created_idx": { - "name": "recipient_created_idx", - "columns": ["recipientId", "createdAt"], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": { - "notifications_id": { - "name": "notifications_id", - "columns": ["id"] - } - }, - "uniqueConstraints": { - "notifications_id_unique": { - "name": "notifications_id_unique", - "columns": ["id"] - } - }, - "checkConstraint": {} - }, - "organization_invites": { - "name": "organization_invites", - "columns": { - "id": { - "name": "id", - "type": "varchar(15)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "organizationId": { - "name": "organizationId", - "type": "varchar(15)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "invitedEmail": { - "name": "invitedEmail", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "invitedByUserId": { - "name": "invitedByUserId", - "type": "varchar(15)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "role": { - "name": "role", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "status": { - "name": "status", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "'pending'" - }, - "createdAt": { - "name": "createdAt", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "(now())" - }, - "updatedAt": { - "name": "updatedAt", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "onUpdate": true, - "default": "(now())" - }, - "expiresAt": { - "name": "expiresAt", - "type": "timestamp", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "organization_id_idx": { - "name": "organization_id_idx", - "columns": ["organizationId"], - "isUnique": false - }, - "invited_email_idx": { - "name": "invited_email_idx", - "columns": ["invitedEmail"], - "isUnique": false - }, - "invited_by_user_id_idx": { - "name": "invited_by_user_id_idx", - "columns": ["invitedByUserId"], - "isUnique": false - }, - "status_idx": { - "name": "status_idx", - "columns": ["status"], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": { - "organization_invites_id": { - "name": "organization_invites_id", - "columns": ["id"] - } - }, - "uniqueConstraints": { - "organization_invites_id_unique": { - "name": "organization_invites_id_unique", - "columns": ["id"] - } - }, - "checkConstraint": {} - }, - "organization_members": { - "name": "organization_members", - "columns": { - "id": { - "name": "id", - "type": "varchar(15)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "userId": { - "name": "userId", - "type": "varchar(15)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "organizationId": { - "name": "organizationId", - "type": "varchar(15)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "role": { - "name": "role", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "createdAt": { - "name": "createdAt", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "(now())" - }, - "updatedAt": { - "name": "updatedAt", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "onUpdate": true, - "default": "(now())" - } - }, - "indexes": { - "user_id_idx": { - "name": "user_id_idx", - "columns": ["userId"], - "isUnique": false - }, - "organization_id_idx": { - "name": "organization_id_idx", - "columns": ["organizationId"], - "isUnique": false - }, - "user_id_organization_id_idx": { - "name": "user_id_organization_id_idx", - "columns": ["userId", "organizationId"], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": { - "organization_members_id": { - "name": "organization_members_id", - "columns": ["id"] - } - }, - "uniqueConstraints": { - "organization_members_id_unique": { - "name": "organization_members_id_unique", - "columns": ["id"] - } - }, - "checkConstraint": {} - }, - "organizations": { - "name": "organizations", - "columns": { - "id": { - "name": "id", - "type": "varchar(15)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "ownerId": { - "name": "ownerId", - "type": "varchar(15)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "metadata": { - "name": "metadata", - "type": "json", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "allowedEmailDomain": { - "name": "allowedEmailDomain", - "type": "varchar(255)", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "customDomain": { - "name": "customDomain", - "type": "varchar(255)", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "domainVerified": { - "name": "domainVerified", - "type": "timestamp", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "iconUrl": { - "name": "iconUrl", - "type": "varchar(1024)", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "createdAt": { - "name": "createdAt", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "(now())" - }, - "updatedAt": { - "name": "updatedAt", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "onUpdate": true, - "default": "(now())" - }, - "workosOrganizationId": { - "name": "workosOrganizationId", - "type": "varchar(255)", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "workosConnectionId": { - "name": "workosConnectionId", - "type": "varchar(255)", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "owner_id_idx": { - "name": "owner_id_idx", - "columns": ["ownerId"], - "isUnique": false - }, - "custom_domain_idx": { - "name": "custom_domain_idx", - "columns": ["customDomain"], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": { - "organizations_id": { - "name": "organizations_id", - "columns": ["id"] - } - }, - "uniqueConstraints": { - "organizations_id_unique": { - "name": "organizations_id_unique", - "columns": ["id"] - } - }, - "checkConstraint": {} - }, - "s3_buckets": { - "name": "s3_buckets", - "columns": { - "id": { - "name": "id", - "type": "varchar(15)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "ownerId": { - "name": "ownerId", - "type": "varchar(15)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "region": { - "name": "region", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "endpoint": { - "name": "endpoint", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "bucketName": { - "name": "bucketName", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "accessKeyId": { - "name": "accessKeyId", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "secretAccessKey": { - "name": "secretAccessKey", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "provider": { - "name": "provider", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "('aws')" - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": { - "s3_buckets_id": { - "name": "s3_buckets_id", - "columns": ["id"] - } - }, - "uniqueConstraints": { - "s3_buckets_id_unique": { - "name": "s3_buckets_id_unique", - "columns": ["id"] - } - }, - "checkConstraint": {} - }, - "sessions": { - "name": "sessions", - "columns": { - "id": { - "name": "id", - "type": "varchar(15)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "sessionToken": { - "name": "sessionToken", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "userId": { - "name": "userId", - "type": "varchar(15)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "expires": { - "name": "expires", - "type": "datetime", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "(now())" - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "onUpdate": true, - "default": "(now())" - } - }, - "indexes": { - "session_token_idx": { - "name": "session_token_idx", - "columns": ["sessionToken"], - "isUnique": true - }, - "user_id_idx": { - "name": "user_id_idx", - "columns": ["userId"], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": { - "sessions_id": { - "name": "sessions_id", - "columns": ["id"] - } - }, - "uniqueConstraints": { - "sessions_id_unique": { - "name": "sessions_id_unique", - "columns": ["id"] - }, - "sessions_sessionToken_unique": { - "name": "sessions_sessionToken_unique", - "columns": ["sessionToken"] - } - }, - "checkConstraint": {} - }, - "shared_videos": { - "name": "shared_videos", - "columns": { - "id": { - "name": "id", - "type": "varchar(15)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "videoId": { - "name": "videoId", - "type": "varchar(15)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "organizationId": { - "name": "organizationId", - "type": "varchar(15)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "sharedByUserId": { - "name": "sharedByUserId", - "type": "varchar(15)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "sharedAt": { - "name": "sharedAt", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "(now())" - } - }, - "indexes": { - "video_id_idx": { - "name": "video_id_idx", - "columns": ["videoId"], - "isUnique": false - }, - "organization_id_idx": { - "name": "organization_id_idx", - "columns": ["organizationId"], - "isUnique": false - }, - "shared_by_user_id_idx": { - "name": "shared_by_user_id_idx", - "columns": ["sharedByUserId"], - "isUnique": false - }, - "video_id_organization_id_idx": { - "name": "video_id_organization_id_idx", - "columns": ["videoId", "organizationId"], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": { - "shared_videos_id": { - "name": "shared_videos_id", - "columns": ["id"] - } - }, - "uniqueConstraints": { - "shared_videos_id_unique": { - "name": "shared_videos_id_unique", - "columns": ["id"] - } - }, - "checkConstraint": {} - }, - "space_members": { - "name": "space_members", - "columns": { - "id": { - "name": "id", - "type": "varchar(15)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "spaceId": { - "name": "spaceId", - "type": "varchar(15)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "userId": { - "name": "userId", - "type": "varchar(15)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "role": { - "name": "role", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "'member'" - }, - "createdAt": { - "name": "createdAt", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "(now())" - }, - "updatedAt": { - "name": "updatedAt", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "onUpdate": true, - "default": "(now())" - } - }, - "indexes": { - "space_id_idx": { - "name": "space_id_idx", - "columns": ["spaceId"], - "isUnique": false - }, - "user_id_idx": { - "name": "user_id_idx", - "columns": ["userId"], - "isUnique": false - }, - "space_id_user_id_idx": { - "name": "space_id_user_id_idx", - "columns": ["spaceId", "userId"], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": { - "space_members_id": { - "name": "space_members_id", - "columns": ["id"] - } - }, - "uniqueConstraints": { - "space_members_id_unique": { - "name": "space_members_id_unique", - "columns": ["id"] - } - }, - "checkConstraint": {} - }, - "space_videos": { - "name": "space_videos", - "columns": { - "id": { - "name": "id", - "type": "varchar(15)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "spaceId": { - "name": "spaceId", - "type": "varchar(15)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "folderId": { - "name": "folderId", - "type": "varchar(15)", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "videoId": { - "name": "videoId", - "type": "varchar(15)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "addedById": { - "name": "addedById", - "type": "varchar(15)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "addedAt": { - "name": "addedAt", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "(now())" - } - }, - "indexes": { - "space_id_idx": { - "name": "space_id_idx", - "columns": ["spaceId"], - "isUnique": false - }, - "folder_id_idx": { - "name": "folder_id_idx", - "columns": ["folderId"], - "isUnique": false - }, - "video_id_idx": { - "name": "video_id_idx", - "columns": ["videoId"], - "isUnique": false - }, - "added_by_id_idx": { - "name": "added_by_id_idx", - "columns": ["addedById"], - "isUnique": false - }, - "space_id_video_id_idx": { - "name": "space_id_video_id_idx", - "columns": ["spaceId", "videoId"], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": { - "space_videos_id": { - "name": "space_videos_id", - "columns": ["id"] - } - }, - "uniqueConstraints": { - "space_videos_id_unique": { - "name": "space_videos_id_unique", - "columns": ["id"] - } - }, - "checkConstraint": {} - }, - "spaces": { - "name": "spaces", - "columns": { - "id": { - "name": "id", - "type": "varchar(15)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "primary": { - "name": "primary", - "type": "boolean", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": false - }, - "name": { - "name": "name", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "organizationId": { - "name": "organizationId", - "type": "varchar(15)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "createdById": { - "name": "createdById", - "type": "varchar(15)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "iconUrl": { - "name": "iconUrl", - "type": "varchar(255)", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "description": { - "name": "description", - "type": "varchar(1000)", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "createdAt": { - "name": "createdAt", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "(now())" - }, - "updatedAt": { - "name": "updatedAt", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "onUpdate": true, - "default": "(now())" - }, - "privacy": { - "name": "privacy", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "'Private'" - } - }, - "indexes": { - "organization_id_idx": { - "name": "organization_id_idx", - "columns": ["organizationId"], - "isUnique": false - }, - "created_by_id_idx": { - "name": "created_by_id_idx", - "columns": ["createdById"], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": { - "spaces_id": { - "name": "spaces_id", - "columns": ["id"] - } - }, - "uniqueConstraints": { - "spaces_id_unique": { - "name": "spaces_id_unique", - "columns": ["id"] - } - }, - "checkConstraint": {} - }, - "users": { - "name": "users", - "columns": { - "id": { - "name": "id", - "type": "varchar(15)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "varchar(255)", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "lastName": { - "name": "lastName", - "type": "varchar(255)", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "email": { - "name": "email", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "emailVerified": { - "name": "emailVerified", - "type": "timestamp", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "image": { - "name": "image", - "type": "varchar(255)", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "stripeCustomerId": { - "name": "stripeCustomerId", - "type": "varchar(255)", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "stripeSubscriptionId": { - "name": "stripeSubscriptionId", - "type": "varchar(255)", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "thirdPartyStripeSubscriptionId": { - "name": "thirdPartyStripeSubscriptionId", - "type": "varchar(255)", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "stripeSubscriptionStatus": { - "name": "stripeSubscriptionStatus", - "type": "varchar(255)", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "stripeSubscriptionPriceId": { - "name": "stripeSubscriptionPriceId", - "type": "varchar(255)", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "preferences": { - "name": "preferences", - "type": "json", - "primaryKey": false, - "notNull": false, - "autoincrement": false, - "default": "('null')" - }, - "activeOrganizationId": { - "name": "activeOrganizationId", - "type": "varchar(15)", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "(now())" - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "onUpdate": true, - "default": "(now())" - }, - "onboarding_completed_at": { - "name": "onboarding_completed_at", - "type": "timestamp", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "customBucket": { - "name": "customBucket", - "type": "varchar(15)", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "inviteQuota": { - "name": "inviteQuota", - "type": "int", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 1 - } - }, - "indexes": { - "email_idx": { - "name": "email_idx", - "columns": ["email"], - "isUnique": true - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": { - "users_id": { - "name": "users_id", - "columns": ["id"] - } - }, - "uniqueConstraints": { - "users_id_unique": { - "name": "users_id_unique", - "columns": ["id"] - }, - "users_email_unique": { - "name": "users_email_unique", - "columns": ["email"] - } - }, - "checkConstraint": {} - }, - "verification_tokens": { - "name": "verification_tokens", - "columns": { - "identifier": { - "name": "identifier", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "token": { - "name": "token", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "expires": { - "name": "expires", - "type": "datetime", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "(now())" - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "onUpdate": true, - "default": "(now())" - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": { - "verification_tokens_identifier": { - "name": "verification_tokens_identifier", - "columns": ["identifier"] - } - }, - "uniqueConstraints": { - "verification_tokens_token_unique": { - "name": "verification_tokens_token_unique", - "columns": ["token"] - } - }, - "checkConstraint": {} - }, - "videos": { - "name": "videos", - "columns": { - "id": { - "name": "id", - "type": "varchar(15)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "ownerId": { - "name": "ownerId", - "type": "varchar(15)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "'My Video'" - }, - "awsRegion": { - "name": "awsRegion", - "type": "varchar(255)", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "awsBucket": { - "name": "awsBucket", - "type": "varchar(255)", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "bucket": { - "name": "bucket", - "type": "varchar(15)", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "metadata": { - "name": "metadata", - "type": "json", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "public": { - "name": "public", - "type": "boolean", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": true - }, - "password": { - "name": "password", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "videoStartTime": { - "name": "videoStartTime", - "type": "varchar(255)", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "audioStartTime": { - "name": "audioStartTime", - "type": "varchar(255)", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "xStreamInfo": { - "name": "xStreamInfo", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "jobId": { - "name": "jobId", - "type": "varchar(255)", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "jobStatus": { - "name": "jobStatus", - "type": "varchar(255)", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "isScreenshot": { - "name": "isScreenshot", - "type": "boolean", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": false - }, - "skipProcessing": { - "name": "skipProcessing", - "type": "boolean", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": false - }, - "transcriptionStatus": { - "name": "transcriptionStatus", - "type": "varchar(255)", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "createdAt": { - "name": "createdAt", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "(now())" - }, - "updatedAt": { - "name": "updatedAt", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "onUpdate": true, - "default": "(now())" - }, - "source": { - "name": "source", - "type": "json", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "('{\"type\":\"MediaConvert\"}')" - }, - "folderId": { - "name": "folderId", - "type": "varchar(15)", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "id_idx": { - "name": "id_idx", - "columns": ["id"], - "isUnique": false - }, - "owner_id_idx": { - "name": "owner_id_idx", - "columns": ["ownerId"], - "isUnique": false - }, - "is_public_idx": { - "name": "is_public_idx", - "columns": ["public"], - "isUnique": false - }, - "folder_id_idx": { - "name": "folder_id_idx", - "columns": ["folderId"], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": { - "videos_id": { - "name": "videos_id", - "columns": ["id"] - } - }, - "uniqueConstraints": { - "videos_id_unique": { - "name": "videos_id_unique", - "columns": ["id"] - } - }, - "checkConstraint": {} - } - }, - "views": {}, - "_meta": { - "schemas": {}, - "tables": {}, - "columns": {} - }, - "internal": { - "tables": {}, - "indexes": {} - } -} + "version": "5", + "dialect": "mysql", + "id": "a2a4aef5-93f0-458d-8084-58dd48d1e5be", + "prevId": "6dee9a50-52c1-4900-a05d-b3fa7f6fcb27", + "tables": { + "accounts": { + "name": "accounts", + "columns": { + "id": { + "name": "id", + "type": "varchar(15)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "userId": { + "name": "userId", + "type": "varchar(15)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "type": { + "name": "type", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "provider": { + "name": "provider", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "providerAccountId": { + "name": "providerAccountId", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "access_token": { + "name": "access_token", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "expires_in": { + "name": "expires_in", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "id_token": { + "name": "id_token", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "refresh_token": { + "name": "refresh_token", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "refresh_token_expires_in": { + "name": "refresh_token_expires_in", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "scope": { + "name": "scope", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "token_type": { + "name": "token_type", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "onUpdate": true, + "default": "(now())" + }, + "tempColumn": { + "name": "tempColumn", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "user_id_idx": { + "name": "user_id_idx", + "columns": [ + "userId" + ], + "isUnique": false + }, + "provider_account_id_idx": { + "name": "provider_account_id_idx", + "columns": [ + "providerAccountId" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "accounts_id": { + "name": "accounts_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": { + "accounts_id_unique": { + "name": "accounts_id_unique", + "columns": [ + "id" + ] + } + }, + "checkConstraint": {} + }, + "auth_api_keys": { + "name": "auth_api_keys", + "columns": { + "id": { + "name": "id", + "type": "varchar(36)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "userId": { + "name": "userId", + "type": "varchar(15)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "auth_api_keys_id": { + "name": "auth_api_keys_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": { + "auth_api_keys_id_unique": { + "name": "auth_api_keys_id_unique", + "columns": [ + "id" + ] + } + }, + "checkConstraint": {} + }, + "comments": { + "name": "comments", + "columns": { + "id": { + "name": "id", + "type": "varchar(15)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "type": { + "name": "type", + "type": "varchar(6)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "content": { + "name": "content", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "timestamp": { + "name": "timestamp", + "type": "float", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "authorId": { + "name": "authorId", + "type": "varchar(15)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "videoId": { + "name": "videoId", + "type": "varchar(15)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "onUpdate": true, + "default": "(now())" + }, + "parentCommentId": { + "name": "parentCommentId", + "type": "varchar(15)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "video_id_idx": { + "name": "video_id_idx", + "columns": [ + "videoId" + ], + "isUnique": false + }, + "author_id_idx": { + "name": "author_id_idx", + "columns": [ + "authorId" + ], + "isUnique": false + }, + "parent_comment_id_idx": { + "name": "parent_comment_id_idx", + "columns": [ + "parentCommentId" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "comments_id": { + "name": "comments_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": { + "comments_id_unique": { + "name": "comments_id_unique", + "columns": [ + "id" + ] + } + }, + "checkConstraint": {} + }, + "folders": { + "name": "folders", + "columns": { + "id": { + "name": "id", + "type": "varchar(15)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "color": { + "name": "color", + "type": "varchar(16)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'normal'" + }, + "organizationId": { + "name": "organizationId", + "type": "varchar(15)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "createdById": { + "name": "createdById", + "type": "varchar(15)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "parentId": { + "name": "parentId", + "type": "varchar(15)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "spaceId": { + "name": "spaceId", + "type": "varchar(15)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "onUpdate": true, + "default": "(now())" + } + }, + "indexes": { + "organization_id_idx": { + "name": "organization_id_idx", + "columns": [ + "organizationId" + ], + "isUnique": false + }, + "created_by_id_idx": { + "name": "created_by_id_idx", + "columns": [ + "createdById" + ], + "isUnique": false + }, + "parent_id_idx": { + "name": "parent_id_idx", + "columns": [ + "parentId" + ], + "isUnique": false + }, + "space_id_idx": { + "name": "space_id_idx", + "columns": [ + "spaceId" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "folders_id": { + "name": "folders_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": { + "folders_id_unique": { + "name": "folders_id_unique", + "columns": [ + "id" + ] + } + }, + "checkConstraint": {} + }, + "notifications": { + "name": "notifications", + "columns": { + "id": { + "name": "id", + "type": "varchar(15)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "orgId": { + "name": "orgId", + "type": "varchar(15)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "recipientId": { + "name": "recipientId", + "type": "varchar(15)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "type": { + "name": "type", + "type": "varchar(10)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "data": { + "name": "data", + "type": "json", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "readAt": { + "name": "readAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + } + }, + "indexes": { + "recipient_id_idx": { + "name": "recipient_id_idx", + "columns": [ + "recipientId" + ], + "isUnique": false + }, + "org_id_idx": { + "name": "org_id_idx", + "columns": [ + "orgId" + ], + "isUnique": false + }, + "type_idx": { + "name": "type_idx", + "columns": [ + "type" + ], + "isUnique": false + }, + "read_at_idx": { + "name": "read_at_idx", + "columns": [ + "readAt" + ], + "isUnique": false + }, + "created_at_idx": { + "name": "created_at_idx", + "columns": [ + "createdAt" + ], + "isUnique": false + }, + "recipient_read_idx": { + "name": "recipient_read_idx", + "columns": [ + "recipientId", + "readAt" + ], + "isUnique": false + }, + "recipient_created_idx": { + "name": "recipient_created_idx", + "columns": [ + "recipientId", + "createdAt" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "notifications_id": { + "name": "notifications_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": { + "notifications_id_unique": { + "name": "notifications_id_unique", + "columns": [ + "id" + ] + } + }, + "checkConstraint": {} + }, + "organization_invites": { + "name": "organization_invites", + "columns": { + "id": { + "name": "id", + "type": "varchar(15)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "organizationId": { + "name": "organizationId", + "type": "varchar(15)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "invitedEmail": { + "name": "invitedEmail", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "invitedByUserId": { + "name": "invitedByUserId", + "type": "varchar(15)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "role": { + "name": "role", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "status": { + "name": "status", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'pending'" + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "onUpdate": true, + "default": "(now())" + }, + "expiresAt": { + "name": "expiresAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "organization_id_idx": { + "name": "organization_id_idx", + "columns": [ + "organizationId" + ], + "isUnique": false + }, + "invited_email_idx": { + "name": "invited_email_idx", + "columns": [ + "invitedEmail" + ], + "isUnique": false + }, + "invited_by_user_id_idx": { + "name": "invited_by_user_id_idx", + "columns": [ + "invitedByUserId" + ], + "isUnique": false + }, + "status_idx": { + "name": "status_idx", + "columns": [ + "status" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "organization_invites_id": { + "name": "organization_invites_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": { + "organization_invites_id_unique": { + "name": "organization_invites_id_unique", + "columns": [ + "id" + ] + } + }, + "checkConstraint": {} + }, + "organization_members": { + "name": "organization_members", + "columns": { + "id": { + "name": "id", + "type": "varchar(15)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "userId": { + "name": "userId", + "type": "varchar(15)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "organizationId": { + "name": "organizationId", + "type": "varchar(15)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "role": { + "name": "role", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "onUpdate": true, + "default": "(now())" + } + }, + "indexes": { + "user_id_idx": { + "name": "user_id_idx", + "columns": [ + "userId" + ], + "isUnique": false + }, + "organization_id_idx": { + "name": "organization_id_idx", + "columns": [ + "organizationId" + ], + "isUnique": false + }, + "user_id_organization_id_idx": { + "name": "user_id_organization_id_idx", + "columns": [ + "userId", + "organizationId" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "organization_members_id": { + "name": "organization_members_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": { + "organization_members_id_unique": { + "name": "organization_members_id_unique", + "columns": [ + "id" + ] + } + }, + "checkConstraint": {} + }, + "organizations": { + "name": "organizations", + "columns": { + "id": { + "name": "id", + "type": "varchar(15)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "ownerId": { + "name": "ownerId", + "type": "varchar(15)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "metadata": { + "name": "metadata", + "type": "json", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "allowedEmailDomain": { + "name": "allowedEmailDomain", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "customDomain": { + "name": "customDomain", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "domainVerified": { + "name": "domainVerified", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "iconUrl": { + "name": "iconUrl", + "type": "varchar(1024)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "onUpdate": true, + "default": "(now())" + }, + "workosOrganizationId": { + "name": "workosOrganizationId", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "workosConnectionId": { + "name": "workosConnectionId", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "owner_id_idx": { + "name": "owner_id_idx", + "columns": [ + "ownerId" + ], + "isUnique": false + }, + "custom_domain_idx": { + "name": "custom_domain_idx", + "columns": [ + "customDomain" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "organizations_id": { + "name": "organizations_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": { + "organizations_id_unique": { + "name": "organizations_id_unique", + "columns": [ + "id" + ] + } + }, + "checkConstraint": {} + }, + "s3_buckets": { + "name": "s3_buckets", + "columns": { + "id": { + "name": "id", + "type": "varchar(15)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "ownerId": { + "name": "ownerId", + "type": "varchar(15)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "region": { + "name": "region", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "endpoint": { + "name": "endpoint", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "bucketName": { + "name": "bucketName", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "accessKeyId": { + "name": "accessKeyId", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "secretAccessKey": { + "name": "secretAccessKey", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "provider": { + "name": "provider", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "('aws')" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "s3_buckets_id": { + "name": "s3_buckets_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": { + "s3_buckets_id_unique": { + "name": "s3_buckets_id_unique", + "columns": [ + "id" + ] + } + }, + "checkConstraint": {} + }, + "sessions": { + "name": "sessions", + "columns": { + "id": { + "name": "id", + "type": "varchar(15)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "sessionToken": { + "name": "sessionToken", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "userId": { + "name": "userId", + "type": "varchar(15)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "expires": { + "name": "expires", + "type": "datetime", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "onUpdate": true, + "default": "(now())" + } + }, + "indexes": { + "session_token_idx": { + "name": "session_token_idx", + "columns": [ + "sessionToken" + ], + "isUnique": true + }, + "user_id_idx": { + "name": "user_id_idx", + "columns": [ + "userId" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "sessions_id": { + "name": "sessions_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": { + "sessions_id_unique": { + "name": "sessions_id_unique", + "columns": [ + "id" + ] + }, + "sessions_sessionToken_unique": { + "name": "sessions_sessionToken_unique", + "columns": [ + "sessionToken" + ] + } + }, + "checkConstraint": {} + }, + "shared_videos": { + "name": "shared_videos", + "columns": { + "id": { + "name": "id", + "type": "varchar(15)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "videoId": { + "name": "videoId", + "type": "varchar(15)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "organizationId": { + "name": "organizationId", + "type": "varchar(15)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "sharedByUserId": { + "name": "sharedByUserId", + "type": "varchar(15)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "sharedAt": { + "name": "sharedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + } + }, + "indexes": { + "video_id_idx": { + "name": "video_id_idx", + "columns": [ + "videoId" + ], + "isUnique": false + }, + "organization_id_idx": { + "name": "organization_id_idx", + "columns": [ + "organizationId" + ], + "isUnique": false + }, + "shared_by_user_id_idx": { + "name": "shared_by_user_id_idx", + "columns": [ + "sharedByUserId" + ], + "isUnique": false + }, + "video_id_organization_id_idx": { + "name": "video_id_organization_id_idx", + "columns": [ + "videoId", + "organizationId" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "shared_videos_id": { + "name": "shared_videos_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": { + "shared_videos_id_unique": { + "name": "shared_videos_id_unique", + "columns": [ + "id" + ] + } + }, + "checkConstraint": {} + }, + "space_members": { + "name": "space_members", + "columns": { + "id": { + "name": "id", + "type": "varchar(15)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "spaceId": { + "name": "spaceId", + "type": "varchar(15)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "userId": { + "name": "userId", + "type": "varchar(15)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "role": { + "name": "role", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'member'" + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "onUpdate": true, + "default": "(now())" + } + }, + "indexes": { + "space_id_idx": { + "name": "space_id_idx", + "columns": [ + "spaceId" + ], + "isUnique": false + }, + "user_id_idx": { + "name": "user_id_idx", + "columns": [ + "userId" + ], + "isUnique": false + }, + "space_id_user_id_idx": { + "name": "space_id_user_id_idx", + "columns": [ + "spaceId", + "userId" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "space_members_id": { + "name": "space_members_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": { + "space_members_id_unique": { + "name": "space_members_id_unique", + "columns": [ + "id" + ] + } + }, + "checkConstraint": {} + }, + "space_videos": { + "name": "space_videos", + "columns": { + "id": { + "name": "id", + "type": "varchar(15)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "spaceId": { + "name": "spaceId", + "type": "varchar(15)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "folderId": { + "name": "folderId", + "type": "varchar(15)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "videoId": { + "name": "videoId", + "type": "varchar(15)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "addedById": { + "name": "addedById", + "type": "varchar(15)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "addedAt": { + "name": "addedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + } + }, + "indexes": { + "space_id_idx": { + "name": "space_id_idx", + "columns": [ + "spaceId" + ], + "isUnique": false + }, + "folder_id_idx": { + "name": "folder_id_idx", + "columns": [ + "folderId" + ], + "isUnique": false + }, + "video_id_idx": { + "name": "video_id_idx", + "columns": [ + "videoId" + ], + "isUnique": false + }, + "added_by_id_idx": { + "name": "added_by_id_idx", + "columns": [ + "addedById" + ], + "isUnique": false + }, + "space_id_video_id_idx": { + "name": "space_id_video_id_idx", + "columns": [ + "spaceId", + "videoId" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "space_videos_id": { + "name": "space_videos_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": { + "space_videos_id_unique": { + "name": "space_videos_id_unique", + "columns": [ + "id" + ] + } + }, + "checkConstraint": {} + }, + "spaces": { + "name": "spaces", + "columns": { + "id": { + "name": "id", + "type": "varchar(15)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "primary": { + "name": "primary", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "organizationId": { + "name": "organizationId", + "type": "varchar(15)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "createdById": { + "name": "createdById", + "type": "varchar(15)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "iconUrl": { + "name": "iconUrl", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "description": { + "name": "description", + "type": "varchar(1000)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "onUpdate": true, + "default": "(now())" + }, + "privacy": { + "name": "privacy", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'Private'" + } + }, + "indexes": { + "organization_id_idx": { + "name": "organization_id_idx", + "columns": [ + "organizationId" + ], + "isUnique": false + }, + "created_by_id_idx": { + "name": "created_by_id_idx", + "columns": [ + "createdById" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "spaces_id": { + "name": "spaces_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": { + "spaces_id_unique": { + "name": "spaces_id_unique", + "columns": [ + "id" + ] + } + }, + "checkConstraint": {} + }, + "users": { + "name": "users", + "columns": { + "id": { + "name": "id", + "type": "varchar(15)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "lastName": { + "name": "lastName", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "email": { + "name": "email", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "emailVerified": { + "name": "emailVerified", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "image": { + "name": "image", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "stripeCustomerId": { + "name": "stripeCustomerId", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "stripeSubscriptionId": { + "name": "stripeSubscriptionId", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "thirdPartyStripeSubscriptionId": { + "name": "thirdPartyStripeSubscriptionId", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "stripeSubscriptionStatus": { + "name": "stripeSubscriptionStatus", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "stripeSubscriptionPriceId": { + "name": "stripeSubscriptionPriceId", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "preferences": { + "name": "preferences", + "type": "json", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "('null')" + }, + "activeOrganizationId": { + "name": "activeOrganizationId", + "type": "varchar(15)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "onUpdate": true, + "default": "(now())" + }, + "onboarding_completed_at": { + "name": "onboarding_completed_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "customBucket": { + "name": "customBucket", + "type": "varchar(15)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "inviteQuota": { + "name": "inviteQuota", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 1 + } + }, + "indexes": { + "email_idx": { + "name": "email_idx", + "columns": [ + "email" + ], + "isUnique": true + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "users_id": { + "name": "users_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": { + "users_id_unique": { + "name": "users_id_unique", + "columns": [ + "id" + ] + }, + "users_email_unique": { + "name": "users_email_unique", + "columns": [ + "email" + ] + } + }, + "checkConstraint": {} + }, + "verification_tokens": { + "name": "verification_tokens", + "columns": { + "identifier": { + "name": "identifier", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "token": { + "name": "token", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "expires": { + "name": "expires", + "type": "datetime", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "onUpdate": true, + "default": "(now())" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "verification_tokens_identifier": { + "name": "verification_tokens_identifier", + "columns": [ + "identifier" + ] + } + }, + "uniqueConstraints": { + "verification_tokens_token_unique": { + "name": "verification_tokens_token_unique", + "columns": [ + "token" + ] + } + }, + "checkConstraint": {} + }, + "videos": { + "name": "videos", + "columns": { + "id": { + "name": "id", + "type": "varchar(15)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "ownerId": { + "name": "ownerId", + "type": "varchar(15)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'My Video'" + }, + "bucket": { + "name": "bucket", + "type": "varchar(15)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "duration": { + "name": "duration", + "type": "float", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "width": { + "name": "width", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "height": { + "name": "height", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "fps": { + "name": "fps", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "metadata": { + "name": "metadata", + "type": "json", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "public": { + "name": "public", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": true + }, + "transcriptionStatus": { + "name": "transcriptionStatus", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "source": { + "name": "source", + "type": "json", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "('{\"type\":\"MediaConvert\"}')" + }, + "folderId": { + "name": "folderId", + "type": "varchar(15)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "onUpdate": true, + "default": "(now())" + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "xStreamInfo": { + "name": "xStreamInfo", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "isScreenshot": { + "name": "isScreenshot", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "awsRegion": { + "name": "awsRegion", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "awsBucket": { + "name": "awsBucket", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "videoStartTime": { + "name": "videoStartTime", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "audioStartTime": { + "name": "audioStartTime", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "jobId": { + "name": "jobId", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "jobStatus": { + "name": "jobStatus", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "skipProcessing": { + "name": "skipProcessing", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + } + }, + "indexes": { + "id_idx": { + "name": "id_idx", + "columns": [ + "id" + ], + "isUnique": false + }, + "owner_id_idx": { + "name": "owner_id_idx", + "columns": [ + "ownerId" + ], + "isUnique": false + }, + "is_public_idx": { + "name": "is_public_idx", + "columns": [ + "public" + ], + "isUnique": false + }, + "folder_id_idx": { + "name": "folder_id_idx", + "columns": [ + "folderId" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "videos_id": { + "name": "videos_id", + "columns": [ + "id" + ] + } + }, + "uniqueConstraints": { + "videos_id_unique": { + "name": "videos_id_unique", + "columns": [ + "id" + ] + } + }, + "checkConstraint": {} + } + }, + "views": {}, + "_meta": { + "schemas": {}, + "tables": {}, + "columns": {} + }, + "internal": { + "tables": {}, + "indexes": {} + } +} \ No newline at end of file diff --git a/packages/database/migrations/meta/_journal.json b/packages/database/migrations/meta/_journal.json index 808fe48f79..8c71a23a99 100644 --- a/packages/database/migrations/meta/_journal.json +++ b/packages/database/migrations/meta/_journal.json @@ -1,62 +1,69 @@ { - "version": "5", - "dialect": "mysql", - "entries": [ - { - "idx": 0, - "version": "5", - "when": 1743020179593, - "tag": "0000_brown_sunfire", - "breakpoints": true - }, - { - "idx": 1, - "version": "5", - "when": 1749268354138, - "tag": "0001_white_young_avengers", - "breakpoints": true - }, - { - "idx": 2, - "version": "5", - "when": 1750935538683, - "tag": "0002_dusty_maginty", - "breakpoints": true - }, - { - "idx": 3, - "version": "5", - "when": 1751274435418, - "tag": "0003_outstanding_kylun", - "breakpoints": true - }, - { - "idx": 4, - "version": "5", - "when": 1751299325634, - "tag": "0004_optimal_eddie_brock", - "breakpoints": true - }, - { - "idx": 5, - "version": "5", - "when": 1751979972128, - "tag": "0005_graceful_fenris", - "breakpoints": true - }, - { - "idx": 6, - "version": "5", - "when": 1751982995648, - "tag": "0006_woozy_jamie_braddock", - "breakpoints": true - }, - { - "idx": 7, - "version": "5", - "when": 1754314124918, - "tag": "0007_cheerful_rocket_raccoon", - "breakpoints": true - } - ] -} + "version": "5", + "dialect": "mysql", + "entries": [ + { + "idx": 0, + "version": "5", + "when": 1743020179593, + "tag": "0000_brown_sunfire", + "breakpoints": true + }, + { + "idx": 1, + "version": "5", + "when": 1749268354138, + "tag": "0001_white_young_avengers", + "breakpoints": true + }, + { + "idx": 2, + "version": "5", + "when": 1750935538683, + "tag": "0002_dusty_maginty", + "breakpoints": true + }, + { + "idx": 3, + "version": "5", + "when": 1751274435418, + "tag": "0003_outstanding_kylun", + "breakpoints": true + }, + { + "idx": 4, + "version": "5", + "when": 1751299325634, + "tag": "0004_optimal_eddie_brock", + "breakpoints": true + }, + { + "idx": 5, + "version": "5", + "when": 1751979972128, + "tag": "0005_graceful_fenris", + "breakpoints": true + }, + { + "idx": 6, + "version": "5", + "when": 1751982995648, + "tag": "0006_woozy_jamie_braddock", + "breakpoints": true + }, + { + "idx": 7, + "version": "5", + "when": 1754314124918, + "tag": "0007_cheerful_rocket_raccoon", + "breakpoints": true + }, + { + "idx": 8, + "version": "5", + "when": 1756276562880, + "tag": "0008_fixed_deathbird", + "breakpoints": true + } + ] +} \ No newline at end of file From 3fe3644c48d68001cbfa95203100383109515b26 Mon Sep 17 00:00:00 2001 From: mogita Date: Wed, 27 Aug 2025 17:15:13 +0800 Subject: [PATCH 03/12] build: setup required env vars for building --- .github/workflows/docker-build-web.yml | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/.github/workflows/docker-build-web.yml b/.github/workflows/docker-build-web.yml index 85dfa83197..667e34d3af 100644 --- a/.github/workflows/docker-build-web.yml +++ b/.github/workflows/docker-build-web.yml @@ -38,6 +38,18 @@ jobs: echo "NEXT_PUBLIC_DOCKER_BUILD=true" >> .env echo "NEXT_PUBLIC_CAP_AWS_BUCKET=capso" >> .env echo "NEXT_PUBLIC_CAP_AWS_REGION=us-east-1" >> .env + # Add required build-time environment variables + echo "DATABASE_URL=mysql://build:build@build:3306/build" >> .env + echo "CAP_AWS_BUCKET=build-bucket" >> .env + echo "CAP_AWS_REGION=us-east-1" >> .env + echo "CAP_AWS_ACCESS_KEY=build-access-key" >> .env + echo "CAP_AWS_SECRET_KEY=build-secret-key" >> .env + echo "NEXTAUTH_SECRET=build-nextauth-secret-placeholder-32-chars" >> .env + echo "NEXTAUTH_URL=https://build.placeholder.com" >> .env + echo "CAP_AWS_ENDPOINT=https://build.placeholder.com" >> .env + echo "S3_PUBLIC_ENDPOINT=https://build.placeholder.com" >> .env + echo "S3_INTERNAL_ENDPOINT=https://build.placeholder.com" >> .env + echo "NEXT_PUBLIC_IS_CAP=true" >> .env cat .env - name: Login to GitHub Container Registry @@ -58,6 +70,18 @@ jobs: outputs: type=image,name=ghcr.io/${{ github.repository_owner }}/cap-web,push-by-digest=true cache-from: type=gha,scope=buildx-${{ matrix.platform }} cache-to: type=gha,mode=max,scope=buildx-${{ matrix.platform }} + build-args: | + DATABASE_URL=mysql://build:build@build:3306/build + CAP_AWS_BUCKET=build-bucket + CAP_AWS_REGION=us-east-1 + CAP_AWS_ACCESS_KEY=build-access-key + CAP_AWS_SECRET_KEY=build-secret-key + NEXTAUTH_SECRET=build-nextauth-secret-placeholder-32-chars + NEXTAUTH_URL=https://build.placeholder.com + CAP_AWS_ENDPOINT=https://build.placeholder.com + S3_PUBLIC_ENDPOINT=https://build.placeholder.com + S3_INTERNAL_ENDPOINT=https://build.placeholder.com + NEXT_PUBLIC_IS_CAP=true - name: Export Digest run: | From 925d33ac455aa578713fa1667a826beaa93e1d19 Mon Sep 17 00:00:00 2001 From: mogita Date: Wed, 27 Aug 2025 17:59:08 +0800 Subject: [PATCH 04/12] chore: remove non-existent migration record --- .../database/migrations/meta/_journal.json | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/packages/database/migrations/meta/_journal.json b/packages/database/migrations/meta/_journal.json index 8c71a23a99..d62e6be41a 100644 --- a/packages/database/migrations/meta/_journal.json +++ b/packages/database/migrations/meta/_journal.json @@ -52,18 +52,11 @@ "breakpoints": true }, { - "idx": 7, - "version": "5", - "when": 1754314124918, - "tag": "0007_cheerful_rocket_raccoon", - "breakpoints": true - }, - { - "idx": 8, - "version": "5", - "when": 1756276562880, - "tag": "0008_fixed_deathbird", - "breakpoints": true - } + "idx": 8, + "version": "5", + "when": 1756276562880, + "tag": "0008_fixed_deathbird", + "breakpoints": true + } ] } \ No newline at end of file From d43d9c1c023254a1e4de8c84d3a63bebd2a301e0 Mon Sep 17 00:00:00 2001 From: mogita Date: Thu, 28 Aug 2025 11:09:05 +0800 Subject: [PATCH 05/12] fix: remove NEXT_PUBLIC_IS_CAP from the image --- .github/workflows/docker-build-web.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/docker-build-web.yml b/.github/workflows/docker-build-web.yml index 667e34d3af..4ae43a8a26 100644 --- a/.github/workflows/docker-build-web.yml +++ b/.github/workflows/docker-build-web.yml @@ -49,7 +49,6 @@ jobs: echo "CAP_AWS_ENDPOINT=https://build.placeholder.com" >> .env echo "S3_PUBLIC_ENDPOINT=https://build.placeholder.com" >> .env echo "S3_INTERNAL_ENDPOINT=https://build.placeholder.com" >> .env - echo "NEXT_PUBLIC_IS_CAP=true" >> .env cat .env - name: Login to GitHub Container Registry @@ -81,7 +80,6 @@ jobs: CAP_AWS_ENDPOINT=https://build.placeholder.com S3_PUBLIC_ENDPOINT=https://build.placeholder.com S3_INTERNAL_ENDPOINT=https://build.placeholder.com - NEXT_PUBLIC_IS_CAP=true - name: Export Digest run: | From 95a5a602f37280f5e3f4c9c6594cdc1b22b44613 Mon Sep 17 00:00:00 2001 From: mogita Date: Thu, 28 Aug 2025 15:34:03 +0800 Subject: [PATCH 06/12] feat: add back the allowed domain restriction on signup --- packages/database/auth/auth-options.tsx | 32 +++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/packages/database/auth/auth-options.tsx b/packages/database/auth/auth-options.tsx index 85e0961b2a..31f797e93c 100644 --- a/packages/database/auth/auth-options.tsx +++ b/packages/database/auth/auth-options.tsx @@ -14,6 +14,7 @@ import { dub } from "../dub"; import { sendEmail } from "../emails/config"; import { nanoId } from "../helpers"; import { organizationMembers, organizations, users } from "../schema"; +import { isEmailAllowedForSignup } from "./domain-utils"; import { DrizzleAdapter } from "./drizzle-adapter"; export const config = { @@ -189,6 +190,37 @@ export const authOptions = (): NextAuthOptions => { }, }, callbacks: { + async signIn({ user, email, credentials }) { + const allowedDomains = serverEnv().CAP_ALLOWED_SIGNUP_DOMAINS; + if (!allowedDomains) return true; + + // Get email from either user object (OAuth) or email parameter (email provider) + const userEmail = + user?.email || + (typeof email === "string" + ? email + : typeof credentials?.email === "string" + ? credentials.email + : null); + if (!userEmail || typeof userEmail !== "string") return true; + + const [existingUser] = await db() + .select() + .from(users) + .where(eq(users.email, userEmail)) + .limit(1); + + // Only apply domain restrictions for new users, existing ones can always sign in + if ( + !existingUser && + !isEmailAllowedForSignup(userEmail, allowedDomains) + ) { + console.warn(`Signup blocked for email domain: ${userEmail}`); + return false; + } + + return true; + }, async session({ token, session }) { if (!session.user) return session; From 322702f0b847d106a22de27f8f39879040689ae5 Mon Sep 17 00:00:00 2001 From: mogita Date: Thu, 28 Aug 2025 17:34:24 +0800 Subject: [PATCH 07/12] feat: load screenshot and thumbnails by signed urls --- apps/web/app/api/screenshot/route.ts | 8 +------- apps/web/app/api/thumbnail/route.ts | 26 ++++++-------------------- 2 files changed, 7 insertions(+), 27 deletions(-) diff --git a/apps/web/app/api/screenshot/route.ts b/apps/web/app/api/screenshot/route.ts index 4fd0c5ff05..00e1d0bda7 100644 --- a/apps/web/app/api/screenshot/route.ts +++ b/apps/web/app/api/screenshot/route.ts @@ -1,8 +1,6 @@ import { db } from "@cap/database"; import { getCurrentUser } from "@cap/database/auth/session"; import { s3Buckets, videos } from "@cap/database/schema"; -import { serverEnv } from "@cap/env"; -import { S3_BUCKET_URL } from "@cap/utils"; import { eq } from "drizzle-orm"; import type { NextRequest } from "next/server"; import { getHeaders } from "@/utils/helpers"; @@ -90,11 +88,7 @@ export async function GET(request: NextRequest) { let screenshotUrl: string; - if (video.awsBucket !== serverEnv().CAP_AWS_BUCKET) { - screenshotUrl = await bucketProvider.getSignedObjectUrl(screenshot.Key!); - } else { - screenshotUrl = `${S3_BUCKET_URL}/${screenshot.Key}`; - } + screenshotUrl = await bucketProvider.getSignedObjectUrl(screenshot.Key!); return new Response(JSON.stringify({ url: screenshotUrl }), { status: 200, diff --git a/apps/web/app/api/thumbnail/route.ts b/apps/web/app/api/thumbnail/route.ts index 2e8da7b177..8f33bded18 100644 --- a/apps/web/app/api/thumbnail/route.ts +++ b/apps/web/app/api/thumbnail/route.ts @@ -1,7 +1,5 @@ import { db } from "@cap/database"; import { s3Buckets, videos } from "@cap/database/schema"; -import { serverEnv } from "@cap/env"; -import { S3_BUCKET_URL } from "@cap/utils"; import { eq } from "drizzle-orm"; import type { NextRequest } from "next/server"; import { getHeaders } from "@/utils/helpers"; @@ -58,19 +56,7 @@ export async function GET(request: NextRequest) { ); } - const { video } = result; const prefix = `${userId}/${videoId}/`; - - let thumbnailUrl: string; - - if (!result.bucket || video.awsBucket === serverEnv().CAP_AWS_BUCKET) { - thumbnailUrl = `${S3_BUCKET_URL}/${prefix}screenshot/screen-capture.jpg`; - return new Response(JSON.stringify({ screen: thumbnailUrl }), { - status: 200, - headers: getHeaders(origin), - }); - } - const bucketProvider = await createBucketProvider(result.bucket); try { @@ -96,7 +82,12 @@ export async function GET(request: NextRequest) { ); } - thumbnailUrl = await bucketProvider.getSignedObjectUrl(thumbnailKey); + const thumbnailUrl = await bucketProvider.getSignedObjectUrl(thumbnailKey); + + return new Response(JSON.stringify({ screen: thumbnailUrl }), { + status: 200, + headers: getHeaders(origin), + }); } catch (error) { return new Response( JSON.stringify({ @@ -110,9 +101,4 @@ export async function GET(request: NextRequest) { }, ); } - - return new Response(JSON.stringify({ screen: thumbnailUrl }), { - status: 200, - headers: getHeaders(origin), - }); } From a9b760a6e7ca2fddd0e068e7334e10d9474f1e65 Mon Sep 17 00:00:00 2001 From: mogita Date: Sun, 31 Aug 2025 21:27:15 +0800 Subject: [PATCH 08/12] chore: restore database files --- .../migrations/0008_fixed_deathbird.sql | 4 - .../migrations/meta/0008_snapshot.json | 3690 ++++++++--------- .../database/migrations/meta/_journal.json | 116 +- 3 files changed, 1804 insertions(+), 2006 deletions(-) delete mode 100644 packages/database/migrations/0008_fixed_deathbird.sql diff --git a/packages/database/migrations/0008_fixed_deathbird.sql b/packages/database/migrations/0008_fixed_deathbird.sql deleted file mode 100644 index d460e5b932..0000000000 --- a/packages/database/migrations/0008_fixed_deathbird.sql +++ /dev/null @@ -1,4 +0,0 @@ -ALTER TABLE `videos` ADD `duration` float;--> statement-breakpoint -ALTER TABLE `videos` ADD `width` int;--> statement-breakpoint -ALTER TABLE `videos` ADD `height` int;--> statement-breakpoint -ALTER TABLE `videos` ADD `fps` int; \ No newline at end of file diff --git a/packages/database/migrations/meta/0008_snapshot.json b/packages/database/migrations/meta/0008_snapshot.json index 3cdf67e880..2bdbcef0ec 100644 --- a/packages/database/migrations/meta/0008_snapshot.json +++ b/packages/database/migrations/meta/0008_snapshot.json @@ -1,1946 +1,1748 @@ { - "version": "5", - "dialect": "mysql", - "id": "a2a4aef5-93f0-458d-8084-58dd48d1e5be", - "prevId": "6dee9a50-52c1-4900-a05d-b3fa7f6fcb27", - "tables": { - "accounts": { - "name": "accounts", - "columns": { - "id": { - "name": "id", - "type": "varchar(15)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "userId": { - "name": "userId", - "type": "varchar(15)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "type": { - "name": "type", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "provider": { - "name": "provider", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "providerAccountId": { - "name": "providerAccountId", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "access_token": { - "name": "access_token", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "expires_in": { - "name": "expires_in", - "type": "int", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "id_token": { - "name": "id_token", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "refresh_token": { - "name": "refresh_token", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "refresh_token_expires_in": { - "name": "refresh_token_expires_in", - "type": "int", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "scope": { - "name": "scope", - "type": "varchar(255)", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "token_type": { - "name": "token_type", - "type": "varchar(255)", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "createdAt": { - "name": "createdAt", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "(now())" - }, - "updatedAt": { - "name": "updatedAt", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "onUpdate": true, - "default": "(now())" - }, - "tempColumn": { - "name": "tempColumn", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "user_id_idx": { - "name": "user_id_idx", - "columns": [ - "userId" - ], - "isUnique": false - }, - "provider_account_id_idx": { - "name": "provider_account_id_idx", - "columns": [ - "providerAccountId" - ], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": { - "accounts_id": { - "name": "accounts_id", - "columns": [ - "id" - ] - } - }, - "uniqueConstraints": { - "accounts_id_unique": { - "name": "accounts_id_unique", - "columns": [ - "id" - ] - } - }, - "checkConstraint": {} - }, - "auth_api_keys": { - "name": "auth_api_keys", - "columns": { - "id": { - "name": "id", - "type": "varchar(36)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "userId": { - "name": "userId", - "type": "varchar(15)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "createdAt": { - "name": "createdAt", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "(now())" - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": { - "auth_api_keys_id": { - "name": "auth_api_keys_id", - "columns": [ - "id" - ] - } - }, - "uniqueConstraints": { - "auth_api_keys_id_unique": { - "name": "auth_api_keys_id_unique", - "columns": [ - "id" - ] - } - }, - "checkConstraint": {} - }, - "comments": { - "name": "comments", - "columns": { - "id": { - "name": "id", - "type": "varchar(15)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "type": { - "name": "type", - "type": "varchar(6)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "content": { - "name": "content", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "timestamp": { - "name": "timestamp", - "type": "float", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "authorId": { - "name": "authorId", - "type": "varchar(15)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "videoId": { - "name": "videoId", - "type": "varchar(15)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "createdAt": { - "name": "createdAt", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "(now())" - }, - "updatedAt": { - "name": "updatedAt", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "onUpdate": true, - "default": "(now())" - }, - "parentCommentId": { - "name": "parentCommentId", - "type": "varchar(15)", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "video_id_idx": { - "name": "video_id_idx", - "columns": [ - "videoId" - ], - "isUnique": false - }, - "author_id_idx": { - "name": "author_id_idx", - "columns": [ - "authorId" - ], - "isUnique": false - }, - "parent_comment_id_idx": { - "name": "parent_comment_id_idx", - "columns": [ - "parentCommentId" - ], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": { - "comments_id": { - "name": "comments_id", - "columns": [ - "id" - ] - } - }, - "uniqueConstraints": { - "comments_id_unique": { - "name": "comments_id_unique", - "columns": [ - "id" - ] - } - }, - "checkConstraint": {} - }, - "folders": { - "name": "folders", - "columns": { - "id": { - "name": "id", - "type": "varchar(15)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "color": { - "name": "color", - "type": "varchar(16)", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "'normal'" - }, - "organizationId": { - "name": "organizationId", - "type": "varchar(15)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "createdById": { - "name": "createdById", - "type": "varchar(15)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "parentId": { - "name": "parentId", - "type": "varchar(15)", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "spaceId": { - "name": "spaceId", - "type": "varchar(15)", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "createdAt": { - "name": "createdAt", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "(now())" - }, - "updatedAt": { - "name": "updatedAt", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "onUpdate": true, - "default": "(now())" - } - }, - "indexes": { - "organization_id_idx": { - "name": "organization_id_idx", - "columns": [ - "organizationId" - ], - "isUnique": false - }, - "created_by_id_idx": { - "name": "created_by_id_idx", - "columns": [ - "createdById" - ], - "isUnique": false - }, - "parent_id_idx": { - "name": "parent_id_idx", - "columns": [ - "parentId" - ], - "isUnique": false - }, - "space_id_idx": { - "name": "space_id_idx", - "columns": [ - "spaceId" - ], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": { - "folders_id": { - "name": "folders_id", - "columns": [ - "id" - ] - } - }, - "uniqueConstraints": { - "folders_id_unique": { - "name": "folders_id_unique", - "columns": [ - "id" - ] - } - }, - "checkConstraint": {} - }, - "notifications": { - "name": "notifications", - "columns": { - "id": { - "name": "id", - "type": "varchar(15)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "orgId": { - "name": "orgId", - "type": "varchar(15)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "recipientId": { - "name": "recipientId", - "type": "varchar(15)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "type": { - "name": "type", - "type": "varchar(10)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "data": { - "name": "data", - "type": "json", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "readAt": { - "name": "readAt", - "type": "timestamp", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "createdAt": { - "name": "createdAt", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "(now())" - } - }, - "indexes": { - "recipient_id_idx": { - "name": "recipient_id_idx", - "columns": [ - "recipientId" - ], - "isUnique": false - }, - "org_id_idx": { - "name": "org_id_idx", - "columns": [ - "orgId" - ], - "isUnique": false - }, - "type_idx": { - "name": "type_idx", - "columns": [ - "type" - ], - "isUnique": false - }, - "read_at_idx": { - "name": "read_at_idx", - "columns": [ - "readAt" - ], - "isUnique": false - }, - "created_at_idx": { - "name": "created_at_idx", - "columns": [ - "createdAt" - ], - "isUnique": false - }, - "recipient_read_idx": { - "name": "recipient_read_idx", - "columns": [ - "recipientId", - "readAt" - ], - "isUnique": false - }, - "recipient_created_idx": { - "name": "recipient_created_idx", - "columns": [ - "recipientId", - "createdAt" - ], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": { - "notifications_id": { - "name": "notifications_id", - "columns": [ - "id" - ] - } - }, - "uniqueConstraints": { - "notifications_id_unique": { - "name": "notifications_id_unique", - "columns": [ - "id" - ] - } - }, - "checkConstraint": {} - }, - "organization_invites": { - "name": "organization_invites", - "columns": { - "id": { - "name": "id", - "type": "varchar(15)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "organizationId": { - "name": "organizationId", - "type": "varchar(15)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "invitedEmail": { - "name": "invitedEmail", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "invitedByUserId": { - "name": "invitedByUserId", - "type": "varchar(15)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "role": { - "name": "role", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "status": { - "name": "status", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "'pending'" - }, - "createdAt": { - "name": "createdAt", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "(now())" - }, - "updatedAt": { - "name": "updatedAt", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "onUpdate": true, - "default": "(now())" - }, - "expiresAt": { - "name": "expiresAt", - "type": "timestamp", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "organization_id_idx": { - "name": "organization_id_idx", - "columns": [ - "organizationId" - ], - "isUnique": false - }, - "invited_email_idx": { - "name": "invited_email_idx", - "columns": [ - "invitedEmail" - ], - "isUnique": false - }, - "invited_by_user_id_idx": { - "name": "invited_by_user_id_idx", - "columns": [ - "invitedByUserId" - ], - "isUnique": false - }, - "status_idx": { - "name": "status_idx", - "columns": [ - "status" - ], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": { - "organization_invites_id": { - "name": "organization_invites_id", - "columns": [ - "id" - ] - } - }, - "uniqueConstraints": { - "organization_invites_id_unique": { - "name": "organization_invites_id_unique", - "columns": [ - "id" - ] - } - }, - "checkConstraint": {} - }, - "organization_members": { - "name": "organization_members", - "columns": { - "id": { - "name": "id", - "type": "varchar(15)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "userId": { - "name": "userId", - "type": "varchar(15)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "organizationId": { - "name": "organizationId", - "type": "varchar(15)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "role": { - "name": "role", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "createdAt": { - "name": "createdAt", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "(now())" - }, - "updatedAt": { - "name": "updatedAt", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "onUpdate": true, - "default": "(now())" - } - }, - "indexes": { - "user_id_idx": { - "name": "user_id_idx", - "columns": [ - "userId" - ], - "isUnique": false - }, - "organization_id_idx": { - "name": "organization_id_idx", - "columns": [ - "organizationId" - ], - "isUnique": false - }, - "user_id_organization_id_idx": { - "name": "user_id_organization_id_idx", - "columns": [ - "userId", - "organizationId" - ], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": { - "organization_members_id": { - "name": "organization_members_id", - "columns": [ - "id" - ] - } - }, - "uniqueConstraints": { - "organization_members_id_unique": { - "name": "organization_members_id_unique", - "columns": [ - "id" - ] - } - }, - "checkConstraint": {} - }, - "organizations": { - "name": "organizations", - "columns": { - "id": { - "name": "id", - "type": "varchar(15)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "ownerId": { - "name": "ownerId", - "type": "varchar(15)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "metadata": { - "name": "metadata", - "type": "json", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "allowedEmailDomain": { - "name": "allowedEmailDomain", - "type": "varchar(255)", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "customDomain": { - "name": "customDomain", - "type": "varchar(255)", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "domainVerified": { - "name": "domainVerified", - "type": "timestamp", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "iconUrl": { - "name": "iconUrl", - "type": "varchar(1024)", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "createdAt": { - "name": "createdAt", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "(now())" - }, - "updatedAt": { - "name": "updatedAt", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "onUpdate": true, - "default": "(now())" - }, - "workosOrganizationId": { - "name": "workosOrganizationId", - "type": "varchar(255)", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "workosConnectionId": { - "name": "workosConnectionId", - "type": "varchar(255)", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "owner_id_idx": { - "name": "owner_id_idx", - "columns": [ - "ownerId" - ], - "isUnique": false - }, - "custom_domain_idx": { - "name": "custom_domain_idx", - "columns": [ - "customDomain" - ], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": { - "organizations_id": { - "name": "organizations_id", - "columns": [ - "id" - ] - } - }, - "uniqueConstraints": { - "organizations_id_unique": { - "name": "organizations_id_unique", - "columns": [ - "id" - ] - } - }, - "checkConstraint": {} - }, - "s3_buckets": { - "name": "s3_buckets", - "columns": { - "id": { - "name": "id", - "type": "varchar(15)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "ownerId": { - "name": "ownerId", - "type": "varchar(15)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "region": { - "name": "region", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "endpoint": { - "name": "endpoint", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "bucketName": { - "name": "bucketName", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "accessKeyId": { - "name": "accessKeyId", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "secretAccessKey": { - "name": "secretAccessKey", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "provider": { - "name": "provider", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "('aws')" - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": { - "s3_buckets_id": { - "name": "s3_buckets_id", - "columns": [ - "id" - ] - } - }, - "uniqueConstraints": { - "s3_buckets_id_unique": { - "name": "s3_buckets_id_unique", - "columns": [ - "id" - ] - } - }, - "checkConstraint": {} - }, - "sessions": { - "name": "sessions", - "columns": { - "id": { - "name": "id", - "type": "varchar(15)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "sessionToken": { - "name": "sessionToken", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "userId": { - "name": "userId", - "type": "varchar(15)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "expires": { - "name": "expires", - "type": "datetime", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "(now())" - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "onUpdate": true, - "default": "(now())" - } - }, - "indexes": { - "session_token_idx": { - "name": "session_token_idx", - "columns": [ - "sessionToken" - ], - "isUnique": true - }, - "user_id_idx": { - "name": "user_id_idx", - "columns": [ - "userId" - ], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": { - "sessions_id": { - "name": "sessions_id", - "columns": [ - "id" - ] - } - }, - "uniqueConstraints": { - "sessions_id_unique": { - "name": "sessions_id_unique", - "columns": [ - "id" - ] - }, - "sessions_sessionToken_unique": { - "name": "sessions_sessionToken_unique", - "columns": [ - "sessionToken" - ] - } - }, - "checkConstraint": {} - }, - "shared_videos": { - "name": "shared_videos", - "columns": { - "id": { - "name": "id", - "type": "varchar(15)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "videoId": { - "name": "videoId", - "type": "varchar(15)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "organizationId": { - "name": "organizationId", - "type": "varchar(15)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "sharedByUserId": { - "name": "sharedByUserId", - "type": "varchar(15)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "sharedAt": { - "name": "sharedAt", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "(now())" - } - }, - "indexes": { - "video_id_idx": { - "name": "video_id_idx", - "columns": [ - "videoId" - ], - "isUnique": false - }, - "organization_id_idx": { - "name": "organization_id_idx", - "columns": [ - "organizationId" - ], - "isUnique": false - }, - "shared_by_user_id_idx": { - "name": "shared_by_user_id_idx", - "columns": [ - "sharedByUserId" - ], - "isUnique": false - }, - "video_id_organization_id_idx": { - "name": "video_id_organization_id_idx", - "columns": [ - "videoId", - "organizationId" - ], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": { - "shared_videos_id": { - "name": "shared_videos_id", - "columns": [ - "id" - ] - } - }, - "uniqueConstraints": { - "shared_videos_id_unique": { - "name": "shared_videos_id_unique", - "columns": [ - "id" - ] - } - }, - "checkConstraint": {} - }, - "space_members": { - "name": "space_members", - "columns": { - "id": { - "name": "id", - "type": "varchar(15)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "spaceId": { - "name": "spaceId", - "type": "varchar(15)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "userId": { - "name": "userId", - "type": "varchar(15)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "role": { - "name": "role", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "'member'" - }, - "createdAt": { - "name": "createdAt", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "(now())" - }, - "updatedAt": { - "name": "updatedAt", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "onUpdate": true, - "default": "(now())" - } - }, - "indexes": { - "space_id_idx": { - "name": "space_id_idx", - "columns": [ - "spaceId" - ], - "isUnique": false - }, - "user_id_idx": { - "name": "user_id_idx", - "columns": [ - "userId" - ], - "isUnique": false - }, - "space_id_user_id_idx": { - "name": "space_id_user_id_idx", - "columns": [ - "spaceId", - "userId" - ], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": { - "space_members_id": { - "name": "space_members_id", - "columns": [ - "id" - ] - } - }, - "uniqueConstraints": { - "space_members_id_unique": { - "name": "space_members_id_unique", - "columns": [ - "id" - ] - } - }, - "checkConstraint": {} - }, - "space_videos": { - "name": "space_videos", - "columns": { - "id": { - "name": "id", - "type": "varchar(15)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "spaceId": { - "name": "spaceId", - "type": "varchar(15)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "folderId": { - "name": "folderId", - "type": "varchar(15)", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "videoId": { - "name": "videoId", - "type": "varchar(15)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "addedById": { - "name": "addedById", - "type": "varchar(15)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "addedAt": { - "name": "addedAt", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "(now())" - } - }, - "indexes": { - "space_id_idx": { - "name": "space_id_idx", - "columns": [ - "spaceId" - ], - "isUnique": false - }, - "folder_id_idx": { - "name": "folder_id_idx", - "columns": [ - "folderId" - ], - "isUnique": false - }, - "video_id_idx": { - "name": "video_id_idx", - "columns": [ - "videoId" - ], - "isUnique": false - }, - "added_by_id_idx": { - "name": "added_by_id_idx", - "columns": [ - "addedById" - ], - "isUnique": false - }, - "space_id_video_id_idx": { - "name": "space_id_video_id_idx", - "columns": [ - "spaceId", - "videoId" - ], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": { - "space_videos_id": { - "name": "space_videos_id", - "columns": [ - "id" - ] - } - }, - "uniqueConstraints": { - "space_videos_id_unique": { - "name": "space_videos_id_unique", - "columns": [ - "id" - ] - } - }, - "checkConstraint": {} - }, - "spaces": { - "name": "spaces", - "columns": { - "id": { - "name": "id", - "type": "varchar(15)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "primary": { - "name": "primary", - "type": "boolean", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": false - }, - "name": { - "name": "name", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "organizationId": { - "name": "organizationId", - "type": "varchar(15)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "createdById": { - "name": "createdById", - "type": "varchar(15)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "iconUrl": { - "name": "iconUrl", - "type": "varchar(255)", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "description": { - "name": "description", - "type": "varchar(1000)", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "createdAt": { - "name": "createdAt", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "(now())" - }, - "updatedAt": { - "name": "updatedAt", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "onUpdate": true, - "default": "(now())" - }, - "privacy": { - "name": "privacy", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "'Private'" - } - }, - "indexes": { - "organization_id_idx": { - "name": "organization_id_idx", - "columns": [ - "organizationId" - ], - "isUnique": false - }, - "created_by_id_idx": { - "name": "created_by_id_idx", - "columns": [ - "createdById" - ], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": { - "spaces_id": { - "name": "spaces_id", - "columns": [ - "id" - ] - } - }, - "uniqueConstraints": { - "spaces_id_unique": { - "name": "spaces_id_unique", - "columns": [ - "id" - ] - } - }, - "checkConstraint": {} - }, - "users": { - "name": "users", - "columns": { - "id": { - "name": "id", - "type": "varchar(15)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "varchar(255)", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "lastName": { - "name": "lastName", - "type": "varchar(255)", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "email": { - "name": "email", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "emailVerified": { - "name": "emailVerified", - "type": "timestamp", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "image": { - "name": "image", - "type": "varchar(255)", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "stripeCustomerId": { - "name": "stripeCustomerId", - "type": "varchar(255)", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "stripeSubscriptionId": { - "name": "stripeSubscriptionId", - "type": "varchar(255)", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "thirdPartyStripeSubscriptionId": { - "name": "thirdPartyStripeSubscriptionId", - "type": "varchar(255)", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "stripeSubscriptionStatus": { - "name": "stripeSubscriptionStatus", - "type": "varchar(255)", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "stripeSubscriptionPriceId": { - "name": "stripeSubscriptionPriceId", - "type": "varchar(255)", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "preferences": { - "name": "preferences", - "type": "json", - "primaryKey": false, - "notNull": false, - "autoincrement": false, - "default": "('null')" - }, - "activeOrganizationId": { - "name": "activeOrganizationId", - "type": "varchar(15)", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "(now())" - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "onUpdate": true, - "default": "(now())" - }, - "onboarding_completed_at": { - "name": "onboarding_completed_at", - "type": "timestamp", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "customBucket": { - "name": "customBucket", - "type": "varchar(15)", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "inviteQuota": { - "name": "inviteQuota", - "type": "int", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 1 - } - }, - "indexes": { - "email_idx": { - "name": "email_idx", - "columns": [ - "email" - ], - "isUnique": true - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": { - "users_id": { - "name": "users_id", - "columns": [ - "id" - ] - } - }, - "uniqueConstraints": { - "users_id_unique": { - "name": "users_id_unique", - "columns": [ - "id" - ] - }, - "users_email_unique": { - "name": "users_email_unique", - "columns": [ - "email" - ] - } - }, - "checkConstraint": {} - }, - "verification_tokens": { - "name": "verification_tokens", - "columns": { - "identifier": { - "name": "identifier", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "token": { - "name": "token", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "expires": { - "name": "expires", - "type": "datetime", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "(now())" - }, - "updated_at": { - "name": "updated_at", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "onUpdate": true, - "default": "(now())" - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": { - "verification_tokens_identifier": { - "name": "verification_tokens_identifier", - "columns": [ - "identifier" - ] - } - }, - "uniqueConstraints": { - "verification_tokens_token_unique": { - "name": "verification_tokens_token_unique", - "columns": [ - "token" - ] - } - }, - "checkConstraint": {} - }, - "videos": { - "name": "videos", - "columns": { - "id": { - "name": "id", - "type": "varchar(15)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "ownerId": { - "name": "ownerId", - "type": "varchar(15)", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "varchar(255)", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "'My Video'" - }, - "bucket": { - "name": "bucket", - "type": "varchar(15)", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "duration": { - "name": "duration", - "type": "float", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "width": { - "name": "width", - "type": "int", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "height": { - "name": "height", - "type": "int", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "fps": { - "name": "fps", - "type": "int", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "metadata": { - "name": "metadata", - "type": "json", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "public": { - "name": "public", - "type": "boolean", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": true - }, - "transcriptionStatus": { - "name": "transcriptionStatus", - "type": "varchar(255)", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "source": { - "name": "source", - "type": "json", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "('{\"type\":\"MediaConvert\"}')" - }, - "folderId": { - "name": "folderId", - "type": "varchar(15)", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "createdAt": { - "name": "createdAt", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "(now())" - }, - "updatedAt": { - "name": "updatedAt", - "type": "timestamp", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "onUpdate": true, - "default": "(now())" - }, - "password": { - "name": "password", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "xStreamInfo": { - "name": "xStreamInfo", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "isScreenshot": { - "name": "isScreenshot", - "type": "boolean", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": false - }, - "awsRegion": { - "name": "awsRegion", - "type": "varchar(255)", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "awsBucket": { - "name": "awsBucket", - "type": "varchar(255)", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "videoStartTime": { - "name": "videoStartTime", - "type": "varchar(255)", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "audioStartTime": { - "name": "audioStartTime", - "type": "varchar(255)", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "jobId": { - "name": "jobId", - "type": "varchar(255)", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "jobStatus": { - "name": "jobStatus", - "type": "varchar(255)", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "skipProcessing": { - "name": "skipProcessing", - "type": "boolean", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": false - } - }, - "indexes": { - "id_idx": { - "name": "id_idx", - "columns": [ - "id" - ], - "isUnique": false - }, - "owner_id_idx": { - "name": "owner_id_idx", - "columns": [ - "ownerId" - ], - "isUnique": false - }, - "is_public_idx": { - "name": "is_public_idx", - "columns": [ - "public" - ], - "isUnique": false - }, - "folder_id_idx": { - "name": "folder_id_idx", - "columns": [ - "folderId" - ], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": { - "videos_id": { - "name": "videos_id", - "columns": [ - "id" - ] - } - }, - "uniqueConstraints": { - "videos_id_unique": { - "name": "videos_id_unique", - "columns": [ - "id" - ] - } - }, - "checkConstraint": {} - } - }, - "views": {}, - "_meta": { - "schemas": {}, - "tables": {}, - "columns": {} - }, - "internal": { - "tables": {}, - "indexes": {} - } + "version": "5", + "dialect": "mysql", + "id": "6dee9a50-52c1-4900-a05d-b3fa7f6fcb27", + "prevId": "ccef8ed8-2472-41a3-bf54-900db6ce8b08", + "tables": { + "accounts": { + "name": "accounts", + "columns": { + "id": { + "name": "id", + "type": "varchar(15)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "userId": { + "name": "userId", + "type": "varchar(15)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "type": { + "name": "type", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "provider": { + "name": "provider", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "providerAccountId": { + "name": "providerAccountId", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "access_token": { + "name": "access_token", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "expires_in": { + "name": "expires_in", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "id_token": { + "name": "id_token", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "refresh_token": { + "name": "refresh_token", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "refresh_token_expires_in": { + "name": "refresh_token_expires_in", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "scope": { + "name": "scope", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "token_type": { + "name": "token_type", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "onUpdate": true, + "default": "(now())" + }, + "tempColumn": { + "name": "tempColumn", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "user_id_idx": { + "name": "user_id_idx", + "columns": ["userId"], + "isUnique": false + }, + "provider_account_id_idx": { + "name": "provider_account_id_idx", + "columns": ["providerAccountId"], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "accounts_id": { + "name": "accounts_id", + "columns": ["id"] + } + }, + "uniqueConstraints": { + "accounts_id_unique": { + "name": "accounts_id_unique", + "columns": ["id"] + } + }, + "checkConstraint": {} + }, + "auth_api_keys": { + "name": "auth_api_keys", + "columns": { + "id": { + "name": "id", + "type": "varchar(36)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "userId": { + "name": "userId", + "type": "varchar(15)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "auth_api_keys_id": { + "name": "auth_api_keys_id", + "columns": ["id"] + } + }, + "uniqueConstraints": { + "auth_api_keys_id_unique": { + "name": "auth_api_keys_id_unique", + "columns": ["id"] + } + }, + "checkConstraint": {} + }, + "comments": { + "name": "comments", + "columns": { + "id": { + "name": "id", + "type": "varchar(15)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "type": { + "name": "type", + "type": "varchar(6)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "content": { + "name": "content", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "timestamp": { + "name": "timestamp", + "type": "float", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "authorId": { + "name": "authorId", + "type": "varchar(15)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "videoId": { + "name": "videoId", + "type": "varchar(15)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "onUpdate": true, + "default": "(now())" + }, + "parentCommentId": { + "name": "parentCommentId", + "type": "varchar(15)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "video_id_idx": { + "name": "video_id_idx", + "columns": ["videoId"], + "isUnique": false + }, + "author_id_idx": { + "name": "author_id_idx", + "columns": ["authorId"], + "isUnique": false + }, + "parent_comment_id_idx": { + "name": "parent_comment_id_idx", + "columns": ["parentCommentId"], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "comments_id": { + "name": "comments_id", + "columns": ["id"] + } + }, + "uniqueConstraints": { + "comments_id_unique": { + "name": "comments_id_unique", + "columns": ["id"] + } + }, + "checkConstraint": {} + }, + "folders": { + "name": "folders", + "columns": { + "id": { + "name": "id", + "type": "varchar(15)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "color": { + "name": "color", + "type": "varchar(16)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'normal'" + }, + "organizationId": { + "name": "organizationId", + "type": "varchar(15)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "createdById": { + "name": "createdById", + "type": "varchar(15)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "parentId": { + "name": "parentId", + "type": "varchar(15)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "spaceId": { + "name": "spaceId", + "type": "varchar(15)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "onUpdate": true, + "default": "(now())" + } + }, + "indexes": { + "organization_id_idx": { + "name": "organization_id_idx", + "columns": ["organizationId"], + "isUnique": false + }, + "created_by_id_idx": { + "name": "created_by_id_idx", + "columns": ["createdById"], + "isUnique": false + }, + "parent_id_idx": { + "name": "parent_id_idx", + "columns": ["parentId"], + "isUnique": false + }, + "space_id_idx": { + "name": "space_id_idx", + "columns": ["spaceId"], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "folders_id": { + "name": "folders_id", + "columns": ["id"] + } + }, + "uniqueConstraints": { + "folders_id_unique": { + "name": "folders_id_unique", + "columns": ["id"] + } + }, + "checkConstraint": {} + }, + "notifications": { + "name": "notifications", + "columns": { + "id": { + "name": "id", + "type": "varchar(15)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "orgId": { + "name": "orgId", + "type": "varchar(15)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "recipientId": { + "name": "recipientId", + "type": "varchar(15)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "type": { + "name": "type", + "type": "varchar(10)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "data": { + "name": "data", + "type": "json", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "readAt": { + "name": "readAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + } + }, + "indexes": { + "recipient_id_idx": { + "name": "recipient_id_idx", + "columns": ["recipientId"], + "isUnique": false + }, + "org_id_idx": { + "name": "org_id_idx", + "columns": ["orgId"], + "isUnique": false + }, + "type_idx": { + "name": "type_idx", + "columns": ["type"], + "isUnique": false + }, + "read_at_idx": { + "name": "read_at_idx", + "columns": ["readAt"], + "isUnique": false + }, + "created_at_idx": { + "name": "created_at_idx", + "columns": ["createdAt"], + "isUnique": false + }, + "recipient_read_idx": { + "name": "recipient_read_idx", + "columns": ["recipientId", "readAt"], + "isUnique": false + }, + "recipient_created_idx": { + "name": "recipient_created_idx", + "columns": ["recipientId", "createdAt"], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "notifications_id": { + "name": "notifications_id", + "columns": ["id"] + } + }, + "uniqueConstraints": { + "notifications_id_unique": { + "name": "notifications_id_unique", + "columns": ["id"] + } + }, + "checkConstraint": {} + }, + "organization_invites": { + "name": "organization_invites", + "columns": { + "id": { + "name": "id", + "type": "varchar(15)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "organizationId": { + "name": "organizationId", + "type": "varchar(15)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "invitedEmail": { + "name": "invitedEmail", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "invitedByUserId": { + "name": "invitedByUserId", + "type": "varchar(15)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "role": { + "name": "role", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "status": { + "name": "status", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'pending'" + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "onUpdate": true, + "default": "(now())" + }, + "expiresAt": { + "name": "expiresAt", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "organization_id_idx": { + "name": "organization_id_idx", + "columns": ["organizationId"], + "isUnique": false + }, + "invited_email_idx": { + "name": "invited_email_idx", + "columns": ["invitedEmail"], + "isUnique": false + }, + "invited_by_user_id_idx": { + "name": "invited_by_user_id_idx", + "columns": ["invitedByUserId"], + "isUnique": false + }, + "status_idx": { + "name": "status_idx", + "columns": ["status"], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "organization_invites_id": { + "name": "organization_invites_id", + "columns": ["id"] + } + }, + "uniqueConstraints": { + "organization_invites_id_unique": { + "name": "organization_invites_id_unique", + "columns": ["id"] + } + }, + "checkConstraint": {} + }, + "organization_members": { + "name": "organization_members", + "columns": { + "id": { + "name": "id", + "type": "varchar(15)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "userId": { + "name": "userId", + "type": "varchar(15)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "organizationId": { + "name": "organizationId", + "type": "varchar(15)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "role": { + "name": "role", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "onUpdate": true, + "default": "(now())" + } + }, + "indexes": { + "user_id_idx": { + "name": "user_id_idx", + "columns": ["userId"], + "isUnique": false + }, + "organization_id_idx": { + "name": "organization_id_idx", + "columns": ["organizationId"], + "isUnique": false + }, + "user_id_organization_id_idx": { + "name": "user_id_organization_id_idx", + "columns": ["userId", "organizationId"], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "organization_members_id": { + "name": "organization_members_id", + "columns": ["id"] + } + }, + "uniqueConstraints": { + "organization_members_id_unique": { + "name": "organization_members_id_unique", + "columns": ["id"] + } + }, + "checkConstraint": {} + }, + "organizations": { + "name": "organizations", + "columns": { + "id": { + "name": "id", + "type": "varchar(15)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "ownerId": { + "name": "ownerId", + "type": "varchar(15)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "metadata": { + "name": "metadata", + "type": "json", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "allowedEmailDomain": { + "name": "allowedEmailDomain", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "customDomain": { + "name": "customDomain", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "domainVerified": { + "name": "domainVerified", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "iconUrl": { + "name": "iconUrl", + "type": "varchar(1024)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "onUpdate": true, + "default": "(now())" + }, + "workosOrganizationId": { + "name": "workosOrganizationId", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "workosConnectionId": { + "name": "workosConnectionId", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "owner_id_idx": { + "name": "owner_id_idx", + "columns": ["ownerId"], + "isUnique": false + }, + "custom_domain_idx": { + "name": "custom_domain_idx", + "columns": ["customDomain"], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "organizations_id": { + "name": "organizations_id", + "columns": ["id"] + } + }, + "uniqueConstraints": { + "organizations_id_unique": { + "name": "organizations_id_unique", + "columns": ["id"] + } + }, + "checkConstraint": {} + }, + "s3_buckets": { + "name": "s3_buckets", + "columns": { + "id": { + "name": "id", + "type": "varchar(15)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "ownerId": { + "name": "ownerId", + "type": "varchar(15)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "region": { + "name": "region", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "endpoint": { + "name": "endpoint", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "bucketName": { + "name": "bucketName", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "accessKeyId": { + "name": "accessKeyId", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "secretAccessKey": { + "name": "secretAccessKey", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "provider": { + "name": "provider", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "('aws')" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "s3_buckets_id": { + "name": "s3_buckets_id", + "columns": ["id"] + } + }, + "uniqueConstraints": { + "s3_buckets_id_unique": { + "name": "s3_buckets_id_unique", + "columns": ["id"] + } + }, + "checkConstraint": {} + }, + "sessions": { + "name": "sessions", + "columns": { + "id": { + "name": "id", + "type": "varchar(15)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "sessionToken": { + "name": "sessionToken", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "userId": { + "name": "userId", + "type": "varchar(15)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "expires": { + "name": "expires", + "type": "datetime", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "onUpdate": true, + "default": "(now())" + } + }, + "indexes": { + "session_token_idx": { + "name": "session_token_idx", + "columns": ["sessionToken"], + "isUnique": true + }, + "user_id_idx": { + "name": "user_id_idx", + "columns": ["userId"], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "sessions_id": { + "name": "sessions_id", + "columns": ["id"] + } + }, + "uniqueConstraints": { + "sessions_id_unique": { + "name": "sessions_id_unique", + "columns": ["id"] + }, + "sessions_sessionToken_unique": { + "name": "sessions_sessionToken_unique", + "columns": ["sessionToken"] + } + }, + "checkConstraint": {} + }, + "shared_videos": { + "name": "shared_videos", + "columns": { + "id": { + "name": "id", + "type": "varchar(15)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "videoId": { + "name": "videoId", + "type": "varchar(15)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "organizationId": { + "name": "organizationId", + "type": "varchar(15)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "sharedByUserId": { + "name": "sharedByUserId", + "type": "varchar(15)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "sharedAt": { + "name": "sharedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + } + }, + "indexes": { + "video_id_idx": { + "name": "video_id_idx", + "columns": ["videoId"], + "isUnique": false + }, + "organization_id_idx": { + "name": "organization_id_idx", + "columns": ["organizationId"], + "isUnique": false + }, + "shared_by_user_id_idx": { + "name": "shared_by_user_id_idx", + "columns": ["sharedByUserId"], + "isUnique": false + }, + "video_id_organization_id_idx": { + "name": "video_id_organization_id_idx", + "columns": ["videoId", "organizationId"], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "shared_videos_id": { + "name": "shared_videos_id", + "columns": ["id"] + } + }, + "uniqueConstraints": { + "shared_videos_id_unique": { + "name": "shared_videos_id_unique", + "columns": ["id"] + } + }, + "checkConstraint": {} + }, + "space_members": { + "name": "space_members", + "columns": { + "id": { + "name": "id", + "type": "varchar(15)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "spaceId": { + "name": "spaceId", + "type": "varchar(15)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "userId": { + "name": "userId", + "type": "varchar(15)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "role": { + "name": "role", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'member'" + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "onUpdate": true, + "default": "(now())" + } + }, + "indexes": { + "space_id_idx": { + "name": "space_id_idx", + "columns": ["spaceId"], + "isUnique": false + }, + "user_id_idx": { + "name": "user_id_idx", + "columns": ["userId"], + "isUnique": false + }, + "space_id_user_id_idx": { + "name": "space_id_user_id_idx", + "columns": ["spaceId", "userId"], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "space_members_id": { + "name": "space_members_id", + "columns": ["id"] + } + }, + "uniqueConstraints": { + "space_members_id_unique": { + "name": "space_members_id_unique", + "columns": ["id"] + } + }, + "checkConstraint": {} + }, + "space_videos": { + "name": "space_videos", + "columns": { + "id": { + "name": "id", + "type": "varchar(15)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "spaceId": { + "name": "spaceId", + "type": "varchar(15)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "folderId": { + "name": "folderId", + "type": "varchar(15)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "videoId": { + "name": "videoId", + "type": "varchar(15)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "addedById": { + "name": "addedById", + "type": "varchar(15)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "addedAt": { + "name": "addedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + } + }, + "indexes": { + "space_id_idx": { + "name": "space_id_idx", + "columns": ["spaceId"], + "isUnique": false + }, + "folder_id_idx": { + "name": "folder_id_idx", + "columns": ["folderId"], + "isUnique": false + }, + "video_id_idx": { + "name": "video_id_idx", + "columns": ["videoId"], + "isUnique": false + }, + "added_by_id_idx": { + "name": "added_by_id_idx", + "columns": ["addedById"], + "isUnique": false + }, + "space_id_video_id_idx": { + "name": "space_id_video_id_idx", + "columns": ["spaceId", "videoId"], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "space_videos_id": { + "name": "space_videos_id", + "columns": ["id"] + } + }, + "uniqueConstraints": { + "space_videos_id_unique": { + "name": "space_videos_id_unique", + "columns": ["id"] + } + }, + "checkConstraint": {} + }, + "spaces": { + "name": "spaces", + "columns": { + "id": { + "name": "id", + "type": "varchar(15)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "primary": { + "name": "primary", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "organizationId": { + "name": "organizationId", + "type": "varchar(15)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "createdById": { + "name": "createdById", + "type": "varchar(15)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "iconUrl": { + "name": "iconUrl", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "description": { + "name": "description", + "type": "varchar(1000)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "onUpdate": true, + "default": "(now())" + }, + "privacy": { + "name": "privacy", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'Private'" + } + }, + "indexes": { + "organization_id_idx": { + "name": "organization_id_idx", + "columns": ["organizationId"], + "isUnique": false + }, + "created_by_id_idx": { + "name": "created_by_id_idx", + "columns": ["createdById"], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "spaces_id": { + "name": "spaces_id", + "columns": ["id"] + } + }, + "uniqueConstraints": { + "spaces_id_unique": { + "name": "spaces_id_unique", + "columns": ["id"] + } + }, + "checkConstraint": {} + }, + "users": { + "name": "users", + "columns": { + "id": { + "name": "id", + "type": "varchar(15)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "lastName": { + "name": "lastName", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "email": { + "name": "email", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "emailVerified": { + "name": "emailVerified", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "image": { + "name": "image", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "stripeCustomerId": { + "name": "stripeCustomerId", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "stripeSubscriptionId": { + "name": "stripeSubscriptionId", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "thirdPartyStripeSubscriptionId": { + "name": "thirdPartyStripeSubscriptionId", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "stripeSubscriptionStatus": { + "name": "stripeSubscriptionStatus", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "stripeSubscriptionPriceId": { + "name": "stripeSubscriptionPriceId", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "preferences": { + "name": "preferences", + "type": "json", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "('null')" + }, + "activeOrganizationId": { + "name": "activeOrganizationId", + "type": "varchar(15)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "onUpdate": true, + "default": "(now())" + }, + "onboarding_completed_at": { + "name": "onboarding_completed_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "customBucket": { + "name": "customBucket", + "type": "varchar(15)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "inviteQuota": { + "name": "inviteQuota", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 1 + } + }, + "indexes": { + "email_idx": { + "name": "email_idx", + "columns": ["email"], + "isUnique": true + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "users_id": { + "name": "users_id", + "columns": ["id"] + } + }, + "uniqueConstraints": { + "users_id_unique": { + "name": "users_id_unique", + "columns": ["id"] + }, + "users_email_unique": { + "name": "users_email_unique", + "columns": ["email"] + } + }, + "checkConstraint": {} + }, + "verification_tokens": { + "name": "verification_tokens", + "columns": { + "identifier": { + "name": "identifier", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "token": { + "name": "token", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "expires": { + "name": "expires", + "type": "datetime", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "onUpdate": true, + "default": "(now())" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "verification_tokens_identifier": { + "name": "verification_tokens_identifier", + "columns": ["identifier"] + } + }, + "uniqueConstraints": { + "verification_tokens_token_unique": { + "name": "verification_tokens_token_unique", + "columns": ["token"] + } + }, + "checkConstraint": {} + }, + "videos": { + "name": "videos", + "columns": { + "id": { + "name": "id", + "type": "varchar(15)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "ownerId": { + "name": "ownerId", + "type": "varchar(15)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'My Video'" + }, + "awsRegion": { + "name": "awsRegion", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "awsBucket": { + "name": "awsBucket", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "bucket": { + "name": "bucket", + "type": "varchar(15)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "metadata": { + "name": "metadata", + "type": "json", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "public": { + "name": "public", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": true + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "videoStartTime": { + "name": "videoStartTime", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "audioStartTime": { + "name": "audioStartTime", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "xStreamInfo": { + "name": "xStreamInfo", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "jobId": { + "name": "jobId", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "jobStatus": { + "name": "jobStatus", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "isScreenshot": { + "name": "isScreenshot", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "skipProcessing": { + "name": "skipProcessing", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "transcriptionStatus": { + "name": "transcriptionStatus", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "onUpdate": true, + "default": "(now())" + }, + "source": { + "name": "source", + "type": "json", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "('{\"type\":\"MediaConvert\"}')" + }, + "folderId": { + "name": "folderId", + "type": "varchar(15)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "id_idx": { + "name": "id_idx", + "columns": ["id"], + "isUnique": false + }, + "owner_id_idx": { + "name": "owner_id_idx", + "columns": ["ownerId"], + "isUnique": false + }, + "is_public_idx": { + "name": "is_public_idx", + "columns": ["public"], + "isUnique": false + }, + "folder_id_idx": { + "name": "folder_id_idx", + "columns": ["folderId"], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "videos_id": { + "name": "videos_id", + "columns": ["id"] + } + }, + "uniqueConstraints": { + "videos_id_unique": { + "name": "videos_id_unique", + "columns": ["id"] + } + }, + "checkConstraint": {} + } + }, + "views": {}, + "_meta": { + "schemas": {}, + "tables": {}, + "columns": {} + }, + "internal": { + "tables": {}, + "indexes": {} + } } \ No newline at end of file diff --git a/packages/database/migrations/meta/_journal.json b/packages/database/migrations/meta/_journal.json index d62e6be41a..3d704a5fce 100644 --- a/packages/database/migrations/meta/_journal.json +++ b/packages/database/migrations/meta/_journal.json @@ -1,62 +1,62 @@ { - "version": "5", - "dialect": "mysql", - "entries": [ - { - "idx": 0, - "version": "5", - "when": 1743020179593, - "tag": "0000_brown_sunfire", - "breakpoints": true - }, - { - "idx": 1, - "version": "5", - "when": 1749268354138, - "tag": "0001_white_young_avengers", - "breakpoints": true - }, - { - "idx": 2, - "version": "5", - "when": 1750935538683, - "tag": "0002_dusty_maginty", - "breakpoints": true - }, - { - "idx": 3, - "version": "5", - "when": 1751274435418, - "tag": "0003_outstanding_kylun", - "breakpoints": true - }, - { - "idx": 4, - "version": "5", - "when": 1751299325634, - "tag": "0004_optimal_eddie_brock", - "breakpoints": true - }, - { - "idx": 5, - "version": "5", - "when": 1751979972128, - "tag": "0005_graceful_fenris", - "breakpoints": true - }, - { - "idx": 6, - "version": "5", - "when": 1751982995648, - "tag": "0006_woozy_jamie_braddock", - "breakpoints": true - }, - { - "idx": 8, - "version": "5", - "when": 1756276562880, - "tag": "0008_fixed_deathbird", + "version": "5", + "dialect": "mysql", + "entries": [ + { + "idx": 0, + "version": "5", + "when": 1743020179593, + "tag": "0000_brown_sunfire", + "breakpoints": true + }, + { + "idx": 1, + "version": "5", + "when": 1749268354138, + "tag": "0001_white_young_avengers", + "breakpoints": true + }, + { + "idx": 2, + "version": "5", + "when": 1750935538683, + "tag": "0002_dusty_maginty", + "breakpoints": true + }, + { + "idx": 3, + "version": "5", + "when": 1751274435418, + "tag": "0003_outstanding_kylun", + "breakpoints": true + }, + { + "idx": 4, + "version": "5", + "when": 1751299325634, + "tag": "0004_optimal_eddie_brock", + "breakpoints": true + }, + { + "idx": 5, + "version": "5", + "when": 1751979972128, + "tag": "0005_graceful_fenris", + "breakpoints": true + }, + { + "idx": 6, + "version": "5", + "when": 1751982995648, + "tag": "0006_woozy_jamie_braddock", + "breakpoints": true + }, + { + "idx": 7, + "version": "5", + "when": 1754314124918, + "tag": "0007_cheerful_rocket_raccoon", "breakpoints": true } - ] + ] } \ No newline at end of file From d40d3f7e4995a705fd84a252fd2254b03a54d776 Mon Sep 17 00:00:00 2001 From: mogita Date: Sun, 31 Aug 2025 22:37:29 +0800 Subject: [PATCH 09/12] feat: block un-authenticated access to playlist url --- .github/workflows/docker-build-web.yml | 1 - apps/web/app/api/video/playlistUrl/route.ts | 12 ++++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/.github/workflows/docker-build-web.yml b/.github/workflows/docker-build-web.yml index 4ae43a8a26..7a84177b42 100644 --- a/.github/workflows/docker-build-web.yml +++ b/.github/workflows/docker-build-web.yml @@ -49,7 +49,6 @@ jobs: echo "CAP_AWS_ENDPOINT=https://build.placeholder.com" >> .env echo "S3_PUBLIC_ENDPOINT=https://build.placeholder.com" >> .env echo "S3_INTERNAL_ENDPOINT=https://build.placeholder.com" >> .env - cat .env - name: Login to GitHub Container Registry uses: docker/login-action@v3 diff --git a/apps/web/app/api/video/playlistUrl/route.ts b/apps/web/app/api/video/playlistUrl/route.ts index 4285ce0628..606c08fb48 100644 --- a/apps/web/app/api/video/playlistUrl/route.ts +++ b/apps/web/app/api/video/playlistUrl/route.ts @@ -5,6 +5,7 @@ import { eq } from "drizzle-orm"; import type { NextRequest } from "next/server"; import { CACHE_CONTROL_HEADERS, getHeaders } from "@/utils/helpers"; import { createBucketProvider } from "@/utils/s3"; +import { getCurrentUser } from "@cap/database/auth/session"; export const revalidate = 0; @@ -60,6 +61,17 @@ export async function GET(request: NextRequest) { } if (video.jobStatus === "COMPLETE") { + // Enforce access control for non-public videos + if (video.public === false) { + const user = await getCurrentUser(); + if (!user || user.id !== video.ownerId) { + return new Response( + JSON.stringify({ error: true, message: "Video is not public" }), + { status: 401, headers: getHeaders(origin) }, + ); + } + } + const [customBucket] = await db() .select() .from(s3Buckets) From 56caf49747327001e30e345da7d28e6bb5131ea0 Mon Sep 17 00:00:00 2001 From: mogita Date: Sun, 31 Aug 2025 22:56:55 +0800 Subject: [PATCH 10/12] feat: query bucket by video id --- apps/web/app/api/video/playlistUrl/route.ts | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/apps/web/app/api/video/playlistUrl/route.ts b/apps/web/app/api/video/playlistUrl/route.ts index 606c08fb48..d0505e44a5 100644 --- a/apps/web/app/api/video/playlistUrl/route.ts +++ b/apps/web/app/api/video/playlistUrl/route.ts @@ -1,11 +1,11 @@ import { db } from "@cap/database"; +import { getCurrentUser } from "@cap/database/auth/session"; import { s3Buckets, videos } from "@cap/database/schema"; import { serverEnv } from "@cap/env"; import { eq } from "drizzle-orm"; import type { NextRequest } from "next/server"; import { CACHE_CONTROL_HEADERS, getHeaders } from "@/utils/helpers"; import { createBucketProvider } from "@/utils/s3"; -import { getCurrentUser } from "@cap/database/auth/session"; export const revalidate = 0; @@ -37,7 +37,11 @@ export async function GET(request: NextRequest) { ); } - const query = await db().select().from(videos).where(eq(videos.id, videoId)); + const query = await db() + .select({ video: videos, bucket: s3Buckets }) + .from(videos) + .leftJoin(s3Buckets, eq(videos.bucket, s3Buckets.id)) + .where(eq(videos.id, videoId)); if (query.length === 0) { return new Response( @@ -49,8 +53,8 @@ export async function GET(request: NextRequest) { ); } - const video = query[0]; - if (!video) { + const result = query[0]; + if (!result?.video) { return new Response( JSON.stringify({ error: true, message: "Video not found" }), { @@ -60,6 +64,8 @@ export async function GET(request: NextRequest) { ); } + const { video, bucket } = result; + if (video.jobStatus === "COMPLETE") { // Enforce access control for non-public videos if (video.public === false) { @@ -72,12 +78,7 @@ export async function GET(request: NextRequest) { } } - const [customBucket] = await db() - .select() - .from(s3Buckets) - .where(eq(s3Buckets.ownerId, video.ownerId)); - - const bucketProvider = await createBucketProvider(customBucket); + const bucketProvider = await createBucketProvider(bucket); const playlistKey = `${video.ownerId}/${video.id}/output/video_recording_000_output.m3u8`; const playlistUrl = await bucketProvider.getSignedObjectUrl(playlistKey); From 8151df033266b8329db4b92e4bbb84b9d40e8022 Mon Sep 17 00:00:00 2001 From: mogita Date: Sun, 31 Aug 2025 23:01:06 +0800 Subject: [PATCH 11/12] format: fix biome issue --- packages/database/migrations/meta/0008_snapshot.json | 2 +- packages/database/migrations/meta/_journal.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/database/migrations/meta/0008_snapshot.json b/packages/database/migrations/meta/0008_snapshot.json index 2bdbcef0ec..4946a96733 100644 --- a/packages/database/migrations/meta/0008_snapshot.json +++ b/packages/database/migrations/meta/0008_snapshot.json @@ -1745,4 +1745,4 @@ "tables": {}, "indexes": {} } -} \ No newline at end of file +} diff --git a/packages/database/migrations/meta/_journal.json b/packages/database/migrations/meta/_journal.json index 3d704a5fce..808fe48f79 100644 --- a/packages/database/migrations/meta/_journal.json +++ b/packages/database/migrations/meta/_journal.json @@ -59,4 +59,4 @@ "breakpoints": true } ] -} \ No newline at end of file +} From d937e7afa62e83213c278a68c7e83071c2b646a1 Mon Sep 17 00:00:00 2001 From: Brendan Allan Date: Mon, 15 Sep 2025 10:54:41 +0800 Subject: [PATCH 12/12] cleanup --- .github/workflows/docker-build-web.yml | 22 ---- .../caps/components/SharingDialog.tsx | 1 + .../api/notifications/preferences/route.ts | 2 + apps/web/app/api/notifications/route.ts | 2 + apps/web/app/api/video/playlistUrl/route.ts | 114 ------------------ 5 files changed, 5 insertions(+), 136 deletions(-) delete mode 100644 apps/web/app/api/video/playlistUrl/route.ts diff --git a/.github/workflows/docker-build-web.yml b/.github/workflows/docker-build-web.yml index 7a84177b42..af6a883dd2 100644 --- a/.github/workflows/docker-build-web.yml +++ b/.github/workflows/docker-build-web.yml @@ -38,17 +38,6 @@ jobs: echo "NEXT_PUBLIC_DOCKER_BUILD=true" >> .env echo "NEXT_PUBLIC_CAP_AWS_BUCKET=capso" >> .env echo "NEXT_PUBLIC_CAP_AWS_REGION=us-east-1" >> .env - # Add required build-time environment variables - echo "DATABASE_URL=mysql://build:build@build:3306/build" >> .env - echo "CAP_AWS_BUCKET=build-bucket" >> .env - echo "CAP_AWS_REGION=us-east-1" >> .env - echo "CAP_AWS_ACCESS_KEY=build-access-key" >> .env - echo "CAP_AWS_SECRET_KEY=build-secret-key" >> .env - echo "NEXTAUTH_SECRET=build-nextauth-secret-placeholder-32-chars" >> .env - echo "NEXTAUTH_URL=https://build.placeholder.com" >> .env - echo "CAP_AWS_ENDPOINT=https://build.placeholder.com" >> .env - echo "S3_PUBLIC_ENDPOINT=https://build.placeholder.com" >> .env - echo "S3_INTERNAL_ENDPOINT=https://build.placeholder.com" >> .env - name: Login to GitHub Container Registry uses: docker/login-action@v3 @@ -68,17 +57,6 @@ jobs: outputs: type=image,name=ghcr.io/${{ github.repository_owner }}/cap-web,push-by-digest=true cache-from: type=gha,scope=buildx-${{ matrix.platform }} cache-to: type=gha,mode=max,scope=buildx-${{ matrix.platform }} - build-args: | - DATABASE_URL=mysql://build:build@build:3306/build - CAP_AWS_BUCKET=build-bucket - CAP_AWS_REGION=us-east-1 - CAP_AWS_ACCESS_KEY=build-access-key - CAP_AWS_SECRET_KEY=build-secret-key - NEXTAUTH_SECRET=build-nextauth-secret-placeholder-32-chars - NEXTAUTH_URL=https://build.placeholder.com - CAP_AWS_ENDPOINT=https://build.placeholder.com - S3_PUBLIC_ENDPOINT=https://build.placeholder.com - S3_INTERNAL_ENDPOINT=https://build.placeholder.com - name: Export Digest run: | diff --git a/apps/web/app/(org)/dashboard/caps/components/SharingDialog.tsx b/apps/web/app/(org)/dashboard/caps/components/SharingDialog.tsx index 1375f9dba1..ebf3fc1835 100644 --- a/apps/web/app/(org)/dashboard/caps/components/SharingDialog.tsx +++ b/apps/web/app/(org)/dashboard/caps/components/SharingDialog.tsx @@ -22,6 +22,7 @@ import { shareCap } from "@/actions/caps/share"; import { useDashboardContext } from "@/app/(org)/dashboard/Contexts"; import type { Spaces } from "@/app/(org)/dashboard/dashboard-data"; import { Tooltip } from "@/components/Tooltip"; +import { usePublicEnv } from "@/utils/public-env"; interface SharingDialogProps { isOpen: boolean; diff --git a/apps/web/app/api/notifications/preferences/route.ts b/apps/web/app/api/notifications/preferences/route.ts index 87c994c07d..83d6c72b72 100644 --- a/apps/web/app/api/notifications/preferences/route.ts +++ b/apps/web/app/api/notifications/preferences/route.ts @@ -14,6 +14,8 @@ const PreferencesSchema = z.object({ }), }); +export const dynamic = "force-dynamic"; + export async function GET() { const currentUser = await getCurrentUser(); if (!currentUser) { diff --git a/apps/web/app/api/notifications/route.ts b/apps/web/app/api/notifications/route.ts index 353f17038c..0ea8748bee 100644 --- a/apps/web/app/api/notifications/route.ts +++ b/apps/web/app/api/notifications/route.ts @@ -21,6 +21,8 @@ type NotificationsKeysWithReplies = | Exclude<`${NotificationsKeys}s`, "replys"> | "replies"; +export const dynamic = "force-dynamic"; + export async function GET() { const currentUser = await getCurrentUser(); if (!currentUser) { diff --git a/apps/web/app/api/video/playlistUrl/route.ts b/apps/web/app/api/video/playlistUrl/route.ts deleted file mode 100644 index d0505e44a5..0000000000 --- a/apps/web/app/api/video/playlistUrl/route.ts +++ /dev/null @@ -1,114 +0,0 @@ -import { db } from "@cap/database"; -import { getCurrentUser } from "@cap/database/auth/session"; -import { s3Buckets, videos } from "@cap/database/schema"; -import { serverEnv } from "@cap/env"; -import { eq } from "drizzle-orm"; -import type { NextRequest } from "next/server"; -import { CACHE_CONTROL_HEADERS, getHeaders } from "@/utils/helpers"; -import { createBucketProvider } from "@/utils/s3"; - -export const revalidate = 0; - -export async function OPTIONS(request: NextRequest) { - const origin = request.headers.get("origin") as string; - - return new Response(null, { - status: 200, - headers: getHeaders(origin), - }); -} - -export async function GET(request: NextRequest) { - const searchParams = request.nextUrl.searchParams; - const userId = searchParams.get("userId") || ""; - const videoId = searchParams.get("videoId") || ""; - const origin = request.headers.get("origin") as string; - - if (!userId || !videoId) { - return new Response( - JSON.stringify({ - error: true, - message: "userId or videoId not supplied", - }), - { - status: 401, - headers: getHeaders(origin), - }, - ); - } - - const query = await db() - .select({ video: videos, bucket: s3Buckets }) - .from(videos) - .leftJoin(s3Buckets, eq(videos.bucket, s3Buckets.id)) - .where(eq(videos.id, videoId)); - - if (query.length === 0) { - return new Response( - JSON.stringify({ error: true, message: "Video does not exist" }), - { - status: 401, - headers: getHeaders(origin), - }, - ); - } - - const result = query[0]; - if (!result?.video) { - return new Response( - JSON.stringify({ error: true, message: "Video not found" }), - { - status: 404, - headers: getHeaders(origin), - }, - ); - } - - const { video, bucket } = result; - - if (video.jobStatus === "COMPLETE") { - // Enforce access control for non-public videos - if (video.public === false) { - const user = await getCurrentUser(); - if (!user || user.id !== video.ownerId) { - return new Response( - JSON.stringify({ error: true, message: "Video is not public" }), - { status: 401, headers: getHeaders(origin) }, - ); - } - } - - const bucketProvider = await createBucketProvider(bucket); - const playlistKey = `${video.ownerId}/${video.id}/output/video_recording_000_output.m3u8`; - const playlistUrl = await bucketProvider.getSignedObjectUrl(playlistKey); - - return new Response( - JSON.stringify({ playlistOne: playlistUrl, playlistTwo: null }), - { - status: 200, - headers: { - ...getHeaders(origin), - ...CACHE_CONTROL_HEADERS, - }, - }, - ); - } - - return new Response( - JSON.stringify({ - playlistOne: `${serverEnv().WEB_URL}/api/playlist?userId=${ - video.ownerId - }&videoId=${video.id}&videoType=video`, - playlistTwo: `${serverEnv().WEB_URL}/api/playlist?userId=${ - video.ownerId - }&videoId=${video.id}&videoType=audio`, - }), - { - status: 200, - headers: { - ...getHeaders(origin), - ...CACHE_CONTROL_HEADERS, - }, - }, - ); -}