- Add video MIME types support (WebM, MP4, OGG, MOV, AVI) - Increase upload size limit to 100MB for videos - Add ffmpeg integration for local video processing - Generate video thumbnails at 50% duration - Extract video metadata (duration, codecs, bitrate) - Add database fields for video metadata - Support video uploads in both local and Cloudinary storage - Maintain aspect ratio for video thumbnails (1920px max width) 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
182 lines
5.6 KiB
Text
182 lines
5.6 KiB
Text
generator client {
|
|
provider = "prisma-client-js"
|
|
}
|
|
|
|
datasource db {
|
|
provider = "postgresql"
|
|
url = env("DATABASE_URL")
|
|
}
|
|
|
|
model Project {
|
|
id Int @id @default(autoincrement())
|
|
slug String @unique @db.VarChar(255)
|
|
title String @db.VarChar(255)
|
|
subtitle String? @db.VarChar(255)
|
|
description String?
|
|
year Int
|
|
client String? @db.VarChar(255)
|
|
role String? @db.VarChar(255)
|
|
featuredImage String? @db.VarChar(500)
|
|
gallery Json?
|
|
externalUrl String? @db.VarChar(500)
|
|
caseStudyContent Json?
|
|
displayOrder Int @default(0)
|
|
status String @default("draft") @db.VarChar(50)
|
|
publishedAt DateTime?
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
backgroundColor String? @db.VarChar(50)
|
|
highlightColor String? @db.VarChar(50)
|
|
logoUrl String? @db.VarChar(500)
|
|
password String? @db.VarChar(255)
|
|
projectType String @default("work") @db.VarChar(50)
|
|
|
|
@@index([slug])
|
|
@@index([status])
|
|
}
|
|
|
|
model Post {
|
|
id Int @id @default(autoincrement())
|
|
slug String @unique @db.VarChar(255)
|
|
postType String @db.VarChar(50)
|
|
title String? @db.VarChar(255)
|
|
content Json?
|
|
featuredImage String? @db.VarChar(500)
|
|
tags Json?
|
|
status String @default("draft") @db.VarChar(50)
|
|
publishedAt DateTime?
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
attachments Json?
|
|
|
|
@@index([slug])
|
|
@@index([status])
|
|
@@index([postType])
|
|
}
|
|
|
|
model Album {
|
|
id Int @id @default(autoincrement())
|
|
slug String @unique @db.VarChar(255)
|
|
title String @db.VarChar(255)
|
|
description String?
|
|
date DateTime?
|
|
location String? @db.VarChar(255)
|
|
coverPhotoId Int?
|
|
status String @default("draft") @db.VarChar(50)
|
|
showInUniverse Boolean @default(false)
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
content Json?
|
|
publishedAt DateTime?
|
|
media AlbumMedia[]
|
|
geoLocations GeoLocation[]
|
|
|
|
@@index([slug])
|
|
@@index([status])
|
|
}
|
|
|
|
model Photo {
|
|
id Int @id @default(autoincrement())
|
|
filename String @db.VarChar(255)
|
|
url String @db.VarChar(500)
|
|
thumbnailUrl String? @db.VarChar(500)
|
|
width Int?
|
|
height Int?
|
|
exifData Json?
|
|
caption String?
|
|
displayOrder Int @default(0)
|
|
slug String? @unique @db.VarChar(255)
|
|
title String? @db.VarChar(255)
|
|
description String?
|
|
status String @default("draft") @db.VarChar(50)
|
|
publishedAt DateTime?
|
|
showInPhotos Boolean @default(true)
|
|
createdAt DateTime @default(now())
|
|
mediaId Int?
|
|
dominantColor String? @db.VarChar(7)
|
|
colors Json?
|
|
aspectRatio Float?
|
|
media Media? @relation(fields: [mediaId], references: [id])
|
|
|
|
@@index([slug])
|
|
@@index([status])
|
|
@@index([mediaId])
|
|
}
|
|
|
|
model Media {
|
|
id Int @id @default(autoincrement())
|
|
filename String @db.VarChar(255)
|
|
mimeType String @db.VarChar(100)
|
|
size Int
|
|
url String
|
|
thumbnailUrl String?
|
|
width Int?
|
|
height Int?
|
|
usedIn Json @default("[]")
|
|
createdAt DateTime @default(now())
|
|
description String?
|
|
originalName String? @db.VarChar(255)
|
|
updatedAt DateTime @updatedAt
|
|
isPhotography Boolean @default(false)
|
|
exifData Json?
|
|
photoCaption String?
|
|
photoTitle String? @db.VarChar(255)
|
|
photoDescription String?
|
|
photoSlug String? @unique @db.VarChar(255)
|
|
photoPublishedAt DateTime?
|
|
dominantColor String? @db.VarChar(7)
|
|
colors Json?
|
|
aspectRatio Float?
|
|
duration Float? // Video duration in seconds
|
|
videoCodec String? @db.VarChar(50)
|
|
audioCodec String? @db.VarChar(50)
|
|
bitrate Int? // Bitrate in bits per second
|
|
albums AlbumMedia[]
|
|
usage MediaUsage[]
|
|
photos Photo[]
|
|
}
|
|
|
|
model MediaUsage {
|
|
id Int @id @default(autoincrement())
|
|
mediaId Int
|
|
contentType String @db.VarChar(50)
|
|
contentId Int
|
|
fieldName String @db.VarChar(100)
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
media Media @relation(fields: [mediaId], references: [id], onDelete: Cascade)
|
|
|
|
@@unique([mediaId, contentType, contentId, fieldName])
|
|
@@index([mediaId])
|
|
@@index([contentType, contentId])
|
|
}
|
|
|
|
model AlbumMedia {
|
|
id Int @id @default(autoincrement())
|
|
albumId Int
|
|
mediaId Int
|
|
displayOrder Int @default(0)
|
|
createdAt DateTime @default(now())
|
|
album Album @relation(fields: [albumId], references: [id], onDelete: Cascade)
|
|
media Media @relation(fields: [mediaId], references: [id], onDelete: Cascade)
|
|
|
|
@@unique([albumId, mediaId])
|
|
@@index([albumId])
|
|
@@index([mediaId])
|
|
}
|
|
|
|
model GeoLocation {
|
|
id Int @id @default(autoincrement())
|
|
albumId Int
|
|
latitude Float
|
|
longitude Float
|
|
title String @db.VarChar(255)
|
|
description String?
|
|
markerColor String? @db.VarChar(7)
|
|
order Int @default(0)
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
album Album @relation(fields: [albumId], references: [id], onDelete: Cascade)
|
|
|
|
@@index([albumId])
|
|
}
|