Files
NVWA Code Agent a533dd276c design database
2026-01-05 06:46:12 +00:00

104 lines
4.3 KiB
TypeScript

import {
bigint, // BIGINT (大整数, -2^63 到 2^63-1)
bigserial, // BIGSERIAL (自增大整数, 1 到 2^63-1)
boolean, // BOOLEAN (布尔值)
char, // CHAR (定长字符串)
check, // 定义检查约束
date, // DATE (日期)
decimal, // DECIMAL/NUMERIC (精确数字, 指定 precision 和 scale)
doublePrecision, // DOUBLE PRECISION (双精度浮点数, 8字节)
foreignKey, // 定义外键
index, // 创建索引
integer, // INTEGER (整数, -2^31 到 2^31-1)
interval, // INTERVAL (时间间隔)
json, // JSON (JSON 数据)
jsonb, // JSONB (二进制 JSON, 推荐使用)
numeric, // NUMERIC (同 decimal)
pgEnum, // 定义枚举类型 (PostgreSQL ENUM)
pgMaterializedView, // 创建物化视图
pgPolicy, // 定义行级安全策略
pgRole, // 定义角色
pgSequence, // 创建序列
pgTable, // 定义表
pgTableCreator, // 创建自定义表名生成器的表定义函数
pgView, // 创建视图
primaryKey, // 定义主键
serial, // SERIAL (自增整数, 1 到 2^31-1)
text, // TEXT (变长字符串, 无长度限制)
time, // TIME (时间)
timestamp, // TIMESTAMP (日期时间, 无时区)
unique, // 定义唯一约束
uniqueIndex, // 创建唯一索引
uuid, // UUID (通用唯一标识符)
varchar, // VARCHAR (变长字符串, 指定长度)
} from "drizzle-orm/pg-core";
import { sql } from "drizzle-orm";
import { id, createdAt, updatedAt } from "../common";
import { user } from "./auth.db";
// Levels table: Store information about each programming level
export const level = pgTable("level", {
id,
title: varchar("title", { length: 255 }).notNull(),
description: text("description"),
difficulty: integer("difficulty").notNull(), // 1-5 scale
order: integer("order").notNull().unique(), // Level sequence
codeBlocks: jsonb("code_blocks"), // Available code blocks for this level (JSON array)
initialCode: jsonb("initial_code"), // Starting code structure (JSON)
solution: jsonb("solution"), // Correct solution (JSON, optional for validation)
rewards: jsonb("rewards"), // Rewards upon completion (JSON: points, badges, etc.)
isActive: boolean("is_active").default(true).notNull(),
createdAt,
updatedAt,
});
// User Level Progress: Track user progress through levels
export const userLevelProgress = pgTable("user_level_progress", {
id,
userId: text("user_id").notNull().references(() => user.id, { onDelete: "cascade" }),
levelId: integer("level_id").notNull().references(() => level.id, { onDelete: "cascade" }),
completed: boolean("completed").default(false).notNull(),
score: integer("score"), // Points earned
timeTaken: integer("time_taken"), // Time in seconds
attempts: integer("attempts").default(1).notNull(),
codeSnapshot: jsonb("code_snapshot"), // Final code state (JSON)
completedAt: timestamp("completed_at"),
createdAt,
updatedAt,
});
// Achievements: Store available achievements
export const achievement = pgTable("achievement", {
id,
title: varchar("title", { length: 255 }).notNull(),
description: text("description"),
icon: varchar("icon", { length: 255 }), // Icon URL or identifier
type: varchar("type", { length: 50 }).notNull(), // e.g., 'level_completion', 'streak', 'sharing'
condition: jsonb("condition"), // Criteria for unlocking (JSON)
points: integer("points").default(0).notNull(),
isActive: boolean("is_active").default(true).notNull(),
createdAt,
updatedAt,
});
// User Achievements: Track unlocked achievements per user
export const userAchievement = pgTable("user_achievement", {
id,
userId: text("user_id").notNull().references(() => user.id, { onDelete: "cascade" }),
achievementId: integer("achievement_id").notNull().references(() => achievement.id, { onDelete: "cascade" }),
unlockedAt: timestamp("unlocked_at").defaultNow().notNull(),
createdAt,
updatedAt,
});
// Parent-Child Relations: For parents to monitor children (optional, assuming parents are also users)
export const parentChildRelation = pgTable("parent_child_relation", {
id,
parentId: text("parent_id").notNull().references(() => user.id, { onDelete: "cascade" }),
childId: text("child_id").notNull().references(() => user.id, { onDelete: "cascade" }),
relation: varchar("relation", { length: 50 }).default("parent").notNull(), // e.g., 'parent', 'guardian'
createdAt,
updatedAt,
});