Files
kr-phim/.agents/drizzle-database.md
T

71 lines
2.7 KiB
Markdown

# Database & Drizzle ORM Standards
This guide covers the database structure, schema conventions, and query best practices using **Drizzle ORM** (MySQL) in the CineK (kr-phim) project.
---
## 1. Database Configuration & Schema
- **Database Dialect**: MySQL
- **Schema Location**: `/server/database/schema.ts`
- **Migrations Folder**: `/server/database/migrations`
- **Config file**: `drizzle.config.ts`
### Migration Commands:
- Generate a new migration file: `npm run db:generate`
- Apply migrations to database: `npm run db:migrate`
---
## 2. Core Schemas & Types Reference
The database is structured around four primary tables. Always import types and schema objects from `~/server/database/schema`:
### Users (`users`)
- Used for authentication and roles (admin, user).
- Schema definition:
- `id`: Auto-incrementing primary key.
- `name`: Full name.
- `email`: Unique email address.
- `password`: Hashed password (using bcryptjs).
- `role`: User authorization level (`admin` or `user`).
- `active`: Boolean to enable/disable accounts.
### Movies (`movies`)
- Contains metadata for all imported/scraped movies.
- Key properties:
- `source`: The origin API provider (e.g. `kkphim`, `ophim`, `nguonc`).
- `slug`: Unique slug path for URL routing.
- `categories` & `countries`: Stored as JSON arrays of strings.
- `actors`: JSON array of objects `[ { name, originalName, role, avatar } ]`.
- **Custom Overrides**: Admin can overwrite fields with `customPoster`, `customThumb`, `customContent`, `customEpisodes`, and `customServers`.
### Comments (`comments`) & Comment Votes (`comment_votes`)
- Enables interactive comments under movies with parent-child relationships for nested threads.
- Supports pinning, marking as spoiler, anonymous posting, and like/dislike reactions tracking.
---
## 3. Server Endpoints Integration
When querying the database from server routes (`/server/api/*`):
- Import the database client from a global instance (e.g., `drizzle` or `db` composable).
- Use proper relational joins or index queries to keep performance fast.
- Ensure authentication checks are in place for destructive endpoints (e.g. validating token session via `/api/auth/*` before modifying movies or comments).
Example Query:
```typescript
import { db } from '~/server/database' // check project db import structure
import { movies } from '~/server/database/schema'
import { eq } from 'drizzle-orm'
export default defineEventHandler(async (event) => {
const query = getQuery(event)
const slug = query.slug as string
if (!slug) {
throw createError({ statusCode: 400, message: 'Slug is required' })
}
const result = await db.select().from(movies).where(eq(movies.slug, slug)).limit(1)
return result[0] || null
})
```