diff --git a/drizzle/0009_family-invite.sql b/drizzle/0009_family-invite.sql new file mode 100644 index 0000000..60ebf37 --- /dev/null +++ b/drizzle/0009_family-invite.sql @@ -0,0 +1,11 @@ +-- xuchao: 家庭邀请码——家长生成一次性邀请码,其他家长凭码注册加入家庭。幂等。 +CREATE TABLE IF NOT EXISTS `family_invite` ( + `id` bigint AUTO_INCREMENT NOT NULL, + `family_id` bigint NOT NULL, + `code_hash` varchar(64) NOT NULL, + `created_by` bigint NOT NULL, + `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `expires_at` datetime NOT NULL, + `used_at` datetime, + CONSTRAINT `family_invite_id` PRIMARY KEY(`id`) +); \ No newline at end of file diff --git a/drizzle/meta/_journal.json b/drizzle/meta/_journal.json index 83dce88..950d3b7 100644 --- a/drizzle/meta/_journal.json +++ b/drizzle/meta/_journal.json @@ -64,6 +64,13 @@ "when": 1786233600000, "tag": "0008_points", "breakpoints": true + }, + { + "idx": 9, + "version": "5", + "when": 1786320000000, + "tag": "0009_family-invite", + "breakpoints": true } ] } \ No newline at end of file diff --git a/src/db/schema.ts b/src/db/schema.ts index 29e623a..d5d4489 100644 --- a/src/db/schema.ts +++ b/src/db/schema.ts @@ -78,6 +78,21 @@ export const activationCodes = mysqlTable("activation_code", { usedAt: datetime("used_at"), }); +// ===== 家庭邀请码(家长生成,其他家长凭码注册加入;一次性,15 分钟)===== +export const familyInvites = mysqlTable("family_invite", { + id: bigint("id", { mode: "number" }).primaryKey().autoincrement(), + familyId: bigint("family_id", { mode: "number" }) + .notNull() + .references(() => families.id, { onDelete: "cascade" }), + codeHash: varchar("code_hash", { length: 64 }).notNull(), + createdBy: bigint("created_by", { mode: "number" }) + .notNull() + .references(() => users.id), + createdAt: datetime("created_at").notNull().default(sql`CURRENT_TIMESTAMP`), + expiresAt: datetime("expires_at").notNull(), + usedAt: datetime("used_at"), +}); + // ===== 周模板(每个孩子 × 每周几 × 每条任务)===== export const taskTemplates = mysqlTable( "task_template",