import { sql, relations } from "drizzle-orm"; import { pgTable, text, varchar, integer, timestamp } from "drizzle-orm/pg-core"; import { createInsertSchema } from "drizzle-zod"; import { z } from "zod"; export const videos = pgTable("videos", { id: varchar("id").primaryKey(), title: text("title").notNull(), description: text("description"), thumbnailUrl: text("thumbnail_url").notNull(), videoUrl: text("video_url").notNull(), videoUrlMp4: text("video_url_mp4"), videoUrlIframe: text("video_url_iframe"), duration: integer("duration").notNull(), // in seconds views: integer("views").notNull().default(0), category: text("category"), createdAt: timestamp("created_at").notNull().default(sql`CURRENT_TIMESTAMP`), }); // User playlists table export const playlists = pgTable("playlists", { id: varchar("id").primaryKey().default(sql`gen_random_uuid()`), name: text("name").notNull(), description: text("description"), isPublic: integer("is_public").notNull().default(0), // 0 = private, 1 = public userId: varchar("user_id"), // For future user authentication createdAt: timestamp("created_at").notNull().default(sql`CURRENT_TIMESTAMP`), updatedAt: timestamp("updated_at").notNull().default(sql`CURRENT_TIMESTAMP`), }); // Junction table for playlist-video relationships export const playlistVideos = pgTable("playlist_videos", { id: varchar("id").primaryKey().default(sql`gen_random_uuid()`), playlistId: varchar("playlist_id").notNull(), videoId: varchar("video_id").notNull(), position: integer("position").notNull().default(0), // Order within playlist addedAt: timestamp("added_at").notNull().default(sql`CURRENT_TIMESTAMP`), }); // Favorites table (simplified playlist for favorites) export const favorites = pgTable("favorites", { id: varchar("id").primaryKey().default(sql`gen_random_uuid()`), videoId: varchar("video_id").notNull(), userId: varchar("user_id"), // For future user authentication addedAt: timestamp("added_at").notNull().default(sql`CURRENT_TIMESTAMP`), }); export const insertVideoSchema = createInsertSchema(videos).omit({ id: true, createdAt: true, }); export const insertPlaylistSchema = createInsertSchema(playlists).omit({ id: true, createdAt: true, updatedAt: true, }); export const insertPlaylistVideoSchema = createInsertSchema(playlistVideos).omit({ id: true, addedAt: true, }); export const insertFavoriteSchema = createInsertSchema(favorites).omit({ id: true, addedAt: true, }); // Relations export const playlistsRelations = relations(playlists, ({ many }) => ({ playlistVideos: many(playlistVideos), })); export const playlistVideosRelations = relations(playlistVideos, ({ one }) => ({ playlist: one(playlists, { fields: [playlistVideos.playlistId], references: [playlists.id], }), video: one(videos, { fields: [playlistVideos.videoId], references: [videos.id], }), })); export const videosRelations = relations(videos, ({ many }) => ({ playlistVideos: many(playlistVideos), favorites: many(favorites), })); export const favoritesRelations = relations(favorites, ({ one }) => ({ video: one(videos, { fields: [favorites.videoId], references: [videos.id], }), })); export type InsertVideo = z.infer; export type Video = typeof videos.$inferSelect; export type Playlist = typeof playlists.$inferSelect; export type InsertPlaylist = z.infer; export type PlaylistVideo = typeof playlistVideos.$inferSelect; export type InsertPlaylistVideo = z.infer; export type Favorite = typeof favorites.$inferSelect; export type InsertFavorite = z.infer;