Enable users to create custom video playlists and save favorite videos
Adds database schemas and Drizzle ORM setup for user playlists and favorites features. Replit-Commit-Author: Agent Replit-Commit-Session-Id: aa92e7e2-ec62-4c92-b21b-02ef78a664c2 Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/8cc42625-c1f5-4e43-99bd-77f2c4dedee2/aa92e7e2-ec62-4c92-b21b-02ef78a664c2/Xt4Awd6
This commit is contained in:
+79
-1
@@ -1,4 +1,4 @@
|
||||
import { sql } from "drizzle-orm";
|
||||
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";
|
||||
@@ -17,10 +17,88 @@ export const videos = pgTable("videos", {
|
||||
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<typeof insertVideoSchema>;
|
||||
export type Video = typeof videos.$inferSelect;
|
||||
export type Playlist = typeof playlists.$inferSelect;
|
||||
export type InsertPlaylist = z.infer<typeof insertPlaylistSchema>;
|
||||
export type PlaylistVideo = typeof playlistVideos.$inferSelect;
|
||||
export type InsertPlaylistVideo = z.infer<typeof insertPlaylistVideoSchema>;
|
||||
export type Favorite = typeof favorites.$inferSelect;
|
||||
export type InsertFavorite = z.infer<typeof insertFavoriteSchema>;
|
||||
|
||||
Reference in New Issue
Block a user