from tortoise import BaseDBAsyncClient async def upgrade(db: BaseDBAsyncClient) -> str: return """ CREATE TABLE IF NOT EXISTS "categories" ( "id" SERIAL NOT NULL PRIMARY KEY, "name" VARCHAR(255) NOT NULL ); CREATE TABLE IF NOT EXISTS "discounts" ( "created_at" TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP, "updated_at" TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP, "id" SERIAL NOT NULL PRIMARY KEY, "code" VARCHAR(8) NOT NULL, "percent" INT, "value" INT, "max_value" INT, "expires_at" TIMESTAMPTZ ); CREATE TABLE IF NOT EXISTS "users" ( "created_at" TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP, "updated_at" TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP, "id" UUID NOT NULL PRIMARY KEY, "mobile_number" VARCHAR(11) UNIQUE, "password" VARCHAR(255), "name" VARCHAR(255), "image" VARCHAR(255), "email" VARCHAR(255) UNIQUE, "username" VARCHAR(255) UNIQUE, "verified" BOOL NOT NULL DEFAULT False, "otp" VARCHAR(6), "otp_expires_at" TIMESTAMPTZ, "code" VARCHAR(6), "card_number" VARCHAR(16), "income" DOUBLE PRECISION NOT NULL DEFAULT 0, "credit" INT NOT NULL DEFAULT 0, "free_credit" INT NOT NULL DEFAULT 100 ); CREATE INDEX IF NOT EXISTS "idx_users_mobile__c5f07a" ON "users" ("mobile_number"); CREATE INDEX IF NOT EXISTS "idx_users_email_133a6f" ON "users" ("email"); CREATE INDEX IF NOT EXISTS "idx_users_usernam_266d85" ON "users" ("username"); CREATE TABLE IF NOT EXISTS "billings" ( "created_at" TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP, "updated_at" TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP, "id" SERIAL NOT NULL PRIMARY KEY, "amount" INT NOT NULL, "credit" INT NOT NULL, "discount" INT NOT NULL DEFAULT 0, "authority" VARCHAR(255) UNIQUE, "ref_id" VARCHAR(255) UNIQUE, "type" VARCHAR(9) NOT NULL DEFAULT 'purchase', "status" VARCHAR(7) NOT NULL DEFAULT 'pending', "user_id" UUID REFERENCES "users" ("id") ON DELETE SET NULL ); COMMENT ON COLUMN "billings"."type" IS 'FREE: free\nCODE: code\nINVITE: invite\nWELCOME: welcome\nPURCHASE: purchase\nINSTAGRAM: instagram'; COMMENT ON COLUMN "billings"."status" IS 'SUCCESS: success\nFAILED: failed\nPENDING: pending'; CREATE TABLE IF NOT EXISTS "bots" ( "created_at" TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP, "updated_at" TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP, "id" SERIAL NOT NULL PRIMARY KEY, "name" VARCHAR(255), "model" VARCHAR(255) NOT NULL, "description" TEXT, "image" VARCHAR(255) NOT NULL, "attachment" INT NOT NULL DEFAULT 0, "attachment_type" JSONB, "tool" BOOL NOT NULL DEFAULT False, "public" BOOL NOT NULL DEFAULT True, "cost" INT NOT NULL DEFAULT 0, "limit" INT NOT NULL DEFAULT -1, "prompt" TEXT, "links" JSONB, "docs" JSONB, "status" VARCHAR(9) NOT NULL DEFAULT 'confirmed', "category_id" INT REFERENCES "categories" ("id") ON DELETE SET NULL, "user_id" UUID REFERENCES "users" ("id") ON DELETE SET NULL ); COMMENT ON COLUMN "bots"."status" IS 'CONFIRMED: confirmed\nREJECTED: rejected\nPENDING: pending'; CREATE TABLE IF NOT EXISTS "chatbots" ( "created_at" TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP, "updated_at" TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP, "id" SERIAL NOT NULL PRIMARY KEY, "title" VARCHAR(255), "archive" BOOL NOT NULL DEFAULT False, "bot_id" INT NOT NULL REFERENCES "bots" ("id") ON DELETE CASCADE, "user_id" UUID NOT NULL REFERENCES "users" ("id") ON DELETE CASCADE ); CREATE TABLE IF NOT EXISTS "comments" ( "created_at" TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP, "updated_at" TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP, "id" SERIAL NOT NULL PRIMARY KEY, "text" TEXT NOT NULL, "image" VARCHAR(255), "category_id" INT NOT NULL REFERENCES "categories" ("id") ON DELETE CASCADE, "parent_id" INT REFERENCES "comments" ("id") ON DELETE SET NULL, "replied_user_id" UUID REFERENCES "users" ("id") ON DELETE SET NULL, "user_id" UUID NOT NULL REFERENCES "users" ("id") ON DELETE CASCADE ); CREATE TABLE IF NOT EXISTS "feedbacks" ( "created_at" TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP, "updated_at" TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP, "id" SERIAL NOT NULL PRIMARY KEY, "status" VARCHAR(8) NOT NULL, "comment_id" INT NOT NULL REFERENCES "comments" ("id") ON DELETE CASCADE, "user_id" UUID NOT NULL REFERENCES "users" ("id") ON DELETE CASCADE, CONSTRAINT "uid_feedbacks_user_id_c72030" UNIQUE ("user_id", "comment_id") ); COMMENT ON COLUMN "feedbacks"."status" IS 'LIKED: liked\nDISLIKED: disliked'; CREATE TABLE IF NOT EXISTS "marks" ( "created_at" TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP, "updated_at" TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP, "id" SERIAL NOT NULL PRIMARY KEY, "bot_id" INT NOT NULL REFERENCES "bots" ("id") ON DELETE CASCADE, "user_id" UUID NOT NULL REFERENCES "users" ("id") ON DELETE CASCADE, CONSTRAINT "uid_marks_user_id_76ce59" UNIQUE ("user_id", "bot_id") ); CREATE TABLE IF NOT EXISTS "messages" ( "created_at" TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP, "updated_at" TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP, "id" SERIAL NOT NULL PRIMARY KEY, "input_tokens" INT NOT NULL, "output_tokens" INT NOT NULL, "chatbot_id" INT REFERENCES "chatbots" ("id") ON DELETE SET NULL ); CREATE TABLE IF NOT EXISTS "notifications" ( "created_at" TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP, "updated_at" TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP, "id" SERIAL NOT NULL PRIMARY KEY, "title" VARCHAR(255) NOT NULL, "message" VARCHAR(255) NOT NULL, "seen" BOOL NOT NULL DEFAULT False, "user_id" UUID NOT NULL REFERENCES "users" ("id") ON DELETE CASCADE ); CREATE TABLE IF NOT EXISTS "rates" ( "created_at" TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP, "updated_at" TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP, "id" SERIAL NOT NULL PRIMARY KEY, "text" TEXT NOT NULL, "score" INT NOT NULL, "bot_id" INT NOT NULL REFERENCES "bots" ("id") ON DELETE CASCADE, "user_id" UUID NOT NULL REFERENCES "users" ("id") ON DELETE CASCADE ); CREATE TABLE IF NOT EXISTS "settlements" ( "created_at" TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP, "updated_at" TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP, "id" SERIAL NOT NULL PRIMARY KEY, "income" INT NOT NULL, "confirmed" BOOL NOT NULL DEFAULT False, "type" VARCHAR(5) NOT NULL, "user_id" UUID NOT NULL REFERENCES "users" ("id") ON DELETE CASCADE ); COMMENT ON COLUMN "settlements"."type" IS 'COIN: coin\nMONEY: money'; CREATE TABLE IF NOT EXISTS "tickets" ( "created_at" TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP, "updated_at" TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP, "id" SERIAL NOT NULL PRIMARY KEY, "text" TEXT, "role" VARCHAR(5) NOT NULL DEFAULT 'user', "file" VARCHAR(255), "user_id" UUID NOT NULL REFERENCES "users" ("id") ON DELETE CASCADE ); COMMENT ON COLUMN "tickets"."role" IS 'USER: user\nADMIN: admin'; CREATE TABLE IF NOT EXISTS "aerich" ( "id" SERIAL NOT NULL PRIMARY KEY, "version" VARCHAR(255) NOT NULL, "app" VARCHAR(100) NOT NULL, "content" JSONB NOT NULL );""" async def downgrade(db: BaseDBAsyncClient) -> str: return """ """