Files
avz-site/db/schema.ts
T
2026-06-08 23:50:59 -03:00

110 lines
4.2 KiB
TypeScript

import {
mysqlTable,
mysqlEnum,
serial,
varchar,
text,
timestamp,
// bigint,
} from "drizzle-orm/mysql-core";
export const users = mysqlTable("users", {
id: serial("id").primaryKey(),
unionId: varchar("unionId", { length: 255 }).notNull().unique(),
name: varchar("name", { length: 255 }),
email: varchar("email", { length: 320 }),
avatar: text("avatar"),
role: mysqlEnum("role", ["user", "admin"]).default("user").notNull(),
createdAt: timestamp("createdAt").defaultNow().notNull(),
updatedAt: timestamp("updatedAt")
.defaultNow()
.notNull()
.$onUpdate(() => new Date()),
lastSignInAt: timestamp("lastSignInAt").defaultNow().notNull(),
});
export type User = typeof users.$inferSelect;
export type InsertUser = typeof users.$inferInsert;
// ============================================================================
// SISTEMA DE FORMULARIOS - Area do Cliente Avanzato
// ============================================================================
// Formularios criados pela Avanzato para clientes
export const clientForms = mysqlTable("client_forms", {
id: serial("id").primaryKey(),
title: varchar("title", { length: 255 }).notNull(),
description: text("description"),
clientName: varchar("clientName", { length: 255 }).notNull(),
clientEmail: varchar("clientEmail", { length: 320 }),
status: mysqlEnum("status", ["active", "inactive", "archived"]).default("inactive").notNull(),
accessCode: varchar("access_code", { length: 32 }).notNull().unique(),
createdBy: varchar("created_by", { length: 255 }),
createdAt: timestamp("created_at").defaultNow().notNull(),
updatedAt: timestamp("updated_at").defaultNow().notNull().$onUpdate(() => new Date()),
});
export type ClientForm = typeof clientForms.$inferSelect;
export type InsertClientForm = typeof clientForms.$inferInsert;
// Secoes de cada formulario
export const formSections = mysqlTable("form_sections", {
id: serial("id").primaryKey(),
formId: varchar("form_id", { length: 32 }).notNull(),
title: varchar("title", { length: 255 }).notNull(),
description: text("description"),
orderNum: serial("order_num"),
createdAt: timestamp("created_at").defaultNow().notNull(),
});
export type FormSection = typeof formSections.$inferSelect;
// Perguntas/Campos de cada secao
export const formQuestions = mysqlTable("form_questions", {
id: serial("id").primaryKey(),
formId: varchar("form_id", { length: 32 }).notNull(),
sectionId: varchar("section_id", { length: 32 }),
question: text("question").notNull(),
fieldType: mysqlEnum("field_type", ["text", "textarea", "number", "select", "multiselect", "date", "file"]).default("text").notNull(),
options: text("options"), // JSON string para select/multiselect
required: mysqlEnum("required", ["yes", "no"]).default("no").notNull(),
orderNum: serial("order_num"),
createdAt: timestamp("created_at").defaultNow().notNull(),
});
export type FormQuestion = typeof formQuestions.$inferSelect;
// Respostas submetidas pelos clientes
export const formAnswers = mysqlTable("form_answers", {
id: serial("id").primaryKey(),
formId: varchar("form_id", { length: 32 }).notNull(),
questionId: varchar("question_id", { length: 32 }).notNull(),
answer: text("answer"),
createdAt: timestamp("created_at").defaultNow().notNull(),
});
export type FormAnswer = typeof formAnswers.$inferSelect;
// Submissoes completas (uma por formulario preenchido)
export const formSubmissions = mysqlTable("form_submissions", {
id: serial("id").primaryKey(),
formId: varchar("form_id", { length: 32 }).notNull(),
submittedBy: varchar("submitted_by", { length: 255 }),
submittedByEmail: varchar("submitted_by_email", { length: 320 }),
notes: text("notes"),
createdAt: timestamp("created_at").defaultNow().notNull(),
});
export type FormSubmission = typeof formSubmissions.$inferSelect;
//
// Example:
// export const posts = mysqlTable("posts", {
// id: serial("id").primaryKey(),
// title: varchar("title", { length: 255 }).notNull(),
// content: text("content"),
// createdAt: timestamp("created_at").notNull().defaultNow(),
// });
//
// Note: FK columns referencing a serial() PK must use:
// bigint("columnName", { mode: "number", unsigned: true }).notNull()