import { defineSchema, defineTable } from "convex/server"; import { v } from "convex/values"; export default defineSchema({ users: defineTable({ name: v.string(), phone: v.optional(v.string()), email: v.optional(v.string()), role: v.string(), avatarId: v.optional(v.string()), reviewCount: v.number(), createdAt: v.number(), }).index("by_email", ["email"]), accounts: defineTable({ userId: v.id("users"), provider: v.string(), providerId: v.string(), secret: v.string(), createdAt: v.number(), }).index("by_provider_email", ["provider", "providerId"]), sessions: defineTable({ userId: v.id("users"), token: v.string(), expiresAt: v.number(), createdAt: v.number(), }).index("by_token", ["token"]), ads: defineTable({ handymanId: v.id("users"), title: v.string(), description: v.string(), category: v.string(), location: v.string(), lat: v.optional(v.number()), lng: v.optional(v.number()), priceRange: v.optional(v.string()), imageIds: v.optional(v.array(v.string())), availability: v.optional(v.string()), ratingAvg: v.optional(v.number()), reviewCount: v.number(), createdAt: v.number(), updatedAt: v.number(), }) .index("by_handyman", ["handymanId"]) .index("by_category", ["category"]), categories: defineTable({ name: v.string(), slug: v.string(), icon: v.optional(v.string()), sortOrder: v.number(), }).index("by_slug", ["slug"]), reviews: defineTable({ adId: v.id("ads"), customerId: v.id("users"), handymanId: v.id("users"), rating: v.number(), comment: v.optional(v.string()), createdAt: v.number(), }) .index("by_ad", ["adId"]) .index("by_handyman", ["handymanId"]), chats: defineTable({ participantIds: v.array(v.id("users")), lastMessageAt: v.number(), createdBy: v.id("users"), }).index("by_participant", ["participantIds"]), messages: defineTable({ chatId: v.id("chats"), senderId: v.id("users"), content: v.string(), imageId: v.optional(v.string()), createdAt: v.number(), }).index("by_chat", ["chatId", "createdAt"]), posts: defineTable({ customerId: v.id("users"), title: v.string(), description: v.string(), category: v.optional(v.string()), location: v.optional(v.string()), budget: v.optional(v.string()), status: v.string(), createdAt: v.number(), updatedAt: v.number(), }) .index("by_customer", ["customerId"]) .index("by_status", ["status"]), });