{"version":3,"sources":["../src/app.ts","../src/config/index.ts","../src/modules/user/user.route.ts","../src/modules/user/user.controller.ts","../src/modules/user/user.service.ts","../src/lib/prisma.ts","../generated/prisma/client.ts","../generated/prisma/internal/class.ts","../generated/prisma/internal/prismaNamespace.ts","../generated/prisma/enums.ts","../src/utils/catchAsync.ts","../src/utils/sendResponse.ts","../src/utils/jwt.ts","../src/middlewares/auth.ts","../src/modules/auth/auth.route.ts","../src/modules/auth/auth.service.ts","../src/modules/auth/auth.controller.ts","../src/modules/comment/comment.route.ts","../src/modules/comment/comment.controller.ts","../src/modules/comment/comment.service.ts","../src/modules/post/post.route.ts","../src/modules/post/post.controller.ts","../src/modules/post/post.service.ts","../src/middlewares/notFoundHandler.ts","../src/middlewares/globalErrorHandler.ts","../src/modules/subscription/subscription.route.ts","../src/lib/stripe.ts","../src/utils/subscription.utils.ts","../src/modules/subscription/subscription.services.ts","../src/modules/subscription/subscription.controller.ts","../src/modules/premium/premium.route.ts","../src/modules/premium/premium.service.ts","../src/modules/premium/premium.controller.ts","../src/middlewares/premiumGuard.ts","../src/server.ts"],"sourcesContent":["import cookieParser from \"cookie-parser\";\r\nimport express, { Application, NextFunction, Request, Response } from \"express\";\r\nimport cors from \"cors\";\r\nimport config from \"./config\";\r\nimport { userRoutes } from \"./modules/user/user.route\";\r\nimport { authRouter } from \"./modules/auth/auth.route\";\r\nimport { commentRoutes } from \"./modules/comment/comment.route\";\r\nimport { postRoutes } from \"./modules/post/post.route\";\r\nimport { notFoundHandler } from \"./middlewares/notFoundHandler\";\r\nimport httpStatus from \"http-status\";\r\nimport { globalErrorHandler } from \"./middlewares/globalErrorHandler\";\r\nimport { subscriptionRoutes } from \"./modules/subscription/subscription.route\";\r\nimport { stripe } from \"./lib/stripe\";\r\nimport { premiumRoutes } from \"./modules/premium/premium.route\";\r\n\r\nconst app: Application = express();\r\napp.use(\r\n  cors({\r\n    origin: config.app_url,\r\n    credentials: true,\r\n  }),\r\n);\r\n// ==================================\r\napp.use(\"/api/subscription/webhook\", express.raw({ type: \"application/json\" }));\r\n\r\n// const endpointSecret = config.stripe_webhook_secret;\r\n// app.post(\r\n//   \"/api/subscription/webhook\",\r\n//   express.raw({ type: \"application/json\" }),\r\n//   async (request, response) => {\r\n//     let event = request.body;\r\n//     console.log(\"stripe Request body:\", event);\r\n//     console.log(\"stripe Request headers:\", request.headers);\r\n//     // Only verify the event if you have an endpoint secret defined.\r\n//     // Otherwise use the basic event deserialized with JSON.parse\r\n//     if (endpointSecret) {\r\n//       // Get the signature sent by Stripe\r\n//       const signature = request.headers[\"stripe-signature\"]!;\r\n//       try {\r\n//         // Converting event buffer to a valid object.\r\n//         event = stripe.webhooks.constructEvent(\r\n//           request.body,\r\n//           signature,\r\n//           endpointSecret,\r\n//         );\r\n//       } catch (err: any) {\r\n//         console.log(`⚠️  Webhook signature verification failed.`, err.message);\r\n//         return response.status(400).json({\r\n//           message: err.message,\r\n//         });\r\n//       }\r\n//     }\r\n\r\n//     // Handle the event\r\n//     switch (event.type) {\r\n//       case \"payment_intent.succeeded\":\r\n//         const paymentIntent = event.data.object;\r\n//         console.log(\r\n//           `PaymentIntent for ${paymentIntent.amount} was successful!`,\r\n//         );\r\n//         // Then define and call a method to handle the successful payment intent.\r\n//         // handlePaymentIntentSucceeded(paymentIntent);\r\n//         break;\r\n//       case \"payment_method.attached\":\r\n//         const paymentMethod = event.data.object;\r\n//         // Then define and call a method to handle the successful attachment of a PaymentMethod.\r\n//         // handlePaymentMethodAttached(paymentMethod);\r\n//         break;\r\n//       default:\r\n//         // Unexpected event type\r\n//         console.log(`Unhandled event type ${event.type}.`);\r\n//     }\r\n\r\n//     // Return a 200 response to acknowledge receipt of the event\r\n//     response.send();\r\n//   },\r\n// );\r\n// ==================================\r\napp.use(express.json());\r\napp.use(express.urlencoded({ extended: true }));\r\napp.use(cookieParser());\r\n\r\napp.get(\"/\", (req: Request, res: Response) => {\r\n  res.send(\"Hello World!\");\r\n});\r\napp.use(\"/api/users\", userRoutes);\r\napp.use(\"/api/auth\", authRouter);\r\napp.use(\"/api/posts\", postRoutes);\r\napp.use(\"/api/comments\", commentRoutes);\r\n// app.use(\"/api/subscriptions\", subscriptionRoutes);\r\napp.use(\"/api/subscription\", subscriptionRoutes);\r\napp.use(\"/api/premium\", premiumRoutes);\r\n\r\napp.use(notFoundHandler);\r\n\r\napp.use(globalErrorHandler);\r\n\r\nexport default app;\r\n","import dotenv from \"dotenv\";\r\nimport path from \"path\";\r\n\r\ndotenv.config({ path: path.join(process.cwd(), \".env\") });\r\nexport default {\r\n  port: process.env.PORT || 5000,\r\n  database_url: process.env.DATABASE_URL!,\r\n  app_url: process.env.APP_URL!,\r\n  bcrypt_salt_rounds: process.env.BCRYPT_SALT_ROUNDS!,\r\n  jwt_access_secret: process.env.JWT_ACCESS_SECRET!,\r\n  jwt_refresh_secret: process.env.JWT_REFRESH_SECRET!,\r\n  jwt_access_expires_in: process.env.JWT_ACCESS_EXPIRES_IN!,\r\n  jwt_refresh_expires_in: process.env.JWT_REFRESH_EXPIRES_IN!,\r\n  stripe_product_price_id: process.env.STRIPE_PRODUCT_PRICE_ID!,\r\n  stripe_secret_key: process.env.STRIPE_SECRET_KEY!,\r\n  stripe_webhook_secret: process.env.STRIPE_WEBHOOK_SECRET!,\r\n};\r\n","import { NextFunction, Request, Response, Router } from \"express\";\r\nimport { userController } from \"./user.controller\";\r\nimport { jwtUtils } from \"../../utils/jwt\";\r\nimport config from \"../../config\";\r\nimport { Role } from \"../../../generated/prisma/enums\";\r\nimport httpStatus from \"http-status\";\r\nimport { catchAsync } from \"../../utils/catchAsync\";\r\nimport { JwtPayload } from \"jsonwebtoken\";\r\nimport { prisma } from \"../../lib/prisma\";\r\nimport { auth } from \"../../middlewares/auth\";\r\n\r\nconst router = Router();\r\n\r\nrouter.post(\"/register\", userController.registerUser);\r\n\r\nrouter.get(\r\n  \"/me\",\r\n  auth(Role.ADMIN, Role.AUTHOR, Role.USER),\r\n  userController.getMyProfile,\r\n);\r\n\r\nrouter.put(\r\n  \"/my-profile\",\r\n  auth(Role.ADMIN, Role.AUTHOR, Role.USER),\r\n  userController.updateMyProfile,\r\n);\r\n\r\nexport const userRoutes = router;\r\n","import httpStatus from \"http-status\";\r\nimport { NextFunction, Request, RequestHandler, Response } from \"express\";\r\nimport { userService } from \"./user.service\";\r\nimport { catchAsync } from \"../../utils/catchAsync\";\r\nimport { sendResponse } from \"../../utils/sendResponse\";\r\n\r\nconst registerUser = catchAsync(\r\n  async (req: Request, res: Response, next: NextFunction) => {\r\n    const payload = req.body;\r\n    const user = await userService.registerUserIntoDB(payload);\r\n\r\n    sendResponse(res, {\r\n      success: true,\r\n      statusCode: httpStatus.CREATED,\r\n      message: \"User registered Successfully.\",\r\n      data: {\r\n        user,\r\n      },\r\n    });\r\n  },\r\n);\r\n\r\nconst getMyProfile = catchAsync(\r\n  async (req: Request, res: Response, next: NextFunction) => {\r\n    const profile = await userService.getMyProfileFromDB(\r\n      req.user?.id as string,\r\n    );\r\n\r\n    sendResponse(res, {\r\n      success: true,\r\n      statusCode: httpStatus.OK,\r\n      message: \"User profile fetched Successfully!\",\r\n      data: {\r\n        profile,\r\n      },\r\n    });\r\n  },\r\n);\r\nconst updateMyProfile = catchAsync(\r\n  async (req: Request, res: Response, next: NextFunction) => {\r\n    const userId = req.user?.id as string;\r\n    const payload = req.body;\r\n\r\n    const updatedProfile = await userService.updateMyProfileFromDB(\r\n      userId,\r\n      payload,\r\n    );\r\n\r\n    sendResponse(res, {\r\n      success: true,\r\n      statusCode: httpStatus.CREATED,\r\n      message: \"User Profile Updated Successfully.\",\r\n      data: {\r\n        updatedProfile,\r\n      },\r\n    });\r\n  },\r\n);\r\n\r\nexport const userController = {\r\n  registerUser,\r\n  getMyProfile,\r\n  updateMyProfile,\r\n};\r\n","import bcrypt from \"bcryptjs\";\r\nimport { prisma } from \"../../lib/prisma\";\r\nimport config from \"../../config\";\r\nimport { RegisterUserPayload } from \"./user.interface\";\r\n\r\nconst registerUserIntoDB = async (payload: RegisterUserPayload) => {\r\n  const { name, email, password, profilePhoto } = payload;\r\n  const isUserExist = await prisma.user.findUnique({\r\n    where: { email },\r\n  });\r\n  // if (isUserExist) {\r\n  //   throw new Error(\"User with this email already exists.\");\r\n  // }\r\n  const hashedPassword = await bcrypt.hash(\r\n    password,\r\n    Number(config.bcrypt_salt_rounds),\r\n  );\r\n\r\n  const createdUser = await prisma.user.create({\r\n    data: {\r\n      name,\r\n      email,\r\n      password: hashedPassword,\r\n      profile: {\r\n        create: {\r\n          profilePhoto,\r\n        },\r\n      },\r\n    },\r\n  });\r\n\r\n  const user = await prisma.user.findUnique({\r\n    where: {\r\n      id: createdUser.id,\r\n      email: createdUser.email,\r\n    },\r\n    include: {\r\n      profile: true,\r\n    },\r\n    omit: {\r\n      password: true,\r\n    },\r\n  });\r\n  return user;\r\n};\r\n\r\nconst getMyProfileFromDB = async (userId: string) => {\r\n  const user = await prisma.user.findFirstOrThrow({\r\n    where: {\r\n      id: userId,\r\n    },\r\n    omit: {\r\n      password: true,\r\n    },\r\n    include: {\r\n      profile: true,\r\n    },\r\n  });\r\n  return user;\r\n};\r\n\r\nconst updateMyProfileFromDB = async (userId: string, payload: any) => {\r\n  const { name, email, profilePhoto, bio } = payload;\r\n\r\n  const updatedUser = await prisma.user.update({\r\n    where: {\r\n      id: userId,\r\n    },\r\n    data: {\r\n      name,\r\n      email,\r\n      profile: {\r\n        update: {\r\n          profilePhoto,\r\n          bio,\r\n        },\r\n      },\r\n    },\r\n    omit: {\r\n      password: true,\r\n    },\r\n    include: {\r\n      profile: true,\r\n    },\r\n  });\r\n  return updatedUser;\r\n};\r\n\r\nexport const userService = {\r\n  registerUserIntoDB,\r\n  getMyProfileFromDB,\r\n  updateMyProfileFromDB,\r\n};\r\n","import \"dotenv/config\";\r\nimport { PrismaPg } from \"@prisma/adapter-pg\";\r\nimport { PrismaClient } from \"../../generated/prisma/client\";\r\n\r\nconst connectionString = `${process.env.DATABASE_URL}`;\r\n\r\nconst adapter = new PrismaPg({ connectionString });\r\nconst prisma = new PrismaClient({ adapter });\r\n\r\nexport { prisma };\r\n","\n/* !!! This is code generated by Prisma. Do not edit directly. !!! */\n/* eslint-disable */\n// biome-ignore-all lint: generated file\n// @ts-nocheck \n/*\n * This file should be your main import to use Prisma. Through it you get access to all the models, enums, and input types.\n * If you're looking for something you can import in the client-side of your application, please refer to the `browser.ts` file instead.\n *\n * 🟢 You can import this file directly.\n */\n\nimport * as process from 'node:process'\nimport * as path from 'node:path'\nimport { fileURLToPath } from 'node:url'\nglobalThis['__dirname'] = path.dirname(fileURLToPath(import.meta.url))\n\nimport * as runtime from \"@prisma/client/runtime/client\"\nimport * as $Enums from \"./enums\"\nimport * as $Class from \"./internal/class\"\nimport * as Prisma from \"./internal/prismaNamespace\"\n\nexport * as $Enums from './enums'\nexport * from \"./enums\"\n/**\n * ## Prisma Client\n * \n * Type-safe database client for TypeScript\n * @example\n * ```\n * const prisma = new PrismaClient({\n *   adapter: new PrismaPg({ connectionString: process.env.DATABASE_URL })\n * })\n * // Fetch zero or more Comments\n * const comments = await prisma.comment.findMany()\n * ```\n * \n * Read more in our [docs](https://pris.ly/d/client).\n */\nexport const PrismaClient = $Class.getPrismaClientClass()\nexport type PrismaClient<LogOpts extends Prisma.LogLevel = never, OmitOpts extends Prisma.PrismaClientOptions[\"omit\"] = Prisma.PrismaClientOptions[\"omit\"], ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = $Class.PrismaClient<LogOpts, OmitOpts, ExtArgs>\nexport { Prisma }\n\n/**\n * Model Comment\n * \n */\nexport type Comment = Prisma.CommentModel\n/**\n * Model Post\n * \n */\nexport type Post = Prisma.PostModel\n/**\n * Model Profile\n * \n */\nexport type Profile = Prisma.ProfileModel\n/**\n * Model Subscription\n * \n */\nexport type Subscription = Prisma.SubscriptionModel\n/**\n * Model User\n * \n */\nexport type User = Prisma.UserModel\n","\n/* !!! This is code generated by Prisma. Do not edit directly. !!! */\n/* eslint-disable */\n// biome-ignore-all lint: generated file\n// @ts-nocheck \n/*\n * WARNING: This is an internal file that is subject to change!\n *\n * 🛑 Under no circumstances should you import this file directly! 🛑\n *\n * Please import the `PrismaClient` class from the `client.ts` file instead.\n */\n\nimport * as runtime from \"@prisma/client/runtime/client\"\nimport type * as Prisma from \"./prismaNamespace\"\n\n\nconst config: runtime.GetPrismaClientConfig = {\n  \"previewFeatures\": [],\n  \"clientVersion\": \"7.9.1\",\n  \"engineVersion\": \"e922089b7d7502aff4249d5da3420f6fa55fc6ad\",\n  \"activeProvider\": \"postgresql\",\n  \"inlineSchema\": \"model Comment {\\n  id      String @id @default(uuid())\\n  content String @db.Text\\n\\n  authorId String\\n  author   User   @relation(fields: [authorId], references: [id], onDelete: Cascade)\\n\\n  postId String\\n  post   Post   @relation(fields: [postId], references: [id], onDelete: Cascade)\\n\\n  status    CommentStatus @default(APPROVED)\\n  createdAt DateTime      @default(now())\\n  updatedAt DateTime      @updatedAt\\n\\n  @@index([postId])\\n  @@index([authorId])\\n  @@map(\\\"comments\\\")\\n}\\n\\nenum ActiveStatus {\\n  ACTIVE\\n  INACTIVE\\n  BLOCKED\\n}\\n\\nenum Role {\\n  USER\\n  AUTHOR\\n  ADMIN\\n}\\n\\nenum PostStatus {\\n  DRAFT\\n  PUBLISHED\\n  ARCHIVED\\n}\\n\\nenum CommentStatus {\\n  APPROVED\\n  REJECT\\n}\\n\\nenum SubscriptionStatus {\\n  ACTIVE\\n  INACTIVE\\n  EXPIRED\\n  CANCELED\\n}\\n\\nmodel Post {\\n  id         String     @id @default(uuid())\\n  title      String     @db.VarChar(255)\\n  content    String     @db.Text\\n  thumbnail  String?\\n  isFeatured Boolean    @default(false)\\n  status     PostStatus @default(PUBLISHED)\\n  tags       String[]\\n  views      Int        @default(0)\\n  isPremium  Boolean    @default(false)\\n\\n  authorId String\\n  author   User   @relation(fields: [authorId], references: [id], onDelete: Cascade)\\n\\n  comments  Comment[]\\n  createdAt DateTime  @default(now())\\n  updatedAt DateTime  @updatedAt\\n\\n  @@index([authorId])\\n  @@map(\\\"posts\\\")\\n}\\n\\nmodel Profile {\\n  id           String   @id @default(uuid())\\n  profilePhoto String?\\n  bio          String?\\n  userId       String   @unique\\n  user         User     @relation(fields: [userId], references: [id])\\n  createdAt    DateTime @default(now())\\n  updatedAt    DateTime @updatedAt\\n\\n  @@map(\\\"profiles\\\")\\n}\\n\\n// This is your Prisma schema file,\\n// learn more about it in the docs: https://pris.ly/d/prisma-schema\\n\\n// Get a free hosted Postgres database in seconds: `npx create-db`\\n\\ngenerator client {\\n  provider = \\\"prisma-client\\\"\\n  output   = \\\"../../generated/prisma\\\"\\n}\\n\\ndatasource db {\\n  provider = \\\"postgresql\\\"\\n}\\n\\nmodel Subscription {\\n  id String @id @default(uuid())\\n\\n  userId String @unique\\n  user   User   @relation(fields: [userId], references: [id], onDelete: Cascade)\\n\\n  currentPeriodEnd DateTime\\n  status           SubscriptionStatus @default(ACTIVE)\\n\\n  // stripe related ids\\n  // stripe customer id\\n  stripeCustomerId     String @unique\\n  // stripe subscription id\\n  stripeSubscriptionId String @unique\\n\\n  createdAt DateTime @default(now())\\n  updatedAt DateTime @updatedAt\\n\\n  @@map(\\\"subscriptions\\\")\\n}\\n\\nmodel User {\\n  id           String        @id @default(uuid())\\n  name         String        @db.VarChar(255)\\n  email        String        @unique\\n  password     String\\n  activeStatus ActiveStatus  @default(ACTIVE)\\n  role         Role          @default(USER)\\n  profile      Profile?\\n  posts        Post[]\\n  comments     Comment[]\\n  subscription Subscription?\\n  createdAt    DateTime      @default(now())\\n  updatedAt    DateTime      @updatedAt\\n\\n  @@map(\\\"users\\\")\\n}\\n\",\n  \"runtimeDataModel\": {\n    \"models\": {},\n    \"enums\": {},\n    \"types\": {}\n  },\n  \"parameterizationSchema\": {\n    \"strings\": [],\n    \"graph\": \"\"\n  }\n}\n\nconfig.runtimeDataModel = JSON.parse(\"{\\\"models\\\":{\\\"Comment\\\":{\\\"fields\\\":[{\\\"name\\\":\\\"id\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"content\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"authorId\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"author\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"User\\\",\\\"relationName\\\":\\\"CommentToUser\\\"},{\\\"name\\\":\\\"postId\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"post\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"Post\\\",\\\"relationName\\\":\\\"CommentToPost\\\"},{\\\"name\\\":\\\"status\\\",\\\"kind\\\":\\\"enum\\\",\\\"type\\\":\\\"CommentStatus\\\"},{\\\"name\\\":\\\"createdAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"},{\\\"name\\\":\\\"updatedAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"}],\\\"dbName\\\":\\\"comments\\\"},\\\"Post\\\":{\\\"fields\\\":[{\\\"name\\\":\\\"id\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"title\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"content\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"thumbnail\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"isFeatured\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Boolean\\\"},{\\\"name\\\":\\\"status\\\",\\\"kind\\\":\\\"enum\\\",\\\"type\\\":\\\"PostStatus\\\"},{\\\"name\\\":\\\"tags\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"views\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Int\\\"},{\\\"name\\\":\\\"isPremium\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Boolean\\\"},{\\\"name\\\":\\\"authorId\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"author\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"User\\\",\\\"relationName\\\":\\\"PostToUser\\\"},{\\\"name\\\":\\\"comments\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"Comment\\\",\\\"relationName\\\":\\\"CommentToPost\\\"},{\\\"name\\\":\\\"createdAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"},{\\\"name\\\":\\\"updatedAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"}],\\\"dbName\\\":\\\"posts\\\"},\\\"Profile\\\":{\\\"fields\\\":[{\\\"name\\\":\\\"id\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"profilePhoto\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"bio\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"userId\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"user\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"User\\\",\\\"relationName\\\":\\\"ProfileToUser\\\"},{\\\"name\\\":\\\"createdAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"},{\\\"name\\\":\\\"updatedAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"}],\\\"dbName\\\":\\\"profiles\\\"},\\\"Subscription\\\":{\\\"fields\\\":[{\\\"name\\\":\\\"id\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"userId\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"user\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"User\\\",\\\"relationName\\\":\\\"SubscriptionToUser\\\"},{\\\"name\\\":\\\"currentPeriodEnd\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"},{\\\"name\\\":\\\"status\\\",\\\"kind\\\":\\\"enum\\\",\\\"type\\\":\\\"SubscriptionStatus\\\"},{\\\"name\\\":\\\"stripeCustomerId\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"stripeSubscriptionId\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"createdAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"},{\\\"name\\\":\\\"updatedAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"}],\\\"dbName\\\":\\\"subscriptions\\\"},\\\"User\\\":{\\\"fields\\\":[{\\\"name\\\":\\\"id\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"name\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"email\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"password\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"activeStatus\\\",\\\"kind\\\":\\\"enum\\\",\\\"type\\\":\\\"ActiveStatus\\\"},{\\\"name\\\":\\\"role\\\",\\\"kind\\\":\\\"enum\\\",\\\"type\\\":\\\"Role\\\"},{\\\"name\\\":\\\"profile\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"Profile\\\",\\\"relationName\\\":\\\"ProfileToUser\\\"},{\\\"name\\\":\\\"posts\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"Post\\\",\\\"relationName\\\":\\\"PostToUser\\\"},{\\\"name\\\":\\\"comments\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"Comment\\\",\\\"relationName\\\":\\\"CommentToUser\\\"},{\\\"name\\\":\\\"subscription\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"Subscription\\\",\\\"relationName\\\":\\\"SubscriptionToUser\\\"},{\\\"name\\\":\\\"createdAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"},{\\\"name\\\":\\\"updatedAt\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"}],\\\"dbName\\\":\\\"users\\\"}},\\\"enums\\\":{},\\\"types\\\":{}}\")\nconfig.parameterizationSchema = {\n  strings: JSON.parse(\"[\\\"where\\\",\\\"user\\\",\\\"profile\\\",\\\"orderBy\\\",\\\"cursor\\\",\\\"author\\\",\\\"comments\\\",\\\"_count\\\",\\\"posts\\\",\\\"subscription\\\",\\\"post\\\",\\\"Comment.findUnique\\\",\\\"Comment.findUniqueOrThrow\\\",\\\"Comment.findFirst\\\",\\\"Comment.findFirstOrThrow\\\",\\\"Comment.findMany\\\",\\\"data\\\",\\\"Comment.createOne\\\",\\\"Comment.createMany\\\",\\\"Comment.createManyAndReturn\\\",\\\"Comment.updateOne\\\",\\\"Comment.updateMany\\\",\\\"Comment.updateManyAndReturn\\\",\\\"create\\\",\\\"update\\\",\\\"Comment.upsertOne\\\",\\\"Comment.deleteOne\\\",\\\"Comment.deleteMany\\\",\\\"having\\\",\\\"_min\\\",\\\"_max\\\",\\\"Comment.groupBy\\\",\\\"Comment.aggregate\\\",\\\"Post.findUnique\\\",\\\"Post.findUniqueOrThrow\\\",\\\"Post.findFirst\\\",\\\"Post.findFirstOrThrow\\\",\\\"Post.findMany\\\",\\\"Post.createOne\\\",\\\"Post.createMany\\\",\\\"Post.createManyAndReturn\\\",\\\"Post.updateOne\\\",\\\"Post.updateMany\\\",\\\"Post.updateManyAndReturn\\\",\\\"Post.upsertOne\\\",\\\"Post.deleteOne\\\",\\\"Post.deleteMany\\\",\\\"_avg\\\",\\\"_sum\\\",\\\"Post.groupBy\\\",\\\"Post.aggregate\\\",\\\"Profile.findUnique\\\",\\\"Profile.findUniqueOrThrow\\\",\\\"Profile.findFirst\\\",\\\"Profile.findFirstOrThrow\\\",\\\"Profile.findMany\\\",\\\"Profile.createOne\\\",\\\"Profile.createMany\\\",\\\"Profile.createManyAndReturn\\\",\\\"Profile.updateOne\\\",\\\"Profile.updateMany\\\",\\\"Profile.updateManyAndReturn\\\",\\\"Profile.upsertOne\\\",\\\"Profile.deleteOne\\\",\\\"Profile.deleteMany\\\",\\\"Profile.groupBy\\\",\\\"Profile.aggregate\\\",\\\"Subscription.findUnique\\\",\\\"Subscription.findUniqueOrThrow\\\",\\\"Subscription.findFirst\\\",\\\"Subscription.findFirstOrThrow\\\",\\\"Subscription.findMany\\\",\\\"Subscription.createOne\\\",\\\"Subscription.createMany\\\",\\\"Subscription.createManyAndReturn\\\",\\\"Subscription.updateOne\\\",\\\"Subscription.updateMany\\\",\\\"Subscription.updateManyAndReturn\\\",\\\"Subscription.upsertOne\\\",\\\"Subscription.deleteOne\\\",\\\"Subscription.deleteMany\\\",\\\"Subscription.groupBy\\\",\\\"Subscription.aggregate\\\",\\\"User.findUnique\\\",\\\"User.findUniqueOrThrow\\\",\\\"User.findFirst\\\",\\\"User.findFirstOrThrow\\\",\\\"User.findMany\\\",\\\"User.createOne\\\",\\\"User.createMany\\\",\\\"User.createManyAndReturn\\\",\\\"User.updateOne\\\",\\\"User.updateMany\\\",\\\"User.updateManyAndReturn\\\",\\\"User.upsertOne\\\",\\\"User.deleteOne\\\",\\\"User.deleteMany\\\",\\\"User.groupBy\\\",\\\"User.aggregate\\\",\\\"AND\\\",\\\"OR\\\",\\\"NOT\\\",\\\"id\\\",\\\"name\\\",\\\"email\\\",\\\"password\\\",\\\"ActiveStatus\\\",\\\"activeStatus\\\",\\\"Role\\\",\\\"role\\\",\\\"createdAt\\\",\\\"updatedAt\\\",\\\"equals\\\",\\\"in\\\",\\\"notIn\\\",\\\"lt\\\",\\\"lte\\\",\\\"gt\\\",\\\"gte\\\",\\\"not\\\",\\\"contains\\\",\\\"startsWith\\\",\\\"endsWith\\\",\\\"every\\\",\\\"some\\\",\\\"none\\\",\\\"userId\\\",\\\"currentPeriodEnd\\\",\\\"SubscriptionStatus\\\",\\\"status\\\",\\\"stripeCustomerId\\\",\\\"stripeSubscriptionId\\\",\\\"profilePhoto\\\",\\\"bio\\\",\\\"title\\\",\\\"content\\\",\\\"thumbnail\\\",\\\"isFeatured\\\",\\\"PostStatus\\\",\\\"tags\\\",\\\"views\\\",\\\"isPremium\\\",\\\"authorId\\\",\\\"has\\\",\\\"hasEvery\\\",\\\"hasSome\\\",\\\"postId\\\",\\\"CommentStatus\\\",\\\"is\\\",\\\"isNot\\\",\\\"connectOrCreate\\\",\\\"upsert\\\",\\\"disconnect\\\",\\\"delete\\\",\\\"connect\\\",\\\"createMany\\\",\\\"set\\\",\\\"updateMany\\\",\\\"deleteMany\\\",\\\"increment\\\",\\\"decrement\\\",\\\"multiply\\\",\\\"divide\\\",\\\"push\\\"]\"),\n  graph: \"vwItUAwFAACjAQAgCgAAvAEAIGMAALoBADBkAAAJABBlAAC6AQAwZgEAAAABbkAAmAEAIW9AAJgBACGBAQAAuwGUASKHAQEAlQEAIY4BAQCVAQAhkgEBAJUBACEBAAAAAQAgCgEAAKMBACBjAACpAQAwZAAAAwAQZQAAqQEAMGYBAJUBACFuQACYAQAhb0AAmAEAIX4BAJUBACGEAQEAqgEAIYUBAQCqAQAhAQAAAAMAIBEFAACjAQAgBgAAmwEAIGMAAL0BADBkAAAFABBlAAC9AQAwZgEAlQEAIW5AAJgBACFvQACYAQAhgQEAAL8BiwEihgEBAJUBACGHAQEAlQEAIYgBAQCqAQAhiQEgAL4BACGLAQAArgEAIIwBAgDAAQAhjQEgAL4BACGOAQEAlQEAIQMFAACSAgAgBgAAiwIAIIgBAACTAgAgEQUAAKMBACAGAACbAQAgYwAAvQEAMGQAAAUAEGUAAL0BADBmAQAAAAFuQACYAQAhb0AAmAEAIYEBAAC_AYsBIoYBAQCVAQAhhwEBAJUBACGIAQEAqgEAIYkBIAC-AQAhiwEAAK4BACCMAQIAwAEAIY0BIAC-AQAhjgEBAJUBACEDAAAABQAgAwAABgAwBAAABwAgDAUAAKMBACAKAAC8AQAgYwAAugEAMGQAAAkAEGUAALoBADBmAQCVAQAhbkAAmAEAIW9AAJgBACGBAQAAuwGUASKHAQEAlQEAIY4BAQCVAQAhkgEBAJUBACECBQAAkgIAIAoAAKMCACADAAAACQAgAwAACgAwBAAAAQAgAQAAAAkAIAMAAAAJACADAAAKADAEAAABACAMAQAAowEAIGMAAKEBADBkAAAOABBlAAChAQAwZgEAlQEAIW5AAJgBACFvQACYAQAhfgEAlQEAIX9AAJgBACGBAQAAogGBASKCAQEAlQEAIYMBAQCVAQAhAQAAAA4AIAEAAAAFACABAAAACQAgAQAAAAEAIAMAAAAJACADAAAKADAEAAABACADAAAACQAgAwAACgAwBAAAAQAgAwAAAAkAIAMAAAoAMAQAAAEAIAkFAAD8AQAgCgAA4AEAIGYBAAAAAW5AAAAAAW9AAAAAAYEBAAAAlAEChwEBAAAAAY4BAQAAAAGSAQEAAAABARAAABYAIAdmAQAAAAFuQAAAAAFvQAAAAAGBAQAAAJQBAocBAQAAAAGOAQEAAAABkgEBAAAAAQEQAAAYADABEAAAGAAwCQUAAPoBACAKAADeAQAgZgEAxAEAIW5AAMcBACFvQADHAQAhgQEAANwBlAEihwEBAMQBACGOAQEAxAEAIZIBAQDEAQAhAgAAAAEAIBAAABsAIAdmAQDEAQAhbkAAxwEAIW9AAMcBACGBAQAA3AGUASKHAQEAxAEAIY4BAQDEAQAhkgEBAMQBACECAAAACQAgEAAAHQAgAgAAAAkAIBAAAB0AIAMAAAABACAXAAAWACAYAAAbACABAAAAAQAgAQAAAAkAIAMHAACgAgAgHQAAogIAIB4AAKECACAKYwAAtgEAMGQAACQAEGUAALYBADBmAQCHAQAhbkAAigEAIW9AAIoBACGBAQAAtwGUASKHAQEAhwEAIY4BAQCHAQAhkgEBAIcBACEDAAAACQAgAwAAIwAwHAAAJAAgAwAAAAkAIAMAAAoAMAQAAAEAIAEAAAAHACABAAAABwAgAwAAAAUAIAMAAAYAMAQAAAcAIAMAAAAFACADAAAGADAEAAAHACADAAAABQAgAwAABgAwBAAABwAgDgUAAJ8CACAGAAD_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_QADHAQAhgQEAANEBgQEiggEBAMQBACGDAQEAxAEAIQIAAAAOACAQAABjACACAAAADgAgEAAAYwAgAwAAAFUAIBcAAFwAIBgAAGEAIAEAAABVACABAAAADgAgAwcAAI0CACAdAACPAgAgHgAAjgIAIAtjAACdAQAwZAAAagAQZQAAnQEAMGYBAIcBACFuQACKAQAhb0AAigEAIX4BAIcBACF_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_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_AYsBIoYBAQCVAQAhhwEBAJUBACGIAQEAqgEAIYkBIAC-AQAhiwEAAK4BACCMAQIAwAEAIY0BIAC-AQAhjgEBAJUBACECcCAAAAABdyAAtQEAIQRwAAAAiwECcQAAAIsBCHIAAACLAQh3AACzAYsBIghwAgAAAAFxAgAAAARyAgAAAARzAgAAAAF0AgAAAAF1AgAAAAF2AgAAAAF3AgCMAQAhAAAAAZwBAQAAAAEBnAEAAABrAgGcAQAAAG0CAZwBQAAAAAEHFwAAgAIAIBgAAIMCACCWAQAAgQIAIJcBAACCAgAgmAEAAAMAIJkBAAADACCaAQAAPQAgCxcAAOEBADAYAADmAQAwlgEAAOIBADCXAQAA4wEAMJgBAADlAQAwmQEAAOUBADCaAQAA5QEAMJsBAADkAQAgnAEAAOUBADCdAQAA5wEAMJ4BAADoAQAwCxcAANIBADAYAADXAQAwlgEAANMBADCXAQAA1AEAMJgBAADWAQAwmQEAANYBADCaAQAA1gEAMJsBAADVAQAgnAEAANYBADCdAQAA2AEAMJ4BAADZAQAwBxcAAMwBACAYAADPAQAglgEAAM0BACCXAQAAzgEAIJgBAAAOACCZAQAADgAgmgEAAFUAIAdmAQAAAAFuQAAAAAFvQAAAAAF_QAAAAAGBAQAAAIEBAoIBAQAAAAGDAQEAAAABAgAAAFUAIBcAAMwBACADAAAADgAgFwAAzAEAIBgAANABACAJAAAADgAgEAAA0AEAIGYBAMQBACFuQADHAQAhb0AAxwEAIX9AAMcBACGBAQAA0QGBASKCAQEAxAEAIYMBAQDEAQAhB2YBAMQBACFuQADHAQAhb0AAxwEAIX9AAMcBACGBAQAA0QGBASKCAQEAxAEAIYMBAQDEAQAhAZwBAAAAgQECBwoAAOABACBmAQAAAAFuQAAAAAFvQAAAAAGBAQAAAJQBAocBAQAAAAGSAQEAAAABAgAAAAEAIBcAAN8BACADAAAAAQAgFwAA3wEAIBgAAN0BACABEAAAvwIAMAwFAACjAQAgCgAAvAEAIGMAALoBADBkAAAJABBlAAC6AQAwZgEAAAABbkAAmAEAIW9AAJgBACGBAQAAuwGUASKHAQEAlQEAIY4BAQCVAQAhkgEBAJUBACECAAAAAQAgEAAA3QEAIAIAAADaAQAgEAAA2wEAIApjAADZAQAwZAAA2gEAEGUAANkBADBmAQCVAQAhbkAAmAEAIW9AAJgBACGBAQAAuwGUASKHAQEAlQEAIY4BAQCVAQAhkgEBAJUBACEKYwAA2QEAMGQAANoBABBlAADZAQAwZgEAlQEAIW5AAJgBACFvQACYAQAhgQEAALsBlAEihwEBAJUBACGOAQEAlQEAIZIBAQCVAQAhBmYBAMQBACFuQADHAQAhb0AAxwEAIYEBAADcAZQBIocBAQDEAQAhkgEBAMQBACEBnAEAAACUAQIHCgAA3gEAIGYBAMQBACFuQADHAQAhb0AAxwEAIYEBAADcAZQBIocBAQDEAQAhkgEBAMQBACEFFwAAugIAIBgAAL0CACCWAQAAuwIAIJcBAAC8AgAgmgEAAAcAIAcKAADgAQAgZgEAAAABbkAAAAABb0AAAAABgQEAAACUAQKHAQEAAAABkgEBAAAAAQMXAAC6AgAglgEAALsCACCaAQAABwAgDAYAAP8BACBmAQAAAAFuQAAAAAFvQAAAAAGBAQAAAIsBAoYBAQAAAAGHAQEAAAABiAEBAAAAAYkBIAAAAAGLAQAA_gEAIIwBAgAAAAGNASAAAAABAgAAAAcAIBcAAP0BACADAAAABwAgFwAA_QEAIBgAAPABACABEAAAuQIAMBEFAACjAQAgBgAAmwEAIGMAAL0BADBkAAAFABBlAAC9AQAwZgEAAAABbkAAmAEAIW9AAJgBACGBAQAAvwGLASKGAQEAlQEAIYcBAQCVAQAhiAEBAKoBACGJASAAvgEAIYsBAACuAQAgjAECAMABACGNASAAvgEAIY4BAQCVAQAhAgAAAAcAIBAAAPABACACAAAA6QEAIBAAAOoBACAPYwAA6AEAMGQAAOkBABBlAADoAQAwZgEAlQEAIW5AAJgBACFvQACYAQAhgQEAAL8BiwEihgEBAJUBACGHAQEAlQEAIYgBAQCqAQAhiQEgAL4BACGLAQAArgEAIIwBAgDAAQAhjQEgAL4BACGOAQEAlQEAIQ9jAADoAQAwZAAA6QEAEGUAAOgBADBmAQCVAQAhbkAAmAEAIW9AAJgBACGBAQAAvwGLASKGAQEAlQEAIYcBAQCVAQAhiAEBAKoBACGJASAAvgEAIYsBAACuAQAgjAECAMABACGNASAAvgEAIY4BAQCVAQAhC2YBAMQBACFuQADHAQAhb0AAxwEAIYEBAADtAYsBIoYBAQDEAQAhhwEBAMQBACGIAQEA6wEAIYkBIADsAQAhiwEAAO4BACCMAQIA7wEAIY0BIADsAQAhAZwBAQAAAAEBnAEgAAAAAQGcAQAAAIsBAgKcAQEAAAAEowEBAAAABQWcAQIAAAABnwECAAAAAaABAgAAAAGhAQIAAAABogECAAAAAQwGAADxAQAgZgEAxAEAIW5AAMcBACFvQADHAQAhgQEAAO0BiwEihgEBAMQBACGHAQEAxAEAIYgBAQDrAQAhiQEgAOwBACGLAQAA7gEAIIwBAgDvAQAhjQEgAOwBACELFwAA8gEAMBgAAPYBADCWAQAA8wEAMJcBAAD0AQAwmAEAANYBADCZAQAA1gEAMJoBAADWAQAwmwEAAPUBACCcAQAA1gEAMJ0BAAD3AQAwngEAANkBADAHBQAA_AEAIGYBAAAAAW5AAAAAAW9AAAAAAYEBAAAAlAEChwEBAAAAAY4BAQAAAAECAAAAAQAgFwAA-wEAIAMAAAABACAXAAD7AQAgGAAA-QEAIAEQAAC4AgAwAgAAAAEAIBAAAPkBACACAAAA2gEAIBAAAPgBACAGZgEAxAEAIW5AAMcBACFvQADHAQAhgQEAANwBlAEihwEBAMQBACGOAQEAxAEAIQcFAAD6AQAgZgEAxAEAIW5AAMcBACFvQADHAQAhgQEAANwBlAEihwEBAMQBACGOAQEAxAEAIQUXAACzAgAgGAAAtgIAIJYBAAC0AgAglwEAALUCACCaAQAAbQAgBwUAAPwBACBmAQAAAAFuQAAAAAFvQAAAAAGBAQAAAJQBAocBAQAAAAGOAQEAAAABAxcAALMCACCWAQAAtAIAIJoBAABtACAMBgAA_wEAIGYBAAAAAW5AAAAAAW9AAAAAAYEBAAAAiwEChgEBAAAAAYcBAQAAAAGIAQEAAAABiQEgAAAAAYsBAAD-AQAgjAECAAAAAY0BIAAAAAEBnAEBAAAABAQXAADyAQAwlgEAAPMBADCaAQAA1gEAMJsBAAD1AQAgBWYBAAAAAW5AAAAAAW9AAAAAAYQBAQAAAAGFAQEAAAABAgAAAD0AIBcAAIACACADAAAAAwAgFwAAgAIAIBgAAIQCACAHAAAAAwAgEAAAhAIAIGYBAMQBACFuQADHAQAhb0AAxwEAIYQBAQDrAQAhhQEBAOsBACEFZgEAxAEAIW5AAMcBACFvQADHAQAhhAEBAOsBACGFAQEA6wEAIQMXAACAAgAglgEAAIECACCaAQAAPQAgBBcAAOEBADCWAQAA4gEAMJoBAADlAQAwmwEAAOQBACAEFwAA0gEAMJYBAADTAQAwmgEAANYBADCbAQAA1QEAIAMXAADMAQAglgEAAM0BACCaAQAAVQAgAwEAAJICACCEAQAAkwIAIIUBAACTAgAgAAABAQAAkgIAIAAAAAUXAACuAgAgGAAAsQIAIJYBAACvAgAglwEAALACACCaAQAAbQAgAxcAAK4CACCWAQAArwIAIJoBAABtACAEAgAAiQIAIAYAAIsCACAIAACKAgAgCQAAjAIAIAAAAAAFFwAAqQIAIBgAAKwCACCWAQAAqgIAIJcBAACrAgAgmgEAAG0AIAMXAACpAgAglgEAAKoCACCaAQAAbQAgAAAAAAAFFwAApAIAIBgAAKcCACCWAQAApQIAIJcBAACmAgAgmgEAAG0AIAMXAACkAgAglgEAAKUCACCaAQAAbQAgAAAAAwUAAJICACAGAACLAgAgiAEAAJMCACALAgAAhQIAIAYAAIcCACAJAACIAgAgZgEAAAABZwEAAAABaAEAAAABaQEAAAABawAAAGsCbQAAAG0CbkAAAAABb0AAAAABAgAAAG0AIBcAAKQCACADAAAAcAAgFwAApAIAIBgAAKgCACANAAAAcAAgAgAAyAEAIAYAAMoBACAJAADLAQAgEAAAqAIAIGYBAMQBACFnAQDEAQAhaAEAxAEAIWkBAMQBACFrAADFAWsibQAAxgFtIm5AAMcBACFvQADHAQAhCwIAAMgBACAGAADKAQAgCQAAywEAIGYBAMQBACFnAQDEAQAhaAEAxAEAIWkBAMQBACFrAADFAWsibQAAxgFtIm5AAMcBACFvQADHAQAhCwYAAIcCACAIAACGAgAgCQAAiAIAIGYBAAAAAWcBAAAAAWgBAAAAAWkBAAAAAWsAAABrAm0AAABtAm5AAAAAAW9AAAAAAQIAAABtACAXAACpAgAgAwAAAHAAIBcAAKkCACAYAACtAgAgDQAAAHAAIAYAAMoBACAIAADJAQAgCQAAywEAIBAAAK0CACBmAQDEAQAhZwEAxAEAIWgBAMQBACFpAQDEAQAhawAAxQFrIm0AAMYBbSJuQADHAQAhb0AAxwEAIQsGAADKAQAgCAAAyQEAIAkAAMsBACBmAQDEAQAhZwEAxAEAIWgBAMQBACFpAQDEAQAhawAAxQFrIm0AAMYBbSJuQADHAQAhb0AAxwEAIQsCAACFAgAgBgAAhwIAIAgAAIYCACBmAQAAAAFnAQAAAAFoAQAAAAFpAQAAAAFrAAAAawJtAAAAbQJuQAAAAAFvQAAAAAECAAAAbQAgFwAArgIAIAMAAABwACAXAACuAgAgGAAAsgIAIA0AAABwACACAADIAQAgBgAAygEAIAgAAMkBACAQAACyAgAgZgEAxAEAIWcBAMQBACFoAQDEAQAhaQEAxAEAIWsAAMUBayJtAADGAW0ibkAAxwEAIW9AAMcBACELAgAAyAEAIAYAAMoBACAIAADJAQAgZgEAxAEAIWcBAMQBACFoAQDEAQAhaQEAxAEAIWsAAMUBayJtAADGAW0ibkAAxwEAIW9AAMcBACELAgAAhQIAIAgAAIYCACAJAACIAgAgZgEAAAABZwEAAAABaAEAAAABaQEAAAABawAAAGsCbQAAAG0CbkAAAAABb0AAAAABAgAAAG0AIBcAALMCACADAAAAcAAgFwAAswIAIBgAALcCACANAAAAcAAgAgAAyAEAIAgAAMkBACAJAADLAQAgEAAAtwIAIGYBAMQBACFnAQDEAQAhaAEAxAEAIWkBAMQBACFrAADFAWsibQAAxgFtIm5AAMcBACFvQADHAQAhCwIAAMgBACAIAADJAQAgCQAAywEAIGYBAMQBACFnAQDEAQAhaAEAxAEAIWkBAMQBACFrAADFAWsibQAAxgFtIm5AAMcBACFvQADHAQAhBmYBAAAAAW5AAAAAAW9AAAAAAYEBAAAAlAEChwEBAAAAAY4BAQAAAAELZgEAAAABbkAAAAABb0AAAAABgQEAAACLAQKGAQEAAAABhwEBAAAAAYgBAQAAAAGJASAAAAABiwEAAP4BACCMAQIAAAABjQEgAAAAAQ0FAACfAgAgZgEAAAABbkAAAAABb0AAAAABgQEAAACLAQKGAQEAAAABhwEBAAAAAYgBAQAAAAGJASAAAAABiwEAAP4BACCMAQIAAAABjQEgAAAAAY4BAQAAAAECAAAABwAgFwAAugIAIAMAAAAFACAXAAC6AgAgGAAAvgIAIA8AAAAFACAFAACeAgAgEAAAvgIAIGYBAMQBACFuQADHAQAhb0AAxwEAIYEBAADtAYsBIoYBAQDEAQAhhwEBAMQBACGIAQEA6wEAIYkBIADsAQAhiwEAAO4BACCMAQIA7wEAIY0BIADsAQAhjgEBAMQBACENBQAAngIAIGYBAMQBACFuQADHAQAhb0AAxwEAIYEBAADtAYsBIoYBAQDEAQAhhwEBAMQBACGIAQEA6wEAIYkBIADsAQAhiwEAAO4BACCMAQIA7wEAIY0BIADsAQAhjgEBAMQBACEGZgEAAAABbkAAAAABb0AAAAABgQEAAACUAQKHAQEAAAABkgEBAAAAAQIFAAIKAAQFAgQDBg0BBwAHCAgECQ8GAQEAAgMFAAIGCwEHAAUBBgwAAQEAAgIGEQAIEAAAAgUAAgoABAIFAAIKAAQDBwAMHQANHgAOAAAAAwcADB0ADR4ADgEFAAIBBQACBQcAEx0AFh4AFy8AFDAAFQAAAAAABQcAEx0AFh4AFy8AFDAAFQEBAAIBAQACAwcAHB0AHR4AHgAAAAMHABwdAB0eAB4BAQACAQEAAgMHACMdACQeACUAAAADBwAjHQAkHgAlAAADBwAqHQArHgAsAAAAAwcAKh0AKx4ALAsCAQwSAQ0TAQ4UAQ8VAREXARIZCBMaCRQcARUeCBYfChkgARohARsiCB8lCyAmDyEnBCIoBCMpBCQqBCUrBCYtBCcvCCgwECkyBCo0CCs1ESw2BC03BC44CDE7EjI8GDM-AzQ_AzVBAzZCAzdDAzhFAzlHCDpIGTtKAzxMCD1NGj5OAz9PA0BQCEFTG0JUH0NWBkRXBkVZBkZaBkdbBkhdBklfCEpgIEtiBkxkCE1lIU5mBk9nBlBoCFFrIlJsJlNuAlRvAlVyAlZzAld0Alh2All4CFp5J1t7Alx9CF1-KF5_Al-AAQJggQEIYYQBKWKFAS0\"\n}\n\nasync function decodeBase64AsWasm(wasmBase64: string): Promise<WebAssembly.Module> {\n  const { Buffer } = await import('node:buffer')\n  const wasmArray = Buffer.from(wasmBase64, 'base64')\n  return new WebAssembly.Module(wasmArray)\n}\n\nconfig.compilerWasm = {\n  getRuntime: async () => await import(\"@prisma/client/runtime/query_compiler_fast_bg.postgresql.mjs\"),\n\n  getQueryCompilerWasmModule: async () => {\n    const { wasm } = await import(\"@prisma/client/runtime/query_compiler_fast_bg.postgresql.wasm-base64.mjs\")\n    return await decodeBase64AsWasm(wasm)\n  },\n\n  importName: \"./query_compiler_fast_bg.js\"\n}\n\n\n\nexport type LogOptions<ClientOptions extends Prisma.PrismaClientOptions> =\n  'log' extends keyof ClientOptions ? ClientOptions['log'] extends Array<Prisma.LogLevel | Prisma.LogDefinition> ? Prisma.GetEvents<ClientOptions['log']> : never : never\n\nexport interface PrismaClientConstructor {\n    /**\n   * ## Prisma Client\n   * \n   * Type-safe database client for TypeScript\n   * @example\n   * ```\n   * const prisma = new PrismaClient({\n   *   adapter: new PrismaPg({ connectionString: process.env.DATABASE_URL })\n   * })\n   * // Fetch zero or more Comments\n   * const comments = await prisma.comment.findMany()\n   * ```\n   * \n   * Read more in our [docs](https://pris.ly/d/client).\n   */\n\n  new <\n    Options extends Prisma.PrismaClientOptions = Prisma.PrismaClientOptions,\n    LogOpts extends LogOptions<Options> = LogOptions<Options>,\n    OmitOpts extends Prisma.PrismaClientOptions['omit'] = Options extends { omit: infer U } ? U : Prisma.PrismaClientOptions['omit'],\n    ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs\n  >(options: Prisma.PrismaClientConstructorArgs<Options>): PrismaClient<LogOpts, OmitOpts, ExtArgs>\n}\n\n/**\n * ## Prisma Client\n * \n * Type-safe database client for TypeScript\n * @example\n * ```\n * const prisma = new PrismaClient({\n *   adapter: new PrismaPg({ connectionString: process.env.DATABASE_URL })\n * })\n * // Fetch zero or more Comments\n * const comments = await prisma.comment.findMany()\n * ```\n * \n * Read more in our [docs](https://pris.ly/d/client).\n */\n\nexport interface PrismaClient<\n  in LogOpts extends Prisma.LogLevel = never,\n  in out OmitOpts extends Prisma.PrismaClientOptions['omit'] = Prisma.PrismaClientOptions['omit'],\n  in out ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs\n> {\n  [K: symbol]: { types: Prisma.TypeMap<ExtArgs>['other'] }\n\n  $on<V extends LogOpts>(eventType: V, callback: (event: V extends 'query' ? Prisma.QueryEvent : Prisma.LogEvent) => void): PrismaClient;\n\n  /**\n   * Connect with the database\n   */\n  $connect(): runtime.Types.Utils.JsPromise<void>;\n\n  /**\n   * Disconnect from the database\n   */\n  $disconnect(): runtime.Types.Utils.JsPromise<void>;\n\n/**\n   * Executes a prepared raw query and returns the number of affected rows.\n   * @example\n   * ```\n   * const result = await prisma.$executeRaw`UPDATE User SET cool = ${true} WHERE email = ${'user@email.com'};`\n   * ```\n   *\n   * Read more in our [docs](https://pris.ly/d/raw-queries).\n   */\n  $executeRaw<T = unknown>(query: TemplateStringsArray | Prisma.Sql, ...values: any[]): Prisma.PrismaPromise<number>;\n\n  /**\n   * Executes a raw query and returns the number of affected rows.\n   * Susceptible to SQL injections, see documentation.\n   * @example\n   * ```\n   * const result = await prisma.$executeRawUnsafe('UPDATE User SET cool = $1 WHERE email = $2 ;', true, 'user@email.com')\n   * ```\n   *\n   * Read more in our [docs](https://pris.ly/d/raw-queries).\n   */\n  $executeRawUnsafe<T = unknown>(query: string, ...values: any[]): Prisma.PrismaPromise<number>;\n\n  /**\n   * Performs a prepared raw query and returns the `SELECT` data.\n   * @example\n   * ```\n   * const result = await prisma.$queryRaw`SELECT * FROM User WHERE id = ${1} OR email = ${'user@email.com'};`\n   * ```\n   *\n   * Read more in our [docs](https://pris.ly/d/raw-queries).\n   */\n  $queryRaw<T = unknown>(query: TemplateStringsArray | Prisma.Sql, ...values: any[]): Prisma.PrismaPromise<T>;\n\n  /**\n   * Performs a raw query and returns the `SELECT` data.\n   * Susceptible to SQL injections, see documentation.\n   * @example\n   * ```\n   * const result = await prisma.$queryRawUnsafe('SELECT * FROM User WHERE id = $1 OR email = $2;', 1, 'user@email.com')\n   * ```\n   *\n   * Read more in our [docs](https://pris.ly/d/raw-queries).\n   */\n  $queryRawUnsafe<T = unknown>(query: string, ...values: any[]): Prisma.PrismaPromise<T>;\n\n\n  /**\n   * Allows the running of a sequence of read/write operations that are guaranteed to either succeed or fail as a whole.\n   * @example\n   * ```\n   * const [george, bob, alice] = await prisma.$transaction([\n   *   prisma.user.create({ data: { name: 'George' } }),\n   *   prisma.user.create({ data: { name: 'Bob' } }),\n   *   prisma.user.create({ data: { name: 'Alice' } }),\n   * ])\n   * ```\n   * \n   * Read more in our [docs](https://www.prisma.io/docs/orm/prisma-client/queries/transactions).\n   */\n  $transaction<P extends Prisma.PrismaPromise<any>[]>(arg: [...P], options?: { maxWait?: number, timeout?: number, isolationLevel?: Prisma.TransactionIsolationLevel }): runtime.Types.Utils.JsPromise<runtime.Types.Utils.UnwrapTuple<P>>\n\n  $transaction<R>(fn: (prisma: Omit<PrismaClient, runtime.ITXClientDenyList>) => runtime.Types.Utils.JsPromise<R>, options?: { maxWait?: number, timeout?: number, isolationLevel?: Prisma.TransactionIsolationLevel }): runtime.Types.Utils.JsPromise<R>\n\n  $extends: runtime.Types.Extensions.ExtendsHook<\"extends\", Prisma.TypeMapCb<OmitOpts>, ExtArgs, runtime.Types.Utils.Call<Prisma.TypeMapCb<OmitOpts>, {\n    extArgs: ExtArgs\n  }>>\n\n      /**\n   * `prisma.comment`: Exposes CRUD operations for the **Comment** model.\n    * Example usage:\n    * ```ts\n    * // Fetch zero or more Comments\n    * const comments = await prisma.comment.findMany()\n    * ```\n    */\n  get comment(): Prisma.CommentDelegate<ExtArgs, { omit: OmitOpts }>;\n\n  /**\n   * `prisma.post`: Exposes CRUD operations for the **Post** model.\n    * Example usage:\n    * ```ts\n    * // Fetch zero or more Posts\n    * const posts = await prisma.post.findMany()\n    * ```\n    */\n  get post(): Prisma.PostDelegate<ExtArgs, { omit: OmitOpts }>;\n\n  /**\n   * `prisma.profile`: Exposes CRUD operations for the **Profile** model.\n    * Example usage:\n    * ```ts\n    * // Fetch zero or more Profiles\n    * const profiles = await prisma.profile.findMany()\n    * ```\n    */\n  get profile(): Prisma.ProfileDelegate<ExtArgs, { omit: OmitOpts }>;\n\n  /**\n   * `prisma.subscription`: Exposes CRUD operations for the **Subscription** model.\n    * Example usage:\n    * ```ts\n    * // Fetch zero or more Subscriptions\n    * const subscriptions = await prisma.subscription.findMany()\n    * ```\n    */\n  get subscription(): Prisma.SubscriptionDelegate<ExtArgs, { omit: OmitOpts }>;\n\n  /**\n   * `prisma.user`: Exposes CRUD operations for the **User** model.\n    * Example usage:\n    * ```ts\n    * // Fetch zero or more Users\n    * const users = await prisma.user.findMany()\n    * ```\n    */\n  get user(): Prisma.UserDelegate<ExtArgs, { omit: OmitOpts }>;\n}\n\nexport function getPrismaClientClass(): PrismaClientConstructor {\n  return runtime.getPrismaClient(config) as unknown as PrismaClientConstructor\n}\n","\n/* !!! This is code generated by Prisma. Do not edit directly. !!! */\n/* eslint-disable */\n// biome-ignore-all lint: generated file\n// @ts-nocheck \n/*\n * WARNING: This is an internal file that is subject to change!\n *\n * 🛑 Under no circumstances should you import this file directly! 🛑\n *\n * All exports from this file are wrapped under a `Prisma` namespace object in the client.ts file.\n * While this enables partial backward compatibility, it is not part of the stable public API.\n *\n * If you are looking for your Models, Enums, and Input Types, please import them from the respective\n * model files in the `model` directory!\n */\n\nimport * as runtime from \"@prisma/client/runtime/client\"\nimport type * as Prisma from \"../models\"\nimport { type PrismaClient } from \"./class\"\n\nexport type * from '../models'\n\nexport type DMMF = typeof runtime.DMMF\n\nexport type PrismaPromise<T> = runtime.Types.Public.PrismaPromise<T>\n\n/**\n * Prisma Errors\n */\n\nexport const PrismaClientKnownRequestError = runtime.PrismaClientKnownRequestError\nexport type PrismaClientKnownRequestError = runtime.PrismaClientKnownRequestError\n\nexport const PrismaClientUnknownRequestError = runtime.PrismaClientUnknownRequestError\nexport type PrismaClientUnknownRequestError = runtime.PrismaClientUnknownRequestError\n\nexport const PrismaClientRustPanicError = runtime.PrismaClientRustPanicError\nexport type PrismaClientRustPanicError = runtime.PrismaClientRustPanicError\n\nexport const PrismaClientInitializationError = runtime.PrismaClientInitializationError\nexport type PrismaClientInitializationError = runtime.PrismaClientInitializationError\n\nexport const PrismaClientValidationError = runtime.PrismaClientValidationError\nexport type PrismaClientValidationError = runtime.PrismaClientValidationError\n\n/**\n * Re-export of sql-template-tag\n */\nexport const sql = runtime.sqltag\nexport const empty = runtime.empty\nexport const join = runtime.join\nexport const raw = runtime.raw\nexport const Sql = runtime.Sql\nexport type Sql = runtime.Sql\n\n\n\n/**\n * Decimal.js\n */\nexport const Decimal = runtime.Decimal\nexport type Decimal = runtime.Decimal\n\nexport type DecimalJsLike = runtime.DecimalJsLike\n\n/**\n* Extensions\n*/\nexport type Extension = runtime.Types.Extensions.UserArgs\nexport const getExtensionContext = runtime.Extensions.getExtensionContext\nexport type Args<T, F extends runtime.Operation> = runtime.Types.Public.Args<T, F>\nexport type Payload<T, F extends runtime.Operation = never> = runtime.Types.Public.Payload<T, F>\nexport type Result<T, A, F extends runtime.Operation> = runtime.Types.Public.Result<T, A, F>\nexport type Exact<A, W> = runtime.Types.Public.Exact<A, W>\n\nexport type PrismaVersion = {\n  client: string\n  engine: string\n}\n\n/**\n * Prisma Client JS version: 7.9.1\n * Query Engine version: e922089b7d7502aff4249d5da3420f6fa55fc6ad\n */\nexport const prismaVersion: PrismaVersion = {\n  client: \"7.9.1\",\n  engine: \"e922089b7d7502aff4249d5da3420f6fa55fc6ad\"\n}\n\n/**\n * Utility Types\n */\n\nexport type Bytes = runtime.Bytes\nexport type JsonObject = runtime.JsonObject\nexport type JsonArray = runtime.JsonArray\nexport type JsonValue = runtime.JsonValue\nexport type InputJsonObject = runtime.InputJsonObject\nexport type InputJsonArray = runtime.InputJsonArray\nexport type InputJsonValue = runtime.InputJsonValue\n\n\nexport const NullTypes = {\n  DbNull: runtime.NullTypes.DbNull as (new (secret: never) => typeof runtime.DbNull),\n  JsonNull: runtime.NullTypes.JsonNull as (new (secret: never) => typeof runtime.JsonNull),\n  AnyNull: runtime.NullTypes.AnyNull as (new (secret: never) => typeof runtime.AnyNull),\n}\n/**\n * Helper for filtering JSON entries that have `null` on the database (empty on the db)\n *\n * @see https://www.prisma.io/docs/concepts/components/prisma-client/working-with-fields/working-with-json-fields#filtering-on-a-json-field\n */\nexport const DbNull = runtime.DbNull\n\n/**\n * Helper for filtering JSON entries that have JSON `null` values (not empty on the db)\n *\n * @see https://www.prisma.io/docs/concepts/components/prisma-client/working-with-fields/working-with-json-fields#filtering-on-a-json-field\n */\nexport const JsonNull = runtime.JsonNull\n\n/**\n * Helper for filtering JSON entries that are `Prisma.DbNull` or `Prisma.JsonNull`\n *\n * @see https://www.prisma.io/docs/concepts/components/prisma-client/working-with-fields/working-with-json-fields#filtering-on-a-json-field\n */\nexport const AnyNull = runtime.AnyNull\n\n\ntype SelectAndInclude = {\n  select: any\n  include: any\n}\n\ntype SelectAndOmit = {\n  select: any\n  omit: any\n}\n\n/**\n * From T, pick a set of properties whose keys are in the union K\n */\ntype Prisma__Pick<T, K extends keyof T> = {\n    [P in K]: T[P];\n};\n\nexport type Enumerable<T> = T | Array<T>;\n\n/**\n * Subset\n * @desc From `T` pick properties that exist in `U`. Simple version of Intersection\n */\nexport type Subset<T, U> = {\n  [key in keyof T]: key extends keyof U ? T[key] : never;\n};\n\n/**\n * Resolved type of the argument passed to the `PrismaClient` constructor.\n *\n * When called without a narrower options type (the common case), this resolves\n * to `PrismaClientOptions` directly, which produces a clear TypeScript error\n * message (`not assignable to parameter of type 'PrismaClientOptions'`) when\n * the argument is missing or incomplete. When the user supplies a narrower\n * options type (e.g. via a literal), it falls back to `Subset` to keep\n * filtering out unknown properties.\n */\nexport type PrismaClientConstructorArgs<Options extends PrismaClientOptions> =\n  [PrismaClientOptions] extends [Options] ? PrismaClientOptions : Subset<Options, PrismaClientOptions>;\n\n/**\n * SelectSubset\n * @desc From `T` pick properties that exist in `U`. Simple version of Intersection.\n * Additionally, it validates, if both select and include are present. If the case, it errors.\n */\nexport type SelectSubset<T, U> = {\n  [key in keyof T]: key extends keyof U ? T[key] : never\n} &\n  (T extends SelectAndInclude\n    ? 'Please either choose `select` or `include`.'\n    : T extends SelectAndOmit\n      ? 'Please either choose `select` or `omit`.'\n      : {})\n\n/**\n * Subset + Intersection\n * @desc From `T` pick properties that exist in `U` and intersect `K`\n */\nexport type SubsetIntersection<T, U, K> = {\n  [key in keyof T]: key extends keyof U ? T[key] : never\n} &\n  K\n\ntype Without<T, U> = { [P in Exclude<keyof T, keyof U>]?: never };\n\n/**\n * XOR is needed to have a real mutually exclusive union type\n * https://stackoverflow.com/questions/42123407/does-typescript-support-mutually-exclusive-types\n */\nexport type XOR<T, U> =\n  T extends object ?\n  U extends object ?\n    ((Without<T, U> & U) | (Without<U, T> & T)) & object\n  : U : T\n\n\n/**\n * Is T a Record?\n */\ntype IsObject<T extends any> = T extends Array<any>\n? False\n: T extends Date\n? False\n: T extends Uint8Array\n? False\n: T extends BigInt\n? False\n: T extends object\n? True\n: False\n\n\n/**\n * If it's T[], return T\n */\nexport type UnEnumerate<T extends unknown> = T extends Array<infer U> ? U : T\n\n/**\n * From ts-toolbelt\n */\n\ntype __Either<O extends object, K extends Key> = Omit<O, K> &\n  {\n    // Merge all but K\n    [P in K]: Prisma__Pick<O, P & keyof O> // With K possibilities\n  }[K]\n\ntype EitherStrict<O extends object, K extends Key> = Strict<__Either<O, K>>\n\ntype EitherLoose<O extends object, K extends Key> = ComputeRaw<__Either<O, K>>\n\ntype _Either<\n  O extends object,\n  K extends Key,\n  strict extends Boolean\n> = {\n  1: EitherStrict<O, K>\n  0: EitherLoose<O, K>\n}[strict]\n\nexport type Either<\n  O extends object,\n  K extends Key,\n  strict extends Boolean = 1\n> = O extends unknown ? _Either<O, K, strict> : never\n\nexport type Union = any\n\nexport type PatchUndefined<O extends object, O1 extends object> = {\n  [K in keyof O]: O[K] extends undefined ? At<O1, K> : O[K]\n} & {}\n\n/** Helper Types for \"Merge\" **/\nexport type IntersectOf<U extends Union> = (\n  U extends unknown ? (k: U) => void : never\n) extends (k: infer I) => void\n  ? I\n  : never\n\nexport type Overwrite<O extends object, O1 extends object> = {\n    [K in keyof O]: K extends keyof O1 ? O1[K] : O[K];\n} & {};\n\ntype _Merge<U extends object> = IntersectOf<Overwrite<U, {\n    [K in keyof U]-?: At<U, K>;\n}>>;\n\ntype Key = string | number | symbol;\ntype AtStrict<O extends object, K extends Key> = O[K & keyof O];\ntype AtLoose<O extends object, K extends Key> = O extends unknown ? AtStrict<O, K> : never;\nexport type At<O extends object, K extends Key, strict extends Boolean = 1> = {\n    1: AtStrict<O, K>;\n    0: AtLoose<O, K>;\n}[strict];\n\nexport type ComputeRaw<A extends any> = A extends Function ? A : {\n  [K in keyof A]: A[K];\n} & {};\n\nexport type OptionalFlat<O> = {\n  [K in keyof O]?: O[K];\n} & {};\n\ntype _Record<K extends keyof any, T> = {\n  [P in K]: T;\n};\n\n// cause typescript not to expand types and preserve names\ntype NoExpand<T> = T extends unknown ? T : never;\n\n// this type assumes the passed object is entirely optional\nexport type AtLeast<O extends object, K extends string> = NoExpand<\n  O extends unknown\n  ? | (K extends keyof O ? { [P in K]: O[P] } & O : O)\n    | {[P in keyof O as P extends K ? P : never]-?: O[P]} & O\n  : never>;\n\ntype _Strict<U, _U = U> = U extends unknown ? U & OptionalFlat<_Record<Exclude<Keys<_U>, keyof U>, never>> : never;\n\nexport type Strict<U extends object> = ComputeRaw<_Strict<U>>;\n/** End Helper Types for \"Merge\" **/\n\nexport type Merge<U extends object> = ComputeRaw<_Merge<Strict<U>>>;\n\nexport type Boolean = True | False\n\nexport type True = 1\n\nexport type False = 0\n\nexport type Not<B extends Boolean> = {\n  0: 1\n  1: 0\n}[B]\n\nexport type Extends<A1 extends any, A2 extends any> = [A1] extends [never]\n  ? 0 // anything `never` is false\n  : A1 extends A2\n  ? 1\n  : 0\n\nexport type Has<U extends Union, U1 extends Union> = Not<\n  Extends<Exclude<U1, U>, U1>\n>\n\nexport type Or<B1 extends Boolean, B2 extends Boolean> = {\n  0: {\n    0: 0\n    1: 1\n  }\n  1: {\n    0: 1\n    1: 1\n  }\n}[B1][B2]\n\nexport type Keys<U extends Union> = U extends unknown ? keyof U : never\n\nexport type GetScalarType<T, O> = O extends object ? {\n  [P in keyof T]: P extends keyof O\n    ? O[P]\n    : never\n} : never\n\ntype FieldPaths<\n  T,\n  U = Omit<T, '_avg' | '_sum' | '_count' | '_min' | '_max'>\n> = IsObject<T> extends True ? U : T\n\nexport type GetHavingFields<T> = {\n  [K in keyof T]: Or<\n    Or<Extends<'OR', K>, Extends<'AND', K>>,\n    Extends<'NOT', K>\n  > extends True\n    ? // infer is only needed to not hit TS limit\n      // based on the brilliant idea of Pierre-Antoine Mills\n      // https://github.com/microsoft/TypeScript/issues/30188#issuecomment-478938437\n      T[K] extends infer TK\n      ? GetHavingFields<UnEnumerate<TK> extends object ? Merge<UnEnumerate<TK>> : never>\n      : never\n    : {} extends FieldPaths<T[K]>\n    ? never\n    : K\n}[keyof T]\n\n/**\n * Convert tuple to union\n */\ntype _TupleToUnion<T> = T extends (infer E)[] ? E : never\ntype TupleToUnion<K extends readonly any[]> = _TupleToUnion<K>\nexport type MaybeTupleToUnion<T> = T extends any[] ? TupleToUnion<T> : T\n\n/**\n * Like `Pick`, but additionally can also accept an array of keys\n */\nexport type PickEnumerable<T, K extends Enumerable<keyof T> | keyof T> = Prisma__Pick<T, MaybeTupleToUnion<K>>\n\n/**\n * Exclude all keys with underscores\n */\nexport type ExcludeUnderscoreKeys<T extends string> = T extends `_${string}` ? never : T\n\n\nexport type FieldRef<Model, FieldType> = runtime.FieldRef<Model, FieldType>\n\ntype FieldRefInputType<Model, FieldType> = Model extends never ? never : FieldRef<Model, FieldType>\n\n\nexport const ModelName = {\n  Comment: 'Comment',\n  Post: 'Post',\n  Profile: 'Profile',\n  Subscription: 'Subscription',\n  User: 'User'\n} as const\n\nexport type ModelName = (typeof ModelName)[keyof typeof ModelName]\n\n\n\nexport interface TypeMapCb<GlobalOmitOptions = {}> extends runtime.Types.Utils.Fn<{extArgs: runtime.Types.Extensions.InternalArgs }, runtime.Types.Utils.Record<string, any>> {\n  returns: TypeMap<this['params']['extArgs'], GlobalOmitOptions>\n}\n\nexport type TypeMap<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs, GlobalOmitOptions = {}> = {\n  globalOmitOptions: {\n    omit: GlobalOmitOptions\n  }\n  meta: {\n    modelProps: \"comment\" | \"post\" | \"profile\" | \"subscription\" | \"user\"\n    txIsolationLevel: TransactionIsolationLevel\n  }\n  model: {\n    Comment: {\n      payload: Prisma.$CommentPayload<ExtArgs>\n      fields: Prisma.CommentFieldRefs\n      operations: {\n        findUnique: {\n          args: Prisma.CommentFindUniqueArgs<ExtArgs>\n          result: runtime.Types.Utils.PayloadToResult<Prisma.$CommentPayload> | null\n        }\n        findUniqueOrThrow: {\n          args: Prisma.CommentFindUniqueOrThrowArgs<ExtArgs>\n          result: runtime.Types.Utils.PayloadToResult<Prisma.$CommentPayload>\n        }\n        findFirst: {\n          args: Prisma.CommentFindFirstArgs<ExtArgs>\n          result: runtime.Types.Utils.PayloadToResult<Prisma.$CommentPayload> | null\n        }\n        findFirstOrThrow: {\n          args: Prisma.CommentFindFirstOrThrowArgs<ExtArgs>\n          result: runtime.Types.Utils.PayloadToResult<Prisma.$CommentPayload>\n        }\n        findMany: {\n          args: Prisma.CommentFindManyArgs<ExtArgs>\n          result: runtime.Types.Utils.PayloadToResult<Prisma.$CommentPayload>[]\n        }\n        create: {\n          args: Prisma.CommentCreateArgs<ExtArgs>\n          result: runtime.Types.Utils.PayloadToResult<Prisma.$CommentPayload>\n        }\n        createMany: {\n          args: Prisma.CommentCreateManyArgs<ExtArgs>\n          result: BatchPayload\n        }\n        createManyAndReturn: {\n          args: Prisma.CommentCreateManyAndReturnArgs<ExtArgs>\n          result: runtime.Types.Utils.PayloadToResult<Prisma.$CommentPayload>[]\n        }\n        delete: {\n          args: Prisma.CommentDeleteArgs<ExtArgs>\n          result: runtime.Types.Utils.PayloadToResult<Prisma.$CommentPayload>\n        }\n        update: {\n          args: Prisma.CommentUpdateArgs<ExtArgs>\n          result: runtime.Types.Utils.PayloadToResult<Prisma.$CommentPayload>\n        }\n        deleteMany: {\n          args: Prisma.CommentDeleteManyArgs<ExtArgs>\n          result: BatchPayload\n        }\n        updateMany: {\n          args: Prisma.CommentUpdateManyArgs<ExtArgs>\n          result: BatchPayload\n        }\n        updateManyAndReturn: {\n          args: Prisma.CommentUpdateManyAndReturnArgs<ExtArgs>\n          result: runtime.Types.Utils.PayloadToResult<Prisma.$CommentPayload>[]\n        }\n        upsert: {\n          args: Prisma.CommentUpsertArgs<ExtArgs>\n          result: runtime.Types.Utils.PayloadToResult<Prisma.$CommentPayload>\n        }\n        aggregate: {\n          args: Prisma.CommentAggregateArgs<ExtArgs>\n          result: runtime.Types.Utils.Optional<Prisma.AggregateComment>\n        }\n        groupBy: {\n          args: Prisma.CommentGroupByArgs<ExtArgs>\n          result: runtime.Types.Utils.Optional<Prisma.CommentGroupByOutputType>[]\n        }\n        count: {\n          args: Prisma.CommentCountArgs<ExtArgs>\n          result: runtime.Types.Utils.Optional<Prisma.CommentCountAggregateOutputType> | number\n        }\n      }\n    }\n    Post: {\n      payload: Prisma.$PostPayload<ExtArgs>\n      fields: Prisma.PostFieldRefs\n      operations: {\n        findUnique: {\n          args: Prisma.PostFindUniqueArgs<ExtArgs>\n          result: runtime.Types.Utils.PayloadToResult<Prisma.$PostPayload> | null\n        }\n        findUniqueOrThrow: {\n          args: Prisma.PostFindUniqueOrThrowArgs<ExtArgs>\n          result: runtime.Types.Utils.PayloadToResult<Prisma.$PostPayload>\n        }\n        findFirst: {\n          args: Prisma.PostFindFirstArgs<ExtArgs>\n          result: runtime.Types.Utils.PayloadToResult<Prisma.$PostPayload> | null\n        }\n        findFirstOrThrow: {\n          args: Prisma.PostFindFirstOrThrowArgs<ExtArgs>\n          result: runtime.Types.Utils.PayloadToResult<Prisma.$PostPayload>\n        }\n        findMany: {\n          args: Prisma.PostFindManyArgs<ExtArgs>\n          result: runtime.Types.Utils.PayloadToResult<Prisma.$PostPayload>[]\n        }\n        create: {\n          args: Prisma.PostCreateArgs<ExtArgs>\n          result: runtime.Types.Utils.PayloadToResult<Prisma.$PostPayload>\n        }\n        createMany: {\n          args: Prisma.PostCreateManyArgs<ExtArgs>\n          result: BatchPayload\n        }\n        createManyAndReturn: {\n          args: Prisma.PostCreateManyAndReturnArgs<ExtArgs>\n          result: runtime.Types.Utils.PayloadToResult<Prisma.$PostPayload>[]\n        }\n        delete: {\n          args: Prisma.PostDeleteArgs<ExtArgs>\n          result: runtime.Types.Utils.PayloadToResult<Prisma.$PostPayload>\n        }\n        update: {\n          args: Prisma.PostUpdateArgs<ExtArgs>\n          result: runtime.Types.Utils.PayloadToResult<Prisma.$PostPayload>\n        }\n        deleteMany: {\n          args: Prisma.PostDeleteManyArgs<ExtArgs>\n          result: BatchPayload\n        }\n        updateMany: {\n          args: Prisma.PostUpdateManyArgs<ExtArgs>\n          result: BatchPayload\n        }\n        updateManyAndReturn: {\n          args: Prisma.PostUpdateManyAndReturnArgs<ExtArgs>\n          result: runtime.Types.Utils.PayloadToResult<Prisma.$PostPayload>[]\n        }\n        upsert: {\n          args: Prisma.PostUpsertArgs<ExtArgs>\n          result: runtime.Types.Utils.PayloadToResult<Prisma.$PostPayload>\n        }\n        aggregate: {\n          args: Prisma.PostAggregateArgs<ExtArgs>\n          result: runtime.Types.Utils.Optional<Prisma.AggregatePost>\n        }\n        groupBy: {\n          args: Prisma.PostGroupByArgs<ExtArgs>\n          result: runtime.Types.Utils.Optional<Prisma.PostGroupByOutputType>[]\n        }\n        count: {\n          args: Prisma.PostCountArgs<ExtArgs>\n          result: runtime.Types.Utils.Optional<Prisma.PostCountAggregateOutputType> | number\n        }\n      }\n    }\n    Profile: {\n      payload: Prisma.$ProfilePayload<ExtArgs>\n      fields: Prisma.ProfileFieldRefs\n      operations: {\n        findUnique: {\n          args: Prisma.ProfileFindUniqueArgs<ExtArgs>\n          result: runtime.Types.Utils.PayloadToResult<Prisma.$ProfilePayload> | null\n        }\n        findUniqueOrThrow: {\n          args: Prisma.ProfileFindUniqueOrThrowArgs<ExtArgs>\n          result: runtime.Types.Utils.PayloadToResult<Prisma.$ProfilePayload>\n        }\n        findFirst: {\n          args: Prisma.ProfileFindFirstArgs<ExtArgs>\n          result: runtime.Types.Utils.PayloadToResult<Prisma.$ProfilePayload> | null\n        }\n        findFirstOrThrow: {\n          args: Prisma.ProfileFindFirstOrThrowArgs<ExtArgs>\n          result: runtime.Types.Utils.PayloadToResult<Prisma.$ProfilePayload>\n        }\n        findMany: {\n          args: Prisma.ProfileFindManyArgs<ExtArgs>\n          result: runtime.Types.Utils.PayloadToResult<Prisma.$ProfilePayload>[]\n        }\n        create: {\n          args: Prisma.ProfileCreateArgs<ExtArgs>\n          result: runtime.Types.Utils.PayloadToResult<Prisma.$ProfilePayload>\n        }\n        createMany: {\n          args: Prisma.ProfileCreateManyArgs<ExtArgs>\n          result: BatchPayload\n        }\n        createManyAndReturn: {\n          args: Prisma.ProfileCreateManyAndReturnArgs<ExtArgs>\n          result: runtime.Types.Utils.PayloadToResult<Prisma.$ProfilePayload>[]\n        }\n        delete: {\n          args: Prisma.ProfileDeleteArgs<ExtArgs>\n          result: runtime.Types.Utils.PayloadToResult<Prisma.$ProfilePayload>\n        }\n        update: {\n          args: Prisma.ProfileUpdateArgs<ExtArgs>\n          result: runtime.Types.Utils.PayloadToResult<Prisma.$ProfilePayload>\n        }\n        deleteMany: {\n          args: Prisma.ProfileDeleteManyArgs<ExtArgs>\n          result: BatchPayload\n        }\n        updateMany: {\n          args: Prisma.ProfileUpdateManyArgs<ExtArgs>\n          result: BatchPayload\n        }\n        updateManyAndReturn: {\n          args: Prisma.ProfileUpdateManyAndReturnArgs<ExtArgs>\n          result: runtime.Types.Utils.PayloadToResult<Prisma.$ProfilePayload>[]\n        }\n        upsert: {\n          args: Prisma.ProfileUpsertArgs<ExtArgs>\n          result: runtime.Types.Utils.PayloadToResult<Prisma.$ProfilePayload>\n        }\n        aggregate: {\n          args: Prisma.ProfileAggregateArgs<ExtArgs>\n          result: runtime.Types.Utils.Optional<Prisma.AggregateProfile>\n        }\n        groupBy: {\n          args: Prisma.ProfileGroupByArgs<ExtArgs>\n          result: runtime.Types.Utils.Optional<Prisma.ProfileGroupByOutputType>[]\n        }\n        count: {\n          args: Prisma.ProfileCountArgs<ExtArgs>\n          result: runtime.Types.Utils.Optional<Prisma.ProfileCountAggregateOutputType> | number\n        }\n      }\n    }\n    Subscription: {\n      payload: Prisma.$SubscriptionPayload<ExtArgs>\n      fields: Prisma.SubscriptionFieldRefs\n      operations: {\n        findUnique: {\n          args: Prisma.SubscriptionFindUniqueArgs<ExtArgs>\n          result: runtime.Types.Utils.PayloadToResult<Prisma.$SubscriptionPayload> | null\n        }\n        findUniqueOrThrow: {\n          args: Prisma.SubscriptionFindUniqueOrThrowArgs<ExtArgs>\n          result: runtime.Types.Utils.PayloadToResult<Prisma.$SubscriptionPayload>\n        }\n        findFirst: {\n          args: Prisma.SubscriptionFindFirstArgs<ExtArgs>\n          result: runtime.Types.Utils.PayloadToResult<Prisma.$SubscriptionPayload> | null\n        }\n        findFirstOrThrow: {\n          args: Prisma.SubscriptionFindFirstOrThrowArgs<ExtArgs>\n          result: runtime.Types.Utils.PayloadToResult<Prisma.$SubscriptionPayload>\n        }\n        findMany: {\n          args: Prisma.SubscriptionFindManyArgs<ExtArgs>\n          result: runtime.Types.Utils.PayloadToResult<Prisma.$SubscriptionPayload>[]\n        }\n        create: {\n          args: Prisma.SubscriptionCreateArgs<ExtArgs>\n          result: runtime.Types.Utils.PayloadToResult<Prisma.$SubscriptionPayload>\n        }\n        createMany: {\n          args: Prisma.SubscriptionCreateManyArgs<ExtArgs>\n          result: BatchPayload\n        }\n        createManyAndReturn: {\n          args: Prisma.SubscriptionCreateManyAndReturnArgs<ExtArgs>\n          result: runtime.Types.Utils.PayloadToResult<Prisma.$SubscriptionPayload>[]\n        }\n        delete: {\n          args: Prisma.SubscriptionDeleteArgs<ExtArgs>\n          result: runtime.Types.Utils.PayloadToResult<Prisma.$SubscriptionPayload>\n        }\n        update: {\n          args: Prisma.SubscriptionUpdateArgs<ExtArgs>\n          result: runtime.Types.Utils.PayloadToResult<Prisma.$SubscriptionPayload>\n        }\n        deleteMany: {\n          args: Prisma.SubscriptionDeleteManyArgs<ExtArgs>\n          result: BatchPayload\n        }\n        updateMany: {\n          args: Prisma.SubscriptionUpdateManyArgs<ExtArgs>\n          result: BatchPayload\n        }\n        updateManyAndReturn: {\n          args: Prisma.SubscriptionUpdateManyAndReturnArgs<ExtArgs>\n          result: runtime.Types.Utils.PayloadToResult<Prisma.$SubscriptionPayload>[]\n        }\n        upsert: {\n          args: Prisma.SubscriptionUpsertArgs<ExtArgs>\n          result: runtime.Types.Utils.PayloadToResult<Prisma.$SubscriptionPayload>\n        }\n        aggregate: {\n          args: Prisma.SubscriptionAggregateArgs<ExtArgs>\n          result: runtime.Types.Utils.Optional<Prisma.AggregateSubscription>\n        }\n        groupBy: {\n          args: Prisma.SubscriptionGroupByArgs<ExtArgs>\n          result: runtime.Types.Utils.Optional<Prisma.SubscriptionGroupByOutputType>[]\n        }\n        count: {\n          args: Prisma.SubscriptionCountArgs<ExtArgs>\n          result: runtime.Types.Utils.Optional<Prisma.SubscriptionCountAggregateOutputType> | number\n        }\n      }\n    }\n    User: {\n      payload: Prisma.$UserPayload<ExtArgs>\n      fields: Prisma.UserFieldRefs\n      operations: {\n        findUnique: {\n          args: Prisma.UserFindUniqueArgs<ExtArgs>\n          result: runtime.Types.Utils.PayloadToResult<Prisma.$UserPayload> | null\n        }\n        findUniqueOrThrow: {\n          args: Prisma.UserFindUniqueOrThrowArgs<ExtArgs>\n          result: runtime.Types.Utils.PayloadToResult<Prisma.$UserPayload>\n        }\n        findFirst: {\n          args: Prisma.UserFindFirstArgs<ExtArgs>\n          result: runtime.Types.Utils.PayloadToResult<Prisma.$UserPayload> | null\n        }\n        findFirstOrThrow: {\n          args: Prisma.UserFindFirstOrThrowArgs<ExtArgs>\n          result: runtime.Types.Utils.PayloadToResult<Prisma.$UserPayload>\n        }\n        findMany: {\n          args: Prisma.UserFindManyArgs<ExtArgs>\n          result: runtime.Types.Utils.PayloadToResult<Prisma.$UserPayload>[]\n        }\n        create: {\n          args: Prisma.UserCreateArgs<ExtArgs>\n          result: runtime.Types.Utils.PayloadToResult<Prisma.$UserPayload>\n        }\n        createMany: {\n          args: Prisma.UserCreateManyArgs<ExtArgs>\n          result: BatchPayload\n        }\n        createManyAndReturn: {\n          args: Prisma.UserCreateManyAndReturnArgs<ExtArgs>\n          result: runtime.Types.Utils.PayloadToResult<Prisma.$UserPayload>[]\n        }\n        delete: {\n          args: Prisma.UserDeleteArgs<ExtArgs>\n          result: runtime.Types.Utils.PayloadToResult<Prisma.$UserPayload>\n        }\n        update: {\n          args: Prisma.UserUpdateArgs<ExtArgs>\n          result: runtime.Types.Utils.PayloadToResult<Prisma.$UserPayload>\n        }\n        deleteMany: {\n          args: Prisma.UserDeleteManyArgs<ExtArgs>\n          result: BatchPayload\n        }\n        updateMany: {\n          args: Prisma.UserUpdateManyArgs<ExtArgs>\n          result: BatchPayload\n        }\n        updateManyAndReturn: {\n          args: Prisma.UserUpdateManyAndReturnArgs<ExtArgs>\n          result: runtime.Types.Utils.PayloadToResult<Prisma.$UserPayload>[]\n        }\n        upsert: {\n          args: Prisma.UserUpsertArgs<ExtArgs>\n          result: runtime.Types.Utils.PayloadToResult<Prisma.$UserPayload>\n        }\n        aggregate: {\n          args: Prisma.UserAggregateArgs<ExtArgs>\n          result: runtime.Types.Utils.Optional<Prisma.AggregateUser>\n        }\n        groupBy: {\n          args: Prisma.UserGroupByArgs<ExtArgs>\n          result: runtime.Types.Utils.Optional<Prisma.UserGroupByOutputType>[]\n        }\n        count: {\n          args: Prisma.UserCountArgs<ExtArgs>\n          result: runtime.Types.Utils.Optional<Prisma.UserCountAggregateOutputType> | number\n        }\n      }\n    }\n  }\n} & {\n  other: {\n    payload: any\n    operations: {\n      $executeRaw: {\n        args: [query: TemplateStringsArray | Sql, ...values: any[]],\n        result: any\n      }\n      $executeRawUnsafe: {\n        args: [query: string, ...values: any[]],\n        result: any\n      }\n      $queryRaw: {\n        args: [query: TemplateStringsArray | Sql, ...values: any[]],\n        result: any\n      }\n      $queryRawUnsafe: {\n        args: [query: string, ...values: any[]],\n        result: any\n      }\n    }\n  }\n}\n\n/**\n * Enums\n */\n\nexport const TransactionIsolationLevel = runtime.makeStrictEnum({\n  ReadUncommitted: 'ReadUncommitted',\n  ReadCommitted: 'ReadCommitted',\n  RepeatableRead: 'RepeatableRead',\n  Serializable: 'Serializable'\n} as const)\n\nexport type TransactionIsolationLevel = (typeof TransactionIsolationLevel)[keyof typeof TransactionIsolationLevel]\n\n\nexport const CommentScalarFieldEnum = {\n  id: 'id',\n  content: 'content',\n  authorId: 'authorId',\n  postId: 'postId',\n  status: 'status',\n  createdAt: 'createdAt',\n  updatedAt: 'updatedAt'\n} as const\n\nexport type CommentScalarFieldEnum = (typeof CommentScalarFieldEnum)[keyof typeof CommentScalarFieldEnum]\n\n\nexport const PostScalarFieldEnum = {\n  id: 'id',\n  title: 'title',\n  content: 'content',\n  thumbnail: 'thumbnail',\n  isFeatured: 'isFeatured',\n  status: 'status',\n  tags: 'tags',\n  views: 'views',\n  isPremium: 'isPremium',\n  authorId: 'authorId',\n  createdAt: 'createdAt',\n  updatedAt: 'updatedAt'\n} as const\n\nexport type PostScalarFieldEnum = (typeof PostScalarFieldEnum)[keyof typeof PostScalarFieldEnum]\n\n\nexport const ProfileScalarFieldEnum = {\n  id: 'id',\n  profilePhoto: 'profilePhoto',\n  bio: 'bio',\n  userId: 'userId',\n  createdAt: 'createdAt',\n  updatedAt: 'updatedAt'\n} as const\n\nexport type ProfileScalarFieldEnum = (typeof ProfileScalarFieldEnum)[keyof typeof ProfileScalarFieldEnum]\n\n\nexport const SubscriptionScalarFieldEnum = {\n  id: 'id',\n  userId: 'userId',\n  currentPeriodEnd: 'currentPeriodEnd',\n  status: 'status',\n  stripeCustomerId: 'stripeCustomerId',\n  stripeSubscriptionId: 'stripeSubscriptionId',\n  createdAt: 'createdAt',\n  updatedAt: 'updatedAt'\n} as const\n\nexport type SubscriptionScalarFieldEnum = (typeof SubscriptionScalarFieldEnum)[keyof typeof SubscriptionScalarFieldEnum]\n\n\nexport const UserScalarFieldEnum = {\n  id: 'id',\n  name: 'name',\n  email: 'email',\n  password: 'password',\n  activeStatus: 'activeStatus',\n  role: 'role',\n  createdAt: 'createdAt',\n  updatedAt: 'updatedAt'\n} as const\n\nexport type UserScalarFieldEnum = (typeof UserScalarFieldEnum)[keyof typeof UserScalarFieldEnum]\n\n\nexport const SortOrder = {\n  asc: 'asc',\n  desc: 'desc'\n} as const\n\nexport type SortOrder = (typeof SortOrder)[keyof typeof SortOrder]\n\n\nexport const QueryMode = {\n  default: 'default',\n  insensitive: 'insensitive'\n} as const\n\nexport type QueryMode = (typeof QueryMode)[keyof typeof QueryMode]\n\n\nexport const NullsOrder = {\n  first: 'first',\n  last: 'last'\n} as const\n\nexport type NullsOrder = (typeof NullsOrder)[keyof typeof NullsOrder]\n\n\n\n/**\n * Field references\n */\n\n\n/**\n * Reference to a field of type 'String'\n */\nexport type StringFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'String'>\n    \n\n\n/**\n * Reference to a field of type 'String[]'\n */\nexport type ListStringFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'String[]'>\n    \n\n\n/**\n * Reference to a field of type 'CommentStatus'\n */\nexport type EnumCommentStatusFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'CommentStatus'>\n    \n\n\n/**\n * Reference to a field of type 'CommentStatus[]'\n */\nexport type ListEnumCommentStatusFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'CommentStatus[]'>\n    \n\n\n/**\n * Reference to a field of type 'DateTime'\n */\nexport type DateTimeFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'DateTime'>\n    \n\n\n/**\n * Reference to a field of type 'DateTime[]'\n */\nexport type ListDateTimeFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'DateTime[]'>\n    \n\n\n/**\n * Reference to a field of type 'Boolean'\n */\nexport type BooleanFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'Boolean'>\n    \n\n\n/**\n * Reference to a field of type 'PostStatus'\n */\nexport type EnumPostStatusFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'PostStatus'>\n    \n\n\n/**\n * Reference to a field of type 'PostStatus[]'\n */\nexport type ListEnumPostStatusFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'PostStatus[]'>\n    \n\n\n/**\n * Reference to a field of type 'Int'\n */\nexport type IntFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'Int'>\n    \n\n\n/**\n * Reference to a field of type 'Int[]'\n */\nexport type ListIntFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'Int[]'>\n    \n\n\n/**\n * Reference to a field of type 'SubscriptionStatus'\n */\nexport type EnumSubscriptionStatusFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'SubscriptionStatus'>\n    \n\n\n/**\n * Reference to a field of type 'SubscriptionStatus[]'\n */\nexport type ListEnumSubscriptionStatusFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'SubscriptionStatus[]'>\n    \n\n\n/**\n * Reference to a field of type 'ActiveStatus'\n */\nexport type EnumActiveStatusFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'ActiveStatus'>\n    \n\n\n/**\n * Reference to a field of type 'ActiveStatus[]'\n */\nexport type ListEnumActiveStatusFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'ActiveStatus[]'>\n    \n\n\n/**\n * Reference to a field of type 'Role'\n */\nexport type EnumRoleFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'Role'>\n    \n\n\n/**\n * Reference to a field of type 'Role[]'\n */\nexport type ListEnumRoleFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'Role[]'>\n    \n\n\n/**\n * Reference to a field of type 'Float'\n */\nexport type FloatFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'Float'>\n    \n\n\n/**\n * Reference to a field of type 'Float[]'\n */\nexport type ListFloatFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'Float[]'>\n    \n\n/**\n * Batch Payload for updateMany & deleteMany & createMany\n */\nexport type BatchPayload = {\n  count: number\n}\n\nexport const defineExtension = runtime.Extensions.defineExtension as unknown as runtime.Types.Extensions.ExtendsHook<\"define\", TypeMapCb, runtime.Types.Extensions.DefaultArgs>\nexport type DefaultPrismaClient = PrismaClient\nexport type ErrorFormat = 'pretty' | 'colorless' | 'minimal'\n/**\n * Options common to all variants of `PrismaClientOptions`, regardless of whether you connect to your database through a driver adapter or through Prisma Accelerate.\n */\nexport interface PrismaClientBaseOptions {\n  /**\n   * @default \"colorless\"\n   */\n  errorFormat?: ErrorFormat\n  /**\n   * @example\n   * ```\n   * // Shorthand for `emit: 'stdout'`\n   * log: ['query', 'info', 'warn', 'error']\n   * \n   * // Emit as events only\n   * log: [\n   *   { emit: 'event', level: 'query' },\n   *   { emit: 'event', level: 'info' },\n   *   { emit: 'event', level: 'warn' }\n   *   { emit: 'event', level: 'error' }\n   * ]\n   * \n   * / Emit as events and log to stdout\n   * og: [\n   *  { emit: 'stdout', level: 'query' },\n   *  { emit: 'stdout', level: 'info' },\n   *  { emit: 'stdout', level: 'warn' }\n   *  { emit: 'stdout', level: 'error' }\n   * \n   * ```\n   * Read more in our [docs](https://pris.ly/d/logging).\n   */\n  log?: (LogLevel | LogDefinition)[]\n  /**\n   * The default values for transactionOptions\n   * maxWait ?= 2000\n   * timeout ?= 5000\n   */\n  transactionOptions?: {\n    maxWait?: number\n    timeout?: number\n    isolationLevel?: TransactionIsolationLevel\n  }\n  /**\n   * Global configuration for omitting model fields by default.\n   * \n   * @example\n   * ```\n   * const prisma = new PrismaClient({\n   *   omit: {\n   *     user: {\n   *       password: true\n   *     }\n   *   }\n   * })\n   * ```\n   */\n  omit?: GlobalOmitConfig\n  /**\n   * SQL commenter plugins that add metadata to SQL queries as comments.\n   * Comments follow the sqlcommenter format: https://google.github.io/sqlcommenter/\n   * \n   * @example\n   * ```\n   * const prisma = new PrismaClient({\n   *   adapter,\n   *   comments: [\n   *     traceContext(),\n   *     queryInsights(),\n   *   ],\n   * })\n   * ```\n   */\n  comments?: runtime.SqlCommenterPlugin[]\n  /**\n   * Optional maximum size for the query plan cache. If not provided, a default size will be used.\n   * A value of `0` can be used to disable the cache entirely. A higher cache size can improve\n   * performance for applications that execute a large number of unique queries, while a smaller\n   * cache size can reduce memory usage.\n   * \n   * @example\n   * ```\n   * const prisma = new PrismaClient({\n   *   adapter,\n   *   queryPlanCacheMaxSize: 100,\n   * })\n   * ```\n   */\n  queryPlanCacheMaxSize?: number\n}\n\n/**\n * `PrismaClient` options for connecting to your database through Prisma Accelerate instead of a driver adapter.\n * \n * Learn more: https://pris.ly/d/accelerate\n */\nexport interface PrismaClientOptionsWithAccelerateUrl extends PrismaClientBaseOptions {\n  /**\n   * The Prisma Accelerate connection URL. Use this option to connect to your database through Prisma Accelerate instead of using a driver adapter to connect directly.\n   * \n   * Learn more: https://pris.ly/d/accelerate\n   */\n  accelerateUrl: string\n  adapter?: never\n}\n\n/**\n * `PrismaClient` options for connecting to your database through a driver adapter. This is the common case in Prisma 7.\n * \n * Learn more: https://pris.ly/d/driver-adapters\n */\nexport interface PrismaClientOptionsWithAdapter extends PrismaClientBaseOptions {\n  /**\n   * A driver adapter that PrismaClient uses to connect to your database, such as the ones provided by `@prisma/adapter-pg`, `@prisma/adapter-libsql`, `@prisma/adapter-planetscale`, etc.\n   * \n   * A driver adapter is **required** unless you connect to your database through Prisma Accelerate (in which case use `accelerateUrl` instead).\n   * \n   * Learn more: https://pris.ly/d/driver-adapters\n   * \n   * @example\n   * ```ts\n   * import { PrismaPg } from '@prisma/adapter-pg'\n   * import { PrismaClient } from './generated/prisma/client'\n   * \n   * const adapter = new PrismaPg({ connectionString: process.env.DATABASE_URL })\n   * const prisma = new PrismaClient({ adapter })\n   * ```\n   */\n  adapter: runtime.SqlDriverAdapterFactory\n  accelerateUrl?: never\n}\n\n/**\n * Options passed to the `PrismaClient` constructor.\n * \n * A driver adapter (or, alternatively, a Prisma Accelerate URL) is **required**. See {@link PrismaClientOptionsWithAdapter} and {@link PrismaClientOptionsWithAccelerateUrl} for the two variants. All other properties live in {@link PrismaClientBaseOptions} and are optional.\n * \n * Learn more about driver adapters: https://pris.ly/d/driver-adapters\n */\nexport type PrismaClientOptions = PrismaClientOptionsWithAccelerateUrl | PrismaClientOptionsWithAdapter\nexport type GlobalOmitConfig = {\n  comment?: Prisma.CommentOmit\n  post?: Prisma.PostOmit\n  profile?: Prisma.ProfileOmit\n  subscription?: Prisma.SubscriptionOmit\n  user?: Prisma.UserOmit\n}\n\n/* Types for Logging */\nexport type LogLevel = 'info' | 'query' | 'warn' | 'error'\nexport type LogDefinition = {\n  level: LogLevel\n  emit: 'stdout' | 'event'\n}\n\nexport type CheckIsLogLevel<T> = T extends LogLevel ? T : never;\n\nexport type GetLogType<T> = CheckIsLogLevel<\n  T extends LogDefinition ? T['level'] : T\n>;\n\nexport type GetEvents<T extends any[]> = T extends Array<LogLevel | LogDefinition>\n  ? GetLogType<T[number]>\n  : never;\n\nexport type QueryEvent = {\n  timestamp: Date\n  query: string\n  params: string\n  duration: number\n  target: string\n}\n\nexport type LogEvent = {\n  timestamp: Date\n  message: string\n  target: string\n}\n/* End Types for Logging */\n\n\nexport type PrismaAction =\n  | 'findUnique'\n  | 'findUniqueOrThrow'\n  | 'findMany'\n  | 'findFirst'\n  | 'findFirstOrThrow'\n  | 'create'\n  | 'createMany'\n  | 'createManyAndReturn'\n  | 'update'\n  | 'updateMany'\n  | 'updateManyAndReturn'\n  | 'upsert'\n  | 'delete'\n  | 'deleteMany'\n  | 'executeRaw'\n  | 'queryRaw'\n  | 'aggregate'\n  | 'count'\n  | 'runCommandRaw'\n  | 'findRaw'\n  | 'groupBy'\n\n/**\n * `PrismaClient` proxy available in interactive transactions.\n */\nexport type TransactionClient = Omit<DefaultPrismaClient, runtime.ITXClientDenyList>\n\n","\n/* !!! This is code generated by Prisma. Do not edit directly. !!! */\n/* eslint-disable */\n// biome-ignore-all lint: generated file\n// @ts-nocheck \n/*\n* This file exports all enum related types from the schema.\n*\n* 🟢 You can import this file directly.\n*/\n\nexport const ActiveStatus = {\n  ACTIVE: 'ACTIVE',\n  INACTIVE: 'INACTIVE',\n  BLOCKED: 'BLOCKED'\n} as const\n\nexport type ActiveStatus = (typeof ActiveStatus)[keyof typeof ActiveStatus]\n\n\nexport const Role = {\n  USER: 'USER',\n  AUTHOR: 'AUTHOR',\n  ADMIN: 'ADMIN'\n} as const\n\nexport type Role = (typeof Role)[keyof typeof Role]\n\n\nexport const PostStatus = {\n  DRAFT: 'DRAFT',\n  PUBLISHED: 'PUBLISHED',\n  ARCHIVED: 'ARCHIVED'\n} as const\n\nexport type PostStatus = (typeof PostStatus)[keyof typeof PostStatus]\n\n\nexport const CommentStatus = {\n  APPROVED: 'APPROVED',\n  REJECT: 'REJECT'\n} as const\n\nexport type CommentStatus = (typeof CommentStatus)[keyof typeof CommentStatus]\n\n\nexport const SubscriptionStatus = {\n  ACTIVE: 'ACTIVE',\n  INACTIVE: 'INACTIVE',\n  EXPIRED: 'EXPIRED',\n  CANCELED: 'CANCELED'\n} as const\n\nexport type SubscriptionStatus = (typeof SubscriptionStatus)[keyof typeof SubscriptionStatus]\n","import { NextFunction, Request, RequestHandler, Response } from \"express\";\r\nimport httpStatus from \"http-status\";\r\n\r\nexport const catchAsync = (fn: RequestHandler) => {\r\n  return async (req: Request, res: Response, next: NextFunction) => {\r\n    try {\r\n      await fn(req, res, next);\r\n    } catch (error: any) {\r\n      // res.status(httpStatus.INTERNAL_SERVER_ERROR).json({\r\n      //   success: false,\r\n      //   statusCode: httpStatus.INTERNAL_SERVER_ERROR,\r\n      //   message:\r\n      //     error?.code === \"P2025\"\r\n      //       ? \"No record was founded!\"\r\n      //       : \"Something went wrong.\",\r\n      //   error: (error as Error).message,\r\n      //   willDelete: error,\r\n      // });\r\n      next(error);\r\n    }\r\n  };\r\n};\r\n","import { Response } from \"express\";\r\n\r\ntype TMeta = {\r\n  page: number;\r\n  limit: number;\r\n  total: number;\r\n};\r\n\r\ntype TResponseData<T> = {\r\n  success: boolean;\r\n  statusCode: number;\r\n  message: string;\r\n  data: T;\r\n  meta?: TMeta;\r\n};\r\n\r\nexport const sendResponse = <T>(res: Response, data: TResponseData<T>) => {\r\n  res.status(data.statusCode).json({\r\n    success: data.success,\r\n    statusCode: data.statusCode,\r\n    message: data.message,\r\n    data: data.data,\r\n    meta: data.meta,\r\n  });\r\n};\r\n","import jwt, { JwtPayload, Secret, SignOptions } from \"jsonwebtoken\";\r\n\r\nconst createToken = async (\r\n  payload: JwtPayload,\r\n  //   secret: Secret,\r\n  secret: string,\r\n  expiresIn: SignOptions,\r\n) => {\r\n  const token = jwt.sign(payload, secret, { expiresIn } as SignOptions);\r\n  return token;\r\n};\r\n\r\nconst verifiedToken = async (accessToken: string, secret: Secret) => {\r\n  try {\r\n    const verifiedToken = jwt.verify(accessToken, secret);\r\n    return {\r\n      success: true,\r\n      data: verifiedToken,\r\n    };\r\n  } catch (error: any) {\r\n    console.error(\"Token Verification Failed: \", error);\r\n    return {\r\n      success: false,\r\n      error: error.message,\r\n    };\r\n  }\r\n};\r\n\r\nexport const jwtUtils = {\r\n  createToken,\r\n  verifiedToken,\r\n};\r\n","import { NextFunction, Request, Response } from \"express\";\r\nimport { Role } from \"../../generated/prisma/enums\";\r\nimport { catchAsync } from \"../utils/catchAsync\";\r\nimport { jwtUtils } from \"../utils/jwt\";\r\nimport config from \"../config\";\r\nimport { JwtPayload } from \"jsonwebtoken\";\r\nimport { prisma } from \"../lib/prisma\";\r\n\r\ndeclare global {\r\n  namespace Express {\r\n    interface Request {\r\n      user?: {\r\n        id: string;\r\n        name: string;\r\n        email: string;\r\n        role: Role;\r\n      };\r\n    }\r\n  }\r\n}\r\n\r\nexport const auth = (...requiredRoles: Role[]) => {\r\n  return catchAsync(async (req: Request, res: Response, next: NextFunction) => {\r\n    const token = req.cookies.accessToken\r\n      ? req.cookies.accessToken\r\n      : req.headers.authorization?.startsWith(\"Bearer \")\r\n        ? req.headers.authorization?.split(\" \")[1]\r\n        : req.headers.authorization;\r\n\r\n    if (!token) {\r\n      throw new Error(\r\n        \"You are not logged in. Please log in to access this resource.\",\r\n      );\r\n    }\r\n\r\n    const verifiedToken = await jwtUtils.verifiedToken(\r\n      token,\r\n      config.jwt_access_secret,\r\n    );\r\n\r\n    if (!verifiedToken.success) {\r\n      throw new Error(verifiedToken.error);\r\n    }\r\n    const { id, name, email, role } = verifiedToken.data as JwtPayload;\r\n\r\n    if (requiredRoles.length && !requiredRoles.includes(role)) {\r\n      throw new Error(\r\n        \"Access Forbidden! You don't have permission to access this resource.\",\r\n      );\r\n    }\r\n    const user = await prisma.user.findUniqueOrThrow({\r\n      where: {\r\n        id,\r\n        name,\r\n        email,\r\n        role,\r\n      },\r\n    });\r\n\r\n    if (!user) {\r\n      throw new Error(\"User not found. Please login again.\");\r\n    }\r\n\r\n    // if (user.activeStatus === \"BLOCKED\") {\r\n    if (user.activeStatus === \"INACTIVE\") {\r\n      throw new Error(\r\n        \"Your account has been blocked. Please contact with support.\",\r\n      );\r\n    }\r\n\r\n    req.user = {\r\n      id,\r\n      name,\r\n      email,\r\n      role,\r\n    };\r\n    next();\r\n  });\r\n};\r\n","import { Router } from \"express\";\r\nimport { authController } from \"./auth.controller\";\r\n\r\nconst router = Router();\r\nrouter.post(\"/login\", authController.loginUser);\r\nrouter.post(\"/refresh-token\", authController.refreshToken);\r\n\r\nexport const authRouter = router;\r\n","import bcrypt from \"bcryptjs\";\r\nimport { prisma } from \"../../lib/prisma\";\r\nimport { ILoginUserPayload } from \"./auth.interface\";\r\nimport jwt, { JwtPayload, SignOptions } from \"jsonwebtoken\";\r\nimport config from \"../../config\";\r\nimport { jwtUtils } from \"../../utils/jwt\";\r\n\r\nconst loginUserIntoDB = async (payload: ILoginUserPayload) => {\r\n  const { email, password } = payload;\r\n  const user = await prisma.user.findUniqueOrThrow({\r\n    where: { email },\r\n  });\r\n\r\n  if (user.activeStatus === \"BLOCKED\") {\r\n    throw new Error(\r\n      \"Your account has been blocked. Please contact with support.\",\r\n    );\r\n  }\r\n\r\n  const isPasswordMatched = await bcrypt.compare(password, user.password);\r\n  if (!isPasswordMatched) {\r\n    throw new Error(\"Password is incorrect!\");\r\n  }\r\n\r\n  const jwtPayload = {\r\n    id: user.id,\r\n    name: user.name,\r\n    email: user.email,\r\n    role: user.role,\r\n  };\r\n\r\n  // Generate Access Token\r\n  const accessToken = await jwtUtils.createToken(\r\n    jwtPayload,\r\n    config.jwt_access_secret,\r\n    config.jwt_access_expires_in as SignOptions,\r\n  );\r\n\r\n  // Refresh Access Token\r\n  const refreshToken = await jwtUtils.createToken(\r\n    jwtPayload,\r\n    config.jwt_refresh_secret,\r\n    config.jwt_refresh_expires_in as SignOptions,\r\n  );\r\n\r\n  return {\r\n    accessToken,\r\n    refreshToken,\r\n    user,\r\n  };\r\n};\r\nconst refreshToken = async (refreshToken: string) => {\r\n  // Refresh Access Token\r\n  const verifiedRefreshToken = await jwtUtils.verifiedToken(\r\n    refreshToken,\r\n    config.jwt_refresh_secret,\r\n  );\r\n\r\n  if (!verifiedRefreshToken.success) {\r\n    throw new Error(verifiedRefreshToken.error);\r\n  }\r\n  const { id } = verifiedRefreshToken.data as JwtPayload;\r\n  const user = await prisma.user.findFirstOrThrow({\r\n    where: {\r\n      id: id,\r\n    },\r\n  });\r\n  if (user.activeStatus === \"BLOCKED\") {\r\n    throw new Error(\"User is Blocked. Please contact with administrator.\");\r\n  }\r\n  const jwtPayload = {\r\n    id: user.id,\r\n    name: user.name,\r\n    email: user.email,\r\n    role: user.role,\r\n  };\r\n\r\n  // Refresh Access Token\r\n  const accessToken = await jwtUtils.createToken(\r\n    jwtPayload,\r\n    config.jwt_access_secret,\r\n    config.jwt_access_expires_in as SignOptions,\r\n  );\r\n\r\n  return {\r\n    accessToken,\r\n  };\r\n};\r\n\r\nexport const authService = {\r\n  loginUserIntoDB,\r\n  refreshToken,\r\n};\r\n","import { NextFunction, Request, Response } from \"express\";\r\nimport { catchAsync } from \"../../utils/catchAsync\";\r\nimport { authService } from \"./auth.service\";\r\nimport { sendResponse } from \"../../utils/sendResponse\";\r\nimport httpStatus from \"http-status\";\r\n\r\nconst loginUser = catchAsync(\r\n  async (req: Request, res: Response, next: NextFunction) => {\r\n    const payload = req.body;\r\n    const { accessToken, refreshToken } =\r\n      await authService.loginUserIntoDB(payload);\r\n\r\n    res.cookie(\"accessToken\", accessToken, {\r\n      httpOnly: true,\r\n      secure: false,\r\n      sameSite: \"none\",\r\n      maxAge: 1 * 24 * 60 * 60 * 1000,\r\n    });\r\n\r\n    res.cookie(\"refreshToken\", refreshToken, {\r\n      httpOnly: true,\r\n      secure: false,\r\n      sameSite: \"none\",\r\n      maxAge: 7 * 24 * 60 * 60 * 1000,\r\n    });\r\n\r\n    sendResponse(res, {\r\n      success: true,\r\n      statusCode: httpStatus.CREATED,\r\n      message: \"User logged in Successfully.\",\r\n      data: { accessToken, refreshToken },\r\n    });\r\n  },\r\n);\r\n\r\nconst refreshToken = catchAsync(\r\n  async (req: Request, res: Response, next: NextFunction) => {\r\n    const refreshToken = req.cookies.refreshToken;\r\n\r\n    const { accessToken } = await authService.refreshToken(refreshToken);\r\n\r\n    res.cookie(\"accessToken\", accessToken, {\r\n      httpOnly: true,\r\n      secure: false,\r\n      sameSite: \"none\",\r\n      maxAge: 1 * 24 * 60 * 60 * 1000,\r\n    });\r\n\r\n    sendResponse(res, {\r\n      success: true,\r\n      statusCode: httpStatus.OK,\r\n      message: \"Token Refresh Successfully.\",\r\n      data: { accessToken },\r\n    });\r\n  },\r\n);\r\n\r\nexport const authController = {\r\n  loginUser,\r\n  refreshToken,\r\n};\r\n","import { Router } from \"express\";\r\nimport { auth } from \"../../middlewares/auth\";\r\nimport { Role } from \"../../../generated/prisma/enums\";\r\nimport { commentController } from \"./comment.controller\";\r\n\r\nconst router = Router();\r\n\r\nrouter.post(\r\n  \"/\",\r\n  auth(Role.ADMIN, Role.AUTHOR, Role.USER),\r\n  commentController.createComment,\r\n);\r\nrouter.get(\"/author/:authorId\", commentController.getCommentByAuthorId);\r\n\r\nrouter.get(\"/:postId\", commentController.getCommentByPostId);\r\n\r\nrouter.patch(\r\n  \"/:commentId\",\r\n  auth(Role.ADMIN, Role.AUTHOR, Role.USER),\r\n  commentController.updateComment,\r\n);\r\n\r\nrouter.delete(\r\n  \"/:commentId\",\r\n  auth(Role.ADMIN, Role.AUTHOR, Role.USER),\r\n  commentController.deleteComment,\r\n);\r\n\r\nrouter.patch(\r\n  \"/:commentId/moderate\",\r\n  auth(Role.ADMIN),\r\n  commentController.moderateComment,\r\n);\r\n\r\nexport const commentRoutes = router;\r\n","import httpStatus from \"http-status\";\r\nimport { NextFunction, Request, Response } from \"express\";\r\nimport { catchAsync } from \"../../utils/catchAsync\";\r\nimport { sendResponse } from \"../../utils/sendResponse\";\r\nimport { commentService } from \"./comment.service\";\r\nimport {\r\n  IModerateCommentPayload,\r\n  IUpdateCommentPayload,\r\n} from \"./comment.interface\";\r\n\r\nconst createComment = catchAsync(\r\n  async (req: Request, res: Response, next: NextFunction) => {\r\n    const authorId = req.user?.id as string;\r\n    const payload = req.body;\r\n    const result = await commentService.createComment(authorId, payload);\r\n    sendResponse(res, {\r\n      statusCode: httpStatus.CREATED,\r\n      success: true,\r\n      message: \"Comment created successfully\",\r\n      data: result,\r\n    });\r\n  },\r\n);\r\n\r\nconst getCommentByAuthorId = catchAsync(\r\n  async (req: Request, res: Response, next: NextFunction) => {\r\n    const { authorId } = req.params;\r\n    const result = await commentService.getCommentByAuthorId(\r\n      authorId as string,\r\n    );\r\n    sendResponse(res, {\r\n      statusCode: httpStatus.OK,\r\n      success: true,\r\n      message: \"Comments retrieved successfully\",\r\n      data: result,\r\n    });\r\n  },\r\n);\r\n\r\nconst getCommentByPostId = catchAsync(\r\n  async (req: Request, res: Response, next: NextFunction) => {\r\n    const { postId } = req.params;\r\n    const result = await commentService.getCommentByPostId(postId as string);\r\n    sendResponse(res, {\r\n      statusCode: httpStatus.OK,\r\n      success: true,\r\n      message: \"Comment retrieved successfully\",\r\n      data: result,\r\n    });\r\n  },\r\n);\r\n\r\nconst updateComment = catchAsync(\r\n  async (req: Request, res: Response, next: NextFunction) => {\r\n    const { commentId } = req.params;\r\n    const authorId = req.user?.id as string;\r\n    const payload = req.body;\r\n    const result = await commentService.updateComment(\r\n      commentId as string,\r\n      payload as IUpdateCommentPayload,\r\n      authorId as string,\r\n    );\r\n    sendResponse(res, {\r\n      statusCode: httpStatus.OK,\r\n      success: true,\r\n      message: \"Comment updated successfully\",\r\n      data: result,\r\n    });\r\n  },\r\n);\r\n\r\nconst deleteComment = catchAsync(\r\n  async (req: Request, res: Response, next: NextFunction) => {\r\n    const { commentId } = req.params;\r\n    const authorId = req.user?.id as string;\r\n    const result = await commentService.deleteComment(\r\n      commentId as string,\r\n      authorId as string,\r\n    );\r\n    sendResponse(res, {\r\n      statusCode: httpStatus.OK,\r\n      success: true,\r\n      message: \"Comment deleted successfully\",\r\n      data: result,\r\n    });\r\n  },\r\n);\r\n\r\nconst moderateComment = catchAsync(\r\n  async (req: Request, res: Response, next: NextFunction) => {\r\n    const { commentId } = req.params;\r\n    const payload = req.body;\r\n    const result = await commentService.moderateComment(\r\n      commentId as string,\r\n      payload as IModerateCommentPayload,\r\n    );\r\n    sendResponse(res, {\r\n      statusCode: httpStatus.OK,\r\n      success: true,\r\n      message: \"Comment moderated successfully\",\r\n      data: result,\r\n    });\r\n  },\r\n);\r\n\r\nexport const commentController = {\r\n  createComment,\r\n  getCommentByAuthorId,\r\n  getCommentByPostId,\r\n  updateComment,\r\n  deleteComment,\r\n  moderateComment,\r\n};\r\n","import { prisma } from \"../../lib/prisma\";\r\nimport config from \"../../config\";\r\nimport {\r\n  ICreateCommentPayload,\r\n  IModerateCommentPayload,\r\n  IUpdateCommentPayload,\r\n} from \"./comment.interface\";\r\n\r\nconst createComment = async (\r\n  authorId: string,\r\n  payload: ICreateCommentPayload,\r\n) => {\r\n  await prisma.post.findUniqueOrThrow({\r\n    where: {\r\n      id: payload.postId,\r\n    },\r\n  });\r\n  const comment = await prisma.comment.create({\r\n    data: {\r\n      ...payload,\r\n      authorId,\r\n    },\r\n  });\r\n  return comment;\r\n};\r\n\r\nconst getCommentByAuthorId = async (authorId: string) => {\r\n  const comments = await prisma.comment.findMany({\r\n    where: {\r\n      authorId,\r\n    },\r\n    orderBy: {\r\n      createdAt: \"desc\",\r\n    },\r\n    include: {\r\n      post: {\r\n        select: {\r\n          id: true,\r\n          title: true,\r\n          views: true,\r\n        },\r\n      },\r\n    },\r\n  });\r\n  return comments;\r\n};\r\n\r\nconst getCommentByPostId = async (postId: string) => {\r\n  const comments = await prisma.comment.findMany({\r\n    where: {\r\n      postId,\r\n    },\r\n  });\r\n  return comments;\r\n};\r\n\r\nconst updateComment = async (\r\n  commentId: string,\r\n  payload: IUpdateCommentPayload,\r\n  authorId: string,\r\n) => {\r\n  const result = await prisma.comment.findUniqueOrThrow({\r\n    where: {\r\n      id: commentId,\r\n      authorId,\r\n    },\r\n    select: {\r\n      id: true,\r\n    },\r\n  });\r\n\r\n  if (!result) {\r\n    throw new Error(\"Comment not found or access denied\");\r\n  }\r\n  const updatedComment = await prisma.comment.update({\r\n    where: {\r\n      id: commentId,\r\n      authorId,\r\n    },\r\n    data: payload,\r\n  });\r\n  return updatedComment;\r\n};\r\n\r\nconst deleteComment = async (commentId: string, authorId: string) => {\r\n  const result = await prisma.comment.findFirst({\r\n    where: {\r\n      id: commentId,\r\n      authorId,\r\n    },\r\n    select: {\r\n      id: true,\r\n    },\r\n  });\r\n\r\n  if (!result) {\r\n    throw new Error(\"Comment not found or access denied\");\r\n  }\r\n  await prisma.comment.delete({\r\n    where: {\r\n      id: commentId,\r\n      authorId,\r\n    },\r\n  });\r\n};\r\n\r\nconst moderateComment = async (\r\n  id: string,\r\n  payload: IModerateCommentPayload,\r\n) => {\r\n  const commentData = await prisma.comment.findUniqueOrThrow({\r\n    where: {\r\n      id,\r\n    },\r\n    select: {\r\n      id: true,\r\n      status: true,\r\n    },\r\n  });\r\n  if (commentData.status === payload.status) {\r\n    throw new Error(\r\n      `Your provided status ${payload.status} is already up to date.`,\r\n    );\r\n  }\r\n\r\n  const updatedModerateComment = await prisma.comment.update({\r\n    where: {\r\n      id,\r\n    },\r\n    data: payload,\r\n  });\r\n  return updatedModerateComment;\r\n};\r\n\r\nexport const commentService = {\r\n  createComment,\r\n  getCommentByAuthorId,\r\n  getCommentByPostId,\r\n  updateComment,\r\n  deleteComment,\r\n  moderateComment,\r\n};\r\n","import { Router } from \"express\";\r\nimport { postController } from \"./post.controller\";\r\nimport { auth } from \"../../middlewares/auth\";\r\nimport { Role } from \"../../../generated/prisma/enums\";\r\n\r\nconst router = Router();\r\n\r\nrouter.post(\r\n  \"/\",\r\n  auth(Role.USER, Role.ADMIN, Role.AUTHOR),\r\n  postController.createPost,\r\n);\r\n\r\nrouter.get(\"/\", auth(Role.ADMIN), postController.getAllPosts);\r\n\r\nrouter.get(\"/\", postController.getAllPosts);\r\n\r\nrouter.get(\"/WithFilter\", postController.getAllPostsWithFilter);\r\n\r\nrouter.get(\"/WithSearch\", postController.getAllPostsWithSearch);\r\n\r\n// ? Filtering with exact match (AND Operator) and Search with Partial Match (OR Operator)\r\nrouter.get(\r\n  \"/WithFilterAndSearch\",\r\n  postController.getAllPostsWithFilterAndSearch,\r\n);\r\n\r\n// ? All Post with Pagination\r\nrouter.get(\"/WithPagination\", postController.getAllPostsWithPagination);\r\n\r\n// ? All Post with Dynamic Pagination\r\nrouter.get(\r\n  \"/WithDynamicPagination\",\r\n  postController.getAllPostsWithDynamicPagination,\r\n);\r\n\r\nrouter.get(\"/stats\", auth(Role.ADMIN), postController.getPostsStats);\r\n\r\nrouter.get(\r\n  \"/my-posts\",\r\n  auth(Role.USER, Role.ADMIN, Role.AUTHOR),\r\n  postController.getMyPosts,\r\n);\r\n\r\nrouter.get(\"/:postId\", postController.getPostById);\r\n\r\nrouter.patch(\r\n  \"/:postId\",\r\n  auth(Role.USER, Role.ADMIN, Role.AUTHOR),\r\n  postController.updatePost,\r\n);\r\n\r\nrouter.delete(\r\n  \"/:postId\",\r\n  auth(Role.USER, Role.ADMIN, Role.AUTHOR),\r\n  postController.deletePost,\r\n);\r\n\r\nexport const postRoutes = router;\r\n","import httpStatus from \"http-status\";\r\nimport { NextFunction, Request, Response } from \"express\";\r\nimport { catchAsync } from \"../../utils/catchAsync\";\r\nimport { sendResponse } from \"../../utils/sendResponse\";\r\nimport { postService } from \"./post.service\";\r\n\r\nconst createPost = catchAsync(\r\n  async (req: Request, res: Response, next: NextFunction) => {\r\n    const id = req.user?.id;\r\n    const payload = req.body;\r\n\r\n    const result = await postService.createPost(payload, id as string);\r\n\r\n    sendResponse(res, {\r\n      success: true,\r\n      statusCode: httpStatus.CREATED,\r\n      message: \"Post Created Successfully!\",\r\n      data: result,\r\n    });\r\n  },\r\n);\r\n\r\nconst getAllPosts = catchAsync(\r\n  async (req: Request, res: Response, next: NextFunction) => {\r\n    const posts = await postService.getAllPosts();\r\n    sendResponse(res, {\r\n      success: true,\r\n      statusCode: httpStatus.OK,\r\n      message: \"Post Retrieved Successfully!\",\r\n      data: {\r\n        posts,\r\n      },\r\n    });\r\n  },\r\n);\r\n\r\n// ? Filtering with Exact Match\r\nconst getAllPostsWithFilter = catchAsync(\r\n  async (req: Request, res: Response, next: NextFunction) => {\r\n    const posts = await postService.getAllPostsWithFilter();\r\n    sendResponse(res, {\r\n      success: true,\r\n      statusCode: httpStatus.OK,\r\n      message: \"Post Retrieved Successfully!\",\r\n      data: {\r\n        posts,\r\n      },\r\n    });\r\n  },\r\n);\r\n\r\n// ? Search/Filtering with Partial Match\r\nconst getAllPostsWithSearch = catchAsync(\r\n  async (req: Request, res: Response, next: NextFunction) => {\r\n    const posts = await postService.getAllPostsWithSearch();\r\n    sendResponse(res, {\r\n      success: true,\r\n      statusCode: httpStatus.OK,\r\n      message: \"Post Retrieved Successfully!\",\r\n      data: {\r\n        posts,\r\n      },\r\n    });\r\n  },\r\n);\r\n\r\n// ? Filtering with exact match (AND Operator) and Search with Partial Match (OR Operator)\r\nconst getAllPostsWithFilterAndSearch = catchAsync(\r\n  async (req: Request, res: Response, next: NextFunction) => {\r\n    const posts = await postService.getAllPostsWithFilterAndSearch();\r\n    sendResponse(res, {\r\n      success: true,\r\n      statusCode: httpStatus.OK,\r\n      message: \"Post Retrieved Successfully!\",\r\n      data: {\r\n        posts,\r\n      },\r\n    });\r\n  },\r\n);\r\n\r\n// ? Filtering with exact match (AND Operator) and Search with Partial Match (OR Operator)\r\nconst getAllPostsWithPagination = catchAsync(\r\n  async (req: Request, res: Response, next: NextFunction) => {\r\n    const posts = await postService.getAllPostsWithPagination();\r\n    sendResponse(res, {\r\n      success: true,\r\n      statusCode: httpStatus.OK,\r\n      message: \"Post Retrieved Successfully!\",\r\n      data: {\r\n        posts,\r\n      },\r\n    });\r\n  },\r\n);\r\n\r\n// ? Filtering with exact match (AND Operator) and Search with Partial Match (OR Operator)\r\nconst getAllPostsWithDynamicPagination = catchAsync(\r\n  async (req: Request, res: Response, next: NextFunction) => {\r\n    const queryParams = req.query;\r\n    // console.log(queryParams);\r\n    const posts =\r\n      await postService.getAllPostsWithDynamicPagination(queryParams);\r\n    sendResponse(res, {\r\n      success: true,\r\n      statusCode: httpStatus.OK,\r\n      message: \"Post Retrieved Successfully!\",\r\n      data: posts.data,\r\n      meta: posts.meta,\r\n    });\r\n  },\r\n);\r\n\r\nconst getPostById = catchAsync(\r\n  async (req: Request, res: Response, next: NextFunction) => {\r\n    const postId = req.params.postId;\r\n    if (!postId) {\r\n      throw new Error(\"Post Id required in params.\");\r\n    }\r\n\r\n    const post = await postService.getPostById(postId as string);\r\n    sendResponse(res, {\r\n      success: true,\r\n      statusCode: httpStatus.OK,\r\n      message: \"Post retrieved Successfully!\",\r\n      data: post,\r\n    });\r\n  },\r\n);\r\n\r\nconst getPostsStats = catchAsync(\r\n  async (req: Request, res: Response, next: NextFunction) => {\r\n    const result = await postService.getPostsStats();\r\n    sendResponse(res, {\r\n      success: true,\r\n      statusCode: httpStatus.OK,\r\n      message: \"Post stats retrieved Successfully!\",\r\n      data: result,\r\n    });\r\n  },\r\n);\r\n\r\nconst getMyPosts = catchAsync(\r\n  async (req: Request, res: Response, next: NextFunction) => {\r\n    const authorId = req.user?.id;\r\n    const post = await postService.getMyPosts(authorId as string);\r\n    sendResponse(res, {\r\n      success: true,\r\n      statusCode: httpStatus.OK,\r\n      message: \"My Post retrieved Successfully!\",\r\n      data: post,\r\n    });\r\n  },\r\n);\r\n\r\nconst updatePost = catchAsync(\r\n  async (req: Request, res: Response, next: NextFunction) => {\r\n    const postId = req.params.postId;\r\n    const payload = req.body;\r\n    const authorId = req.user?.id;\r\n    const isAdmin = req.user?.role === \"ADMIN\";\r\n\r\n    const result = await postService.updatePost(\r\n      postId as string,\r\n      payload,\r\n      authorId as string,\r\n      isAdmin,\r\n    );\r\n    sendResponse(res, {\r\n      success: true,\r\n      statusCode: httpStatus.OK,\r\n      message: \"Post updated Successfully!\",\r\n      data: result,\r\n    });\r\n  },\r\n);\r\n\r\nconst deletePost = catchAsync(\r\n  async (req: Request, res: Response, next: NextFunction) => {\r\n    const postId = req.params.postId;\r\n    const authorId = req.user?.id;\r\n    const isAdmin = req.user?.role === \"ADMIN\";\r\n\r\n    if (!postId) {\r\n      throw new Error(\"Post Id required in params.\");\r\n    }\r\n\r\n    await postService.deletePost(postId as string, authorId as string, isAdmin);\r\n    sendResponse(res, {\r\n      success: true,\r\n      statusCode: httpStatus.OK,\r\n      message: \"Post Deleted Successfully!\",\r\n      data: {},\r\n    });\r\n  },\r\n);\r\n\r\nexport const postController = {\r\n  createPost,\r\n  getAllPosts,\r\n  getAllPostsWithFilter,\r\n  getAllPostsWithSearch,\r\n  getAllPostsWithFilterAndSearch,\r\n  getAllPostsWithPagination,\r\n  getAllPostsWithDynamicPagination,\r\n  getPostsStats,\r\n  getMyPosts,\r\n  getPostById,\r\n  updatePost,\r\n  deletePost,\r\n};\r\n","import bcrypt from \"bcryptjs\";\r\nimport { prisma } from \"../../lib/prisma\";\r\nimport config from \"../../config\";\r\nimport {\r\n  ICreatePostPayload,\r\n  IPostQuery,\r\n  IUpdatePostPayload,\r\n} from \"./post.interface\";\r\nimport { CommentStatus, PostStatus } from \"../../../generated/prisma/enums\";\r\nimport { skip } from \"node:test\";\r\nimport { PostWhereInput } from \"../../../generated/prisma/models\";\r\n\r\nconst createPost = async (payload: ICreatePostPayload, userId: string) => {\r\n  const user = await prisma.user.findUniqueOrThrow({\r\n    where: {\r\n      id: userId,\r\n    },\r\n    include: {\r\n      subscription: true,\r\n    },\r\n  });\r\n  if (payload.isPremium && user.subscription?.status !== \"ACTIVE\") {\r\n    throw new Error(\r\n      \"Your are not premium user. So, you can not create premium post. \",\r\n    );\r\n  }\r\n  const result = await prisma.post.create({\r\n    data: {\r\n      ...payload,\r\n      authorId: userId,\r\n    },\r\n  });\r\n\r\n  return result;\r\n};\r\n\r\nconst getAllPosts = async () => {\r\n  const posts = await prisma.post.findMany({\r\n    include: {\r\n      author: {\r\n        omit: {\r\n          password: true,\r\n        },\r\n      },\r\n      comments: true,\r\n    },\r\n  });\r\n  return posts;\r\n};\r\n\r\n// ? Filtering with Exact Match\r\nconst getAllPostsWithFilter = async () => {\r\n  const posts = await prisma.post.findMany({\r\n    // ? Filtering without AND condition\r\n    // where: {\r\n    //   title: \"My Second Post for USER\",\r\n    //   status: PostStatus.PUBLISHED,\r\n    // },\r\n\r\n    // ? Filtering with AND condition\r\n    where: {\r\n      AND: [\r\n        {\r\n          title: \"My Second Post for USER\",\r\n        },\r\n        {\r\n          status: PostStatus.PUBLISHED,\r\n        },\r\n        {\r\n          tags: {\r\n            equals: [\"typescript\", \"prisma\", \"express\"],\r\n          },\r\n        },\r\n      ],\r\n    },\r\n    include: {\r\n      author: {\r\n        omit: {\r\n          password: true,\r\n        },\r\n      },\r\n      comments: true,\r\n    },\r\n  });\r\n  return posts;\r\n};\r\n\r\n// ? Search/Filtering with Partial Match OR Operator\r\nconst getAllPostsWithSearch = async () => {\r\n  const posts = await prisma.post.findMany({\r\n    where: {\r\n      OR: [\r\n        {\r\n          title: {\r\n            contains: \"Second\",\r\n            mode: \"insensitive\",\r\n          },\r\n        },\r\n        {\r\n          status: PostStatus.PUBLISHED,\r\n        },\r\n        {\r\n          tags: {\r\n            equals: [\"typescript\", \"prisma\", \"express\"],\r\n          },\r\n        },\r\n      ],\r\n    },\r\n    include: {\r\n      author: {\r\n        omit: {\r\n          password: true,\r\n        },\r\n      },\r\n      comments: true,\r\n    },\r\n  });\r\n  return posts;\r\n};\r\n\r\n// ? Filtering with exact match (AND Operator) and Search with Partial Match (OR Operator)\r\nconst getAllPostsWithFilterAndSearch = async () => {\r\n  const posts = await prisma.post.findMany({\r\n    where: {\r\n      AND: [\r\n        // Searching\r\n        {\r\n          OR: [\r\n            {\r\n              title: {\r\n                contains: \"ARCHIVED\",\r\n                mode: \"insensitive\",\r\n              },\r\n              content: {\r\n                contains: \"Content of the post goes here.\",\r\n                mode: \"insensitive\",\r\n              },\r\n            },\r\n          ],\r\n        },\r\n        // Filtering\r\n        {\r\n          status: PostStatus.ARCHIVED,\r\n        },\r\n        {\r\n          tags: {\r\n            equals: [\"typescript\", \"prisma\", \"express\"],\r\n          },\r\n        },\r\n      ],\r\n    },\r\n    include: {\r\n      author: {\r\n        omit: {\r\n          password: true,\r\n        },\r\n      },\r\n      comments: true,\r\n    },\r\n  });\r\n  return posts;\r\n};\r\n\r\n// ? All Post with Pagination\r\nconst getAllPostsWithPagination = async () => {\r\n  const posts = await prisma.post.findMany({\r\n    take: 5,\r\n    skip: 5,\r\n    // orderBy: {\r\n    //   createdAt: \"desc\",\r\n    // },\r\n    include: {\r\n      author: {\r\n        omit: {\r\n          password: true,\r\n        },\r\n      },\r\n      comments: true,\r\n    },\r\n  });\r\n  return posts;\r\n};\r\n\r\n// ? All Post with DynamicPagination\r\nconst getAllPostsWithDynamicPagination = async (queryParams: IPostQuery) => {\r\n  const limit = queryParams.limit ? parseInt(queryParams.limit) : 5;\r\n  const page = queryParams.page ? parseInt(queryParams.page) : 1;\r\n  const skip = (page - 1) * limit;\r\n  const sortBy = queryParams.sortBy ? queryParams.sortBy : \"createdAt\";\r\n  const sortOrder = queryParams.sortOrder ? queryParams.sortOrder : \"desc\";\r\n  const tags = queryParams.tags ? JSON.parse(queryParams.tags as string) : [];\r\n  const tagsArray = Array.isArray(tags) ? tags : [tags];\r\n\r\n  console.log(tagsArray);\r\n\r\n  const andConditions: PostWhereInput[] = [];\r\n  if (queryParams.searchTerm) {\r\n    andConditions.push({\r\n      OR: [\r\n        {\r\n          title: {\r\n            contains: queryParams.searchTerm,\r\n            mode: \"insensitive\",\r\n          },\r\n        },\r\n        {\r\n          content: {\r\n            contains: queryParams.searchTerm,\r\n            mode: \"insensitive\",\r\n          },\r\n        },\r\n      ],\r\n    });\r\n  }\r\n  if (queryParams.status) {\r\n    andConditions.push({ status: queryParams.status });\r\n  }\r\n  if (queryParams.content) {\r\n    andConditions.push({ content: queryParams.content });\r\n  }\r\n  if (queryParams.authorId) {\r\n    andConditions.push({ authorId: queryParams.authorId });\r\n  }\r\n  if (queryParams.isFeatured) {\r\n    andConditions.push({ isFeatured: Boolean(queryParams.isFeatured) });\r\n  }\r\n  if (queryParams.tags) {\r\n    andConditions.push({\r\n      tags: {\r\n        hasSome: tagsArray,\r\n      },\r\n    });\r\n  }\r\n\r\n  andConditions.push({\r\n    isPremium: false,\r\n  });\r\n\r\n  const posts = await prisma.post.findMany({\r\n    // Options for Dynamic Filtering, Pagination, and Sorting\r\n    where: {\r\n      AND: andConditions,\r\n    },\r\n    take: limit,\r\n    skip: skip,\r\n    orderBy: {\r\n      [sortBy]: sortOrder,\r\n    },\r\n    include: {\r\n      author: {\r\n        omit: {\r\n          password: true,\r\n        },\r\n      },\r\n      comments: true,\r\n    },\r\n  });\r\n\r\n  const totalPostCount = await prisma.post.count({\r\n    where: {\r\n      AND: andConditions,\r\n    },\r\n  });\r\n  return {\r\n    data: posts,\r\n    meta: {\r\n      page: page,\r\n      limit: limit,\r\n      total: totalPostCount,\r\n      totalPages: Math.ceil(totalPostCount / limit),\r\n    },\r\n  };\r\n};\r\n\r\nconst getPostById = async (postId: string) => {\r\n  const transactionResult = await prisma.$transaction(async (tx) => {\r\n    await tx.post.update({\r\n      where: {\r\n        id: postId,\r\n      },\r\n      data: {\r\n        views: {\r\n          increment: 1,\r\n        },\r\n      },\r\n    });\r\n\r\n    // throw new Error(\"Fake Error\");\r\n\r\n    const post = await tx.post.findUniqueOrThrow({\r\n      where: {\r\n        id: postId,\r\n        isPremium: false,\r\n      },\r\n      include: {\r\n        author: {\r\n          omit: {\r\n            password: true,\r\n          },\r\n        },\r\n        comments: {\r\n          where: {\r\n            status: CommentStatus.APPROVED,\r\n          },\r\n          orderBy: {\r\n            createdAt: \"desc\",\r\n          },\r\n        },\r\n\r\n        _count: {\r\n          select: {\r\n            comments: true,\r\n          },\r\n        },\r\n      },\r\n    });\r\n    return post;\r\n  });\r\n  return transactionResult;\r\n};\r\n\r\nconst getPostsStats = async () => {\r\n  const transactionResult = await prisma.$transaction(async (tx) => {\r\n    const [\r\n      totalPost,\r\n      totalPublishedPost,\r\n      totalDraftPost,\r\n      totalArchivedPost,\r\n      totalComments,\r\n      totalApprovedComments,\r\n      totalRejectedComments,\r\n      totalPostViewsAggregate,\r\n    ] = await Promise.all([\r\n      await tx.post.count(),\r\n      await tx.post.count({\r\n        where: {\r\n          status: PostStatus.PUBLISHED,\r\n        },\r\n      }),\r\n      await tx.post.count({\r\n        where: {\r\n          status: PostStatus.DRAFT,\r\n        },\r\n      }),\r\n      await tx.post.count({\r\n        where: {\r\n          status: PostStatus.ARCHIVED,\r\n        },\r\n      }),\r\n      await tx.comment.count(),\r\n      await tx.comment.count({\r\n        where: {\r\n          status: CommentStatus.APPROVED,\r\n        },\r\n      }),\r\n      await tx.comment.count({\r\n        where: {\r\n          status: CommentStatus.REJECT,\r\n        },\r\n      }),\r\n      await tx.post.aggregate({\r\n        _sum: {\r\n          views: true,\r\n        },\r\n      }),\r\n    ]);\r\n    return {\r\n      totalPost,\r\n      totalPublishedPost,\r\n      totalDraftPost,\r\n      totalArchivedPost,\r\n      totalComments,\r\n      totalApprovedComments,\r\n      totalRejectedComments,\r\n      totalPostViews: totalPostViewsAggregate._sum.views,\r\n    };\r\n  });\r\n  return transactionResult;\r\n};\r\n\r\nconst getMyPosts = async (authorId: string) => {\r\n  const result = await prisma.post.findMany({\r\n    where: {\r\n      authorId,\r\n    },\r\n    orderBy: {\r\n      createdAt: \"desc\",\r\n    },\r\n    include: {\r\n      author: {\r\n        omit: {\r\n          password: true,\r\n        },\r\n      },\r\n      _count: {\r\n        select: {\r\n          comments: true,\r\n        },\r\n      },\r\n      comments: true,\r\n    },\r\n  });\r\n\r\n  return result;\r\n};\r\n\r\nconst updatePost = async (\r\n  postId: string,\r\n  payload: IUpdatePostPayload,\r\n  authorId: string,\r\n  isAdmin: boolean,\r\n) => {\r\n  const post = await prisma.post.findUniqueOrThrow({\r\n    where: {\r\n      id: postId,\r\n    },\r\n  });\r\n\r\n  if (!isAdmin && post.authorId !== authorId) {\r\n    throw new Error(\"Access denied! you are not owner of this post or admin.\");\r\n  }\r\n\r\n  const result = await prisma.post.update({\r\n    where: {\r\n      id: postId,\r\n    },\r\n    data: payload,\r\n    include: {\r\n      author: {\r\n        omit: {\r\n          password: true,\r\n        },\r\n      },\r\n      comments: true,\r\n    },\r\n  });\r\n\r\n  return result;\r\n};\r\n\r\nconst deletePost = async (\r\n  postId: string,\r\n  authorId: string,\r\n  isAdmin: boolean,\r\n) => {\r\n  const post = await prisma.post.findUniqueOrThrow({\r\n    where: {\r\n      id: postId,\r\n    },\r\n  });\r\n\r\n  if (!isAdmin && post.authorId !== authorId) {\r\n    throw new Error(\"Access denied! you are not owner of this post or admin.\");\r\n  }\r\n\r\n  await prisma.post.delete({\r\n    where: {\r\n      id: postId,\r\n    },\r\n  });\r\n};\r\n\r\nexport const postService = {\r\n  createPost,\r\n  getAllPosts,\r\n  getAllPostsWithFilter,\r\n  getAllPostsWithSearch,\r\n  getAllPostsWithFilterAndSearch,\r\n  getAllPostsWithPagination,\r\n  getAllPostsWithDynamicPagination,\r\n  getPostById,\r\n  getPostsStats,\r\n  getMyPosts,\r\n  updatePost,\r\n  deletePost,\r\n};\r\n","import { Request, Response } from \"express\";\r\n\r\nexport const notFoundHandler = (req: Request, res: Response) => {\r\n  res.status(404).json({\r\n    success: false,\r\n    message: \"Not Found\",\r\n    path: req.originalUrl,\r\n    timestamp: new Date().toISOString(),\r\n    date: new Date(),\r\n  });\r\n};\r\n","import { NextFunction, Request, Response } from \"express\";\r\nimport httpStatus from \"http-status\";\r\nimport { Prisma } from \"../../generated/prisma/client\";\r\n\r\nexport const globalErrorHandler = (\r\n  err: any,\r\n  req: Request,\r\n  res: Response,\r\n  next: NextFunction,\r\n) => {\r\n  //   console.log(\"Error: \", err);\r\n\r\n  let statusCode;\r\n  let errorMessage = err.message || \"Something went wrong.\";\r\n\r\n  if (err instanceof Prisma.PrismaClientValidationError) {\r\n    statusCode = httpStatus.BAD_REQUEST;\r\n    errorMessage =\r\n      \"Validation error occurred. You have provided incorrect field type or missing required fields.\";\r\n  } else if (err instanceof Prisma.PrismaClientKnownRequestError) {\r\n    if (err.code === \"P2002\") {\r\n      statusCode = httpStatus.CONFLICT;\r\n      errorMessage = \"Duplicate entry found. Please check your input.\";\r\n    } else if (err.code === \"P2003\") {\r\n      statusCode = httpStatus.BAD_REQUEST;\r\n      errorMessage = \"Foreign key constraint failed. Please check your input.\";\r\n    } else if (err.code === \"P2025\") {\r\n      statusCode = httpStatus.NOT_FOUND;\r\n      errorMessage = \"Requested resource not found. Please check your input.\";\r\n    }\r\n  } else if (err instanceof Prisma.PrismaClientInitializationError) {\r\n    if (err.errorCode === \"P1000\") {\r\n      statusCode = httpStatus.UNAUTHORIZED;\r\n      errorMessage =\r\n        \"Authentication failed against database server.Failed to connect to the database. Please check your database connection.\";\r\n    } else if (err.errorCode === \"P1001\") {\r\n      statusCode = httpStatus.SERVICE_UNAVAILABLE;\r\n      errorMessage =\r\n        \"Database server is not available. Please check your database server.\";\r\n    }\r\n  } else if (err instanceof Prisma.PrismaClientUnknownRequestError) {\r\n    statusCode = httpStatus.INTERNAL_SERVER_ERROR;\r\n    errorMessage = \"An unknown error occurred while processing the request.\";\r\n  }\r\n\r\n  //   ===========================\r\n  res.status(httpStatus.INTERNAL_SERVER_ERROR).json({\r\n    success: false,\r\n    statusCode: statusCode || httpStatus.INTERNAL_SERVER_ERROR,\r\n    message: errorMessage,\r\n    path: req.originalUrl,\r\n    date: Date(),\r\n    errorName: err.name || \"Internal Server Error\",\r\n    errorCode: err.code || \"Error code not available\",\r\n    error: err.stack || err,\r\n  });\r\n};\r\n","import { Request, Response, Router } from \"express\";\r\nimport { subscriptionController } from \"./subscription.controller\";\r\nimport { auth } from \"../../middlewares/auth\";\r\nimport { Role } from \"../../../generated/prisma/client\";\r\n\r\nconst router = Router();\r\n\r\nrouter.post(\r\n  \"/checkout\",\r\n  auth(Role.USER, Role.ADMIN, Role.AUTHOR),\r\n  subscriptionController.createCheckoutSession,\r\n);\r\n\r\nrouter.post(\"/webhook\", subscriptionController.handleWebhook);\r\nrouter.get(\r\n  \"/status\",\r\n  auth(Role.USER, Role.ADMIN, Role.AUTHOR),\r\n  subscriptionController.getSubscriptionStatus,\r\n);\r\n\r\nexport const subscriptionRoutes = router;\r\n","import Stripe from \"stripe\";\r\nimport config from \"../config\";\r\n\r\nexport const stripe = new Stripe(config.stripe_secret_key);\r\n","import Stripe from \"stripe\";\r\nimport { stripe } from \"../lib/stripe\";\r\nimport { prisma } from \"../lib/prisma\";\r\nimport { SubscriptionStatus } from \"../../generated/prisma/enums\";\r\n\r\nexport const getPeriodEnd = (payload: Stripe.Subscription) => {\r\n  const currentPeriodEndInMilliseconds =\r\n    payload.items.data[0]?.current_period_end!;\r\n\r\n  const currentPeriodEnd = new Date(currentPeriodEndInMilliseconds * 1000);\r\n  return currentPeriodEnd;\r\n};\r\n\r\nexport const handleCheckoutCompleted = async (\r\n  session: Stripe.Checkout.Session,\r\n) => {\r\n  // const session: Stripe.Checkout.Session = event.data.object;\r\n  const userId = session.metadata?.userId;\r\n  const stripeCustomerId = session?.customer as string;\r\n  const stripeSubscriptionId = session?.subscription as string;\r\n  if (!userId || !stripeCustomerId || !stripeSubscriptionId) {\r\n    console.log(\r\n      \"Webhook Failed! Missing values for creating checkout session.\",\r\n    );\r\n    return;\r\n  }\r\n  const stripSubscription =\r\n    await stripe.subscriptions.retrieve(stripeSubscriptionId);\r\n\r\n  const currentPeriodEnd = getPeriodEnd(stripSubscription);\r\n  await prisma.subscription.upsert({\r\n    where: {\r\n      userId,\r\n    },\r\n    create: {\r\n      userId,\r\n      stripeCustomerId,\r\n      stripeSubscriptionId,\r\n      status: \"ACTIVE\",\r\n      currentPeriodEnd,\r\n    },\r\n    update: {\r\n      stripeCustomerId,\r\n      stripeSubscriptionId,\r\n      status: \"ACTIVE\",\r\n      currentPeriodEnd,\r\n    },\r\n  });\r\n};\r\n\r\nexport const handleChangeSubscription = async (\r\n  payload: Stripe.Subscription,\r\n) => {\r\n  const stripeSubscriptionId = payload.id;\r\n  const status =\r\n    payload.status === \"active\"\r\n      ? SubscriptionStatus.ACTIVE\r\n      : payload.status === \"trialing\"\r\n        ? SubscriptionStatus.ACTIVE\r\n        : payload.status === \"canceled\"\r\n          ? SubscriptionStatus.CANCELED\r\n          : SubscriptionStatus.EXPIRED;\r\n\r\n  const currentPeriodEnd = getPeriodEnd(payload);\r\n  const isSubscriptionExist = await prisma.subscription.findUnique({\r\n    where: {\r\n      stripeSubscriptionId,\r\n    },\r\n  });\r\n\r\n  if (!isSubscriptionExist) {\r\n    console.log(\r\n      `Webhook: No Subscription found for subscription id : ${stripeSubscriptionId}`,\r\n    );\r\n    return;\r\n  }\r\n  await prisma.subscription.update({\r\n    where: {\r\n      stripeSubscriptionId,\r\n    },\r\n    data: {\r\n      status,\r\n      currentPeriodEnd,\r\n    },\r\n  });\r\n};\r\n","import Stripe from \"stripe\";\r\nimport config from \"../../config\";\r\nimport { prisma } from \"../../lib/prisma\";\r\nimport { stripe } from \"../../lib/stripe\";\r\nimport { SubscriptionStatus } from \"../../../generated/prisma/enums\";\r\nimport {\r\n  handleChangeSubscription,\r\n  handleCheckoutCompleted,\r\n} from \"../../utils/subscription.utils\";\r\n\r\nconst createCheckoutSession = async (userId: string) => {\r\n  const transactionResult = await prisma.$transaction(async (tx) => {\r\n    const user = await tx.user.findFirstOrThrow({\r\n      where: {\r\n        id: userId,\r\n      },\r\n      include: {\r\n        subscription: true,\r\n      },\r\n    });\r\n\r\n    // Old subscriber\r\n    let stripeCustomerId = user.subscription?.stripeCustomerId;\r\n\r\n    if (!stripeCustomerId) {\r\n      // new subscriber\r\n      const customer = await stripe.customers.create({\r\n        email: user.email,\r\n        name: user.name,\r\n        metadata: { userId: user.id },\r\n      });\r\n\r\n      stripeCustomerId = customer.id;\r\n    }\r\n\r\n    const session = await stripe.checkout.sessions.create({\r\n      line_items: [\r\n        {\r\n          price: config.stripe_product_price_id,\r\n          quantity: 1,\r\n        },\r\n      ],\r\n      mode: \"subscription\",\r\n      customer: stripeCustomerId,\r\n      payment_method_types: [\"card\"],\r\n      success_url: `${config.app_url}/premium?success=true`,\r\n      cancel_url: `${config.app_url}/payment?success=false`,\r\n      metadata: { userId: user.id },\r\n    });\r\n\r\n    return session.url;\r\n  });\r\n  return {\r\n    paymentUrl: transactionResult,\r\n  };\r\n};\r\n\r\nconst handleWebhook = async (payload: Buffer, signature: string) => {\r\n  const endpointSecret = config.stripe_webhook_secret;\r\n  const event = stripe.webhooks.constructEvent(\r\n    payload,\r\n    signature,\r\n    endpointSecret,\r\n  );\r\n  // Handle the event\r\n  switch (event.type) {\r\n    case \"checkout.session.completed\":\r\n      // Occurs when a Checkout Session has been successfully completed.\r\n      await handleCheckoutCompleted(event.data.object);\r\n      break;\r\n    case \"customer.subscription.updated\":\r\n      // Occurs whenever a subscription changes (e.g., switching from one plan to another, or changing the status from trial to active).\r\n      // const paymentObject = event.data.object;\r\n      await handleChangeSubscription(event.data.object);\r\n\r\n      break;\r\n    case \"customer.subscription.deleted\":\r\n      // Occurs whenever a customer’s subscription ends.\r\n      // const paymentObject = event.data.object;\r\n      await handleChangeSubscription(event.data.object);\r\n\r\n      break;\r\n    default:\r\n      // Unexpected event type\r\n      console.log(`No events matched. Unhandled event type ${event.type}.`);\r\n      break;\r\n  }\r\n};\r\n\r\nconst getSubscriptionStatus = async (userId: string) => {\r\n  const isSubscriptionExist = await prisma.subscription.findUniqueOrThrow({\r\n    where: {\r\n      userId,\r\n    },\r\n  });\r\n\r\n  const isActive =\r\n    isSubscriptionExist.status === \"ACTIVE\" &&\r\n    isSubscriptionExist.currentPeriodEnd &&\r\n    new Date(isSubscriptionExist.currentPeriodEnd) > new Date();\r\n\r\n  return {\r\n    status: isSubscriptionExist.status,\r\n    isSubscribed: isActive,\r\n    currentPeriodEnd: isSubscriptionExist.currentPeriodEnd,\r\n  };\r\n};\r\nexport const subscriptionServices = {\r\n  createCheckoutSession,\r\n  handleWebhook,\r\n  getSubscriptionStatus,\r\n};\r\n","import { NextFunction, Request, Response } from \"express\";\r\nimport { catchAsync } from \"../../utils/catchAsync\";\r\nimport { subscriptionServices } from \"./subscription.services\";\r\nimport { sendResponse } from \"../../utils/sendResponse\";\r\nimport httpStatus from \"http-status\";\r\n\r\nconst createCheckoutSession = catchAsync(\r\n  catchAsync(async (req: Request, res: Response, next: NextFunction) => {\r\n    const userId = req.user?.id;\r\n    const result = await subscriptionServices.createCheckoutSession(\r\n      userId as string,\r\n    );\r\n    sendResponse(res, {\r\n      success: true,\r\n      statusCode: httpStatus.OK,\r\n      message: \"Checkout completed Successfully!\",\r\n      data: result,\r\n    });\r\n  }),\r\n);\r\n\r\nconst handleWebhook = catchAsync(\r\n  catchAsync(async (req: Request, res: Response, next: NextFunction) => {\r\n    const event = req.body as Buffer;\r\n    const signature = req.headers[\"stripe-signature\"]!;\r\n\r\n    await subscriptionServices.handleWebhook(event, signature as string);\r\n    sendResponse(res, {\r\n      success: true,\r\n      statusCode: httpStatus.OK,\r\n      message: \"Webhook triggered Successfully!\",\r\n      data: null,\r\n    });\r\n  }),\r\n);\r\n\r\nconst getSubscriptionStatus = catchAsync(\r\n  catchAsync(async (req: Request, res: Response, next: NextFunction) => {\r\n    const userId = req.user?.id;\r\n\r\n    const result = await subscriptionServices.getSubscriptionStatus(\r\n      userId as string,\r\n    );\r\n\r\n    sendResponse(res, {\r\n      success: true,\r\n      statusCode: httpStatus.OK,\r\n      message: \"Subscription status retrieved Successfully!\",\r\n      data: result,\r\n    });\r\n  }),\r\n);\r\n\r\nexport const subscriptionController = {\r\n  createCheckoutSession,\r\n  handleWebhook,\r\n  getSubscriptionStatus,\r\n};\r\n","import { NextFunction, Request, Response, Router } from \"express\";\r\nimport { premiumController } from \"./premium.controller\";\r\nimport { auth } from \"../../middlewares/auth\";\r\nimport { Role } from \"../../../generated/prisma/enums\";\r\nimport { catchAsync } from \"../../utils/catchAsync\";\r\nimport { prisma } from \"../../lib/prisma\";\r\nimport { SubscriptionStatus } from \"./../../../generated/prisma/enums\";\r\nimport { subscriptionGuard } from \"../../middlewares/premiumGuard\";\r\n\r\nconst router = Router();\r\n\r\nrouter.get(\r\n  \"/\",\r\n  auth(Role.USER, Role.ADMIN, Role.AUTHOR),\r\n  subscriptionGuard(),\r\n  premiumController.getPremiumContent,\r\n);\r\n\r\nexport const premiumRoutes = router;\r\n","import { PostWhereInput } from \"../../../generated/prisma/models\";\r\nimport { prisma } from \"../../lib/prisma\";\r\nimport { IPostQuery } from \"../post/post.interface\";\r\n\r\nconst getPremiumContent = async (queryParams: IPostQuery) => {\r\n  const limit = queryParams.limit ? parseInt(queryParams.limit) : 5;\r\n  const page = queryParams.page ? parseInt(queryParams.page) : 1;\r\n  const skip = (page - 1) * limit;\r\n  const sortBy = queryParams.sortBy ? queryParams.sortBy : \"createdAt\";\r\n  const sortOrder = queryParams.sortOrder ? queryParams.sortOrder : \"desc\";\r\n  const tags = queryParams.tags ? JSON.parse(queryParams.tags as string) : [];\r\n  const tagsArray = Array.isArray(tags) ? tags : [tags];\r\n\r\n  console.log(tagsArray);\r\n\r\n  const andConditions: PostWhereInput[] = [];\r\n  if (queryParams.searchTerm) {\r\n    andConditions.push({\r\n      OR: [\r\n        {\r\n          title: {\r\n            contains: queryParams.searchTerm,\r\n            mode: \"insensitive\",\r\n          },\r\n        },\r\n        {\r\n          content: {\r\n            contains: queryParams.searchTerm,\r\n            mode: \"insensitive\",\r\n          },\r\n        },\r\n      ],\r\n    });\r\n  }\r\n  if (queryParams.status) {\r\n    andConditions.push({ status: queryParams.status });\r\n  }\r\n  if (queryParams.content) {\r\n    andConditions.push({ content: queryParams.content });\r\n  }\r\n  if (queryParams.authorId) {\r\n    andConditions.push({ authorId: queryParams.authorId });\r\n  }\r\n  if (queryParams.isFeatured) {\r\n    andConditions.push({ isFeatured: Boolean(queryParams.isFeatured) });\r\n  }\r\n  if (queryParams.tags) {\r\n    andConditions.push({\r\n      tags: {\r\n        hasSome: tagsArray,\r\n      },\r\n    });\r\n  }\r\n  andConditions.push({\r\n    isPremium: true,\r\n  });\r\n  const posts = await prisma.post.findMany({\r\n    where: {\r\n      AND: andConditions,\r\n    },\r\n    take: limit,\r\n    skip: skip,\r\n    orderBy: {\r\n      [sortBy]: sortOrder,\r\n    },\r\n    include: {\r\n      author: {\r\n        omit: {\r\n          password: true,\r\n        },\r\n      },\r\n      comments: true,\r\n      _count: {\r\n        select: {\r\n          comments: true,\r\n        },\r\n      },\r\n    },\r\n  });\r\n\r\n  const totalPostCount = await prisma.post.count({\r\n    where: {\r\n      AND: andConditions,\r\n    },\r\n  });\r\n  return {\r\n    data: posts,\r\n    meta: {\r\n      page: page,\r\n      limit: limit,\r\n      total: totalPostCount,\r\n      totalPages: Math.ceil(totalPostCount / limit),\r\n    },\r\n  };\r\n};\r\n\r\nexport const premiumServices = {\r\n  getPremiumContent,\r\n};\r\n","import { NextFunction, Request, Response } from \"express\";\r\nimport { catchAsync } from \"../../utils/catchAsync\";\r\nimport { premiumServices } from \"./premium.service\";\r\nimport { sendResponse } from \"../../utils/sendResponse\";\r\nimport httpStatus from \"http-status\";\r\n\r\nconst getPremiumContent = catchAsync(\r\n  catchAsync(async (req: Request, res: Response, next: NextFunction) => {\r\n    const queryParams = req.query;\r\n    const result = await premiumServices.getPremiumContent(queryParams);\r\n\r\n    sendResponse(res, {\r\n      success: true,\r\n      statusCode: httpStatus.OK,\r\n      message: \"Premium content retrieved Successfully!\",\r\n      data: result.data,\r\n      meta: result.meta,\r\n    });\r\n  }),\r\n);\r\n\r\nexport const premiumController = {\r\n  getPremiumContent,\r\n};\r\n","import { NextFunction, Request, Response } from \"express\";\r\nimport { catchAsync } from \"../utils/catchAsync\";\r\nimport { prisma } from \"../lib/prisma\";\r\nimport { SubscriptionStatus } from \"../../generated/prisma/enums\";\r\n\r\nexport const subscriptionGuard = () => {\r\n  return catchAsync(async (req: Request, res: Response, next: NextFunction) => {\r\n    const userId = req.user?.id;\r\n\r\n    const subscription = await prisma.subscription.findUnique({\r\n      where: {\r\n        userId,\r\n      },\r\n    });\r\n\r\n    if (!subscription) {\r\n      throw new Error(\"Please subscribe to get access to premium content.\");\r\n    }\r\n\r\n    if (subscription?.status !== SubscriptionStatus.ACTIVE) {\r\n      throw new Error(\r\n        \"Please subscribe again to get access to premium content.\",\r\n      );\r\n    }\r\n    next();\r\n  });\r\n};\r\n","import app from \"./app\";\r\nimport config from \"./config\";\r\nimport { prisma } from \"./lib/prisma\";\r\n\r\nconst PORT = config.port;\r\n\r\nasync function main() {\r\n  try {\r\n    await prisma.$connect();\r\n    console.log(\"connected to the database successfully.\");\r\n\r\n    app.listen(PORT, () => {\r\n      console.log(`Server is running on http://localhost:${PORT}`);\r\n    });\r\n  } catch (error) {\r\n    console.error(\"Error starting the server:\", error);\r\n    await prisma.$disconnect();\r\n    process.exit(1);\r\n  }\r\n}\r\n\r\nmain();\r\n"],"mappings":"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","names":["import_express","dotenv","path","path","Buffer","AnyNull","DbNull","Decimal","JsonNull","NullTypes","PrismaClientInitializationError","PrismaClientKnownRequestError","PrismaClientRustPanicError","PrismaClientUnknownRequestError","PrismaClientValidationError","Sql","empty","join","raw","runtime","bcrypt","httpStatus","jwt","verifiedToken","verifiedToken","import_express","import_bcryptjs","bcrypt","refreshToken","import_http_status","refreshToken","httpStatus","router","import_express","import_http_status","createComment","httpStatus","getCommentByAuthorId","getCommentByPostId","updateComment","deleteComment","moderateComment","router","import_express","import_http_status","createPost","httpStatus","getAllPosts","getAllPostsWithFilter","getAllPostsWithSearch","getAllPostsWithFilterAndSearch","getAllPostsWithPagination","getAllPostsWithDynamicPagination","getPostById","getPostsStats","getMyPosts","updatePost","deletePost","router","import_http_status","httpStatus","import_express","Stripe","import_http_status","createCheckoutSession","httpStatus","handleWebhook","getSubscriptionStatus","router","import_express","import_http_status","getPremiumContent","httpStatus","router","express","cors","cookieParser"]}