110 lines
4.2 KiB
TypeScript
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()
|