mirror of
https://github.com/ngthanhvu/kr-phim.git
synced 2026-08-10 17:07:46 +00:00
chore: initialize production docker infrastructure and project agent guidelines
This commit is contained in:
@@ -0,0 +1,70 @@
|
||||
# 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
|
||||
})
|
||||
```
|
||||
Reference in New Issue
Block a user