owl-stream/backend/prisma/schema.prisma

176 lines
4.1 KiB
Plaintext

generator client {
provider = "prisma-client-js"
binaryTargets = ["native", "linux-musl-openssl-3.0.x"]
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
enum UserRole {
admin
volunteer
donor
public
}
enum BurrowStatus {
active
inactive
destroyed
}
enum DonationCampaign {
land_preservation
volunteer_equipment
general
}
enum EventType {
cleanup
educational
fundraiser
}
enum StreamStatus {
live
offline
}
enum EquipmentStatus {
available
checked_out
}
model User {
id String @id @default(cuid())
email String @unique
name String
role UserRole @default(public)
password_hash String
created_at DateTime @default(now())
burrows Burrow[] @relation("AssignedVolunteer")
donations Donation[]
sightings WildlifeSighting[] @relation("SightingReporter")
event_rsvps EventRSVP[]
volunteer_hours VolunteerHour[]
equipment_items EquipmentItem[] @relation("CheckedOutBy")
verified_hours VolunteerHour[] @relation("VerifiedBy")
@@map("users")
}
model Burrow {
id String @id @default(cuid())
gps_lat Float
gps_lng Float
status BurrowStatus @default(active)
location_description String?
photos String[] @default([])
assigned_volunteer_id String?
created_at DateTime @default(now())
assigned_volunteer User? @relation("AssignedVolunteer", fields: [assigned_volunteer_id], references: [id], onDelete: SetNull)
@@map("burrows")
}
model Donation {
id String @id @default(cuid())
donor_id String?
amount Float
campaign DonationCampaign @default(general)
stripe_payment_id String?
created_at DateTime @default(now())
donor User? @relation(fields: [donor_id], references: [id], onDelete: SetNull)
@@map("donations")
}
model WildlifeSighting {
id String @id @default(cuid())
reporter_id String?
species String
gps_lat Float
gps_lng Float
photo_url String?
description String?
verified Boolean @default(false)
created_at DateTime @default(now())
reporter User? @relation("SightingReporter", fields: [reporter_id], references: [id], onDelete: SetNull)
@@map("wildlife_sightings")
}
model Event {
id String @id @default(cuid())
title String
description String?
date DateTime
location String
max_attendees Int?
type EventType
created_at DateTime @default(now())
rsvps EventRSVP[]
@@map("events")
}
model EventRSVP {
event_id String
user_id String
created_at DateTime @default(now())
event Event @relation(fields: [event_id], references: [id], onDelete: Cascade)
user User @relation(fields: [user_id], references: [id], onDelete: Cascade)
@@id([event_id, user_id])
@@map("event_rsvps")
}
model LivestreamSource {
id String @id @default(cuid())
name String
stream_url String
camera_location String
status StreamStatus @default(offline)
thumbnail_url String?
created_at DateTime @default(now())
@@map("livestream_sources")
}
model VolunteerHour {
id String @id @default(cuid())
volunteer_id String
date DateTime
hours Float
task_description String
verified_by String?
created_at DateTime @default(now())
volunteer User @relation(fields: [volunteer_id], references: [id], onDelete: Cascade)
verifier User? @relation("VerifiedBy", fields: [verified_by], references: [id], onDelete: SetNull)
@@map("volunteer_hours")
}
model EquipmentItem {
id String @id @default(cuid())
name String
description String?
status EquipmentStatus @default(available)
checked_out_by String?
checked_out_at DateTime?
created_at DateTime @default(now())
checker User? @relation("CheckedOutBy", fields: [checked_out_by], references: [id], onDelete: SetNull)
@@map("equipment_items")
}