import { pgTable, text, serial, integer, boolean, timestamp, jsonb } from "drizzle-orm/pg-core"; import { createInsertSchema } from "drizzle-zod"; import { z } from "zod"; export const users = pgTable("users", { id: serial("id").primaryKey(), username: text("username").notNull().unique(), password: text("password").notNull(), }); export const calculations = pgTable("calculations", { id: serial("id").primaryKey(), userId: integer("user_id"), module: text("module").notNull(), type: text("type").notNull(), inputs: jsonb("inputs").notNull(), results: jsonb("results").notNull(), createdAt: timestamp("created_at").defaultNow().notNull(), }); export const reports = pgTable("reports", { id: serial("id").primaryKey(), userId: integer("user_id"), title: text("title").notNull(), content: jsonb("content").notNull(), pdfData: text("pdf_data"), createdAt: timestamp("created_at").defaultNow().notNull(), }); export const settings = pgTable("settings", { id: serial("id").primaryKey(), userId: integer("user_id"), key: text("key").notNull(), value: jsonb("value").notNull(), }); // Project Management System export const projects = pgTable("projects", { id: serial("id").primaryKey(), userId: integer("user_id"), name: text("name").notNull(), description: text("description"), type: text("type").notNull(), // 'university', 'residential', 'commercial', 'infrastructure' location: text("location"), status: text("status").notNull().default("active"), // 'active', 'completed', 'archived' data: jsonb("data").notNull().default('{}'), // Project-specific data createdAt: timestamp("created_at").defaultNow().notNull(), updatedAt: timestamp("updated_at").defaultNow().notNull(), }); // Link calculations to projects export const projectCalculations = pgTable("project_calculations", { id: serial("id").primaryKey(), projectId: integer("project_id").notNull(), calculationId: integer("calculation_id").notNull(), moduleUsed: text("module_used").notNull(), createdAt: timestamp("created_at").defaultNow().notNull(), }); // Government Reports export const governmentReports = pgTable("government_reports", { id: serial("id").primaryKey(), projectId: integer("project_id"), reportType: text("report_type").notNull(), // 'eia', 'cpcb', 'municipal', 'forest_clearance' title: text("title").notNull(), content: jsonb("content").notNull(), status: text("status").notNull().default("draft"), // 'draft', 'ready', 'submitted' generatedData: jsonb("generated_data").notNull(), pdfData: text("pdf_data"), createdAt: timestamp("created_at").defaultNow().notNull(), }); // Crop Planning (Fasal Chakra) export const cropPlans = pgTable("crop_plans", { id: serial("id").primaryKey(), userId: integer("user_id"), projectId: integer("project_id"), farmName: text("farm_name").notNull(), location: text("location").notNull(), soilType: text("soil_type").notNull(), climate: text("climate").notNull(), area: integer("area").notNull(), // in acres cropRotation: jsonb("crop_rotation").notNull(), waterRequirement: jsonb("water_requirement").notNull(), fertilizerPlan: jsonb("fertilizer_plan").notNull(), season: text("season").notNull(), // 'kharif', 'rabi', 'zaid' createdAt: timestamp("created_at").defaultNow().notNull(), }); // Coastal Management (Samudra Raksha) export const coastalProjects = pgTable("coastal_projects", { id: serial("id").primaryKey(), userId: integer("user_id"), projectId: integer("project_id"), siteName: text("site_name").notNull(), coordinates: text("coordinates").notNull(), coastlineLength: integer("coastline_length"), // in meters mangroveData: jsonb("mangrove_data").notNull(), erosionRisk: jsonb("erosion_risk").notNull(), crzMapping: jsonb("crz_mapping").notNull(), protectionMeasures: jsonb("protection_measures").notNull(), createdAt: timestamp("created_at").defaultNow().notNull(), }); // Community Knowledge Hub export const communityPosts = pgTable("community_posts", { id: serial("id").primaryKey(), userId: integer("user_id"), title: text("title").notNull(), description: text("description").notNull(), category: text("category").notNull(), // 'case_study', 'best_practice', 'design_sharing' projectData: jsonb("project_data"), images: jsonb("images").default('[]'), tags: jsonb("tags").default('[]'), likes: integer("likes").default(0), isPublic: boolean("is_public").default(true), createdAt: timestamp("created_at").defaultNow().notNull(), }); export const insertUserSchema = createInsertSchema(users).pick({ username: true, password: true, }); export const insertCalculationSchema = createInsertSchema(calculations).omit({ id: true, createdAt: true, }); export const insertReportSchema = createInsertSchema(reports).omit({ id: true, createdAt: true, }); export const insertSettingSchema = createInsertSchema(settings).omit({ id: true, }); export const insertProjectSchema = createInsertSchema(projects).omit({ id: true, createdAt: true, updatedAt: true, }); export const insertGovernmentReportSchema = createInsertSchema(governmentReports).omit({ id: true, createdAt: true, }); export const insertCropPlanSchema = createInsertSchema(cropPlans).omit({ id: true, createdAt: true, }); export const insertCoastalProjectSchema = createInsertSchema(coastalProjects).omit({ id: true, createdAt: true, }); export const insertCommunityPostSchema = createInsertSchema(communityPosts).omit({ id: true, createdAt: true, }); export type InsertUser = z.infer; export type User = typeof users.$inferSelect; export type InsertCalculation = z.infer; export type Calculation = typeof calculations.$inferSelect; export type InsertReport = z.infer; export type Report = typeof reports.$inferSelect; export type InsertSetting = z.infer; export type Setting = typeof settings.$inferSelect; export type InsertProject = z.infer; export type Project = typeof projects.$inferSelect; export type InsertGovernmentReport = z.infer; export type GovernmentReport = typeof governmentReports.$inferSelect; export type InsertCropPlan = z.infer; export type CropPlan = typeof cropPlans.$inferSelect; export type InsertCoastalProject = z.infer; export type CoastalProject = typeof coastalProjects.$inferSelect; export type InsertCommunityPost = z.infer; export type CommunityPost = typeof communityPosts.$inferSelect;