From 33a6e6267c1f56a1260d8e8b624ad0ea233d6c2b Mon Sep 17 00:00:00 2001 From: Ashish Shaiju <74810128+ashishshaiju@users.noreply.github.com> Date: Sun, 26 Jul 2026 13:48:34 +0530 Subject: [PATCH 1/2] Initialize client and admin apps with authentication and venue features (#51) * feat: initialize admin app * feat: initialize client app * feat: init server * feat: add CI workflows for backend, frontend, and global monorepo (#1) * feat: home page change * feat: initialize client and admin projects with React-Router, TanStack Query, and Axios. * feat:implement auth pages UI and validation * feat: implement user auth system * feat: restructure project server structure with authentication modules, email service, graceful shutdown utilities, and database configurations. * feat: add homepage UI * feat: implement password reset functionality and enhance authentication flow - Added ResetPasswordPage component with token validation and password reset logic. - Integrated toast notifications for user feedback during password reset. - Created AuthGuard and GuestGuard components to manage route access based on authentication state. - Implemented AuthContext for managing user authentication state and session verification. - Added useAuth and useToast hooks for easier access to authentication and toast functionalities. - Introduced ToastListener for handling global toast notifications based on custom events. - Updated routing to include guards for protected and guest-only routes. - Enhanced styling and loading states for better user experience during authentication processes. * fix: type errors * feat: create list your venue/add venue page * chore(server): add core utilities, env constants, and custom error helper * feat(server): implement database-driven RBAC models and middleware * feat(server): integrate RBAC authorization within authentication controllers * feat(server): implement venue module with review workflow and owner check * feat(client): update authentication pages and navbar navigation links * feat: Configure husky and lint-staged * chore: update pnpm version in packageManager * chore: make file paths in pre-push hook relative to workspace folders * chore(server): add core utilities, env constants, and custom error helper * feat(server): implement database-driven RBAC models and middleware * feat(server): integrate RBAC authorization within authentication controllers * feat(server): implement venue module with review workflow and owner check * feat(client): update authentication pages and navbar navigation links * feat: Configure husky and lint-staged * chore: update pnpm version in packageManager * chore: make file paths in pre-push hook relative to workspace folders * Update pnpm version from 9 to 10 * Simplify pnpm and Node.js setup in backend workflow Removed specific version settings for pnpm and Node.js. * fix: pnpm & node versions * fix: pnpm & node versions * fix(server): type errors * fix(client): type errors * chore: remove max-warnings and add no-warn-ignored to eslint commands * fix(client): implement page redirects * feat: add booking UI * feat: add booking UI * Feat(server): implement session management, token validation middleware, and token utilities * Feat(server): add transaction utility and wrap core auth actions in DB transactions * Feat(server): refactor venue module types, constants, and route validations * Feat(server): modularize routing for bookings and RBAC controllers * Feat(server): integrate winston logger and clean up console logs * Feat: minor configs and client venue form debug updates * fix: server project with dependencies and build scripts * feat(server): implement session management, and refactor controllers * feat: implement explore page UI * fix(client): Type errors * feat: implemnt my-booking UI * feat(pagination): add pagination middleware, types, and utilities * chore(scripts): migrate scripts from src/scripts/ to scripts/ * feat(auth): move session model into auth module, require refresh token on logout * feat(rbac): add requireRole middleware with role hierarchy support * feat(config): strengthen CORS origin parsing with HTTPS validation in production * chore(auth): use randomUUID for JTI, restrict refresh cookie path to /api/v1/auth * fix(auth): refactor controllers to use shared handleError utility * fix(server): fix global Express error handler to log unhandled errors * chore(email): add TTL index on email tasks, add retryAfter filter and writeConcern to worker * chore(dbutils): simplify transaction wrapper to return directly * chore(logging): add module context identifier to all logError calls * style: apply prettier formatting, fix EOF newlines, and clean up empty file * feat/client: add venue listing form with image upload, draft storage, and India data * feat/server: implement venue module with CRUD operations and validation * feat: fix formatting and prettier * feat(client): add My Venues page with card grid and status badges Add a full-featured My Venues page with: - API-driven venue list with skeleton loading, empty state, and error+retry - VenueCard component with cover image, status badges, location, rejection reason - VenueCardSkeleton animated loading placeholder - VenueStatus and MyVenue types for type safety - Removed old placeholder MyVenues.tsx * feat(client): add responsive sidebar with mobile bottom navigation Refactor ListSidebar for responsive layout: - Desktop sidebar visible on md+ screens only - New fixed bottom navigation bar for mobile with active state - Moved ListVenueLayout from layout/ -> pages/listVenue/ with responsive padding * feat(client): remove hardcoded margin from venue form steps and update routing Clean up layout dependencies: - Remove ml-72 (sidebar offset) from all three form step components - Update router imports to point to new layout location - Minor formatting fix in venueFormMapper * feat(client): add server-side draft persistence for venue wizard Add draft session management with server-side save/resume: - Save/load/clear typed DraftSession in sessionStorage - Fetch draft from server on mount (sessionStorage -> API -> blank) - Auto-save form progress to server on step navigation - Clear draft session on logout in AuthContext - Add upsertVenueDraft/getMyDraft/updateVenue service methods - Add VENUE_DRAFT and VENUE_UPDATE API endpoints * feat(server): add venue draft persistence APIs and model Add draft persistence for the venue creation wizard: - Add VenueDraftModel schema for storing in-progress form data - Add upsertDraft/getMyDraft controller functions - Add upsertDraft/getDraft/deleteDraft repository functions - Add PUT /draft and GET /draft routes - Add upsertDraft/getDraft service functions * feat(server): add validation error messages to venue refund schemas Improve venue validation: - Export refundRuleSchema for reuse - Replace z.coerce.number() with z.number() for stricter validation - Add custom error messages for daysBefore and refundPercentage * feat: implement feat updates * feat(client): add shared filter constants for price range and Kerala districts * feat(client): add useDebounce hook for input debouncing * feat(client): add venue filter types and pagination response interfaces * feat(client): add public venue fetching and configure array params serialization * feat(client): add useExploreVenues infinite scroll hook * feat(client): integrate explore page with API, filters, search, and infinite scroll * feat(client): update venue listing form to use shared district constants and remove state field * feat(server): add pagination types, utilities, and paginated response helper * feat(server): implement venue management module with filtering, and draft support * feat(server): implement venue management module with drafting, and administrative workflows * feat(client):Fix type errors * chore: update workspace configurations and development setup * refactor(server): update venue schema with nested structures and fields * feat(server): setup skeleton for venue availability module * refactor(client): update venue types, form mappers, and add venue steps to support nested schema * feat(client): modernize venue details page and card layout in explore page * feat(client): run types and formatter * feat(client): fix type errors * feat(client): restructure pages folder casing and booking layouts * refactor(client): migrate relative imports to @ path aliases * feat(client): register missing user bookings routes in router * feat(client): implement booking system with Razorpay webhooks, email notifications, and availability management * chore(server): update package dependencies, environment configurations, and routing initialization * feat(server): implement venue availability computation and time slot overlap validation * feat(server): implement slot locking mechanism and booking management module * feat(server): implement Razorpay webhook handlers and signature verification * feat(server): setup transactional email templates, queuing database, and background processing workers * refactor(server): extract HTML templates from EmailService to a dedicated EmailTemplateFactory * feat(server): implement Swagger API documentation and modularize route definitions across the application * feat(server): implement strict layered architecture, refactor routers, and add complex workflows for bookings/owners * feat(client): restructure authentication, venue details, and booking flow pages * feat(admin): implement modal system, route guards, and owner/superadmin dashboards * feat(admin): implement reusable detail panel components and admin dashboard pages for users, venues, bookings, and team management * feat: add husky pre-push hook to perform targeted type-checking and linting * feat(admin): add detailed admin panels for entities and implement workspace-aware pre-push validation hooks * feat: add Husky pre-push hook for incremental type checking and linting * fix: use ESM-compatible __dirname in vite.config, fix pre-push sed pattern * chore: add lint cmd to package.json - Github actions error @ .github\workflows\frontend.yml * fix(client): Razorpay payment types * fix(client): align page directory casing with router.tsx imports router.tsx imported ./pages/Explore, ./pages/Booking, and listVenue/{myVenue,addVenue}, but the committed directories were lowercase explore/booking and listVenue/{MyVenue,Addvenue}. Windows and macOS filesystems are case-insensitive so this resolved fine locally, but GitHub Actions' Linux runners are case-sensitive, failing the tsc build with TS2307 for all 8 paths. Renames pages directories to match router.tsx's casing exactly. * feat: add slot generator type definitions * feat(client): implement slot generation logic and preview panel component for venue creation * feat(server/admin): add env validation, RBAC seed check, admin booking filters, and dashboard role redirect * feat(server): add reviews, wishlist, and moderation modules with RBAC permissions * feat(server): improve booking system with duplicate prevention and owner review management * feat(server): enhance venue system with featured venues, geospatial pins, and ratings * feat(server): improve auth rate limiting and email worker reliability * feat(admin): add user ban system, moderation panel, and featured venues management * feat(admin): add owner reviews page and design system refresh * feat(client): implement wishlist, review submission, and major UI overhaul * feat(client): update types and services for coordinates, ratings, and featured venues * feat: implement venue interaction features including geolocation, wishlist sync, reviews, and authentication layout * fix: slot blocking mechanism and venue detail page * WIP: Backup commit * Refactor: Constants and fixes * Fix: Dynamic imports and fixes * feat: add venue moderation, deadline system, auth refactor, and contract snapshot types * feat: add venue moderation system with admin review workflow * feat: add inactivity and temporary block overlays to owner calendar * feat: support inactive venue state with UI and navigation changes - Server: approveReview now sets status to Inactive; offline booking guard for inactive venues - Admin: TenantLayout allows inactive venues + purple banner; VenueSelectorPage shows inactive badge and allows dashboard access (navigates to bookings); OwnerBookingsPage disables offline booking button with tooltip; DangerZone removed obsolete closing period - Sidebar: My Venues nav item, venue switcher allows inactive venues, sub-route tracking for venue switching preserves current page - Store: activeVenueStatus and lastVenueSubRoute tracking * fix: add cursor-pointer to button components and minor UI fixes * feat: make booking ID clickable in owner bookings table to open detail panel * feat: add review action dialogs and moderation store for admin review workflow * feat: add venue settings page with edit/view mode, Cloudinary upload, and danger zone * feat: add idempotency middleware with MongoDB-backed key store for safe retries * fix: rename lint-staged.config.js to .mjs for ESM compatibility * fix: pre-push hook whitespace bug and remove redundant tsc --noEmit * fix: add test steps to CI workflows and fix hooks - ci.yml: re-enable pnpm test after build - backend.yml: add test step after build - frontend.yml: add typecheck and test steps for both apps - .gitignore: add coverage/ to prevent committing test artifacts - lint-staged: rename config to .mjs for ESM compatibility - pre-push: fix file path whitespace bug, remove redundant tsc * fix: add test steps to CI workflows and fix hooks * feat: implement venue status workflow engine, transaction utility, and standardized linting configuration * fix: stabilize flaky webhook idempotency test and fix event override helper * feat: add Docker setup, venue/booking workflow engine, swagger doc alignment, and code cleanup - Add docker-compose.yml, Dockerfile, and .dockerignore for server containerization - Implement venue status workflow engine with transaction utility - Add idempotency middleware with MongoDB-backed key store - Fix swagger path mismatches, add missing query param docs, align request bodies - Add admin settings page, venue moderation, and owner review management - Apply consistent formatting across admin and client codebase * feat(client): add comprehensive vitest test suite with 125 tests - Exclude test files from production build tsconfig * feat(admin): add comprehensive vitest test suite with 86 tests * fix(admin): exclude src/tests from tsc build to fix pre-push * docs: add project documentation (setup, security, architecture, api, modules) * Add logos/favicons, fix reports analytics validation, uncomment zrok header, update email templates with logo * feat: implement owner repository tests and add environment configuration constants * feat: add PaymentStatus enum, schema field, and updated partial index * feat(client): add paymentStatus display to booking cards and details * Feat: Add in_progress status, booking status worker, admin table scroll * fix: type errors & add uiStatus enum * fix(idempotency): await create() before response to prevent race condition --------- Co-authored-by: MuneebMoosa --- .github/workflows/backend.yml | 37 + .github/workflows/ci.yml | 57 + .github/workflows/enforce-pr-source.yml | 67 + .github/workflows/frontend.yml | 78 + .gitignore | 52 + .husky/pre-commit | 1 + .husky/pre-push | 96 + BMV full logo nontransparent.png | Bin 0 -> 732315 bytes BMV full logo.png | Bin 0 -> 150492 bytes README.md | 12 + SECURITY.md | 56 + SETUP.md | 177 + admin/.gitignore | 25 + admin/README.md | 81 + admin/components.json | 25 + admin/eslint.config.js | 44 + admin/index.html | 16 + admin/package.json | 65 + admin/pnpm-lock.yaml | 1788 +++ admin/public/apple-touch-icon.png | Bin 0 -> 18372 bytes admin/public/favicon-96x96.png | Bin 0 -> 6549 bytes admin/public/favicon.ico | Bin 0 -> 15086 bytes admin/public/favicon.svg | 1 + admin/public/icons.svg | 24 + admin/public/site.webmanifest | 21 + admin/public/web-app-manifest-192x192.png | Bin 0 -> 20780 bytes admin/public/web-app-manifest-512x512.png | Bin 0 -> 105944 bytes admin/src/App.css | 184 + admin/src/App.tsx | 24 + admin/src/assets/bmv-logo.png | Bin 0 -> 150492 bytes admin/src/assets/hero.png | Bin 0 -> 13057 bytes admin/src/assets/react.svg | 1 + admin/src/assets/vite.svg | 1 + .../bookings/OfflineBookingDialog.tsx | 124 + .../components/bookings/useBookingColumns.tsx | 183 + .../bookings/useOwnerBookingColumns.tsx | 167 + .../components/calendar/BlockDateDialog.tsx | 90 + .../components/calendar/BlockedDatesTable.tsx | 91 + .../components/calendar/CalendarLegend.tsx | 45 + .../src/components/calendar/VenueCalendar.tsx | 106 + admin/src/components/common/CustomTooltip.tsx | 19 + admin/src/components/common/Footer.tsx | 1 + admin/src/components/common/MetricCard.tsx | 34 + admin/src/components/common/ModalRoot.tsx | 68 + admin/src/components/common/Navbar.tsx | 1 + admin/src/components/common/StarRating.tsx | 16 + .../common/panels/BookingDetailPanel.tsx | 302 + .../common/panels/FeaturedVenuesPanel.tsx | 168 + .../common/panels/OwnerDetailPanel.tsx | 178 + .../common/panels/UserDetailPanel.tsx | 137 + .../common/panels/VenueDetailPanel.tsx | 641 ++ admin/src/components/guards/AuthGuard.tsx | 62 + admin/src/components/guards/OwnerGuard.tsx | 23 + admin/src/components/guards/RoleGuard.tsx | 28 + admin/src/components/layout/MainLayout.tsx | 17 + admin/src/components/layout/Sidebar.tsx | 291 + admin/src/components/layout/TenantLayout.tsx | 139 + .../moderation/BannedUsersTable.tsx | 128 + .../moderation/FlaggedReviewsTable.tsx | 185 + .../moderation/HideRequestsTable.tsx | 188 + .../moderation/ReviewActionDialog.tsx | 133 + .../moderation/SuspendedVenuesTable.tsx | 123 + .../components/reports/MetricCardsGrid.tsx | 52 + .../reports/MonthlyBreakdownTable.tsx | 50 + admin/src/components/reports/RevenueChart.tsx | 85 + admin/src/components/reviews/ReplyDialog.tsx | 80 + admin/src/components/reviews/ReportDialog.tsx | 144 + .../reviews/ReviewActionDialogs.tsx | 183 + .../components/reviews/ReviewsTabContent.tsx | 158 + .../components/reviews/useReviewColumns.tsx | 138 + admin/src/components/settings/DangerZone.tsx | 376 + .../components/settings/VenueSettingsEdit.tsx | 1456 +++ .../components/settings/VenueSettingsView.tsx | 632 ++ admin/src/components/team/AddAdminDialog.tsx | 69 + admin/src/components/team/AdminColumns.tsx | 59 + admin/src/components/ui/alert.tsx | 66 + admin/src/components/ui/badge.tsx | 48 + admin/src/components/ui/button.tsx | 64 + admin/src/components/ui/card.tsx | 92 + admin/src/components/ui/data-table.tsx | 120 + admin/src/components/ui/dialog.tsx | 156 + admin/src/components/ui/dropdown-menu.tsx | 257 + admin/src/components/ui/input.tsx | 21 + admin/src/components/ui/label.tsx | 22 + admin/src/components/ui/select.tsx | 190 + admin/src/components/ui/tabs.tsx | 89 + admin/src/components/ui/tooltip.tsx | 55 + admin/src/components/users/BanUserDialog.tsx | 287 + .../components/users/ChangePasswordForm.tsx | 106 + admin/src/components/users/useUserColumns.tsx | 130 + .../venues/ExtendDeadlineDialog.tsx | 98 + .../components/venues/FeatureVenueDialog.tsx | 70 + .../components/venues/RejectVenueDialog.tsx | 117 + .../venues/RejectionHistoryDialog.tsx | 66 + .../components/venues/SuspendVenueDialog.tsx | 71 + .../src/components/venues/useVenueColumns.tsx | 382 + admin/src/config/axios.ts | 158 + admin/src/config/queryClient.ts | 20 + admin/src/config/queryKeys.ts | 18 + admin/src/constants/bookings.ts | 16 + admin/src/constants/index.tsx | 50 + admin/src/constants/moderation.ts | 46 + admin/src/constants/pagination.ts | 2 + admin/src/constants/queryConfig.ts | 1 + admin/src/constants/roles.ts | 5 + admin/src/constants/routes.ts | 7 + admin/src/constants/statusVariants.ts | 34 + admin/src/constants/validation.ts | 3 + admin/src/constants/venueConstants.ts | 7 + admin/src/constants/venueStatus.ts | 16 + admin/src/context/AuthContext.tsx | 18 + admin/src/context/AuthProvider.tsx | 24 + admin/src/context/useAuth.ts | 10 + admin/src/hooks/useApi.ts | 54 + admin/src/hooks/useImageUpload.ts | 47 + admin/src/hooks/useModal.ts | 9 + admin/src/hooks/useModeration.ts | 95 + admin/src/hooks/useToast.ts | 5 + admin/src/index.css | 86 + admin/src/lib/utils.ts | 6 + admin/src/main.tsx | 10 + admin/src/pages/admin/BookingsPage.tsx | 48 + admin/src/pages/admin/ModerationPage.tsx | 244 + admin/src/pages/admin/OwnersPage.tsx | 85 + admin/src/pages/admin/UsersPage.tsx | 147 + admin/src/pages/admin/VenuesPage.tsx | 286 + admin/src/pages/dashboard/index.tsx | 27 + admin/src/pages/home/index.tsx | 12 + admin/src/pages/login/index.tsx | 216 + admin/src/pages/owner/CalendarPage.tsx | 254 + admin/src/pages/owner/OwnerBookingsPage.tsx | 153 + admin/src/pages/owner/ReportsPage.tsx | 165 + admin/src/pages/owner/ReviewsPage.tsx | 135 + admin/src/pages/owner/VenueSelectorPage.tsx | 390 + admin/src/pages/owner/VenueSettingsPage.tsx | 74 + .../src/pages/superadmin/ActivityLogsPage.tsx | 146 + admin/src/pages/superadmin/TeamPage.tsx | 228 + admin/src/pages/unauthorized/index.tsx | 26 + admin/src/router.tsx | 83 + admin/src/services/adminService.ts | 165 + admin/src/services/api/useAdminReviews.ts | 46 + admin/src/services/api/useAdminUsers.ts | 91 + admin/src/services/api/useAdminVenues.ts | 119 + admin/src/services/api/useBookings.ts | 88 + admin/src/services/api/useReviews.ts | 63 + admin/src/services/api/useSuperAdmins.ts | 50 + admin/src/services/api/useVenueSettings.ts | 150 + admin/src/services/api/useVenues.ts | 52 + admin/src/store/useAppStore.ts | 28 + admin/src/store/useAuthStore.ts | 33 + admin/src/store/useModalStore.ts | 39 + admin/src/store/useModerationStore.ts | 17 + .../components/guards/AuthGuard.test.tsx | 124 + .../components/guards/OwnerGuard.test.tsx | 115 + .../components/guards/RoleGuard.test.tsx | 97 + admin/src/tests/config/axios.test.ts | 182 + admin/src/tests/config/queryClient.test.ts | 24 + admin/src/tests/config/queryKeys.test.ts | 79 + admin/src/tests/hooks/useApi.test.tsx | 131 + admin/src/tests/hooks/useModal.test.ts | 49 + admin/src/tests/pages/login/index.test.tsx | 116 + admin/src/tests/services/adminService.test.ts | 340 + admin/src/tests/setup.ts | 7 + admin/src/tests/store/useAppStore.test.ts | 53 + admin/src/tests/store/useAuthStore.test.ts | 58 + admin/src/tests/store/useModalStore.test.ts | 48 + .../src/tests/unit/utils/bookingUtils.test.ts | 10 + admin/src/tests/unit/utils/dateUtils.test.ts | 14 + admin/src/types/admin.types.ts | 13 + admin/src/types/api.ts | 74 + admin/src/types/index.ts | 4 + admin/src/types/models.ts | 183 + admin/src/types/moderation.types.ts | 41 + admin/src/types/reports.types.ts | 10 + admin/src/types/ui.ts | 44 + admin/src/utils/bookingUtils.ts | 7 + admin/src/utils/dateUtils.ts | 6 + admin/src/utils/redirect.ts | 17 + admin/src/utils/toast.ts | 69 + admin/tsconfig.app.json | 31 + admin/tsconfig.app.tsbuildinfo | 1 + admin/tsconfig.json | 15 + admin/tsconfig.node.json | 24 + admin/vite.config.js | 21 + admin/vite.config.ts | 22 + admin/vitest.config.ts | 22 + client/.gitignore | 24 + client/.prettierignore | 12 + client/.prettierrc | 10 + client/README.md | 79 + client/components.json | 25 + client/eslint.config.js | 52 + client/index.html | 40 + client/package.json | 70 + client/pnpm-lock.yaml | 1788 +++ client/public/apple-touch-icon.png | Bin 0 -> 18372 bytes client/public/favicon-96x96.png | Bin 0 -> 6549 bytes client/public/favicon.ico | Bin 0 -> 15086 bytes client/public/favicon.svg | 1 + client/public/site.webmanifest | 21 + client/public/web-app-manifest-192x192.png | Bin 0 -> 20780 bytes client/public/web-app-manifest-512x512.png | Bin 0 -> 105944 bytes client/src/App.tsx | 32 + client/src/assets/bmv-logo.png | Bin 0 -> 150492 bytes client/src/assets/hero.png | Bin 0 -> 2833676 bytes client/src/assets/map.jpg | Bin 0 -> 123552 bytes client/src/components/CompactVenueCard.tsx | 148 + client/src/components/PlaceAutocomplete.tsx | 218 + client/src/components/VenueCard.tsx | 211 + client/src/components/auth/AuthInput.tsx | 51 + .../src/components/auth/AuthSubmitButton.tsx | 54 + client/src/components/auth/PasswordInput.tsx | 178 + .../components/booking/BookingSummaryCard.tsx | 132 + .../src/components/bookings/BookingCard.tsx | 101 + .../components/bookings/NextBookingBanner.tsx | 56 + .../src/components/common/AdminRedirect.tsx | 26 + client/src/components/common/AuthGuard.tsx | 55 + .../components/common/AvatarCropEditor.tsx | 96 + .../components/common/CancelBookingModal.tsx | 131 + client/src/components/common/Footer.tsx | 210 + client/src/components/common/GuestGuard.tsx | 28 + .../src/components/common/ImageLightbox.tsx | 85 + client/src/components/common/ImageUpload.tsx | 170 + client/src/components/common/ListSidebar.tsx | 76 + client/src/components/common/Navbar.tsx | 264 + .../src/components/common/ProfileDropdown.tsx | 166 + client/src/components/common/ReviewModal.tsx | 115 + client/src/components/common/Spinner.tsx | 13 + client/src/components/common/ThemeToggle.tsx | 48 + .../src/components/common/ToastListener.tsx | 27 + .../components/common/VenueCardSkeleton.tsx | 34 + .../src/components/explore/ExploreFilters.tsx | 269 + .../explore/RejectionHistoryAccordion.tsx | 50 + .../explore/RejectionHistoryModal.tsx | 54 + client/src/components/explore/VenueGrid.tsx | 103 + client/src/components/ui/button.tsx | 65 + client/src/components/ui/calendar.tsx | 184 + client/src/components/ui/checkbox.tsx | 27 + client/src/components/ui/dialog.tsx | 140 + client/src/components/ui/input.tsx | 19 + client/src/components/ui/radio-group.tsx | 42 + client/src/components/ui/select.tsx | 183 + client/src/components/ui/separator.tsx | 26 + client/src/components/ui/skeleton.tsx | 7 + client/src/components/ui/slider.tsx | 52 + .../src/components/venue/VenueAmenities.tsx | 31 + client/src/components/venue/VenueGallery.tsx | 156 + client/src/components/venue/VenueInfo.tsx | 287 + client/src/config/axios.ts | 151 + client/src/config/queryClient.ts | 19 + client/src/constants/bookingConstants.ts | 18 + client/src/constants/common.ts | 9 + client/src/constants/filterConstants.ts | 22 + client/src/constants/index.tsx | 81 + client/src/constants/map.ts | 4 + client/src/constants/statusVariants.ts | 9 + client/src/constants/uiClasses.ts | 3 + client/src/constants/upload.ts | 3 + client/src/constants/venueConstants.ts | 53 + client/src/context/AuthContext.tsx | 171 + client/src/context/ThemeContext.tsx | 71 + client/src/hooks/useApi.ts | 67 + client/src/hooks/useAuth.ts | 10 + client/src/hooks/useAvatarUpload.ts | 55 + client/src/hooks/useBookingById.ts | 10 + client/src/hooks/useDebounce.ts | 17 + client/src/hooks/useExploreVenues.ts | 19 + client/src/hooks/useGeolocation.ts | 65 + client/src/hooks/useImageUpload.ts | 62 + client/src/hooks/useLockTimer.ts | 50 + client/src/hooks/useMyBookings.ts | 9 + client/src/hooks/useRazorpayPayment.ts | 161 + client/src/hooks/useSessions.ts | 9 + client/src/hooks/useTheme.ts | 10 + client/src/hooks/useToast.ts | 5 + client/src/hooks/useVenueBooking.ts | 221 + client/src/hooks/useVenuePins.ts | 64 + client/src/hooks/useVenueReviews.ts | 43 + client/src/hooks/useWishlist.ts | 117 + client/src/index.css | 275 + client/src/layout/AuthLayout.tsx | 99 + client/src/layout/MainLayout.tsx | 18 + client/src/lib/utils.ts | 6 + client/src/main.tsx | 10 + .../src/pages/Auth/forgotPassword/index.tsx | 94 + .../pages/Auth/forgotPassword/validation.ts | 5 + client/src/pages/Auth/login/index.tsx | 122 + client/src/pages/Auth/login/validation.ts | 7 + client/src/pages/Auth/register/index.tsx | 120 + client/src/pages/Auth/register/validation.ts | 17 + client/src/pages/Auth/resetPassword/index.tsx | 141 + .../pages/Auth/resetPassword/validation.ts | 15 + .../bookingDetails/components/BookingInfo.tsx | 67 + .../components/BookingSidebarDetails.tsx | 87 + .../pages/Booking/bookingDetails/index.tsx | 206 + .../src/pages/Booking/confirmation/index.tsx | 149 + client/src/pages/Booking/myBookings/index.tsx | 219 + client/src/pages/Booking/summary/index.tsx | 312 + .../src/pages/Explore/components/VenueMap.tsx | 219 + client/src/pages/Explore/index.tsx | 191 + .../components/BookingSidebar.tsx | 279 + .../venueDetails/components/ReviewList.tsx | 146 + .../src/pages/Explore/venueDetails/index.tsx | 326 + client/src/pages/NotFound/index.tsx | 45 + client/src/pages/Profile/DevicesCard.tsx | 152 + client/src/pages/Profile/IdentityCard.tsx | 214 + client/src/pages/Profile/SecurityCard.tsx | 128 + client/src/pages/Profile/index.tsx | 42 + client/src/pages/Wishlist/index.tsx | 205 + .../pages/home/components/FeaturedVenues.tsx | 69 + .../src/pages/home/components/HeroSection.tsx | 56 + client/src/pages/home/featuredVenues.ts | 46 + client/src/pages/home/index.tsx | 237 + .../src/pages/listVenue/ListVenueLayout.tsx | 18 + .../addVenue/components/AmenitiesSection.tsx | 25 + .../addVenue/components/BasicInfoStep.tsx | 184 + .../addVenue/components/BasicValidation.ts | 34 + .../components/BookingTypeSection.tsx | 44 + .../addVenue/components/FinishStep.tsx | 298 + .../addVenue/components/FinishValidation.ts | 37 + .../components/FixedBookingSection.tsx | 111 + .../components/FlexibleBookingSection.tsx | 291 + .../addVenue/components/SlotPreviewPanel.tsx | 175 + .../addVenue/components/middleStep.tsx | 111 + .../addVenue/components/middleValidation.ts | 251 + client/src/pages/listVenue/addVenue/index.tsx | 452 + .../myVenue/components/VenueCard.tsx | 236 + .../myVenue/components/VenuePreviewModal.tsx | 646 ++ client/src/pages/listVenue/myVenue/index.tsx | 124 + client/src/router.tsx | 68 + client/src/services/authService.ts | 29 + client/src/services/bookingService.ts | 50 + client/src/services/reviewService.ts | 95 + client/src/services/userService.ts | 38 + client/src/services/venueService.ts | 54 + client/src/services/wishlistService.ts | 50 + client/src/tests/config/axios.test.ts | 87 + client/src/tests/config/queryClient.test.ts | 16 + client/src/tests/context/AuthContext.test.tsx | 113 + .../src/tests/context/ThemeContext.test.tsx | 63 + client/src/tests/hooks/useApi.test.tsx | 156 + client/src/tests/hooks/useAuth.test.tsx | 18 + client/src/tests/hooks/useDebounce.test.ts | 77 + client/src/tests/hooks/useLockTimer.test.ts | 90 + .../tests/pages/Auth/login/validation.test.ts | 33 + .../pages/Auth/register/validation.test.ts | 120 + client/src/tests/services/authService.test.ts | 72 + .../src/tests/services/bookingService.test.ts | 122 + .../src/tests/services/venueService.test.ts | 138 + client/src/tests/setup.ts | 7 + .../tests/unit/utils/slotGenerator.test.ts | 112 + client/src/tests/unit/utils/timeUtils.test.ts | 43 + .../tests/unit/utils/venueFormMapper.test.ts | 52 + client/src/tests/utils/redirect.test.ts | 40 + client/src/tests/utils/timeUtils.test.ts | 73 + client/src/tests/utils/toast.test.ts | 83 + client/src/tests/utils/venueDraft.test.ts | 63 + .../src/tests/utils/venueFormMapper.test.ts | 165 + client/src/types/auth.types.ts | 19 + client/src/types/booking.types.ts | 129 + client/src/types/geo.types.ts | 21 + client/src/types/review.types.ts | 39 + client/src/types/user.types.ts | 36 + client/src/types/venue.types.ts | 262 + client/src/types/wishlist.types.ts | 30 + client/src/utils/bookingUtils.ts | 7 + client/src/utils/cropImage.ts | 61 + client/src/utils/parseUserAgent.ts | 27 + client/src/utils/profileGreeting.ts | 11 + client/src/utils/redirect.ts | 14 + client/src/utils/slotGenerator.types.ts | 47 + client/src/utils/slotGenerator.utils.ts | 176 + client/src/utils/timeUtils.ts | 25 + client/src/utils/toast.ts | 69 + client/src/utils/venueDraft.ts | 45 + client/src/utils/venueFormMapper.ts | 154 + client/tsconfig.app.json | 38 + client/tsconfig.json | 7 + client/tsconfig.node.json | 24 + client/vite.config.ts | 24 + client/vitest.config.ts | 26 + docker-compose.yml | 22 + docs/api-overview.md | 137 + docs/architecture.md | 145 + docs/modules.md | 155 + favicon/apple-touch-icon.png | Bin 0 -> 18372 bytes favicon/favicon-96x96.png | Bin 0 -> 6549 bytes favicon/favicon.ico | Bin 0 -> 15086 bytes favicon/favicon.svg | 1 + favicon/site.webmanifest | 21 + favicon/web-app-manifest-192x192.png | Bin 0 -> 20780 bytes favicon/web-app-manifest-512x512.png | Bin 0 -> 105944 bytes lint-staged.config.mjs | 32 + logo small.png | Bin 0 -> 321873 bytes package.json | 27 + pnpm-lock.yaml | 9860 +++++++++++++++++ pnpm-workspace.yaml | 14 + server/.dockerignore | 16 + server/.env.example | 40 + server/.prettierignore | 13 + server/.prettierrc | 10 + server/Dockerfile | 56 + server/eslint.config.mjs | 98 + server/package.json | 71 + server/pnpm-lock.yaml | 4082 +++++++ server/pnpm-workspace.yaml | 5 + server/public/images/bmv-logo.png | Bin 0 -> 732315 bytes server/src/app.ts | 72 + server/src/configs/cors.config.ts | 32 + server/src/configs/database.config.ts | 55 + server/src/configs/envValidation.config.ts | 37 + server/src/constants/auth.constants.ts | 26 + server/src/constants/booking.constants.ts | 8 + server/src/constants/common.ts | 0 server/src/constants/email.constants.ts | 36 + server/src/constants/env.ts | 79 + server/src/constants/payment.constants.ts | 6 + server/src/constants/permissions.ts | 101 + server/src/constants/venue.constants.ts | 91 + server/src/middlewares/auth.middleware.ts | 242 + .../src/middlewares/idempotency.middleware.ts | 43 + .../src/middlewares/ownerTenant.middleware.ts | 31 + .../src/middlewares/pagination.middleware.ts | 51 + server/src/middlewares/rbac.middleware.ts | 181 + .../src/middlewares/validation.middleware.ts | 107 + server/src/models/email-task.model.ts | 59 + server/src/models/featured-venue.model.ts | 26 + server/src/models/idempotency-key.model.ts | 23 + server/src/models/permission.model.ts | 32 + server/src/models/role-permission.model.ts | 28 + server/src/models/role.model.ts | 37 + server/src/models/user-role.model.ts | 26 + server/src/modules/auth/auth.controller.ts | 182 + server/src/modules/auth/auth.repository.ts | 375 + server/src/modules/auth/auth.router.ts | 317 + server/src/modules/auth/auth.service.ts | 560 + server/src/modules/auth/auth.validator.ts | 67 + .../models/password-reset-request.model.ts | 30 + .../auth/models/password-reset-token.model.ts | 47 + .../auth/models/refresh-token.model.ts | 43 + .../src/modules/auth/models/session.model.ts | 38 + .../availability/availability.controller.ts | 76 + .../availability/availability.repository.ts | 16 + .../availability/availability.router.ts | 161 + .../availability/availability.validator.ts | 15 + .../availability/availability.workflow.ts | 170 + .../src/modules/booking/booking.controller.ts | 328 + .../src/modules/booking/booking.repository.ts | 617 ++ server/src/modules/booking/booking.router.ts | 307 + server/src/modules/booking/booking.service.ts | 405 + server/src/modules/booking/booking.types.ts | 117 + .../src/modules/booking/booking.validator.ts | 280 + .../src/modules/booking/booking.workflow.ts | 409 + server/src/modules/booking/lock.types.ts | 57 + .../modules/booking/models/booking.model.ts | 63 + .../booking/models/failedBooking.model.ts | 25 + .../src/modules/booking/models/lock.model.ts | 27 + .../booking/models/processedWebhook.model.ts | 29 + .../modules/booking/models/slotMutex.model.ts | 21 + server/src/modules/geo/geo.router.ts | 88 + server/src/modules/geo/geo.service.ts | 182 + server/src/modules/geo/geo.types.ts | 27 + .../moderation/bannedUser.controller.ts | 71 + .../modules/moderation/bannedUser.model.ts | 88 + .../moderation/bannedUser.repository.ts | 156 + .../modules/moderation/bannedUser.router.ts | 137 + .../modules/moderation/bannedUser.service.ts | 192 + .../modules/moderation/bannedUser.types.ts | 9 + .../moderation/bannedUser.validator.ts | 15 + .../moderation/moderation.repository.ts | 61 + .../modules/moderation/moderation.router.ts | 93 + .../modules/moderation/moderation.service.ts | 68 + .../modules/moderation/moderation.types.ts | 100 + .../moderation/moderationActivity.model.ts | 58 + .../moderation/moderationActivity.service.ts | 53 + server/src/modules/owner/owner.controller.ts | 291 + server/src/modules/owner/owner.repository.ts | 253 + server/src/modules/owner/owner.router.ts | 701 ++ server/src/modules/owner/owner.service.ts | 254 + server/src/modules/owner/owner.validator.ts | 69 + server/src/modules/owner/owner.workflow.ts | 39 + server/src/modules/rbac/rbac.controller.ts | 24 + server/src/modules/rbac/rbac.router.ts | 87 + server/src/modules/rbac/rbac.service.ts | 14 + .../src/modules/review/review.controller.ts | 197 + server/src/modules/review/review.model.ts | 117 + server/src/modules/review/review.ownership.ts | 41 + .../src/modules/review/review.repository.ts | 341 + server/src/modules/review/review.router.ts | 207 + server/src/modules/review/review.service.ts | 406 + server/src/modules/review/review.types.ts | 47 + server/src/modules/role/role.controller.ts | 41 + server/src/modules/role/role.repository.ts | 85 + server/src/modules/role/role.router.ts | 104 + server/src/modules/role/role.service.ts | 44 + server/src/modules/role/role.validator.ts | 14 + server/src/modules/swagger/swagger.config.ts | 92 + server/src/modules/swagger/swagger.router.ts | 81 + server/src/modules/user/user.controller.ts | 162 + server/src/modules/user/user.models.ts | 39 + server/src/modules/user/user.repository.ts | 226 + server/src/modules/user/user.router.ts | 258 + server/src/modules/user/user.service.ts | 194 + server/src/modules/user/user.types.ts | 3 + server/src/modules/user/user.validator.ts | 10 + server/src/modules/user/user.workflow.ts | 26 + server/src/modules/venue/venue.controller.ts | 462 + server/src/modules/venue/venue.model.ts | 245 + server/src/modules/venue/venue.ownership.ts | 29 + server/src/modules/venue/venue.repository.ts | 459 + server/src/modules/venue/venue.router.ts | 922 ++ server/src/modules/venue/venue.service.ts | 931 ++ server/src/modules/venue/venue.types.ts | 213 + server/src/modules/venue/venue.validator.ts | 505 + server/src/modules/venue/venue.workflow.ts | 218 + server/src/modules/venue/venueDraft.model.ts | 35 + .../src/modules/webhook/webhook.controller.ts | 73 + server/src/modules/webhook/webhook.router.ts | 67 + server/src/modules/webhook/webhook.types.ts | 19 + .../modules/wishlist/wishlist.controller.ts | 93 + server/src/modules/wishlist/wishlist.model.ts | 43 + .../modules/wishlist/wishlist.repository.ts | 82 + .../src/modules/wishlist/wishlist.router.ts | 131 + .../src/modules/wishlist/wishlist.service.ts | 64 + server/src/modules/wishlist/wishlist.types.ts | 13 + .../modules/wishlist/wishlist.validator.ts | 5 + server/src/router.ts | 47 + server/src/server.ts | 37 + .../cache/permission-cache.service.ts | 103 + server/src/services/email.repository.ts | 22 + server/src/services/email.service.ts | 384 + server/src/services/emailTemplateFactory.ts | 640 ++ server/src/services/razorpay.service.ts | 237 + server/src/services/roles.service.ts | 253 + server/src/types/express.ts | 70 + server/src/types/pagination.types.ts | 45 + server/src/utils/cacheUtils.ts | 0 server/src/utils/cloudinarySign.ts | 43 + server/src/utils/dbUtils.ts | 27 + server/src/utils/errors.ts | 123 + server/src/utils/logger.ts | 12 + server/src/utils/mutex.ts | 34 + server/src/utils/paginationUtils.ts | 133 + server/src/utils/responseUtils.ts | 104 + server/src/utils/shutdownUtils.ts | 125 + server/src/utils/timeUtils.ts | 74 + server/src/utils/tokenUtils.ts | 181 + server/src/utils/winston/logger.ts | 126 + server/src/utils/winston/requestLogger.ts | 25 + server/src/workers/banExpiry.worker.ts | 45 + server/src/workers/bookingStatus.worker.ts | 75 + server/src/workers/email.worker.ts | 340 + .../src/workers/venueEditDeadline.worker.ts | 115 + server/tests/globalSetup.ts | 38 + server/tests/helpers/auth.helper.ts | 22 + server/tests/helpers/db.helper.ts | 29 + server/tests/helpers/webhook.helper.ts | 67 + .../middlewares/validation.middleware.test.ts | 68 + server/tests/integration/routes/auth.test.ts | 157 + .../tests/integration/routes/booking.test.ts | 130 + .../tests/integration/routes/health.test.ts | 21 + server/tests/integration/routes/rbac.test.ts | 37 + server/tests/integration/routes/user.test.ts | 44 + server/tests/integration/routes/venue.test.ts | 42 + .../tests/integration/routes/webhook.test.ts | 108 + server/tests/setup.ts | 64 + .../tests/unit/idempotency.middleware.test.ts | 98 + server/tests/unit/owner.repository.test.ts | 43 + server/tests/unit/responseUtils.test.ts | 92 + server/tests/unit/validators.test.ts | 76 + server/tsconfig.json | 27 + server/tsconfig.tsbuildinfo | 1 + server/vitest.config.ts | 17 + 573 files changed, 74088 insertions(+) create mode 100644 .github/workflows/backend.yml create mode 100644 .github/workflows/ci.yml create mode 100644 .github/workflows/enforce-pr-source.yml create mode 100644 .github/workflows/frontend.yml create mode 100644 .gitignore create mode 100644 .husky/pre-commit create mode 100644 .husky/pre-push create mode 100644 BMV full logo nontransparent.png create mode 100644 BMV full logo.png create mode 100644 SECURITY.md create mode 100644 SETUP.md create mode 100644 admin/.gitignore create mode 100644 admin/README.md create mode 100644 admin/components.json create mode 100644 admin/eslint.config.js create mode 100644 admin/index.html create mode 100644 admin/package.json create mode 100644 admin/pnpm-lock.yaml create mode 100644 admin/public/apple-touch-icon.png create mode 100644 admin/public/favicon-96x96.png create mode 100644 admin/public/favicon.ico create mode 100644 admin/public/favicon.svg create mode 100644 admin/public/icons.svg create mode 100644 admin/public/site.webmanifest create mode 100644 admin/public/web-app-manifest-192x192.png create mode 100644 admin/public/web-app-manifest-512x512.png create mode 100644 admin/src/App.css create mode 100644 admin/src/App.tsx create mode 100644 admin/src/assets/bmv-logo.png create mode 100644 admin/src/assets/hero.png create mode 100644 admin/src/assets/react.svg create mode 100644 admin/src/assets/vite.svg create mode 100644 admin/src/components/bookings/OfflineBookingDialog.tsx create mode 100644 admin/src/components/bookings/useBookingColumns.tsx create mode 100644 admin/src/components/bookings/useOwnerBookingColumns.tsx create mode 100644 admin/src/components/calendar/BlockDateDialog.tsx create mode 100644 admin/src/components/calendar/BlockedDatesTable.tsx create mode 100644 admin/src/components/calendar/CalendarLegend.tsx create mode 100644 admin/src/components/calendar/VenueCalendar.tsx create mode 100644 admin/src/components/common/CustomTooltip.tsx create mode 100644 admin/src/components/common/Footer.tsx create mode 100644 admin/src/components/common/MetricCard.tsx create mode 100644 admin/src/components/common/ModalRoot.tsx create mode 100644 admin/src/components/common/Navbar.tsx create mode 100644 admin/src/components/common/StarRating.tsx create mode 100644 admin/src/components/common/panels/BookingDetailPanel.tsx create mode 100644 admin/src/components/common/panels/FeaturedVenuesPanel.tsx create mode 100644 admin/src/components/common/panels/OwnerDetailPanel.tsx create mode 100644 admin/src/components/common/panels/UserDetailPanel.tsx create mode 100644 admin/src/components/common/panels/VenueDetailPanel.tsx create mode 100644 admin/src/components/guards/AuthGuard.tsx create mode 100644 admin/src/components/guards/OwnerGuard.tsx create mode 100644 admin/src/components/guards/RoleGuard.tsx create mode 100644 admin/src/components/layout/MainLayout.tsx create mode 100644 admin/src/components/layout/Sidebar.tsx create mode 100644 admin/src/components/layout/TenantLayout.tsx create mode 100644 admin/src/components/moderation/BannedUsersTable.tsx create mode 100644 admin/src/components/moderation/FlaggedReviewsTable.tsx create mode 100644 admin/src/components/moderation/HideRequestsTable.tsx create mode 100644 admin/src/components/moderation/ReviewActionDialog.tsx create mode 100644 admin/src/components/moderation/SuspendedVenuesTable.tsx create mode 100644 admin/src/components/reports/MetricCardsGrid.tsx create mode 100644 admin/src/components/reports/MonthlyBreakdownTable.tsx create mode 100644 admin/src/components/reports/RevenueChart.tsx create mode 100644 admin/src/components/reviews/ReplyDialog.tsx create mode 100644 admin/src/components/reviews/ReportDialog.tsx create mode 100644 admin/src/components/reviews/ReviewActionDialogs.tsx create mode 100644 admin/src/components/reviews/ReviewsTabContent.tsx create mode 100644 admin/src/components/reviews/useReviewColumns.tsx create mode 100644 admin/src/components/settings/DangerZone.tsx create mode 100644 admin/src/components/settings/VenueSettingsEdit.tsx create mode 100644 admin/src/components/settings/VenueSettingsView.tsx create mode 100644 admin/src/components/team/AddAdminDialog.tsx create mode 100644 admin/src/components/team/AdminColumns.tsx create mode 100644 admin/src/components/ui/alert.tsx create mode 100644 admin/src/components/ui/badge.tsx create mode 100644 admin/src/components/ui/button.tsx create mode 100644 admin/src/components/ui/card.tsx create mode 100644 admin/src/components/ui/data-table.tsx create mode 100644 admin/src/components/ui/dialog.tsx create mode 100644 admin/src/components/ui/dropdown-menu.tsx create mode 100644 admin/src/components/ui/input.tsx create mode 100644 admin/src/components/ui/label.tsx create mode 100644 admin/src/components/ui/select.tsx create mode 100644 admin/src/components/ui/tabs.tsx create mode 100644 admin/src/components/ui/tooltip.tsx create mode 100644 admin/src/components/users/BanUserDialog.tsx create mode 100644 admin/src/components/users/ChangePasswordForm.tsx create mode 100644 admin/src/components/users/useUserColumns.tsx create mode 100644 admin/src/components/venues/ExtendDeadlineDialog.tsx create mode 100644 admin/src/components/venues/FeatureVenueDialog.tsx create mode 100644 admin/src/components/venues/RejectVenueDialog.tsx create mode 100644 admin/src/components/venues/RejectionHistoryDialog.tsx create mode 100644 admin/src/components/venues/SuspendVenueDialog.tsx create mode 100644 admin/src/components/venues/useVenueColumns.tsx create mode 100644 admin/src/config/axios.ts create mode 100644 admin/src/config/queryClient.ts create mode 100644 admin/src/config/queryKeys.ts create mode 100644 admin/src/constants/bookings.ts create mode 100644 admin/src/constants/index.tsx create mode 100644 admin/src/constants/moderation.ts create mode 100644 admin/src/constants/pagination.ts create mode 100644 admin/src/constants/queryConfig.ts create mode 100644 admin/src/constants/roles.ts create mode 100644 admin/src/constants/routes.ts create mode 100644 admin/src/constants/statusVariants.ts create mode 100644 admin/src/constants/validation.ts create mode 100644 admin/src/constants/venueConstants.ts create mode 100644 admin/src/constants/venueStatus.ts create mode 100644 admin/src/context/AuthContext.tsx create mode 100644 admin/src/context/AuthProvider.tsx create mode 100644 admin/src/context/useAuth.ts create mode 100644 admin/src/hooks/useApi.ts create mode 100644 admin/src/hooks/useImageUpload.ts create mode 100644 admin/src/hooks/useModal.ts create mode 100644 admin/src/hooks/useModeration.ts create mode 100644 admin/src/hooks/useToast.ts create mode 100644 admin/src/index.css create mode 100644 admin/src/lib/utils.ts create mode 100644 admin/src/main.tsx create mode 100644 admin/src/pages/admin/BookingsPage.tsx create mode 100644 admin/src/pages/admin/ModerationPage.tsx create mode 100644 admin/src/pages/admin/OwnersPage.tsx create mode 100644 admin/src/pages/admin/UsersPage.tsx create mode 100644 admin/src/pages/admin/VenuesPage.tsx create mode 100644 admin/src/pages/dashboard/index.tsx create mode 100644 admin/src/pages/home/index.tsx create mode 100644 admin/src/pages/login/index.tsx create mode 100644 admin/src/pages/owner/CalendarPage.tsx create mode 100644 admin/src/pages/owner/OwnerBookingsPage.tsx create mode 100644 admin/src/pages/owner/ReportsPage.tsx create mode 100644 admin/src/pages/owner/ReviewsPage.tsx create mode 100644 admin/src/pages/owner/VenueSelectorPage.tsx create mode 100644 admin/src/pages/owner/VenueSettingsPage.tsx create mode 100644 admin/src/pages/superadmin/ActivityLogsPage.tsx create mode 100644 admin/src/pages/superadmin/TeamPage.tsx create mode 100644 admin/src/pages/unauthorized/index.tsx create mode 100644 admin/src/router.tsx create mode 100644 admin/src/services/adminService.ts create mode 100644 admin/src/services/api/useAdminReviews.ts create mode 100644 admin/src/services/api/useAdminUsers.ts create mode 100644 admin/src/services/api/useAdminVenues.ts create mode 100644 admin/src/services/api/useBookings.ts create mode 100644 admin/src/services/api/useReviews.ts create mode 100644 admin/src/services/api/useSuperAdmins.ts create mode 100644 admin/src/services/api/useVenueSettings.ts create mode 100644 admin/src/services/api/useVenues.ts create mode 100644 admin/src/store/useAppStore.ts create mode 100644 admin/src/store/useAuthStore.ts create mode 100644 admin/src/store/useModalStore.ts create mode 100644 admin/src/store/useModerationStore.ts create mode 100644 admin/src/tests/components/guards/AuthGuard.test.tsx create mode 100644 admin/src/tests/components/guards/OwnerGuard.test.tsx create mode 100644 admin/src/tests/components/guards/RoleGuard.test.tsx create mode 100644 admin/src/tests/config/axios.test.ts create mode 100644 admin/src/tests/config/queryClient.test.ts create mode 100644 admin/src/tests/config/queryKeys.test.ts create mode 100644 admin/src/tests/hooks/useApi.test.tsx create mode 100644 admin/src/tests/hooks/useModal.test.ts create mode 100644 admin/src/tests/pages/login/index.test.tsx create mode 100644 admin/src/tests/services/adminService.test.ts create mode 100644 admin/src/tests/setup.ts create mode 100644 admin/src/tests/store/useAppStore.test.ts create mode 100644 admin/src/tests/store/useAuthStore.test.ts create mode 100644 admin/src/tests/store/useModalStore.test.ts create mode 100644 admin/src/tests/unit/utils/bookingUtils.test.ts create mode 100644 admin/src/tests/unit/utils/dateUtils.test.ts create mode 100644 admin/src/types/admin.types.ts create mode 100644 admin/src/types/api.ts create mode 100644 admin/src/types/index.ts create mode 100644 admin/src/types/models.ts create mode 100644 admin/src/types/moderation.types.ts create mode 100644 admin/src/types/reports.types.ts create mode 100644 admin/src/types/ui.ts create mode 100644 admin/src/utils/bookingUtils.ts create mode 100644 admin/src/utils/dateUtils.ts create mode 100644 admin/src/utils/redirect.ts create mode 100644 admin/src/utils/toast.ts create mode 100644 admin/tsconfig.app.json create mode 100644 admin/tsconfig.app.tsbuildinfo create mode 100644 admin/tsconfig.json create mode 100644 admin/tsconfig.node.json create mode 100644 admin/vite.config.js create mode 100644 admin/vite.config.ts create mode 100644 admin/vitest.config.ts create mode 100644 client/.gitignore create mode 100644 client/.prettierignore create mode 100644 client/.prettierrc create mode 100644 client/README.md create mode 100644 client/components.json create mode 100644 client/eslint.config.js create mode 100644 client/index.html create mode 100644 client/package.json create mode 100644 client/pnpm-lock.yaml create mode 100644 client/public/apple-touch-icon.png create mode 100644 client/public/favicon-96x96.png create mode 100644 client/public/favicon.ico create mode 100644 client/public/favicon.svg create mode 100644 client/public/site.webmanifest create mode 100644 client/public/web-app-manifest-192x192.png create mode 100644 client/public/web-app-manifest-512x512.png create mode 100644 client/src/App.tsx create mode 100644 client/src/assets/bmv-logo.png create mode 100644 client/src/assets/hero.png create mode 100644 client/src/assets/map.jpg create mode 100644 client/src/components/CompactVenueCard.tsx create mode 100644 client/src/components/PlaceAutocomplete.tsx create mode 100644 client/src/components/VenueCard.tsx create mode 100644 client/src/components/auth/AuthInput.tsx create mode 100644 client/src/components/auth/AuthSubmitButton.tsx create mode 100644 client/src/components/auth/PasswordInput.tsx create mode 100644 client/src/components/booking/BookingSummaryCard.tsx create mode 100644 client/src/components/bookings/BookingCard.tsx create mode 100644 client/src/components/bookings/NextBookingBanner.tsx create mode 100644 client/src/components/common/AdminRedirect.tsx create mode 100644 client/src/components/common/AuthGuard.tsx create mode 100644 client/src/components/common/AvatarCropEditor.tsx create mode 100644 client/src/components/common/CancelBookingModal.tsx create mode 100644 client/src/components/common/Footer.tsx create mode 100644 client/src/components/common/GuestGuard.tsx create mode 100644 client/src/components/common/ImageLightbox.tsx create mode 100644 client/src/components/common/ImageUpload.tsx create mode 100644 client/src/components/common/ListSidebar.tsx create mode 100644 client/src/components/common/Navbar.tsx create mode 100644 client/src/components/common/ProfileDropdown.tsx create mode 100644 client/src/components/common/ReviewModal.tsx create mode 100644 client/src/components/common/Spinner.tsx create mode 100644 client/src/components/common/ThemeToggle.tsx create mode 100644 client/src/components/common/ToastListener.tsx create mode 100644 client/src/components/common/VenueCardSkeleton.tsx create mode 100644 client/src/components/explore/ExploreFilters.tsx create mode 100644 client/src/components/explore/RejectionHistoryAccordion.tsx create mode 100644 client/src/components/explore/RejectionHistoryModal.tsx create mode 100644 client/src/components/explore/VenueGrid.tsx create mode 100644 client/src/components/ui/button.tsx create mode 100644 client/src/components/ui/calendar.tsx create mode 100644 client/src/components/ui/checkbox.tsx create mode 100644 client/src/components/ui/dialog.tsx create mode 100644 client/src/components/ui/input.tsx create mode 100644 client/src/components/ui/radio-group.tsx create mode 100644 client/src/components/ui/select.tsx create mode 100644 client/src/components/ui/separator.tsx create mode 100644 client/src/components/ui/skeleton.tsx create mode 100644 client/src/components/ui/slider.tsx create mode 100644 client/src/components/venue/VenueAmenities.tsx create mode 100644 client/src/components/venue/VenueGallery.tsx create mode 100644 client/src/components/venue/VenueInfo.tsx create mode 100644 client/src/config/axios.ts create mode 100644 client/src/config/queryClient.ts create mode 100644 client/src/constants/bookingConstants.ts create mode 100644 client/src/constants/common.ts create mode 100644 client/src/constants/filterConstants.ts create mode 100644 client/src/constants/index.tsx create mode 100644 client/src/constants/map.ts create mode 100644 client/src/constants/statusVariants.ts create mode 100644 client/src/constants/uiClasses.ts create mode 100644 client/src/constants/upload.ts create mode 100644 client/src/constants/venueConstants.ts create mode 100644 client/src/context/AuthContext.tsx create mode 100644 client/src/context/ThemeContext.tsx create mode 100644 client/src/hooks/useApi.ts create mode 100644 client/src/hooks/useAuth.ts create mode 100644 client/src/hooks/useAvatarUpload.ts create mode 100644 client/src/hooks/useBookingById.ts create mode 100644 client/src/hooks/useDebounce.ts create mode 100644 client/src/hooks/useExploreVenues.ts create mode 100644 client/src/hooks/useGeolocation.ts create mode 100644 client/src/hooks/useImageUpload.ts create mode 100644 client/src/hooks/useLockTimer.ts create mode 100644 client/src/hooks/useMyBookings.ts create mode 100644 client/src/hooks/useRazorpayPayment.ts create mode 100644 client/src/hooks/useSessions.ts create mode 100644 client/src/hooks/useTheme.ts create mode 100644 client/src/hooks/useToast.ts create mode 100644 client/src/hooks/useVenueBooking.ts create mode 100644 client/src/hooks/useVenuePins.ts create mode 100644 client/src/hooks/useVenueReviews.ts create mode 100644 client/src/hooks/useWishlist.ts create mode 100644 client/src/index.css create mode 100644 client/src/layout/AuthLayout.tsx create mode 100644 client/src/layout/MainLayout.tsx create mode 100644 client/src/lib/utils.ts create mode 100644 client/src/main.tsx create mode 100644 client/src/pages/Auth/forgotPassword/index.tsx create mode 100644 client/src/pages/Auth/forgotPassword/validation.ts create mode 100644 client/src/pages/Auth/login/index.tsx create mode 100644 client/src/pages/Auth/login/validation.ts create mode 100644 client/src/pages/Auth/register/index.tsx create mode 100644 client/src/pages/Auth/register/validation.ts create mode 100644 client/src/pages/Auth/resetPassword/index.tsx create mode 100644 client/src/pages/Auth/resetPassword/validation.ts create mode 100644 client/src/pages/Booking/bookingDetails/components/BookingInfo.tsx create mode 100644 client/src/pages/Booking/bookingDetails/components/BookingSidebarDetails.tsx create mode 100644 client/src/pages/Booking/bookingDetails/index.tsx create mode 100644 client/src/pages/Booking/confirmation/index.tsx create mode 100644 client/src/pages/Booking/myBookings/index.tsx create mode 100644 client/src/pages/Booking/summary/index.tsx create mode 100644 client/src/pages/Explore/components/VenueMap.tsx create mode 100644 client/src/pages/Explore/index.tsx create mode 100644 client/src/pages/Explore/venueDetails/components/BookingSidebar.tsx create mode 100644 client/src/pages/Explore/venueDetails/components/ReviewList.tsx create mode 100644 client/src/pages/Explore/venueDetails/index.tsx create mode 100644 client/src/pages/NotFound/index.tsx create mode 100644 client/src/pages/Profile/DevicesCard.tsx create mode 100644 client/src/pages/Profile/IdentityCard.tsx create mode 100644 client/src/pages/Profile/SecurityCard.tsx create mode 100644 client/src/pages/Profile/index.tsx create mode 100644 client/src/pages/Wishlist/index.tsx create mode 100644 client/src/pages/home/components/FeaturedVenues.tsx create mode 100644 client/src/pages/home/components/HeroSection.tsx create mode 100644 client/src/pages/home/featuredVenues.ts create mode 100644 client/src/pages/home/index.tsx create mode 100644 client/src/pages/listVenue/ListVenueLayout.tsx create mode 100644 client/src/pages/listVenue/addVenue/components/AmenitiesSection.tsx create mode 100644 client/src/pages/listVenue/addVenue/components/BasicInfoStep.tsx create mode 100644 client/src/pages/listVenue/addVenue/components/BasicValidation.ts create mode 100644 client/src/pages/listVenue/addVenue/components/BookingTypeSection.tsx create mode 100644 client/src/pages/listVenue/addVenue/components/FinishStep.tsx create mode 100644 client/src/pages/listVenue/addVenue/components/FinishValidation.ts create mode 100644 client/src/pages/listVenue/addVenue/components/FixedBookingSection.tsx create mode 100644 client/src/pages/listVenue/addVenue/components/FlexibleBookingSection.tsx create mode 100644 client/src/pages/listVenue/addVenue/components/SlotPreviewPanel.tsx create mode 100644 client/src/pages/listVenue/addVenue/components/middleStep.tsx create mode 100644 client/src/pages/listVenue/addVenue/components/middleValidation.ts create mode 100644 client/src/pages/listVenue/addVenue/index.tsx create mode 100644 client/src/pages/listVenue/myVenue/components/VenueCard.tsx create mode 100644 client/src/pages/listVenue/myVenue/components/VenuePreviewModal.tsx create mode 100644 client/src/pages/listVenue/myVenue/index.tsx create mode 100644 client/src/router.tsx create mode 100644 client/src/services/authService.ts create mode 100644 client/src/services/bookingService.ts create mode 100644 client/src/services/reviewService.ts create mode 100644 client/src/services/userService.ts create mode 100644 client/src/services/venueService.ts create mode 100644 client/src/services/wishlistService.ts create mode 100644 client/src/tests/config/axios.test.ts create mode 100644 client/src/tests/config/queryClient.test.ts create mode 100644 client/src/tests/context/AuthContext.test.tsx create mode 100644 client/src/tests/context/ThemeContext.test.tsx create mode 100644 client/src/tests/hooks/useApi.test.tsx create mode 100644 client/src/tests/hooks/useAuth.test.tsx create mode 100644 client/src/tests/hooks/useDebounce.test.ts create mode 100644 client/src/tests/hooks/useLockTimer.test.ts create mode 100644 client/src/tests/pages/Auth/login/validation.test.ts create mode 100644 client/src/tests/pages/Auth/register/validation.test.ts create mode 100644 client/src/tests/services/authService.test.ts create mode 100644 client/src/tests/services/bookingService.test.ts create mode 100644 client/src/tests/services/venueService.test.ts create mode 100644 client/src/tests/setup.ts create mode 100644 client/src/tests/unit/utils/slotGenerator.test.ts create mode 100644 client/src/tests/unit/utils/timeUtils.test.ts create mode 100644 client/src/tests/unit/utils/venueFormMapper.test.ts create mode 100644 client/src/tests/utils/redirect.test.ts create mode 100644 client/src/tests/utils/timeUtils.test.ts create mode 100644 client/src/tests/utils/toast.test.ts create mode 100644 client/src/tests/utils/venueDraft.test.ts create mode 100644 client/src/tests/utils/venueFormMapper.test.ts create mode 100644 client/src/types/auth.types.ts create mode 100644 client/src/types/booking.types.ts create mode 100644 client/src/types/geo.types.ts create mode 100644 client/src/types/review.types.ts create mode 100644 client/src/types/user.types.ts create mode 100644 client/src/types/venue.types.ts create mode 100644 client/src/types/wishlist.types.ts create mode 100644 client/src/utils/bookingUtils.ts create mode 100644 client/src/utils/cropImage.ts create mode 100644 client/src/utils/parseUserAgent.ts create mode 100644 client/src/utils/profileGreeting.ts create mode 100644 client/src/utils/redirect.ts create mode 100644 client/src/utils/slotGenerator.types.ts create mode 100644 client/src/utils/slotGenerator.utils.ts create mode 100644 client/src/utils/timeUtils.ts create mode 100644 client/src/utils/toast.ts create mode 100644 client/src/utils/venueDraft.ts create mode 100644 client/src/utils/venueFormMapper.ts create mode 100644 client/tsconfig.app.json create mode 100644 client/tsconfig.json create mode 100644 client/tsconfig.node.json create mode 100644 client/vite.config.ts create mode 100644 client/vitest.config.ts create mode 100644 docker-compose.yml create mode 100644 docs/api-overview.md create mode 100644 docs/architecture.md create mode 100644 docs/modules.md create mode 100644 favicon/apple-touch-icon.png create mode 100644 favicon/favicon-96x96.png create mode 100644 favicon/favicon.ico create mode 100644 favicon/favicon.svg create mode 100644 favicon/site.webmanifest create mode 100644 favicon/web-app-manifest-192x192.png create mode 100644 favicon/web-app-manifest-512x512.png create mode 100644 lint-staged.config.mjs create mode 100644 logo small.png create mode 100644 package.json create mode 100644 pnpm-lock.yaml create mode 100644 pnpm-workspace.yaml create mode 100644 server/.dockerignore create mode 100644 server/.env.example create mode 100644 server/.prettierignore create mode 100644 server/.prettierrc create mode 100644 server/Dockerfile create mode 100644 server/eslint.config.mjs create mode 100644 server/package.json create mode 100644 server/pnpm-lock.yaml create mode 100644 server/pnpm-workspace.yaml create mode 100644 server/public/images/bmv-logo.png create mode 100644 server/src/app.ts create mode 100644 server/src/configs/cors.config.ts create mode 100644 server/src/configs/database.config.ts create mode 100644 server/src/configs/envValidation.config.ts create mode 100644 server/src/constants/auth.constants.ts create mode 100644 server/src/constants/booking.constants.ts create mode 100644 server/src/constants/common.ts create mode 100644 server/src/constants/email.constants.ts create mode 100644 server/src/constants/env.ts create mode 100644 server/src/constants/payment.constants.ts create mode 100644 server/src/constants/permissions.ts create mode 100644 server/src/constants/venue.constants.ts create mode 100644 server/src/middlewares/auth.middleware.ts create mode 100644 server/src/middlewares/idempotency.middleware.ts create mode 100644 server/src/middlewares/ownerTenant.middleware.ts create mode 100644 server/src/middlewares/pagination.middleware.ts create mode 100644 server/src/middlewares/rbac.middleware.ts create mode 100644 server/src/middlewares/validation.middleware.ts create mode 100644 server/src/models/email-task.model.ts create mode 100644 server/src/models/featured-venue.model.ts create mode 100644 server/src/models/idempotency-key.model.ts create mode 100644 server/src/models/permission.model.ts create mode 100644 server/src/models/role-permission.model.ts create mode 100644 server/src/models/role.model.ts create mode 100644 server/src/models/user-role.model.ts create mode 100644 server/src/modules/auth/auth.controller.ts create mode 100644 server/src/modules/auth/auth.repository.ts create mode 100644 server/src/modules/auth/auth.router.ts create mode 100644 server/src/modules/auth/auth.service.ts create mode 100644 server/src/modules/auth/auth.validator.ts create mode 100644 server/src/modules/auth/models/password-reset-request.model.ts create mode 100644 server/src/modules/auth/models/password-reset-token.model.ts create mode 100644 server/src/modules/auth/models/refresh-token.model.ts create mode 100644 server/src/modules/auth/models/session.model.ts create mode 100644 server/src/modules/availability/availability.controller.ts create mode 100644 server/src/modules/availability/availability.repository.ts create mode 100644 server/src/modules/availability/availability.router.ts create mode 100644 server/src/modules/availability/availability.validator.ts create mode 100644 server/src/modules/availability/availability.workflow.ts create mode 100644 server/src/modules/booking/booking.controller.ts create mode 100644 server/src/modules/booking/booking.repository.ts create mode 100644 server/src/modules/booking/booking.router.ts create mode 100644 server/src/modules/booking/booking.service.ts create mode 100644 server/src/modules/booking/booking.types.ts create mode 100644 server/src/modules/booking/booking.validator.ts create mode 100644 server/src/modules/booking/booking.workflow.ts create mode 100644 server/src/modules/booking/lock.types.ts create mode 100644 server/src/modules/booking/models/booking.model.ts create mode 100644 server/src/modules/booking/models/failedBooking.model.ts create mode 100644 server/src/modules/booking/models/lock.model.ts create mode 100644 server/src/modules/booking/models/processedWebhook.model.ts create mode 100644 server/src/modules/booking/models/slotMutex.model.ts create mode 100644 server/src/modules/geo/geo.router.ts create mode 100644 server/src/modules/geo/geo.service.ts create mode 100644 server/src/modules/geo/geo.types.ts create mode 100644 server/src/modules/moderation/bannedUser.controller.ts create mode 100644 server/src/modules/moderation/bannedUser.model.ts create mode 100644 server/src/modules/moderation/bannedUser.repository.ts create mode 100644 server/src/modules/moderation/bannedUser.router.ts create mode 100644 server/src/modules/moderation/bannedUser.service.ts create mode 100644 server/src/modules/moderation/bannedUser.types.ts create mode 100644 server/src/modules/moderation/bannedUser.validator.ts create mode 100644 server/src/modules/moderation/moderation.repository.ts create mode 100644 server/src/modules/moderation/moderation.router.ts create mode 100644 server/src/modules/moderation/moderation.service.ts create mode 100644 server/src/modules/moderation/moderation.types.ts create mode 100644 server/src/modules/moderation/moderationActivity.model.ts create mode 100644 server/src/modules/moderation/moderationActivity.service.ts create mode 100644 server/src/modules/owner/owner.controller.ts create mode 100644 server/src/modules/owner/owner.repository.ts create mode 100644 server/src/modules/owner/owner.router.ts create mode 100644 server/src/modules/owner/owner.service.ts create mode 100644 server/src/modules/owner/owner.validator.ts create mode 100644 server/src/modules/owner/owner.workflow.ts create mode 100644 server/src/modules/rbac/rbac.controller.ts create mode 100644 server/src/modules/rbac/rbac.router.ts create mode 100644 server/src/modules/rbac/rbac.service.ts create mode 100644 server/src/modules/review/review.controller.ts create mode 100644 server/src/modules/review/review.model.ts create mode 100644 server/src/modules/review/review.ownership.ts create mode 100644 server/src/modules/review/review.repository.ts create mode 100644 server/src/modules/review/review.router.ts create mode 100644 server/src/modules/review/review.service.ts create mode 100644 server/src/modules/review/review.types.ts create mode 100644 server/src/modules/role/role.controller.ts create mode 100644 server/src/modules/role/role.repository.ts create mode 100644 server/src/modules/role/role.router.ts create mode 100644 server/src/modules/role/role.service.ts create mode 100644 server/src/modules/role/role.validator.ts create mode 100644 server/src/modules/swagger/swagger.config.ts create mode 100644 server/src/modules/swagger/swagger.router.ts create mode 100644 server/src/modules/user/user.controller.ts create mode 100644 server/src/modules/user/user.models.ts create mode 100644 server/src/modules/user/user.repository.ts create mode 100644 server/src/modules/user/user.router.ts create mode 100644 server/src/modules/user/user.service.ts create mode 100644 server/src/modules/user/user.types.ts create mode 100644 server/src/modules/user/user.validator.ts create mode 100644 server/src/modules/user/user.workflow.ts create mode 100644 server/src/modules/venue/venue.controller.ts create mode 100644 server/src/modules/venue/venue.model.ts create mode 100644 server/src/modules/venue/venue.ownership.ts create mode 100644 server/src/modules/venue/venue.repository.ts create mode 100644 server/src/modules/venue/venue.router.ts create mode 100644 server/src/modules/venue/venue.service.ts create mode 100644 server/src/modules/venue/venue.types.ts create mode 100644 server/src/modules/venue/venue.validator.ts create mode 100644 server/src/modules/venue/venue.workflow.ts create mode 100644 server/src/modules/venue/venueDraft.model.ts create mode 100644 server/src/modules/webhook/webhook.controller.ts create mode 100644 server/src/modules/webhook/webhook.router.ts create mode 100644 server/src/modules/webhook/webhook.types.ts create mode 100644 server/src/modules/wishlist/wishlist.controller.ts create mode 100644 server/src/modules/wishlist/wishlist.model.ts create mode 100644 server/src/modules/wishlist/wishlist.repository.ts create mode 100644 server/src/modules/wishlist/wishlist.router.ts create mode 100644 server/src/modules/wishlist/wishlist.service.ts create mode 100644 server/src/modules/wishlist/wishlist.types.ts create mode 100644 server/src/modules/wishlist/wishlist.validator.ts create mode 100644 server/src/router.ts create mode 100644 server/src/server.ts create mode 100644 server/src/services/cache/permission-cache.service.ts create mode 100644 server/src/services/email.repository.ts create mode 100644 server/src/services/email.service.ts create mode 100644 server/src/services/emailTemplateFactory.ts create mode 100644 server/src/services/razorpay.service.ts create mode 100644 server/src/services/roles.service.ts create mode 100644 server/src/types/express.ts create mode 100644 server/src/types/pagination.types.ts create mode 100644 server/src/utils/cacheUtils.ts create mode 100644 server/src/utils/cloudinarySign.ts create mode 100644 server/src/utils/dbUtils.ts create mode 100644 server/src/utils/errors.ts create mode 100644 server/src/utils/logger.ts create mode 100644 server/src/utils/mutex.ts create mode 100644 server/src/utils/paginationUtils.ts create mode 100644 server/src/utils/responseUtils.ts create mode 100644 server/src/utils/shutdownUtils.ts create mode 100644 server/src/utils/timeUtils.ts create mode 100644 server/src/utils/tokenUtils.ts create mode 100644 server/src/utils/winston/logger.ts create mode 100644 server/src/utils/winston/requestLogger.ts create mode 100644 server/src/workers/banExpiry.worker.ts create mode 100644 server/src/workers/bookingStatus.worker.ts create mode 100644 server/src/workers/email.worker.ts create mode 100644 server/src/workers/venueEditDeadline.worker.ts create mode 100644 server/tests/globalSetup.ts create mode 100644 server/tests/helpers/auth.helper.ts create mode 100644 server/tests/helpers/db.helper.ts create mode 100644 server/tests/helpers/webhook.helper.ts create mode 100644 server/tests/integration/middlewares/validation.middleware.test.ts create mode 100644 server/tests/integration/routes/auth.test.ts create mode 100644 server/tests/integration/routes/booking.test.ts create mode 100644 server/tests/integration/routes/health.test.ts create mode 100644 server/tests/integration/routes/rbac.test.ts create mode 100644 server/tests/integration/routes/user.test.ts create mode 100644 server/tests/integration/routes/venue.test.ts create mode 100644 server/tests/integration/routes/webhook.test.ts create mode 100644 server/tests/setup.ts create mode 100644 server/tests/unit/idempotency.middleware.test.ts create mode 100644 server/tests/unit/owner.repository.test.ts create mode 100644 server/tests/unit/responseUtils.test.ts create mode 100644 server/tests/unit/validators.test.ts create mode 100644 server/tsconfig.json create mode 100644 server/tsconfig.tsbuildinfo create mode 100644 server/vitest.config.ts diff --git a/.github/workflows/backend.yml b/.github/workflows/backend.yml new file mode 100644 index 0000000000..f94936bde6 --- /dev/null +++ b/.github/workflows/backend.yml @@ -0,0 +1,37 @@ +name: Backend CI + +on: + push: + branches: [dev, qa, main] + paths: + - 'server/**' + pull_request: + branches: [dev, qa, main] + paths: + - 'server/**' + +jobs: + check: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + + - uses: pnpm/action-setup@v4 + + - uses: actions/setup-node@v4 + + - name: Install dependencies + run: pnpm install --no-frozen-lockfile + + - name: Type check + run: pnpm --filter server run typecheck + + - name: Lint + run: pnpm --filter server run lint + + - name: Test + run: pnpm --filter server run test + + - name: Build + run: pnpm --filter server run build diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000000..9c66902ec6 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,57 @@ +name: Monorepo CI + +on: + push: + branches: [dev, qa, main] + pull_request: + branches: [dev, qa, main] + +jobs: + changes: + runs-on: ubuntu-latest + outputs: + admin: ${{ steps.filter.outputs.admin }} + client: ${{ steps.filter.outputs.client }} + server: ${{ steps.filter.outputs.server }} + steps: + - uses: actions/checkout@v4 + - uses: dorny/paths-filter@v3 + id: filter + with: + filters: | + admin: 'admin/**' + client: 'client/**' + server: 'server/**' + + build: + needs: changes + strategy: + matrix: + component: [admin, client, server] + runs-on: ubuntu-latest + if: | + (matrix.component == 'admin' && needs.changes.outputs.admin == 'true') || + (matrix.component == 'client' && needs.changes.outputs.client == 'true') || + (matrix.component == 'server' && needs.changes.outputs.server == 'true') + defaults: + run: + working-directory: ${{ matrix.component }} + steps: + - uses: actions/checkout@v4 + + - uses: pnpm/action-setup@v4 + + - uses: actions/setup-node@v4 + with: + cache: "pnpm" + cache-dependency-path: ${{ matrix.component }}/pnpm-lock.yaml + + - run: pnpm install --no-frozen-lockfile --recursive + + - name: Type check (server only) + if: matrix.component == 'server' + run: pnpm exec tsc --noEmit + + - run: pnpm run lint + - run: pnpm run test + - run: pnpm run build \ No newline at end of file diff --git a/.github/workflows/enforce-pr-source.yml b/.github/workflows/enforce-pr-source.yml new file mode 100644 index 0000000000..85048d3557 --- /dev/null +++ b/.github/workflows/enforce-pr-source.yml @@ -0,0 +1,67 @@ +name: Enforce PR Source Branches + +on: + pull_request: + branches: [qa, main] + types: [opened, synchronize, reopened, edited] + +jobs: + check-qa-source: + name: Check PRs targeting `qa` + if: github.base_ref == 'qa' + runs-on: ubuntu-latest + steps: + - name: Verify source branch is `dev` + run: | + if [[ "${{ github.head_ref }}" != "dev" ]]; then + echo "❌ ERROR: PRs to 'qa' must come from 'dev'!" + echo "" + echo "Valid path to qa:" + echo " dev → qa" + echo "" + echo "Your PR is from: ${{ github.head_ref }}" + echo "Expected source: dev" + echo "" + echo "Please:" + echo "1. Close this PR" + echo "2. Merge your changes into 'dev' branch first" + echo "3. Create a new PR from 'dev' to 'qa'" + exit 1 + fi + + - name: Optional – Suggest release preparation + run: | + echo "✅ PR from dev to qa is valid. Continue with QA testing." + + check-main-source: + name: Check PRs targeting `main` + if: github.base_ref == 'main' + runs-on: ubuntu-latest + steps: + - name: Verify source branch is `qa` + run: | + if [[ "${{ github.head_ref }}" != "qa" ]]; then + echo "❌ ERROR: Direct PR to 'main' is not allowed!" + echo "" + echo "Valid path to main:" + echo " dev → qa → main" + echo "" + echo "Your PR is from: ${{ github.head_ref }}" + echo "Expected source: qa" + echo "" + echo "Please:" + echo "1. Close this PR" + echo "2. Merge your changes into 'qa' branch first" + echo "3. Create a new PR from 'qa' to 'main'" + exit 1 + fi + + - name: Enforce release version naming (optional) + run: | + TITLE="${{ github.event.pull_request.title }}" + if [[ ! "$TITLE" =~ ^Release\ version\ [0-9]+\.[0-9]+\.[0-9]+ ]]; then + echo "⚠️ Suggestion: PR title should follow 'Release version X.Y.Z'" + # Change to "exit 1" if you want to enforce the naming strictly + else + echo "✅ Valid release title format." + fi diff --git a/.github/workflows/frontend.yml b/.github/workflows/frontend.yml new file mode 100644 index 0000000000..70c6c19165 --- /dev/null +++ b/.github/workflows/frontend.yml @@ -0,0 +1,78 @@ +name: Frontend CI + +on: + push: + branches: [dev, qa, main] + paths: + - "admin/**" + - "client/**" + - ".github/workflows/frontend.yml" + pull_request: + branches: [dev, qa, main] + paths: + - "admin/**" + - "client/**" + - ".github/workflows/frontend.yml" + +jobs: + changes: + runs-on: ubuntu-latest + outputs: + admin: ${{ steps.filter.outputs.admin }} + client: ${{ steps.filter.outputs.client }} + steps: + - uses: actions/checkout@v4 + - uses: dorny/paths-filter@v3 + id: filter + with: + filters: | + admin: + - 'admin/**' + client: + - 'client/**' + + build-admin: + needs: changes + if: needs.changes.outputs.admin == 'true' + runs-on: ubuntu-latest + defaults: + run: + working-directory: admin + steps: + - uses: actions/checkout@v4 + + - uses: pnpm/action-setup@v4 + + - uses: actions/setup-node@v4 + with: + cache: "pnpm" + cache-dependency-path: admin/pnpm-lock.yaml + + - run: pnpm install --no-frozen-lockfile + - run: pnpm exec tsc --noEmit + - run: pnpm run lint + - run: pnpm run test + - run: pnpm run build + + build-client: + needs: changes + if: needs.changes.outputs.client == 'true' + runs-on: ubuntu-latest + defaults: + run: + working-directory: client + steps: + - uses: actions/checkout@v4 + + - uses: pnpm/action-setup@v4 + + - uses: actions/setup-node@v4 + with: + cache: "pnpm" + cache-dependency-path: client/pnpm-lock.yaml + + - run: pnpm install --no-frozen-lockfile + - run: pnpm exec tsc --noEmit + - run: pnpm run lint + - run: pnpm run test + - run: pnpm run build diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000..a2501db7c3 --- /dev/null +++ b/.gitignore @@ -0,0 +1,52 @@ +# Logs +*.log +lerna-debug.log* +logs +npm-debug.log* +pnpm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Build / Distribution +dist +dist-ssr + +# Editor / IDE +.agents +.agent +.idea +.vscode +!.vscode/extensions.json +*.njsproj +*.ntvs* +*.sln +*.suo +*.sw? + +# Root +node_modules/ + +# System / OS +.DS_Store + +# ------------------------------------- + +# Admin +/admin/.env +/admin/.vite/ +/admin/dist/ +/admin/node_modules + +# Client +/client/.env +/client/.vite/ +/client/dist/ +/client/node_modules + +# Server +/server/.env +/server/dist/ +/server/node_modules + +# Test coverage +coverage/ \ No newline at end of file diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100644 index 0000000000..5ee7abd87c --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1 @@ +pnpm exec lint-staged diff --git a/.husky/pre-push b/.husky/pre-push new file mode 100644 index 0000000000..b51904ccfb --- /dev/null +++ b/.husky/pre-push @@ -0,0 +1,96 @@ +#!/bin/sh + +# Pre-push hook — runs full typecheck + lint + build + test only on the sub-projects that changed. +# Reads from stdin in the format: + +changed_files="" +while read local_ref local_sha remote_ref remote_sha; do + # Skip branch deletion + if [ "$local_sha" = "0000000000000000000000000000000000000000" ]; then + continue + fi + + # Determine what to compare against + if [ "$remote_sha" = "0000000000000000000000000000000000000000" ]; then + # New branch — compare against merge-base with main or dev + against=$(git merge-base HEAD main 2>/dev/null || git merge-base HEAD dev 2>/dev/null || echo "$local_sha~1") + else + against="$remote_sha" + fi + + new_changed=$(git diff --name-only "$against".."$local_sha" 2>/dev/null) + if [ -n "$new_changed" ]; then + changed_files="$changed_files +$new_changed" + fi +done + +if [ -z "$changed_files" ] || [ "$changed_files" = "" ]; then + echo "✅ No file changes detected, skipping pre-push checks." + exit 0 +fi + +# Categorize changed files by sub-project +CLIENT_FILES="" +ADMIN_FILES="" +SERVER_FILES="" + +while IFS= read -r file; do + [ -z "$file" ] && continue + + [ ! -f "$file" ] && continue + case "$file" in + client/*) CLIENT_FILES="$CLIENT_FILES $file" ;; + admin/*) ADMIN_FILES="$ADMIN_FILES $file" ;; + server/*) SERVER_FILES="$SERVER_FILES $file" ;; + esac +done <&1) || failed=1 + (cd "$ROOT_DIR/client" && pnpm test 2>&1) || failed=1 + (cd "$ROOT_DIR/client" && pnpm build 2>&1) || failed=1 + echo " Client checks complete" +fi + +if [ -n "$ADMIN_FILES" ]; then + echo "" + echo "📦 Checking admin …" + ADMIN_FILES_RELATIVE=$(printf "%s" "$ADMIN_FILES" | sed 's|^[[:space:]]*||; s| admin/| |g; s|^admin/||') + (cd "$ROOT_DIR/admin" && pnpm exec eslint --no-warn-ignored $ADMIN_FILES_RELATIVE 2>&1) || failed=1 + (cd "$ROOT_DIR/admin" && pnpm test 2>&1) || failed=1 + (cd "$ROOT_DIR/admin" && pnpm build 2>&1) || failed=1 + echo " Admin checks complete" +fi + +if [ -n "$SERVER_FILES" ]; then + echo "" + echo "📦 Checking server …" + SERVER_FILES_RELATIVE=$(printf "%s" "$SERVER_FILES" | sed 's|^[[:space:]]*||; s| server/| |g; s|^server/||') + (cd "$ROOT_DIR/server" && pnpm exec eslint --no-warn-ignored $SERVER_FILES_RELATIVE 2>&1) || failed=1 + (cd "$ROOT_DIR/server" && pnpm test 2>&1) || failed=1 + (cd "$ROOT_DIR/server" && pnpm build 2>&1) || failed=1 + echo " Server checks complete" +fi + +echo "" +echo "───────────────────────────────────────" +if [ "$failed" = 1 ]; then + echo "❌ Pre-push checks FAILED — push blocked." + exit 1 +fi +echo "✅ All checks passed — push allowed." +exit 0 diff --git a/BMV full logo nontransparent.png b/BMV full logo nontransparent.png new file mode 100644 index 0000000000000000000000000000000000000000..4e77f83291420a29e695626787db84eb6056aa5a GIT binary patch literal 732315 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

q!lNTiG(QlR1M=a`Y#4vwD-#v7|L=s77H2 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

?I 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 OApSd%EJQP=)cMf*Az2p2%U(^ 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 O0000eR`hy? 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

3i9EOJoIu%X%+XS1ER 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

CD@%^ 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 wZv{VYyr`+}fPmYrE9mYW?tdTsKi*;M1& literal 0 HcmV?d00001 diff --git a/README.md b/README.md index 68d8b36b8e..ea8c844f07 100644 --- a/README.md +++ b/README.md @@ -44,4 +44,16 @@ To maintain a high standard of code, all Pull Requests must use our [standard te 4. **Sign the AI Disclosure** (Confirming you have reviewed any AI-generated code). 5. **Attach Screenshots** (If your PR includes UI changes). +## 📚 Documentation + +| Document | Description | +|---|---| +| [Setup Guide](SETUP.md) | Development environment setup, environment variables, and running the project | +| [Architecture](docs/architecture.md) | System architecture, module patterns, middleware stack, and RBAC | +| [API Overview](docs/api-overview.md) | Authentication flow, response format, pagination, webhooks, and route map | +| [Server Modules](docs/modules.md) | Catalog of all 14 server feature modules | +| [Pagination](.agents/PAGINATION.md) | Detailed pagination middleware and utilities reference | +| [Security Policy](SECURITY.md) | How to report vulnerabilities and security measures | +| [Contribution Guidelines](CONTRIBUTING.md) | How to contribute, branch naming, and PR workflow | + **BookMyVenue belongs to all of us. Join WeCode today and let's build something amazing together!** diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000000..affe1230b5 --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,56 @@ +# Security Policy + +## Supported Versions + +Currently in Phase 1 MVP development — only the latest commit on `main`/`dev` is supported. + +## Reporting a Vulnerability + +To report a security vulnerability, please email **me@ashishshaiju.com** (do **NOT** open a public GitHub issue). + +You should receive an acknowledgment within 48 hours. If you don't, follow up to ensure we received your report. + +We ask that you: + +- Provide a detailed description of the vulnerability +- Include steps to reproduce if possible +- Allow us reasonable time to address the issue before any public disclosure + +### What We Do + +- Acknowledge receipt within 2 business days +- Investigate and provide a timeline for fix +- Release a patch and credit the reporter (if desired) +- Backport fixes to supported versions as needed + +## Scope + +- **Server** (`server/`): Express API, authentication (JWT), payment processing (Razorpay), data handling +- **Client** (`client/`): User-facing React app, API communication +- **Admin** (`admin/`): Admin dashboard, user/venue management + +## Security Measures + +- **Authentication**: JWT-based access + refresh token flow with HTTP-only cookies +- **Rate Limiting**: Global (100 req/15min), login (10 req/15min), sensitive endpoints (5 req/15min) +- **Headers**: Helmet.js for security headers +- **Payment Webhooks**: Razorpay HMAC-SHA256 signature verification on raw request body +- **Input Validation**: Zod schemas on all endpoints with centralized validation middleware +- **Dependencies**: Regular updates via pnpm, Dependabot configured +- **Secrets**: All secrets and API keys managed via environment variables, never hardcoded + +## Data Handling + +- Passwords hashed with bcrypt +- MongoDB connection uses SRV + TLS in production +- Email service via Resend (API key authenticated) +- File uploads processed through Cloudinary (not stored on application servers) + +## Disclosure Policy + +We follow coordinated disclosure: + +1. Reporter submits vulnerability privately +2. We investigate and fix +3. We release a security advisory with the fix +4. Reporter may disclose publicly after advisory release diff --git a/SETUP.md b/SETUP.md new file mode 100644 index 0000000000..1de97cf477 --- /dev/null +++ b/SETUP.md @@ -0,0 +1,177 @@ +# BookMyVenue — Development Setup Guide + +## Prerequisites + +- Node.js 22+ +- pnpm 10.16.1 (`npm install -g pnpm@10.16.1`) +- MongoDB (local instance or MongoDB Atlas) +- Git + +## Getting Started + +```bash +git clone https://github.com/ashishshaiju/BookMyVenue.git +cd BookMyVenue +pnpm install +``` + +## Environment Variables + +### Server (`server/.env`) + +Copy `server/.env.example` to `server/.env`. Key variables: + +| Variable | Description | Default | +|---|---|---| +| `MONGODB_URI` | MongoDB connection string | `mongodb://localhost:27017/book-my-venue` | +| `PORT` | Server port | `3000` | +| `NODE_ENV` | Environment | `development` | +| `JWT_ACCESS_SECRET` | JWT access token secret | (generate random 64-char hex) | +| `JWT_REFRESH_SECRET` | JWT refresh token secret | (generate random 64-char hex) | +| `ACCESS_TOKEN_EXPIRY` | Access token lifetime | `15m` | +| `REFRESH_TOKEN_EXPIRY` | Refresh token lifetime | `7d` | +| `RESEND_API_KEY` | Resend email API key | — | +| `EMAIL_FROM_NAME` | Sender name | `BookMyVenue` | +| `EMAIL_FROM_EMAIL` | Sender email | `noreply@bookmyvenue.com` | +| `FRONTEND_URL` | Client app URL | `http://localhost:5173` | +| `CLOUDINARY_CLOUD_NAME` | Cloudinary cloud name | — | +| `CLOUDINARY_API_KEY` | Cloudinary API key | — | +| `CLOUDINARY_API_SECRET` | Cloudinary API secret | — | +| `RAZORPAY_KEY_ID` | Razorpay key ID | — | +| `RAZORPAY_KEY_SECRET` | Razorpay key secret | — | +| `RAZORPAY_WEBHOOK_SECRET` | Razorpay webhook secret | — | +| `SWAGGER_USER` | Swagger UI basic auth user | `admin` | +| `SWAGGER_PASS` | Swagger UI basic auth pass | `password` | + +### Client (`client/.env`) + +```env +VITE_API_BASE_URL=http://localhost:3000/api/v1 +``` + +### Admin (`admin/.env`) + +```env +VITE_API_BASE_URL=http://localhost:3003/api/v1 +VITE_CLIENT_URL=http://localhost:5173 +``` + +## Database Setup + +1. Start MongoDB locally or use MongoDB Atlas +2. The server connects automatically on startup using `MONGODB_URI` +3. Required after a fresh database: + +```bash +cd server +pnpm script seed:rbac +``` + +This seeds roles, permissions, and RBAC data. The server verifies this at startup via `verifyRbacSeed()` and exits if missing. + +## Running the Workspaces + +### Root (all workspaces simultaneously) + +```bash +pnpm dev +``` + +Starts server (port 3000/3003), client (port 5173), and admin (port 5174) in parallel. + +### Server (Backend) + +```bash +cd server +pnpm dev # Start with auto-reload (tsx watch) +pnpm build # Compile TypeScript to dist/ +pnpm start # Run built server (node dist/server.js) +pnpm lint # ESLint +pnpm typecheck # tsc --noEmit +``` + +Runs on `http://localhost:3000` (configurable via `PORT`). Uses Express 5 + Mongoose. Swagger API docs at `http://localhost:3000/api/v1/swagger` (basic auth: user/pass from env). + +### Client (User App) + +```bash +cd client +pnpm dev # Vite dev server on http://localhost:5173 (--host) +pnpm build # tsc -b && vite build +pnpm lint # ESLint +pnpm preview # Preview production build +``` + +User-facing React 19 app for browsing venues and booking. + +### Admin (Admin Dashboard) + +```bash +cd admin +pnpm dev # Vite dev server on http://localhost:5174 +pnpm build # tsc -b && vite build +pnpm lint # ESLint +pnpm preview # Preview production build +``` + +Owner/admin dashboard built with React 19 + Zustand + TanStack React Table. + +## Docker + +The project includes a server-only Docker Compose setup for local dev: + +```bash +docker compose up +``` + +This runs the server in a container, mapping host port 3000 to container port 3003. It reads `server/.env` for configuration and persists logs to `server/logs/`. + +Note: Docker Compose does NOT include MongoDB or the frontend apps — it's for smoke-testing the containerised server only. + +## Background Workers + +The server starts 3 background workers automatically: + +- **email.worker.ts** — Processes email tasks from the `email-task` MongoDB collection +- **banExpiry.worker.ts** — Handles automatic ban expiration +- **venueEditDeadline.worker.ts** — Manages venue edit deadlines + +## Testing + +```bash +# Run tests in current workspace +pnpm test + +# Run tests in all workspaces +pnpm -r test + +# Run a specific workspace command from root +pnpm --filter server exec +pnpm --filter client exec +pnpm --filter admin exec +``` + +- **Server**: vitest with `mongodb-memory-server` + `supertest` for integration tests +- **Client**: vitest with jsdom + @testing-library/react +- **Admin**: vitest with jsdom + @testing-library/react + +## Pre-commit / Pre-push + +- **pre-commit**: lint-staged (ESLint on staged files → `tsc --noEmit` → test per workspace) +- **pre-push**: ESLint + test + build on changed workspaces + +## Useful Commands + +```bash +pnpm install:all # Install all dependencies +pnpm build # Build all workspaces +pnpm lint # Lint all workspaces +pnpm format # Format code in all workspaces +``` + +## Troubleshooting + +- **"RBAC data missing" on server startup**: Run `pnpm script seed:rbac` in the server directory +- **Build failures**: Ensure you have the correct Node version (22+) and pnpm version (10.16.1) +- **MongoDB connection refused**: Verify MongoDB is running locally or check `MONGODB_URI` +- **Client can't reach API**: Check `VITE_API_BASE_URL` in `client/.env` diff --git a/admin/.gitignore b/admin/.gitignore new file mode 100644 index 0000000000..d7d77c98a0 --- /dev/null +++ b/admin/.gitignore @@ -0,0 +1,25 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local +*.env + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/admin/README.md b/admin/README.md new file mode 100644 index 0000000000..64ac86db9e --- /dev/null +++ b/admin/README.md @@ -0,0 +1,81 @@ +# BookMyVenue — Admin Dashboard + +The owner and admin dashboard for managing venues, bookings, users, and moderation. Built with React 19 + Vite 8 + Zustand + TanStack React Table. + +## Tech Stack + +- **Framework**: React 19 with TypeScript ~6.0 +- **Build Tool**: Vite 8 with rolldown +- **Styling**: TailwindCSS 4 +- **Routing**: React Router 7 +- **Server State**: TanStack React Query 5 +- **Client State**: Zustand 5 +- **HTTP Client**: Axios +- **Tables**: TanStack React Table 8 +- **Charts**: Recharts +- **UI Components**: Radix UI (Dialog, Slot, Tooltip), class-variance-authority +- **Date Handling**: date-fns, react-day-picker +- **Notifications**: react-hot-toast + +## Available Scripts + +| Script | Description | +|---|---| +| `pnpm dev` | Start Vite dev server (local only) | +| `pnpm build` | Type-check (`tsc -b`) then build (`vite build`) | +| `pnpm test` | Run vitest tests | +| `pnpm test:watch` | Run tests in watch mode | +| `pnpm test:coverage` | Run tests with coverage report | +| `pnpm lint` | ESLint check | +| `pnpm lint:fix` | Auto-fix ESLint issues | +| `pnpm preview` | Preview production build locally | + +## Development + +```bash +# Install dependencies (from repo root) +pnpm install + +# Start dev server (default: http://localhost:5174) +pnpm dev + +# Run tests +pnpm test +``` + +## Environment Variables + +Create `admin/.env`: + +```env +VITE_API_BASE_URL=http://localhost:3003/api/v1 +VITE_CLIENT_URL=http://localhost:5173 +``` + +## Project Structure + +``` +src/ +├── pages/ # Page components (routed) +├── components/ # Reusable UI components +│ └── guards/ # Auth guards (AuthGuard, RoleGuard, OwnerGuard) +├── hooks/ # Custom React hooks (useApi, useModal, useToast) +├── services/ # API service layer (Axios) +├── store/ # Zustand stores (useAuthStore, useAppStore, useModalStore) +├── utils/ # Utility functions +├── constants/ # App constants +├── types/ # TypeScript type definitions +├── tests/ # Vitest test files +├── config/ # Axios instance and query client config +├── App.tsx # Root app component +└── main.tsx # Entry point +``` + +## Key Differences from Client + +- Owner/admin dashboard (authenticated-only routes) +- Zustand for client state management (no React Context) +- TanStack React Table for data tables +- Recharts for analytics charts +- Auth guards (AuthGuard, RoleGuard, OwnerGuard) for route protection +- No map or animation libraries diff --git a/admin/components.json b/admin/components.json new file mode 100644 index 0000000000..0a5b2f70b4 --- /dev/null +++ b/admin/components.json @@ -0,0 +1,25 @@ +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "new-york", + "rsc": false, + "tsx": true, + "tailwind": { + "config": "", + "css": "src/index.css", + "baseColor": "zinc", + "cssVariables": true, + "prefix": "" + }, + "iconLibrary": "lucide", + "rtl": false, + "aliases": { + "components": "@/components", + "utils": "@/lib/utils", + "ui": "@/components/ui", + "lib": "@/lib", + "hooks": "@/hooks" + }, + "menuColor": "default", + "menuAccent": "subtle", + "registries": {} +} diff --git a/admin/eslint.config.js b/admin/eslint.config.js new file mode 100644 index 0000000000..8f99594dcc --- /dev/null +++ b/admin/eslint.config.js @@ -0,0 +1,44 @@ +import js from "@eslint/js"; +import globals from "globals"; +import reactHooks from "eslint-plugin-react-hooks"; +import reactRefresh from "eslint-plugin-react-refresh"; +import tseslint from "typescript-eslint"; +import { defineConfig, globalIgnores } from "eslint/config"; +import eslintComments from "@eslint-community/eslint-plugin-eslint-comments"; + +export default defineConfig([ + globalIgnores(["dist"]), + js.configs.recommended, + ...tseslint.configs.recommended, + reactHooks.configs.flat.recommended, + reactRefresh.configs.vite, + { + files: ["**/*.{ts,tsx}"], + plugins: { + "eslint-comments": eslintComments, + }, + languageOptions: { + globals: globals.browser, + parserOptions: { + tsconfigRootDir: import.meta.dirname, + }, + }, + rules: { + "eslint-comments/no-use": ["error", { allow: [] }], + "eslint-comments/no-unlimited-disable": "error", + "eslint-comments/no-unused-disable": "error", + "@typescript-eslint/no-explicit-any": "error", + "react-refresh/only-export-components": [ + "error", + { allowConstantExport: true }, + ], + }, + }, + { + files: ["src/components/ui/**/*.{ts,tsx}"], + rules: { + "react-refresh/only-export-components": "off", + "react-hooks/incompatible-library": "off" + } + } +]); diff --git a/admin/index.html b/admin/index.html new file mode 100644 index 0000000000..e11675168f --- /dev/null +++ b/admin/index.html @@ -0,0 +1,16 @@ + + + + + + + + + + BookMyVenue - Admin + + +

+ + + diff --git a/admin/package.json b/admin/package.json new file mode 100644 index 0000000000..ba6f35a2f3 --- /dev/null +++ b/admin/package.json @@ -0,0 +1,65 @@ +{ + "name": "admin", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc -b && vite build", + "test": "vitest run", + "test:watch": "vitest", + "test:coverage": "vitest run --coverage", + "lint": "eslint .", + "lint:fix": "eslint src/**/*.{ts,tsx} --fix", + "preview": "vite preview", + "format": "prettier --write src/**/*.{js,jsx,ts,tsx}" + }, + "dependencies": { + "@radix-ui/react-dialog": "^1.1.17", + "@radix-ui/react-slot": "^1.3.0", + "@radix-ui/react-tooltip": "^1.2.10", + "@tanstack/react-query": "^5.101.0", + "@tanstack/react-table": "^8.21.3", + "axios": "^1.17.0", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "date-fns": "^4.4.0", + "lucide-react": "^1.21.0", + "prettier": "3.8.3", + "radix-ui": "^1.6.0", + "react": "^19.2.6", + "react-day-picker": "^10.0.1", + "react-dom": "^19.2.6", + "react-hot-toast": "^2.6.0", + "react-router": "^7.16.0", + "recharts": "^3.9.0", + "tailwind-merge": "^3.6.0", + "zustand": "^5.0.14" + }, + "devDependencies": { + "@babel/core": "^7.29.0", + "@eslint-community/eslint-plugin-eslint-comments": "^4.7.2", + "@eslint/js": "^10.0.1", + "@rolldown/plugin-babel": "^0.2.3", + "@tailwindcss/vite": "^4.3.0", + "@testing-library/jest-dom": "^7.0.0", + "@testing-library/react": "^16.3.2", + "@testing-library/user-event": "^14.6.1", + "@types/babel__core": "^7.20.5", + "@types/node": "^24.12.3", + "@types/react": "^19.2.14", + "@types/react-dom": "^19.2.3", + "@vitejs/plugin-react": "^6.0.1", + "babel-plugin-react-compiler": "^1.0.0", + "eslint": "^10.3.0", + "eslint-plugin-react-hooks": "^7.1.1", + "eslint-plugin-react-refresh": "^0.5.2", + "globals": "^17.6.0", + "jsdom": "^29.1.1", + "tailwindcss": "^4.3.0", + "typescript": "~6.0.2", + "typescript-eslint": "^8.59.2", + "vite": "^8.0.12", + "vitest": "^4.1.10" + } +} diff --git a/admin/pnpm-lock.yaml b/admin/pnpm-lock.yaml new file mode 100644 index 0000000000..54e1de01ce --- /dev/null +++ b/admin/pnpm-lock.yaml @@ -0,0 +1,1788 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + react: + specifier: ^19.2.6 + version: 19.2.7 + react-dom: + specifier: ^19.2.6 + version: 19.2.7(react@19.2.7) + devDependencies: + '@babel/core': + specifier: ^7.29.0 + version: 7.29.7 + '@eslint/js': + specifier: ^10.0.1 + version: 10.0.1(eslint@10.4.1) + '@rolldown/plugin-babel': + specifier: ^0.2.3 + version: 0.2.3(@babel/core@7.29.7)(rolldown@1.0.3)(vite@8.0.16(@types/node@24.12.4)) + '@types/babel__core': + specifier: ^7.20.5 + version: 7.20.5 + '@types/node': + specifier: ^24.12.3 + version: 24.12.4 + '@types/react': + specifier: ^19.2.14 + version: 19.2.16 + '@types/react-dom': + specifier: ^19.2.3 + version: 19.2.3(@types/react@19.2.16) + '@vitejs/plugin-react': + specifier: ^6.0.1 + version: 6.0.2(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(rolldown@1.0.3)(vite@8.0.16(@types/node@24.12.4)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.16(@types/node@24.12.4)) + babel-plugin-react-compiler: + specifier: ^1.0.0 + version: 1.0.0 + eslint: + specifier: ^10.3.0 + version: 10.4.1 + eslint-plugin-react-hooks: + specifier: ^7.1.1 + version: 7.1.1(eslint@10.4.1) + eslint-plugin-react-refresh: + specifier: ^0.5.2 + version: 0.5.2(eslint@10.4.1) + globals: + specifier: ^17.6.0 + version: 17.6.0 + typescript: + specifier: ~6.0.2 + version: 6.0.3 + typescript-eslint: + specifier: ^8.59.2 + version: 8.60.1(eslint@10.4.1)(typescript@6.0.3) + vite: + specifier: ^8.0.12 + version: 8.0.16(@types/node@24.12.4) + +packages: + + '@babel/code-frame@7.29.7': + resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.29.7': + resolution: {integrity: sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.29.7': + resolution: {integrity: sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.29.7': + resolution: {integrity: sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.29.7': + resolution: {integrity: sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==} + engines: {node: '>=6.9.0'} + + '@babel/helper-globals@7.29.7': + resolution: {integrity: sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.29.7': + resolution: {integrity: sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.29.7': + resolution: {integrity: sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-string-parser@7.29.7': + resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.29.7': + resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.29.7': + resolution: {integrity: sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.29.7': + resolution: {integrity: sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.29.7': + resolution: {integrity: sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/template@7.29.7': + resolution: {integrity: sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.29.7': + resolution: {integrity: sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.29.7': + resolution: {integrity: sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==} + engines: {node: '>=6.9.0'} + + '@emnapi/core@1.10.0': + resolution: {integrity: sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==} + + '@emnapi/runtime@1.10.0': + resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==} + + '@emnapi/wasi-threads@1.2.1': + resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} + + '@eslint-community/eslint-utils@4.9.1': + resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.12.2': + resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/config-array@0.23.5': + resolution: {integrity: sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + '@eslint/config-helpers@0.6.0': + resolution: {integrity: sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + '@eslint/core@1.2.1': + resolution: {integrity: sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + '@eslint/js@10.0.1': + resolution: {integrity: sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + peerDependencies: + eslint: ^10.0.0 + peerDependenciesMeta: + eslint: + optional: true + + '@eslint/object-schema@3.0.5': + resolution: {integrity: sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + '@eslint/plugin-kit@0.7.2': + resolution: {integrity: sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + '@humanfs/core@0.19.2': + resolution: {integrity: sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.8': + resolution: {integrity: sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==} + engines: {node: '>=18.18.0'} + + '@humanfs/types@0.15.0': + resolution: {integrity: sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==} + engines: {node: '>=18.18.0'} + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/retry@0.4.3': + resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} + engines: {node: '>=18.18'} + + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + + '@napi-rs/wasm-runtime@1.1.4': + resolution: {integrity: sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==} + peerDependencies: + '@emnapi/core': ^1.7.1 + '@emnapi/runtime': ^1.7.1 + + '@oxc-project/types@0.133.0': + resolution: {integrity: sha512-KzkdCd6Uxqnf6l3HOw1xfatAlUURA0g14cvBYFyJ5SaNOQbOUvBr9PKArcPcrNIeRsBdgcUzOGrhKveVpvOIGA==} + + '@rolldown/binding-android-arm64@1.0.3': + resolution: {integrity: sha512-454rs7jHngixp/NMxd5srYD57OnzSlZ/eFTETjORQHLwJG1lRtmNOJcBerZlfu4GjKqeq8aCCIQrMdHyhI51Hw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@rolldown/binding-darwin-arm64@1.0.3': + resolution: {integrity: sha512-PcAhP+ynjURNyy8SKGl5DQP94aGuB/7JrXJb/t7P+hanXvQVMWzUvRRhBAcg/lNRadBhoUPqSoP4xw5tR/KBEA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@rolldown/binding-darwin-x64@1.0.3': + resolution: {integrity: sha512-9YpfeUvSE2RS7wysJ81uOZkXJz7f7Q55H2Gvp3VEw/EsahqDtrphrZ0EwDLK5vvKOzaCrBsjF8JmnMLcUt78Gg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@rolldown/binding-freebsd-x64@1.0.3': + resolution: {integrity: sha512-yB1IlAsSNHncV6SCTL27/MVGR5htvQsoGxIv5KMGXALp+Ll1wYsn+x98M9MW7qa+NdSbvrrY7ANI4wLJ0n1e6g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@rolldown/binding-linux-arm-gnueabihf@1.0.3': + resolution: {integrity: sha512-Yi30IVAAfLUCy2MseFjbB1jAMDl1VMCAas5StnYp8da9+CKvMd2H2cbEjWcw5NPaPqzvYkVIaF1nNUG+b7u/sw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@rolldown/binding-linux-arm64-gnu@1.0.3': + resolution: {integrity: sha512-jsO7R8To+AdlYgUmN5sHSCZbfhtMBkO0WUx8iORQnPcMMdgr7qM2DQmMwgabs3GhNztdmoKkMKQFHD6DTMCIQw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@rolldown/binding-linux-arm64-musl@1.0.3': + resolution: {integrity: sha512-VWkUHwWriDciit80wleYwKILoR/KMvxh/IdwS/paX+ZgpuRpCrKLUdadJbc0NpBEiyhpYawsJ73j9aCvOH+f7Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@rolldown/binding-linux-ppc64-gnu@1.0.3': + resolution: {integrity: sha512-5f1laC0SlIR0yDbFCd8acUhvJIag6N3zC5P7oUPN6wX0aOma+uKJ0wBDH5aq7I1PVI2ttTlhJwzwRIBnLiSGEg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + + '@rolldown/binding-linux-s390x-gnu@1.0.3': + resolution: {integrity: sha512-Iq4ko0r4XsgbrF/LunNgHtAGLRRVE2kXonAXQ/MV0mC6jQpMOhW1SvtZja2EhC/kd05++bP78dsqBeIQyYJ6Yg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + + '@rolldown/binding-linux-x64-gnu@1.0.3': + resolution: {integrity: sha512-B8m6tD5+/N5FeNQFbKlLA/2yVq9ycQP1SeedyEYYKWBNR3ZQbkvIUcNnDNM03lO1l5F2roiiFJGgvoLLyZXtSg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@rolldown/binding-linux-x64-musl@1.0.3': + resolution: {integrity: sha512-pSdpdUJHkuCxun9LE7jvgUB9qsRgaiyNNCX7m/AvHTcq67AiT/Yhoxvw5zPfhrM8k/BfP8ce/hMOpthKDpEUow==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@rolldown/binding-openharmony-arm64@1.0.3': + resolution: {integrity: sha512-OXXS3RKJgX2uLwM+gYyuH5omcH8fL1LJs96pZGgtetVCahON57+d4SJHzTgZiOjxgGkSnpXpOsWuPDGAKAigEg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@rolldown/binding-wasm32-wasi@1.0.3': + resolution: {integrity: sha512-JTtb8BWFynicNSoPrehsCzBtOKjZ6jhMiPFEmOiuXg1Fl8dn2KHQob+GuPSGR0dryQa1PQJbzjF3dqO/whhjLg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [wasm32] + + '@rolldown/binding-win32-arm64-msvc@1.0.3': + resolution: {integrity: sha512-gEdFFEN70A/jxb2svrWsN3aDL7OUtmvlOy+6fa2jxG8K0wQ1ZbdeLGnidov6Yu5/733dI5ySfzFlQ/cb0bSz1g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@rolldown/binding-win32-x64-msvc@1.0.3': + resolution: {integrity: sha512-eXB7CHuaQdqmJcc3koCNtNPmT/bj2gc999kUFgBxG8Ac0NdgXc4rkCHhqrgrhN3zddvvvrgzj1e90SuSfmyIXA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@rolldown/plugin-babel@0.2.3': + resolution: {integrity: sha512-+zEk16yGlz1F9STiRr6uG9hmIXb6nprjLczV/htGptYuLoCuxb+itZ03RKCEeOhBpDDd1NU7qF6x1VLMUp62bw==} + engines: {node: '>=22.12.0 || ^24.0.0'} + peerDependencies: + '@babel/core': ^7.29.0 || ^8.0.0-rc.1 + '@babel/plugin-transform-runtime': ^7.29.0 || ^8.0.0-rc.1 + '@babel/runtime': ^7.27.0 || ^8.0.0-rc.1 + rolldown: ^1.0.0-rc.5 + vite: ^8.0.0 + peerDependenciesMeta: + '@babel/plugin-transform-runtime': + optional: true + '@babel/runtime': + optional: true + vite: + optional: true + + '@rolldown/pluginutils@1.0.1': + resolution: {integrity: sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==} + + '@tybys/wasm-util@0.10.2': + resolution: {integrity: sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==} + + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + + '@types/babel__generator@7.27.0': + resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} + + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + + '@types/babel__traverse@7.28.0': + resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} + + '@types/esrecurse@4.3.1': + resolution: {integrity: sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==} + + '@types/estree@1.0.9': + resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/node@24.12.4': + resolution: {integrity: sha512-GUUEShf+PBCGW2KaXwcIt3Yk+e3pkKwWKb9GSyM9WQVE+ep2jzmHdGsHzu4wgcZy5fN9FBdVzjpBQsYlpfpgLA==} + + '@types/react-dom@19.2.3': + resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==} + peerDependencies: + '@types/react': ^19.2.0 + + '@types/react@19.2.16': + resolution: {integrity: sha512-esJiCAnl0kfpNdE69f3So4WJUXy95dLZydX0KwK46riIHDzHM7O9Vtf9xCHW0PXIqvgqNrswl522kA/5yx+F4w==} + + '@typescript-eslint/eslint-plugin@8.60.1': + resolution: {integrity: sha512-JQ4S5GB0tfjO8BuJ4fcX+HodkzJjYBV+7OJ+wLygaX7OGQ7FudyHL4NSCA6ob+w3Yn+5MkKIozOwQhXeM7opVg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.60.1 + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/parser@8.60.1': + resolution: {integrity: sha512-A0M6ua6H252bVjPvvtSgl2QA4+ET9S5Mtkb2GDyTxIhH/C4qDItT7RQNO5PhMC6NXGYXOR9dIalcDDgBKT7oFA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/project-service@8.60.1': + resolution: {integrity: sha512-eXkTH2bxmXlqD1RnOPmLZ9ZM9D3VwSx04JOwBnP9RQ+yUA5a2Mu7SfW8uaV2Aon53NJzZlZYuX7tn91Izf+xaw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/scope-manager@8.60.1': + resolution: {integrity: sha512-gvI5OQoptnxQnchOirukCuQ55svJSTuD/4k5+pC267xyBtYry748R9/c3tYUzb/iE6RZfllRz2lVulLCHkTm4w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/tsconfig-utils@8.60.1': + resolution: {integrity: sha512-nh8w4qAteiKuZu3pSSzG/yGKpw0OlkrKnzFmbVRenKaD4qc+7i1GrmZaLVkr8rk4uipiPGMOW4YsM6WmKZ5CvA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/type-utils@8.60.1': + resolution: {integrity: sha512-sdwTrpjosW7ANQYJ39ZBF1ZyEMEGVB2UsikrserVM/30a/F1dTLnu9bGxEdosugyu5caigjLrR2qiD11asjI1A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/types@8.60.1': + resolution: {integrity: sha512-4h0tY8ppCkdCzcrl2YM5M3my0xsE1Tf8om3owEu5oPWmXwkKRmk0j0LGDzYBGUcAlesEbxBhazqu/K4cu3Ug7w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/typescript-estree@8.60.1': + resolution: {integrity: sha512-alpRkfG8hlVE5kdJW2GkfgDgXxold3e8e4l6EnmhRmRLbekgAPCCGDVD++sABy9FcgPFroq+uFcCSM1vR57Cew==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/utils@8.60.1': + resolution: {integrity: sha512-h2MPBLoNtjc3qZWfY3Tl51yPorQ2McHn8pJfcMNTcIvrrZrr90Ykffit0yjrPFWQcRcUxzH20+6OcVdW4yHtUg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/visitor-keys@8.60.1': + resolution: {integrity: sha512-EbGRQg4FhrmwLodl+t3JNAnXHWVr9Vp+Zl1QBZVPY4ByfkzIT8cX3K6QWODHtkIZqqJVEWvhHSx3v5PDHsaQag==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@vitejs/plugin-react@6.0.2': + resolution: {integrity: sha512-DlSMqo4WhThw4vB8Mpn0Woe9J+Jfq1geJ61AKW0QEgLzGMNwtIMdxbDUzLxcun8W7NbJO0e2Jg/Nxm3cCSVzzg==} + engines: {node: ^20.19.0 || >=22.12.0} + peerDependencies: + '@rolldown/plugin-babel': ^0.1.7 || ^0.2.0 + babel-plugin-react-compiler: ^1.0.0 + vite: ^8.0.0 + peerDependenciesMeta: + '@rolldown/plugin-babel': + optional: true + babel-plugin-react-compiler: + optional: true + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.16.0: + resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} + engines: {node: '>=0.4.0'} + hasBin: true + + ajv@6.15.0: + resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==} + + babel-plugin-react-compiler@1.0.0: + resolution: {integrity: sha512-Ixm8tFfoKKIPYdCCKYTsqv+Fd4IJ0DQqMyEimo+pxUOMUR9cVPlwTrFt9Avu+3cb6Zp3mAzl+t1MrG2fxxKsxw==} + + balanced-match@4.0.4: + resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} + engines: {node: 18 || 20 || >=22} + + baseline-browser-mapping@2.10.33: + resolution: {integrity: sha512-bA6+tcSLpz2tIEdDXZPpPTIuxBcC4+w6SieaYyfigIa4h8GlFxbA17v22Vx3JUtuZQj9SgOsnbK+aTBzyDyEuw==} + engines: {node: '>=6.0.0'} + hasBin: true + + brace-expansion@5.0.6: + resolution: {integrity: sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==} + engines: {node: 18 || 20 || >=22} + + browserslist@4.28.2: + resolution: {integrity: sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + caniuse-lite@1.0.30001793: + resolution: {integrity: sha512-iwSsYWaCOoh26cV8NwNRViHlrfUvYsHDfRVcbtmw0Kg6PJIZZXwMkj1442FYLBGkeUf1juAsU3DTfxW579mrPA==} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} + + electron-to-chromium@1.5.364: + resolution: {integrity: sha512-G/dYE3+AYhyHwzTwg8UbnXf7zqMERYh7l2jJ3QujhFsH8agSYwtnGAR2aZ7f0AakIKJXd5En/Hre4igIUrdlYw==} + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + eslint-plugin-react-hooks@7.1.1: + resolution: {integrity: sha512-f2I7Gw6JbvCexzIInuSbZpfdQ44D7iqdWX01FKLvrPgqxoE7oMj8clOfto8U6vYiz4yd5oKu39rRSVOe1zRu0g==} + engines: {node: '>=18'} + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 || ^10.0.0 + + eslint-plugin-react-refresh@0.5.2: + resolution: {integrity: sha512-hmgTH57GfzoTFjVN0yBwTggnsVUF2tcqi7RJZHqi9lIezSs4eFyAMktA68YD4r5kNw1mxyY4dmkyoFDb3FIqrA==} + peerDependencies: + eslint: ^9 || ^10 + + eslint-scope@9.1.2: + resolution: {integrity: sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@5.0.1: + resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + eslint@10.4.1: + resolution: {integrity: sha512-AyIKhnOBuOAdueD7RB3xB+YeAWScb9jHsJBgH2Hcde8InP5JYhqrRR6iTMHyTEwgENK54Cp44e4v8BwNhsuHuw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true + + espree@11.2.0: + resolution: {integrity: sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + esquery@1.7.0: + resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} + + flatted@3.4.2: + resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + globals@17.6.0: + resolution: {integrity: sha512-sepffkT8stwnIYbsMBpoCHJuJM5l98FUF2AnE07hfvE0m/qp3R586hw4jF4uadbhvg1ooIdzuu7CsfD2jzCaNA==} + engines: {node: '>=18'} + + hermes-estree@0.25.1: + resolution: {integrity: sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==} + + hermes-parser@0.25.1: + resolution: {integrity: sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + ignore@7.0.5: + resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} + engines: {node: '>= 4'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + lightningcss-android-arm64@1.32.0: + resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [android] + + lightningcss-darwin-arm64@1.32.0: + resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.32.0: + resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.32.0: + resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.32.0: + resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.32.0: + resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-arm64-musl@1.32.0: + resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-x64-gnu@1.32.0: + resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-linux-x64-musl@1.32.0: + resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-win32-arm64-msvc@1.32.0: + resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.32.0: + resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.32.0: + resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==} + engines: {node: '>= 12.0.0'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + minimatch@10.2.5: + resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} + engines: {node: 18 || 20 || >=22} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + nanoid@3.3.12: + resolution: {integrity: sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + node-releases@2.0.46: + resolution: {integrity: sha512-GYVXHE2KnrzAfsAjl4uP++evGFCrAU1jta4ubEjIG7YWt/64Gqv66a30yKwWczVjA6j3bM4nBwH7Pk1JmDHaxQ==} + engines: {node: '>=18'} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@4.0.4: + resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} + engines: {node: '>=12'} + + postcss@8.5.15: + resolution: {integrity: sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==} + engines: {node: ^10 || ^12 || >=14} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + react-dom@19.2.7: + resolution: {integrity: sha512-t0BRVXvbiE/o20Hfw669rLbMCDWtYZLvmJigy2f0MxsXF+71pxhR3xOkspmsO8h3ZlNzyibAmtCa3l4lYKk6gQ==} + peerDependencies: + react: ^19.2.7 + + react@19.2.7: + resolution: {integrity: sha512-HNe9WslTbXmFK8o8cmwgAeJFSBvt1bPdHCVKtaaV+WlAN36mpT4hcRpwbf3fY56ar2oIXzsBpOAiIRHAdY0OlQ==} + engines: {node: '>=0.10.0'} + + rolldown@1.0.3: + resolution: {integrity: sha512-i00lAJ2ks1BYr7rjNjKC7BcqAS7nVfiT3QX1SI5aY+AFHblCmaUf9OE9dbdzDvW6dJxbi2ZCZiy9v3CcwOiX3g==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + + scheduler@0.27.0: + resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.8.1: + resolution: {integrity: sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==} + engines: {node: '>=10'} + hasBin: true + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + tinyglobby@0.2.17: + resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} + engines: {node: '>=12.0.0'} + + ts-api-utils@2.5.0: + resolution: {integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==} + engines: {node: '>=18.12'} + peerDependencies: + typescript: '>=4.8.4' + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + typescript-eslint@8.60.1: + resolution: {integrity: sha512-6m5hkkRAp8lKvhVpcprAIn5KkehQEh+47oHH2VGnExEh7dhNxXlg6GPAOIu6TxbVQxhebrJDvjl3020ooiWCMA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + + typescript@6.0.3: + resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==} + engines: {node: '>=14.17'} + hasBin: true + + undici-types@7.16.0: + resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} + + update-browserslist-db@1.2.3: + resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + vite@8.0.16: + resolution: {integrity: sha512-h9bXPmJichP5fLmVQo3PyaGSDE2n3aPuomeAlVRm0JLmt4rY6zmPKd59HYI4LNW8oTK7tlTsuC7l/m7awx9Jcw==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + '@vitejs/devtools': ^0.1.18 + esbuild: ^0.27.0 || ^0.28.0 + jiti: '>=1.21.0' + less: ^4.0.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + '@vitejs/devtools': + optional: true + esbuild: + optional: true + jiti: + optional: true + less: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + zod-validation-error@4.0.2: + resolution: {integrity: sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==} + engines: {node: '>=18.0.0'} + peerDependencies: + zod: ^3.25.0 || ^4.0.0 + + zod@4.4.3: + resolution: {integrity: sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==} + +snapshots: + + '@babel/code-frame@7.29.7': + dependencies: + '@babel/helper-validator-identifier': 7.29.7 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.29.7': {} + + '@babel/core@7.29.7': + dependencies: + '@babel/code-frame': 7.29.7 + '@babel/generator': 7.29.7 + '@babel/helper-compilation-targets': 7.29.7 + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7) + '@babel/helpers': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/template': 7.29.7 + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 + '@jridgewell/remapping': 2.3.5 + convert-source-map: 2.0.0 + debug: 4.4.3 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.29.7': + dependencies: + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.1.0 + + '@babel/helper-compilation-targets@7.29.7': + dependencies: + '@babel/compat-data': 7.29.7 + '@babel/helper-validator-option': 7.29.7 + browserslist: 4.28.2 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-globals@7.29.7': {} + + '@babel/helper-module-imports@7.29.7': + dependencies: + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-module-imports': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + '@babel/traverse': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/helper-string-parser@7.29.7': {} + + '@babel/helper-validator-identifier@7.29.7': {} + + '@babel/helper-validator-option@7.29.7': {} + + '@babel/helpers@7.29.7': + dependencies: + '@babel/template': 7.29.7 + '@babel/types': 7.29.7 + + '@babel/parser@7.29.7': + dependencies: + '@babel/types': 7.29.7 + + '@babel/template@7.29.7': + dependencies: + '@babel/code-frame': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 + + '@babel/traverse@7.29.7': + dependencies: + '@babel/code-frame': 7.29.7 + '@babel/generator': 7.29.7 + '@babel/helper-globals': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/template': 7.29.7 + '@babel/types': 7.29.7 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.29.7': + dependencies: + '@babel/helper-string-parser': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + + '@emnapi/core@1.10.0': + dependencies: + '@emnapi/wasi-threads': 1.2.1 + tslib: 2.8.1 + optional: true + + '@emnapi/runtime@1.10.0': + dependencies: + tslib: 2.8.1 + optional: true + + '@emnapi/wasi-threads@1.2.1': + dependencies: + tslib: 2.8.1 + optional: true + + '@eslint-community/eslint-utils@4.9.1(eslint@10.4.1)': + dependencies: + eslint: 10.4.1 + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.2': {} + + '@eslint/config-array@0.23.5': + dependencies: + '@eslint/object-schema': 3.0.5 + debug: 4.4.3 + minimatch: 10.2.5 + transitivePeerDependencies: + - supports-color + + '@eslint/config-helpers@0.6.0': + dependencies: + '@eslint/core': 1.2.1 + + '@eslint/core@1.2.1': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/js@10.0.1(eslint@10.4.1)': + optionalDependencies: + eslint: 10.4.1 + + '@eslint/object-schema@3.0.5': {} + + '@eslint/plugin-kit@0.7.2': + dependencies: + '@eslint/core': 1.2.1 + levn: 0.4.1 + + '@humanfs/core@0.19.2': + dependencies: + '@humanfs/types': 0.15.0 + + '@humanfs/node@0.16.8': + dependencies: + '@humanfs/core': 0.19.2 + '@humanfs/types': 0.15.0 + '@humanwhocodes/retry': 0.4.3 + + '@humanfs/types@0.15.0': {} + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/retry@0.4.3': {} + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@napi-rs/wasm-runtime@1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': + dependencies: + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 + '@tybys/wasm-util': 0.10.2 + optional: true + + '@oxc-project/types@0.133.0': {} + + '@rolldown/binding-android-arm64@1.0.3': + optional: true + + '@rolldown/binding-darwin-arm64@1.0.3': + optional: true + + '@rolldown/binding-darwin-x64@1.0.3': + optional: true + + '@rolldown/binding-freebsd-x64@1.0.3': + optional: true + + '@rolldown/binding-linux-arm-gnueabihf@1.0.3': + optional: true + + '@rolldown/binding-linux-arm64-gnu@1.0.3': + optional: true + + '@rolldown/binding-linux-arm64-musl@1.0.3': + optional: true + + '@rolldown/binding-linux-ppc64-gnu@1.0.3': + optional: true + + '@rolldown/binding-linux-s390x-gnu@1.0.3': + optional: true + + '@rolldown/binding-linux-x64-gnu@1.0.3': + optional: true + + '@rolldown/binding-linux-x64-musl@1.0.3': + optional: true + + '@rolldown/binding-openharmony-arm64@1.0.3': + optional: true + + '@rolldown/binding-wasm32-wasi@1.0.3': + dependencies: + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 + '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + optional: true + + '@rolldown/binding-win32-arm64-msvc@1.0.3': + optional: true + + '@rolldown/binding-win32-x64-msvc@1.0.3': + optional: true + + '@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(rolldown@1.0.3)(vite@8.0.16(@types/node@24.12.4))': + dependencies: + '@babel/core': 7.29.7 + picomatch: 4.0.4 + rolldown: 1.0.3 + optionalDependencies: + vite: 8.0.16(@types/node@24.12.4) + + '@rolldown/pluginutils@1.0.1': {} + + '@tybys/wasm-util@0.10.2': + dependencies: + tslib: 2.8.1 + optional: true + + '@types/babel__core@7.20.5': + dependencies: + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 + '@types/babel__generator': 7.27.0 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.28.0 + + '@types/babel__generator@7.27.0': + dependencies: + '@babel/types': 7.29.7 + + '@types/babel__template@7.4.4': + dependencies: + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 + + '@types/babel__traverse@7.28.0': + dependencies: + '@babel/types': 7.29.7 + + '@types/esrecurse@4.3.1': {} + + '@types/estree@1.0.9': {} + + '@types/json-schema@7.0.15': {} + + '@types/node@24.12.4': + dependencies: + undici-types: 7.16.0 + + '@types/react-dom@19.2.3(@types/react@19.2.16)': + dependencies: + '@types/react': 19.2.16 + + '@types/react@19.2.16': + dependencies: + csstype: 3.2.3 + + '@typescript-eslint/eslint-plugin@8.60.1(@typescript-eslint/parser@8.60.1(eslint@10.4.1)(typescript@6.0.3))(eslint@10.4.1)(typescript@6.0.3)': + dependencies: + '@eslint-community/regexpp': 4.12.2 + '@typescript-eslint/parser': 8.60.1(eslint@10.4.1)(typescript@6.0.3) + '@typescript-eslint/scope-manager': 8.60.1 + '@typescript-eslint/type-utils': 8.60.1(eslint@10.4.1)(typescript@6.0.3) + '@typescript-eslint/utils': 8.60.1(eslint@10.4.1)(typescript@6.0.3) + '@typescript-eslint/visitor-keys': 8.60.1 + eslint: 10.4.1 + ignore: 7.0.5 + natural-compare: 1.4.0 + ts-api-utils: 2.5.0(typescript@6.0.3) + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@8.60.1(eslint@10.4.1)(typescript@6.0.3)': + dependencies: + '@typescript-eslint/scope-manager': 8.60.1 + '@typescript-eslint/types': 8.60.1 + '@typescript-eslint/typescript-estree': 8.60.1(typescript@6.0.3) + '@typescript-eslint/visitor-keys': 8.60.1 + debug: 4.4.3 + eslint: 10.4.1 + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/project-service@8.60.1(typescript@6.0.3)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.60.1(typescript@6.0.3) + '@typescript-eslint/types': 8.60.1 + debug: 4.4.3 + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@8.60.1': + dependencies: + '@typescript-eslint/types': 8.60.1 + '@typescript-eslint/visitor-keys': 8.60.1 + + '@typescript-eslint/tsconfig-utils@8.60.1(typescript@6.0.3)': + dependencies: + typescript: 6.0.3 + + '@typescript-eslint/type-utils@8.60.1(eslint@10.4.1)(typescript@6.0.3)': + dependencies: + '@typescript-eslint/types': 8.60.1 + '@typescript-eslint/typescript-estree': 8.60.1(typescript@6.0.3) + '@typescript-eslint/utils': 8.60.1(eslint@10.4.1)(typescript@6.0.3) + debug: 4.4.3 + eslint: 10.4.1 + ts-api-utils: 2.5.0(typescript@6.0.3) + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@8.60.1': {} + + '@typescript-eslint/typescript-estree@8.60.1(typescript@6.0.3)': + dependencies: + '@typescript-eslint/project-service': 8.60.1(typescript@6.0.3) + '@typescript-eslint/tsconfig-utils': 8.60.1(typescript@6.0.3) + '@typescript-eslint/types': 8.60.1 + '@typescript-eslint/visitor-keys': 8.60.1 + debug: 4.4.3 + minimatch: 10.2.5 + semver: 7.8.1 + tinyglobby: 0.2.17 + ts-api-utils: 2.5.0(typescript@6.0.3) + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.60.1(eslint@10.4.1)(typescript@6.0.3)': + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@10.4.1) + '@typescript-eslint/scope-manager': 8.60.1 + '@typescript-eslint/types': 8.60.1 + '@typescript-eslint/typescript-estree': 8.60.1(typescript@6.0.3) + eslint: 10.4.1 + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/visitor-keys@8.60.1': + dependencies: + '@typescript-eslint/types': 8.60.1 + eslint-visitor-keys: 5.0.1 + + '@vitejs/plugin-react@6.0.2(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(rolldown@1.0.3)(vite@8.0.16(@types/node@24.12.4)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.16(@types/node@24.12.4))': + dependencies: + '@rolldown/pluginutils': 1.0.1 + vite: 8.0.16(@types/node@24.12.4) + optionalDependencies: + '@rolldown/plugin-babel': 0.2.3(@babel/core@7.29.7)(rolldown@1.0.3)(vite@8.0.16(@types/node@24.12.4)) + babel-plugin-react-compiler: 1.0.0 + + acorn-jsx@5.3.2(acorn@8.16.0): + dependencies: + acorn: 8.16.0 + + acorn@8.16.0: {} + + ajv@6.15.0: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + babel-plugin-react-compiler@1.0.0: + dependencies: + '@babel/types': 7.29.7 + + balanced-match@4.0.4: {} + + baseline-browser-mapping@2.10.33: {} + + brace-expansion@5.0.6: + dependencies: + balanced-match: 4.0.4 + + browserslist@4.28.2: + dependencies: + baseline-browser-mapping: 2.10.33 + caniuse-lite: 1.0.30001793 + electron-to-chromium: 1.5.364 + node-releases: 2.0.46 + update-browserslist-db: 1.2.3(browserslist@4.28.2) + + caniuse-lite@1.0.30001793: {} + + convert-source-map@2.0.0: {} + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + csstype@3.2.3: {} + + debug@4.4.3: + dependencies: + ms: 2.1.3 + + deep-is@0.1.4: {} + + detect-libc@2.1.2: {} + + electron-to-chromium@1.5.364: {} + + escalade@3.2.0: {} + + escape-string-regexp@4.0.0: {} + + eslint-plugin-react-hooks@7.1.1(eslint@10.4.1): + dependencies: + '@babel/core': 7.29.7 + '@babel/parser': 7.29.7 + eslint: 10.4.1 + hermes-parser: 0.25.1 + zod: 4.4.3 + zod-validation-error: 4.0.2(zod@4.4.3) + transitivePeerDependencies: + - supports-color + + eslint-plugin-react-refresh@0.5.2(eslint@10.4.1): + dependencies: + eslint: 10.4.1 + + eslint-scope@9.1.2: + dependencies: + '@types/esrecurse': 4.3.1 + '@types/estree': 1.0.9 + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint-visitor-keys@5.0.1: {} + + eslint@10.4.1: + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@10.4.1) + '@eslint-community/regexpp': 4.12.2 + '@eslint/config-array': 0.23.5 + '@eslint/config-helpers': 0.6.0 + '@eslint/core': 1.2.1 + '@eslint/plugin-kit': 0.7.2 + '@humanfs/node': 0.16.8 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.4.3 + '@types/estree': 1.0.9 + ajv: 6.15.0 + cross-spawn: 7.0.6 + debug: 4.4.3 + escape-string-regexp: 4.0.0 + eslint-scope: 9.1.2 + eslint-visitor-keys: 5.0.1 + espree: 11.2.0 + esquery: 1.7.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 8.0.0 + find-up: 5.0.0 + glob-parent: 6.0.2 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + json-stable-stringify-without-jsonify: 1.0.1 + minimatch: 10.2.5 + natural-compare: 1.4.0 + optionator: 0.9.4 + transitivePeerDependencies: + - supports-color + + espree@11.2.0: + dependencies: + acorn: 8.16.0 + acorn-jsx: 5.3.2(acorn@8.16.0) + eslint-visitor-keys: 5.0.1 + + esquery@1.7.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@5.3.0: {} + + esutils@2.0.3: {} + + fast-deep-equal@3.1.3: {} + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fdir@6.5.0(picomatch@4.0.4): + optionalDependencies: + picomatch: 4.0.4 + + file-entry-cache@8.0.0: + dependencies: + flat-cache: 4.0.1 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + flat-cache@4.0.1: + dependencies: + flatted: 3.4.2 + keyv: 4.5.4 + + flatted@3.4.2: {} + + fsevents@2.3.3: + optional: true + + gensync@1.0.0-beta.2: {} + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + globals@17.6.0: {} + + hermes-estree@0.25.1: {} + + hermes-parser@0.25.1: + dependencies: + hermes-estree: 0.25.1 + + ignore@5.3.2: {} + + ignore@7.0.5: {} + + imurmurhash@0.1.4: {} + + is-extglob@2.1.1: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + isexe@2.0.0: {} + + js-tokens@4.0.0: {} + + jsesc@3.1.0: {} + + json-buffer@3.0.1: {} + + json-schema-traverse@0.4.1: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + json5@2.2.3: {} + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + lightningcss-android-arm64@1.32.0: + optional: true + + lightningcss-darwin-arm64@1.32.0: + optional: true + + lightningcss-darwin-x64@1.32.0: + optional: true + + lightningcss-freebsd-x64@1.32.0: + optional: true + + lightningcss-linux-arm-gnueabihf@1.32.0: + optional: true + + lightningcss-linux-arm64-gnu@1.32.0: + optional: true + + lightningcss-linux-arm64-musl@1.32.0: + optional: true + + lightningcss-linux-x64-gnu@1.32.0: + optional: true + + lightningcss-linux-x64-musl@1.32.0: + optional: true + + lightningcss-win32-arm64-msvc@1.32.0: + optional: true + + lightningcss-win32-x64-msvc@1.32.0: + optional: true + + lightningcss@1.32.0: + dependencies: + detect-libc: 2.1.2 + optionalDependencies: + lightningcss-android-arm64: 1.32.0 + lightningcss-darwin-arm64: 1.32.0 + lightningcss-darwin-x64: 1.32.0 + lightningcss-freebsd-x64: 1.32.0 + lightningcss-linux-arm-gnueabihf: 1.32.0 + lightningcss-linux-arm64-gnu: 1.32.0 + lightningcss-linux-arm64-musl: 1.32.0 + lightningcss-linux-x64-gnu: 1.32.0 + lightningcss-linux-x64-musl: 1.32.0 + lightningcss-win32-arm64-msvc: 1.32.0 + lightningcss-win32-x64-msvc: 1.32.0 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + minimatch@10.2.5: + dependencies: + brace-expansion: 5.0.6 + + ms@2.1.3: {} + + nanoid@3.3.12: {} + + natural-compare@1.4.0: {} + + node-releases@2.0.46: {} + + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + path-exists@4.0.0: {} + + path-key@3.1.1: {} + + picocolors@1.1.1: {} + + picomatch@4.0.4: {} + + postcss@8.5.15: + dependencies: + nanoid: 3.3.12 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + prelude-ls@1.2.1: {} + + punycode@2.3.1: {} + + react-dom@19.2.7(react@19.2.7): + dependencies: + react: 19.2.7 + scheduler: 0.27.0 + + react@19.2.7: {} + + rolldown@1.0.3: + dependencies: + '@oxc-project/types': 0.133.0 + '@rolldown/pluginutils': 1.0.1 + optionalDependencies: + '@rolldown/binding-android-arm64': 1.0.3 + '@rolldown/binding-darwin-arm64': 1.0.3 + '@rolldown/binding-darwin-x64': 1.0.3 + '@rolldown/binding-freebsd-x64': 1.0.3 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.3 + '@rolldown/binding-linux-arm64-gnu': 1.0.3 + '@rolldown/binding-linux-arm64-musl': 1.0.3 + '@rolldown/binding-linux-ppc64-gnu': 1.0.3 + '@rolldown/binding-linux-s390x-gnu': 1.0.3 + '@rolldown/binding-linux-x64-gnu': 1.0.3 + '@rolldown/binding-linux-x64-musl': 1.0.3 + '@rolldown/binding-openharmony-arm64': 1.0.3 + '@rolldown/binding-wasm32-wasi': 1.0.3 + '@rolldown/binding-win32-arm64-msvc': 1.0.3 + '@rolldown/binding-win32-x64-msvc': 1.0.3 + + scheduler@0.27.0: {} + + semver@6.3.1: {} + + semver@7.8.1: {} + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + source-map-js@1.2.1: {} + + tinyglobby@0.2.17: + dependencies: + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 + + ts-api-utils@2.5.0(typescript@6.0.3): + dependencies: + typescript: 6.0.3 + + tslib@2.8.1: + optional: true + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + typescript-eslint@8.60.1(eslint@10.4.1)(typescript@6.0.3): + dependencies: + '@typescript-eslint/eslint-plugin': 8.60.1(@typescript-eslint/parser@8.60.1(eslint@10.4.1)(typescript@6.0.3))(eslint@10.4.1)(typescript@6.0.3) + '@typescript-eslint/parser': 8.60.1(eslint@10.4.1)(typescript@6.0.3) + '@typescript-eslint/typescript-estree': 8.60.1(typescript@6.0.3) + '@typescript-eslint/utils': 8.60.1(eslint@10.4.1)(typescript@6.0.3) + eslint: 10.4.1 + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + + typescript@6.0.3: {} + + undici-types@7.16.0: {} + + update-browserslist-db@1.2.3(browserslist@4.28.2): + dependencies: + browserslist: 4.28.2 + escalade: 3.2.0 + picocolors: 1.1.1 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + vite@8.0.16(@types/node@24.12.4): + dependencies: + lightningcss: 1.32.0 + picomatch: 4.0.4 + postcss: 8.5.15 + rolldown: 1.0.3 + tinyglobby: 0.2.17 + optionalDependencies: + '@types/node': 24.12.4 + fsevents: 2.3.3 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + word-wrap@1.2.5: {} + + yallist@3.1.1: {} + + yocto-queue@0.1.0: {} + + zod-validation-error@4.0.2(zod@4.4.3): + dependencies: + zod: 4.4.3 + + zod@4.4.3: {} diff --git a/admin/public/apple-touch-icon.png b/admin/public/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..2000537371dbd450d8963ff17e56c4253e56f8ab GIT binary patch literal 18372 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

tFV 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 Hu0mjfnLK{! literal 0 HcmV?d00001 diff --git a/admin/public/favicon.ico b/admin/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..ea259ee47be882ac4834940c02a0b5f6061722af GIT binary patch literal 15086 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 N#-V~)k8RlY{{S}J6)gY& literal 0 HcmV?d00001 diff --git a/admin/public/favicon.svg b/admin/public/favicon.svg new file mode 100644 index 0000000000..cc652d1204 --- /dev/null +++ b/admin/public/favicon.svg @@ -0,0 +1 @@ +RealFaviconGeneratorhttps://realfavicongenerator.net \ No newline at end of file diff --git a/admin/public/icons.svg b/admin/public/icons.svg new file mode 100644 index 0000000000..e9522193d9 --- /dev/null +++ b/admin/public/icons.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/admin/public/site.webmanifest b/admin/public/site.webmanifest new file mode 100644 index 0000000000..b55d1951c9 --- /dev/null +++ b/admin/public/site.webmanifest @@ -0,0 +1,21 @@ +{ + "name": "BookMyVenue", + "short_name": "BMV", + "icons": [ + { + "src": "/web-app-manifest-192x192.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "maskable" + }, + { + "src": "/web-app-manifest-512x512.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "maskable" + } + ], + "theme_color": "#ffffff", + "background_color": "#ffffff", + "display": "standalone" +} \ No newline at end of file diff --git a/admin/public/web-app-manifest-192x192.png b/admin/public/web-app-manifest-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..86806ded66d00f187ebc6464e2706f6f34def48a GIT binary patch literal 20780 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 a8I%Jn*?FDT_el6dG967raKmHAxc>n?ut07A literal 0 HcmV?d00001 diff --git a/admin/public/web-app-manifest-512x512.png b/admin/public/web-app-manifest-512x512.png new file mode 100644 index 0000000000000000000000000000000000000000..25386ddb5eb934b154e615dc8c3df6cee2b480d9 GIT binary patch literal 105944 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

pW6RD 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 e#r{WaMmgZK+O!ivzpX!-1*V3U2Co3O$o~K `pnpm --filter client exec eslint --no-warn-ignored ${files.join(" ")}`, + () => "pnpm --filter client exec tsc --noEmit", + () => "pnpm --filter client test", + ], + + // Admin project — lint changed files only, full tsc, and unit tests + "admin/src/**/*.{ts,tsx}": [ + (files) => `pnpm --filter admin exec eslint --no-warn-ignored ${files.join(" ")}`, + () => "pnpm --filter admin exec tsc --noEmit", + () => "pnpm --filter admin test", + ], + + // Server project — lint changed files only, full tsc, and unit tests + "server/src/**/*.ts": [ + (files) => `pnpm --filter server exec eslint --no-warn-ignored ${files.join(" ")}`, + () => "pnpm --filter server exec tsc --noEmit", + () => "pnpm --filter server test", + ], +}; diff --git a/logo small.png b/logo small.png new file mode 100644 index 0000000000000000000000000000000000000000..be013a694b482c213c2b5fbc99c83e3e97423bf0 GIT binary patch literal 321873 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 z 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 Cn$i~l literal 0 HcmV?d00001 diff --git a/package.json b/package.json new file mode 100644 index 0000000000..f8abc0d4bf --- /dev/null +++ b/package.json @@ -0,0 +1,27 @@ +{ + "name": "bookmyvenue", + "version": "1.0.0", + "description": "BookMyVenue Monorepo", + "private": true, + "workspaces": [ + "server", + "client", + "admin" + ], + "scripts": { + "install:all": "pnpm install", + "build": "pnpm -r build", + "dev": "pnpm -r dev", + "format": "pnpm -r format", + "lint": "pnpm -r lint", + "prepare": "husky" + }, + "keywords": [], + "author": "", + "license": "ISC", + "packageManager": "pnpm@10.16.1", + "devDependencies": { + "husky": "^9.1.7", + "lint-staged": "^17.0.7" + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000000..5f06931573 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,9860 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + devDependencies: + husky: + specifier: ^9.1.7 + version: 9.1.7 + lint-staged: + specifier: ^17.0.7 + version: 17.0.7 + + admin: + dependencies: + '@radix-ui/react-dialog': + specifier: ^1.1.17 + version: 1.1.17(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-slot': + specifier: ^1.3.0 + version: 1.3.0(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-tooltip': + specifier: ^1.2.10 + version: 1.2.10(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@tanstack/react-query': + specifier: ^5.101.0 + version: 5.101.0(react@19.2.7) + '@tanstack/react-table': + specifier: ^8.21.3 + version: 8.21.3(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + axios: + specifier: ^1.17.0 + version: 1.17.0 + class-variance-authority: + specifier: ^0.7.1 + version: 0.7.1 + clsx: + specifier: ^2.1.1 + version: 2.1.1 + date-fns: + specifier: ^4.4.0 + version: 4.4.0 + lucide-react: + specifier: ^1.21.0 + version: 1.21.0(react@19.2.7) + prettier: + specifier: 3.8.3 + version: 3.8.3 + radix-ui: + specifier: ^1.6.0 + version: 1.6.0(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + react: + specifier: ^19.2.6 + version: 19.2.7 + react-day-picker: + specifier: ^10.0.1 + version: 10.0.1(@types/react@19.2.16)(react@19.2.7) + react-dom: + specifier: ^19.2.6 + version: 19.2.7(react@19.2.7) + react-hot-toast: + specifier: ^2.6.0 + version: 2.6.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + react-router: + specifier: ^7.16.0 + version: 7.16.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + recharts: + specifier: ^3.9.0 + version: 3.9.0(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react-is@17.0.2)(react@19.2.7)(redux@5.0.1) + tailwind-merge: + specifier: ^3.6.0 + version: 3.6.0 + zustand: + specifier: ^5.0.14 + version: 5.0.14(@types/react@19.2.16)(immer@11.1.8)(react@19.2.7)(use-sync-external-store@1.6.0(react@19.2.7)) + devDependencies: + '@babel/core': + specifier: ^7.29.0 + version: 7.29.7 + '@eslint-community/eslint-plugin-eslint-comments': + specifier: ^4.7.2 + version: 4.7.2(eslint@10.4.1(jiti@2.7.0)) + '@eslint/js': + specifier: ^10.0.1 + version: 10.0.1(eslint@10.4.1(jiti@2.7.0)) + '@rolldown/plugin-babel': + specifier: ^0.2.3 + version: 0.2.3(@babel/core@7.29.7)(@babel/runtime@7.29.7)(rolldown@1.0.3)(vite@8.0.16(@types/node@24.12.4)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0)) + '@tailwindcss/vite': + specifier: ^4.3.0 + version: 4.3.0(vite@8.0.16(@types/node@24.12.4)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0)) + '@testing-library/jest-dom': + specifier: ^7.0.0 + version: 7.0.0(@testing-library/dom@10.4.1) + '@testing-library/react': + specifier: ^16.3.2 + version: 16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@testing-library/user-event': + specifier: ^14.6.1 + version: 14.6.1(@testing-library/dom@10.4.1) + '@types/babel__core': + specifier: ^7.20.5 + version: 7.20.5 + '@types/node': + specifier: ^24.12.3 + version: 24.12.4 + '@types/react': + specifier: ^19.2.14 + version: 19.2.16 + '@types/react-dom': + specifier: ^19.2.3 + version: 19.2.3(@types/react@19.2.16) + '@vitejs/plugin-react': + specifier: ^6.0.1 + version: 6.0.2(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.29.7)(rolldown@1.0.3)(vite@8.0.16(@types/node@24.12.4)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.16(@types/node@24.12.4)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0)) + babel-plugin-react-compiler: + specifier: ^1.0.0 + version: 1.0.0 + eslint: + specifier: ^10.3.0 + version: 10.4.1(jiti@2.7.0) + eslint-plugin-react-hooks: + specifier: ^7.1.1 + version: 7.1.1(eslint@10.4.1(jiti@2.7.0)) + eslint-plugin-react-refresh: + specifier: ^0.5.2 + version: 0.5.2(eslint@10.4.1(jiti@2.7.0)) + globals: + specifier: ^17.6.0 + version: 17.6.0 + jsdom: + specifier: ^29.1.1 + version: 29.1.1(@noble/hashes@1.8.0) + tailwindcss: + specifier: ^4.3.0 + version: 4.3.0 + typescript: + specifier: ~6.0.2 + version: 6.0.3 + typescript-eslint: + specifier: ^8.59.2 + version: 8.60.1(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + vite: + specifier: ^8.0.12 + version: 8.0.16(@types/node@24.12.4)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0) + vitest: + specifier: ^4.1.10 + version: 4.1.10(@types/node@24.12.4)(@vitest/coverage-v8@4.1.10)(jsdom@29.1.1(@noble/hashes@1.8.0))(vite@8.0.16(@types/node@24.12.4)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0)) + + client: + dependencies: + '@fontsource-variable/inter': + specifier: ^5.2.8 + version: 5.2.8 + '@tanstack/react-query': + specifier: ^5.101.0 + version: 5.101.0(react@19.2.7) + axios: + specifier: ^1.17.0 + version: 1.17.0 + class-variance-authority: + specifier: ^0.7.1 + version: 0.7.1 + clsx: + specifier: ^2.1.1 + version: 2.1.1 + date-fns: + specifier: ^4.4.0 + version: 4.4.0 + formik: + specifier: ^2.4.9 + version: 2.4.9(@types/react@19.2.16)(react@19.2.7) + framer-motion: + specifier: ^12.42.2 + version: 12.42.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + leaflet: + specifier: ^1.9.4 + version: 1.9.4 + lucide-react: + specifier: ^1.18.0 + version: 1.21.0(react@19.2.7) + radix-ui: + specifier: ^1.5.0 + version: 1.6.0(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + react: + specifier: ^19.2.6 + version: 19.2.7 + react-day-picker: + specifier: ^10.0.1 + version: 10.0.1(@types/react@19.2.16)(react@19.2.7) + react-dom: + specifier: ^19.2.6 + version: 19.2.7(react@19.2.7) + react-easy-crop: + specifier: ^6.2.0 + version: 6.2.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + react-hot-toast: + specifier: ^2.6.0 + version: 2.6.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + react-icons: + specifier: ^5.6.0 + version: 5.6.0(react@19.2.7) + react-router: + specifier: ^7.16.0 + version: 7.16.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + react-router-dom: + specifier: ^7.17.0 + version: 7.17.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + shadcn: + specifier: ^4.11.0 + version: 4.11.0(typescript@6.0.3) + tailwind-merge: + specifier: ^3.6.0 + version: 3.6.0 + tw-animate-css: + specifier: ^1.4.0 + version: 1.4.0 + yup: + specifier: ^1.7.1 + version: 1.7.1 + devDependencies: + '@babel/core': + specifier: ^7.29.0 + version: 7.29.7 + '@eslint-community/eslint-plugin-eslint-comments': + specifier: ^4.7.2 + version: 4.7.2(eslint@10.4.1(jiti@2.7.0)) + '@eslint/js': + specifier: ^10.0.1 + version: 10.0.1(eslint@10.4.1(jiti@2.7.0)) + '@rolldown/plugin-babel': + specifier: ^0.2.3 + version: 0.2.3(@babel/core@7.29.7)(@babel/runtime@7.29.7)(rolldown@1.0.3)(vite@8.0.16(@types/node@24.12.4)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0)) + '@tailwindcss/vite': + specifier: ^4.3.0 + version: 4.3.0(vite@8.0.16(@types/node@24.12.4)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0)) + '@testing-library/jest-dom': + specifier: ^7.0.0 + version: 7.0.0(@testing-library/dom@10.4.1) + '@testing-library/react': + specifier: ^16.3.2 + version: 16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@testing-library/user-event': + specifier: ^14.6.1 + version: 14.6.1(@testing-library/dom@10.4.1) + '@types/babel__core': + specifier: ^7.20.5 + version: 7.20.5 + '@types/leaflet': + specifier: ^1.9.21 + version: 1.9.21 + '@types/node': + specifier: ^24.12.3 + version: 24.12.4 + '@types/react': + specifier: ^19.2.14 + version: 19.2.16 + '@types/react-dom': + specifier: ^19.2.3 + version: 19.2.3(@types/react@19.2.16) + '@vitejs/plugin-react': + specifier: ^6.0.2 + version: 6.0.2(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.29.7)(rolldown@1.0.3)(vite@8.0.16(@types/node@24.12.4)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.16(@types/node@24.12.4)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0)) + babel-plugin-react-compiler: + specifier: ^1.0.0 + version: 1.0.0 + eslint: + specifier: ^10.3.0 + version: 10.4.1(jiti@2.7.0) + eslint-plugin-react-hooks: + specifier: ^7.1.1 + version: 7.1.1(eslint@10.4.1(jiti@2.7.0)) + eslint-plugin-react-refresh: + specifier: ^0.5.2 + version: 0.5.2(eslint@10.4.1(jiti@2.7.0)) + globals: + specifier: ^17.6.0 + version: 17.6.0 + jsdom: + specifier: ^29.1.1 + version: 29.1.1(@noble/hashes@1.8.0) + prettier: + specifier: 3.8.3 + version: 3.8.3 + tailwindcss: + specifier: ^4.3.0 + version: 4.3.0 + typescript: + specifier: ~6.0.2 + version: 6.0.3 + typescript-eslint: + specifier: ^8.59.2 + version: 8.60.1(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + vite: + specifier: ^8.0.16 + version: 8.0.16(@types/node@24.12.4)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0) + vitest: + specifier: ^4.1.10 + version: 4.1.10(@types/node@24.12.4)(@vitest/coverage-v8@4.1.10)(jsdom@29.1.1(@noble/hashes@1.8.0))(vite@8.0.16(@types/node@24.12.4)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0)) + + server: + dependencies: + bcrypt: + specifier: ^6.0.0 + version: 6.0.0 + brotli: + specifier: ^1.3.3 + version: 1.3.3 + cloudinary: + specifier: ^2.10.0 + version: 2.10.0 + compression: + specifier: ^1.8.1 + version: 1.8.1 + cookie-parser: + specifier: ^1.4.7 + version: 1.4.7 + cors: + specifier: ^2.8.6 + version: 2.8.6 + dotenv: + specifier: ^17.4.2 + version: 17.4.2 + eslint: + specifier: ^10.7.0 + version: 10.7.0(jiti@2.7.0) + express: + specifier: ^5.2.1 + version: 5.2.1 + express-rate-limit: + specifier: ^8.6.0 + version: 8.6.0(express@5.2.1) + express-validator: + specifier: ^7.3.2 + version: 7.3.2 + helmet: + specifier: ^8.3.0 + version: 8.3.0 + jsonwebtoken: + specifier: ^9.0.3 + version: 9.0.3 + mongoose: + specifier: ^9.8.0 + version: 9.8.0 + razorpay: + specifier: ^2.9.8 + version: 2.9.8 + resend: + specifier: ^6.18.0 + version: 6.18.0 + swagger-jsdoc: + specifier: ^6.3.0 + version: 6.3.0(openapi-types@12.1.3) + swagger-ui-express: + specifier: ^5.0.1 + version: 5.0.1(express@5.2.1) + winston: + specifier: ^3.19.0 + version: 3.19.0 + winston-daily-rotate-file: + specifier: ^5.0.0 + version: 5.0.0(winston@3.19.0) + zod: + specifier: ^4.4.3 + version: 4.4.3 + devDependencies: + '@eslint-community/eslint-plugin-eslint-comments': + specifier: ^4.7.2 + version: 4.7.2(eslint@10.7.0(jiti@2.7.0)) + '@eslint/js': + specifier: ^10.0.1 + version: 10.0.1(eslint@10.7.0(jiti@2.7.0)) + '@types/bcrypt': + specifier: ^6.0.0 + version: 6.0.0 + '@types/compression': + specifier: ^1.8.1 + version: 1.8.1 + '@types/cookie-parser': + specifier: ^1.4.10 + version: 1.4.10(@types/express@5.0.6) + '@types/cors': + specifier: ^2.8.19 + version: 2.8.19 + '@types/express': + specifier: ^5.0.6 + version: 5.0.6 + '@types/jsonwebtoken': + specifier: ^9.0.10 + version: 9.0.10 + '@types/node': + specifier: ^22.13.0 + version: 22.19.19 + '@types/supertest': + specifier: ^7.2.1 + version: 7.2.1 + '@types/swagger-jsdoc': + specifier: ^6.0.4 + version: 6.0.4 + '@types/swagger-ui-express': + specifier: ^4.1.8 + version: 4.1.8 + '@vitest/coverage-v8': + specifier: ^4.0.0 + version: 4.1.10(vitest@4.1.10) + globals: + specifier: ^17.7.0 + version: 17.7.0 + mongodb-memory-server: + specifier: ^11.2.0 + version: 11.2.0 + prettier: + specifier: ^3.9.6 + version: 3.9.6 + supertest: + specifier: ^7.2.2 + version: 7.2.2 + tsx: + specifier: ^4.23.1 + version: 4.23.1 + typescript: + specifier: ^5.9.3 + version: 5.9.3 + typescript-eslint: + specifier: ^8.65.0 + version: 8.65.0(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.3) + vitest: + specifier: ^4.0.0 + version: 4.1.10(@types/node@22.19.19)(@vitest/coverage-v8@4.1.10)(jsdom@29.1.1(@noble/hashes@1.8.0))(vite@8.0.16(@types/node@22.19.19)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0)) + +packages: + + '@adobe/css-tools@4.5.0': + resolution: {integrity: sha512-6OzddxPio9UiWTCemp4N8cYLV2ZN1ncRnV1cVGtve7dhPOtRkleRyx32GQCYSwDYgaHU3USMm84tNsvKzRCa1Q==} + + '@apidevtools/json-schema-ref-parser@14.0.1': + resolution: {integrity: sha512-Oc96zvmxx1fqoSEdUmfmvvb59/KDOnUoJ7s2t7bISyAn0XEz57LCCw8k2Y4Pf3mwKaZLMciESALORLgfe2frCw==} + engines: {node: '>= 16'} + + '@apidevtools/openapi-schemas@2.1.0': + resolution: {integrity: sha512-Zc1AlqrJlX3SlpupFGpiLi2EbteyP7fXmUOGup6/DnkRgjP9bgMM/ag+n91rsv0U1Gpz0H3VILA/o3bW7Ua6BQ==} + engines: {node: '>=10'} + + '@apidevtools/swagger-methods@3.0.2': + resolution: {integrity: sha512-QAkD5kK2b1WfjDS/UQn/qQkbwF31uqRjPTrsCs5ZG9BQGAkjwvqGFjjPqAuzac/IYzpPtRzjCP1WrTuAIjMrXg==} + + '@apidevtools/swagger-parser@12.1.0': + resolution: {integrity: sha512-e5mJoswsnAX0jG+J09xHFYQXb/bUc5S3pLpMxUuRUA2H8T2kni3yEoyz2R3Dltw5f4A6j6rPNMpWTK+iVDFlng==} + peerDependencies: + openapi-types: '>=7' + + '@asamuzakjp/css-color@5.1.11': + resolution: {integrity: sha512-KVw6qIiCTUQhByfTd78h2yD1/00waTmm9uy/R7Ck/ctUyAPj+AEDLkQIdJW0T8+qGgj3j5bpNKK7Q3G+LedJWg==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + + '@asamuzakjp/dom-selector@7.1.1': + resolution: {integrity: sha512-67RZDnYRc8H/8MLDgQCDE//zoqVFwajkepHZgmXrbwybzXOEwOWGPYGmALYl9J2DOLfFPPs6kKCqmbzV895hTQ==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + + '@asamuzakjp/generational-cache@1.0.1': + resolution: {integrity: sha512-wajfB8KqzMCN2KGNFdLkReeHncd0AslUSrvHVvvYWuU8ghncRJoA50kT3zP9MVL0+9g4/67H+cdvBskj9THPzg==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + + '@asamuzakjp/nwsapi@2.3.9': + resolution: {integrity: sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==} + + '@babel/code-frame@7.29.7': + resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.29.7': + resolution: {integrity: sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.29.7': + resolution: {integrity: sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.29.7': + resolution: {integrity: sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-annotate-as-pure@7.29.7': + resolution: {integrity: sha512-OoK6239jHPuSQOoS0kfTVKn0b/rVTk0seKq4Gd2UMLtmOVLjDC0ki3e+c90Trqv2gMfvJFqkiljrr568+qddiw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.29.7': + resolution: {integrity: sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==} + engines: {node: '>=6.9.0'} + + '@babel/helper-create-class-features-plugin@7.29.7': + resolution: {integrity: sha512-IY3ZD9Tmooqr3TUhc3DUWxiuo8xx1DWLhd5M7hQ+ZWJamqM2BbalrBJb2MisSLoYorOj75U03qULCxQTY9r3hg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-globals@7.29.7': + resolution: {integrity: sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-member-expression-to-functions@7.29.7': + resolution: {integrity: sha512-j+7JYmk1JYDtACIGj0QJqqWZjoUpMoEikQGADMaHgCMCSDqd2+P32rfcibUNrGOMWrlzK1WJBdxrB3JJQZwWtg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.29.7': + resolution: {integrity: sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.29.7': + resolution: {integrity: sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-optimise-call-expression@7.29.7': + resolution: {integrity: sha512-+kmGVjcT9RGYzoDwdwEqEvGgKe3BYq+O1iGzjFubaNgZHwYHP6lsF2Yghf4kEuv9BV7tYDZ913aBW9am6YKong==} + engines: {node: '>=6.9.0'} + + '@babel/helper-plugin-utils@7.29.7': + resolution: {integrity: sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-replace-supers@7.29.7': + resolution: {integrity: sha512-atfGXWSeCiF4DnKZIfmJfQRkSw9b9gNNXR1kqKjbhG4pGYCOnkp8OcTB8E3NXjBu8NpheSnOeNKz8KT7UNFTmQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-skip-transparent-expression-wrappers@7.29.7': + resolution: {integrity: sha512-brcMGQaVzIeUb+6/bs1Av0f8YuNNjKY2JyvfRCsFuFsdKccEQ5Ges2y74D74NZ1Rz8lKJ9ksJkfqwQFJ/iNEyQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.29.7': + resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.29.7': + resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.29.7': + resolution: {integrity: sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.29.7': + resolution: {integrity: sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.29.7': + resolution: {integrity: sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-syntax-jsx@7.29.7': + resolution: {integrity: sha512-TSu8+mHCoEaaCDEZ0I3+6mvTBYR4PCxQwf2z9/r5Tbztv6NaLR3B9thGTTxX2WGuGHJqRiAbKPeGTJ5XWXVg6A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-typescript@7.29.7': + resolution: {integrity: sha512-ngr+82Sh0xMz25TPCZi+nC2iTzjfCdWS2ONXTp/PtSCHCgaCNBpdMqgvJ2ccdLlClVZ7sisIgB914j/JFe+RZA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-commonjs@7.29.7': + resolution: {integrity: sha512-j0vCldybPC5b5dwCQOJ21uKtHzt7hxLygJTg9eF1ScfaikEDNfzn94XoW5Fi+seBR0nCyL23xaBFFkq7dTM8XQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-typescript@7.29.7': + resolution: {integrity: sha512-jK52h8LaLc7JarhQV2ofeFMts4H7vnOXnqZNA6fYglBTZewRBE51KWt3BUltW1P+KoPsYkHoJeXePuz4zo2LMw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/preset-typescript@7.29.7': + resolution: {integrity: sha512-/Foi8vKY2EVbed/1eZx0gJEEwHAIxogrySI7rULcRIvhZzbvoE/b5qG5Ghc0WKAFKOHA9SD1x7RsFlOYdutIiQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/runtime@7.29.7': + resolution: {integrity: sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==} + engines: {node: '>=6.9.0'} + + '@babel/template@7.29.7': + resolution: {integrity: sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.29.7': + resolution: {integrity: sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.29.7': + resolution: {integrity: sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==} + engines: {node: '>=6.9.0'} + + '@bcoe/v8-coverage@1.0.2': + resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} + engines: {node: '>=18'} + + '@bramus/specificity@2.4.2': + resolution: {integrity: sha512-ctxtJ/eA+t+6q2++vj5j7FYX3nRu311q1wfYH3xjlLOsczhlhxAg2FWNUXhpGvAw3BWo1xBcvOV6/YLc2r5FJw==} + hasBin: true + + '@colors/colors@1.6.0': + resolution: {integrity: sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==} + engines: {node: '>=0.1.90'} + + '@csstools/color-helpers@6.1.0': + resolution: {integrity: sha512-064IFJdjTfUqnjpCVpMOdbr8FLQBhinbZj6yRv2An2E41O/pLEXqfFRWqGq/SxlE5PEUYTlvWsG2r8MswAVvkg==} + engines: {node: '>=20.19.0'} + + '@csstools/css-calc@3.2.1': + resolution: {integrity: sha512-DtdHlgXh5ZkA43cwBcAm+huzgJiwx3ZTWVjBs94kwz2xKqSimDA3lBgCjphYgwgVUMWatSM0pDd8TILB1yrVVg==} + engines: {node: '>=20.19.0'} + peerDependencies: + '@csstools/css-parser-algorithms': ^4.0.0 + '@csstools/css-tokenizer': ^4.0.0 + + '@csstools/css-color-parser@4.1.9': + resolution: {integrity: sha512-paQcIaOO53Rk5+YrBaBjm/SgrV4INImjo2BT1DtQRYr+XeTRbeAYlS+jxXp9drqvKmtFnWRJKIalDLhZZDu42A==} + engines: {node: '>=20.19.0'} + peerDependencies: + '@csstools/css-parser-algorithms': ^4.0.0 + '@csstools/css-tokenizer': ^4.0.0 + + '@csstools/css-parser-algorithms@4.0.0': + resolution: {integrity: sha512-+B87qS7fIG3L5h3qwJ/IFbjoVoOe/bpOdh9hAjXbvx0o8ImEmUsGXN0inFOnk2ChCFgqkkGFQ+TpM5rbhkKe4w==} + engines: {node: '>=20.19.0'} + peerDependencies: + '@csstools/css-tokenizer': ^4.0.0 + + '@csstools/css-syntax-patches-for-csstree@1.1.6': + resolution: {integrity: sha512-TcJCWFbXLPpJYq6z7bfOyjWYJDiDg2/I4gyUC9pqPNqHFRIey0EB0q0L5cSnQDfWJg8Jd6VadakxdIez/3zkqQ==} + peerDependencies: + css-tree: ^3.2.1 + peerDependenciesMeta: + css-tree: + optional: true + + '@csstools/css-tokenizer@4.0.0': + resolution: {integrity: sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==} + engines: {node: '>=20.19.0'} + + '@dabh/diagnostics@2.0.8': + resolution: {integrity: sha512-R4MSXTVnuMzGD7bzHdW2ZhhdPC/igELENcq5IjEverBvq5hn1SXCWcsi6eSsdWP0/Ur+SItRRjAktmdoX/8R/Q==} + + '@date-fns/tz@1.5.0': + resolution: {integrity: sha512-lwYN/vDPeNRULcepoE/LO2Pgx+7/RV+S9ARfbc9lr2DtGkOD7pAiruHvbR1RX3Qyf6ja47EWJDMsNK5vK08DJg==} + + '@dotenvx/dotenvx@1.74.2': + resolution: {integrity: sha512-UucMF9L95sVr/feRojWB/NIc5R+CzoiiXq7rd7sWppYA7j6CIH5bu5bQCuoJ0HJxQARR0Ecg4bYot3ilo100lw==} + hasBin: true + + '@ecies/ciphers@0.2.6': + resolution: {integrity: sha512-patgsRPKGkhhoBjETV4XxD0En4ui5fbX0hzayqI3M8tvNMGUoUvmyYAIWwlxBc1KX5cturfqByYdj5bYGRpN9g==} + engines: {bun: '>=1', deno: '>=2.7.10', node: '>=16'} + peerDependencies: + '@noble/ciphers': ^1.0.0 + + '@emnapi/core@1.10.0': + resolution: {integrity: sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==} + + '@emnapi/runtime@1.10.0': + resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==} + + '@emnapi/wasi-threads@1.2.1': + resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} + + '@esbuild/aix-ppc64@0.28.0': + resolution: {integrity: sha512-lhRUCeuOyJQURhTxl4WkpFTjIsbDayJHih5kZC1giwE+MhIzAb7mEsQMqMf18rHLsrb5qI1tafG20mLxEWcWlA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.28.0': + resolution: {integrity: sha512-+WzIXQOSaGs33tLEgYPYe/yQHf0WTU0X42Jca3y8NWMbUVhp7rUnw+vAsRC/QiDrdD31IszMrZy+qwPOPjd+rw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.28.0': + resolution: {integrity: sha512-wqh0ByljabXLKHeWXYLqoJ5jKC4XBaw6Hk08OfMrCRd2nP2ZQ5eleDZC41XHyCNgktBGYMbqnrJKq/K/lzPMSQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.28.0': + resolution: {integrity: sha512-+VJggoaKhk2VNNqVL7f6S189UzShHC/mR9EE8rDdSkdpN0KflSwWY/gWjDrNxxisg8Fp1ZCD9jLMo4m0OUfeUA==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.28.0': + resolution: {integrity: sha512-0T+A9WZm+bZ84nZBtk1ckYsOvyA3x7e2Acj1KdVfV4/2tdG4fzUp91YHx+GArWLtwqp77pBXVCPn2We7Letr0Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.28.0': + resolution: {integrity: sha512-fyzLm/DLDl/84OCfp2f/XQ4flmORsjU7VKt8HLjvIXChJoFFOIL6pLJPH4Yhd1n1gGFF9mPwtlN5Wf82DZs+LQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.28.0': + resolution: {integrity: sha512-l9GeW5UZBT9k9brBYI+0WDffcRxgHQD8ShN2Ur4xWq/NFzUKm3k5lsH4PdaRgb2w7mI9u61nr2gI2mLI27Nh3Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.28.0': + resolution: {integrity: sha512-BXoQai/A0wPO6Es3yFJ7APCiKGc1tdAEOgeTNy3SsB491S3aHn4S4r3e976eUnPdU+NbdtmBuLncYir2tMU9Nw==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.28.0': + resolution: {integrity: sha512-RVyzfb3FWsGA55n6WY0MEIEPURL1FcbhFE6BffZEMEekfCzCIMtB5yyDcFnVbTnwk+CLAgTujmV/Lgvih56W+A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.28.0': + resolution: {integrity: sha512-CjaaREJagqJp7iTaNQjjidaNbCKYcd4IDkzbwwxtSvjI7NZm79qiHc8HqciMddQ6CKvJT6aBd8lO9kN/ZudLlw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.28.0': + resolution: {integrity: sha512-KBnSTt1kxl9x70q+ydterVdl+Cn0H18ngRMRCEQfrbqdUuntQQ0LoMZv47uB97NljZFzY6HcfqEZ2SAyIUTQBQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.28.0': + resolution: {integrity: sha512-zpSlUce1mnxzgBADvxKXX5sl8aYQHo2ezvMNI8I0lbblJtp8V4odlm3Yzlj7gPyt3T8ReksE6bK+pT3WD+aJRg==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.28.0': + resolution: {integrity: sha512-2jIfP6mmjkdmeTlsX/9vmdmhBmKADrWqN7zcdtHIeNSCH1SqIoNI63cYsjQR8J+wGa4Y5izRcSHSm8K3QWmk3w==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.28.0': + resolution: {integrity: sha512-bc0FE9wWeC0WBm49IQMPSPILRocGTQt3j5KPCA8os6VprfuJ7KD+5PzESSrJ6GmPIPJK965ZJHTUlSA6GNYEhg==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.28.0': + resolution: {integrity: sha512-SQPZOwoTTT/HXFXQJG/vBX8sOFagGqvZyXcgLA3NhIqcBv1BJU1d46c0rGcrij2B56Z2rNiSLaZOYW5cUk7yLQ==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.28.0': + resolution: {integrity: sha512-SCfR0HN8CEEjnYnySJTd2cw0k9OHB/YFzt5zgJEwa+wL/T/raGWYMBqwDNAC6dqFKmJYZoQBRfHjgwLHGSrn3Q==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.28.0': + resolution: {integrity: sha512-us0dSb9iFxIi8srnpl931Nvs65it/Jd2a2K3qs7fz2WfGPHqzfzZTfec7oxZJRNPXPnNYZtanmRc4AL/JwVzHQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.28.0': + resolution: {integrity: sha512-CR/RYotgtCKwtftMwJlUU7xCVNg3lMYZ0RzTmAHSfLCXw3NtZtNpswLEj/Kkf6kEL3Gw+BpOekRX0BYCtklhUw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.28.0': + resolution: {integrity: sha512-nU1yhmYutL+fQ71Kxnhg8uEOdC0pwEW9entHykTgEbna2pw2dkbFSMeqjjyHZoCmt8SBkOSvV+yNmm94aUrrqw==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.28.0': + resolution: {integrity: sha512-cXb5vApOsRsxsEl4mcZ1XY3D4DzcoMxR/nnc4IyqYs0rTI8ZKmW6kyyg+11Z8yvgMfAEldKzP7AdP64HnSC/6g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.28.0': + resolution: {integrity: sha512-8wZM2qqtv9UP3mzy7HiGYNH/zjTA355mpeuA+859TyR+e+Tc08IHYpLJuMsfpDJwoLo1ikIJI8jC3GFjnRClzA==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.28.0': + resolution: {integrity: sha512-FLGfyizszcef5C3YtoyQDACyg95+dndv79i2EekILBofh5wpCa1KuBqOWKrEHZg3zrL3t5ouE5jgr94vA+Wb2w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.28.0': + resolution: {integrity: sha512-1ZgjUoEdHZZl/YlV76TSCz9Hqj9h9YmMGAgAPYd+q4SicWNX3G5GCyx9uhQWSLcbvPW8Ni7lj4gDa1T40akdlw==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.28.0': + resolution: {integrity: sha512-Q9StnDmQ/enxnpxCCLSg0oo4+34B9TdXpuyPeTedN/6+iXBJ4J+zwfQI28u/Jl40nOYAxGoNi7mFP40RUtkmUA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.28.0': + resolution: {integrity: sha512-zF3ag/gfiCe6U2iczcRzSYJKH1DCI+ByzSENHlM2FcDbEeo5Zd2C86Aq0tKUYAJJ1obRP84ymxIAksZUcdztHA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.28.0': + resolution: {integrity: sha512-pEl1bO9mfAmIC+tW5btTmrKaujg3zGtUmWNdCw/xs70FBjwAL3o9OEKNHvNmnyylD6ubxUERiEhdsL0xBQ9efw==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@eslint-community/eslint-plugin-eslint-comments@4.7.2': + resolution: {integrity: sha512-LF03qURSwEWm2dz5wtdDCzNk+7Opl0X7q6I3undsaIuNsEiNvRV3BCtqu14Q/6Pzg1tBj44LcxpW2EpSLZStZw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 + + '@eslint-community/eslint-utils@4.9.1': + resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.12.2': + resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/config-array@0.23.5': + resolution: {integrity: sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + '@eslint/config-helpers@0.6.0': + resolution: {integrity: sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + '@eslint/core@1.2.1': + resolution: {integrity: sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + '@eslint/js@10.0.1': + resolution: {integrity: sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + peerDependencies: + eslint: ^10.0.0 + peerDependenciesMeta: + eslint: + optional: true + + '@eslint/object-schema@3.0.5': + resolution: {integrity: sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + '@eslint/plugin-kit@0.7.2': + resolution: {integrity: sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + '@exodus/bytes@1.15.1': + resolution: {integrity: sha512-S6mL0yNB/Abt9Ei4tq8gDhcczc4S3+vQ4ra7vxnAf+YHC02srtqxKKZghx2Dq6p0e66THKwR6r8N6P95wEty7Q==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + peerDependencies: + '@noble/hashes': ^1.8.0 || ^2.0.0 + peerDependenciesMeta: + '@noble/hashes': + optional: true + + '@floating-ui/core@1.7.5': + resolution: {integrity: sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==} + + '@floating-ui/dom@1.7.6': + resolution: {integrity: sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ==} + + '@floating-ui/react-dom@2.1.8': + resolution: {integrity: sha512-cC52bHwM/n/CxS87FH0yWdngEZrjdtLW/qVruo68qg+prK7ZQ4YGdut2GyDVpoGeAYe/h899rVeOVm6Oi40k2A==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@floating-ui/utils@0.2.11': + resolution: {integrity: sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==} + + '@fontsource-variable/inter@5.2.8': + resolution: {integrity: sha512-kOfP2D+ykbcX/P3IFnokOhVRNoTozo5/JxhAIVYLpea/UBmCQ/YWPBfWIDuBImXX/15KH+eKh4xpEUyS2sQQGQ==} + + '@hono/node-server@1.19.14': + resolution: {integrity: sha512-GwtvgtXxnWsucXvbQXkRgqksiH2Qed37H9xHZocE5sA3N8O8O8/8FA3uclQXxXVzc9XBZuEOMK7+r02FmSpHtw==} + engines: {node: '>=18.14.1'} + peerDependencies: + hono: ^4 + + '@humanfs/core@0.19.2': + resolution: {integrity: sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.8': + resolution: {integrity: sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==} + engines: {node: '>=18.18.0'} + + '@humanfs/types@0.15.0': + resolution: {integrity: sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==} + engines: {node: '>=18.18.0'} + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/retry@0.4.3': + resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} + engines: {node: '>=18.18'} + + '@isaacs/cliui@9.0.0': + resolution: {integrity: sha512-AokJm4tuBHillT+FpMtxQ60n8ObyXBatq7jD2/JA9dxbDDokKQm8KMht5ibGzLVU9IJDIKK4TPKgMHEYMn3lMg==} + engines: {node: '>=18'} + + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + + '@modelcontextprotocol/sdk@1.29.0': + resolution: {integrity: sha512-zo37mZA9hJWpULgkRpowewez1y6ML5GsXJPY8FI0tBBCd77HEvza4jDqRKOXgHNn867PVGCyTdzqpz0izu5ZjQ==} + engines: {node: '>=18'} + peerDependencies: + '@cfworker/json-schema': ^4.1.1 + zod: ^3.25 || ^4.0 + peerDependenciesMeta: + '@cfworker/json-schema': + optional: true + + '@mongodb-js/saslprep@1.4.11': + resolution: {integrity: sha512-o9rAHc0IpIjuPSxRutWpE1F62x7n+4mVS4rCNHkzhIUMQcc18bb6xEq5wd2NdN0WjepIyXIppRshYI2kQDOZVA==} + + '@napi-rs/wasm-runtime@1.1.4': + resolution: {integrity: sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==} + peerDependencies: + '@emnapi/core': ^1.7.1 + '@emnapi/runtime': ^1.7.1 + + '@noble/ciphers@1.3.0': + resolution: {integrity: sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==} + engines: {node: ^14.21.3 || >=16} + + '@noble/curves@1.9.7': + resolution: {integrity: sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==} + engines: {node: ^14.21.3 || >=16} + + '@noble/hashes@1.8.0': + resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} + engines: {node: ^14.21.3 || >=16} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@oxc-project/types@0.133.0': + resolution: {integrity: sha512-KzkdCd6Uxqnf6l3HOw1xfatAlUURA0g14cvBYFyJ5SaNOQbOUvBr9PKArcPcrNIeRsBdgcUzOGrhKveVpvOIGA==} + + '@paralleldrive/cuid2@2.3.1': + resolution: {integrity: sha512-XO7cAxhnTZl0Yggq6jOgjiOHhbgcO4NqFqwSmQpjK3b6TEE6Uj/jfSk6wzYyemh3+I0sHirKSetjQwn5cZktFw==} + + '@radix-ui/number@1.1.2': + resolution: {integrity: sha512-ceTwaxc4I5IOi97DgCotl3pqiyRGvffcc0oOsE2dQYaJOFIDsDt4VWG6xEbg1QePv9QWausCEIppud/tJ1wNig==} + + '@radix-ui/primitive@1.1.4': + resolution: {integrity: sha512-7AdCK9PQyiljKoBDbN8OuctCbd/esdwZPQ8RtOE3SsyQtUpiPb+ND75q0jEhC1m1ecBI0MFNeLJvwIh9iKHRcQ==} + + '@radix-ui/react-accessible-icon@1.1.10': + resolution: {integrity: sha512-TraSwZUqTcVbiDV2/RXzAXC7aeVVXchq0daPFZE7zAxYFaMzjOUggLOfQH9KFLgRizuwVKZO/crveV1eeO3/ZQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-accordion@1.2.14': + resolution: {integrity: sha512-iE8YB9nmTBH8zd73ofBISZ8JCzgMoMkATJr7qDwa6u5F1+7mTM81V6fa71jgZ65rpjVpecDf1vSnwIFP9Ly1zw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-alert-dialog@1.1.17': + resolution: {integrity: sha512-563ygGeyWPrxyVCNp7OV4rE2aIXhFPknpFyo4wbDlcyMMPZ6ySh+zC5WTvY0ZFLgPTg/QB6tA8PyDQyJ2b4cPg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-arrow@1.1.10': + resolution: {integrity: sha512-j2VTDz1vgCsmuG0k5lBfOcM8n5JPFqZBcMryasFjHYMhwxYL5SRUV5lMSUpRdNtw3D/Sv8pzJtrlAgkssYSsQQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-aspect-ratio@1.1.10': + resolution: {integrity: sha512-kbI7NrqhDeuytYrq7JjAsoXczvL8wgj2tc1MyaYWm+50bMKHCHQtVWCryslx4cCpmCTTkBcwQckE4CmmGV2haQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-avatar@1.2.0': + resolution: {integrity: sha512-am/CwltXtmtdtP+5FbYblYDnMa/zuKcMJP1i3/SJMDXXfj2mG+BTqLH2wucqeyyiQMursUtg/5cK+Nh2pCaSOA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-checkbox@1.3.5': + resolution: {integrity: sha512-pREzrmNnVwGvYaBoM64huTRK7B3lrTRuwj8A9nwhPiEtMb+yudiWh6zWAqEtP0Dzd5+iBa1Ki7V1pCxV8ExMdA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-collapsible@1.1.14': + resolution: {integrity: sha512-9bT+FvifX1FK2Mj6UEsTdyu0cN3JaA3KdfhaBao+ONrYFy/pyOy3TU1TNw7iOk1o+0hOEq67RojlUUmoFGwxyA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-collection@1.1.10': + resolution: {integrity: sha512-IVVz4EvBcKjrzKgof714qDnz/SzQAkLA2Emh5edlHbgcE6fNd3Un6CJLlaYcnm8N4JmAtzQgse4dOKxcD2yc9g==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-compose-refs@1.1.3': + resolution: {integrity: sha512-rYOP8OMnuuPMQF1uhPVlGNcCDlkokKqGFE3JcxFViIkAXP7EvFWUliJAstrapypaBLJNHbZL6jGhbVDGTwmVhA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-context-menu@2.3.1': + resolution: {integrity: sha512-XbrxS68W5dyiE4fAb96yvJwSVU5x66B20A99sD5Mk3xSWK/LqeOnx6TZnim1KieMjXS/CTFq8reOAjWxas2G8Q==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-context@1.1.4': + resolution: {integrity: sha512-QwH4PO5urrbO+FaGd5Aglg+YJgWTyyuZ3g/6mKvsqraLkglDdckw9JafgL5McL5VEJ6EPNduPaT3ZE9BttDAqg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-dialog@1.1.17': + resolution: {integrity: sha512-TDTYmpdq8dI2+Xgvgj9AJ8Ghqq+Eph/TRVEdaFQPDItIY+6QSkU7MJMeevw1568Yw/2Ijz8BTphPSP2XejKphw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-direction@1.1.2': + resolution: {integrity: sha512-C3vFhbyi4SW3PmbAi6Awpu4OzJtd0MxGurvSsYtr7p7nM8RNB3VAF3CUmnp2j50knpkrRcB7+ycVXzgLgF6yNA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-dismissable-layer@1.1.13': + resolution: {integrity: sha512-2v+zNAWWe0ySxgC0D0yeXMPQ23xZVgXZTerTz+JKlmdRj6gfTqmCcR29jb6d290DezXPGgruHWDX/vYUebtErg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-dropdown-menu@2.1.18': + resolution: {integrity: sha512-PZGV82gFk0WltDRI//SsG28ZIjlo9ANTmoNYg0jLNzXXiDsAy5PkOOYQaVD1pPxY6t7gxffb1QMD6qaUvsBZdw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-focus-guards@1.1.4': + resolution: {integrity: sha512-cot/aB/mOm0IYVYTTmQcEEK1M48lZWi8FlYe5nDPQQ8NYZUlXEFgncJ9p2Kzer3RKSrY7cTTpEMLZKNo9QoP5Q==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-focus-scope@1.1.10': + resolution: {integrity: sha512-Fas/lXQqhVvqwAb64s5RFeHiHYElZ6SUQbZaNd6EkfhP/Al7wTIQ9WIR4QVX475tlu5yFCEdDcJH6/UwsZjMWw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-form@0.1.10': + resolution: {integrity: sha512-1NfuvctVtX4sU3Mmq/IdrR8UunxiCMiVg3A5UENKhFzxUBeOyaQQ+lmaQaV7Tc8cqvBKsJL3/KGBsixK0D8WFg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-hover-card@1.1.17': + resolution: {integrity: sha512-GjZQIEANVkuuWeztlKz6QEHe31ZX2iDfHzcTMCQVZXC0JyQrgfKWSC+LOOEw6aVV64zyjzobIzSA4AU4eKWrHA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-id@1.1.2': + resolution: {integrity: sha512-orBC88futVpqCmhX1p4cvquNHsELQ+w+vBJnuj3ftETI5bJb0bZn3Tqu3SWN2IOcPycTnMGnhwoermvISt72sA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-label@2.1.10': + resolution: {integrity: sha512-ib0zvq2ZsAqKm5tRnqGJn3vOxSgIts5ToxsXT0q1S/GfLD1Zj7UOEnkw8u2w6sRmn47djpQWuSU1DCL1R29/yw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-menu@2.1.18': + resolution: {integrity: sha512-lj8Rxjtn6zJq1oSbE/uDtAwCbB9BnxgHD+8MwJMuTh6u1dPamYhW9iuELr/Z8d0D/UysFblYYHeBPwi7T4k0YQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-menubar@1.1.18': + resolution: {integrity: sha512-hX7EGx/oFq6DPY27GQuP/2wP48GHf5LG6r06VgNJlG+znmDS8OfopZcRcGly3L4lsB9FqpmLx6JQSE9P3BUpyw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-navigation-menu@1.2.16': + resolution: {integrity: sha512-nJ0SkrSQgudyYhMiYeHA1ayLVuduEJCFLan1RZZN7c9kqzzCFLaU9kuy81uNtqzweM9YaQPgWzxi9MwQ9jZ04g==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-one-time-password-field@0.1.10': + resolution: {integrity: sha512-GHkcJ+WVj91At+OvUVTD4R3W0/wxw9t/sG5xFUBYXaCbtWiooZX5Md376QjJqgH4VsVyXrbVNHO2O4NYcmjfVg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-password-toggle-field@0.1.5': + resolution: {integrity: sha512-fVuA82u0b/fClpbEJv8yp1nU9eSvoSEOERsU/hhf3FXGPIvkmE7oEaHEu8poowoXO39/Va7zq2E0TUcYr1dBRg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-popover@1.1.17': + resolution: {integrity: sha512-/YSAOdJ7YJvdn7bn5sdSx2egW+SKY+u7O5RyAVs94Ymrg2fg5QTSFPMRkzvhGyFuE4/qsmPBdrwYoZMZh/4f+g==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-popper@1.3.1': + resolution: {integrity: sha512-bhnq/0DEPTi2lsOD3J5rTL65qUKHbKbhqHsmN9TMiclSXpipi651ooUKPPp6G5lF/WiHBdn1s0Wuqsn+myVAvw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-portal@1.1.12': + resolution: {integrity: sha512-m309havGzsjLHHaIX50G5PlvRs3xkgPCsGk/5PTvYm8D5q33yG0J7w/712PTOhid7NTaFETtnSXjngHQavvhVw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-presence@1.1.6': + resolution: {integrity: sha512-zdTk4PlUO0E18HnZ3wYbW0KkJJxWCdiNYp6g6X1PtONFhxVkg01vliTJAmwIszU6mHiyBOoW9P0rAugl5/hULQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-primitive@2.1.6': + resolution: {integrity: sha512-wetd0QI77DbvrPpTAvH1SqOxsYF2wZe5TNxqwOd5Ty4XDpV3dpV0s8K/1MGMJBeY5o7lg8ub5VIt1Ub+yVen6g==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-progress@1.1.10': + resolution: {integrity: sha512-JYzEg60lk79PwKM27WZyKd7PW8O4OM5jOaFfRPfOyeXmMw7tLJh5kSj+CEjVTehszuwml/AdCzPGMXBTGf4BBw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-radio-group@1.4.1': + resolution: {integrity: sha512-/SSxZdKEo2Eo29FFRKd06EfFDYp8HryKg0WYg7QLXaydPzl52YfSvCH2a3QDBRdtcuwACroJT8UVjQVgOJ7P9A==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-roving-focus@1.1.13': + resolution: {integrity: sha512-9gkwneI0guf8JDmrFxPjJF6Ozzgioyw+/lonYNCwefS9ZHA05er0BVHiXr+LbWGHxUfczvMY6G1oiZZi1VzjRw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-scroll-area@1.2.12': + resolution: {integrity: sha512-xuafVzQiTCLsyEjakowTdG3OgTXsmO7IdCiO77otIa+z44xoLNs9Do5eg7POFumIOCjtG6djfm6RKUKpUa/csA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-select@2.3.1': + resolution: {integrity: sha512-w6eDvY78LE9ZUiNnXCA1QVK8RYN7k9galFv09kjVydJqBAgHd7Y9A6h0UJ/6DCZNGZMZrB2ohcSW1Bo9d8+wWA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-separator@1.1.10': + resolution: {integrity: sha512-Y6K6jLQCVfCnTL2MEtGxDLffkhNfEfHsEg3Wa8JU+IWdn3EWbLXd3OuOfQRN7p/W/cUce1WyTk3QeuAoDBzN9g==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-slider@1.4.1': + resolution: {integrity: sha512-r91WSpQucNGFKAIxT8FT0H0zyjd5tJlqObLp7LOMV4z49KoDCwjy01w3vDOU4e1wxhF9IgjYco7SB6byOW7Buw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-slot@1.3.0': + resolution: {integrity: sha512-MojKku4U/miO8Av4Dkb+ctMAQx7JmY96LmtDQlAarCRtd7rN52QCSzBF+XAvr5S6coSVj9HEPBgHAHKEJVk/WA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-switch@1.3.1': + resolution: {integrity: sha512-55bQtCnOB0BohomSHi6qvQXpJEEqUGDm6hRrM0Bph5OXwhSegqkd8IqgBAQkM1IlgUlWZIxpxRcpOEfRIgimyw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-tabs@1.1.15': + resolution: {integrity: sha512-kxc9gI6/HfcU4nfMMVS3AmQK414kbU1IE6UCJmMmxjhO3cRPXOyYnmvyKD+ODt7q56nRq9l7Wovi6uaGwKgMlg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-toast@1.2.17': + resolution: {integrity: sha512-uL4kyyWy000pPL43fGGCV5qT6ZchCWEQZOSlkYiPwPt8Hy1iW38RjeptIvz1/SZesrW6Vn58Ct3sV7tfEfiAbw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-toggle-group@1.1.13': + resolution: {integrity: sha512-Xb9PLtlvU66F36LiKba6dFswu6V2mDkgidO4fNSbQHQwmZ9ObxMIO17MN/LJ4aWJecVuSVLAHPZjyeMzJrgeiA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-toggle@1.1.12': + resolution: {integrity: sha512-AsAVsYNZIlRBsci7BhE+QyQeKd1h6TffJYt+lF0QQkd5OpQ3klfIByPsCb4G0h/Fq6PJwh1FYNluzBFYzhk4+w==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-toolbar@1.1.13': + resolution: {integrity: sha512-Za1l4f6fzTkGgz/iynAMN8iaqiKff2wm2/QwiLmHPtDQreWEBrvSimgQFIekxMUdRPhILM7xdIXxuS/o/DGZag==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-tooltip@1.2.10': + resolution: {integrity: sha512-NlNe8D0dWEpVfXFli90IO6X07Josx/b1iu98tDnx9Xv0HT4wLIL+m2VOheMHhK7qbp2HoTBqALEFzGyZs/levw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-use-callback-ref@1.1.2': + resolution: {integrity: sha512-xCso9j1/u8sEgP1RNHjFrXJLApL8LiqOkI1R4ywuN00rxWdYg4oQXuwKLS3i0j5NWLromUD27/4nlxj2UFVvIw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-controllable-state@1.2.3': + resolution: {integrity: sha512-PLzC90MS+ReootmjC597dvopoelpZ8Q61HJkDXZSExitIq7PL55vHNnesAHwguHK0aPfBnpdNzQtv1uliaqQrA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-effect-event@0.0.3': + resolution: {integrity: sha512-6c8ZqvPTWILEKnyVkP53EGRCcpnJiKTC21sS/6R1GF5xKyHJJWQEPfkqlcgUkdRQivd6tb23abUwe4ngWmY0JA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-escape-keydown@1.1.2': + resolution: {integrity: sha512-2uVLvLjgO7NZCWw01/FdqRwmA42J0BcjPMUCA+koFEOAb+zjqIP7SiFz/7zWPrKnVmSqr76Omq2ALyCuX4dhLw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-is-hydrated@0.1.1': + resolution: {integrity: sha512-qwOiz4Tjo8CNnrOLAYUMXeZwDzXgXpvK4TKQPmWLECM9XoWvA6+0Z2/7Ag3A4ivjS4ovbLJPbskkxioFyBhr8A==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-layout-effect@1.1.2': + resolution: {integrity: sha512-jrBWOxZITuGcnjRCM2t2U5ZPkCLxD+Ym6DjfssS5haTj2iiak/DOb64JeN6OdLfLgptb6/e2kKR+ZuTrGoZTPA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-previous@1.1.2': + resolution: {integrity: sha512-IGBQPtRFdhN6MQ8dbegVmBq1LVZluya3F1jWY+puIcQC3MHctRwTDSBWCkL/3ZcnMJLTMJ++Z+ktmvg0F89iCw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-rect@1.1.2': + resolution: {integrity: sha512-d8a+bBY/FxikNPlgJJoaBHZX+zKVbWHYJGTLnLvveQgFSTntkGdEKv3JDtHrMS0DNYpllz2nRsTLGLKYttbpmw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-size@1.1.2': + resolution: {integrity: sha512-giWQp+4mxjBPt4KZ0MmyuykFNWfbDxKt4x+fPkRYmgRFJSbCZFzUglvMb/Kjn38tm10YP4ufiQZDx3zna4LU6w==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-visually-hidden@1.2.6': + resolution: {integrity: sha512-jCE0WljWifTI4niIMCll06kGpsJTAPiZVU9H4WR1N6qW7At9ystHbN7dDB+we2xH535roFHj7qKS+RGj0FMDWQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/rect@1.1.2': + resolution: {integrity: sha512-xnXE7wG13PI+cxieVssYXlQJuYVRhH9NBoxt3KNwzghDIA69GMm7d4wXRouHIYjE+KvS6U/MsMO73NdS2MH9ZA==} + + '@reduxjs/toolkit@2.12.0': + resolution: {integrity: sha512-KiT+RzZbp6mQET+Mg+h2c97+9j1sNflUxQkIHI7Yuzf6Peu+OYpmkn6nbHWmLLWj+1ZODUJFwGZ7gx3L9R9EOw==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18 || ^19 + react-redux: ^7.2.1 || ^8.1.3 || ^9.0.0 + peerDependenciesMeta: + react: + optional: true + react-redux: + optional: true + + '@rolldown/binding-android-arm64@1.0.3': + resolution: {integrity: sha512-454rs7jHngixp/NMxd5srYD57OnzSlZ/eFTETjORQHLwJG1lRtmNOJcBerZlfu4GjKqeq8aCCIQrMdHyhI51Hw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@rolldown/binding-darwin-arm64@1.0.3': + resolution: {integrity: sha512-PcAhP+ynjURNyy8SKGl5DQP94aGuB/7JrXJb/t7P+hanXvQVMWzUvRRhBAcg/lNRadBhoUPqSoP4xw5tR/KBEA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@rolldown/binding-darwin-x64@1.0.3': + resolution: {integrity: sha512-9YpfeUvSE2RS7wysJ81uOZkXJz7f7Q55H2Gvp3VEw/EsahqDtrphrZ0EwDLK5vvKOzaCrBsjF8JmnMLcUt78Gg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@rolldown/binding-freebsd-x64@1.0.3': + resolution: {integrity: sha512-yB1IlAsSNHncV6SCTL27/MVGR5htvQsoGxIv5KMGXALp+Ll1wYsn+x98M9MW7qa+NdSbvrrY7ANI4wLJ0n1e6g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@rolldown/binding-linux-arm-gnueabihf@1.0.3': + resolution: {integrity: sha512-Yi30IVAAfLUCy2MseFjbB1jAMDl1VMCAas5StnYp8da9+CKvMd2H2cbEjWcw5NPaPqzvYkVIaF1nNUG+b7u/sw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@rolldown/binding-linux-arm64-gnu@1.0.3': + resolution: {integrity: sha512-jsO7R8To+AdlYgUmN5sHSCZbfhtMBkO0WUx8iORQnPcMMdgr7qM2DQmMwgabs3GhNztdmoKkMKQFHD6DTMCIQw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@rolldown/binding-linux-arm64-musl@1.0.3': + resolution: {integrity: sha512-VWkUHwWriDciit80wleYwKILoR/KMvxh/IdwS/paX+ZgpuRpCrKLUdadJbc0NpBEiyhpYawsJ73j9aCvOH+f7Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@rolldown/binding-linux-ppc64-gnu@1.0.3': + resolution: {integrity: sha512-5f1laC0SlIR0yDbFCd8acUhvJIag6N3zC5P7oUPN6wX0aOma+uKJ0wBDH5aq7I1PVI2ttTlhJwzwRIBnLiSGEg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + + '@rolldown/binding-linux-s390x-gnu@1.0.3': + resolution: {integrity: sha512-Iq4ko0r4XsgbrF/LunNgHtAGLRRVE2kXonAXQ/MV0mC6jQpMOhW1SvtZja2EhC/kd05++bP78dsqBeIQyYJ6Yg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + + '@rolldown/binding-linux-x64-gnu@1.0.3': + resolution: {integrity: sha512-B8m6tD5+/N5FeNQFbKlLA/2yVq9ycQP1SeedyEYYKWBNR3ZQbkvIUcNnDNM03lO1l5F2roiiFJGgvoLLyZXtSg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@rolldown/binding-linux-x64-musl@1.0.3': + resolution: {integrity: sha512-pSdpdUJHkuCxun9LE7jvgUB9qsRgaiyNNCX7m/AvHTcq67AiT/Yhoxvw5zPfhrM8k/BfP8ce/hMOpthKDpEUow==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@rolldown/binding-openharmony-arm64@1.0.3': + resolution: {integrity: sha512-OXXS3RKJgX2uLwM+gYyuH5omcH8fL1LJs96pZGgtetVCahON57+d4SJHzTgZiOjxgGkSnpXpOsWuPDGAKAigEg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@rolldown/binding-wasm32-wasi@1.0.3': + resolution: {integrity: sha512-JTtb8BWFynicNSoPrehsCzBtOKjZ6jhMiPFEmOiuXg1Fl8dn2KHQob+GuPSGR0dryQa1PQJbzjF3dqO/whhjLg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [wasm32] + + '@rolldown/binding-win32-arm64-msvc@1.0.3': + resolution: {integrity: sha512-gEdFFEN70A/jxb2svrWsN3aDL7OUtmvlOy+6fa2jxG8K0wQ1ZbdeLGnidov6Yu5/733dI5ySfzFlQ/cb0bSz1g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@rolldown/binding-win32-x64-msvc@1.0.3': + resolution: {integrity: sha512-eXB7CHuaQdqmJcc3koCNtNPmT/bj2gc999kUFgBxG8Ac0NdgXc4rkCHhqrgrhN3zddvvvrgzj1e90SuSfmyIXA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@rolldown/plugin-babel@0.2.3': + resolution: {integrity: sha512-+zEk16yGlz1F9STiRr6uG9hmIXb6nprjLczV/htGptYuLoCuxb+itZ03RKCEeOhBpDDd1NU7qF6x1VLMUp62bw==} + engines: {node: '>=22.12.0 || ^24.0.0'} + peerDependencies: + '@babel/core': ^7.29.0 || ^8.0.0-rc.1 + '@babel/plugin-transform-runtime': ^7.29.0 || ^8.0.0-rc.1 + '@babel/runtime': ^7.27.0 || ^8.0.0-rc.1 + rolldown: ^1.0.0-rc.5 + vite: ^8.0.0 + peerDependenciesMeta: + '@babel/plugin-transform-runtime': + optional: true + '@babel/runtime': + optional: true + vite: + optional: true + + '@rolldown/pluginutils@1.0.1': + resolution: {integrity: sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==} + + '@scarf/scarf@1.4.0': + resolution: {integrity: sha512-xxeapPiUXdZAE3che6f3xogoJPeZgig6omHEy1rIY5WVsB3H2BHNnZH+gHG6x91SCWyQCzWGsuL2Hh3ClO5/qQ==} + + '@sec-ant/readable-stream@0.4.1': + resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} + + '@sindresorhus/merge-streams@4.0.0': + resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} + engines: {node: '>=18'} + + '@so-ric/colorspace@1.1.6': + resolution: {integrity: sha512-/KiKkpHNOBgkFJwu9sh48LkHSMYGyuTcSFK/qMBdnOAlrRJzRSXAOFB5qwzaVQuDl8wAvHVMkaASQDReTahxuw==} + + '@stablelib/base64@1.0.1': + resolution: {integrity: sha512-1bnPQqSxSuc3Ii6MhBysoWCg58j97aUjuCSZrGSmDxNqtytIi0k8utUenAwTZN4V5mXXYGsVUI9zeBqy+jBOSQ==} + + '@standard-schema/spec@1.1.0': + resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} + + '@standard-schema/utils@0.3.0': + resolution: {integrity: sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==} + + '@tailwindcss/node@4.3.0': + resolution: {integrity: sha512-aFb4gUhFOgdh9AXo4IzBEOzBkkAxm9VigwDJnMIYv3lcfXCJVesNfbEaBl4BNgVRyid92AmdviqwBUBRKSeY3g==} + + '@tailwindcss/oxide-android-arm64@4.3.0': + resolution: {integrity: sha512-TJPiq67tKlLuObP6RkwvVGDoxCMBVtDgKkLfa/uyj7/FyxvQwHS+UOnVrXXgbEsfUaMgiVvC4KbJnRr26ho4Ng==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [android] + + '@tailwindcss/oxide-darwin-arm64@4.3.0': + resolution: {integrity: sha512-oMN/WZRb+SO37BmUElEgeEWuU8E/HXRkiODxJxLe1UTHVXLrdVSgfaJV7pSlhRGMSOiXLuxTIjfsF3wYvz8cgQ==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [darwin] + + '@tailwindcss/oxide-darwin-x64@4.3.0': + resolution: {integrity: sha512-N6CUmu4a6bKVADfw77p+iw6Yd9Q3OBhe0veaDX+QazfuVYlQsHfDgxBrsjQ/IW+zywL8mTrNd0SdJT/zgtvMdA==} + engines: {node: '>= 20'} + cpu: [x64] + os: [darwin] + + '@tailwindcss/oxide-freebsd-x64@4.3.0': + resolution: {integrity: sha512-zDL5hBkQdH5C6MpqbK3gQAgP80tsMwSI26vjOzjJtNCMUo0lFgOItzHKBIupOZNQxt3ouPH7RPhvNhiTfCe5CQ==} + engines: {node: '>= 20'} + cpu: [x64] + os: [freebsd] + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.0': + resolution: {integrity: sha512-R06HdNi7A7OEoMsf6d4tjZ71RCWnZQPHj2mnotSFURjNLdBC+cIgXQ7l81CqeoiQftjf6OOblxXMInMgN2VzMA==} + engines: {node: '>= 20'} + cpu: [arm] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-gnu@4.3.0': + resolution: {integrity: sha512-qTJHELX8jetjhRQHCLilkVLmybpzNQAtaI/gaoVoidn/ufbNDbAo8KlK2J+yPoc8wQxvDxCmh/5lr8nC1+lTbg==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-musl@4.3.0': + resolution: {integrity: sha512-Z6sukiQsngnWO+l39X4pPbiWT81IC+PLKF+PHxIlyZbGNb9MODfYlXEVlFvej5BOZInWX01kVyzeLvHsXhfczQ==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [linux] + + '@tailwindcss/oxide-linux-x64-gnu@4.3.0': + resolution: {integrity: sha512-DRNdQRpSGzRGfARVuVkxvM8Q12nh19l4BF/G7zGA1oe+9wcC6saFBHTISrpIcKzhiXtSrlSrluCfvMuledoCTQ==} + engines: {node: '>= 20'} + cpu: [x64] + os: [linux] + + '@tailwindcss/oxide-linux-x64-musl@4.3.0': + resolution: {integrity: sha512-Z0IADbDo8bh6I7h2IQMx601AdXBLfFpEdUotft86evd/8ZPflZe9COPO8Q1vw+pfLWIUo9zN/JGZvwuAJqduqg==} + engines: {node: '>= 20'} + cpu: [x64] + os: [linux] + + '@tailwindcss/oxide-wasm32-wasi@4.3.0': + resolution: {integrity: sha512-HNZGOUxEmElksYR7S6sC5jTeNGpobAsy9u7Gu0AskJ8/20FR9GqebUyB+HBcU/ax6BHuiuJi+Oda4B+YX6H1yA==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + bundledDependencies: + - '@napi-rs/wasm-runtime' + - '@emnapi/core' + - '@emnapi/runtime' + - '@tybys/wasm-util' + - '@emnapi/wasi-threads' + - tslib + + '@tailwindcss/oxide-win32-arm64-msvc@4.3.0': + resolution: {integrity: sha512-Pe+RPVTi1T+qymuuRpcdvwSVZjnll/f7n8gBxMMh3xLTctMDKqpdfGimbMyioqtLhUYZxdJ9wGNhV7MKHvgZsQ==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [win32] + + '@tailwindcss/oxide-win32-x64-msvc@4.3.0': + resolution: {integrity: sha512-Mvrf2kXW/yeW/OTezZlCGOirXRcUuLIBx/5Y12BaPM7wJoryG6dfS/NJL8aBPqtTEx/Vm4T4vKzFUcKDT+TKUA==} + engines: {node: '>= 20'} + cpu: [x64] + os: [win32] + + '@tailwindcss/oxide@4.3.0': + resolution: {integrity: sha512-F7HZGBeN9I0/AuuJS5PwcD8xayx5ri5GhjYUDBEVYUkexyA/giwbDNjRVrxSezE3T250OU2K/wp/ltWx3UOefg==} + engines: {node: '>= 20'} + + '@tailwindcss/vite@4.3.0': + resolution: {integrity: sha512-t6J3OrB5Fc0ExuhohouH0fWUGMYL6PTLhW+E7zIk/pdbnJARZDCwjBznFnkh5ynRnIRSI4YjtTH0t6USjJISrw==} + peerDependencies: + vite: ^5.2.0 || ^6 || ^7 || ^8 + + '@tanstack/query-core@5.101.0': + resolution: {integrity: sha512-cQetA74EB+seWySv1TTKr828TnP0u39m6LykwDXIo84SNortpDkp30TMEjkqtYCNP9c40uT/iwl6MLiufEt0Ow==} + + '@tanstack/react-query@5.101.0': + resolution: {integrity: sha512-rLlJXSpkqfizLWgkR5+eLeIk0MvTx/meEIR7LRjxic+qxiQP8zVjq7BqQkiCMNLQBlLfuOLqqr6KO5GtrDlmSg==} + peerDependencies: + react: ^18 || ^19 + + '@tanstack/react-table@8.21.3': + resolution: {integrity: sha512-5nNMTSETP4ykGegmVkhjcS8tTLW6Vl4axfEGQN3v0zdHYbK4UfoqfPChclTrJ4EoK9QynqAu9oUf8VEmrpZ5Ww==} + engines: {node: '>=12'} + peerDependencies: + react: '>=16.8' + react-dom: '>=16.8' + + '@tanstack/table-core@8.21.3': + resolution: {integrity: sha512-ldZXEhOBb8Is7xLs01fR3YEc3DERiz5silj8tnGkFZytt1abEvl/GhUmCE0PMLaMPTa3Jk4HbKmRlHmu+gCftg==} + engines: {node: '>=12'} + + '@testing-library/dom@10.4.1': + resolution: {integrity: sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==} + engines: {node: '>=18'} + + '@testing-library/jest-dom@7.0.0': + resolution: {integrity: sha512-HKAH9C6mBo5yBG6yRO5i43L2iisencAo5z+o5P/saHUoY+miC5ivXRxHBJcFyB5ypPNxHJdK3BoF/3O4DIptMg==} + engines: {node: '>=22', npm: '>=6', yarn: '>=1'} + peerDependencies: + '@testing-library/dom': '>=10 <11' + + '@testing-library/react@16.3.2': + resolution: {integrity: sha512-XU5/SytQM+ykqMnAnvB2umaJNIOsLF3PVv//1Ew4CTcpz0/BRyy/af40qqrt7SjKpDdT1saBMc42CUok5gaw+g==} + engines: {node: '>=18'} + peerDependencies: + '@testing-library/dom': ^10.0.0 + '@types/react': ^18.0.0 || ^19.0.0 + '@types/react-dom': ^18.0.0 || ^19.0.0 + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@testing-library/user-event@14.6.1': + resolution: {integrity: sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==} + engines: {node: '>=12', npm: '>=6'} + peerDependencies: + '@testing-library/dom': '>=7.21.4' + + '@ts-morph/common@0.27.0': + resolution: {integrity: sha512-Wf29UqxWDpc+i61k3oIOzcUfQt79PIT9y/MWfAGlrkjg6lBC1hwDECLXPVJAhWjiGbfBCxZd65F/LIZF3+jeJQ==} + + '@tybys/wasm-util@0.10.2': + resolution: {integrity: sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==} + + '@types/aria-query@5.0.4': + resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} + + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + + '@types/babel__generator@7.27.0': + resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} + + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + + '@types/babel__traverse@7.28.0': + resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} + + '@types/bcrypt@6.0.0': + resolution: {integrity: sha512-/oJGukuH3D2+D+3H4JWLaAsJ/ji86dhRidzZ/Od7H/i8g+aCmvkeCc6Ni/f9uxGLSQVCRZkX2/lqEFG2BvWtlQ==} + + '@types/body-parser@1.19.6': + resolution: {integrity: sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==} + + '@types/chai@5.2.3': + resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} + + '@types/compression@1.8.1': + resolution: {integrity: sha512-kCFuWS0ebDbmxs0AXYn6e2r2nrGAb5KwQhknjSPSPgJcGd8+HVSILlUyFhGqML2gk39HcG7D1ydW9/qpYkN00Q==} + + '@types/connect@3.4.38': + resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + + '@types/cookie-parser@1.4.10': + resolution: {integrity: sha512-B4xqkqfZ8Wek+rCOeRxsjMS9OgvzebEzzLYw7NHYuvzb7IdxOkI0ZHGgeEBX4PUM7QGVvNSK60T3OvWj3YfBRg==} + peerDependencies: + '@types/express': '*' + + '@types/cookiejar@2.1.5': + resolution: {integrity: sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q==} + + '@types/cors@2.8.19': + resolution: {integrity: sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==} + + '@types/d3-array@3.2.2': + resolution: {integrity: sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==} + + '@types/d3-color@3.1.3': + resolution: {integrity: sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==} + + '@types/d3-ease@3.0.2': + resolution: {integrity: sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==} + + '@types/d3-interpolate@3.0.4': + resolution: {integrity: sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==} + + '@types/d3-path@3.1.1': + resolution: {integrity: sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==} + + '@types/d3-scale@4.0.9': + resolution: {integrity: sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==} + + '@types/d3-shape@3.1.8': + resolution: {integrity: sha512-lae0iWfcDeR7qt7rA88BNiqdvPS5pFVPpo5OfjElwNaT2yyekbM0C9vK+yqBqEmHr6lDkRnYNoTBYlAgJa7a4w==} + + '@types/d3-time@3.0.4': + resolution: {integrity: sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==} + + '@types/d3-timer@3.0.2': + resolution: {integrity: sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==} + + '@types/deep-eql@4.0.2': + resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + + '@types/esrecurse@4.3.1': + resolution: {integrity: sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==} + + '@types/estree@1.0.9': + resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} + + '@types/express-serve-static-core@5.1.1': + resolution: {integrity: sha512-v4zIMr/cX7/d2BpAEX3KNKL/JrT1s43s96lLvvdTmza1oEvDudCqK9aF/djc/SWgy8Yh0h30TZx5VpzqFCxk5A==} + + '@types/express@5.0.6': + resolution: {integrity: sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA==} + + '@types/geojson@7946.0.16': + resolution: {integrity: sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==} + + '@types/hoist-non-react-statics@3.3.7': + resolution: {integrity: sha512-PQTyIulDkIDro8P+IHbKCsw7U2xxBYflVzW/FgWdCAePD9xGSidgA76/GeJ6lBKoblyhf9pBY763gbrN+1dI8g==} + peerDependencies: + '@types/react': '*' + + '@types/http-errors@2.0.5': + resolution: {integrity: sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/jsonwebtoken@9.0.10': + resolution: {integrity: sha512-asx5hIG9Qmf/1oStypjanR7iKTv0gXQ1Ov/jfrX6kS/EO0OFni8orbmGCn0672NHR3kXHwpAwR+B368ZGN/2rA==} + + '@types/leaflet@1.9.21': + resolution: {integrity: sha512-TbAd9DaPGSnzp6QvtYngntMZgcRk+igFELwR2N99XZn7RXUdKgsXMR+28bUO0rPsWp8MIu/f47luLIQuSLYv/w==} + + '@types/methods@1.1.4': + resolution: {integrity: sha512-ymXWVrDiCxTBE3+RIrrP533E70eA+9qu7zdWoHuOmGujkYtzf4HQF96b8nwHLqhuf4ykX61IGRIB38CC6/sImQ==} + + '@types/ms@2.1.0': + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + + '@types/node@22.19.19': + resolution: {integrity: sha512-dyh/xO2Fh5bYrfWaaqGrRQQGkNdmYw6AmaAUvYeUMNTWQtvb796ikLdmTchRmOlOiIJ1TDXfWgVx1QkUlQ6Hew==} + + '@types/node@24.12.4': + resolution: {integrity: sha512-GUUEShf+PBCGW2KaXwcIt3Yk+e3pkKwWKb9GSyM9WQVE+ep2jzmHdGsHzu4wgcZy5fN9FBdVzjpBQsYlpfpgLA==} + + '@types/qs@6.15.1': + resolution: {integrity: sha512-GZHUBZR9hckSUhrxmp1nG6NwdpM9fCunJwyThLW1X3AyHgd9IlHb6VANpQQqDr2o/qQp6McZ3y/IA2rVzKzSbw==} + + '@types/range-parser@1.2.7': + resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} + + '@types/react-dom@19.2.3': + resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==} + peerDependencies: + '@types/react': ^19.2.0 + + '@types/react@19.2.16': + resolution: {integrity: sha512-esJiCAnl0kfpNdE69f3So4WJUXy95dLZydX0KwK46riIHDzHM7O9Vtf9xCHW0PXIqvgqNrswl522kA/5yx+F4w==} + + '@types/send@1.2.1': + resolution: {integrity: sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==} + + '@types/serve-static@2.2.0': + resolution: {integrity: sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ==} + + '@types/superagent@8.1.11': + resolution: {integrity: sha512-KA7srSW/HENDtOw9DOqaFLgWuMqN9WgjEw62lh9dpvRaZDkhdOkazASd7X7i2eMUYLHa1U37ZttnePsH5zTDHw==} + + '@types/supertest@7.2.1': + resolution: {integrity: sha512-4CbBvoYVLHL7+yhbYrZET0vsvuyXTC05aRe7dNQkwMzm56auceoy6Yu3K50uZmwfHna1os3CMSgM/3QVkUtPTw==} + + '@types/swagger-jsdoc@6.0.4': + resolution: {integrity: sha512-W+Xw5epcOZrF/AooUM/PccNMSAFOKWZA5dasNyMujTwsBkU74njSJBpvCCJhHAJ95XRMzQrrW844Btu0uoetwQ==} + + '@types/swagger-ui-express@4.1.8': + resolution: {integrity: sha512-AhZV8/EIreHFmBV5wAs0gzJUNq9JbbSXgJLQubCC0jtIo6prnI9MIRRxnU4MZX9RB9yXxF1V4R7jtLl/Wcj31g==} + + '@types/triple-beam@1.3.5': + resolution: {integrity: sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==} + + '@types/use-sync-external-store@0.0.6': + resolution: {integrity: sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==} + + '@types/validate-npm-package-name@4.0.2': + resolution: {integrity: sha512-lrpDziQipxCEeK5kWxvljWYhUvOiB2A9izZd9B2AFarYAkqZshb4lPbRs7zKEic6eGtH8V/2qJW+dPp9OtF6bw==} + + '@types/webidl-conversions@7.0.3': + resolution: {integrity: sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==} + + '@types/whatwg-url@13.0.0': + resolution: {integrity: sha512-N8WXpbE6Wgri7KUSvrmQcqrMllKZ9uxkYWMt+mCSGwNc0Hsw9VQTW7ApqI4XNrx6/SaM2QQJCzMPDEXE058s+Q==} + + '@typescript-eslint/eslint-plugin@8.60.1': + resolution: {integrity: sha512-JQ4S5GB0tfjO8BuJ4fcX+HodkzJjYBV+7OJ+wLygaX7OGQ7FudyHL4NSCA6ob+w3Yn+5MkKIozOwQhXeM7opVg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.60.1 + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/eslint-plugin@8.65.0': + resolution: {integrity: sha512-IEgob78X12rHpUmtcwFsXhZdVGJtwTVP8FiCLZkR6GlYVrl2PcuB+KhCE5BlVC/eQpQnu8WXRtkHZuPar+gCRA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.65.0 + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/parser@8.60.1': + resolution: {integrity: sha512-A0M6ua6H252bVjPvvtSgl2QA4+ET9S5Mtkb2GDyTxIhH/C4qDItT7RQNO5PhMC6NXGYXOR9dIalcDDgBKT7oFA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/parser@8.65.0': + resolution: {integrity: sha512-CZ4nMxWwgu1HEEFNkeaCptra9QCtkmKdgf3sWh1rl1trIhmxLilgTV4cwcbQ4wemnT4sWQN8CaKOmdYx+g2gMA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/project-service@8.60.1': + resolution: {integrity: sha512-eXkTH2bxmXlqD1RnOPmLZ9ZM9D3VwSx04JOwBnP9RQ+yUA5a2Mu7SfW8uaV2Aon53NJzZlZYuX7tn91Izf+xaw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/project-service@8.65.0': + resolution: {integrity: sha512-SxnPhbTsGahizDgbu7oqFH/xVtzIqMd/s+WtnSxNxJZJpLbdT5IPdzg8EZxO3+PoKahXmwJLeNQOpKJb3/bi7Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/scope-manager@8.60.1': + resolution: {integrity: sha512-gvI5OQoptnxQnchOirukCuQ55svJSTuD/4k5+pC267xyBtYry748R9/c3tYUzb/iE6RZfllRz2lVulLCHkTm4w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/scope-manager@8.65.0': + resolution: {integrity: sha512-Esbl8OSYiVxBokYgWPf7VVWg/BE798wXhimnn9ML9Pt5qoDf8bfQlgjlKXR/k98+AcNzlLKYrpCcrcuZ9DZLgg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/tsconfig-utils@8.60.1': + resolution: {integrity: sha512-nh8w4qAteiKuZu3pSSzG/yGKpw0OlkrKnzFmbVRenKaD4qc+7i1GrmZaLVkr8rk4uipiPGMOW4YsM6WmKZ5CvA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/tsconfig-utils@8.65.0': + resolution: {integrity: sha512-j6GzGqCiRdA7Qhur2VVmKZAkBLfnHFQfx4TaJGL9RMveZqCo48jSHHO0DTgizEnGhtWnqmbtCUSrqSkdiY/0Hg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/type-utils@8.60.1': + resolution: {integrity: sha512-sdwTrpjosW7ANQYJ39ZBF1ZyEMEGVB2UsikrserVM/30a/F1dTLnu9bGxEdosugyu5caigjLrR2qiD11asjI1A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/type-utils@8.65.0': + resolution: {integrity: sha512-YjaZ7PRI5qY7ax2L3PbvX0rRyGtipAReCWs0mhhDBHjH/vl0g0BonaGXrKdKpMbIIsMIwDgbk/xzkBTyAltS5g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/types@8.60.1': + resolution: {integrity: sha512-4h0tY8ppCkdCzcrl2YM5M3my0xsE1Tf8om3owEu5oPWmXwkKRmk0j0LGDzYBGUcAlesEbxBhazqu/K4cu3Ug7w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/types@8.65.0': + resolution: {integrity: sha512-JSSwWNy+H0E/01jJEM+hrX6N0OFDzFzeIhHFSAS01tlVaevpG8cFyYRPhS5yjGOvBUx3sqQHVMjCL1CAZZMxBg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/typescript-estree@8.60.1': + resolution: {integrity: sha512-alpRkfG8hlVE5kdJW2GkfgDgXxold3e8e4l6EnmhRmRLbekgAPCCGDVD++sABy9FcgPFroq+uFcCSM1vR57Cew==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/typescript-estree@8.65.0': + resolution: {integrity: sha512-JboAE2swaYt4tb1fHhHTABE2K+OLy09XfcTbhnk4Pw96f9dd2e9iYsJ28gBggHlo5z5x1rkyWvcPoTuNTd4oGg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/utils@8.60.1': + resolution: {integrity: sha512-h2MPBLoNtjc3qZWfY3Tl51yPorQ2McHn8pJfcMNTcIvrrZrr90Ykffit0yjrPFWQcRcUxzH20+6OcVdW4yHtUg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/utils@8.65.0': + resolution: {integrity: sha512-gXiwIHsYreboxeJucHKPvgwl7dXt50mF8s1/c00cP/WoVTyWKFdtfhRWwZiXYFU5H2O8vVoSLNrexFZjYS/SGA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/visitor-keys@8.60.1': + resolution: {integrity: sha512-EbGRQg4FhrmwLodl+t3JNAnXHWVr9Vp+Zl1QBZVPY4ByfkzIT8cX3K6QWODHtkIZqqJVEWvhHSx3v5PDHsaQag==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/visitor-keys@8.65.0': + resolution: {integrity: sha512-8C71BQkGjiMmXtop7pHVJu1l2NNShFdkCyD6a2ezzs5vU/L3LRtb69EtcteFwz0mYMPzIgOw0n6OV4VBUWZd7A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@vitejs/plugin-react@6.0.2': + resolution: {integrity: sha512-DlSMqo4WhThw4vB8Mpn0Woe9J+Jfq1geJ61AKW0QEgLzGMNwtIMdxbDUzLxcun8W7NbJO0e2Jg/Nxm3cCSVzzg==} + engines: {node: ^20.19.0 || >=22.12.0} + peerDependencies: + '@rolldown/plugin-babel': ^0.1.7 || ^0.2.0 + babel-plugin-react-compiler: ^1.0.0 + vite: ^8.0.0 + peerDependenciesMeta: + '@rolldown/plugin-babel': + optional: true + babel-plugin-react-compiler: + optional: true + + '@vitest/coverage-v8@4.1.10': + resolution: {integrity: sha512-IM49HmthevbgAO4anp1hwtoT9wYe59w0LR00gr+eagHE+ZJ5lK4sLPeO0ubgoJcwLk6dehU3R24N+FbEEKDc8g==} + peerDependencies: + '@vitest/browser': 4.1.10 + vitest: 4.1.10 + peerDependenciesMeta: + '@vitest/browser': + optional: true + + '@vitest/expect@4.1.10': + resolution: {integrity: sha512-YsCn+qAk1GWjQOWFEsEcL2gNQ0zmVmQu3T03qP6UyjhtmdtwtbuI+DASn/7iQB3HGTXkdBwGddzxPlmiql5vlA==} + + '@vitest/mocker@4.1.10': + resolution: {integrity: sha512-v0xaezt+DKEmKfaxg133ldzADrwLGd7Ze1MfQQTYfvs8OqZIwbxyxaYURivwV7sWy5fqn3rH5uOrSp07bp44Ow==} + peerDependencies: + msw: ^2.4.9 + vite: ^6.0.0 || ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + + '@vitest/pretty-format@4.1.10': + resolution: {integrity: sha512-W1HsjSH4MXQ9YfmmhLAoIYf1HRfekQCGngeIgcei6MP5QQGWUe0gkopdZQaVCFO+JDJMrAJGwa5pRpNpvy4P8Q==} + + '@vitest/runner@4.1.10': + resolution: {integrity: sha512-IKI6kpIH+LmpROplyLwBBaCfMgOZOMsygVa6BARD6ahA04VRuJSa6OaVG7kRvSEMD870Vd91rSSw0eegtWyLGg==} + + '@vitest/snapshot@4.1.10': + resolution: {integrity: sha512-xRkfOT1qpTAi/Ti4Y1LtfRc3kEuqxGw59eN2jN9pRWMtS/XDevekhcFSqvQqjUNGksfjMJu3Y+oJ+4Ypn2OaJw==} + + '@vitest/spy@4.1.10': + resolution: {integrity: sha512-PLf/Ugvoq5wO/b4rwYCR1h2PSIdXz7wnkQFMiUpLdtM7l6pqVFcQIBEHyT1+l+cj7mNwAfZHzqXqDyjvOuwbDw==} + + '@vitest/utils@4.1.10': + resolution: {integrity: sha512-fy9am/HWxbaGt/Sawrp90vt6Y6jQwf1RX77cz3uwoJwJVMli/e1IEwRPnMNJ7vKfPTwo0diXifkpPvwH9v7nGA==} + + accepts@2.0.0: + resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} + engines: {node: '>= 0.6'} + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.16.0: + resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} + engines: {node: '>=0.4.0'} + hasBin: true + + agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + + agent-base@7.1.4: + resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} + engines: {node: '>= 14'} + + ajv-draft-04@1.0.0: + resolution: {integrity: sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==} + peerDependencies: + ajv: ^8.5.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv-formats@2.1.1: + resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv-formats@3.0.1: + resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv@6.15.0: + resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==} + + ajv@8.20.0: + resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==} + + ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + + ansi-escapes@7.3.0: + resolution: {integrity: sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==} + engines: {node: '>=18'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.2.2: + resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} + engines: {node: '>=12'} + + ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + + ansi-styles@6.2.3: + resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} + engines: {node: '>=12'} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + aria-hidden@1.2.6: + resolution: {integrity: sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==} + engines: {node: '>=10'} + + aria-query@5.3.0: + resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} + + aria-query@5.3.2: + resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} + engines: {node: '>= 0.4'} + + asap@2.0.6: + resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} + + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} + + ast-types@0.16.1: + resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==} + engines: {node: '>=4'} + + ast-v8-to-istanbul@1.0.5: + resolution: {integrity: sha512-UPAgKJFSEGMWSDr3LX4tqnAb4f7KGT8O40Tyx8wbYmmZ/yn58lNCm8h3svs3eXgiGd5AXxz8NDOvXWvicq+rJA==} + + async-mutex@0.5.0: + resolution: {integrity: sha512-1A94B18jkJ3DYq284ohPxoXbfTA5HsQ7/Mf4DEhcyLx3Bz27Rh59iScbB6EPiP+B+joue6YCxcMXSbFC1tZKwA==} + + async@3.2.6: + resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + atomically@1.7.0: + resolution: {integrity: sha512-Xcz9l0z7y9yQ9rdDaxlmaI4uJHf/T8g9hOEzJcsEqX2SjCj4J20uK7+ldkDHMbpJDK76wF7xEIgxc/vSlsfw5w==} + engines: {node: '>=10.12.0'} + + axios@1.17.0: + resolution: {integrity: sha512-J8SwNxprqqpbfenehxWYXE7CW+wM1BB4w3+N+g+/Wx40xM4rsLrfPmHHxSWIxJLYDgSY/HqlFPIYb2/S3rxafw==} + + axios@1.18.1: + resolution: {integrity: sha512-3nTvFlvpn9Zu/RkHUqtc7/+al4UpRW5az71ap5zccp6e8RAYEzhMTecX8Dz1wWDYrPpUoB1HAQEGEAEvUr7S9g==} + + b4a@1.8.1: + resolution: {integrity: sha512-aiqre1Nr0B/6DgE2N5vwTc+2/oQZ4Wh1t4NznYY4E00y8LCt6NqdRv81so00oo27D8MVKTpUa/MwUUtBLXCoDw==} + peerDependencies: + react-native-b4a: '*' + peerDependenciesMeta: + react-native-b4a: + optional: true + + babel-plugin-react-compiler@1.0.0: + resolution: {integrity: sha512-Ixm8tFfoKKIPYdCCKYTsqv+Fd4IJ0DQqMyEimo+pxUOMUR9cVPlwTrFt9Avu+3cb6Zp3mAzl+t1MrG2fxxKsxw==} + + balanced-match@4.0.4: + resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} + engines: {node: 18 || 20 || >=22} + + bare-events@2.9.1: + resolution: {integrity: sha512-Z0oHEHAFDZkffN8Qc39zNZjQlMDkPJRyyyZieU1VH7u8c5S+qHZ2S8ixdKIAxEjfHO7FJxXmJWgteOghVanIsg==} + peerDependencies: + bare-abort-controller: '*' + peerDependenciesMeta: + bare-abort-controller: + optional: true + + bare-fs@4.7.4: + resolution: {integrity: sha512-y1kC+ffIx/tPLdTE693uNjHfzTfr+ravR5tvWlMXe25nELbkqV400S71qHDwbkAQ1FVEZobB1NFRzFbCCcyBCQ==} + engines: {bare: '>=1.16.0'} + peerDependencies: + bare-buffer: '*' + peerDependenciesMeta: + bare-buffer: + optional: true + + bare-path@3.1.1: + resolution: {integrity: sha512-JprUlveX3QjApC1cTpsUOiscADftCGVWkzitbHsRqv84hzYwYHw2mbluddsq5TvI8mH/8Ov1f4BiMAdcB0oYnQ==} + + bare-stream@2.13.3: + resolution: {integrity: sha512-Kc+brLqvEqGkjyfiwJmImAOqLZL7OsoLKuavx+hJjgVV3nLTOjloJyPMFxjUPerGGHrNH0fLU06jjykMLWrERQ==} + peerDependencies: + bare-abort-controller: '*' + bare-buffer: '*' + bare-events: '*' + peerDependenciesMeta: + bare-abort-controller: + optional: true + bare-buffer: + optional: true + bare-events: + optional: true + + bare-url@2.4.6: + resolution: {integrity: sha512-iQxPClE07hETVpbRoX7JXX3v/ZQViCxe/SYCxylRLzdEx1xJAufPptfiOqR8tqiCtmbtMDANKWszzjLu1PMAZQ==} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + baseline-browser-mapping@2.10.33: + resolution: {integrity: sha512-bA6+tcSLpz2tIEdDXZPpPTIuxBcC4+w6SieaYyfigIa4h8GlFxbA17v22Vx3JUtuZQj9SgOsnbK+aTBzyDyEuw==} + engines: {node: '>=6.0.0'} + hasBin: true + + bcrypt@6.0.0: + resolution: {integrity: sha512-cU8v/EGSrnH+HnxV2z0J7/blxH8gq7Xh2JFT6Aroax7UohdmiJJlxApMxtKfuI7z68NvvVcmR78k2LbT6efhRg==} + engines: {node: '>= 18'} + + bidi-js@1.0.3: + resolution: {integrity: sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==} + + body-parser@2.2.2: + resolution: {integrity: sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==} + engines: {node: '>=18'} + + brace-expansion@5.0.6: + resolution: {integrity: sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==} + engines: {node: 18 || 20 || >=22} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + brotli@1.3.3: + resolution: {integrity: sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg==} + + browserslist@4.28.2: + resolution: {integrity: sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + bson@7.2.0: + resolution: {integrity: sha512-YCEo7KjMlbNlyHhz7zAZNDpIpQbd+wOEHJYezv0nMYTn4x31eIUM2yomNNubclAt63dObUzKHWsBLJ9QcZNSnQ==} + engines: {node: '>=20.19.0'} + + buffer-equal-constant-time@1.0.1: + resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} + + bundle-name@4.1.0: + resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} + engines: {node: '>=18'} + + bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + + call-me-maybe@1.0.2: + resolution: {integrity: sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + + caniuse-lite@1.0.30001793: + resolution: {integrity: sha512-iwSsYWaCOoh26cV8NwNRViHlrfUvYsHDfRVcbtmw0Kg6PJIZZXwMkj1442FYLBGkeUf1juAsU3DTfxW579mrPA==} + + chai@6.2.2: + resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} + engines: {node: '>=18'} + + chalk@5.6.2: + resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + class-variance-authority@0.7.1: + resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==} + + cli-cursor@5.0.0: + resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} + engines: {node: '>=18'} + + cli-spinners@2.9.2: + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + engines: {node: '>=6'} + + cli-truncate@5.2.0: + resolution: {integrity: sha512-xRwvIOMGrfOAnM1JYtqQImuaNtDEv9v6oIYAs4LIHwTiKee8uwvIi363igssOC0O5U04i4AlENs79LQLu9tEMw==} + engines: {node: '>=20'} + + cloudinary@2.10.0: + resolution: {integrity: sha512-sY09kYg7wprkndAOjZBAYqFZqwL+SxnEGcAvksOvFA+5upnFn949UjkEkHKNSwkBtW/xRDd0p6NgbSXZcxkI3w==} + engines: {node: '>=9'} + + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + + code-block-writer@13.0.3: + resolution: {integrity: sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg==} + + color-convert@3.1.3: + resolution: {integrity: sha512-fasDH2ont2GqF5HpyO4w0+BcewlhHEZOFn9c1ckZdHpJ56Qb7MHhH/IcJZbBGgvdtwdwNbLvxiBEdg336iA9Sg==} + engines: {node: '>=14.6'} + + color-name@2.1.0: + resolution: {integrity: sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==} + engines: {node: '>=12.20'} + + color-string@2.1.4: + resolution: {integrity: sha512-Bb6Cq8oq0IjDOe8wJmi4JeNn763Xs9cfrBcaylK1tPypWzyoy2G3l90v9k64kjphl/ZJjPIShFztenRomi8WTg==} + engines: {node: '>=18'} + + color@5.0.3: + resolution: {integrity: sha512-ezmVcLR3xAVp8kYOm4GS45ZLLgIE6SPAFoduLr6hTDajwb3KZ2F46gulK3XpcwRFb5KKGCSezCBAY4Dw4HsyXA==} + engines: {node: '>=18'} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + commander@11.1.0: + resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} + engines: {node: '>=16'} + + commander@14.0.3: + resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==} + engines: {node: '>=20'} + + commander@6.2.0: + resolution: {integrity: sha512-zP4jEKbe8SHzKJYQmq8Y9gYjtO/POJLgIdKgV7B9qNmABVFVc+ctqSX6iXh4mCpJfRBOabiZ2YKPg8ciDw6C+Q==} + engines: {node: '>= 6'} + + commondir@1.0.1: + resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + + component-emitter@1.3.1: + resolution: {integrity: sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==} + + compressible@2.0.18: + resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} + engines: {node: '>= 0.6'} + + compression@1.8.1: + resolution: {integrity: sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==} + engines: {node: '>= 0.8.0'} + + conf@10.2.0: + resolution: {integrity: sha512-8fLl9F04EJqjSqH+QjITQfJF8BrOVaYr1jewVgSRAEWePfxT0sku4w2hrGQ60BC/TNLGQ2pgxNlTbWQmMPFvXg==} + engines: {node: '>=12'} + + content-disposition@1.1.0: + resolution: {integrity: sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==} + engines: {node: '>=18'} + + content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + + content-type@2.0.0: + resolution: {integrity: sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ==} + engines: {node: '>=18'} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + cookie-parser@1.4.7: + resolution: {integrity: sha512-nGUvgXnotP3BsjiLX2ypbQnWoGUPIIfHQNZkkC668ntrzGWEZVW70HDEB1qnNGMicPje6EttlIgzo51YSwNQGw==} + engines: {node: '>= 0.8.0'} + + cookie-signature@1.0.6: + resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + + cookie-signature@1.2.2: + resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} + engines: {node: '>=6.6.0'} + + cookie@0.7.2: + resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} + engines: {node: '>= 0.6'} + + cookie@1.1.1: + resolution: {integrity: sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==} + engines: {node: '>=18'} + + cookiejar@2.1.4: + resolution: {integrity: sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==} + + cors@2.8.6: + resolution: {integrity: sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==} + engines: {node: '>= 0.10'} + + cosmiconfig@9.0.2: + resolution: {integrity: sha512-gtTZxTDau1wL7Y7zifc2dd8jHSK/k6BTx/2Xp/BpdlAdnlYWFVt7qhJqgwi7637yRwRQ3qL4ZidbB4I8tA5VOg==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + css-tree@3.2.1: + resolution: {integrity: sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + + css.escape@1.5.1: + resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + + d3-array@3.2.4: + resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} + engines: {node: '>=12'} + + d3-color@3.1.0: + resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} + engines: {node: '>=12'} + + d3-ease@3.0.1: + resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==} + engines: {node: '>=12'} + + d3-format@3.1.2: + resolution: {integrity: sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==} + engines: {node: '>=12'} + + d3-interpolate@3.0.1: + resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} + engines: {node: '>=12'} + + d3-path@3.1.0: + resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==} + engines: {node: '>=12'} + + d3-scale@4.0.2: + resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==} + engines: {node: '>=12'} + + d3-shape@3.2.0: + resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==} + engines: {node: '>=12'} + + d3-time-format@4.1.0: + resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==} + engines: {node: '>=12'} + + d3-time@3.1.0: + resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==} + engines: {node: '>=12'} + + d3-timer@3.0.1: + resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} + engines: {node: '>=12'} + + data-uri-to-buffer@4.0.1: + resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} + engines: {node: '>= 12'} + + data-urls@7.0.0: + resolution: {integrity: sha512-23XHcCF+coGYevirZceTVD7NdJOqVn+49IHyxgszm+JIiHLoB2TkmPtsYkNWT1pvRSGkc35L6NHs0yHkN2SumA==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + + date-fns@4.4.0: + resolution: {integrity: sha512-+1UMbeh68lH1SegH83CGWwpb6OHHbpSgr3+s5Eww5M4CAgswBpoWS0AjTOfEJ33HiYKz1hdj/KTFprzXHmq/6w==} + + debounce-fn@4.0.0: + resolution: {integrity: sha512-8pYCQiL9Xdcg0UPSD3d+0KMlOjp+KGU5EPwYddgzQ7DATsg4fuUDjQtsYLmWjnk2obnNHgV3vE2Y4jejSOJVBQ==} + engines: {node: '>=10'} + + debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decimal.js-light@2.5.1: + resolution: {integrity: sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==} + + decimal.js@10.6.0: + resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==} + + dedent@1.7.2: + resolution: {integrity: sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA==} + peerDependencies: + babel-plugin-macros: ^3.1.0 + peerDependenciesMeta: + babel-plugin-macros: + optional: true + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + deepmerge@2.2.1: + resolution: {integrity: sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA==} + engines: {node: '>=0.10.0'} + + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + + default-browser-id@5.0.1: + resolution: {integrity: sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==} + engines: {node: '>=18'} + + default-browser@5.5.0: + resolution: {integrity: sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==} + engines: {node: '>=18'} + + define-lazy-prop@2.0.0: + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} + + define-lazy-prop@3.0.0: + resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} + engines: {node: '>=12'} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} + + detect-node-es@1.1.0: + resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} + + dezalgo@1.0.4: + resolution: {integrity: sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==} + + diff@8.0.4: + resolution: {integrity: sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==} + engines: {node: '>=0.3.1'} + + doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + + dom-accessibility-api@0.5.16: + resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} + + dom-accessibility-api@0.6.3: + resolution: {integrity: sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==} + + dot-prop@6.0.1: + resolution: {integrity: sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==} + engines: {node: '>=10'} + + dotenv@17.4.2: + resolution: {integrity: sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw==} + engines: {node: '>=12'} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + ecdsa-sig-formatter@1.0.11: + resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} + + eciesjs@0.4.18: + resolution: {integrity: sha512-wG99Zcfcys9fZux7Cft8BAX/YrOJLJSZ3jyYPfhZHqN2E+Ffx+QXBDsv3gubEgPtV6dTzJMSQUwk1H98/t/0wQ==} + engines: {bun: '>=1', deno: '>=2', node: '>=16'} + + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + + electron-to-chromium@1.5.367: + resolution: {integrity: sha512-4Mk/mrynCNQ+atY40D3UpmhLWB6AHMbYMlIrPhHcMF6x0L7O0b052FCAsxw1LlaR++UFuNg3D/A6XCuGDa0guQ==} + + emoji-regex@10.6.0: + resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} + + enabled@2.0.0: + resolution: {integrity: sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==} + + encodeurl@2.0.0: + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + engines: {node: '>= 0.8'} + + enhanced-resolve@5.22.2: + resolution: {integrity: sha512-0rxICaFZ7NQho/sHely2bvOPRP0Eu2B0NZ9zM54YvRvWMn7jfz3DmnOZDR9LlXDdDcqntAVc6Hfy4gr/tdH/Ag==} + engines: {node: '>=10.13.0'} + + enquirer@2.4.1: + resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} + engines: {node: '>=8.6'} + + entities@8.0.0: + resolution: {integrity: sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==} + engines: {node: '>=20.19.0'} + + env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + + environment@1.1.0: + resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} + engines: {node: '>=18'} + + error-ex@1.3.4: + resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-module-lexer@2.3.1: + resolution: {integrity: sha512-shc1dbU90Yl/xq1QrC7QRtfcwURZuVRfPhZbDoldJ1cn1gzDvBaBWlv0eFolj5+0znnPJz5TXLxsN77X/12KTA==} + + es-object-atoms@1.1.2: + resolution: {integrity: sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + es-toolkit@1.49.0: + resolution: {integrity: sha512-G5iZ6Pc/FNRY/soKZHC+TxGDD83rHUDXxzaWhGCX44vAv/tMs56WMusnm/KMNK+luUPsgA9U28cGr4RDlSzL2g==} + + esbuild@0.28.0: + resolution: {integrity: sha512-sNR9MHpXSUV/XB4zmsFKN+QgVG82Cc7+/aaxJ8Adi8hyOac+EXptIp45QBPaVyX3N70664wRbTcLTOemCAnyqw==} + engines: {node: '>=18'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + eslint-plugin-react-hooks@7.1.1: + resolution: {integrity: sha512-f2I7Gw6JbvCexzIInuSbZpfdQ44D7iqdWX01FKLvrPgqxoE7oMj8clOfto8U6vYiz4yd5oKu39rRSVOe1zRu0g==} + engines: {node: '>=18'} + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 || ^10.0.0 + + eslint-plugin-react-refresh@0.5.2: + resolution: {integrity: sha512-hmgTH57GfzoTFjVN0yBwTggnsVUF2tcqi7RJZHqi9lIezSs4eFyAMktA68YD4r5kNw1mxyY4dmkyoFDb3FIqrA==} + peerDependencies: + eslint: ^9 || ^10 + + eslint-scope@9.1.2: + resolution: {integrity: sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@5.0.1: + resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + eslint@10.4.1: + resolution: {integrity: sha512-AyIKhnOBuOAdueD7RB3xB+YeAWScb9jHsJBgH2Hcde8InP5JYhqrRR6iTMHyTEwgENK54Cp44e4v8BwNhsuHuw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true + + eslint@10.7.0: + resolution: {integrity: sha512-GVTD7s1vdIl6UYvAfriOPeY1Df8LIZjfofLvHwde+erDHGGuHyuM6xoxRxmHiebhYuD2p1vN4wWh0XzPARSGDQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true + + espree@11.2.0: + resolution: {integrity: sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + esquery@1.7.0: + resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + + eventemitter3@5.0.4: + resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} + + events-universal@1.0.1: + resolution: {integrity: sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==} + + eventsource-parser@3.1.0: + resolution: {integrity: sha512-kJezFj9YFAMLeORyi7aCLxLbD5/qWMQnoMVlVPyHIll7lgRJCc3JVln9Vgl9nwQi0YkMnhdGTMNn7CkRRAptMg==} + engines: {node: '>=18.0.0'} + + eventsource@3.0.7: + resolution: {integrity: sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==} + engines: {node: '>=18.0.0'} + + execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + + execa@9.6.1: + resolution: {integrity: sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA==} + engines: {node: ^18.19.0 || >=20.5.0} + + expect-type@1.4.0: + resolution: {integrity: sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==} + engines: {node: '>=12.0.0'} + + express-rate-limit@8.6.0: + resolution: {integrity: sha512-XKJXDsASUOo0LLtFwW5hCcQGH0N4WQc/Rn8/Pvoia+TJFOkkFPvrtW9lZOeeNcxQJspvOIERMwiRLsVFlhHEkA==} + engines: {node: '>= 16'} + peerDependencies: + express: '>= 4.11' + + express-validator@7.3.2: + resolution: {integrity: sha512-ctLw1Vl6dXVH62dIQMDdTAQkrh480mkFuG6/SGXOaVlwPNukhRAe7EgJIMJ2TSAni8iwHBRp530zAZE5ZPF2IA==} + engines: {node: '>= 8.0.0'} + + express@5.2.1: + resolution: {integrity: sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==} + engines: {node: '>= 18'} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-fifo@1.3.2: + resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} + + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fast-safe-stringify@2.1.1: + resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} + + fast-sha256@1.3.0: + resolution: {integrity: sha512-n11RGP/lrWEFI/bWdygLxhI+pVeo1ZYIVwvvPkW7azl/rOy+F3HYRZ2K5zeE9mmkhQppyv9sQFx0JM9UabnpPQ==} + + fast-uri@3.1.2: + resolution: {integrity: sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==} + + fastq@1.20.1: + resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + fecha@4.2.3: + resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==} + + fetch-blob@3.2.0: + resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} + engines: {node: ^12.20 || >= 14.13} + + figures@6.1.0: + resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==} + engines: {node: '>=18'} + + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} + + file-stream-rotator@0.6.1: + resolution: {integrity: sha512-u+dBid4PvZw17PmDeRcNOtCP9CCK/9lRN2w+r1xIS7yOL9JFrIBKTvrYsxT4P0pGtThYTn++QS5ChHaUov3+zQ==} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + finalhandler@2.1.1: + resolution: {integrity: sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==} + engines: {node: '>= 18.0.0'} + + find-cache-dir@3.3.2: + resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} + engines: {node: '>=8'} + + find-up@3.0.0: + resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} + engines: {node: '>=6'} + + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} + + flatted@3.4.2: + resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==} + + fn.name@1.1.0: + resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==} + + follow-redirects@1.16.0: + resolution: {integrity: sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} + engines: {node: '>=14'} + + form-data@4.0.5: + resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} + engines: {node: '>= 6'} + + formdata-polyfill@4.0.10: + resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} + engines: {node: '>=12.20.0'} + + formidable@3.5.4: + resolution: {integrity: sha512-YikH+7CUTOtP44ZTnUhR7Ic2UASBPOqmaRkRKxRbywPTe5VxF7RRCck4af9wutiZ/QKM5nME9Bie2fFaPz5Gug==} + engines: {node: '>=14.0.0'} + + formik@2.4.9: + resolution: {integrity: sha512-5nI94BMnlFDdQRBY4Sz39WkhxajZJ57Fzs8wVbtsQlm5ScKIR1QLYqv/ultBnobObtlUyxpxoLodpixrsf36Og==} + peerDependencies: + react: '>=16.8.0' + + forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + + framer-motion@12.42.2: + resolution: {integrity: sha512-5XY9luDiu0oHfHBjpDthFMh0ES+122w6p/papSJBweMkO8Sn+PW2QaEgRblQBpWFnuvZS5qvarpt/hO2pjGmnw==} + peerDependencies: + '@emotion/is-prop-valid': '*' + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@emotion/is-prop-valid': + optional: true + react: + optional: true + react-dom: + optional: true + + fresh@2.0.0: + resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} + engines: {node: '>= 0.8'} + + fs-extra@11.3.5: + resolution: {integrity: sha512-eKpRKAovdpZtR1WopLHxlBWvAgPny3c4gX1G5Jhwmmw4XJj0ifSD5qB5TOo8hmA0wlRKDAOAhEE1yVPgs6Fgcg==} + engines: {node: '>=14.14'} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + fuzzysort@3.1.0: + resolution: {integrity: sha512-sR9BNCjBg6LNgwvxlBd0sBABvQitkLzoVY9MYYROQVX/FvfJ4Mai9LsGhDgd8qYdds0bY77VzYd5iuB+v5rwQQ==} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-east-asian-width@1.6.0: + resolution: {integrity: sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==} + engines: {node: '>=18'} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-nonce@1.0.1: + resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} + engines: {node: '>=6'} + + get-own-enumerable-keys@1.0.0: + resolution: {integrity: sha512-PKsK2FSrQCyxcGHsGrLDcK0lx+0Ke+6e8KFFozA9/fIQLhQzPaRvJFdcz7+Axg3jUH/Mq+NI4xa5u/UT2tQskA==} + engines: {node: '>=14.16'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + + get-stream@9.0.1: + resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==} + engines: {node: '>=18'} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob@11.1.0: + resolution: {integrity: sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw==} + engines: {node: 20 || >=22} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + hasBin: true + + globals@17.6.0: + resolution: {integrity: sha512-sepffkT8stwnIYbsMBpoCHJuJM5l98FUF2AnE07hfvE0m/qp3R586hw4jF4uadbhvg1ooIdzuu7CsfD2jzCaNA==} + engines: {node: '>=18'} + + globals@17.7.0: + resolution: {integrity: sha512-Czmyns5dUsq4seFBR/Kdydhmo8y9kC79hiSkPn0YcGtNnYWnrgt0vjrSjx9tspoDGWm2CMarffRuLjM4xUz8xg==} + engines: {node: '>=18'} + + goober@2.1.19: + resolution: {integrity: sha512-U7veizMqxyKlM58+Z5j2ngJBH/r9siDmxpvNxSw0PylF6WQvrASJEZrxh1hidRBJc2jqoBVSyOban5u8m+6Rxg==} + peerDependencies: + csstype: ^3.0.10 + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hasown@2.0.4: + resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==} + engines: {node: '>= 0.4'} + + helmet@8.3.0: + resolution: {integrity: sha512-Qgpiaws3Sm30Av8Eah6sjMCZZwjlBu+E68rhpCWBshY1lb09HtLwj5GviX0OyQIn+ulUS0iX0AxN5n3tLZzz1w==} + engines: {node: '>=18.0.0'} + + hermes-estree@0.25.1: + resolution: {integrity: sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==} + + hermes-parser@0.25.1: + resolution: {integrity: sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==} + + hoist-non-react-statics@3.3.2: + resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + + hono@4.12.26: + resolution: {integrity: sha512-uyZtpnYxM9CmQ7QsQknM4zN8EftNqhON1qYeIKM0Se67CCEe2c44xyGURwB0axX2fBDu1dqHrHAc1hmNT8ITkw==} + engines: {node: '>=16.9.0'} + + html-encoding-sniffer@6.0.0: + resolution: {integrity: sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + + html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + + http-errors@2.0.1: + resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} + engines: {node: '>= 0.8'} + + https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} + + human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + + human-signals@8.0.1: + resolution: {integrity: sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==} + engines: {node: '>=18.18.0'} + + husky@9.1.7: + resolution: {integrity: sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==} + engines: {node: '>=18'} + hasBin: true + + iconv-lite@0.7.2: + resolution: {integrity: sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==} + engines: {node: '>=0.10.0'} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + ignore@7.0.5: + resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} + engines: {node: '>= 4'} + + immer@10.2.0: + resolution: {integrity: sha512-d/+XTN3zfODyjr89gM3mPq1WNX2B8pYsu7eORitdwyA2sBubnTl3laYlBk4sXY5FUa5qTZGBDPJICVbvqzjlbw==} + + immer@11.1.8: + resolution: {integrity: sha512-/tbkHMW7y10Lx6i1crLjD4/OhNkRG+Fo7byZHtah0547nIeXYcpIXaUh0IAQY6gO5459qpGGYapcEOHtFXkIuA==} + + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + internmap@2.0.3: + resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} + engines: {node: '>=12'} + + ip-address@10.2.0: + resolution: {integrity: sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA==} + engines: {node: '>= 12'} + + ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + + is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@5.1.0: + resolution: {integrity: sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==} + engines: {node: '>=18'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-in-ssh@1.0.0: + resolution: {integrity: sha512-jYa6Q9rH90kR1vKB6NM7qqd1mge3Fx4Dhw5TVlK1MUBqhEOuCagrEHMevNuCcbECmXZ0ThXkRm+Ymr51HwEPAw==} + engines: {node: '>=20'} + + is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + + is-interactive@2.0.0: + resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} + engines: {node: '>=12'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-obj@2.0.0: + resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} + engines: {node: '>=8'} + + is-obj@3.0.0: + resolution: {integrity: sha512-IlsXEHOjtKhpN8r/tRFj2nDyTmHvcfNeu/nrRIcXE17ROeatXchkojffa1SpdqW4cr/Fj6QkEf/Gn4zf6KKvEQ==} + engines: {node: '>=12'} + + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + + is-potential-custom-element-name@1.0.1: + resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + + is-promise@4.0.0: + resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} + + is-regexp@3.1.0: + resolution: {integrity: sha512-rbku49cWloU5bSMI+zaRaXdQHXnthP6DZ/vLnfdSKyL4zUzuWnomtOEiZZOd+ioQ+avFo/qau3KPTc7Fjy1uPA==} + engines: {node: '>=12'} + + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + is-stream@4.0.1: + resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==} + engines: {node: '>=18'} + + is-unicode-supported@1.3.0: + resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} + engines: {node: '>=12'} + + is-unicode-supported@2.1.0: + resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} + engines: {node: '>=18'} + + is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + + is-wsl@3.1.1: + resolution: {integrity: sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==} + engines: {node: '>=16'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + isexe@3.1.5: + resolution: {integrity: sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w==} + engines: {node: '>=18'} + + istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} + + istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} + + istanbul-reports@3.2.0: + resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==} + engines: {node: '>=8'} + + jackspeak@4.2.3: + resolution: {integrity: sha512-ykkVRwrYvFm1nb2AJfKKYPr0emF6IiXDYUaFx4Zn9ZuIH7MrzEZ3sD5RlqGXNRpHtvUHJyOnCEFxOlNDtGo7wg==} + engines: {node: 20 || >=22} + + jiti@2.7.0: + resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==} + hasBin: true + + jose@6.2.3: + resolution: {integrity: sha512-YYVDInQKFJfR/xa3ojUTl8c2KoTwiL1R5Wg9YCydwH0x0B9grbzlg5HC7mMjCtUJjbQ/YnGEZIhI5tCgfTb4Hw==} + + js-tokens@10.0.0: + resolution: {integrity: sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@4.2.0: + resolution: {integrity: sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==} + hasBin: true + + jsdom@29.1.1: + resolution: {integrity: sha512-ECi4Fi2f7BdJtUKTflYRTiaMxIB0O6zfR1fX0GXpUrf6flp8QIYn1UT20YQqdSOfk2dfkCwS8LAFoJDEppNK5Q==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24.0.0} + peerDependencies: + canvas: ^3.0.0 + peerDependenciesMeta: + canvas: + optional: true + + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json-schema-typed@7.0.3: + resolution: {integrity: sha512-7DE8mpG+/fVw+dTpjbxnx47TaMnDfOI1jwft9g1VybltZCduyRQPJPvc+zzKY9WPHxhPWczyFuYa6I8Mw4iU5A==} + + json-schema-typed@8.0.2: + resolution: {integrity: sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsonfile@6.2.1: + resolution: {integrity: sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==} + + jsonwebtoken@9.0.3: + resolution: {integrity: sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==} + engines: {node: '>=12', npm: '>=6'} + + jwa@2.0.1: + resolution: {integrity: sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==} + + jws@4.0.1: + resolution: {integrity: sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==} + + kareem@3.3.0: + resolution: {integrity: sha512-kpSuLD3/7RenBnjnJdOHXCKC8dTd1JzeOiJhN0necWWci6cC+qX+VuwPnMVgb+a4+KNJSfgqahpnfWaeDXCimw==} + engines: {node: '>=18.0.0'} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + + kleur@4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} + + kuler@2.0.0: + resolution: {integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==} + + leaflet@1.9.4: + resolution: {integrity: sha512-nxS1ynzJOmOlHp+iL3FyWqK89GtNL8U8rvlMOsQdTTssxZwCXh8N2NB3GDQOL+YR3XnWyZAxwQixURb+FA74PA==} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + lightningcss-android-arm64@1.32.0: + resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [android] + + lightningcss-darwin-arm64@1.32.0: + resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.32.0: + resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.32.0: + resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.32.0: + resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.32.0: + resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-arm64-musl@1.32.0: + resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-x64-gnu@1.32.0: + resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-linux-x64-musl@1.32.0: + resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-win32-arm64-msvc@1.32.0: + resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.32.0: + resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.32.0: + resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==} + engines: {node: '>= 12.0.0'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + lint-staged@17.0.7: + resolution: {integrity: sha512-JrSobt+tW3rH8IOMi8tDZd3foorM5yPEkLD/V2NxobgHrFfHWGee4MOLVuZeScgxftEwbHrPHIFA/ZL+nUJeuA==} + engines: {node: '>=22.22.1'} + hasBin: true + + listr2@10.2.1: + resolution: {integrity: sha512-7I5knELsJKTUjXG+A6BkKAiGkW1i25fNa/xlUl9hFtk15WbE9jndA89xu5FzQKrY5llajE1hfZZFMILXkDHk/Q==} + engines: {node: '>=22.13.0'} + + locate-path@3.0.0: + resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} + engines: {node: '>=6'} + + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash-es@4.18.1: + resolution: {integrity: sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==} + + lodash.includes@4.3.0: + resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==} + + lodash.isboolean@3.0.3: + resolution: {integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==} + + lodash.isinteger@4.0.4: + resolution: {integrity: sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==} + + lodash.isnumber@3.0.3: + resolution: {integrity: sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==} + + lodash.isplainobject@4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + + lodash.isstring@4.0.1: + resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==} + + lodash.mergewith@4.6.2: + resolution: {integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==} + + lodash.once@4.1.1: + resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} + + lodash@4.18.1: + resolution: {integrity: sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==} + + log-symbols@6.0.0: + resolution: {integrity: sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==} + engines: {node: '>=18'} + + log-update@6.1.0: + resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==} + engines: {node: '>=18'} + + logform@2.7.0: + resolution: {integrity: sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==} + engines: {node: '>= 12.0.0'} + + lru-cache@11.5.1: + resolution: {integrity: sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==} + engines: {node: 20 || >=22} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + lucide-react@1.21.0: + resolution: {integrity: sha512-reEZMXq8Qdd5jg5XYkQ5TR1fB/GiQ7ih4vcrthYDtgjSDwh0i6/YLiGjsWsIwgN49gpAnd4J2elSNzncMEEUUQ==} + peerDependencies: + react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + lz-string@1.5.0: + resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} + hasBin: true + + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + + magicast@0.5.3: + resolution: {integrity: sha512-pVKE4UdSQ7DvHzivsCIFx2BJn1mHG6KsyrFcaxFx6tONdneEuThrDx0Cj3AMg58KyN4pzYT+LHOotxDQDjNvkw==} + + make-dir@3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} + + make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + mdn-data@2.27.1: + resolution: {integrity: sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==} + + media-typer@1.1.0: + resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} + engines: {node: '>= 0.8'} + + memory-pager@1.5.0: + resolution: {integrity: sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==} + + merge-descriptors@2.0.0: + resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} + engines: {node: '>=18'} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + methods@1.1.2: + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-db@1.54.0: + resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mime-types@3.0.2: + resolution: {integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==} + engines: {node: '>=18'} + + mime@2.6.0: + resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} + engines: {node: '>=4.0.0'} + hasBin: true + + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + mimic-fn@3.1.0: + resolution: {integrity: sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==} + engines: {node: '>=8'} + + mimic-function@5.0.1: + resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} + engines: {node: '>=18'} + + min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + + minimatch@10.2.5: + resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} + engines: {node: 18 || 20 || >=22} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass@7.1.3: + resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==} + engines: {node: '>=16 || 14 >=14.17'} + + moment@2.30.1: + resolution: {integrity: sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==} + + mongodb-connection-string-url@7.0.1: + resolution: {integrity: sha512-h0AZ9A7IDVwwHyMxmdMXKy+9oNlF0zFoahHiX3vQ8e3KFcSP3VmsmfvtRSuLPxmyv2vjIDxqty8smTgie/SNRQ==} + engines: {node: '>=20.19.0'} + + mongodb-memory-server-core@11.2.0: + resolution: {integrity: sha512-vOoDtn0JiLrHvZY81Rp/UtKXXK0rtJHZGZFVnccvJwYitPLNspO0Ty0grqFQOe7iAET8+GI4zAQcphg+R3vxQg==} + engines: {node: '>=20.19.0'} + + mongodb-memory-server@11.2.0: + resolution: {integrity: sha512-506AD8qvClVx8Raw/WhAUUWBgIXPyi856iC01aa5vAzHmn6WOXC6ulvudkTF7oTMzJxkyA0A84VpD4BpyfqJ9w==} + engines: {node: '>=20.19.0'} + + mongodb@7.2.0: + resolution: {integrity: sha512-F/2+BMZtLVhY30ioZp0dAmZ+IRZMBqI+nrv6t5+9/1AIwCa8sMRC3jBf81lpxMhnZgqq8CoUD503Z1oZWq1/sw==} + engines: {node: '>=20.19.0'} + peerDependencies: + '@aws-sdk/credential-providers': ^3.806.0 + '@mongodb-js/zstd': ^7.0.0 + gcp-metadata: ^7.0.1 + kerberos: ^7.0.0 + mongodb-client-encryption: '>=7.0.0 <7.1.0' + snappy: ^7.3.2 + socks: ^2.8.6 + peerDependenciesMeta: + '@aws-sdk/credential-providers': + optional: true + '@mongodb-js/zstd': + optional: true + gcp-metadata: + optional: true + kerberos: + optional: true + mongodb-client-encryption: + optional: true + snappy: + optional: true + socks: + optional: true + + mongodb@7.5.0: + resolution: {integrity: sha512-5FnrEDLnvp6ycUOGLNLLU33BfCx2qmp2mJjGPDwKLruYsVzXVSK5fsGpoDXvsXJwBfBsD7ebMRdawbDxC2814g==} + engines: {node: '>=20.19.0'} + peerDependencies: + '@aws-sdk/credential-providers': ^3.806.0 + '@mongodb-js/zstd': ^7.0.0 + gcp-metadata: ^7.0.1 + kerberos: ^7.0.0 + mongodb-client-encryption: ^7.2.0 + snappy: ^7.3.2 + socks: ^2.8.6 + peerDependenciesMeta: + '@aws-sdk/credential-providers': + optional: true + '@mongodb-js/zstd': + optional: true + gcp-metadata: + optional: true + kerberos: + optional: true + mongodb-client-encryption: + optional: true + snappy: + optional: true + socks: + optional: true + + mongoose@9.8.0: + resolution: {integrity: sha512-PDGx3XACxrBQyWf4YT+5s1Xsx19x84UWGlRVIza4i9RG6qKjGcoG7odotT6uquR6YoaDMTZ6ZZc/jMXLrNPyyA==} + engines: {node: '>=20.19.0'} + + motion-dom@12.42.2: + resolution: {integrity: sha512-5gIMWLp/PycBtJRJWRgjxke5n8dlvkSn2DrYW+tr3XcqAZY1xZh6BJyooJXCM8wdfM7wfMjkBJNLge1CKPUIRA==} + + motion-utils@12.39.0: + resolution: {integrity: sha512-8nadJAJjTtqRkmRF36FoJTrywK9nnFmnPwnSMyxaOCU7GDjN9RTMJIxx9De8ErM+vpPhMccr/6fo5WciyQLnMQ==} + + mpath@0.9.0: + resolution: {integrity: sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==} + engines: {node: '>=4.0.0'} + + mquery@6.0.0: + resolution: {integrity: sha512-b2KQNsmgtkscfeDgkYMcWGn9vZI9YoXh802VDEwE6qc50zxBFQ0Oo8ROkawbPAsXCY1/Z1yp0MagqsZStPWJjw==} + engines: {node: '>=20.19.0'} + + ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + nanoid@3.3.12: + resolution: {integrity: sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + negotiator@0.6.4: + resolution: {integrity: sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==} + engines: {node: '>= 0.6'} + + negotiator@1.0.0: + resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} + engines: {node: '>= 0.6'} + + new-find-package-json@2.0.0: + resolution: {integrity: sha512-lDcBsjBSMlj3LXH2v/FW3txlh2pYTjmbOXPYJD93HI5EwuLzI11tdHSIpUMmfq/IOsldj4Ps8M8flhm+pCK4Ew==} + engines: {node: '>=12.22.0'} + + node-addon-api@8.8.0: + resolution: {integrity: sha512-c5Ko1fZJIJmzhFIkhRN76WTq+fC6tWnGy9CXA0fA+XygsWZmEwG8vmbkNqxMyoaa0Tin4djul49NzdVcJJcjeA==} + engines: {node: ^18 || ^20 || >= 21} + + node-domexception@1.0.0: + resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} + engines: {node: '>=10.5.0'} + deprecated: Use your platform's native DOMException instead + + node-fetch@3.3.2: + resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + node-gyp-build@4.8.4: + resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} + hasBin: true + + node-releases@2.0.47: + resolution: {integrity: sha512-Uzmd6LXpouKo8EUK68IjH4+E01w/hXyV3R3g/geCJo+rXLNfh1xucB+LOzYEOQPSiUK3h/xZf0cQGcSsmyL2Og==} + engines: {node: '>=18'} + + normalize-wheel@1.0.1: + resolution: {integrity: sha512-1OnlAPZ3zgrk8B91HyRj+eVv+kS5u+Z0SCsak6Xil/kmgEia50ga7zfkumayonZrImffAxPU/5WcyGhzetHNPA==} + + npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + + npm-run-path@6.0.0: + resolution: {integrity: sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==} + engines: {node: '>=18'} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-hash@3.0.0: + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} + engines: {node: '>= 6'} + + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + + object-treeify@1.1.33: + resolution: {integrity: sha512-EFVjAYfzWqWsBMRHPMAXLCDIJnpMhdWAqR7xG6M6a2cs6PMFpl/+Z20w9zDW4vkxOFfddegBKq9Rehd0bxWE7A==} + engines: {node: '>= 10'} + + obug@2.1.4: + resolution: {integrity: sha512-4a+OsYv9UktOJKE+l1A4OufDgdRF9PifWj+tJnHURo/P+WOxpG4GzUFL9qCalmWauao6ogiG+QvnCovwPoyAWA==} + engines: {node: '>=12.20.0'} + + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + + on-headers@1.1.0: + resolution: {integrity: sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==} + engines: {node: '>= 0.8'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + one-time@1.0.0: + resolution: {integrity: sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + onetime@7.0.0: + resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} + engines: {node: '>=18'} + + open@11.0.0: + resolution: {integrity: sha512-smsWv2LzFjP03xmvFoJ331ss6h+jixfA4UUV/Bsiyuu4YJPfN+FIQGOIiv4w9/+MoHkfkJ22UIaQWRVFRfH6Vw==} + engines: {node: '>=20'} + + open@8.4.2: + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} + engines: {node: '>=12'} + + openapi-types@12.1.3: + resolution: {integrity: sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + ora@8.2.0: + resolution: {integrity: sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==} + engines: {node: '>=18'} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@3.0.0: + resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} + engines: {node: '>=6'} + + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + parse-ms@4.0.0: + resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} + engines: {node: '>=18'} + + parse5@8.0.1: + resolution: {integrity: sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw==} + + parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + + path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + + path-exists@3.0.0: + resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} + engines: {node: '>=4'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + + path-scurry@2.0.2: + resolution: {integrity: sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==} + engines: {node: 18 || 20 || >=22} + + path-to-regexp@8.4.2: + resolution: {integrity: sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==} + + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + + pend@1.2.0: + resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.2: + resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} + engines: {node: '>=8.6'} + + picomatch@4.0.4: + resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} + engines: {node: '>=12'} + + pkce-challenge@5.0.1: + resolution: {integrity: sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==} + engines: {node: '>=16.20.0'} + + pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + + pkg-up@3.1.0: + resolution: {integrity: sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==} + engines: {node: '>=8'} + + postal-mime@2.7.5: + resolution: {integrity: sha512-GNEXKvWFQnbgO5NlrGzVa0FmWzBZ24PersAWErttSg1Hjpf0ATxTwS5DOMGaOpTG6bUh5cTr7xi0jAD942wCJA==} + + postcss-selector-parser@7.1.4: + resolution: {integrity: sha512-HeP7D2wyhkR+XaK6v4W8oRF62Dsz4flyuczALJp61GckGm42u1saSSJ/0auvcBqxs3jMRFEcPK34At/0JBKdOg==} + engines: {node: '>=4'} + + postcss@8.5.15: + resolution: {integrity: sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==} + engines: {node: ^10 || ^12 || >=14} + + powershell-utils@0.1.0: + resolution: {integrity: sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A==} + engines: {node: '>=20'} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prettier@3.8.3: + resolution: {integrity: sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw==} + engines: {node: '>=14'} + hasBin: true + + prettier@3.9.6: + resolution: {integrity: sha512-OpN0zzVdiaiAhxpuuj5efpIS4sY9j7bY6uR5mnj5yPzGkdkjNKSJeUThPb60Jw29QuAZgA4o+/iB49kFiaBX6g==} + engines: {node: '>=14'} + hasBin: true + + pretty-format@27.5.1: + resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + + pretty-ms@9.3.0: + resolution: {integrity: sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==} + engines: {node: '>=18'} + + prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + + property-expr@2.0.6: + resolution: {integrity: sha512-SVtmxhRE/CGkn3eZY1T6pC8Nln6Fr/lu1mKSgRud0eC73whjGfoAogbn78LkD8aFL0zz3bAFerKSnOl7NlErBA==} + + proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + + proxy-from-env@2.1.0: + resolution: {integrity: sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==} + engines: {node: '>=10'} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + qs@6.15.2: + resolution: {integrity: sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw==} + engines: {node: '>=0.6'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + radix-ui@1.6.0: + resolution: {integrity: sha512-EUEC70O03EgxWMP5aoqfBZ6iLC5bczFagGy7zhSYRt8o5DP7IWNiP3ywetse3L9b8843ExB0OGWZvgbYVJuNeg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + + raw-body@3.0.2: + resolution: {integrity: sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==} + engines: {node: '>= 0.10'} + + razorpay@2.9.8: + resolution: {integrity: sha512-Uqv3KV7JAfpLlabGdg8Cw7e7ieGkK/DighFq6iGkNnz0Y+it6+/lFmPCTfkcptc2EagL2Og25VWUxc+Fgp/+nA==} + + react-day-picker@10.0.1: + resolution: {integrity: sha512-eNh6BlwcYInWaJtRv18mXQ06Ys/H6rdTZAnTaSdOYJuTpwP1JMCHNd1FDRadA+gbeinq+psdULN5Xnowy9mV8w==} + engines: {node: '>=18'} + peerDependencies: + '@types/react': '>=16.8.0' + react: '>=16.8.0' + peerDependenciesMeta: + '@types/react': + optional: true + + react-dom@19.2.7: + resolution: {integrity: sha512-t0BRVXvbiE/o20Hfw669rLbMCDWtYZLvmJigy2f0MxsXF+71pxhR3xOkspmsO8h3ZlNzyibAmtCa3l4lYKk6gQ==} + peerDependencies: + react: ^19.2.7 + + react-easy-crop@6.2.0: + resolution: {integrity: sha512-8CEes7M8UkNoRPaz/krm70xMTbpar07crz/OrPSJwdGopV6lPcqdEmamDYTXgsqukb/1e2fbFd9/mROi8Qkp+A==} + peerDependencies: + react: '>=16.4.0' + react-dom: '>=16.4.0' + + react-fast-compare@2.0.4: + resolution: {integrity: sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw==} + + react-hot-toast@2.6.0: + resolution: {integrity: sha512-bH+2EBMZ4sdyou/DPrfgIouFpcRLCJ+HoCA32UoAYHn6T3Ur5yfcDCeSr5mwldl6pFOsiocmrXMuoCJ1vV8bWg==} + engines: {node: '>=10'} + peerDependencies: + react: '>=16' + react-dom: '>=16' + + react-icons@5.6.0: + resolution: {integrity: sha512-RH93p5ki6LfOiIt0UtDyNg/cee+HLVR6cHHtW3wALfo+eOHTp8RnU2kRkI6E+H19zMIs03DyxUG/GfZMOGvmiA==} + peerDependencies: + react: '*' + + react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + + react-is@17.0.2: + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + + react-redux@9.3.0: + resolution: {integrity: sha512-KQopgqFo/p/fgmAs5qz6p5RWaNAzq40WAu7fJIXnQpYxFPbJYtsJPWvGeF2rOBaY/kEuV77AVsX8TsQzKm+A/g==} + peerDependencies: + '@types/react': ^18.2.25 || ^19 + react: ^18.0 || ^19 + redux: ^5.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + redux: + optional: true + + react-remove-scroll-bar@2.3.8: + resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + react-remove-scroll@2.7.2: + resolution: {integrity: sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + react-router-dom@7.17.0: + resolution: {integrity: sha512-fyU2yjGups/hE6Xz0I5ZYbVL8Gx29eCjgpHaRaTaVU+OOAdfRX05KsvyRm0GO8YQwOkhpU3MurW1jyMUJn+zSw==} + engines: {node: '>=20.0.0'} + peerDependencies: + react: '>=18' + react-dom: '>=18' + + react-router@7.16.0: + resolution: {integrity: sha512-wArC8lVyJb3+jM9OpDyW6hLCizACWkvQR/sSGqSs+o5uEXEtGlqdZ4v8hENR3Jad6i+LRkK93q/+bQAcvl6V1A==} + engines: {node: '>=20.0.0'} + peerDependencies: + react: '>=18' + react-dom: '>=18' + peerDependenciesMeta: + react-dom: + optional: true + + react-router@7.17.0: + resolution: {integrity: sha512-FDELK7rTMlCHO5+reyXsPlmfr7N1F91lPHsWYfMEGQm/KQ+F4JFM8jGoeQDmDvdTs93Fw9aSilH+uKRb4/jXvQ==} + engines: {node: '>=20.0.0'} + peerDependencies: + react: '>=18' + react-dom: '>=18' + peerDependenciesMeta: + react-dom: + optional: true + + react-style-singleton@2.2.3: + resolution: {integrity: sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + react@19.2.7: + resolution: {integrity: sha512-HNe9WslTbXmFK8o8cmwgAeJFSBvt1bPdHCVKtaaV+WlAN36mpT4hcRpwbf3fY56ar2oIXzsBpOAiIRHAdY0OlQ==} + engines: {node: '>=0.10.0'} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + recast@0.23.11: + resolution: {integrity: sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA==} + engines: {node: '>= 4'} + + recharts@3.9.0: + resolution: {integrity: sha512-dCEcE9y20c8H2tkVeByrAXhhnBJk6/QLbxKmn+dJUptOfc5NMjwRh1jo0vZPRLD+5dMrHrP+hPEsfbGBMfnf5Q==} + engines: {node: '>=18'} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-is: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + redent@3.0.0: + resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} + engines: {node: '>=8'} + + redux-thunk@3.1.0: + resolution: {integrity: sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==} + peerDependencies: + redux: ^5.0.0 + + redux@5.0.1: + resolution: {integrity: sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + reselect@5.2.0: + resolution: {integrity: sha512-AgZ3UOZm3YndfrJ4OYjgrT7bmCm/1iqkjvEfH/oYjzh6PD2qw4QuT3jjnXIrpdt4MTpMXclMT3lXbmRY+XRakw==} + + resend@6.18.0: + resolution: {integrity: sha512-EjxZ9AVzywJgOlUoIJe9ytBWVrfbUtJbjeoLnRSvpU1sv97Hh9DSwhw+k8kiujrG4Rg4bzTBsjlmwWWuoOxSug==} + engines: {node: '>=20'} + peerDependencies: + '@react-email/render': '*' + peerDependenciesMeta: + '@react-email/render': + optional: true + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + restore-cursor@5.1.0: + resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} + engines: {node: '>=18'} + + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rfdc@1.4.1: + resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} + + rolldown@1.0.3: + resolution: {integrity: sha512-i00lAJ2ks1BYr7rjNjKC7BcqAS7nVfiT3QX1SI5aY+AFHblCmaUf9OE9dbdzDvW6dJxbi2ZCZiy9v3CcwOiX3g==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + + router@2.2.0: + resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} + engines: {node: '>= 18'} + + run-applescript@7.1.0: + resolution: {integrity: sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==} + engines: {node: '>=18'} + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safe-stable-stringify@2.5.0: + resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} + engines: {node: '>=10'} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + saxes@6.0.0: + resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} + engines: {node: '>=v12.22.7'} + + scheduler@0.27.0: + resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.8.1: + resolution: {integrity: sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==} + engines: {node: '>=10'} + hasBin: true + + send@1.2.1: + resolution: {integrity: sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==} + engines: {node: '>= 18'} + + serve-static@2.2.1: + resolution: {integrity: sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==} + engines: {node: '>= 18'} + + set-cookie-parser@2.7.2: + resolution: {integrity: sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==} + + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + shadcn@4.11.0: + resolution: {integrity: sha512-UV0cchFea9hO7poV1CuEP0wvmYjpAqcxCKdy23bndl2Du2ARtDs8A4xdzfhUjDBeOW1nNpJ6lXmsEpsply2SfQ==} + hasBin: true + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + side-channel-list@1.0.1: + resolution: {integrity: sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + + sift@17.1.3: + resolution: {integrity: sha512-Rtlj66/b0ICeFzYTuNvX/EF1igRbbnGSvEyT79McoZa/DeGhMyC5pWKOEsZKnpkqtSeovd5FL/bjHWC3CIIvCQ==} + + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + + slice-ansi@7.1.2: + resolution: {integrity: sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==} + engines: {node: '>=18'} + + slice-ansi@8.0.0: + resolution: {integrity: sha512-stxByr12oeeOyY2BlviTNQlYV5xOj47GirPr4yA1hE9JCtxfQN0+tVbkxwCtYDQWhEKWFHsEK48ORg5jrouCAg==} + engines: {node: '>=20'} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + sparse-bitfield@3.0.3: + resolution: {integrity: sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==} + + stack-trace@0.0.10: + resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==} + + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + + standardwebhooks@1.0.0: + resolution: {integrity: sha512-BbHGOQK9olHPMvQNHWul6MYlrRTAOKn03rOe4A8O3CLWhNf4YHBqq2HJKKC+sfqpxiBY52pNeesD6jIiLDz8jg==} + + statuses@2.0.2: + resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} + engines: {node: '>= 0.8'} + + std-env@4.2.0: + resolution: {integrity: sha512-oCUKSupKTHX53EyjDtuZQ64pjLJ6yYCtpmEw0goYxtjG9KpbRe8KAsl2tBUGU9DyMcJ0RwJ8GqJAFzMXcXW1Rw==} + + stdin-discarder@0.2.2: + resolution: {integrity: sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==} + engines: {node: '>=18'} + + streamx@2.28.0: + resolution: {integrity: sha512-1Yowhzjf0ivGMrTIkY9hav5TxobO9qIVqUE41fiCGMGgc3CLlf4MY+9AHmZqBWgDTue0fY9zWjYFVyf6Diuobw==} + + string-argv@0.3.2: + resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} + engines: {node: '>=0.6.19'} + + string-width@7.2.0: + resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} + engines: {node: '>=18'} + + string-width@8.2.1: + resolution: {integrity: sha512-IIaP0g3iy9Cyy18w3M9YcaDudujEAVHKt3a3QJg1+sr/oX96TbaGUubG0hJyCjCBThFH+tFpcIyoUHUn1ogaLA==} + engines: {node: '>=20'} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + stringify-object@5.0.0: + resolution: {integrity: sha512-zaJYxz2FtcMb4f+g60KsRNFOpVMUyuJgA51Zi5Z1DOTC3S59+OQiVOzE9GZt0x72uBGWKsQIuBKeF9iusmKFsg==} + engines: {node: '>=14.16'} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.2.0: + resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==} + engines: {node: '>=12'} + + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + + strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + + strip-final-newline@4.0.0: + resolution: {integrity: sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==} + engines: {node: '>=18'} + + strip-indent@3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + + superagent@10.3.0: + resolution: {integrity: sha512-B+4Ik7ROgVKrQsXTV0Jwp2u+PXYLSlqtDAhYnkkD+zn3yg8s/zjA2MeGayPoY/KICrbitwneDHrjSotxKL+0XQ==} + engines: {node: '>=14.18.0'} + + supertest@7.2.2: + resolution: {integrity: sha512-oK8WG9diS3DlhdUkcFn4tkNIiIbBx9lI2ClF8K+b2/m8Eyv47LSawxUzZQSNKUrVb2KsqeTDCcjAAVPYaSLVTA==} + engines: {node: '>=14.18.0'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + swagger-jsdoc@6.3.0: + resolution: {integrity: sha512-I+iQjVGV3t28pOkQUJv2MncthvOtkEactOn8R76SvSYhxgtIn7FoqfDHwQaN+GBnQdXQLrhgDXseKitmJcHMsA==} + engines: {node: '>=20.0.0'} + hasBin: true + + swagger-ui-dist@5.32.8: + resolution: {integrity: sha512-dgMdWXIgnI4zX4OPhKEdWnlDODbgm8W3AX0Ivn/BBqcUh6xZsBxhZMnvk6DJyRz1BTrj8dPxtarmEGgkz30oyA==} + + swagger-ui-express@5.0.1: + resolution: {integrity: sha512-SrNU3RiBGTLLmFU8GIJdOdanJTl4TOmT27tt3bWWHppqYmAZ6IDuEuBvMU6nZq0zLEe6b/1rACXCgLZqO6ZfrA==} + engines: {node: '>= v0.10.32'} + peerDependencies: + express: '>=4.0.0 || >=5.0.0-beta' + + symbol-tree@3.2.4: + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + + systeminformation@5.31.7: + resolution: {integrity: sha512-/8NC53e5nP9nmhn42/ncdOkyJnOoue/Vy+tJOyUGd1Yv66G069wK4rrziwhrqDETgk78CudTQupw5z19S5uoZw==} + engines: {node: '>=8.0.0'} + os: [darwin, linux, win32, freebsd, openbsd, netbsd, sunos, android] + hasBin: true + + tailwind-merge@3.6.0: + resolution: {integrity: sha512-uxL7qAVQriqRQPAyK3pj66VqskWqoZ37PW94jwOTwNfq/z9oyu1V+eqrZqtR2+fCiXdYOZe/Modt8GtvqNzu+w==} + + tailwindcss@4.3.0: + resolution: {integrity: sha512-y6nxMGB1nMW9R6k96e5gdIFzcfL/gTJRNaqGes1YvkLnPVXzWgbqFF2yLC0T8G774n24cx3Pe8XrKoniCOAH+Q==} + + tapable@2.3.3: + resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==} + engines: {node: '>=6'} + + tar-stream@3.2.0: + resolution: {integrity: sha512-ojzvCvVaNp6aOTFmG7jaRD0meowIAuPc3cMMhSgKiVWws1GyHbGd/xvnyuRKcKlMpt3qvxx6r0hreCNITP9hIg==} + + teex@1.0.1: + resolution: {integrity: sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==} + + text-decoder@1.2.7: + resolution: {integrity: sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ==} + + text-hex@1.0.0: + resolution: {integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==} + + tiny-case@1.0.3: + resolution: {integrity: sha512-Eet/eeMhkO6TX8mnUteS9zgPbUMQa4I6Kkp5ORiBD5476/m+PIRiumP5tmh5ioJpH7k51Kehawy2UDfsnxxY8Q==} + + tiny-invariant@1.3.3: + resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} + + tiny-warning@1.0.3: + resolution: {integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==} + + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + + tinyexec@1.2.4: + resolution: {integrity: sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg==} + engines: {node: '>=18'} + + tinyglobby@0.2.17: + resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} + engines: {node: '>=12.0.0'} + + tinyrainbow@3.1.0: + resolution: {integrity: sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==} + engines: {node: '>=14.0.0'} + + tldts-core@7.4.9: + resolution: {integrity: sha512-DxKfPBI52p2msTEu7MPhdpdDTBhhVQg1a/8PjQckeyAvO13eMYElX545grIp6nnTGIMZlRvFZPvFhvI/WIz2Vg==} + + tldts@7.4.9: + resolution: {integrity: sha512-3kZ8wQQ/k5DrChD4X4FVvr2D7E5uoRgAqkPyLpSCGUvqOvqu+JEdr3mwMUaVWb+vMHZaKhF5fp2PBigKsui7hA==} + hasBin: true + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + toposort@2.0.2: + resolution: {integrity: sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg==} + + tough-cookie@6.0.2: + resolution: {integrity: sha512-exgYmnmL/sJpR3upZfXG5PoatXQii55xAiXGXzY+sROLZ/Y+SLcp9PgJNI9Vz37HpQ74WvDcLT8eqm+kV3FzrA==} + engines: {node: '>=16'} + + tr46@5.1.1: + resolution: {integrity: sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==} + engines: {node: '>=18'} + + tr46@6.0.0: + resolution: {integrity: sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==} + engines: {node: '>=20'} + + triple-beam@1.4.1: + resolution: {integrity: sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==} + engines: {node: '>= 14.0.0'} + + ts-api-utils@2.5.0: + resolution: {integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==} + engines: {node: '>=18.12'} + peerDependencies: + typescript: '>=4.8.4' + + ts-morph@26.0.0: + resolution: {integrity: sha512-ztMO++owQnz8c/gIENcM9XfCEzgoGphTv+nKpYNM1bgsdOVC/jRZuEBf6N+mLLDNg68Kl+GgUZfOySaRiG1/Ug==} + + tsconfig-paths@4.2.0: + resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} + engines: {node: '>=6'} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + tsx@4.23.1: + resolution: {integrity: sha512-GQHnkIfxyx1wYCOS/wonik5MVRZU9hi1TEZmzGZSCJB1y9YgoZ8H6itNE/u4suE+yLmOzuE4E5S4TZ/ZX2wcWQ==} + engines: {node: '>=18.0.0'} + hasBin: true + + tw-animate-css@1.4.0: + resolution: {integrity: sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ==} + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-fest@2.19.0: + resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} + engines: {node: '>=12.20'} + + type-is@2.1.0: + resolution: {integrity: sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA==} + engines: {node: '>= 18'} + + typescript-eslint@8.60.1: + resolution: {integrity: sha512-6m5hkkRAp8lKvhVpcprAIn5KkehQEh+47oHH2VGnExEh7dhNxXlg6GPAOIu6TxbVQxhebrJDvjl3020ooiWCMA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + + typescript-eslint@8.65.0: + resolution: {integrity: sha512-/ggrHAwyjENDusvyxbuqxAC2dTnZg/Z8F+fgQtYIz+L6n/9HfSlEZcFGV/NsMNa6CkGk0xUjUAFwC0vHOflvIA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true + + typescript@6.0.3: + resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==} + engines: {node: '>=14.17'} + hasBin: true + + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + + undici-types@7.16.0: + resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} + + undici@7.28.0: + resolution: {integrity: sha512-cRZYrTDwWznlnRiPjggAGxZXanty6M8RV1ff8Wm4LWXBp7/IG8v5DnOm74DtUBp9OONpK75YlPnIjQqX0dBDtA==} + engines: {node: '>=20.18.1'} + + unicorn-magic@0.3.0: + resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} + engines: {node: '>=18'} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + + update-browserslist-db@1.2.3: + resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + use-callback-ref@1.3.3: + resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + use-sidecar@1.1.3: + resolution: {integrity: sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + use-sync-external-store@1.6.0: + resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + validate-npm-package-name@7.0.2: + resolution: {integrity: sha512-hVDIBwsRruT73PbK7uP5ebUt+ezEtCmzZz3F59BSr2F6OVFnJ/6h8liuvdLrQ88Xmnk6/+xGGuq+pG9WwTuy3A==} + engines: {node: ^20.17.0 || >=22.9.0} + + validator@13.15.35: + resolution: {integrity: sha512-TQ5pAGhd5whStmqWvYF4OjQROlmv9SMFVt37qoCBdqRffuuklWYQlCNnEs2ZaIBD1kZRNnikiZOS1eqgkar0iw==} + engines: {node: '>= 0.10'} + + vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + + victory-vendor@37.3.6: + resolution: {integrity: sha512-SbPDPdDBYp+5MJHhBCAyI7wKM3d5ivekigc2Dk2s7pgbZ9wIgIBYGVw4zGHBml/qTFbexrofXW6Gu4noGxrOwQ==} + + vite@8.0.16: + resolution: {integrity: sha512-h9bXPmJichP5fLmVQo3PyaGSDE2n3aPuomeAlVRm0JLmt4rY6zmPKd59HYI4LNW8oTK7tlTsuC7l/m7awx9Jcw==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + '@vitejs/devtools': ^0.1.18 + esbuild: ^0.27.0 || ^0.28.0 + jiti: '>=1.21.0' + less: ^4.0.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + '@vitejs/devtools': + optional: true + esbuild: + optional: true + jiti: + optional: true + less: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vitest@4.1.10: + resolution: {integrity: sha512-R9jUTe5S4Qb0HCd4TNqpC7oGcrMssMRGXLW80ubjWsW9VH5GF8y1Y0SFLY9AbqSk6nt0PnOx4H4WNJYZ13GUPw==} + engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@opentelemetry/api': ^1.9.0 + '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 + '@vitest/browser-playwright': 4.1.10 + '@vitest/browser-preview': 4.1.10 + '@vitest/browser-webdriverio': 4.1.10 + '@vitest/coverage-istanbul': 4.1.10 + '@vitest/coverage-v8': 4.1.10 + '@vitest/ui': 4.1.10 + happy-dom: '*' + jsdom: '*' + vite: ^6.0.0 || ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@opentelemetry/api': + optional: true + '@types/node': + optional: true + '@vitest/browser-playwright': + optional: true + '@vitest/browser-preview': + optional: true + '@vitest/browser-webdriverio': + optional: true + '@vitest/coverage-istanbul': + optional: true + '@vitest/coverage-v8': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + + w3c-xmlserializer@5.0.0: + resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} + engines: {node: '>=18'} + + web-streams-polyfill@3.3.3: + resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} + engines: {node: '>= 8'} + + webidl-conversions@7.0.0: + resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} + engines: {node: '>=12'} + + webidl-conversions@8.0.1: + resolution: {integrity: sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==} + engines: {node: '>=20'} + + whatwg-mimetype@5.0.0: + resolution: {integrity: sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==} + engines: {node: '>=20'} + + whatwg-url@14.2.0: + resolution: {integrity: sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==} + engines: {node: '>=18'} + + whatwg-url@16.0.1: + resolution: {integrity: sha512-1to4zXBxmXHV3IiSSEInrreIlu02vUOvrhxJJH5vcxYTBDAx51cqZiKdyTxlecdKNSjj8EcxGBxNf6Vg+945gw==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + which@4.0.0: + resolution: {integrity: sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==} + engines: {node: ^16.13.0 || >=18.0.0} + hasBin: true + + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} + hasBin: true + + winston-daily-rotate-file@5.0.0: + resolution: {integrity: sha512-JDjiXXkM5qvwY06733vf09I2wnMXpZEhxEVOSPenZMii+g7pcDcTBt2MRugnoi8BwVSuCT2jfRXBUy+n1Zz/Yw==} + engines: {node: '>=8'} + peerDependencies: + winston: ^3 + + winston-transport@4.9.0: + resolution: {integrity: sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==} + engines: {node: '>= 12.0.0'} + + winston@3.19.0: + resolution: {integrity: sha512-LZNJgPzfKR+/J3cHkxcpHKpKKvGfDZVPS4hfJCc4cCG0CgYzvlD6yE/S3CIL/Yt91ak327YCpiF/0MyeZHEHKA==} + engines: {node: '>= 12.0.0'} + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + wrap-ansi@10.0.0: + resolution: {integrity: sha512-SGcvg80f0wUy2/fXES19feHMz8E0JoXv2uNgHOu4Dgi2OrCy1lqwFYEJz1BLbDI0exjPMe/ZdzZ/YpGECBG/aQ==} + engines: {node: '>=20'} + + wrap-ansi@9.0.2: + resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==} + engines: {node: '>=18'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + wsl-utils@0.3.1: + resolution: {integrity: sha512-g/eziiSUNBSsdDJtCLB8bdYEUMj4jR7AGeUo96p/3dTafgjHhpF4RiCFPiRILwjQoDXx5MqkBr4fwWtR3Ky4Wg==} + engines: {node: '>=20'} + + xml-name-validator@5.0.0: + resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} + engines: {node: '>=18'} + + xmlchars@2.2.0: + resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yaml@2.0.0-1: + resolution: {integrity: sha512-W7h5dEhywMKenDJh2iX/LABkbFnBxasD27oyXWDS/feDsxiw0dD5ncXdYXgkvAsXIY2MpW/ZKkr9IU30DBdMNQ==} + engines: {node: '>= 6'} + + yaml@2.9.0: + resolution: {integrity: sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==} + engines: {node: '>= 14.6'} + hasBin: true + + yauzl@3.4.0: + resolution: {integrity: sha512-jIH9yLR9wqr0wOS0TpBvo/g/2UgZH5qePVbjgRliiF0BYvOZyaBknKsF+x9Iht0O6sqgnB93rCICdOZFecJuDw==} + engines: {node: '>=12'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + yocto-spinner@1.2.0: + resolution: {integrity: sha512-Yw0hUB6UA3o4YUgKy3oSe9a4cxoaZ9sBfYDw+JSxo6Id0KoJGoxzPA24qqUXYKBWABs/zDSGTz9kww7t3F0XGw==} + engines: {node: '>=18.19'} + + yoctocolors@2.1.2: + resolution: {integrity: sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==} + engines: {node: '>=18'} + + yup@1.7.1: + resolution: {integrity: sha512-GKHFX2nXul2/4Dtfxhozv701jLQHdf6J34YDh2cEkpqoo8le5Mg6/LrdseVLrFarmFygZTlfIhHx/QKfb/QWXw==} + + zod-to-json-schema@3.25.2: + resolution: {integrity: sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA==} + peerDependencies: + zod: ^3.25.28 || ^4 + + zod-validation-error@4.0.2: + resolution: {integrity: sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==} + engines: {node: '>=18.0.0'} + peerDependencies: + zod: ^3.25.0 || ^4.0.0 + + zod@3.25.76: + resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} + + zod@4.4.3: + resolution: {integrity: sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==} + + zustand@5.0.14: + resolution: {integrity: sha512-/8tAspM5LMPr28b3fwLYrtdj77ECpfZviaP75CMTnwO8ISyaE4GDIG/9rDDYq/cH9D2Xw2A2RXglLInmVBQB/g==} + engines: {node: '>=12.20.0'} + peerDependencies: + '@types/react': '>=18.0.0' + immer: '>=9.0.6' + react: '>=18.0.0' + use-sync-external-store: '>=1.2.0' + peerDependenciesMeta: + '@types/react': + optional: true + immer: + optional: true + react: + optional: true + use-sync-external-store: + optional: true + +snapshots: + + '@adobe/css-tools@4.5.0': {} + + '@apidevtools/json-schema-ref-parser@14.0.1': + dependencies: + '@types/json-schema': 7.0.15 + js-yaml: 4.2.0 + + '@apidevtools/openapi-schemas@2.1.0': {} + + '@apidevtools/swagger-methods@3.0.2': {} + + '@apidevtools/swagger-parser@12.1.0(openapi-types@12.1.3)': + dependencies: + '@apidevtools/json-schema-ref-parser': 14.0.1 + '@apidevtools/openapi-schemas': 2.1.0 + '@apidevtools/swagger-methods': 3.0.2 + ajv: 8.20.0 + ajv-draft-04: 1.0.0(ajv@8.20.0) + call-me-maybe: 1.0.2 + openapi-types: 12.1.3 + + '@asamuzakjp/css-color@5.1.11': + dependencies: + '@asamuzakjp/generational-cache': 1.0.1 + '@csstools/css-calc': 3.2.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) + '@csstools/css-color-parser': 4.1.9(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) + '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) + '@csstools/css-tokenizer': 4.0.0 + + '@asamuzakjp/dom-selector@7.1.1': + dependencies: + '@asamuzakjp/generational-cache': 1.0.1 + '@asamuzakjp/nwsapi': 2.3.9 + bidi-js: 1.0.3 + css-tree: 3.2.1 + is-potential-custom-element-name: 1.0.1 + + '@asamuzakjp/generational-cache@1.0.1': {} + + '@asamuzakjp/nwsapi@2.3.9': {} + + '@babel/code-frame@7.29.7': + dependencies: + '@babel/helper-validator-identifier': 7.29.7 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.29.7': {} + + '@babel/core@7.29.7': + dependencies: + '@babel/code-frame': 7.29.7 + '@babel/generator': 7.29.7 + '@babel/helper-compilation-targets': 7.29.7 + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7) + '@babel/helpers': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/template': 7.29.7 + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 + '@jridgewell/remapping': 2.3.5 + convert-source-map: 2.0.0 + debug: 4.4.3 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.29.7': + dependencies: + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.1.0 + + '@babel/helper-annotate-as-pure@7.29.7': + dependencies: + '@babel/types': 7.29.7 + + '@babel/helper-compilation-targets@7.29.7': + dependencies: + '@babel/compat-data': 7.29.7 + '@babel/helper-validator-option': 7.29.7 + browserslist: 4.28.2 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-create-class-features-plugin@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-annotate-as-pure': 7.29.7 + '@babel/helper-member-expression-to-functions': 7.29.7 + '@babel/helper-optimise-call-expression': 7.29.7 + '@babel/helper-replace-supers': 7.29.7(@babel/core@7.29.7) + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 + '@babel/traverse': 7.29.7 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/helper-globals@7.29.7': {} + + '@babel/helper-member-expression-to-functions@7.29.7': + dependencies: + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-imports@7.29.7': + dependencies: + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-module-imports': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + '@babel/traverse': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/helper-optimise-call-expression@7.29.7': + dependencies: + '@babel/types': 7.29.7 + + '@babel/helper-plugin-utils@7.29.7': {} + + '@babel/helper-replace-supers@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-member-expression-to-functions': 7.29.7 + '@babel/helper-optimise-call-expression': 7.29.7 + '@babel/traverse': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/helper-skip-transparent-expression-wrappers@7.29.7': + dependencies: + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/helper-string-parser@7.29.7': {} + + '@babel/helper-validator-identifier@7.29.7': {} + + '@babel/helper-validator-option@7.29.7': {} + + '@babel/helpers@7.29.7': + dependencies: + '@babel/template': 7.29.7 + '@babel/types': 7.29.7 + + '@babel/parser@7.29.7': + dependencies: + '@babel/types': 7.29.7 + + '@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + + '@babel/plugin-transform-modules-commonjs@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7) + '@babel/helper-plugin-utils': 7.29.7 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-typescript@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-annotate-as-pure': 7.29.7 + '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.7) + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 + '@babel/plugin-syntax-typescript': 7.29.7(@babel/core@7.29.7) + transitivePeerDependencies: + - supports-color + + '@babel/preset-typescript@7.29.7(@babel/core@7.29.7)': + dependencies: + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-validator-option': 7.29.7 + '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-modules-commonjs': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-typescript': 7.29.7(@babel/core@7.29.7) + transitivePeerDependencies: + - supports-color + + '@babel/runtime@7.29.7': {} + + '@babel/template@7.29.7': + dependencies: + '@babel/code-frame': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 + + '@babel/traverse@7.29.7': + dependencies: + '@babel/code-frame': 7.29.7 + '@babel/generator': 7.29.7 + '@babel/helper-globals': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/template': 7.29.7 + '@babel/types': 7.29.7 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.29.7': + dependencies: + '@babel/helper-string-parser': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + + '@bcoe/v8-coverage@1.0.2': {} + + '@bramus/specificity@2.4.2': + dependencies: + css-tree: 3.2.1 + + '@colors/colors@1.6.0': {} + + '@csstools/color-helpers@6.1.0': {} + + '@csstools/css-calc@3.2.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': + dependencies: + '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) + '@csstools/css-tokenizer': 4.0.0 + + '@csstools/css-color-parser@4.1.9(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': + dependencies: + '@csstools/color-helpers': 6.1.0 + '@csstools/css-calc': 3.2.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) + '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) + '@csstools/css-tokenizer': 4.0.0 + + '@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0)': + dependencies: + '@csstools/css-tokenizer': 4.0.0 + + '@csstools/css-syntax-patches-for-csstree@1.1.6(css-tree@3.2.1)': + optionalDependencies: + css-tree: 3.2.1 + + '@csstools/css-tokenizer@4.0.0': {} + + '@dabh/diagnostics@2.0.8': + dependencies: + '@so-ric/colorspace': 1.1.6 + enabled: 2.0.0 + kuler: 2.0.0 + + '@date-fns/tz@1.5.0': {} + + '@dotenvx/dotenvx@1.74.2': + dependencies: + commander: 11.1.0 + conf: 10.2.0 + dotenv: 17.4.2 + eciesjs: 0.4.18 + enquirer: 2.4.1 + env-paths: 2.2.1 + execa: 5.1.1 + fdir: 6.5.0(picomatch@4.0.4) + ignore: 5.3.2 + object-treeify: 1.1.33 + open: 8.4.2 + picomatch: 4.0.4 + systeminformation: 5.31.7 + undici: 7.28.0 + which: 4.0.0 + yocto-spinner: 1.2.0 + + '@ecies/ciphers@0.2.6(@noble/ciphers@1.3.0)': + dependencies: + '@noble/ciphers': 1.3.0 + + '@emnapi/core@1.10.0': + dependencies: + '@emnapi/wasi-threads': 1.2.1 + tslib: 2.8.1 + optional: true + + '@emnapi/runtime@1.10.0': + dependencies: + tslib: 2.8.1 + optional: true + + '@emnapi/wasi-threads@1.2.1': + dependencies: + tslib: 2.8.1 + optional: true + + '@esbuild/aix-ppc64@0.28.0': + optional: true + + '@esbuild/android-arm64@0.28.0': + optional: true + + '@esbuild/android-arm@0.28.0': + optional: true + + '@esbuild/android-x64@0.28.0': + optional: true + + '@esbuild/darwin-arm64@0.28.0': + optional: true + + '@esbuild/darwin-x64@0.28.0': + optional: true + + '@esbuild/freebsd-arm64@0.28.0': + optional: true + + '@esbuild/freebsd-x64@0.28.0': + optional: true + + '@esbuild/linux-arm64@0.28.0': + optional: true + + '@esbuild/linux-arm@0.28.0': + optional: true + + '@esbuild/linux-ia32@0.28.0': + optional: true + + '@esbuild/linux-loong64@0.28.0': + optional: true + + '@esbuild/linux-mips64el@0.28.0': + optional: true + + '@esbuild/linux-ppc64@0.28.0': + optional: true + + '@esbuild/linux-riscv64@0.28.0': + optional: true + + '@esbuild/linux-s390x@0.28.0': + optional: true + + '@esbuild/linux-x64@0.28.0': + optional: true + + '@esbuild/netbsd-arm64@0.28.0': + optional: true + + '@esbuild/netbsd-x64@0.28.0': + optional: true + + '@esbuild/openbsd-arm64@0.28.0': + optional: true + + '@esbuild/openbsd-x64@0.28.0': + optional: true + + '@esbuild/openharmony-arm64@0.28.0': + optional: true + + '@esbuild/sunos-x64@0.28.0': + optional: true + + '@esbuild/win32-arm64@0.28.0': + optional: true + + '@esbuild/win32-ia32@0.28.0': + optional: true + + '@esbuild/win32-x64@0.28.0': + optional: true + + '@eslint-community/eslint-plugin-eslint-comments@4.7.2(eslint@10.4.1(jiti@2.7.0))': + dependencies: + escape-string-regexp: 4.0.0 + eslint: 10.4.1(jiti@2.7.0) + ignore: 7.0.5 + + '@eslint-community/eslint-plugin-eslint-comments@4.7.2(eslint@10.7.0(jiti@2.7.0))': + dependencies: + escape-string-regexp: 4.0.0 + eslint: 10.7.0(jiti@2.7.0) + ignore: 7.0.5 + + '@eslint-community/eslint-utils@4.9.1(eslint@10.4.1(jiti@2.7.0))': + dependencies: + eslint: 10.4.1(jiti@2.7.0) + eslint-visitor-keys: 3.4.3 + + '@eslint-community/eslint-utils@4.9.1(eslint@10.7.0(jiti@2.7.0))': + dependencies: + eslint: 10.7.0(jiti@2.7.0) + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.2': {} + + '@eslint/config-array@0.23.5': + dependencies: + '@eslint/object-schema': 3.0.5 + debug: 4.4.3 + minimatch: 10.2.5 + transitivePeerDependencies: + - supports-color + + '@eslint/config-helpers@0.6.0': + dependencies: + '@eslint/core': 1.2.1 + + '@eslint/core@1.2.1': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/js@10.0.1(eslint@10.4.1(jiti@2.7.0))': + optionalDependencies: + eslint: 10.4.1(jiti@2.7.0) + + '@eslint/js@10.0.1(eslint@10.7.0(jiti@2.7.0))': + optionalDependencies: + eslint: 10.7.0(jiti@2.7.0) + + '@eslint/object-schema@3.0.5': {} + + '@eslint/plugin-kit@0.7.2': + dependencies: + '@eslint/core': 1.2.1 + levn: 0.4.1 + + '@exodus/bytes@1.15.1(@noble/hashes@1.8.0)': + optionalDependencies: + '@noble/hashes': 1.8.0 + + '@floating-ui/core@1.7.5': + dependencies: + '@floating-ui/utils': 0.2.11 + + '@floating-ui/dom@1.7.6': + dependencies: + '@floating-ui/core': 1.7.5 + '@floating-ui/utils': 0.2.11 + + '@floating-ui/react-dom@2.1.8(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@floating-ui/dom': 1.7.6 + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + + '@floating-ui/utils@0.2.11': {} + + '@fontsource-variable/inter@5.2.8': {} + + '@hono/node-server@1.19.14(hono@4.12.26)': + dependencies: + hono: 4.12.26 + + '@humanfs/core@0.19.2': + dependencies: + '@humanfs/types': 0.15.0 + + '@humanfs/node@0.16.8': + dependencies: + '@humanfs/core': 0.19.2 + '@humanfs/types': 0.15.0 + '@humanwhocodes/retry': 0.4.3 + + '@humanfs/types@0.15.0': {} + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/retry@0.4.3': {} + + '@isaacs/cliui@9.0.0': {} + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@modelcontextprotocol/sdk@1.29.0(zod@3.25.76)': + dependencies: + '@hono/node-server': 1.19.14(hono@4.12.26) + ajv: 8.20.0 + ajv-formats: 3.0.1(ajv@8.20.0) + content-type: 1.0.5 + cors: 2.8.6 + cross-spawn: 7.0.6 + eventsource: 3.0.7 + eventsource-parser: 3.1.0 + express: 5.2.1 + express-rate-limit: 8.6.0(express@5.2.1) + hono: 4.12.26 + jose: 6.2.3 + json-schema-typed: 8.0.2 + pkce-challenge: 5.0.1 + raw-body: 3.0.2 + zod: 3.25.76 + zod-to-json-schema: 3.25.2(zod@3.25.76) + transitivePeerDependencies: + - supports-color + + '@mongodb-js/saslprep@1.4.11': + dependencies: + sparse-bitfield: 3.0.3 + + '@napi-rs/wasm-runtime@1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': + dependencies: + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 + '@tybys/wasm-util': 0.10.2 + optional: true + + '@noble/ciphers@1.3.0': {} + + '@noble/curves@1.9.7': + dependencies: + '@noble/hashes': 1.8.0 + + '@noble/hashes@1.8.0': {} + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.20.1 + + '@oxc-project/types@0.133.0': {} + + '@paralleldrive/cuid2@2.3.1': + dependencies: + '@noble/hashes': 1.8.0 + + '@radix-ui/number@1.1.2': {} + + '@radix-ui/primitive@1.1.4': {} + + '@radix-ui/react-accessible-icon@1.1.10(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@radix-ui/react-visually-hidden': 1.2.6(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + optionalDependencies: + '@types/react': 19.2.16 + '@types/react-dom': 19.2.3(@types/react@19.2.16) + + '@radix-ui/react-accordion@1.2.14(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@radix-ui/primitive': 1.1.4 + '@radix-ui/react-collapsible': 1.1.14(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-collection': 1.1.10(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-compose-refs': 1.1.3(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-context': 1.1.4(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-direction': 1.1.2(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-id': 1.1.2(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-primitive': 2.1.6(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-use-controllable-state': 1.2.3(@types/react@19.2.16)(react@19.2.7) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + optionalDependencies: + '@types/react': 19.2.16 + '@types/react-dom': 19.2.3(@types/react@19.2.16) + + '@radix-ui/react-alert-dialog@1.1.17(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@radix-ui/primitive': 1.1.4 + '@radix-ui/react-compose-refs': 1.1.3(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-context': 1.1.4(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-dialog': 1.1.17(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-primitive': 2.1.6(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + optionalDependencies: + '@types/react': 19.2.16 + '@types/react-dom': 19.2.3(@types/react@19.2.16) + + '@radix-ui/react-arrow@1.1.10(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@radix-ui/react-primitive': 2.1.6(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + optionalDependencies: + '@types/react': 19.2.16 + '@types/react-dom': 19.2.3(@types/react@19.2.16) + + '@radix-ui/react-aspect-ratio@1.1.10(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@radix-ui/react-primitive': 2.1.6(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + optionalDependencies: + '@types/react': 19.2.16 + '@types/react-dom': 19.2.3(@types/react@19.2.16) + + '@radix-ui/react-avatar@1.2.0(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@radix-ui/react-context': 1.1.4(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-primitive': 2.1.6(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-use-callback-ref': 1.1.2(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-use-is-hydrated': 0.1.1(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@19.2.16)(react@19.2.7) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + optionalDependencies: + '@types/react': 19.2.16 + '@types/react-dom': 19.2.3(@types/react@19.2.16) + + '@radix-ui/react-checkbox@1.3.5(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@radix-ui/primitive': 1.1.4 + '@radix-ui/react-compose-refs': 1.1.3(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-context': 1.1.4(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-presence': 1.1.6(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-primitive': 2.1.6(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-use-controllable-state': 1.2.3(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-use-previous': 1.1.2(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-use-size': 1.1.2(@types/react@19.2.16)(react@19.2.7) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + optionalDependencies: + '@types/react': 19.2.16 + '@types/react-dom': 19.2.3(@types/react@19.2.16) + + '@radix-ui/react-collapsible@1.1.14(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@radix-ui/primitive': 1.1.4 + '@radix-ui/react-compose-refs': 1.1.3(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-context': 1.1.4(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-id': 1.1.2(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-presence': 1.1.6(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-primitive': 2.1.6(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-use-controllable-state': 1.2.3(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@19.2.16)(react@19.2.7) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + optionalDependencies: + '@types/react': 19.2.16 + '@types/react-dom': 19.2.3(@types/react@19.2.16) + + '@radix-ui/react-collection@1.1.10(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.3(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-context': 1.1.4(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-primitive': 2.1.6(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-slot': 1.3.0(@types/react@19.2.16)(react@19.2.7) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + optionalDependencies: + '@types/react': 19.2.16 + '@types/react-dom': 19.2.3(@types/react@19.2.16) + + '@radix-ui/react-compose-refs@1.1.3(@types/react@19.2.16)(react@19.2.7)': + dependencies: + react: 19.2.7 + optionalDependencies: + '@types/react': 19.2.16 + + '@radix-ui/react-context-menu@2.3.1(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@radix-ui/primitive': 1.1.4 + '@radix-ui/react-context': 1.1.4(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-menu': 2.1.18(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-primitive': 2.1.6(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-use-controllable-state': 1.2.3(@types/react@19.2.16)(react@19.2.7) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + optionalDependencies: + '@types/react': 19.2.16 + '@types/react-dom': 19.2.3(@types/react@19.2.16) + + '@radix-ui/react-context@1.1.4(@types/react@19.2.16)(react@19.2.7)': + dependencies: + react: 19.2.7 + optionalDependencies: + '@types/react': 19.2.16 + + '@radix-ui/react-dialog@1.1.17(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@radix-ui/primitive': 1.1.4 + '@radix-ui/react-compose-refs': 1.1.3(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-context': 1.1.4(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-dismissable-layer': 1.1.13(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-focus-guards': 1.1.4(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-focus-scope': 1.1.10(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-id': 1.1.2(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-portal': 1.1.12(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-presence': 1.1.6(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-primitive': 2.1.6(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-slot': 1.3.0(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-use-controllable-state': 1.2.3(@types/react@19.2.16)(react@19.2.7) + aria-hidden: 1.2.6 + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + react-remove-scroll: 2.7.2(@types/react@19.2.16)(react@19.2.7) + optionalDependencies: + '@types/react': 19.2.16 + '@types/react-dom': 19.2.3(@types/react@19.2.16) + + '@radix-ui/react-direction@1.1.2(@types/react@19.2.16)(react@19.2.7)': + dependencies: + react: 19.2.7 + optionalDependencies: + '@types/react': 19.2.16 + + '@radix-ui/react-dismissable-layer@1.1.13(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@radix-ui/primitive': 1.1.4 + '@radix-ui/react-compose-refs': 1.1.3(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-primitive': 2.1.6(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-use-callback-ref': 1.1.2(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-use-escape-keydown': 1.1.2(@types/react@19.2.16)(react@19.2.7) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + optionalDependencies: + '@types/react': 19.2.16 + '@types/react-dom': 19.2.3(@types/react@19.2.16) + + '@radix-ui/react-dropdown-menu@2.1.18(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@radix-ui/primitive': 1.1.4 + '@radix-ui/react-compose-refs': 1.1.3(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-context': 1.1.4(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-id': 1.1.2(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-menu': 2.1.18(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-primitive': 2.1.6(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-use-controllable-state': 1.2.3(@types/react@19.2.16)(react@19.2.7) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + optionalDependencies: + '@types/react': 19.2.16 + '@types/react-dom': 19.2.3(@types/react@19.2.16) + + '@radix-ui/react-focus-guards@1.1.4(@types/react@19.2.16)(react@19.2.7)': + dependencies: + react: 19.2.7 + optionalDependencies: + '@types/react': 19.2.16 + + '@radix-ui/react-focus-scope@1.1.10(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.3(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-primitive': 2.1.6(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-use-callback-ref': 1.1.2(@types/react@19.2.16)(react@19.2.7) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + optionalDependencies: + '@types/react': 19.2.16 + '@types/react-dom': 19.2.3(@types/react@19.2.16) + + '@radix-ui/react-form@0.1.10(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@radix-ui/primitive': 1.1.4 + '@radix-ui/react-compose-refs': 1.1.3(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-context': 1.1.4(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-id': 1.1.2(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-label': 2.1.10(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-primitive': 2.1.6(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + optionalDependencies: + '@types/react': 19.2.16 + '@types/react-dom': 19.2.3(@types/react@19.2.16) + + '@radix-ui/react-hover-card@1.1.17(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@radix-ui/primitive': 1.1.4 + '@radix-ui/react-compose-refs': 1.1.3(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-context': 1.1.4(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-dismissable-layer': 1.1.13(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-popper': 1.3.1(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-portal': 1.1.12(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-presence': 1.1.6(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-primitive': 2.1.6(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-use-controllable-state': 1.2.3(@types/react@19.2.16)(react@19.2.7) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + optionalDependencies: + '@types/react': 19.2.16 + '@types/react-dom': 19.2.3(@types/react@19.2.16) + + '@radix-ui/react-id@1.1.2(@types/react@19.2.16)(react@19.2.7)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@19.2.16)(react@19.2.7) + react: 19.2.7 + optionalDependencies: + '@types/react': 19.2.16 + + '@radix-ui/react-label@2.1.10(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@radix-ui/react-primitive': 2.1.6(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + optionalDependencies: + '@types/react': 19.2.16 + '@types/react-dom': 19.2.3(@types/react@19.2.16) + + '@radix-ui/react-menu@2.1.18(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@radix-ui/primitive': 1.1.4 + '@radix-ui/react-collection': 1.1.10(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-compose-refs': 1.1.3(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-context': 1.1.4(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-direction': 1.1.2(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-dismissable-layer': 1.1.13(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-focus-guards': 1.1.4(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-focus-scope': 1.1.10(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-id': 1.1.2(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-popper': 1.3.1(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-portal': 1.1.12(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-presence': 1.1.6(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-primitive': 2.1.6(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-roving-focus': 1.1.13(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-slot': 1.3.0(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-use-callback-ref': 1.1.2(@types/react@19.2.16)(react@19.2.7) + aria-hidden: 1.2.6 + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + react-remove-scroll: 2.7.2(@types/react@19.2.16)(react@19.2.7) + optionalDependencies: + '@types/react': 19.2.16 + '@types/react-dom': 19.2.3(@types/react@19.2.16) + + '@radix-ui/react-menubar@1.1.18(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@radix-ui/primitive': 1.1.4 + '@radix-ui/react-collection': 1.1.10(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-compose-refs': 1.1.3(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-context': 1.1.4(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-direction': 1.1.2(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-id': 1.1.2(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-menu': 2.1.18(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-primitive': 2.1.6(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-roving-focus': 1.1.13(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-use-controllable-state': 1.2.3(@types/react@19.2.16)(react@19.2.7) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + optionalDependencies: + '@types/react': 19.2.16 + '@types/react-dom': 19.2.3(@types/react@19.2.16) + + '@radix-ui/react-navigation-menu@1.2.16(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@radix-ui/primitive': 1.1.4 + '@radix-ui/react-collection': 1.1.10(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-compose-refs': 1.1.3(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-context': 1.1.4(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-direction': 1.1.2(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-dismissable-layer': 1.1.13(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-id': 1.1.2(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-presence': 1.1.6(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-primitive': 2.1.6(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-use-callback-ref': 1.1.2(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-use-controllable-state': 1.2.3(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-use-previous': 1.1.2(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-visually-hidden': 1.2.6(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + optionalDependencies: + '@types/react': 19.2.16 + '@types/react-dom': 19.2.3(@types/react@19.2.16) + + '@radix-ui/react-one-time-password-field@0.1.10(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@radix-ui/number': 1.1.2 + '@radix-ui/primitive': 1.1.4 + '@radix-ui/react-collection': 1.1.10(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-compose-refs': 1.1.3(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-context': 1.1.4(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-direction': 1.1.2(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-primitive': 2.1.6(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-roving-focus': 1.1.13(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-use-controllable-state': 1.2.3(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-use-effect-event': 0.0.3(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-use-is-hydrated': 0.1.1(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@19.2.16)(react@19.2.7) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + optionalDependencies: + '@types/react': 19.2.16 + '@types/react-dom': 19.2.3(@types/react@19.2.16) + + '@radix-ui/react-password-toggle-field@0.1.5(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@radix-ui/primitive': 1.1.4 + '@radix-ui/react-compose-refs': 1.1.3(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-context': 1.1.4(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-id': 1.1.2(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-primitive': 2.1.6(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-use-controllable-state': 1.2.3(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-use-effect-event': 0.0.3(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-use-is-hydrated': 0.1.1(@types/react@19.2.16)(react@19.2.7) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + optionalDependencies: + '@types/react': 19.2.16 + '@types/react-dom': 19.2.3(@types/react@19.2.16) + + '@radix-ui/react-popover@1.1.17(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@radix-ui/primitive': 1.1.4 + '@radix-ui/react-compose-refs': 1.1.3(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-context': 1.1.4(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-dismissable-layer': 1.1.13(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-focus-guards': 1.1.4(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-focus-scope': 1.1.10(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-id': 1.1.2(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-popper': 1.3.1(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-portal': 1.1.12(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-presence': 1.1.6(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-primitive': 2.1.6(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-slot': 1.3.0(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-use-controllable-state': 1.2.3(@types/react@19.2.16)(react@19.2.7) + aria-hidden: 1.2.6 + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + react-remove-scroll: 2.7.2(@types/react@19.2.16)(react@19.2.7) + optionalDependencies: + '@types/react': 19.2.16 + '@types/react-dom': 19.2.3(@types/react@19.2.16) + + '@radix-ui/react-popper@1.3.1(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@floating-ui/react-dom': 2.1.8(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-arrow': 1.1.10(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-compose-refs': 1.1.3(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-context': 1.1.4(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-primitive': 2.1.6(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-use-callback-ref': 1.1.2(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-use-rect': 1.1.2(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-use-size': 1.1.2(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/rect': 1.1.2 + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + optionalDependencies: + '@types/react': 19.2.16 + '@types/react-dom': 19.2.3(@types/react@19.2.16) + + '@radix-ui/react-portal@1.1.12(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@radix-ui/react-primitive': 2.1.6(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@19.2.16)(react@19.2.7) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + optionalDependencies: + '@types/react': 19.2.16 + '@types/react-dom': 19.2.3(@types/react@19.2.16) + + '@radix-ui/react-presence@1.1.6(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@19.2.16)(react@19.2.7) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + optionalDependencies: + '@types/react': 19.2.16 + '@types/react-dom': 19.2.3(@types/react@19.2.16) + + '@radix-ui/react-primitive@2.1.6(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@radix-ui/react-slot': 1.3.0(@types/react@19.2.16)(react@19.2.7) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + optionalDependencies: + '@types/react': 19.2.16 + '@types/react-dom': 19.2.3(@types/react@19.2.16) + + '@radix-ui/react-progress@1.1.10(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@radix-ui/react-context': 1.1.4(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-primitive': 2.1.6(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + optionalDependencies: + '@types/react': 19.2.16 + '@types/react-dom': 19.2.3(@types/react@19.2.16) + + '@radix-ui/react-radio-group@1.4.1(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@radix-ui/primitive': 1.1.4 + '@radix-ui/react-compose-refs': 1.1.3(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-context': 1.1.4(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-direction': 1.1.2(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-presence': 1.1.6(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-primitive': 2.1.6(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-roving-focus': 1.1.13(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-use-controllable-state': 1.2.3(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-use-previous': 1.1.2(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-use-size': 1.1.2(@types/react@19.2.16)(react@19.2.7) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + optionalDependencies: + '@types/react': 19.2.16 + '@types/react-dom': 19.2.3(@types/react@19.2.16) + + '@radix-ui/react-roving-focus@1.1.13(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@radix-ui/primitive': 1.1.4 + '@radix-ui/react-collection': 1.1.10(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-compose-refs': 1.1.3(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-context': 1.1.4(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-direction': 1.1.2(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-id': 1.1.2(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-primitive': 2.1.6(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-use-callback-ref': 1.1.2(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-use-controllable-state': 1.2.3(@types/react@19.2.16)(react@19.2.7) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + optionalDependencies: + '@types/react': 19.2.16 + '@types/react-dom': 19.2.3(@types/react@19.2.16) + + '@radix-ui/react-scroll-area@1.2.12(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@radix-ui/number': 1.1.2 + '@radix-ui/primitive': 1.1.4 + '@radix-ui/react-compose-refs': 1.1.3(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-context': 1.1.4(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-direction': 1.1.2(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-presence': 1.1.6(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-primitive': 2.1.6(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-use-callback-ref': 1.1.2(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@19.2.16)(react@19.2.7) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + optionalDependencies: + '@types/react': 19.2.16 + '@types/react-dom': 19.2.3(@types/react@19.2.16) + + '@radix-ui/react-select@2.3.1(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@radix-ui/number': 1.1.2 + '@radix-ui/primitive': 1.1.4 + '@radix-ui/react-collection': 1.1.10(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-compose-refs': 1.1.3(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-context': 1.1.4(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-direction': 1.1.2(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-dismissable-layer': 1.1.13(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-focus-guards': 1.1.4(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-focus-scope': 1.1.10(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-id': 1.1.2(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-popper': 1.3.1(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-portal': 1.1.12(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-presence': 1.1.6(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-primitive': 2.1.6(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-slot': 1.3.0(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-use-callback-ref': 1.1.2(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-use-controllable-state': 1.2.3(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-use-previous': 1.1.2(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-visually-hidden': 1.2.6(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + aria-hidden: 1.2.6 + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + react-remove-scroll: 2.7.2(@types/react@19.2.16)(react@19.2.7) + optionalDependencies: + '@types/react': 19.2.16 + '@types/react-dom': 19.2.3(@types/react@19.2.16) + + '@radix-ui/react-separator@1.1.10(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@radix-ui/react-primitive': 2.1.6(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + optionalDependencies: + '@types/react': 19.2.16 + '@types/react-dom': 19.2.3(@types/react@19.2.16) + + '@radix-ui/react-slider@1.4.1(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@radix-ui/number': 1.1.2 + '@radix-ui/primitive': 1.1.4 + '@radix-ui/react-collection': 1.1.10(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-compose-refs': 1.1.3(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-context': 1.1.4(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-direction': 1.1.2(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-primitive': 2.1.6(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-use-controllable-state': 1.2.3(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-use-previous': 1.1.2(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-use-size': 1.1.2(@types/react@19.2.16)(react@19.2.7) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + optionalDependencies: + '@types/react': 19.2.16 + '@types/react-dom': 19.2.3(@types/react@19.2.16) + + '@radix-ui/react-slot@1.3.0(@types/react@19.2.16)(react@19.2.7)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.3(@types/react@19.2.16)(react@19.2.7) + react: 19.2.7 + optionalDependencies: + '@types/react': 19.2.16 + + '@radix-ui/react-switch@1.3.1(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@radix-ui/primitive': 1.1.4 + '@radix-ui/react-compose-refs': 1.1.3(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-context': 1.1.4(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-primitive': 2.1.6(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-use-controllable-state': 1.2.3(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-use-previous': 1.1.2(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-use-size': 1.1.2(@types/react@19.2.16)(react@19.2.7) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + optionalDependencies: + '@types/react': 19.2.16 + '@types/react-dom': 19.2.3(@types/react@19.2.16) + + '@radix-ui/react-tabs@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@radix-ui/primitive': 1.1.4 + '@radix-ui/react-context': 1.1.4(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-direction': 1.1.2(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-id': 1.1.2(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-presence': 1.1.6(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-primitive': 2.1.6(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-roving-focus': 1.1.13(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-use-controllable-state': 1.2.3(@types/react@19.2.16)(react@19.2.7) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + optionalDependencies: + '@types/react': 19.2.16 + '@types/react-dom': 19.2.3(@types/react@19.2.16) + + '@radix-ui/react-toast@1.2.17(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@radix-ui/primitive': 1.1.4 + '@radix-ui/react-collection': 1.1.10(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-compose-refs': 1.1.3(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-context': 1.1.4(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-dismissable-layer': 1.1.13(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-portal': 1.1.12(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-presence': 1.1.6(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-primitive': 2.1.6(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-use-callback-ref': 1.1.2(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-use-controllable-state': 1.2.3(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-visually-hidden': 1.2.6(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + optionalDependencies: + '@types/react': 19.2.16 + '@types/react-dom': 19.2.3(@types/react@19.2.16) + + '@radix-ui/react-toggle-group@1.1.13(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@radix-ui/primitive': 1.1.4 + '@radix-ui/react-context': 1.1.4(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-direction': 1.1.2(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-primitive': 2.1.6(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-roving-focus': 1.1.13(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-toggle': 1.1.12(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-use-controllable-state': 1.2.3(@types/react@19.2.16)(react@19.2.7) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + optionalDependencies: + '@types/react': 19.2.16 + '@types/react-dom': 19.2.3(@types/react@19.2.16) + + '@radix-ui/react-toggle@1.1.12(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@radix-ui/primitive': 1.1.4 + '@radix-ui/react-primitive': 2.1.6(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-use-controllable-state': 1.2.3(@types/react@19.2.16)(react@19.2.7) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + optionalDependencies: + '@types/react': 19.2.16 + '@types/react-dom': 19.2.3(@types/react@19.2.16) + + '@radix-ui/react-toolbar@1.1.13(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@radix-ui/primitive': 1.1.4 + '@radix-ui/react-context': 1.1.4(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-direction': 1.1.2(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-primitive': 2.1.6(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-roving-focus': 1.1.13(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-separator': 1.1.10(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-toggle-group': 1.1.13(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + optionalDependencies: + '@types/react': 19.2.16 + '@types/react-dom': 19.2.3(@types/react@19.2.16) + + '@radix-ui/react-tooltip@1.2.10(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@radix-ui/primitive': 1.1.4 + '@radix-ui/react-compose-refs': 1.1.3(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-context': 1.1.4(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-dismissable-layer': 1.1.13(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-id': 1.1.2(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-popper': 1.3.1(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-portal': 1.1.12(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-presence': 1.1.6(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-primitive': 2.1.6(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-slot': 1.3.0(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-use-controllable-state': 1.2.3(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-visually-hidden': 1.2.6(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + optionalDependencies: + '@types/react': 19.2.16 + '@types/react-dom': 19.2.3(@types/react@19.2.16) + + '@radix-ui/react-use-callback-ref@1.1.2(@types/react@19.2.16)(react@19.2.7)': + dependencies: + react: 19.2.7 + optionalDependencies: + '@types/react': 19.2.16 + + '@radix-ui/react-use-controllable-state@1.2.3(@types/react@19.2.16)(react@19.2.7)': + dependencies: + '@radix-ui/react-use-effect-event': 0.0.3(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@19.2.16)(react@19.2.7) + react: 19.2.7 + optionalDependencies: + '@types/react': 19.2.16 + + '@radix-ui/react-use-effect-event@0.0.3(@types/react@19.2.16)(react@19.2.7)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@19.2.16)(react@19.2.7) + react: 19.2.7 + optionalDependencies: + '@types/react': 19.2.16 + + '@radix-ui/react-use-escape-keydown@1.1.2(@types/react@19.2.16)(react@19.2.7)': + dependencies: + '@radix-ui/react-use-callback-ref': 1.1.2(@types/react@19.2.16)(react@19.2.7) + react: 19.2.7 + optionalDependencies: + '@types/react': 19.2.16 + + '@radix-ui/react-use-is-hydrated@0.1.1(@types/react@19.2.16)(react@19.2.7)': + dependencies: + react: 19.2.7 + optionalDependencies: + '@types/react': 19.2.16 + + '@radix-ui/react-use-layout-effect@1.1.2(@types/react@19.2.16)(react@19.2.7)': + dependencies: + react: 19.2.7 + optionalDependencies: + '@types/react': 19.2.16 + + '@radix-ui/react-use-previous@1.1.2(@types/react@19.2.16)(react@19.2.7)': + dependencies: + react: 19.2.7 + optionalDependencies: + '@types/react': 19.2.16 + + '@radix-ui/react-use-rect@1.1.2(@types/react@19.2.16)(react@19.2.7)': + dependencies: + '@radix-ui/rect': 1.1.2 + react: 19.2.7 + optionalDependencies: + '@types/react': 19.2.16 + + '@radix-ui/react-use-size@1.1.2(@types/react@19.2.16)(react@19.2.7)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@19.2.16)(react@19.2.7) + react: 19.2.7 + optionalDependencies: + '@types/react': 19.2.16 + + '@radix-ui/react-visually-hidden@1.2.6(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@radix-ui/react-primitive': 2.1.6(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + optionalDependencies: + '@types/react': 19.2.16 + '@types/react-dom': 19.2.3(@types/react@19.2.16) + + '@radix-ui/rect@1.1.2': {} + + '@reduxjs/toolkit@2.12.0(react-redux@9.3.0(@types/react@19.2.16)(react@19.2.7)(redux@5.0.1))(react@19.2.7)': + dependencies: + '@standard-schema/spec': 1.1.0 + '@standard-schema/utils': 0.3.0 + immer: 11.1.8 + redux: 5.0.1 + redux-thunk: 3.1.0(redux@5.0.1) + reselect: 5.2.0 + optionalDependencies: + react: 19.2.7 + react-redux: 9.3.0(@types/react@19.2.16)(react@19.2.7)(redux@5.0.1) + + '@rolldown/binding-android-arm64@1.0.3': + optional: true + + '@rolldown/binding-darwin-arm64@1.0.3': + optional: true + + '@rolldown/binding-darwin-x64@1.0.3': + optional: true + + '@rolldown/binding-freebsd-x64@1.0.3': + optional: true + + '@rolldown/binding-linux-arm-gnueabihf@1.0.3': + optional: true + + '@rolldown/binding-linux-arm64-gnu@1.0.3': + optional: true + + '@rolldown/binding-linux-arm64-musl@1.0.3': + optional: true + + '@rolldown/binding-linux-ppc64-gnu@1.0.3': + optional: true + + '@rolldown/binding-linux-s390x-gnu@1.0.3': + optional: true + + '@rolldown/binding-linux-x64-gnu@1.0.3': + optional: true + + '@rolldown/binding-linux-x64-musl@1.0.3': + optional: true + + '@rolldown/binding-openharmony-arm64@1.0.3': + optional: true + + '@rolldown/binding-wasm32-wasi@1.0.3': + dependencies: + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 + '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + optional: true + + '@rolldown/binding-win32-arm64-msvc@1.0.3': + optional: true + + '@rolldown/binding-win32-x64-msvc@1.0.3': + optional: true + + '@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.29.7)(rolldown@1.0.3)(vite@8.0.16(@types/node@24.12.4)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0))': + dependencies: + '@babel/core': 7.29.7 + picomatch: 4.0.4 + rolldown: 1.0.3 + optionalDependencies: + '@babel/runtime': 7.29.7 + vite: 8.0.16(@types/node@24.12.4)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0) + + '@rolldown/pluginutils@1.0.1': {} + + '@scarf/scarf@1.4.0': {} + + '@sec-ant/readable-stream@0.4.1': {} + + '@sindresorhus/merge-streams@4.0.0': {} + + '@so-ric/colorspace@1.1.6': + dependencies: + color: 5.0.3 + text-hex: 1.0.0 + + '@stablelib/base64@1.0.1': {} + + '@standard-schema/spec@1.1.0': {} + + '@standard-schema/utils@0.3.0': {} + + '@tailwindcss/node@4.3.0': + dependencies: + '@jridgewell/remapping': 2.3.5 + enhanced-resolve: 5.22.2 + jiti: 2.7.0 + lightningcss: 1.32.0 + magic-string: 0.30.21 + source-map-js: 1.2.1 + tailwindcss: 4.3.0 + + '@tailwindcss/oxide-android-arm64@4.3.0': + optional: true + + '@tailwindcss/oxide-darwin-arm64@4.3.0': + optional: true + + '@tailwindcss/oxide-darwin-x64@4.3.0': + optional: true + + '@tailwindcss/oxide-freebsd-x64@4.3.0': + optional: true + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.0': + optional: true + + '@tailwindcss/oxide-linux-arm64-gnu@4.3.0': + optional: true + + '@tailwindcss/oxide-linux-arm64-musl@4.3.0': + optional: true + + '@tailwindcss/oxide-linux-x64-gnu@4.3.0': + optional: true + + '@tailwindcss/oxide-linux-x64-musl@4.3.0': + optional: true + + '@tailwindcss/oxide-wasm32-wasi@4.3.0': + optional: true + + '@tailwindcss/oxide-win32-arm64-msvc@4.3.0': + optional: true + + '@tailwindcss/oxide-win32-x64-msvc@4.3.0': + optional: true + + '@tailwindcss/oxide@4.3.0': + optionalDependencies: + '@tailwindcss/oxide-android-arm64': 4.3.0 + '@tailwindcss/oxide-darwin-arm64': 4.3.0 + '@tailwindcss/oxide-darwin-x64': 4.3.0 + '@tailwindcss/oxide-freebsd-x64': 4.3.0 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.3.0 + '@tailwindcss/oxide-linux-arm64-gnu': 4.3.0 + '@tailwindcss/oxide-linux-arm64-musl': 4.3.0 + '@tailwindcss/oxide-linux-x64-gnu': 4.3.0 + '@tailwindcss/oxide-linux-x64-musl': 4.3.0 + '@tailwindcss/oxide-wasm32-wasi': 4.3.0 + '@tailwindcss/oxide-win32-arm64-msvc': 4.3.0 + '@tailwindcss/oxide-win32-x64-msvc': 4.3.0 + + '@tailwindcss/vite@4.3.0(vite@8.0.16(@types/node@24.12.4)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0))': + dependencies: + '@tailwindcss/node': 4.3.0 + '@tailwindcss/oxide': 4.3.0 + tailwindcss: 4.3.0 + vite: 8.0.16(@types/node@24.12.4)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0) + + '@tanstack/query-core@5.101.0': {} + + '@tanstack/react-query@5.101.0(react@19.2.7)': + dependencies: + '@tanstack/query-core': 5.101.0 + react: 19.2.7 + + '@tanstack/react-table@8.21.3(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@tanstack/table-core': 8.21.3 + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + + '@tanstack/table-core@8.21.3': {} + + '@testing-library/dom@10.4.1': + dependencies: + '@babel/code-frame': 7.29.7 + '@babel/runtime': 7.29.7 + '@types/aria-query': 5.0.4 + aria-query: 5.3.0 + dom-accessibility-api: 0.5.16 + lz-string: 1.5.0 + picocolors: 1.1.1 + pretty-format: 27.5.1 + + '@testing-library/jest-dom@7.0.0(@testing-library/dom@10.4.1)': + dependencies: + '@adobe/css-tools': 4.5.0 + '@testing-library/dom': 10.4.1 + aria-query: 5.3.2 + css.escape: 1.5.1 + dom-accessibility-api: 0.6.3 + picocolors: 1.1.1 + redent: 3.0.0 + + '@testing-library/react@16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@babel/runtime': 7.29.7 + '@testing-library/dom': 10.4.1 + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + optionalDependencies: + '@types/react': 19.2.16 + '@types/react-dom': 19.2.3(@types/react@19.2.16) + + '@testing-library/user-event@14.6.1(@testing-library/dom@10.4.1)': + dependencies: + '@testing-library/dom': 10.4.1 + + '@ts-morph/common@0.27.0': + dependencies: + fast-glob: 3.3.3 + minimatch: 10.2.5 + path-browserify: 1.0.1 + + '@tybys/wasm-util@0.10.2': + dependencies: + tslib: 2.8.1 + optional: true + + '@types/aria-query@5.0.4': {} + + '@types/babel__core@7.20.5': + dependencies: + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 + '@types/babel__generator': 7.27.0 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.28.0 + + '@types/babel__generator@7.27.0': + dependencies: + '@babel/types': 7.29.7 + + '@types/babel__template@7.4.4': + dependencies: + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 + + '@types/babel__traverse@7.28.0': + dependencies: + '@babel/types': 7.29.7 + + '@types/bcrypt@6.0.0': + dependencies: + '@types/node': 24.12.4 + + '@types/body-parser@1.19.6': + dependencies: + '@types/connect': 3.4.38 + '@types/node': 24.12.4 + + '@types/chai@5.2.3': + dependencies: + '@types/deep-eql': 4.0.2 + assertion-error: 2.0.1 + + '@types/compression@1.8.1': + dependencies: + '@types/express': 5.0.6 + '@types/node': 24.12.4 + + '@types/connect@3.4.38': + dependencies: + '@types/node': 24.12.4 + + '@types/cookie-parser@1.4.10(@types/express@5.0.6)': + dependencies: + '@types/express': 5.0.6 + + '@types/cookiejar@2.1.5': {} + + '@types/cors@2.8.19': + dependencies: + '@types/node': 24.12.4 + + '@types/d3-array@3.2.2': {} + + '@types/d3-color@3.1.3': {} + + '@types/d3-ease@3.0.2': {} + + '@types/d3-interpolate@3.0.4': + dependencies: + '@types/d3-color': 3.1.3 + + '@types/d3-path@3.1.1': {} + + '@types/d3-scale@4.0.9': + dependencies: + '@types/d3-time': 3.0.4 + + '@types/d3-shape@3.1.8': + dependencies: + '@types/d3-path': 3.1.1 + + '@types/d3-time@3.0.4': {} + + '@types/d3-timer@3.0.2': {} + + '@types/deep-eql@4.0.2': {} + + '@types/esrecurse@4.3.1': {} + + '@types/estree@1.0.9': {} + + '@types/express-serve-static-core@5.1.1': + dependencies: + '@types/node': 24.12.4 + '@types/qs': 6.15.1 + '@types/range-parser': 1.2.7 + '@types/send': 1.2.1 + + '@types/express@5.0.6': + dependencies: + '@types/body-parser': 1.19.6 + '@types/express-serve-static-core': 5.1.1 + '@types/serve-static': 2.2.0 + + '@types/geojson@7946.0.16': {} + + '@types/hoist-non-react-statics@3.3.7(@types/react@19.2.16)': + dependencies: + '@types/react': 19.2.16 + hoist-non-react-statics: 3.3.2 + + '@types/http-errors@2.0.5': {} + + '@types/json-schema@7.0.15': {} + + '@types/jsonwebtoken@9.0.10': + dependencies: + '@types/ms': 2.1.0 + '@types/node': 24.12.4 + + '@types/leaflet@1.9.21': + dependencies: + '@types/geojson': 7946.0.16 + + '@types/methods@1.1.4': {} + + '@types/ms@2.1.0': {} + + '@types/node@22.19.19': + dependencies: + undici-types: 6.21.0 + + '@types/node@24.12.4': + dependencies: + undici-types: 7.16.0 + + '@types/qs@6.15.1': {} + + '@types/range-parser@1.2.7': {} + + '@types/react-dom@19.2.3(@types/react@19.2.16)': + dependencies: + '@types/react': 19.2.16 + + '@types/react@19.2.16': + dependencies: + csstype: 3.2.3 + + '@types/send@1.2.1': + dependencies: + '@types/node': 24.12.4 + + '@types/serve-static@2.2.0': + dependencies: + '@types/http-errors': 2.0.5 + '@types/node': 24.12.4 + + '@types/superagent@8.1.11': + dependencies: + '@types/cookiejar': 2.1.5 + '@types/methods': 1.1.4 + '@types/node': 24.12.4 + form-data: 4.0.5 + + '@types/supertest@7.2.1': + dependencies: + '@types/methods': 1.1.4 + '@types/superagent': 8.1.11 + + '@types/swagger-jsdoc@6.0.4': {} + + '@types/swagger-ui-express@4.1.8': + dependencies: + '@types/express': 5.0.6 + '@types/serve-static': 2.2.0 + + '@types/triple-beam@1.3.5': {} + + '@types/use-sync-external-store@0.0.6': {} + + '@types/validate-npm-package-name@4.0.2': {} + + '@types/webidl-conversions@7.0.3': {} + + '@types/whatwg-url@13.0.0': + dependencies: + '@types/webidl-conversions': 7.0.3 + + '@typescript-eslint/eslint-plugin@8.60.1(@typescript-eslint/parser@8.60.1(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3)': + dependencies: + '@eslint-community/regexpp': 4.12.2 + '@typescript-eslint/parser': 8.60.1(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/scope-manager': 8.60.1 + '@typescript-eslint/type-utils': 8.60.1(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/utils': 8.60.1(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/visitor-keys': 8.60.1 + eslint: 10.4.1(jiti@2.7.0) + ignore: 7.0.5 + natural-compare: 1.4.0 + ts-api-utils: 2.5.0(typescript@6.0.3) + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/eslint-plugin@8.65.0(@typescript-eslint/parser@8.65.0(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.3))(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.3)': + dependencies: + '@eslint-community/regexpp': 4.12.2 + '@typescript-eslint/parser': 8.65.0(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.65.0 + '@typescript-eslint/type-utils': 8.65.0(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.3) + '@typescript-eslint/utils': 8.65.0(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.65.0 + eslint: 10.7.0(jiti@2.7.0) + ignore: 7.0.5 + natural-compare: 1.4.0 + ts-api-utils: 2.5.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@8.60.1(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3)': + dependencies: + '@typescript-eslint/scope-manager': 8.60.1 + '@typescript-eslint/types': 8.60.1 + '@typescript-eslint/typescript-estree': 8.60.1(typescript@6.0.3) + '@typescript-eslint/visitor-keys': 8.60.1 + debug: 4.4.3 + eslint: 10.4.1(jiti@2.7.0) + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@8.65.0(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.3)': + dependencies: + '@typescript-eslint/scope-manager': 8.65.0 + '@typescript-eslint/types': 8.65.0 + '@typescript-eslint/typescript-estree': 8.65.0(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.65.0 + debug: 4.4.3 + eslint: 10.7.0(jiti@2.7.0) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/project-service@8.60.1(typescript@6.0.3)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.60.1(typescript@6.0.3) + '@typescript-eslint/types': 8.60.1 + debug: 4.4.3 + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/project-service@8.65.0(typescript@5.9.3)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.65.0(typescript@5.9.3) + '@typescript-eslint/types': 8.65.0 + debug: 4.4.3 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@8.60.1': + dependencies: + '@typescript-eslint/types': 8.60.1 + '@typescript-eslint/visitor-keys': 8.60.1 + + '@typescript-eslint/scope-manager@8.65.0': + dependencies: + '@typescript-eslint/types': 8.65.0 + '@typescript-eslint/visitor-keys': 8.65.0 + + '@typescript-eslint/tsconfig-utils@8.60.1(typescript@6.0.3)': + dependencies: + typescript: 6.0.3 + + '@typescript-eslint/tsconfig-utils@8.65.0(typescript@5.9.3)': + dependencies: + typescript: 5.9.3 + + '@typescript-eslint/type-utils@8.60.1(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3)': + dependencies: + '@typescript-eslint/types': 8.60.1 + '@typescript-eslint/typescript-estree': 8.60.1(typescript@6.0.3) + '@typescript-eslint/utils': 8.60.1(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + debug: 4.4.3 + eslint: 10.4.1(jiti@2.7.0) + ts-api-utils: 2.5.0(typescript@6.0.3) + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/type-utils@8.65.0(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.3)': + dependencies: + '@typescript-eslint/types': 8.65.0 + '@typescript-eslint/typescript-estree': 8.65.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.65.0(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.3) + debug: 4.4.3 + eslint: 10.7.0(jiti@2.7.0) + ts-api-utils: 2.5.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@8.60.1': {} + + '@typescript-eslint/types@8.65.0': {} + + '@typescript-eslint/typescript-estree@8.60.1(typescript@6.0.3)': + dependencies: + '@typescript-eslint/project-service': 8.60.1(typescript@6.0.3) + '@typescript-eslint/tsconfig-utils': 8.60.1(typescript@6.0.3) + '@typescript-eslint/types': 8.60.1 + '@typescript-eslint/visitor-keys': 8.60.1 + debug: 4.4.3 + minimatch: 10.2.5 + semver: 7.8.1 + tinyglobby: 0.2.17 + ts-api-utils: 2.5.0(typescript@6.0.3) + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/typescript-estree@8.65.0(typescript@5.9.3)': + dependencies: + '@typescript-eslint/project-service': 8.65.0(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.65.0(typescript@5.9.3) + '@typescript-eslint/types': 8.65.0 + '@typescript-eslint/visitor-keys': 8.65.0 + debug: 4.4.3 + minimatch: 10.2.5 + semver: 7.8.1 + tinyglobby: 0.2.17 + ts-api-utils: 2.5.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.60.1(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3)': + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@10.4.1(jiti@2.7.0)) + '@typescript-eslint/scope-manager': 8.60.1 + '@typescript-eslint/types': 8.60.1 + '@typescript-eslint/typescript-estree': 8.60.1(typescript@6.0.3) + eslint: 10.4.1(jiti@2.7.0) + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.65.0(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.3)': + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@10.7.0(jiti@2.7.0)) + '@typescript-eslint/scope-manager': 8.65.0 + '@typescript-eslint/types': 8.65.0 + '@typescript-eslint/typescript-estree': 8.65.0(typescript@5.9.3) + eslint: 10.7.0(jiti@2.7.0) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/visitor-keys@8.60.1': + dependencies: + '@typescript-eslint/types': 8.60.1 + eslint-visitor-keys: 5.0.1 + + '@typescript-eslint/visitor-keys@8.65.0': + dependencies: + '@typescript-eslint/types': 8.65.0 + eslint-visitor-keys: 5.0.1 + + '@vitejs/plugin-react@6.0.2(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/runtime@7.29.7)(rolldown@1.0.3)(vite@8.0.16(@types/node@24.12.4)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.16(@types/node@24.12.4)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0))': + dependencies: + '@rolldown/pluginutils': 1.0.1 + vite: 8.0.16(@types/node@24.12.4)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0) + optionalDependencies: + '@rolldown/plugin-babel': 0.2.3(@babel/core@7.29.7)(@babel/runtime@7.29.7)(rolldown@1.0.3)(vite@8.0.16(@types/node@24.12.4)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0)) + babel-plugin-react-compiler: 1.0.0 + + '@vitest/coverage-v8@4.1.10(vitest@4.1.10)': + dependencies: + '@bcoe/v8-coverage': 1.0.2 + '@vitest/utils': 4.1.10 + ast-v8-to-istanbul: 1.0.5 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-report: 3.0.1 + istanbul-reports: 3.2.0 + magicast: 0.5.3 + obug: 2.1.4 + std-env: 4.2.0 + tinyrainbow: 3.1.0 + vitest: 4.1.10(@types/node@24.12.4)(@vitest/coverage-v8@4.1.10)(jsdom@29.1.1(@noble/hashes@1.8.0))(vite@8.0.16(@types/node@24.12.4)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0)) + + '@vitest/expect@4.1.10': + dependencies: + '@standard-schema/spec': 1.1.0 + '@types/chai': 5.2.3 + '@vitest/spy': 4.1.10 + '@vitest/utils': 4.1.10 + chai: 6.2.2 + tinyrainbow: 3.1.0 + + '@vitest/mocker@4.1.10(vite@8.0.16(@types/node@22.19.19)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0))': + dependencies: + '@vitest/spy': 4.1.10 + estree-walker: 3.0.3 + magic-string: 0.30.21 + optionalDependencies: + vite: 8.0.16(@types/node@22.19.19)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0) + + '@vitest/mocker@4.1.10(vite@8.0.16(@types/node@24.12.4)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0))': + dependencies: + '@vitest/spy': 4.1.10 + estree-walker: 3.0.3 + magic-string: 0.30.21 + optionalDependencies: + vite: 8.0.16(@types/node@24.12.4)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0) + + '@vitest/pretty-format@4.1.10': + dependencies: + tinyrainbow: 3.1.0 + + '@vitest/runner@4.1.10': + dependencies: + '@vitest/utils': 4.1.10 + pathe: 2.0.3 + + '@vitest/snapshot@4.1.10': + dependencies: + '@vitest/pretty-format': 4.1.10 + '@vitest/utils': 4.1.10 + magic-string: 0.30.21 + pathe: 2.0.3 + + '@vitest/spy@4.1.10': {} + + '@vitest/utils@4.1.10': + dependencies: + '@vitest/pretty-format': 4.1.10 + convert-source-map: 2.0.0 + tinyrainbow: 3.1.0 + + accepts@2.0.0: + dependencies: + mime-types: 3.0.2 + negotiator: 1.0.0 + + acorn-jsx@5.3.2(acorn@8.16.0): + dependencies: + acorn: 8.16.0 + + acorn@8.16.0: {} + + agent-base@6.0.2: + dependencies: + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + agent-base@7.1.4: {} + + ajv-draft-04@1.0.0(ajv@8.20.0): + optionalDependencies: + ajv: 8.20.0 + + ajv-formats@2.1.1(ajv@8.20.0): + optionalDependencies: + ajv: 8.20.0 + + ajv-formats@3.0.1(ajv@8.20.0): + optionalDependencies: + ajv: 8.20.0 + + ajv@6.15.0: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ajv@8.20.0: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.1.2 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + + ansi-colors@4.1.3: {} + + ansi-escapes@7.3.0: + dependencies: + environment: 1.1.0 + + ansi-regex@5.0.1: {} + + ansi-regex@6.2.2: {} + + ansi-styles@5.2.0: {} + + ansi-styles@6.2.3: {} + + argparse@2.0.1: {} + + aria-hidden@1.2.6: + dependencies: + tslib: 2.8.1 + + aria-query@5.3.0: + dependencies: + dequal: 2.0.3 + + aria-query@5.3.2: {} + + asap@2.0.6: {} + + assertion-error@2.0.1: {} + + ast-types@0.16.1: + dependencies: + tslib: 2.8.1 + + ast-v8-to-istanbul@1.0.5: + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + estree-walker: 3.0.3 + js-tokens: 10.0.0 + + async-mutex@0.5.0: + dependencies: + tslib: 2.8.1 + + async@3.2.6: {} + + asynckit@0.4.0: {} + + atomically@1.7.0: {} + + axios@1.17.0: + dependencies: + follow-redirects: 1.16.0(debug@4.4.3) + form-data: 4.0.5 + https-proxy-agent: 5.0.1 + proxy-from-env: 2.1.0 + transitivePeerDependencies: + - debug + - supports-color + + axios@1.18.1: + dependencies: + follow-redirects: 1.16.0(debug@4.4.3) + form-data: 4.0.5 + https-proxy-agent: 5.0.1 + proxy-from-env: 2.1.0 + transitivePeerDependencies: + - debug + - supports-color + + b4a@1.8.1: {} + + babel-plugin-react-compiler@1.0.0: + dependencies: + '@babel/types': 7.29.7 + + balanced-match@4.0.4: {} + + bare-events@2.9.1: {} + + bare-fs@4.7.4: + dependencies: + bare-events: 2.9.1 + bare-path: 3.1.1 + bare-stream: 2.13.3(bare-events@2.9.1) + bare-url: 2.4.6 + fast-fifo: 1.3.2 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a + + bare-path@3.1.1: {} + + bare-stream@2.13.3(bare-events@2.9.1): + dependencies: + b4a: 1.8.1 + streamx: 2.28.0 + teex: 1.0.1 + optionalDependencies: + bare-events: 2.9.1 + transitivePeerDependencies: + - react-native-b4a + + bare-url@2.4.6: + dependencies: + bare-path: 3.1.1 + + base64-js@1.5.1: {} + + baseline-browser-mapping@2.10.33: {} + + bcrypt@6.0.0: + dependencies: + node-addon-api: 8.8.0 + node-gyp-build: 4.8.4 + + bidi-js@1.0.3: + dependencies: + require-from-string: 2.0.2 + + body-parser@2.2.2: + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 4.4.3 + http-errors: 2.0.1 + iconv-lite: 0.7.2 + on-finished: 2.4.1 + qs: 6.15.2 + raw-body: 3.0.2 + type-is: 2.1.0 + transitivePeerDependencies: + - supports-color + + brace-expansion@5.0.6: + dependencies: + balanced-match: 4.0.4 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + brotli@1.3.3: + dependencies: + base64-js: 1.5.1 + + browserslist@4.28.2: + dependencies: + baseline-browser-mapping: 2.10.33 + caniuse-lite: 1.0.30001793 + electron-to-chromium: 1.5.367 + node-releases: 2.0.47 + update-browserslist-db: 1.2.3(browserslist@4.28.2) + + bson@7.2.0: {} + + buffer-equal-constant-time@1.0.1: {} + + bundle-name@4.1.0: + dependencies: + run-applescript: 7.1.0 + + bytes@3.1.2: {} + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + + call-me-maybe@1.0.2: {} + + callsites@3.1.0: {} + + camelcase@6.3.0: {} + + caniuse-lite@1.0.30001793: {} + + chai@6.2.2: {} + + chalk@5.6.2: {} + + class-variance-authority@0.7.1: + dependencies: + clsx: 2.1.1 + + cli-cursor@5.0.0: + dependencies: + restore-cursor: 5.1.0 + + cli-spinners@2.9.2: {} + + cli-truncate@5.2.0: + dependencies: + slice-ansi: 8.0.0 + string-width: 8.2.1 + + cloudinary@2.10.0: + dependencies: + lodash: 4.18.1 + + clsx@2.1.1: {} + + code-block-writer@13.0.3: {} + + color-convert@3.1.3: + dependencies: + color-name: 2.1.0 + + color-name@2.1.0: {} + + color-string@2.1.4: + dependencies: + color-name: 2.1.0 + + color@5.0.3: + dependencies: + color-convert: 3.1.3 + color-string: 2.1.4 + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + commander@11.1.0: {} + + commander@14.0.3: {} + + commander@6.2.0: {} + + commondir@1.0.1: {} + + component-emitter@1.3.1: {} + + compressible@2.0.18: + dependencies: + mime-db: 1.54.0 + + compression@1.8.1: + dependencies: + bytes: 3.1.2 + compressible: 2.0.18 + debug: 2.6.9 + negotiator: 0.6.4 + on-headers: 1.1.0 + safe-buffer: 5.2.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + conf@10.2.0: + dependencies: + ajv: 8.20.0 + ajv-formats: 2.1.1(ajv@8.20.0) + atomically: 1.7.0 + debounce-fn: 4.0.0 + dot-prop: 6.0.1 + env-paths: 2.2.1 + json-schema-typed: 7.0.3 + onetime: 5.1.2 + pkg-up: 3.1.0 + semver: 7.8.1 + + content-disposition@1.1.0: {} + + content-type@1.0.5: {} + + content-type@2.0.0: {} + + convert-source-map@2.0.0: {} + + cookie-parser@1.4.7: + dependencies: + cookie: 0.7.2 + cookie-signature: 1.0.6 + + cookie-signature@1.0.6: {} + + cookie-signature@1.2.2: {} + + cookie@0.7.2: {} + + cookie@1.1.1: {} + + cookiejar@2.1.4: {} + + cors@2.8.6: + dependencies: + object-assign: 4.1.1 + vary: 1.1.2 + + cosmiconfig@9.0.2(typescript@6.0.3): + dependencies: + env-paths: 2.2.1 + import-fresh: 3.3.1 + js-yaml: 4.2.0 + parse-json: 5.2.0 + optionalDependencies: + typescript: 6.0.3 + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + css-tree@3.2.1: + dependencies: + mdn-data: 2.27.1 + source-map-js: 1.2.1 + + css.escape@1.5.1: {} + + cssesc@3.0.0: {} + + csstype@3.2.3: {} + + d3-array@3.2.4: + dependencies: + internmap: 2.0.3 + + d3-color@3.1.0: {} + + d3-ease@3.0.1: {} + + d3-format@3.1.2: {} + + d3-interpolate@3.0.1: + dependencies: + d3-color: 3.1.0 + + d3-path@3.1.0: {} + + d3-scale@4.0.2: + dependencies: + d3-array: 3.2.4 + d3-format: 3.1.2 + d3-interpolate: 3.0.1 + d3-time: 3.1.0 + d3-time-format: 4.1.0 + + d3-shape@3.2.0: + dependencies: + d3-path: 3.1.0 + + d3-time-format@4.1.0: + dependencies: + d3-time: 3.1.0 + + d3-time@3.1.0: + dependencies: + d3-array: 3.2.4 + + d3-timer@3.0.1: {} + + data-uri-to-buffer@4.0.1: {} + + data-urls@7.0.0(@noble/hashes@1.8.0): + dependencies: + whatwg-mimetype: 5.0.0 + whatwg-url: 16.0.1(@noble/hashes@1.8.0) + transitivePeerDependencies: + - '@noble/hashes' + + date-fns@4.4.0: {} + + debounce-fn@4.0.0: + dependencies: + mimic-fn: 3.1.0 + + debug@2.6.9: + dependencies: + ms: 2.0.0 + + debug@4.4.3: + dependencies: + ms: 2.1.3 + + decimal.js-light@2.5.1: {} + + decimal.js@10.6.0: {} + + dedent@1.7.2: {} + + deep-is@0.1.4: {} + + deepmerge@2.2.1: {} + + deepmerge@4.3.1: {} + + default-browser-id@5.0.1: {} + + default-browser@5.5.0: + dependencies: + bundle-name: 4.1.0 + default-browser-id: 5.0.1 + + define-lazy-prop@2.0.0: {} + + define-lazy-prop@3.0.0: {} + + delayed-stream@1.0.0: {} + + depd@2.0.0: {} + + dequal@2.0.3: {} + + detect-libc@2.1.2: {} + + detect-node-es@1.1.0: {} + + dezalgo@1.0.4: + dependencies: + asap: 2.0.6 + wrappy: 1.0.2 + + diff@8.0.4: {} + + doctrine@3.0.0: + dependencies: + esutils: 2.0.3 + + dom-accessibility-api@0.5.16: {} + + dom-accessibility-api@0.6.3: {} + + dot-prop@6.0.1: + dependencies: + is-obj: 2.0.0 + + dotenv@17.4.2: {} + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + ecdsa-sig-formatter@1.0.11: + dependencies: + safe-buffer: 5.2.1 + + eciesjs@0.4.18: + dependencies: + '@ecies/ciphers': 0.2.6(@noble/ciphers@1.3.0) + '@noble/ciphers': 1.3.0 + '@noble/curves': 1.9.7 + '@noble/hashes': 1.8.0 + + ee-first@1.1.1: {} + + electron-to-chromium@1.5.367: {} + + emoji-regex@10.6.0: {} + + enabled@2.0.0: {} + + encodeurl@2.0.0: {} + + enhanced-resolve@5.22.2: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.3.3 + + enquirer@2.4.1: + dependencies: + ansi-colors: 4.1.3 + strip-ansi: 6.0.1 + + entities@8.0.0: {} + + env-paths@2.2.1: {} + + environment@1.1.0: {} + + error-ex@1.3.4: + dependencies: + is-arrayish: 0.2.1 + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-module-lexer@2.3.1: {} + + es-object-atoms@1.1.2: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.4 + + es-toolkit@1.49.0: {} + + esbuild@0.28.0: + optionalDependencies: + '@esbuild/aix-ppc64': 0.28.0 + '@esbuild/android-arm': 0.28.0 + '@esbuild/android-arm64': 0.28.0 + '@esbuild/android-x64': 0.28.0 + '@esbuild/darwin-arm64': 0.28.0 + '@esbuild/darwin-x64': 0.28.0 + '@esbuild/freebsd-arm64': 0.28.0 + '@esbuild/freebsd-x64': 0.28.0 + '@esbuild/linux-arm': 0.28.0 + '@esbuild/linux-arm64': 0.28.0 + '@esbuild/linux-ia32': 0.28.0 + '@esbuild/linux-loong64': 0.28.0 + '@esbuild/linux-mips64el': 0.28.0 + '@esbuild/linux-ppc64': 0.28.0 + '@esbuild/linux-riscv64': 0.28.0 + '@esbuild/linux-s390x': 0.28.0 + '@esbuild/linux-x64': 0.28.0 + '@esbuild/netbsd-arm64': 0.28.0 + '@esbuild/netbsd-x64': 0.28.0 + '@esbuild/openbsd-arm64': 0.28.0 + '@esbuild/openbsd-x64': 0.28.0 + '@esbuild/openharmony-arm64': 0.28.0 + '@esbuild/sunos-x64': 0.28.0 + '@esbuild/win32-arm64': 0.28.0 + '@esbuild/win32-ia32': 0.28.0 + '@esbuild/win32-x64': 0.28.0 + + escalade@3.2.0: {} + + escape-html@1.0.3: {} + + escape-string-regexp@4.0.0: {} + + eslint-plugin-react-hooks@7.1.1(eslint@10.4.1(jiti@2.7.0)): + dependencies: + '@babel/core': 7.29.7 + '@babel/parser': 7.29.7 + eslint: 10.4.1(jiti@2.7.0) + hermes-parser: 0.25.1 + zod: 4.4.3 + zod-validation-error: 4.0.2(zod@4.4.3) + transitivePeerDependencies: + - supports-color + + eslint-plugin-react-refresh@0.5.2(eslint@10.4.1(jiti@2.7.0)): + dependencies: + eslint: 10.4.1(jiti@2.7.0) + + eslint-scope@9.1.2: + dependencies: + '@types/esrecurse': 4.3.1 + '@types/estree': 1.0.9 + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint-visitor-keys@5.0.1: {} + + eslint@10.4.1(jiti@2.7.0): + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@10.4.1(jiti@2.7.0)) + '@eslint-community/regexpp': 4.12.2 + '@eslint/config-array': 0.23.5 + '@eslint/config-helpers': 0.6.0 + '@eslint/core': 1.2.1 + '@eslint/plugin-kit': 0.7.2 + '@humanfs/node': 0.16.8 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.4.3 + '@types/estree': 1.0.9 + ajv: 6.15.0 + cross-spawn: 7.0.6 + debug: 4.4.3 + escape-string-regexp: 4.0.0 + eslint-scope: 9.1.2 + eslint-visitor-keys: 5.0.1 + espree: 11.2.0 + esquery: 1.7.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 8.0.0 + find-up: 5.0.0 + glob-parent: 6.0.2 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + json-stable-stringify-without-jsonify: 1.0.1 + minimatch: 10.2.5 + natural-compare: 1.4.0 + optionator: 0.9.4 + optionalDependencies: + jiti: 2.7.0 + transitivePeerDependencies: + - supports-color + + eslint@10.7.0(jiti@2.7.0): + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@10.7.0(jiti@2.7.0)) + '@eslint-community/regexpp': 4.12.2 + '@eslint/config-array': 0.23.5 + '@eslint/config-helpers': 0.6.0 + '@eslint/core': 1.2.1 + '@eslint/plugin-kit': 0.7.2 + '@humanfs/node': 0.16.8 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.4.3 + '@types/estree': 1.0.9 + ajv: 6.15.0 + cross-spawn: 7.0.6 + debug: 4.4.3 + escape-string-regexp: 4.0.0 + eslint-scope: 9.1.2 + eslint-visitor-keys: 5.0.1 + espree: 11.2.0 + esquery: 1.7.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 8.0.0 + find-up: 5.0.0 + glob-parent: 6.0.2 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + json-stable-stringify-without-jsonify: 1.0.1 + minimatch: 10.2.5 + natural-compare: 1.4.0 + optionator: 0.9.4 + optionalDependencies: + jiti: 2.7.0 + transitivePeerDependencies: + - supports-color + + espree@11.2.0: + dependencies: + acorn: 8.16.0 + acorn-jsx: 5.3.2(acorn@8.16.0) + eslint-visitor-keys: 5.0.1 + + esprima@4.0.1: {} + + esquery@1.7.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@5.3.0: {} + + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.9 + + esutils@2.0.3: {} + + etag@1.8.1: {} + + eventemitter3@5.0.4: {} + + events-universal@1.0.1: + dependencies: + bare-events: 2.9.1 + transitivePeerDependencies: + - bare-abort-controller + + eventsource-parser@3.1.0: {} + + eventsource@3.0.7: + dependencies: + eventsource-parser: 3.1.0 + + execa@5.1.1: + dependencies: + cross-spawn: 7.0.6 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + + execa@9.6.1: + dependencies: + '@sindresorhus/merge-streams': 4.0.0 + cross-spawn: 7.0.6 + figures: 6.1.0 + get-stream: 9.0.1 + human-signals: 8.0.1 + is-plain-obj: 4.1.0 + is-stream: 4.0.1 + npm-run-path: 6.0.0 + pretty-ms: 9.3.0 + signal-exit: 4.1.0 + strip-final-newline: 4.0.0 + yoctocolors: 2.1.2 + + expect-type@1.4.0: {} + + express-rate-limit@8.6.0(express@5.2.1): + dependencies: + debug: 4.4.3 + express: 5.2.1 + ip-address: 10.2.0 + transitivePeerDependencies: + - supports-color + + express-validator@7.3.2: + dependencies: + lodash: 4.18.1 + validator: 13.15.35 + + express@5.2.1: + dependencies: + accepts: 2.0.0 + body-parser: 2.2.2 + content-disposition: 1.1.0 + content-type: 1.0.5 + cookie: 0.7.2 + cookie-signature: 1.2.2 + debug: 4.4.3 + depd: 2.0.0 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 2.1.1 + fresh: 2.0.0 + http-errors: 2.0.1 + merge-descriptors: 2.0.0 + mime-types: 3.0.2 + on-finished: 2.4.1 + once: 1.4.0 + parseurl: 1.3.3 + proxy-addr: 2.0.7 + qs: 6.15.2 + range-parser: 1.2.1 + router: 2.2.0 + send: 1.2.1 + serve-static: 2.2.1 + statuses: 2.0.2 + type-is: 2.1.0 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + fast-deep-equal@3.1.3: {} + + fast-fifo@1.3.2: {} + + fast-glob@3.3.3: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fast-safe-stringify@2.1.1: {} + + fast-sha256@1.3.0: {} + + fast-uri@3.1.2: {} + + fastq@1.20.1: + dependencies: + reusify: 1.1.0 + + fdir@6.5.0(picomatch@4.0.4): + optionalDependencies: + picomatch: 4.0.4 + + fecha@4.2.3: {} + + fetch-blob@3.2.0: + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 3.3.3 + + figures@6.1.0: + dependencies: + is-unicode-supported: 2.1.0 + + file-entry-cache@8.0.0: + dependencies: + flat-cache: 4.0.1 + + file-stream-rotator@0.6.1: + dependencies: + moment: 2.30.1 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + finalhandler@2.1.1: + dependencies: + debug: 4.4.3 + encodeurl: 2.0.0 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.2 + transitivePeerDependencies: + - supports-color + + find-cache-dir@3.3.2: + dependencies: + commondir: 1.0.1 + make-dir: 3.1.0 + pkg-dir: 4.2.0 + + find-up@3.0.0: + dependencies: + locate-path: 3.0.0 + + find-up@4.1.0: + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + flat-cache@4.0.1: + dependencies: + flatted: 3.4.2 + keyv: 4.5.4 + + flatted@3.4.2: {} + + fn.name@1.1.0: {} + + follow-redirects@1.16.0(debug@4.4.3): + optionalDependencies: + debug: 4.4.3 + + foreground-child@3.3.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + form-data@4.0.5: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + hasown: 2.0.4 + mime-types: 2.1.35 + + formdata-polyfill@4.0.10: + dependencies: + fetch-blob: 3.2.0 + + formidable@3.5.4: + dependencies: + '@paralleldrive/cuid2': 2.3.1 + dezalgo: 1.0.4 + once: 1.4.0 + + formik@2.4.9(@types/react@19.2.16)(react@19.2.7): + dependencies: + '@types/hoist-non-react-statics': 3.3.7(@types/react@19.2.16) + deepmerge: 2.2.1 + hoist-non-react-statics: 3.3.2 + lodash: 4.18.1 + lodash-es: 4.18.1 + react: 19.2.7 + react-fast-compare: 2.0.4 + tiny-warning: 1.0.3 + tslib: 2.8.1 + transitivePeerDependencies: + - '@types/react' + + forwarded@0.2.0: {} + + framer-motion@12.42.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7): + dependencies: + motion-dom: 12.42.2 + motion-utils: 12.39.0 + tslib: 2.8.1 + optionalDependencies: + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + + fresh@2.0.0: {} + + fs-extra@11.3.5: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.2.1 + universalify: 2.0.1 + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + fuzzysort@3.1.0: {} + + gensync@1.0.0-beta.2: {} + + get-east-asian-width@1.6.0: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.2 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.4 + math-intrinsics: 1.1.0 + + get-nonce@1.0.1: {} + + get-own-enumerable-keys@1.0.0: {} + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.2 + + get-stream@6.0.1: {} + + get-stream@9.0.1: + dependencies: + '@sec-ant/readable-stream': 0.4.1 + is-stream: 4.0.1 + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob@11.1.0: + dependencies: + foreground-child: 3.3.1 + jackspeak: 4.2.3 + minimatch: 10.2.5 + minipass: 7.1.3 + package-json-from-dist: 1.0.1 + path-scurry: 2.0.2 + + globals@17.6.0: {} + + globals@17.7.0: {} + + goober@2.1.19(csstype@3.2.3): + dependencies: + csstype: 3.2.3 + + gopd@1.2.0: {} + + graceful-fs@4.2.11: {} + + has-flag@4.0.0: {} + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hasown@2.0.4: + dependencies: + function-bind: 1.1.2 + + helmet@8.3.0: {} + + hermes-estree@0.25.1: {} + + hermes-parser@0.25.1: + dependencies: + hermes-estree: 0.25.1 + + hoist-non-react-statics@3.3.2: + dependencies: + react-is: 16.13.1 + + hono@4.12.26: {} + + html-encoding-sniffer@6.0.0(@noble/hashes@1.8.0): + dependencies: + '@exodus/bytes': 1.15.1(@noble/hashes@1.8.0) + transitivePeerDependencies: + - '@noble/hashes' + + html-escaper@2.0.2: {} + + http-errors@2.0.1: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.2 + toidentifier: 1.0.1 + + https-proxy-agent@5.0.1: + dependencies: + agent-base: 6.0.2 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + https-proxy-agent@7.0.6: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + human-signals@2.1.0: {} + + human-signals@8.0.1: {} + + husky@9.1.7: {} + + iconv-lite@0.7.2: + dependencies: + safer-buffer: 2.1.2 + + ignore@5.3.2: {} + + ignore@7.0.5: {} + + immer@10.2.0: {} + + immer@11.1.8: {} + + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + imurmurhash@0.1.4: {} + + indent-string@4.0.0: {} + + inherits@2.0.4: {} + + internmap@2.0.3: {} + + ip-address@10.2.0: {} + + ipaddr.js@1.9.1: {} + + is-arrayish@0.2.1: {} + + is-docker@2.2.1: {} + + is-docker@3.0.0: {} + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@5.1.0: + dependencies: + get-east-asian-width: 1.6.0 + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-in-ssh@1.0.0: {} + + is-inside-container@1.0.0: + dependencies: + is-docker: 3.0.0 + + is-interactive@2.0.0: {} + + is-number@7.0.0: {} + + is-obj@2.0.0: {} + + is-obj@3.0.0: {} + + is-plain-obj@4.1.0: {} + + is-potential-custom-element-name@1.0.1: {} + + is-promise@4.0.0: {} + + is-regexp@3.1.0: {} + + is-stream@2.0.1: {} + + is-stream@4.0.1: {} + + is-unicode-supported@1.3.0: {} + + is-unicode-supported@2.1.0: {} + + is-wsl@2.2.0: + dependencies: + is-docker: 2.2.1 + + is-wsl@3.1.1: + dependencies: + is-inside-container: 1.0.0 + + isexe@2.0.0: {} + + isexe@3.1.5: {} + + istanbul-lib-coverage@3.2.2: {} + + istanbul-lib-report@3.0.1: + dependencies: + istanbul-lib-coverage: 3.2.2 + make-dir: 4.0.0 + supports-color: 7.2.0 + + istanbul-reports@3.2.0: + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 + + jackspeak@4.2.3: + dependencies: + '@isaacs/cliui': 9.0.0 + + jiti@2.7.0: {} + + jose@6.2.3: {} + + js-tokens@10.0.0: {} + + js-tokens@4.0.0: {} + + js-yaml@4.2.0: + dependencies: + argparse: 2.0.1 + + jsdom@29.1.1(@noble/hashes@1.8.0): + dependencies: + '@asamuzakjp/css-color': 5.1.11 + '@asamuzakjp/dom-selector': 7.1.1 + '@bramus/specificity': 2.4.2 + '@csstools/css-syntax-patches-for-csstree': 1.1.6(css-tree@3.2.1) + '@exodus/bytes': 1.15.1(@noble/hashes@1.8.0) + css-tree: 3.2.1 + data-urls: 7.0.0(@noble/hashes@1.8.0) + decimal.js: 10.6.0 + html-encoding-sniffer: 6.0.0(@noble/hashes@1.8.0) + is-potential-custom-element-name: 1.0.1 + lru-cache: 11.5.1 + parse5: 8.0.1 + saxes: 6.0.0 + symbol-tree: 3.2.4 + tough-cookie: 6.0.2 + undici: 7.28.0 + w3c-xmlserializer: 5.0.0 + webidl-conversions: 8.0.1 + whatwg-mimetype: 5.0.0 + whatwg-url: 16.0.1(@noble/hashes@1.8.0) + xml-name-validator: 5.0.0 + transitivePeerDependencies: + - '@noble/hashes' + + jsesc@3.1.0: {} + + json-buffer@3.0.1: {} + + json-parse-even-better-errors@2.3.1: {} + + json-schema-traverse@0.4.1: {} + + json-schema-traverse@1.0.0: {} + + json-schema-typed@7.0.3: {} + + json-schema-typed@8.0.2: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + json5@2.2.3: {} + + jsonfile@6.2.1: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + + jsonwebtoken@9.0.3: + dependencies: + jws: 4.0.1 + lodash.includes: 4.3.0 + lodash.isboolean: 3.0.3 + lodash.isinteger: 4.0.4 + lodash.isnumber: 3.0.3 + lodash.isplainobject: 4.0.6 + lodash.isstring: 4.0.1 + lodash.once: 4.1.1 + ms: 2.1.3 + semver: 7.8.1 + + jwa@2.0.1: + dependencies: + buffer-equal-constant-time: 1.0.1 + ecdsa-sig-formatter: 1.0.11 + safe-buffer: 5.2.1 + + jws@4.0.1: + dependencies: + jwa: 2.0.1 + safe-buffer: 5.2.1 + + kareem@3.3.0: {} + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + kleur@3.0.3: {} + + kleur@4.1.5: {} + + kuler@2.0.0: {} + + leaflet@1.9.4: {} + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + lightningcss-android-arm64@1.32.0: + optional: true + + lightningcss-darwin-arm64@1.32.0: + optional: true + + lightningcss-darwin-x64@1.32.0: + optional: true + + lightningcss-freebsd-x64@1.32.0: + optional: true + + lightningcss-linux-arm-gnueabihf@1.32.0: + optional: true + + lightningcss-linux-arm64-gnu@1.32.0: + optional: true + + lightningcss-linux-arm64-musl@1.32.0: + optional: true + + lightningcss-linux-x64-gnu@1.32.0: + optional: true + + lightningcss-linux-x64-musl@1.32.0: + optional: true + + lightningcss-win32-arm64-msvc@1.32.0: + optional: true + + lightningcss-win32-x64-msvc@1.32.0: + optional: true + + lightningcss@1.32.0: + dependencies: + detect-libc: 2.1.2 + optionalDependencies: + lightningcss-android-arm64: 1.32.0 + lightningcss-darwin-arm64: 1.32.0 + lightningcss-darwin-x64: 1.32.0 + lightningcss-freebsd-x64: 1.32.0 + lightningcss-linux-arm-gnueabihf: 1.32.0 + lightningcss-linux-arm64-gnu: 1.32.0 + lightningcss-linux-arm64-musl: 1.32.0 + lightningcss-linux-x64-gnu: 1.32.0 + lightningcss-linux-x64-musl: 1.32.0 + lightningcss-win32-arm64-msvc: 1.32.0 + lightningcss-win32-x64-msvc: 1.32.0 + + lines-and-columns@1.2.4: {} + + lint-staged@17.0.7: + dependencies: + listr2: 10.2.1 + picomatch: 4.0.4 + string-argv: 0.3.2 + tinyexec: 1.2.4 + optionalDependencies: + yaml: 2.9.0 + + listr2@10.2.1: + dependencies: + cli-truncate: 5.2.0 + eventemitter3: 5.0.4 + log-update: 6.1.0 + rfdc: 1.4.1 + wrap-ansi: 10.0.0 + + locate-path@3.0.0: + dependencies: + p-locate: 3.0.0 + path-exists: 3.0.0 + + locate-path@5.0.0: + dependencies: + p-locate: 4.1.0 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash-es@4.18.1: {} + + lodash.includes@4.3.0: {} + + lodash.isboolean@3.0.3: {} + + lodash.isinteger@4.0.4: {} + + lodash.isnumber@3.0.3: {} + + lodash.isplainobject@4.0.6: {} + + lodash.isstring@4.0.1: {} + + lodash.mergewith@4.6.2: {} + + lodash.once@4.1.1: {} + + lodash@4.18.1: {} + + log-symbols@6.0.0: + dependencies: + chalk: 5.6.2 + is-unicode-supported: 1.3.0 + + log-update@6.1.0: + dependencies: + ansi-escapes: 7.3.0 + cli-cursor: 5.0.0 + slice-ansi: 7.1.2 + strip-ansi: 7.2.0 + wrap-ansi: 9.0.2 + + logform@2.7.0: + dependencies: + '@colors/colors': 1.6.0 + '@types/triple-beam': 1.3.5 + fecha: 4.2.3 + ms: 2.1.3 + safe-stable-stringify: 2.5.0 + triple-beam: 1.4.1 + + lru-cache@11.5.1: {} + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + lucide-react@1.21.0(react@19.2.7): + dependencies: + react: 19.2.7 + + lz-string@1.5.0: {} + + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + magicast@0.5.3: + dependencies: + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 + source-map-js: 1.2.1 + + make-dir@3.1.0: + dependencies: + semver: 6.3.1 + + make-dir@4.0.0: + dependencies: + semver: 7.8.1 + + math-intrinsics@1.1.0: {} + + mdn-data@2.27.1: {} + + media-typer@1.1.0: {} + + memory-pager@1.5.0: {} + + merge-descriptors@2.0.0: {} + + merge-stream@2.0.0: {} + + merge2@1.4.1: {} + + methods@1.1.2: {} + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.2 + + mime-db@1.52.0: {} + + mime-db@1.54.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mime-types@3.0.2: + dependencies: + mime-db: 1.54.0 + + mime@2.6.0: {} + + mimic-fn@2.1.0: {} + + mimic-fn@3.1.0: {} + + mimic-function@5.0.1: {} + + min-indent@1.0.1: {} + + minimatch@10.2.5: + dependencies: + brace-expansion: 5.0.6 + + minimist@1.2.8: {} + + minipass@7.1.3: {} + + moment@2.30.1: {} + + mongodb-connection-string-url@7.0.1: + dependencies: + '@types/whatwg-url': 13.0.0 + whatwg-url: 14.2.0 + + mongodb-memory-server-core@11.2.0: + dependencies: + async-mutex: 0.5.0 + camelcase: 6.3.0 + debug: 4.4.3 + find-cache-dir: 3.3.2 + follow-redirects: 1.16.0(debug@4.4.3) + https-proxy-agent: 7.0.6 + mongodb: 7.2.0 + new-find-package-json: 2.0.0 + semver: 7.8.1 + tar-stream: 3.2.0 + tslib: 2.8.1 + yauzl: 3.4.0 + transitivePeerDependencies: + - '@aws-sdk/credential-providers' + - '@mongodb-js/zstd' + - bare-abort-controller + - bare-buffer + - gcp-metadata + - kerberos + - mongodb-client-encryption + - react-native-b4a + - snappy + - socks + - supports-color + + mongodb-memory-server@11.2.0: + dependencies: + mongodb-memory-server-core: 11.2.0 + tslib: 2.8.1 + transitivePeerDependencies: + - '@aws-sdk/credential-providers' + - '@mongodb-js/zstd' + - bare-abort-controller + - bare-buffer + - gcp-metadata + - kerberos + - mongodb-client-encryption + - react-native-b4a + - snappy + - socks + - supports-color + + mongodb@7.2.0: + dependencies: + '@mongodb-js/saslprep': 1.4.11 + bson: 7.2.0 + mongodb-connection-string-url: 7.0.1 + + mongodb@7.5.0: + dependencies: + '@mongodb-js/saslprep': 1.4.11 + bson: 7.2.0 + mongodb-connection-string-url: 7.0.1 + + mongoose@9.8.0: + dependencies: + '@standard-schema/spec': 1.1.0 + kareem: 3.3.0 + mongodb: 7.5.0 + mpath: 0.9.0 + mquery: 6.0.0 + ms: 2.1.3 + sift: 17.1.3 + transitivePeerDependencies: + - '@aws-sdk/credential-providers' + - '@mongodb-js/zstd' + - gcp-metadata + - kerberos + - mongodb-client-encryption + - snappy + - socks + + motion-dom@12.42.2: + dependencies: + motion-utils: 12.39.0 + + motion-utils@12.39.0: {} + + mpath@0.9.0: {} + + mquery@6.0.0: {} + + ms@2.0.0: {} + + ms@2.1.3: {} + + nanoid@3.3.12: {} + + natural-compare@1.4.0: {} + + negotiator@0.6.4: {} + + negotiator@1.0.0: {} + + new-find-package-json@2.0.0: + dependencies: + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + node-addon-api@8.8.0: {} + + node-domexception@1.0.0: {} + + node-fetch@3.3.2: + dependencies: + data-uri-to-buffer: 4.0.1 + fetch-blob: 3.2.0 + formdata-polyfill: 4.0.10 + + node-gyp-build@4.8.4: {} + + node-releases@2.0.47: {} + + normalize-wheel@1.0.1: {} + + npm-run-path@4.0.1: + dependencies: + path-key: 3.1.1 + + npm-run-path@6.0.0: + dependencies: + path-key: 4.0.0 + unicorn-magic: 0.3.0 + + object-assign@4.1.1: {} + + object-hash@3.0.0: {} + + object-inspect@1.13.4: {} + + object-treeify@1.1.33: {} + + obug@2.1.4: {} + + on-finished@2.4.1: + dependencies: + ee-first: 1.1.1 + + on-headers@1.1.0: {} + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + one-time@1.0.0: + dependencies: + fn.name: 1.1.0 + + onetime@5.1.2: + dependencies: + mimic-fn: 2.1.0 + + onetime@7.0.0: + dependencies: + mimic-function: 5.0.1 + + open@11.0.0: + dependencies: + default-browser: 5.5.0 + define-lazy-prop: 3.0.0 + is-in-ssh: 1.0.0 + is-inside-container: 1.0.0 + powershell-utils: 0.1.0 + wsl-utils: 0.3.1 + + open@8.4.2: + dependencies: + define-lazy-prop: 2.0.0 + is-docker: 2.2.1 + is-wsl: 2.2.0 + + openapi-types@12.1.3: {} + + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + + ora@8.2.0: + dependencies: + chalk: 5.6.2 + cli-cursor: 5.0.0 + cli-spinners: 2.9.2 + is-interactive: 2.0.0 + is-unicode-supported: 2.1.0 + log-symbols: 6.0.0 + stdin-discarder: 0.2.2 + string-width: 7.2.0 + strip-ansi: 7.2.0 + + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@3.0.0: + dependencies: + p-limit: 2.3.0 + + p-locate@4.1.0: + dependencies: + p-limit: 2.3.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + p-try@2.2.0: {} + + package-json-from-dist@1.0.1: {} + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.29.7 + error-ex: 1.3.4 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + + parse-ms@4.0.0: {} + + parse5@8.0.1: + dependencies: + entities: 8.0.0 + + parseurl@1.3.3: {} + + path-browserify@1.0.1: {} + + path-exists@3.0.0: {} + + path-exists@4.0.0: {} + + path-key@3.1.1: {} + + path-key@4.0.0: {} + + path-scurry@2.0.2: + dependencies: + lru-cache: 11.5.1 + minipass: 7.1.3 + + path-to-regexp@8.4.2: {} + + pathe@2.0.3: {} + + pend@1.2.0: {} + + picocolors@1.1.1: {} + + picomatch@2.3.2: {} + + picomatch@4.0.4: {} + + pkce-challenge@5.0.1: {} + + pkg-dir@4.2.0: + dependencies: + find-up: 4.1.0 + + pkg-up@3.1.0: + dependencies: + find-up: 3.0.0 + + postal-mime@2.7.5: {} + + postcss-selector-parser@7.1.4: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss@8.5.15: + dependencies: + nanoid: 3.3.12 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + powershell-utils@0.1.0: {} + + prelude-ls@1.2.1: {} + + prettier@3.8.3: {} + + prettier@3.9.6: {} + + pretty-format@27.5.1: + dependencies: + ansi-regex: 5.0.1 + ansi-styles: 5.2.0 + react-is: 17.0.2 + + pretty-ms@9.3.0: + dependencies: + parse-ms: 4.0.0 + + prompts@2.4.2: + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + + property-expr@2.0.6: {} + + proxy-addr@2.0.7: + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + + proxy-from-env@2.1.0: {} + + punycode@2.3.1: {} + + qs@6.15.2: + dependencies: + side-channel: 1.1.0 + + queue-microtask@1.2.3: {} + + radix-ui@1.6.0(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7): + dependencies: + '@radix-ui/primitive': 1.1.4 + '@radix-ui/react-accessible-icon': 1.1.10(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-accordion': 1.2.14(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-alert-dialog': 1.1.17(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-arrow': 1.1.10(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-aspect-ratio': 1.1.10(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-avatar': 1.2.0(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-checkbox': 1.3.5(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-collapsible': 1.1.14(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-collection': 1.1.10(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-compose-refs': 1.1.3(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-context': 1.1.4(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-context-menu': 2.3.1(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-dialog': 1.1.17(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-direction': 1.1.2(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-dismissable-layer': 1.1.13(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-dropdown-menu': 2.1.18(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-focus-guards': 1.1.4(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-focus-scope': 1.1.10(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-form': 0.1.10(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-hover-card': 1.1.17(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-label': 2.1.10(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-menu': 2.1.18(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-menubar': 1.1.18(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-navigation-menu': 1.2.16(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-one-time-password-field': 0.1.10(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-password-toggle-field': 0.1.5(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-popover': 1.1.17(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-popper': 1.3.1(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-portal': 1.1.12(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-presence': 1.1.6(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-primitive': 2.1.6(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-progress': 1.1.10(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-radio-group': 1.4.1(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-roving-focus': 1.1.13(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-scroll-area': 1.2.12(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-select': 2.3.1(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-separator': 1.1.10(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-slider': 1.4.1(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-slot': 1.3.0(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-switch': 1.3.1(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-tabs': 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-toast': 1.2.17(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-toggle': 1.1.12(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-toggle-group': 1.1.13(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-toolbar': 1.1.13(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-tooltip': 1.2.10(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-use-callback-ref': 1.1.2(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-use-controllable-state': 1.2.3(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-use-effect-event': 0.0.3(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-use-escape-keydown': 1.1.2(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-use-is-hydrated': 0.1.1(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-use-size': 1.1.2(@types/react@19.2.16)(react@19.2.7) + '@radix-ui/react-visually-hidden': 1.2.6(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + optionalDependencies: + '@types/react': 19.2.16 + '@types/react-dom': 19.2.3(@types/react@19.2.16) + + range-parser@1.2.1: {} + + raw-body@3.0.2: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.1 + iconv-lite: 0.7.2 + unpipe: 1.0.0 + + razorpay@2.9.8: + dependencies: + axios: 1.18.1 + transitivePeerDependencies: + - debug + - supports-color + + react-day-picker@10.0.1(@types/react@19.2.16)(react@19.2.7): + dependencies: + '@date-fns/tz': 1.5.0 + date-fns: 4.4.0 + react: 19.2.7 + optionalDependencies: + '@types/react': 19.2.16 + + react-dom@19.2.7(react@19.2.7): + dependencies: + react: 19.2.7 + scheduler: 0.27.0 + + react-easy-crop@6.2.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7): + dependencies: + normalize-wheel: 1.0.1 + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + + react-fast-compare@2.0.4: {} + + react-hot-toast@2.6.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7): + dependencies: + csstype: 3.2.3 + goober: 2.1.19(csstype@3.2.3) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + + react-icons@5.6.0(react@19.2.7): + dependencies: + react: 19.2.7 + + react-is@16.13.1: {} + + react-is@17.0.2: {} + + react-redux@9.3.0(@types/react@19.2.16)(react@19.2.7)(redux@5.0.1): + dependencies: + '@types/use-sync-external-store': 0.0.6 + react: 19.2.7 + use-sync-external-store: 1.6.0(react@19.2.7) + optionalDependencies: + '@types/react': 19.2.16 + redux: 5.0.1 + + react-remove-scroll-bar@2.3.8(@types/react@19.2.16)(react@19.2.7): + dependencies: + react: 19.2.7 + react-style-singleton: 2.2.3(@types/react@19.2.16)(react@19.2.7) + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.2.16 + + react-remove-scroll@2.7.2(@types/react@19.2.16)(react@19.2.7): + dependencies: + react: 19.2.7 + react-remove-scroll-bar: 2.3.8(@types/react@19.2.16)(react@19.2.7) + react-style-singleton: 2.2.3(@types/react@19.2.16)(react@19.2.7) + tslib: 2.8.1 + use-callback-ref: 1.3.3(@types/react@19.2.16)(react@19.2.7) + use-sidecar: 1.1.3(@types/react@19.2.16)(react@19.2.7) + optionalDependencies: + '@types/react': 19.2.16 + + react-router-dom@7.17.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7): + dependencies: + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + react-router: 7.17.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + + react-router@7.16.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7): + dependencies: + cookie: 1.1.1 + react: 19.2.7 + set-cookie-parser: 2.7.2 + optionalDependencies: + react-dom: 19.2.7(react@19.2.7) + + react-router@7.17.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7): + dependencies: + cookie: 1.1.1 + react: 19.2.7 + set-cookie-parser: 2.7.2 + optionalDependencies: + react-dom: 19.2.7(react@19.2.7) + + react-style-singleton@2.2.3(@types/react@19.2.16)(react@19.2.7): + dependencies: + get-nonce: 1.0.1 + react: 19.2.7 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.2.16 + + react@19.2.7: {} + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + recast@0.23.11: + dependencies: + ast-types: 0.16.1 + esprima: 4.0.1 + source-map: 0.6.1 + tiny-invariant: 1.3.3 + tslib: 2.8.1 + + recharts@3.9.0(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react-is@17.0.2)(react@19.2.7)(redux@5.0.1): + dependencies: + '@reduxjs/toolkit': 2.12.0(react-redux@9.3.0(@types/react@19.2.16)(react@19.2.7)(redux@5.0.1))(react@19.2.7) + clsx: 2.1.1 + decimal.js-light: 2.5.1 + es-toolkit: 1.49.0 + eventemitter3: 5.0.4 + immer: 10.2.0 + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + react-is: 17.0.2 + react-redux: 9.3.0(@types/react@19.2.16)(react@19.2.7)(redux@5.0.1) + reselect: 5.2.0 + tiny-invariant: 1.3.3 + use-sync-external-store: 1.6.0(react@19.2.7) + victory-vendor: 37.3.6 + transitivePeerDependencies: + - '@types/react' + - redux + + redent@3.0.0: + dependencies: + indent-string: 4.0.0 + strip-indent: 3.0.0 + + redux-thunk@3.1.0(redux@5.0.1): + dependencies: + redux: 5.0.1 + + redux@5.0.1: {} + + require-from-string@2.0.2: {} + + reselect@5.2.0: {} + + resend@6.18.0: + dependencies: + postal-mime: 2.7.5 + standardwebhooks: 1.0.0 + + resolve-from@4.0.0: {} + + restore-cursor@5.1.0: + dependencies: + onetime: 7.0.0 + signal-exit: 4.1.0 + + reusify@1.1.0: {} + + rfdc@1.4.1: {} + + rolldown@1.0.3: + dependencies: + '@oxc-project/types': 0.133.0 + '@rolldown/pluginutils': 1.0.1 + optionalDependencies: + '@rolldown/binding-android-arm64': 1.0.3 + '@rolldown/binding-darwin-arm64': 1.0.3 + '@rolldown/binding-darwin-x64': 1.0.3 + '@rolldown/binding-freebsd-x64': 1.0.3 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.3 + '@rolldown/binding-linux-arm64-gnu': 1.0.3 + '@rolldown/binding-linux-arm64-musl': 1.0.3 + '@rolldown/binding-linux-ppc64-gnu': 1.0.3 + '@rolldown/binding-linux-s390x-gnu': 1.0.3 + '@rolldown/binding-linux-x64-gnu': 1.0.3 + '@rolldown/binding-linux-x64-musl': 1.0.3 + '@rolldown/binding-openharmony-arm64': 1.0.3 + '@rolldown/binding-wasm32-wasi': 1.0.3 + '@rolldown/binding-win32-arm64-msvc': 1.0.3 + '@rolldown/binding-win32-x64-msvc': 1.0.3 + + router@2.2.0: + dependencies: + debug: 4.4.3 + depd: 2.0.0 + is-promise: 4.0.0 + parseurl: 1.3.3 + path-to-regexp: 8.4.2 + transitivePeerDependencies: + - supports-color + + run-applescript@7.1.0: {} + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + safe-buffer@5.2.1: {} + + safe-stable-stringify@2.5.0: {} + + safer-buffer@2.1.2: {} + + saxes@6.0.0: + dependencies: + xmlchars: 2.2.0 + + scheduler@0.27.0: {} + + semver@6.3.1: {} + + semver@7.8.1: {} + + send@1.2.1: + dependencies: + debug: 4.4.3 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 2.0.0 + http-errors: 2.0.1 + mime-types: 3.0.2 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.2 + transitivePeerDependencies: + - supports-color + + serve-static@2.2.1: + dependencies: + encodeurl: 2.0.0 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 1.2.1 + transitivePeerDependencies: + - supports-color + + set-cookie-parser@2.7.2: {} + + setprototypeof@1.2.0: {} + + shadcn@4.11.0(typescript@6.0.3): + dependencies: + '@babel/core': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/plugin-transform-typescript': 7.29.7(@babel/core@7.29.7) + '@babel/preset-typescript': 7.29.7(@babel/core@7.29.7) + '@dotenvx/dotenvx': 1.74.2 + '@modelcontextprotocol/sdk': 1.29.0(zod@3.25.76) + '@types/validate-npm-package-name': 4.0.2 + browserslist: 4.28.2 + commander: 14.0.3 + cosmiconfig: 9.0.2(typescript@6.0.3) + dedent: 1.7.2 + deepmerge: 4.3.1 + diff: 8.0.4 + execa: 9.6.1 + fast-glob: 3.3.3 + fs-extra: 11.3.5 + fuzzysort: 3.1.0 + https-proxy-agent: 7.0.6 + kleur: 4.1.5 + node-fetch: 3.3.2 + open: 11.0.0 + ora: 8.2.0 + postcss: 8.5.15 + postcss-selector-parser: 7.1.4 + prompts: 2.4.2 + recast: 0.23.11 + stringify-object: 5.0.0 + tailwind-merge: 3.6.0 + ts-morph: 26.0.0 + tsconfig-paths: 4.2.0 + validate-npm-package-name: 7.0.2 + zod: 3.25.76 + zod-to-json-schema: 3.25.2(zod@3.25.76) + transitivePeerDependencies: + - '@cfworker/json-schema' + - babel-plugin-macros + - supports-color + - typescript + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + side-channel-list@1.0.1: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + + side-channel@1.1.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.1 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + + sift@17.1.3: {} + + siginfo@2.0.0: {} + + signal-exit@3.0.7: {} + + signal-exit@4.1.0: {} + + sisteransi@1.0.5: {} + + slice-ansi@7.1.2: + dependencies: + ansi-styles: 6.2.3 + is-fullwidth-code-point: 5.1.0 + + slice-ansi@8.0.0: + dependencies: + ansi-styles: 6.2.3 + is-fullwidth-code-point: 5.1.0 + + source-map-js@1.2.1: {} + + source-map@0.6.1: {} + + sparse-bitfield@3.0.3: + dependencies: + memory-pager: 1.5.0 + + stack-trace@0.0.10: {} + + stackback@0.0.2: {} + + standardwebhooks@1.0.0: + dependencies: + '@stablelib/base64': 1.0.1 + fast-sha256: 1.3.0 + + statuses@2.0.2: {} + + std-env@4.2.0: {} + + stdin-discarder@0.2.2: {} + + streamx@2.28.0: + dependencies: + events-universal: 1.0.1 + fast-fifo: 1.3.2 + text-decoder: 1.2.7 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a + + string-argv@0.3.2: {} + + string-width@7.2.0: + dependencies: + emoji-regex: 10.6.0 + get-east-asian-width: 1.6.0 + strip-ansi: 7.2.0 + + string-width@8.2.1: + dependencies: + get-east-asian-width: 1.6.0 + strip-ansi: 7.2.0 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + stringify-object@5.0.0: + dependencies: + get-own-enumerable-keys: 1.0.0 + is-obj: 3.0.0 + is-regexp: 3.1.0 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.2.0: + dependencies: + ansi-regex: 6.2.2 + + strip-bom@3.0.0: {} + + strip-final-newline@2.0.0: {} + + strip-final-newline@4.0.0: {} + + strip-indent@3.0.0: + dependencies: + min-indent: 1.0.1 + + superagent@10.3.0: + dependencies: + component-emitter: 1.3.1 + cookiejar: 2.1.4 + debug: 4.4.3 + fast-safe-stringify: 2.1.1 + form-data: 4.0.5 + formidable: 3.5.4 + methods: 1.1.2 + mime: 2.6.0 + qs: 6.15.2 + transitivePeerDependencies: + - supports-color + + supertest@7.2.2: + dependencies: + cookie-signature: 1.2.2 + methods: 1.1.2 + superagent: 10.3.0 + transitivePeerDependencies: + - supports-color + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + swagger-jsdoc@6.3.0(openapi-types@12.1.3): + dependencies: + '@apidevtools/swagger-parser': 12.1.0(openapi-types@12.1.3) + commander: 6.2.0 + doctrine: 3.0.0 + glob: 11.1.0 + lodash.mergewith: 4.6.2 + yaml: 2.0.0-1 + transitivePeerDependencies: + - openapi-types + + swagger-ui-dist@5.32.8: + dependencies: + '@scarf/scarf': 1.4.0 + + swagger-ui-express@5.0.1(express@5.2.1): + dependencies: + express: 5.2.1 + swagger-ui-dist: 5.32.8 + + symbol-tree@3.2.4: {} + + systeminformation@5.31.7: {} + + tailwind-merge@3.6.0: {} + + tailwindcss@4.3.0: {} + + tapable@2.3.3: {} + + tar-stream@3.2.0: + dependencies: + b4a: 1.8.1 + bare-fs: 4.7.4 + fast-fifo: 1.3.2 + streamx: 2.28.0 + transitivePeerDependencies: + - bare-abort-controller + - bare-buffer + - react-native-b4a + + teex@1.0.1: + dependencies: + streamx: 2.28.0 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a + + text-decoder@1.2.7: + dependencies: + b4a: 1.8.1 + transitivePeerDependencies: + - react-native-b4a + + text-hex@1.0.0: {} + + tiny-case@1.0.3: {} + + tiny-invariant@1.3.3: {} + + tiny-warning@1.0.3: {} + + tinybench@2.9.0: {} + + tinyexec@1.2.4: {} + + tinyglobby@0.2.17: + dependencies: + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 + + tinyrainbow@3.1.0: {} + + tldts-core@7.4.9: {} + + tldts@7.4.9: + dependencies: + tldts-core: 7.4.9 + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + toidentifier@1.0.1: {} + + toposort@2.0.2: {} + + tough-cookie@6.0.2: + dependencies: + tldts: 7.4.9 + + tr46@5.1.1: + dependencies: + punycode: 2.3.1 + + tr46@6.0.0: + dependencies: + punycode: 2.3.1 + + triple-beam@1.4.1: {} + + ts-api-utils@2.5.0(typescript@5.9.3): + dependencies: + typescript: 5.9.3 + + ts-api-utils@2.5.0(typescript@6.0.3): + dependencies: + typescript: 6.0.3 + + ts-morph@26.0.0: + dependencies: + '@ts-morph/common': 0.27.0 + code-block-writer: 13.0.3 + + tsconfig-paths@4.2.0: + dependencies: + json5: 2.2.3 + minimist: 1.2.8 + strip-bom: 3.0.0 + + tslib@2.8.1: {} + + tsx@4.23.1: + dependencies: + esbuild: 0.28.0 + optionalDependencies: + fsevents: 2.3.3 + + tw-animate-css@1.4.0: {} + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + type-fest@2.19.0: {} + + type-is@2.1.0: + dependencies: + content-type: 2.0.0 + media-typer: 1.1.0 + mime-types: 3.0.2 + + typescript-eslint@8.60.1(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3): + dependencies: + '@typescript-eslint/eslint-plugin': 8.60.1(@typescript-eslint/parser@8.60.1(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/parser': 8.60.1(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/typescript-estree': 8.60.1(typescript@6.0.3) + '@typescript-eslint/utils': 8.60.1(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + eslint: 10.4.1(jiti@2.7.0) + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + + typescript-eslint@8.65.0(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.3): + dependencies: + '@typescript-eslint/eslint-plugin': 8.65.0(@typescript-eslint/parser@8.65.0(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.3))(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.3) + '@typescript-eslint/parser': 8.65.0(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.65.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.65.0(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.3) + eslint: 10.7.0(jiti@2.7.0) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + typescript@5.9.3: {} + + typescript@6.0.3: {} + + undici-types@6.21.0: {} + + undici-types@7.16.0: {} + + undici@7.28.0: {} + + unicorn-magic@0.3.0: {} + + universalify@2.0.1: {} + + unpipe@1.0.0: {} + + update-browserslist-db@1.2.3(browserslist@4.28.2): + dependencies: + browserslist: 4.28.2 + escalade: 3.2.0 + picocolors: 1.1.1 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + use-callback-ref@1.3.3(@types/react@19.2.16)(react@19.2.7): + dependencies: + react: 19.2.7 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.2.16 + + use-sidecar@1.1.3(@types/react@19.2.16)(react@19.2.7): + dependencies: + detect-node-es: 1.1.0 + react: 19.2.7 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.2.16 + + use-sync-external-store@1.6.0(react@19.2.7): + dependencies: + react: 19.2.7 + + util-deprecate@1.0.2: {} + + validate-npm-package-name@7.0.2: {} + + validator@13.15.35: {} + + vary@1.1.2: {} + + victory-vendor@37.3.6: + dependencies: + '@types/d3-array': 3.2.2 + '@types/d3-ease': 3.0.2 + '@types/d3-interpolate': 3.0.4 + '@types/d3-scale': 4.0.9 + '@types/d3-shape': 3.1.8 + '@types/d3-time': 3.0.4 + '@types/d3-timer': 3.0.2 + d3-array: 3.2.4 + d3-ease: 3.0.1 + d3-interpolate: 3.0.1 + d3-scale: 4.0.2 + d3-shape: 3.2.0 + d3-time: 3.1.0 + d3-timer: 3.0.1 + + vite@8.0.16(@types/node@22.19.19)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0): + dependencies: + lightningcss: 1.32.0 + picomatch: 4.0.4 + postcss: 8.5.15 + rolldown: 1.0.3 + tinyglobby: 0.2.17 + optionalDependencies: + '@types/node': 22.19.19 + esbuild: 0.28.0 + fsevents: 2.3.3 + jiti: 2.7.0 + tsx: 4.23.1 + yaml: 2.9.0 + + vite@8.0.16(@types/node@24.12.4)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0): + dependencies: + lightningcss: 1.32.0 + picomatch: 4.0.4 + postcss: 8.5.15 + rolldown: 1.0.3 + tinyglobby: 0.2.17 + optionalDependencies: + '@types/node': 24.12.4 + esbuild: 0.28.0 + fsevents: 2.3.3 + jiti: 2.7.0 + tsx: 4.23.1 + yaml: 2.9.0 + + vitest@4.1.10(@types/node@22.19.19)(@vitest/coverage-v8@4.1.10)(jsdom@29.1.1(@noble/hashes@1.8.0))(vite@8.0.16(@types/node@22.19.19)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0)): + dependencies: + '@vitest/expect': 4.1.10 + '@vitest/mocker': 4.1.10(vite@8.0.16(@types/node@22.19.19)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0)) + '@vitest/pretty-format': 4.1.10 + '@vitest/runner': 4.1.10 + '@vitest/snapshot': 4.1.10 + '@vitest/spy': 4.1.10 + '@vitest/utils': 4.1.10 + es-module-lexer: 2.3.1 + expect-type: 1.4.0 + magic-string: 0.30.21 + obug: 2.1.4 + pathe: 2.0.3 + picomatch: 4.0.4 + std-env: 4.2.0 + tinybench: 2.9.0 + tinyexec: 1.2.4 + tinyglobby: 0.2.17 + tinyrainbow: 3.1.0 + vite: 8.0.16(@types/node@22.19.19)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 22.19.19 + '@vitest/coverage-v8': 4.1.10(vitest@4.1.10) + jsdom: 29.1.1(@noble/hashes@1.8.0) + transitivePeerDependencies: + - msw + + vitest@4.1.10(@types/node@24.12.4)(@vitest/coverage-v8@4.1.10)(jsdom@29.1.1(@noble/hashes@1.8.0))(vite@8.0.16(@types/node@24.12.4)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0)): + dependencies: + '@vitest/expect': 4.1.10 + '@vitest/mocker': 4.1.10(vite@8.0.16(@types/node@24.12.4)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0)) + '@vitest/pretty-format': 4.1.10 + '@vitest/runner': 4.1.10 + '@vitest/snapshot': 4.1.10 + '@vitest/spy': 4.1.10 + '@vitest/utils': 4.1.10 + es-module-lexer: 2.3.1 + expect-type: 1.4.0 + magic-string: 0.30.21 + obug: 2.1.4 + pathe: 2.0.3 + picomatch: 4.0.4 + std-env: 4.2.0 + tinybench: 2.9.0 + tinyexec: 1.2.4 + tinyglobby: 0.2.17 + tinyrainbow: 3.1.0 + vite: 8.0.16(@types/node@24.12.4)(esbuild@0.28.0)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 24.12.4 + '@vitest/coverage-v8': 4.1.10(vitest@4.1.10) + jsdom: 29.1.1(@noble/hashes@1.8.0) + transitivePeerDependencies: + - msw + + w3c-xmlserializer@5.0.0: + dependencies: + xml-name-validator: 5.0.0 + + web-streams-polyfill@3.3.3: {} + + webidl-conversions@7.0.0: {} + + webidl-conversions@8.0.1: {} + + whatwg-mimetype@5.0.0: {} + + whatwg-url@14.2.0: + dependencies: + tr46: 5.1.1 + webidl-conversions: 7.0.0 + + whatwg-url@16.0.1(@noble/hashes@1.8.0): + dependencies: + '@exodus/bytes': 1.15.1(@noble/hashes@1.8.0) + tr46: 6.0.0 + webidl-conversions: 8.0.1 + transitivePeerDependencies: + - '@noble/hashes' + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + which@4.0.0: + dependencies: + isexe: 3.1.5 + + why-is-node-running@2.3.0: + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + + winston-daily-rotate-file@5.0.0(winston@3.19.0): + dependencies: + file-stream-rotator: 0.6.1 + object-hash: 3.0.0 + triple-beam: 1.4.1 + winston: 3.19.0 + winston-transport: 4.9.0 + + winston-transport@4.9.0: + dependencies: + logform: 2.7.0 + readable-stream: 3.6.2 + triple-beam: 1.4.1 + + winston@3.19.0: + dependencies: + '@colors/colors': 1.6.0 + '@dabh/diagnostics': 2.0.8 + async: 3.2.6 + is-stream: 2.0.1 + logform: 2.7.0 + one-time: 1.0.0 + readable-stream: 3.6.2 + safe-stable-stringify: 2.5.0 + stack-trace: 0.0.10 + triple-beam: 1.4.1 + winston-transport: 4.9.0 + + word-wrap@1.2.5: {} + + wrap-ansi@10.0.0: + dependencies: + ansi-styles: 6.2.3 + string-width: 8.2.1 + strip-ansi: 7.2.0 + + wrap-ansi@9.0.2: + dependencies: + ansi-styles: 6.2.3 + string-width: 7.2.0 + strip-ansi: 7.2.0 + + wrappy@1.0.2: {} + + wsl-utils@0.3.1: + dependencies: + is-wsl: 3.1.1 + powershell-utils: 0.1.0 + + xml-name-validator@5.0.0: {} + + xmlchars@2.2.0: {} + + yallist@3.1.1: {} + + yaml@2.0.0-1: {} + + yaml@2.9.0: + optional: true + + yauzl@3.4.0: + dependencies: + pend: 1.2.0 + + yocto-queue@0.1.0: {} + + yocto-spinner@1.2.0: + dependencies: + yoctocolors: 2.1.2 + + yoctocolors@2.1.2: {} + + yup@1.7.1: + dependencies: + property-expr: 2.0.6 + tiny-case: 1.0.3 + toposort: 2.0.2 + type-fest: 2.19.0 + + zod-to-json-schema@3.25.2(zod@3.25.76): + dependencies: + zod: 3.25.76 + + zod-validation-error@4.0.2(zod@4.4.3): + dependencies: + zod: 4.4.3 + + zod@3.25.76: {} + + zod@4.4.3: {} + + zustand@5.0.14(@types/react@19.2.16)(immer@11.1.8)(react@19.2.7)(use-sync-external-store@1.6.0(react@19.2.7)): + optionalDependencies: + '@types/react': 19.2.16 + immer: 11.1.8 + react: 19.2.7 + use-sync-external-store: 1.6.0(react@19.2.7) diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml new file mode 100644 index 0000000000..5abd5d86e4 --- /dev/null +++ b/pnpm-workspace.yaml @@ -0,0 +1,14 @@ +packages: + - server + - client + - admin + +allowBuilds: + bcrypt: true + esbuild: true + +onlyBuiltDependencies: + - '@scarf/scarf' + - bcrypt + - esbuild + - mongodb-memory-server diff --git a/server/.dockerignore b/server/.dockerignore new file mode 100644 index 0000000000..862f0b6a5e --- /dev/null +++ b/server/.dockerignore @@ -0,0 +1,16 @@ +node_modules +dist +.env +.env.* +*.log +logs/ +.git +.gitignore +coverage +tests +scripts +tsconfig.tsbuildinfo +.prettierrc +.prettierignore +eslint.config.mjs +vitest.config.ts diff --git a/server/.env.example b/server/.env.example new file mode 100644 index 0000000000..9ea6a66d14 --- /dev/null +++ b/server/.env.example @@ -0,0 +1,40 @@ +# Database +MONGODB_URI=mongodb://localhost:27017/book-my-venue + +# Email (Resend) +# Development Email Override (all emails in dev go here) +RESEND_DEV_RECIPIENT=dev@yourdomain.com +RESEND_API_KEY=re_your_api_key_here +EMAIL_FROM_NAME=BookMyVenue +EMAIL_FROM_EMAIL=noreply@bookmyvenue.com +APP_NAME=BookMyVenue +FRONTEND_URL=http://localhost:5173 +SERVER_URL=http://localhost:3000 + +# Server Configuration +PORT=3000 +NODE_ENV=development + +# Cloudinary +CLOUDINARY_CLOUD_NAME=your_cloud_name +CLOUDINARY_API_KEY=your_api_key +CLOUDINARY_API_SECRET=your_api_secret +CLOUDINARY_UPLOAD_PRESET=bookmyvenue_venues + +# JWT Configuration +JWT_ACCESS_SECRET=your_secure_access_token_secret_here_min_32_chars +JWT_REFRESH_SECRET=your_secure_refresh_token_secret_here_min_32_chars +JWT_ISSUER=BookMyVenue +JWT_AUDIENCE=BookMyVenue +JWT_ALGORITHM=HS256 +ACCESS_TOKEN_EXPIRY=15m +REFRESH_TOKEN_EXPIRY=7d + +# Razorpay Payment Gateway +RAZORPAY_KEY_ID=rzp_test_xxxxxxxxxxxx +RAZORPAY_KEY_SECRET=your_razorpay_key_secret +RAZORPAY_WEBHOOK_SECRET=your_razorpay_webhook_secret + +# Swagger UI (development only) +SWAGGER_USER=admin +SWAGGER_PASS=password \ No newline at end of file diff --git a/server/.prettierignore b/server/.prettierignore new file mode 100644 index 0000000000..9aec4249bd --- /dev/null +++ b/server/.prettierignore @@ -0,0 +1,13 @@ +.env +.env.local +.git +.idea +.vscode +*.log +coverage +dist +logs +node_modules +package-lock.json +pnpm-lock.yaml +pnpm-workspace.yaml \ No newline at end of file diff --git a/server/.prettierrc b/server/.prettierrc new file mode 100644 index 0000000000..32a2397321 --- /dev/null +++ b/server/.prettierrc @@ -0,0 +1,10 @@ +{ + "semi": true, + "trailingComma": "es5", + "singleQuote": true, + "printWidth": 100, + "tabWidth": 2, + "useTabs": false, + "arrowParens": "always", + "endOfLine": "lf" +} diff --git a/server/Dockerfile b/server/Dockerfile new file mode 100644 index 0000000000..beaaeaa6e6 --- /dev/null +++ b/server/Dockerfile @@ -0,0 +1,56 @@ +# BookMyVenue — Server Dockerfile +# ============================================================================= + +# Stage Install dependencies +FROM node:22-alpine AS deps + +WORKDIR /app + +RUN corepack enable + +COPY package.json pnpm-lock.yaml pnpm-workspace.yaml ./ + +RUN pnpm install --frozen-lockfile + +# Stage 2: Build TypeScript +FROM node:22-alpine AS build + +WORKDIR /app + +COPY package.json pnpm-lock.yaml pnpm-workspace.yaml ./ +COPY --from=deps /app/node_modules ./node_modules + +COPY tsconfig.json ./ +COPY src/ ./src/ + +RUN corepack enable && pnpm build + +# Stage 3: Production runner +FROM node:22-alpine AS runner + +WORKDIR /app + +# Create non-root user +RUN addgroup -S appgroup && adduser -S appuser -G appgroup -u 1001 + +# Copy production dependencies +COPY package.json pnpm-lock.yaml pnpm-workspace.yaml ./ +RUN apk add --no-cache --virtual .build-deps python3 make g++ \ + && corepack enable \ + && pnpm install --frozen-lockfile --prod \ + && apk del .build-deps + +# Copy built artifacts from build stage +COPY --from=build /app/dist ./dist + +# Log directory — writable by non-root user +RUN mkdir -p logs && chown -R appuser:appgroup logs + +EXPOSE 3003 + +HEALTHCHECK --interval=30s --timeout=3s --start-period=10s --retries=3 \ + CMD wget --no-verbose --tries=1 --spider http://localhost:3000/api/v1/health || exit 1 + +USER appuser + +CMD ["node", "dist/server.js"] diff --git a/server/eslint.config.mjs b/server/eslint.config.mjs new file mode 100644 index 0000000000..37d1fc9b68 --- /dev/null +++ b/server/eslint.config.mjs @@ -0,0 +1,98 @@ +import js from '@eslint/js'; +import globals from 'globals'; +import tseslint from 'typescript-eslint'; +import eslintComments from '@eslint-community/eslint-plugin-eslint-comments'; + +export default tseslint.config( + { + ignores: ['dist/**', 'scripts/**', 'coverage/**', 'eslint.config.mjs'], + }, + js.configs.recommended, + ...tseslint.configs.strictTypeChecked, + ...tseslint.configs.stylisticTypeChecked, + { + languageOptions: { + globals: globals.node, + parserOptions: { + projectService: true, + tsconfigRootDir: import.meta.dirname, + }, + }, + }, + { + plugins: { + 'eslint-comments': eslintComments, + }, + rules: { + 'eslint-comments/no-unlimited-disable': 'error', + 'eslint-comments/no-use': 'error', + 'eslint-comments/require-description': 'error', + }, + }, + { + rules: { + // TypeScript strictness + '@typescript-eslint/no-explicit-any': 'error', + '@typescript-eslint/no-unsafe-assignment': 'error', + '@typescript-eslint/no-unsafe-member-access': 'error', + '@typescript-eslint/no-unsafe-call': 'error', + '@typescript-eslint/no-unsafe-return': 'error', + '@typescript-eslint/no-unsafe-argument': 'error', + '@typescript-eslint/explicit-function-return-type': 'error', + '@typescript-eslint/consistent-type-imports': ['error', { prefer: 'type-imports' }], + '@typescript-eslint/no-import-type-side-effects': 'error', + '@typescript-eslint/no-unused-vars': [ + 'error', + { argsIgnorePattern: '^_', varsIgnorePattern: '^_' }, + ], + '@typescript-eslint/require-await': 'error', + '@typescript-eslint/await-thenable': 'error', + '@typescript-eslint/no-floating-promises': 'error', + '@typescript-eslint/no-misused-promises': 'error', + '@typescript-eslint/prefer-nullish-coalescing': 'error', + '@typescript-eslint/prefer-optional-chain': 'error', + '@typescript-eslint/no-non-null-assertion': 'error', + + // Error handling + '@typescript-eslint/only-throw-error': 'error', + + // General quality + 'no-undef': 'warn', + 'no-console': 'error', + 'no-debugger': 'error', + 'no-return-await': 'off', + '@typescript-eslint/return-await': ['error', 'in-try-catch'], + eqeqeq: ['error', 'always'], + 'no-shadow': 'off', + '@typescript-eslint/no-shadow': 'error', + }, + }, + + // Per-file overrides (keep minimal, document why) + { + files: ['src/types/express.ts'], + rules: { + // declare global { namespace Express { ... } } is the only valid TypeScript + // mechanism for augmenting Express Request types — namespace is required here. + '@typescript-eslint/no-namespace': 'off', + }, + }, + // Test files — disable type-aware linting (test patterns like supertest chaining, + // mock data, and dynamic assertions conflict with strict type-checked rules). + { + files: ['tests/**/*.ts', 'vitest.config.ts'], + languageOptions: { + parserOptions: { + projectService: null, + }, + }, + rules: { + // Disable all type-aware rules inherited from strictTypeChecked + stylisticTypeChecked + ...Object.fromEntries( + Object.entries(tseslint.configs.disableTypeChecked.rules).map(([key]) => [key, 'off']) + ), + // Also disable non-type-aware strict rules that fight test patterns + '@typescript-eslint/explicit-function-return-type': 'off', + }, + }, +); diff --git a/server/package.json b/server/package.json new file mode 100644 index 0000000000..657fe127e5 --- /dev/null +++ b/server/package.json @@ -0,0 +1,71 @@ +{ + "name": "server", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "build": "tsc", + "start": "node dist/server.js", + "dev": "tsx watch src/server.ts", + "lint": "eslint src/**/*.ts", + "lint:fix": "eslint src/**/*.ts --fix", + "typecheck": "tsc --noEmit", + "format": "prettier --write \"src/**/*.ts\"", + "format:check": "prettier --check \"src/**/*.ts\"", + "format:fix": "prettier --write .", + "script": "tsx scripts/configs/runner.ts", + "test": "vitest run", + "test:watch": "vitest", + "test:coverage": "vitest run --coverage" + }, + "keywords": [], + "author": "", + "license": "ISC", + "packageManager": "pnpm@10.16.1", + "dependencies": { + "bcrypt": "^6.0.0", + "brotli": "^1.3.3", + "cloudinary": "^2.10.0", + "compression": "^1.8.1", + "cookie-parser": "^1.4.7", + "cors": "^2.8.6", + "dotenv": "^17.4.2", + "eslint": "^10.7.0", + "express": "^5.2.1", + "express-rate-limit": "^8.6.0", + "express-validator": "^7.3.2", + "helmet": "^8.3.0", + "jsonwebtoken": "^9.0.3", + "mongoose": "^9.8.0", + "razorpay": "^2.9.8", + "resend": "^6.18.0", + "swagger-jsdoc": "^6.3.0", + "swagger-ui-express": "^5.0.1", + "winston": "^3.19.0", + "winston-daily-rotate-file": "^5.0.0", + "zod": "^4.4.3" + }, + "devDependencies": { + "@eslint-community/eslint-plugin-eslint-comments": "^4.7.2", + "@eslint/js": "^10.0.1", + "@types/bcrypt": "^6.0.0", + "@types/compression": "^1.8.1", + "@types/cookie-parser": "^1.4.10", + "@types/cors": "^2.8.19", + "@types/express": "^5.0.6", + "@types/jsonwebtoken": "^9.0.10", + "@types/node": "^22.13.0", + "@types/supertest": "^7.2.1", + "@types/swagger-jsdoc": "^6.0.4", + "@types/swagger-ui-express": "^4.1.8", + "@vitest/coverage-v8": "^4.0.0", + "globals": "^17.7.0", + "mongodb-memory-server": "^11.2.0", + "prettier": "^3.9.6", + "supertest": "^7.2.2", + "tsx": "^4.23.1", + "typescript": "^5.9.3", + "typescript-eslint": "^8.65.0", + "vitest": "^4.0.0" + } +} diff --git a/server/pnpm-lock.yaml b/server/pnpm-lock.yaml new file mode 100644 index 0000000000..4ac6f3672a --- /dev/null +++ b/server/pnpm-lock.yaml @@ -0,0 +1,4082 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + bcrypt: + specifier: ^6.0.0 + version: 6.0.0 + brotli: + specifier: ^1.3.3 + version: 1.3.3 + cloudinary: + specifier: ^2.10.0 + version: 2.10.0 + compression: + specifier: ^1.8.1 + version: 1.8.1 + cookie-parser: + specifier: ^1.4.7 + version: 1.4.7 + cors: + specifier: ^2.8.6 + version: 2.8.6 + dotenv: + specifier: ^17.4.2 + version: 17.4.2 + eslint: + specifier: ^10.7.0 + version: 10.7.0 + express: + specifier: ^5.2.1 + version: 5.2.1 + express-rate-limit: + specifier: ^8.6.0 + version: 8.6.0(express@5.2.1) + express-validator: + specifier: ^7.3.2 + version: 7.3.2 + helmet: + specifier: ^8.3.0 + version: 8.3.0 + jsonwebtoken: + specifier: ^9.0.3 + version: 9.0.3 + mongoose: + specifier: ^9.8.0 + version: 9.8.0 + razorpay: + specifier: ^2.9.8 + version: 2.9.8 + resend: + specifier: ^6.18.0 + version: 6.18.0 + swagger-jsdoc: + specifier: ^6.3.0 + version: 6.3.0(openapi-types@12.1.3) + swagger-ui-express: + specifier: ^5.0.1 + version: 5.0.1(express@5.2.1) + winston: + specifier: ^3.19.0 + version: 3.19.0 + winston-daily-rotate-file: + specifier: ^5.0.0 + version: 5.0.0(winston@3.19.0) + zod: + specifier: ^4.4.3 + version: 4.4.3 + devDependencies: + '@eslint-community/eslint-plugin-eslint-comments': + specifier: ^4.7.2 + version: 4.7.2(eslint@10.7.0) + '@eslint/js': + specifier: ^10.0.1 + version: 10.0.1(eslint@10.7.0) + '@types/bcrypt': + specifier: ^6.0.0 + version: 6.0.0 + '@types/compression': + specifier: ^1.8.1 + version: 1.8.1 + '@types/cookie-parser': + specifier: ^1.4.10 + version: 1.4.10(@types/express@5.0.6) + '@types/cors': + specifier: ^2.8.19 + version: 2.8.19 + '@types/express': + specifier: ^5.0.6 + version: 5.0.6 + '@types/jsonwebtoken': + specifier: ^9.0.10 + version: 9.0.10 + '@types/node': + specifier: ^22.13.0 + version: 22.20.1 + '@types/supertest': + specifier: ^7.2.1 + version: 7.2.1 + '@types/swagger-jsdoc': + specifier: ^6.0.4 + version: 6.0.4 + '@types/swagger-ui-express': + specifier: ^4.1.8 + version: 4.1.8 + '@vitest/coverage-v8': + specifier: ^4.0.0 + version: 4.1.10(vitest@4.1.10) + globals: + specifier: ^17.7.0 + version: 17.7.0 + mongodb-memory-server: + specifier: ^11.2.0 + version: 11.2.0 + prettier: + specifier: ^3.9.6 + version: 3.9.6 + supertest: + specifier: ^7.2.2 + version: 7.2.2 + tsx: + specifier: ^4.23.1 + version: 4.23.1 + typescript: + specifier: ^5.9.3 + version: 5.9.3 + typescript-eslint: + specifier: ^8.65.0 + version: 8.65.0(eslint@10.7.0)(typescript@5.9.3) + vitest: + specifier: ^4.0.0 + version: 4.1.10(@types/node@22.20.1)(@vitest/coverage-v8@4.1.10)(vite@7.3.6(@types/node@22.20.1)(tsx@4.23.1)) + +packages: + + '@apidevtools/json-schema-ref-parser@14.0.1': + resolution: {integrity: sha512-Oc96zvmxx1fqoSEdUmfmvvb59/KDOnUoJ7s2t7bISyAn0XEz57LCCw8k2Y4Pf3mwKaZLMciESALORLgfe2frCw==} + engines: {node: '>= 16'} + + '@apidevtools/openapi-schemas@2.1.0': + resolution: {integrity: sha512-Zc1AlqrJlX3SlpupFGpiLi2EbteyP7fXmUOGup6/DnkRgjP9bgMM/ag+n91rsv0U1Gpz0H3VILA/o3bW7Ua6BQ==} + engines: {node: '>=10'} + + '@apidevtools/swagger-methods@3.0.2': + resolution: {integrity: sha512-QAkD5kK2b1WfjDS/UQn/qQkbwF31uqRjPTrsCs5ZG9BQGAkjwvqGFjjPqAuzac/IYzpPtRzjCP1WrTuAIjMrXg==} + + '@apidevtools/swagger-parser@12.1.0': + resolution: {integrity: sha512-e5mJoswsnAX0jG+J09xHFYQXb/bUc5S3pLpMxUuRUA2H8T2kni3yEoyz2R3Dltw5f4A6j6rPNMpWTK+iVDFlng==} + peerDependencies: + openapi-types: '>=7' + + '@babel/helper-string-parser@7.29.7': + resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.29.7': + resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.29.7': + resolution: {integrity: sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/types@7.29.7': + resolution: {integrity: sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==} + engines: {node: '>=6.9.0'} + + '@bcoe/v8-coverage@1.0.2': + resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} + engines: {node: '>=18'} + + '@colors/colors@1.6.0': + resolution: {integrity: sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==} + engines: {node: '>=0.1.90'} + + '@dabh/diagnostics@2.0.8': + resolution: {integrity: sha512-R4MSXTVnuMzGD7bzHdW2ZhhdPC/igELENcq5IjEverBvq5hn1SXCWcsi6eSsdWP0/Ur+SItRRjAktmdoX/8R/Q==} + + '@esbuild/aix-ppc64@0.28.1': + resolution: {integrity: sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.28.1': + resolution: {integrity: sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.28.1': + resolution: {integrity: sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.28.1': + resolution: {integrity: sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.28.1': + resolution: {integrity: sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.28.1': + resolution: {integrity: sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.28.1': + resolution: {integrity: sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.28.1': + resolution: {integrity: sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.28.1': + resolution: {integrity: sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.28.1': + resolution: {integrity: sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.28.1': + resolution: {integrity: sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.28.1': + resolution: {integrity: sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.28.1': + resolution: {integrity: sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.28.1': + resolution: {integrity: sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.28.1': + resolution: {integrity: sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.28.1': + resolution: {integrity: sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.28.1': + resolution: {integrity: sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.28.1': + resolution: {integrity: sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.28.1': + resolution: {integrity: sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.28.1': + resolution: {integrity: sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.28.1': + resolution: {integrity: sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.28.1': + resolution: {integrity: sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.28.1': + resolution: {integrity: sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.28.1': + resolution: {integrity: sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.28.1': + resolution: {integrity: sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.28.1': + resolution: {integrity: sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@eslint-community/eslint-plugin-eslint-comments@4.7.2': + resolution: {integrity: sha512-LF03qURSwEWm2dz5wtdDCzNk+7Opl0X7q6I3undsaIuNsEiNvRV3BCtqu14Q/6Pzg1tBj44LcxpW2EpSLZStZw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 + + '@eslint-community/eslint-utils@4.9.1': + resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.12.2': + resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/config-array@0.23.5': + resolution: {integrity: sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + '@eslint/config-helpers@0.6.0': + resolution: {integrity: sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + '@eslint/core@1.2.1': + resolution: {integrity: sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + '@eslint/js@10.0.1': + resolution: {integrity: sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + peerDependencies: + eslint: ^10.0.0 + peerDependenciesMeta: + eslint: + optional: true + + '@eslint/object-schema@3.0.5': + resolution: {integrity: sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + '@eslint/plugin-kit@0.7.2': + resolution: {integrity: sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + '@humanfs/core@0.19.2': + resolution: {integrity: sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.8': + resolution: {integrity: sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==} + engines: {node: '>=18.18.0'} + + '@humanfs/types@0.15.0': + resolution: {integrity: sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==} + engines: {node: '>=18.18.0'} + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/retry@0.4.3': + resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} + engines: {node: '>=18.18'} + + '@isaacs/cliui@9.0.0': + resolution: {integrity: sha512-AokJm4tuBHillT+FpMtxQ60n8ObyXBatq7jD2/JA9dxbDDokKQm8KMht5ibGzLVU9IJDIKK4TPKgMHEYMn3lMg==} + engines: {node: '>=18'} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + + '@mongodb-js/saslprep@1.4.12': + resolution: {integrity: sha512-QAfAMwNgnYxZ2C6D1HgeP7Gc4i/uvJRim415PCIL9ptRxWMNbWeLBYb2/9R4pGKny/s1FVu2JA2cxCUBUOggrA==} + + '@noble/hashes@1.8.0': + resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} + engines: {node: ^14.21.3 || >=16} + + '@paralleldrive/cuid2@2.3.1': + resolution: {integrity: sha512-XO7cAxhnTZl0Yggq6jOgjiOHhbgcO4NqFqwSmQpjK3b6TEE6Uj/jfSk6wzYyemh3+I0sHirKSetjQwn5cZktFw==} + + '@rollup/rollup-android-arm-eabi@4.62.2': + resolution: {integrity: sha512-6o7ZLZK+BeenkZCFNDXqpbjw9bD6nuWonvS/lwQJp7NoVVxm6p3qE7qQ5jGuBjiFsgvqjD8mZAU5oWxTmbOeOg==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.62.2': + resolution: {integrity: sha512-BaH7BllCACHoH1LguOU56UItGfUWjujlO65kS9LAodViaN4bwIKd7oeW/ZHJ/4ljr/7MIiENnNy3HJ0zXv8Zkw==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.62.2': + resolution: {integrity: sha512-v39RCCvj4He82I9sFmk+M1VZ0PLM9sfsLVikjfx2hYBNALhrrOR2D3JjQA6AhlaSOgcR+RzrKY7e1+bT6SUO/A==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.62.2': + resolution: {integrity: sha512-yl0y2vq3S3lHeuXhEdss6TWfKW8vkujImO12tn4ZkG/4oghr09LvdYm2RElVjokTQiUvDUGXLGsYeLqUMCKpGA==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.62.2': + resolution: {integrity: sha512-tT4pvt4qXD+vEoezupCWi+a1F0vvDiksiHc+PxRlYTOH1I6/X4id9jPxTP+Fg+545euaFT1jJVs4CEdHZAU1vw==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.62.2': + resolution: {integrity: sha512-6nU5F2wCW+qvCBhTn1pdIU3bzsIoF7EUwsCDRxilWGprQR6yd508YnH9+OKFCwpfS8pjZqDUmnCAr7exax0XCg==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.62.2': + resolution: {integrity: sha512-n1GJHPOvpIfhi3TmrCeh6S6URt9BFCt0KQE3qvexyGCTAKpR4Lg+eWvNZEqu7epxwus/8ElT3hacYEucm49SZg==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.62.2': + resolution: {integrity: sha512-JqgflS8wEB+UXV/vS1RpRbifGBeN4D5lz8D8oOFbFZw4vedvdOgCFAjfBmIMdW3yL10XpQQ0Ambepw6MXrhOnA==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.62.2': + resolution: {integrity: sha512-wnFJkogWvN4jm/hQRF2UBaeUmk20j5+DmHvoyWii2b8HJDyvz1MF2OU/6ynXt2KR63rbZLWkFpoytpdc/yBuSA==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.62.2': + resolution: {integrity: sha512-HVu2bp0zhvJ8xHEV9+UUs7S90VadmBSY3LcIMvozbPo4AuMGDWlz3ymHLHZPX4hR67TKTt8Qp5PJ5RBg/i+RMQ==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loong64-gnu@4.62.2': + resolution: {integrity: sha512-mQqqAV8QaoSgr9I2fKDLY2BAVvmKjWoGiu/cSYQonsLvtqwEn1E4QYfnCOcp5zoEqNhsDYin1s6jx/VJmrxlZg==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-loong64-musl@4.62.2': + resolution: {integrity: sha512-IxKLoxCQ2IWi6bT2akyDUBGsOImDKB+sPp4EsTmwFQ/fMwpCKm8uLSSgP/Kx/QYUgKis6SEZ5/Nlhup0DIA0PQ==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-ppc64-gnu@4.62.2': + resolution: {integrity: sha512-Mk5ha2RQSgyFfmYYLkBpPnUk8D8FriBxesO1u9O75X0mHgXL1UQcH5Itl2lurWL2tj0RxV9b9tJgipac0hRY9A==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-ppc64-musl@4.62.2': + resolution: {integrity: sha512-CjvEnqJL/0/TQ3TXX3OPIJ/kmBellrWd4heXUmHeJlTnmwjKpSJzoehLaL6Xk0ZnMHBu9dZuFADNOrtjF4v+2w==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.62.2': + resolution: {integrity: sha512-1SiZbzwdkaDURsew/tSOrooKiYy7EQGT6m8ufavAi9NEyQb/6VuIxFXAL1fqa4iZe3g4NbNk4P7J32z2tw5Mgg==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-riscv64-musl@4.62.2': + resolution: {integrity: sha512-nQts12zJ3NQRoE6uYljOH89v7szzLDvG2JD/vsX+vGXU8w/At1GowTZ5/7qeFQ8m7L55rpR8Okugnuo5bgjy2Q==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.62.2': + resolution: {integrity: sha512-E9/ll019jhPIJgpzfZoIkBGhcz+kKNgVWYRY0zr9srBdPPFVpvOKW8VaJKUbeK+eZXyQF9ltME+Kk6affeaPgg==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.62.2': + resolution: {integrity: sha512-5BqxR/pshjey51iliyzTD5Xi3EN0aLmQ2lZ3lvefVV9c82BvrLo2/6OT55iifpWBufs6kdwWbuOKS841DrmK9A==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.62.2': + resolution: {integrity: sha512-uNN83XxQrRAh/w0/pmAfibcwyb6YWt4gP+dpnQKPVJshAloQ785ii8CT8ZCIxkGg9opVsvAlGhFitSm6D1Jjpg==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-openbsd-x64@4.62.2': + resolution: {integrity: sha512-srjEIxSH3LRnJN6THczDHWQplqEMFiAJrTab0msUryh9kwNpkICf3Ea6q6MN/2cZwRFUNx5w+h6Hpi4QuHS6Zg==} + cpu: [x64] + os: [openbsd] + + '@rollup/rollup-openharmony-arm64@4.62.2': + resolution: {integrity: sha512-8hOJnxgbyObnCm5AlRA3A931xX19xq80RjVTKgJOvEKWqJruP/Uf12IbAOaDjjEXYRewwHLfmF0YRIdK3OwKWA==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.62.2': + resolution: {integrity: sha512-mmF4AY1i0hG/bLWUctUq59gtmgaSIRa3cu/A3JFRp/sCNEme2bgDEiDS22P9FbnJB8NJNF4jPJiSP5RHQpUTDg==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.62.2': + resolution: {integrity: sha512-DZgkknc6jhHrk46V25vbAM0zZkyP0nSDkJB8/dRkLTxv470dOmWDqGoEJl/9A0dFfS7yE3REOwNDxpHwSLSt0Q==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-gnu@4.62.2': + resolution: {integrity: sha512-T6xr6ucWSFto+VGajA8YH26LdpHRuP4YLHEKAtCWvJDOlnmWcDZVCI2Jmjr+IFHDlt2zRaTAKE4tfjTaWLgJBg==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.62.2': + resolution: {integrity: sha512-BfzEnDJOt9T8M989/lA37EcJgat01wLRnoi5dQf3QzOH7jzpqTAzdDbVfRljVr5r+jzKqpbHeyOfAaXxAd0PAA==} + cpu: [x64] + os: [win32] + + '@scarf/scarf@1.4.0': + resolution: {integrity: sha512-xxeapPiUXdZAE3che6f3xogoJPeZgig6omHEy1rIY5WVsB3H2BHNnZH+gHG6x91SCWyQCzWGsuL2Hh3ClO5/qQ==} + + '@so-ric/colorspace@1.1.6': + resolution: {integrity: sha512-/KiKkpHNOBgkFJwu9sh48LkHSMYGyuTcSFK/qMBdnOAlrRJzRSXAOFB5qwzaVQuDl8wAvHVMkaASQDReTahxuw==} + + '@stablelib/base64@1.0.1': + resolution: {integrity: sha512-1bnPQqSxSuc3Ii6MhBysoWCg58j97aUjuCSZrGSmDxNqtytIi0k8utUenAwTZN4V5mXXYGsVUI9zeBqy+jBOSQ==} + + '@standard-schema/spec@1.1.0': + resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} + + '@types/bcrypt@6.0.0': + resolution: {integrity: sha512-/oJGukuH3D2+D+3H4JWLaAsJ/ji86dhRidzZ/Od7H/i8g+aCmvkeCc6Ni/f9uxGLSQVCRZkX2/lqEFG2BvWtlQ==} + + '@types/body-parser@1.19.6': + resolution: {integrity: sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==} + + '@types/chai@5.2.3': + resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} + + '@types/compression@1.8.1': + resolution: {integrity: sha512-kCFuWS0ebDbmxs0AXYn6e2r2nrGAb5KwQhknjSPSPgJcGd8+HVSILlUyFhGqML2gk39HcG7D1ydW9/qpYkN00Q==} + + '@types/connect@3.4.38': + resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + + '@types/cookie-parser@1.4.10': + resolution: {integrity: sha512-B4xqkqfZ8Wek+rCOeRxsjMS9OgvzebEzzLYw7NHYuvzb7IdxOkI0ZHGgeEBX4PUM7QGVvNSK60T3OvWj3YfBRg==} + peerDependencies: + '@types/express': '*' + + '@types/cookiejar@2.1.5': + resolution: {integrity: sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q==} + + '@types/cors@2.8.19': + resolution: {integrity: sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==} + + '@types/deep-eql@4.0.2': + resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + + '@types/esrecurse@4.3.1': + resolution: {integrity: sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==} + + '@types/estree@1.0.9': + resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} + + '@types/express-serve-static-core@5.1.2': + resolution: {integrity: sha512-d3KvEXBSo/lOAMc2u6fkyDHBvetBHeqD7wm/AcXfLpSOQwlmG9D/aQ0SFswVjv05p7ullQS7Mjohj6/VdbZuTg==} + + '@types/express@5.0.6': + resolution: {integrity: sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA==} + + '@types/http-errors@2.0.5': + resolution: {integrity: sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/jsonwebtoken@9.0.10': + resolution: {integrity: sha512-asx5hIG9Qmf/1oStypjanR7iKTv0gXQ1Ov/jfrX6kS/EO0OFni8orbmGCn0672NHR3kXHwpAwR+B368ZGN/2rA==} + + '@types/methods@1.1.4': + resolution: {integrity: sha512-ymXWVrDiCxTBE3+RIrrP533E70eA+9qu7zdWoHuOmGujkYtzf4HQF96b8nwHLqhuf4ykX61IGRIB38CC6/sImQ==} + + '@types/ms@2.1.0': + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + + '@types/node@22.20.1': + resolution: {integrity: sha512-EANqOCF9QFyra+4pfxUcX9STKJpCLjMbObVzljIJomAWSnuSIEAvyzEU53GaajbXJEgdh0iEcPL+DGvpUd4k1Q==} + + '@types/qs@6.15.1': + resolution: {integrity: sha512-GZHUBZR9hckSUhrxmp1nG6NwdpM9fCunJwyThLW1X3AyHgd9IlHb6VANpQQqDr2o/qQp6McZ3y/IA2rVzKzSbw==} + + '@types/range-parser@1.2.7': + resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} + + '@types/send@1.2.1': + resolution: {integrity: sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==} + + '@types/serve-static@2.2.0': + resolution: {integrity: sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ==} + + '@types/superagent@8.1.11': + resolution: {integrity: sha512-KA7srSW/HENDtOw9DOqaFLgWuMqN9WgjEw62lh9dpvRaZDkhdOkazASd7X7i2eMUYLHa1U37ZttnePsH5zTDHw==} + + '@types/supertest@7.2.1': + resolution: {integrity: sha512-4CbBvoYVLHL7+yhbYrZET0vsvuyXTC05aRe7dNQkwMzm56auceoy6Yu3K50uZmwfHna1os3CMSgM/3QVkUtPTw==} + + '@types/swagger-jsdoc@6.0.4': + resolution: {integrity: sha512-W+Xw5epcOZrF/AooUM/PccNMSAFOKWZA5dasNyMujTwsBkU74njSJBpvCCJhHAJ95XRMzQrrW844Btu0uoetwQ==} + + '@types/swagger-ui-express@4.1.8': + resolution: {integrity: sha512-AhZV8/EIreHFmBV5wAs0gzJUNq9JbbSXgJLQubCC0jtIo6prnI9MIRRxnU4MZX9RB9yXxF1V4R7jtLl/Wcj31g==} + + '@types/triple-beam@1.3.5': + resolution: {integrity: sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==} + + '@types/webidl-conversions@7.0.3': + resolution: {integrity: sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==} + + '@types/whatwg-url@13.0.0': + resolution: {integrity: sha512-N8WXpbE6Wgri7KUSvrmQcqrMllKZ9uxkYWMt+mCSGwNc0Hsw9VQTW7ApqI4XNrx6/SaM2QQJCzMPDEXE058s+Q==} + + '@typescript-eslint/eslint-plugin@8.65.0': + resolution: {integrity: sha512-IEgob78X12rHpUmtcwFsXhZdVGJtwTVP8FiCLZkR6GlYVrl2PcuB+KhCE5BlVC/eQpQnu8WXRtkHZuPar+gCRA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.65.0 + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/parser@8.65.0': + resolution: {integrity: sha512-CZ4nMxWwgu1HEEFNkeaCptra9QCtkmKdgf3sWh1rl1trIhmxLilgTV4cwcbQ4wemnT4sWQN8CaKOmdYx+g2gMA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/project-service@8.65.0': + resolution: {integrity: sha512-SxnPhbTsGahizDgbu7oqFH/xVtzIqMd/s+WtnSxNxJZJpLbdT5IPdzg8EZxO3+PoKahXmwJLeNQOpKJb3/bi7Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/scope-manager@8.65.0': + resolution: {integrity: sha512-Esbl8OSYiVxBokYgWPf7VVWg/BE798wXhimnn9ML9Pt5qoDf8bfQlgjlKXR/k98+AcNzlLKYrpCcrcuZ9DZLgg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/tsconfig-utils@8.65.0': + resolution: {integrity: sha512-j6GzGqCiRdA7Qhur2VVmKZAkBLfnHFQfx4TaJGL9RMveZqCo48jSHHO0DTgizEnGhtWnqmbtCUSrqSkdiY/0Hg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/type-utils@8.65.0': + resolution: {integrity: sha512-YjaZ7PRI5qY7ax2L3PbvX0rRyGtipAReCWs0mhhDBHjH/vl0g0BonaGXrKdKpMbIIsMIwDgbk/xzkBTyAltS5g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/types@8.65.0': + resolution: {integrity: sha512-JSSwWNy+H0E/01jJEM+hrX6N0OFDzFzeIhHFSAS01tlVaevpG8cFyYRPhS5yjGOvBUx3sqQHVMjCL1CAZZMxBg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/typescript-estree@8.65.0': + resolution: {integrity: sha512-JboAE2swaYt4tb1fHhHTABE2K+OLy09XfcTbhnk4Pw96f9dd2e9iYsJ28gBggHlo5z5x1rkyWvcPoTuNTd4oGg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/utils@8.65.0': + resolution: {integrity: sha512-gXiwIHsYreboxeJucHKPvgwl7dXt50mF8s1/c00cP/WoVTyWKFdtfhRWwZiXYFU5H2O8vVoSLNrexFZjYS/SGA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/visitor-keys@8.65.0': + resolution: {integrity: sha512-8C71BQkGjiMmXtop7pHVJu1l2NNShFdkCyD6a2ezzs5vU/L3LRtb69EtcteFwz0mYMPzIgOw0n6OV4VBUWZd7A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@vitest/coverage-v8@4.1.10': + resolution: {integrity: sha512-IM49HmthevbgAO4anp1hwtoT9wYe59w0LR00gr+eagHE+ZJ5lK4sLPeO0ubgoJcwLk6dehU3R24N+FbEEKDc8g==} + peerDependencies: + '@vitest/browser': 4.1.10 + vitest: 4.1.10 + peerDependenciesMeta: + '@vitest/browser': + optional: true + + '@vitest/expect@4.1.10': + resolution: {integrity: sha512-YsCn+qAk1GWjQOWFEsEcL2gNQ0zmVmQu3T03qP6UyjhtmdtwtbuI+DASn/7iQB3HGTXkdBwGddzxPlmiql5vlA==} + + '@vitest/mocker@4.1.10': + resolution: {integrity: sha512-v0xaezt+DKEmKfaxg133ldzADrwLGd7Ze1MfQQTYfvs8OqZIwbxyxaYURivwV7sWy5fqn3rH5uOrSp07bp44Ow==} + peerDependencies: + msw: ^2.4.9 + vite: ^6.0.0 || ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + + '@vitest/pretty-format@4.1.10': + resolution: {integrity: sha512-W1HsjSH4MXQ9YfmmhLAoIYf1HRfekQCGngeIgcei6MP5QQGWUe0gkopdZQaVCFO+JDJMrAJGwa5pRpNpvy4P8Q==} + + '@vitest/runner@4.1.10': + resolution: {integrity: sha512-IKI6kpIH+LmpROplyLwBBaCfMgOZOMsygVa6BARD6ahA04VRuJSa6OaVG7kRvSEMD870Vd91rSSw0eegtWyLGg==} + + '@vitest/snapshot@4.1.10': + resolution: {integrity: sha512-xRkfOT1qpTAi/Ti4Y1LtfRc3kEuqxGw59eN2jN9pRWMtS/XDevekhcFSqvQqjUNGksfjMJu3Y+oJ+4Ypn2OaJw==} + + '@vitest/spy@4.1.10': + resolution: {integrity: sha512-PLf/Ugvoq5wO/b4rwYCR1h2PSIdXz7wnkQFMiUpLdtM7l6pqVFcQIBEHyT1+l+cj7mNwAfZHzqXqDyjvOuwbDw==} + + '@vitest/utils@4.1.10': + resolution: {integrity: sha512-fy9am/HWxbaGt/Sawrp90vt6Y6jQwf1RX77cz3uwoJwJVMli/e1IEwRPnMNJ7vKfPTwo0diXifkpPvwH9v7nGA==} + + accepts@2.0.0: + resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} + engines: {node: '>= 0.6'} + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.17.0: + resolution: {integrity: sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==} + engines: {node: '>=0.4.0'} + hasBin: true + + agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + + agent-base@7.1.4: + resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} + engines: {node: '>= 14'} + + ajv-draft-04@1.0.0: + resolution: {integrity: sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==} + peerDependencies: + ajv: ^8.5.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv@6.15.0: + resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==} + + ajv@8.20.0: + resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + asap@2.0.6: + resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} + + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} + + ast-v8-to-istanbul@1.0.5: + resolution: {integrity: sha512-UPAgKJFSEGMWSDr3LX4tqnAb4f7KGT8O40Tyx8wbYmmZ/yn58lNCm8h3svs3eXgiGd5AXxz8NDOvXWvicq+rJA==} + + async-mutex@0.5.0: + resolution: {integrity: sha512-1A94B18jkJ3DYq284ohPxoXbfTA5HsQ7/Mf4DEhcyLx3Bz27Rh59iScbB6EPiP+B+joue6YCxcMXSbFC1tZKwA==} + + async@3.2.6: + resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + axios@1.18.1: + resolution: {integrity: sha512-3nTvFlvpn9Zu/RkHUqtc7/+al4UpRW5az71ap5zccp6e8RAYEzhMTecX8Dz1wWDYrPpUoB1HAQEGEAEvUr7S9g==} + + b4a@1.8.1: + resolution: {integrity: sha512-aiqre1Nr0B/6DgE2N5vwTc+2/oQZ4Wh1t4NznYY4E00y8LCt6NqdRv81so00oo27D8MVKTpUa/MwUUtBLXCoDw==} + peerDependencies: + react-native-b4a: '*' + peerDependenciesMeta: + react-native-b4a: + optional: true + + balanced-match@4.0.4: + resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} + engines: {node: 18 || 20 || >=22} + + bare-events@2.9.1: + resolution: {integrity: sha512-Z0oHEHAFDZkffN8Qc39zNZjQlMDkPJRyyyZieU1VH7u8c5S+qHZ2S8ixdKIAxEjfHO7FJxXmJWgteOghVanIsg==} + peerDependencies: + bare-abort-controller: '*' + peerDependenciesMeta: + bare-abort-controller: + optional: true + + bare-fs@4.7.4: + resolution: {integrity: sha512-y1kC+ffIx/tPLdTE693uNjHfzTfr+ravR5tvWlMXe25nELbkqV400S71qHDwbkAQ1FVEZobB1NFRzFbCCcyBCQ==} + engines: {bare: '>=1.16.0'} + peerDependencies: + bare-buffer: '*' + peerDependenciesMeta: + bare-buffer: + optional: true + + bare-path@3.1.1: + resolution: {integrity: sha512-JprUlveX3QjApC1cTpsUOiscADftCGVWkzitbHsRqv84hzYwYHw2mbluddsq5TvI8mH/8Ov1f4BiMAdcB0oYnQ==} + + bare-stream@2.13.3: + resolution: {integrity: sha512-Kc+brLqvEqGkjyfiwJmImAOqLZL7OsoLKuavx+hJjgVV3nLTOjloJyPMFxjUPerGGHrNH0fLU06jjykMLWrERQ==} + peerDependencies: + bare-abort-controller: '*' + bare-buffer: '*' + bare-events: '*' + peerDependenciesMeta: + bare-abort-controller: + optional: true + bare-buffer: + optional: true + bare-events: + optional: true + + bare-url@2.4.6: + resolution: {integrity: sha512-iQxPClE07hETVpbRoX7JXX3v/ZQViCxe/SYCxylRLzdEx1xJAufPptfiOqR8tqiCtmbtMDANKWszzjLu1PMAZQ==} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + bcrypt@6.0.0: + resolution: {integrity: sha512-cU8v/EGSrnH+HnxV2z0J7/blxH8gq7Xh2JFT6Aroax7UohdmiJJlxApMxtKfuI7z68NvvVcmR78k2LbT6efhRg==} + engines: {node: '>= 18'} + + body-parser@2.3.0: + resolution: {integrity: sha512-2cGmJupaNgg+QUwVLAucDuWuoMZ6EX9iHDRswZ5lsNYEmwPaRknMPCLZz07yTzVq/83p4o/wzbDZbBrTvGGTIw==} + engines: {node: '>=18'} + + brace-expansion@5.0.7: + resolution: {integrity: sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA==} + engines: {node: 18 || 20 || >=22} + + brotli@1.3.3: + resolution: {integrity: sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg==} + + bson@7.3.1: + resolution: {integrity: sha512-h/C0qe6857pQhcSJHLfsR1uYGj98Ge3wKAD3Ed9KqH3wcVh+BM4Jq4xISD7vs9OPuT07n+q3QQVjslJ286j6ag==} + engines: {node: '>=20.19.0'} + + buffer-equal-constant-time@1.0.1: + resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} + + bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + + call-me-maybe@1.0.2: + resolution: {integrity: sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==} + + camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + + chai@6.2.2: + resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} + engines: {node: '>=18'} + + cloudinary@2.10.0: + resolution: {integrity: sha512-sY09kYg7wprkndAOjZBAYqFZqwL+SxnEGcAvksOvFA+5upnFn949UjkEkHKNSwkBtW/xRDd0p6NgbSXZcxkI3w==} + engines: {node: '>=9'} + + color-convert@3.1.3: + resolution: {integrity: sha512-fasDH2ont2GqF5HpyO4w0+BcewlhHEZOFn9c1ckZdHpJ56Qb7MHhH/IcJZbBGgvdtwdwNbLvxiBEdg336iA9Sg==} + engines: {node: '>=14.6'} + + color-name@2.1.0: + resolution: {integrity: sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==} + engines: {node: '>=12.20'} + + color-string@2.1.4: + resolution: {integrity: sha512-Bb6Cq8oq0IjDOe8wJmi4JeNn763Xs9cfrBcaylK1tPypWzyoy2G3l90v9k64kjphl/ZJjPIShFztenRomi8WTg==} + engines: {node: '>=18'} + + color@5.0.3: + resolution: {integrity: sha512-ezmVcLR3xAVp8kYOm4GS45ZLLgIE6SPAFoduLr6hTDajwb3KZ2F46gulK3XpcwRFb5KKGCSezCBAY4Dw4HsyXA==} + engines: {node: '>=18'} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + commander@6.2.0: + resolution: {integrity: sha512-zP4jEKbe8SHzKJYQmq8Y9gYjtO/POJLgIdKgV7B9qNmABVFVc+ctqSX6iXh4mCpJfRBOabiZ2YKPg8ciDw6C+Q==} + engines: {node: '>= 6'} + + commondir@1.0.1: + resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + + component-emitter@1.3.1: + resolution: {integrity: sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==} + + compressible@2.0.18: + resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} + engines: {node: '>= 0.6'} + + compression@1.8.1: + resolution: {integrity: sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==} + engines: {node: '>= 0.8.0'} + + content-disposition@1.1.0: + resolution: {integrity: sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==} + engines: {node: '>=18'} + + content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + + content-type@2.0.0: + resolution: {integrity: sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ==} + engines: {node: '>=18'} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + cookie-parser@1.4.7: + resolution: {integrity: sha512-nGUvgXnotP3BsjiLX2ypbQnWoGUPIIfHQNZkkC668ntrzGWEZVW70HDEB1qnNGMicPje6EttlIgzo51YSwNQGw==} + engines: {node: '>= 0.8.0'} + + cookie-signature@1.0.6: + resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + + cookie-signature@1.2.2: + resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} + engines: {node: '>=6.6.0'} + + cookie@0.7.2: + resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} + engines: {node: '>= 0.6'} + + cookiejar@2.1.4: + resolution: {integrity: sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==} + + cors@2.8.6: + resolution: {integrity: sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==} + engines: {node: '>= 0.10'} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + + dezalgo@1.0.4: + resolution: {integrity: sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==} + + doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + + dotenv@17.4.2: + resolution: {integrity: sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw==} + engines: {node: '>=12'} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + ecdsa-sig-formatter@1.0.11: + resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} + + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + + enabled@2.0.0: + resolution: {integrity: sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==} + + encodeurl@2.0.0: + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + engines: {node: '>= 0.8'} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-module-lexer@2.3.1: + resolution: {integrity: sha512-shc1dbU90Yl/xq1QrC7QRtfcwURZuVRfPhZbDoldJ1cn1gzDvBaBWlv0eFolj5+0znnPJz5TXLxsN77X/12KTA==} + + es-object-atoms@1.1.2: + resolution: {integrity: sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + esbuild@0.28.1: + resolution: {integrity: sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==} + engines: {node: '>=18'} + hasBin: true + + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + eslint-scope@9.1.2: + resolution: {integrity: sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@5.0.1: + resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + eslint@10.7.0: + resolution: {integrity: sha512-GVTD7s1vdIl6UYvAfriOPeY1Df8LIZjfofLvHwde+erDHGGuHyuM6xoxRxmHiebhYuD2p1vN4wWh0XzPARSGDQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true + + espree@11.2.0: + resolution: {integrity: sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + esquery@1.7.0: + resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + + events-universal@1.0.1: + resolution: {integrity: sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==} + + expect-type@1.4.0: + resolution: {integrity: sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==} + engines: {node: '>=12.0.0'} + + express-rate-limit@8.6.0: + resolution: {integrity: sha512-XKJXDsASUOo0LLtFwW5hCcQGH0N4WQc/Rn8/Pvoia+TJFOkkFPvrtW9lZOeeNcxQJspvOIERMwiRLsVFlhHEkA==} + engines: {node: '>= 16'} + peerDependencies: + express: '>= 4.11' + + express-validator@7.3.2: + resolution: {integrity: sha512-ctLw1Vl6dXVH62dIQMDdTAQkrh480mkFuG6/SGXOaVlwPNukhRAe7EgJIMJ2TSAni8iwHBRp530zAZE5ZPF2IA==} + engines: {node: '>= 8.0.0'} + + express@5.2.1: + resolution: {integrity: sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==} + engines: {node: '>= 18'} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-fifo@1.3.2: + resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fast-safe-stringify@2.1.1: + resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} + + fast-sha256@1.3.0: + resolution: {integrity: sha512-n11RGP/lrWEFI/bWdygLxhI+pVeo1ZYIVwvvPkW7azl/rOy+F3HYRZ2K5zeE9mmkhQppyv9sQFx0JM9UabnpPQ==} + + fast-uri@3.1.4: + resolution: {integrity: sha512-8JnbkQ4juDyvYs4mgFGQqg4yCYtFDtUtmp2QIQq11ZZe5CFQ5wcqm1rqDgAh/QdMySuBnPzMUiJUNZG5N/AiQw==} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + fecha@4.2.3: + resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==} + + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} + + file-stream-rotator@0.6.1: + resolution: {integrity: sha512-u+dBid4PvZw17PmDeRcNOtCP9CCK/9lRN2w+r1xIS7yOL9JFrIBKTvrYsxT4P0pGtThYTn++QS5ChHaUov3+zQ==} + + finalhandler@2.1.1: + resolution: {integrity: sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==} + engines: {node: '>= 18.0.0'} + + find-cache-dir@3.3.2: + resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} + engines: {node: '>=8'} + + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} + + flatted@3.4.2: + resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==} + + fn.name@1.1.0: + resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==} + + follow-redirects@1.16.0: + resolution: {integrity: sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} + engines: {node: '>=14'} + + form-data@4.0.6: + resolution: {integrity: sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==} + engines: {node: '>= 6'} + + formidable@3.5.4: + resolution: {integrity: sha512-YikH+7CUTOtP44ZTnUhR7Ic2UASBPOqmaRkRKxRbywPTe5VxF7RRCck4af9wutiZ/QKM5nME9Bie2fFaPz5Gug==} + engines: {node: '>=14.0.0'} + + forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + + fresh@2.0.0: + resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} + engines: {node: '>= 0.8'} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob@11.1.0: + resolution: {integrity: sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw==} + engines: {node: 20 || >=22} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + hasBin: true + + globals@17.7.0: + resolution: {integrity: sha512-Czmyns5dUsq4seFBR/Kdydhmo8y9kC79hiSkPn0YcGtNnYWnrgt0vjrSjx9tspoDGWm2CMarffRuLjM4xUz8xg==} + engines: {node: '>=18'} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hasown@2.0.4: + resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==} + engines: {node: '>= 0.4'} + + helmet@8.3.0: + resolution: {integrity: sha512-Qgpiaws3Sm30Av8Eah6sjMCZZwjlBu+E68rhpCWBshY1lb09HtLwj5GviX0OyQIn+ulUS0iX0AxN5n3tLZzz1w==} + engines: {node: '>=18.0.0'} + + html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + + http-errors@2.0.1: + resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} + engines: {node: '>= 0.8'} + + https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} + + iconv-lite@0.7.3: + resolution: {integrity: sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ==} + engines: {node: '>=0.10.0'} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + ignore@7.0.6: + resolution: {integrity: sha512-BAg6QkE8W+TuQLrrw0Ugr7HegXduRuuj8/ti2kSOc+jz1dmx8/WNcjr6XGnq5YpDWxFwwaavqD0+jIUOKelTsw==} + engines: {node: '>= 4'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ip-address@10.2.0: + resolution: {integrity: sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA==} + engines: {node: '>= 12'} + + ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-promise@4.0.0: + resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} + + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} + + istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} + + istanbul-reports@3.2.0: + resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==} + engines: {node: '>=8'} + + jackspeak@4.2.3: + resolution: {integrity: sha512-ykkVRwrYvFm1nb2AJfKKYPr0emF6IiXDYUaFx4Zn9ZuIH7MrzEZ3sD5RlqGXNRpHtvUHJyOnCEFxOlNDtGo7wg==} + engines: {node: 20 || >=22} + + js-tokens@10.0.0: + resolution: {integrity: sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==} + + js-yaml@4.3.0: + resolution: {integrity: sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + jsonwebtoken@9.0.3: + resolution: {integrity: sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==} + engines: {node: '>=12', npm: '>=6'} + + jwa@2.0.1: + resolution: {integrity: sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==} + + jws@4.0.1: + resolution: {integrity: sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==} + + kareem@3.3.0: + resolution: {integrity: sha512-kpSuLD3/7RenBnjnJdOHXCKC8dTd1JzeOiJhN0necWWci6cC+qX+VuwPnMVgb+a4+KNJSfgqahpnfWaeDXCimw==} + engines: {node: '>=18.0.0'} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + kuler@2.0.0: + resolution: {integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash.includes@4.3.0: + resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==} + + lodash.isboolean@3.0.3: + resolution: {integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==} + + lodash.isinteger@4.0.4: + resolution: {integrity: sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==} + + lodash.isnumber@3.0.3: + resolution: {integrity: sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==} + + lodash.isplainobject@4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + + lodash.isstring@4.0.1: + resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==} + + lodash.mergewith@4.6.2: + resolution: {integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==} + + lodash.once@4.1.1: + resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} + + lodash@4.18.1: + resolution: {integrity: sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==} + + logform@2.7.0: + resolution: {integrity: sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==} + engines: {node: '>= 12.0.0'} + + lru-cache@11.5.2: + resolution: {integrity: sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==} + engines: {node: 20 || >=22} + + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + + magicast@0.5.3: + resolution: {integrity: sha512-pVKE4UdSQ7DvHzivsCIFx2BJn1mHG6KsyrFcaxFx6tONdneEuThrDx0Cj3AMg58KyN4pzYT+LHOotxDQDjNvkw==} + + make-dir@3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} + + make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + media-typer@1.1.0: + resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} + engines: {node: '>= 0.8'} + + memory-pager@1.5.0: + resolution: {integrity: sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==} + + merge-descriptors@2.0.0: + resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} + engines: {node: '>=18'} + + methods@1.1.2: + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-db@1.54.0: + resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mime-types@3.0.2: + resolution: {integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==} + engines: {node: '>=18'} + + mime@2.6.0: + resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} + engines: {node: '>=4.0.0'} + hasBin: true + + minimatch@10.2.5: + resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} + engines: {node: 18 || 20 || >=22} + + minipass@7.1.3: + resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==} + engines: {node: '>=16 || 14 >=14.17'} + + moment@2.30.1: + resolution: {integrity: sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==} + + mongodb-connection-string-url@7.0.2: + resolution: {integrity: sha512-ZoS07RoFqpKYQwAk59qmrx8+jJHNHU30UjlU96QktiGn1ltvDr+vCznLX5DiUBLEpMAHatHNWV1nM/74ul66kA==} + engines: {node: '>=20.19.0'} + + mongodb-memory-server-core@11.2.0: + resolution: {integrity: sha512-vOoDtn0JiLrHvZY81Rp/UtKXXK0rtJHZGZFVnccvJwYitPLNspO0Ty0grqFQOe7iAET8+GI4zAQcphg+R3vxQg==} + engines: {node: '>=20.19.0'} + + mongodb-memory-server@11.2.0: + resolution: {integrity: sha512-506AD8qvClVx8Raw/WhAUUWBgIXPyi856iC01aa5vAzHmn6WOXC6ulvudkTF7oTMzJxkyA0A84VpD4BpyfqJ9w==} + engines: {node: '>=20.19.0'} + + mongodb@7.5.0: + resolution: {integrity: sha512-5FnrEDLnvp6ycUOGLNLLU33BfCx2qmp2mJjGPDwKLruYsVzXVSK5fsGpoDXvsXJwBfBsD7ebMRdawbDxC2814g==} + engines: {node: '>=20.19.0'} + peerDependencies: + '@aws-sdk/credential-providers': ^3.806.0 + '@mongodb-js/zstd': ^7.0.0 + gcp-metadata: ^7.0.1 + kerberos: ^7.0.0 + mongodb-client-encryption: ^7.2.0 + snappy: ^7.3.2 + socks: ^2.8.6 + peerDependenciesMeta: + '@aws-sdk/credential-providers': + optional: true + '@mongodb-js/zstd': + optional: true + gcp-metadata: + optional: true + kerberos: + optional: true + mongodb-client-encryption: + optional: true + snappy: + optional: true + socks: + optional: true + + mongoose@9.8.0: + resolution: {integrity: sha512-PDGx3XACxrBQyWf4YT+5s1Xsx19x84UWGlRVIza4i9RG6qKjGcoG7odotT6uquR6YoaDMTZ6ZZc/jMXLrNPyyA==} + engines: {node: '>=20.19.0'} + + mpath@0.9.0: + resolution: {integrity: sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==} + engines: {node: '>=4.0.0'} + + mquery@6.0.0: + resolution: {integrity: sha512-b2KQNsmgtkscfeDgkYMcWGn9vZI9YoXh802VDEwE6qc50zxBFQ0Oo8ROkawbPAsXCY1/Z1yp0MagqsZStPWJjw==} + engines: {node: '>=20.19.0'} + + ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + nanoid@3.3.16: + resolution: {integrity: sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + negotiator@0.6.4: + resolution: {integrity: sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==} + engines: {node: '>= 0.6'} + + negotiator@1.0.0: + resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} + engines: {node: '>= 0.6'} + + new-find-package-json@2.0.0: + resolution: {integrity: sha512-lDcBsjBSMlj3LXH2v/FW3txlh2pYTjmbOXPYJD93HI5EwuLzI11tdHSIpUMmfq/IOsldj4Ps8M8flhm+pCK4Ew==} + engines: {node: '>=12.22.0'} + + node-addon-api@8.9.0: + resolution: {integrity: sha512-ekZMeaaIzSQTSpr7X2X3iJM7lTzgnx8ahAG9pJfT/7+14mlEM8ZYQ9cgCDvSSRbReFK0oHli3WrZdCiRsgAT9Q==} + engines: {node: ^18 || ^20 || >= 21} + + node-gyp-build@4.8.4: + resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} + hasBin: true + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-hash@3.0.0: + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} + engines: {node: '>= 6'} + + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + + obug@2.1.4: + resolution: {integrity: sha512-4a+OsYv9UktOJKE+l1A4OufDgdRF9PifWj+tJnHURo/P+WOxpG4GzUFL9qCalmWauao6ogiG+QvnCovwPoyAWA==} + engines: {node: '>=12.20.0'} + + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + + on-headers@1.1.0: + resolution: {integrity: sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==} + engines: {node: '>= 0.8'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + one-time@1.0.0: + resolution: {integrity: sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==} + + openapi-types@12.1.3: + resolution: {integrity: sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + + parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-scurry@2.0.2: + resolution: {integrity: sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==} + engines: {node: 18 || 20 || >=22} + + path-to-regexp@8.4.2: + resolution: {integrity: sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==} + + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + + pend@1.2.0: + resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@4.0.5: + resolution: {integrity: sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==} + engines: {node: '>=12'} + + pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + + postal-mime@2.7.5: + resolution: {integrity: sha512-GNEXKvWFQnbgO5NlrGzVa0FmWzBZ24PersAWErttSg1Hjpf0ATxTwS5DOMGaOpTG6bUh5cTr7xi0jAD942wCJA==} + + postcss@8.5.21: + resolution: {integrity: sha512-v4sDNP3fdNiWMfabO7OwOQdOX8TiQSztKyT1Wj0w+j7LDallJThJRBBBmzVGyYj0crMh7jlV4zepPkiNu9UwDQ==} + engines: {node: ^10 || ^12 || >=14} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prettier@3.9.6: + resolution: {integrity: sha512-OpN0zzVdiaiAhxpuuj5efpIS4sY9j7bY6uR5mnj5yPzGkdkjNKSJeUThPb60Jw29QuAZgA4o+/iB49kFiaBX6g==} + engines: {node: '>=14'} + hasBin: true + + proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + + proxy-from-env@2.1.0: + resolution: {integrity: sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==} + engines: {node: '>=10'} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + qs@6.15.3: + resolution: {integrity: sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==} + engines: {node: '>=0.6'} + + range-parser@1.3.0: + resolution: {integrity: sha512-hek2mFQpPuI4E1BBKrSto+BU3e3x4xuarsbiwr3+lf7p44juvFMV0XFWQAP3xUyqXA4RrXLIoaSUGbSt056ZMw==} + engines: {node: '>= 0.6'} + + raw-body@3.0.2: + resolution: {integrity: sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==} + engines: {node: '>= 0.10'} + + razorpay@2.9.8: + resolution: {integrity: sha512-Uqv3KV7JAfpLlabGdg8Cw7e7ieGkK/DighFq6iGkNnz0Y+it6+/lFmPCTfkcptc2EagL2Og25VWUxc+Fgp/+nA==} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + resend@6.18.0: + resolution: {integrity: sha512-EjxZ9AVzywJgOlUoIJe9ytBWVrfbUtJbjeoLnRSvpU1sv97Hh9DSwhw+k8kiujrG4Rg4bzTBsjlmwWWuoOxSug==} + engines: {node: '>=20'} + peerDependencies: + '@react-email/render': '*' + peerDependenciesMeta: + '@react-email/render': + optional: true + + rollup@4.62.2: + resolution: {integrity: sha512-RFnrW4lhXA3s3eqHDZvN654g8OTjzRfqpIRJYczCGB6HzphckVAi/Qh4tbPUbRuDi7s1Llv8g/NspLkttY3gTA==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + router@2.2.0: + resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} + engines: {node: '>= 18'} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safe-stable-stringify@2.5.0: + resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} + engines: {node: '>=10'} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.8.5: + resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==} + engines: {node: '>=10'} + hasBin: true + + send@1.2.1: + resolution: {integrity: sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==} + engines: {node: '>= 18'} + + serve-static@2.2.1: + resolution: {integrity: sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==} + engines: {node: '>= 18'} + + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + side-channel-list@1.0.1: + resolution: {integrity: sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.1: + resolution: {integrity: sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==} + engines: {node: '>= 0.4'} + + sift@17.1.3: + resolution: {integrity: sha512-Rtlj66/b0ICeFzYTuNvX/EF1igRbbnGSvEyT79McoZa/DeGhMyC5pWKOEsZKnpkqtSeovd5FL/bjHWC3CIIvCQ==} + + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + sparse-bitfield@3.0.3: + resolution: {integrity: sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==} + + stack-trace@0.0.10: + resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==} + + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + + standardwebhooks@1.0.0: + resolution: {integrity: sha512-BbHGOQK9olHPMvQNHWul6MYlrRTAOKn03rOe4A8O3CLWhNf4YHBqq2HJKKC+sfqpxiBY52pNeesD6jIiLDz8jg==} + + statuses@2.0.2: + resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} + engines: {node: '>= 0.8'} + + std-env@4.2.0: + resolution: {integrity: sha512-oCUKSupKTHX53EyjDtuZQ64pjLJ6yYCtpmEw0goYxtjG9KpbRe8KAsl2tBUGU9DyMcJ0RwJ8GqJAFzMXcXW1Rw==} + + streamx@2.28.0: + resolution: {integrity: sha512-1Yowhzjf0ivGMrTIkY9hav5TxobO9qIVqUE41fiCGMGgc3CLlf4MY+9AHmZqBWgDTue0fY9zWjYFVyf6Diuobw==} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + superagent@10.3.0: + resolution: {integrity: sha512-B+4Ik7ROgVKrQsXTV0Jwp2u+PXYLSlqtDAhYnkkD+zn3yg8s/zjA2MeGayPoY/KICrbitwneDHrjSotxKL+0XQ==} + engines: {node: '>=14.18.0'} + + supertest@7.2.2: + resolution: {integrity: sha512-oK8WG9diS3DlhdUkcFn4tkNIiIbBx9lI2ClF8K+b2/m8Eyv47LSawxUzZQSNKUrVb2KsqeTDCcjAAVPYaSLVTA==} + engines: {node: '>=14.18.0'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + swagger-jsdoc@6.3.0: + resolution: {integrity: sha512-I+iQjVGV3t28pOkQUJv2MncthvOtkEactOn8R76SvSYhxgtIn7FoqfDHwQaN+GBnQdXQLrhgDXseKitmJcHMsA==} + engines: {node: '>=20.0.0'} + hasBin: true + + swagger-ui-dist@5.32.10: + resolution: {integrity: sha512-RTrAPrp/J5H/H8JvRBOpR3qCsIhntOweFwaasR0TD2Y6a/7VUYYFnjyB3MFe1niAg3VkEQGT9pVZ0r225jvJJA==} + + swagger-ui-express@5.0.1: + resolution: {integrity: sha512-SrNU3RiBGTLLmFU8GIJdOdanJTl4TOmT27tt3bWWHppqYmAZ6IDuEuBvMU6nZq0zLEe6b/1rACXCgLZqO6ZfrA==} + engines: {node: '>= v0.10.32'} + peerDependencies: + express: '>=4.0.0 || >=5.0.0-beta' + + tar-stream@3.2.0: + resolution: {integrity: sha512-ojzvCvVaNp6aOTFmG7jaRD0meowIAuPc3cMMhSgKiVWws1GyHbGd/xvnyuRKcKlMpt3qvxx6r0hreCNITP9hIg==} + + teex@1.0.1: + resolution: {integrity: sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==} + + text-decoder@1.2.7: + resolution: {integrity: sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ==} + + text-hex@1.0.0: + resolution: {integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==} + + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + + tinyexec@1.2.4: + resolution: {integrity: sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg==} + engines: {node: '>=18'} + + tinyglobby@0.2.17: + resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} + engines: {node: '>=12.0.0'} + + tinyrainbow@3.1.0: + resolution: {integrity: sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==} + engines: {node: '>=14.0.0'} + + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + tr46@5.1.1: + resolution: {integrity: sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==} + engines: {node: '>=18'} + + triple-beam@1.4.1: + resolution: {integrity: sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==} + engines: {node: '>= 14.0.0'} + + ts-api-utils@2.5.0: + resolution: {integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==} + engines: {node: '>=18.12'} + peerDependencies: + typescript: '>=4.8.4' + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + tsx@4.23.1: + resolution: {integrity: sha512-GQHnkIfxyx1wYCOS/wonik5MVRZU9hi1TEZmzGZSCJB1y9YgoZ8H6itNE/u4suE+yLmOzuE4E5S4TZ/ZX2wcWQ==} + engines: {node: '>=18.0.0'} + hasBin: true + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-is@2.1.0: + resolution: {integrity: sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA==} + engines: {node: '>= 18'} + + typescript-eslint@8.65.0: + resolution: {integrity: sha512-/ggrHAwyjENDusvyxbuqxAC2dTnZg/Z8F+fgQtYIz+L6n/9HfSlEZcFGV/NsMNa6CkGk0xUjUAFwC0vHOflvIA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true + + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + + unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + validator@13.15.35: + resolution: {integrity: sha512-TQ5pAGhd5whStmqWvYF4OjQROlmv9SMFVt37qoCBdqRffuuklWYQlCNnEs2ZaIBD1kZRNnikiZOS1eqgkar0iw==} + engines: {node: '>= 0.10'} + + vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + + vite@7.3.6: + resolution: {integrity: sha512-4XP60spRGjSZFf1qYH+dJIkK2znL3zQfl9KkOV9MkkRR/3Dls0dxaBsQPTloEc5BLXWPL9vsOxopxyKoMmDueg==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + jiti: '>=1.21.0' + less: ^4.0.0 + lightningcss: ^1.21.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vitest@4.1.10: + resolution: {integrity: sha512-R9jUTe5S4Qb0HCd4TNqpC7oGcrMssMRGXLW80ubjWsW9VH5GF8y1Y0SFLY9AbqSk6nt0PnOx4H4WNJYZ13GUPw==} + engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@opentelemetry/api': ^1.9.0 + '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 + '@vitest/browser-playwright': 4.1.10 + '@vitest/browser-preview': 4.1.10 + '@vitest/browser-webdriverio': 4.1.10 + '@vitest/coverage-istanbul': 4.1.10 + '@vitest/coverage-v8': 4.1.10 + '@vitest/ui': 4.1.10 + happy-dom: '*' + jsdom: '*' + vite: ^6.0.0 || ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@opentelemetry/api': + optional: true + '@types/node': + optional: true + '@vitest/browser-playwright': + optional: true + '@vitest/browser-preview': + optional: true + '@vitest/browser-webdriverio': + optional: true + '@vitest/coverage-istanbul': + optional: true + '@vitest/coverage-v8': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + + webidl-conversions@7.0.0: + resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} + engines: {node: '>=12'} + + whatwg-url@14.2.0: + resolution: {integrity: sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==} + engines: {node: '>=18'} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} + hasBin: true + + winston-daily-rotate-file@5.0.0: + resolution: {integrity: sha512-JDjiXXkM5qvwY06733vf09I2wnMXpZEhxEVOSPenZMii+g7pcDcTBt2MRugnoi8BwVSuCT2jfRXBUy+n1Zz/Yw==} + engines: {node: '>=8'} + peerDependencies: + winston: ^3 + + winston-transport@4.9.0: + resolution: {integrity: sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==} + engines: {node: '>= 12.0.0'} + + winston@3.19.0: + resolution: {integrity: sha512-LZNJgPzfKR+/J3cHkxcpHKpKKvGfDZVPS4hfJCc4cCG0CgYzvlD6yE/S3CIL/Yt91ak327YCpiF/0MyeZHEHKA==} + engines: {node: '>= 12.0.0'} + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + yaml@2.0.0-1: + resolution: {integrity: sha512-W7h5dEhywMKenDJh2iX/LABkbFnBxasD27oyXWDS/feDsxiw0dD5ncXdYXgkvAsXIY2MpW/ZKkr9IU30DBdMNQ==} + engines: {node: '>= 6'} + + yauzl@3.4.0: + resolution: {integrity: sha512-jIH9yLR9wqr0wOS0TpBvo/g/2UgZH5qePVbjgRliiF0BYvOZyaBknKsF+x9Iht0O6sqgnB93rCICdOZFecJuDw==} + engines: {node: '>=12'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + zod@4.4.3: + resolution: {integrity: sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==} + +snapshots: + + '@apidevtools/json-schema-ref-parser@14.0.1': + dependencies: + '@types/json-schema': 7.0.15 + js-yaml: 4.3.0 + + '@apidevtools/openapi-schemas@2.1.0': {} + + '@apidevtools/swagger-methods@3.0.2': {} + + '@apidevtools/swagger-parser@12.1.0(openapi-types@12.1.3)': + dependencies: + '@apidevtools/json-schema-ref-parser': 14.0.1 + '@apidevtools/openapi-schemas': 2.1.0 + '@apidevtools/swagger-methods': 3.0.2 + ajv: 8.20.0 + ajv-draft-04: 1.0.0(ajv@8.20.0) + call-me-maybe: 1.0.2 + openapi-types: 12.1.3 + + '@babel/helper-string-parser@7.29.7': {} + + '@babel/helper-validator-identifier@7.29.7': {} + + '@babel/parser@7.29.7': + dependencies: + '@babel/types': 7.29.7 + + '@babel/types@7.29.7': + dependencies: + '@babel/helper-string-parser': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + + '@bcoe/v8-coverage@1.0.2': {} + + '@colors/colors@1.6.0': {} + + '@dabh/diagnostics@2.0.8': + dependencies: + '@so-ric/colorspace': 1.1.6 + enabled: 2.0.0 + kuler: 2.0.0 + + '@esbuild/aix-ppc64@0.28.1': + optional: true + + '@esbuild/android-arm64@0.28.1': + optional: true + + '@esbuild/android-arm@0.28.1': + optional: true + + '@esbuild/android-x64@0.28.1': + optional: true + + '@esbuild/darwin-arm64@0.28.1': + optional: true + + '@esbuild/darwin-x64@0.28.1': + optional: true + + '@esbuild/freebsd-arm64@0.28.1': + optional: true + + '@esbuild/freebsd-x64@0.28.1': + optional: true + + '@esbuild/linux-arm64@0.28.1': + optional: true + + '@esbuild/linux-arm@0.28.1': + optional: true + + '@esbuild/linux-ia32@0.28.1': + optional: true + + '@esbuild/linux-loong64@0.28.1': + optional: true + + '@esbuild/linux-mips64el@0.28.1': + optional: true + + '@esbuild/linux-ppc64@0.28.1': + optional: true + + '@esbuild/linux-riscv64@0.28.1': + optional: true + + '@esbuild/linux-s390x@0.28.1': + optional: true + + '@esbuild/linux-x64@0.28.1': + optional: true + + '@esbuild/netbsd-arm64@0.28.1': + optional: true + + '@esbuild/netbsd-x64@0.28.1': + optional: true + + '@esbuild/openbsd-arm64@0.28.1': + optional: true + + '@esbuild/openbsd-x64@0.28.1': + optional: true + + '@esbuild/openharmony-arm64@0.28.1': + optional: true + + '@esbuild/sunos-x64@0.28.1': + optional: true + + '@esbuild/win32-arm64@0.28.1': + optional: true + + '@esbuild/win32-ia32@0.28.1': + optional: true + + '@esbuild/win32-x64@0.28.1': + optional: true + + '@eslint-community/eslint-plugin-eslint-comments@4.7.2(eslint@10.7.0)': + dependencies: + escape-string-regexp: 4.0.0 + eslint: 10.7.0 + ignore: 7.0.6 + + '@eslint-community/eslint-utils@4.9.1(eslint@10.7.0)': + dependencies: + eslint: 10.7.0 + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.2': {} + + '@eslint/config-array@0.23.5': + dependencies: + '@eslint/object-schema': 3.0.5 + debug: 4.4.3 + minimatch: 10.2.5 + transitivePeerDependencies: + - supports-color + + '@eslint/config-helpers@0.6.0': + dependencies: + '@eslint/core': 1.2.1 + + '@eslint/core@1.2.1': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/js@10.0.1(eslint@10.7.0)': + optionalDependencies: + eslint: 10.7.0 + + '@eslint/object-schema@3.0.5': {} + + '@eslint/plugin-kit@0.7.2': + dependencies: + '@eslint/core': 1.2.1 + levn: 0.4.1 + + '@humanfs/core@0.19.2': + dependencies: + '@humanfs/types': 0.15.0 + + '@humanfs/node@0.16.8': + dependencies: + '@humanfs/core': 0.19.2 + '@humanfs/types': 0.15.0 + '@humanwhocodes/retry': 0.4.3 + + '@humanfs/types@0.15.0': {} + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/retry@0.4.3': {} + + '@isaacs/cliui@9.0.0': {} + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@mongodb-js/saslprep@1.4.12': + dependencies: + sparse-bitfield: 3.0.3 + + '@noble/hashes@1.8.0': {} + + '@paralleldrive/cuid2@2.3.1': + dependencies: + '@noble/hashes': 1.8.0 + + '@rollup/rollup-android-arm-eabi@4.62.2': + optional: true + + '@rollup/rollup-android-arm64@4.62.2': + optional: true + + '@rollup/rollup-darwin-arm64@4.62.2': + optional: true + + '@rollup/rollup-darwin-x64@4.62.2': + optional: true + + '@rollup/rollup-freebsd-arm64@4.62.2': + optional: true + + '@rollup/rollup-freebsd-x64@4.62.2': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.62.2': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.62.2': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.62.2': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.62.2': + optional: true + + '@rollup/rollup-linux-loong64-gnu@4.62.2': + optional: true + + '@rollup/rollup-linux-loong64-musl@4.62.2': + optional: true + + '@rollup/rollup-linux-ppc64-gnu@4.62.2': + optional: true + + '@rollup/rollup-linux-ppc64-musl@4.62.2': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.62.2': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.62.2': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.62.2': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.62.2': + optional: true + + '@rollup/rollup-linux-x64-musl@4.62.2': + optional: true + + '@rollup/rollup-openbsd-x64@4.62.2': + optional: true + + '@rollup/rollup-openharmony-arm64@4.62.2': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.62.2': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.62.2': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.62.2': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.62.2': + optional: true + + '@scarf/scarf@1.4.0': {} + + '@so-ric/colorspace@1.1.6': + dependencies: + color: 5.0.3 + text-hex: 1.0.0 + + '@stablelib/base64@1.0.1': {} + + '@standard-schema/spec@1.1.0': {} + + '@types/bcrypt@6.0.0': + dependencies: + '@types/node': 22.20.1 + + '@types/body-parser@1.19.6': + dependencies: + '@types/connect': 3.4.38 + '@types/node': 22.20.1 + + '@types/chai@5.2.3': + dependencies: + '@types/deep-eql': 4.0.2 + assertion-error: 2.0.1 + + '@types/compression@1.8.1': + dependencies: + '@types/express': 5.0.6 + '@types/node': 22.20.1 + + '@types/connect@3.4.38': + dependencies: + '@types/node': 22.20.1 + + '@types/cookie-parser@1.4.10(@types/express@5.0.6)': + dependencies: + '@types/express': 5.0.6 + + '@types/cookiejar@2.1.5': {} + + '@types/cors@2.8.19': + dependencies: + '@types/node': 22.20.1 + + '@types/deep-eql@4.0.2': {} + + '@types/esrecurse@4.3.1': {} + + '@types/estree@1.0.9': {} + + '@types/express-serve-static-core@5.1.2': + dependencies: + '@types/node': 22.20.1 + '@types/qs': 6.15.1 + '@types/range-parser': 1.2.7 + '@types/send': 1.2.1 + + '@types/express@5.0.6': + dependencies: + '@types/body-parser': 1.19.6 + '@types/express-serve-static-core': 5.1.2 + '@types/serve-static': 2.2.0 + + '@types/http-errors@2.0.5': {} + + '@types/json-schema@7.0.15': {} + + '@types/jsonwebtoken@9.0.10': + dependencies: + '@types/ms': 2.1.0 + '@types/node': 22.20.1 + + '@types/methods@1.1.4': {} + + '@types/ms@2.1.0': {} + + '@types/node@22.20.1': + dependencies: + undici-types: 6.21.0 + + '@types/qs@6.15.1': {} + + '@types/range-parser@1.2.7': {} + + '@types/send@1.2.1': + dependencies: + '@types/node': 22.20.1 + + '@types/serve-static@2.2.0': + dependencies: + '@types/http-errors': 2.0.5 + '@types/node': 22.20.1 + + '@types/superagent@8.1.11': + dependencies: + '@types/cookiejar': 2.1.5 + '@types/methods': 1.1.4 + '@types/node': 22.20.1 + form-data: 4.0.6 + + '@types/supertest@7.2.1': + dependencies: + '@types/methods': 1.1.4 + '@types/superagent': 8.1.11 + + '@types/swagger-jsdoc@6.0.4': {} + + '@types/swagger-ui-express@4.1.8': + dependencies: + '@types/express': 5.0.6 + '@types/serve-static': 2.2.0 + + '@types/triple-beam@1.3.5': {} + + '@types/webidl-conversions@7.0.3': {} + + '@types/whatwg-url@13.0.0': + dependencies: + '@types/webidl-conversions': 7.0.3 + + '@typescript-eslint/eslint-plugin@8.65.0(@typescript-eslint/parser@8.65.0(eslint@10.7.0)(typescript@5.9.3))(eslint@10.7.0)(typescript@5.9.3)': + dependencies: + '@eslint-community/regexpp': 4.12.2 + '@typescript-eslint/parser': 8.65.0(eslint@10.7.0)(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.65.0 + '@typescript-eslint/type-utils': 8.65.0(eslint@10.7.0)(typescript@5.9.3) + '@typescript-eslint/utils': 8.65.0(eslint@10.7.0)(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.65.0 + eslint: 10.7.0 + ignore: 7.0.6 + natural-compare: 1.4.0 + ts-api-utils: 2.5.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@8.65.0(eslint@10.7.0)(typescript@5.9.3)': + dependencies: + '@typescript-eslint/scope-manager': 8.65.0 + '@typescript-eslint/types': 8.65.0 + '@typescript-eslint/typescript-estree': 8.65.0(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.65.0 + debug: 4.4.3 + eslint: 10.7.0 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/project-service@8.65.0(typescript@5.9.3)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.65.0(typescript@5.9.3) + '@typescript-eslint/types': 8.65.0 + debug: 4.4.3 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@8.65.0': + dependencies: + '@typescript-eslint/types': 8.65.0 + '@typescript-eslint/visitor-keys': 8.65.0 + + '@typescript-eslint/tsconfig-utils@8.65.0(typescript@5.9.3)': + dependencies: + typescript: 5.9.3 + + '@typescript-eslint/type-utils@8.65.0(eslint@10.7.0)(typescript@5.9.3)': + dependencies: + '@typescript-eslint/types': 8.65.0 + '@typescript-eslint/typescript-estree': 8.65.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.65.0(eslint@10.7.0)(typescript@5.9.3) + debug: 4.4.3 + eslint: 10.7.0 + ts-api-utils: 2.5.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@8.65.0': {} + + '@typescript-eslint/typescript-estree@8.65.0(typescript@5.9.3)': + dependencies: + '@typescript-eslint/project-service': 8.65.0(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.65.0(typescript@5.9.3) + '@typescript-eslint/types': 8.65.0 + '@typescript-eslint/visitor-keys': 8.65.0 + debug: 4.4.3 + minimatch: 10.2.5 + semver: 7.8.5 + tinyglobby: 0.2.17 + ts-api-utils: 2.5.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.65.0(eslint@10.7.0)(typescript@5.9.3)': + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@10.7.0) + '@typescript-eslint/scope-manager': 8.65.0 + '@typescript-eslint/types': 8.65.0 + '@typescript-eslint/typescript-estree': 8.65.0(typescript@5.9.3) + eslint: 10.7.0 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/visitor-keys@8.65.0': + dependencies: + '@typescript-eslint/types': 8.65.0 + eslint-visitor-keys: 5.0.1 + + '@vitest/coverage-v8@4.1.10(vitest@4.1.10)': + dependencies: + '@bcoe/v8-coverage': 1.0.2 + '@vitest/utils': 4.1.10 + ast-v8-to-istanbul: 1.0.5 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-report: 3.0.1 + istanbul-reports: 3.2.0 + magicast: 0.5.3 + obug: 2.1.4 + std-env: 4.2.0 + tinyrainbow: 3.1.0 + vitest: 4.1.10(@types/node@22.20.1)(@vitest/coverage-v8@4.1.10)(vite@7.3.6(@types/node@22.20.1)(tsx@4.23.1)) + + '@vitest/expect@4.1.10': + dependencies: + '@standard-schema/spec': 1.1.0 + '@types/chai': 5.2.3 + '@vitest/spy': 4.1.10 + '@vitest/utils': 4.1.10 + chai: 6.2.2 + tinyrainbow: 3.1.0 + + '@vitest/mocker@4.1.10(vite@7.3.6(@types/node@22.20.1)(tsx@4.23.1))': + dependencies: + '@vitest/spy': 4.1.10 + estree-walker: 3.0.3 + magic-string: 0.30.21 + optionalDependencies: + vite: 7.3.6(@types/node@22.20.1)(tsx@4.23.1) + + '@vitest/pretty-format@4.1.10': + dependencies: + tinyrainbow: 3.1.0 + + '@vitest/runner@4.1.10': + dependencies: + '@vitest/utils': 4.1.10 + pathe: 2.0.3 + + '@vitest/snapshot@4.1.10': + dependencies: + '@vitest/pretty-format': 4.1.10 + '@vitest/utils': 4.1.10 + magic-string: 0.30.21 + pathe: 2.0.3 + + '@vitest/spy@4.1.10': {} + + '@vitest/utils@4.1.10': + dependencies: + '@vitest/pretty-format': 4.1.10 + convert-source-map: 2.0.0 + tinyrainbow: 3.1.0 + + accepts@2.0.0: + dependencies: + mime-types: 3.0.2 + negotiator: 1.0.0 + + acorn-jsx@5.3.2(acorn@8.17.0): + dependencies: + acorn: 8.17.0 + + acorn@8.17.0: {} + + agent-base@6.0.2: + dependencies: + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + agent-base@7.1.4: {} + + ajv-draft-04@1.0.0(ajv@8.20.0): + optionalDependencies: + ajv: 8.20.0 + + ajv@6.15.0: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ajv@8.20.0: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.1.4 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + + argparse@2.0.1: {} + + asap@2.0.6: {} + + assertion-error@2.0.1: {} + + ast-v8-to-istanbul@1.0.5: + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + estree-walker: 3.0.3 + js-tokens: 10.0.0 + + async-mutex@0.5.0: + dependencies: + tslib: 2.8.1 + + async@3.2.6: {} + + asynckit@0.4.0: {} + + axios@1.18.1: + dependencies: + follow-redirects: 1.16.0(debug@4.4.3) + form-data: 4.0.6 + https-proxy-agent: 5.0.1 + proxy-from-env: 2.1.0 + transitivePeerDependencies: + - debug + - supports-color + + b4a@1.8.1: {} + + balanced-match@4.0.4: {} + + bare-events@2.9.1: {} + + bare-fs@4.7.4: + dependencies: + bare-events: 2.9.1 + bare-path: 3.1.1 + bare-stream: 2.13.3(bare-events@2.9.1) + bare-url: 2.4.6 + fast-fifo: 1.3.2 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a + + bare-path@3.1.1: {} + + bare-stream@2.13.3(bare-events@2.9.1): + dependencies: + b4a: 1.8.1 + streamx: 2.28.0 + teex: 1.0.1 + optionalDependencies: + bare-events: 2.9.1 + transitivePeerDependencies: + - react-native-b4a + + bare-url@2.4.6: + dependencies: + bare-path: 3.1.1 + + base64-js@1.5.1: {} + + bcrypt@6.0.0: + dependencies: + node-addon-api: 8.9.0 + node-gyp-build: 4.8.4 + + body-parser@2.3.0: + dependencies: + bytes: 3.1.2 + content-type: 2.0.0 + debug: 4.4.3 + http-errors: 2.0.1 + iconv-lite: 0.7.3 + on-finished: 2.4.1 + qs: 6.15.3 + raw-body: 3.0.2 + type-is: 2.1.0 + transitivePeerDependencies: + - supports-color + + brace-expansion@5.0.7: + dependencies: + balanced-match: 4.0.4 + + brotli@1.3.3: + dependencies: + base64-js: 1.5.1 + + bson@7.3.1: {} + + buffer-equal-constant-time@1.0.1: {} + + bytes@3.1.2: {} + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + + call-me-maybe@1.0.2: {} + + camelcase@6.3.0: {} + + chai@6.2.2: {} + + cloudinary@2.10.0: + dependencies: + lodash: 4.18.1 + + color-convert@3.1.3: + dependencies: + color-name: 2.1.0 + + color-name@2.1.0: {} + + color-string@2.1.4: + dependencies: + color-name: 2.1.0 + + color@5.0.3: + dependencies: + color-convert: 3.1.3 + color-string: 2.1.4 + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + commander@6.2.0: {} + + commondir@1.0.1: {} + + component-emitter@1.3.1: {} + + compressible@2.0.18: + dependencies: + mime-db: 1.54.0 + + compression@1.8.1: + dependencies: + bytes: 3.1.2 + compressible: 2.0.18 + debug: 2.6.9 + negotiator: 0.6.4 + on-headers: 1.1.0 + safe-buffer: 5.2.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + content-disposition@1.1.0: {} + + content-type@1.0.5: {} + + content-type@2.0.0: {} + + convert-source-map@2.0.0: {} + + cookie-parser@1.4.7: + dependencies: + cookie: 0.7.2 + cookie-signature: 1.0.6 + + cookie-signature@1.0.6: {} + + cookie-signature@1.2.2: {} + + cookie@0.7.2: {} + + cookiejar@2.1.4: {} + + cors@2.8.6: + dependencies: + object-assign: 4.1.1 + vary: 1.1.2 + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + debug@2.6.9: + dependencies: + ms: 2.0.0 + + debug@4.4.3: + dependencies: + ms: 2.1.3 + + deep-is@0.1.4: {} + + delayed-stream@1.0.0: {} + + depd@2.0.0: {} + + dezalgo@1.0.4: + dependencies: + asap: 2.0.6 + wrappy: 1.0.2 + + doctrine@3.0.0: + dependencies: + esutils: 2.0.3 + + dotenv@17.4.2: {} + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + ecdsa-sig-formatter@1.0.11: + dependencies: + safe-buffer: 5.2.1 + + ee-first@1.1.1: {} + + enabled@2.0.0: {} + + encodeurl@2.0.0: {} + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-module-lexer@2.3.1: {} + + es-object-atoms@1.1.2: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.4 + + esbuild@0.28.1: + optionalDependencies: + '@esbuild/aix-ppc64': 0.28.1 + '@esbuild/android-arm': 0.28.1 + '@esbuild/android-arm64': 0.28.1 + '@esbuild/android-x64': 0.28.1 + '@esbuild/darwin-arm64': 0.28.1 + '@esbuild/darwin-x64': 0.28.1 + '@esbuild/freebsd-arm64': 0.28.1 + '@esbuild/freebsd-x64': 0.28.1 + '@esbuild/linux-arm': 0.28.1 + '@esbuild/linux-arm64': 0.28.1 + '@esbuild/linux-ia32': 0.28.1 + '@esbuild/linux-loong64': 0.28.1 + '@esbuild/linux-mips64el': 0.28.1 + '@esbuild/linux-ppc64': 0.28.1 + '@esbuild/linux-riscv64': 0.28.1 + '@esbuild/linux-s390x': 0.28.1 + '@esbuild/linux-x64': 0.28.1 + '@esbuild/netbsd-arm64': 0.28.1 + '@esbuild/netbsd-x64': 0.28.1 + '@esbuild/openbsd-arm64': 0.28.1 + '@esbuild/openbsd-x64': 0.28.1 + '@esbuild/openharmony-arm64': 0.28.1 + '@esbuild/sunos-x64': 0.28.1 + '@esbuild/win32-arm64': 0.28.1 + '@esbuild/win32-ia32': 0.28.1 + '@esbuild/win32-x64': 0.28.1 + + escape-html@1.0.3: {} + + escape-string-regexp@4.0.0: {} + + eslint-scope@9.1.2: + dependencies: + '@types/esrecurse': 4.3.1 + '@types/estree': 1.0.9 + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint-visitor-keys@5.0.1: {} + + eslint@10.7.0: + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@10.7.0) + '@eslint-community/regexpp': 4.12.2 + '@eslint/config-array': 0.23.5 + '@eslint/config-helpers': 0.6.0 + '@eslint/core': 1.2.1 + '@eslint/plugin-kit': 0.7.2 + '@humanfs/node': 0.16.8 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.4.3 + '@types/estree': 1.0.9 + ajv: 6.15.0 + cross-spawn: 7.0.6 + debug: 4.4.3 + escape-string-regexp: 4.0.0 + eslint-scope: 9.1.2 + eslint-visitor-keys: 5.0.1 + espree: 11.2.0 + esquery: 1.7.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 8.0.0 + find-up: 5.0.0 + glob-parent: 6.0.2 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + json-stable-stringify-without-jsonify: 1.0.1 + minimatch: 10.2.5 + natural-compare: 1.4.0 + optionator: 0.9.4 + transitivePeerDependencies: + - supports-color + + espree@11.2.0: + dependencies: + acorn: 8.17.0 + acorn-jsx: 5.3.2(acorn@8.17.0) + eslint-visitor-keys: 5.0.1 + + esquery@1.7.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@5.3.0: {} + + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.9 + + esutils@2.0.3: {} + + etag@1.8.1: {} + + events-universal@1.0.1: + dependencies: + bare-events: 2.9.1 + transitivePeerDependencies: + - bare-abort-controller + + expect-type@1.4.0: {} + + express-rate-limit@8.6.0(express@5.2.1): + dependencies: + debug: 4.4.3 + express: 5.2.1 + ip-address: 10.2.0 + transitivePeerDependencies: + - supports-color + + express-validator@7.3.2: + dependencies: + lodash: 4.18.1 + validator: 13.15.35 + + express@5.2.1: + dependencies: + accepts: 2.0.0 + body-parser: 2.3.0 + content-disposition: 1.1.0 + content-type: 1.0.5 + cookie: 0.7.2 + cookie-signature: 1.2.2 + debug: 4.4.3 + depd: 2.0.0 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 2.1.1 + fresh: 2.0.0 + http-errors: 2.0.1 + merge-descriptors: 2.0.0 + mime-types: 3.0.2 + on-finished: 2.4.1 + once: 1.4.0 + parseurl: 1.3.3 + proxy-addr: 2.0.7 + qs: 6.15.3 + range-parser: 1.3.0 + router: 2.2.0 + send: 1.2.1 + serve-static: 2.2.1 + statuses: 2.0.2 + type-is: 2.1.0 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + fast-deep-equal@3.1.3: {} + + fast-fifo@1.3.2: {} + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fast-safe-stringify@2.1.1: {} + + fast-sha256@1.3.0: {} + + fast-uri@3.1.4: {} + + fdir@6.5.0(picomatch@4.0.5): + optionalDependencies: + picomatch: 4.0.5 + + fecha@4.2.3: {} + + file-entry-cache@8.0.0: + dependencies: + flat-cache: 4.0.1 + + file-stream-rotator@0.6.1: + dependencies: + moment: 2.30.1 + + finalhandler@2.1.1: + dependencies: + debug: 4.4.3 + encodeurl: 2.0.0 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.2 + transitivePeerDependencies: + - supports-color + + find-cache-dir@3.3.2: + dependencies: + commondir: 1.0.1 + make-dir: 3.1.0 + pkg-dir: 4.2.0 + + find-up@4.1.0: + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + flat-cache@4.0.1: + dependencies: + flatted: 3.4.2 + keyv: 4.5.4 + + flatted@3.4.2: {} + + fn.name@1.1.0: {} + + follow-redirects@1.16.0(debug@4.4.3): + optionalDependencies: + debug: 4.4.3 + + foreground-child@3.3.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + form-data@4.0.6: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + hasown: 2.0.4 + mime-types: 2.1.35 + + formidable@3.5.4: + dependencies: + '@paralleldrive/cuid2': 2.3.1 + dezalgo: 1.0.4 + once: 1.4.0 + + forwarded@0.2.0: {} + + fresh@2.0.0: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.2 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.4 + math-intrinsics: 1.1.0 + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.2 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob@11.1.0: + dependencies: + foreground-child: 3.3.1 + jackspeak: 4.2.3 + minimatch: 10.2.5 + minipass: 7.1.3 + package-json-from-dist: 1.0.1 + path-scurry: 2.0.2 + + globals@17.7.0: {} + + gopd@1.2.0: {} + + has-flag@4.0.0: {} + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hasown@2.0.4: + dependencies: + function-bind: 1.1.2 + + helmet@8.3.0: {} + + html-escaper@2.0.2: {} + + http-errors@2.0.1: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.2 + toidentifier: 1.0.1 + + https-proxy-agent@5.0.1: + dependencies: + agent-base: 6.0.2 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + https-proxy-agent@7.0.6: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + iconv-lite@0.7.3: + dependencies: + safer-buffer: 2.1.2 + + ignore@5.3.2: {} + + ignore@7.0.6: {} + + imurmurhash@0.1.4: {} + + inherits@2.0.4: {} + + ip-address@10.2.0: {} + + ipaddr.js@1.9.1: {} + + is-extglob@2.1.1: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-promise@4.0.0: {} + + is-stream@2.0.1: {} + + isexe@2.0.0: {} + + istanbul-lib-coverage@3.2.2: {} + + istanbul-lib-report@3.0.1: + dependencies: + istanbul-lib-coverage: 3.2.2 + make-dir: 4.0.0 + supports-color: 7.2.0 + + istanbul-reports@3.2.0: + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 + + jackspeak@4.2.3: + dependencies: + '@isaacs/cliui': 9.0.0 + + js-tokens@10.0.0: {} + + js-yaml@4.3.0: + dependencies: + argparse: 2.0.1 + + json-buffer@3.0.1: {} + + json-schema-traverse@0.4.1: {} + + json-schema-traverse@1.0.0: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + jsonwebtoken@9.0.3: + dependencies: + jws: 4.0.1 + lodash.includes: 4.3.0 + lodash.isboolean: 3.0.3 + lodash.isinteger: 4.0.4 + lodash.isnumber: 3.0.3 + lodash.isplainobject: 4.0.6 + lodash.isstring: 4.0.1 + lodash.once: 4.1.1 + ms: 2.1.3 + semver: 7.8.5 + + jwa@2.0.1: + dependencies: + buffer-equal-constant-time: 1.0.1 + ecdsa-sig-formatter: 1.0.11 + safe-buffer: 5.2.1 + + jws@4.0.1: + dependencies: + jwa: 2.0.1 + safe-buffer: 5.2.1 + + kareem@3.3.0: {} + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + kuler@2.0.0: {} + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + locate-path@5.0.0: + dependencies: + p-locate: 4.1.0 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash.includes@4.3.0: {} + + lodash.isboolean@3.0.3: {} + + lodash.isinteger@4.0.4: {} + + lodash.isnumber@3.0.3: {} + + lodash.isplainobject@4.0.6: {} + + lodash.isstring@4.0.1: {} + + lodash.mergewith@4.6.2: {} + + lodash.once@4.1.1: {} + + lodash@4.18.1: {} + + logform@2.7.0: + dependencies: + '@colors/colors': 1.6.0 + '@types/triple-beam': 1.3.5 + fecha: 4.2.3 + ms: 2.1.3 + safe-stable-stringify: 2.5.0 + triple-beam: 1.4.1 + + lru-cache@11.5.2: {} + + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + magicast@0.5.3: + dependencies: + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 + source-map-js: 1.2.1 + + make-dir@3.1.0: + dependencies: + semver: 6.3.1 + + make-dir@4.0.0: + dependencies: + semver: 7.8.5 + + math-intrinsics@1.1.0: {} + + media-typer@1.1.0: {} + + memory-pager@1.5.0: {} + + merge-descriptors@2.0.0: {} + + methods@1.1.2: {} + + mime-db@1.52.0: {} + + mime-db@1.54.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mime-types@3.0.2: + dependencies: + mime-db: 1.54.0 + + mime@2.6.0: {} + + minimatch@10.2.5: + dependencies: + brace-expansion: 5.0.7 + + minipass@7.1.3: {} + + moment@2.30.1: {} + + mongodb-connection-string-url@7.0.2: + dependencies: + '@types/whatwg-url': 13.0.0 + whatwg-url: 14.2.0 + + mongodb-memory-server-core@11.2.0: + dependencies: + async-mutex: 0.5.0 + camelcase: 6.3.0 + debug: 4.4.3 + find-cache-dir: 3.3.2 + follow-redirects: 1.16.0(debug@4.4.3) + https-proxy-agent: 7.0.6 + mongodb: 7.5.0 + new-find-package-json: 2.0.0 + semver: 7.8.5 + tar-stream: 3.2.0 + tslib: 2.8.1 + yauzl: 3.4.0 + transitivePeerDependencies: + - '@aws-sdk/credential-providers' + - '@mongodb-js/zstd' + - bare-abort-controller + - bare-buffer + - gcp-metadata + - kerberos + - mongodb-client-encryption + - react-native-b4a + - snappy + - socks + - supports-color + + mongodb-memory-server@11.2.0: + dependencies: + mongodb-memory-server-core: 11.2.0 + tslib: 2.8.1 + transitivePeerDependencies: + - '@aws-sdk/credential-providers' + - '@mongodb-js/zstd' + - bare-abort-controller + - bare-buffer + - gcp-metadata + - kerberos + - mongodb-client-encryption + - react-native-b4a + - snappy + - socks + - supports-color + + mongodb@7.5.0: + dependencies: + '@mongodb-js/saslprep': 1.4.12 + bson: 7.3.1 + mongodb-connection-string-url: 7.0.2 + + mongoose@9.8.0: + dependencies: + '@standard-schema/spec': 1.1.0 + kareem: 3.3.0 + mongodb: 7.5.0 + mpath: 0.9.0 + mquery: 6.0.0 + ms: 2.1.3 + sift: 17.1.3 + transitivePeerDependencies: + - '@aws-sdk/credential-providers' + - '@mongodb-js/zstd' + - gcp-metadata + - kerberos + - mongodb-client-encryption + - snappy + - socks + + mpath@0.9.0: {} + + mquery@6.0.0: {} + + ms@2.0.0: {} + + ms@2.1.3: {} + + nanoid@3.3.16: {} + + natural-compare@1.4.0: {} + + negotiator@0.6.4: {} + + negotiator@1.0.0: {} + + new-find-package-json@2.0.0: + dependencies: + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + node-addon-api@8.9.0: {} + + node-gyp-build@4.8.4: {} + + object-assign@4.1.1: {} + + object-hash@3.0.0: {} + + object-inspect@1.13.4: {} + + obug@2.1.4: {} + + on-finished@2.4.1: + dependencies: + ee-first: 1.1.1 + + on-headers@1.1.0: {} + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + one-time@1.0.0: + dependencies: + fn.name: 1.1.0 + + openapi-types@12.1.3: {} + + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@4.1.0: + dependencies: + p-limit: 2.3.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + p-try@2.2.0: {} + + package-json-from-dist@1.0.1: {} + + parseurl@1.3.3: {} + + path-exists@4.0.0: {} + + path-key@3.1.1: {} + + path-scurry@2.0.2: + dependencies: + lru-cache: 11.5.2 + minipass: 7.1.3 + + path-to-regexp@8.4.2: {} + + pathe@2.0.3: {} + + pend@1.2.0: {} + + picocolors@1.1.1: {} + + picomatch@4.0.5: {} + + pkg-dir@4.2.0: + dependencies: + find-up: 4.1.0 + + postal-mime@2.7.5: {} + + postcss@8.5.21: + dependencies: + nanoid: 3.3.16 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + prelude-ls@1.2.1: {} + + prettier@3.9.6: {} + + proxy-addr@2.0.7: + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + + proxy-from-env@2.1.0: {} + + punycode@2.3.1: {} + + qs@6.15.3: + dependencies: + es-define-property: 1.0.1 + side-channel: 1.1.1 + + range-parser@1.3.0: {} + + raw-body@3.0.2: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.1 + iconv-lite: 0.7.3 + unpipe: 1.0.0 + + razorpay@2.9.8: + dependencies: + axios: 1.18.1 + transitivePeerDependencies: + - debug + - supports-color + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + require-from-string@2.0.2: {} + + resend@6.18.0: + dependencies: + postal-mime: 2.7.5 + standardwebhooks: 1.0.0 + + rollup@4.62.2: + dependencies: + '@types/estree': 1.0.9 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.62.2 + '@rollup/rollup-android-arm64': 4.62.2 + '@rollup/rollup-darwin-arm64': 4.62.2 + '@rollup/rollup-darwin-x64': 4.62.2 + '@rollup/rollup-freebsd-arm64': 4.62.2 + '@rollup/rollup-freebsd-x64': 4.62.2 + '@rollup/rollup-linux-arm-gnueabihf': 4.62.2 + '@rollup/rollup-linux-arm-musleabihf': 4.62.2 + '@rollup/rollup-linux-arm64-gnu': 4.62.2 + '@rollup/rollup-linux-arm64-musl': 4.62.2 + '@rollup/rollup-linux-loong64-gnu': 4.62.2 + '@rollup/rollup-linux-loong64-musl': 4.62.2 + '@rollup/rollup-linux-ppc64-gnu': 4.62.2 + '@rollup/rollup-linux-ppc64-musl': 4.62.2 + '@rollup/rollup-linux-riscv64-gnu': 4.62.2 + '@rollup/rollup-linux-riscv64-musl': 4.62.2 + '@rollup/rollup-linux-s390x-gnu': 4.62.2 + '@rollup/rollup-linux-x64-gnu': 4.62.2 + '@rollup/rollup-linux-x64-musl': 4.62.2 + '@rollup/rollup-openbsd-x64': 4.62.2 + '@rollup/rollup-openharmony-arm64': 4.62.2 + '@rollup/rollup-win32-arm64-msvc': 4.62.2 + '@rollup/rollup-win32-ia32-msvc': 4.62.2 + '@rollup/rollup-win32-x64-gnu': 4.62.2 + '@rollup/rollup-win32-x64-msvc': 4.62.2 + fsevents: 2.3.3 + + router@2.2.0: + dependencies: + debug: 4.4.3 + depd: 2.0.0 + is-promise: 4.0.0 + parseurl: 1.3.3 + path-to-regexp: 8.4.2 + transitivePeerDependencies: + - supports-color + + safe-buffer@5.2.1: {} + + safe-stable-stringify@2.5.0: {} + + safer-buffer@2.1.2: {} + + semver@6.3.1: {} + + semver@7.8.5: {} + + send@1.2.1: + dependencies: + debug: 4.4.3 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 2.0.0 + http-errors: 2.0.1 + mime-types: 3.0.2 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.3.0 + statuses: 2.0.2 + transitivePeerDependencies: + - supports-color + + serve-static@2.2.1: + dependencies: + encodeurl: 2.0.0 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 1.2.1 + transitivePeerDependencies: + - supports-color + + setprototypeof@1.2.0: {} + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + side-channel-list@1.0.1: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + + side-channel@1.1.1: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.1 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + + sift@17.1.3: {} + + siginfo@2.0.0: {} + + signal-exit@4.1.0: {} + + source-map-js@1.2.1: {} + + sparse-bitfield@3.0.3: + dependencies: + memory-pager: 1.5.0 + + stack-trace@0.0.10: {} + + stackback@0.0.2: {} + + standardwebhooks@1.0.0: + dependencies: + '@stablelib/base64': 1.0.1 + fast-sha256: 1.3.0 + + statuses@2.0.2: {} + + std-env@4.2.0: {} + + streamx@2.28.0: + dependencies: + events-universal: 1.0.1 + fast-fifo: 1.3.2 + text-decoder: 1.2.7 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + superagent@10.3.0: + dependencies: + component-emitter: 1.3.1 + cookiejar: 2.1.4 + debug: 4.4.3 + fast-safe-stringify: 2.1.1 + form-data: 4.0.6 + formidable: 3.5.4 + methods: 1.1.2 + mime: 2.6.0 + qs: 6.15.3 + transitivePeerDependencies: + - supports-color + + supertest@7.2.2: + dependencies: + cookie-signature: 1.2.2 + methods: 1.1.2 + superagent: 10.3.0 + transitivePeerDependencies: + - supports-color + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + swagger-jsdoc@6.3.0(openapi-types@12.1.3): + dependencies: + '@apidevtools/swagger-parser': 12.1.0(openapi-types@12.1.3) + commander: 6.2.0 + doctrine: 3.0.0 + glob: 11.1.0 + lodash.mergewith: 4.6.2 + yaml: 2.0.0-1 + transitivePeerDependencies: + - openapi-types + + swagger-ui-dist@5.32.10: + dependencies: + '@scarf/scarf': 1.4.0 + + swagger-ui-express@5.0.1(express@5.2.1): + dependencies: + express: 5.2.1 + swagger-ui-dist: 5.32.10 + + tar-stream@3.2.0: + dependencies: + b4a: 1.8.1 + bare-fs: 4.7.4 + fast-fifo: 1.3.2 + streamx: 2.28.0 + transitivePeerDependencies: + - bare-abort-controller + - bare-buffer + - react-native-b4a + + teex@1.0.1: + dependencies: + streamx: 2.28.0 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a + + text-decoder@1.2.7: + dependencies: + b4a: 1.8.1 + transitivePeerDependencies: + - react-native-b4a + + text-hex@1.0.0: {} + + tinybench@2.9.0: {} + + tinyexec@1.2.4: {} + + tinyglobby@0.2.17: + dependencies: + fdir: 6.5.0(picomatch@4.0.5) + picomatch: 4.0.5 + + tinyrainbow@3.1.0: {} + + toidentifier@1.0.1: {} + + tr46@5.1.1: + dependencies: + punycode: 2.3.1 + + triple-beam@1.4.1: {} + + ts-api-utils@2.5.0(typescript@5.9.3): + dependencies: + typescript: 5.9.3 + + tslib@2.8.1: {} + + tsx@4.23.1: + dependencies: + esbuild: 0.28.1 + optionalDependencies: + fsevents: 2.3.3 + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + type-is@2.1.0: + dependencies: + content-type: 2.0.0 + media-typer: 1.1.0 + mime-types: 3.0.2 + + typescript-eslint@8.65.0(eslint@10.7.0)(typescript@5.9.3): + dependencies: + '@typescript-eslint/eslint-plugin': 8.65.0(@typescript-eslint/parser@8.65.0(eslint@10.7.0)(typescript@5.9.3))(eslint@10.7.0)(typescript@5.9.3) + '@typescript-eslint/parser': 8.65.0(eslint@10.7.0)(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.65.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.65.0(eslint@10.7.0)(typescript@5.9.3) + eslint: 10.7.0 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + typescript@5.9.3: {} + + undici-types@6.21.0: {} + + unpipe@1.0.0: {} + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + util-deprecate@1.0.2: {} + + validator@13.15.35: {} + + vary@1.1.2: {} + + vite@7.3.6(@types/node@22.20.1)(tsx@4.23.1): + dependencies: + esbuild: 0.28.1 + fdir: 6.5.0(picomatch@4.0.5) + picomatch: 4.0.5 + postcss: 8.5.21 + rollup: 4.62.2 + tinyglobby: 0.2.17 + optionalDependencies: + '@types/node': 22.20.1 + fsevents: 2.3.3 + tsx: 4.23.1 + + vitest@4.1.10(@types/node@22.20.1)(@vitest/coverage-v8@4.1.10)(vite@7.3.6(@types/node@22.20.1)(tsx@4.23.1)): + dependencies: + '@vitest/expect': 4.1.10 + '@vitest/mocker': 4.1.10(vite@7.3.6(@types/node@22.20.1)(tsx@4.23.1)) + '@vitest/pretty-format': 4.1.10 + '@vitest/runner': 4.1.10 + '@vitest/snapshot': 4.1.10 + '@vitest/spy': 4.1.10 + '@vitest/utils': 4.1.10 + es-module-lexer: 2.3.1 + expect-type: 1.4.0 + magic-string: 0.30.21 + obug: 2.1.4 + pathe: 2.0.3 + picomatch: 4.0.5 + std-env: 4.2.0 + tinybench: 2.9.0 + tinyexec: 1.2.4 + tinyglobby: 0.2.17 + tinyrainbow: 3.1.0 + vite: 7.3.6(@types/node@22.20.1)(tsx@4.23.1) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 22.20.1 + '@vitest/coverage-v8': 4.1.10(vitest@4.1.10) + transitivePeerDependencies: + - msw + + webidl-conversions@7.0.0: {} + + whatwg-url@14.2.0: + dependencies: + tr46: 5.1.1 + webidl-conversions: 7.0.0 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + why-is-node-running@2.3.0: + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + + winston-daily-rotate-file@5.0.0(winston@3.19.0): + dependencies: + file-stream-rotator: 0.6.1 + object-hash: 3.0.0 + triple-beam: 1.4.1 + winston: 3.19.0 + winston-transport: 4.9.0 + + winston-transport@4.9.0: + dependencies: + logform: 2.7.0 + readable-stream: 3.6.2 + triple-beam: 1.4.1 + + winston@3.19.0: + dependencies: + '@colors/colors': 1.6.0 + '@dabh/diagnostics': 2.0.8 + async: 3.2.6 + is-stream: 2.0.1 + logform: 2.7.0 + one-time: 1.0.0 + readable-stream: 3.6.2 + safe-stable-stringify: 2.5.0 + stack-trace: 0.0.10 + triple-beam: 1.4.1 + winston-transport: 4.9.0 + + word-wrap@1.2.5: {} + + wrappy@1.0.2: {} + + yaml@2.0.0-1: {} + + yauzl@3.4.0: + dependencies: + pend: 1.2.0 + + yocto-queue@0.1.0: {} + + zod@4.4.3: {} diff --git a/server/pnpm-workspace.yaml b/server/pnpm-workspace.yaml new file mode 100644 index 0000000000..83663413a8 --- /dev/null +++ b/server/pnpm-workspace.yaml @@ -0,0 +1,5 @@ +onlyBuiltDependencies: + - '@scarf/scarf' + - bcrypt + - esbuild + - mongodb-memory-server diff --git a/server/public/images/bmv-logo.png b/server/public/images/bmv-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..4e77f83291420a29e695626787db84eb6056aa5a GIT binary patch literal 732315 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

q!lNTiG(QlR1M=a`Y#4vwD-#v7|L=s77H2 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

Kz5UB>z2QZb9}5E9W}(ut;(Qax>SqGtn6jpYY*_ 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

?I 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 OApSd%EJQP=)cMf*Az2p2%U(^ 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 O0000 { + res.setHeader('Cache-Control', 'no-store, no-cache, must-revalidate, proxy-revalidate'); + res.setHeader('Pragma', 'no-cache'); + res.setHeader('Expires', '0'); + next(); +}); + +// HTTP request logging +app.use(requestLogger); + +// Router +app.use('/api/v1', router); + +// 404 Handler +app.use((_req: Request, res: Response) => { + ResponseUtil.notFound(res, 'Route/Method not found'); +}); + +// Global error handler +app.use((err: Error, _req: Request, res: Response, _next: NextFunction) => { + logError('Unhandled Express error', { error: err.message, stack: err.stack }); + ResponseUtil.internalServerError(res, 'Internal server error'); +}); + +export { app }; diff --git a/server/src/configs/cors.config.ts b/server/src/configs/cors.config.ts new file mode 100644 index 0000000000..b947184dc2 --- /dev/null +++ b/server/src/configs/cors.config.ts @@ -0,0 +1,32 @@ +import type { CorsOptions } from 'cors'; +import { nodeEnv } from '../constants/env'; + +function parseOrigins(env: string | undefined, fallback: string[]): string[] { + if (!env) return fallback; + const origins = env + .split(',') + .map((s) => s.trim()) + .filter(Boolean); + for (const o of origins) { + const u = new URL(o); + if (u.protocol !== 'https:' && nodeEnv === 'production') { + throw new Error(`Non-HTTPS CORS origin in production: ${o}`); + } + } + return origins; +} + +export const corsOptions: CorsOptions = { + origin: + nodeEnv === 'production' + ? parseOrigins(process.env.CLIENT_URL, ['https://bookmyvenue.com']) + : parseOrigins(process.env.CLIENT_URL, [ + 'https://bmvserver.shares.zrok.io', + 'http://localhost:5173', + 'http://localhost:3000', + 'http://localhost:5174', + 'http://localhost:3001', + ]), + credentials: true, + optionsSuccessStatus: 204, +}; diff --git a/server/src/configs/database.config.ts b/server/src/configs/database.config.ts new file mode 100644 index 0000000000..b0757cf8d9 --- /dev/null +++ b/server/src/configs/database.config.ts @@ -0,0 +1,55 @@ +import mongoose from 'mongoose'; +import { logInfo, logError } from '../utils/logger'; + +export let dbSupportsTransactions = false; + +export const connectDatabase = async (): Promise => { + const mongodburi = process.env.MONGODB_URI; + + if (!mongodburi) { + logError('MONGODB_URI environment variable is not set', { + module: 'database.config.ts/connectDatabase', + }); + process.exit(1); + } + + try { + const connection = await mongoose.connect(mongodburi, { + autoIndex: process.env.NODE_ENV !== 'production', + }); + logInfo('DB connected'); + + const client = mongoose.connection.getClient(); + const topologyType = (client as unknown as { topology?: { description?: { type?: string } } }) + .topology?.description?.type; + dbSupportsTransactions = + typeof topologyType === 'string' && + (topologyType.includes('ReplicaSet') || topologyType.includes('Sharded')); + + logInfo('DB topology details', { + topology: topologyType ?? 'unknown', + txSupported: dbSupportsTransactions, + }); + + return connection; + } catch (error) { + logError('Failed to connect to MongoDB', { + module: 'database.config.ts/connectDatabase', + error: (error as Error).message, + }); + process.exit(1); + } +}; + +export const disconnectDatabase = async (): Promise => { + try { + await mongoose.disconnect(); + logInfo('Disconnected from MongoDB'); + } catch (error) { + logError('Failed to disconnect from MongoDB', { + module: 'database.config.ts/disconnectDatabase', + error: (error as Error).message, + }); + process.exit(1); + } +}; diff --git a/server/src/configs/envValidation.config.ts b/server/src/configs/envValidation.config.ts new file mode 100644 index 0000000000..fe0a93e760 --- /dev/null +++ b/server/src/configs/envValidation.config.ts @@ -0,0 +1,37 @@ +import { z } from 'zod'; +import { logError, logInfo } from '../utils/logger'; +import { nodeEnv } from '../constants/env'; + +const envSchema = z.object({ + MONGODB_URI: z.string().min(1, 'MONGODB_URI is required'), + JWT_ACCESS_SECRET: z.string().min(1, 'JWT_ACCESS_SECRET is required'), + JWT_REFRESH_SECRET: z.string().min(1, 'JWT_REFRESH_SECRET is required'), + JWT_ISSUER: z.string().min(1, 'JWT_ISSUER is required'), + JWT_AUDIENCE: z.string().min(1, 'JWT_AUDIENCE is required'), + RAZORPAY_KEY_ID: z.string().min(1, 'RAZORPAY_KEY_ID is required'), + RAZORPAY_KEY_SECRET: z.string().min(1, 'RAZORPAY_KEY_SECRET is required'), + RESEND_API_KEY: z.string().min(1, 'RESEND_API_KEY is required'), + PORT: z.coerce.number().positive().optional(), +}); + +const productionEnvSchema = envSchema.extend({ + SWAGGER_USER: z.string().min(1, 'SWAGGER_USER is required in production'), + SWAGGER_PASS: z.string().min(1, 'SWAGGER_PASS is required in production'), +}); + +export function validateEnv(): void { + const schema = nodeEnv === 'production' ? productionEnvSchema : envSchema; + const result = schema.safeParse(process.env); + + if (!result.success) { + const errorMessages: string[] = []; + for (const issue of result.error.issues) { + const path = issue.path.length > 0 ? String(issue.path[0]) : 'unknown'; + errorMessages.push(`${path}: ${issue.message}`); + } + logError('Environment validation failed', { errors: errorMessages }); + process.exit(1); + } + + logInfo('Env validated'); +} diff --git a/server/src/constants/auth.constants.ts b/server/src/constants/auth.constants.ts new file mode 100644 index 0000000000..31ceead022 --- /dev/null +++ b/server/src/constants/auth.constants.ts @@ -0,0 +1,26 @@ +export const TokenRevocationReason = { + ADMIN_REVOKED: 'admin:revoked', + EXPIRED: 'system:expired', + INVALID: 'system:invalid', + PASSWORD_CHANGED: 'system:password_changed', + PASSWORD_REUSE_ATTEMPT: 'system:password_reuse_attempt', + SECURITY_BREACH: 'admin:security_breach', + SUSPICIOUS_ACTIVITY: 'system:suspicious_activity', + TOKEN_ROTATION: 'system:token_rotation', + USER_LOGIN: 'system:user_login', + USER_LOGOUT: 'user:manual_logout', + USER_REVOKED: 'user:revoked', +} as const; + +export type TokenRevocationReasonType = + (typeof TokenRevocationReason)[keyof typeof TokenRevocationReason]; + +export const AuthConstants = { + MAX_ACTIVE_TOKENS: 3, + MAX_EMAILS_PER_HR: 5, + MAX_REQUESTS_PER_HR: 10, + RESEND_COOLDOWN_MS: 30 * 1000, // 30s + TOKEN_EXPIRY_MS: 15 * 60 * 1000, //15mins + SESSION_ABSOLUTE_EXPIRY_MS: 30 * 24 * 60 * 60 * 1000, // 30d + NEW_SESSION_REVOKE_LOCK_MS: 48 * 60 * 60 * 1000, // 48h +} as const; diff --git a/server/src/constants/booking.constants.ts b/server/src/constants/booking.constants.ts new file mode 100644 index 0000000000..2546ab26ff --- /dev/null +++ b/server/src/constants/booking.constants.ts @@ -0,0 +1,8 @@ +export type BookingStatusType = (typeof BookingStatus)[keyof typeof BookingStatus]; + +export const BookingStatus = { + CONFIRMED: 'confirmed', + CANCELLED: 'cancelled', + COMPLETED: 'completed', + IN_PROGRESS: 'in_progress', +} as const; diff --git a/server/src/constants/common.ts b/server/src/constants/common.ts new file mode 100644 index 0000000000..e69de29bb2 diff --git a/server/src/constants/email.constants.ts b/server/src/constants/email.constants.ts new file mode 100644 index 0000000000..c68720c287 --- /dev/null +++ b/server/src/constants/email.constants.ts @@ -0,0 +1,36 @@ +export type EmailIntentType = (typeof EmailIntent)[keyof typeof EmailIntent]; +export type EmailTaskStatusType = (typeof EmailTaskStatus)[keyof typeof EmailTaskStatus]; + +export const EmailIntent = { + ACCOUNT_NOTIFICATION: 'account_notification', + EMAIL_VERIFICATION: 'email_verification', + PASSWORD_RESET: 'password_reset', + ADMIN_PASSWORD_RESET: 'admin_password_reset', + SECURITY_ALERT: 'security_alert', + WELCOME: 'welcome', + BOOKING_CONFIRMATION: 'booking_confirmation', + BOOKING_REFUND: 'booking_refund', + BOOKING_CANCELLATION: 'booking_cancellation', + VENUE_APPROVED: 'venue_approved', + VENUE_REJECTED: 'venue_rejected', + VENUE_SUSPENDED: 'venue_suspended', + VENUE_UNSUSPENDED: 'venue_unsuspended', + VENUE_DEADLINE_EXTENDED: 'venue_deadline_extended', + USER_BANNED: 'user_banned', + USER_UNBANNED: 'user_unbanned', + REVIEW_REMOVED: 'review_removed', + REVIEW_RESTORED: 'review_restored', +} as const; + +export const EmailTaskStatus = { + COMPLETED: 'completed', + FAILED: 'failed', + PENDING: 'pending', + QUEUED: 'queued', +} as const; + +export const EmailConstants = { + MAX_RETRIES: 3, + POLL_INTERVAL_MS: 5000, // 5 seconds + STALE_CUTOFF_MS: 5 * 60 * 1000, // 5 minutes +} as const; diff --git a/server/src/constants/env.ts b/server/src/constants/env.ts new file mode 100644 index 0000000000..4c40d923f6 --- /dev/null +++ b/server/src/constants/env.ts @@ -0,0 +1,79 @@ +import type jwt from 'jsonwebtoken'; + +export const nodeEnv = process.env.NODE_ENV ?? 'development'; + +export const resendConfig = { + get apiKey(): string | undefined { + return process.env.RESEND_API_KEY; + }, + get fromName(): string | undefined { + return process.env.EMAIL_FROM_NAME; + }, + get fromEmail(): string | undefined { + return process.env.EMAIL_FROM_EMAIL; + }, + get devToEmail(): string | undefined { + return process.env.RESEND_DEV_RECIPIENT; + }, + get appName(): string { + return process.env.APP_NAME ?? 'BookMyVenue'; + }, + get frontendUrl(): string | undefined { + return process.env.FRONTEND_URL; + }, + get serverUrl(): string { + return process.env.SERVER_URL ?? 'http://localhost:3003'; + }, + get logoUrl(): string { + const base = process.env.SERVER_URL ?? 'http://localhost:3003'; + return `${base}/images/bmv-logo.png`; + }, +}; + +export const jwtConfig = { + get issuer(): string { + return process.env.JWT_ISSUER ?? 'BookMyVenue'; + }, + get audience(): string { + return process.env.JWT_AUDIENCE ?? 'BookMyVenue'; + }, + get algorithm(): jwt.Algorithm { + return (process.env.JWT_ALGORITHM ?? 'HS256') as jwt.Algorithm; + }, +}; + +export const razorpayConfig = { + get keyId(): string | undefined { + return process.env.RAZORPAY_KEY_ID; + }, + get keySecret(): string | undefined { + return process.env.RAZORPAY_KEY_SECRET; + }, + get webhookSecret(): string | undefined { + return process.env.RAZORPAY_WEBHOOK_SECRET; + }, +}; + +export const authEnvs = { + get accessTokenExpiry(): string { + return process.env.ACCESS_TOKEN_EXPIRY ?? '30m'; + }, + get refreshTokenExpiry(): string { + return process.env.REFRESH_TOKEN_EXPIRY ?? '7d'; + }, + get accessTokenSecret(): string | undefined { + return process.env.JWT_ACCESS_SECRET; + }, + get refreshTokenSecret(): string | undefined { + return process.env.JWT_REFRESH_SECRET; + }, +}; + +export const swaggerConfig = { + get user(): string | undefined { + return process.env.SWAGGER_USER; + }, + get pass(): string | undefined { + return process.env.SWAGGER_PASS; + }, +}; diff --git a/server/src/constants/payment.constants.ts b/server/src/constants/payment.constants.ts new file mode 100644 index 0000000000..59656e58e9 --- /dev/null +++ b/server/src/constants/payment.constants.ts @@ -0,0 +1,6 @@ +export const PaymentStatus = { + PENDING: 'pending', + PAID: 'paid', + REFUNDED: 'refunded', +} as const; +export type PaymentStatusType = (typeof PaymentStatus)[keyof typeof PaymentStatus]; diff --git a/server/src/constants/permissions.ts b/server/src/constants/permissions.ts new file mode 100644 index 0000000000..6bf0ff4198 --- /dev/null +++ b/server/src/constants/permissions.ts @@ -0,0 +1,101 @@ +export const ActionEnum = [ + 'create', + 'read', + 'update', + 'delete', + 'approve', + 'reject', + 'activate', + 'deactivate', +] as const; + +export const EntityEnum = [ + 'users', + 'venues', + 'bookings', + 'roles', + 'permissions', + 'payments', + 'reviews', + 'wishlist', +] as const; + +export type IAction = (typeof ActionEnum)[number]; +export type IEntity = (typeof EntityEnum)[number]; +export type IPermission = `${IAction}:${IEntity}`; + +export const PERMISSIONS = { + users: { + create: 'create:users' as IPermission, + read: 'read:users' as IPermission, + update: 'update:users' as IPermission, + delete: 'delete:users' as IPermission, + activate: 'activate:users' as IPermission, + deactivate: 'deactivate:users' as IPermission, + }, + venues: { + create: 'create:venues' as IPermission, + read: 'read:venues' as IPermission, + update: 'update:venues' as IPermission, + delete: 'delete:venues' as IPermission, + activate: 'activate:venues' as IPermission, + deactivate: 'deactivate:venues' as IPermission, + }, + bookings: { + create: 'create:bookings' as IPermission, + read: 'read:bookings' as IPermission, + update: 'update:bookings' as IPermission, + delete: 'delete:bookings' as IPermission, + approve: 'approve:bookings' as IPermission, + reject: 'reject:bookings' as IPermission, + activate: 'activate:bookings' as IPermission, + deactivate: 'deactivate:bookings' as IPermission, + }, + roles: { + create: 'create:roles' as IPermission, + read: 'read:roles' as IPermission, + update: 'update:roles' as IPermission, + delete: 'delete:roles' as IPermission, + activate: 'activate:roles' as IPermission, + deactivate: 'deactivate:roles' as IPermission, + }, + permissions: { + create: 'create:permissions' as IPermission, + read: 'read:permissions' as IPermission, + update: 'update:permissions' as IPermission, + delete: 'delete:permissions' as IPermission, + activate: 'activate:permissions' as IPermission, + deactivate: 'deactivate:permissions' as IPermission, + }, + payments: { + create: 'create:payments' as IPermission, + read: 'read:payments' as IPermission, + update: 'update:payments' as IPermission, + delete: 'delete:payments' as IPermission, + approve: 'approve:payments' as IPermission, + reject: 'reject:payments' as IPermission, + activate: 'activate:payments' as IPermission, + deactivate: 'deactivate:payments' as IPermission, + }, + reviews: { + create: 'create:reviews' as IPermission, + read: 'read:reviews' as IPermission, + update: 'update:reviews' as IPermission, + delete: 'delete:reviews' as IPermission, + }, + wishlist: { + create: 'create:wishlist' as IPermission, + read: 'read:wishlist' as IPermission, + delete: 'delete:wishlist' as IPermission, + }, +} as const; + +// Static reference map — lowest priority number = highest rank. +// Runtime inheritance is resolved dynamically via $graphLookup, not this map. +// Extend this when new roles are added to the DB. +export const ROLE_HIERARCHY: Record = { + superAdmin: ['superAdmin', 'admin', 'owner', 'user'], + admin: ['admin', 'owner', 'user'], + owner: ['owner', 'user'], + user: ['user'], +}; diff --git a/server/src/constants/venue.constants.ts b/server/src/constants/venue.constants.ts new file mode 100644 index 0000000000..20f8d36349 --- /dev/null +++ b/server/src/constants/venue.constants.ts @@ -0,0 +1,91 @@ +import type { IVenue } from '../modules/venue/venue.types'; + +export const VenueStatusEnum = [ + 'Draft', + 'PendingReview', + 'Approved', + 'Rejected', + 'Suspended', + 'Inactive', +] as const; + +export const ReviewIntent = { + CREATION: 'creation', + RESUBMISSION: 'resubmission', + VENUE_EDIT: 'venue_edit', + INACTIVITY_REQUEST: 'inactivity_request', + INACTIVITY_WITHDRAWAL: 'inactivity_withdrawal', + DELETION_REQUEST: 'deletion_request', +} as const; + +export type ReviewIntentType = (typeof ReviewIntent)[keyof typeof ReviewIntent]; + +export const INACTIVITY_COOLDOWN_DAYS = 15; +export const IDEMPOTENCY_TTL_MS = 24 * 60 * 60 * 1000; + +export const KERALA_DISTRICTS = [ + 'Thiruvananthapuram', + 'Kollam', + 'Pathanamthitta', + 'Alappuzha', + 'Kottayam', + 'Idukki', + 'Ernakulam', + 'Thrissur', + 'Palakkad', + 'Malappuram', + 'Kozhikode', + 'Wayanad', + 'Kannur', + 'Kasaragod', +] as const; + +export const VenueFields = [ + 'name', + 'description', + 'venueType', + 'address', + 'city', + 'district', + 'pincode', + 'googleMapsUrl', + 'spaceAttributes', + 'seatingConfigurations', + 'maxCapacity', + 'bookingType', + 'fixedPackages', + 'workingDays', + 'workingHours', + 'flexibleBooking', + 'pricing', + 'blockedTimes', + 'blockedDates', + 'amenities', + 'coverImage', + 'galleryImages', + 'contact', + 'cancellation', +] as const; + +// Required Fields for Submission + +export const SUBMISSION_REQUIRED_FIELDS: (keyof IVenue)[] = [ + 'name', + 'description', + 'venueType', + 'address', + 'city', + 'district', + 'pincode', + 'bookingType', + 'cancellation', + 'contact', + 'coverImage', +]; + +export const VENUE_CONSTANTS = { + MAX_SUBMISSION_ATTEMPTS: 10, + EDIT_WINDOW_DAYS: 30, + MAX_EXTENDED_DAYS: 120, + AUTO_SUSPEND_REASON: 'Auto-suspended: Owner did not resubmit within 30 days after rejection', +} as const; diff --git a/server/src/middlewares/auth.middleware.ts b/server/src/middlewares/auth.middleware.ts new file mode 100644 index 0000000000..5e09e980bc --- /dev/null +++ b/server/src/middlewares/auth.middleware.ts @@ -0,0 +1,242 @@ +import type { NextFunction, Request, Response } from 'express'; +import jwt from 'jsonwebtoken'; +import mongoose from 'mongoose'; +import type { RefreshTokenPayload, TokenPayload } from '../types/express'; +import { ResponseUtil } from '../utils/responseUtils'; +import * as authRepo from '../modules/auth/auth.repository'; +import { tokenVerifyOptions, revokeTokenFamily } from '../utils/tokenUtils'; +import { TokenRevocationReason } from '../constants/auth.constants'; +import crypto from 'crypto'; +import { logWarn, logError } from '../utils/logger'; + +export const verifyAccessToken = (req: Request, res: Response, next: NextFunction): void => { + try { + const accessToken = req.cookies.accessToken as string | undefined; + + if (!accessToken) { + logWarn('Access token missing', { path: req.path, method: req.method }); + ResponseUtil.unauthorized(res, 'Access token required'); + return; + } + + const accessSecret = process.env.JWT_ACCESS_SECRET; + if (!accessSecret) { + logError('JWT_ACCESS_SECRET not configured', { + module: 'auth.middleware.ts/verifyAccessToken', + path: req.path, + }); + ResponseUtil.internalServerError(res, 'Server configuration error'); + return; + } + + const decoded = jwt.verify(accessToken, accessSecret, tokenVerifyOptions) as TokenPayload; + + if (!decoded.id || !decoded.username || !decoded.email) { + logWarn('Invalid access token payload', { path: req.path }); + ResponseUtil.unauthorized(res, 'Invalid access token'); + return; + } + + req.user = { + userId: decoded.id, + username: decoded.username, + email: decoded.email, + role: {}, + }; + + next(); + } catch (error) { + const authError = error as Error; + logWarn('Access token verification failed', { + error: authError.message, + path: req.path, + }); + + if (authError.name === 'TokenExpiredError') { + ResponseUtil.unauthorized(res, 'Access token expired'); + return; + } + + ResponseUtil.unauthorized(res, 'Invalid access token'); + } +}; + +export const verifyAccessTokenOptional = ( + req: Request, + _res: Response, + next: NextFunction +): void => { + try { + const accessToken = req.cookies.accessToken as string | undefined; + + if (!accessToken) { + next(); + return; + } + + const accessSecret = process.env.JWT_ACCESS_SECRET; + if (!accessSecret) { + logError('JWT_ACCESS_SECRET not configured', { + module: 'auth.middleware.ts/verifyAccessTokenOptional', + path: req.path, + }); + next(); + return; + } + + const decoded = jwt.verify(accessToken, accessSecret, tokenVerifyOptions) as TokenPayload; + + if (decoded.id && decoded.username && decoded.email) { + req.user = { + userId: decoded.id, + username: decoded.username, + email: decoded.email, + role: {}, + }; + } + + next(); + } catch (error) { + const authError = error as Error; + logWarn('Optional access token verification failed', { + error: authError.message, + path: req.path, + }); + next(); + } +}; + +export const verifyRefreshToken = async ( + req: Request, + res: Response, + next: NextFunction +): Promise => { + try { + const refreshToken = req.cookies.refreshToken as string | undefined; + + if (!refreshToken) { + logWarn('Refresh token missing', { path: req.path }); + ResponseUtil.unauthorized(res, 'Refresh token required'); + return; + } + + const refreshSecret = process.env.JWT_REFRESH_SECRET; + if (!refreshSecret) { + logError('JWT_REFRESH_SECRET not configured', { + module: 'auth.middleware.ts/verifyRefreshToken', + path: req.path, + }); + ResponseUtil.internalServerError(res, 'Server configuration error'); + return; + } + + const decoded = jwt.verify( + refreshToken, + refreshSecret, + tokenVerifyOptions + ) as RefreshTokenPayload; + + if (!decoded.id || !decoded.jti) { + logWarn('Invalid refresh token payload', { path: req.path }); + ResponseUtil.unauthorized(res, 'Invalid refresh token'); + return; + } + + const tokenHash = crypto.createHash('sha256').update(decoded.jti).digest('hex'); + + const storedToken = await authRepo.findRefreshTokenByHash( + tokenHash, + new mongoose.Types.ObjectId(decoded.id) + ); + + if (!storedToken) { + logWarn('Refresh token not found', { path: req.path }); + ResponseUtil.unauthorized(res, 'Invalid refresh token'); + return; + } + + if (storedToken.expiresAt < new Date()) { + logWarn('Refresh token expired', { path: req.path }); + ResponseUtil.unauthorized(res, 'Refresh token expired, please login again'); + return; + } + + // Reuse detection + if (!storedToken.active) { + logWarn('Refresh token reuse detected — revoking entire token family', { + path: req.path, + rootTokenId: storedToken.rootTokenId.toString(), + userId: decoded.id, + }); + + await revokeTokenFamily( + storedToken.rootTokenId, + TokenRevocationReason.SUSPICIOUS_ACTIVITY + ).catch((err: unknown) => { + const error = err as Error; + logError('Failed to revoke token family on reuse detection', { + module: 'auth.middleware.ts/verifyRefreshToken', + error: error.message, + rootTokenId: storedToken.rootTokenId.toString(), + }); + }); + + await authRepo + .deactivateSessionByRootTokenId(storedToken.rootTokenId.toString()) + .catch((err: unknown) => { + const error = err as Error; + logError('Failed to deactivate session on reuse detection', { + module: 'auth.middleware.ts/verifyRefreshToken', + error: error.message, + rootTokenId: storedToken.rootTokenId.toString(), + }); + }); + + ResponseUtil.unauthorized(res, 'Invalid refresh token'); + return; + } + + // Session validation + const session = await authRepo.findSessionByRootTokenId(storedToken.rootTokenId); + + if (!session) { + logWarn('Session not found for refresh token', { path: req.path }); + ResponseUtil.unauthorized(res, 'Invalid refresh token'); + return; + } + + if (!session.active) { + logWarn('Session is inactive', { path: req.path }); + ResponseUtil.unauthorized(res, 'Session has been terminated, please log in again'); + return; + } + + if (session.absoluteExpiresAt < new Date()) { + logWarn('Session absolute expiry reached', { path: req.path }); + ResponseUtil.unauthorized(res, 'Session expired, please log in again'); + return; + } + + req.token = { + decoded: { + id: decoded.id, + jti: decoded.jti, + }, + stored: storedToken, + }; + + next(); + } catch (error) { + const authError = error as Error; + logWarn('Refresh token verification failed', { + error: authError.message, + }); + + if (authError.name === 'TokenExpiredError') { + ResponseUtil.unauthorized(res, 'Refresh token expired'); + return; + } + + ResponseUtil.unauthorized(res, 'Invalid refresh token'); + } +}; diff --git a/server/src/middlewares/idempotency.middleware.ts b/server/src/middlewares/idempotency.middleware.ts new file mode 100644 index 0000000000..13542d090c --- /dev/null +++ b/server/src/middlewares/idempotency.middleware.ts @@ -0,0 +1,43 @@ +import type { NextFunction, Request, Response } from 'express'; +import { IdempotencyKeyModel } from '../models/idempotency-key.model'; +import { logWarn } from '../utils/logger'; + +export function idempotencyMiddleware() { + return async (req: Request, res: Response, next: NextFunction): Promise => { + const key = req.headers['idempotency-key'] as string; + if (!key) { + next(); + return; + } + + try { + const existing = await IdempotencyKeyModel.findOne({ key }).lean().exec(); + if (existing) { + logWarn('Idempotency key replay', { key, path: req.path }); + res.status(existing.response.status).json(existing.response.body); + return; + } + + const originalJson = res.json.bind(res); + res.json = (async function (body: unknown): Promise { + if (res.statusCode < 500) { + try { + await IdempotencyKeyModel.create({ + key, + response: { status: res.statusCode, body }, + createdAt: new Date(), + }); + } catch (err: unknown) { + logWarn('Failed to cache idempotency key', { key, error: err }); + } + } + return originalJson(body); + } as unknown) as typeof res.json; + + next(); + } catch (err) { + logWarn('Idempotency middleware error', { key, error: err }); + next(); + } + }; +} diff --git a/server/src/middlewares/ownerTenant.middleware.ts b/server/src/middlewares/ownerTenant.middleware.ts new file mode 100644 index 0000000000..2472ca0a9e --- /dev/null +++ b/server/src/middlewares/ownerTenant.middleware.ts @@ -0,0 +1,31 @@ +import type { NextFunction, Request, Response } from 'express'; +import { requireOwnVenue } from '../modules/venue/venue.ownership'; +import { ResponseUtil } from '../utils/responseUtils'; + +export const ownerTenantMiddleware = async ( + req: Request, + res: Response, + next: NextFunction +): Promise => { + try { + const venueId = req.params.venueId || (req.body as Record).venueId; + const userId = req.user?.userId; + + if (!userId) { + ResponseUtil.unauthorized(res); + return; + } + + if (!venueId) { + ResponseUtil.badRequest(res, 'Venue ID is required'); + return; + } + // This will throw NotFoundError (404) or ForbiddenError (403) if validation fails + const venue = await requireOwnVenue(venueId as string, userId); + Object.assign(req, { venue }); + + next(); + } catch (error) { + next(error); + } +}; diff --git a/server/src/middlewares/pagination.middleware.ts b/server/src/middlewares/pagination.middleware.ts new file mode 100644 index 0000000000..6839d9bfa7 --- /dev/null +++ b/server/src/middlewares/pagination.middleware.ts @@ -0,0 +1,51 @@ +import type { Request, Response, NextFunction } from 'express'; +import type { PaginationMiddlewareOptions } from '../types/pagination.types'; +import { parsePaginationParams } from '../utils/paginationUtils'; + +/** + * Factory that returns an Express middleware which: + * 1. Reads `page`, `limit`, `skip`, and `sort` from `req.query`. + * 2. Normalises and validates them via {@link parsePaginationParams}. + * 3. Attaches the result to `req.pagination`. + * + * Downstream controllers can then access `req.pagination` directly — it is + * always defined on routes that use this middleware. + * + * @example Basic usage (project defaults) + * ```ts + * router.get('/venues', paginationMiddleware(), controller.listVenues); + * ``` + * + * @example Custom limits + * ```ts + * router.get('/venues', paginationMiddleware({ defaultLimit: 10, maxLimit: 50 }), controller.listVenues); + * ``` + * + * @example Sort by a different field by default + * ```ts + * router.get('/venues', paginationMiddleware({ defaultSort: '-updatedAt' }), controller.listVenues); + * ``` + */ +export function paginationMiddleware(options?: PaginationMiddlewareOptions) { + return (req: Request, _res: Response, next: NextFunction): void => { + req.pagination = parsePaginationParams( + { + page: req.query.page as string | undefined, + limit: req.query.limit as string | undefined, + skip: req.query.skip as string | undefined, + sort: req.query.sort as string | undefined, + }, + options + ); + + next(); + }; +} + +/** + * Ready-to-use pagination middleware with the project's default settings. + * Equivalent to `paginationMiddleware()` with no arguments. + * + * Defaults: limit=20, maxLimit=200, sort=`-createdAt` + */ +export const defaultPaginationMiddleware = paginationMiddleware(); diff --git a/server/src/middlewares/rbac.middleware.ts b/server/src/middlewares/rbac.middleware.ts new file mode 100644 index 0000000000..9b2641a03e --- /dev/null +++ b/server/src/middlewares/rbac.middleware.ts @@ -0,0 +1,181 @@ +import type { NextFunction, Request, Response } from 'express'; +import { ResponseUtil } from '../utils/responseUtils'; +import { getUserRole } from '../services/roles.service'; +import { getPerms } from '../services/cache/permission-cache.service'; +import type { IPermission } from '../constants/permissions'; +import { ROLE_HIERARCHY } from '../constants/permissions'; +import { logWarn, logError } from '../utils/logger'; + +export const loadPermissions = async (req: Request, res: Response): Promise => { + const { user } = req; + + if (!user?.userId) { + ResponseUtil.unauthorized(res, 'Unauthorized'); + return false; + } + + if (user.role.permissions) return true; + + const { userId } = user; + + const userRole = + user.role.id && user.role.name + ? { roleId: user.role.id, roleName: user.role.name } + : await getUserRole(userId); + + if (!userRole) { + ResponseUtil.unauthorized(res, 'Unauthorized'); + return false; + } + + user.role.id = userRole.roleId; + user.role.name = userRole.roleName; + + const permissions = await getPerms(userRole.roleId, userRole.roleName); + + user.role.permissions = new Set(permissions); + user.role.isSuperAdmin = userRole.roleName === 'superAdmin'; + + return true; +}; + +export const requirePermission = (...required: IPermission[]) => { + return async (req: Request, res: Response, next: NextFunction): Promise => { + const userId = req.user?.userId; + + if (!userId) { + ResponseUtil.unauthorized(res, 'Unauthorized'); + return; + } + + try { + const loaded = await loadPermissions(req, res); + if (!loaded) return; + + // superAdmin always bypasses + if (req.user?.role.isSuperAdmin) { + next(); + return; + } + + const userPerms = req.user?.role.permissions; + + if (!userPerms) { + logWarn('requirePermission: user has no permissions', { userId, path: req.path }); + ResponseUtil.unauthorized(res, 'Unauthorized'); + return; + } + + const permitted = required.every((p) => userPerms.has(p)); + + if (!permitted) { + logWarn('requirePermission: access denied', { + userId, + required, + path: req.path, + method: req.method, + }); + ResponseUtil.forbidden(res, 'Forbidden'); + return; + } + + next(); + } catch (e) { + const error = e as Error; + logError('requirePermission: unexpected error', { + module: 'rbac.middleware.ts/requirePermission', + error: error.message, + userId, + }); + ResponseUtil.internalServerError(res, 'Server error'); + } + }; +}; + +export const requireSuperAdmin = async ( + req: Request, + res: Response, + next: NextFunction +): Promise => { + const userId = req.user?.userId; + + if (!userId) { + ResponseUtil.unauthorized(res, 'Unauthorized'); + return; + } + + try { + const loaded = await loadPermissions(req, res); + if (!loaded) return; + + if (!req.user?.role.isSuperAdmin) { + logWarn('requireSuperAdmin: access denied', { userId, path: req.path }); + ResponseUtil.forbidden(res, 'Forbidden'); + return; + } + + next(); + } catch (e) { + const error = e as Error; + logError('requireSuperAdmin: unexpected error', { + module: 'rbac.middleware.ts/requireSuperAdmin', + error: error.message, + userId, + }); + ResponseUtil.internalServerError(res, 'Server error'); + } +}; + +export const requireRole = (...allowedRoles: string[]) => { + return async (req: Request, res: Response, next: NextFunction): Promise => { + const userId = req.user?.userId; + + if (!userId) { + ResponseUtil.unauthorized(res, 'Unauthorized'); + return; + } + + try { + const loaded = await loadPermissions(req, res); + if (!loaded) return; + + const roleName = req.user?.role.name; + + if (!roleName) { + logWarn('requireRole: user has no role', { userId, path: req.path }); + ResponseUtil.forbidden(res, 'Forbidden'); + return; + } + + if (req.user?.role.isSuperAdmin) { + next(); + return; + } + + const userHierarchy = ROLE_HIERARCHY[roleName] ?? [roleName]; + const permitted = allowedRoles.some((r) => userHierarchy.includes(r)); + + if (!permitted) { + logWarn('requireRole: access denied', { + userId, + roleName, + allowedRoles, + path: req.path, + method: req.method, + }); + ResponseUtil.forbidden(res, 'Forbidden'); + return; + } + + next(); + } catch (e) { + const error = e as Error; + logError('requireRole: unexpected error', { + module: 'rbac.middleware.ts/requireRole', + error: error.message, + userId, + }); + ResponseUtil.internalServerError(res, 'Server error'); + } + }; +}; diff --git a/server/src/middlewares/validation.middleware.ts b/server/src/middlewares/validation.middleware.ts new file mode 100644 index 0000000000..b9cbfbf37d --- /dev/null +++ b/server/src/middlewares/validation.middleware.ts @@ -0,0 +1,107 @@ +import type { NextFunction, Request, Response } from 'express'; +import { z } from 'zod'; +import { ResponseUtil } from '../utils/responseUtils'; +import { logWarn, logError } from '../utils/logger'; + +export interface ValidationSchema { + body?: z.ZodType; + query?: z.ZodType; + params?: z.ZodType; +} + +const formatErrorLog = (error: z.ZodError): { path: string; message: string; code: string }[] => { + return error.issues.map((issues) => ({ + path: issues.path.join('.') || 'unknown', + message: issues.message, + code: issues.code, + })); +}; + +const formatErrorMessage = (error: z.ZodError): string => { + return error.issues + .map((issues) => { + const field = issues.path.join('.') || 'unknown'; + return `${field}: ${issues.message}`; + }) + .join(', '); +}; + +const validate = ( + schema: ValidationSchema +): ((req: Request, res: Response, next: NextFunction) => void) => { + return (req: Request, res: Response, next: NextFunction): void => { + try { + req.validated = req.validated ?? {}; + + if (schema.body) { + const bodyResult = schema.body.safeParse(req.body); + if (!bodyResult.success) { + const errorLog = + bodyResult.error instanceof z.ZodError + ? formatErrorLog(bodyResult.error) + : 'Invalid request body'; + const errorMessage = + bodyResult.error instanceof z.ZodError + ? formatErrorMessage(bodyResult.error) + : 'Invalid request body'; + logWarn('Request body validation failed', { errorLog }); + ResponseUtil.badRequest(res, errorMessage); + return; + } + req.body = bodyResult.data; + req.validated.body = bodyResult.data; + } + + if (schema.params) { + const paramsResult = schema.params.safeParse(req.params); + if (!paramsResult.success) { + const errorLog = + paramsResult.error instanceof z.ZodError + ? formatErrorLog(paramsResult.error) + : 'Invalid request parameters'; + const errorMessage = + paramsResult.error instanceof z.ZodError + ? formatErrorMessage(paramsResult.error) + : 'Invalid request parameters'; + logWarn('Request params validation failed', { errorLog }); + ResponseUtil.badRequest(res, errorMessage); + return; + } + req.validated.params = paramsResult.data; + } + + if (schema.query) { + const queryResult = schema.query.safeParse(req.query); + if (!queryResult.success) { + const errorLog = + queryResult.error instanceof z.ZodError + ? formatErrorLog(queryResult.error) + : 'Invalid query parameters'; + const errorMessage = + queryResult.error instanceof z.ZodError + ? formatErrorMessage(queryResult.error) + : 'Invalid query parameters'; + logWarn('Request query validation failed', { errorLog }); + ResponseUtil.badRequest(res, errorMessage); + return; + } + req.validated.query = queryResult.data; + } + + next(); + } catch (error) { + logError('Validation middleware error', { module: 'validation.middleware.ts', error }); + ResponseUtil.internalServerError(res, 'Validation error'); + } + }; +}; + +export const validateBody = ( + schema: z.ZodType +): ((req: Request, res: Response, next: NextFunction) => void) => validate({ body: schema }); +export const validateParams = ( + schema: z.ZodType +): ((req: Request, res: Response, next: NextFunction) => void) => validate({ params: schema }); +export const validateQuery = ( + schema: z.ZodType +): ((req: Request, res: Response, next: NextFunction) => void) => validate({ query: schema }); diff --git a/server/src/models/email-task.model.ts b/server/src/models/email-task.model.ts new file mode 100644 index 0000000000..79410c4865 --- /dev/null +++ b/server/src/models/email-task.model.ts @@ -0,0 +1,59 @@ +import type { Document } from 'mongoose'; +import mongoose, { Schema } from 'mongoose'; +import { + EmailIntent, + type EmailIntentType, + EmailTaskStatus, + type EmailTaskStatusType, +} from '../constants/email.constants'; + +export interface IEmailTask extends Document { + intent: EmailIntentType; + recipient: string; + subject: string; + metadata: Record; + status: EmailTaskStatusType; + workerId: string | null; + lockedAt: Date | null; + retryAfter: Date; + retries: number; + lastError: string | null; + deleteAt: Date; + createdAt: Date; + updatedAt: Date; +} + +const EmailTaskSchema = new Schema( + { + intent: { + type: String, + enum: Object.values(EmailIntent), + required: true, + }, + recipient: { type: String, required: true }, + subject: { type: String, required: true }, + metadata: { type: Schema.Types.Mixed, default: {} }, + status: { + type: String, + enum: Object.values(EmailTaskStatus), + default: EmailTaskStatus.PENDING, + }, + workerId: { type: String, default: null }, + lockedAt: { type: Date, default: null }, + retryAfter: { type: Date, required: true }, + retries: { type: Number, default: 0 }, + lastError: { type: String, default: null }, + deleteAt: { type: Date, required: true }, // TTL: completed → 15 min, pending/failed → 7 days + }, + { timestamps: true } +); + +// Compound index for fast polling +EmailTaskSchema.index({ status: 1, lockedAt: 1, retryAfter: 1 }); +EmailTaskSchema.index({ deleteAt: 1 }, { expireAfterSeconds: 0 }); + +export const EmailTaskModel = mongoose.model( + 'EmailTasks', + EmailTaskSchema, + 'EmailTasks' +); diff --git a/server/src/models/featured-venue.model.ts b/server/src/models/featured-venue.model.ts new file mode 100644 index 0000000000..166d30acbd --- /dev/null +++ b/server/src/models/featured-venue.model.ts @@ -0,0 +1,26 @@ +import type { Document } from 'mongoose'; +import mongoose, { Schema } from 'mongoose'; + +export interface IFeaturedVenue extends Document { + venueId: mongoose.Types.ObjectId; + expiresAt: Date | null; +} + +const featuredVenueSchema = new Schema( + { + venueId: { type: Schema.Types.ObjectId, ref: 'Venues', required: true, unique: true }, + expiresAt: { type: Date, default: null }, + }, + { timestamps: true } +); + +featuredVenueSchema.index( + { expiresAt: 1 }, + { expireAfterSeconds: 0, sparse: true, name: 'idx_featured_ttl' } +); + +export const FeaturedVenueModel = mongoose.model( + 'FeaturedVenues', + featuredVenueSchema, + 'FeaturedVenues' +); diff --git a/server/src/models/idempotency-key.model.ts b/server/src/models/idempotency-key.model.ts new file mode 100644 index 0000000000..7f304ad79a --- /dev/null +++ b/server/src/models/idempotency-key.model.ts @@ -0,0 +1,23 @@ +import mongoose, { Schema } from 'mongoose'; +import type { Document } from 'mongoose'; + +export interface IIdempotencyKey extends Document { + key: string; + response: { status: number; body: unknown }; + createdAt: Date; +} + +const IdempotencyKeySchema = new Schema({ + key: { type: String, required: true, unique: true, index: true }, + response: { + status: { type: Number, required: true }, + body: { type: Schema.Types.Mixed, required: true }, + }, + createdAt: { type: Date, default: Date.now, index: { expires: 86400 } }, +}); + +export const IdempotencyKeyModel = mongoose.model( + 'IdempotencyKeys', + IdempotencyKeySchema, + 'IdempotencyKeys' +); diff --git a/server/src/models/permission.model.ts b/server/src/models/permission.model.ts new file mode 100644 index 0000000000..85896fa4f3 --- /dev/null +++ b/server/src/models/permission.model.ts @@ -0,0 +1,32 @@ +import type { Document } from 'mongoose'; +import mongoose, { Schema } from 'mongoose'; +import { ActionEnum, EntityEnum } from '../constants/permissions'; +import type { IAction, IEntity } from '../constants/permissions'; + +export interface IPermission extends Document { + action: IAction; + entity: IEntity; + isSystem: boolean; + active: boolean; + deleted: boolean; +} + +const permissionSchema = new Schema( + { + action: { type: String, required: true, enum: ActionEnum as unknown as string[] }, + entity: { type: String, required: true, enum: EntityEnum as unknown as string[] }, + isSystem: { type: Boolean, default: false, immutable: true }, + active: { type: Boolean, default: true }, + deleted: { type: Boolean, default: false }, + }, + { timestamps: true } +); + +// Composite unique — one row per action/entity combination +permissionSchema.index({ action: 1, entity: 1 }, { unique: true }); + +export const PermissionModel = mongoose.model( + 'Permissions', + permissionSchema, + 'Permissions' +); diff --git a/server/src/models/role-permission.model.ts b/server/src/models/role-permission.model.ts new file mode 100644 index 0000000000..ba8b8d3ab5 --- /dev/null +++ b/server/src/models/role-permission.model.ts @@ -0,0 +1,28 @@ +import type { Document } from 'mongoose'; +import mongoose, { Schema } from 'mongoose'; + +export interface IRolePermission extends Document { + roleId: mongoose.Types.ObjectId; + permissionId: mongoose.Types.ObjectId; + active: boolean; + deleted: boolean; +} + +const rolePermissionSchema = new Schema( + { + roleId: { type: Schema.Types.ObjectId, ref: 'Roles', required: true }, + permissionId: { type: Schema.Types.ObjectId, ref: 'Permissions', required: true }, + active: { type: Boolean, default: true }, + deleted: { type: Boolean, default: false }, + }, + { timestamps: true } +); + +// One grant per role/permission pair +rolePermissionSchema.index({ roleId: 1, permissionId: 1 }, { unique: true }); + +export const RolePermissionModel = mongoose.model( + 'RolePermissions', + rolePermissionSchema, + 'RolePermissions' +); diff --git a/server/src/models/role.model.ts b/server/src/models/role.model.ts new file mode 100644 index 0000000000..8a978d9e23 --- /dev/null +++ b/server/src/models/role.model.ts @@ -0,0 +1,37 @@ +import type { Document } from 'mongoose'; +import mongoose, { Schema } from 'mongoose'; + +// Kept open-ended so new roles can be inserted into the DB without a schema change. +// The enum below reflects the four system roles shipped at launch. +export const RoleEnum = ['user', 'owner', 'admin', 'superAdmin'] as const; +export type RoleName = (typeof RoleEnum)[number]; + +export interface IRole extends Document { + name: string; // string (not narrowed to RoleEnum) to allow future roles without a migration + displayName: string; + description?: string; + isSystem: boolean; // true for the four built-in roles + parentRole: mongoose.Types.ObjectId | null; // drives $graphLookup inheritance + priority: number; // lower = higher rank; superAdmin=1, admin=20, owner=50, user=100 + active: boolean; + deleted: boolean; +} + +const roleSchema = new Schema( + { + name: { type: String, required: true, unique: true }, + displayName: { type: String, required: true }, + description: { type: String, default: '' }, + isSystem: { type: Boolean, default: false, immutable: true }, + parentRole: { type: Schema.Types.ObjectId, ref: 'Roles', default: null }, + priority: { type: Number, required: true }, + active: { type: Boolean, default: true }, + deleted: { type: Boolean, default: false }, + }, + { timestamps: true } +); + +roleSchema.index({ name: 1, _id: 1 }); +roleSchema.index({ priority: 1 }); + +export const RoleModel = mongoose.model('Roles', roleSchema, 'Roles'); diff --git a/server/src/models/user-role.model.ts b/server/src/models/user-role.model.ts new file mode 100644 index 0000000000..2c23113b0c --- /dev/null +++ b/server/src/models/user-role.model.ts @@ -0,0 +1,26 @@ +import type { Document } from 'mongoose'; +import mongoose, { Schema } from 'mongoose'; + +// Join table: one active row per user. +// A user is promoted to owner/admin by upserting a new row (or updating roleId). +// No role field on the User document — roles live here exclusively. +export interface IUserRole extends Document { + userId: mongoose.Types.ObjectId; + roleId: mongoose.Types.ObjectId; + active: boolean; + deleted: boolean; +} + +const userRoleSchema = new Schema( + { + userId: { type: Schema.Types.ObjectId, ref: 'Users', required: true }, + roleId: { type: Schema.Types.ObjectId, ref: 'Roles', required: true }, + active: { type: Boolean, default: true }, + deleted: { type: Boolean, default: false }, + }, + { timestamps: true } +); + +userRoleSchema.index({ userId: 1, roleId: 1 }, { unique: true }); + +export const UserRoleModel = mongoose.model('UserRoles', userRoleSchema, 'UserRoles'); diff --git a/server/src/modules/auth/auth.controller.ts b/server/src/modules/auth/auth.controller.ts new file mode 100644 index 0000000000..fea7477cbc --- /dev/null +++ b/server/src/modules/auth/auth.controller.ts @@ -0,0 +1,182 @@ +import { handleError } from '../../utils/errors'; +import { ResponseUtil } from '../../utils/responseUtils'; +import { setTokenCookies, clearTokenCookies } from '../../utils/tokenUtils'; +import * as service from './auth.service'; +import * as validator from './auth.validator'; +import type * as authScheme from './auth.validator'; +import type { Request, Response } from 'express'; +import type { z } from 'zod'; + +export const register = async (req: Request, res: Response): Promise => { + try { + const dto = req.validated?.body as z.infer; + const userId = await service.registerUser(dto); + + ResponseUtil.created(res, 'User registered successfully! Please login.', { userId }); + } catch (e) { + handleError(res, e, 'register'); + } +}; + +export const login = async (req: Request, res: Response): Promise => { + try { + const dto = req.validated?.body as z.infer; + const ip = req.ip ?? 'unknown'; + const userAgent = req.get('user-agent') ?? 'unknown'; + + const result = await service.loginUser(dto, ip, userAgent); + + setTokenCookies(res, result.accessToken, result.refreshToken); + + ResponseUtil.success(res, 'User logged in successfully', { + userId: result.userId, + username: result.username, + email: result.email, + }); + } catch (e) { + handleError(res, e, 'login'); + } +}; + +export const refreshToken = async (req: Request, res: Response): Promise => { + try { + const decodedToken = req.token?.decoded; + const storedToken = req.token?.stored; + + const result = await service.rotateRefreshToken(storedToken, decodedToken); + + setTokenCookies(res, result.accessToken, result.refreshToken); + + ResponseUtil.success(res, 'Refresh token generated successfully', { + userId: result.userId, + username: result.username, + email: result.email, + }); + } catch (e) { + handleError(res, e, 'refreshToken'); + } +}; + +export const logout = async (req: Request, res: Response): Promise => { + try { + const userId = req.user?.userId; + + if (!userId) { + ResponseUtil.unauthorized(res, 'Unauthorized'); + return; + } + + const storedToken = req.token?.stored; + await service.logoutUser(userId, storedToken); + + clearTokenCookies(res); + + ResponseUtil.success(res, 'Logout successful'); + } catch (e) { + handleError(res, e, 'logout'); + } +}; + +export const forgotPassword = async (req: Request, res: Response): Promise => { + try { + const dto = req.validated?.body as z.infer; + const ip = req.ip ?? 'unknown'; + const userAgent = req.get('user-agent') ?? 'unknown'; + + await service.processForgotPassword(dto, ip, userAgent); + + ResponseUtil.success(res, 'If an account exists, a reset link has been sent.'); + } catch (e) { + handleError(res, e, 'forgotPassword'); + } +}; + +export const resetPassword = async (req: Request, res: Response): Promise => { + try { + const dto = req.validated?.body as z.infer; + + const ip = req.ip ?? 'unknown'; + const userAgent = req.get('user-agent') ?? 'unknown'; + + await service.processResetPassword(dto, ip, userAgent); + + ResponseUtil.success(res, 'Password reset successful. Please log in with your new password.'); + } catch (e) { + handleError(res, e, 'resetPassword'); + } +}; + +export const changePassword = async (req: Request, res: Response): Promise => { + try { + const validatedData = validator.changePasswordSchema.parse(req.body); + + if (!req.user?.userId) { + ResponseUtil.unauthorized(res, 'User not authenticated'); + return; + } + + await service.changePassword( + req.user.userId, + validatedData, + req.ip ?? req.socket.remoteAddress ?? 'unknown', + req.headers['user-agent'] ?? 'unknown' + ); + + ResponseUtil.success(res, 'Password changed successfully.'); + } catch (e) { + handleError(res, e, 'changePassword'); + } +}; + +export const listSessions = async (req: Request, res: Response): Promise => { + try { + const userId = req.user?.userId; + const rootTokenId = req.token?.stored.rootTokenId; + + if (!userId || !rootTokenId) { + ResponseUtil.unauthorized(res, 'Unauthorized'); + return; + } + + const sessions = await service.listSessions(userId, rootTokenId); + ResponseUtil.success(res, 'Sessions retrieved successfully', sessions); + } catch (e) { + handleError(res, e, 'listSessions'); + } +}; + +export const revokeSession = async (req: Request, res: Response): Promise => { + try { + const userId = req.user?.userId; + const rootTokenId = req.token?.stored.rootTokenId; + + if (!userId || !rootTokenId) { + ResponseUtil.unauthorized(res, 'Unauthorized'); + return; + } + + const { sessionId } = req.validated?.params as z.infer; + await service.revokeSession(userId, rootTokenId, sessionId); + + ResponseUtil.success(res, 'Device signed out successfully'); + } catch (e) { + handleError(res, e, 'revokeSession'); + } +}; + +export const revokeAllOtherSessions = async (req: Request, res: Response): Promise => { + try { + const userId = req.user?.userId; + const rootTokenId = req.token?.stored.rootTokenId; + + if (!userId || !rootTokenId) { + ResponseUtil.unauthorized(res, 'Unauthorized'); + return; + } + + const result = await service.revokeAllOtherSessions(userId, rootTokenId); + ResponseUtil.success(res, 'Other devices signed out successfully', result); + } catch (e) { + handleError(res, e, 'revokeAllOtherSessions'); + } +}; diff --git a/server/src/modules/auth/auth.repository.ts b/server/src/modules/auth/auth.repository.ts new file mode 100644 index 0000000000..a1490e1844 --- /dev/null +++ b/server/src/modules/auth/auth.repository.ts @@ -0,0 +1,375 @@ +import type mongoose from 'mongoose'; +import { PasswordResetRequestModel } from './models/password-reset-request.model'; +import { PasswordResetTokenModel } from './models/password-reset-token.model'; +import { RefreshTokenModel } from './models/refresh-token.model'; +import type { IRefreshToken } from './models/refresh-token.model'; +import { SessionModel } from './models/session.model'; +import type { ISession } from './models/session.model'; +import { EmailTaskModel } from '../../models/email-task.model'; +import { RoleModel } from '../../models/role.model'; +import { UserRoleModel } from '../../models/user-role.model'; +import type { TokenRevocationReasonType } from '../../constants/auth.constants'; + +export async function findDefaultRole(): Promise { + return RoleModel.findOne({ name: 'user', active: true, deleted: false }).lean().exec(); +} + +export async function assignRoleToUser( + userId: mongoose.Types.ObjectId, + roleId: mongoose.Types.ObjectId, + session?: mongoose.ClientSession +): Promise { + await UserRoleModel.updateOne( + { userId, roleId }, + { + $set: { + userId, + roleId, + active: true, + deleted: false, + }, + }, + { upsert: true, session } + ).exec(); +} + +export async function revokePasswordResetTokensOnLogin( + userId: mongoose.Types.ObjectId, + revocationReason: TokenRevocationReasonType, + session?: mongoose.ClientSession +): Promise { + await PasswordResetTokenModel.updateMany( + { userId, active: true }, + { + $set: { + active: false, + revokedAt: new Date(), + revokedReason: revocationReason, + }, + }, + { session } + ).exec(); +} + +export async function createSession( + userId: mongoose.Types.ObjectId, + rootTokenId: string, + absoluteExpiresAt: Date, + ipAddress: string, + userAgent: string, + session?: mongoose.ClientSession +): Promise { + await SessionModel.create( + [ + { + userId, + rootTokenId, + absoluteExpiresAt, + lastLogin: new Date(), + ipAddress, + userAgent, + }, + ], + { session } + ); +} + +export async function deactivateSessionByRootTokenId( + rootTokenId: string, + session?: mongoose.ClientSession +): Promise { + await SessionModel.findOneAndUpdate( + { rootTokenId }, + { $set: { active: false } }, + { session } + ).exec(); +} + +export async function getRateLimitDataForPasswordReset( + emailHash: string, + oneHourAgo: Date +): Promise<{ + totalCount: number; + emailCount: number; + lastEmailAt: Date | null; +}> { + const [rateLimitData] = await PasswordResetRequestModel.aggregate<{ + totalRequests: ({ n: number } | undefined)[]; + emailsSent: ({ n: number } | undefined)[]; + lastEmailSent: ({ createdAt: Date } | undefined)[]; + }>([ + { $match: { emailHash, createdAt: { $gte: oneHourAgo } } }, + { + $facet: { + totalRequests: [{ $count: 'n' }], + emailsSent: [{ $match: { emailSent: true } }, { $count: 'n' }], + lastEmailSent: [ + { $match: { emailSent: true } }, + { $sort: { createdAt: -1 } }, + { $limit: 1 }, + { $project: { createdAt: 1 } }, + ], + }, + }, + ]).exec(); + + const totalCount = rateLimitData.totalRequests[0]?.n ?? 0; + const emailCount = rateLimitData.emailsSent[0]?.n ?? 0; + const lastEmailAt = rateLimitData.lastEmailSent[0]?.createdAt ?? null; + + return { totalCount, emailCount, lastEmailAt }; +} + +export async function createPasswordResetRequest( + data: { + emailHash: string; + ip: string; + userAgent: string; + emailSent: boolean; + }, + session?: mongoose.ClientSession +): Promise { + await PasswordResetRequestModel.create([data], { session }); +} + +export async function cleanupExcessPasswordResetTokens( + userId: mongoose.Types.ObjectId, + maxActiveTokens: number, + session?: mongoose.ClientSession +): Promise { + const activeTokens = await PasswordResetTokenModel.find( + { + userId, + used: false, + active: true, + deleted: false, + expiresAt: { $gt: new Date() }, + }, + { _id: 1 }, + { sort: { createdAt: 1 } } + ) + .session(session ?? null) + .exec(); + + if (activeTokens.length >= maxActiveTokens) { + const excess = activeTokens.slice(0, activeTokens.length - maxActiveTokens + 1); + await PasswordResetTokenModel.updateMany( + { _id: { $in: excess.map((t) => t._id) } }, + { $set: { active: false, deleted: true } }, + { session } + ).exec(); + } +} + +export async function createPasswordResetToken( + data: { + userId: mongoose.Types.ObjectId; + tokenHash: string; + expiresAt: Date; + requestIp: string; + userAgent: string; + }, + session?: mongoose.ClientSession +): Promise { + await PasswordResetTokenModel.create([data], { session }); +} + +export async function createEmailTask( + data: { + intent: + | 'password_reset' + | 'account_notification' + | 'email_verification' + | 'security_alert' + | 'welcome'; + recipient: string; + subject: string; + metadata: Record; + }, + session?: mongoose.ClientSession +): Promise { + const SEVEN_DAYS_MS = 7 * 24 * 60 * 60 * 1000; + await EmailTaskModel.create( + [{ ...data, retryAfter: new Date(), deleteAt: new Date(Date.now() + SEVEN_DAYS_MS) }], + { session } + ); +} + +export async function markPasswordResetTokenAsUsed( + tokenHash: string, + session?: mongoose.ClientSession +): Promise<(mongoose.Document & { userId: mongoose.Types.ObjectId; expiresAt: Date }) | null> { + return PasswordResetTokenModel.findOneAndUpdate( + { tokenHash, active: true, used: false, deleted: false, expiresAt: { $gt: new Date() } }, + { $set: { active: false, used: true, usedAt: new Date() } }, + { returnDocument: 'after', session: session ?? null } + ).exec(); +} + +export async function revokeAllOtherPasswordResetTokens( + userId: mongoose.Types.ObjectId, + excludeTokenId: mongoose.Types.ObjectId, + revocationReason: TokenRevocationReasonType, + session?: mongoose.ClientSession +): Promise { + await PasswordResetTokenModel.updateMany( + { userId, _id: { $ne: excludeTokenId }, active: true, used: false, deleted: false }, + { + $set: { + active: false, + revokedAt: new Date(), + revokedReason: revocationReason, + }, + }, + { session } + ).exec(); +} + +export async function revokeActivePasswordResetTokens( + userId: mongoose.Types.ObjectId, + excludeTokenId: mongoose.Types.ObjectId, + revocationReason: TokenRevocationReasonType, + session?: mongoose.ClientSession +): Promise { + await PasswordResetTokenModel.updateMany( + { userId, _id: { $ne: excludeTokenId }, active: true }, + { + $set: { + active: false, + revokedAt: new Date(), + revokedReason: revocationReason, + }, + }, + { session } + ).exec(); +} + +export async function revokeAllRefreshTokensForUser( + userId: mongoose.Types.ObjectId, + revocationReason: TokenRevocationReasonType, + session?: mongoose.ClientSession +): Promise { + await RefreshTokenModel.updateMany( + { userId, active: true }, + { + $set: { + active: false, + revokedAt: new Date(), + revokedReason: revocationReason, + }, + }, + { session } + ).exec(); +} + +export async function deactivateAllSessionsForUser( + userId: mongoose.Types.ObjectId, + session?: mongoose.ClientSession +): Promise { + await SessionModel.updateMany( + { userId, active: true }, + { $set: { active: false } }, + { session } + ).exec(); +} + +export async function findRefreshTokenByHash( + tokenHash: string, + userId: mongoose.Types.ObjectId +): Promise { + return RefreshTokenModel.findOne({ + tokenHash, + userId, + deleted: false, + }).exec(); +} + +export async function findSessionByRootTokenId( + rootTokenId: mongoose.Types.ObjectId +): Promise { + return SessionModel.findOne({ + rootTokenId, + deleted: false, + }).exec(); +} + +export async function getActiveSessionsForUser( + userId: mongoose.Types.ObjectId | string +): Promise { + return SessionModel.find({ userId, active: true, deleted: false }).sort({ createdAt: -1 }).exec(); +} + +export async function findActiveSessionByIdForUser( + sessionId: mongoose.Types.ObjectId | string, + userId: mongoose.Types.ObjectId | string +): Promise { + return SessionModel.findOne({ + _id: sessionId, + userId, + active: true, + deleted: false, + }).exec(); +} + +export async function deactivateSessionById( + sessionId: mongoose.Types.ObjectId | string, + userId: mongoose.Types.ObjectId | string, + session?: mongoose.ClientSession +): Promise { + await SessionModel.updateOne( + { _id: sessionId, userId, active: true }, + { $set: { active: false } }, + { session } + ).exec(); +} + +export async function createRefreshToken( + data: { + _id: mongoose.Types.ObjectId; + userId: mongoose.Types.ObjectId; + tokenHash: string; + rootTokenId: mongoose.Types.ObjectId; + parentTokenId: mongoose.Types.ObjectId | null; + expiresAt: Date; + }, + session?: mongoose.ClientSession +): Promise { + await RefreshTokenModel.create([data], { session }); +} + +export async function revokeRefreshToken( + tokenHash: string, + reason: TokenRevocationReasonType, + session?: mongoose.ClientSession +): Promise { + await RefreshTokenModel.updateOne( + { tokenHash, active: true, isUsed: false }, + { + $set: { + active: false, + isUsed: true, + revokedAt: new Date(), + revokedReason: reason, + }, + }, + { session } + ).exec(); +} + +export async function revokeTokenFamily( + rootTokenId: mongoose.Types.ObjectId, + reason: TokenRevocationReasonType, + session?: mongoose.ClientSession +): Promise { + await RefreshTokenModel.updateMany( + { rootTokenId, active: true }, + { + $set: { + active: false, + revokedAt: new Date(), + revokedReason: reason, + }, + }, + { session } + ).exec(); +} diff --git a/server/src/modules/auth/auth.router.ts b/server/src/modules/auth/auth.router.ts new file mode 100644 index 0000000000..0f6fcee746 --- /dev/null +++ b/server/src/modules/auth/auth.router.ts @@ -0,0 +1,317 @@ +import { Router } from 'express'; +import * as controller from './auth.controller'; +import * as authValidator from './auth.validator'; +import { validateBody, validateParams } from '../../middlewares/validation.middleware'; +import { verifyAccessToken, verifyRefreshToken } from '../../middlewares/auth.middleware'; +import rateLimit from 'express-rate-limit'; + +const router: Router = Router(); + +const secondaryRateLimiter = rateLimit({ + windowMs: 15 * 60 * 1000, + max: 5, + message: 'Too many requests from this IP. Please try again after 15 minutes.', + standardHeaders: true, + legacyHeaders: false, +}); + +const loginRateLimiter = rateLimit({ + windowMs: 15 * 60 * 1000, + max: 10, + message: 'Too many login attempts from this IP. Please try again after 15 minutes.', + standardHeaders: true, + legacyHeaders: false, +}); + +/** + * @openapi + * /auth/register: + * post: + * tags: [Auth] + * summary: Register a new user + * requestBody: + * required: true + * content: + * application/json: + * schema: + * type: object + * required: [username, email, password] + * properties: + * username: + * type: string + * minLength: 3 + * maxLength: 30 + * example: johndoe + * email: + * type: string + * format: email + * example: john@example.com + * password: + * type: string + * minLength: 8 + * example: SecurePass@1 + * responses: + * 201: + * description: User registered successfully + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/SuccessResponse' + * 400: + * description: Validation error + * 409: + * description: Username or email already taken + */ +router.route('/register').post(validateBody(authValidator.registerSchema), controller.register); + +/** + * @openapi + * /auth/login: + * post: + * tags: [Auth] + * summary: Login with email/username and password + * requestBody: + * required: true + * content: + * application/json: + * schema: + * type: object + * required: [password] + * properties: + * username: + * type: string + * example: johndoe + * email: + * type: string + * format: email + * example: john@example.com + * password: + * type: string + * example: SecurePass@1 + * responses: + * 200: + * description: Login successful + * 400: + * description: Validation error or missing credentials + * 401: + * description: Invalid credentials + * 429: + * description: Too many requests + */ +router + .route('/login') + .post(loginRateLimiter, validateBody(authValidator.loginSchema), controller.login); + +/** + * @openapi + * /auth/refresh: + * post: + * tags: [Auth] + * summary: Refresh access token using refresh token cookie + * security: + * - cookieAuth: [] + * responses: + * 200: + * description: New access token issued + * 401: + * description: Missing, invalid, or expired refresh token + */ +router.route('/refresh').post(verifyRefreshToken, controller.refreshToken); + +/** + * @openapi + * /auth/logout: + * post: + * tags: [Auth] + * summary: Logout and revoke the current session + * security: + * - bearerAuth: [] + * - cookieAuth: [] + * responses: + * 200: + * description: Logged out successfully + * 401: + * description: Not authenticated + */ +router.route('/logout').post(verifyAccessToken, verifyRefreshToken, controller.logout); + +/** + * @openapi + * /auth/forgot-password: + * post: + * tags: [Auth] + * summary: Send a password reset email + * description: Rate-limited to 5 requests per 15 minutes per IP. + * requestBody: + * required: true + * content: + * application/json: + * schema: + * type: object + * required: [email] + * properties: + * email: + * type: string + * format: email + * example: john@example.com + * responses: + * 200: + * description: Reset email sent if account exists + * 400: + * description: Invalid email format + * 429: + * description: Too many requests + */ +router + .route('/forgot-password') + .post( + secondaryRateLimiter, + validateBody(authValidator.forgotPasswordSchema), + controller.forgotPassword + ); + +/** + * @openapi + * /auth/reset-password: + * post: + * tags: [Auth] + * summary: Reset password using a valid reset token + * requestBody: + * required: true + * content: + * application/json: + * schema: + * type: object + * required: [token, password] + * properties: + * token: + * type: string + * description: Token received in the reset email + * example: abc123xyz + * password: + * type: string + * minLength: 8 + * example: NewSecurePass@1 + * responses: + * 200: + * description: Password reset successfully + * 400: + * description: Invalid or expired token, or validation error + */ +router + .route('/reset-password') + .post(validateBody(authValidator.resetPasswordSchema), controller.resetPassword); + +/** + * @openapi + * /auth/change-password: + * patch: + * tags: [Auth] + * summary: Change user password + * security: + * - bearerAuth: [] + * requestBody: + * required: true + * content: + * application/json: + * schema: + * type: object + * required: [oldPassword, newPassword] + * properties: + * oldPassword: + * type: string + * newPassword: + * type: string + * format: password + * responses: + * 200: + * description: Password changed successfully + * 400: + * description: Invalid input or incorrect old password + * 401: + * description: Unauthorized + */ +router.route('/change-password').patch(verifyAccessToken, controller.changePassword); + +/** + * @openapi + * /auth/sessions: + * get: + * tags: [Auth] + * summary: List the authenticated user's active sessions/devices + * security: + * - bearerAuth: [] + * - cookieAuth: [] + * responses: + * 200: + * description: Array of active sessions, each flagged with isCurrent + * 401: + * description: Not authenticated + */ +router.route('/sessions').get(verifyAccessToken, verifyRefreshToken, controller.listSessions); + +/** + * @openapi + * /auth/sessions/logout-others: + * post: + * tags: [Auth] + * summary: Sign out every other active session/device + * description: | + * Blocked with a 403 if the current session is less than 48 hours old and + * any other active session predates it — prevents a newly-added device + * from locking out established devices. + * security: + * - bearerAuth: [] + * - cookieAuth: [] + * responses: + * 200: + * description: Other sessions signed out successfully + * 401: + * description: Not authenticated + * 403: + * description: Current device is too new to sign out older devices + */ +router + .route('/sessions/logout-others') + .post(verifyAccessToken, verifyRefreshToken, controller.revokeAllOtherSessions); + +/** + * @openapi + * /auth/sessions/{sessionId}: + * delete: + * tags: [Auth] + * summary: Sign out one specific session/device + * description: | + * Blocked with a 403 if the current session is less than 48 hours old and + * the target session predates it. + * security: + * - bearerAuth: [] + * - cookieAuth: [] + * parameters: + * - in: path + * name: sessionId + * required: true + * schema: + * type: string + * responses: + * 200: + * description: Device signed out successfully + * 400: + * description: Cannot revoke the current session this way + * 401: + * description: Not authenticated + * 403: + * description: Current device is too new to sign out older devices + * 404: + * description: Session not found + */ +router + .route('/sessions/:sessionId') + .delete( + verifyAccessToken, + verifyRefreshToken, + validateParams(authValidator.sessionIdParamSchema), + controller.revokeSession + ); + +export { router as authRouter }; diff --git a/server/src/modules/auth/auth.service.ts b/server/src/modules/auth/auth.service.ts new file mode 100644 index 0000000000..6c7fdc1bf6 --- /dev/null +++ b/server/src/modules/auth/auth.service.ts @@ -0,0 +1,560 @@ +import crypto from 'crypto'; +import * as bcrypt from 'bcrypt'; +import type { z } from 'zod'; +import { authEnvs } from '../../constants/env'; +import { AuthConstants, TokenRevocationReason } from '../../constants/auth.constants'; +import * as authRepo from './auth.repository'; +import * as userRepo from '../user/user.repository'; +import type * as authScheme from './auth.validator'; +import { AppError, NotFoundError, ForbiddenError } from '../../utils/errors'; +import { logError, logWarn, logInfo } from '../../utils/logger'; +import { runInTransaction } from '../../utils/dbUtils'; +import mongoose from 'mongoose'; +import type * as validator from './auth.validator'; +import { + generateAccessToken, + generateRefreshToken, + revokeRefreshToken, +} from '../../utils/tokenUtils'; +import type { DecodedToken, StoredToken } from '../../types/express'; + +export class UnauthorizedError extends AppError { + constructor(message = 'Unauthorized') { + super(message, 401, 'UNAUTHORIZED'); + } +} + +export class RateLimitError extends AppError { + constructor(message = 'Too many requests. Please try again later') { + super(message, 429, 'RATE_LIMIT_EXCEEDED'); + } +} + +export class BadRequestError extends AppError { + constructor(message = 'Bad Request') { + super(message, 400, 'BAD_REQUEST'); + } +} + +export async function registerUser( + dto: z.infer +): Promise { + const { username, email, password } = dto; + + const existingUser = await userRepo.findUserByUsernameOrEmail(username, email); + if (existingUser) { + logWarn('Registration attempt with existing user', { username, email }); + throw new BadRequestError( + 'User already exists! please login instead, or choose a different username/email' + ); + } + + const defaultRole = await authRepo.findDefaultRole(); + if (!defaultRole) { + logError('register: default "user" role missing from system configs', { + module: 'auth.service.ts/registerUser', + }); + throw new AppError( + 'System initialization Error, Pls contact admin...', + 500, + 'INTERNAL_SERVER_ERROR' + ); + } + + let createdUserId = ''; + + await runInTransaction(async (session) => { + const hashedPassword = await bcrypt.hash(password, 12); + + const newUser = await userRepo.createUser( + { username, email, passwordHash: hashedPassword }, + session + ); + + createdUserId = newUser._id.toString(); + + await authRepo.assignRoleToUser(newUser._id, defaultRole._id, session); + }); + + logInfo('New user registered successfully', { username, email }); + return createdUserId; +} + +export async function loginUser( + dto: z.infer, + ipAddress: string, + userAgent: string +): Promise<{ + userId: string; + username: string; + email: string; + accessToken: string; + refreshToken: string; +}> { + const identifier = dto.username ?? dto.email; + + logInfo('Login attempt', { credential: identifier }); + + if (!identifier || !dto.password) { + logWarn('Login attempt with missing credentials'); + throw new BadRequestError('Username/Email and password required'); + } + + const user = await userRepo.findActiveUserByIdentifierWithPassword(identifier); + + if (!user) { + logWarn('Login attempt with non-existent user', { credential: identifier }); + throw new UnauthorizedError('Invalid username or password'); + } + + const isPasswordValid = await bcrypt.compare(dto.password, user.password); + + if (!isPasswordValid) { + logWarn('Login attempt with invalid password', { credential: identifier }); + throw new UnauthorizedError('Invalid username or password'); + } + + if (!authEnvs.accessTokenSecret || !authEnvs.refreshTokenSecret) { + logError('JWT secrets not configured', { module: 'auth.service.ts/loginUser' }); + throw new AppError('Server configuration error', 500, 'INTERNAL_SERVER_ERROR'); + } + + const userId = user._id.toString(); + let refreshTokenStr = ''; + + await runInTransaction(async (session) => { + try { + await authRepo.revokePasswordResetTokensOnLogin( + user._id, + TokenRevocationReason.USER_LOGIN, + session + ); + } catch (err: unknown) { + logError('Failed to cleanup reset tokens on login', { + module: 'auth.service.ts/loginUser', + error: err instanceof Error ? err.message : String(err), + }); + } + + const result = await generateRefreshToken(userId, undefined, undefined, session); + refreshTokenStr = result.token; + + await authRepo.createSession( + user._id, + result.rootTokenId, + new Date(Date.now() + AuthConstants.SESSION_ABSOLUTE_EXPIRY_MS), + ipAddress, + userAgent, + session + ); + }); + + const accessTokenStr = generateAccessToken(userId, user.username, user.email); + + return { + userId, + username: user.username, + email: user.email, + accessToken: accessTokenStr, + refreshToken: refreshTokenStr, + }; +} + +export async function rotateRefreshToken( + storedToken: StoredToken | undefined, + decodedToken: DecodedToken | undefined +): Promise<{ + userId: string; + username: string; + email: string; + accessToken: string; + refreshToken: string; +}> { + if (!decodedToken || !storedToken) { + throw new UnauthorizedError('Invalid refresh token'); + } + + const userId = decodedToken.id; + const user = await userRepo.findActiveUserById(userId); + + if (!user) { + throw new UnauthorizedError('Invalid refresh token'); + } + + const newAccessToken = generateAccessToken(userId, user.username, user.email); + let newRefreshTokenStr = ''; + + await runInTransaction(async (session) => { + const result = await generateRefreshToken( + userId, + storedToken.rootTokenId.toString(), + storedToken._id.toString(), + session + ); + newRefreshTokenStr = result.token; + + await revokeRefreshToken(storedToken.tokenHash, TokenRevocationReason.TOKEN_ROTATION, session); + }); + + return { + userId, + username: user.username, + email: user.email, + accessToken: newAccessToken, + refreshToken: newRefreshTokenStr, + }; +} + +export interface SessionSummary { + id: string; + ipAddress: string; + userAgent: string; + lastLogin: Date; + createdAt: Date; + isCurrent: boolean; +} + +export async function listSessions( + userId: string, + currentRootTokenId: mongoose.Types.ObjectId +): Promise { + const sessions = await authRepo.getActiveSessionsForUser(userId); + + return sessions.map((s) => ({ + id: s._id.toString(), + ipAddress: s.ipAddress, + userAgent: s.userAgent, + lastLogin: s.lastLogin, + createdAt: s.createdAt, + isCurrent: s.rootTokenId.equals(currentRootTokenId), + })); +} + +function assertCanRevokeOlderSessions( + currentSession: { createdAt: Date }, + targetCreatedAts: Date[] +): void { + const currentAgeMs = Date.now() - currentSession.createdAt.getTime(); + const hasOlderTarget = targetCreatedAts.some((createdAt) => createdAt < currentSession.createdAt); + + if (currentAgeMs < AuthConstants.NEW_SESSION_REVOKE_LOCK_MS && hasOlderTarget) { + throw new ForbiddenError( + 'This device is too new to sign out older devices. This unlocks 48 hours after you sign in here.' + ); + } +} + +export async function revokeSession( + userId: string, + currentRootTokenId: mongoose.Types.ObjectId, + targetSessionId: string +): Promise { + const currentSession = await authRepo.findSessionByRootTokenId(currentRootTokenId); + if (!currentSession) { + throw new UnauthorizedError('Current session not found'); + } + + if (currentSession._id.toString() === targetSessionId) { + throw new BadRequestError('Use logout to sign out of this device'); + } + + const targetSession = await authRepo.findActiveSessionByIdForUser(targetSessionId, userId); + if (!targetSession) { + throw new NotFoundError('Session not found'); + } + + assertCanRevokeOlderSessions(currentSession, [targetSession.createdAt]); + + await runInTransaction(async (session) => { + await authRepo.revokeTokenFamily( + targetSession.rootTokenId, + TokenRevocationReason.USER_REVOKED, + session + ); + await authRepo.deactivateSessionById(targetSession._id, userId, session); + }); +} + +export async function revokeAllOtherSessions( + userId: string, + currentRootTokenId: mongoose.Types.ObjectId +): Promise<{ revokedCount: number }> { + const currentSession = await authRepo.findSessionByRootTokenId(currentRootTokenId); + if (!currentSession) { + throw new UnauthorizedError('Current session not found'); + } + + const otherSessions = (await authRepo.getActiveSessionsForUser(userId)).filter( + (s) => !s._id.equals(currentSession._id) + ); + + assertCanRevokeOlderSessions( + currentSession, + otherSessions.map((s) => s.createdAt) + ); + + await runInTransaction(async (session) => { + for (const s of otherSessions) { + await authRepo.revokeTokenFamily(s.rootTokenId, TokenRevocationReason.USER_REVOKED, session); + await authRepo.deactivateSessionById(s._id, userId, session); + } + }); + + return { revokedCount: otherSessions.length }; +} + +export async function logoutUser(userId: string, storedToken?: StoredToken): Promise { + if (storedToken) { + await runInTransaction(async (session) => { + await revokeRefreshToken(storedToken.tokenHash, TokenRevocationReason.USER_LOGOUT, session); + await authRepo.deactivateSessionByRootTokenId(storedToken.rootTokenId.toString(), session); + }); + } + logInfo('User logged out', { userId }); +} + +export async function processForgotPassword( + dto: z.infer, + ipAddress: string, + userAgent: string +): Promise { + const normalizedEmail = dto.email.trim().toLowerCase(); + const emailHash = crypto.createHash('sha256').update(normalizedEmail).digest('hex'); + + const oneHourAgo = new Date(Date.now() - 60 * 60 * 1000); + const { totalCount, emailCount, lastEmailAt } = await authRepo.getRateLimitDataForPasswordReset( + emailHash, + oneHourAgo + ); + + // Rate limit: max 20 requests per emailHash per hour + if (totalCount >= AuthConstants.MAX_REQUESTS_PER_HR) { + logWarn('forgot-password: request limit exceeded', { emailHash, ip: ipAddress, userAgent }); + throw new RateLimitError(); + } + + // Rate limit: max 5 emails per emailHash per hour + if (emailCount >= AuthConstants.MAX_EMAILS_PER_HR) { + logWarn('forgot-password: email send limit exceeded', { emailHash, ip: ipAddress, userAgent }); + throw new RateLimitError(); + } + + // Cooldown: 30 seconds between email sends for this emailHash + if (lastEmailAt) { + const msSinceLastEmail = Date.now() - lastEmailAt.getTime(); + if (msSinceLastEmail < AuthConstants.RESEND_COOLDOWN_MS) { + const secondsRemaining = Math.ceil( + (AuthConstants.RESEND_COOLDOWN_MS - msSinceLastEmail) / 1000 + ); + logWarn('forgot-password: cooldown active', { + emailHash, + ip: ipAddress, + userAgent, + secondsRemaining, + }); + throw new RateLimitError( + `Please wait ${secondsRemaining.toString()} seconds before resending reset link` + ); + } + } + + const user = await userRepo.findActiveUserByEmail(normalizedEmail); + if (!user) { + await authRepo.createPasswordResetRequest({ + emailHash, + ip: ipAddress, + userAgent, + emailSent: false, + }); + logWarn('forgot-password: user not found or inactive', { ip: ipAddress, userAgent }); + return; + } + + const rawToken = crypto.randomBytes(32).toString('hex'); + const tokenHash = crypto.createHash('sha256').update(rawToken).digest('hex'); + const expiresAt = new Date(Date.now() + AuthConstants.TOKEN_EXPIRY_MS); + + await runInTransaction(async (session) => { + await authRepo.cleanupExcessPasswordResetTokens( + user._id, + AuthConstants.MAX_ACTIVE_TOKENS, + session + ); + + await authRepo.createPasswordResetRequest( + { emailHash, ip: ipAddress, userAgent, emailSent: true }, + session + ); + + await authRepo.createPasswordResetToken( + { + userId: user._id, + tokenHash, + expiresAt, + requestIp: ipAddress, + userAgent, + }, + session + ); + + const frontendUrl = process.env.FRONTEND_URL ?? ''; + const resetLink = `${frontendUrl}/reset-password?token=${rawToken}`; + const appName = process.env.APP_NAME ?? 'BookMyVenue'; + + await authRepo.createEmailTask( + { + intent: 'password_reset', + recipient: user.email, + subject: `Reset your ${appName} password`, + metadata: { resetLink }, + }, + session + ); + }); + + logInfo('forgot-password: reset email successfully synced & queued', { + userId: user._id.toString(), + ip: ipAddress, + userAgent, + }); +} + +export async function processResetPassword( + dto: z.infer, + ipAddress: string, + userAgent: string +): Promise { + const { token, password } = dto; + const tokenHash = crypto.createHash('sha256').update(token).digest('hex'); + + await runInTransaction(async (session) => { + const tokenRecord = await authRepo.markPasswordResetTokenAsUsed(tokenHash, session); + + if (!tokenRecord) { + logWarn('reset-password: token not found or already used', { ip: ipAddress, userAgent }); + throw new BadRequestError('Invalid or expired reset token'); + } + + const user = await userRepo.findActiveUserByIdWithPassword( + tokenRecord.userId.toString(), + session + ); + + if (!user) { + logWarn('reset-password: user not found or inactive', { + userId: tokenRecord.userId.toString(), + ip: ipAddress, + userAgent, + }); + throw new BadRequestError('Invalid or expired reset token'); + } + + const userId = user._id; + const isSamePassword = await bcrypt.compare(password, user.password); + + if (isSamePassword) { + await authRepo.revokeAllOtherPasswordResetTokens( + userId, + tokenRecord._id, + TokenRevocationReason.PASSWORD_REUSE_ATTEMPT, + session + ); + logWarn('reset-password: password reuse attempt', { + userId: userId.toString(), + ip: ipAddress, + userAgent, + }); + throw new BadRequestError('New password cannot be the same as your old password'); + } + + const hashedPassword = await bcrypt.hash(password, 12); + await userRepo.updateUserPassword(userId, hashedPassword, session); + + await authRepo.revokeActivePasswordResetTokens( + userId, + tokenRecord._id, + TokenRevocationReason.PASSWORD_CHANGED, + session + ); + + await authRepo.revokeAllRefreshTokensForUser( + userId, + TokenRevocationReason.PASSWORD_CHANGED, + session + ); + + await authRepo.deactivateAllSessionsForUser(userId, session); + + const appName = process.env.APP_NAME ?? 'BookMyVenue'; + await authRepo.createEmailTask( + { + intent: 'security_alert', + recipient: user.email, + subject: `Your ${appName} password was changed`, + metadata: {}, + }, + session + ); + + logInfo('reset-password: password reset successful', { + userId: userId.toString(), + ip: ipAddress, + userAgent, + }); + }); +} + +export async function changePassword( + userId: string, + dto: z.infer, + ipAddress: string, + userAgent: string +): Promise { + const session = await mongoose.startSession(); + + await session.withTransaction(async () => { + const user = await userRepo.findActiveUserByIdWithPassword(userId, session); + if (!user) { + throw new NotFoundError('User not found'); + } + + const isOldPasswordValid = await bcrypt.compare(dto.oldPassword, user.password); + if (!isOldPasswordValid) { + throw new BadRequestError('Incorrect old password'); + } + + const isSamePassword = await bcrypt.compare(dto.newPassword, user.password); + if (isSamePassword) { + throw new BadRequestError('New password cannot be the same as your old password'); + } + + const hashedPassword = await bcrypt.hash(dto.newPassword, 12); + await userRepo.updateUserPassword(userId, hashedPassword, session); + + await authRepo.revokeAllRefreshTokensForUser( + new mongoose.Types.ObjectId(userId), + TokenRevocationReason.PASSWORD_CHANGED, + session + ); + + await authRepo.deactivateAllSessionsForUser(new mongoose.Types.ObjectId(userId), session); + + const appName = process.env.APP_NAME ?? 'BookMyVenue'; + await authRepo.createEmailTask( + { + intent: 'security_alert', + recipient: user.email, + subject: `Your ${appName} password was changed`, + metadata: {}, + }, + session + ); + + logInfo('change-password: password changed successfully', { + userId, + ip: ipAddress, + userAgent, + }); + }); + await session.endSession(); +} diff --git a/server/src/modules/auth/auth.validator.ts b/server/src/modules/auth/auth.validator.ts new file mode 100644 index 0000000000..f484502b1d --- /dev/null +++ b/server/src/modules/auth/auth.validator.ts @@ -0,0 +1,67 @@ +import { z } from 'zod'; + +export const registerSchema = z.object({ + username: z.string().trim().min(3).max(30), + email: z.email('Invalid email Format'), + password: z + .string() + .min(8, 'Password must be at least 8 characters') + .regex( + /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]+$/, + 'Password must contain at least one uppercase letter, one lowercase letter, one number and one special character' + ) + .max(100), +}); + +export const loginSchema = z + .object({ + username: z.string().trim().min(3).max(30).optional(), + email: z.email('Invalid email Format').optional(), + password: z + .string() + .min(8, 'Password must be at least 8 characters') + .regex( + /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!#%*?&])[A-Za-z\d@$!#%*?&]+$/, + 'Password must contain at least one uppercase letter, one lowercase letter, one number and one special character' + ) + .max(100), + }) + .refine((data) => data.username ?? data.email, { + message: 'Either username or email is required', + path: ['username', 'email'], + }); + +export const forgotPasswordSchema = z.object({ + email: z.email('Invalid email format'), +}); + +export const resetPasswordSchema = z.object({ + token: z.string().min(1, 'Token is required'), + password: z + .string() + .min(8, 'Password must be at least 8 characters') + .regex( + /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]+$/, + 'Password must contain at least one uppercase letter, one lowercase letter, one number and one special character' + ) + .max(100), +}); + +export const changePasswordSchema = z.object({ + oldPassword: z.string().min(1, 'Old password is required'), + newPassword: z + .string() + .min(8, 'Password must be at least 8 characters') + .regex( + /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]+$/, + 'Password must contain at least one uppercase letter, one lowercase letter, one number and one special character' + ) + .max(100), +}); + +export const sessionIdParamSchema = z.object({ + sessionId: z + .string() + .trim() + .regex(/^[a-f\d]{24}$/i, 'Invalid session ID'), +}); diff --git a/server/src/modules/auth/models/password-reset-request.model.ts b/server/src/modules/auth/models/password-reset-request.model.ts new file mode 100644 index 0000000000..de6ae8b27d --- /dev/null +++ b/server/src/modules/auth/models/password-reset-request.model.ts @@ -0,0 +1,30 @@ +import type { Document } from 'mongoose'; +import mongoose, { Schema } from 'mongoose'; + +export interface IPasswordResetRequest extends Document { + emailHash: string; + ip: string; + userAgent: string; + emailSent: boolean; + createdAt: Date; + updatedAt: Date; +} + +const PasswordResetRequestSchema = new Schema( + { + emailHash: { type: String, required: true }, + ip: { type: String, required: true }, + userAgent: { type: String, required: true }, + emailSent: { type: Boolean, default: false }, + createdAt: { type: Date, default: Date.now, expires: 7200 }, + }, + { timestamps: true } +); + +PasswordResetRequestSchema.index({ emailHash: 1, createdAt: -1 }); + +export const PasswordResetRequestModel = mongoose.model( + 'PasswordResetRequests', + PasswordResetRequestSchema, + 'PasswordResetRequests' +); diff --git a/server/src/modules/auth/models/password-reset-token.model.ts b/server/src/modules/auth/models/password-reset-token.model.ts new file mode 100644 index 0000000000..2ec430bd1a --- /dev/null +++ b/server/src/modules/auth/models/password-reset-token.model.ts @@ -0,0 +1,47 @@ +import type { Document } from 'mongoose'; +import mongoose, { Schema } from 'mongoose'; + +export interface IPasswordResetToken extends Document { + userId: mongoose.Types.ObjectId; + tokenHash: string; + expiresAt: Date; + used: boolean; + usedAt: Date | null; + active: boolean; + deleted: boolean; + requestIp: string; + userAgent: string; + createdAt: Date; + updatedAt: Date; + revokedAt: Date | null; + revokedReason: string | null; +} + +const PasswordResetTokenSchema = new Schema( + { + userId: { type: Schema.Types.ObjectId, ref: 'Users', required: true }, + tokenHash: { type: String, required: true }, + expiresAt: { type: Date, required: true, index: { expires: 0 } }, + used: { type: Boolean, default: false }, + usedAt: { type: Date, default: null }, + active: { type: Boolean, default: true }, + deleted: { type: Boolean, default: false }, + requestIp: { type: String, required: true }, + userAgent: { type: String, required: true }, + revokedAt: { type: Date, default: null }, + revokedReason: { type: String, default: null }, + }, + { timestamps: true } +); + +// Fast lookup by hash during reset validation +PasswordResetTokenSchema.index({ tokenHash: 1 }, { unique: true }); + +// Bulk-invalidate all tokens for a user after successful reset +PasswordResetTokenSchema.index({ userId: 1 }); + +export const PasswordResetTokenModel = mongoose.model( + 'PasswordResetTokens', + PasswordResetTokenSchema, + 'PasswordResetTokens' +); diff --git a/server/src/modules/auth/models/refresh-token.model.ts b/server/src/modules/auth/models/refresh-token.model.ts new file mode 100644 index 0000000000..8c4cfd13f9 --- /dev/null +++ b/server/src/modules/auth/models/refresh-token.model.ts @@ -0,0 +1,43 @@ +import type { Document } from 'mongoose'; +import mongoose, { Schema } from 'mongoose'; + +export interface IRefreshToken extends Document { + userId: mongoose.Types.ObjectId; + tokenHash: string; + rootTokenId: mongoose.Types.ObjectId; + parentTokenId: mongoose.Types.ObjectId | null; + isUsed: boolean; + expiresAt: Date; + active: boolean; + deleted: boolean; + revokedAt: Date | null; + revokedReason: string | null; + createdAt: Date; + updatedAt: Date; +} + +const RefreshTokenSchema = new Schema( + { + userId: { type: Schema.Types.ObjectId, ref: 'Users', required: true }, + tokenHash: { type: String, required: true }, + rootTokenId: { type: Schema.Types.ObjectId, ref: 'RefreshTokens', required: true }, + parentTokenId: { type: Schema.Types.ObjectId, ref: 'RefreshTokens', default: null }, + isUsed: { type: Boolean, default: false }, + expiresAt: { type: Date, required: true, index: { expires: 0 } }, + active: { type: Boolean, default: true }, + deleted: { type: Boolean, default: false }, + revokedAt: { type: Date, default: null }, + revokedReason: { type: String, default: null }, + }, + { timestamps: true } +); + +RefreshTokenSchema.index({ tokenHash: 1 }, { unique: true }); +RefreshTokenSchema.index({ userId: 1, tokenHash: 1 }); +RefreshTokenSchema.index({ rootTokenId: 1 }); + +export const RefreshTokenModel = mongoose.model( + 'RefreshTokens', + RefreshTokenSchema, + 'RefreshTokens' +); diff --git a/server/src/modules/auth/models/session.model.ts b/server/src/modules/auth/models/session.model.ts new file mode 100644 index 0000000000..96c6192e6e --- /dev/null +++ b/server/src/modules/auth/models/session.model.ts @@ -0,0 +1,38 @@ +import type { Document } from 'mongoose'; +import mongoose, { Schema } from 'mongoose'; + +export interface ISession extends Document { + userId: mongoose.Types.ObjectId; + rootTokenId: mongoose.Types.ObjectId; + absoluteExpiresAt: Date; + lastLogin: Date; + ipAddress: string; + userAgent: string; + active: boolean; + deleted: boolean; + createdAt: Date; + updatedAt: Date; +} + +const SessionSchema = new Schema( + { + userId: { type: Schema.Types.ObjectId, ref: 'Users', required: true }, + rootTokenId: { + type: Schema.Types.ObjectId, + ref: 'RefreshTokens', + required: true, + unique: true, + }, + absoluteExpiresAt: { type: Date, required: true, index: { expires: 0 } }, + lastLogin: { type: Date, default: Date.now }, + ipAddress: { type: String, required: true }, + userAgent: { type: String, required: true }, + active: { type: Boolean, default: true }, + deleted: { type: Boolean, default: false }, + }, + { timestamps: true } +); + +SessionSchema.index({ userId: 1 }); + +export const SessionModel = mongoose.model('Sessions', SessionSchema, 'Sessions'); diff --git a/server/src/modules/availability/availability.controller.ts b/server/src/modules/availability/availability.controller.ts new file mode 100644 index 0000000000..04ad9b1285 --- /dev/null +++ b/server/src/modules/availability/availability.controller.ts @@ -0,0 +1,76 @@ +import type { Request, Response } from 'express'; +import { findVenueById } from '../venue/venue.repository'; +import { fetchActiveConflicts } from '../booking/booking.repository'; +import { generateAvailability, getBookableDates } from './availability.workflow'; +import { ResponseUtil } from '../../utils/responseUtils'; +import { logError, logInfo } from '../../utils/logger'; +import crypto from 'crypto'; +import { validateDateForVenue, type VenueIdParamDTO } from '../booking/booking.validator'; +import type { AvailabilityQueryDTO } from './availability.validator'; + +export const getVenueAvailability = async (req: Request, res: Response): Promise => { + try { + const validated = req.validated; + if (!validated?.params) { + ResponseUtil.badRequest(res, 'Validation failed'); + return; + } + + const { id } = validated.params as VenueIdParamDTO; + const { date } = validated.query as AvailabilityQueryDTO; + + const venue = await findVenueById(id); + if (!venue) { + ResponseUtil.notFound(res, 'Venue not found'); + return; + } + + // Only Approved, active, non-deleted venues expose availability. + // Return 404 (not 403) to avoid leaking venue existence for non-public venues. + if (venue.status !== 'Approved' || !venue.active || venue.deleted) { + ResponseUtil.notFound(res, 'Venue not found'); + return; + } + + if (!date) { + const bookableData = getBookableDates(venue); + ResponseUtil.success(res, 'Bookable dates calculated successfully', bookableData); + return; + } + + const dateCheck = validateDateForVenue(venue, date); + if (!dateCheck.valid) { + ResponseUtil.badRequest(res, dateCheck.reason ?? 'This date is not available for booking.'); + return; + } + + const sessionToken = req.headers['x-session-token'] as string | undefined; + const sessionTokenHash = sessionToken + ? crypto.createHash('sha256').update(sessionToken).digest('hex') + : undefined; + const userId = req.user?.userId; + + logInfo('Availability check: self-lock exclusion parameters extracted', { + venueId: id, + date, + userId: userId ?? 'Unauthenticated', + hasSessionToken: !!sessionToken, + sessionTokenHash, + }); + + // Fetch active conflicts (Bookings and locks) + const conflicts = await fetchActiveConflicts(id, date, { + excludeUserId: userId, + excludeSessionTokenHash: sessionTokenHash, + }); + + // Calculate availability data + const availabilityData = generateAvailability(venue, date, conflicts); + ResponseUtil.success(res, 'Availability calculated successfully', availabilityData); + return; + } catch (error) { + logError('Error computing availability', error as Record); + ResponseUtil.serverUnavailable(res, 'Failed to compute availability'); + return; + } +}; diff --git a/server/src/modules/availability/availability.repository.ts b/server/src/modules/availability/availability.repository.ts new file mode 100644 index 0000000000..8ebf9b34ca --- /dev/null +++ b/server/src/modules/availability/availability.repository.ts @@ -0,0 +1,16 @@ +import { fetchActiveConflicts } from '../booking/booking.repository'; + +/** + * Fetches all active time-slot conflicts (Locks + confirmed Bookings) + * for a given venue and date. + * + * Delegates to `booking.repository.fetchActiveConflicts` which is the + * single source of truth for this query, shared by both the availability + * check and the webhook collision re-check. + */ +export const fetchConflictsForDate = async ( + venueId: string, + date: string +): Promise<{ start: number; end: number }[]> => { + return fetchActiveConflicts(venueId, date); +}; diff --git a/server/src/modules/availability/availability.router.ts b/server/src/modules/availability/availability.router.ts new file mode 100644 index 0000000000..9a0dac7d47 --- /dev/null +++ b/server/src/modules/availability/availability.router.ts @@ -0,0 +1,161 @@ +import { Router } from 'express'; +import type { Router as ExpressRouter } from 'express'; +import { + validateBody, + validateParams, + validateQuery, +} from '../../middlewares/validation.middleware'; +import { verifyAccessToken, verifyAccessTokenOptional } from '../../middlewares/auth.middleware'; +import { idempotencyMiddleware } from '../../middlewares/idempotency.middleware'; +import { requirePermission } from '../../middlewares/rbac.middleware'; +import { PERMISSIONS as P } from '../../constants/permissions'; +import { venueIdParamSchema } from '../venue/venue.validator'; +import { blockSlotBodySchema } from '../booking/booking.validator'; +import * as bookingController from '../booking/booking.controller'; +import * as availabilityController from './availability.controller'; +import { availabilityQuerySchema } from './availability.validator'; + +const router: ExpressRouter = Router(); + +/** + * @openapi + * /availability/{id}: + * get: + * tags: [Availability] + * summary: Get venue availability slots for a given date range + * parameters: + * - in: path + * name: id + * required: true + * description: Venue MongoDB ObjectId + * schema: + * type: string + * example: 64b1f2c3d4e5f6a7b8c9d0e1 + * - in: query + * name: date + * required: false + * description: Target date in YYYY-MM-DD format. If omitted, returns bookable dates for the venue. + * schema: + * type: string + * example: '2025-12-25' + * responses: + * 200: + * description: Availability grid or bookable dates metadata + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/SuccessResponse' + * 400: + * description: Invalid venue ID or date format + * 404: + * description: Venue not found + */ +router + .route('/:id') + .get( + verifyAccessTokenOptional, + validateParams(venueIdParamSchema), + validateQuery(availabilityQuerySchema), + availabilityController.getVenueAvailability + ); + +/** + * @openapi + * /availability/{id}/block: + * post: + * tags: [Availability] + * summary: Block a time slot for a venue (Step 1 of 3 in the booking flow) + * description: | + * Acquires a time-limited DB lock on the requested slot. + * Does NOT create a Razorpay order — that happens in Step 2 (`/bookings/checkout`). + * Lock expires automatically if checkout is not initiated within the window. + * security: + * - bearerAuth: [] + * parameters: + * - in: path + * name: id + * required: true + * description: Venue MongoDB ObjectId + * schema: + * type: string + * example: 64b1f2c3d4e5f6a7b8c9d0e1 + * requestBody: + * required: true + * content: + * application/json: + * schema: + * type: object + * required: [date, startTime, endTime, expectedPrice] + * properties: + * date: + * type: string + * description: Booking date in YYYY-MM-DD + * example: '2025-12-25' + * startTime: + * type: integer + * description: Slot start in minutes from midnight (0–1439) + * example: 600 + * endTime: + * type: integer + * description: Slot end in minutes from midnight (1–1440) + * example: 720 + * expectedPrice: + * type: number + * description: Client-calculated price in rupees for server sanity check + * example: 5000 + * responses: + * 200: + * description: Slot locked — returns lock ID for use in checkout + * content: + * application/json: + * schema: + * allOf: + * - $ref: '#/components/schemas/SuccessResponse' + * - type: object + * properties: + * data: + * type: object + * properties: + * lockId: + * type: string + * expiresAt: + * type: string + * format: date-time + * 400: + * description: Slot unavailable or validation error + * 401: + * description: Not authenticated + * 403: + * description: Insufficient permissions + * 409: + * description: Slot already locked by another user + */ +router + .route('/:id/block') + .post( + verifyAccessToken, + idempotencyMiddleware(), + requirePermission(P.bookings.create), + validateParams(venueIdParamSchema), + validateBody(blockSlotBodySchema), + bookingController.blockSlot + ); + +/** + * @openapi + * /availability/lock: + * delete: + * tags: [Availability] + * summary: Release a slot lock + * description: Manually release a lock before it expires + * security: + * - bearerAuth: [] + * responses: + * 200: + * description: Lock released successfully + * 401: + * description: Not authenticated + */ +router.route('/lock').delete(verifyAccessTokenOptional, bookingController.releaseLock); + +export { router as availabilityRouter }; diff --git a/server/src/modules/availability/availability.validator.ts b/server/src/modules/availability/availability.validator.ts new file mode 100644 index 0000000000..e975f07287 --- /dev/null +++ b/server/src/modules/availability/availability.validator.ts @@ -0,0 +1,15 @@ +import { z } from 'zod'; +import { isBookableDate } from '../../utils/timeUtils'; + +export const availabilityQuerySchema = z.object({ + date: z + .string() + .trim() + .regex(/^\d{4}-\d{2}-\d{2}$/, 'Date query parameter must be in YYYY-MM-DD format') + .optional() + .refine((val) => !val || isBookableDate(val), { + message: 'Date must be between tomorrow and 90 days from today', + }), +}); + +export type AvailabilityQueryDTO = z.infer; diff --git a/server/src/modules/availability/availability.workflow.ts b/server/src/modules/availability/availability.workflow.ts new file mode 100644 index 0000000000..81336ed0f1 --- /dev/null +++ b/server/src/modules/availability/availability.workflow.ts @@ -0,0 +1,170 @@ +import type { IVenue } from '../venue/venue.types'; +import { + timeStringToMinutes, + minutesToTimeString, + checkOverlap, + toLocalDateString, +} from '../../utils/timeUtils'; + +interface AvailabilitySlot { + slotId: string; + name: string | null; + startTime: string; + endTime: string; + price: number; + isAvailable: boolean; + reason: string | null; +} + +interface AvailabilityResponse { + venueId: unknown; + date: string; + bookingType: 'fixedBooking' | 'flexibleBooking'; + slots: AvailabilitySlot[]; +} + +export const generateAvailability = ( + venue: IVenue, + date: string, + externalConflicts: { start: number; end: number }[] +): AvailabilityResponse => { + // Merge venue blocked times/breaks with external conflicts + const internalConflicts = (venue.blockedTimes ?? []).map((bt) => ({ + start: timeStringToMinutes(bt.fromTime), + end: timeStringToMinutes(bt.toTime), + })); + const allConflicts = [...externalConflicts, ...internalConflicts]; + + const slots: AvailabilitySlot[] = []; + + // Fixed bookings branch + if (venue.bookingType === 'fixedBooking') { + for (const pkg of venue.fixedPackages ?? []) { + const startMin = timeStringToMinutes(pkg.startTime); + const endMin = timeStringToMinutes(pkg.endTime); + + const isBlocked = checkOverlap(startMin, endMin, allConflicts); + + slots.push({ + slotId: pkg.slotName.replace(/\s+/g, '_').toLowerCase(), + name: pkg.slotName, + startTime: pkg.startTime, + endTime: pkg.endTime, + price: pkg.price, + isAvailable: !isBlocked, + reason: isBlocked ? 'UNAVAILABLE' : null, + }); + } + return { venueId: venue._id, date, bookingType: 'fixedBooking', slots }; + } + + // Flexible bookings branch + if (!venue.workingHours) { + throw new Error('Working hours are required for flexible booking venues'); + } + const openMin = timeStringToMinutes(venue.workingHours.open); + const closeMin = timeStringToMinutes(venue.workingHours.close); + const duration = venue.flexibleBooking?.slotDuration ?? 60; + const buffer = venue.flexibleBooking?.bufferTime ?? 0; + + let currentStart = openMin; + + while (currentStart + duration <= closeMin) { + const currentEnd = currentStart + duration; + const isBlocked = checkOverlap(currentStart, currentEnd, allConflicts); + + // Determine pricing based on base price or rules + if (!venue.pricing) { + throw new Error('Pricing configuration missing for flexible booking venue'); + } + let appliedPrice = venue.pricing.basePrice; + if (venue.pricing.pricingType === 'timeBasedPricing') { + for (const rule of venue.pricing.pricingRules) { + const ruleStart = timeStringToMinutes(rule.fromTime); + const ruleEnd = timeStringToMinutes(rule.toTime); + if (currentStart >= ruleStart && currentStart < ruleEnd) { + appliedPrice = rule.price; + break; + } + } + } + + slots.push({ + slotId: `${currentStart.toString()}-${currentEnd.toString()}`, + name: null, + startTime: minutesToTimeString(currentStart), + endTime: minutesToTimeString(currentEnd), + price: appliedPrice, + isAvailable: !isBlocked, + reason: isBlocked ? 'UNAVAILABLE' : null, + }); + + // Advance loop adding slot duration and buffer + currentStart = currentEnd + buffer; + } + + return { venueId: venue._id, date, bookingType: 'flexibleBooking', slots }; +}; + +export interface BookableDatesResponse { + bookableDates: string[]; + disabledDates: string[]; + maxDate: string; +} + +export const getBookableDates = (venue: IVenue): BookableDatesResponse => { + const today = new Date(); + today.setHours(0, 0, 0, 0); + + const tomorrow = new Date(today); + tomorrow.setDate(tomorrow.getDate() + 1); + + const maxDateObj = new Date(today); + maxDateObj.setDate(maxDateObj.getDate() + 90); + + // Apply blockedAfterDate (tightest date wins) + if (venue.temporaryBlockAfterDate) { + const blockDate = new Date(venue.temporaryBlockAfterDate); + if (blockDate < maxDateObj) { + maxDateObj.setTime(blockDate.getTime()); + } + } + if (venue.inactivity?.blockedAfterDate) { + const blockDate = new Date(venue.inactivity.blockedAfterDate); + if (blockDate < maxDateObj) { + maxDateObj.setTime(blockDate.getTime()); + } + } + + const bookableDates: string[] = []; + const disabledDates: string[] = []; + + const blockedDatesStr = venue.blockedDates.map((d) => d.toISOString().split('T')[0]); + + const workingDays = venue.workingDays; + + for (let d = new Date(today); d <= maxDateObj; d.setDate(d.getDate() + 1)) { + const dateStr = toLocalDateString(d); + + if (d < tomorrow) { + disabledDates.push(dateStr); + continue; + } + + const dayName = d.toLocaleDateString('en-US', { weekday: 'long' }); + const isWorkingDay = workingDays.includes(dayName); + const isBlocked = blockedDatesStr.includes(dateStr); + + if (isWorkingDay && !isBlocked) { + bookableDates.push(dateStr); + } else { + disabledDates.push(dateStr); + } + } + + return { + bookableDates, + disabledDates, + maxDate: toLocalDateString(maxDateObj), + }; +}; diff --git a/server/src/modules/booking/booking.controller.ts b/server/src/modules/booking/booking.controller.ts new file mode 100644 index 0000000000..29d00239b5 --- /dev/null +++ b/server/src/modules/booking/booking.controller.ts @@ -0,0 +1,328 @@ +import type { Request, Response } from 'express'; +import { Types } from 'mongoose'; +import { ResponseUtil } from '../../utils/responseUtils'; +import { logError } from '../../utils/logger'; +import * as workflow from './booking.workflow'; +import * as service from './booking.service'; +import type { BookingStatusType } from '../../constants/booking.constants'; +import { verifyPaymentSignature } from '../../services/razorpay.service'; +import { getUserReviewedBookings } from '../review/review.service'; +import { findVenueById } from '../venue/venue.repository'; +import type { + BlockSlotBodyDTO, + CheckoutBodyDTO, + SaveBookerDetailsBodyDTO, + VerifyPaymentBodyDTO, + VenueIdParamDTO, + AdminBookingFiltersDTO, +} from './booking.validator'; + +export const blockSlot = async (req: Request, res: Response): Promise => { + try { + const validated = req.validated; + if (!validated) { + ResponseUtil.badRequest(res, 'Validation failed'); + return; + } + const { id: venueId } = validated.params as VenueIdParamDTO; + const { date, selectedSlots, expectedPrice } = validated.body as BlockSlotBodyDTO; + const userId = req.user?.userId; + + if (!userId) { + ResponseUtil.unauthorized(res, 'User identity not found in token'); + return; + } + + // Guard: only Approved, active, non-deleted venues accept slot locks. + // Return 404 (not 403) to avoid leaking existence of non-public venues. + const venue = await findVenueById(venueId); + if (!venue || !venue.active || venue.status !== 'Approved' || venue.deleted) { + ResponseUtil.notFound(res, 'Venue not found'); + return; + } + + const sessionToken = req.headers['x-session-token'] as string | undefined; + + const result = await workflow.blockSlotWorkflow( + venueId, + userId, + date, + expectedPrice, + selectedSlots, + sessionToken + ); + + ResponseUtil.success(res, 'Slot locked successfully. Proceed to checkout.', result); + } catch (err) { + const error = err as Error; + if (error.message.includes('not found') || error.message.includes('unavailable')) { + ResponseUtil.notFound(res, error.message); + } else if ( + error.message.includes('no longer available') || + error.message.includes('Someone else is booking') + ) { + ResponseUtil.conflict(res, error.message); + } else if (error.message.includes('Invalid') || error.message.includes('mismatch')) { + ResponseUtil.badRequest(res, error.message); + } else { + logError('blockSlot controller error', { + module: 'booking.controller.ts/blockSlot', + error: error.message, + }); + ResponseUtil.internalServerError(res, 'Failed to acquire slot lock. Please try again.'); + } + } +}; + +export const saveBookerDetails = async (req: Request, res: Response): Promise => { + try { + const validated = req.validated; + if (!validated) { + ResponseUtil.badRequest(res, 'Validation failed'); + return; + } + const { lockId, guestCount, eventType, bookerInfo } = + validated.body as SaveBookerDetailsBodyDTO; + const userId = req.user?.userId; + + if (!userId) { + ResponseUtil.unauthorized(res, 'User identity not found in token'); + return; + } + + await workflow.saveBookerDetailsWorkflow(lockId, userId, guestCount, eventType, bookerInfo); + + ResponseUtil.success(res, 'Booker details saved successfully.'); + } catch (err) { + const error = err as Error; + if (error.message.includes('expired')) { + ResponseUtil.badRequest(res, error.message); + } else { + logError('saveBookerDetails controller error', { + module: 'booking.controller.ts/saveBookerDetails', + error: error.message, + }); + ResponseUtil.internalServerError(res, 'Failed to save booker details. Please try again.'); + } + } +}; + +export const initCheckout = async (req: Request, res: Response): Promise => { + try { + const validated = req.validated; + if (!validated) { + ResponseUtil.badRequest(res, 'Validation failed'); + return; + } + const { lockId } = validated.body as CheckoutBodyDTO; + const userId = req.user?.userId; + + if (!userId) { + ResponseUtil.unauthorized(res, 'User identity not found in token'); + return; + } + + const result = await workflow.initCheckoutWorkflow(userId, lockId); + + ResponseUtil.success(res, 'Checkout order created successfully.', result); + } catch (err) { + const error = err as Error; + if (error.message.includes('expired') || error.message.includes('Insufficient')) { + ResponseUtil.badRequest(res, error.message); + } else { + logError('initCheckout controller error', { + module: 'booking.controller.ts/initCheckout', + error: error.message, + }); + ResponseUtil.internalServerError(res, 'Failed to create checkout order. Please try again.'); + } + } +}; + +export const verifyPayment = async (req: Request, res: Response): Promise => { + try { + const { orderId, paymentId, signature } = req.validated?.body as VerifyPaymentBodyDTO; + + const isAuthentic = verifyPaymentSignature({ + orderId, + paymentId, + signature, + }); + + if (!isAuthentic) { + ResponseUtil.badRequest(res, 'Invalid payment signature'); + return; + } + + const booking = await service.getBookingByPaymentReference(paymentId); + if (booking) { + const bookingRef = `BMV-${booking._id.toString().slice(-6).toUpperCase()}`; + ResponseUtil.success(res, 'Payment verified successfully', { + _id: booking._id.toString(), + bookingRef, + }); + } else { + ResponseUtil.success(res, 'Payment verified successfully'); + } + } catch (err) { + const error = err as Error; + logError('verifyPayment controller error', { + module: 'booking.controller.ts/verifyPayment', + error: error.message, + }); + ResponseUtil.internalServerError(res, 'Failed to verify payment'); + } +}; + +export const releaseLock = async (req: Request, res: Response): Promise => { + try { + const userId = req.user?.userId; + const sessionToken = req.headers['x-session-token'] as string | undefined; + + await workflow.releaseLockWorkflow(userId, sessionToken); + + ResponseUtil.success(res, 'Lock released successfully'); + } catch (err) { + const error = err as Error; + logError('releaseLock controller error', { + module: 'booking.controller.ts/releaseLock', + error: error.message, + }); + ResponseUtil.internalServerError(res, 'Failed to release lock'); + } +}; + +export const getMyBookings = async (req: Request, res: Response): Promise => { + try { + const userId = req.user?.userId; + if (!userId) { + ResponseUtil.unauthorized(res, 'User identity not found in token'); + return; + } + + const [bookingsResult, reviewedBookingIds] = await Promise.all([ + service.getMyBookings(userId), + getUserReviewedBookings(userId), + ]); + + // Merge hasReview flag into completed bookings + const result = { + ...bookingsResult, + bookings: { + ...bookingsResult.bookings, + completed: bookingsResult.bookings.completed.map((booking: Record) => ({ + ...booking, + hasReview: reviewedBookingIds.has(booking._id as string), + })), + }, + }; + + ResponseUtil.success(res, 'My bookings retrieved successfully', result); + } catch (err) { + const error = err as Error; + logError('fetchMyBookings controller error', { + module: 'booking.controller.ts/fetchMyBookings', + error: error.message, + }); + ResponseUtil.internalServerError(res, 'Failed to fetch your bookings.'); + } +}; + +export const getBookingById = async (req: Request, res: Response): Promise => { + try { + const userId = req.user?.userId; + if (!userId) { + ResponseUtil.unauthorized(res, 'User identity not found in token'); + return; + } + + const bookingId = req.params.bookingRefId as string; + const isBookingRef = bookingId.toUpperCase().startsWith('BMV-') && bookingId.length === 10; + if (!Types.ObjectId.isValid(bookingId) && !isBookingRef) { + ResponseUtil.badRequest(res, 'Invalid booking ID or reference'); + return; + } + + const booking = await service.getBookingById(bookingId, userId); + if (!booking) { + ResponseUtil.notFound(res, 'Booking not found'); + return; + } + + ResponseUtil.success(res, 'Booking details retrieved successfully', booking); + } catch (err) { + const error = err as Error; + logError('getBookingById controller error', { + module: 'booking.controller.ts/getBookingById', + error: error.message, + }); + ResponseUtil.internalServerError(res, 'Failed to fetch booking details.'); + } +}; + +export const cancelBooking = async (req: Request, res: Response): Promise => { + try { + const userId = req.user?.userId; + if (!userId) { + ResponseUtil.unauthorized(res, 'User identity not found in token'); + return; + } + + const bookingId = req.params.bookingRefId as string; + const reason = (req.body as { reason?: string }).reason; + const isBookingRef = bookingId.toUpperCase().startsWith('BMV-') && bookingId.length === 10; + if (!Types.ObjectId.isValid(bookingId) && !isBookingRef) { + ResponseUtil.badRequest(res, 'Invalid booking ID or reference'); + return; + } + + await workflow.cancelBookingWorkflow(userId, bookingId, reason); + + ResponseUtil.success(res, 'Booking cancelled successfully'); + } catch (err) { + const error = err as Error; + if (error.message.includes('not found')) { + ResponseUtil.notFound(res, error.message); + } else if (error.message.includes('already been cancelled')) { + ResponseUtil.conflict(res, error.message); + } else if ( + error.message.includes('Cannot') || + error.message.includes('Only confirmed') || + error.message.includes('Cancellation window') + ) { + ResponseUtil.badRequest(res, error.message); + } else { + logError('cancelBooking controller error', { + module: 'booking.controller.ts/cancelBooking', + error: error.message, + }); + ResponseUtil.internalServerError(res, 'Failed to cancel booking. Please try again.'); + } + } +}; + +export const getAllBookings = async (req: Request, res: Response): Promise => { + try { + const { status, venueId } = req.validated?.query as AdminBookingFiltersDTO; + const paginationParams = req.pagination ?? { page: 1, limit: 10, skip: 0, sort: '' }; + const result = await service.getAllBookings(paginationParams, { + status: status as BookingStatusType | undefined, + venueId, + }); + + ResponseUtil.paginated( + res, + 'All bookings retrieved successfully', + result.bookings, + result.pagination, + 'bookings' + ); + } catch (err) { + const error = err as Error; + logError('getAllBookings controller error', { + module: 'booking.controller.ts/getAllBookings', + error: error.message, + }); + ResponseUtil.internalServerError(res, 'Failed to fetch all bookings.'); + } +}; diff --git a/server/src/modules/booking/booking.repository.ts b/server/src/modules/booking/booking.repository.ts new file mode 100644 index 0000000000..a0cc195a16 --- /dev/null +++ b/server/src/modules/booking/booking.repository.ts @@ -0,0 +1,617 @@ +import { Types, type ClientSession } from 'mongoose'; +import { buildPaginationMeta } from '../../utils/paginationUtils'; +import { BookingStatus, type BookingStatusType } from '../../constants/booking.constants'; +import { PaymentStatus, type PaymentStatusType } from '../../constants/payment.constants'; +import { LockModel } from './models/lock.model'; +import { BookingModel } from './models/booking.model'; +import { FailedBookingModel } from './models/failedBooking.model'; +import { ProcessedWebhookModel } from './models/processedWebhook.model'; +import { VenueModel } from '../venue/venue.model'; +import type { IVenue, IRefundRule } from '../venue/venue.types'; +import type { IBooking } from './booking.types'; +import type { ILock, IContractSnapshot } from './lock.types'; +import type { PaginationParams, PaginatedResponse } from '../../types/pagination.types'; +import { minutesToTimeString } from '../../utils/timeUtils'; + +function resolveRefundPct(venueRaw: unknown, bookingDate: string): { pct: number; label: string } { + const venue = venueRaw as IVenue; + + if (venue.cancellation.policy !== 'refundable') { + return { pct: 0, label: 'Non-refundable' }; + } + + const rules: IRefundRule[] = venue.cancellation.refundRules; + if (rules.length === 0) { + if (venue.cancellation.refundType === 'fullRefund') { + return { pct: 100, label: 'Full Refund' }; + } + return { pct: 0, label: 'Non-refundable' }; + } + + const sortedRules = [...rules].sort((a, b) => b.daysBefore - a.daysBefore); + + const nowMs = Date.now(); + const bookingDateMs = new Date(`${bookingDate}T00:00:00`).getTime(); + const daysUntilBooking = Math.floor((bookingDateMs - nowMs) / (1000 * 60 * 60 * 24)); + + const matchedRule = sortedRules.find((rule) => daysUntilBooking >= rule.daysBefore); + + if (matchedRule) { + return { + pct: matchedRule.refundPercentage, + label: `Refundable (${String(matchedRule.refundPercentage)}% up to ${String(matchedRule.daysBefore)} days before)`, + }; + } + + return { pct: 0, label: 'Non-refundable' }; +} + +export function resolveRefundPctFromSnapshot( + cancellation: IContractSnapshot['cancellation'], + bookingDate: string +): { pct: number; label: string } { + if (cancellation.policy !== 'refundable') { + return { pct: 0, label: 'Non-refundable' }; + } + + const rules = cancellation.refundRules; + if (rules.length === 0) { + if (cancellation.refundType === 'fullRefund') { + return { pct: 100, label: 'Full Refund' }; + } + return { pct: 0, label: 'Non-refundable' }; + } + + const sortedRules = [...rules].sort((a, b) => b.daysBefore - a.daysBefore); + const nowMs = Date.now(); + const bookingDateMs = new Date(`${bookingDate}T00:00:00`).getTime(); + const daysUntilBooking = Math.floor((bookingDateMs - nowMs) / (1000 * 60 * 60 * 24)); + + const matchedRule = sortedRules.find((rule) => daysUntilBooking >= rule.daysBefore); + if (matchedRule) { + return { + pct: matchedRule.refundPercentage, + label: `Refundable (${String(matchedRule.refundPercentage)}% up to ${String(matchedRule.daysBefore)} days before)`, + }; + } + + return { pct: 0, label: 'Non-refundable' }; +} + +export interface AggregatedBooking { + _id: Types.ObjectId; + userId: Types.ObjectId; + venueId: Types.ObjectId; + date: string; + startTime: number; + endTime: number; + price: number; + paymentReference: string; + status: BookingStatusType; + paymentStatus?: PaymentStatusType; + guestCount?: number; + eventType?: string; + bookerInfo?: { + name?: string; + email?: string; + phone?: string; + place?: string; + note?: string; + }; + paymentMethod?: string; + advancePaid?: number; + remainingAmount?: number; + createdAt: Date; + updatedAt: Date; + venue: IVenue & { _id: Types.ObjectId }; + contractSnapshot?: IContractSnapshot; +} + +export async function fetchMyBookings(userId: string): Promise<{ + bookings: { + upcoming: Record[]; + cancelled: Record[]; + completed: Record[]; + }; +}> { + const bookings = await BookingModel.aggregate([ + { $match: { userId: new Types.ObjectId(userId) } }, + { + $lookup: { + from: 'Venues', + localField: 'venueId', + foreignField: '_id', + as: 'venue', + }, + }, + { $unwind: '$venue' }, + { $sort: { date: 1, startTime: 1 } }, + ]); + + const now = new Date(); + const upcoming = []; + const cancelled = []; + const completed = []; + + for (const b of bookings) { + const bookingStart = new Date(`${b.date}T00:00:00`); + bookingStart.setMinutes(b.startTime); + const bookingEnd = new Date(`${b.date}T00:00:00`); + bookingEnd.setMinutes(b.endTime); + + let uiStatus: string; + if (b.status === BookingStatus.CANCELLED) { + uiStatus = 'cancelled'; + } else if (b.status === BookingStatus.COMPLETED) { + uiStatus = 'completed'; + } else if (b.status === BookingStatus.IN_PROGRESS) { + uiStatus = 'in_progress'; + } else if (bookingEnd < now) { + uiStatus = 'completed'; + } else if (bookingStart <= now && bookingEnd > now) { + uiStatus = 'in_progress'; + } else { + uiStatus = 'upcoming'; + } + + const dto = { + _id: b._id.toString(), + bookingRef: `BMV-${b._id.toString().slice(-6).toUpperCase()}`, + venueName: b.venue.name, + venueId: b.venue._id.toString(), + city: b.venue.city, + district: b.venue.district, + coverImage: b.venue.coverImage, + date: new Date(b.date).toLocaleDateString('en-GB', { + day: '2-digit', + month: 'short', + year: 'numeric', + }), + timeRange: `${minutesToTimeString(b.startTime)} - ${minutesToTimeString(b.endTime)}`, + bookedOn: new Date(b.createdAt).toLocaleDateString('en-GB', { + day: '2-digit', + month: 'short', + year: 'numeric', + }), + guestCount: b.guestCount, + eventType: b.eventType, + totalPrice: b.price, + paymentMethod: b.paymentMethod, + status: b.status, + paymentStatus: b.paymentStatus, + uiStatus, + }; + + if (uiStatus === 'cancelled') cancelled.push(dto); + else if (uiStatus === 'completed') completed.push(dto); + else upcoming.push(dto); + } + + return { + bookings: { + upcoming, + cancelled, + completed, + }, + }; +} + +export async function fetchBookingById( + bookingId: string, + userId: string +): Promise | null> { + let matchStage: Record; + if (bookingId.toUpperCase().startsWith('BMV-')) { + const suffix = bookingId.toUpperCase().replace('BMV-', '').toLowerCase(); + matchStage = { + userId: new Types.ObjectId(userId), + $expr: { + $eq: [{ $substr: [{ $toString: '$_id' }, 18, 6] }, suffix], + }, + }; + } else { + matchStage = { _id: new Types.ObjectId(bookingId), userId: new Types.ObjectId(userId) }; + } + + const [booking] = await BookingModel.aggregate([ + { $match: matchStage }, + { + $lookup: { + from: 'Venues', + localField: 'venueId', + foreignField: '_id', + as: 'venue', + }, + }, + { $unwind: '$venue' }, + ]); + + if (!booking) return null; + + const now = new Date(); + const bookingStart = new Date(`${booking.date}T00:00:00`); + bookingStart.setMinutes(booking.startTime); + const bookingEnd = new Date(`${booking.date}T00:00:00`); + bookingEnd.setMinutes(booking.endTime); + + let uiStatus: string; + if (booking.status === BookingStatus.CANCELLED) { + uiStatus = 'cancelled'; + } else if (booking.status === BookingStatus.COMPLETED) { + uiStatus = 'completed'; + } else if (booking.status === BookingStatus.IN_PROGRESS) { + uiStatus = 'in_progress'; + } else if (bookingEnd < now) { + uiStatus = 'completed'; + } else if (bookingStart <= now && bookingEnd > now) { + uiStatus = 'in_progress'; + } else { + uiStatus = 'upcoming'; + } + + return { + _id: booking._id.toString(), + bookingRef: `BMV-${booking._id.toString().slice(-6).toUpperCase()}`, + venueName: booking.venue.name, + venueId: booking.venue._id.toString(), + city: booking.venue.city, + district: booking.venue.district, + coverImage: booking.venue.coverImage, + date: new Date(booking.date).toLocaleDateString('en-GB', { + day: '2-digit', + month: 'short', + year: 'numeric', + }), + timeRange: `${minutesToTimeString(booking.startTime)} - ${minutesToTimeString(booking.endTime)}`, + bookedOn: new Date(booking.createdAt).toLocaleDateString('en-GB', { + day: '2-digit', + month: 'short', + year: 'numeric', + }), + guestCount: booking.guestCount, + eventType: booking.eventType, + totalPrice: booking.price, + paymentMethod: booking.paymentMethod, + status: booking.status, + paymentStatus: booking.paymentStatus, + uiStatus, + address: booking.venue.address, + contactPhone: booking.venue.contact.phone, + contactEmail: booking.venue.contact.email, + googleMapsUrl: booking.venue.googleMapsUrl, + amenities: booking.venue.amenities, + cancellationPolicy: booking.contractSnapshot + ? resolveRefundPctFromSnapshot(booking.contractSnapshot.cancellation, booking.date).label + : resolveRefundPct(booking.venue, booking.date).label, + cancellationRefundPct: booking.contractSnapshot + ? resolveRefundPctFromSnapshot(booking.contractSnapshot.cancellation, booking.date).pct + : resolveRefundPct(booking.venue, booking.date).pct, + paymentReference: booking.paymentReference, + bookerInfo: booking.bookerInfo, + }; +} + +// Conflict resolution +export async function fetchActiveConflicts( + venueId: string, + date: string, + options?: { + excludeUserId?: string; + excludeSessionTokenHash?: string; + session?: ClientSession; + } +): Promise<{ start: number; end: number }[]> { + const vId = new Types.ObjectId(venueId); + + let lockQuery: Record = { venueId: vId, date }; + const excludeConditions: Record[] = []; + + if (options?.excludeUserId) { + excludeConditions.push({ userId: new Types.ObjectId(options.excludeUserId) }); + } + if (options?.excludeSessionTokenHash) { + excludeConditions.push({ sessionTokenHash: options.excludeSessionTokenHash }); + } + + if (excludeConditions.length > 0) { + lockQuery = { ...lockQuery, $nor: excludeConditions }; + } + + const locks = await LockModel.find(lockQuery) + .session(options?.session ?? null) + .lean(); + const bookings = await BookingModel.find({ + venueId: vId, + date, + status: { $in: [BookingStatus.CONFIRMED, BookingStatus.COMPLETED, BookingStatus.IN_PROGRESS] }, + }) + .session(options?.session ?? null) + .lean(); + + return [ + ...locks.map((l: ILock) => ({ start: l.startTime, end: l.endTime })), + ...bookings.map((b: IBooking) => ({ start: b.startTime, end: b.endTime })), + ]; +} + +export async function fetchApprovedVenueForBooking(venueId: string): Promise { + return VenueModel.findOne({ + _id: new Types.ObjectId(venueId), + status: 'Approved', + active: true, + deleted: false, + }).lean(); +} + +// Booking writes +export interface CreateBookingData { + venueId: string; + userId: string; + date: string; + startTime: number; + endTime: number; + price: number; + paymentReference: string; + status?: BookingStatusType; + paymentStatus?: PaymentStatusType; + guestCount?: number; + eventType?: string; + bookerInfo?: { + name?: string; + email?: string; + phone?: string; + place?: string; + note?: string; + }; + paymentMethod?: string; + advancePaid?: number; + remainingAmount?: number; + contractSnapshot?: IContractSnapshot; +} + +export async function createBooking(data: CreateBookingData): Promise { + const booking = await BookingModel.create({ + venueId: new Types.ObjectId(data.venueId), + userId: new Types.ObjectId(data.userId), + date: data.date, + startTime: data.startTime, + endTime: data.endTime, + price: data.price, + paymentReference: data.paymentReference, + status: data.status ?? BookingStatus.CONFIRMED, + paymentStatus: data.paymentStatus ?? PaymentStatus.PAID, + guestCount: data.guestCount, + eventType: data.eventType, + bookerInfo: data.bookerInfo, + paymentMethod: data.paymentMethod, + advancePaid: data.advancePaid, + remainingAmount: data.remainingAmount, + contractSnapshot: data.contractSnapshot, + }); + return booking; +} + +// FailedBooking audit +export interface CreateFailedBookingData { + venueId: string; + userId: string; + date: string; + startTime: number; + endTime: number; + amountPaid: number; + paymentReference: string; + refundReference: string; + reason: string; +} + +// Inserts an immutable audit record for a collision-triggered refund. +export async function createFailedBooking(data: CreateFailedBookingData): Promise { + await FailedBookingModel.create({ + venueId: new Types.ObjectId(data.venueId), + userId: new Types.ObjectId(data.userId), + date: data.date, + startTime: data.startTime, + endTime: data.endTime, + amountPaid: data.amountPaid, + paymentReference: data.paymentReference, + refundReference: data.refundReference, + reason: data.reason, + }); +} + +// Idempotency gate +/** + * Inserts the Razorpay event_id into ProcessedWebhookModel. + * Throws a MongoServerError with code 11000 if the event was already processed. + * The caller MUST catch error.code === 11000 and return 200 immediately. + */ +export async function markWebhookProcessed(eventId: string): Promise { + await ProcessedWebhookModel.create({ eventId }); +} + +export async function findAllBookings( + paginationParams: PaginationParams, + filters?: { status?: BookingStatusType; venueId?: string } +): Promise> { + const { limit, skip } = paginationParams; + const matchStage: Record = {}; + + if (filters?.status) matchStage.status = filters.status; + if (filters?.venueId) matchStage.venueId = new Types.ObjectId(filters.venueId); + + const [bookings, totalCount] = await Promise.all([ + BookingModel.aggregate([ + { $match: matchStage }, + { $sort: { createdAt: -1 } }, + { $skip: skip }, + { $limit: limit }, + { + $lookup: { + from: 'Venues', + localField: 'venueId', + foreignField: '_id', + as: 'venue', + }, + }, + { $unwind: '$venue' }, + { + $lookup: { + from: 'Users', + localField: 'userId', + foreignField: '_id', + as: 'user', + }, + }, + { $unwind: { path: '$user', preserveNullAndEmptyArrays: true } }, + { + $addFields: { + bookerEmail: '$bookerInfo.email', + bookerPhone: '$bookerInfo.phone', + bookerName: '$bookerInfo.name', + }, + }, + ]), + BookingModel.countDocuments(matchStage).exec(), + ]); + + // Compute UI status for each booking + const now = new Date(); + const bookingsWithUIStatus = bookings.map((booking) => { + if (booking.status === 'cancelled') { + return { ...booking, uiStatus: 'cancelled' as const }; + } + if (booking.status === 'completed') { + return { ...booking, uiStatus: 'completed' as const }; + } + if (booking.status === 'in_progress') { + return { ...booking, uiStatus: 'in_progress' as const }; + } + const eventStart = new Date(`${booking.date}T00:00:00`); + eventStart.setMinutes(booking.startTime); + const eventEnd = new Date(`${booking.date}T00:00:00`); + eventEnd.setMinutes(booking.endTime); + if (eventEnd < now) { + return { ...booking, uiStatus: 'completed' as const, status: 'completed' as const }; + } + if (eventStart <= now && eventEnd > now) { + return { ...booking, uiStatus: 'in_progress' as const, status: 'in_progress' as const }; + } + return { ...booking, uiStatus: 'confirmed' as const }; + }); + + return { + bookings: bookingsWithUIStatus, + pagination: buildPaginationMeta(totalCount, paginationParams), + }; +} + +export async function updateLockBookerDetails( + lockId: string, + userId: string, + guestCount?: number, + eventType?: string, + bookerInfo?: Record +): Promise { + return LockModel.findOneAndUpdate( + { _id: new Types.ObjectId(lockId), userId: new Types.ObjectId(userId) }, + { + $set: { + guestCount, + eventType, + bookerInfo, + }, + }, + { new: true } + ).lean(); +} +export async function fetchUserBookingByRefIdOrId( + bookingId: string, + userId: string +): Promise { + const isBookingRef = bookingId.toUpperCase().startsWith('BMV-') && bookingId.length === 10; + if (isBookingRef) { + const suffix = bookingId.toUpperCase().replace('BMV-', ''); + const userBookings = await BookingModel.find({ userId: new Types.ObjectId(userId) }); + return userBookings.find((b) => b._id.toString().slice(-6).toUpperCase() === suffix) ?? null; + } else { + return BookingModel.findOne({ + _id: new Types.ObjectId(bookingId), + userId: new Types.ObjectId(userId), + }); + } +} + +export async function findLockById(lockId: string, userId: string): Promise { + return LockModel.findOne({ + _id: new Types.ObjectId(lockId), + userId: new Types.ObjectId(userId), + }).lean(); +} + +export async function findLockByIdRaw(lockId: string): Promise { + return LockModel.findById(lockId).lean(); +} + +export async function deleteLockById(lockId: string): Promise { + await LockModel.deleteOne({ _id: new Types.ObjectId(lockId) }); +} + +export async function createLock( + data: Partial[], + session?: ClientSession +): Promise { + return LockModel.create(data, { session }); +} + +export async function deleteLocksByConditions( + deleteConditions: Record[], + session?: ClientSession +): Promise { + if (deleteConditions.length > 0) { + return LockModel.deleteMany({ $or: deleteConditions }, { session }); + } + return null; +} + +export async function fetchBookingByPaymentReference(paymentId: string): Promise { + return BookingModel.findOne({ paymentReference: paymentId }).lean(); +} + +// Atomically transitions CONFIRMED -> CANCELLED. Returns the pre-update +// document if this call won the race, or null if the booking was already +// cancelled (by a concurrent request or otherwise). This is the sole gate +// that must pass before a refund is issued — it guarantees at most one +// caller can ever proceed to refund for a given booking. +export async function claimBookingForCancellation( + bookingId: string, + userId: string, + reason?: string +): Promise { + return BookingModel.findOneAndUpdate( + { + _id: new Types.ObjectId(bookingId), + userId: new Types.ObjectId(userId), + status: BookingStatus.CONFIRMED, + }, + { + $set: { + status: BookingStatus.CANCELLED, + paymentStatus: PaymentStatus.REFUNDED, + ...(reason ? { cancellationReason: reason } : {}), + }, + }, + { new: false } + ).lean(); +} + +export async function findVerifiedUserIds( + venueId: string, + userIds: string[] +): Promise> { + const verified = await BookingModel.find({ + venueId, + userId: { $in: userIds }, + status: { $ne: BookingStatus.CANCELLED }, + }).distinct('userId'); + return new Set(verified.map((id) => id.toString())); +} diff --git a/server/src/modules/booking/booking.router.ts b/server/src/modules/booking/booking.router.ts new file mode 100644 index 0000000000..d961d8778e --- /dev/null +++ b/server/src/modules/booking/booking.router.ts @@ -0,0 +1,307 @@ +import { Router } from 'express'; +import { verifyAccessToken } from '../../middlewares/auth.middleware'; +import { idempotencyMiddleware } from '../../middlewares/idempotency.middleware'; +import { requireRole, requirePermission } from '../../middlewares/rbac.middleware'; +import { + validateBody, + validateParams, + validateQuery, +} from '../../middlewares/validation.middleware'; +import { PERMISSIONS as P } from '../../constants/permissions'; +import { + checkoutBodySchema, + verifyPaymentBodySchema, + fetchMyBookingsQuerySchema, + saveBookerDetailsBodySchema, + bookingRefIdParamSchema, + adminBookingFiltersSchema, +} from './booking.validator'; +import * as controller from './booking.controller'; +import { paginationMiddleware } from '../../middlewares/pagination.middleware'; + +const router: Router = Router(); + +/** + * @openapi + * /bookings/checkout: + * post: + * tags: [Bookings] + * summary: Initiate checkout — create a Razorpay order (Step 2 of 3) + * description: | + * Validates the slot lock is still alive and within the buffer window, + * then creates a Razorpay order. Requires a valid `lockId` from Step 1. + * security: + * - bearerAuth: [] + * requestBody: + * required: true + * content: + * application/json: + * schema: + * type: object + * required: [lockId] + * properties: + * lockId: + * type: string + * description: MongoDB ObjectId returned from /availability/:id/block + * example: 64b1f2c3d4e5f6a7b8c9d0e2 + * responses: + * 200: + * description: Razorpay order created — return order ID to client for payment + * content: + * application/json: + * schema: + * allOf: + * - $ref: '#/components/schemas/SuccessResponse' + * - type: object + * properties: + * data: + * type: object + * properties: + * orderId: + * type: string + * amount: + * type: integer + * description: Amount in paise + * currency: + * type: string + * example: INR + * 400: + * description: Invalid lockId or lock expired + * 401: + * description: Not authenticated + * 403: + * description: Insufficient permissions + * 409: + * description: Lock no longer valid or slot taken + */ +router + .route('/checkout') + .post( + verifyAccessToken, + idempotencyMiddleware(), + requirePermission(P.bookings.create), + validateBody(checkoutBodySchema), + controller.initCheckout + ); + +/** + * @openapi + * /bookings/booker-details: + * patch: + * tags: [Bookings] + * summary: Save booker details before checkout + * description: Save booker info into the lock + * security: + * - bearerAuth: [] + * requestBody: + * required: true + * content: + * application/json: + * schema: + * type: object + * required: [lockId, guestCount, eventType, bookerInfo] + * properties: + * lockId: + * type: string + * description: MongoDB ObjectId from slot block + * guestCount: + * type: integer + * description: Number of guests attending + * eventType: + * type: string + * description: Type of event (e.g. wedding, corporate) + * bookerInfo: + * type: object + * required: [name, email, phone, place] + * properties: + * name: + * type: string + * email: + * type: string + * format: email + * phone: + * type: string + * place: + * type: string + * note: + * type: string + * responses: + * 200: + * description: Booker details saved successfully + * 400: + * description: Validation error + * 401: + * description: Not authenticated + */ +router + .route('/booker-details') + .patch( + verifyAccessToken, + validateBody(saveBookerDetailsBodySchema), + controller.saveBookerDetails + ); + +/** + * @openapi + * /bookings/verify-payment: + * post: + * tags: [Bookings] + * summary: Verify Razorpay payment signature (Step 3 of 3) + * description: | + * Client-side verification step called after the Razorpay payment modal closes. + * The server re-verifies the HMAC signature before confirming the booking. + * Final booking creation is triggered by the Razorpay webhook automatically. + * security: + * - bearerAuth: [] + * requestBody: + * required: true + * content: + * application/json: + * schema: + * type: object + * required: [orderId, paymentId, signature] + * properties: + * orderId: + * type: string + * example: order_OIBFHxxx + * paymentId: + * type: string + * example: pay_OIBFHyyy + * signature: + * type: string + * example: abc123hmac + * responses: + * 200: + * description: Payment signature verified + * 400: + * description: Invalid or mismatched signature + * 401: + * description: Not authenticated + */ +router + .route('/verify-payment') + .post( + verifyAccessToken, + requirePermission(P.bookings.create), + validateBody(verifyPaymentBodySchema), + controller.verifyPayment + ); + +/** + * @openapi + * /bookings/my-bookings: + * get: + * tags: [Bookings] + * summary: Get all bookings for the authenticated user (grouped by status) + * security: + * - bearerAuth: [] + * responses: + * 200: + * description: List of user's bookings + * 401: + * description: Not authenticated + */ +router + .route('/my-bookings') + .get(verifyAccessToken, validateQuery(fetchMyBookingsQuerySchema), controller.getMyBookings); + +/** + * @openapi + * /bookings/all: + * get: + * tags: [Bookings] + * summary: Get all bookings across all venues (Admin only) + * security: + * - bearerAuth: [] + * parameters: + * - in: query + * name: page + * schema: + * type: integer + * default: 1 + * - in: query + * name: limit + * schema: + * type: integer + * default: 20 + * - in: query + * name: status + * schema: + * type: string + * enum: [confirmed, pending, cancelled, completed] + * - in: query + * name: venueId + * schema: + * type: string + * description: Filter by venue (MongoDB ObjectId) + * - in: query + * name: sort + * schema: + * type: string + * description: Sort order field + * responses: + * 200: + * description: Paginated list of all bookings + * 401: + * description: Not authenticated + * 403: + * description: Admin role required + */ +router + .route('/all') + .get( + verifyAccessToken, + requireRole('admin'), + requirePermission(P.bookings.read), + validateQuery(adminBookingFiltersSchema), + paginationMiddleware(), + controller.getAllBookings + ); + +/** + * @openapi + * /bookings/{bookingRefId}: + * get: + * tags: [Bookings] + * summary: Get a booking by its reference ID + * security: + * - bearerAuth: [] + * parameters: + * - in: path + * name: bookingRefId + * required: true + * schema: + * type: string + * responses: + * 200: + * description: Booking details + * 401: + * description: Not authenticated + * 404: + * description: Booking not found + * delete: + * tags: [Bookings] + * summary: Cancel a booking by its reference ID + * security: + * - bearerAuth: [] + * parameters: + * - in: path + * name: bookingRefId + * required: true + * schema: + * type: string + * responses: + * 200: + * description: Booking cancelled successfully + * 401: + * description: Not authenticated + * 404: + * description: Booking not found + */ +router + .route('/:bookingRefId') + .all(verifyAccessToken, validateParams(bookingRefIdParamSchema)) + .get(requirePermission(P.bookings.read), controller.getBookingById) + .delete(requirePermission(P.bookings.delete), controller.cancelBooking); + +export { router as bookingRouter }; diff --git a/server/src/modules/booking/booking.service.ts b/server/src/modules/booking/booking.service.ts new file mode 100644 index 0000000000..93a1397dff --- /dev/null +++ b/server/src/modules/booking/booking.service.ts @@ -0,0 +1,405 @@ +import type { Types } from 'mongoose'; +import { BookingStatus, type BookingStatusType } from '../../constants/booking.constants'; +import { PaymentStatus } from '../../constants/payment.constants'; +import { logError, logInfo, logWarn } from '../../utils/logger'; +import { issueRefund } from '../../services/razorpay.service'; +import { + markWebhookProcessed, + createBooking, + createFailedBooking, + findAllBookings, + findLockByIdRaw, + deleteLockById, + fetchMyBookings, + fetchBookingById, + fetchBookingByPaymentReference, + type AggregatedBooking, +} from './booking.repository'; +import type { PaginationParams, PaginatedResponse } from '../../types/pagination.types'; +import { minutesToTimeString } from '../../utils/timeUtils'; +import { + EmailIntent, + EmailTaskStatus, + type EmailIntentType, +} from '../../constants/email.constants'; +import type { ILock } from './lock.types'; +import type { IBooking } from './booking.types'; +import type { RazorpayWebhookNotes } from './booking.types'; +import { findUserEmailById } from '../user/user.repository'; +import { findVenueNameAndOwner, findVenueById } from '../venue/venue.repository'; +import { enqueueEmailTask } from '../../services/email.repository'; + +async function enqueueEmail( + intent: EmailIntentType, + recipient: string, + subject: string, + metadata: Record +): Promise { + try { + await enqueueEmailTask(recipient, intent, subject, EmailTaskStatus.PENDING, metadata); + } catch (err) { + logError('Failed to enqueue email task', { + module: 'booking.service.ts/enqueueEmail', + intent, + recipient, + error: (err as Error).message, + }); + } +} + +async function resolveCustomerEmail(userId: string): Promise { + try { + return await findUserEmailById(userId); + } catch { + return null; + } +} + +async function resolveVenueInfo( + venueId: string +): Promise<{ venueName: string; ownerEmail: string | null } | null> { + try { + const venue = await findVenueNameAndOwner(venueId); + if (!venue) return null; + + const ownerEmail = await findUserEmailById(venue.ownerUserId.toString()); + + return { + venueName: venue.name, + ownerEmail: ownerEmail, + }; + } catch { + return null; + } +} + +// Processes a captured payment webhook. +export async function processCapturedPayment( + paymentId: string, + amountPaise: number, + notes: RazorpayWebhookNotes, + paymentMethod?: string +): Promise<{ success: boolean; isDuplicate?: boolean; error?: string }> { + try { + await markWebhookProcessed(paymentId); + } catch (err) { + const error = err as { code?: number; message: string }; + if (error.code === 11000) { + logInfo('Duplicate webhook received — skipping (already processed)', { + module: 'booking.service.ts/processCapturedPayment', + eventId: paymentId, + }); + return { success: true, isDuplicate: true }; + } + logError('CRITICAL: Failed to record webhook idempotency marker', { + module: 'booking.service.ts/processCapturedPayment', + eventId: paymentId, + error: error.message, + }); + return { + success: false, + error: 'Idempotency gate error — refusing to process to prevent duplicate booking', + }; + } + + const { lockId, venueId, userId } = notes; + if (!lockId || !venueId || !userId) { + logError('Webhook payment captured notes are missing required fields', { + module: 'booking.service.ts/processCapturedPayment', + eventId: paymentId, + notes, + }); + return { success: false, error: 'Missing notes metadata' }; + } + + const [venueInfo, customerEmail] = await Promise.all([ + resolveVenueInfo(venueId), + resolveCustomerEmail(userId), + ]); + + const venueName = venueInfo?.venueName ?? 'the venue'; + const ownerEmail = venueInfo?.ownerEmail ?? null; + + let lock: (ILock & { _id: Types.ObjectId }) | null; + try { + lock = await findLockByIdRaw(lockId); + } catch (err) { + logError('Failed to query LockModel in webhook service', { + module: 'booking.service.ts/processCapturedPayment', + lockId, + error: (err as Error).message, + }); + return { success: false, error: 'Lock query failed' }; + } + + // Scenario A: Slot lock is active. Confirm the booking and delete the lock. + if (lock) { + const expectedAmountPaise = Math.round(lock.price * 100); + if (Math.abs(amountPaise - expectedAmountPaise) > 100) { + logWarn( + 'Captured payment amount does not match lock price — proceeding, but flagging for review', + { + module: 'booking.service.ts/processCapturedPayment', + lockId, + paymentId, + expectedAmountPaise, + capturedAmountPaise: amountPaise, + } + ); + } + + logInfo('Webhook Scenario A: Lock exists, creating booking', { + lockId, + venueId, + userId, + paymentId, + }); + + // Transfer contractSnapshot from lock to booking + let contractSnapshot = lock.contractSnapshot; + + if (!contractSnapshot) { + logWarn('Lock missing contractSnapshot — building fallback from venue', { + module: 'booking.service.ts/processCapturedPayment', + lockId, + venueId, + }); + const fallbackVenue = await findVenueById(venueId); + if (fallbackVenue) { + const totalPrice = amountPaise / 100; + contractSnapshot = { + venue: { + name: fallbackVenue.name, + city: fallbackVenue.city, + district: fallbackVenue.district, + }, + packages: [ + { + pkgName: `${String(lock.startTime)}-${String(lock.endTime)}`, + pkgType: fallbackVenue.bookingType === 'fixedBooking' ? 'fixed' : 'flexible', + startTime: lock.startTime, + endTime: lock.endTime, + price: totalPrice, + }, + ], + financial: { basePrice: totalPrice, taxes: 0, platformFee: 0, totalPaid: totalPrice }, + cancellation: fallbackVenue.cancellation, + }; + } + } + + // Security re-verify: fetch venue and log inconsistencies + try { + const currentVenue = await findVenueById(venueId); + if (currentVenue && contractSnapshot) { + if (currentVenue.name !== contractSnapshot.venue.name) { + logWarn('Venue name changed since lock was acquired', { + module: 'booking.service.ts/processCapturedPayment', + lockId, + venueId, + snapshotName: contractSnapshot.venue.name, + currentName: currentVenue.name, + }); + } + if (currentVenue.cancellation.policy !== contractSnapshot.cancellation.policy) { + logWarn('Venue cancellation policy changed since lock was acquired', { + module: 'booking.service.ts/processCapturedPayment', + lockId, + venueId, + snapshotPolicy: contractSnapshot.cancellation.policy, + currentPolicy: currentVenue.cancellation.policy, + }); + } + } + } catch (err) { + logWarn('Failed to re-verify venue during webhook processing', { + module: 'booking.service.ts/processCapturedPayment', + lockId, + venueId, + error: (err as Error).message, + }); + } + + try { + await createBooking({ + venueId, + userId, + date: lock.date, + startTime: lock.startTime, + endTime: lock.endTime, + price: amountPaise / 100, + paymentReference: paymentId, + status: BookingStatus.CONFIRMED, + paymentStatus: PaymentStatus.PAID, + guestCount: lock.guestCount, + eventType: lock.eventType, + bookerInfo: lock.bookerInfo, + paymentMethod: paymentMethod, + contractSnapshot, + }); + } catch (err) { + const error = err as { code?: number; message: string }; + if (error.code === 11000) { + logError('CRITICAL: Slot already booked (duplicate-key) — issuing automatic refund', { + module: 'booking.service.ts/processCapturedPayment', + lockId, + paymentId, + venueId, + userId, + }); + try { + await issueRefund(paymentId, amountPaise); + } catch (refundErr) { + logError('CRITICAL: Automatic refund failed after lost double-booking race', { + module: 'booking.service.ts/processCapturedPayment', + lockId, + paymentId, + error: (refundErr as Error).message, + }); + } + if (notes.lockId) { + await deleteLockById(notes.lockId).catch(() => undefined); + } + return { success: false, error: 'Slot already booked; refund issued' }; + } + logError('CRITICAL: Failed to create booking in Scenario A', { + module: 'booking.service.ts/processCapturedPayment', + eventId: paymentId, + error: (err as Error).message, + }); + return { success: false, error: 'Booking creation failed' }; + } + + try { + if (notes.lockId) { + await deleteLockById(notes.lockId); + } + } catch (err) { + logWarn('Failed to delete lock after booking creation', { + module: 'booking.service.ts/processCapturedPayment', + lockId, + error: (err as Error).message, + }); + } + + const emailMetadata = { + venueName, + date: lock.date, + startTime: minutesToTimeString(lock.startTime), + endTime: minutesToTimeString(lock.endTime), + amount: String(amountPaise / 100), + paymentReference: paymentId, + }; + + if (customerEmail) { + void enqueueEmail( + EmailIntent.BOOKING_CONFIRMATION, + customerEmail, + `Booking Confirmed – ${venueName} on ${lock.date}`, + emailMetadata + ); + } + + if (ownerEmail) { + void enqueueEmail( + EmailIntent.BOOKING_CONFIRMATION, + ownerEmail, + `New Booking Received – ${venueName} on ${lock.date}`, + emailMetadata + ); + } + + logInfo('Scenario A complete: booking confirmed', { lockId, paymentId }); + return { success: true }; + } + + // Scenario B: Slot lock has expired. Issue safety refund and log failed booking. + logWarn('Webhook Scenario B: Lock TTL expired — issuing safety refund', { + lockId, + venueId, + userId, + paymentId, + }); + + let refundId: string; + try { + const refundResult = await issueRefund(paymentId, amountPaise); + refundId = refundResult.refundId; + } catch (err) { + logError('CRITICAL: Razorpay refund failed in Scenario B', { + module: 'booking.service.ts/processCapturedPayment', + paymentId, + amountPaise, + error: (err as Error).message, + }); + return { success: false, error: 'Refund failed — manual review required' }; + } + + try { + await createFailedBooking({ + venueId, + userId, + date: 'UNKNOWN', + startTime: 0, + endTime: 0, + amountPaid: amountPaise, + paymentReference: paymentId, + refundReference: refundId, + reason: 'TTL_EXPIRED_COLLISION', + }); + } catch (err) { + logError('Failed to create FailedBooking audit record', { + module: 'booking.service.ts/processCapturedPayment', + paymentId, + refundId, + error: (err as Error).message, + }); + } + + if (customerEmail) { + void enqueueEmail( + EmailIntent.BOOKING_REFUND, + customerEmail, + `Booking Failed – Full Refund Initiated for ${venueName}`, + { + venueName, + date: 'your selected date', + startTime: 'your selected slot', + endTime: 'your selected slot', + amount: String(amountPaise / 100), + refundReference: refundId, + } + ); + } + + logInfo('Scenario B complete: refund issued', { paymentId, refundId }); + return { success: true }; +} + +export async function getAllBookings( + paginationParams: PaginationParams, + filters?: { status?: BookingStatusType; venueId?: string } +): Promise> { + return findAllBookings(paginationParams, filters); +} + +export async function getMyBookings(userId: string): Promise<{ + bookings: { + upcoming: Record[]; + cancelled: Record[]; + completed: Record[]; + }; +}> { + return fetchMyBookings(userId); +} + +export async function getBookingById( + bookingId: string, + userId: string +): Promise | null> { + return fetchBookingById(bookingId, userId); +} + +export async function getBookingByPaymentReference(paymentId: string): Promise { + return fetchBookingByPaymentReference(paymentId); +} diff --git a/server/src/modules/booking/booking.types.ts b/server/src/modules/booking/booking.types.ts new file mode 100644 index 0000000000..c199f77c61 --- /dev/null +++ b/server/src/modules/booking/booking.types.ts @@ -0,0 +1,117 @@ +import type { Document, Types } from 'mongoose'; +import type { BookingStatusType } from '../../constants/booking.constants'; +import type { PaymentStatusType } from '../../constants/payment.constants'; +import type { IContractSnapshot } from './lock.types'; + +export type BookingStatus = BookingStatusType; + +export interface RazorpayWebhookNotes { + lockId?: string; + venueId?: string; + userId?: string; +} + +export interface IBooking extends Document { + venueId: Types.ObjectId; + userId: Types.ObjectId; + date: string; // YYYY-MM-DD + startTime: number; // minutes from midnight + endTime: number; // minutes from midnight + price: number; + paymentReference: string; // Razorpay payment_id + status: BookingStatus; + paymentStatus: PaymentStatusType; + guestCount?: number; + eventType?: string; + bookerInfo?: { + name?: string; + email?: string; + phone?: string; + place?: string; + note?: string; + }; + paymentMethod?: string; + contractSnapshot?: IContractSnapshot; + + // Future update fields (Not needed for MVP now) + advancePaid?: number; + remainingAmount?: number; + cancellationReason?: string; + + createdAt: Date; + updatedAt: Date; +} + +// Aggregated booking for admin/owner queries with populated refs +export interface AggregatedBooking { + _id: Types.ObjectId; + userId: Types.ObjectId; + venueId: Types.ObjectId; + date: string; + startTime: number; + endTime: number; + price: number; + paymentReference: string; + status: BookingStatusType; + paymentStatus: PaymentStatusType; + guestCount?: number; + eventType?: string; + bookerInfo?: { + name?: string; + email?: string; + phone?: string; + place?: string; + note?: string; + }; + paymentMethod?: string; + advancePaid?: number; + remainingAmount?: number; + createdAt: Date; + updatedAt: Date; + contractSnapshot?: IContractSnapshot; + venue: { + _id: Types.ObjectId; + name: string; + city: string; + district: string; + coverImage: string; + address: string; + contact: { + phone: string; + email?: string; + }; + googleMapsUrl?: string; + amenities: string[]; + }; + // User who made the booking (for admin view) + user?: { + _id: Types.ObjectId; + username: string; + email: string; + phone?: string; + status: string; + }; +} + +// Computed UI status for display +export type UIBookingStatus = 'confirmed' | 'completed' | 'cancelled'; + +// FailedBooking (No TTL - usefull later) +export interface IFailedBooking extends Document { + venueId: Types.ObjectId; + userId: Types.ObjectId; + date: string; + startTime: number; + endTime: number; + amountPaid: number; // in paise + paymentReference: string; // Razorpay payment_id + refundReference: string; // Razorpay refund_id + reason: string; // e.g: 'TTL_EXPIRED_COLLISION' + createdAt: Date; +} + +// ProcessedWebhook +export interface IProcessedWebhook extends Document { + eventId: string; + createdAt: Date; +} diff --git a/server/src/modules/booking/booking.validator.ts b/server/src/modules/booking/booking.validator.ts new file mode 100644 index 0000000000..af191b980f --- /dev/null +++ b/server/src/modules/booking/booking.validator.ts @@ -0,0 +1,280 @@ +import { z } from 'zod'; +import type { IVenue } from '../venue/venue.types'; +import { timeStringToMinutes, isBookableDate } from '../../utils/timeUtils'; + +export const venueIdParamSchema = z.object({ + id: z + .string() + .trim() + .regex(/^[a-f\d]{24}$/i, 'Invalid venue ID format'), +}); + +export type VenueIdParamDTO = z.infer; + +const selectedSlotSchema = z + .object({ + startTime: z.number().int().min(0).max(1439), + endTime: z.number().int().min(1).max(1440), + }) + .refine((data) => data.startTime < data.endTime, { + message: 'endTime must be strictly greater than startTime', + path: ['endTime'], + }); + +export const blockSlotBodySchema = z.object({ + date: z + .string() + .trim() + .regex(/^\d{4}-\d{2}-\d{2}$/, 'date must be in YYYY-MM-DD format') + .refine(isBookableDate, { + message: 'Date must be between tomorrow and 90 days from today', + }), + selectedSlots: z + .array(selectedSlotSchema) + .min(1, 'At least one slot must be selected') + .max(24, 'Cannot select more than 24 slots at once'), + expectedPrice: z.number().positive('expectedPrice must be greater than 0'), +}); + +export type BlockSlotBodyDTO = z.infer; + +export function validateDateForVenue( + venue: IVenue, + date: string +): { valid: boolean; reason?: string } { + const dateObj = new Date(date + 'T00:00:00'); + const dayOfWeek = dateObj.toLocaleDateString('en-US', { weekday: 'long' }); + + if (!venue.workingDays.includes(dayOfWeek)) { + return { valid: false, reason: `Venue is not open on ${dayOfWeek}s.` }; + } + + const isBlocked = venue.blockedDates.some( + (blockedDate) => blockedDate.toISOString().split('T')[0] === date + ); + if (isBlocked) { + return { valid: false, reason: 'This date is blocked by the venue.' }; + } + + // Check temporary block + if (venue.temporaryBlockAfterDate) { + const blockDate = new Date(venue.temporaryBlockAfterDate); + dateObj.setHours(0, 0, 0, 0); + blockDate.setHours(0, 0, 0, 0); + if (dateObj >= blockDate) { + return { valid: false, reason: "This date is after the venue's temporary booking block" }; + } + } + + // Check inactivity block + if (venue.inactivity?.blockedAfterDate) { + const blockDate = new Date(venue.inactivity.blockedAfterDate); + dateObj.setHours(0, 0, 0, 0); + blockDate.setHours(0, 0, 0, 0); + if (dateObj >= blockDate) { + return { valid: false, reason: "This date falls within the venue's closing period" }; + } + } + + return { valid: true }; +} + +export function validateSelectedSlotsForVenue( + venue: IVenue, + selectedSlots: { startTime: number; endTime: number }[] +): { valid: boolean; reason?: string } { + // Guard against overlapping selected slots + const sortedSlots = [...selectedSlots].sort((a, b) => a.startTime - b.startTime); + for (let i = 0; i < sortedSlots.length - 1; i++) { + if (sortedSlots[i].endTime > sortedSlots[i + 1].startTime) { + return { valid: false, reason: 'Selected slots cannot overlap each other.' }; + } + } + + if (venue.bookingType === 'fixedBooking') { + for (const slot of selectedSlots) { + const match = (venue.fixedPackages ?? []).find( + (pkg) => + timeStringToMinutes(pkg.startTime) === slot.startTime && + timeStringToMinutes(pkg.endTime) === slot.endTime + ); + if (!match) { + return { + valid: false, + reason: 'One or more selected slots do not match any fixed package.', + }; + } + } + } else { + // flexibleBooking + if (!venue.workingHours) { + return { valid: false, reason: 'Venue working hours are not configured.' }; + } + const openMin = timeStringToMinutes(venue.workingHours.open); + const closeMin = timeStringToMinutes(venue.workingHours.close); + const duration = venue.flexibleBooking?.slotDuration ?? 60; + const buffer = venue.flexibleBooking?.bufferTime ?? 0; + const cycle = duration + buffer; + + for (const slot of selectedSlots) { + if (slot.startTime < openMin || slot.endTime > closeMin) { + return { valid: false, reason: 'One or more slots are outside venue working hours.' }; + } + if (slot.endTime - slot.startTime !== duration) { + return { + valid: false, + reason: `All slots must be exactly ${String(duration)} minutes long.`, + }; + } + if ((slot.startTime - openMin) % cycle !== 0) { + return { + valid: false, + reason: "Slot times do not align with the venue's scheduling grid.", + }; + } + } + + // Must be contiguous + for (let i = 0; i < sortedSlots.length - 1; i++) { + if (sortedSlots[i].endTime + buffer !== sortedSlots[i + 1].startTime) { + return { valid: false, reason: 'Multiple flexible slots must be contiguous.' }; + } + } + } + + return { valid: true }; +} + +export function computeServerTotalPrice( + venue: IVenue, + selectedSlots: { startTime: number; endTime: number }[] +): number { + let totalPrice = 0; + + if (venue.bookingType === 'fixedBooking') { + for (const slot of selectedSlots) { + const match = (venue.fixedPackages ?? []).find( + (pkg) => + timeStringToMinutes(pkg.startTime) === slot.startTime && + timeStringToMinutes(pkg.endTime) === slot.endTime + ); + if (match) totalPrice += match.price; + } + } else { + // flexibleBooking + if (!venue.pricing) { + throw new Error('Pricing configuration is missing for flexible booking venue'); + } + for (const slot of selectedSlots) { + let appliedPrice = venue.pricing.basePrice; + if (venue.pricing.pricingType === 'timeBasedPricing') { + for (const rule of venue.pricing.pricingRules) { + const ruleStart = timeStringToMinutes(rule.fromTime); + const ruleEnd = timeStringToMinutes(rule.toTime); + if (slot.startTime >= ruleStart && slot.startTime < ruleEnd) { + appliedPrice = rule.price; + break; + } + } + } + totalPrice += appliedPrice; + } + } + + return totalPrice; +} + +export function assertPriceWithinTolerance( + serverPrice: number, + clientPrice: number, + tolerancePct = 2 +): { valid: boolean; reason?: string } { + if (serverPrice <= 0) { + return { + valid: false, + reason: 'Server could not compute a valid price for this slot. Please contact support.', + }; + } + const drift = Math.abs(serverPrice - clientPrice) / serverPrice; + if (drift > tolerancePct / 100) { + return { + valid: false, + reason: `Price mismatch. Expected ₹${String(serverPrice)} but received ₹${String(clientPrice)}. Please refresh and try again.`, + }; + } + return { valid: true }; +} + +export const checkoutBodySchema = z.object({ + lockId: z + .string() + .trim() + .regex(/^[a-f\d]{24}$/i, 'Invalid lockId format'), +}); + +export type CheckoutBodyDTO = z.infer; + +const bookerInfoSchema = z.object({ + name: z.string().trim().min(1, 'Name is required'), + email: z + .string() + .trim() + .regex(/^[^\s@]+@[^\s@]+\.[^\s@]+$/, 'Valid email is required'), + phone: z.string().trim().min(10, 'Valid phone number is required'), + place: z.string().trim().min(1, 'Place is required'), + note: z.string().trim().optional(), +}); + +export const saveBookerDetailsBodySchema = z.object({ + lockId: z + .string() + .trim() + .regex(/^[a-f\d]{24}$/i, 'Invalid lockId format'), + guestCount: z.number().int().positive('Guest count must be positive'), + eventType: z.string().trim().min(1, 'Event type is required').max(100, 'Event type is too long'), + bookerInfo: bookerInfoSchema, +}); + +export type SaveBookerDetailsBodyDTO = z.infer; + +export const verifyPaymentBodySchema = z.object({ + orderId: z.string().trim().min(1, 'orderId is required'), + paymentId: z.string().trim().min(1, 'paymentId is required'), + signature: z.string().trim().min(1, 'razorpay_signature is required'), +}); + +export type VerifyPaymentBodyDTO = z.infer; + +export const fetchMyBookingsQuerySchema = z.object({}); +export type FetchMyBookingsQueryDTO = z.infer; + +export const adminBookingFiltersSchema = z.object({ + status: z.enum(['confirmed', 'pending', 'cancelled', 'completed', 'in_progress']).optional(), + venueId: z + .string() + .trim() + .regex(/^[a-f\d]{24}$/i, 'Invalid venue ID format') + .optional(), + page: z.coerce.number().int().positive().default(1), + limit: z.coerce.number().int().positive().max(100).default(20), + sort: z.string().optional(), +}); + +export type AdminBookingFiltersDTO = z.infer; + +export const bookingRefIdParamSchema = z.object({ + bookingRefId: z + .string() + .trim() + .refine( + (val) => { + const isObjectId = /^[a-f\d]{24}$/i.test(val); + const isBookingRef = val.toUpperCase().startsWith('BMV-') && val.length === 10; + return isObjectId || isBookingRef; + }, + { + message: 'Invalid booking ID or reference format', + } + ), +}); +export type BookingRefIdParamDTO = z.infer; diff --git a/server/src/modules/booking/booking.workflow.ts b/server/src/modules/booking/booking.workflow.ts new file mode 100644 index 0000000000..81891fa054 --- /dev/null +++ b/server/src/modules/booking/booking.workflow.ts @@ -0,0 +1,409 @@ +import crypto from 'crypto'; +import { Types } from 'mongoose'; +import { runInTransaction } from '../../utils/dbUtils'; +import { acquireSlotMutex, releaseSlotMutex } from '../../utils/mutex'; +import { checkOverlap, timeStringToMinutes } from '../../utils/timeUtils'; +import { logInfo, logWarn, logError } from '../../utils/logger'; + +import * as repo from './booking.repository'; +import { + validateDateForVenue, + validateSelectedSlotsForVenue, + computeServerTotalPrice, + assertPriceWithinTolerance, +} from './booking.validator'; +import { issueRefund, createOrder } from '../../services/razorpay.service'; +import { EmailIntent, EmailTaskStatus } from '../../constants/email.constants'; +import { enqueueEmailTask } from '../../services/email.repository'; +import { findUserEmailById } from '../user/user.repository'; +import { BookingStatus } from '../../constants/booking.constants'; +import type { IContractSnapshot, IContractPackage } from './lock.types'; + +const LOCK_TTL_SECONDS = 600; +const CHECKOUT_BUFFER_MS = 60 * 1000; + +function buildContractSnapshot( + venue: { + name: string; + city: string; + district: string; + bookingType: string; + fixedPackages?: { slotName: string; startTime: string; endTime: string; price: number }[]; + pricing?: { + basePrice: number; + pricingType: string; + pricingRules: { fromTime: string; toTime: string; price: number }[]; + }; + cancellation?: { + policy: 'refundable' | 'nonRefundable'; + refundType?: 'fullRefund' | 'timeBasedRefund'; + refundRules: { daysBefore: number; refundPercentage: number }[]; + }; + }, + selectedSlots: { startTime: number; endTime: number }[], + serverPrice: number +): IContractSnapshot { + const packages: IContractPackage[] = []; + + if (venue.bookingType === 'fixedBooking') { + for (const slot of selectedSlots) { + const pkg = (venue.fixedPackages ?? []).find( + (p) => + timeStringToMinutes(p.startTime) === slot.startTime && + timeStringToMinutes(p.endTime) === slot.endTime + ); + packages.push({ + pkgName: pkg?.slotName ?? `${String(slot.startTime)}-${String(slot.endTime)}`, + pkgType: 'fixed', + startTime: slot.startTime, + endTime: slot.endTime, + price: pkg?.price ?? 0, + }); + } + } else { + if (!venue.pricing) { + throw new Error('Pricing configuration is missing for flexible booking venue'); + } + for (const slot of selectedSlots) { + let price = venue.pricing.basePrice; + if (venue.pricing.pricingType === 'timeBasedPricing') { + for (const rule of venue.pricing.pricingRules) { + const ruleStart = timeStringToMinutes(rule.fromTime); + const ruleEnd = timeStringToMinutes(rule.toTime); + if (slot.startTime >= ruleStart && slot.startTime < ruleEnd) { + price = rule.price; + break; + } + } + } + packages.push({ + pkgName: `${String(slot.startTime)}-${String(slot.endTime)}`, + pkgType: 'flexible', + startTime: slot.startTime, + endTime: slot.endTime, + price, + }); + } + } + + if (!venue.cancellation) { + logError('Venue missing cancellation policy', { + module: 'booking.workflow.ts/buildContractSnapshot', + venueName: venue.name, + }); + } + + return { + venue: { + name: venue.name, + city: venue.city, + district: venue.district, + }, + packages, + financial: { + basePrice: serverPrice, + taxes: 0, + platformFee: 0, + totalPaid: serverPrice, + }, + cancellation: venue.cancellation ?? { + policy: 'nonRefundable' as const, + refundRules: [], + }, + }; +} + +export async function blockSlotWorkflow( + venueId: string, + userId: string, + date: string, + expectedPrice: number, + selectedSlots: { startTime: number; endTime: number }[], + sessionToken?: string +): Promise<{ lockId: string; expiresAt: string; amountToPay: number }> { + const venue = await repo.fetchApprovedVenueForBooking(venueId); + if (!venue) { + throw new Error('Venue not found or unavailable for booking.'); + } + + const dateCheck = validateDateForVenue(venue, date); + if (!dateCheck.valid) { + throw new Error(dateCheck.reason ?? 'Invalid date'); + } + + const slotCheck = validateSelectedSlotsForVenue(venue, selectedSlots); + if (!slotCheck.valid) { + throw new Error(slotCheck.reason ?? 'Invalid slots'); + } + + const serverPrice = computeServerTotalPrice(venue, selectedSlots); + const priceCheck = assertPriceWithinTolerance(serverPrice, expectedPrice, 2); + if (!priceCheck.valid) { + throw new Error(priceCheck.reason ?? 'Price mismatch'); + } + + const contractSnapshot = buildContractSnapshot(venue, selectedSlots, serverPrice); + + const sortedSlots = [...selectedSlots].sort((a, b) => a.startTime - b.startTime); + const effectiveStart = sortedSlots[0].startTime; + const effectiveEnd = sortedSlots[sortedSlots.length - 1].endTime; + + const sessionTokenHash = sessionToken + ? crypto.createHash('sha256').update(sessionToken).digest('hex') + : undefined; + + const mutexAcquired = await acquireSlotMutex(venueId, date); + if (!mutexAcquired) { + throw new Error('Someone else is booking this slot right now. Please try again in a moment.'); + } + + let lock; + try { + lock = await runInTransaction(async (session) => { + const conflicts = await repo.fetchActiveConflicts(venueId, date, { + excludeUserId: userId, + excludeSessionTokenHash: sessionTokenHash, + session, + }); + + if (checkOverlap(effectiveStart, effectiveEnd, conflicts)) { + throw new Error( + 'The selected time slot is no longer available. Please choose a different slot.' + ); + } + + const deleteConditions: Record[] = [{ userId: new Types.ObjectId(userId) }]; + if (sessionTokenHash) { + deleteConditions.push({ sessionTokenHash }); + } + await repo.deleteLocksByConditions( + [ + { userId: new Types.ObjectId(userId) }, + ...(sessionTokenHash ? [{ sessionTokenHash }] : []), + ], + session + ); + + const [newLock] = await repo.createLock( + [ + { + venueId: new Types.ObjectId(venueId), + userId: new Types.ObjectId(userId), + date, + startTime: effectiveStart, + endTime: effectiveEnd, + price: serverPrice, + sessionTokenHash, + contractSnapshot, + createdAt: new Date(), + }, + ], + session + ); + return newLock; + }); + } finally { + await releaseSlotMutex(venueId, date); + } + + const expiresAt = new Date(lock.createdAt.getTime() + LOCK_TTL_SECONDS * 1000); + + logInfo('Slot lock acquired', { + lockId: lock._id.toString(), + venueId, + userId, + date, + startTime: effectiveStart, + endTime: effectiveEnd, + }); + + return { + lockId: lock._id.toString(), + expiresAt: expiresAt.toISOString(), + amountToPay: serverPrice, + }; +} + +export async function saveBookerDetailsWorkflow( + lockId: string, + userId: string, + guestCount?: number, + eventType?: string, + bookerInfo?: Record +): Promise { + const lock = await repo.updateLockBookerDetails( + lockId, + userId, + guestCount, + eventType, + bookerInfo + ); + if (!lock) { + throw new Error('Booking session expired. Please re-select your slot and try again.'); + } + return true; +} + +export async function initCheckoutWorkflow( + userId: string, + lockId: string +): Promise<{ orderId: string; amount: number; currency: string }> { + const lock = await repo.findLockById(lockId, userId); + + if (!lock) { + throw new Error('Lock expired. Please re-select your slot and try again.'); + } + + const lockCreatedAt = + lock.createdAt instanceof Date ? lock.createdAt.getTime() : new Date(lock.createdAt).getTime(); + + const lockExpiresAtMs = lockCreatedAt + LOCK_TTL_SECONDS * 1000; + const remainingMs = lockExpiresAtMs - Date.now(); + + if (remainingMs < CHECKOUT_BUFFER_MS) { + logWarn('Checkout rejected: insufficient time remaining on lock', { + lockId, + userId, + remainingSeconds: Math.floor(remainingMs / 1000), + }); + throw new Error('Insufficient time to complete payment. Please re-select your slot.'); + } + + const amountPaise = Math.round(lock.price * 100); + + const order = await createOrder({ + amountPaise, + currency: 'INR', + notes: { + lockId: lock._id.toString(), + venueId: lock.venueId.toString(), + userId: lock.userId.toString(), + }, + }); + + logInfo('Razorpay checkout order created', { + lockId: lock._id.toString(), + orderId: order.orderId, + amount: order.amount, + }); + + return { + orderId: order.orderId, + amount: order.amount, + currency: order.currency, + }; +} + +export async function releaseLockWorkflow(userId?: string, sessionToken?: string): Promise { + if (!userId && !sessionToken) return; + + const deleteConditions: Record[] = []; + if (userId) deleteConditions.push({ userId: new Types.ObjectId(userId) }); + if (sessionToken) { + const sessionTokenHash = crypto.createHash('sha256').update(sessionToken).digest('hex'); + deleteConditions.push({ sessionTokenHash }); + } + + await repo.deleteLocksByConditions(deleteConditions); +} + +export async function cancelBookingWorkflow( + userId: string, + bookingId: string, + reason?: string +): Promise { + const booking = await repo.fetchUserBookingByRefIdOrId(bookingId, userId); + + if (!booking) { + throw new Error('Booking not found'); + } + + if (booking.status !== BookingStatus.CONFIRMED) { + throw new Error('Only confirmed bookings can be cancelled'); + } + + const now = new Date(); + const bookingEnd = new Date(`${booking.date}T00:00:00`); + bookingEnd.setMinutes(booking.endTime); + + if (bookingEnd < now) { + throw new Error('Cannot cancel a booking that has already started or completed'); + } + + const bookingDetails = await repo.fetchBookingById(booking._id.toString(), userId); + if (!bookingDetails || (bookingDetails.cancellationRefundPct as number) === 0) { + throw new Error('Cancellation window passed or non-refundable venue'); + } + + const hasSnapshot = bookingDetails.contractSnapshot !== undefined; + if (!hasSnapshot) { + logWarn('Booking missing contractSnapshot — falling back to live venue data', { + module: 'booking.workflow.ts/cancelBookingWorkflow', + bookingId: booking._id.toString(), + userId, + }); + } + + // Atomic guard: only one concurrent cancellation request can ever pass + // this point for a given booking. If another request already cancelled + // it (race or retry), this returns null and we stop before touching + // Razorpay — this is what prevents a double refund. + const claimed = await repo.claimBookingForCancellation(booking._id.toString(), userId, reason); + if (!claimed) { + throw new Error('This booking has already been cancelled.'); + } + + const amountPaise = claimed.price * 100; + const refundAmountPaise = Math.floor( + amountPaise * ((bookingDetails.cancellationRefundPct as number) / 100) + ); + + if (refundAmountPaise > 0 && claimed.paymentReference) { + try { + await issueRefund(claimed.paymentReference, refundAmountPaise); + } catch (err) { + logError('CRITICAL: Razorpay refund failed after booking was already marked cancelled', { + module: 'booking.workflow.ts/cancelBookingWorkflow', + bookingId: claimed._id.toString(), + paymentId: claimed.paymentReference, + amountPaise: refundAmountPaise, + error: (err as Error).message, + }); + throw new Error('Booking cancelled, but the refund failed. Please contact support.', { + cause: err, + }); + } + } + + try { + const customerEmail = await findUserEmailById(userId); + + if (customerEmail) { + const venueName = bookingDetails.venueName as string; + const date = bookingDetails.date as string; + const timeRange = bookingDetails.timeRange as string; + const bookingRef = bookingDetails.bookingRef as string; + + await enqueueEmailTask( + customerEmail, + EmailIntent.BOOKING_CANCELLATION, + `Booking Cancelled – ${venueName}`, + EmailTaskStatus.PENDING, + { + bookingRef, + venueName, + date, + timeRange, + refundAmount: (refundAmountPaise / 100).toString(), + } + ); + } + } catch (emailErr) { + logWarn('Failed to queue cancellation email', { + bookingId, + error: (emailErr as Error).message, + }); + } + + return true; +} diff --git a/server/src/modules/booking/lock.types.ts b/server/src/modules/booking/lock.types.ts new file mode 100644 index 0000000000..c8145dda91 --- /dev/null +++ b/server/src/modules/booking/lock.types.ts @@ -0,0 +1,57 @@ +import type { Document, Types } from 'mongoose'; + +export interface IContractPackage { + pkgName: string; + pkgType: 'fixed' | 'flexible'; + startTime: number; + endTime: number; + price: number; +} + +export interface IContractFinancial { + basePrice: number; + taxes: number; + platformFee: number; + totalPaid: number; +} + +export interface IContractCancellation { + policy: 'refundable' | 'nonRefundable'; + refundType?: 'fullRefund' | 'timeBasedRefund'; + refundRules: { + daysBefore: number; + refundPercentage: number; + }[]; +} + +export interface IContractSnapshot { + venue: { + name: string; + city: string; + district: string; + }; + packages: IContractPackage[]; + financial: IContractFinancial; + cancellation: IContractCancellation; +} + +export interface ILock extends Document { + venueId: Types.ObjectId; + userId: Types.ObjectId; + date: string; + startTime: number; + endTime: number; + price: number; + sessionTokenHash?: string; + guestCount?: number; + eventType?: string; + bookerInfo?: { + name?: string; + email?: string; + phone?: string; + place?: string; + note?: string; + }; + contractSnapshot?: IContractSnapshot; + createdAt: Date; +} diff --git a/server/src/modules/booking/models/booking.model.ts b/server/src/modules/booking/models/booking.model.ts new file mode 100644 index 0000000000..76f7580a94 --- /dev/null +++ b/server/src/modules/booking/models/booking.model.ts @@ -0,0 +1,63 @@ +import mongoose, { Schema } from 'mongoose'; +import type { IBooking } from '../booking.types'; +import { BookingStatus } from '../../../constants/booking.constants'; +import { PaymentStatus } from '../../../constants/payment.constants'; + +const BookingSchema = new Schema( + { + venueId: { type: Schema.Types.ObjectId, ref: 'Venues', required: true }, + userId: { type: Schema.Types.ObjectId, ref: 'Users', required: true }, + date: { type: String, required: true }, + startTime: { type: Number, required: true }, // minutes from midnight + endTime: { type: Number, required: true }, // minutes from midnight + price: { type: Number, required: true }, + paymentReference: { type: String, required: true, trim: true }, // Razorpay payment_id + status: { + type: String, + enum: Object.values(BookingStatus), + required: true, + default: BookingStatus.CONFIRMED, + }, + paymentStatus: { + type: String, + enum: Object.values(PaymentStatus), + required: true, + default: PaymentStatus.PAID, + }, + guestCount: { type: Number, required: false }, + eventType: { type: String, required: false, trim: true }, + bookerInfo: { + name: { type: String, required: false, trim: true }, + email: { type: String, required: false, trim: true }, + phone: { type: String, required: false, trim: true }, + place: { type: String, required: false, trim: true }, + note: { type: String, required: false, trim: true }, + }, + paymentMethod: { type: String, required: false, trim: true }, + advancePaid: { type: Number, required: false }, + remainingAmount: { type: Number, required: false }, + cancellationReason: { type: String, required: false, trim: true }, + contractSnapshot: { type: Schema.Types.Mixed }, // typed via IContractSnapshot from lock.types + }, + { timestamps: true } +); + +BookingSchema.index({ venueId: 1, date: 1 }); + +BookingSchema.index({ venueId: 1, date: 1, startTime: 1, endTime: 1, status: 1 }); + +BookingSchema.index({ paymentStatus: 1 }); + +BookingSchema.index( + { venueId: 1, date: 1, startTime: 1, endTime: 1 }, + { + unique: true, + partialFilterExpression: { + status: { + $in: [BookingStatus.CONFIRMED, BookingStatus.COMPLETED, BookingStatus.IN_PROGRESS], + }, + }, + } +); + +export const BookingModel = mongoose.model('Bookings', BookingSchema, 'Bookings'); diff --git a/server/src/modules/booking/models/failedBooking.model.ts b/server/src/modules/booking/models/failedBooking.model.ts new file mode 100644 index 0000000000..d6ec610d3a --- /dev/null +++ b/server/src/modules/booking/models/failedBooking.model.ts @@ -0,0 +1,25 @@ +import mongoose, { Schema } from 'mongoose'; +import type { IFailedBooking } from '../booking.types'; + +const FailedBookingSchema = new Schema( + { + venueId: { type: Schema.Types.ObjectId, ref: 'Venues', required: true }, + userId: { type: Schema.Types.ObjectId, ref: 'Users', required: true }, + date: { type: String, required: true }, + startTime: { type: Number, required: true }, + endTime: { type: Number, required: true }, + amountPaid: { type: Number, required: true }, // paise + paymentReference: { type: String, required: true, trim: true }, + refundReference: { type: String, required: true, trim: true }, + reason: { type: String, required: true, trim: true }, // e.g. 'TTL_EXPIRED_COLLISION' + }, + { + timestamps: { createdAt: true, updatedAt: false }, // immutable audit log + } +); + +export const FailedBookingModel = mongoose.model( + 'FailedBookings', + FailedBookingSchema, + 'FailedBookings' +); diff --git a/server/src/modules/booking/models/lock.model.ts b/server/src/modules/booking/models/lock.model.ts new file mode 100644 index 0000000000..fc5121b788 --- /dev/null +++ b/server/src/modules/booking/models/lock.model.ts @@ -0,0 +1,27 @@ +import mongoose, { Schema } from 'mongoose'; +import type { ILock } from '../lock.types'; + +const LockSchema = new Schema({ + venueId: { type: Schema.Types.ObjectId, ref: 'Venues', required: true }, + userId: { type: Schema.Types.ObjectId, ref: 'Users', required: true }, + date: { type: String, required: true }, + startTime: { type: Number, required: true }, + endTime: { type: Number, required: true }, + price: { type: Number, required: true }, + sessionTokenHash: { type: String }, + guestCount: { type: Number, required: false }, + eventType: { type: String, required: false, trim: true }, + bookerInfo: { + name: { type: String, required: false, trim: true }, + email: { type: String, required: false, trim: true }, + phone: { type: String, required: false, trim: true }, + place: { type: String, required: false, trim: true }, + note: { type: String, required: false, trim: true }, + }, + contractSnapshot: { type: Schema.Types.Mixed }, // typed via ILock, Mixed avoids subdoc casting issues + createdAt: { type: Date, default: Date.now, expires: 600 }, // 600s = 10 minutes +}); + +LockSchema.index({ venueId: 1, date: 1 }); + +export const LockModel = mongoose.model('Locks', LockSchema, 'Locks'); diff --git a/server/src/modules/booking/models/processedWebhook.model.ts b/server/src/modules/booking/models/processedWebhook.model.ts new file mode 100644 index 0000000000..58089c5134 --- /dev/null +++ b/server/src/modules/booking/models/processedWebhook.model.ts @@ -0,0 +1,29 @@ +import mongoose, { Schema } from 'mongoose'; +import type { IProcessedWebhook } from '../booking.types'; + +const ProcessedWebhookSchema = new Schema( + { + // Razorpay event_id — unique index is the idempotency gate. + // Duplicate inserts throw MongoServerError code 11000, which the + // webhook controller catches to return 200 immediately. + eventId: { + type: String, + required: true, + unique: true, + trim: true, + }, + }, + { + timestamps: { createdAt: true, updatedAt: false }, + } +); + +// Auto-expire records after 30 days to avoid unbounded collection growth. +// A 30-day window is sufficient; Razorpay never replays events that old. +ProcessedWebhookSchema.index({ createdAt: 1 }, { expireAfterSeconds: 30 * 24 * 60 * 60 }); + +export const ProcessedWebhookModel = mongoose.model( + 'ProcessedWebhooks', + ProcessedWebhookSchema, + 'ProcessedWebhooks' +); diff --git a/server/src/modules/booking/models/slotMutex.model.ts b/server/src/modules/booking/models/slotMutex.model.ts new file mode 100644 index 0000000000..7196859793 --- /dev/null +++ b/server/src/modules/booking/models/slotMutex.model.ts @@ -0,0 +1,21 @@ +import mongoose, { Schema } from 'mongoose'; + +export interface ISlotMutex { + venueId: mongoose.Types.ObjectId; + date: string; + lockedAt: Date; +} + +const SlotMutexSchema = new Schema({ + venueId: { type: Schema.Types.ObjectId, required: true }, + date: { type: String, required: true }, + lockedAt: { type: Date, required: true, default: Date.now, expires: 30 }, +}); + +SlotMutexSchema.index({ venueId: 1, date: 1 }, { unique: true }); + +export const SlotMutexModel = mongoose.model( + 'SlotMutexes', + SlotMutexSchema, + 'SlotMutexes' +); diff --git a/server/src/modules/geo/geo.router.ts b/server/src/modules/geo/geo.router.ts new file mode 100644 index 0000000000..e764d86ee4 --- /dev/null +++ b/server/src/modules/geo/geo.router.ts @@ -0,0 +1,88 @@ +import { Router } from 'express'; +import type { Request, Response } from 'express'; +import { verifyAccessToken } from '../../middlewares/auth.middleware'; +import { searchPlace } from './geo.service'; +import { ResponseUtil } from '../../utils/responseUtils'; +import { logError } from '../../utils/logger'; + +const router: Router = Router(); + +/** + * @openapi + * /geo/search: + * get: + * tags: [Geo] + * summary: Search for places using OpenStreetMap Nominatim + * description: | + * Search for cities, towns, or places in India using OpenStreetMap's Nominatim geocoding service. + * Results include coordinates, city/district, and postcode information. + * security: + * - bearerAuth: [] + * parameters: + * - in: query + * name: q + * required: true + * schema: + * type: string + * minLength: 2 + * description: Search query (city, town, or place name) + * responses: + * 200: + * description: Array of search results + * content: + * application/json: + * schema: + * type: object + * properties: + * success: + * type: boolean + * data: + * type: array + * items: + * type: object + * properties: + * displayName: + * type: string + * lat: + * type: number + * lng: + * type: number + * city: + * type: string + * district: + * type: string + * postcode: + * type: string + * 400: + * description: Missing or invalid query parameter + * 401: + * description: Not authenticated + * 503: + * description: Search service temporarily unavailable + */ +router.get('/search', verifyAccessToken, async (req: Request, res: Response): Promise => { + try { + const { q } = req.query; + + if (!q || typeof q !== 'string' || q.trim().length < 2) { + ResponseUtil.badRequest(res, 'Search query must be at least 2 characters'); + return; + } + + const results = await searchPlace(q); + ResponseUtil.success(res, 'Places found', results); + } catch (err) { + const error = err as Error; + if (error.message.includes('temporarily unavailable')) { + ResponseUtil.internalServerError(res, error.message); + } else { + logError('Geo search error', { + module: 'geo.router.ts/search', + error: error.message, + }); + ResponseUtil.internalServerError(res, 'Search failed. Please try again.'); + } + } +}); + +export { router as geoRouter }; diff --git a/server/src/modules/geo/geo.service.ts b/server/src/modules/geo/geo.service.ts new file mode 100644 index 0000000000..aa4af0656a --- /dev/null +++ b/server/src/modules/geo/geo.service.ts @@ -0,0 +1,182 @@ +import { logError } from '../../utils/logger'; +import type { GeoSearchResult, NominatimResponse } from './geo.types'; + +// Simple in-memory LRU cache with TTL +interface CacheEntry { + data: T; + timestamp: number; +} + +class LRUCache { + private map = new Map>(); + private ttl: number; // ms + private maxSize: number; + + constructor(ttl: number = 5 * 60 * 1000, maxSize = 100) { + this.ttl = ttl; + this.maxSize = maxSize; + } + + get(key: string): T | null { + const entry = this.map.get(key); + if (!entry) return null; + + const now = Date.now(); + if (now - entry.timestamp > this.ttl) { + this.map.delete(key); + return null; + } + + // Move to end (most recently used) + this.map.delete(key); + this.map.set(key, entry); + return entry.data; + } + + set(key: string, value: T): void { + // Remove if exists to move to end + if (this.map.has(key)) { + this.map.delete(key); + } + + // Evict oldest if at capacity + if (this.map.size >= this.maxSize) { + const oldestKey = this.map.keys().next().value; + if (oldestKey) { + this.map.delete(oldestKey); + } + } + + this.map.set(key, { data: value, timestamp: Date.now() }); + } + + clear(): void { + this.map.clear(); + } +} + +// Token bucket rate limiter (1 request per second) +class TokenBucket { + private tokens = 1; + private maxTokens = 1; + private refillRate = 1000; // ms per token + private lastRefillTime: number = Date.now(); + + takeToken(): boolean { + this.refill(); + if (this.tokens > 0) { + this.tokens--; + return true; + } + return false; + } + + private refill(): void { + const now = Date.now(); + const timePassed = now - this.lastRefillTime; + const tokensToAdd = timePassed / this.refillRate; + + if (tokensToAdd >= 1) { + this.tokens = Math.min(this.maxTokens, this.tokens + Math.floor(tokensToAdd)); + this.lastRefillTime = now; + } + } +} + +// Global cache and rate limiter +const nominatimCache = new LRUCache(5 * 60 * 1000, 100); // 5 min TTL +const tokenBucket = new TokenBucket(); + +const NOMINATIM_BASE_URL = 'https://nominatim.openstreetmap.org/search'; +const USER_AGENT = 'BookMyVenue/1.0 (+https://github.com/ashishshaiju/bookmyvenue)'; + +const KERALA_VIEWBOX = '74.8,12.9,77.5,7.9'; +const RESULT_LIMIT = 5; +const RAW_RESULT_LIMIT = 12; + +function normalizeQuery(query: string): string { + return query.trim().toLowerCase(); +} + +function scopeQueryToKerala(query: string): string { + return normalizeQuery(query).includes('kerala') ? query : `${query}, Kerala, India`; +} + +function parseNominatimResult(item: NominatimResponse): GeoSearchResult { + const { address } = item; + const city = address.city ?? address.town ?? address.village; + const district = address.state_district ?? address.county; + const postcode = address.postcode; + + return { + displayName: item.display_name, + lat: parseFloat(item.lat), + lng: parseFloat(item.lon), + ...(city && { city }), + ...(district && { district }), + ...(postcode && { postcode }), + boundingbox: [ + parseFloat(item.boundingbox[0]), + parseFloat(item.boundingbox[1]), + parseFloat(item.boundingbox[2]), + parseFloat(item.boundingbox[3]), + ], + }; +} + +export async function searchPlace(query: string): Promise { + const normalizedQuery = normalizeQuery(query); + + // Check cache first + const cached = nominatimCache.get(normalizedQuery); + if (cached) { + return cached; + } + + // Rate limit + if (!tokenBucket.takeToken()) { + logError('Nominatim rate limit reached', { module: 'geo.service.ts/searchPlace' }); + throw new Error('Search temporarily unavailable — please try again'); + } + + try { + const url = new URL(NOMINATIM_BASE_URL); + url.searchParams.set('q', scopeQueryToKerala(query)); + url.searchParams.set('format', 'jsonv2'); + url.searchParams.set('countrycodes', 'in'); + url.searchParams.set('addressdetails', '1'); + url.searchParams.set('limit', String(RAW_RESULT_LIMIT)); + url.searchParams.set('viewbox', KERALA_VIEWBOX); + url.searchParams.set('bounded', '1'); + + const response = await fetch(url.toString(), { + method: 'GET', + headers: { + 'User-Agent': USER_AGENT, + }, + }); + + if (!response.ok) { + throw new Error(`Nominatim returned ${String(response.status)}`); + } + + const data = (await response.json()) as NominatimResponse[]; + const results = data + .filter((item) => (item.address.state ?? '').toLowerCase() === 'kerala') + .slice(0, RESULT_LIMIT) + .map(parseNominatimResult); + + // Cache the results + nominatimCache.set(normalizedQuery, results); + + return results; + } catch (err) { + const error = err as Error; + logError('Nominatim search failed', { + module: 'geo.service.ts/searchPlace', + error: error.message, + query, + }); + throw new Error('Search temporarily unavailable — please try again', { cause: err }); + } +} diff --git a/server/src/modules/geo/geo.types.ts b/server/src/modules/geo/geo.types.ts new file mode 100644 index 0000000000..bd2b7dc433 --- /dev/null +++ b/server/src/modules/geo/geo.types.ts @@ -0,0 +1,27 @@ +export interface GeoSearchResult { + displayName: string; + lat: number; + lng: number; + city?: string; + district?: string; + postcode?: string; + boundingbox?: [number, number, number, number]; // [south, north, west, east] +} + +export interface NominatimAddress { + city?: string; + town?: string; + village?: string; + state_district?: string; + county?: string; + state?: string; + postcode?: string; +} + +export interface NominatimResponse { + display_name: string; + lat: string; + lon: string; + address: NominatimAddress; + boundingbox: [string, string, string, string]; +} diff --git a/server/src/modules/moderation/bannedUser.controller.ts b/server/src/modules/moderation/bannedUser.controller.ts new file mode 100644 index 0000000000..7b26160dc3 --- /dev/null +++ b/server/src/modules/moderation/bannedUser.controller.ts @@ -0,0 +1,71 @@ +import type { Request, Response } from 'express'; +import { ResponseUtil } from '../../utils/responseUtils'; +import { handleError } from '../../utils/errors'; +import * as service from '../moderation/bannedUser.service'; +import type { CreateBanRequest } from './bannedUser.types'; + +export const banUser = async (req: Request, res: Response): Promise => { + try { + const adminId = req.user?.userId; + if (!adminId) { + ResponseUtil.unauthorized(res, 'Unauthorized'); + return; + } + + const { userId, scope, reason, venueId, expiresAt } = req.body as CreateBanRequest; + + const ban = await service.banUser(adminId, userId, scope, reason, { + venueId: venueId ?? null, + expiresAt: expiresAt ? new Date(expiresAt) : null, + }); + + ResponseUtil.created(res, 'User banned successfully', ban); + } catch (e) { + handleError(res, e, 'banUser'); + } +}; + +export const liftBan = async (req: Request, res: Response): Promise => { + try { + const adminId = req.user?.userId; + if (!adminId) { + ResponseUtil.unauthorized(res, 'Unauthorized'); + return; + } + + const banId = Array.isArray(req.params.banId) ? req.params.banId[0] : req.params.banId; + + const ban = await service.liftBan(adminId, banId); + ResponseUtil.success(res, 'Ban lifted successfully', ban); + } catch (e) { + handleError(res, e, 'liftBan'); + } +}; + +export const liftAllBansForUser = async (req: Request, res: Response): Promise => { + try { + const adminId = req.user?.userId; + if (!adminId) { + ResponseUtil.unauthorized(res, 'Unauthorized'); + return; + } + + const userId = Array.isArray(req.params.userId) ? req.params.userId[0] : req.params.userId; + + const count = await service.liftAllBansForUser(adminId, userId); + ResponseUtil.success(res, 'All active bans lifted successfully', { liftedCount: count }); + } catch (e) { + handleError(res, e, 'liftAllBansForUser'); + } +}; + +export const getUserBans = async (req: Request, res: Response): Promise => { + try { + const userId = Array.isArray(req.params.userId) ? req.params.userId[0] : req.params.userId; + + const bans = await service.getUserBanHistory(userId); + ResponseUtil.success(res, 'User ban history retrieved', { bans }); + } catch (e) { + handleError(res, e, 'getUserBans'); + } +}; diff --git a/server/src/modules/moderation/bannedUser.model.ts b/server/src/modules/moderation/bannedUser.model.ts new file mode 100644 index 0000000000..0ef3ba5627 --- /dev/null +++ b/server/src/modules/moderation/bannedUser.model.ts @@ -0,0 +1,88 @@ +import mongoose, { type Document, Schema } from 'mongoose'; + +export type BanScope = 'full' | 'commenting' | 'owner_dashboard' | 'venue_creation'; +export type BanRecordStatus = 'active' | 'lifted' | 'expired'; + +export interface IBannedUser extends Document { + userId: mongoose.Types.ObjectId; + scope: BanScope; + venueId?: mongoose.Types.ObjectId | null; + reason: string; + bannedBy: mongoose.Types.ObjectId; + bannedAt: Date; + expiresAt?: Date | null; + status: BanRecordStatus; + liftedBy?: mongoose.Types.ObjectId | null; + liftedAt?: Date | null; + createdAt: Date; + updatedAt: Date; +} + +const BannedUserSchema = new Schema( + { + userId: { + type: Schema.Types.ObjectId, + ref: 'Users', + required: true, + index: true, + }, + scope: { + type: String, + enum: ['full', 'commenting', 'owner_dashboard', 'venue_creation'], + required: true, + }, + venueId: { + type: Schema.Types.ObjectId, + ref: 'Venues', + default: null, + }, + reason: { + type: String, + required: true, + maxlength: 500, + trim: true, + }, + bannedBy: { + type: Schema.Types.ObjectId, + ref: 'Users', + required: true, + }, + bannedAt: { + type: Date, + required: true, + default: (): Date => new Date(), + }, + expiresAt: { + type: Date, + default: null, + }, + status: { + type: String, + enum: ['active', 'lifted', 'expired'], + default: 'active', + index: true, + }, + liftedBy: { + type: Schema.Types.ObjectId, + ref: 'Users', + default: null, + }, + liftedAt: { + type: Date, + default: null, + }, + }, + { timestamps: true } +); + +// Composite index for enforcement lookups +BannedUserSchema.index({ userId: 1, scope: 1, status: 1 }, { name: 'idx_user_scope_status' }); + +// Index for expiry sweep +BannedUserSchema.index({ status: 1, expiresAt: 1 }, { name: 'idx_active_expiry' }); + +export const BannedUserModel = mongoose.model( + 'BannedUsers', + BannedUserSchema, + 'BannedUsers' +); diff --git a/server/src/modules/moderation/bannedUser.repository.ts b/server/src/modules/moderation/bannedUser.repository.ts new file mode 100644 index 0000000000..fc8969353f --- /dev/null +++ b/server/src/modules/moderation/bannedUser.repository.ts @@ -0,0 +1,156 @@ +import { BannedUserModel, type IBannedUser, type BanScope } from './bannedUser.model'; +import { UserModel } from '../user/user.models'; +import mongoose from 'mongoose'; + +const toObjectId = (id: string): mongoose.Types.ObjectId => { + return new mongoose.Types.ObjectId(id); +}; + +export async function createBan( + userId: string, + scope: BanScope, + reason: string, + bannedBy: string, + options?: { venueId?: string | null; expiresAt?: Date | null } +): Promise { + const banDoc = new BannedUserModel({ + userId: toObjectId(userId), + scope, + reason, + bannedBy: toObjectId(bannedBy), + venueId: options?.venueId ? toObjectId(options.venueId) : null, + expiresAt: options?.expiresAt ?? null, + status: 'active', + bannedAt: new Date(), + }); + + await banDoc.save(); + + // For full bans, also update User.isBanned + if (scope === 'full') { + await UserModel.findByIdAndUpdate(toObjectId(userId), { + isBanned: true, + active: false, + }).exec(); + } + + return banDoc; +} + +export async function liftAllBansForUser(userId: string, liftedBy: string): Promise { + const result = await BannedUserModel.updateMany( + { userId: toObjectId(userId), status: 'active' }, + { + $set: { + status: 'lifted', + liftedBy: toObjectId(liftedBy), + liftedAt: new Date(), + }, + } + ).exec(); + + // Restore user to active/unbanned since all bans are lifted + await UserModel.findByIdAndUpdate(toObjectId(userId), { + isBanned: false, + active: true, + }).exec(); + + return result.modifiedCount; +} + +export async function liftBan(banRecordId: string, liftedBy: string): Promise { + const updated = await BannedUserModel.findByIdAndUpdate( + toObjectId(banRecordId), + { + status: 'lifted', + liftedBy: toObjectId(liftedBy), + liftedAt: new Date(), + }, + { new: true } + ).exec(); + + if (!updated) return null; + + // If lifting a full ban, check if user has any other active full bans + if (updated.scope === 'full') { + const otherFullBans = await BannedUserModel.findOne({ + userId: updated.userId, + scope: 'full', + status: 'active', + _id: { $ne: toObjectId(banRecordId) }, + }).exec(); + + // Only restore User.isBanned/active if no other active full bans exist + if (!otherFullBans) { + await UserModel.findByIdAndUpdate(updated.userId, { + isBanned: false, + active: true, + }).exec(); + } + } + + return updated; +} + +export async function findActiveBan( + userId: string, + scope: BanScope, + venueId?: string | null +): Promise { + const query: Record = { + userId: toObjectId(userId), + scope, + status: 'active', + }; + + // For venue-scoped bans (commenting, owner_dashboard), match both global and venue-specific + if (scope === 'commenting' || scope === 'owner_dashboard') { + if (venueId) { + // Match either: venueId is null (global) OR venueId matches + query.$or = [{ venueId: null }, { venueId: toObjectId(venueId) }]; + } else { + // No specific venue passed — just match global (venueId: null) + query.venueId = null; + } + } else { + // For 'full' and 'venue_creation', always global (venueId must be null/absent) + query.venueId = null; + } + + return BannedUserModel.findOne(query).exec(); +} + +export async function findUserBans(userId: string): Promise { + return BannedUserModel.find({ userId: toObjectId(userId) }) + .sort({ bannedAt: -1 }) + .populate('bannedBy', 'username email') + .populate('liftedBy', 'username email') + .lean() + .exec(); +} + +export async function findActiveFullBans(): Promise { + return BannedUserModel.find({ + scope: 'full', + status: 'active', + expiresAt: { $lte: new Date() }, + }).exec(); +} + +export async function markAsExpired(banRecordId: string): Promise { + const updated = await BannedUserModel.findByIdAndUpdate( + toObjectId(banRecordId), + { status: 'expired' }, + { new: true } + ).exec(); + + return updated; +} + +export async function findExpiredFullBans(): Promise { + return BannedUserModel.find({ + scope: 'full', + status: 'active', + expiresAt: { $ne: null, $lte: new Date() }, + }).exec(); +} diff --git a/server/src/modules/moderation/bannedUser.router.ts b/server/src/modules/moderation/bannedUser.router.ts new file mode 100644 index 0000000000..f4715f5f20 --- /dev/null +++ b/server/src/modules/moderation/bannedUser.router.ts @@ -0,0 +1,137 @@ +import { Router } from 'express'; +import { verifyAccessToken } from '../../middlewares/auth.middleware'; +import { requireRole } from '../../middlewares/rbac.middleware'; +import { validateBody, validateParams } from '../../middlewares/validation.middleware'; +import * as controller from './bannedUser.controller'; +import * as validator from './bannedUser.validator'; +import { z } from 'zod'; + +const router: Router = Router(); + +const banIdSchema = z.object({ + banId: z.string().regex(/^[a-f\d]{24}$/i, 'Invalid ban ID'), +}); + +const userIdSchema = z.object({ + userId: z.string().regex(/^[a-f\d]{24}$/i, 'Invalid user ID'), +}); + +/** + * @openapi + * /moderation/bans: + * post: + * tags: [Moderation] + * summary: Create a ban + * security: + * - bearerAuth: [] + * requestBody: + * required: true + * content: + * application/json: + * schema: + * type: object + * required: [userId, scope, reason] + * properties: + * userId: + * type: string + * scope: + * type: string + * enum: [full, commenting, owner_dashboard, venue_creation] + * reason: + * type: string + * venueId: + * type: string + * expiresAt: + * type: string + * format: date-time + * responses: + * 201: + * description: Ban created successfully + */ +router.post( + '/', + verifyAccessToken, + requireRole('admin'), + validateBody(validator.createBanSchema), + controller.banUser +); + +/** + * @openapi + * /moderation/bans/{banId}: + * delete: + * tags: [Moderation] + * summary: Lift a ban + * security: + * - bearerAuth: [] + * parameters: + * - in: path + * name: banId + * required: true + * schema: + * type: string + * responses: + * 200: + * description: Ban lifted successfully + */ +router.delete( + '/:banId', + verifyAccessToken, + requireRole('admin'), + validateParams(banIdSchema), + controller.liftBan +); + +/** + * @openapi + * /moderation/bans/user/{userId}: + * get: + * tags: [Moderation] + * summary: Get user ban history + * security: + * - bearerAuth: [] + * parameters: + * - in: path + * name: userId + * required: true + * schema: + * type: string + * responses: + * 200: + * description: User ban history + */ +router.get( + '/user/:userId', + verifyAccessToken, + requireRole('admin'), + validateParams(userIdSchema), + controller.getUserBans +); + +/** + * @openapi + * /moderation/bans/user/{userId}/lift-all: + * post: + * tags: [Moderation] + * summary: Lift all active bans for a user + * security: + * - bearerAuth: [] + * parameters: + * - in: path + * name: userId + * required: true + * schema: + * type: string + * responses: + * 200: + * description: All active bans lifted successfully + */ +router.post( + '/user/:userId/lift-all', + verifyAccessToken, + requireRole('admin'), + validateParams(userIdSchema), + controller.liftAllBansForUser +); + +export default router; diff --git a/server/src/modules/moderation/bannedUser.service.ts b/server/src/modules/moderation/bannedUser.service.ts new file mode 100644 index 0000000000..9782d7ac53 --- /dev/null +++ b/server/src/modules/moderation/bannedUser.service.ts @@ -0,0 +1,192 @@ +import * as repo from './bannedUser.repository'; +import { getUserRole } from '../../services/roles.service'; +import { ForbiddenError, NotFoundError, ValidationError } from '../../utils/errors'; +import type { IBannedUser, BanScope } from './bannedUser.model'; +import { UserModel } from '../user/user.models'; +import { VenueModel } from '../venue/venue.model'; +import { enqueueEmailTask } from '../../services/email.repository'; +import { EmailIntent, EmailTaskStatus } from '../../constants/email.constants'; +import { logWarn } from '../../utils/logger'; + +export async function banUser( + adminId: string, + userId: string, + scope: BanScope, + reason: string, + options?: { venueId?: string | null; expiresAt?: Date | null } +): Promise { + // Guard: no self-ban + if (adminId === userId) { + throw new ForbiddenError('Cannot ban yourself'); + } + + // Guard: user exists + const targetUser = await UserModel.findById(userId).exec(); + if (!targetUser) { + throw new NotFoundError('User not found'); + } + + // Guard: cannot ban a superAdmin (unless you're also admin checking permissions, but role check happens at route level) + const userRole = await getUserRole(userId); + if (userRole?.roleName === 'superAdmin') { + throw new ForbiddenError('Cannot ban a superAdmin'); + } + + // Validate: venueId only allowed for commenting/owner_dashboard scopes + if ((scope === 'full' || scope === 'venue_creation') && options?.venueId) { + throw new ValidationError('Scope ' + scope + ' must be platform-wide (venueId not allowed)'); + } + + // Validate: expiresAt must be in the future if provided + if (options?.expiresAt && options.expiresAt <= new Date()) { + throw new ValidationError('expiresAt must be in the future'); + } + + // Validate: reason length + if (reason.trim().length < 10) { + throw new ValidationError('Reason must be at least 10 characters'); + } + + const ban = await repo.createBan(userId, scope, reason, adminId, options); + + // Resolve optional venue name for the ban notification + const venueName = options?.venueId + ? await VenueModel.findById(options.venueId) + .select('name') + .lean() + .then((v) => v?.name) + : undefined; + + // Send email notification + try { + await enqueueEmailTask( + targetUser.email, + EmailIntent.USER_BANNED, + 'Important: Your Account Access Has Been Restricted', + EmailTaskStatus.PENDING, + { + scope, + reason, + ...(options?.expiresAt ? { expiresAt: options.expiresAt.toISOString() } : {}), + ...(venueName ? { venueName } : {}), + } + ); + } catch (err) { + logWarn('Failed to queue user banned email', { + module: 'bannedUser.service.ts/banUser', + userId, + error: (err as Error).message, + }); + } + + // Log activity + const { logModerationAction } = await import('./moderationActivity.service.js'); + await logModerationAction(adminId, 'ban_user', userId, 'user', reason, { scope, ...options }); + + return ban; +} + +export async function liftBan(adminId: string, banRecordId: string): Promise { + const updated = await repo.liftBan(banRecordId, adminId); + if (!updated) { + throw new NotFoundError('Ban record not found'); + } + + // Send email notification + const user = await UserModel.findById(updated.userId).select('email').lean(); + if (user?.email) { + try { + await enqueueEmailTask( + user.email, + EmailIntent.USER_UNBANNED, + 'Your Account Access Has Been Restored', + EmailTaskStatus.PENDING, + {} + ); + } catch (err) { + logWarn('Failed to queue user unbanned email', { + module: 'bannedUser.service.ts/liftBan', + banRecordId, + error: (err as Error).message, + }); + } + } + + // Log activity + const { logModerationAction } = await import('./moderationActivity.service.js'); + await logModerationAction(adminId, 'unban_user', updated.userId.toString(), 'user', undefined, { + banRecordId, + }); + + return updated; +} + +export async function liftAllBansForUser(adminId: string, userId: string): Promise { + const targetUser = await UserModel.findById(userId).exec(); + if (!targetUser) { + throw new NotFoundError('User not found'); + } + + const count = await repo.liftAllBansForUser(userId, adminId); + + if (count > 0) { + // Send email notification + try { + await enqueueEmailTask( + targetUser.email, + EmailIntent.USER_UNBANNED, + 'Your Account Access Has Been Restored', + EmailTaskStatus.PENDING, + {} + ); + } catch (err) { + logWarn('Failed to queue user unbanned email (lift all bans)', { + module: 'bannedUser.service.ts/liftAllBansForUser', + userId, + error: (err as Error).message, + }); + } + + // Log activity + const { logModerationAction } = await import('./moderationActivity.service.js'); + await logModerationAction(adminId, 'unban_user', userId, 'user', undefined, { count }); + } + + return count; +} + +export async function isBannedForScope( + userId: string, + scope: BanScope, + venueId?: string | null +): Promise { + const ban = await repo.findActiveBan(userId, scope, venueId); + return !!ban; +} + +export async function getUserBanHistory(userId: string): Promise { + return repo.findUserBans(userId); +} + +export async function expireActiveBans(): Promise { + const expiredBans = await repo.findExpiredFullBans(); + let expiredCount = 0; + + for (const ban of expiredBans) { + const updated = await repo.markAsExpired(ban._id.toString()); + if (updated?.scope === 'full') { + // Check if user has any other active full bans + const otherFullBans = await repo.findActiveBan(ban.userId.toString(), 'full'); + if (!otherFullBans) { + // Restore User.isBanned/active + await UserModel.findByIdAndUpdate(ban.userId, { + isBanned: false, + active: true, + }).exec(); + } + } + expiredCount++; + } + + return expiredCount; +} diff --git a/server/src/modules/moderation/bannedUser.types.ts b/server/src/modules/moderation/bannedUser.types.ts new file mode 100644 index 0000000000..ab69fd6db5 --- /dev/null +++ b/server/src/modules/moderation/bannedUser.types.ts @@ -0,0 +1,9 @@ +import type { BanScope } from './bannedUser.model'; + +export interface CreateBanRequest { + userId: string; + scope: BanScope; + reason: string; + venueId?: string; + expiresAt?: string; +} diff --git a/server/src/modules/moderation/bannedUser.validator.ts b/server/src/modules/moderation/bannedUser.validator.ts new file mode 100644 index 0000000000..a86e018859 --- /dev/null +++ b/server/src/modules/moderation/bannedUser.validator.ts @@ -0,0 +1,15 @@ +import { z } from 'zod'; + +export const createBanSchema = z.object({ + userId: z.string().regex(/^[a-f\d]{24}$/i, 'Invalid user ID'), + scope: z.enum(['full', 'commenting', 'owner_dashboard', 'venue_creation']), + reason: z.string().trim().min(10, 'Reason must be at least 10 characters').max(500), + venueId: z + .string() + .regex(/^[a-f\d]{24}$/i) + .nullable() + .optional(), + expiresAt: z.string().pipe(z.coerce.date()).nullable().optional(), +}); + +export type CreateBanDTO = z.infer; diff --git a/server/src/modules/moderation/moderation.repository.ts b/server/src/modules/moderation/moderation.repository.ts new file mode 100644 index 0000000000..c9c540c801 --- /dev/null +++ b/server/src/modules/moderation/moderation.repository.ts @@ -0,0 +1,61 @@ +import { ReviewModel } from '../review/review.model'; +import { VenueModel } from '../venue/venue.model'; +import { BannedUserModel } from './bannedUser.model'; +import type { + FlaggedReviewLean, + HideRequestLean, + SuspendedVenueLean, + BannedUserLean, +} from './moderation.types'; + +export async function getTopFlaggedReviews(limit = 10): Promise { + return ReviewModel.find({ + status: 'flagged', + }) + .sort({ moderatedAt: -1, createdAt: -1 }) + .limit(limit) + .populate('userId', 'username') + .populate('venueId', 'name') + .lean() + .exec() as unknown as Promise; +} + +export async function getTopHideRequests(limit = 10): Promise { + return ReviewModel.find({ + hideRequestStatus: 'pending', + }) + .sort({ hideRequestedAt: -1 }) + .limit(limit) + .populate('userId', 'username email') + .populate({ + path: 'venueId', + select: 'name ownerUserId', + populate: { path: 'ownerUserId', select: 'username email' }, + }) + .lean() + .exec() as unknown as Promise; +} + +export async function getTopSuspendedVenues(limit = 10): Promise { + return VenueModel.find({ + status: 'Suspended', + deleted: false, + }) + .sort({ updatedAt: -1 }) + .limit(limit) + .select('_id name suspensionReason ownerUserId createdAt updatedAt') + .lean() + .exec(); +} + +export async function getTopBannedUsers(limit = 10): Promise { + return BannedUserModel.find({ + status: 'active', + }) + .sort({ bannedAt: -1 }) + .limit(limit) + .populate('userId', 'username email') + .populate('bannedBy', 'username email') + .lean() + .exec() as unknown as Promise; +} diff --git a/server/src/modules/moderation/moderation.router.ts b/server/src/modules/moderation/moderation.router.ts new file mode 100644 index 0000000000..929fc5e927 --- /dev/null +++ b/server/src/modules/moderation/moderation.router.ts @@ -0,0 +1,93 @@ +import { Router } from 'express'; +import type { Request, Response } from 'express'; +import { verifyAccessToken } from '../../middlewares/auth.middleware'; +import { requireRole } from '../../middlewares/rbac.middleware'; +import { ResponseUtil } from '../../utils/responseUtils'; +import { handleError } from '../../utils/errors'; +import { getModerationSummary } from './moderation.service'; +import { getModerationLogs } from './moderationActivity.service'; +import bannedUserRouter from './bannedUser.router'; + +const router: Router = Router(); + +/** + * @openapi + * /moderation/summary: + * get: + * tags: [Moderation] + * summary: Get moderation dashboard summary (admin only) + * security: + * - bearerAuth: [] + * responses: + * 200: + * description: Moderation summary with flagged reviews, suspended venues, banned users + * 401: + * description: Not authenticated + * 403: + * description: Not admin + */ +router + .route('/summary') + .get( + verifyAccessToken, + requireRole('admin'), + async (_req: Request, res: Response): Promise => { + try { + const summary = await getModerationSummary(); + ResponseUtil.success(res, 'Moderation summary retrieved', summary); + } catch (err) { + handleError(res, err, 'getModerationSummary'); + } + } + ); + +/** + * @openapi + * /moderation/logs: + * get: + * tags: [Moderation] + * summary: Get moderation logs (superAdmin only) + * security: + * - bearerAuth: [] + * parameters: + * - in: query + * name: page + * schema: + * type: integer + * description: Page number for pagination + * - in: query + * name: limit + * schema: + * type: integer + * description: Number of items per page + * responses: + * 200: + * description: List of moderation logs with pagination info + * 401: + * description: Not authenticated + * 403: + * description: Not authorized (requires superAdmin) + */ +router + .route('/logs') + .get( + verifyAccessToken, + requireRole('superAdmin'), + async (req: Request, res: Response): Promise => { + try { + const page = parseInt(req.query.page as string) || 1; + const limit = parseInt(req.query.limit as string) || 20; + const { logs, total } = await getModerationLogs(page, limit); + ResponseUtil.success(res, 'Moderation logs retrieved', { + logs, + pagination: { total, page, limit, totalPages: Math.ceil(total / limit) }, + }); + } catch (err) { + handleError(res, err, 'getModerationLogs'); + } + } + ); + +router.use('/bans', bannedUserRouter); + +export { router as moderationRouter }; diff --git a/server/src/modules/moderation/moderation.service.ts b/server/src/modules/moderation/moderation.service.ts new file mode 100644 index 0000000000..0279f0c667 --- /dev/null +++ b/server/src/modules/moderation/moderation.service.ts @@ -0,0 +1,68 @@ +import type { ModerationSummary } from './moderation.types'; +import * as repo from './moderation.repository'; + +export async function getModerationSummary(): Promise { + // Get top 10 flagged/removed reviews + const flaggedReviews = await repo.getTopFlaggedReviews(10); + + // Get top 10 pending hide requests + const hideRequests = await repo.getTopHideRequests(10); + + // Get top 10 suspended venues + const suspendedVenues = await repo.getTopSuspendedVenues(10); + + // Get top 10 banned users + const bannedUsers = await repo.getTopBannedUsers(10); + + return { + flaggedReviews: flaggedReviews.map((r) => ({ + _id: r._id.toString(), + rating: r.rating, + comment: r.comment, + venueId: r.venueId._id.toString(), + venueName: r.venueId.name, + userId: r.userId._id.toString(), + userName: r.userId.username, + moderationReason: r.moderationReason, + moderatedAt: r.moderatedAt, + createdAt: r.createdAt, + })), + hideRequests: hideRequests.map((r) => ({ + _id: r._id.toString(), + rating: r.rating, + comment: r.comment, + venueId: r.venueId._id.toString(), + venueName: r.venueId.name, + ownerId: r.venueId.ownerUserId._id.toString(), + ownerUsername: r.venueId.ownerUserId.username, + ownerEmail: r.venueId.ownerUserId.email, + userId: r.userId._id.toString(), + userName: r.userId.username, + userEmail: r.userId.email, + hideRequestReason: r.hideRequestReason, + hideRequestedAt: r.hideRequestedAt, + createdAt: r.createdAt, + })), + suspendedVenues: suspendedVenues.map((v) => ({ + _id: v._id.toString(), + name: v.name, + suspensionReason: v.suspensionReason, + ownerUserId: v.ownerUserId.toString(), + suspendedAt: v.updatedAt ?? v.createdAt, + createdAt: v.createdAt, + })), + bannedUsers: bannedUsers.map((u) => ({ + _id: u._id.toString(), + userId: u.userId._id.toString(), + username: u.userId.username, + email: u.userId.email, + scope: u.scope, + banReason: u.reason, + bannedBy: u.bannedBy?.username ?? u.bannedBy?._id.toString(), + bannedAt: u.bannedAt, + expiresAt: u.expiresAt, + venueId: u.venueId?.toString(), + createdAt: u.createdAt, + })), + }; +} diff --git a/server/src/modules/moderation/moderation.types.ts b/server/src/modules/moderation/moderation.types.ts new file mode 100644 index 0000000000..347f8cb4c2 --- /dev/null +++ b/server/src/modules/moderation/moderation.types.ts @@ -0,0 +1,100 @@ +import type { Types } from 'mongoose'; + +export interface FlaggedReviewLean { + _id: Types.ObjectId; + rating: number; + comment?: string; + venueId: { _id: Types.ObjectId; name: string }; + userId: { _id: Types.ObjectId; username: string }; + moderationReason?: string; + moderatedAt?: Date; + createdAt: Date; +} + +export interface HideRequestLean { + _id: Types.ObjectId; + rating: number; + comment?: string; + venueId: { + _id: Types.ObjectId; + name: string; + ownerUserId: { _id: Types.ObjectId; username: string; email: string }; + }; + userId: { _id: Types.ObjectId; username: string; email: string }; + hideRequestReason?: string; + hideRequestedAt?: Date; + createdAt: Date; +} + +export interface SuspendedVenueLean { + _id: Types.ObjectId; + name: string; + suspensionReason?: string; + ownerUserId: Types.ObjectId; + createdAt: Date; + updatedAt?: Date; +} + +export interface BannedUserLean { + _id: Types.ObjectId; + userId: { _id: Types.ObjectId; username: string; email: string }; + scope: string; + reason: string; + bannedAt: Date; + expiresAt?: Date | null; + bannedBy?: { _id: Types.ObjectId; username: string; email: string }; + venueId?: Types.ObjectId | null; + createdAt: Date; +} + +export interface ModerationSummary { + flaggedReviews: { + _id: string; + rating: number; + comment?: string; + venueId: string; + venueName?: string; + userId: string; + userName?: string; + moderationReason?: string; + moderatedAt?: Date; + createdAt: Date; + }[]; + hideRequests: { + _id: string; + rating: number; + comment?: string; + venueId: string; + venueName?: string; + ownerId: string; + ownerUsername?: string; + ownerEmail?: string; + userId: string; + userName?: string; + userEmail?: string; + hideRequestReason?: string; + hideRequestedAt?: Date; + createdAt: Date; + }[]; + suspendedVenues: { + _id: string; + name: string; + suspensionReason?: string; + ownerUserId: string; + suspendedAt?: Date; + createdAt: Date; + }[]; + bannedUsers: { + _id: string; + userId: string; + username: string; + email: string; + scope: string; + banReason: string; + bannedBy?: string; + bannedAt: Date; + expiresAt?: Date | null; + venueId?: string | null; + createdAt: Date; + }[]; +} diff --git a/server/src/modules/moderation/moderationActivity.model.ts b/server/src/modules/moderation/moderationActivity.model.ts new file mode 100644 index 0000000000..3e4a605c55 --- /dev/null +++ b/server/src/modules/moderation/moderationActivity.model.ts @@ -0,0 +1,58 @@ +import type { Document, Types } from 'mongoose'; +import mongoose, { Schema } from 'mongoose'; + +export type ModerationActionType = + | 'ban_user' + | 'unban_user' + | 'suspend_venue' + | 'unsuspend_venue' + | 'remove_review' + | 'restore_review' + | 'auto_suspend_venue' + | 'extend_venue_deadline' + | 'reject_venue'; + +export interface IModerationActivity extends Document { + adminId: mongoose.Types.ObjectId; + action: ModerationActionType; + targetId: string; // The ID of the user, venue, or review + targetType: 'user' | 'venue' | 'review'; + reason?: string; + metadata?: Record; + createdAt: Date; +} + +const ModerationActivitySchema = new Schema( + { + adminId: { type: Schema.Types.ObjectId, ref: 'Users', required: true }, + action: { type: String, required: true }, + targetId: { type: String, required: true }, + targetType: { type: String, enum: ['user', 'venue', 'review'], required: true }, + reason: { type: String }, + metadata: { type: Schema.Types.Mixed }, + }, + { timestamps: { createdAt: true, updatedAt: false } } +); + +// Index for faster queries on logs +ModerationActivitySchema.index({ adminId: 1, createdAt: -1 }); +ModerationActivitySchema.index({ createdAt: -1 }); +ModerationActivitySchema.index({ action: 1 }); +ModerationActivitySchema.index({ targetId: 1, targetType: 1 }); + +export const ModerationActivityModel = mongoose.model( + 'ModerationActivity', + ModerationActivitySchema, + 'ModerationActivities' +); + +export interface ModerationLogLean { + _id: Types.ObjectId; + adminId: { _id: Types.ObjectId; username: string; email: string }; + action: ModerationActionType; + targetId: string; + targetType: 'user' | 'venue' | 'review'; + reason?: string; + metadata?: Record; + createdAt: Date; +} diff --git a/server/src/modules/moderation/moderationActivity.service.ts b/server/src/modules/moderation/moderationActivity.service.ts new file mode 100644 index 0000000000..bf25b49c31 --- /dev/null +++ b/server/src/modules/moderation/moderationActivity.service.ts @@ -0,0 +1,53 @@ +import { + ModerationActivityModel, + type ModerationActionType, + type ModerationLogLean, +} from './moderationActivity.model'; +import type mongoose from 'mongoose'; +import { logError } from '../../utils/logger'; + +export async function logModerationAction( + adminId: string | mongoose.Types.ObjectId, + action: ModerationActionType, + targetId: string, + targetType: 'user' | 'venue' | 'review', + reason?: string, + metadata?: Record +): Promise { + try { + await ModerationActivityModel.create({ + adminId, + action, + targetId, + targetType, + reason, + metadata, + }); + } catch (error) { + // Log the error but don't fail the primary moderation action + logError('Failed to log moderation activity', { + module: 'moderationActivity.service', + error: error instanceof Error ? error.message : String(error), + }); + } +} + +export async function getModerationLogs( + page: number, + limit: number +): Promise<{ logs: ModerationLogLean[]; total: number }> { + const skip = (page - 1) * limit; + + const [logs, total] = await Promise.all([ + ModerationActivityModel.find() + .sort({ createdAt: -1 }) + .skip(skip) + .limit(limit) + .populate('adminId', 'username email') + .lean() + .exec() as unknown as Promise, + ModerationActivityModel.countDocuments(), + ]); + + return { logs, total }; +} diff --git a/server/src/modules/owner/owner.controller.ts b/server/src/modules/owner/owner.controller.ts new file mode 100644 index 0000000000..fd1f68f16d --- /dev/null +++ b/server/src/modules/owner/owner.controller.ts @@ -0,0 +1,291 @@ +import type { z } from 'zod'; +import type { Request, Response } from 'express'; +import { ResponseUtil } from '../../utils/responseUtils'; +import { handleError } from '../../utils/errors'; +import type { + blockDatesSchema, + unblockDatesSchema, + offlineBookingSchema, + ownerReplySchema, + reportReviewSchema, + inactivityRequestSchema, + deleteRequestSchema, +} from './owner.validator'; +import * as service from './owner.service'; +import * as workflow from './owner.workflow'; +import * as reviewService from '../review/review.service'; + +// GET /api/v1/owner/analytics/:venueId +export const getVenueAnalytics = async (req: Request, res: Response): Promise => { + try { + const venueId = req.params.venueId as string; + const result = await service.getVenueAnalyticsService(venueId); + ResponseUtil.success(res, 'Analytics retrieved successfully', result); + } catch (e) { + handleError(res, e, 'getVenueAnalytics'); + } +}; + +// GET /api/v1/owner/venue/:venueId/bookings +export const getVenueBookings = async (req: Request, res: Response): Promise => { + try { + const venueId = req.params.venueId as string; + const { page, limit } = req.pagination ?? { page: 1, limit: 10, skip: 0, sort: '' }; + + const result = await service.getVenueBookingsService(venueId, page, limit); + + ResponseUtil.success(res, 'Venue bookings retrieved', result); + } catch (e) { + handleError(res, e, 'getVenueBookings'); + } +}; + +// POST /api/v1/owner/bookings/offline +export const createOfflineBooking = async (req: Request, res: Response): Promise => { + try { + if (!req.user?.userId) { + ResponseUtil.unauthorized(res, 'User not authenticated'); + return; + } + const dto = req.validated?.body as z.infer; + + const result = await service.createOfflineBookingService(req.user.userId, dto); + + ResponseUtil.created(res, 'Offline booking created', result); + } catch (e) { + handleError(res, e, 'createOfflineBooking'); + } +}; + +// GET /api/v1/owner/venue/:venueId/availability-calendar +export const getVenueAvailabilityCalendar = async (req: Request, res: Response): Promise => { + try { + const venueId = req.params.venueId as string; + + const result = await workflow.getVenueAvailabilityCalendarWorkflow(venueId); + if (!result) { + ResponseUtil.notFound(res, 'Venue not found'); + return; + } + + ResponseUtil.success(res, 'Availability calendar retrieved', result); + } catch (e) { + handleError(res, e, 'getVenueAvailabilityCalendar'); + } +}; + +// POST /api/v1/owner/:venueId/block-dates +export const blockDates = async (req: Request, res: Response): Promise => { + try { + const venueId = req.params.venueId as string; + const { dates } = req.validated?.body as z.infer; + + const blockedDates = await service.blockDatesService(venueId, dates); + + ResponseUtil.success(res, 'Dates blocked successfully', blockedDates); + } catch (e) { + handleError(res, e, 'blockDates'); + } +}; + +// POST /api/v1/owner/:venueId/unblock-dates +export const unblockDates = async (req: Request, res: Response): Promise => { + try { + const venueId = req.params.venueId as string; + const { dates } = req.validated?.body as z.infer; + + const blockedDates = await service.unblockDatesService(venueId, dates); + + ResponseUtil.success(res, 'Dates unblocked successfully', blockedDates); + } catch (e) { + handleError(res, e, 'unblockDates'); + } +}; + +// GET /api/v1/owner/venue/:venueId/reviews +export const getVenueReviews = async (req: Request, res: Response): Promise => { + try { + const venueId = req.params.venueId as string; + const { page, limit, skip } = req.pagination ?? { page: 1, limit: 10, skip: 0, sort: '' }; + + const result = await reviewService.getOwnerVenueReviews(venueId, { + page, + limit, + skip, + sort: '', + }); + ResponseUtil.paginated( + res, + 'Venue reviews retrieved', + result.reviews, + result.pagination, + 'reviews' + ); + } catch (e) { + handleError(res, e, 'getVenueReviews'); + } +}; + +// POST /api/v1/owner/venue/:venueId/reviews/:reviewId/reply +export const replyToReview = async (req: Request, res: Response): Promise => { + try { + const venueId = req.params.venueId as string; + const reviewId = req.params.reviewId as string; + const { text } = req.validated?.body as z.infer; + + const review = await reviewService.replyToReview(venueId, reviewId, text); + ResponseUtil.success(res, 'Reply added successfully', review); + } catch (e) { + handleError(res, e, 'replyToReview'); + } +}; + +// POST /api/v1/owner/venue/:venueId/reviews/:reviewId/report +export const reportReview = async (req: Request, res: Response): Promise => { + try { + const userId = req.user?.userId; + if (!userId) { + ResponseUtil.unauthorized(res, 'Unauthorized'); + return; + } + + const venueId = req.params.venueId as string; + const reviewId = req.params.reviewId as string; + const { reason, action } = req.validated?.body as z.infer; + + let review; + if (action === 'hide') { + review = await reviewService.requestHideForReview(venueId, reviewId, userId, reason); + } else { + review = await reviewService.flagReview(reviewId, reason); + } + ResponseUtil.success(res, 'Report submitted successfully', review); + } catch (e) { + handleError(res, e, 'reportReview'); + } +}; + +// GET /api/v1/owner/venue/:venueId/settings +export const getVenueSettings = async (req: Request, res: Response): Promise => { + try { + const venueId = req.params.venueId as string; + const result = await service.getVenueSettingsService(venueId); + ResponseUtil.success(res, 'Venue settings retrieved successfully', result); + } catch (e) { + handleError(res, e, 'getVenueSettings'); + } +}; + +// POST /api/v1/owner/venue/:venueId/request-inactivity +export const requestInactivity = async (req: Request, res: Response): Promise => { + try { + if (!req.user?.userId) { + ResponseUtil.unauthorized(res, 'User not authenticated'); + return; + } + const venueId = req.params.venueId as string; + const { reason } = req.validated?.body as z.infer; + const result = await service.requestInactivityService(venueId, req.user.userId, reason); + ResponseUtil.success(res, 'Inactivity request submitted', result); + } catch (e) { + handleError(res, e, 'requestInactivity'); + } +}; + +// DELETE /api/v1/owner/venue/:venueId/request-inactivity +export const withdrawInactivity = async (req: Request, res: Response): Promise => { + try { + if (!req.user?.userId) { + ResponseUtil.unauthorized(res, 'User not authenticated'); + return; + } + const venueId = req.params.venueId as string; + const result = await service.withdrawInactivityService(venueId, req.user.userId); + ResponseUtil.success(res, 'Inactivity request withdrawn', result); + } catch (e) { + handleError(res, e, 'withdrawInactivity'); + } +}; + +// POST /api/v1/owner/venue/:venueId/block-bookings +export const blockBookings = async (req: Request, res: Response): Promise => { + try { + if (!req.user?.userId) { + ResponseUtil.unauthorized(res, 'User not authenticated'); + return; + } + const venueId = req.params.venueId as string; + const result = await service.blockBookingsService(venueId, req.user.userId); + ResponseUtil.success(res, 'Bookings blocked successfully', result); + } catch (e) { + handleError(res, e, 'blockBookings'); + } +}; + +// DELETE /api/v1/owner/venue/:venueId/block-bookings +export const unblockBookings = async (req: Request, res: Response): Promise => { + try { + if (!req.user?.userId) { + ResponseUtil.unauthorized(res, 'User not authenticated'); + return; + } + const venueId = req.params.venueId as string; + const result = await service.unblockBookingsService(venueId, req.user.userId); + ResponseUtil.success(res, 'Booking block removed successfully', result); + } catch (e) { + handleError(res, e, 'unblockBookings'); + } +}; + +// POST /api/v1/owner/venue/:venueId/activate +export const activateVenue = async (req: Request, res: Response): Promise => { + try { + if (!req.user?.userId) { + ResponseUtil.unauthorized(res, 'User not authenticated'); + return; + } + const venueId = req.params.venueId as string; + const result = await service.activateVenueService(venueId, req.user.userId); + ResponseUtil.success(res, 'Venue reactivated successfully', result); + } catch (e) { + handleError(res, e, 'activateVenue'); + } +}; + +// PATCH /api/v1/owner/bookings/:bookingId/mark-paid +export const markBookingAsPaid = async (req: Request, res: Response): Promise => { + try { + const bookingId = req.params.bookingId as string; + await service.markBookingAsPaidService(bookingId); + ResponseUtil.success(res, 'Booking marked as paid'); + } catch (e) { + handleError(res, e, 'markBookingAsPaid'); + } +}; + +// PATCH /api/v1/owner/bookings/:bookingId/cancel-pending +export const cancelPendingOfflineBooking = async (req: Request, res: Response): Promise => { + try { + const bookingId = req.params.bookingId as string; + await service.cancelPendingOfflineBookingService(bookingId); + ResponseUtil.success(res, 'Pending offline booking cancelled'); + } catch (e) { + handleError(res, e, 'cancelPendingOfflineBooking'); + } +}; + +// POST /api/v1/owner/venue/:venueId/delete-request +export const requestDeleteVenue = async (req: Request, res: Response): Promise => { + try { + if (!req.user?.userId) { + ResponseUtil.unauthorized(res, 'User not authenticated'); + return; + } + const venueId = req.params.venueId as string; + const { reason } = req.validated?.body as z.infer; + const result = await service.requestDeleteVenueService(venueId, req.user.userId, reason); + ResponseUtil.success(res, 'Deletion request submitted', result); + } catch (e) { + handleError(res, e, 'requestDeleteVenue'); + } +}; diff --git a/server/src/modules/owner/owner.repository.ts b/server/src/modules/owner/owner.repository.ts new file mode 100644 index 0000000000..117c905735 --- /dev/null +++ b/server/src/modules/owner/owner.repository.ts @@ -0,0 +1,253 @@ +import { Types } from 'mongoose'; +import { BookingModel } from '../booking/models/booking.model'; +import { VenueModel } from '../venue/venue.model'; +import { BookingStatus } from '../../constants/booking.constants'; +import { PaymentStatus } from '../../constants/payment.constants'; +import type { IBooking, AggregatedBooking } from '../booking/booking.types'; +import type { IVenue } from '../venue/venue.types'; + +export async function getVenueAnalyticsData(venueId: string): Promise[]> { + const pipeline = [ + { + $match: { + venueId: new Types.ObjectId(venueId), + status: { $in: [BookingStatus.CONFIRMED, BookingStatus.COMPLETED] }, + }, + }, + { + $group: { + _id: { + year: { $substrCP: ['$date', 0, 4] }, + month: { $substrCP: ['$date', 5, 2] }, + }, + revenue: { $sum: '$price' }, + count: { $sum: 1 }, + }, + }, + { $sort: { '_id.year': 1, '_id.month': 1 } as Record }, + { + $project: { + _id: 0, + year: '$_id.year', + month: '$_id.month', + revenue: 1, + count: 1, + }, + }, + ]; + + return BookingModel.aggregate(pipeline); +} + +export async function getVenueBookingsPaginated( + venueId: string, + skip: number, + limit: number +): Promise[]> { + interface OwnerAggregatedBooking extends AggregatedBooking { + bookerName?: string; + bookerEmail?: string; + bookerPhone?: string; + } + const bookings = await BookingModel.aggregate([ + { $match: { venueId: new Types.ObjectId(venueId) } }, + { $sort: { date: -1, startTime: -1 } }, + { $skip: skip }, + { $limit: limit }, + { + $lookup: { + from: 'Venues', + localField: 'venueId', + foreignField: '_id', + as: 'venue', + }, + }, + { $unwind: '$venue' }, + { + $lookup: { + from: 'Users', + localField: 'userId', + foreignField: '_id', + as: 'user', + }, + }, + { $unwind: { path: '$user', preserveNullAndEmptyArrays: true } }, + { + $addFields: { + bookerEmail: '$bookerInfo.email', + bookerPhone: '$bookerInfo.phone', + bookerName: '$bookerInfo.name', + }, + }, + { + $project: { + 'venue._id': 1, + 'venue.name': 1, + 'venue.city': 1, + 'venue.address': 1, + 'user._id': 1, + 'user.username': 1, + 'user.email': 1, + 'user.phone': 1, + _id: 1, + date: 1, + startTime: 1, + endTime: 1, + price: 1, + status: 1, + paymentStatus: 1, + paymentMethod: 1, + paymentReference: 1, + bookerName: 1, + bookerEmail: 1, + bookerPhone: 1, + createdAt: 1, + eventType: 1, + userId: 1, + bookerInfo: 1, + }, + }, + ]); + + const now = new Date(); + const result: Record[] = []; + for (const b of bookings) { + let uiStatus: string; + if (b.status === BookingStatus.CANCELLED) { + uiStatus = 'cancelled'; + } else if (b.status === BookingStatus.COMPLETED) { + uiStatus = 'completed'; + } else { + const eventEnd = new Date(`${b.date}T00:00:00`); + eventEnd.setMinutes(b.endTime); + uiStatus = eventEnd < now ? 'completed' : 'confirmed'; + } + result.push({ ...b, uiStatus }); + } + return result; +} + +export async function countVenueBookings(venueId: string): Promise { + return BookingModel.countDocuments({ venueId: new Types.ObjectId(venueId) }); +} + +export async function createOfflineBookingRecord( + venueId: string, + userId: string, + date: string, + startTime: number, + endTime: number, + price: number, + customerName: string, + phone: string +): Promise { + return BookingModel.create({ + venueId: new Types.ObjectId(venueId), + userId: new Types.ObjectId(userId), + date, + startTime, + endTime, + price, + paymentReference: `OFFLINE-${Date.now().toString()}`, + status: BookingStatus.CONFIRMED, + paymentStatus: PaymentStatus.PENDING, + paymentMethod: 'offline', + bookerInfo: { + name: customerName, + phone: phone, + }, + }); +} + +export async function getVenueBlockedDatesAndWorkingDays(venueId: string): Promise { + return VenueModel.findById(venueId) + .select('blockedDates workingDays temporaryBlockAfterDate inactivity.blockedAfterDate') + .lean() + .exec(); +} + +export async function getConfirmedBookingsAfterDate( + venueId: string, + dateThreshold: string +): Promise { + return BookingModel.find({ + venueId: new Types.ObjectId(venueId), + status: { $in: [BookingStatus.CONFIRMED, BookingStatus.COMPLETED] }, + date: { $gte: dateThreshold }, + }) + .select('date') + .lean() + .exec(); +} + +export async function findConflictingBookingForDates( + venueId: string, + dates: string[] +): Promise { + return BookingModel.findOne({ + venueId: new Types.ObjectId(venueId), + status: BookingStatus.CONFIRMED, + date: { $in: dates }, + }) + .lean() + .exec(); +} + +export async function addBlockedDatesToVenue( + venueId: string, + dates: Date[] +): Promise { + return VenueModel.findByIdAndUpdate( + venueId, + { + $addToSet: { + blockedDates: { $each: dates }, + }, + }, + { new: true } + ) + .select('blockedDates') + .lean() + .exec(); +} + +export async function markBookingAsPaid(bookingId: string): Promise { + return BookingModel.findOneAndUpdate( + { + _id: new Types.ObjectId(bookingId), + paymentReference: /^OFFLINE-/, + paymentStatus: PaymentStatus.PENDING, + }, + { $set: { paymentStatus: PaymentStatus.PAID } }, + { new: true } + ).lean(); +} + +export async function cancelPendingOfflineBooking(bookingId: string): Promise { + return BookingModel.findOneAndUpdate( + { + _id: new Types.ObjectId(bookingId), + paymentStatus: PaymentStatus.PENDING, + }, + { $set: { status: BookingStatus.CANCELLED } }, + { new: true } + ).lean(); +} + +export async function removeBlockedDatesFromVenue( + venueId: string, + dates: Date[] +): Promise { + return VenueModel.findByIdAndUpdate( + venueId, + { + $pullAll: { + blockedDates: dates, + }, + }, + { new: true } + ) + .select('blockedDates') + .lean() + .exec(); +} diff --git a/server/src/modules/owner/owner.router.ts b/server/src/modules/owner/owner.router.ts new file mode 100644 index 0000000000..fa85e6c8ef --- /dev/null +++ b/server/src/modules/owner/owner.router.ts @@ -0,0 +1,701 @@ +import { Router } from 'express'; +import { verifyAccessToken } from '../../middlewares/auth.middleware'; +import { requirePermission } from '../../middlewares/rbac.middleware'; +import { ownerTenantMiddleware } from '../../middlewares/ownerTenant.middleware'; +import { validateBody, validateParams } from '../../middlewares/validation.middleware'; +import { paginationMiddleware } from '../../middlewares/pagination.middleware'; +import { idempotencyMiddleware } from '../../middlewares/idempotency.middleware'; +import { PERMISSIONS as P } from '../../constants/permissions'; +import * as controller from './owner.controller'; +import * as validator from './owner.validator'; + +const router: Router = Router(); + +/** + * @openapi + * /owner/analytics/{venueId}: + * get: + * tags: [Owner] + * summary: Get analytics for a specific venue + * security: + * - bearerAuth: [] + * parameters: + * - in: path + * name: venueId + * required: true + * schema: + * type: string + * responses: + * 200: + * description: Venue analytics data + * 401: + * description: Not authenticated + * 403: + * description: Insufficient permissions + */ +router.get( + '/analytics/:venueId', + verifyAccessToken, + requirePermission(P.venues.read), + validateParams(validator.analyticsParamsSchema), + ownerTenantMiddleware, + controller.getVenueAnalytics +); + +/** + * @openapi + * /owner/{venueId}/block-dates: + * post: + * tags: [Owner] + * summary: Block dates for a venue + * security: + * - bearerAuth: [] + * parameters: + * - in: path + * name: venueId + * required: true + * schema: + * type: string + * requestBody: + * required: true + * content: + * application/json: + * schema: + * type: object + * required: [dates] + * properties: + * dates: + * type: array + * items: + * type: string + * format: date + * example: '2025-12-25' + * description: Array of dates to block (YYYY-MM-DD, up to 6 months ahead) + * responses: + * 200: + * description: Dates blocked successfully + * 401: + * description: Not authenticated + * 403: + * description: Insufficient permissions + */ +router.post( + '/:venueId/block-dates', + verifyAccessToken, + requirePermission(P.venues.update), + validateParams(validator.analyticsParamsSchema), + validateBody(validator.blockDatesSchema), + ownerTenantMiddleware, + controller.blockDates +); + +/** + * @openapi + * /owner/{venueId}/unblock-dates: + * post: + * tags: [Owner] + * summary: Unblock dates for a venue + * security: + * - bearerAuth: [] + * parameters: + * - in: path + * name: venueId + * required: true + * schema: + * type: string + * requestBody: + * required: true + * content: + * application/json: + * schema: + * type: object + * required: [dates] + * properties: + * dates: + * type: array + * items: + * type: string + * format: date + * example: '2025-12-25' + * description: Array of dates to unblock (YYYY-MM-DD) + * responses: + * 200: + * description: Dates unblocked successfully + * 401: + * description: Not authenticated + * 403: + * description: Insufficient permissions + */ +router.post( + '/:venueId/unblock-dates', + verifyAccessToken, + requirePermission(P.venues.update), + validateParams(validator.analyticsParamsSchema), + validateBody(validator.unblockDatesSchema), + ownerTenantMiddleware, + controller.unblockDates +); + +/** + * @openapi + * /owner/venue/{venueId}/bookings: + * get: + * tags: [Owner] + * summary: Get all bookings for a specific venue + * security: + * - bearerAuth: [] + * parameters: + * - in: path + * name: venueId + * required: true + * schema: + * type: string + * responses: + * 200: + * description: List of venue bookings + * 401: + * description: Not authenticated + * 403: + * description: Insufficient permissions + */ +router.get( + '/venue/:venueId/bookings', + verifyAccessToken, + requirePermission(P.bookings.read), + validateParams(validator.analyticsParamsSchema), + ownerTenantMiddleware, + paginationMiddleware(), + controller.getVenueBookings +); + +/** + * @openapi + * /owner/venue/{venueId}/availability-calendar: + * get: + * tags: [Owner] + * summary: Get availability calendar for a venue + * security: + * - bearerAuth: [] + * parameters: + * - in: path + * name: venueId + * required: true + * schema: + * type: string + * - in: query + * name: month + * schema: + * type: integer + * - in: query + * name: year + * schema: + * type: integer + * responses: + * 200: + * description: Availability calendar data + * 401: + * description: Not authenticated + * 403: + * description: Insufficient permissions + */ +router.get( + '/venue/:venueId/availability-calendar', + verifyAccessToken, + requirePermission(P.venues.read), + validateParams(validator.analyticsParamsSchema), + ownerTenantMiddleware, + controller.getVenueAvailabilityCalendar +); + +/** + * @openapi + * /owner/bookings/offline: + * post: + * tags: [Owner] + * summary: Create an offline booking + * security: + * - bearerAuth: [] + * requestBody: + * required: true + * content: + * application/json: + * schema: + * type: object + * required: [venueId, date, startTime, endTime, customerName, customerPhone] + * properties: + * venueId: + * type: string + * date: + * type: string + * format: date + * startTime: + * type: integer + * endTime: + * type: integer + * customerName: + * type: string + * customerPhone: + * type: string + * responses: + * 200: + * description: Offline booking created successfully + * 401: + * description: Not authenticated + * 403: + * description: Insufficient permissions + */ +router.post( + '/bookings/offline', + verifyAccessToken, + requirePermission(P.bookings.create), + validateBody(validator.offlineBookingSchema), + ownerTenantMiddleware, + controller.createOfflineBooking +); + +/** + * @openapi + * /owner/venue/{venueId}/reviews: + * get: + * tags: [Owner] + * summary: Get reviews for a specific venue (owner only) + * security: + * - bearerAuth: [] + * parameters: + * - in: path + * name: venueId + * required: true + * schema: + * type: string + * - in: query + * name: page + * schema: + * type: integer + * - in: query + * name: limit + * schema: + * type: integer + * responses: + * 200: + * description: Reviews for the venue + * 403: + * description: Not the venue owner + */ +router.get( + '/venue/:venueId/reviews', + verifyAccessToken, + requirePermission(P.reviews.read), + validateParams(validator.analyticsParamsSchema), + ownerTenantMiddleware, + paginationMiddleware(), + controller.getVenueReviews +); + +/** + * @openapi + * /owner/venue/{venueId}/reviews/{reviewId}/reply: + * post: + * tags: [Owner] + * summary: Reply to a review (owner only) + * security: + * - bearerAuth: [] + * parameters: + * - in: path + * name: venueId + * required: true + * schema: + * type: string + * - in: path + * name: reviewId + * required: true + * schema: + * type: string + * requestBody: + * required: true + * content: + * application/json: + * schema: + * type: object + * required: [text] + * properties: + * text: + * type: string + * maxLength: 500 + * responses: + * 200: + * description: Reply added successfully + * 403: + * description: Not the venue owner + */ +router.post( + '/venue/:venueId/reviews/:reviewId/reply', + verifyAccessToken, + requirePermission(P.reviews.update), + validateParams(validator.reviewParamsSchema), + validateBody(validator.ownerReplySchema), + ownerTenantMiddleware, + controller.replyToReview +); + +/** + * @openapi + * /owner/venue/{venueId}/reviews/{reviewId}/report: + * post: + * tags: [Owner] + * summary: Report a review to admin for hiding (owner only) + * security: + * - bearerAuth: [] + * parameters: + * - in: path + * name: venueId + * required: true + * schema: + * type: string + * - in: path + * name: reviewId + * required: true + * schema: + * type: string + * requestBody: + * required: true + * content: + * application/json: + * schema: + * type: object + * required: [reason] + * properties: + * reason: + * type: string + * minLength: 10 + * maxLength: 500 + * responses: + * 200: + * description: Report submitted to admin + * 403: + * description: Not the venue owner + * 409: + * description: Hide request already pending + */ +router.post( + '/venue/:venueId/reviews/:reviewId/report', + verifyAccessToken, + requirePermission(P.reviews.update), + validateParams(validator.reviewParamsSchema), + validateBody(validator.reportReviewSchema), + ownerTenantMiddleware, + controller.reportReview +); + +/** + * @openapi + * /owner/venue/{venueId}/settings: + * get: + * tags: [Owner] + * summary: Get venue settings + * security: + * - bearerAuth: [] + * parameters: + * - in: path + * name: venueId + * required: true + * schema: + * type: string + * responses: + * 200: + * description: Venue settings data + * 401: + * description: Not authenticated + * 403: + * description: Insufficient permissions + */ +router.get( + '/venue/:venueId/settings', + verifyAccessToken, + requirePermission(P.venues.read), + validateParams(validator.analyticsParamsSchema), + ownerTenantMiddleware, + controller.getVenueSettings +); + +/** + * @openapi + * /owner/venue/{venueId}/request-inactivity: + * post: + * tags: [Owner] + * summary: Request venue inactivity (requires admin approval) + * security: + * - bearerAuth: [] + * parameters: + * - in: path + * name: venueId + * required: true + * schema: + * type: string + * requestBody: + * required: false + * content: + * application/json: + * schema: + * type: object + * properties: + * reason: + * type: string + * responses: + * 200: + * description: Inactivity request submitted + * 401: + * description: Not authenticated + * 403: + * description: Insufficient permissions + */ +router.post( + '/venue/:venueId/request-inactivity', + verifyAccessToken, + requirePermission(P.venues.update), + validateParams(validator.analyticsParamsSchema), + validateBody(validator.inactivityRequestSchema), + ownerTenantMiddleware, + idempotencyMiddleware(), + controller.requestInactivity +); + +/** + * @openapi + * /owner/venue/{venueId}/request-inactivity: + * delete: + * tags: [Owner] + * summary: Withdraw inactivity request + * security: + * - bearerAuth: [] + * parameters: + * - in: path + * name: venueId + * required: true + * schema: + * type: string + * responses: + * 200: + * description: Inactivity request withdrawn + * 401: + * description: Not authenticated + * 403: + * description: Insufficient permissions + */ +router.delete( + '/venue/:venueId/request-inactivity', + verifyAccessToken, + requirePermission(P.venues.update), + validateParams(validator.analyticsParamsSchema), + ownerTenantMiddleware, + idempotencyMiddleware(), + controller.withdrawInactivity +); + +/** + * @openapi + * /owner/venue/{venueId}/block-bookings: + * post: + * tags: [Owner] + * summary: Block bookings for a venue (no approval needed) + * security: + * - bearerAuth: [] + * parameters: + * - in: path + * name: venueId + * required: true + * schema: + * type: string + * responses: + * 200: + * description: Bookings blocked successfully + * 401: + * description: Not authenticated + * 403: + * description: Insufficient permissions + */ +router.post( + '/venue/:venueId/block-bookings', + verifyAccessToken, + requirePermission(P.venues.update), + validateParams(validator.analyticsParamsSchema), + ownerTenantMiddleware, + idempotencyMiddleware(), + controller.blockBookings +); + +/** + * @openapi + * /owner/venue/{venueId}/block-bookings: + * delete: + * tags: [Owner] + * summary: Remove temporary booking block + * security: + * - bearerAuth: [] + * parameters: + * - in: path + * name: venueId + * required: true + * schema: + * type: string + * responses: + * 200: + * description: Booking block removed + * 401: + * description: Not authenticated + * 403: + * description: Insufficient permissions + */ +router.delete( + '/venue/:venueId/block-bookings', + verifyAccessToken, + requirePermission(P.venues.update), + validateParams(validator.analyticsParamsSchema), + ownerTenantMiddleware, + idempotencyMiddleware(), + controller.unblockBookings +); + +/** + * @openapi + * /owner/venue/{venueId}/activate: + * post: + * tags: [Owner] + * summary: Reactivate venue from Inactive to Approved + * security: + * - bearerAuth: [] + * parameters: + * - in: path + * name: venueId + * required: true + * schema: + * type: string + * responses: + * 200: + * description: Venue reactivated successfully + * 401: + * description: Not authenticated + * 403: + * description: Insufficient permissions + */ +router.post( + '/venue/:venueId/activate', + verifyAccessToken, + requirePermission(P.venues.update), + validateParams(validator.analyticsParamsSchema), + ownerTenantMiddleware, + idempotencyMiddleware(), + controller.activateVenue +); + +/** + * @openapi + * /owner/venue/{venueId}/delete-request: + * post: + * tags: [Owner] + * summary: Request venue deletion (requires admin approval) + * security: + * - bearerAuth: [] + * parameters: + * - in: path + * name: venueId + * required: true + * schema: + * type: string + * requestBody: + * required: true + * content: + * application/json: + * schema: + * type: object + * required: [reason] + * properties: + * reason: + * type: string + * minLength: 10 + * maxLength: 500 + * responses: + * 200: + * description: Deletion request submitted + * 401: + * description: Not authenticated + * 403: + * description: Insufficient permissions + */ +router.post( + '/venue/:venueId/delete-request', + verifyAccessToken, + requirePermission(P.venues.update), + validateParams(validator.analyticsParamsSchema), + validateBody(validator.deleteRequestSchema), + ownerTenantMiddleware, + idempotencyMiddleware(), + controller.requestDeleteVenue +); + +/** + * @openapi + * /owner/bookings/{bookingId}/mark-paid: + * patch: + * tags: [Owner] + * summary: Mark an offline booking as paid + * security: + * - bearerAuth: [] + * parameters: + * - in: path + * name: bookingId + * required: true + * schema: + * type: string + * responses: + * 200: + * description: Booking marked as paid + * 401: + * description: Not authenticated + * 403: + * description: Insufficient permissions + * 404: + * description: Booking not found + */ +router + .route('/bookings/:bookingId/mark-paid') + .patch( + verifyAccessToken, + requirePermission(P.bookings.update), + ownerTenantMiddleware, + controller.markBookingAsPaid + ); + +/** + * @openapi + * /owner/bookings/{bookingId}/cancel-pending: + * patch: + * tags: [Owner] + * summary: Cancel a pending offline booking + * security: + * - bearerAuth: [] + * parameters: + * - in: path + * name: bookingId + * required: true + * schema: + * type: string + * responses: + * 200: + * description: Pending offline booking cancelled + * 401: + * description: Not authenticated + * 403: + * description: Insufficient permissions + * 404: + * description: Booking not found + */ +router + .route('/bookings/:bookingId/cancel-pending') + .patch( + verifyAccessToken, + requirePermission(P.bookings.update), + ownerTenantMiddleware, + controller.cancelPendingOfflineBooking + ); + +export default router; diff --git a/server/src/modules/owner/owner.service.ts b/server/src/modules/owner/owner.service.ts new file mode 100644 index 0000000000..4ae9605504 --- /dev/null +++ b/server/src/modules/owner/owner.service.ts @@ -0,0 +1,254 @@ +import { NotFoundError, ConflictError } from '../../utils/errors'; +import { buildPaginationMeta } from '../../utils/paginationUtils'; +import * as repo from './owner.repository'; +import type { offlineBookingSchema } from './owner.validator'; + +import type { z } from 'zod'; +import { fetchActiveConflicts } from '../booking/booking.repository'; +import { checkOverlap } from '../../utils/timeUtils'; +import * as venueRepo from '../venue/venue.repository'; +import * as venueWorkflow from '../venue/venue.workflow'; +import { requireOwnVenue } from '../venue/venue.ownership'; +import { ReviewIntent } from '../../constants/venue.constants'; +import { VenueModel } from '../venue/venue.model'; +import { BookingModel } from '../booking/models/booking.model'; +import { BookingStatus } from '../../constants/booking.constants'; +import mongoose from 'mongoose'; +import type { IVenue } from '../venue/venue.types'; + +export function getDateThreshold(daysAgo: number): string { + const date = new Date(); + date.setDate(date.getDate() - daysAgo); + return date.toISOString().split('T')[0]; +} + +export async function getVenueAnalyticsService( + venueId: string +): Promise<{ months: Record[] }> { + const months = await repo.getVenueAnalyticsData(venueId); + return { months }; +} + +export async function getVenueBookingsService( + venueId: string, + page: number, + limit: number +): Promise<{ bookings: Record[]; pagination: unknown }> { + const skip = (page - 1) * limit; + + const [bookings, totalCount] = await Promise.all([ + repo.getVenueBookingsPaginated(venueId, skip, limit), + repo.countVenueBookings(venueId), + ]); + + return { + bookings, + pagination: buildPaginationMeta(totalCount, { page, limit, skip, sort: '-date' }), + }; +} + +export async function createOfflineBookingService( + userId: string, + dto: z.infer +): Promise<{ bookingId: string }> { + const venue = await requireOwnVenue(dto.venueId, userId); + if (venue.status === 'Inactive') { + throw new ConflictError('Cannot create offline booking: venue is currently inactive'); + } + + const conflicts = await fetchActiveConflicts(dto.venueId, dto.date); + if (checkOverlap(dto.startTime, dto.endTime, conflicts)) { + throw new ConflictError( + 'This slot overlaps with an existing booking or hold for the selected date.' + ); + } + + const booking = await repo.createOfflineBookingRecord( + dto.venueId, + userId, + dto.date, + dto.startTime, + dto.endTime, + dto.amountPaid, + dto.customerName, + dto.phone + ); + return { bookingId: String(booking._id) }; +} + +export async function blockDatesService(venueId: string, dates: string[]): Promise { + const conflictingBooking = await repo.findConflictingBookingForDates(venueId, dates); + + if (conflictingBooking) { + throw new ConflictError( + `Cannot block date ${conflictingBooking.date} because it has a confirmed booking.` + ); + } + + const dateObjects = dates.map((d) => new Date(`${d}T00:00:00Z`)); + const updatedVenue = await repo.addBlockedDatesToVenue(venueId, dateObjects); + return updatedVenue ? updatedVenue.blockedDates : []; +} + +export async function unblockDatesService(venueId: string, dates: string[]): Promise { + const dateObjects = dates.map((d) => new Date(`${d}T00:00:00Z`)); + const updatedVenue = await repo.removeBlockedDatesFromVenue(venueId, dateObjects); + return updatedVenue ? updatedVenue.blockedDates : []; +} + +export async function getVenueSettingsService(venueId: string): Promise { + const venue = await venueRepo.findVenueById(venueId); + if (!venue) throw new NotFoundError('Venue not found'); + return venue; +} + +export async function requestInactivityService( + venueId: string, + userId: string, + reason?: string +): Promise { + const venue = await requireOwnVenue(venueId, userId); + venueWorkflow.canRequestInactivity(venue); + + const $set: Record = { + 'inactivity.requestedAt': new Date(), + 'pendingReview.intent': ReviewIntent.INACTIVITY_REQUEST, + 'pendingReview.requestedAt': new Date(), + }; + if (reason) $set['pendingReview.details.reason'] = reason; + + const updated = await VenueModel.findByIdAndUpdate(venueId, { $set }, { new: true }).exec(); + if (!updated) throw new NotFoundError('Venue not found'); + return updated; +} + +export async function withdrawInactivityService(venueId: string, userId: string): Promise { + const venue = await requireOwnVenue(venueId, userId); + + if (venue.pendingReview?.intent !== ReviewIntent.INACTIVITY_REQUEST) { + throw new ConflictError('No pending inactivity request to withdraw'); + } + + const updated = await VenueModel.findByIdAndUpdate( + venueId, + { $unset: { pendingReview: '', 'inactivity.requestedAt': '' } }, + { new: true } + ).exec(); + if (!updated) throw new NotFoundError('Venue not found'); + return updated; +} + +export async function blockBookingsService(venueId: string, userId: string): Promise { + await requireOwnVenue(venueId, userId); + + const today = new Date().toISOString().split('T')[0]; + const latestBooking = await BookingModel.findOne({ + venueId: new mongoose.Types.ObjectId(venueId), + status: BookingStatus.CONFIRMED, + date: { $gte: today }, + }) + .sort({ date: -1 }) + .lean() + .exec(); + + let blockedAfterDate: Date; + if (latestBooking) { + const bookingDate = new Date(latestBooking.date + 'T00:00:00Z'); + blockedAfterDate = new Date(bookingDate.getTime() + 24 * 60 * 60 * 1000); + } else { + blockedAfterDate = new Date(today + 'T00:00:00Z'); + } + + const updated = await VenueModel.findByIdAndUpdate( + venueId, + { $set: { temporaryBlockAfterDate: blockedAfterDate } }, + { new: true } + ).exec(); + if (!updated) throw new NotFoundError('Venue not found'); + return updated; +} + +export async function unblockBookingsService(venueId: string, userId: string): Promise { + await requireOwnVenue(venueId, userId); + + const updated = await VenueModel.findByIdAndUpdate( + venueId, + { $unset: { temporaryBlockAfterDate: '' } }, + { new: true } + ).exec(); + if (!updated) throw new NotFoundError('Venue not found'); + return updated; +} + +export async function activateVenueService(venueId: string, userId: string): Promise { + const venue = await requireOwnVenue(venueId, userId); + venueWorkflow.canReactivate(venue); + + const updated = await VenueModel.findByIdAndUpdate( + venueId, + { + $set: { status: 'Approved', 'inactivity.lastInactiveAt': new Date() }, + $unset: { + pendingReview: '', + 'inactivity.requestedAt': '', + 'inactivity.approvedAt': '', + 'inactivity.inactiveAt': '', + 'inactivity.blockedAfterDate': '', + temporaryBlockAfterDate: '', + }, + }, + { new: true } + ).exec(); + if (!updated) throw new NotFoundError('Venue not found'); + return updated; +} + +export async function markBookingAsPaidService(bookingId: string): Promise { + const updated = await repo.markBookingAsPaid(bookingId); + if (!updated) { + throw new NotFoundError('Booking not found or already paid'); + } +} + +export async function cancelPendingOfflineBookingService(bookingId: string): Promise { + const updated = await repo.cancelPendingOfflineBooking(bookingId); + if (!updated) { + throw new NotFoundError('Booking not found or already processed'); + } +} + +export async function requestDeleteVenueService( + venueId: string, + userId: string, + reason: string +): Promise { + const venue = await requireOwnVenue(venueId, userId); + venueWorkflow.canRequestDelete(venue); + + const today = new Date().toISOString().split('T')[0]; + const futureBookingCount = await BookingModel.countDocuments({ + venueId: new mongoose.Types.ObjectId(venueId), + status: BookingStatus.CONFIRMED, + date: { $gte: today }, + }); + + if (futureBookingCount > 0) { + throw new ConflictError('Cannot request deletion: venue has future confirmed bookings'); + } + + const updateObj: Record = { + $set: { + 'pendingReview.intent': ReviewIntent.DELETION_REQUEST, + 'pendingReview.requestedAt': new Date(), + 'pendingReview.details.reason': reason, + }, + }; + + if (venue.pendingReview?.intent === ReviewIntent.INACTIVITY_REQUEST) { + updateObj.$unset = { 'inactivity.requestedAt': '' }; + } + + const updated = await VenueModel.findByIdAndUpdate(venueId, updateObj, { new: true }).exec(); + if (!updated) throw new NotFoundError('Venue not found'); + return updated; +} diff --git a/server/src/modules/owner/owner.validator.ts b/server/src/modules/owner/owner.validator.ts new file mode 100644 index 0000000000..7d8d8a5156 --- /dev/null +++ b/server/src/modules/owner/owner.validator.ts @@ -0,0 +1,69 @@ +import { z } from 'zod'; + +export const analyticsParamsSchema = z.object({ + venueId: z.string().regex(/^[a-f\d]{24}$/i, 'Invalid venue ID'), +}); + +export const blockDatesSchema = z.object({ + dates: z + .array( + z + .string() + .regex(/^\d{4}-\d{2}-\d{2}$/, 'Invalid date format (YYYY-MM-DD)') + .refine((dateStr) => { + const d = new Date(`${dateStr}T00:00:00Z`); + const today = new Date(); + // Use UTC to match the Date object + const todayUtc = new Date( + Date.UTC(today.getFullYear(), today.getMonth(), today.getDate()) + ); + const sixMonths = new Date(todayUtc); + sixMonths.setUTCMonth(sixMonths.getUTCMonth() + 6); + return d >= todayUtc && d <= sixMonths; + }, 'Dates must be from today up to 6 months in the future') + ) + .min(1, 'At least one date is required'), +}); + +export const unblockDatesSchema = z.object({ + dates: z + .array(z.string().regex(/^\d{4}-\d{2}-\d{2}$/, 'Invalid date format (YYYY-MM-DD)')) + .min(1, 'At least one date is required'), +}); + +export const offlineBookingSchema = z + .object({ + venueId: z.string().regex(/^[a-f\d]{24}$/i, 'Invalid venue ID'), + customerName: z.string().trim().min(2, 'Customer name is required'), + phone: z.string().trim().min(10, 'Valid phone number required'), + date: z.string().regex(/^\d{4}-\d{2}-\d{2}$/, 'Date must be YYYY-MM-DD'), + startTime: z.number().int().min(0).max(1439, 'startTime must be minutes from midnight'), + endTime: z.number().int().min(1).max(1440, 'endTime must be minutes from midnight'), + amountPaid: z.number().positive('Amount must be positive'), + }) + .refine((data) => data.endTime > data.startTime, { + message: 'endTime must be after startTime', + path: ['endTime'], + }); + +export const reviewParamsSchema = z.object({ + venueId: z.string().regex(/^[a-f\d]{24}$/i, 'Invalid venue ID'), + reviewId: z.string().regex(/^[a-f\d]{24}$/i, 'Invalid review ID'), +}); + +export const ownerReplySchema = z.object({ + text: z.string().trim().min(1, 'Reply cannot be empty').max(500, 'Reply too long'), +}); + +export const reportReviewSchema = z.object({ + action: z.enum(['hide', 'flag']), + reason: z.string().trim().min(10, 'Reason must be at least 10 characters').max(500), +}); + +export const inactivityRequestSchema = z.object({ + reason: z.string().trim().min(10).max(500).optional(), +}); + +export const deleteRequestSchema = z.object({ + reason: z.string().trim().min(10).max(500), +}); diff --git a/server/src/modules/owner/owner.workflow.ts b/server/src/modules/owner/owner.workflow.ts new file mode 100644 index 0000000000..ef12eb5395 --- /dev/null +++ b/server/src/modules/owner/owner.workflow.ts @@ -0,0 +1,39 @@ +import * as repo from './owner.repository'; +import * as service from './owner.service'; +import type { IBooking } from '../booking/booking.types'; + +export async function getVenueAvailabilityCalendarWorkflow(venueId: string): Promise<{ + bookedDates: string[]; + blockedDates: string[]; + workingDays: unknown; + temporaryBlockAfterDate: string | null; + inactivityBlockedAfterDate: string | null; +} | null> { + const venue = await repo.getVenueBlockedDatesAndWorkingDays(venueId); + if (!venue) { + return null; + } + + const dateThreshold = service.getDateThreshold(30); + + const bookings = await repo.getConfirmedBookingsAfterDate(venueId, dateThreshold); + + const bookedDates = [...new Set(bookings.map((b: IBooking) => b.date))]; + + // Blocked dates - YYYY-MM-DD strings + const blockedDates = venue.blockedDates.map((d: Date) => new Date(d).toISOString().split('T')[0]); + + const toDateStr = (d: Date | undefined | null): string | null => { + if (!d) return null; + const date = new Date(d); + return date.toISOString().split('T')[0]; + }; + + return { + bookedDates, + blockedDates, + workingDays: venue.workingDays, + temporaryBlockAfterDate: toDateStr(venue.temporaryBlockAfterDate), + inactivityBlockedAfterDate: toDateStr(venue.inactivity?.blockedAfterDate), + }; +} diff --git a/server/src/modules/rbac/rbac.controller.ts b/server/src/modules/rbac/rbac.controller.ts new file mode 100644 index 0000000000..1641566ca5 --- /dev/null +++ b/server/src/modules/rbac/rbac.controller.ts @@ -0,0 +1,24 @@ +import type { Request, Response } from 'express'; +import { ResponseUtil } from '../../utils/responseUtils'; +import * as service from './rbac.service'; + +export const rbacController = { + getCacheStats: (_req: Request, res: Response): void => { + const stats = service.getCacheStats(); + ResponseUtil.success(res, 'Cache stats retrieved', { + totalRoles: stats.size, + totalPermissions: stats.entries.reduce((sum, entry) => sum + entry.permissionCount, 0), + roles: stats.entries, + }); + }, + + clearCache: (_req: Request, res: Response): void => { + service.clearCache(); + ResponseUtil.success(res, 'Permission cache cleared'); + }, + + invalidateRoleCache: (req: Request, res: Response): void => { + service.invalidateRoleCache(String(req.params.roleId)); + ResponseUtil.success(res, `Cache invalidated for role ${String(req.params.roleId)}`); + }, +}; diff --git a/server/src/modules/rbac/rbac.router.ts b/server/src/modules/rbac/rbac.router.ts new file mode 100644 index 0000000000..8e21443b6c --- /dev/null +++ b/server/src/modules/rbac/rbac.router.ts @@ -0,0 +1,87 @@ +import { Router } from 'express'; +import { verifyAccessToken } from '../../middlewares/auth.middleware'; +import { requireSuperAdmin } from '../../middlewares/rbac.middleware'; +import { rbacController } from './rbac.controller'; + +const router: Router = Router(); + +/** + * @openapi + * /rbac/cache: + * get: + * tags: [RBAC] + * summary: Get permission cache statistics (super-admin only) + * security: + * - bearerAuth: [] + * responses: + * 200: + * description: Cache stats — hit rate, size, entries + * content: + * application/json: + * schema: + * allOf: + * - $ref: '#/components/schemas/SuccessResponse' + * - type: object + * properties: + * data: + * type: object + * properties: + * size: + * type: integer + * entries: + * type: array + * items: + * type: string + * 401: + * description: Not authenticated + * 403: + * description: Super-admin role required + * delete: + * tags: [RBAC] + * summary: Clear the entire permission cache (super-admin only) + * security: + * - bearerAuth: [] + * responses: + * 200: + * description: Permission cache cleared + * 401: + * description: Not authenticated + * 403: + * description: Super-admin role required + */ +router + .route('/cache') + .get(verifyAccessToken, requireSuperAdmin, rbacController.getCacheStats) + .delete(verifyAccessToken, requireSuperAdmin, rbacController.clearCache); + +/** + * @openapi + * /rbac/cache/{roleId}: + * delete: + * tags: [RBAC] + * summary: Invalidate the permission cache for a specific role (super-admin only) + * security: + * - bearerAuth: [] + * parameters: + * - in: path + * name: roleId + * required: true + * description: MongoDB ObjectId of the role whose cache entry should be cleared + * schema: + * type: string + * example: 64b1f2c3d4e5f6a7b8c9d0e3 + * responses: + * 200: + * description: Cache entry invalidated for the role + * 401: + * description: Not authenticated + * 403: + * description: Super-admin role required + * 404: + * description: Role not found in cache + */ +router + .route('/cache/:roleId') + .delete(verifyAccessToken, requireSuperAdmin, rbacController.invalidateRoleCache); + +export { router as rbacRouter }; diff --git a/server/src/modules/rbac/rbac.service.ts b/server/src/modules/rbac/rbac.service.ts new file mode 100644 index 0000000000..59d8249b87 --- /dev/null +++ b/server/src/modules/rbac/rbac.service.ts @@ -0,0 +1,14 @@ +import { getStats, clearAll, invalidateRole } from '../../services/cache/permission-cache.service'; +import type { CacheStatEntry } from '../../services/cache/permission-cache.service'; + +export function getCacheStats(): { size: number; entries: CacheStatEntry[] } { + return getStats(); +} + +export function clearCache(): void { + clearAll(); +} + +export function invalidateRoleCache(roleId: string): void { + invalidateRole(roleId); +} diff --git a/server/src/modules/review/review.controller.ts b/server/src/modules/review/review.controller.ts new file mode 100644 index 0000000000..7e9d9c488d --- /dev/null +++ b/server/src/modules/review/review.controller.ts @@ -0,0 +1,197 @@ +import type { Request, Response } from 'express'; +import { ResponseUtil } from '../../utils/responseUtils'; +import * as service from './review.service'; +import { handleError } from '../../utils/errors'; +import type { UpdateReviewDTO, ModerateReviewDTO } from './review.types'; + +export const submitReview = async (req: Request, res: Response): Promise => { + try { + const userId = req.user?.userId; + if (!userId) { + ResponseUtil.unauthorized(res, 'Unauthorized'); + return; + } + + const venueId = Array.isArray(req.params.venueId) ? req.params.venueId[0] : req.params.venueId; + const { rating, comment } = req.body as { rating?: number; comment?: string }; + + const review = await service.submitReview(userId, venueId, { rating, comment }); + ResponseUtil.created(res, 'Review submitted successfully', review); + } catch (err) { + handleError(res, err, 'submitReview'); + } +}; + +export const upsertRating = async (req: Request, res: Response): Promise => { + try { + const userId = req.user?.userId; + if (!userId) { + ResponseUtil.unauthorized(res, 'Unauthorized'); + return; + } + + const venueId = Array.isArray(req.params.venueId) ? req.params.venueId[0] : req.params.venueId; + const { rating } = req.body as { rating: number }; + + const review = await service.upsertRating(userId, venueId, rating); + ResponseUtil.success(res, 'Rating updated successfully', review); + } catch (err) { + handleError(res, err, 'upsertRating'); + } +}; + +export const getMyRating = async (req: Request, res: Response): Promise => { + try { + const userId = req.user?.userId; + if (!userId) { + ResponseUtil.unauthorized(res, 'Unauthorized'); + return; + } + + const venueId = Array.isArray(req.params.venueId) ? req.params.venueId[0] : req.params.venueId; + const rating = await service.getMyRating(userId, venueId); + ResponseUtil.success(res, 'Rating retrieved successfully', { rating }); + } catch (err) { + handleError(res, err, 'getMyRating'); + } +}; + +export const updateReview = async (req: Request, res: Response): Promise => { + try { + const user = req.user; + if (!user?.userId) { + ResponseUtil.unauthorized(res, 'Unauthorized'); + return; + } + + const id = Array.isArray(req.params.id) ? req.params.id[0] : req.params.id; + const dto = req.body as UpdateReviewDTO; + const userId = user.userId; + const requesterRole = user.role.name; + const review = await service.updateReview(userId, id, dto, requesterRole); + ResponseUtil.success(res, 'Review updated successfully', review); + } catch (err) { + handleError(res, err, 'updateReview'); + } +}; + +export const deleteReview = async (req: Request, res: Response): Promise => { + try { + const user = req.user; + if (!user?.userId) { + ResponseUtil.unauthorized(res, 'Unauthorized'); + return; + } + + const id = Array.isArray(req.params.id) ? req.params.id[0] : req.params.id; + const userId = user.userId; + const requesterRole = user.role.name; + await service.deleteReview(userId, id, requesterRole); + ResponseUtil.success(res, 'Review deleted successfully'); + } catch (err) { + handleError(res, err, 'deleteReview'); + } +}; + +export const getVenueReviews = async (req: Request, res: Response): Promise => { + try { + const venueId = Array.isArray(req.params.venueId) ? req.params.venueId[0] : req.params.venueId; + const paginationParams = req.pagination ?? { page: 1, limit: 10, skip: 0, sort: '' }; + const result = await service.getVenueReviews(venueId, paginationParams); + ResponseUtil.paginated( + res, + 'Reviews retrieved successfully', + result.reviews, + result.pagination, + 'reviews' + ); + } catch (err) { + handleError(res, err, 'getVenueReviews'); + } +}; + +export const getFlaggedReviews = async (req: Request, res: Response): Promise => { + try { + const paginationParams = req.pagination ?? { page: 1, limit: 20, skip: 0, sort: '' }; + const result = await service.getFlaggedReviews(paginationParams); + ResponseUtil.paginated( + res, + 'Flagged reviews retrieved successfully', + result.reviews, + result.pagination, + 'reviews' + ); + } catch (err) { + handleError(res, err, 'getFlaggedReviews'); + } +}; + +export const moderateReview = async (req: Request, res: Response): Promise => { + try { + const adminId = req.user?.userId; + if (!adminId) { + ResponseUtil.unauthorized(res, 'Unauthorized'); + return; + } + + const id = Array.isArray(req.params.id) ? req.params.id[0] : req.params.id; + const dto = req.body as ModerateReviewDTO; + const review = await service.moderateReview(id, dto, adminId); + ResponseUtil.success(res, 'Review moderated successfully', review); + } catch (err) { + handleError(res, err, 'moderateReview'); + } +}; + +export const getOwnerVenueReviews = async (req: Request, res: Response): Promise => { + try { + const venueId = Array.isArray(req.params.venueId) ? req.params.venueId[0] : req.params.venueId; + const { page, limit, skip } = req.pagination ?? { page: 1, limit: 10, skip: 0, sort: '' }; + + const result = await service.getOwnerVenueReviews(venueId, { page, limit, skip, sort: '' }); + ResponseUtil.paginated( + res, + 'Venue reviews retrieved', + result.reviews, + result.pagination, + 'reviews' + ); + } catch (err) { + handleError(res, err, 'getOwnerVenueReviews'); + } +}; + +export const replyToReview = async (req: Request, res: Response): Promise => { + try { + const venueId = Array.isArray(req.params.venueId) ? req.params.venueId[0] : req.params.venueId; + const reviewId = Array.isArray(req.params.reviewId) + ? req.params.reviewId[0] + : req.params.reviewId; + const { text } = req.body as { text: string }; + + const review = await service.replyToReview(venueId, reviewId, text); + ResponseUtil.success(res, 'Reply added successfully', review); + } catch (err) { + handleError(res, err, 'replyToReview'); + } +}; + +export const reportReview = async (req: Request, res: Response): Promise => { + try { + const userId = req.user?.userId; + if (!userId) { + ResponseUtil.unauthorized(res, 'Unauthorized'); + return; + } + + const reviewId = Array.isArray(req.params.reviewId) + ? req.params.reviewId[0] + : req.params.reviewId; + const { reason } = req.body as { reason: string }; + + const review = await service.flagReview(reviewId, reason); + ResponseUtil.success(res, 'Review flagged successfully', review); + } catch (err) { + handleError(res, err, 'reportReview'); + } +}; diff --git a/server/src/modules/review/review.model.ts b/server/src/modules/review/review.model.ts new file mode 100644 index 0000000000..524c5b7173 --- /dev/null +++ b/server/src/modules/review/review.model.ts @@ -0,0 +1,117 @@ +import mongoose, { Schema } from 'mongoose'; +import type { Document } from 'mongoose'; + +export interface IReview extends Document { + venueId: mongoose.Types.ObjectId; + userId: mongoose.Types.ObjectId; + bookingId?: mongoose.Types.ObjectId | null; + rating?: number; // 1-5, optional (upserted doc may have no comment) + comment?: string; // optional (rating-only doc may have no comment) + status: 'visible' | 'flagged' | 'removed'; + moderationReason?: string; + moderatedBy?: mongoose.Types.ObjectId; + moderatedAt?: Date; + editedAt?: Date; + ownerReply?: { text: string; repliedAt: Date }; + hideRequestedBy?: mongoose.Types.ObjectId; + hideRequestReason?: string; + hideRequestedAt?: Date; + hideRequestStatus: 'none' | 'pending' | 'approved' | 'rejected'; + createdAt: Date; + updatedAt: Date; +} + +const ReviewSchema = new Schema( + { + venueId: { + type: Schema.Types.ObjectId, + ref: 'Venues', + required: true, + index: true, + }, + userId: { + type: Schema.Types.ObjectId, + ref: 'Users', + required: true, + index: true, + }, + bookingId: { + type: Schema.Types.ObjectId, + ref: 'Bookings', + default: null, + }, + rating: { + type: Number, + min: 1, + max: 5, + }, + comment: { + type: String, + maxlength: 1000, + trim: true, + }, + status: { + type: String, + enum: ['visible', 'flagged', 'removed'], + default: 'visible', + index: true, + }, + moderationReason: { + type: String, + maxlength: 500, + }, + moderatedBy: { + type: Schema.Types.ObjectId, + ref: 'Users', + }, + moderatedAt: { + type: Date, + }, + editedAt: { + type: Date, + }, + ownerReply: { + text: { type: String, maxlength: 500, trim: true }, + repliedAt: { type: Date }, + }, + hideRequestedBy: { + type: Schema.Types.ObjectId, + ref: 'Users', + }, + hideRequestReason: { + type: String, + maxlength: 500, + }, + hideRequestedAt: { + type: Date, + }, + hideRequestStatus: { + type: String, + enum: ['none', 'pending', 'approved', 'rejected'], + default: 'none', + index: true, + }, + }, + { timestamps: true } +); + +// Index for venue reviews listing (public view filters to visible) +ReviewSchema.index({ venueId: 1, status: 1, createdAt: -1 }, { name: 'idx_venue_status_recency' }); + +// Partial unique index: only one rating per (userId, venueId) +ReviewSchema.index( + { userId: 1, venueId: 1 }, + { + unique: true, + partialFilterExpression: { rating: { $exists: true } }, + name: 'idx_user_venue_rating', + } +); + +// Index for admin hide-request moderation queue +ReviewSchema.index( + { hideRequestStatus: 1, hideRequestedAt: -1 }, + { name: 'idx_hide_request_queue' } +); + +export const ReviewModel = mongoose.model('Reviews', ReviewSchema, 'Reviews'); diff --git a/server/src/modules/review/review.ownership.ts b/server/src/modules/review/review.ownership.ts new file mode 100644 index 0000000000..e41c7a0140 --- /dev/null +++ b/server/src/modules/review/review.ownership.ts @@ -0,0 +1,41 @@ +import { ReviewModel } from './review.model'; +import { ForbiddenError, NotFoundError } from '../../utils/errors'; +import mongoose from 'mongoose'; + +const toObjectId = (id: string): mongoose.Types.ObjectId => { + return new mongoose.Types.ObjectId(id); +}; + +export async function assertReviewOwner(reviewId: string, userId: string): Promise { + const review = await ReviewModel.findById(toObjectId(reviewId)).exec(); + if (!review) { + throw new NotFoundError('Review not found'); + } + if (review.userId.toString() !== userId) { + throw new ForbiddenError('You do not have permission to modify this review'); + } +} + +export async function isReviewEditableByOwner(reviewId: string, userId: string): Promise { + const review = await ReviewModel.findById(toObjectId(reviewId)).exec(); + if (!review) { + return false; + } + + if (review.userId.toString() !== userId) { + return false; + } + + // Check 30-day edit window from creation + const createdAt = review.createdAt; + const thirtyDaysInMs = 30 * 24 * 60 * 60 * 1000; + const now = Date.now(); + + return now - createdAt.getTime() <= thirtyDaysInMs; +} + +export function requireOwnReview(userId: string): (reviewId: string) => Promise { + return async (reviewId: string) => { + await assertReviewOwner(reviewId, userId); + }; +} diff --git a/server/src/modules/review/review.repository.ts b/server/src/modules/review/review.repository.ts new file mode 100644 index 0000000000..912a3e81e8 --- /dev/null +++ b/server/src/modules/review/review.repository.ts @@ -0,0 +1,341 @@ +import type { PaginationParams, PaginatedResponse } from '../../types/pagination.types'; +import { buildPaginationMeta } from '../../utils/paginationUtils'; +import { ReviewModel, type IReview } from './review.model'; +import type { UpdateReviewDTO, ModerateReviewDTO } from './review.types'; +import mongoose from 'mongoose'; + +const toObjectId = (id: string): mongoose.Types.ObjectId => { + return new mongoose.Types.ObjectId(id); +}; + +export async function upsertRating( + userId: string, + venueId: string, + rating: number +): Promise { + const review = await ReviewModel.findOneAndUpdate( + { userId: toObjectId(userId), venueId: toObjectId(venueId), rating: { $exists: true } }, + { rating, editedAt: new Date() }, + { upsert: true, new: true, setDefaultsOnInsert: true, runValidators: true } + ).exec(); + return review; +} + +export async function createComment( + userId: string, + venueId: string, + comment: string +): Promise { + const review = new ReviewModel({ + userId: toObjectId(userId), + venueId: toObjectId(venueId), + comment, + status: 'visible', + }); + return review.save(); +} + +export async function findRatingsForUsers( + venueId: string, + userIds: string[] +): Promise> { + if (userIds.length === 0) { + return new Map(); + } + + const validUserIds = userIds.filter((id) => { + try { + toObjectId(id); + return true; + } catch { + return false; + } + }); + + if (validUserIds.length === 0) { + return new Map(); + } + + const ratings = await ReviewModel.find({ + venueId: toObjectId(venueId), + userId: { $in: validUserIds.map(toObjectId) }, + rating: { $exists: true }, + status: 'visible', + }) + .select('userId rating') + .exec(); + + const map = new Map(); + ratings.forEach((r) => { + if (r.rating) map.set(r.userId.toString(), r.rating); + }); + return map; +} + +export async function updateReview( + reviewId: string, + dto: UpdateReviewDTO +): Promise { + const updates: Record = { editedAt: new Date() }; + if (dto.rating !== undefined) updates.rating = dto.rating; + if (dto.comment !== undefined) updates.comment = dto.comment; + + return ReviewModel.findByIdAndUpdate(toObjectId(reviewId), updates, { + new: true, + runValidators: true, + }).exec(); +} + +export async function deleteReview(reviewId: string): Promise { + await ReviewModel.deleteOne({ _id: toObjectId(reviewId) }).exec(); +} + +export async function findVenueReviews( + venueId: string, + paginationParams: PaginationParams +): Promise> { + const { limit, skip } = paginationParams; + + const [reviews, total] = await Promise.all([ + ReviewModel.find({ + venueId: toObjectId(venueId), + status: 'visible', + comment: { $exists: true, $ne: '' }, + }) + .sort({ createdAt: -1 }) + .skip(skip) + .limit(limit) + .populate('userId', 'username') + .exec(), + + ReviewModel.countDocuments({ + venueId: toObjectId(venueId), + status: 'visible', + comment: { $exists: true, $ne: '' }, + }).exec(), + ]); + + return { + reviews, + pagination: buildPaginationMeta(total, paginationParams), + }; +} + +export async function getVenueRatingAggregate( + venueId: string +): Promise<{ avgRating: number; reviewCount: number }> { + const result = await ReviewModel.aggregate([ + { + $match: { + venueId: toObjectId(venueId), + status: 'visible', + rating: { $exists: true }, + }, + }, + { + $group: { + _id: null, + avgRating: { $avg: '$rating' }, + reviewCount: { $sum: 1 }, + }, + }, + ]).exec(); + + if (!result.length) { + return { avgRating: 0, reviewCount: 0 }; + } + + const agg = result[0] as { avgRating: number; reviewCount: number }; + return { + avgRating: Math.round(agg.avgRating * 10) / 10, + reviewCount: agg.reviewCount, + }; +} + +export async function findReviewById(reviewId: string): Promise { + return ReviewModel.findById(toObjectId(reviewId)).exec(); +} + +export async function moderateReview( + reviewId: string, + dto: ModerateReviewDTO, + moderatorId: string +): Promise { + const updates: Record = { + moderatedBy: toObjectId(moderatorId), + moderatedAt: new Date(), + }; + + if (dto.action === 'flag') { + updates.status = 'flagged'; + updates.moderationReason = dto.reason; + } else if (dto.action === 'remove') { + updates.status = 'removed'; + updates.moderationReason = dto.reason; + } else if (dto.action === 'restore') { + updates.status = 'visible'; + updates.moderationReason = null; + } + + return ReviewModel.findByIdAndUpdate(toObjectId(reviewId), updates, { new: true }).exec(); +} + +export async function findFlaggedReviews( + paginationParams: PaginationParams +): Promise> { + const { limit, skip } = paginationParams; + + const [reviews, total] = await Promise.all([ + ReviewModel.find({ + $or: [{ status: 'flagged' }, { status: 'removed' }], + }) + .sort({ moderatedAt: -1, createdAt: -1 }) + .skip(skip) + .limit(limit) + .populate('userId', 'username') + .populate('venueId', 'name') + .exec(), + + ReviewModel.countDocuments({ + $or: [{ status: 'flagged' }, { status: 'removed' }], + }).exec(), + ]); + + return { + reviews, + pagination: buildPaginationMeta(total, paginationParams), + }; +} + +export async function findUserReviewedBookings(userId: string): Promise> { + const reviews = await ReviewModel.find({ + userId: toObjectId(userId), + bookingId: { $exists: true }, + }) + .select('bookingId') + .lean() + .exec(); + + const bookingIds = reviews + .map((r) => { + if (r.bookingId) return r.bookingId.toString(); + return null; + }) + .filter((id): id is string => id !== null); + return new Set(bookingIds); +} + +export async function findVenueReviewsForOwner( + venueId: string, + paginationParams: PaginationParams +): Promise> { + const { limit, skip } = paginationParams; + + const [reviews, total] = await Promise.all([ + ReviewModel.find({ venueId: toObjectId(venueId) }) + .sort({ createdAt: -1 }) + .skip(skip) + .limit(limit) + .populate('userId', 'username email') + .exec(), + + ReviewModel.countDocuments({ venueId: toObjectId(venueId) }).exec(), + ]); + + return { + reviews, + pagination: buildPaginationMeta(total, paginationParams), + }; +} + +export async function addOwnerReply( + reviewId: string, + venueId: string, + text: string +): Promise { + return ReviewModel.findOneAndUpdate( + { _id: toObjectId(reviewId), venueId: toObjectId(venueId) }, + { + ownerReply: { + text, + repliedAt: new Date(), + }, + }, + { new: true } + ).exec(); +} + +export async function requestHideReview( + reviewId: string, + venueId: string, + ownerId: string, + reason: string +): Promise { + return ReviewModel.findOneAndUpdate( + { _id: toObjectId(reviewId), venueId: toObjectId(venueId) }, + { + hideRequestedBy: toObjectId(ownerId), + hideRequestReason: reason, + hideRequestedAt: new Date(), + hideRequestStatus: 'pending', + }, + { new: true } + ).exec(); +} + +export async function flagReview(reviewId: string, reason: string): Promise { + return ReviewModel.findByIdAndUpdate( + toObjectId(reviewId), + { + status: 'flagged', + moderationReason: reason, + }, + { new: true } + ).exec(); +} + +export async function findPendingHideRequests( + paginationParams: PaginationParams +): Promise> { + const { limit, skip } = paginationParams; + + const [reviews, total] = await Promise.all([ + ReviewModel.find({ hideRequestStatus: 'pending' }) + .sort({ hideRequestedAt: -1 }) + .skip(skip) + .limit(limit) + .populate('userId', 'username email') + .populate({ + path: 'venueId', + select: 'name ownerUserId', + populate: { path: 'ownerUserId', select: 'username email' }, + }) + .exec(), + + ReviewModel.countDocuments({ hideRequestStatus: 'pending' }).exec(), + ]); + + return { + reviews, + pagination: buildPaginationMeta(total, paginationParams), + }; +} + +export async function resolveHideRequest( + reviewId: string, + action: 'approve' | 'reject', + adminId: string +): Promise { + const updates: Record = {}; + + if (action === 'approve') { + updates.status = 'removed'; + updates.hideRequestStatus = 'approved'; + updates.moderatedBy = toObjectId(adminId); + updates.moderatedAt = new Date(); + } else { + updates.hideRequestStatus = 'rejected'; + } + + return ReviewModel.findByIdAndUpdate(toObjectId(reviewId), updates, { new: true }).exec(); +} diff --git a/server/src/modules/review/review.router.ts b/server/src/modules/review/review.router.ts new file mode 100644 index 0000000000..ca5f239909 --- /dev/null +++ b/server/src/modules/review/review.router.ts @@ -0,0 +1,207 @@ +import { Router } from 'express'; +import { verifyAccessToken } from '../../middlewares/auth.middleware'; +import { requireRole, requirePermission } from '../../middlewares/rbac.middleware'; +import { PERMISSIONS as P } from '../../constants/permissions'; +import { paginationMiddleware } from '../../middlewares/pagination.middleware'; +import * as controller from './review.controller'; + +const router: Router = Router(); + +/** + * @openapi + * /reviews/venue/{venueId}: + * get: + * tags: [Reviews] + * summary: Get reviews for a venue (public) + * parameters: + * - in: path + * name: venueId + * required: true + * schema: + * type: string + * - in: query + * name: page + * schema: + * type: integer + * - in: query + * name: limit + * schema: + * type: integer + * responses: + * 200: + * description: Reviews for the venue + * post: + * tags: [Reviews] + * summary: Submit a rating and/or comment for a venue + * security: + * - bearerAuth: [] + * requestBody: + * required: true + * content: + * application/json: + * schema: + * type: object + * properties: + * rating: + * type: number + * comment: + * type: string + * responses: + * 201: + * description: Review submitted successfully + * 401: + * description: Not authenticated + */ +router + .route('/venue/:venueId') + .get(paginationMiddleware(), controller.getVenueReviews) + .post(verifyAccessToken, requirePermission(P.reviews.create), controller.submitReview); + +/** + * @openapi + * /reviews/venue/{venueId}/my-rating: + * get: + * tags: [Reviews] + * summary: Get my rating for a venue + * security: + * - bearerAuth: [] + * parameters: + * - in: path + * name: venueId + * required: true + * schema: + * type: string + * responses: + * 200: + * description: My rating + */ +router.route('/venue/:venueId/my-rating').get(verifyAccessToken, controller.getMyRating); + +/** + * @openapi + * /reviews/{id}: + * patch: + * tags: [Reviews] + * summary: Update a review (owner only) + * security: + * - bearerAuth: [] + * parameters: + * - in: path + * name: id + * required: true + * schema: + * type: string + * requestBody: + * content: + * application/json: + * schema: + * type: object + * properties: + * rating: + * type: number + * comment: + * type: string + * responses: + * 200: + * description: Review updated successfully + * 401: + * description: Not authenticated + * 404: + * description: Review not found + * delete: + * tags: [Reviews] + * summary: Delete a review (owner only) + * security: + * - bearerAuth: [] + * parameters: + * - in: path + * name: id + * required: true + * schema: + * type: string + * responses: + * 200: + * description: Review deleted successfully + * 401: + * description: Not authenticated + * 404: + * description: Review not found + */ +router + .route('/:id') + .patch(verifyAccessToken, requirePermission(P.reviews.update), controller.updateReview) + .delete(verifyAccessToken, requirePermission(P.reviews.delete), controller.deleteReview); + +/** + * @openapi + * /reviews/moderation/flagged: + * get: + * tags: [Reviews] + * summary: Get flagged/removed reviews (admin only) + * security: + * - bearerAuth: [] + * parameters: + * - in: query + * name: page + * schema: + * type: integer + * - in: query + * name: limit + * schema: + * type: integer + * responses: + * 200: + * description: Flagged reviews + * 401: + * description: Not authenticated + * 403: + * description: Insufficient permissions + */ +router + .route('/moderation/flagged') + .get( + verifyAccessToken, + requireRole('admin'), + paginationMiddleware(), + controller.getFlaggedReviews + ); + +/** + * @openapi + * /reviews/{id}/moderate: + * patch: + * tags: [Reviews] + * summary: Moderate a review (admin only) + * security: + * - bearerAuth: [] + * parameters: + * - in: path + * name: id + * required: true + * schema: + * type: string + * requestBody: + * required: true + * content: + * application/json: + * schema: + * type: object + * properties: + * action: + * type: string + * enum: [flag, remove, restore] + * reason: + * type: string + * responses: + * 200: + * description: Review moderated successfully + * 401: + * description: Not authenticated + * 403: + * description: Insufficient permissions + */ +router + .route('/:id/moderate') + .patch(verifyAccessToken, requireRole('admin'), controller.moderateReview); + +export { router as reviewRouter }; diff --git a/server/src/modules/review/review.service.ts b/server/src/modules/review/review.service.ts new file mode 100644 index 0000000000..9ff946c666 --- /dev/null +++ b/server/src/modules/review/review.service.ts @@ -0,0 +1,406 @@ +import * as repo from './review.repository'; +import * as bookingRepo from '../booking/booking.repository'; +import { isReviewEditableByOwner } from './review.ownership'; +import type { UpdateReviewDTO, ModerateReviewDTO } from './review.types'; +import type { IReview as IReviewModel } from './review.model'; +import type { PaginationParams, PaginatedResponse } from '../../types/pagination.types'; +import { VenueModel } from '../venue/venue.model'; +import { ConflictError, NotFoundError, ValidationError } from '../../utils/errors'; +import { logError, logWarn } from '../../utils/logger'; +import { enqueueEmailTask } from '../../services/email.repository'; +import { EmailIntent, EmailTaskStatus } from '../../constants/email.constants'; + +export async function submitReview( + userId: string, + venueId: string, + dto: { rating?: number; comment?: string } +): Promise { + if (!dto.rating && !dto.comment) { + throw new ValidationError('Must provide either a rating or a comment'); + } + + if (dto.comment?.trim()) { + const { isBannedForScope } = await import('../moderation/bannedUser.service.js'); + const isBanned = await isBannedForScope(userId, 'commenting', venueId); + if (isBanned) { + throw new ConflictError('You are currently banned from commenting.'); + } + } + + if (dto.rating && (!Number.isInteger(dto.rating) || dto.rating < 1 || dto.rating > 5)) { + throw new ValidationError('Rating must be an integer between 1 and 5'); + } + + let review: IReviewModel | null = null; + + if (dto.rating) { + review = await repo.upsertRating(userId, venueId, dto.rating); + } + + if (dto.comment?.trim()) { + const commentReview = await repo.createComment(userId, venueId, dto.comment.trim()); + review ??= commentReview; + } + + if (!review) { + throw new ValidationError('Failed to create review'); + } + + if (dto.rating) { + await recomputeVenueRating(venueId); + } + + return review; +} + +export async function upsertRating( + userId: string, + venueId: string, + rating: number +): Promise { + if (!Number.isInteger(rating) || rating < 1 || rating > 5) { + throw new ValidationError('Rating must be an integer between 1 and 5'); + } + const review = await repo.upsertRating(userId, venueId, rating); + await recomputeVenueRating(venueId); + return review; +} + +export async function addComment( + userId: string, + venueId: string, + comment: string +): Promise { + if (!comment.trim()) { + throw new ValidationError('Comment cannot be empty'); + } + + const { isBannedForScope } = await import('../moderation/bannedUser.service.js'); + const isBanned = await isBannedForScope(userId, 'commenting', venueId); + if (isBanned) { + throw new ConflictError('You are currently banned from commenting.'); + } + + return repo.createComment(userId, venueId, comment.trim()); +} + +export async function getMyRating(userId: string, venueId: string): Promise { + const ratings = await repo.findRatingsForUsers(venueId, [userId]); + return ratings.get(userId) ?? null; +} + +export async function updateReview( + userId: string, + reviewId: string, + dto: UpdateReviewDTO, + requesterRole?: string +): Promise { + const review = await repo.findReviewById(reviewId); + if (!review) { + throw new NotFoundError('Review not found'); + } + + const isAdmin = requesterRole === 'admin' || requesterRole === 'superAdmin'; + const isOwner = review.userId.toString() === userId; + + if (!isOwner && !isAdmin) { + throw new NotFoundError('Review not found'); + } + + if (!isAdmin) { + const isEditable = await isReviewEditableByOwner(reviewId, userId); + if (!isEditable) { + throw new ValidationError('Review can only be edited within 30 days of creation'); + } + + if (dto.comment?.trim()) { + const { isBannedForScope } = await import('../moderation/bannedUser.service.js'); + const isBanned = await isBannedForScope(userId, 'commenting', review.venueId.toString()); + if (isBanned) { + throw new ConflictError('You are currently banned from commenting.'); + } + } + } + + const updated = await repo.updateReview(reviewId, dto); + if (!updated) { + throw new NotFoundError('Review not found'); + } + + if (dto.rating !== undefined) { + await recomputeVenueRating(updated.venueId.toString()); + } + + return updated; +} + +export async function deleteReview( + userId: string, + reviewId: string, + requesterRole?: string +): Promise { + const review = await repo.findReviewById(reviewId); + if (!review) { + throw new NotFoundError('Review not found'); + } + + const isAdmin = requesterRole === 'admin' || requesterRole === 'superAdmin'; + const isOwner = review.userId.toString() === userId; + + if (!isOwner && !isAdmin) { + throw new NotFoundError('Review not found'); + } + + if (!isAdmin) { + const isEditable = await isReviewEditableByOwner(reviewId, userId); + if (!isEditable) { + throw new ValidationError('Review can only be deleted within 30 days of creation'); + } + } + + const venueId = review.venueId.toString(); + await repo.deleteReview(reviewId); + + if (review.rating) { + await recomputeVenueRating(venueId); + } +} + +// review.userId is populated with 'username' by repo.findVenueReviews, so it's +// a user sub-document (with _id), not a raw ObjectId — extract the real id. +function extractUserId(userId: unknown): string { + if (userId && typeof userId === 'object' && '_id' in userId) { + return (userId as { _id: { toString(): string } })._id.toString(); + } + return (userId as { toString(): string }).toString(); +} + +export async function getVenueReviews( + venueId: string, + paginationParams: PaginationParams +): Promise> { + const result = await repo.findVenueReviews(venueId, paginationParams); + + // Batch-fetch verified status and reviewer ratings + const userIds = result.reviews.map((r) => extractUserId(r.userId)); + const [verifiedUserIds, reviewerRatings] = await Promise.all([ + bookingRepo.findVerifiedUserIds(venueId, userIds), + repo.findRatingsForUsers(venueId, userIds), + ]); + + // Enrich each review with verified status and reviewer's rating + const enrichedReviews = result.reviews.map((review): IReviewModel => { + const uid = extractUserId(review.userId); + return { + ...review.toObject(), + isVerified: verifiedUserIds.has(uid), + reviewerRating: reviewerRatings.get(uid), + } as IReviewModel; + }); + + return { + ...result, + reviews: enrichedReviews, + }; +} + +export async function getFlaggedReviews( + paginationParams: PaginationParams +): Promise> { + return repo.findFlaggedReviews(paginationParams); +} + +export async function moderateReview( + reviewId: string, + dto: ModerateReviewDTO, + moderatorId: string +): Promise { + // Validate inputs + if (dto.action === 'flag' || dto.action === 'remove' || dto.action === 'approve_hide') { + if (!dto.reason || dto.reason.trim().length === 0) { + throw new ValidationError('Reason is required for flag/remove/approve actions'); + } + if (dto.reason.length < 10) { + throw new ValidationError('Reason must be at least 10 characters'); + } + } + + const review = await repo.findReviewById(reviewId); + if (!review) { + throw new NotFoundError('Review not found'); + } + + const venue = await VenueModel.findById(review.venueId).select('name').lean().exec(); + const venueName = venue?.name ?? 'Unknown Venue'; + + const updated = + dto.action === 'approve_hide' || dto.action === 'reject_hide' + ? await repo.resolveHideRequest( + reviewId, + dto.action === 'approve_hide' ? 'approve' : 'reject', + moderatorId + ) + : await repo.moderateReview(reviewId, dto, moderatorId); + + if (!updated) { + throw new NotFoundError('Review not found'); + } + + // Recompute venue rating if moderation affected visibility + if (dto.action === 'remove' || dto.action === 'restore' || dto.action === 'approve_hide') { + await recomputeVenueRating(updated.venueId.toString()); + } + + // Send email notifications to review author + if (dto.action === 'remove' || dto.action === 'approve_hide') { + try { + await enqueueEmailTask( + updated.userId.toString(), + EmailIntent.REVIEW_REMOVED, + 'Your Review Has Been Removed', + EmailTaskStatus.PENDING, + { venueName, reason: dto.reason ?? 'No reason provided' } + ); + } catch (err) { + logWarn('Failed to queue review removed email', { + module: 'review.service.ts/moderateReview', + reviewId, + error: (err as Error).message, + }); + } + } else if (dto.action === 'restore') { + try { + await enqueueEmailTask( + updated.userId.toString(), + EmailIntent.REVIEW_RESTORED, + 'Your Review Has Been Restored', + EmailTaskStatus.PENDING, + { venueName } + ); + } catch (err) { + logWarn('Failed to queue review restored email', { + module: 'review.service.ts/moderateReview', + reviewId, + error: (err as Error).message, + }); + } + } + + // Log activity + if (dto.action === 'remove' || dto.action === 'restore' || dto.action === 'approve_hide') { + const { logModerationAction } = await import('../moderation/moderationActivity.service.js'); + const actionType = dto.action === 'restore' ? 'restore_review' : 'remove_review'; + await logModerationAction(moderatorId, actionType, reviewId, 'review', dto.reason, { + venueId: updated.venueId.toString(), + userId: updated.userId.toString(), + }); + } + + return updated; +} + +async function recomputeVenueRating(venueId: string): Promise { + try { + const { avgRating, reviewCount } = await repo.getVenueRatingAggregate(venueId); + + await VenueModel.findByIdAndUpdate(venueId, { + avgRating, + reviewCount, + }).exec(); + } catch (err) { + const error = err as Error; + logError('Failed to recompute venue rating', { + module: 'review.service.ts/recomputeVenueRating', + venueId, + error: error.message, + }); + // Non-blocking — continue without throwing + } +} + +export async function getUserReviewedBookings(userId: string): Promise> { + return repo.findUserReviewedBookings(userId); +} + +export async function getOwnerVenueReviews( + venueId: string, + paginationParams: PaginationParams +): Promise> { + return repo.findVenueReviewsForOwner(venueId, paginationParams); +} + +export async function replyToReview( + venueId: string, + reviewId: string, + text: string +): Promise { + const review = await repo.findReviewById(reviewId); + if (!review) throw new NotFoundError('Review not found'); + + const { isBannedForScope } = await import('../moderation/bannedUser.service.js'); + const venue = await VenueModel.findById(venueId); + if (venue) { + const isBanned = await isBannedForScope(venue.ownerUserId.toString(), 'commenting', venueId); + if (isBanned) { + throw new ConflictError('You are currently banned from replying to reviews.'); + } + } + + const updated = await repo.addOwnerReply(reviewId, venueId, text); + if (!updated) { + throw new NotFoundError('Review not found'); + } + return updated; +} + +export async function requestHideForReview( + venueId: string, + reviewId: string, + ownerId: string, + reason: string +): Promise { + const review = await repo.findReviewById(reviewId); + if (!review) { + throw new NotFoundError('Review not found'); + } + + if (review.venueId.toString() !== venueId) { + throw new NotFoundError('Review not found'); + } + + if (review.hideRequestStatus === 'pending') { + throw new ConflictError('A hide request is already pending for this review'); + } + + const updated = await repo.requestHideReview(reviewId, venueId, ownerId, reason); + if (!updated) { + throw new NotFoundError('Review not found'); + } + + return updated; +} + +export async function flagReview(reviewId: string, reason: string): Promise { + const review = await repo.findReviewById(reviewId); + if (!review) { + throw new NotFoundError('Review not found'); + } + + const updated = await repo.flagReview(reviewId, reason); + if (!updated) { + throw new NotFoundError('Review not found'); + } + + // Recompute venue rating since the review is hidden + if (review.rating) { + await recomputeVenueRating(updated.venueId.toString()); + } + + return updated; +} + +export async function getPendingHideRequests( + paginationParams: PaginationParams +): Promise> { + return repo.findPendingHideRequests(paginationParams); +} diff --git a/server/src/modules/review/review.types.ts b/server/src/modules/review/review.types.ts new file mode 100644 index 0000000000..9c103bf813 --- /dev/null +++ b/server/src/modules/review/review.types.ts @@ -0,0 +1,47 @@ +export interface IReview { + _id: string; + venueId: string; + userId: string; + bookingId?: string | null; + rating?: number; + comment?: string; + status: 'visible' | 'flagged' | 'removed'; + moderationReason?: string; + moderatedBy?: string; + moderatedAt?: Date; + editedAt?: Date; + createdAt: Date; + updatedAt: Date; + isVerified?: boolean; + reviewerRating?: number; +} + +export interface CreateReviewDTO { + venueId: string; + rating?: number; + comment?: string; +} + +export interface UpdateReviewDTO { + rating?: number; + comment?: string; +} + +export interface ModerateReviewDTO { + action: 'flag' | 'remove' | 'restore' | 'approve_hide' | 'reject_hide'; + reason?: string; +} + +export interface ReviewWithUserInfo extends IReview { + user?: { + username: string; + }; +} + +export interface OwnerReplyDTO { + text: string; +} + +export interface RequestHideDTO { + reason: string; +} diff --git a/server/src/modules/role/role.controller.ts b/server/src/modules/role/role.controller.ts new file mode 100644 index 0000000000..9b3c70ba31 --- /dev/null +++ b/server/src/modules/role/role.controller.ts @@ -0,0 +1,41 @@ +import type { Request, Response } from 'express'; +import { ResponseUtil } from '../../utils/responseUtils'; +import { handleError } from '../../utils/errors'; +import * as service from './role.service'; + +export const roleController = { + promoteToAdmin: async (req: Request, res: Response): Promise => { + try { + const { email } = req.validated?.body as { email: string }; + await service.promoteToAdmin(email); + ResponseUtil.success(res, 'User promoted to admin successfully'); + } catch (e) { + handleError(res, e, 'promoteToAdmin'); + } + }, + + demoteAdmin: async (req: Request, res: Response): Promise => { + try { + const { userId } = req.validated?.body as { userId: string }; + await service.demoteAdmin(userId); + ResponseUtil.success(res, 'Admin demoted successfully'); + } catch (e) { + handleError(res, e, 'demoteAdmin'); + } + }, + + getAdmins: async (req: Request, res: Response): Promise => { + try { + const paginationParams = req.pagination ?? { + page: 1, + limit: 10, + skip: 0, + sort: '-createdAt', + }; + const result = await service.getAdmins(paginationParams); + ResponseUtil.success(res, 'Admins retrieved successfully', result); + } catch (e) { + handleError(res, e, 'getAdmins'); + } + }, +}; diff --git a/server/src/modules/role/role.repository.ts b/server/src/modules/role/role.repository.ts new file mode 100644 index 0000000000..b81f11fd49 --- /dev/null +++ b/server/src/modules/role/role.repository.ts @@ -0,0 +1,85 @@ +import { UserModel } from '../user/user.models'; +import type { IUser } from '../user/user.models'; +import { RoleModel } from '../../models/role.model'; +import type { IRole } from '../../models/role.model'; +import { UserRoleModel } from '../../models/user-role.model'; +import type { IUserRole } from '../../models/user-role.model'; +import type mongoose from 'mongoose'; +import type { PaginationParams, PaginatedResponse } from '../../types/pagination.types'; +import { buildPaginationMeta } from '../../utils/paginationUtils'; + +export async function findActiveUserByEmail(email: string): Promise { + return UserModel.findOne({ email, active: true, deleted: false }).exec(); +} + +export async function findUserById(userId: string): Promise { + return UserModel.findById(userId).exec(); +} + +export async function findRoleByName(name: string): Promise { + return RoleModel.findOne({ name }).exec(); +} + +export async function findUserRole( + userId: mongoose.Types.ObjectId, + roleId: mongoose.Types.ObjectId +): Promise { + return UserRoleModel.findOne({ userId, roleId }).exec(); +} + +export async function createUserRole( + userId: mongoose.Types.ObjectId, + roleId: mongoose.Types.ObjectId +): Promise { + return UserRoleModel.create({ userId, roleId }); +} + +export async function updateUserRoleStatus( + existing: IUserRole, + active: boolean, + deleted: boolean +): Promise { + existing.active = active; + existing.deleted = deleted; + await existing.save(); +} + +export async function findAdminsWithPagination( + paginationParams: PaginationParams, + adminRoleId: mongoose.Types.ObjectId +): Promise, 'admins'>> { + const { limit, skip } = paginationParams; + const matchStage = { roleId: adminRoleId, active: true, deleted: false }; + + const [userRoles, totalCountResult] = await Promise.all([ + UserRoleModel.aggregate>([ + { $match: matchStage }, + { $skip: skip }, + { $limit: limit }, + { + $lookup: { + from: 'Users', + localField: 'userId', + foreignField: '_id', + as: 'user', + }, + }, + { $unwind: '$user' }, + { + $project: { + _id: '$user._id', + username: '$user.username', + email: '$user.email', + active: '$user.active', + createdAt: '$user.createdAt', + }, + }, + ]), + UserRoleModel.countDocuments(matchStage), + ]); + + return { + admins: userRoles, + pagination: buildPaginationMeta(totalCountResult, paginationParams), + }; +} diff --git a/server/src/modules/role/role.router.ts b/server/src/modules/role/role.router.ts new file mode 100644 index 0000000000..ae05652d2d --- /dev/null +++ b/server/src/modules/role/role.router.ts @@ -0,0 +1,104 @@ +import { Router } from 'express'; +import { verifyAccessToken } from '../../middlewares/auth.middleware'; +import { requireSuperAdmin } from '../../middlewares/rbac.middleware'; +import { validateBody, validateQuery } from '../../middlewares/validation.middleware'; +import { paginationMiddleware } from '../../middlewares/pagination.middleware'; +import * as validator from './role.validator'; +import { roleController } from './role.controller'; + +const router: Router = Router(); + +/** + * @openapi + * /role/promote: + * post: + * tags: [Role] + * summary: Promote a user to admin (super-admin only) + * security: + * - bearerAuth: [] + * requestBody: + * required: true + * content: + * application/json: + * schema: + * type: object + * required: [email] + * properties: + * email: + * type: string + * responses: + * 200: + * description: User promoted + */ +router + .route('/promote') + .post( + verifyAccessToken, + requireSuperAdmin, + validateBody(validator.promoteUserSchema), + roleController.promoteToAdmin + ); + +/** + * @openapi + * /role/demote: + * post: + * tags: [Role] + * summary: Demote an admin (super-admin only) + * security: + * - bearerAuth: [] + * requestBody: + * required: true + * content: + * application/json: + * schema: + * type: object + * required: [userId] + * properties: + * userId: + * type: string + * responses: + * 200: + * description: Admin demoted + */ +router + .route('/demote') + .post( + verifyAccessToken, + requireSuperAdmin, + validateBody(validator.demoteUserSchema), + roleController.demoteAdmin + ); + +/** + * @openapi + * /role/admins: + * get: + * tags: [Role] + * summary: List all admins (super-admin only) + * security: + * - bearerAuth: [] + * parameters: + * - in: query + * name: page + * schema: + * type: integer + * - in: query + * name: limit + * schema: + * type: integer + * responses: + * 200: + * description: List of admins + */ +router + .route('/admins') + .get( + verifyAccessToken, + requireSuperAdmin, + validateQuery(validator.getAdminsQuerySchema), + paginationMiddleware(), + roleController.getAdmins + ); + +export { router as roleRouter }; diff --git a/server/src/modules/role/role.service.ts b/server/src/modules/role/role.service.ts new file mode 100644 index 0000000000..03b6b68f15 --- /dev/null +++ b/server/src/modules/role/role.service.ts @@ -0,0 +1,44 @@ +import { NotFoundError, ConflictError } from '../../utils/errors'; +import type { PaginationParams, PaginatedResponse } from '../../types/pagination.types'; +import * as repo from './role.repository'; + +export async function promoteToAdmin(email: string): Promise { + const user = await repo.findActiveUserByEmail(email); + if (!user) throw new NotFoundError('User not found'); + + const adminRole = await repo.findRoleByName('admin'); + if (!adminRole) throw new Error('Admin role not found in system'); + + const existing = await repo.findUserRole(user._id, adminRole._id); + if (existing) { + if (existing.active && !existing.deleted) throw new ConflictError('User is already an admin'); + await repo.updateUserRoleStatus(existing, true, false); + return; + } + + await repo.createUserRole(user._id, adminRole._id); +} + +export async function demoteAdmin(userId: string): Promise { + const user = await repo.findUserById(userId); + if (!user) throw new NotFoundError('User not found'); + + const adminRole = await repo.findRoleByName('admin'); + if (!adminRole) throw new Error('Admin role not found in system'); + + const existing = await repo.findUserRole(user._id, adminRole._id); + if (!existing || !existing.active || existing.deleted) { + throw new ConflictError('User is not an active admin'); + } + + await repo.updateUserRoleStatus(existing, false, true); +} + +export async function getAdmins( + paginationParams: PaginationParams +): Promise, 'admins'>> { + const adminRole = await repo.findRoleByName('admin'); + if (!adminRole) throw new Error('Admin role not found in system'); + + return repo.findAdminsWithPagination(paginationParams, adminRole._id); +} diff --git a/server/src/modules/role/role.validator.ts b/server/src/modules/role/role.validator.ts new file mode 100644 index 0000000000..f8504aba23 --- /dev/null +++ b/server/src/modules/role/role.validator.ts @@ -0,0 +1,14 @@ +import { z } from 'zod'; + +export const promoteUserSchema = z.object({ + email: z.email('Invalid email format'), +}); + +export const demoteUserSchema = z.object({ + userId: z.string().regex(/^[0-9a-fA-F]{24}$/, 'Invalid user ID format'), +}); + +export const getAdminsQuerySchema = z.object({ + page: z.coerce.number().min(1).default(1), + limit: z.coerce.number().min(1).max(100).default(10), +}); diff --git a/server/src/modules/swagger/swagger.config.ts b/server/src/modules/swagger/swagger.config.ts new file mode 100644 index 0000000000..68ee8e0329 --- /dev/null +++ b/server/src/modules/swagger/swagger.config.ts @@ -0,0 +1,92 @@ +import swaggerJsdoc from 'swagger-jsdoc'; +import type { OAS3Definition } from 'swagger-jsdoc'; +import path from 'path'; + +const definition: OAS3Definition = { + openapi: '3.0.3', + info: { + title: 'BookMyVenue API', + version: '1.0.0', + description: + 'REST API for the BookMyVenue platform — venue discovery, slot locking, and Razorpay-backed booking flow.', + }, + servers: [ + { + url: '/api/v1', + description: 'Development server (localhost)', + }, + { + url: 'https://bmvserver.shares.zrok.io/api/v1', + description: 'zrok tunnel (HTTPS)', + }, + ], + components: { + securitySchemes: { + bearerAuth: { + type: 'http', + scheme: 'bearer', + bearerFormat: 'JWT', + description: 'Access token returned by /auth/login or /auth/refresh', + }, + cookieAuth: { + type: 'apiKey', + in: 'cookie', + name: 'refreshToken', + description: 'Refresh token cookie used by /auth/refresh and /auth/logout', + }, + }, + schemas: { + SuccessResponse: { + type: 'object', + properties: { + success: { type: 'boolean', example: true }, + message: { type: 'string' }, + data: { type: 'object' }, + }, + }, + ErrorResponse: { + type: 'object', + properties: { + success: { type: 'boolean', example: false }, + message: { type: 'string' }, + }, + }, + PaginatedMeta: { + type: 'object', + properties: { + page: { type: 'integer' }, + limit: { type: 'integer' }, + total: { type: 'integer' }, + totalPages: { type: 'integer' }, + }, + }, + }, + }, + tags: [ + { name: 'Health', description: 'Server health check' }, + { name: 'Auth', description: 'Authentication and session management' }, + { name: 'User', description: 'Authenticated user profile' }, + { name: 'Venues', description: 'Venue management — public, owner, and admin operations' }, + { name: 'Availability', description: 'Venue availability and slot locking' }, + { name: 'Bookings', description: 'Checkout and payment flow' }, + { name: 'RBAC', description: 'Permission cache management (super-admin only)' }, + { name: 'Webhooks', description: 'Incoming Razorpay payment event handler' }, + { name: 'Geo', description: 'Geospatial lookups (city/state autocomplete)' }, + { name: 'Moderation', description: 'User moderation — ban and unban operations (admin only)' }, + { name: 'Owner', description: 'Owner onboarding, earnings, and dashboard' }, + { name: 'Reviews', description: 'Venue review submission and moderation' }, + { name: 'Role', description: 'Role definitions and assignment (admin only)' }, + { name: 'Wishlist', description: 'User venue wishlist management' }, + ], +}; + +const options: swaggerJsdoc.Options = { + definition, + apis: [ + path.join(process.cwd(), 'src/modules/**/*.routes.ts').replace(/\\/g, '/'), + path.join(process.cwd(), 'src/modules/**/*.router.ts').replace(/\\/g, '/'), + path.join(process.cwd(), 'src/router.ts').replace(/\\/g, '/'), + ], +}; + +export const openapiDocument = swaggerJsdoc(options); diff --git a/server/src/modules/swagger/swagger.router.ts b/server/src/modules/swagger/swagger.router.ts new file mode 100644 index 0000000000..ee4c34c2b8 --- /dev/null +++ b/server/src/modules/swagger/swagger.router.ts @@ -0,0 +1,81 @@ +import crypto from 'crypto'; +import { Router } from 'express'; +import type { Request, Response, NextFunction } from 'express'; +import swaggerUi from 'swagger-ui-express'; +import { openapiDocument } from './swagger.config'; +import { swaggerConfig, nodeEnv } from '../../constants/env'; + +const router: Router = Router(); + +// Only serve Swagger UI in development +function devOnly(_req: Request, res: Response, next: NextFunction): void { + if (nodeEnv !== 'development') { + res.status(404).json({ message: 'Not found' }); + return; + } + next(); +} + +// Basic Auth guard for the Swagger UI +function basicAuth(req: Request, res: Response, next: NextFunction): void { + const authHeader = req.headers.authorization; + + if (!authHeader?.startsWith('Basic ')) { + res.setHeader('WWW-Authenticate', 'Basic realm="Swagger UI"'); + res.status(401).json({ message: 'Authentication required' }); + return; + } + + // Reject if credentials are not configured + if (!swaggerConfig.user || !swaggerConfig.pass) { + res.setHeader('WWW-Authenticate', 'Basic realm="Swagger UI"'); + res.status(401).json({ message: 'Invalid credentials' }); + return; + } + + const base64 = authHeader.slice('Basic '.length); + const decoded = Buffer.from(base64, 'base64').toString('utf8'); + const [user, ...rest] = decoded.split(':'); + const pass = rest.join(':'); + + // Hash both sides to a fixed-length digest before comparing. + // crypto.timingSafeEqual throws a RangeError when buffer lengths differ, + // which happens on virtually every wrong-password attempt. HMAC-SHA256 + // normalises both operands to 32 bytes while preserving timing safety. + const HMAC_KEY = Buffer.from('swagger-basic-auth-comparison-key'); + const hash = (s: string): Buffer => crypto.createHmac('sha256', HMAC_KEY).update(s).digest(); + + const userMatch = crypto.timingSafeEqual(hash(user), hash(swaggerConfig.user)); + const passMatch = crypto.timingSafeEqual(hash(pass), hash(swaggerConfig.pass)); + + if (!userMatch || !passMatch) { + res.setHeader('WWW-Authenticate', 'Basic realm="Swagger UI"'); + res.status(401).json({ message: 'Invalid credentials' }); + return; + } + + next(); +} + +// Expose the raw OpenAPI JSON for Postman / import +router.get('/json', devOnly, basicAuth, (_req, res) => { + res.json(openapiDocument); +}); + +// Mount the Swagger UI +router.use('/', devOnly, basicAuth, swaggerUi.serve); +router.get( + '/', + devOnly, + basicAuth, + swaggerUi.setup(openapiDocument, { + customSiteTitle: 'BookMyVenue API Docs', + swaggerOptions: { + persistAuthorization: true, + filter: true, + displayRequestDuration: true, + }, + }) +); + +export { router as swaggerRouter }; diff --git a/server/src/modules/user/user.controller.ts b/server/src/modules/user/user.controller.ts new file mode 100644 index 0000000000..92e4e4bb2f --- /dev/null +++ b/server/src/modules/user/user.controller.ts @@ -0,0 +1,162 @@ +import type { Request, Response } from 'express'; +import type { z } from 'zod'; +import { ResponseUtil } from '../../utils/responseUtils'; +import * as service from './user.service'; +import * as workflow from './user.workflow'; +import { handleError } from '../../utils/errors'; +import type { updateProfileSchema } from './user.validator'; +import type { BanUserRequest } from './user.types'; + +export const getProfile = async (req: Request, res: Response): Promise => { + try { + const userId = req.user?.userId; + + if (!userId) { + ResponseUtil.unauthorized(res, 'Unauthorized'); + return; + } + + const profile = await service.getProfile(userId); + ResponseUtil.success(res, 'User profile retrieved successfully', profile); + } catch (e) { + handleError(res, e, 'getProfile'); + } +}; + +export const updateProfile = async (req: Request, res: Response): Promise => { + try { + const userId = req.user?.userId; + if (!userId) { + ResponseUtil.unauthorized(res, 'Unauthorized'); + return; + } + + const dto = req.validated?.body as z.infer; + const profile = await service.updateProfile(userId, dto); + ResponseUtil.success(res, 'Profile updated successfully', profile); + } catch (e) { + handleError(res, e, 'updateProfile'); + } +}; + +export const deleteProfilePicture = async (req: Request, res: Response): Promise => { + try { + const userId = req.user?.userId; + if (!userId) { + ResponseUtil.unauthorized(res, 'Unauthorized'); + return; + } + + const profile = await service.deleteProfilePicture(userId); + ResponseUtil.success(res, 'Profile picture removed successfully', profile); + } catch (e) { + handleError(res, e, 'deleteProfilePicture'); + } +}; + +export const getAvatarUploadSignature = (req: Request, res: Response): void => { + try { + const userId = req.user?.userId; + if (!userId) { + ResponseUtil.unauthorized(res, 'Unauthorized'); + return; + } + + const signed = service.getAvatarUploadSignature(userId); + if (!signed) { + ResponseUtil.internalServerError(res, 'Image upload not configured'); + return; + } + + ResponseUtil.success(res, 'Signature generated', signed); + } catch (e) { + handleError(res, e, 'getAvatarUploadSignature'); + } +}; + +export const getAllUsers = async (req: Request, res: Response): Promise => { + try { + const paginationParams = req.pagination ?? { page: 1, limit: 10, skip: 0, sort: '-createdAt' }; + const role = req.query.role as string | undefined; + + const result = await service.getAllUsers(paginationParams, { role }); + ResponseUtil.success(res, 'Users retrieved successfully', result); + } catch (e) { + handleError(res, e, 'getAllUsers'); + } +}; + +export const toggleUserStatus = async (req: Request, res: Response): Promise => { + try { + const { userId } = req.params; + + // Prevent modifying own status + if (req.user?.userId === userId) { + ResponseUtil.badRequest(res, 'You cannot toggle your own status'); + return; + } + const user = await service.toggleUserStatus(userId as string); + if (!user) { + ResponseUtil.notFound(res, 'User not found'); + return; + } + + ResponseUtil.success(res, `User is now ${user.active ? 'active' : 'inactive'}`, { + active: user.active, + }); + } catch (e) { + handleError(res, e, 'toggleUserStatus'); + } +}; + +export const resetUserPassword = async (req: Request, res: Response): Promise => { + try { + const { userId } = req.params; + await workflow.resetUserPasswordWorkflow(userId as string); + + ResponseUtil.success(res, 'Password reset successfully, email dispatched'); + } catch (e) { + const error = e as Error; + if (error.message.includes('not found')) { + ResponseUtil.notFound(res, error.message); + } else { + handleError(res, e, 'resetUserPassword'); + } + } +}; + +export const banUser = async (req: Request, res: Response): Promise => { + try { + const adminId = req.user?.userId; + if (!adminId) { + ResponseUtil.unauthorized(res, 'Unauthorized'); + return; + } + + const userId = Array.isArray(req.params.userId) ? req.params.userId[0] : req.params.userId; + const { banReason } = req.body as BanUserRequest; + + if (!banReason || banReason.trim().length < 10) { + ResponseUtil.badRequest(res, 'Ban reason must be at least 10 characters'); + return; + } + + const user = await service.banUser(userId, adminId, banReason); + ResponseUtil.success(res, 'User banned successfully', { + username: user.username, + isBanned: user.isBanned, + }); + } catch (e) { + handleError(res, e, 'banUser'); + } +}; + +export const unbanUser = async (req: Request, res: Response): Promise => { + try { + const userId = Array.isArray(req.params.userId) ? req.params.userId[0] : req.params.userId; + const user = await service.unbanUser(userId); + ResponseUtil.success(res, 'User unbanned successfully', { username: user.username }); + } catch (e) { + handleError(res, e, 'unbanUser'); + } +}; diff --git a/server/src/modules/user/user.models.ts b/server/src/modules/user/user.models.ts new file mode 100644 index 0000000000..953b842836 --- /dev/null +++ b/server/src/modules/user/user.models.ts @@ -0,0 +1,39 @@ +import type { Document } from 'mongoose'; +import mongoose, { Schema } from 'mongoose'; + +export interface IUser extends Document { + username: string; + email: string; + password: string; + createdAt: Date; + active: boolean; + deleted: boolean; + passwordChangedAt?: Date | null; + isBanned: boolean; + profilePicture?: string; + profilePicturePublicId?: string; +} + +const UserSchema = new Schema( + { + username: { type: String, required: true, unique: true }, + email: { type: String, required: true }, + password: { type: String, required: true, select: false }, + active: { type: Boolean, default: true }, + deleted: { type: Boolean, default: false }, + passwordChangedAt: { type: Date, default: null }, + isBanned: { type: Boolean, default: false, index: true }, + profilePicture: { type: String }, + profilePicturePublicId: { type: String }, + }, + { timestamps: true } +); + +UserSchema.index( + { email: 1 }, + { unique: true, sparse: true, partialFilterExpression: { active: true } } +); + +UserSchema.index({ active: 1, deleted: 1, isBanned: 1 }, { name: 'idx_active_deleted_banned' }); + +export const UserModel = mongoose.model('Users', UserSchema, 'Users'); diff --git a/server/src/modules/user/user.repository.ts b/server/src/modules/user/user.repository.ts new file mode 100644 index 0000000000..74ec312529 --- /dev/null +++ b/server/src/modules/user/user.repository.ts @@ -0,0 +1,226 @@ +import type { IUser } from './user.models'; +import { UserModel } from './user.models'; +import type mongoose from 'mongoose'; +import type { PaginationParams, PaginatedResponse } from '../../types/pagination.types'; +import { buildPaginationMeta } from '../../utils/paginationUtils'; + +export async function findUserById(userId: string): Promise { + return UserModel.findById(userId).select('-password').exec(); +} + +export async function findUserEmailById(userId: string): Promise { + const user = await UserModel.findById(userId).select('email').lean().exec(); + return (user as { email?: string } | null)?.email ?? null; +} + +export async function findActiveUserById(id: string): Promise { + return UserModel.findOne({ _id: id, active: true, deleted: false }).exec(); +} + +export async function findActiveUserByIdWithPassword( + id: string, + session?: mongoose.ClientSession +): Promise { + return UserModel.findOne({ _id: id, active: true, deleted: false }) + .select('+password') + .session(session ?? null) + .exec(); +} + +export async function findUserByUsernameOrEmail( + username?: string, + email?: string +): Promise { + return UserModel.findOne({ $or: [{ username }, { email }] }).exec(); +} + +export async function findActiveUserByIdentifierWithPassword( + identifier: string +): Promise { + return UserModel.findOne({ + $or: [{ username: identifier }, { email: identifier }], + active: true, + deleted: false, + }) + .select('+password') + .exec(); +} + +export async function findActiveUserByEmail(email: string): Promise { + return UserModel.findOne({ email, active: true, deleted: false }).exec(); +} + +export async function updateUserPassword( + userId: string | mongoose.Types.ObjectId, + passwordHash: string, + session?: mongoose.ClientSession +): Promise { + await UserModel.updateOne( + { _id: userId }, + { $set: { password: passwordHash, passwordChangedAt: new Date() } }, + { session } + ).exec(); +} + +export async function findActiveUserByUsernameExcludingId( + username: string, + excludeUserId: string +): Promise { + return UserModel.findOne({ + username, + _id: { $ne: excludeUserId }, + deleted: false, + }).exec(); +} + +export async function updateUserProfile( + userId: string, + data: { username?: string; profilePicture?: string; profilePicturePublicId?: string } +): Promise { + return UserModel.findByIdAndUpdate(userId, { $set: data }, { new: true }).exec(); +} + +export async function clearUserProfilePicture(userId: string): Promise { + return UserModel.findByIdAndUpdate( + userId, + { $unset: { profilePicture: '', profilePicturePublicId: '' } }, + { new: true } + ).exec(); +} + +export async function createUser( + data: { username: string; email: string; passwordHash: string }, + session?: mongoose.ClientSession +): Promise { + const newUser = new UserModel({ + username: data.username, + email: data.email, + password: data.passwordHash, + }); + return newUser.save({ session }); +} + +export async function findAllUsers( + paginationParams: PaginationParams, + filters?: { role?: string } +): Promise, 'users'>> { + const { limit, skip } = paginationParams; + const matchStage: Record = { deleted: false }; + + const pipeline: mongoose.PipelineStage[] = [ + { $match: matchStage }, + { + $lookup: { + from: 'UserRoles', + localField: '_id', + foreignField: 'userId', + as: 'userRoles', + }, + }, + { + $lookup: { + from: 'Roles', + localField: 'userRoles.roleId', + foreignField: '_id', + as: 'roles', + }, + }, + { + $lookup: { + from: 'Venues', + localField: '_id', + foreignField: 'ownerUserId', + as: 'venues', + }, + }, + ]; + + if (filters?.role) { + pipeline.push({ + $match: { 'roles.name': filters.role }, + }); + } + + const [users, totalCountResult] = await Promise.all([ + UserModel.aggregate>([ + ...pipeline, + { $sort: { createdAt: -1 } }, + { $skip: skip }, + { $limit: limit }, + { + $project: { + _id: 1, + username: 1, + email: 1, + active: 1, + isBanned: 1, + createdAt: 1, + roles: { $map: { input: '$roles', as: 'r', in: '$$r.name' } }, + venues: 1, + }, + }, + ]), + UserModel.aggregate>([...pipeline, { $count: 'total' }]), + ]); + + const totalCount = totalCountResult[0]?.total ?? 0; + + return { + users, + pagination: buildPaginationMeta(totalCount as number, paginationParams), + }; +} + +export async function toggleUserStatus(userId: string): Promise { + const user = await UserModel.findById(userId); + if (!user) { + return null; + } + user.active = !user.active; + await user.save(); + return user; +} + +export async function banUser(userId: string, adminId: string, banReason: string): Promise { + const user = await UserModel.findByIdAndUpdate( + userId, + { + active: false, + banReason, + bannedBy: adminId, + bannedAt: new Date(), + }, + { new: true } + ).exec(); + + if (!user) { + throw new Error('User not found'); + } + + return user; +} + +export async function unbanUser(userId: string): Promise { + // Using $unset for legacy fields, and $set for actual schema fields + const user = await UserModel.findByIdAndUpdate( + userId, + { + $unset: { + banReason: 1, + bannedBy: 1, + bannedAt: 1, + }, + $set: { + isBanned: false, + active: true, + }, + }, + { new: true, strict: false } + ).exec(); + + if (!user) { + throw new Error('User not found'); + } + + return user; +} diff --git a/server/src/modules/user/user.router.ts b/server/src/modules/user/user.router.ts new file mode 100644 index 0000000000..c413a2644e --- /dev/null +++ b/server/src/modules/user/user.router.ts @@ -0,0 +1,258 @@ +import { Router } from 'express'; +import rateLimit from 'express-rate-limit'; +import * as controller from './user.controller'; +import { verifyAccessToken } from '../../middlewares/auth.middleware'; +import { requireRole } from '../../middlewares/rbac.middleware'; +import { validateBody } from '../../middlewares/validation.middleware'; +import { paginationMiddleware } from '../../middlewares/pagination.middleware'; +import * as validator from './user.validator'; + +const router: Router = Router(); + +const uploadSignatureLimiter = rateLimit({ + windowMs: 30 * 60 * 1000, + max: 10, + message: 'Too many upload requests, please try again later', +}); + +/** + * @openapi + * /user/profile: + * get: + * tags: [User] + * summary: Get the authenticated user's profile + * security: + * - bearerAuth: [] + * responses: + * 200: + * description: User profile data + * content: + * application/json: + * schema: + * allOf: + * - $ref: '#/components/schemas/SuccessResponse' + * - type: object + * properties: + * data: + * type: object + * properties: + * _id: + * type: string + * username: + * type: string + * email: + * type: string + * 401: + * description: Not authenticated + */ +router.route('/profile').get(verifyAccessToken, controller.getProfile); + +/** + * @openapi + * /user/profile: + * patch: + * tags: [User] + * summary: Update the authenticated user's own profile (username and/or profile picture) + * security: + * - bearerAuth: [] + * requestBody: + * required: true + * content: + * application/json: + * schema: + * type: object + * properties: + * username: + * type: string + * profilePicture: + * type: string + * profilePicturePublicId: + * type: string + * responses: + * 200: + * description: Profile updated successfully + * 400: + * description: Validation error + * 401: + * description: Not authenticated + * 409: + * description: Username already taken + */ +router + .route('/profile') + .patch(verifyAccessToken, validateBody(validator.updateProfileSchema), controller.updateProfile); + +/** + * @openapi + * /user/profile/upload-signature: + * get: + * tags: [User] + * summary: Get a Cloudinary upload signature for a profile picture upload + * security: + * - bearerAuth: [] + * responses: + * 200: + * description: Cloudinary signature and upload parameters + * 401: + * description: Not authenticated + * 429: + * description: Too many upload signature requests + */ +router + .route('/profile/upload-signature') + .get(verifyAccessToken, uploadSignatureLimiter, controller.getAvatarUploadSignature); + +/** + * @openapi + * /user/profile/picture: + * delete: + * tags: [User] + * summary: Remove the authenticated user's profile picture + * security: + * - bearerAuth: [] + * responses: + * 200: + * description: Profile picture removed successfully + * 400: + * description: No profile picture to remove + * 401: + * description: Not authenticated + */ +router.route('/profile/picture').delete(verifyAccessToken, controller.deleteProfilePicture); + +/** + * @openapi + * /user/all: + * get: + * tags: [User] + * summary: Get all users (Admin/SuperAdmin) + * security: + * - bearerAuth: [] + * parameters: + * - in: query + * name: role + * schema: + * type: string + * description: Filter users by role name + * responses: + * 200: + * description: List of users + * 401: + * description: Not authenticated + * 403: + * description: Forbidden + */ +router + .route('/all') + .get(verifyAccessToken, requireRole('admin'), paginationMiddleware(), controller.getAllUsers); + +/** + * @openapi + * /user/{userId}/toggle-status: + * patch: + * tags: [User] + * summary: Toggle user active status (SuperAdmin) + * security: + * - bearerAuth: [] + * parameters: + * - in: path + * name: userId + * required: true + * schema: + * type: string + * responses: + * 200: + * description: User status toggled successfully + * 401: + * description: Not authenticated + * 403: + * description: SuperAdmin role required + */ +router + .route('/:userId/toggle-status') + .patch(verifyAccessToken, requireRole('superAdmin'), controller.toggleUserStatus); + +/** + * @openapi + * /user/{userId}/reset-password: + * post: + * tags: [User] + * summary: Reset user password and email (SuperAdmin) + * security: + * - bearerAuth: [] + * parameters: + * - in: path + * name: userId + * required: true + * schema: + * type: string + * responses: + * 200: + * description: User password reset successfully + * 401: + * description: Not authenticated + * 403: + * description: SuperAdmin role required + */ +router + .route('/:userId/reset-password') + .post(verifyAccessToken, requireRole('superAdmin'), controller.resetUserPassword); + +/** + * @openapi + * /user/{userId}/ban: + * post: + * tags: [User] + * summary: Ban a user (Admin) + * security: + * - bearerAuth: [] + * parameters: + * - in: path + * name: userId + * required: true + * schema: + * type: string + * requestBody: + * required: true + * content: + * application/json: + * schema: + * type: object + * properties: + * banReason: + * type: string + * responses: + * 200: + * description: User banned successfully + * 401: + * description: Not authenticated + * 403: + * description: Admin role required + */ +router.route('/:userId/ban').post(verifyAccessToken, requireRole('admin'), controller.banUser); + +/** + * @openapi + * /user/{userId}/unban: + * post: + * tags: [User] + * summary: Unban a user (Admin) + * security: + * - bearerAuth: [] + * parameters: + * - in: path + * name: userId + * required: true + * schema: + * type: string + * responses: + * 200: + * description: User unbanned successfully + * 401: + * description: Not authenticated + * 403: + * description: Admin role required + */ +router.route('/:userId/unban').post(verifyAccessToken, requireRole('admin'), controller.unbanUser); + +export { router as userRouter }; diff --git a/server/src/modules/user/user.service.ts b/server/src/modules/user/user.service.ts new file mode 100644 index 0000000000..5bb6a40b2f --- /dev/null +++ b/server/src/modules/user/user.service.ts @@ -0,0 +1,194 @@ +import crypto from 'crypto'; +import { v2 as cloudinary } from 'cloudinary'; +import * as repo from './user.repository'; +import { NotFoundError, ForbiddenError, ConflictError, ValidationError } from '../../utils/errors'; +import type { IUser } from './user.models'; +import { getUserRole } from '../../services/roles.service'; +import type { PaginatedResponse, PaginationParams } from '../../types/pagination.types'; +import { signUploadParams, type CloudinarySignature } from '../../utils/cloudinarySign'; +import { logError } from '../../utils/logger'; + +interface ProfileDto { + _id: string; + name: string; + email: string; + profilePicture?: string; +} + +function toProfileDto(user: IUser): ProfileDto { + return { + _id: user._id.toString(), + name: user.username, + email: user.email, + profilePicture: user.profilePicture, + }; +} + +export async function getProfile(userId: string): Promise { + const user = await repo.findUserById(userId); + + if (!user) { + throw new NotFoundError('User not found'); + } + + const roleInfo = await getUserRole(userId); + + return { ...toProfileDto(user), role: roleInfo?.roleName }; +} + +export async function updateProfile( + userId: string, + dto: { username?: string; profilePicturePublicId?: string } +): Promise { + const existingUser = await repo.findUserById(userId); + if (!existingUser) { + throw new NotFoundError('User not found'); + } + + if (dto.username && dto.username !== existingUser.username) { + const usernameTaken = await repo.findActiveUserByUsernameExcludingId(dto.username, userId); + if (usernameTaken) { + throw new ConflictError('Username is already taken'); + } + } + + const updateData: { + username?: string; + profilePicture?: string; + profilePicturePublicId?: string; + } = {}; + if (dto.username) { + updateData.username = dto.username; + } + + if (dto.profilePicturePublicId) { + const ownFolderPrefix = `bookmyvenue/users/${userId}/`; + if (!dto.profilePicturePublicId.startsWith(ownFolderPrefix)) { + throw new ForbiddenError('Profile picture must be one you uploaded'); + } + + let verifiedUrl: string; + try { + const resource = (await cloudinary.api.resource(dto.profilePicturePublicId)) as { + secure_url: string; + }; + verifiedUrl = resource.secure_url; + } catch { + throw new ValidationError('Could not verify the uploaded profile picture'); + } + + if ( + existingUser.profilePicturePublicId && + existingUser.profilePicturePublicId !== dto.profilePicturePublicId + ) { + try { + await cloudinary.uploader.destroy(existingUser.profilePicturePublicId); + } catch (e) { + const error = e as Error; + logError('Failed to delete old profile picture from Cloudinary', { + module: 'user.service.ts/updateProfile', + userId, + publicId: existingUser.profilePicturePublicId, + error: error.message, + }); + } + } + + updateData.profilePicture = verifiedUrl; + updateData.profilePicturePublicId = dto.profilePicturePublicId; + } + + const updated = await repo.updateUserProfile(userId, updateData); + if (!updated) { + throw new NotFoundError('User not found'); + } + + return toProfileDto(updated); +} + +export async function deleteProfilePicture(userId: string): Promise { + const existingUser = await repo.findUserById(userId); + if (!existingUser) { + throw new NotFoundError('User not found'); + } + + if (!existingUser.profilePicturePublicId) { + throw new ValidationError('No profile picture to remove'); + } + + try { + await cloudinary.uploader.destroy(existingUser.profilePicturePublicId); + } catch (e) { + const error = e as Error; + logError('Failed to delete profile picture from Cloudinary', { + module: 'user.service.ts/deleteProfilePicture', + userId, + publicId: existingUser.profilePicturePublicId, + error: error.message, + }); + } + + const updated = await repo.clearUserProfilePicture(userId); + if (!updated) { + throw new NotFoundError('User not found'); + } + + return toProfileDto(updated); +} + +export function getAvatarUploadSignature(userId: string): CloudinarySignature | null { + return signUploadParams(`bookmyvenue/users/${userId}`); +} + +export async function getAllUsers( + paginationParams: PaginationParams, + filters?: { role?: string } +): Promise, 'users'>> { + return repo.findAllUsers(paginationParams, filters); +} + +export async function toggleUserStatus(userId: string): Promise { + return repo.toggleUserStatus(userId); +} + +export async function generateRandomPasswordWithHash(): Promise<{ plain: string; hashed: string }> { + const bcrypt = await import('bcrypt'); + const newPassword = crypto.randomBytes(12).toString('base64url'); + const hashedPassword = await bcrypt.hash(newPassword, 12); + return { plain: newPassword, hashed: hashedPassword }; +} + +export async function banUser(userId: string, adminId: string, banReason: string): Promise { + // Prevent self-ban + if (userId === adminId) { + throw new ForbiddenError('You cannot ban yourself'); + } + + // Get the user to be banned + const userToban = await repo.findUserById(userId); + if (!userToban) { + throw new NotFoundError('User not found'); + } + + // Prevent banning a superAdmin + const userRole = await getUserRole(userId); + if (userRole?.roleName === 'superAdmin') { + throw new ForbiddenError('You cannot ban a super admin'); + } + + // Ban the user + return repo.banUser(userId, adminId, banReason); +} + +export async function unbanUser(userId: string): Promise { + const user = await repo.findUserById(userId); + if (!user) { + throw new NotFoundError('User not found'); + } + + // Also lift any BannedUsers records to keep systems in sync + const bannedUserRepo = await import('../moderation/bannedUser.repository.js'); + await bannedUserRepo.liftAllBansForUser(userId, userId); // using userId as a dummy liftedBy + + return repo.unbanUser(userId); +} diff --git a/server/src/modules/user/user.types.ts b/server/src/modules/user/user.types.ts new file mode 100644 index 0000000000..b6fa8c5977 --- /dev/null +++ b/server/src/modules/user/user.types.ts @@ -0,0 +1,3 @@ +export interface BanUserRequest { + banReason: string; +} diff --git a/server/src/modules/user/user.validator.ts b/server/src/modules/user/user.validator.ts new file mode 100644 index 0000000000..70ad9d6c60 --- /dev/null +++ b/server/src/modules/user/user.validator.ts @@ -0,0 +1,10 @@ +import { z } from 'zod'; + +export const updateProfileSchema = z + .object({ + username: z.string().trim().min(3).max(30).optional(), + profilePicturePublicId: z.string().trim().min(1).optional(), + }) + .refine((data) => data.username ?? data.profilePicturePublicId, { + message: 'Nothing to update', + }); diff --git a/server/src/modules/user/user.workflow.ts b/server/src/modules/user/user.workflow.ts new file mode 100644 index 0000000000..e503f2aef9 --- /dev/null +++ b/server/src/modules/user/user.workflow.ts @@ -0,0 +1,26 @@ +import * as repo from './user.repository'; +import * as service from './user.service'; +import { enqueueEmailTask } from '../../services/email.repository'; +import { EmailIntent, EmailTaskStatus } from '../../constants/email.constants'; + +export async function resetUserPasswordWorkflow(userId: string): Promise { + const user = await repo.findUserById(userId); + if (!user) { + throw new Error('User not found'); + } + + const { plain: newPassword, hashed: hashedPassword } = + await service.generateRandomPasswordWithHash(); + + await repo.updateUserPassword(userId, hashedPassword); + + await enqueueEmailTask( + user.email, + EmailIntent.ADMIN_PASSWORD_RESET, + `Password Reset – ${user.username}`, + EmailTaskStatus.PENDING, + { newPassword, username: user.username } + ); + + return true; +} diff --git a/server/src/modules/venue/venue.controller.ts b/server/src/modules/venue/venue.controller.ts new file mode 100644 index 0000000000..dd2ec3010a --- /dev/null +++ b/server/src/modules/venue/venue.controller.ts @@ -0,0 +1,462 @@ +import type { z } from 'zod'; +import type { Request, Response } from 'express'; +import { ResponseUtil } from '../../utils/responseUtils'; +import * as service from './venue.service'; +import * as wishlistService from '../wishlist/wishlist.service'; +import type { + createVenueSchema, + updateVenueSchema, + rejectVenueSchema, + suspendVenueSchema, + adminVenueFiltersSchema, + venueIdParamSchema, + publicVenueFiltersSchema, + featureVenueSchema, + extendVenueDeadlineSchema, + approveReviewSchema, + rejectReviewSchema, +} from './venue.validator'; +import type { PlainVenue } from './venue.types'; +import { handleError } from '../../utils/errors'; +import { signUploadParams } from '../../utils/cloudinarySign'; +import { PERMISSIONS } from '../../constants/permissions'; + +// Helpers +function isCallerPrivileged(req: Request): boolean { + return ( + req.user?.role.isSuperAdmin === true || + req.user?.role.permissions?.has(PERMISSIONS.venues.read) === true + ); +} +// function isCallerAdmin(req: Request): boolean { +// return ( +// req.user?.role.isSuperAdmin === true || +// req.user?.role.permissions?.has('approve:venues') === true +// ); +// } + +export const getUploadSignature = (req: Request, res: Response): void => { + try { + const userId = req.user?.userId; + if (!userId) { + ResponseUtil.unauthorized(res, 'Unauthorized'); + return; + } + + const signed = signUploadParams(`bookmyvenue/venues/${userId}`); + if (!signed) { + ResponseUtil.internalServerError(res, 'Image upload not configured'); + return; + } + + ResponseUtil.success(res, 'Signature generated', signed); + } catch (e) { + handleError(res, e, 'getUploadSignature'); + } +}; + +export const getPaginatedActiveVenues = async (req: Request, res: Response): Promise => { + try { + const filters = req.validated?.query as z.infer; + const paginationParams = req.pagination ?? { page: 1, limit: 20, skip: 0, sort: '' }; + const venuesData = await service.getPaginatedActiveVenues(paginationParams, filters); + + // Add wishlisted flag for authenticated users (bulk check, not N+1) + let finalVenues: (PlainVenue & { wishlisted?: boolean })[]; + if (req.user?.userId) { + const venueIds = venuesData.venues.map((v) => v._id.toString()); + const wishlistedStatuses = await wishlistService.getWishlistStatus(req.user.userId, venueIds); + finalVenues = venuesData.venues.map((venue) => ({ + ...(venue.toObject() as PlainVenue), + wishlisted: wishlistedStatuses[venue._id.toString()] ?? false, + })); + } else { + finalVenues = venuesData.venues.map((venue) => ({ + ...(venue.toObject() as PlainVenue), + wishlisted: false, + })); + } + + ResponseUtil.paginated( + res, + 'Venues retrieved successfully', + finalVenues, + venuesData.pagination, + 'venues' + ); + } catch (e) { + handleError(res, e, 'getPaginatedActiveVenues'); + } +}; + +export const getVenuePins = async (req: Request, res: Response): Promise => { + try { + const { swLng, swLat, neLng, neLat } = req.query; + + // Parse and validate bbox parameters + const bbox = + swLng && swLat && neLng && neLat + ? { + swLng: Number(swLng), + swLat: Number(swLat), + neLng: Number(neLng), + neLat: Number(neLat), + } + : undefined; + + const pins = await service.getVenuePins(bbox); + ResponseUtil.success(res, 'Venue pins retrieved successfully', pins); + } catch (e) { + handleError(res, e, 'getVenuePins'); + } +}; + +// Owner Handlers +export const createVenue = async (req: Request, res: Response): Promise => { + try { + const userId = req.user?.userId; + if (!userId) { + ResponseUtil.unauthorized(res, 'Unauthorized'); + return; + } + const dto = req.validated?.body as z.infer; + const venue = await service.createVenue(userId, dto); + ResponseUtil.created(res, 'Venue created successfully', venue); + } catch (e) { + handleError(res, e, 'createVenue'); + } +}; + +export const getMyVenues = async (req: Request, res: Response): Promise => { + try { + const userId = req.user?.userId; + if (!userId) { + ResponseUtil.unauthorized(res, 'Unauthorized'); + return; + } + const venues = await service.getMyVenues(userId); + ResponseUtil.success(res, 'Venues retrieved successfully', { + count: venues.length, + venues, + }); + } catch (e) { + handleError(res, e, 'getMyVenues'); + } +}; + +// PUT /venues/draft +export const upsertDraft = async (req: Request, res: Response): Promise => { + try { + const userId = req.user?.userId; + if (!userId) { + ResponseUtil.unauthorized(res, 'Unauthorized'); + return; + } + + const { step, formValues } = req.body as { step: number; formValues: Record }; + if (typeof step !== 'number') { + ResponseUtil.badRequest(res, 'Invalid draft payload'); + return; + } + + const draft = await service.upsertDraft(userId, step, formValues); + ResponseUtil.success(res, 'Draft saved', draft); + } catch (e) { + handleError(res, e, 'upsertDraft'); + } +}; + +// GET /venues/draft +export const getMyDraft = async (req: Request, res: Response): Promise => { + try { + const userId = req.user?.userId; + if (!userId) { + ResponseUtil.unauthorized(res, 'Unauthorized'); + return; + } + + const draft = await service.getDraft(userId); + ResponseUtil.success(res, 'Draft retrieved', draft); + } catch (e) { + handleError(res, e, 'getMyDraft'); + } +}; + +export const getVenueById = async (req: Request, res: Response): Promise => { + try { + const { id } = req.validated?.params as z.infer; + const venue = await service.getVenueById(id, req.user?.userId, isCallerPrivileged(req)); + + // Add wishlisted flag if user is authenticated + const venueWithWishlist = { + ...(venue.toObject() as PlainVenue), + wishlisted: false, + }; + + if (req.user?.userId) { + const statuses = await wishlistService.getWishlistStatus(req.user.userId, [id]); + venueWithWishlist.wishlisted = statuses[id] ?? false; + } + + ResponseUtil.success(res, 'Venue retrieved successfully', venueWithWishlist); + } catch (e) { + handleError(res, e, 'getVenueById'); + } +}; + +export const updateVenue = async (req: Request, res: Response): Promise => { + try { + const { id } = req.validated?.params as z.infer; + const userId = req.user?.userId; + if (!userId) { + ResponseUtil.unauthorized(res, 'Unauthorized'); + return; + } + const dto = req.validated?.body as z.infer; + const venue = await service.updateVenue(id, userId, dto); + const requiresReview = venue.pendingReview?.intent === 'venue_edit'; + const msg = requiresReview + ? 'Changes saved. Critical updates submitted for admin review.' + : 'Venue updated successfully'; + ResponseUtil.success(res, msg, venue); + } catch (e) { + handleError(res, e, 'updateVenue'); + } +}; + +export const deleteVenue = async (req: Request, res: Response): Promise => { + try { + const { id } = req.validated?.params as z.infer; + const userId = req.user?.userId; + if (!userId) { + ResponseUtil.unauthorized(res, 'Unauthorized'); + return; + } + await service.deleteVenue(id, userId); + ResponseUtil.success(res, 'Venue deleted successfully'); + } catch (e) { + handleError(res, e, 'deleteVenue'); + } +}; + +export const submitVenue = async (req: Request, res: Response): Promise => { + try { + const { id } = req.validated?.params as z.infer; + const userId = req.user?.userId; + if (!userId) { + ResponseUtil.unauthorized(res, 'Unauthorized'); + return; + } + const venue = await service.submitVenue(id, userId); + ResponseUtil.success(res, 'Venue submitted for review successfully', venue); + } catch (e) { + handleError(res, e, 'submitVenue'); + } +}; + +// Admin Handlers +export const getPendingVenues = async (_req: Request, res: Response): Promise => { + try { + const venues = await service.getPendingVenues(); + ResponseUtil.success(res, 'Pending venues retrieved successfully', { + count: venues.length, + venues, + }); + } catch (e) { + handleError(res, e, 'getPendingVenues'); + } +}; + +export const getAllVenues = async (req: Request, res: Response): Promise => { + try { + const filters = req.validated?.query as z.infer; + const result = await service.getAllVenues(filters); + ResponseUtil.success(res, 'Venues retrieved successfully', result); + } catch (e) { + handleError(res, e, 'getAllVenues'); + } +}; + +export const approveVenue = async (req: Request, res: Response): Promise => { + try { + const { id } = req.validated?.params as z.infer; + const adminId = req.user?.userId; + if (!adminId) { + ResponseUtil.unauthorized(res, 'Unauthorized'); + return; + } + const venue = await service.approveVenue(id, adminId); + ResponseUtil.success(res, 'Venue approved successfully', venue); + } catch (e) { + handleError(res, e, 'approveVenue'); + } +}; + +export const rejectVenue = async (req: Request, res: Response): Promise => { + try { + const { id } = req.validated?.params as z.infer; + const adminId = req.user?.userId; + if (!adminId) { + ResponseUtil.unauthorized(res, 'Unauthorized'); + return; + } + const dto = req.validated?.body as z.infer; + const venue = await service.rejectVenue(id, adminId, dto); + ResponseUtil.success(res, 'Venue rejected', venue); + } catch (e) { + handleError(res, e, 'rejectVenue'); + } +}; + +export const unsuspendVenue = async (req: Request, res: Response): Promise => { + try { + const { id } = req.validated?.params as z.infer; + const adminId = req.user?.userId; + if (!adminId) { + ResponseUtil.unauthorized(res, 'Unauthorized'); + return; + } + const venue = await service.unsuspendVenue(id, adminId); + ResponseUtil.success(res, 'Venue reactivated successfully', venue); + } catch (e) { + handleError(res, e, 'unsuspendVenue'); + } +}; + +export const suspendVenue = async (req: Request, res: Response): Promise => { + try { + const { id } = req.validated?.params as z.infer; + const dto = req.validated?.body as z.infer; + const adminId = req.user?.userId; + if (!adminId) { + ResponseUtil.unauthorized(res, 'Unauthorized'); + return; + } + const venue = await service.suspendVenue(id, adminId, dto); + ResponseUtil.success(res, 'Venue suspended successfully', venue); + } catch (e) { + handleError(res, e, 'suspendVenue'); + } +}; + +export const featureVenue = async (req: Request, res: Response): Promise => { + try { + const { id } = req.validated?.params as z.infer; + const adminId = req.user?.userId; + if (!adminId) { + ResponseUtil.unauthorized(res, 'Unauthorized'); + return; + } + const dto = req.validated?.body as z.infer; + await service.featureVenue( + id, + dto.durationDays === 'indefinite' ? null : parseInt(dto.durationDays, 10) + ); + ResponseUtil.success(res, 'Venue featured status updated successfully'); + } catch (e) { + handleError(res, e, 'featureVenue'); + } +}; + +export const getFeaturedVenues = async (req: Request, res: Response): Promise => { + try { + const venues = await service.getFeaturedVenues(); + + let finalVenues: (PlainVenue & { wishlisted?: boolean; featuredExpiresAt?: Date | null })[] = + venues; + if (req.user?.userId) { + const venueIds = venues.map((v) => v._id.toString()); + const wishlistedStatuses = await wishlistService.getWishlistStatus(req.user.userId, venueIds); + finalVenues = venues.map((venue) => ({ + ...venue, + wishlisted: wishlistedStatuses[venue._id.toString()] ?? false, + featuredExpiresAt: venue.featuredExpiresAt, + })); + } else { + finalVenues = venues.map((venue) => ({ + ...venue, + wishlisted: false, + featuredExpiresAt: venue.featuredExpiresAt, + })); + } + + ResponseUtil.success(res, 'Featured venues retrieved successfully', finalVenues); + } catch (e) { + handleError(res, e, 'getFeaturedVenues'); + } +}; + +export const unfeatureVenue = async (req: Request, res: Response): Promise => { + try { + const { id } = req.validated?.params as z.infer; + const adminId = req.user?.userId; + if (!adminId) { + ResponseUtil.unauthorized(res, 'Unauthorized'); + return; + } + await service.unfeatureVenue(id); + ResponseUtil.success(res, 'Venue removed from featured successfully'); + } catch (e) { + handleError(res, e, 'unfeatureVenue'); + } +}; + +export const getReviewsList = async (_req: Request, res: Response): Promise => { + try { + const venues = await service.getReviewsList(); + ResponseUtil.success(res, 'Review list retrieved successfully', { + count: venues.length, + venues, + }); + } catch (e) { + handleError(res, e, 'getReviewsList'); + } +}; + +export const approveReview = async (req: Request, res: Response): Promise => { + try { + const { id } = req.validated?.params as z.infer; + const adminId = req.user?.userId; + if (!adminId) { + ResponseUtil.unauthorized(res, 'Unauthorized'); + return; + } + const dto = req.validated?.body as z.infer | undefined; + const venue = await service.approveReview(id, adminId, dto?.note); + ResponseUtil.success(res, 'Review approved successfully', venue); + } catch (e) { + handleError(res, e, 'approveReview'); + } +}; + +export const rejectReview = async (req: Request, res: Response): Promise => { + try { + const { id } = req.validated?.params as z.infer; + const adminId = req.user?.userId; + if (!adminId) { + ResponseUtil.unauthorized(res, 'Unauthorized'); + return; + } + const dto = req.validated?.body as z.infer; + const venue = await service.rejectReview(id, adminId, dto.note); + ResponseUtil.success(res, 'Review rejected', venue); + } catch (e) { + handleError(res, e, 'rejectReview'); + } +}; + +export const extendDeadline = async (req: Request, res: Response): Promise => { + try { + const { id } = req.validated?.params as z.infer; + const { newDeadline } = req.validated?.body as z.infer; + const adminId = req.user?.userId; + if (!adminId) { + ResponseUtil.unauthorized(res, 'Unauthorized'); + return; + } + const venue = await service.extendVenueEditDeadline(id, adminId, newDeadline); + ResponseUtil.success(res, 'Edit deadline extended successfully', venue); + } catch (e) { + handleError(res, e, 'extendDeadline'); + } +}; diff --git a/server/src/modules/venue/venue.model.ts b/server/src/modules/venue/venue.model.ts new file mode 100644 index 0000000000..75664d93b5 --- /dev/null +++ b/server/src/modules/venue/venue.model.ts @@ -0,0 +1,245 @@ +import mongoose, { Schema } from 'mongoose'; +import { VenueStatusEnum, ReviewIntent } from '../../constants/venue.constants'; +import type { + IGeoPoint, + IFixedPackage, + IPricingRule, + IPricing, + IBlockedTime, + IRefundRule, + IContact, + ICancellation, + IVenue, +} from './venue.types'; + +const GeoPointSchema = new Schema( + { + type: { type: String, enum: ['Point'], required: true, default: 'Point' }, + coordinates: { + type: [Number], + required: true, + validate: { + validator: (v: number[]): boolean => v.length === 2, + message: 'coordinates must be [longitude, latitude]', + }, + }, + }, + { _id: false } +); + +const FixedPackageSchema = new Schema( + { + slotName: { type: String, required: true }, + startTime: { type: String, required: true }, + endTime: { type: String, required: true }, + price: { type: Number, required: true }, + }, + { _id: false } +); + +const PricingRuleSchema = new Schema( + { + fromTime: { type: String, required: true }, + toTime: { type: String, required: true }, + price: { type: Number, required: true }, + }, + { _id: false } +); + +const PricingSchema = new Schema( + { + pricingType: { type: String, enum: ['fixedPricing', 'timeBasedPricing'], required: true }, + basePrice: { type: Number, required: true, min: 0 }, + pricingRules: { type: [PricingRuleSchema], default: [] }, + }, + { _id: false } +); + +const BlockedTimeSchema = new Schema( + { + fromTime: { type: String, required: true }, + toTime: { type: String, required: true }, + }, + { _id: false } +); + +const RefundRuleSchema = new Schema( + { + daysBefore: { type: Number, required: true }, + refundPercentage: { type: Number, required: true }, + }, + { _id: false } +); + +const ContactSchema = new Schema( + { + name: { type: String, required: true, trim: true }, + phone: { type: String, required: true, trim: true }, + email: { type: String, trim: true, default: null }, + }, + { _id: false } +); + +const CancellationSchema = new Schema( + { + policy: { type: String, enum: ['refundable', 'nonRefundable'], required: true }, + refundType: { type: String, enum: ['fullRefund', 'timeBasedRefund'] }, + refundRules: { type: [RefundRuleSchema], default: [] }, + }, + { _id: false } +); + +const RejectionEntrySchema = new Schema( + { + reason: { type: String, required: true, maxlength: 500 }, + rejectedAt: { type: Date, default: Date.now }, + rejectedBy: { type: Schema.Types.ObjectId, ref: 'Users', required: true }, + submissionNumber: { type: Number, required: true }, + editDeadline: { type: Date, required: true }, + extendedAt: { type: Date }, + extendedBy: { type: Schema.Types.ObjectId, ref: 'Users' }, + originalDeadline: { type: Date }, + }, + { _id: true } +); + +const VenueSchema = new Schema( + { + // Basic Info + name: { type: String, required: true, trim: true, maxlength: 100 }, + description: { type: String, required: true, trim: true }, + venueType: { type: String, required: true }, + + // Location + address: { type: String, required: true, trim: true }, + city: { type: String, required: true, trim: true }, + district: { type: String, required: true, trim: true }, + pincode: { type: String, required: true, trim: true }, + location: { type: GeoPointSchema, required: false }, + googleMapsUrl: { type: String, trim: true, default: null }, + + // Space & Capacity + spaceAttributes: { type: [String], default: [] }, + seatingConfigurations: { type: [String], default: [] }, + maxCapacity: { type: Number }, + + // Booking Config + bookingType: { type: String, enum: ['fixedBooking', 'flexibleBooking'], required: true }, + fixedPackages: { type: [FixedPackageSchema], default: [] }, + workingDays: { type: [String], default: [] }, + workingHours: { + open: { type: String, required: false }, + close: { type: String, required: false }, + }, + blockedTimes: { type: [BlockedTimeSchema], default: [] }, + blockedDates: { type: [Date], default: [] }, + flexibleBooking: { + slotDuration: { type: Number, default: 60 }, + bufferTime: { type: Number, default: 0 }, + }, + + // Pricing + pricing: { type: PricingSchema, required: false }, + + // Amenities + amenities: { type: [String], default: [] }, + + // Media + coverImage: { type: String, required: true, trim: true }, + galleryImages: { type: [String], default: [] }, + + // Contact + contact: { type: ContactSchema, required: true }, + + // Cancellation & Refund + cancellation: { type: CancellationSchema, required: true }, + + // Ratings & Reviews + avgRating: { type: Number, default: 0, min: 0, max: 5 }, + reviewCount: { type: Number, default: 0, min: 0 }, + + pendingReview: { + type: { + intent: { type: String, enum: Object.values(ReviewIntent) }, + requestedAt: { type: Date }, + details: { + type: { + changedFields: [{ type: String }], + previousSnapshot: { type: Schema.Types.Mixed }, + reason: { type: String }, + }, + default: {}, + }, + }, + default: undefined, + }, + + inactivity: { + type: { + requestedAt: { type: Date }, + approvedAt: { type: Date }, + blockedAfterDate: { type: Date }, + inactiveAt: { type: Date }, + lastInactiveAt: { type: Date }, + withdrawalRequestedAt: { type: Date }, + }, + default: undefined, + }, + + temporaryBlockAfterDate: { type: Date, default: undefined }, + + // Operational + status: { + type: String, + enum: VenueStatusEnum as unknown as string[], + required: true, + default: 'Draft', + }, + ownerUserId: { type: Schema.Types.ObjectId, ref: 'Users', required: true }, + rejectionHistory: { + type: [RejectionEntrySchema], + default: [], + validate: { + validator: (v: unknown[]): boolean => v.length <= 10, + message: 'Maximum 10 submission attempts exceeded', + }, + }, + submissionCount: { type: Number, default: 0 }, + lastSubmittedAt: { type: Date }, + currentEditDeadline: { type: Date }, + suspensionReason: { type: String, default: null }, + + // Audit + createdBy: { type: Schema.Types.ObjectId, ref: 'Users', required: true }, + updatedBy: { type: Schema.Types.ObjectId, ref: 'Users', required: true }, + + // Soft delete + active: { type: Boolean, default: true }, + deleted: { type: Boolean, default: false }, + }, + { timestamps: true } +); + +// Indexes +VenueSchema.index( + { ownerUserId: 1, name: 1 }, + { + unique: true, + partialFilterExpression: { deleted: false }, + name: 'idx_owner_name_unique', + } +); + +// Admin: fetch all pending venues +VenueSchema.index({ status: 1, deleted: 1 }, { name: 'idx_status' }); + +// Owner: list own venues +VenueSchema.index({ ownerUserId: 1, status: 1, deleted: 1 }, { name: 'idx_owner_status' }); + +// Future geo-search readiness (2dsphere on the nested GeoJSON Point) +VenueSchema.index({ location: '2dsphere' }, { name: 'idx_location_geo' }); + +// For auto-suspend job query +VenueSchema.index({ status: 1, currentEditDeadline: 1 }, { name: 'idx_status_edit_deadline' }); + +export const VenueModel = mongoose.model('Venues', VenueSchema, 'Venues'); diff --git a/server/src/modules/venue/venue.ownership.ts b/server/src/modules/venue/venue.ownership.ts new file mode 100644 index 0000000000..69678f88ef --- /dev/null +++ b/server/src/modules/venue/venue.ownership.ts @@ -0,0 +1,29 @@ +import type { IVenue } from './venue.types'; +import { ForbiddenError, NotFoundError } from '../../utils/errors'; +import { findVenueById } from './venue.repository'; + +export function assertVenueOwner(venue: IVenue, userId: string): void { + if (venue.ownerUserId.toString() !== userId) { + throw new ForbiddenError('You do not have permission to modify this venue'); + } +} + +export async function requireOwnVenue(venueId: string, userId: string): Promise { + const venue = await findVenueById(venueId); + + if (!venue) { + throw new NotFoundError('Venue not found'); + } + + assertVenueOwner(venue, userId); + + const { isBannedForScope } = await import('../moderation/bannedUser.service.js'); + const isBanned = await isBannedForScope(userId, 'owner_dashboard', venueId); + if (isBanned) { + throw new ForbiddenError( + 'You are currently banned from accessing the owner dashboard for this venue.' + ); + } + + return venue; +} diff --git a/server/src/modules/venue/venue.repository.ts b/server/src/modules/venue/venue.repository.ts new file mode 100644 index 0000000000..89f76dae79 --- /dev/null +++ b/server/src/modules/venue/venue.repository.ts @@ -0,0 +1,459 @@ +import type { PaginationParams, PaginatedResponse } from '../../types/pagination.types'; +import { buildPaginationMeta } from '../../utils/paginationUtils'; +import type { + IVenue, + VenueStatus, + AdminVenueFilters, + CreateVenueData, + UpdateVenueData, + PublicVenueFilters, +} from './venue.types'; +import { VenueModel } from './venue.model'; +import { VenueDraftModel, type IVenueDraft } from './venueDraft.model'; +import { FeaturedVenueModel } from '../../models/featured-venue.model'; +import mongoose from 'mongoose'; + +// Helpers + +const toObjectId = (id: string): mongoose.Types.ObjectId => { + return new mongoose.Types.ObjectId(id); +}; + +function escapeRegex(str: string): string { + return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); +} + +export async function findActiveVenues(): Promise { + return VenueModel.find({ status: 'Approved', active: true, deleted: false }) + .sort({ createdAt: -1 }) + .select( + '_id name description venueType city district coverImage maxCapacity avgRating reviewCount flexibleBooking amenities pricing fixedPackages bookingType' + ) + .exec(); +} + +// Get lightweight venue pins for map view +export async function findVenuePinsInBounds(bbox?: { + swLng: number; + swLat: number; + neLng: number; + neLat: number; +}): Promise< + { + _id: string; + name: string; + location: { coordinates: [number, number] }; + coverImage: string; + avgRating: number; + }[] +> { + const query: Record = { + status: 'Approved', + active: true, + deleted: false, + location: { $exists: true }, + }; + + // If bbox is provided, use $geoWithin to filter by bounds + if (bbox) { + query.location = { + $geoWithin: { + $box: [ + [bbox.swLng, bbox.swLat], + [bbox.neLng, bbox.neLat], + ], + }, + }; + } + + return VenueModel.find(query) + .select('_id name location coverImage avgRating') + .lean() + .exec() as unknown as Promise< + { + _id: string; + name: string; + location: { coordinates: [number, number] }; + coverImage: string; + avgRating: number; + }[] + >; +} + +export async function findPaginatedActiveVenues( + paginationParams: PaginationParams, + filters?: PublicVenueFilters +): Promise> { + const { limit, skip } = paginationParams; + const conditions: Record[] = [ + { status: 'Approved', active: true, deleted: false }, + ]; + + if (filters?.searchTerm) { + const searchRegex = new RegExp(escapeRegex(filters.searchTerm), 'i'); + conditions.push({ + $or: [ + { name: searchRegex }, + { city: searchRegex }, + { district: searchRegex }, + { description: searchRegex }, + ], + }); + } + + if (filters?.minPrice !== undefined || filters?.maxPrice !== undefined) { + const priceCondition: { $gte?: number; $lte?: number } = {}; + if (filters.minPrice !== undefined) priceCondition.$gte = filters.minPrice; + if (filters.maxPrice !== undefined) priceCondition.$lte = filters.maxPrice; + + conditions.push({ + $or: [ + { 'pricing.basePrice': priceCondition }, + { 'pricing.pricingRules.price': priceCondition }, + { 'fixedPackages.price': priceCondition }, + ], + }); + } + + if (filters?.venueType && filters.venueType.length > 0) { + conditions.push({ venueType: { $in: filters.venueType } }); + } + + if (filters?.district) { + conditions.push({ + district: { $regex: new RegExp(`^${escapeRegex(filters.district)}$`, 'i') }, + }); + } + + if (filters?.capacity) { + conditions.push({ maxCapacity: { $gte: filters.capacity } }); + } + + if (filters?.spaceAttributes && filters.spaceAttributes.length > 0) { + conditions.push({ spaceAttributes: { $in: filters.spaceAttributes } }); + } + + if (filters?.seatingConfigurations && filters.seatingConfigurations.length > 0) { + conditions.push({ seatingConfigurations: { $in: filters.seatingConfigurations } }); + } + + if (filters?.amenities && filters.amenities.length > 0) { + conditions.push({ amenities: { $all: filters.amenities } }); + } + + // Geospatial: $geoWithin/$centerSphere for composability with other filters + if (filters?.lat !== undefined && filters.lng !== undefined) { + const radiusKm = filters.radiusKm ?? 25; + const radiusRadians = radiusKm / 6378.1; // Earth's mean radius in km + + conditions.push({ + location: { + $geoWithin: { + $centerSphere: [[filters.lng, filters.lat], radiusRadians], + }, + }, + }); + } + + const query = { $and: conditions }; + + let sortOption: Record = { createdAt: -1, _id: -1 }; + if (filters?.sortBy) { + switch (filters.sortBy) { + case 'price-low': + sortOption = { 'pricing.basePrice': 1, _id: 1 }; + break; + case 'price-high': + sortOption = { 'pricing.basePrice': -1, _id: -1 }; + break; + case 'rating': + sortOption = { avgRating: -1, reviewCount: -1, _id: -1 }; + break; + case 'distance': + // For distance sorting, must use $near, which auto-sorts by distance + // This branch handles the special case where distance-sort is requested + sortOption = { createdAt: -1, _id: -1 }; // Fallback; prefer lat+lng sorting + break; + default: + sortOption = { createdAt: -1, _id: -1 }; + break; + } + } + + const [venues, total] = await Promise.all([ + VenueModel.find(query) + .sort(sortOption) + .skip(skip) + .limit(limit) + .select( + '_id name description venueType city district coverImage maxCapacity avgRating reviewCount flexibleBooking amenities pricing fixedPackages bookingType' + ) + .exec(), + VenueModel.countDocuments(query).exec(), + ]); + + return { + venues, + pagination: buildPaginationMeta(total, paginationParams), + }; +} + +// Read Operations +export async function findVenueById( + venueId: string, + session?: mongoose.ClientSession +): Promise { + const query = VenueModel.findOne({ _id: toObjectId(venueId), deleted: false }); + if (session) query.session(session); + return query.exec(); +} + +// Check if an active venue with this name already exists for this owner +export async function existsByOwnerAndName( + ownerUserId: string, + name: string, + excludeVenueId?: string +): Promise { + const query: Record = { + ownerUserId: toObjectId(ownerUserId), + name: { $regex: new RegExp(`^${escapeRegex(name)}$`, 'i') }, + deleted: false, + }; + + if (excludeVenueId) { + query._id = { $ne: toObjectId(excludeVenueId) }; + } + + const count = await VenueModel.countDocuments(query).exec(); + return count > 0; +} + +export async function findVenueNameAndOwner( + venueId: string +): Promise<{ name: string; ownerUserId: mongoose.Types.ObjectId } | null> { + return VenueModel.findById(venueId).select('name ownerUserId').lean().exec(); +} + +export async function venueExists(venueId: string): Promise { + const exists = await VenueModel.exists({ _id: venueId, deleted: false }).exec(); + return exists !== null; +} + +export async function findVenuesByIds( + venueIds: string[] +): Promise<{ _id: mongoose.Types.ObjectId }[]> { + return VenueModel.find({ _id: { $in: venueIds }, deleted: false }) + .select('_id') + .lean() + .exec(); +} + +export async function findMyVenuesProjected( + ownerUserId: string +): Promise< + (Pick< + IVenue, + | '_id' + | 'name' + | 'city' + | 'district' + | 'venueType' + | 'coverImage' + | 'status' + | 'rejectionHistory' + | 'submissionCount' + | 'currentEditDeadline' + | 'suspensionReason' + | 'createdAt' + > & { rejectionReason?: string; isFeatured?: boolean })[] +> { + const [venues, featuredDocs] = await Promise.all([ + VenueModel.find( + { ownerUserId: toObjectId(ownerUserId), deleted: false }, + { + _id: 1, + name: 1, + city: 1, + district: 1, + venueType: 1, + coverImage: 1, + status: 1, + rejectionReason: 1, + rejectionHistory: 1, + submissionCount: 1, + currentEditDeadline: 1, + suspensionReason: 1, + createdAt: 1, + } + ) + .sort({ createdAt: -1 }) + .lean() + .exec(), + FeaturedVenueModel.find().select('venueId').lean().exec(), + ]); + + const featuredSet = new Set(featuredDocs.map((f) => f.venueId.toString())); + return venues.map((v) => ({ + ...v, + isFeatured: featuredSet.has(v._id.toString()), + })); +} + +// Admin +export async function findPendingVenues(): Promise { + return VenueModel.find({ + status: 'PendingReview', + deleted: false, + }) + .sort({ createdAt: 1 }) + .exec(); +} + +// Admin +export async function findAllVenues( + filters: AdminVenueFilters +): Promise> { + const { status, city, page, limit } = filters; + const skip = (page - 1) * limit; + + const query: Record = { deleted: false }; + if (status) query.status = status; + if (city) query.city = { $regex: new RegExp(`^${escapeRegex(city)}$`, 'i') }; + + const [rawVenues, totalCount, featuredDocs] = await Promise.all([ + VenueModel.find(query) + .sort({ createdAt: -1, _id: -1 }) + .skip(skip) + .limit(limit) + .populate('ownerUserId', 'username email') + .lean() + .exec(), + VenueModel.countDocuments(query).exec(), + FeaturedVenueModel.find().select('venueId').lean().exec(), + ]); + + const featuredSet = new Set(featuredDocs.map((f) => f.venueId.toString())); + + const venues = rawVenues.map((v) => ({ + ...v, + isActive: v.status === 'Approved', + isFeatured: featuredSet.has(v._id.toString()), + })) as unknown as IVenue[]; + + return { + venues, + pagination: buildPaginationMeta(totalCount, { page, limit, skip, sort: '-createdAt' }), + }; +} + +// Write Operations +export async function createVenue(data: CreateVenueData): Promise { + const venue = new VenueModel(data); + return venue.save(); +} + +// Draft Operations +export async function upsertDraft( + userId: string, + step: number, + formValues: Record +): Promise { + return VenueDraftModel.findOneAndUpdate( + { userId: toObjectId(userId) }, + { $set: { step, formValues } }, + { new: true, upsert: true } + ).exec(); +} + +export async function getDraft(userId: string): Promise { + return VenueDraftModel.findOne({ userId: toObjectId(userId) }).exec(); +} + +export async function deleteDraft(userId: string): Promise { + await VenueDraftModel.deleteOne({ userId: toObjectId(userId) }).exec(); +} + +export async function updateVenue(venueId: string, patch: UpdateVenueData): Promise { + return VenueModel.findOneAndUpdate( + { _id: toObjectId(venueId), deleted: false }, + { $set: patch }, + { new: true, runValidators: true } + ).exec(); +} + +export async function softDeleteVenue(venueId: string, updatedBy: string): Promise { + const result = await VenueModel.updateOne( + { _id: toObjectId(venueId), deleted: false }, + { + $set: { + deleted: true, + active: false, + updatedBy: toObjectId(updatedBy), + }, + } + ).exec(); + + return result.modifiedCount > 0; +} + +// State Machine Operations +export async function updateVenueStatus( + venueId: string, + newStatus: VenueStatus, + updatedBy: string, + extraFields?: Partial +): Promise { + const patch: mongoose.UpdateQuery = { + $set: { + status: newStatus, + updatedBy: toObjectId(updatedBy), + ...(extraFields ?? {}), + }, + }; + + if (newStatus !== 'Rejected') { + patch.$unset = { ...patch.$unset, rejectionReason: '' }; + } + + if (newStatus !== 'Suspended') { + patch.$unset = { ...patch.$unset, suspensionReason: '' }; + } + + return VenueModel.findOneAndUpdate({ _id: toObjectId(venueId), deleted: false }, patch, { + new: true, + runValidators: true, + }).exec(); +} + +export async function upsertFeaturedVenue( + venueId: string, + durationDays: number | null +): Promise { + const expiresAt = durationDays ? new Date(Date.now() + durationDays * 24 * 60 * 60 * 1000) : null; + + await FeaturedVenueModel.findOneAndUpdate( + { venueId: toObjectId(venueId) }, + { $set: { expiresAt } }, + { upsert: true, new: true } + ).exec(); +} + +export async function getFeaturedVenues(): Promise< + (IVenue & { featuredExpiresAt?: Date | null })[] +> { + const featured = await FeaturedVenueModel.find() + .populate<{ venueId: IVenue }>('venueId') + .lean() + .exec(); + + return featured + .filter((f) => Boolean(f.venueId) && f.venueId.status === 'Approved') + .map((f) => ({ + ...f.venueId, + featuredExpiresAt: f.expiresAt, + })) as (IVenue & { featuredExpiresAt?: Date | null })[]; +} + +export async function removeFeaturedVenue(venueId: string): Promise { + await FeaturedVenueModel.findOneAndDelete({ venueId: toObjectId(venueId) }).exec(); +} diff --git a/server/src/modules/venue/venue.router.ts b/server/src/modules/venue/venue.router.ts new file mode 100644 index 0000000000..5ff17e8a00 --- /dev/null +++ b/server/src/modules/venue/venue.router.ts @@ -0,0 +1,922 @@ +import { Router } from 'express'; +import { verifyAccessToken, verifyAccessTokenOptional } from '../../middlewares/auth.middleware'; +import { requirePermission, requireRole } from '../../middlewares/rbac.middleware'; +import { PERMISSIONS as P } from '../../constants/permissions'; +import * as controller from './venue.controller'; +import { + validateBody, + validateParams, + validateQuery, +} from '../../middlewares/validation.middleware'; +import * as validator from './venue.validator'; +import rateLimit from 'express-rate-limit'; +import { paginationMiddleware } from '../../middlewares/pagination.middleware'; +import { idempotencyMiddleware } from '../../middlewares/idempotency.middleware'; + +const router: Router = Router(); + +const uploadSignatureLimiter = rateLimit({ + windowMs: 30 * 60 * 1000, + max: 10, + message: 'Too many upload requests, please try again later', +}); + +/** + * @openapi + * /venues/upload-signature: + * get: + * tags: [Venues] + * summary: Get a Cloudinary upload signature for direct browser uploads + * security: + * - bearerAuth: [] + * responses: + * 200: + * description: Cloudinary signature and upload parameters + * content: + * application/json: + * schema: + * allOf: + * - $ref: '#/components/schemas/SuccessResponse' + * - type: object + * properties: + * data: + * type: object + * properties: + * signature: + * type: string + * timestamp: + * type: integer + * cloudName: + * type: string + * apiKey: + * type: string + * 401: + * description: Not authenticated + * 403: + * description: Insufficient permissions + * 429: + * description: Too many upload signature requests + */ +router + .route('/upload-signature') + .get(verifyAccessToken, uploadSignatureLimiter, controller.getUploadSignature); + +/** + * @openapi + * /venues: + * post: + * tags: [Venues] + * summary: Create a new venue + * security: + * - bearerAuth: [] + * requestBody: + * required: true + * content: + * application/json: + * schema: + * type: object + * description: Venue creation payload — validated by createVenueSchema + * responses: + * 201: + * description: Venue created successfully + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/SuccessResponse' + * 400: + * description: Validation error + * 401: + * description: Not authenticated + * 403: + * description: Insufficient permissions + * get: + * tags: [Venues] + * summary: List active venues (public, paginated, filterable) + * parameters: + * - in: query + * name: page + * schema: + * type: integer + * default: 1 + * - in: query + * name: limit + * schema: + * type: integer + * default: 20 + * - in: query + * name: searchTerm + * schema: + * type: string + * description: Search venues by name or description + * - in: query + * name: minPrice + * schema: + * type: number + * - in: query + * name: maxPrice + * schema: + * type: number + * - in: query + * name: venueType + * schema: + * type: string + * description: Filter by venue type + * - in: query + * name: district + * schema: + * type: string + * description: Filter by Kerala district + * - in: query + * name: capacity + * schema: + * type: integer + * description: Minimum capacity required + * - in: query + * name: spaceAttributes + * schema: + * type: string + * description: Comma-separated or single space attribute + * - in: query + * name: seatingConfigurations + * schema: + * type: string + * description: Comma-separated or single seating configuration + * - in: query + * name: amenities + * schema: + * type: string + * description: Comma-separated or single amenity + * - in: query + * name: lat + * schema: + * type: number + * description: Latitude for geo-search (must be paired with lng) + * - in: query + * name: lng + * schema: + * type: number + * description: Longitude for geo-search (must be paired with lat) + * - in: query + * name: radiusKm + * schema: + * type: number + * default: 25 + * description: Search radius in km for geo queries + * - in: query + * name: sortBy + * schema: + * type: string + * enum: [price-low, price-high, rating, distance] + * responses: + * 200: + * description: Paginated list of active venues + * content: + * application/json: + * schema: + * allOf: + * - $ref: '#/components/schemas/SuccessResponse' + * - type: object + * properties: + * meta: + * $ref: '#/components/schemas/PaginatedMeta' + */ +router + .route('/') + .post(verifyAccessToken, validateBody(validator.createVenueSchema), controller.createVenue) + .get( + verifyAccessTokenOptional, + validateQuery(validator.publicVenueFiltersSchema), + paginationMiddleware(), + controller.getPaginatedActiveVenues + ); + +/** + * @openapi + * /venues/my-venues: + * get: + * tags: [Venues] + * summary: List the authenticated owner's venues + * security: + * - bearerAuth: [] + * responses: + * 200: + * description: Array of venues owned by the current user + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/SuccessResponse' + * 401: + * description: Not authenticated + * 403: + * description: Insufficient permissions + */ +router + .route('/my-venues') + .get(verifyAccessToken, requirePermission(P.venues.read), controller.getMyVenues); + +/** + * @openapi + * /venues/pins: + * get: + * tags: [Venues] + * summary: Get lightweight venue pins for map view (geospatial filtering) + * parameters: + * - in: query + * name: swLng + * schema: + * type: number + * description: Southwest longitude (bounding box) + * - in: query + * name: swLat + * schema: + * type: number + * description: Southwest latitude + * - in: query + * name: neLng + * schema: + * type: number + * description: Northeast longitude + * - in: query + * name: neLat + * schema: + * type: number + * description: Northeast latitude + * responses: + * 200: + * description: Array of venue pins with location and rating + * content: + * application/json: + * schema: + * allOf: + * - $ref: '#/components/schemas/SuccessResponse' + * - type: object + * properties: + * data: + * type: array + * items: + * type: object + */ +router.route('/pins').get(controller.getVenuePins); + +/** + * @openapi + * /venues/draft: + * put: + * tags: [Venues] + * summary: Create or update the owner's draft venue + * security: + * - bearerAuth: [] + * requestBody: + * required: true + * content: + * application/json: + * schema: + * type: object + * description: Partial venue payload for draft persistence + * responses: + * 200: + * description: Draft saved + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/SuccessResponse' + * 401: + * description: Not authenticated + * get: + * tags: [Venues] + * summary: Get the owner's current draft venue + * security: + * - bearerAuth: [] + * responses: + * 200: + * description: Draft venue object + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/SuccessResponse' + * 401: + * description: Not authenticated + * 404: + * description: No draft found + */ +router + .route('/draft') + .put(verifyAccessToken, controller.upsertDraft) + .get(verifyAccessToken, requirePermission(P.venues.read), controller.getMyDraft); + +/** + * @openapi + * /venues/pending: + * get: + * tags: [Venues] + * summary: List venues pending admin approval (admin only) + * security: + * - bearerAuth: [] + * responses: + * 200: + * description: Array of pending venues + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/SuccessResponse' + * 401: + * description: Not authenticated + * 403: + * description: Admin role required + */ +router + .route('/pending') + .get( + verifyAccessToken, + requireRole('admin'), + requirePermission(P.venues.activate), + controller.getPendingVenues + ); + +/** + * @openapi + * /venues/reviews: + * get: + * tags: [Venues] + * summary: List all venues with pending reviews grouped by intent (admin only) + * security: + * - bearerAuth: [] + * responses: + * 200: + * description: Array of venues with pending reviews + * 401: + * description: Not authenticated + * 403: + * description: Admin role required + */ +router + .route('/reviews') + .get( + verifyAccessToken, + requireRole('admin'), + requirePermission(P.venues.activate), + controller.getReviewsList + ); + +/** + * @openapi + * /venues/all: + * get: + * tags: [Venues] + * summary: List all venues across all statuses (admin only, paginated) + * security: + * - bearerAuth: [] + * parameters: + * - in: query + * name: status + * schema: + * type: string + * enum: [draft, pending, active, rejected, deactivated] + * - in: query + * name: page + * schema: + * type: integer + * default: 1 + * - in: query + * name: limit + * schema: + * type: integer + * default: 20 + * responses: + * 200: + * description: Paginated list of all venues + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/SuccessResponse' + * 401: + * description: Not authenticated + * 403: + * description: Admin role required + */ +router + .route('/all') + .get( + verifyAccessToken, + requireRole('admin'), + requirePermission(P.venues.activate), + validateQuery(validator.adminVenueFiltersSchema), + paginationMiddleware(), + controller.getAllVenues + ); + +/** + * @openapi + * /venues/featured: + * get: + * tags: [Venues] + * summary: Get all featured venues (public) + * responses: + * 200: + * description: Array of featured venues + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/SuccessResponse' + */ +router.route('/featured').get(verifyAccessTokenOptional, controller.getFeaturedVenues); + +/** + * @openapi + * /venues/{id}: + * get: + * tags: [Venues] + * summary: Get a venue by ID (public) + * parameters: + * - in: path + * name: id + * required: true + * schema: + * type: string + * example: 64b1f2c3d4e5f6a7b8c9d0e1 + * responses: + * 200: + * description: Venue details + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/SuccessResponse' + * 400: + * description: Invalid venue ID format + * 404: + * description: Venue not found + * put: + * tags: [Venues] + * summary: Update a venue (owner) + * security: + * - bearerAuth: [] + * parameters: + * - in: path + * name: id + * required: true + * schema: + * type: string + * requestBody: + * required: true + * content: + * application/json: + * schema: + * type: object + * description: Fields to update — validated by updateVenueSchema + * responses: + * 200: + * description: Venue updated + * 400: + * description: Validation error + * 401: + * description: Not authenticated + * 403: + * description: Insufficient permissions + * 404: + * description: Venue not found + * delete: + * tags: [Venues] + * summary: Delete a venue (owner) + * security: + * - bearerAuth: [] + * parameters: + * - in: path + * name: id + * required: true + * schema: + * type: string + * responses: + * 200: + * description: Venue deleted + * 401: + * description: Not authenticated + * 403: + * description: Insufficient permissions + * 404: + * description: Venue not found + */ +router + .route('/:id') + .get( + verifyAccessTokenOptional, + validateParams(validator.venueIdParamSchema), + controller.getVenueById + ) + .put( + verifyAccessToken, + idempotencyMiddleware(), + requirePermission(P.venues.update), + validateParams(validator.venueIdParamSchema), + validateBody(validator.updateVenueSchema), + controller.updateVenue + ) + .delete( + verifyAccessToken, + requirePermission(P.venues.delete), + validateParams(validator.venueIdParamSchema), + controller.deleteVenue + ); + +/** + * @openapi + * /venues/{id}/submit: + * post: + * tags: [Venues] + * summary: Submit a venue for admin review + * security: + * - bearerAuth: [] + * parameters: + * - in: path + * name: id + * required: true + * schema: + * type: string + * responses: + * 200: + * description: Venue submitted for review + * 401: + * description: Not authenticated + * 403: + * description: Insufficient permissions + * 404: + * description: Venue not found + */ +router + .route('/:id/submit') + .post( + verifyAccessToken, + requirePermission(P.venues.update), + validateParams(validator.venueIdParamSchema), + controller.submitVenue + ); + +/** + * @openapi + * /venues/{id}/approve: + * post: + * tags: [Venues] + * summary: Approve a venue (admin only) + * security: + * - bearerAuth: [] + * parameters: + * - in: path + * name: id + * required: true + * schema: + * type: string + * responses: + * 200: + * description: Venue approved and set to active + * 401: + * description: Not authenticated + * 403: + * description: Admin role required + * 404: + * description: Venue not found + */ +router + .route('/:id/approve') + .post( + verifyAccessToken, + requireRole('admin'), + requirePermission(P.venues.activate), + validateParams(validator.venueIdParamSchema), + controller.approveVenue + ); + +/** + * @openapi + * /venues/{id}/reject: + * post: + * tags: [Venues] + * summary: Reject a venue with a reason (admin only) + * security: + * - bearerAuth: [] + * parameters: + * - in: path + * name: id + * required: true + * schema: + * type: string + * requestBody: + * required: true + * content: + * application/json: + * schema: + * type: object + * required: [reason] + * properties: + * reason: + * type: string + * example: Images do not meet quality standards + * responses: + * 200: + * description: Venue rejected + * 400: + * description: Rejection reason required + * 401: + * description: Not authenticated + * 403: + * description: Admin role required + * 404: + * description: Venue not found + */ +router + .route('/:id/reject') + .post( + verifyAccessToken, + requireRole('admin'), + requirePermission(P.venues.deactivate), + validateParams(validator.venueIdParamSchema), + validateBody(validator.rejectVenueSchema), + controller.rejectVenue + ); + +/** + * @openapi + * /venues/{id}/unsuspend: + * post: + * tags: [Venues] + * summary: Activate a venue (admin only) + * security: + * - bearerAuth: [] + * parameters: + * - in: path + * name: id + * required: true + * schema: + * type: string + * responses: + * 200: + * description: Venue activated + * 401: + * description: Not authenticated + * 403: + * description: Admin role required + * 404: + * description: Venue not found + */ +router + .route('/:id/unsuspend') + .post( + verifyAccessToken, + requireRole('admin'), + requirePermission(P.venues.activate), + validateParams(validator.venueIdParamSchema), + controller.unsuspendVenue + ); + +/** + * @openapi + * /venues/{id}/deactivate: + * post: + * tags: [Venues] + * summary: Deactivate a venue (admin only) + * security: + * - bearerAuth: [] + * parameters: + * - in: path + * name: id + * required: true + * schema: + * type: string + * responses: + * 200: + * description: Venue deactivated + * 401: + * description: Not authenticated + * 403: + * description: Admin role required + * 404: + * description: Venue not found + */ +router + .route('/:id/deactivate') + .post( + verifyAccessToken, + requireRole('admin'), + requirePermission(P.venues.deactivate), + validateParams(validator.venueIdParamSchema), + validateBody(validator.suspendVenueSchema), + controller.suspendVenue + ); + +/** + * @openapi + * /venues/{id}/feature: + * post: + * tags: [Venues] + * summary: Feature a venue (admin only) + * security: + * - bearerAuth: [] + * parameters: + * - in: path + * name: id + * required: true + * schema: + * type: string + * requestBody: + * required: true + * content: + * application/json: + * schema: + * type: object + * required: [duration] + * properties: + * duration: + * type: integer + * nullable: true + * description: Duration in days to feature, or null for indefinite + * responses: + * 200: + * description: Venue featured status updated + * 401: + * description: Not authenticated + * 403: + * description: Admin role required + * 404: + * description: Venue not found + * 409: + * description: Only approved venues can be featured + * delete: + * tags: [Venues] + * summary: Unfeature a venue (admin only) + * security: + * - bearerAuth: [] + * parameters: + * - in: path + * name: id + * required: true + * schema: + * type: string + * responses: + * 200: + * description: Venue removed from featured list + * 401: + * description: Not authenticated + * 403: + * description: Admin role required + * 404: + * description: Venue not found + */ +router + .route('/:id/feature') + .post( + verifyAccessToken, + requireRole('admin'), + requirePermission(P.venues.activate), + validateParams(validator.venueIdParamSchema), + validateBody(validator.featureVenueSchema), + controller.featureVenue + ) + .delete( + verifyAccessToken, + requireRole('admin'), + requirePermission(P.venues.activate), + validateParams(validator.venueIdParamSchema), + controller.unfeatureVenue + ); + +/** + * @openapi + * /venues/{id}/extend-deadline: + * post: + * tags: [Venues] + * summary: Extend edit deadline for a rejected venue (superAdmin only) + * security: + * - bearerAuth: [] + * parameters: + * - in: path + * name: id + * required: true + * schema: + * type: string + * requestBody: + * required: true + * content: + * application/json: + * schema: + * type: object + * required: [newDeadline] + * properties: + * newDeadline: + * type: string + * format: date-time + * description: New deadline for editing (must be within 120 days) + * responses: + * 200: + * description: Edit deadline extended successfully + * 400: + * description: Invalid deadline + * 401: + * description: Not authenticated + * 403: + * description: SuperAdmin role required + * 404: + * description: Venue not found + */ +router + .route('/:id/extend-deadline') + .post( + verifyAccessToken, + requireRole('superAdmin'), + validateParams(validator.venueIdParamSchema), + validateBody(validator.extendVenueDeadlineSchema), + controller.extendDeadline + ); + +/** + * @openapi + * /venues/{id}/approve-review: + * post: + * tags: [Venues] + * summary: Approve a pending review (admin only) + * security: + * - bearerAuth: [] + * parameters: + * - in: path + * name: id + * required: true + * schema: + * type: string + * requestBody: + * content: + * application/json: + * schema: + * type: object + * properties: + * note: + * type: string + * responses: + * 200: + * description: Review approved + * 401: + * description: Not authenticated + * 403: + * description: Admin role required + * 404: + * description: Venue not found + * 409: + * description: No pending review + */ +router + .route('/:id/approve-review') + .post( + verifyAccessToken, + requireRole('admin'), + requirePermission(P.venues.activate), + validateParams(validator.venueIdParamSchema), + validateBody(validator.approveReviewSchema), + idempotencyMiddleware(), + controller.approveReview + ); + +/** + * @openapi + * /venues/{id}/reject-review: + * post: + * tags: [Venues] + * summary: Reject a pending review (admin only) + * security: + * - bearerAuth: [] + * parameters: + * - in: path + * name: id + * required: true + * schema: + * type: string + * requestBody: + * required: true + * content: + * application/json: + * schema: + * type: object + * required: [note] + * properties: + * note: + * type: string + * responses: + * 200: + * description: Review rejected + * 401: + * description: Not authenticated + * 403: + * description: Admin role required + * 404: + * description: Venue not found + * 409: + * description: No pending review + */ +router + .route('/:id/reject-review') + .post( + verifyAccessToken, + requireRole('admin'), + requirePermission(P.venues.deactivate), + validateParams(validator.venueIdParamSchema), + validateBody(validator.rejectReviewSchema), + idempotencyMiddleware(), + controller.rejectReview + ); + +export { router as venueRouter }; diff --git a/server/src/modules/venue/venue.service.ts b/server/src/modules/venue/venue.service.ts new file mode 100644 index 0000000000..b67f9815e1 --- /dev/null +++ b/server/src/modules/venue/venue.service.ts @@ -0,0 +1,931 @@ +import * as repo from './venue.repository'; +import type { PaginationParams, PaginatedResponse } from '../../types/pagination.types'; +import type { + CreateVenueData, + UpdateVenueData, + AdminVenueFilters, + IVenue, + PublicVenueFilters, +} from './venue.types'; +import type { IVenueDraft } from './venueDraft.model'; +import { requireOwnVenue } from './venue.ownership'; +import * as workflow from './venue.workflow'; +import { NotFoundError, ConflictError, ValidationError, WorkflowError } from '../../utils/errors'; +import type { + CreateVenueDTO, + UpdateVenueDTO, + RejectVenueDTO, + SuspendVenueDTO, + AdminVenueFiltersDTO, +} from './venue.validator'; +import { VenueFields, ReviewIntent } from '../../constants/venue.constants'; +import { VENUE_CONSTANTS } from '../../constants/venue.constants'; +import { VenueModel } from './venue.model'; +import { RoleModel } from '../../models/role.model'; +import { findUserEmailById } from '../user/user.repository'; +import * as authRepo from '../auth/auth.repository'; +import { getUserRole } from '../../services/roles.service'; +import { enqueueEmailTask } from '../../services/email.repository'; +import { EmailIntent, EmailTaskStatus } from '../../constants/email.constants'; +import mongoose from 'mongoose'; +import { logError, logWarn } from '../../utils/logger'; +import { BookingModel } from '../booking/models/booking.model'; +import { BookingStatus } from '../../constants/booking.constants'; + +// Google Maps URL Resolution & Transformation + +const SHORT_LINK_HOSTS = new Set(['goo.gl', 'maps.app.goo.gl']); + +const GOOGLE_MAPS_EMBED_HOSTS = new Set(['maps.google.com', 'www.google.com', 'google.com']); + +export async function resolveAndTransformGoogleMapsUrl( + inputUrl: string | undefined | null +): Promise { + if (!inputUrl) return null; + + try { + let workingUrl = inputUrl; + const parsed = new URL(workingUrl); + if (SHORT_LINK_HOSTS.has(parsed.hostname)) { + const response = await fetch(workingUrl, { + method: 'HEAD', + redirect: 'follow', + signal: AbortSignal.timeout(5_000), + }); + workingUrl = response.url; + } + + const resolved = new URL(workingUrl); + + // Step 2: Must be https and a known Google Maps domain + if (resolved.protocol !== 'https:' || !GOOGLE_MAPS_EMBED_HOSTS.has(resolved.hostname)) { + return null; + } + + // Step 3: Already an embed URL — return as-is + if (resolved.pathname.startsWith('/maps/embed')) { + return workingUrl; + } + + // Step 4: Extract a place search query from common share URL patterns + // Pattern: /maps/place//@lat,lng,... or /maps?q=... + const qParam = resolved.searchParams.get('q'); + const placeMatch = /\/maps\/place\/([^/]+)/.exec(resolved.pathname); + const coordMatch = /@(-?\d+\.\d+),(-?\d+\.\d+)/.exec(resolved.pathname); + + if (coordMatch) { + const lat = coordMatch[1]; + const lng = coordMatch[2]; + return `https://maps.google.com/maps?q=${lat},${lng}&output=embed&z=15`; + } + + if (qParam) { + return `https://maps.google.com/maps?q=${encodeURIComponent(qParam)}&output=embed&z=15`; + } + + if (placeMatch) { + const placeName = decodeURIComponent(placeMatch[1]); + return `https://maps.google.com/maps?q=${encodeURIComponent(placeName)}&output=embed&z=15`; + } + + return null; + } catch { + return null; + } +} + +export function sanitizeVenueDto( + dto: T, + currentBookingType?: 'fixedBooking' | 'flexibleBooking' +): T { + const bookingType = dto.bookingType ?? currentBookingType; + if (!bookingType) return dto; + + if (bookingType === 'fixedBooking') { + const { + flexibleBooking: _fb, + workingHours: _wh, + pricing: _pr, + blockedTimes: _bt, + ...rest + } = dto as Record; + return rest as T; + } + + const { fixedPackages: _fp, ...rest } = dto as Record; + return rest as T; +} + +async function assignOwnerRoleIfNeeded(userId: string): Promise { + const current = await getUserRole(userId); + + if (current && ['owner', 'admin', 'superAdmin'].includes(current.roleName)) { + return; + } + + const ownerRole = await RoleModel.findOne({ name: 'owner', active: true, deleted: false }) + .lean() + .exec(); + + if (!ownerRole) { + logError('assignOwnerRoleIfNeeded: owner role not found in DB — user not promoted', { + module: 'venue.service.ts/assignOwnerRoleIfNeeded', + userId, + }); + return; + } + + await authRepo.assignRoleToUser(new mongoose.Types.ObjectId(userId), ownerRole._id); +} + +export async function createVenue(userId: string, dto: CreateVenueDTO): Promise { + // Guard: Check for venue creation ban + const { isBannedForScope } = await import('../moderation/bannedUser.service.js'); + const isBanned = await isBannedForScope(userId, 'venue_creation'); + if (isBanned) { + throw new ConflictError('You are currently banned from creating new venues.'); + } + + const nameExists = await repo.existsByOwnerAndName(userId, dto.name); + if (nameExists) { + throw new ConflictError(`You already have a venue named "${dto.name}"`); + } + + const sanitizedDto = sanitizeVenueDto(dto); + + // Resolve and transform the Google Maps URL to a safe embed URL + const resolvedMapsUrl = await resolveAndTransformGoogleMapsUrl(sanitizedDto.googleMapsUrl); + + const now = new Date(); + const data = { + ...sanitizedDto, + googleMapsUrl: resolvedMapsUrl, + galleryImages: sanitizedDto.galleryImages ?? [], + ...(sanitizedDto.coordinates && { + location: { type: 'Point' as const, coordinates: sanitizedDto.coordinates }, + }), + ownerUserId: userId, + createdBy: userId, + updatedBy: userId, + status: 'PendingReview', + submissionCount: 1, + lastSubmittedAt: now, + } as unknown as CreateVenueData; + if (!dto.coordinates) delete (data as unknown as Record).location; + delete (data as unknown as Record).coordinates; + + const venue = await repo.createVenue(data); + + await assignOwnerRoleIfNeeded(userId); + await repo.deleteDraft(userId); + + return venue; +} + +export async function getActiveVenues(): Promise { + return repo.findActiveVenues(); +} + +export async function getPaginatedActiveVenues( + pagination: PaginationParams, + filters?: PublicVenueFilters +): Promise> { + return repo.findPaginatedActiveVenues(pagination, filters); +} + +export async function getVenuePins(bbox?: { + swLng: number; + swLat: number; + neLng: number; + neLat: number; +}): Promise< + { + _id: string; + name: string; + location: { coordinates: [number, number] }; + coverImage: string; + avgRating: number; + }[] +> { + return repo.findVenuePinsInBounds(bbox); +} + +export async function upsertDraft( + userId: string, + step: number, + formValues: Record +): Promise { + return repo.upsertDraft(userId, step, formValues); +} + +export async function getDraft(userId: string): Promise { + return repo.getDraft(userId); +} + +export async function getMyVenues( + userId: string +): Promise< + (Pick< + IVenue, + | '_id' + | 'name' + | 'city' + | 'district' + | 'venueType' + | 'coverImage' + | 'status' + | 'rejectionHistory' + | 'submissionCount' + | 'currentEditDeadline' + | 'suspensionReason' + | 'createdAt' + > & { rejectionReason?: string; isFeatured?: boolean })[] +> { + return repo.findMyVenuesProjected(userId); +} + +export async function getVenueById( + venueId: string, + requesterId?: string, + isPrivileged?: boolean +): Promise { + const venue = await repo.findVenueById(venueId); + + if (!venue) { + throw new NotFoundError('Venue not found'); + } + + const isOwner = requesterId !== undefined && venue.ownerUserId.toString() === requesterId; + if (venue.status !== 'Approved' && !isPrivileged && !isOwner) { + throw new NotFoundError('Venue not found'); + } + + return venue; +} + +const CRITICAL_FIELDS = new Set([ + 'name', + 'contact', + 'address', + 'city', + 'district', + 'pincode', + 'venueType', + 'bookingType', +]); + +function buildPatch( + _venue: IVenue, + dto: Record, + userId: string, + excludeFields?: string[] +): Record { + const patch: Record = { updatedBy: userId }; + for (const key of VenueFields) { + if (excludeFields?.includes(key)) continue; + if (dto[key] !== undefined) { + patch[key] = dto[key]; + } + } + if (dto.coordinates !== undefined) { + patch.location = { type: 'Point', coordinates: dto.coordinates }; + } + return patch; +} + +export async function updateVenue( + venueId: string, + userId: string, + dto: UpdateVenueDTO +): Promise { + const venue = await requireOwnVenue(venueId, userId); + + // Optimistic concurrency check + if (dto.expectedVersion !== undefined && venue.__v !== dto.expectedVersion) { + throw new ConflictError( + 'Venue has been modified by another request. Please reload and try again.' + ); + } + + if (dto.name && dto.name !== venue.name) { + const nameExists = await repo.existsByOwnerAndName(userId, dto.name, venueId); + if (nameExists) { + throw new ConflictError(`You already have a venue named "${dto.name}"`); + } + } + + const sanitizedDto = sanitizeVenueDto(dto, venue.bookingType); + + // Resolve and transform the Google Maps URL to a safe embed URL if provided + if (sanitizedDto.googleMapsUrl !== undefined) { + sanitizedDto.googleMapsUrl = + (await resolveAndTransformGoogleMapsUrl(sanitizedDto.googleMapsUrl)) ?? undefined; + } + + // Status-gated dispatch + if (venue.status === 'Draft' || venue.status === 'Rejected') { + const patch = buildPatch(venue, sanitizedDto, userId); + const updated = await repo.updateVenue(venueId, patch as unknown as UpdateVenueData); + if (!updated) throw new NotFoundError('Venue not found'); + return updated; + } + + if (venue.status === 'Approved' || venue.status === 'Inactive') { + const dtoAny = sanitizedDto as unknown as Record; + const venueAny = venue as unknown as Record; + const changedCritical: string[] = []; + const snapshot: Record = {}; + + for (const field of CRITICAL_FIELDS) { + if (dtoAny[field] !== undefined && dtoAny[field] !== venueAny[field]) { + changedCritical.push(field); + snapshot[field] = venueAny[field]; + } + } + + if (changedCritical.length > 0) { + // Apply all fields immediately (Option B — snapshot is for rollback on reject) + const patch = buildPatch(venue, dtoAny, userId); + const updated = await repo.updateVenue(venueId, patch as UpdateVenueData); + if (!updated) throw new NotFoundError('Venue not found'); + + // Mark pending review with snapshot + await VenueModel.findByIdAndUpdate(venueId, { + $set: { + 'pendingReview.intent': ReviewIntent.VENUE_EDIT, + 'pendingReview.requestedAt': new Date(), + 'pendingReview.details.changedFields': changedCritical, + 'pendingReview.details.previousSnapshot': snapshot, + }, + }).exec(); + + // Re-fetch to include pendingReview + const withReview = await repo.findVenueById(venueId); + if (!withReview) throw new NotFoundError('Venue not found'); + return withReview; + } + + // Only non-critical fields — apply full patch immediately + const patch = buildPatch(venue, dtoAny, userId); + const updated = await repo.updateVenue(venueId, patch as unknown as UpdateVenueData); + if (!updated) throw new NotFoundError('Venue not found'); + return updated; + } + + throw new WorkflowError(venue.status, 'edit'); +} + +export async function deleteVenue(venueId: string, userId: string): Promise { + const venue = await requireOwnVenue(venueId, userId); + workflow.canDelete(venue); + await repo.softDeleteVenue(venueId, userId); +} + +export async function submitVenue(venueId: string, userId: string): Promise { + const session = await mongoose.startSession(); + session.startTransaction(); + + try { + const venue = await repo.findVenueById(venueId, session); + if (!venue) throw new NotFoundError('Venue not found'); + + // Ownership check + if (venue.ownerUserId.toString() !== userId) { + throw new ConflictError('Not authorized to submit this venue'); + } + + // Status must be Rejected + if (venue.status !== 'Rejected') { + throw new ValidationError('Only rejected venues can be resubmitted'); + } + + // Check max attempts + if (venue.submissionCount >= VENUE_CONSTANTS.MAX_SUBMISSION_ATTEMPTS) { + throw new ValidationError( + `Maximum submission attempts (${String(VENUE_CONSTANTS.MAX_SUBMISSION_ATTEMPTS)}) exceeded` + ); + } + + // Check edit deadline (race condition protection) + const now = new Date(); + if (venue.currentEditDeadline && venue.currentEditDeadline < now) { + throw new ValidationError('Edit window expired. Venue has been auto-suspended.'); + } + + // Validate all required fields present + workflow.canSubmit(venue); + + // Atomic update: Rejected -> PendingReview, clear deadline, increment count + const updated = await VenueModel.findByIdAndUpdate( + venueId, + { + $set: { + status: 'PendingReview', + currentEditDeadline: null, + updatedBy: new mongoose.Types.ObjectId(userId), + lastSubmittedAt: now, + }, + $inc: { submissionCount: 1 }, + }, + { new: true, session } + ).exec(); + + if (!updated) throw new NotFoundError('Venue not found'); + + await session.commitTransaction(); + return updated; + } catch (err) { + await session.abortTransaction(); + throw err; + } finally { + await session.endSession(); + } +} + +// Admin Operations + +export async function getPendingVenues(): Promise { + return repo.findPendingVenues(); +} + +export async function getAllVenues( + filters: AdminVenueFiltersDTO +): Promise> { + const repoFilters: AdminVenueFilters = { + status: filters.status, + city: filters.city, + page: filters.page, + limit: filters.limit, + }; + return repo.findAllVenues(repoFilters); +} + +export async function approveVenue(venueId: string, adminId: string): Promise { + const venue = await repo.findVenueById(venueId); + if (!venue) throw new NotFoundError('Venue not found'); + + workflow.canApprove(venue); + + const updated = await repo.updateVenueStatus(venueId, 'Approved', adminId); + if (!updated) throw new NotFoundError('Venue not found'); + + const ownerEmail = await findUserEmailById(venue.ownerUserId.toString()); + if (ownerEmail) { + try { + await enqueueEmailTask( + ownerEmail, + EmailIntent.VENUE_APPROVED, + `Your Venue "${venue.name}" has been Approved!`, + EmailTaskStatus.PENDING, + { venueName: venue.name } + ); + } catch (err) { + logWarn('Failed to queue venue approved email', { + module: 'venue.service.ts/approveVenue', + venueId, + error: (err as Error).message, + }); + } + } + + return updated; +} + +export async function rejectVenue( + venueId: string, + adminId: string, + dto: RejectVenueDTO +): Promise { + const venue = await repo.findVenueById(venueId); + if (!venue) throw new NotFoundError('Venue not found'); + + workflow.canReject(venue); + + // Calculate edit deadline + let editDeadline = new Date(Date.now() + VENUE_CONSTANTS.EDIT_WINDOW_DAYS * 24 * 60 * 60 * 1000); + let extendedAt: Date | undefined; + let extendedBy: mongoose.Types.ObjectId | undefined; + let originalDeadline = editDeadline; + + if (dto.extendedDeadline) { + const minDeadline = new Date( + Date.now() + VENUE_CONSTANTS.EDIT_WINDOW_DAYS * 24 * 60 * 60 * 1000 + ); + const maxDeadline = new Date( + Date.now() + VENUE_CONSTANTS.MAX_EXTENDED_DAYS * 24 * 60 * 60 * 1000 + ); + + if (dto.extendedDeadline < minDeadline || dto.extendedDeadline > maxDeadline) { + throw new ValidationError( + `Extended deadline must be between ${String(VENUE_CONSTANTS.EDIT_WINDOW_DAYS)} and ${String(VENUE_CONSTANTS.MAX_EXTENDED_DAYS)} days` + ); + } + + editDeadline = dto.extendedDeadline; + extendedAt = new Date(); + extendedBy = new mongoose.Types.ObjectId(adminId); + originalDeadline = new Date( + Date.now() + VENUE_CONSTANTS.EDIT_WINDOW_DAYS * 24 * 60 * 60 * 1000 + ); + } + + const rejectionEntry = { + reason: dto.rejectionReason, + rejectedAt: new Date(), + rejectedBy: new mongoose.Types.ObjectId(adminId), + submissionNumber: venue.rejectionHistory.length + 1, + editDeadline, + extendedAt, + extendedBy, + originalDeadline, + }; + + const updated = await VenueModel.findByIdAndUpdate( + venueId, + { + $set: { + status: 'Rejected', + rejectionReason: dto.rejectionReason, // backward compat + currentEditDeadline: editDeadline, + updatedBy: new mongoose.Types.ObjectId(adminId), + lastSubmittedAt: new Date(), + }, + $push: { rejectionHistory: rejectionEntry }, + }, + { new: true } + ).exec(); + + if (!updated) throw new NotFoundError('Venue not found'); + + const ownerEmail = await findUserEmailById(venue.ownerUserId.toString()); + if (ownerEmail && dto.rejectionReason) { + try { + await enqueueEmailTask( + ownerEmail, + EmailIntent.VENUE_REJECTED, + `Application Update: Venue "${venue.name}"`, + EmailTaskStatus.PENDING, + { + venueName: venue.name, + reason: dto.rejectionReason, + editDeadline: editDeadline.toISOString(), + submissionNumber: String(rejectionEntry.submissionNumber), + } + ); + } catch (err) { + logWarn('Failed to queue venue rejected email', { + module: 'venue.service.ts/rejectVenue', + venueId, + error: (err as Error).message, + }); + } + } + + // Log activity + const { logModerationAction } = await import('../moderation/moderationActivity.service.js'); + await logModerationAction(adminId, 'reject_venue', venueId, 'venue', dto.rejectionReason, { + submissionNumber: rejectionEntry.submissionNumber, + editDeadline, + isExtended: !!dto.extendedDeadline, + actor: 'admin', + }); + + return updated; +} + +export async function suspendVenue( + venueId: string, + adminId: string, + dto: SuspendVenueDTO +): Promise { + const venue = await repo.findVenueById(venueId); + if (!venue) throw new NotFoundError('Venue not found'); + + workflow.canDeactivate(venue); + + const extra = { suspensionReason: dto.suspensionReason }; + const updated = await repo.updateVenueStatus(venueId, 'Suspended', adminId, extra); + if (!updated) throw new NotFoundError('Venue not found'); + + const ownerEmail = await findUserEmailById(venue.ownerUserId.toString()); + if (ownerEmail) { + try { + await enqueueEmailTask( + ownerEmail, + EmailIntent.VENUE_SUSPENDED, + `Important: Your Venue "${venue.name}" has been Suspended`, + EmailTaskStatus.PENDING, + { venueName: venue.name, reason: dto.suspensionReason } + ); + } catch (err) { + logWarn('Failed to queue venue suspended email', { + module: 'venue.service.ts/suspendVenue', + venueId, + error: (err as Error).message, + }); + } + } + + // Log activity + const { logModerationAction } = await import('../moderation/moderationActivity.service.js'); + await logModerationAction(adminId, 'suspend_venue', venueId, 'venue', dto.suspensionReason); + + return updated; +} + +export async function unsuspendVenue(venueId: string, adminId: string): Promise { + const venue = await repo.findVenueById(venueId); + if (!venue) throw new NotFoundError('Venue not found'); + + workflow.canActivate(venue); + + const updated = await repo.updateVenueStatus(venueId, 'Approved', adminId); + if (!updated) throw new NotFoundError('Venue not found'); + + const ownerEmail = await findUserEmailById(venue.ownerUserId.toString()); + if (ownerEmail) { + try { + await enqueueEmailTask( + ownerEmail, + EmailIntent.VENUE_UNSUSPENDED, + `Your Venue "${venue.name}" has been Reactivated`, + EmailTaskStatus.PENDING, + { venueName: venue.name } + ); + } catch (err) { + logWarn('Failed to queue venue unsuspended email', { + module: 'venue.service.ts/unsuspendVenue', + venueId, + error: (err as Error).message, + }); + } + } + + // Log activity + const { logModerationAction } = await import('../moderation/moderationActivity.service.js'); + await logModerationAction(adminId, 'unsuspend_venue', venueId, 'venue'); + + return updated; +} + +export async function extendVenueEditDeadline( + venueId: string, + superAdminId: string, + newDeadline: Date +): Promise { + const venue = await repo.findVenueById(venueId); + if (!venue) throw new NotFoundError('Venue not found'); + + // Must be in Rejected status with active deadline + if (venue.status !== 'Rejected') { + throw new ValidationError('Can only extend deadline for rejected venues'); + } + if (!venue.currentEditDeadline || venue.currentEditDeadline < new Date()) { + throw new ValidationError('No active edit deadline to extend (already expired or suspended)'); + } + + // Validate new deadline + const minDeadline = new Date(); // must be in future + const maxDeadline = new Date( + Date.now() + VENUE_CONSTANTS.MAX_EXTENDED_DAYS * 24 * 60 * 60 * 1000 + ); + + if (newDeadline <= minDeadline || newDeadline > maxDeadline) { + throw new ValidationError( + `New deadline must be in the future and within ${String(VENUE_CONSTANTS.MAX_EXTENDED_DAYS)} days` + ); + } + if (newDeadline <= venue.currentEditDeadline) { + throw new ValidationError('New deadline must be later than current deadline'); + } + + // Update latest rejection history entry + const latestRejection = venue.rejectionHistory[venue.rejectionHistory.length - 1]; + + const updated = await VenueModel.findByIdAndUpdate( + venueId, + { + $set: { + currentEditDeadline: newDeadline, + 'rejectionHistory.$[elem].editDeadline': newDeadline, + 'rejectionHistory.$[elem].extendedAt': new Date(), + 'rejectionHistory.$[elem].extendedBy': new mongoose.Types.ObjectId(superAdminId), + updatedBy: new mongoose.Types.ObjectId(superAdminId), + }, + }, + { + arrayFilters: [{ 'elem._id': latestRejection._id }], + new: true, + } + ).exec(); + + if (!updated) throw new NotFoundError('Venue not found'); + + // Log activity + const { logModerationAction } = await import('../moderation/moderationActivity.service.js'); + const previousDeadline = venue.currentEditDeadline.toISOString(); + await logModerationAction( + superAdminId, + 'extend_venue_deadline', + venueId, + 'venue', + `Extended edit deadline from ${previousDeadline} to ${newDeadline.toISOString()}`, + { actor: 'system (superadmin)', previousDeadline: venue.currentEditDeadline, newDeadline } + ); + + // Email owner about extension + const ownerEmail = await findUserEmailById(venue.ownerUserId.toString()); + if (ownerEmail) { + try { + await enqueueEmailTask( + ownerEmail, + EmailIntent.VENUE_DEADLINE_EXTENDED, + `Edit Deadline Extended for "${venue.name}"`, + EmailTaskStatus.PENDING, + { venueName: venue.name, newDeadline: newDeadline.toISOString() } + ); + } catch (err) { + logWarn('Failed to queue venue deadline extended email', { + module: 'venue.service.ts/extendVenueEditDeadline', + venueId, + error: (err as Error).message, + }); + } + } + + return updated; +} + +export async function featureVenue(venueId: string, durationDays: number | null): Promise { + const venue = await repo.findVenueById(venueId); + if (!venue) throw new NotFoundError('Venue not found'); + + if (venue.status !== 'Approved') { + throw new ConflictError('Only approved venues can be featured'); + } + + await repo.upsertFeaturedVenue(venueId, durationDays); +} + +export async function getFeaturedVenues(): Promise< + (IVenue & { featuredExpiresAt?: Date | null })[] +> { + return repo.getFeaturedVenues(); +} + +export async function unfeatureVenue(venueId: string): Promise { + const venue = await repo.findVenueById(venueId); + if (!venue) throw new NotFoundError('Venue not found'); + + await repo.removeFeaturedVenue(venueId); +} + +// Review Management (admin) + +export async function getReviewsList(): Promise { + return VenueModel.find({ + pendingReview: { $exists: true, $ne: null }, + deleted: false, + }) + .select('name city status pendingReview inactivity ownerUserId') + .populate('ownerUserId', 'username email') + .sort({ 'pendingReview.requestedAt': -1 }) + .lean() + .exec(); +} + +export async function approveReview( + venueId: string, + adminId: string, + _note?: string +): Promise { + const venue = await repo.findVenueById(venueId); + if (!venue) throw new NotFoundError('Venue not found'); + if (!venue.pendingReview) throw new ConflictError('Venue has no pending review'); + + const adminObjectId = new mongoose.Types.ObjectId(adminId); + + switch (venue.pendingReview.intent) { + case ReviewIntent.VENUE_EDIT: { + // Changes are already applied. Just clear pendingReview. + const updated = await VenueModel.findByIdAndUpdate( + venueId, + { + $unset: { pendingReview: '' }, + $set: { updatedBy: adminObjectId }, + }, + { new: true } + ).exec(); + if (!updated) throw new NotFoundError('Venue not found'); + return updated; + } + + case ReviewIntent.INACTIVITY_REQUEST: { + const lastFutureBooking = await BookingModel.findOne({ + venueId: new mongoose.Types.ObjectId(venueId), + status: BookingStatus.CONFIRMED, + date: { $gte: new Date().toISOString().split('T')[0] }, + }) + .sort({ date: -1 }) + .lean() + .exec(); + + let blockedAfterDate: Date; + if (lastFutureBooking) { + blockedAfterDate = new Date(lastFutureBooking.date); + blockedAfterDate.setDate(blockedAfterDate.getDate() + 1); + } else { + blockedAfterDate = new Date(); + } + + const updated = await VenueModel.findByIdAndUpdate( + venueId, + { + $set: { + status: 'Inactive', + 'inactivity.approvedAt': new Date(), + 'inactivity.blockedAfterDate': blockedAfterDate, + 'inactivity.inactiveAt': new Date(), + updatedBy: adminObjectId, + }, + $unset: { pendingReview: '' }, + }, + { new: true } + ).exec(); + if (!updated) throw new NotFoundError('Venue not found'); + return updated; + } + + case ReviewIntent.INACTIVITY_WITHDRAWAL: { + const updated = await VenueModel.findByIdAndUpdate( + venueId, + { + $unset: { + pendingReview: '', + 'inactivity.requestedAt': '', + 'inactivity.approvedAt': '', + 'inactivity.blockedAfterDate': '', + 'inactivity.withdrawalRequestedAt': '', + }, + $set: { updatedBy: adminObjectId }, + }, + { new: true } + ).exec(); + if (!updated) throw new NotFoundError('Venue not found'); + return updated; + } + + case ReviewIntent.DELETION_REQUEST: { + const deleted = await repo.softDeleteVenue(venueId, adminId); + if (!deleted) throw new NotFoundError('Venue not found'); + const updated = await repo.findVenueById(venueId); + if (!updated) throw new NotFoundError('Venue not found'); + return updated; + } + + default: + throw new ValidationError( + `Cannot approve review with intent "${venue.pendingReview.intent}"` + ); + } +} + +export async function rejectReview( + venueId: string, + adminId: string, + _note: string +): Promise { + const venue = await repo.findVenueById(venueId); + if (!venue) throw new NotFoundError('Venue not found'); + if (!venue.pendingReview) throw new ConflictError('Venue has no pending review'); + + const adminObjectId = new mongoose.Types.ObjectId(adminId); + + if (venue.pendingReview.intent === ReviewIntent.VENUE_EDIT) { + const snapshot = venue.pendingReview.details.previousSnapshot; + if (snapshot && Object.keys(snapshot).length > 0) { + const updated = await VenueModel.findByIdAndUpdate( + venueId, + { + $set: { ...snapshot, updatedBy: adminObjectId }, + $unset: { pendingReview: '' }, + }, + { new: true } + ).exec(); + if (!updated) throw new NotFoundError('Venue not found'); + return updated; + } + } + + // For all other intents (and VENUE_EDIT without snapshot): just clear pendingReview + const updated = await VenueModel.findByIdAndUpdate( + venueId, + { + $unset: { pendingReview: '' }, + $set: { updatedBy: adminObjectId }, + }, + { new: true } + ).exec(); + if (!updated) throw new NotFoundError('Venue not found'); + return updated; +} diff --git a/server/src/modules/venue/venue.types.ts b/server/src/modules/venue/venue.types.ts new file mode 100644 index 0000000000..494a1b3acd --- /dev/null +++ b/server/src/modules/venue/venue.types.ts @@ -0,0 +1,213 @@ +import type mongoose from 'mongoose'; +import type { Document } from 'mongoose'; +import type { + VenueStatusEnum, + VenueFields, + ReviewIntentType, +} from '../../constants/venue.constants'; + +export type VenueStatus = (typeof VenueStatusEnum)[number]; + +export type PlainVenue = Omit & { _id: IVenue['_id'] }; + +export type VenueKey = (typeof VenueFields)[number]; + +export interface IGeoPoint { + type: 'Point'; + /** [longitude, latitude] — GeoJSON order */ + coordinates: [number, number]; +} + +export interface IFixedPackage { + slotName: string; + startTime: string; // 09:00 + endTime: string; // 13:00 + price: number; +} + +export interface IPricingRule { + fromTime: string; + toTime: string; + price: number; +} + +export interface IPricing { + pricingType: 'fixedPricing' | 'timeBasedPricing'; + basePrice: number; + pricingRules: IPricingRule[]; +} + +export interface IBlockedTime { + fromTime: string; + toTime: string; +} + +export interface IRefundRule { + daysBefore: number; + refundPercentage: number; +} + +export interface IContact { + name: string; + phone: string; + email?: string; +} + +export interface ICancellation { + policy: 'refundable' | 'nonRefundable'; + refundType?: 'fullRefund' | 'timeBasedRefund'; + refundRules: IRefundRule[]; +} + +export interface IRejectionEntry { + _id: mongoose.Types.ObjectId; + reason: string; + rejectedAt: Date; + rejectedBy: mongoose.Types.ObjectId; + submissionNumber: number; + editDeadline: Date; + extendedAt?: Date; + extendedBy?: mongoose.Types.ObjectId; + originalDeadline?: Date; +} + +// Main Interface +export interface IVenue extends Document { + __v?: number; + // Basic Info + name: string; + description: string; + venueType: string; + + // Location + address: string; + city: string; + district: string; + pincode: string; + location: IGeoPoint; // $geoNear / 2dsphere queries - future usecase + googleMapsUrl?: string; + + // Space & Capacity + spaceAttributes: string[]; + seatingConfigurations: string[]; + maxCapacity?: number; + + // Booking Config + bookingType: 'fixedBooking' | 'flexibleBooking'; + fixedPackages?: IFixedPackage[]; + workingDays: string[]; + workingHours?: { + open: string; + close: string; + }; + blockedTimes?: IBlockedTime[]; + blockedDates: Date[]; + flexibleBooking?: { + slotDuration: number; + bufferTime: number; + }; + + // Pricing + pricing?: IPricing; + + // Amenities + amenities: string[]; + + // Media + coverImage: string; + galleryImages: string[]; + + // Contact + contact: IContact; + + // Cancellation & Refund + cancellation: ICancellation; + + // Ratings & Reviews + avgRating: number; + reviewCount: number; + + pendingReview?: { + intent: ReviewIntentType; + requestedAt: Date; + details: { + changedFields?: string[]; + previousSnapshot?: Record; + reason?: string; + }; + }; + + inactivity?: { + requestedAt?: Date; + approvedAt?: Date; + blockedAfterDate?: Date; + inactiveAt?: Date; + lastInactiveAt?: Date; + withdrawalRequestedAt?: Date; + }; + + temporaryBlockAfterDate?: Date; + + // Operational + status: VenueStatus; + ownerUserId: mongoose.Types.ObjectId; + rejectionHistory: IRejectionEntry[]; + submissionCount: number; + lastSubmittedAt?: Date; + currentEditDeadline?: Date; + suspensionReason?: string; + + // Audit + createdBy: mongoose.Types.ObjectId; + updatedBy: mongoose.Types.ObjectId; + createdAt: Date; + updatedAt: Date; + + // Soft delete + active: boolean; + deleted: boolean; +} + +export type CreateVenueData = Omit< + IVenue, + | keyof mongoose.Document + | 'status' + | 'createdAt' + | 'updatedAt' + | 'active' + | 'deleted' + | 'rejectionHistory' + | 'submissionCount' + | 'lastSubmittedAt' + | 'currentEditDeadline' + | 'suspensionReason' +>; + +export type UpdateVenueData = Partial< + Omit +> & { + updatedBy: string; +}; + +export interface AdminVenueFilters { + status?: VenueStatus; + city?: string; + page: number; + limit: number; +} + +export interface PublicVenueFilters { + searchTerm?: string; + minPrice?: number; + maxPrice?: number; + venueType?: string[]; + district?: string; + capacity?: number; + spaceAttributes?: string[]; + seatingConfigurations?: string[]; + amenities?: string[]; + sortBy?: 'price-low' | 'price-high' | 'rating' | 'distance'; + lat?: number; + lng?: number; + radiusKm?: number; +} diff --git a/server/src/modules/venue/venue.validator.ts b/server/src/modules/venue/venue.validator.ts new file mode 100644 index 0000000000..060f957de2 --- /dev/null +++ b/server/src/modules/venue/venue.validator.ts @@ -0,0 +1,505 @@ +import { z } from 'zod'; +import { KERALA_DISTRICTS } from '../../constants/venue.constants'; +import { VENUE_CONSTANTS } from '../../constants/venue.constants'; + +// Shared sub-schemas + +/** [longitude, latitude] */ +const coordinatesSchema = z + .tuple([ + z.number().min(-180).max(180, 'Longitude must be between -180 and 180'), + z.number().min(-90).max(90, 'Latitude must be between -90 and 90'), + ]) + .describe('[longitude, latitude]'); + +const phoneSchema = z + .string() + .trim() + .regex(/^\+?[\d\s\-().]{7,20}$/, 'Contact phone must be a valid phone number (7-20 characters)'); + +const urlSchema = z.string().regex(/^https?:\/\/.+/, 'Must be a valid URL'); + +const GOOGLE_MAPS_ALLOWED_HOSTS = new Set([ + 'maps.google.com', + 'www.google.com', + 'google.com', + 'goo.gl', + 'maps.app.goo.gl', +]); + +const googleMapsUrlSchema = z + .url('Must be a valid URL') + .refine((url) => { + try { + const { protocol, hostname } = new URL(url); + return protocol === 'https:' && GOOGLE_MAPS_ALLOWED_HOSTS.has(hostname); + } catch { + return false; + } + }, 'Must be a valid Google Maps URL (google.com or maps.google.com)') + .optional(); + +const venueIdSchema = z + .string() + .trim() + .regex(/^[a-f\d]{24}$/i, 'Invalid venue ID'); + +const DAYS_OF_WEEK = [ + 'Monday', + 'Tuesday', + 'Wednesday', + 'Thursday', + 'Friday', + 'Saturday', + 'Sunday', +] as const; + +const fixedPackageSchema = z.object({ + slotName: z.string().trim().min(1, 'Slot name is required'), + startTime: z.string().regex(/^([0-1]?[0-9]|2[0-3]):[0-5][0-9]$/, 'Invalid time format (HH:MM)'), + endTime: z.string().regex(/^([0-1]?[0-9]|2[0-3]):[0-5][0-9]$/, 'Invalid time format (HH:MM)'), + price: z.coerce.number().min(0, 'Price cannot be negative'), +}); + +const pricingRuleSchema = z.object({ + fromTime: z.string().regex(/^([0-1]?[0-9]|2[0-3]):[0-5][0-9]$/, 'Invalid time format (HH:MM)'), + toTime: z.string().regex(/^([0-1]?[0-9]|2[0-3]):[0-5][0-9]$/, 'Invalid time format (HH:MM)'), + price: z.coerce.number().min(0, 'Price cannot be negative'), +}); + +const blockedTimeSchema = z.object({ + fromTime: z.string().regex(/^([0-1]?[0-9]|2[0-3]):[0-5][0-9]$/, 'Invalid time format (HH:MM)'), + toTime: z.string().regex(/^([0-1]?[0-9]|2[0-3]):[0-5][0-9]$/, 'Invalid time format (HH:MM)'), +}); + +export const refundRuleSchema = z.object({ + daysBefore: z.number().int().min(0, 'Days before must be positive'), + refundPercentage: z.number().min(0).max(100, 'Percentage must be between 0 and 100'), +}); + +// Venue Creation Validation +export const createVenueSchema = z + .object({ + // Basic Info + name: z.string().trim().min(3, 'Name must be at least 3 characters').max(100), + description: z.string().trim().min(10, 'Description must be at least 10 characters'), + venueType: z.string().trim().min(1, 'Venue type is required'), + + // Location + address: z.string().trim().min(5, 'Address must be at least 5 characters'), + city: z.string().trim().min(2).max(100), + district: z.enum(KERALA_DISTRICTS), + pincode: z.string().trim().min(4).max(20), + coordinates: coordinatesSchema.optional(), + googleMapsUrl: googleMapsUrlSchema, + + // Space & Capacity + spaceAttributes: z.array(z.string()).default([]), + seatingConfigurations: z.array(z.string()).default([]), + maxCapacity: z.coerce.number().int().positive().optional(), + + // Booking & Pricing Config + bookingType: z.enum(['fixedBooking', 'flexibleBooking']), + + // Fixed booking fields + fixedPackages: z.array(fixedPackageSchema).optional(), + + // Both booking types + workingDays: z.array(z.enum(DAYS_OF_WEEK)).min(1, 'At least one working day is required'), + + // Flexible booking fields + workingHours: z + .object({ + open: z.string().regex(/^([0-1]?[0-9]|2[0-3]):[0-5][0-9]$/, 'Invalid time format (HH:MM)'), + close: z.string().regex(/^([0-1]?[0-9]|2[0-3]):[0-5][0-9]$/, 'Invalid time format (HH:MM)'), + }) + .optional(), + flexibleBooking: z + .object({ + slotDuration: z.coerce.number().int().positive().default(60), + bufferTime: z.coerce.number().int().min(0).default(0), + }) + .optional(), + pricing: z + .object({ + pricingType: z.enum(['fixedPricing', 'timeBasedPricing']), + basePrice: z.coerce.number().min(0, 'Base price must be 0 or higher'), + pricingRules: z.array(pricingRuleSchema).default([]), + }) + .optional(), + blockedTimes: z.array(blockedTimeSchema).default([]), + blockedDates: z.array(z.coerce.date()).default([]), + + // Amenities + amenities: z.array(z.string()).min(1, 'At least one amenity is required'), + + // Media + coverImage: urlSchema, + galleryImages: z.array(urlSchema).max(20).optional(), + + // Contact + contact: z.object({ + name: z.string().trim().min(2).max(100), + phone: phoneSchema, + email: z + .string() + .regex(/^[^\s@]+@[^\s@]+\.[^\s@]+$/, 'Must be a valid email') + .optional(), + }), + + // Cancellation & Refund + cancellation: z.object({ + policy: z.enum(['refundable', 'nonRefundable']), + refundType: z.enum(['fullRefund', 'timeBasedRefund']).optional(), + refundRules: z.array(refundRuleSchema).default([]), + }), + }) + .superRefine((data, ctx) => { + // Helper: HH:MM → minutes since midnight + const toMin = (t: string): number => { + const [h, m] = t.split(':').map(Number); + return h * 60 + m; + }; + + // Fixed booking: must have at least one package + if (data.bookingType === 'fixedBooking') { + if (!data.fixedPackages || data.fixedPackages.length === 0) { + ctx.addIssue({ + code: 'custom', + message: 'At least one fixed package is required for fixed booking', + path: ['fixedPackages'], + }); + } + } + + // Flexible booking: requires workingHours, flexibleBooking, and pricing + if (data.bookingType === 'flexibleBooking') { + if (!data.pricing) { + ctx.addIssue({ + code: 'custom', + message: 'Pricing is required for flexible booking', + path: ['pricing'], + }); + return; + } + if (!data.workingHours) { + ctx.addIssue({ + code: 'custom', + message: 'Working hours are required for flexible booking', + path: ['workingHours'], + }); + } else { + if (!data.workingHours.open) { + ctx.addIssue({ + code: 'custom', + message: 'Open time is required for flexible booking', + path: ['workingHours', 'open'], + }); + } + if (!data.workingHours.close) { + ctx.addIssue({ + code: 'custom', + message: 'Close time is required for flexible booking', + path: ['workingHours', 'close'], + }); + } + // close must be after open + if (data.workingHours.open && data.workingHours.close) { + if (toMin(data.workingHours.close) <= toMin(data.workingHours.open)) { + ctx.addIssue({ + code: 'custom', + message: 'Close time must be after open time', + path: ['workingHours', 'close'], + }); + } + } + } + + if (!data.flexibleBooking?.slotDuration) { + ctx.addIssue({ + code: 'custom', + message: 'Slot duration is required for flexible booking', + path: ['flexibleBooking', 'slotDuration'], + }); + } + + // Time-based pricing: must have at least one pricing rule + if ( + data.pricing.pricingType === 'timeBasedPricing' && + data.pricing.pricingRules.length === 0 + ) { + ctx.addIssue({ + code: 'custom', + message: 'At least one pricing rule is required for time-based pricing', + path: ['pricing', 'pricingRules'], + }); + } + + // Working-hours boundary checks for pricing rules + const wh = data.workingHours; + const openMin = wh?.open ? toMin(wh.open) : null; + const closeMin = wh?.close ? toMin(wh.close) : null; + + if (openMin !== null && closeMin !== null && wh) { + data.pricing.pricingRules.forEach((rule, i) => { + if (rule.fromTime) { + const from = toMin(rule.fromTime); + if (from < openMin) { + ctx.addIssue({ + code: 'custom', + message: `From time must be on or after open time (${wh.open})`, + path: ['pricing', 'pricingRules', i, 'fromTime'], + }); + } + } + if (rule.toTime) { + const to = toMin(rule.toTime); + if (to > closeMin) { + ctx.addIssue({ + code: 'custom', + message: `To time must be on or before close time (${wh.close})`, + path: ['pricing', 'pricingRules', i, 'toTime'], + }); + } + } + if (rule.fromTime && rule.toTime && toMin(rule.toTime) <= toMin(rule.fromTime)) { + ctx.addIssue({ + code: 'custom', + message: 'To time must be after from time', + path: ['pricing', 'pricingRules', i, 'toTime'], + }); + } + }); + + // Validate blockedTimes stay within working hours + data.blockedTimes.forEach((block, i) => { + if (block.fromTime) { + const from = toMin(block.fromTime); + if (from < openMin) { + ctx.addIssue({ + code: 'custom', + message: `From time must be on or after open time (${wh.open})`, + path: ['blockedTimes', i, 'fromTime'], + }); + } + } + if (block.toTime) { + const to = toMin(block.toTime); + if (to > closeMin) { + ctx.addIssue({ + code: 'custom', + message: `To time must be on or before close time (${wh.close})`, + path: ['blockedTimes', i, 'toTime'], + }); + } + } + if (block.fromTime && block.toTime && toMin(block.toTime) <= toMin(block.fromTime)) { + ctx.addIssue({ + code: 'custom', + message: 'To time must be after from time', + path: ['blockedTimes', i, 'toTime'], + }); + } + }); + } + } + + // Time-based refund: must have at least one refund rule + if ( + data.cancellation.policy === 'refundable' && + data.cancellation.refundType === 'timeBasedRefund' && + data.cancellation.refundRules.length === 0 + ) { + ctx.addIssue({ + code: 'custom', + message: 'At least one refund rule is required for time-based refund policy', + path: ['cancellation', 'refundRules'], + }); + } + }); + +export type CreateVenueDTO = z.infer; + +// Update +// PUT /venues/:id +export const updateVenueSchema = z + .object({ + expectedVersion: z.number().int().optional(), + name: z.string().trim().min(3, 'Name must be at least 3 characters').max(100), + description: z.string().trim().min(10, 'Description must be at least 10 characters'), + venueType: z.string().trim().min(1, 'Venue type is required'), + address: z.string().trim().min(5, 'Address must be at least 5 characters'), + city: z.string().trim().min(2).max(100), + district: z.string().trim().min(2).max(100), + pincode: z.string().trim().min(4).max(20), + coordinates: coordinatesSchema.optional(), + googleMapsUrl: googleMapsUrlSchema, + spaceAttributes: z.array(z.string()), + seatingConfigurations: z.array(z.string()), + maxCapacity: z.coerce.number().int().positive().optional(), + bookingType: z.enum(['fixedBooking', 'flexibleBooking']), + fixedPackages: z.array(fixedPackageSchema), + workingDays: z.array(z.enum(DAYS_OF_WEEK)).min(1, 'At least one working day is required'), + workingHours: z.object({ + open: z.string().regex(/^([0-1]?[0-9]|2[0-3]):[0-5][0-9]$/), + close: z.string().regex(/^([0-1]?[0-9]|2[0-3]):[0-5][0-9]$/), + }), + flexibleBooking: z.object({ + slotDuration: z.coerce.number().int().positive(), + bufferTime: z.coerce.number().int().min(0), + }), + pricing: z + .object({ + pricingType: z.enum(['fixedPricing', 'timeBasedPricing']), + basePrice: z.coerce.number().min(0), + pricingRules: z.array(pricingRuleSchema).default([]), + }) + .optional(), + blockedTimes: z.array(blockedTimeSchema), + blockedDates: z.array(z.coerce.date()), + amenities: z.array(z.string()), + coverImage: urlSchema, + galleryImages: z.array(urlSchema).max(20).optional(), + contact: z.object({ + name: z.string().trim().min(2).max(100), + phone: phoneSchema, + email: z + .string() + .regex(/^[^\s@]+@[^\s@]+\.[^\s@]+$/, 'Must be a valid email') + .optional(), + }), + cancellation: z.object({ + policy: z.enum(['refundable', 'nonRefundable']), + refundType: z.enum(['fullRefund', 'timeBasedRefund']).optional(), + refundRules: z.array(refundRuleSchema).default([]), + }), + }) + .partial() + .refine((data) => Object.keys(data).length > 0, { + message: 'At least one field must be provided for update', + }); + +export type UpdateVenueDTO = z.infer; + +// Reject venue with optional extended deadline +export const rejectVenueSchema = z.object({ + rejectionReason: z + .string() + .trim() + .max(500, 'Rejection reason must be under 500 characters') + .optional(), + extendedDeadline: z.coerce + .date() + .optional() + .refine( + (date) => + !date || + (date > new Date(Date.now() + VENUE_CONSTANTS.EDIT_WINDOW_DAYS * 24 * 60 * 60 * 1000) && + date <= new Date(Date.now() + VENUE_CONSTANTS.MAX_EXTENDED_DAYS * 24 * 60 * 60 * 1000)), + `Extended deadline must be between ${String(VENUE_CONSTANTS.EDIT_WINDOW_DAYS)} and ${String(VENUE_CONSTANTS.MAX_EXTENDED_DAYS)} days` + ), +}); + +export type RejectVenueDTO = z.infer; + +// Extend venue deadline +export const extendVenueDeadlineSchema = z.object({ + newDeadline: z.coerce + .date() + .refine( + (date) => + date > new Date() && + date <= new Date(Date.now() + VENUE_CONSTANTS.MAX_EXTENDED_DAYS * 24 * 60 * 60 * 1000), + `New deadline must be in the future and within ${String(VENUE_CONSTANTS.MAX_EXTENDED_DAYS)} days` + ), +}); + +export type ExtendVenueDeadlineDTO = z.infer; + +export const suspendVenueSchema = z.object({ + suspensionReason: z + .string() + .trim() + .min(10, 'Suspension reason must be at least 10 characters') + .max(500, 'Suspension reason must be under 500 characters'), +}); + +export type SuspendVenueDTO = z.infer; + +export const featureVenueSchema = z.object({ + durationDays: z.enum(['7', '30', 'indefinite']), +}); + +export type FeatureVenueDTO = z.infer; + +// Admin list filters + +export const adminVenueFiltersSchema = z.object({ + status: z.enum(['Draft', 'PendingReview', 'Approved', 'Rejected', 'Suspended']).optional(), + city: z.string().trim().max(100).optional(), + page: z.coerce.number().int().positive().default(1), + limit: z.coerce.number().int().positive().max(100).default(20), +}); + +export type AdminVenueFiltersDTO = z.infer; + +const stringOrArray = z.preprocess( + (val) => (Array.isArray(val) ? val : val ? [val] : undefined), + z.array(z.string()).optional() +); + +export const publicVenueFiltersSchema = z + .object({ + searchTerm: z.string().trim().max(100).optional(), + minPrice: z.coerce.number().min(0).optional(), + maxPrice: z.coerce.number().min(0).optional(), + venueType: stringOrArray, + district: z.enum(KERALA_DISTRICTS).optional(), + capacity: z.coerce.number().int().positive().optional(), + spaceAttributes: stringOrArray, + seatingConfigurations: stringOrArray, + amenities: stringOrArray, + lat: z.coerce.number().min(-90).max(90).optional(), + lng: z.coerce.number().min(-180).max(180).optional(), + radiusKm: z.coerce.number().positive().max(200).default(25).optional(), + sortBy: z.enum(['price-low', 'price-high', 'rating', 'distance']).optional(), + page: z.coerce.number().int().positive().default(1), + limit: z.coerce.number().int().positive().max(100).default(20), + }) + .refine( + (data) => { + // If lat is provided, lng must also be provided + if (data.lat !== undefined && data.lng === undefined) return false; + // If lng is provided, lat must also be provided + if (data.lng !== undefined && data.lat === undefined) return false; + return true; + }, + { + message: 'Both latitude and longitude must be provided together', + path: ['lat', 'lng'], + } + ); + +export type PublicVenueFiltersDTO = z.infer; + +// Review schemas + +export const approveReviewSchema = z.object({ + note: z.string().trim().max(500).optional(), +}); + +export type ApproveReviewDTO = z.infer; + +export const rejectReviewSchema = z.object({ + note: z.string().trim().min(1).max(500), +}); + +export type RejectReviewDTO = z.infer; + +// Route param + +export const venueIdParamSchema = z.object({ + id: venueIdSchema, +}); + +export type VenueIdParamDTO = z.infer; diff --git a/server/src/modules/venue/venue.workflow.ts b/server/src/modules/venue/venue.workflow.ts new file mode 100644 index 0000000000..6c614dc521 --- /dev/null +++ b/server/src/modules/venue/venue.workflow.ts @@ -0,0 +1,218 @@ +import type { IVenue, VenueStatus } from './venue.types'; +import { + INACTIVITY_COOLDOWN_DAYS, + SUBMISSION_REQUIRED_FIELDS, +} from '../../constants/venue.constants'; +import { WorkflowError, ValidationError } from '../../utils/errors'; +import { timeStringToMinutes } from '../../utils/timeUtils'; + +/** + * Venue Status State Machine + * + * Legal transitions: + * + * Draft → PendingReview (owner submits) + * PendingReview → Approved (admin approves) + * PendingReview → Rejected (admin rejects) + * Approved → Suspended (admin deactivates) + * Approved → Inactive (owner requests inactivity) + * Rejected → PendingReview (owner re-submits after editing) + * Rejected → Suspended (admin deactivates) + * Suspended → Approved (admin reactivates) + * Inactive → Approved (owner or admin reactivates) + */ + +type TransitionMap = Partial>; + +const ALLOWED_TRANSITIONS: TransitionMap = { + Draft: ['PendingReview'], + PendingReview: ['Approved', 'Rejected'], + Approved: ['Suspended', 'Inactive'], + Rejected: ['PendingReview', 'Suspended'], + Suspended: ['Approved'], + Inactive: ['Approved'], +}; + +// Core Guard +export function assertTransition(venue: IVenue, targetStatus: VenueStatus): void { + const allowed = ALLOWED_TRANSITIONS[venue.status] ?? []; + if (!allowed.includes(targetStatus)) { + throw new WorkflowError(venue.status, `transition to '${targetStatus}'`); + } +} + +// Named Transition Guards +export function canSubmit(venue: IVenue): void { + assertTransition(venue, 'PendingReview'); + + const venueRecord = venue as unknown as Record; + const missingFields = SUBMISSION_REQUIRED_FIELDS.filter((field) => { + const value = venueRecord[field as string]; + if (value === null || value === undefined) return true; + if (typeof value === 'string' && value.trim() === '') return true; + return false; + }); + + if (missingFields.length > 0) { + throw new ValidationError( + `Cannot submit: the following required fields are missing or empty — ${missingFields.join(', ')}` + ); + } + + if (venue.workingDays.length === 0) { + throw new ValidationError('Cannot submit: at least one working day must be selected'); + } + + if (venue.amenities.length === 0) { + throw new ValidationError('Cannot submit: at least one amenity is required'); + } + + // Fixed booking checks + if (venue.bookingType === 'fixedBooking') { + if (!venue.fixedPackages || venue.fixedPackages.length === 0) { + throw new ValidationError( + 'Cannot submit: at least one fixed package is required for fixed booking type' + ); + } + venue.fixedPackages.forEach((pkg) => { + if (timeStringToMinutes(pkg.endTime) <= timeStringToMinutes(pkg.startTime)) { + throw new ValidationError( + `Cannot submit: fixed package "${pkg.slotName}" must have endTime after startTime` + ); + } + }); + } + + // Flexible booking checks + if (venue.bookingType === 'flexibleBooking') { + if (!venue.workingHours?.open || !venue.workingHours.close) { + throw new ValidationError( + 'Cannot submit: working hours (open & close) are required for flexible booking type' + ); + } + if (!venue.flexibleBooking?.slotDuration) { + throw new ValidationError( + 'Cannot submit: slot duration is required for flexible booking type' + ); + } + + // Pricing checks inside flexible booking + if (!venue.pricing) { + throw new ValidationError('Cannot submit: pricing is required for flexible booking type'); + } + if ( + venue.pricing.pricingType === 'timeBasedPricing' && + venue.pricing.pricingRules.length === 0 + ) { + throw new ValidationError( + 'Cannot submit: at least one pricing rule is required for time-based pricing' + ); + } + + const openMin = timeStringToMinutes(venue.workingHours.open); + const closeMin = timeStringToMinutes(venue.workingHours.close); + + venue.pricing.pricingRules.forEach((rule) => { + const from = timeStringToMinutes(rule.fromTime); + const to = timeStringToMinutes(rule.toTime); + if (to <= from) { + throw new ValidationError('Cannot submit: pricing rule toTime must be after fromTime'); + } + if (from < openMin || to > closeMin) { + throw new ValidationError('Cannot submit: pricing rule times must be within working hours'); + } + }); + + (venue.blockedTimes ?? []).forEach((block) => { + const from = timeStringToMinutes(block.fromTime); + const to = timeStringToMinutes(block.toTime); + if (to <= from) { + throw new ValidationError('Cannot submit: blocked time toTime must be after fromTime'); + } + if (from < openMin || to > closeMin) { + throw new ValidationError('Cannot submit: blocked time must be within working hours'); + } + }); + } + + // Refund policy checks + if (venue.cancellation.policy === 'refundable') { + if (!venue.cancellation.refundType) { + throw new ValidationError( + 'Cannot submit: refund type is required for refundable cancellation policy' + ); + } + if ( + venue.cancellation.refundType === 'timeBasedRefund' && + venue.cancellation.refundRules.length === 0 + ) { + throw new ValidationError( + 'Cannot submit: at least one refund rule is required for time-based refund policy' + ); + } + } +} + +export function canApprove(venue: IVenue): void { + assertTransition(venue, 'Approved'); +} + +export function canReject(venue: IVenue): void { + assertTransition(venue, 'Rejected'); +} + +export function canDeactivate(venue: IVenue): void { + assertTransition(venue, 'Suspended'); +} + +export function canActivate(venue: IVenue): void { + assertTransition(venue, 'Approved'); +} + +export function canEdit(venue: IVenue): void { + const editableStatuses: VenueStatus[] = ['Draft', 'Rejected']; + if (!editableStatuses.includes(venue.status)) { + throw new WorkflowError( + venue.status, + 'edit -- only Draft or Rejected venues can be directly edited' + ); + } +} + +export function canDelete(venue: IVenue): void { + const deletableStatuses: VenueStatus[] = ['Draft', 'Rejected']; + if (!deletableStatuses.includes(venue.status)) { + throw new WorkflowError( + venue.status, + 'delete -- only Draft or Rejected venues can be directly deleted' + ); + } +} + +export function canReactivate(venue: IVenue): void { + if (venue.status !== 'Inactive') { + throw new WorkflowError(venue.status, 'reactivate -- only Inactive venues can be reactivated'); + } +} + +export function canRequestInactivity(venue: IVenue): void { + if (venue.status !== 'Approved') { + throw new WorkflowError(venue.status, 'inactivity request -- only Approved venues'); + } + + if (venue.inactivity?.lastInactiveAt) { + const cooldownEnd = new Date(venue.inactivity.lastInactiveAt); + cooldownEnd.setDate(cooldownEnd.getDate() + INACTIVITY_COOLDOWN_DAYS); + if (new Date() < cooldownEnd) { + throw new ValidationError( + `Inactivity cooldown active. You can request again after ${cooldownEnd.toISOString().split('T')[0]}.` + ); + } + } +} + +export function canRequestDelete(venue: IVenue): void { + if (venue.deleted) { + throw new WorkflowError('Deleted', 'delete request -- venue already deleted'); + } +} diff --git a/server/src/modules/venue/venueDraft.model.ts b/server/src/modules/venue/venueDraft.model.ts new file mode 100644 index 0000000000..0a4a0c9756 --- /dev/null +++ b/server/src/modules/venue/venueDraft.model.ts @@ -0,0 +1,35 @@ +import mongoose, { type Document, Schema } from 'mongoose'; + +export interface IVenueDraft extends Document { + userId: mongoose.Types.ObjectId; + step: number; + formValues: Record; + createdAt: Date; + updatedAt: Date; +} + +const venueDraftSchema = new Schema( + { + userId: { + type: Schema.Types.ObjectId, + ref: 'User', + required: true, + unique: true, // Only one draft per user + }, + step: { + type: Number, + required: true, + default: 0, + }, + formValues: { + type: Schema.Types.Mixed, + required: true, + default: {}, + }, + }, + { + timestamps: true, // Automatically manage createdAt and updatedAt + } +); + +export const VenueDraftModel = mongoose.model('VenueDraft', venueDraftSchema); diff --git a/server/src/modules/webhook/webhook.controller.ts b/server/src/modules/webhook/webhook.controller.ts new file mode 100644 index 0000000000..a32aa24f7b --- /dev/null +++ b/server/src/modules/webhook/webhook.controller.ts @@ -0,0 +1,73 @@ +import type { Request, Response } from 'express'; +import { logError, logWarn } from '../../utils/logger'; +import { verifyWebhookSignature } from '../../services/razorpay.service'; +import { processCapturedPayment } from '../booking/booking.service'; +import type { RazorpayWebhookPayload } from './webhook.types'; + +// Handles incoming Razorpay webhook events +export const handleRazorpayWebhook = async (req: Request, res: Response): Promise => { + const rawBody = req.body as Buffer; + const signature = req.headers['x-razorpay-signature']; + + if (!signature || typeof signature !== 'string') { + logWarn('Razorpay webhook received without signature header', { + module: 'webhook.controller.ts/handleRazorpayWebhook', + }); + res.status(200).json({ received: false, error: 'Missing x-razorpay-signature header' }); + return; + } + + const isValid = verifyWebhookSignature(rawBody, signature); + + if (!isValid) { + logWarn('Razorpay webhook signature verification failed — rejecting', { + module: 'webhook.controller.ts/handleRazorpayWebhook', + }); + res.status(200).json({ received: false, error: 'Invalid webhook signature' }); + return; + } + + let webhookData: RazorpayWebhookPayload; + + try { + webhookData = JSON.parse(rawBody.toString('utf8')) as RazorpayWebhookPayload; + } catch (err) { + logError('Failed to parse webhook body as JSON', { + module: 'webhook.controller.ts/handleRazorpayWebhook', + error: (err as Error).message, + }); + res.status(400).json({ error: 'Invalid JSON payload' }); + return; + } + + // Only process payment.captured events. Return 200 for other events to acknowledge. + if (webhookData.event !== 'payment.captured') { + res.status(200).json({ received: true }); + return; + } + + const payment = webhookData.payload?.payment?.entity; + + if (!payment) { + logWarn('Webhook payment.captured payload missing entity', { + module: 'webhook.controller.ts/handleRazorpayWebhook', + }); + res.status(200).json({ received: true }); + return; + } + + // Process the captured payment in the booking service + const result = await processCapturedPayment( + payment.id, + payment.amount, + payment.notes, + payment.method + ); + + if (!result.success) { + res.status(200).json({ received: true, error: result.error }); + return; + } + + res.status(200).json({ received: true, idempotent: result.isDuplicate }); +}; diff --git a/server/src/modules/webhook/webhook.router.ts b/server/src/modules/webhook/webhook.router.ts new file mode 100644 index 0000000000..2bc08d9c56 --- /dev/null +++ b/server/src/modules/webhook/webhook.router.ts @@ -0,0 +1,67 @@ +/** + * webhook.router.ts + * + * CRITICAL: This router applies `express.raw({ type: 'application/json' })` + * as route-level middleware on the Razorpay webhook endpoint. + * + * This MUST be registered in server.ts BEFORE the global `express.json()` + * middleware. Express matches routes in registration order — if express.json() + * runs first, it consumes the stream and the raw Buffer is lost, breaking + * the HMAC signature verification. + * + * The route has NO auth middleware. Razorpay sends webhooks from their servers; + * the HMAC-SHA256 signature check in the controller IS the authentication. + */ + +import express, { Router } from 'express'; +import { handleRazorpayWebhook } from './webhook.controller'; + +const router: Router = Router(); + +/** + * @openapi + * /webhook/razorpay: + * post: + * tags: [Webhooks] + * summary: Receive a Razorpay payment event + * description: | + * Ingests Razorpay webhook payloads and verifies the HMAC-SHA256 signature. + * **No JWT auth** — Razorpay server-to-server calls are authenticated by the + * `x-razorpay-signature` header and the shared webhook secret. + * This route must receive the **raw request body** (not parsed JSON) so the + * HMAC can be computed correctly. + * parameters: + * - in: header + * name: x-razorpay-signature + * required: true + * schema: + * type: string + * description: HMAC-SHA256 signature computed by Razorpay over the raw payload + * requestBody: + * required: true + * content: + * application/json: + * schema: + * type: object + * description: Raw Razorpay webhook event payload + * properties: + * event: + * type: string + * example: payment.captured + * payload: + * type: object + * responses: + * 200: + * description: Webhook received and processed + * 400: + * description: Invalid or missing HMAC signature + * 500: + * description: Internal error while processing the event + */ +router.route('/razorpay').post( + // Capture raw bytes BEFORE any JSON parsing + express.raw({ type: 'application/json' }), + handleRazorpayWebhook +); + +export { router as webhookRouter }; diff --git a/server/src/modules/webhook/webhook.types.ts b/server/src/modules/webhook/webhook.types.ts new file mode 100644 index 0000000000..1e406fd916 --- /dev/null +++ b/server/src/modules/webhook/webhook.types.ts @@ -0,0 +1,19 @@ +import type { RazorpayWebhookNotes } from '../booking/booking.types'; + +export interface RazorpayPaymentEntity { + id: string; + order_id: string; + amount: number; + currency: string; + method?: string; + notes: RazorpayWebhookNotes; +} + +export interface RazorpayWebhookPayload { + event: string; + payload?: { + payment?: { + entity?: RazorpayPaymentEntity; + }; + }; +} diff --git a/server/src/modules/wishlist/wishlist.controller.ts b/server/src/modules/wishlist/wishlist.controller.ts new file mode 100644 index 0000000000..5163924491 --- /dev/null +++ b/server/src/modules/wishlist/wishlist.controller.ts @@ -0,0 +1,93 @@ +import type { Request, Response } from 'express'; +import { ResponseUtil } from '../../utils/responseUtils'; +import * as service from './wishlist.service'; +import { handleError } from '../../utils/errors'; + +export const toggleWishlist = async (req: Request, res: Response): Promise => { + try { + const userId = req.user?.userId; + if (!userId) { + ResponseUtil.unauthorized(res, 'Unauthorized'); + return; + } + + const venueId = Array.isArray(req.params.venueId) ? req.params.venueId[0] : req.params.venueId; + const result = await service.toggleWishlist(userId, venueId); + + ResponseUtil.success( + res, + result.wishlisted ? 'Added to wishlist' : 'Removed from wishlist', + result + ); + } catch (err) { + handleError(res, err, 'toggleWishlist'); + } +}; + +export const syncWishlist = async (req: Request, res: Response): Promise => { + try { + const userId = req.user?.userId; + if (!userId) { + ResponseUtil.unauthorized(res, 'Unauthorized'); + return; + } + + const { venueIds } = req.validated?.body as { venueIds: string[] }; + const status = await service.syncWishlist(userId, venueIds); + + ResponseUtil.success(res, 'Wishlist synced successfully', status); + } catch (err) { + handleError(res, err, 'syncWishlist'); + } +}; + +export const getMyWishlist = async (req: Request, res: Response): Promise => { + try { + const userId = req.user?.userId; + if (!userId) { + ResponseUtil.unauthorized(res, 'Unauthorized'); + return; + } + + const paginationParams = req.pagination ?? { page: 1, limit: 20, skip: 0, sort: '' }; + const result = await service.getMyWishlist(userId, paginationParams); + + ResponseUtil.paginated( + res, + 'Wishlist retrieved successfully', + result.venues, + result.pagination, + 'venues' + ); + } catch (err) { + handleError(res, err, 'getMyWishlist'); + } +}; + +export const getWishlistStatus = async (req: Request, res: Response): Promise => { + try { + const userId = req.user?.userId; + if (!userId) { + ResponseUtil.unauthorized(res, 'Unauthorized'); + return; + } + + const { venueIds } = req.query; + const venueIdArray = Array.isArray(venueIds) + ? (venueIds as string[]) + : typeof venueIds === 'string' + ? venueIds.split(',') + : []; + + // Cap at 100 IDs to prevent abuse + if (venueIdArray.length > 100) { + ResponseUtil.badRequest(res, 'Maximum 100 venue IDs allowed'); + return; + } + + const status = await service.getWishlistStatus(userId, venueIdArray); + ResponseUtil.success(res, 'Wishlist status retrieved', status); + } catch (err) { + handleError(res, err, 'getWishlistStatus'); + } +}; diff --git a/server/src/modules/wishlist/wishlist.model.ts b/server/src/modules/wishlist/wishlist.model.ts new file mode 100644 index 0000000000..3bd19c27b0 --- /dev/null +++ b/server/src/modules/wishlist/wishlist.model.ts @@ -0,0 +1,43 @@ +import mongoose, { Schema } from 'mongoose'; +import type { Document } from 'mongoose'; + +export interface IWishlistItem extends Document { + userId: mongoose.Types.ObjectId; + venueId: mongoose.Types.ObjectId; + createdAt: Date; + updatedAt: Date; +} + +const WishlistSchema = new Schema( + { + userId: { + type: Schema.Types.ObjectId, + ref: 'Users', + required: true, + }, + venueId: { + type: Schema.Types.ObjectId, + ref: 'Venues', + required: true, + }, + }, + { timestamps: true } +); + +// Unique compound index: one wishlist entry per user-venue pair +WishlistSchema.index( + { userId: 1, venueId: 1 }, + { + unique: true, + name: 'idx_user_venue_unique', + } +); + +// Index for "My Wishlist" listing (user + most recent first) +WishlistSchema.index({ userId: 1, createdAt: -1 }, { name: 'idx_user_recency' }); + +export const WishlistModel = mongoose.model( + 'Wishlists', + WishlistSchema, + 'Wishlists' +); diff --git a/server/src/modules/wishlist/wishlist.repository.ts b/server/src/modules/wishlist/wishlist.repository.ts new file mode 100644 index 0000000000..2452660c37 --- /dev/null +++ b/server/src/modules/wishlist/wishlist.repository.ts @@ -0,0 +1,82 @@ +import type { PaginationParams, PaginatedResponse } from '../../types/pagination.types'; +import { buildPaginationMeta } from '../../utils/paginationUtils'; +import { WishlistModel, type IWishlistItem } from './wishlist.model'; +import { VenueModel } from '../venue/venue.model'; +import type { IVenue } from '../venue/venue.types'; +import mongoose from 'mongoose'; + +const toObjectId = (id: string): mongoose.Types.ObjectId => { + return new mongoose.Types.ObjectId(id); +}; + +export async function addToWishlist(userId: string, venueId: string): Promise { + const result = await WishlistModel.findOneAndUpdate( + { userId: toObjectId(userId), venueId: toObjectId(venueId) }, + { userId: toObjectId(userId), venueId: toObjectId(venueId) }, + { upsert: true, new: true } + ).exec(); + + return result; +} + +export async function removeFromWishlist(userId: string, venueId: string): Promise { + await WishlistModel.deleteOne({ + userId: toObjectId(userId), + venueId: toObjectId(venueId), + }).exec(); +} + +export async function isWishlisted(userId: string, venueId: string): Promise { + const result = await WishlistModel.exists({ + userId: toObjectId(userId), + venueId: toObjectId(venueId), + }).exec(); + + return !!result; +} + +export async function findUserWishlist( + userId: string, + paginationParams: PaginationParams +): Promise> { + const { limit, skip } = paginationParams; + + const [venues, total] = await Promise.all([ + WishlistModel.find({ userId: toObjectId(userId) }) + .sort({ createdAt: -1 }) + .skip(skip) + .limit(limit) + .populate({ + path: 'venueId', + model: VenueModel, + match: { active: true, deleted: false, status: 'Approved' }, + select: + '_id name description venueType city district coverImage maxCapacity avgRating reviewCount flexibleBooking amenities pricing fixedPackages bookingType', + }) + .lean() + .exec() + .then((items) => items.map((item) => item.venueId as unknown as IVenue).filter(Boolean)), + + WishlistModel.countDocuments({ userId: toObjectId(userId) }).exec(), + ]); + + return { + venues, + pagination: buildPaginationMeta(total, paginationParams), + }; +} + +export async function getWishlistedVenueIds( + userId: string, + venueIds: string[] +): Promise> { + const wishlisted = await WishlistModel.find({ + userId: toObjectId(userId), + venueId: { $in: venueIds.map(toObjectId) }, + }) + .select('venueId') + .lean() + .exec(); + + return new Set(wishlisted.map((item) => item.venueId.toString())); +} diff --git a/server/src/modules/wishlist/wishlist.router.ts b/server/src/modules/wishlist/wishlist.router.ts new file mode 100644 index 0000000000..996e38fe54 --- /dev/null +++ b/server/src/modules/wishlist/wishlist.router.ts @@ -0,0 +1,131 @@ +import { Router } from 'express'; +import { verifyAccessToken } from '../../middlewares/auth.middleware'; +import { requirePermission } from '../../middlewares/rbac.middleware'; +import { PERMISSIONS as P } from '../../constants/permissions'; +import { paginationMiddleware } from '../../middlewares/pagination.middleware'; +import { validateBody } from '../../middlewares/validation.middleware'; +import * as validator from './wishlist.validator'; +import * as controller from './wishlist.controller'; + +const router: Router = Router(); + +/** + * @openapi + * /wishlist/toggle/{venueId}: + * post: + * tags: [Wishlist] + * summary: Toggle a venue in user's wishlist + * security: + * - bearerAuth: [] + * parameters: + * - in: path + * name: venueId + * required: true + * schema: + * type: string + * responses: + * 200: + * description: Wishlist toggled successfully + * 401: + * description: Not authenticated + * 403: + * description: Insufficient permissions + * 404: + * description: Venue not found + */ +router + .route('/toggle/:venueId') + .post(verifyAccessToken, requirePermission(P.wishlist.create), controller.toggleWishlist); + +/** + * @openapi + * /wishlist: + * get: + * tags: [Wishlist] + * summary: Get user's wishlist (paginated) + * security: + * - bearerAuth: [] + * parameters: + * - in: query + * name: page + * schema: + * type: integer + * - in: query + * name: limit + * schema: + * type: integer + * responses: + * 200: + * description: Wishlist retrieved successfully + * 401: + * description: Not authenticated + */ +router + .route('/') + .get( + verifyAccessToken, + requirePermission(P.wishlist.read), + paginationMiddleware(), + controller.getMyWishlist + ); + +/** + * @openapi + * /wishlist/status: + * get: + * tags: [Wishlist] + * summary: Check wishlist status for multiple venues + * security: + * - bearerAuth: [] + * parameters: + * - in: query + * name: venueIds + * schema: + * type: string + * description: Comma-separated venue IDs (max 100) + * responses: + * 200: + * description: Wishlist statuses for requested venues + * 401: + * description: Not authenticated + */ +router + .route('/status') + .get(verifyAccessToken, requirePermission(P.wishlist.read), controller.getWishlistStatus); + +/** + * @openapi + * /wishlist/sync: + * post: + * tags: [Wishlist] + * summary: Merge a guest's locally-stored wishlist into the user's account + * security: + * - bearerAuth: [] + * requestBody: + * required: true + * content: + * application/json: + * schema: + * type: object + * required: [venueIds] + * properties: + * venueIds: + * type: array + * items: + * type: string + * responses: + * 200: + * description: Wishlist synced successfully + * 401: + * description: Not authenticated + */ +router + .route('/sync') + .post( + verifyAccessToken, + requirePermission(P.wishlist.create), + validateBody(validator.syncWishlistBodySchema), + controller.syncWishlist + ); + +export { router as wishlistRouter }; diff --git a/server/src/modules/wishlist/wishlist.service.ts b/server/src/modules/wishlist/wishlist.service.ts new file mode 100644 index 0000000000..dd6d0c6989 --- /dev/null +++ b/server/src/modules/wishlist/wishlist.service.ts @@ -0,0 +1,64 @@ +import * as repo from './wishlist.repository'; +import type { PaginationParams, PaginatedResponse } from '../../types/pagination.types'; +import type { IVenue } from '../venue/venue.types'; +import { venueExists, findVenuesByIds } from '../venue/venue.repository'; +import { NotFoundError } from '../../utils/errors'; +import type { WishlistResponse, WishlistStatusResponse } from './wishlist.types'; + +export async function toggleWishlist(userId: string, venueId: string): Promise { + // Verify venue exists + const venueExistsFlag = await venueExists(venueId); + if (!venueExistsFlag) { + throw new NotFoundError('Venue not found'); + } + + // Check if already wishlisted + const isCurrentlyWishlisted = await repo.isWishlisted(userId, venueId); + + if (isCurrentlyWishlisted) { + // Remove from wishlist + await repo.removeFromWishlist(userId, venueId); + return { wishlisted: false }; + } else { + // Add to wishlist + await repo.addToWishlist(userId, venueId); + return { wishlisted: true }; + } +} + +export async function syncWishlist( + userId: string, + venueIds: string[] +): Promise { + if (!venueIds.length) return {}; + + const existingVenues = await findVenuesByIds(venueIds); + const validVenueIds = existingVenues.map((v: { _id: { toString(): string } }) => + v._id.toString() + ); + + await Promise.all(validVenueIds.map((venueId: string) => repo.addToWishlist(userId, venueId))); + + return getWishlistStatus(userId, venueIds); +} + +export async function getMyWishlist( + userId: string, + paginationParams: PaginationParams +): Promise> { + return repo.findUserWishlist(userId, paginationParams); +} + +export async function getWishlistStatus( + userId: string, + venueIds: string[] +): Promise { + if (!venueIds.length) return {}; + + const wishlisted = await repo.getWishlistedVenueIds(userId, venueIds); + + return venueIds.reduce((acc, venueId) => { + acc[venueId] = wishlisted.has(venueId); + return acc; + }, {}); +} diff --git a/server/src/modules/wishlist/wishlist.types.ts b/server/src/modules/wishlist/wishlist.types.ts new file mode 100644 index 0000000000..8b5495a152 --- /dev/null +++ b/server/src/modules/wishlist/wishlist.types.ts @@ -0,0 +1,13 @@ +export interface IWishlistItem { + _id: string; + userId: string; + venueId: string; + createdAt: Date; + updatedAt: Date; +} + +export interface WishlistResponse { + wishlisted: boolean; +} + +export type WishlistStatusResponse = Record; diff --git a/server/src/modules/wishlist/wishlist.validator.ts b/server/src/modules/wishlist/wishlist.validator.ts new file mode 100644 index 0000000000..e07a068f68 --- /dev/null +++ b/server/src/modules/wishlist/wishlist.validator.ts @@ -0,0 +1,5 @@ +import { z } from 'zod'; + +export const syncWishlistBodySchema = z.object({ + venueIds: z.array(z.string().trim().min(1)).max(200), +}); diff --git a/server/src/router.ts b/server/src/router.ts new file mode 100644 index 0000000000..a1f641a57b --- /dev/null +++ b/server/src/router.ts @@ -0,0 +1,47 @@ +import { Router } from 'express'; +import { ResponseUtil } from './utils/responseUtils'; +import { authRouter } from './modules/auth/auth.router'; +import { userRouter } from './modules/user/user.router'; +import { venueRouter } from './modules/venue/venue.router'; +import { bookingRouter } from './modules/booking/booking.router'; +import { rbacRouter } from './modules/rbac/rbac.router'; +import { availabilityRouter } from './modules/availability/availability.router'; +import { roleRouter } from './modules/role/role.router'; +import { swaggerRouter } from './modules/swagger/swagger.router'; +import ownerRouter from './modules/owner/owner.router'; +import { geoRouter } from './modules/geo/geo.router'; +import { wishlistRouter } from './modules/wishlist/wishlist.router'; +import { reviewRouter } from './modules/review/review.router'; +import { moderationRouter } from './modules/moderation/moderation.router'; + +const router: Router = Router(); + +/** + * @openapi + * /health: + * get: + * tags: [Health] + * summary: Server health check + * responses: + * 200: + * description: Service is healthy + */ +router.get('/health', (_req, res) => { + ResponseUtil.success(res, 'Service is healthy'); +}); + +router.use('/auth', authRouter); +router.use('/user', userRouter); +router.use('/venues', venueRouter); +router.use('/bookings', bookingRouter); +router.use('/availability', availabilityRouter); +router.use('/rbac', rbacRouter); +router.use('/role', roleRouter); +router.use('/swagger', swaggerRouter); +router.use('/owner', ownerRouter); +router.use('/geo', geoRouter); +router.use('/wishlist', wishlistRouter); +router.use('/reviews', reviewRouter); +router.use('/moderation', moderationRouter); + +export default router; diff --git a/server/src/server.ts b/server/src/server.ts new file mode 100644 index 0000000000..93fc35f1af --- /dev/null +++ b/server/src/server.ts @@ -0,0 +1,37 @@ +import 'dotenv/config'; +import type { Server } from 'http'; + +import { app } from './app'; +import { connectDatabase } from './configs/database.config'; +import { validateEnv } from './configs/envValidation.config'; +import { validateEmailConfig } from './services/email.service'; +import { startEmailWorker } from './workers/email.worker'; +import { startBanExpiryWorker } from './workers/banExpiry.worker'; +import { startAutoSuspendWorker } from './workers/venueEditDeadline.worker'; +import { startBookingStatusWorker } from './workers/bookingStatus.worker'; +import { setupGracefulShutdown } from './utils/shutdownUtils'; +import { logInfo } from './utils/logger'; +import { verifyRbacSeed } from './services/roles.service'; + +const PORT = parseInt(process.env.PORT ?? '3000', 10); + +let server: Server | null = null; + +// Start server +async function startServer(): Promise { + validateEnv(); + validateEmailConfig(); + await connectDatabase(); + await verifyRbacSeed(); + startEmailWorker(); + startBanExpiryWorker(); + startAutoSuspendWorker(); + startBookingStatusWorker(); + server = app.listen(PORT, '0.0.0.0', () => { + logInfo(`Server started on port ${String(PORT)}`); + }); + // Register shutdown handlers AFTER server is assigned so the getter returns the live instance + setupGracefulShutdown(() => server); +} + +void startServer(); diff --git a/server/src/services/cache/permission-cache.service.ts b/server/src/services/cache/permission-cache.service.ts new file mode 100644 index 0000000000..3b30f35da3 --- /dev/null +++ b/server/src/services/cache/permission-cache.service.ts @@ -0,0 +1,103 @@ +import type { IPermission } from '../../constants/permissions'; +import { fetchRolePermissions } from '../roles.service'; +import { logInfo } from '../../utils/logger'; + +interface CacheEntry { + permissions: string[]; + roleName: string; + timestamp: number; +} + +export interface CacheStatEntry { + roleId: string; + roleName: string; + permissionCount: number; + ageSeconds: number; +} + +const store = new Map(); + +const TTL_MS = 15 * 60 * 1000; // 15mins (same as accessToken TTL) +const CLEANUP_INTERVAL_MS = 5 * 60 * 1000; // 5mins + +// Pure helpers +const isExpired = (entry: CacheEntry): boolean => Date.now() - entry.timestamp > TTL_MS; + +const ageInSeconds = (entry: CacheEntry): number => + Math.round((Date.now() - entry.timestamp) / 1000); + +// Internal read/write +const getEntry = (roleId: string): CacheEntry | null => { + const entry = store.get(roleId); + if (!entry) return null; + if (isExpired(entry)) { + store.delete(roleId); + return null; + } + return entry; +}; + +const setEntry = (roleId: string, roleName: string, permissions: string[]): void => { + store.set(roleId, { permissions, roleName, timestamp: Date.now() }); +}; + +const resolveAndCache = async (roleId: string, roleName: string): Promise => { + const permissions = await fetchRolePermissions(roleId); + setEntry(roleId, roleName, permissions); + return permissions; +}; + +// Public API + +/** + * Cache-first permission lookup. + * Cache hit → returns in-memory set (no DB). + * Cache miss → runs $graphLookup aggregation, stores result, returns it. + */ +export const getPerms = async (roleId: string, roleName: string): Promise => { + const cached = getEntry(roleId); + const permissions = cached ? cached.permissions : await resolveAndCache(roleId, roleName); + return permissions as IPermission[]; +}; + +// Invalidate a single role's cache entry. +export const invalidateRole = (roleId: string): void => { + const existed = store.delete(roleId); + if (existed) { + logInfo('Permission cache invalidated', { roleId }); + } +}; + +// Clear the entire cache. +// Use after bulk permission changes or schema migrations. +export const clearAll = (): void => { + const size = store.size; + store.clear(); + logInfo('Permission cache cleared', { removed: size }); +}; + +export const getStats = (): { size: number; entries: CacheStatEntry[] } => { + const entries = Array.from(store.entries()).map(([roleId, entry]) => ({ + roleId, + roleName: entry.roleName, + permissionCount: entry.permissions.length, + ageSeconds: ageInSeconds(entry), + })); + return { size: store.size, entries }; +}; + +// Background cleanup +const cleanupExpired = (): void => { + let removed = 0; + for (const [roleId, entry] of store.entries()) { + if (isExpired(entry)) { + store.delete(roleId); + removed++; + } + } + if (removed > 0) { + logInfo('Permission cache cleanup', { removed }); + } +}; + +setInterval(cleanupExpired, CLEANUP_INTERVAL_MS).unref(); diff --git a/server/src/services/email.repository.ts b/server/src/services/email.repository.ts new file mode 100644 index 0000000000..e89cf6a721 --- /dev/null +++ b/server/src/services/email.repository.ts @@ -0,0 +1,22 @@ +import { EmailTaskModel } from '../models/email-task.model'; +import type { EmailIntentType, EmailTaskStatusType } from '../constants/email.constants'; + +const SEVEN_DAYS_MS = 7 * 24 * 60 * 60 * 1000; + +export async function enqueueEmailTask( + recipient: string, + intent: EmailIntentType, + subject: string, + status: EmailTaskStatusType, + metadata: Record +): Promise { + await EmailTaskModel.create({ + recipient, + intent, + subject, + status, + retryAfter: new Date(), + metadata, + deleteAt: new Date(Date.now() + SEVEN_DAYS_MS), + }); +} diff --git a/server/src/services/email.service.ts b/server/src/services/email.service.ts new file mode 100644 index 0000000000..686bd603d6 --- /dev/null +++ b/server/src/services/email.service.ts @@ -0,0 +1,384 @@ +import { Resend } from 'resend'; +import { z } from 'zod'; +import { EmailIntent, type EmailIntentType } from '../constants/email.constants'; +import { resendConfig } from '../constants/env'; +import { logError, logInfo } from '../utils/logger'; +import { + getPasswordResetTemplate, + getPasswordChangedTemplate, + getBookingConfirmationTemplate, + getRefundNotificationTemplate, + getBookingCancellationTemplate, + getVenueApprovedTemplate, + getVenueRejectedTemplate, + getVenueSuspendedTemplate, + getVenueUnsuspendedTemplate, + getVenueDeadlineExtendedTemplate, + getAdminPasswordResetTemplate, + getUserBannedTemplate, + getUserUnbannedTemplate, + getReviewRemovedTemplate, + getReviewRestoredTemplate, +} from './emailTemplateFactory'; + +// Validates required email configuration on startup. +export function validateEmailConfig(): void { + const missing: string[] = []; + + if (!resendConfig.apiKey) missing.push('RESEND_API_KEY'); + if (!resendConfig.fromName) missing.push('EMAIL_FROM_NAME'); + if (!resendConfig.fromEmail) missing.push('EMAIL_FROM_EMAIL'); + if (!resendConfig.devToEmail) missing.push('RESEND_DEV_EMAIL_ADDRESS'); + if (!resendConfig.frontendUrl) missing.push('FRONTEND_URL'); + + if (missing.length > 0) { + logError('Missing required email environment variables', { + module: 'email.service.ts/validateEmailConfig', + missing, + }); + process.exit(1); + } + + logInfo('Email config validated'); +} + +let _resend: Resend | null = null; + +function getResendClient(): Resend { + if (!_resend) { + if (!resendConfig.apiKey) { + throw new Error('RESEND_API_KEY is not set'); + } + _resend = new Resend(resendConfig.apiKey); + } + return _resend; +} + +export interface SendEmailResult { + success: boolean; + messageId?: string; +} + +// Email input validation +const emailAddressSchema = z.email('Invalid recipient email address'); + +function validateRecipient(email: string): string { + if (process.env.NODE_ENV === 'development') { + const res = resendConfig.devToEmail ?? ''; + if (!emailAddressSchema.safeParse(res).success) { + throw new Error('Invalid development recipient email address'); + } + return res; + } + return emailAddressSchema.parse(email); +} + +// Core send helper +async function sendEmail( + to: string, + subject: string, + html: string, + intent: EmailIntentType +): Promise { + const from = `${resendConfig.fromName ?? ''} <${resendConfig.fromEmail ?? ''}>`; + + try { + const resend = getResendClient(); + const { data, error } = await resend.emails.send({ from, to, subject, html }); + + if (error) { + logError('Email delivery failed', { + module: 'email.service.ts/sendEmail', + intent, + recipient: to, + providerError: error.message, + }); + return { success: false }; + } + + logInfo('Email sent successfully', { + intent, + recipient: to, + messageId: data.id, + }); + + return { success: true, messageId: data.id }; + } catch (e) { + const err = e as Error; + logError('Email service encountered an unexpected error', { + module: 'email.service.ts/sendEmail', + intent, + recipient: to, + error: err.message, + }); + return { success: false }; + } +} + +class EmailService { + // Sends a password reset email. + // @param email - Recipient email address + // @param resetLink - Fully-qualified HTTPS reset URL (token included) + async sendPasswordResetEmail(email: string, resetLink: string): Promise { + const validatedRecipientEmail = validateRecipient(email); + const appName = resendConfig.appName; + const html = getPasswordResetTemplate(resetLink, email); + + return sendEmail( + validatedRecipientEmail, + `Reset your ${appName} password`, + html, + 'password_reset' + ); + } + + // Sends an admin password reset email + async sendAdminPasswordResetEmail( + email: string, + newPassword: string, + username: string + ): Promise { + const validatedRecipientEmail = validateRecipient(email); + const appName = resendConfig.appName; + const html = getAdminPasswordResetTemplate(newPassword, username); + + return sendEmail( + validatedRecipientEmail, + `Your ${appName} password has been reset`, + html, + 'admin_password_reset' + ); + } + + // Sends a security notification informing the user that their password was changed. + // @param email - Recipient email address + async sendPasswordChangedEmail(email: string): Promise { + const validatedRecipientEmail = validateRecipient(email); + const appName = resendConfig.appName; + const html = getPasswordChangedTemplate(); + + return sendEmail( + validatedRecipientEmail, + `Your ${appName} password was changed`, + html, + 'security_alert' + ); + } + + // Booking flow emails + // Sends a booking confirmation email to the customer. + // @param email - Customer email address + // @param details - Booking details for rendering the email body + async sendBookingConfirmation( + email: string, + details: { + venueName: string; + date: string; + startTime: string; + endTime: string; + amount: number; + paymentReference: string; + } + ): Promise { + const validatedRecipientEmail = validateRecipient(email); + const html = getBookingConfirmationTemplate(details); + + return sendEmail( + validatedRecipientEmail, + `Booking Confirmed – ${details.venueName} on ${details.date}`, + html, + EmailIntent.BOOKING_CONFIRMATION + ); + } + + // Sends a refund notification to the customer when their booking fails + // due to a slot collision after the lock TTL expired. + async sendRefundNotification( + email: string, + details: { + venueName: string; + date: string; + startTime: string; + endTime: string; + amount: number; + refundReference: string; + } + ): Promise { + const validatedRecipientEmail = validateRecipient(email); + const html = getRefundNotificationTemplate(details); + + return sendEmail( + validatedRecipientEmail, + `Booking Failed – Full Refund Initiated for ${details.venueName}`, + html, + EmailIntent.BOOKING_REFUND + ); + } + + // Sends a cancellation notification with refund details. + async sendBookingCancellationEmail( + email: string, + details: { + venueName: string; + date: string; + timeRange: string; + refundAmount: number; + bookingRef: string; + } + ): Promise { + const validatedRecipientEmail = validateRecipient(email); + const html = getBookingCancellationTemplate(details); + + return sendEmail( + validatedRecipientEmail, + `Booking Cancelled – ${details.venueName}`, + html, + EmailIntent.BOOKING_CANCELLATION + ); + } + + // Venue status emails + async sendVenueApprovedEmail(email: string, venueName: string): Promise { + const validatedRecipientEmail = validateRecipient(email); + const html = getVenueApprovedTemplate(venueName); + + return sendEmail( + validatedRecipientEmail, + `Your Venue "${venueName}" has been Approved!`, + html, + EmailIntent.VENUE_APPROVED + ); + } + + async sendVenueRejectedEmail( + email: string, + venueName: string, + reason: string, + editDeadline: Date, + submissionNumber: number + ): Promise { + const validatedRecipientEmail = validateRecipient(email); + const html = getVenueRejectedTemplate(venueName, reason, editDeadline, submissionNumber); + + return sendEmail( + validatedRecipientEmail, + `Application Update: Venue "${venueName}"`, + html, + EmailIntent.VENUE_REJECTED + ); + } + + async sendVenueSuspendedEmail( + email: string, + venueName: string, + reason: string + ): Promise { + const validatedRecipientEmail = validateRecipient(email); + const html = getVenueSuspendedTemplate(venueName, reason); + + return sendEmail( + validatedRecipientEmail, + `Important: Your Venue "${venueName}" has been Suspended`, + html, + EmailIntent.VENUE_SUSPENDED + ); + } + + async sendVenueUnsuspendedEmail(email: string, venueName: string): Promise { + const validatedRecipientEmail = validateRecipient(email); + const html = getVenueUnsuspendedTemplate(venueName); + + return sendEmail( + validatedRecipientEmail, + `Your Venue "${venueName}" has been Reactivated`, + html, + EmailIntent.VENUE_UNSUSPENDED + ); + } + + async sendVenueDeadlineExtendedEmail( + email: string, + venueName: string, + newDeadline: Date + ): Promise { + const validatedRecipientEmail = validateRecipient(email); + const html = getVenueDeadlineExtendedTemplate(venueName, newDeadline); + + return sendEmail( + validatedRecipientEmail, + `Edit Deadline Extended for "${venueName}"`, + html, + EmailIntent.VENUE_UNSUSPENDED // reuse existing intent or create new one + ); + } + + // Moderation emails + async sendUserBannedEmail( + email: string, + details: { + scope: string; + reason: string; + expiresAt: Date | null; + venueName?: string; + } + ): Promise { + const validatedRecipientEmail = validateRecipient(email); + const html = getUserBannedTemplate( + details.scope, + details.reason, + details.expiresAt, + details.venueName + ); + + return sendEmail( + validatedRecipientEmail, + 'Account Restriction Applied', + html, + EmailIntent.USER_BANNED + ); + } + + async sendUserUnbannedEmail(email: string): Promise { + const validatedRecipientEmail = validateRecipient(email); + const html = getUserUnbannedTemplate(); + + return sendEmail( + validatedRecipientEmail, + 'Account Restriction Lifted', + html, + EmailIntent.USER_UNBANNED + ); + } + + async sendReviewRemovedEmail( + email: string, + details: { + venueName: string; + reason: string; + } + ): Promise { + const validatedRecipientEmail = validateRecipient(email); + const html = getReviewRemovedTemplate(details.venueName, details.reason); + + return sendEmail( + validatedRecipientEmail, + 'Your Review Has Been Removed', + html, + EmailIntent.REVIEW_REMOVED + ); + } + + async sendReviewRestoredEmail(email: string, venueName: string): Promise { + const validatedRecipientEmail = validateRecipient(email); + const html = getReviewRestoredTemplate(venueName); + + return sendEmail( + validatedRecipientEmail, + 'Your Review Has Been Restored', + html, + EmailIntent.REVIEW_RESTORED + ); + } +} + +export const emailService = new EmailService(); diff --git a/server/src/services/emailTemplateFactory.ts b/server/src/services/emailTemplateFactory.ts new file mode 100644 index 0000000000..39271d256c --- /dev/null +++ b/server/src/services/emailTemplateFactory.ts @@ -0,0 +1,640 @@ +import { resendConfig } from '../constants/env'; +import { VENUE_CONSTANTS } from '../constants/venue.constants'; + +function buildEmailWrapper(bodyContent: string): string { + const appName = resendConfig.appName; + const currentYear = new Date().getFullYear(); + + return ` + + + + + + ${appName} + + + + + + +
+ + + + + + + + + + + + + +
+ ${appName} +
+ ${bodyContent} +
+
+
+

+ This email was sent by ${appName}. If you have questions, reply to this email. +

+

+ If you did not request this, you can safely ignore this email. + Your account remains secure and no action is required. +

+

+ © ${String(currentYear)} ${appName}. All rights reserved. +

+
+
+ +`; +} + +export function getPasswordResetTemplate(resetLink: string, email: string): string { + const appName = resendConfig.appName; + const isDev = process.env.NODE_ENV === 'development'; + + const bodyContent = ` +

Reset your password

+

+ We received a request to reset the password for your ${appName} account. + Click the button below to choose a new password. +

+ + + + +
+ + Reset Password + +
+

+ This link expires in 15 minutes. After that you will need to request a new one. +

+ + + + +
+

+ Security notice: If you did not request a password reset, + please ignore this email. Your password will not be changed and your account + remains secure. +

+
+

+ If the button above does not work, copy and paste the following URL into your browser. + Do not share this link with anyone. +

+

+ ${resetLink} +

+ ${isDev ? `

Development mode - Email sent to ${email}

` : ''} + `; + + return buildEmailWrapper(bodyContent); +} + +// Admin Password Reset Template +export function getAdminPasswordResetTemplate(newPassword: string, username: string): string { + const appName = resendConfig.appName; + const bodyContent = ` +

Your Password Has Been Reset

+

+ Hi ${username}, an administrator has reset your password for your ${appName} account. +

+
+

Your new temporary password is:

+

${newPassword}

+
+

+ Please log in with this new password and change it immediately from your profile settings. +

+ `; + + return buildEmailWrapper(bodyContent); +} + +export function getPasswordChangedTemplate(): string { + const appName = resendConfig.appName; + + const bodyContent = ` +

Your password was changed

+

+ The password for your ${appName} account was successfully changed. +

+ + + + +
+

+ Was this you? No action is required. Your account is secure.
+ Was this NOT you? Contact our support team immediately so we can + help secure your account. +

+
+

+ For your security, all active sessions have been signed out. You will need to log in + again with your new password. +

+ `; + + return buildEmailWrapper(bodyContent); +} + +export function getBookingConfirmationTemplate(details: { + venueName: string; + date: string; + startTime: string; + endTime: string; + amount: number; + paymentReference: string; +}): string { + const bodyContent = ` +

Booking Confirmed! 🎉

+

+ Your booking at ${details.venueName} is confirmed. + Here's a summary of your reservation. +

+ + + + +
+

Venue

+

${details.venueName}

+

Date

+

${details.date}

+

Time

+

${details.startTime} – ${details.endTime}

+

Amount Paid

+

₹${details.amount.toLocaleString('en-IN')}

+
+

+ Payment Reference: ${details.paymentReference} +

+

+ We look forward to hosting your event. If you have any questions, please reply to this email. +

+ `; + + return buildEmailWrapper(bodyContent); +} + +export function getRefundNotificationTemplate(details: { + venueName: string; + date: string; + startTime: string; + endTime: string; + amount: number; + refundReference: string; +}): string { + const appName = resendConfig.appName; + + const bodyContent = ` +

Booking Unsuccessful – Refund Initiated

+

+ We're sorry — by the time your payment was processed, the selected slot at + ${details.venueName} had been booked by another customer. + We have initiated a full refund. +

+ + + + +
+

Venue

+

${details.venueName}

+

Requested Date

+

${details.date}

+

Time Slot

+

${details.startTime} – ${details.endTime}

+

Refund Amount

+

₹${details.amount.toLocaleString('en-IN')}

+
+ + + + +
+

+ Refund Timeline: Refunds typically reflect in your account within + 5–7 business days depending on your bank. +

+
+

+ Refund Reference: ${details.refundReference} +

+

+ We apologise for the inconvenience. Please try booking another available slot on ${appName}. +

+ `; + + return buildEmailWrapper(bodyContent); +} + +export function getBookingCancellationTemplate(details: { + venueName: string; + date: string; + timeRange: string; + refundAmount: number; + bookingRef: string; +}): string { + const appName = resendConfig.appName; + + const bodyContent = ` +

Booking Cancelled

+

+ Your booking at ${details.venueName} has been successfully cancelled. +

+ + + + +
+

Venue

+

${details.venueName}

+

Date

+

${details.date}

+

Time Slot

+

${details.timeRange}

+

Refund Amount

+

₹${details.refundAmount.toLocaleString('en-IN')}

+
+ + + + +
+

+ Important notice: If this cancellation was a mistake or was not done by you, + please contact our support team immediately. +

+
+

+ Booking Reference: ${details.bookingRef} +

+

+ We hope to host you another time on ${appName}. +

+ `; + return buildEmailWrapper(bodyContent); +} + +export function getVenueApprovedTemplate(venueName: string): string { + const bodyContent = ` +

Venue Approved! 🎉

+

+ Great news! Your venue ${venueName} has been approved by our admin team and is now live on the platform. +

+ + + + +
+

+ Users can now view and book your venue. Make sure your availability and pricing are up to date! +

+
+ `; + return buildEmailWrapper(bodyContent); +} + +export function getVenueRejectedTemplate( + venueName: string, + reason: string, + editDeadline: Date, + submissionNumber: number +): string { + const deadlineStr = editDeadline.toLocaleDateString('en-IN', { + day: 'numeric', + month: 'long', + year: 'numeric', + }); + const daysLeft = Math.ceil((editDeadline.getTime() - Date.now()) / (24 * 60 * 60 * 1000)); + + const maxAttempts = VENUE_CONSTANTS.MAX_SUBMISSION_ATTEMPTS.toString(); + + const attemptNotice = + submissionNumber >= 7 + ? `

+ This is submission attempt #${String(submissionNumber)} of ${maxAttempts}. +

` + : ''; + + const bodyContent = ` +

Venue Application Update

+

+ We reviewed your application for ${venueName}, but unfortunately, we cannot approve it at this time. +

+ + + + +
+

Reason for Rejection:

+

${reason}

+
+ ${attemptNotice} + + + + +
+

⏰ Action Required: Edit & Resubmit

+

+ You have ${daysLeft.toString()} days (until ${deadlineStr}) + to edit your venue and resubmit for review. +

+

+ After this deadline, your venue will be auto-suspended and no longer editable. +

+
+

+ You can update your venue details in the owner dashboard and submit it again for review once the issues have been addressed. +

+ `; + return buildEmailWrapper(bodyContent); +} + +export function getVenueSuspendedTemplate(venueName: string, reason: string): string { + const bodyContent = ` +

Venue Suspended

+

+ Your venue ${venueName} has been temporarily suspended by our admin team and is currently not visible to users. +

+ + + + +
+

Reason for Suspension:

+

${reason}

+
+

+ Please contact our support team to resolve this issue and have your venue unsuspended. +

+ `; + return buildEmailWrapper(bodyContent); +} + +export function getVenueUnsuspendedTemplate(venueName: string): string { + const bodyContent = ` +

Your Venue Has Been Reactivated ✅

+

+ Great news! Your venue ${venueName} has been reactivated and is now visible to customers again. +

+ + + + +
+

Venue

+

${venueName}

+
+

+ You can now manage your venue and accept bookings as usual. If you have any questions, please reply to this email. +

+ `; + + return buildEmailWrapper(bodyContent); +} + +export function getVenueDeadlineExtendedTemplate(venueName: string, newDeadline: Date): string { + const deadlineStr = newDeadline.toLocaleDateString('en-IN', { + day: 'numeric', + month: 'long', + year: 'numeric', + }); + const daysLeft = Math.ceil((newDeadline.getTime() - Date.now()) / (24 * 60 * 60 * 1000)); + + const bodyContent = ` +

Edit Deadline Extended ✅

+

+ Good news! The deadline to edit and resubmit your venue ${venueName} has been extended. +

+ + + + +
+

New Deadline

+

${deadlineStr}

+

+ You now have ${daysLeft.toString()} days to make changes and resubmit. +

+
+

+ Please update your venue details and submit for review before the new deadline. +

+ `; + return buildEmailWrapper(bodyContent); +} + +interface BanScopeDisplay { + label: string; + description: string; +} + +function getBanScopeDisplay(scope: string, venueName?: string): BanScopeDisplay { + switch (scope) { + case 'full': + return { + label: 'Full Platform Ban', + description: + 'You cannot access any features of the platform. Your account has been deactivated.', + }; + case 'commenting': + return { + label: 'Commenting Ban', + description: venueName + ? `You cannot post reviews or comments on ${venueName}.` + : 'You cannot post reviews or comments on any venue.', + }; + case 'owner_dashboard': + return { + label: 'Owner Dashboard Ban', + description: venueName + ? `You cannot access the owner dashboard for ${venueName}.` + : 'You cannot access the owner dashboard for any of your venues.', + }; + case 'venue_creation': + return { + label: 'Venue Creation Ban', + description: 'You cannot create new venues on the platform.', + }; + default: + return { + label: 'Account Restriction', + description: 'Your account has been restricted.', + }; + } +} + +export function getUserBannedTemplate( + scope: string, + reason: string, + expiresAt: Date | null, + venueName?: string +): string { + const scopeDisplay = getBanScopeDisplay(scope, venueName); + const appName = resendConfig.appName; + const isDev = process.env.NODE_ENV === 'development'; + + const expiryHtml = expiresAt + ? `

This ban expires on: ${expiresAt.toLocaleDateString('en-IN', { day: 'numeric', month: 'long', year: 'numeric' })} at ${expiresAt.toLocaleTimeString('en-IN', { hour: '2-digit', minute: '2-digit' })}

` + : '

This ban is permanent unless lifted by an administrator.

'; + + const bodyContent = ` +

Account Restriction Applied

+

+ Your ${appName} account has been restricted. Please review the details below. +

+ + + + +
+

Restriction Type

+

${scopeDisplay.label}

+

${scopeDisplay.description}

+

Reason

+

${reason}

+
+ ${expiryHtml} + + + + +
+

+ What this means: You will not be able to perform actions related to this restriction. + If you believe this was a mistake, please contact our support team by replying to this email. +

+
+ ${isDev ? `

Development mode: This email was redirected to the development address. The original recipient email is shown in the application logs.

` : ''} + `; + + return buildEmailWrapper(bodyContent); +} + +export function getUserUnbannedTemplate(): string { + const appName = resendConfig.appName; + const isDev = process.env.NODE_ENV === 'development'; + + const bodyContent = ` +

Account Restriction Lifted ✅

+

+ Good news! The restriction on your ${appName} account has been lifted. +

+ + + + +
+

Status

+

All restrictions removed

+
+

+ You can now use all platform features as normal. If you have any questions, please reply to this email. +

+ ${isDev ? `

Development mode: This email was redirected to the development address. The original recipient email is shown in the application logs.

` : ''} + `; + + return buildEmailWrapper(bodyContent); +} + +export function getReviewRemovedTemplate(venueName: string, reason: string): string { + const appName = resendConfig.appName; + const isDev = process.env.NODE_ENV === 'development'; + + const bodyContent = ` +

Your Review Has Been Removed

+

+ An administrator has removed your review for ${venueName} on ${appName}. +

+ + + + +
+

Venue

+

${venueName}

+

Reason for Removal

+

${reason}

+
+ + + + +
+

+ Note: Reviews are removed when they violate our community guidelines. + If you believe this was a mistake, please contact our support team by replying to this email. +

+
+ ${isDev ? `

Development mode: This email was redirected to the development address. The original recipient email is shown in the application logs.

` : ''} + `; + + return buildEmailWrapper(bodyContent); +} + +export function getReviewRestoredTemplate(venueName: string): string { + const appName = resendConfig.appName; + const isDev = process.env.NODE_ENV === 'development'; + + const bodyContent = ` +

Your Review Has Been Restored ✅

+

+ An administrator has restored your review for ${venueName} on ${appName}. +

+ + + + +
+

Venue

+

${venueName}

+
+

+ Your review is now visible to other users. If you have any questions, please reply to this email. +

+ ${isDev ? `

Development mode: This email was redirected to the development address. The original recipient email is shown in the application logs.

` : ''} + `; + + return buildEmailWrapper(bodyContent); +} diff --git a/server/src/services/razorpay.service.ts b/server/src/services/razorpay.service.ts new file mode 100644 index 0000000000..0ea3e81c73 --- /dev/null +++ b/server/src/services/razorpay.service.ts @@ -0,0 +1,237 @@ +/** + * razorpay.service.ts + * + * Thin, strongly-typed wrapper around the Razorpay Node SDK. + * Exposes three domain functions: + * - createOrder — Standard Orders API (used in checkout init) + * - verifyWebhookSignature — HMAC-SHA256 verification for incoming webhooks + * - issueRefund — Full refund for a captured payment + * + * The Razorpay client is a lazy singleton: instantiated on first call after + * env-vars are validated, never re-created on subsequent calls. + */ + +import Razorpay from 'razorpay'; +import crypto from 'crypto'; +import { razorpayConfig } from '../constants/env'; +import { logError, logInfo } from '../utils/logger'; + +// --------------------------------------------------------------------------- +// Client singleton +// --------------------------------------------------------------------------- + +let _razorpayClient: Razorpay | null = null; + +function getRazorpayClient(): Razorpay { + if (_razorpayClient) return _razorpayClient; + + const { keyId, keySecret } = razorpayConfig; + + if (!keyId || !keySecret) { + throw new Error( + 'Razorpay credentials are not configured. ' + + 'Set RAZORPAY_KEY_ID and RAZORPAY_KEY_SECRET in your environment.' + ); + } + + _razorpayClient = new Razorpay({ key_id: keyId, key_secret: keySecret }); + return _razorpayClient; +} + +// --------------------------------------------------------------------------- +// Types +// --------------------------------------------------------------------------- + +export interface CreateOrderParams { + /** Amount in smallest currency unit (paise for INR) */ + amountPaise: number; + currency?: string; + /** Metadata forwarded to webhook notes */ + notes: { + lockId: string; + venueId: string; + userId: string; + }; +} + +export interface CreateOrderResult { + orderId: string; + amount: number; + currency: string; +} + +export interface IssueRefundResult { + refundId: string; +} + +// --------------------------------------------------------------------------- +// createOrder +// --------------------------------------------------------------------------- + +/** + * Creates a Razorpay Standard Order. + * Passes lockId, venueId, userId in the `notes` object so they are + * available in the webhook payload without any additional DB lookup. + */ +export async function createOrder(params: CreateOrderParams): Promise { + const client = getRazorpayClient(); + const currency = params.currency ?? 'INR'; + + try { + const order = await client.orders.create({ + amount: params.amountPaise, + currency, + notes: { + lockId: params.notes.lockId, + venueId: params.notes.venueId, + userId: params.notes.userId, + }, + }); + + logInfo('Razorpay order created', { + orderId: order.id, + amount: order.amount, + currency: order.currency, + }); + + return { + orderId: order.id, + amount: typeof order.amount === 'string' ? parseInt(order.amount, 10) : order.amount, + currency: order.currency, + }; + } catch (err) { + const error = err as Error; + logError('Razorpay order creation failed', { + module: 'razorpay.service.ts/createOrder', + error: error.message, + }); + throw error; + } +} + +// --------------------------------------------------------------------------- +// verifyWebhookSignature +// --------------------------------------------------------------------------- + +/** + * Validates the Razorpay webhook HMAC-SHA256 signature. + * + * IMPORTANT: `rawBody` must be the raw Buffer from `express.raw()`. + * If the body has been parsed by express.json() the bytes will differ + * from what Razorpay signed and every request will be rejected. + * + * Uses `timingSafeEqual` to prevent timing-oracle attacks. + * + * @returns true if the signature is valid, false otherwise. + */ +export function verifyWebhookSignature(rawBody: Buffer, signature: string): boolean { + const webhookSecret = process.env.RAZORPAY_WEBHOOK_SECRET ?? razorpayConfig.webhookSecret; + + if (!webhookSecret) { + logError('RAZORPAY_WEBHOOK_SECRET is not configured', { + module: 'razorpay.service.ts/verifyWebhookSignature', + }); + return false; + } + + try { + const expectedSignature = crypto + .createHmac('sha256', webhookSecret) + .update(rawBody) + .digest('hex'); + + const expectedBuffer = Buffer.from(expectedSignature, 'utf8'); + const receivedBuffer = Buffer.from(signature, 'utf8'); + + // Buffers must be the same length for timingSafeEqual + if (expectedBuffer.length !== receivedBuffer.length) { + return false; + } + + return crypto.timingSafeEqual(expectedBuffer, receivedBuffer); + } catch (err) { + logError('Webhook signature verification threw an error', { + module: 'razorpay.service.ts/verifyWebhookSignature', + error: (err as Error).message, + }); + return false; + } +} + +export interface VerifyPaymentParams { + orderId: string; + paymentId: string; + signature: string; +} + +export function verifyPaymentSignature(params: VerifyPaymentParams): boolean { + const { keySecret } = razorpayConfig; + + if (!keySecret) { + logError('RAZORPAY_KEY_SECRET is not configured', { + module: 'razorpay.service.ts/verifyPaymentSignature', + }); + return false; + } + + try { + const payload = `${params.orderId}|${params.paymentId}`; + const expectedSignature = crypto.createHmac('sha256', keySecret).update(payload).digest('hex'); + + const expectedBuffer = Buffer.from(expectedSignature, 'utf8'); + const receivedBuffer = Buffer.from(params.signature, 'utf8'); + + if (expectedBuffer.length !== receivedBuffer.length) { + return false; + } + + return crypto.timingSafeEqual(expectedBuffer, receivedBuffer); + } catch (err) { + logError('Payment signature verification threw an error', { + module: 'razorpay.service.ts/verifyPaymentSignature', + error: (err as Error).message, + }); + return false; + } +} + +// --------------------------------------------------------------------------- +// issueRefund +// --------------------------------------------------------------------------- + +/** + * Issues a full refund for a captured Razorpay payment. + * + * @param paymentId - The Razorpay payment_id from the webhook payload + * @param amountPaise - The exact amount to refund (paise); must equal the captured amount for full refund + */ +export async function issueRefund( + paymentId: string, + amountPaise: number +): Promise { + const client = getRazorpayClient(); + + try { + const refund = await client.payments.refund(paymentId, { + amount: amountPaise, + speed: 'normal', + notes: { reason: 'TTL_EXPIRED_COLLISION — slot unavailable at payment time' }, + }); + + logInfo('Razorpay refund issued', { + refundId: refund.id, + paymentId, + amount: refund.amount, + }); + + return { refundId: refund.id }; + } catch (err) { + const error = err as Error; + logError('Razorpay refund failed', { + module: 'razorpay.service.ts/issueRefund', + paymentId, + error: error.message, + }); + throw error; + } +} diff --git a/server/src/services/roles.service.ts b/server/src/services/roles.service.ts new file mode 100644 index 0000000000..9d8997fa82 --- /dev/null +++ b/server/src/services/roles.service.ts @@ -0,0 +1,253 @@ +import mongoose from 'mongoose'; +import { UserRoleModel } from '../models/user-role.model'; +import { RoleModel } from '../models/role.model'; +import { PermissionModel } from '../models/permission.model'; +import { RolePermissionModel } from '../models/role-permission.model'; +import { logError, logInfo } from '../utils/logger'; + +export interface UserRoleInfo { + roleId: string; + roleName: string; +} + +export async function getUserRole(userId: string): Promise { + try { + const result = await UserRoleModel.aggregate([ + { + $match: { + userId: new mongoose.Types.ObjectId(userId), + active: true, + deleted: false, + }, + }, + { + $lookup: { + from: 'Roles', + localField: 'roleId', + foreignField: '_id', + as: 'role', + pipeline: [{ $match: { active: true, deleted: false } }, { $project: { name: 1 } }], + }, + }, + { $unwind: '$role' }, + { + $addFields: { + priority: { + $switch: { + branches: [ + { case: { $eq: ['$role.name', 'superAdmin'] }, then: 4 }, + { case: { $eq: ['$role.name', 'admin'] }, then: 3 }, + { case: { $eq: ['$role.name', 'owner'] }, then: 2 }, + { case: { $eq: ['$role.name', 'user'] }, then: 1 }, + ], + default: 0, + }, + }, + }, + }, + { $sort: { priority: -1 } }, + { $limit: 1 }, + { + $project: { + _id: 0, + roleId: { $toString: '$roleId' }, + roleName: '$role.name', + }, + }, + ]); + + return result[0] ?? null; + } catch (e) { + const error = e as Error; + logError('getUserRole failed', { + module: 'roles.service.ts/getUserRole', + error: error.message, + userId, + }); + return null; + } +} + +export async function fetchRolePermissions(roleId: string): Promise { + try { + const result = await RoleModel.aggregate<{ permissions: string[] }>([ + // 1. Start from the user's own role + { + $match: { + _id: new mongoose.Types.ObjectId(roleId), + active: true, + deleted: false, + }, + }, + // 2. Walk the parentRole chain to collect all ancestors + { + $graphLookup: { + from: 'Roles', + startWith: '$parentRole', + connectFromField: 'parentRole', + connectToField: '_id', + as: 'ancestors', + restrictSearchWithMatch: { active: true, deleted: false }, + }, + }, + // 3. Combine own role ID + all ancestor IDs into one array + { + $project: { + _id: 0, + roleIds: { + $concatArrays: [['$_id'], '$ancestors._id'], + }, + }, + }, + // 4. Fetch all RolePermission grants for the full role set + { + $lookup: { + from: 'RolePermissions', + localField: 'roleIds', + foreignField: 'roleId', + as: 'rolePermissions', + pipeline: [ + { $match: { active: true, deleted: false } }, + { $project: { permissionId: 1, _id: 0 } }, + ], + }, + }, + // 5. Resolve permission documents + { + $lookup: { + from: 'Permissions', + localField: 'rolePermissions.permissionId', + foreignField: '_id', + as: 'permissions', + pipeline: [ + { $match: { active: true, deleted: false } }, + { $project: { action: 1, entity: 1, _id: 0 } }, + ], + }, + }, + { $unwind: '$permissions' }, + // 6. Format as 'action:entity' and deduplicate + { + $group: { + _id: null, + permissions: { + $addToSet: { + $concat: ['$permissions.action', ':', '$permissions.entity'], + }, + }, + }, + }, + ]); + + return result.length > 0 ? result[0].permissions : []; + } catch (e) { + const error = e as Error; + logError('fetchRolePermissions failed', { + module: 'roles.service.ts/fetchRolePermissions', + error: error.message, + roleId, + }); + return []; + } +} + +export async function verifyRbacSeed(): Promise { + try { + const requiredRoles = ['user', 'owner', 'admin', 'superAdmin']; + + // Check all required roles exist + const roleCount = await RoleModel.countDocuments({ + active: true, + deleted: false, + }); + + if (roleCount === 0) { + throw new Error( + 'No active roles found in database. Run "pnpm script seed:rbac" to initialize RBAC data.' + ); + } + + for (const roleName of requiredRoles) { + const exists = await RoleModel.exists({ + name: roleName, + active: true, + deleted: false, + }); + + if (!exists) { + throw new Error( + `Required role "${roleName}" not found in database. Run "pnpm script seed:rbac" to initialize RBAC data.` + ); + } + } + + // Check permissions exist + const permissionCount = await PermissionModel.countDocuments({ + active: true, + deleted: false, + }); + + if (permissionCount === 0) { + throw new Error( + 'No active permissions found in database. Run "pnpm script seed:rbac" to initialize RBAC data.' + ); + } + + // Check role-permission links exist + const rolePermissionCount = await RolePermissionModel.countDocuments({ + active: true, + deleted: false, + }); + + if (rolePermissionCount === 0) { + throw new Error( + 'No active role-permission links found in database. Run "pnpm script seed:rbac" to initialize RBAC data.' + ); + } + + // Check admin and superAdmin have at least one permission + const adminRole = await RoleModel.findOne({ name: 'admin', active: true, deleted: false }); + const superAdminRole = await RoleModel.findOne({ + name: 'superAdmin', + active: true, + deleted: false, + }); + + if (adminRole) { + const adminPerms = await RolePermissionModel.countDocuments({ + roleId: adminRole._id, + active: true, + deleted: false, + }); + + if (adminPerms === 0) { + throw new Error( + 'Admin role has no permissions. Run "pnpm script seed:rbac" to initialize RBAC data.' + ); + } + } + + if (superAdminRole) { + const superAdminPerms = await RolePermissionModel.countDocuments({ + roleId: superAdminRole._id, + active: true, + deleted: false, + }); + + if (superAdminPerms === 0) { + throw new Error( + 'SuperAdmin role has no permissions. Run "pnpm script seed:rbac" to initialize RBAC data.' + ); + } + } + + logInfo('RBAC verified'); + } catch (err) { + const error = err instanceof Error ? err : new Error(String(err)); + logError('RBAC seed verification failed', { + module: 'roles.service.ts/verifyRbacSeed', + error: error.message, + }); + process.exit(1); + } +} diff --git a/server/src/types/express.ts b/server/src/types/express.ts new file mode 100644 index 0000000000..0989d5661a --- /dev/null +++ b/server/src/types/express.ts @@ -0,0 +1,70 @@ +import type { IRefreshToken } from '../modules/auth/models/refresh-token.model'; +import type { IPermission } from '../constants/permissions'; +import type { PaginationParams } from './pagination.types'; + +export type StoredToken = IRefreshToken; + +export interface VerifiedRole { + id?: string; + name?: string; + isSuperAdmin?: boolean; + permissions?: Set; +} + +export interface AuthenticatedUser { + userId: string; + username: string; + email: string; + role: VerifiedRole; +} + +export type Permission = IPermission; + +export interface DecodedToken { + id: string; + jti: string; +} + +export interface TokenPayload { + id: string; + username: string; + email: string; + iat: number; + jti?: string; +} + +export interface RefreshTokenPayload { + id: string; + iat?: number; + jti: string; +} + +export interface ApiResponse { + success: boolean; + message: string; + data?: T; + error?: string; + code?: string; +} + +export interface ValidatedRequest { + body?: unknown; + params?: unknown; + query?: unknown; +} + +export interface RequestToken { + decoded: DecodedToken; + stored: IRefreshToken; +} + +declare global { + namespace Express { + interface Request { + user?: AuthenticatedUser; + token?: RequestToken; + validated?: ValidatedRequest; + pagination?: PaginationParams; + } + } +} diff --git a/server/src/types/pagination.types.ts b/server/src/types/pagination.types.ts new file mode 100644 index 0000000000..767da87d04 --- /dev/null +++ b/server/src/types/pagination.types.ts @@ -0,0 +1,45 @@ +/** + * Raw query-string shape accepted by the pagination middleware. + * All fields are optional strings or numbers because Express gives everything as strings. + */ +export interface PaginationQuery { + page?: string | number; + limit?: string | number; + skip?: string | number; + sort?: string; +} + +// Normalised, validated pagination parameters attached to `req.pagination` +// after the pagination middleware runs. +export interface PaginationParams { + // 1-based current page number. + page: number; + // Number of documents per page. + limit: number; + // Number of documents to skip — derived from page/limit or an explicit skip query param. + skip: number; + // Mongo-style sort string, e.g. `-createdAt` or `name,-updatedAt`. + sort: string; +} + +// Pagination metadata included in every paginated API response. +export interface PaginationMeta { + total: number; + page: number; + limit: number; + skip: number; + totalPages: number; + hasNext: boolean; + hasPrev: boolean; +} + +export type PaginatedResponse = Record & { + pagination: PaginationMeta; +}; + +export interface PaginationMiddlewareOptions { + defaultLimit?: number; + maxLimit?: number; + minLimit?: number; + defaultSort?: string; +} diff --git a/server/src/utils/cacheUtils.ts b/server/src/utils/cacheUtils.ts new file mode 100644 index 0000000000..e69de29bb2 diff --git a/server/src/utils/cloudinarySign.ts b/server/src/utils/cloudinarySign.ts new file mode 100644 index 0000000000..0d3bb048f9 --- /dev/null +++ b/server/src/utils/cloudinarySign.ts @@ -0,0 +1,43 @@ +import { v2 as cloudinary } from 'cloudinary'; + +// The SDK only self-configures from a combined CLOUDINARY_URL env var (it uses the split CLOUDINARY_CLOUD_NAME/API_KEY/ API_SECRET vars instead). +// `cloudinary.utils.api_sign_request` takes the secret as an explicit argument so it worked without this, but any real SDK call — `cloudinary.uploader.destroy`, +// `cloudinary.api.resource`, etc. — needs the SDK actually configured, so do it once here as a side effect of importing this module +// (every module that touches Cloudinary imports it). +if ( + process.env.CLOUDINARY_CLOUD_NAME && + process.env.CLOUDINARY_API_KEY && + process.env.CLOUDINARY_API_SECRET +) { + cloudinary.config({ + cloud_name: process.env.CLOUDINARY_CLOUD_NAME, + api_key: process.env.CLOUDINARY_API_KEY, + api_secret: process.env.CLOUDINARY_API_SECRET, + }); +} + +export interface CloudinarySignature { + signature: string; + timestamp: number; + cloudName: string; + apiKey: string; + uploadPreset: string; + folder: string; +} + +export function signUploadParams(folder: string): CloudinarySignature | null { + const apiSecret = process.env.CLOUDINARY_API_SECRET; + const cloudName = process.env.CLOUDINARY_CLOUD_NAME; + const apiKey = process.env.CLOUDINARY_API_KEY; + const uploadPreset = process.env.CLOUDINARY_UPLOAD_PRESET; + + if (!apiSecret || !cloudName || !apiKey || !uploadPreset) { + return null; + } + + const timestamp = Math.round(Date.now() / 1000); + const paramsToSign = { folder, timestamp, upload_preset: uploadPreset }; + const signature = cloudinary.utils.api_sign_request(paramsToSign, apiSecret); + + return { signature, timestamp, cloudName, apiKey, uploadPreset, folder }; +} diff --git a/server/src/utils/dbUtils.ts b/server/src/utils/dbUtils.ts new file mode 100644 index 0000000000..bd21827dc9 --- /dev/null +++ b/server/src/utils/dbUtils.ts @@ -0,0 +1,27 @@ +import mongoose from 'mongoose'; + +export async function runInTransaction( + work: (session: mongoose.ClientSession) => Promise +): Promise { + const session = await mongoose.startSession(); + try { + return await session.withTransaction(() => work(session), { + maxCommitTimeMS: 10000, + }); + } catch (error) { + if ( + error instanceof Error && + (error.message.includes('Unable to acquire IX lock') || + error.message.includes('TransientTransactionError') || + error.message.includes('WriteConflict')) + ) { + await new Promise((resolve) => setTimeout(resolve, 100)); + return await session.withTransaction(() => work(session), { + maxCommitTimeMS: 10000, + }); + } + throw error; + } finally { + await session.endSession(); + } +} diff --git a/server/src/utils/errors.ts b/server/src/utils/errors.ts new file mode 100644 index 0000000000..53e5b73fd5 --- /dev/null +++ b/server/src/utils/errors.ts @@ -0,0 +1,123 @@ +import { z } from 'zod'; +import type { Response } from 'express'; +import { logError } from './logger'; +import { ResponseUtil } from './responseUtils'; + +/** + * Typed application error hierarchy. + * + * All domain modules (property, venue, booking, …) throw these instead of plain + * Error objects so controllers can map them to HTTP status codes without + * inspecting error messages. + * + * Usage in a controller: + * catch (e) { + * if (e instanceof NotFoundError) return ResponseUtil.notFound(res, e.message); + * if (e instanceof ForbiddenError) return ResponseUtil.forbidden(res, e.message); + * … + * } + */ + +export class AppError extends Error { + public readonly statusCode: number; + public readonly code: string; + + constructor(message: string, statusCode: number, code: string) { + super(message); + this.name = this.constructor.name; + this.statusCode = statusCode; + this.code = code; + Object.setPrototypeOf(this, new.target.prototype); + } +} + +// 404 — resource not found +export class NotFoundError extends AppError { + constructor(message = 'Resource not found') { + super(message, 404, 'NOT_FOUND'); + } +} + +// 403 — authenticated but not authorised (ownership failure) +export class ForbiddenError extends AppError { + constructor(message = 'Forbidden') { + super(message, 403, 'FORBIDDEN'); + } +} + +// 409 — uniqueness violation +export class ConflictError extends AppError { + constructor(message = 'Conflict') { + super(message, 409, 'CONFLICT'); + } +} + +// 422 — input passed schema validation but violates a business rule +export class ValidationError extends AppError { + constructor(message: string) { + super(message, 422, 'VALIDATION_ERROR'); + } +} + +/** + * 422 — illegal state-machine transition. + * + * Thrown by property.workflow.ts when a requested status change is not allowed + * from the property's current status. + */ +export class WorkflowError extends AppError { + public readonly currentStatus: string; + public readonly attemptedTransition: string; + + constructor(currentStatus: string, attemptedTransition: string) { + super( + `Cannot perform '${attemptedTransition}': current status is '${currentStatus}'`, + 422, + 'WORKFLOW_ERROR' + ); + this.currentStatus = currentStatus; + this.attemptedTransition = attemptedTransition; + } +} + +export function handleError(res: Response, error: unknown, context: string): void { + if (error instanceof z.ZodError) { + ResponseUtil.badRequest(res, 'Invalid request parameters'); + return; + } + if (error instanceof AppError) { + switch (error.statusCode) { + case 400: + ResponseUtil.badRequest(res, error.message); + return; + case 401: + ResponseUtil.unauthorized(res, error.message); + return; + case 403: + ResponseUtil.forbidden(res, error.message); + return; + case 404: + ResponseUtil.notFound(res, error.message); + return; + case 409: + ResponseUtil.conflict(res, error.message); + return; + case 422: + ResponseUtil.validationError(res, error.message); + return; + case 429: + ResponseUtil.rateLimitExceeded(res, error.message); + return; + default: + ResponseUtil.error(res, error.message, undefined, error.statusCode); + return; + } + } + const err = error as Error; + logError(`${context}: unexpected error`, { + module: 'errorUtils.ts/handleError', + error: err.message, + stack: err.stack, + }); + ResponseUtil.internalServerError(res, 'Server error'); +} diff --git a/server/src/utils/logger.ts b/server/src/utils/logger.ts new file mode 100644 index 0000000000..ce0630f085 --- /dev/null +++ b/server/src/utils/logger.ts @@ -0,0 +1,12 @@ +export { + logError, + logWarn, + logInfo, + logHttp, + logDebug, + logVerbose, + logSilly, + default as logger, +} from './winston/logger'; + +export { requestLogger } from './winston/requestLogger'; diff --git a/server/src/utils/mutex.ts b/server/src/utils/mutex.ts new file mode 100644 index 0000000000..7dbab2c365 --- /dev/null +++ b/server/src/utils/mutex.ts @@ -0,0 +1,34 @@ +import { Types } from 'mongoose'; +import { SlotMutexModel } from '../modules/booking/models/slotMutex.model'; + +const ACQUIRE_RETRY_ATTEMPTS = 5; +const ACQUIRE_RETRY_DELAY_MS = 200; + +function sleep(ms: number): Promise { + return new Promise((resolve) => setTimeout(resolve, ms)); +} + +// Attempts to acquire an exclusive mutex for a given venue+date by +// inserting a uniquely-indexed document. Retries briefly if another +// request currently holds it. Returns false if the mutex could not be +// acquired within the retry budget (caller should surface a +// "try again" error rather than proceed unsynchronized). +export async function acquireSlotMutex(venueId: string, date: string): Promise { + const vId = new Types.ObjectId(venueId); + for (let attempt = 0; attempt < ACQUIRE_RETRY_ATTEMPTS; attempt++) { + try { + await SlotMutexModel.create({ venueId: vId, date, lockedAt: new Date() }); + return true; + } catch (err) { + const error = err as { code?: number }; + if (error.code !== 11000) throw err; + await sleep(ACQUIRE_RETRY_DELAY_MS); + } + } + return false; +} + +export async function releaseSlotMutex(venueId: string, date: string): Promise { + const vId = new Types.ObjectId(venueId); + await SlotMutexModel.deleteOne({ venueId: vId, date }); +} diff --git a/server/src/utils/paginationUtils.ts b/server/src/utils/paginationUtils.ts new file mode 100644 index 0000000000..e0d65a8e7c --- /dev/null +++ b/server/src/utils/paginationUtils.ts @@ -0,0 +1,133 @@ +import type { PaginationMeta, PaginationParams, PaginationQuery } from '../types/pagination.types'; +import type { PaginationMiddlewareOptions } from '../types/pagination.types'; + +// Defaults + +export const PAGINATION_DEFAULTS = { + PAGE: 1, + LIMIT: 20, + MAX_LIMIT: 200, + MIN_LIMIT: 1, + SORT: '-createdAt', +} as const; + +// parsePaginationParams +/** + * Parses and validates raw query-string pagination fields into a normalised + * {@link PaginationParams} object. + * + * Rules: + * - `page` must be a positive integer; falls back to 1. + * - `limit` is clamped between `minLimit` and `maxLimit`. + * - `skip` can be supplied directly (useful for cursor-style clients); when + * absent it is derived from `(page - 1) * limit`. + * - `sort` defaults to `-createdAt` when not provided. + */ +export function parsePaginationParams( + query: PaginationQuery, + options?: PaginationMiddlewareOptions +): PaginationParams { + const defaultLimit = options?.defaultLimit ?? PAGINATION_DEFAULTS.LIMIT; + const maxLimit = options?.maxLimit ?? PAGINATION_DEFAULTS.MAX_LIMIT; + const minLimit = options?.minLimit ?? PAGINATION_DEFAULTS.MIN_LIMIT; + const defaultSort = options?.defaultSort ?? PAGINATION_DEFAULTS.SORT; + + // --- page --- + let page: number = PAGINATION_DEFAULTS.PAGE; + if (query.page !== undefined) { + const parsed = typeof query.page === 'string' ? parseInt(query.page, 10) : query.page; + if (!isNaN(parsed) && parsed > 0) page = parsed; + } + + // --- limit --- + let limit = defaultLimit; + if (query.limit !== undefined) { + const parsed = typeof query.limit === 'string' ? parseInt(query.limit, 10) : query.limit; + if (!isNaN(parsed) && parsed >= minLimit) limit = Math.min(parsed, maxLimit); + } + + // --- skip --- + let skip: number; + if (query.skip !== undefined) { + const parsed = typeof query.skip === 'string' ? parseInt(query.skip, 10) : query.skip; + skip = !isNaN(parsed) && parsed >= 0 ? parsed : (page - 1) * limit; + } else { + skip = (page - 1) * limit; + } + + // --- sort --- + const sort = + typeof query.sort === 'string' && query.sort.trim() ? query.sort.trim() : defaultSort; + + return { page, limit, skip, sort }; +} + +// buildPaginationMeta + +/** + * Builds the {@link PaginationMeta} object to include in paginated API + * responses. + * + * @param total - Total document count returned by `Model.countDocuments()`. + * @param params - The same {@link PaginationParams} used for the query. + */ +export function buildPaginationMeta(total: number, params: PaginationParams): PaginationMeta { + const { limit, skip } = params; + const totalPages = limit > 0 ? Math.ceil(total / limit) : 0; + const currentPage = limit > 0 ? Math.floor(skip / limit) + 1 : 1; + + return { + total, + page: currentPage, + limit, + skip, + totalPages, + hasNext: currentPage < totalPages, + hasPrev: currentPage > 1, + }; +} + +// parseSortString +/** + * Converts a sort string into a Mongoose-compatible sort object. + * + * Format: comma-separated field names, prefixed with `-` for descending. + * + * Examples: + * ``` + * "-createdAt" → { createdAt: -1, _id: -1 } + * "name" → { name: 1, _id: 1 } + * "-createdAt,name" → { createdAt: -1, name: 1, _id: -1 } + * ``` + * + * `_id` is always appended as a tiebreaker (matching the direction of the + * first sort field) to guarantee stable pagination across pages. + */ +export function parseSortString(sortString: string): Record { + const sortObj: Record = {}; + + if (!sortString.trim()) return sortObj; + + let primaryDirection: 1 | -1 = -1; + + for (const rawField of sortString.split(',')) { + const field = rawField.trim(); + if (!field) continue; + + if (field.startsWith('-')) { + const name = field.slice(1); + sortObj[name] = -1; + if (Object.keys(sortObj).length === 1) primaryDirection = -1; + } else { + sortObj[field] = 1; + if (Object.keys(sortObj).length === 1) primaryDirection = 1; + } + } + + // Stable tiebreaker — only add if not already in the sort object + if (!('_id' in sortObj)) { + sortObj._id = primaryDirection; + } + + return sortObj; +} diff --git a/server/src/utils/responseUtils.ts b/server/src/utils/responseUtils.ts new file mode 100644 index 0000000000..03fe33b75d --- /dev/null +++ b/server/src/utils/responseUtils.ts @@ -0,0 +1,104 @@ +import type { Response } from 'express'; +import type { ApiResponse } from '../types/express'; +import type { PaginationMeta } from '../types/pagination.types'; + +function sendSuccess(res: Response, message: string, data?: unknown, statusCode = 200): void { + const response: ApiResponse = { + success: true, + message, + ...(data !== undefined && { data }), + }; + res.status(statusCode).json(response); +} + +function sendError(res: Response, message: string, error?: string, statusCode = 500): void { + const response: ApiResponse = { + success: false, + message, + ...(error !== undefined && { error }), + }; + res.status(statusCode).json(response); +} + +export const ResponseUtil = { + success(res: Response, message: string, data?: unknown, statusCode = 200): void { + sendSuccess(res, message, data, statusCode); + }, + + paginated( + res: Response, + message: string, + items: unknown[], + pagination: PaginationMeta, + dataKey = 'items' + ): void { + sendSuccess(res, message, { + [dataKey]: items, + pagination, + }); + }, + + error(res: Response, message: string, error?: string, statusCode = 500): void { + sendError(res, message, error, statusCode); + }, + + created(res: Response, message: string, data: unknown): void { + sendSuccess(res, message, data, 201); + }, + + notFound(res: Response, message = 'Resource not found'): void { + sendError(res, message, undefined, 404); + }, + + badRequest(res: Response, message: string, error?: string): void { + sendError(res, message, error, 400); + }, + + unauthorized(res: Response, message = 'Unauthorized'): void { + sendError(res, message, undefined, 401); + }, + + forbidden(res: Response, message = 'Forbidden'): void { + sendError(res, message, undefined, 403); + }, + + conflict(res: Response, message: string, error?: string): void { + sendError(res, message, error, 409); + }, + + rateLimitExceeded( + res: Response, + message = 'Too many requests. Please try again later', + error?: string + ): void { + sendError(res, message, error, 429); + }, + + validationError(res: Response, message: string, error?: string): void { + sendError(res, message, error, 422); + }, + + internalServerError(res: Response, message = 'Internal Server Error', error?: string): void { + sendError(res, message, error, 500); + }, + + serverUnavailable(res: Response, message = 'Service Unavailable', error?: string): void { + sendError(res, message, error, 503); + }, +}; + +export const internalServerError = ( + res: Response, + message = 'Internal Server Error', + err?: string +): void => { + sendError(res, message, err, 500); +}; + +export const serverUnavailable = ( + res: Response, + message = 'Service Unavailable', + err?: string +): void => { + sendError(res, message, err, 503); +}; diff --git a/server/src/utils/shutdownUtils.ts b/server/src/utils/shutdownUtils.ts new file mode 100644 index 0000000000..ec9e606906 --- /dev/null +++ b/server/src/utils/shutdownUtils.ts @@ -0,0 +1,125 @@ +import mongoose from 'mongoose'; +import type { Server } from 'http'; +import { stopEmailWorker } from '../workers/email.worker'; +import { logInfo, logWarn, logError } from '../utils/logger'; + +let isShuttingDown = false; +let getServerFn: (() => Server | null) | null = null; + +// Utility +const withTimeout = async (promise: Promise, ms: number, name: string): Promise => { + let timeoutHandle: ReturnType | undefined; + const timeoutPromise = new Promise((_, reject) => { + timeoutHandle = setTimeout(() => { + reject(new Error(`[Timeout] ${name} shutdown exceeded ${ms.toString()}ms`)); + }, ms); + }); + + try { + await Promise.race([promise, timeoutPromise]); + } catch (err) { + logError(`[server] ${name} failed to shut down cleanly`, { + module: 'shutdownUtils.ts/withTimeout', + error: (err as Error).message, + }); + } finally { + if (timeoutHandle) { + clearTimeout(timeoutHandle); + } + } +}; + +async function gracefulShutdown(signal: string, exitCode = 0): Promise { + if (isShuttingDown) return; + isShuttingDown = true; + + logInfo(`[server] ${signal} received. Initiating graceful shutdown...`); + + // Global Hard Timeout + const forceExitTimer = setTimeout(() => { + logError('[server] GLOBAL shutdown timeout reached (30s). Forcing exit.', { + module: 'shutdownUtils.ts/gracefulShutdown', + }); + process.exit(exitCode); + }, 30_000); + forceExitTimer.unref(); + + try { + const server = getServerFn ? getServerFn() : null; + + // STEP 1: HTTP Server (Max 5 seconds) + if (server) { + logInfo('[server] Stopping HTTP server...'); + + // Fatal crash + if (signal === 'Uncaught Exception' || signal === 'Unhandled Rejection') { + if ('closeAllConnections' in server) { + logWarn('[server] Fatal crash detected. Severing all active HTTP connections.'); + server.closeAllConnections(); + } + } else { + if ('closeIdleConnections' in server) { + server.closeIdleConnections(); + } + } + + const closeHttpPromise = new Promise((resolve, reject) => { + server.close((err) => { + if (err) { + reject(err); + return; + } + resolve(); + }); + }); + + await withTimeout(closeHttpPromise, 5000, 'HTTP Server'); + logInfo('[server] HTTP server closed.'); + } + + logInfo('[server] Stopping email worker...'); + await withTimeout(stopEmailWorker(), 3000, 'Email Worker'); + logInfo('[server] Email worker stopped.'); + + logInfo('[server] Closing MongoDB connection...'); + await withTimeout(mongoose.connection.close(false), 3000, 'MongoDB'); + logInfo('[server] MongoDB connection closed.'); + } catch (err) { + logError('[server] Unexpected error during shutdown sequence', { + module: 'shutdownUtils.ts/gracefulShutdown', + error: (err as Error).message, + }); + } + + logInfo('[server] Shutdown sequence complete.'); + process.exit(exitCode); +} + +export function setupGracefulShutdown(getServer: () => Server | null): void { + getServerFn = getServer; + + process.on('unhandledRejection', (reason) => { + logError('Unhandled Rejection', { + module: 'shutdownUtils.ts/setupGracefulShutdown', + reason: String(reason), + }); + void gracefulShutdown('Unhandled Rejection', 1); + }); + + process.on('uncaughtException', (error) => { + logError('Uncaught Exception', { + module: 'shutdownUtils.ts/setupGracefulShutdown', + error: error.message, + stack: error.stack, + }); + void gracefulShutdown('Uncaught Exception', 1); + }); + + process.on('SIGINT', () => { + void gracefulShutdown('SIGINT'); + }); + + process.on('SIGTERM', () => { + void gracefulShutdown('SIGTERM'); + }); +} diff --git a/server/src/utils/timeUtils.ts b/server/src/utils/timeUtils.ts new file mode 100644 index 0000000000..520b8a4a89 --- /dev/null +++ b/server/src/utils/timeUtils.ts @@ -0,0 +1,74 @@ +// Parse '60s'/'30m'/'24h'/'7d' or number → ms. Units: s,m,h,d. +export const parseDurationToMs = (duration: string | number): number => { + if (typeof duration === 'number') { + return duration; + } + if (/^\d+$/.test(duration)) { + return parseInt(duration, 10); + } + + const match = /^(\d+)([smhd])$/i.exec(duration); + if (!match) { + throw new Error( + `Invalid duration format: "${duration}". Expected format like "60s", "30m", "24h", "7d".` + ); + } + + const value = parseInt(match[1], 10); + const unit = match[2].toLowerCase(); + + switch (unit) { + case 's': + return value * 1000; + case 'm': + return value * 60 * 1000; + case 'h': + return value * 60 * 60 * 1000; + case 'd': + return value * 24 * 60 * 60 * 1000; + default: + return 0; + } +}; + +// Converts "09:30" to 570 +export const timeStringToMinutes = (timeString: string): number => { + const [hours, minutes] = timeString.split(':').map(Number); + if (isNaN(hours) || isNaN(minutes)) throw new Error(`Invalid time string: ${timeString}`); + return hours * 60 + minutes; +}; + +// Converts 570 to "09:30" +export const minutesToTimeString = (minutes: number): string => { + const hours = Math.floor(minutes / 60); + const mins = minutes % 60; + return `${hours.toString().padStart(2, '0')}:${mins.toString().padStart(2, '0')}`; +}; + +// Collision formula +export const checkOverlap = ( + slotStart: number, + slotEnd: number, + conflicts: { start: number; end: number }[] +): boolean => { + return conflicts.some((conflict) => slotStart < conflict.end && slotEnd > conflict.start); +}; + +export const toLocalDateString = (date: Date): string => { + const year = String(date.getFullYear()); + const month = String(date.getMonth() + 1).padStart(2, '0'); + const day = String(date.getDate()).padStart(2, '0'); + return `${year}-${month}-${day}`; +}; + +// Check date within [tomorrow, tomorrow + 90 days] window +export const isBookableDate = (dateStr: string): boolean => { + const reqDate = new Date(dateStr + 'T00:00:00'); + const today = new Date(); + today.setHours(0, 0, 0, 0); + const tomorrow = new Date(today); + tomorrow.setDate(tomorrow.getDate() + 1); + const maxDate = new Date(today); + maxDate.setDate(maxDate.getDate() + 90); + return reqDate >= tomorrow && reqDate <= maxDate; +}; diff --git a/server/src/utils/tokenUtils.ts b/server/src/utils/tokenUtils.ts new file mode 100644 index 0000000000..a87f1f12a2 --- /dev/null +++ b/server/src/utils/tokenUtils.ts @@ -0,0 +1,181 @@ +import jwt from 'jsonwebtoken'; +import crypto from 'crypto'; +import mongoose from 'mongoose'; +import type { Response } from 'express'; +import { parseDurationToMs } from './timeUtils'; +import * as authRepo from '../modules/auth/auth.repository'; +import { authEnvs, jwtConfig } from '../constants/env'; +import type { TokenRevocationReasonType } from '../constants/auth.constants'; +import type { RefreshTokenPayload, TokenPayload } from '../types/express'; + +export const tokenVerifyOptions: jwt.VerifyOptions = { + issuer: jwtConfig.issuer, + audience: jwtConfig.audience, + algorithms: [jwtConfig.algorithm], +}; + +export const generateAccessToken = (userId: string, username: string, email: string): string => { + try { + const payload: TokenPayload = { + id: userId, + username, + email, + iat: Math.floor(Date.now() / 1000), + }; + + const jwtOptions: jwt.SignOptions = { + expiresIn: authEnvs.accessTokenExpiry as jwt.SignOptions['expiresIn'], + issuer: jwtConfig.issuer, + audience: jwtConfig.audience, + algorithm: jwtConfig.algorithm, + subject: userId, + }; + + if (!authEnvs.accessTokenSecret) { + throw new Error('Access token secret not defined'); + } + + return jwt.sign(payload, authEnvs.accessTokenSecret, jwtOptions); + } catch (error) { + throw new Error(`Failed to generate access token: ${(error as Error).message}`, { + cause: error, + }); + } +}; + +export interface GenerateRefreshTokenResult { + token: string; + rootTokenId: string; +} + +/** + * Generates a signed refresh token JWT and persists a hashed record to MongoDB. + * @param userId - Owner of the token. + * @param rootTokenId - ObjectId string of the family root. Omit for a new session (login). + * @param parentTokenId - ObjectId string of the token being replaced. Omit for login. + * @param session - Optional Mongoose ClientSession for transactional writes. + */ +export const generateRefreshToken = async ( + userId: string, + rootTokenId?: string, + parentTokenId?: string, + session?: mongoose.ClientSession +): Promise => { + try { + const jti = crypto.randomUUID(); + + const payload: RefreshTokenPayload = { + id: userId, + iat: Math.floor(Date.now() / 1000), + jti, + }; + + const jwtOptions: jwt.SignOptions = { + expiresIn: authEnvs.refreshTokenExpiry as jwt.SignOptions['expiresIn'], + issuer: jwtConfig.issuer, + audience: jwtConfig.audience, + algorithm: jwtConfig.algorithm, + subject: userId, + }; + + if (!authEnvs.refreshTokenSecret) { + throw new Error('Refresh token secret not defined'); + } + + const tokenId = new mongoose.Types.ObjectId(); + const effectiveRootTokenId = rootTokenId ? new mongoose.Types.ObjectId(rootTokenId) : tokenId; + const effectiveParentTokenId = parentTokenId + ? new mongoose.Types.ObjectId(parentTokenId) + : null; + + const token = jwt.sign(payload, authEnvs.refreshTokenSecret, jwtOptions); + const tokenHash = crypto.createHash('sha256').update(jti).digest('hex'); + const expiresAt = new Date(Date.now() + parseDurationToMs(authEnvs.refreshTokenExpiry)); + + await authRepo.createRefreshToken( + { + _id: tokenId, + userId: new mongoose.Types.ObjectId(userId), + tokenHash, + rootTokenId: effectiveRootTokenId, + parentTokenId: effectiveParentTokenId, + expiresAt, + }, + session + ); + + return { + token, + rootTokenId: effectiveRootTokenId.toString(), + }; + } catch (error) { + throw new Error(`Failed to generate refresh token: ${(error as Error).message}`, { + cause: error, + }); + } +}; + +// Revoke a single refresh token +export const revokeRefreshToken = async ( + tokenHash: string, + reason: TokenRevocationReasonType, + session?: mongoose.ClientSession +): Promise => { + try { + await authRepo.revokeRefreshToken(tokenHash, reason, session); + } catch (error) { + throw new Error(`Failed to revoke refresh token: ${(error as Error).message}`, { + cause: error, + }); + } +}; + +// Revoke a token family (same rootTokenId). +export const revokeTokenFamily = async ( + rootTokenId: mongoose.Types.ObjectId, + reason: TokenRevocationReasonType, + session?: mongoose.ClientSession +): Promise => { + try { + await authRepo.revokeTokenFamily(rootTokenId, reason, session); + } catch (error) { + throw new Error(`Failed to revoke token family: ${(error as Error).message}`, { + cause: error, + }); + } +}; + +// Cookie helpers +export const setTokenCookies = ( + res: Response, + accessToken: string, + refreshToken: string +): Response => { + const isProduction = process.env.NODE_ENV === 'production'; + const accessTokenMaxAge = parseDurationToMs(authEnvs.accessTokenExpiry); + const refreshTokenMaxAge = parseDurationToMs(authEnvs.refreshTokenExpiry); + + res.cookie('accessToken', accessToken, { + httpOnly: true, + secure: true, + sameSite: isProduction ? 'strict' : ('none' as const), + maxAge: accessTokenMaxAge, + path: '/', + }); + + res.cookie('refreshToken', refreshToken, { + httpOnly: true, + secure: true, + sameSite: isProduction ? 'strict' : ('none' as const), + maxAge: refreshTokenMaxAge, + path: '/api/v1/auth', + }); + + return res; +}; + +export const clearTokenCookies = (res: Response): Response => { + res.clearCookie('accessToken', { path: '/' }); + res.clearCookie('refreshToken', { path: '/' }); + return res; +}; diff --git a/server/src/utils/winston/logger.ts b/server/src/utils/winston/logger.ts new file mode 100644 index 0000000000..070ff1b0f8 --- /dev/null +++ b/server/src/utils/winston/logger.ts @@ -0,0 +1,126 @@ +import winston from 'winston'; +import DailyRotateFile from 'winston-daily-rotate-file'; +import * as path from 'path'; +import * as fs from 'fs'; + +const logDirs = ['logs/combined', 'logs/error', 'logs/http']; +logDirs.forEach((dir) => { + if (!fs.existsSync(dir)) { + fs.mkdirSync(dir, { recursive: true }); + } +}); + +const levels: winston.config.AbstractConfigSetLevels = { + error: 0, + warn: 1, + info: 2, + http: 3, + verbose: 4, + debug: 5, + silly: 6, +}; + +const colors: winston.config.AbstractConfigSetColors = { + error: 'red', + warn: 'yellow', + info: 'green', + http: 'magenta', + verbose: 'cyan', + debug: 'blue', + silly: 'gray', +}; + +winston.addColors(colors); + +// Shared format +const logFormat = winston.format.combine( + winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }), + winston.format.errors({ stack: true }), + winston.format.splat(), + winston.format.json(), + winston.format.printf(({ timestamp, level, message, ...meta }) => { + return JSON.stringify({ timestamp, level, message, ...meta }); + }) +); + +// Logger instance +const logger = winston.createLogger({ + levels, + format: logFormat, + transports: [ + // error and above → dedicated error log + new DailyRotateFile({ + filename: path.join('logs', 'error', '%DATE%.error.log'), + datePattern: 'MMMM', + level: 'error', + format: logFormat, + maxFiles: '12m', + createSymlink: true, + symlinkName: 'current.error.log', + }), + // everything → combined log + new DailyRotateFile({ + filename: path.join('logs', 'combined', '%DATE%.combined.log'), + datePattern: 'MMMM', + format: logFormat, + maxFiles: '12m', + createSymlink: true, + symlinkName: 'current.combined.log', + }), + // http and below → dedicated http log + new DailyRotateFile({ + filename: path.join('logs', 'http', '%DATE%.http.log'), + datePattern: 'MMMM', + level: 'http', + format: logFormat, + maxFiles: '12m', + createSymlink: true, + symlinkName: 'current.http.log', + }), + ], +}); + +// Colourised console output in non-production environments +if (process.env.NODE_ENV !== 'production') { + logger.add( + new winston.transports.Console({ + format: winston.format.combine( + winston.format.colorize({ all: true }), + winston.format.simple() + ), + level: 'silly', + }) + ); +} + +// Typed helper functions + +export const logError = (message: string, meta?: Record): void => { + logger.error(message, meta); +}; + +export const logWarn = (message: string, meta?: Record): void => { + logger.warn(message, meta); +}; + +export const logInfo = (message: string, meta?: Record): void => { + logger.info(message, meta); +}; + +export const logHttp = (message: string, meta?: Record): void => { + logger.http(message, meta); +}; + +export const logDebug = (message: string, meta?: Record): void => { + logger.debug(message, meta); +}; + +export const logVerbose = (message: string, meta?: Record): void => { + logger.verbose(message, meta); +}; + +export const logSilly = (message: string, meta?: Record): void => { + logger.silly(message, meta); +}; + +export default logger; diff --git a/server/src/utils/winston/requestLogger.ts b/server/src/utils/winston/requestLogger.ts new file mode 100644 index 0000000000..e46eea4212 --- /dev/null +++ b/server/src/utils/winston/requestLogger.ts @@ -0,0 +1,25 @@ +import type { NextFunction, Request, Response } from 'express'; +import { logHttp } from './logger'; + +/** + * Express middleware that logs every completed HTTP request at the 'http' level. + * Attaches to res 'finish' so duration includes controller processing time. + * Register in server.ts before the main router. + */ +export const requestLogger = (req: Request, res: Response, next: NextFunction): void => { + const start = Date.now(); + + res.on('finish', () => { + const duration = Date.now() - start; + logHttp(`${req.method} ${req.originalUrl}`, { + method: req.method, + url: req.originalUrl, + status: res.statusCode, + duration: `${String(duration)}ms`, + ip: req.ip, + userAgent: req.get('user-agent'), + }); + }); + + next(); +}; diff --git a/server/src/workers/banExpiry.worker.ts b/server/src/workers/banExpiry.worker.ts new file mode 100644 index 0000000000..e5913aa962 --- /dev/null +++ b/server/src/workers/banExpiry.worker.ts @@ -0,0 +1,45 @@ +import * as bannedUserService from '../modules/moderation/bannedUser.service'; +import { logInfo, logError } from '../utils/logger'; + +const POLL_INTERVAL_MS = 60000; // 1 minute +let banExpiryInterval: ReturnType | null = null; + +async function processExpiredBans(): Promise { + try { + const expiredCount = await bannedUserService.expireActiveBans(); + if (expiredCount > 0) { + logInfo('Ban expiry worker', { message: `Expired ${String(expiredCount)} ban records` }); + } + } catch (err) { + const error = err as Error; + logError('Ban expiry worker: failed to process expired bans', { + module: 'banExpiry.worker.ts/processExpiredBans', + error: error.message, + }); + } +} + +export function startBanExpiryWorker(): void { + if (banExpiryInterval) { + logInfo('Ban expiry worker already running'); + return; + } + + logInfo('Starting ban expiry worker'); + banExpiryInterval = setInterval(() => { + processExpiredBans().catch((err: unknown) => { + logError('Unexpected error in ban expiry worker', { + module: 'banExpiry.worker.ts', + error: err instanceof Error ? err.message : String(err), + }); + }); + }, POLL_INTERVAL_MS); +} + +export function stopBanExpiryWorker(): void { + if (banExpiryInterval) { + clearInterval(banExpiryInterval); + banExpiryInterval = null; + logInfo('Ban expiry worker stopped'); + } +} diff --git a/server/src/workers/bookingStatus.worker.ts b/server/src/workers/bookingStatus.worker.ts new file mode 100644 index 0000000000..9c987e2926 --- /dev/null +++ b/server/src/workers/bookingStatus.worker.ts @@ -0,0 +1,75 @@ +import { BookingModel } from '../modules/booking/models/booking.model.js'; +import { BookingStatus } from '../constants/booking.constants.js'; +import { logInfo } from '../utils/logger.js'; + +const POLL_INTERVAL_MS = 60_000; +let intervalHandle: ReturnType | null = null; + +export function startBookingStatusWorker(): void { + logInfo('Booking status worker started', { module: 'bookingStatus.worker' }); + void runOnce(); + intervalHandle = setInterval(() => { + void runOnce(); + }, POLL_INTERVAL_MS); +} + +async function runOnce(): Promise { + const now = new Date(); + const nowMinutes = now.getHours() * 60 + now.getMinutes(); + const nowDate = now.toISOString().slice(0, 10); + + // 1. Confirmed bookings past endTime → completed + const pastConfirmed = await BookingModel.updateMany( + { + status: BookingStatus.CONFIRMED, + $or: [{ date: { $lt: nowDate } }, { date: nowDate, endTime: { $lte: nowMinutes } }], + }, + { $set: { status: BookingStatus.COMPLETED } } + ).lean(); + + if (pastConfirmed.modifiedCount > 0) { + logInfo(`Marked ${String(pastConfirmed.modifiedCount)} confirmed bookings as completed`, { + module: 'bookingStatus.worker', + }); + } + + // 2. Confirmed bookings currently active → in_progress + const activeConfirmed = await BookingModel.updateMany( + { + status: BookingStatus.CONFIRMED, + date: nowDate, + startTime: { $lte: nowMinutes }, + endTime: { $gt: nowMinutes }, + }, + { $set: { status: BookingStatus.IN_PROGRESS } } + ).lean(); + + if (activeConfirmed.modifiedCount > 0) { + logInfo(`Marked ${String(activeConfirmed.modifiedCount)} confirmed bookings as in_progress`, { + module: 'bookingStatus.worker', + }); + } + + // 3. In-progress bookings past endTime → completed + const pastInProgress = await BookingModel.updateMany( + { + status: BookingStatus.IN_PROGRESS, + $or: [{ date: { $lt: nowDate } }, { date: nowDate, endTime: { $lte: nowMinutes } }], + }, + { $set: { status: BookingStatus.COMPLETED } } + ).lean(); + + if (pastInProgress.modifiedCount > 0) { + logInfo(`Marked ${String(pastInProgress.modifiedCount)} in_progress bookings as completed`, { + module: 'bookingStatus.worker', + }); + } +} + +export function stopBookingStatusWorker(): void { + if (intervalHandle) { + clearInterval(intervalHandle); + intervalHandle = null; + logInfo('Booking status worker stopped', { module: 'bookingStatus.worker' }); + } +} diff --git a/server/src/workers/email.worker.ts b/server/src/workers/email.worker.ts new file mode 100644 index 0000000000..94044196af --- /dev/null +++ b/server/src/workers/email.worker.ts @@ -0,0 +1,340 @@ +import { EmailTaskModel, type IEmailTask } from '../models/email-task.model'; +import { emailService } from '../services/email.service'; +import { EmailIntent, EmailTaskStatus, EmailConstants } from '../constants/email.constants'; +import { logError, logWarn, logInfo } from '../utils/logger'; + +let isShuttingDown = false; +let pollingInterval: ReturnType | null = null; +let activeTasks = 0; + +const FIFTEEN_MIN_MS = 15 * 60 * 1000; +const SEVEN_DAYS_MS = 7 * 24 * 60 * 60 * 1000; + +async function dispatch(task: IEmailTask): Promise { + const { intent, recipient, metadata } = task; + + switch (intent) { + case EmailIntent.PASSWORD_RESET: { + const resetLink = metadata.resetLink; + if (!resetLink) { + throw new Error(`Missing resetLink in metadata for ${EmailIntent.PASSWORD_RESET} intent`); + } + const result = await emailService.sendPasswordResetEmail(recipient, resetLink); + if (!result.success) { + throw new Error('Failed to send password reset email via Resend'); + } + break; + } + case EmailIntent.ADMIN_PASSWORD_RESET: { + const { newPassword, username } = metadata; + if (!newPassword || !username) { + throw new Error(`Missing required metadata for ${EmailIntent.ADMIN_PASSWORD_RESET} intent`); + } + const result = await emailService.sendAdminPasswordResetEmail( + recipient, + newPassword, + username + ); + if (!result.success) { + throw new Error('Failed to send admin password reset email via Resend'); + } + break; + } + case EmailIntent.SECURITY_ALERT: { + const result = await emailService.sendPasswordChangedEmail(recipient); + if (!result.success) { + throw new Error('Failed to send security alert email via Resend'); + } + break; + } + case EmailIntent.BOOKING_CONFIRMATION: { + const { venueName, date, startTime, endTime, amount, paymentReference } = metadata; + if (!venueName || !date || !startTime || !endTime || !amount || !paymentReference) { + throw new Error( + `Missing required metadata fields for ${EmailIntent.BOOKING_CONFIRMATION} intent` + ); + } + const result = await emailService.sendBookingConfirmation(recipient, { + venueName, + date, + startTime, + endTime, + amount: parseFloat(amount), + paymentReference, + }); + if (!result.success) { + throw new Error('Failed to send booking confirmation email via Resend'); + } + break; + } + case EmailIntent.BOOKING_REFUND: { + const { venueName, date, startTime, endTime, amount, refundReference } = metadata; + if (!venueName || !date || !startTime || !endTime || !amount || !refundReference) { + throw new Error( + `Missing required metadata fields for ${EmailIntent.BOOKING_REFUND} intent` + ); + } + const result = await emailService.sendRefundNotification(recipient, { + venueName, + date, + startTime, + endTime, + amount: parseFloat(amount), + refundReference, + }); + if (!result.success) { + throw new Error('Failed to send booking refund email via Resend'); + } + break; + } + case EmailIntent.BOOKING_CANCELLATION: { + const { venueName, date, timeRange, refundAmount, bookingRef } = metadata; + if (!venueName || !date || !timeRange || !refundAmount || !bookingRef) { + throw new Error( + `Missing required metadata fields for ${EmailIntent.BOOKING_CANCELLATION} intent` + ); + } + const result = await emailService.sendBookingCancellationEmail(recipient, { + venueName, + date, + timeRange, + refundAmount: parseFloat(refundAmount), + bookingRef, + }); + if (!result.success) { + throw new Error('Failed to send booking cancellation email via Resend'); + } + break; + } + case EmailIntent.VENUE_APPROVED: { + const { venueName } = metadata; + if (!venueName) { + throw new Error(`Missing venueName in metadata for ${EmailIntent.VENUE_APPROVED} intent`); + } + const result = await emailService.sendVenueApprovedEmail(recipient, venueName); + if (!result.success) { + throw new Error('Failed to send venue approved email via Resend'); + } + break; + } + case EmailIntent.VENUE_REJECTED: { + const { venueName, reason, editDeadline, submissionNumber } = metadata; + if (!venueName || !reason || !editDeadline || !submissionNumber) { + throw new Error( + `Missing required metadata fields for ${EmailIntent.VENUE_REJECTED} intent` + ); + } + const result = await emailService.sendVenueRejectedEmail( + recipient, + venueName, + reason, + new Date(editDeadline), + parseInt(submissionNumber, 10) + ); + if (!result.success) { + throw new Error('Failed to send venue rejected email via Resend'); + } + break; + } + case EmailIntent.VENUE_SUSPENDED: { + const { venueName, reason } = metadata; + if (!venueName || !reason) { + throw new Error( + `Missing required metadata fields for ${EmailIntent.VENUE_SUSPENDED} intent` + ); + } + const result = await emailService.sendVenueSuspendedEmail(recipient, venueName, reason); + if (!result.success) { + throw new Error('Failed to send venue suspended email via Resend'); + } + break; + } + case EmailIntent.VENUE_UNSUSPENDED: { + const { venueName } = metadata; + if (!venueName) { + throw new Error( + `Missing venueName in metadata for ${EmailIntent.VENUE_UNSUSPENDED} intent` + ); + } + const result = await emailService.sendVenueUnsuspendedEmail(recipient, venueName); + if (!result.success) { + throw new Error('Failed to send venue unsuspended email via Resend'); + } + break; + } + case EmailIntent.VENUE_DEADLINE_EXTENDED: { + const { venueName, newDeadline } = metadata; + if (!venueName || !newDeadline) { + throw new Error( + `Missing required metadata fields for ${EmailIntent.VENUE_DEADLINE_EXTENDED} intent` + ); + } + const result = await emailService.sendVenueDeadlineExtendedEmail( + recipient, + venueName, + new Date(newDeadline) + ); + if (!result.success) { + throw new Error('Failed to send venue deadline extended email via Resend'); + } + break; + } + case EmailIntent.USER_BANNED: { + const { scope, reason, expiresAt, venueName } = metadata; + if (!scope || !reason) { + throw new Error(`Missing required metadata fields for ${EmailIntent.USER_BANNED} intent`); + } + const result = await emailService.sendUserBannedEmail(recipient, { + scope, + reason, + expiresAt: expiresAt ? new Date(expiresAt) : null, + venueName: venueName || undefined, + }); + if (!result.success) { + throw new Error('Failed to send user banned email via Resend'); + } + break; + } + case EmailIntent.USER_UNBANNED: { + const result = await emailService.sendUserUnbannedEmail(recipient); + if (!result.success) { + throw new Error('Failed to send user unbanned email via Resend'); + } + break; + } + case EmailIntent.REVIEW_REMOVED: { + const { venueName, reason } = metadata; + if (!venueName || !reason) { + throw new Error( + `Missing required metadata fields for ${EmailIntent.REVIEW_REMOVED} intent` + ); + } + const result = await emailService.sendReviewRemovedEmail(recipient, { venueName, reason }); + if (!result.success) { + throw new Error('Failed to send review removed email via Resend'); + } + break; + } + case EmailIntent.REVIEW_RESTORED: { + const { venueName } = metadata; + if (!venueName) { + throw new Error(`Missing venueName in metadata for ${EmailIntent.REVIEW_RESTORED} intent`); + } + const result = await emailService.sendReviewRestoredEmail(recipient, venueName); + if (!result.success) { + throw new Error('Failed to send review restored email via Resend'); + } + break; + } + default: + throw new Error(`Unknown email intent: ${intent}`); + } +} + +async function processNextTask(): Promise { + if (isShuttingDown) return; + + const now = new Date(); + const staleCutoff = new Date(Date.now() - EmailConstants.STALE_CUTOFF_MS); + const pid = process.pid.toString(); + + try { + const task = await EmailTaskModel.findOneAndUpdate( + { + status: EmailTaskStatus.PENDING, + $or: [{ lockedAt: null }, { lockedAt: { $lt: staleCutoff } }], + retryAfter: { $lte: now }, + }, + { + $set: { + status: EmailTaskStatus.QUEUED, + workerId: pid, + lockedAt: now, + }, + }, + { returnDocument: 'after', writeConcern: { w: 'majority' } } + ); + + if (!task) return; + + activeTasks++; + + try { + await dispatch(task); + task.status = EmailTaskStatus.COMPLETED; + // Completed tasks expire after 15 minutes + task.lockedAt = null; + task.deleteAt = new Date(Date.now() + FIFTEEN_MIN_MS); + await task.save(); + logInfo(`Email task completed`, { taskId: task._id.toString() }); + } catch (e) { + const error = e as Error; + task.retries += 1; + task.lastError = error.message; + task.lockedAt = null; // Release lock so polling can re-acquire + + if (task.retries >= EmailConstants.MAX_RETRIES) { + task.status = EmailTaskStatus.FAILED; + // Failed tasks persist for 7 days for debugging + task.deleteAt = new Date(Date.now() + SEVEN_DAYS_MS); + logError(`Email task failed permanently`, { + module: 'email.worker.ts/processNextTask', + taskId: task._id.toString(), + error: error.message, + }); + } else { + task.status = EmailTaskStatus.PENDING; + // Fix: schedule retry via retryAfter, not lockedAt + const backoffMs = 2 ** task.retries * 30000; // 30s, 60s, 120s... + task.retryAfter = new Date(Date.now() + backoffMs); + // Failed retry tasks keep the 7-day deleteAt from creation + logWarn(`Email task failed, scheduling retry`, { + taskId: task._id.toString(), + retryInSeconds: backoffMs / 1000, + error: error.message, + }); + } + + await task.save(); + } finally { + activeTasks--; + } + } catch (err) { + logError('Email worker polling loop encountered an error', { + module: 'email.worker.ts/processNextTask', + error: (err as Error).message, + }); + } +} + +export function startEmailWorker(): void { + if (pollingInterval) return; + logInfo('Email worker started', { pollIntervalSeconds: EmailConstants.POLL_INTERVAL_MS / 1000 }); + pollingInterval = setInterval(() => void processNextTask(), EmailConstants.POLL_INTERVAL_MS); +} + +export async function stopEmailWorker(): Promise { + logInfo('Email worker shutdown initiated'); + isShuttingDown = true; + + if (pollingInterval) { + clearInterval(pollingInterval); + pollingInterval = null; + } + + // Wait for in-flight tasks to complete (max 30 seconds) + const waitInterval = 500; + let waited = 0; + const maxWait = 30000; + + while (activeTasks > 0 && waited < maxWait) { + await new Promise((resolve) => setTimeout(resolve, waitInterval)); + waited += waitInterval; + } + + if (activeTasks > 0) { + logWarn('Email worker shutdown complete with incomplete tasks', { activeTasks }); + } else { + logInfo('Email worker shutdown complete gracefully'); + } +} diff --git a/server/src/workers/venueEditDeadline.worker.ts b/server/src/workers/venueEditDeadline.worker.ts new file mode 100644 index 0000000000..cdf08b746b --- /dev/null +++ b/server/src/workers/venueEditDeadline.worker.ts @@ -0,0 +1,115 @@ +import { VenueModel } from '../modules/venue/venue.model'; +import { UserModel } from '../modules/user/user.models'; +import { logModerationAction } from '../modules/moderation/moderationActivity.service'; +import { emailService } from '../services/email.service'; +import { logInfo, logError } from '../utils/logger'; +import { VENUE_CONSTANTS } from '../constants/venue.constants'; +import mongoose from 'mongoose'; + +let superAdminId: string | null = null; + +async function getSuperAdminId(): Promise { + if (superAdminId) return superAdminId; + const admin = await UserModel.findOne({ role: 'superAdmin' }).select('_id').lean(); + if (!admin) throw new Error('SuperAdmin not found for auto-suspend worker'); + superAdminId = admin._id.toString(); + return superAdminId; +} + +export async function checkAndSuspendExpiredVenues(): Promise { + const now = new Date(); + const systemId = await getSuperAdminId(); + + const expiredVenues = await VenueModel.find({ + status: 'Rejected', + currentEditDeadline: { $lt: now }, + deleted: false, + }) + .select('_id name ownerUserId currentEditDeadline') + .lean(); + + let suspendedCount = 0; + + for (const venue of expiredVenues) { + const session = await mongoose.startSession(); + session.startTransaction(); + + try { + // Double-check status hasn't changed (race condition protection) + const freshVenue = await VenueModel.findById(venue._id).session(session); + if ( + freshVenue?.status !== 'Rejected' || + !freshVenue.currentEditDeadline || + freshVenue.currentEditDeadline >= now + ) { + await session.abortTransaction(); + continue; + } + + await VenueModel.findByIdAndUpdate( + venue._id, + { + status: 'Suspended', + suspensionReason: VENUE_CONSTANTS.AUTO_SUSPEND_REASON, + currentEditDeadline: null, + updatedBy: new mongoose.Types.ObjectId(systemId), + }, + { session } + ).exec(); + + // Log activity with system actor + const deadlineStr = venue.currentEditDeadline?.toISOString() ?? 'unknown'; + await logModerationAction( + systemId, + 'auto_suspend_venue', + venue._id.toString(), + 'venue', + `Auto-suspended after edit window expired on ${deadlineStr}`, + { actor: 'system (superadmin)' } + ); + + // Email owner + const owner = await UserModel.findById(venue.ownerUserId).select('email').lean(); + if (owner?.email) { + const daysStr = VENUE_CONSTANTS.EDIT_WINDOW_DAYS.toString(); + await emailService.sendVenueSuspendedEmail( + owner.email, + venue.name, + `Your venue was auto-suspended because it was not resubmitted within ${daysStr} days of rejection.` + ); + } + + await session.commitTransaction(); + suspendedCount++; + } catch (err: unknown) { + await session.abortTransaction(); + logError('Failed to auto-suspend venue', { venueId: venue._id, error: err }); + } finally { + await session.endSession(); + } + } + + if (suspendedCount > 0) { + logInfo('Auto-suspended venues due to edit window expiry', { count: suspendedCount }); + } + + return suspendedCount; +} + +export function startAutoSuspendWorker(): void { + // Run every 6 hours + setInterval( + () => { + void checkAndSuspendExpiredVenues().catch((err: unknown) => { + logError('Auto-suspend worker error', { error: err }); + }); + }, + 6 * 60 * 60 * 1000 + ); + // Also run once on startup after a short delay + setTimeout(() => { + void checkAndSuspendExpiredVenues().catch((err: unknown) => { + logError('Auto-suspend worker startup error', { error: err }); + }); + }, 5000); +} diff --git a/server/tests/globalSetup.ts b/server/tests/globalSetup.ts new file mode 100644 index 0000000000..536ffa0664 --- /dev/null +++ b/server/tests/globalSetup.ts @@ -0,0 +1,38 @@ +import { MongoMemoryReplSet } from 'mongodb-memory-server'; + +let replSet: MongoMemoryReplSet; + +export async function setup() { + process.env.NODE_ENV = 'test'; + process.env.JWT_ACCESS_SECRET = 'test_jwt_access_secret_key_1234567890'; + process.env.JWT_REFRESH_SECRET = 'test_jwt_refresh_secret_key_1234567890'; + process.env.ACCESS_TOKEN_EXPIRY = '30m'; + process.env.REFRESH_TOKEN_EXPIRY = '7d'; + process.env.RAZORPAY_WEBHOOK_SECRET = 'test_webhook_secret_1234567890'; + + replSet = await MongoMemoryReplSet.create({ + replSet: { + count: 1, + dbName: 'test', + storageEngine: 'wiredTiger', + }, + binary: { + version: '6.0.14', + }, + }); + + const uri = replSet.getUri(); + process.env.MONGODB_URI = uri; + + return async () => { + if (replSet) { + await replSet.stop(); + } + }; +} + +export async function teardown() { + if (replSet) { + await replSet.stop(); + } +} diff --git a/server/tests/helpers/auth.helper.ts b/server/tests/helpers/auth.helper.ts new file mode 100644 index 0000000000..166a083503 --- /dev/null +++ b/server/tests/helpers/auth.helper.ts @@ -0,0 +1,22 @@ +import { generateAccessToken } from '../../src/utils/tokenUtils'; +import { createTestUser } from './db.helper'; +import type { IUser } from '../../src/modules/user/user.models'; + +export interface AuthenticatedUserSession { + user: IUser; + accessToken: string; + authHeader: { Authorization: string }; + cookieHeader: string; +} + +export const createAuthenticatedSession = async (): Promise => { + const user = await createTestUser(); + const accessToken = generateAccessToken(user.id as string, user.username, user.email); + + return { + user, + accessToken, + authHeader: { Authorization: `Bearer ${accessToken}` }, + cookieHeader: `accessToken=${accessToken}`, + }; +}; diff --git a/server/tests/helpers/db.helper.ts b/server/tests/helpers/db.helper.ts new file mode 100644 index 0000000000..d84cb13149 --- /dev/null +++ b/server/tests/helpers/db.helper.ts @@ -0,0 +1,29 @@ +import bcrypt from 'bcrypt'; +import { UserModel, type IUser } from '../../src/modules/user/user.models'; + +export interface CreateTestUserOptions { + username?: string; + email?: string; + password?: string; + active?: boolean; + deleted?: boolean; + isBanned?: boolean; +} + +export const createTestUser = async (options: CreateTestUserOptions = {}): Promise => { + const username = options.username ?? `testuser_${Date.now()}_${Math.floor(Math.random() * 1000)}`; + const email = options.email ?? `${username}@example.com`; + const plainPassword = options.password ?? 'Password@123'; + const hashedPassword = await bcrypt.hash(plainPassword, 10); + + const user = new UserModel({ + username, + email, + password: hashedPassword, + active: options.active ?? true, + deleted: options.deleted ?? false, + isBanned: options.isBanned ?? false, + }); + + return user.save(); +}; diff --git a/server/tests/helpers/webhook.helper.ts b/server/tests/helpers/webhook.helper.ts new file mode 100644 index 0000000000..97816b62ab --- /dev/null +++ b/server/tests/helpers/webhook.helper.ts @@ -0,0 +1,67 @@ +import crypto from 'crypto'; + +export const TEST_WEBHOOK_SECRET = 'test_webhook_secret_1234567890'; + +export function generateRazorpaySignature( + rawBody: string, + secret = TEST_WEBHOOK_SECRET +): string { + return crypto.createHmac('sha256', secret).update(rawBody).digest('hex'); +} + +export function createMockRazorpayPaymentCapturedPayload(options: { + paymentId?: string; + orderId?: string; + amount?: number; + notes?: Record; + event?: string; +} = {}): object { + const paymentId = options.paymentId ?? `pay_${Date.now()}_${Math.floor(Math.random() * 1000)}`; + const orderId = options.orderId ?? `order_${Date.now()}_${Math.floor(Math.random() * 1000)}`; + const amount = options.amount ?? 50000; + + return { + entity: 'event', + account_id: 'acc_test123', + event: options.event ?? 'payment.captured', + contains: ['payment'], + payload: { + payment: { + entity: { + id: paymentId, + entity: 'payment', + amount, + currency: 'INR', + status: 'captured', + order_id: orderId, + invoice_id: null, + international: false, + method: 'card', + amount_refunded: 0, + refund_status: null, + captured: true, + description: 'Booking Payment', + card_id: 'card_test123', + bank: null, + wallet: null, + vpa: null, + email: 'testuser@example.com', + contact: '+919999999999', + notes: options.notes ?? { + holdId: 'hold_test_123', + venueId: '60d5ecb8b392d40015f8a001', + date: '2026-08-01', + slotId: '09:00-11:00', + userId: '60d5ecb8b392d40015f8a002', + }, + fee: 1000, + tax: 180, + error_code: null, + error_description: null, + created_at: Math.floor(Date.now() / 1000), + }, + }, + }, + created_at: Math.floor(Date.now() / 1000), + }; +} diff --git a/server/tests/integration/middlewares/validation.middleware.test.ts b/server/tests/integration/middlewares/validation.middleware.test.ts new file mode 100644 index 0000000000..1286de6834 --- /dev/null +++ b/server/tests/integration/middlewares/validation.middleware.test.ts @@ -0,0 +1,68 @@ +import { describe, it, expect } from 'vitest'; +import express from 'express'; +import request from 'supertest'; +import { z } from 'zod'; +import { validateBody, validateParams, validateQuery } from '../../../src/middlewares/validation.middleware'; + +describe('Validation Middleware', () => { + const app = express(); + app.use(express.json()); + + const sampleSchema = z.object({ + name: z.string().min(3), + age: z.number().min(18), + }); + + const paramsSchema = z.object({ + id: z.string().min(5), + }); + + const querySchema = z.object({ + page: z.string().transform(Number), + }); + + app.post('/test-body', validateBody(sampleSchema), (req, res) => { + res.status(200).json({ success: true, validated: req.validated?.body }); + }); + + app.get('/test-params/:id', validateParams(paramsSchema), (req, res) => { + res.status(200).json({ success: true, validated: req.validated?.params }); + }); + + app.get('/test-query', validateQuery(querySchema), (req, res) => { + res.status(200).json({ success: true, validated: req.validated?.query }); + }); + + it('should allow valid request body and populate req.validated', async () => { + const response = await request(app) + .post('/test-body') + .send({ name: 'Alice', age: 25 }); + + expect(response.status).toBe(200); + expect(response.body.success).toBe(true); + expect(response.body.validated).toEqual({ name: 'Alice', age: 25 }); + }); + + it('should reject invalid request body with HTTP 400', async () => { + const response = await request(app) + .post('/test-body') + .send({ name: 'Al', age: 15 }); + + expect(response.status).toBe(400); + expect(response.body.success).toBe(false); + }); + + it('should validate params correctly', async () => { + const response = await request(app).get('/test-params/12345'); + expect(response.status).toBe(200); + + const invalidResponse = await request(app).get('/test-params/12'); + expect(invalidResponse.status).toBe(400); + }); + + it('should validate and transform query params', async () => { + const response = await request(app).get('/test-query?page=2'); + expect(response.status).toBe(200); + expect(response.body.validated).toEqual({ page: 2 }); + }); +}); diff --git a/server/tests/integration/routes/auth.test.ts b/server/tests/integration/routes/auth.test.ts new file mode 100644 index 0000000000..3ba7165391 --- /dev/null +++ b/server/tests/integration/routes/auth.test.ts @@ -0,0 +1,157 @@ +import { describe, it, expect } from 'vitest'; +import request from 'supertest'; +import { app } from '../../../src/app'; +import { createTestUser } from '../../helpers/db.helper'; + +describe('Auth API Routes', () => { + describe('POST /api/v1/auth/register', () => { + it('should register a new user successfully', async () => { + const response = await request(app) + .post('/api/v1/auth/register') + .send({ + username: 'newuser123', + email: 'newuser123@example.com', + password: 'Password@123', + }); + + expect(response.status).toBe(201); + expect(response.body.success).toBe(true); + }); + + it('should return 400 when invalid registration data is provided', async () => { + const response = await request(app) + .post('/api/v1/auth/register') + .send({ + username: 'usr', + email: 'invalid-email', + password: '123', + }); + + expect(response.status).toBe(400); + expect(response.body.success).toBe(false); + }); + }); + + describe('POST /api/v1/auth/login', () => { + it('should log in successfully with valid credentials', async () => { + const password = 'Password@123'; + const user = await createTestUser({ password }); + + const response = await request(app) + .post('/api/v1/auth/login') + .send({ + email: user.email, + password, + }); + + expect(response.status).toBe(200); + expect(response.body.success).toBe(true); + expect(response.headers['set-cookie']).toBeDefined(); + }); + + it('should reject login with wrong password', async () => { + const user = await createTestUser({ password: 'Password@123' }); + + const response = await request(app) + .post('/api/v1/auth/login') + .send({ + email: user.email, + password: 'WrongPassword@123', + }); + + expect(response.status).toBe(401); + expect(response.body.success).toBe(false); + }); + }); + + describe('POST /api/v1/auth/refresh', () => { + it('should return 401 when refresh token cookie is missing', async () => { + const response = await request(app).post('/api/v1/auth/refresh'); + expect(response.status).toBe(401); + expect(response.body.success).toBe(false); + }); + + it('should refresh access token when valid refresh cookie is sent', async () => { + const password = 'Password@123'; + const user = await createTestUser({ password }); + + // Perform login to get cookies + const loginRes = await request(app) + .post('/api/v1/auth/login') + .send({ email: user.email, password }); + + const cookies = loginRes.headers['set-cookie'] as string[]; + expect(cookies).toBeDefined(); + + const refreshRes = await request(app) + .post('/api/v1/auth/refresh') + .set('Cookie', cookies); + + expect(refreshRes.status).toBe(200); + expect(refreshRes.body.success).toBe(true); + }); + }); + + describe('POST /api/v1/auth/logout', () => { + it('should log out user and clear session cookies', async () => { + const password = 'Password@123'; + const user = await createTestUser({ password }); + + const loginRes = await request(app) + .post('/api/v1/auth/login') + .send({ email: user.email, password }); + + const cookies = loginRes.headers['set-cookie'] as string[]; + + const logoutRes = await request(app) + .post('/api/v1/auth/logout') + .set('Cookie', cookies); + + expect(logoutRes.status).toBe(200); + expect(logoutRes.body.success).toBe(true); + }); + }); + + describe('POST /api/v1/auth/forgot-password', () => { + it('should accept valid email and return success', async () => { + const user = await createTestUser(); + + const response = await request(app) + .post('/api/v1/auth/forgot-password') + .send({ email: user.email }); + + expect(response.status).toBe(200); + expect(response.body.success).toBe(true); + }); + + it('should return 400 for invalid email format', async () => { + const response = await request(app) + .post('/api/v1/auth/forgot-password') + .send({ email: 'not-an-email' }); + + expect(response.status).toBe(400); + expect(response.body.success).toBe(false); + }); + }); + + describe('GET /api/v1/auth/sessions', () => { + it('should list active sessions for logged in user', async () => { + const password = 'Password@123'; + const user = await createTestUser({ password }); + + const loginRes = await request(app) + .post('/api/v1/auth/login') + .send({ email: user.email, password }); + + const cookies = loginRes.headers['set-cookie'] as string[]; + + const sessionsRes = await request(app) + .get('/api/v1/auth/sessions') + .set('Cookie', cookies); + + expect(sessionsRes.status).toBe(200); + expect(sessionsRes.body.success).toBe(true); + expect(Array.isArray(sessionsRes.body.data)).toBe(true); + }); + }); +}); diff --git a/server/tests/integration/routes/booking.test.ts b/server/tests/integration/routes/booking.test.ts new file mode 100644 index 0000000000..df3a5333dc --- /dev/null +++ b/server/tests/integration/routes/booking.test.ts @@ -0,0 +1,130 @@ +import { describe, it, expect } from 'vitest'; +import request from 'supertest'; +import { app } from '../../../src/app'; +import { createAuthenticatedSession } from '../../helpers/auth.helper'; +import { IdempotencyKeyModel } from '../../../src/models/idempotency-key.model'; + +describe('Booking API Routes', () => { + describe('GET /api/v1/bookings/my-bookings', () => { + it('should return 401 when not authenticated', async () => { + const response = await request(app).get('/api/v1/bookings/my-bookings'); + expect(response.status).toBe(401); + expect(response.body.success).toBe(false); + }); + + it('should return user bookings list when authenticated', async () => { + const session = await createAuthenticatedSession(); + + const response = await request(app) + .get('/api/v1/bookings/my-bookings') + .set('Cookie', [session.cookieHeader]); + + expect(response.status).toBe(200); + expect(response.body.success).toBe(true); + }); + + it('should accept pagination and status filter query parameters', async () => { + const session = await createAuthenticatedSession(); + + const response = await request(app) + .get('/api/v1/bookings/my-bookings?page=1&limit=5&status=confirmed') + .set('Cookie', [session.cookieHeader]); + + expect(response.status).toBe(200); + expect(response.body.success).toBe(true); + }); + }); + + describe('POST /api/v1/bookings/checkout', () => { + it('should return 400 or unauthorized/forbidden when lockId payload is invalid', async () => { + const session = await createAuthenticatedSession(); + + const response = await request(app) + .post('/api/v1/bookings/checkout') + .set('Cookie', [session.cookieHeader]) + .send({ lockId: 'invalid-id' }); + + expect([400, 401, 403]).toContain(response.status); + expect(response.body.success).toBe(false); + }); + }); + + describe('Idempotency-Key handling on POST /api/v1/bookings/checkout', () => { + it('should cache the response and replay it on the same key', async () => { + const session = await createAuthenticatedSession(); + const key = 'booking-test-replay-key'; + + const first = await request(app) + .post('/api/v1/bookings/checkout') + .set('Cookie', [session.cookieHeader]) + .set('Idempotency-Key', key) + .send({ lockId: 'invalid-id' }); + + expect([400, 401, 403]).toContain(first.status); + expect(first.body.success).toBe(false); + + const cacheEntry = await IdempotencyKeyModel.findOne({ key }).lean().exec(); + expect(cacheEntry).toBeTruthy(); + expect(cacheEntry?.response.status).toBe(first.status); + + const second = await request(app) + .post('/api/v1/bookings/checkout') + .set('Cookie', [session.cookieHeader]) + .set('Idempotency-Key', key) + .send({ lockId: 'invalid-id' }); + + expect(second.status).toBe(first.status); + expect(second.body).toEqual(first.body); + }); + + it('should pass through when no Idempotency-Key header is present', async () => { + const session = await createAuthenticatedSession(); + + const response = await request(app) + .post('/api/v1/bookings/checkout') + .set('Cookie', [session.cookieHeader]) + .send({ lockId: 'invalid-id' }); + + expect([400, 401, 403]).toContain(response.status); + expect(response.body.success).toBe(false); + }); + + it('should treat different idempotency keys as independent requests', async () => { + const session = await createAuthenticatedSession(); + + const responseA = await request(app) + .post('/api/v1/bookings/checkout') + .set('Cookie', [session.cookieHeader]) + .set('Idempotency-Key', 'key-independent-a') + .send({ lockId: 'invalid-id' }); + + expect([400, 401, 403]).toContain(responseA.status); + + const responseB = await request(app) + .post('/api/v1/bookings/checkout') + .set('Cookie', [session.cookieHeader]) + .set('Idempotency-Key', 'key-independent-b') + .send({ lockId: 'invalid-id' }); + + expect([400, 401, 403]).toContain(responseB.status); + + const count = await IdempotencyKeyModel.countDocuments({ + key: { $in: ['key-independent-a', 'key-independent-b'] }, + }); + expect(count).toBe(2); + }); + }); + + describe('GET /api/v1/bookings/:bookingRefId', () => { + it('should return 404 or authorization error for a non-existent booking reference ID', async () => { + const session = await createAuthenticatedSession(); + const fakeRefId = 'BMV-999999'; + + const response = await request(app) + .get(`/api/v1/bookings/${fakeRefId}`) + .set('Cookie', [session.cookieHeader]); + + expect([401, 403, 404]).toContain(response.status); + }); + }); +}); diff --git a/server/tests/integration/routes/health.test.ts b/server/tests/integration/routes/health.test.ts new file mode 100644 index 0000000000..31332c1294 --- /dev/null +++ b/server/tests/integration/routes/health.test.ts @@ -0,0 +1,21 @@ +import { describe, it, expect } from 'vitest'; +import request from 'supertest'; +import { app } from '../../../src/app'; + +describe('GET /api/v1/health', () => { + it('should return 200 OK with health status message', async () => { + const response = await request(app).get('/api/v1/health'); + + expect(response.status).toBe(200); + expect(response.body.success).toBe(true); + expect(response.body.message).toBe('Service is healthy'); + }); + + it('should return 404 for unknown endpoints', async () => { + const response = await request(app).get('/api/v1/unknown-endpoint-xyz'); + + expect(response.status).toBe(404); + expect(response.body.success).toBe(false); + expect(response.body.message).toBe('Route/Method not found'); + }); +}); diff --git a/server/tests/integration/routes/rbac.test.ts b/server/tests/integration/routes/rbac.test.ts new file mode 100644 index 0000000000..c01ad95343 --- /dev/null +++ b/server/tests/integration/routes/rbac.test.ts @@ -0,0 +1,37 @@ +import { describe, it, expect } from 'vitest'; +import request from 'supertest'; +import { app } from '../../../src/app'; +import { createAuthenticatedSession } from '../../helpers/auth.helper'; + +describe('RBAC & Authorization Middleware API Routes', () => { + describe('Admin-only Route Restrictions', () => { + it('should reject unauthenticated request with 401 Unauthorized', async () => { + const response = await request(app).get('/api/v1/bookings/all'); + expect(response.status).toBe(401); + expect(response.body.success).toBe(false); + }); + + it('should deny non-admin standard user with 401/403 on admin booking list', async () => { + const session = await createAuthenticatedSession(); + + const response = await request(app) + .get('/api/v1/bookings/all') + .set('Cookie', [session.cookieHeader]); + + expect([401, 403]).toContain(response.status); + expect(response.body.success).toBe(false); + }); + + it('should deny non-admin standard user with 401/403 on ban user endpoint', async () => { + const session = await createAuthenticatedSession(); + + const response = await request(app) + .post('/api/v1/user/60d5ecb8b392d40015f8a999/ban') + .set('Cookie', [session.cookieHeader]) + .send({ banReason: 'Violation of terms' }); + + expect([401, 403]).toContain(response.status); + expect(response.body.success).toBe(false); + }); + }); +}); diff --git a/server/tests/integration/routes/user.test.ts b/server/tests/integration/routes/user.test.ts new file mode 100644 index 0000000000..7a3a9a596f --- /dev/null +++ b/server/tests/integration/routes/user.test.ts @@ -0,0 +1,44 @@ +import { describe, it, expect } from 'vitest'; +import request from 'supertest'; +import { app } from '../../../src/app'; +import { createAuthenticatedSession } from '../../helpers/auth.helper'; + +describe('User API Routes', () => { + describe('GET /api/v1/user/profile', () => { + it('should return 401 when access token cookie is missing', async () => { + const response = await request(app).get('/api/v1/user/profile'); + expect(response.status).toBe(401); + expect(response.body.success).toBe(false); + }); + + it('should return authenticated user profile when cookie is present', async () => { + const session = await createAuthenticatedSession(); + + const response = await request(app) + .get('/api/v1/user/profile') + .set('Cookie', [session.cookieHeader]); + + expect(response.status).toBe(200); + expect(response.body.success).toBe(true); + expect(response.body.data.email).toBe(session.user.email); + expect(response.body.data.name).toBe(session.user.username); + }); + }); + + describe('PATCH /api/v1/user/profile', () => { + it('should update user profile successfully', async () => { + const session = await createAuthenticatedSession(); + + const response = await request(app) + .patch('/api/v1/user/profile') + .set('Cookie', [session.cookieHeader]) + .send({ + username: 'updatedname', + }); + + expect(response.status).toBe(200); + expect(response.body.success).toBe(true); + expect(response.body.data.name).toBe('updatedname'); + }); + }); +}); diff --git a/server/tests/integration/routes/venue.test.ts b/server/tests/integration/routes/venue.test.ts new file mode 100644 index 0000000000..0b97ba56a2 --- /dev/null +++ b/server/tests/integration/routes/venue.test.ts @@ -0,0 +1,42 @@ +import { describe, it, expect } from 'vitest'; +import request from 'supertest'; +import { app } from '../../../src/app'; + +describe('Venue API Routes', () => { + describe('GET /api/v1/venues', () => { + it('should return paginated active venues list', async () => { + const response = await request(app).get('/api/v1/venues'); + + expect(response.status).toBe(200); + expect(response.body.success).toBe(true); + expect(Array.isArray(response.body.data.venues)).toBe(true); + }); + + it('should accept pagination and filter query parameters', async () => { + const response = await request(app).get('/api/v1/venues?page=1&limit=5&city=Mumbai'); + + expect(response.status).toBe(200); + expect(response.body.success).toBe(true); + }); + }); + + describe('GET /api/v1/venues/pins', () => { + it('should return empty venue pins array when no venues exist', async () => { + const response = await request(app).get('/api/v1/venues/pins'); + + expect(response.status).toBe(200); + expect(response.body.success).toBe(true); + expect(Array.isArray(response.body.data)).toBe(true); + }); + }); + + describe('GET /api/v1/venues/featured', () => { + it('should return featured venues array', async () => { + const response = await request(app).get('/api/v1/venues/featured'); + + expect(response.status).toBe(200); + expect(response.body.success).toBe(true); + expect(Array.isArray(response.body.data)).toBe(true); + }); + }); +}); diff --git a/server/tests/integration/routes/webhook.test.ts b/server/tests/integration/routes/webhook.test.ts new file mode 100644 index 0000000000..407a0cc401 --- /dev/null +++ b/server/tests/integration/routes/webhook.test.ts @@ -0,0 +1,108 @@ +import { describe, it, expect, beforeAll } from 'vitest'; +import request from 'supertest'; +import { app } from '../../../src/app'; +import { ProcessedWebhookModel } from '../../../src/modules/booking/models/processedWebhook.model'; +import { + generateRazorpaySignature, + createMockRazorpayPaymentCapturedPayload, + TEST_WEBHOOK_SECRET, +} from '../../helpers/webhook.helper'; + +// Ensure the unique index on ProcessedWebhooks.eventId is created before tests run. +// mongodb-memory-server may create indexes asynchronously, causing the idempotency +// gate to miss duplicate key errors in the duplicate webhook test. +beforeAll(async () => { + await ProcessedWebhookModel.createIndexes(); +}); + +describe('Razorpay Webhook API Routes', () => { + describe('POST /api/v1/webhook/razorpay', () => { + it('should reject requests missing the x-razorpay-signature header', async () => { + const payload = createMockRazorpayPaymentCapturedPayload(); + const rawBody = JSON.stringify(payload); + + const response = await request(app) + .post('/api/v1/webhook/razorpay') + .set('Content-Type', 'application/json') + .send(rawBody); + + expect(response.status).toBe(200); + expect(response.body.received).toBe(false); + expect(response.body.error).toBe('Missing x-razorpay-signature header'); + }); + + it('should reject requests with invalid HMAC signatures', async () => { + const payload = createMockRazorpayPaymentCapturedPayload(); + const rawBody = JSON.stringify(payload); + const invalidSignature = 'invalid_hmac_signature_hash_1234567890'; + + const response = await request(app) + .post('/api/v1/webhook/razorpay') + .set('Content-Type', 'application/json') + .set('x-razorpay-signature', invalidSignature) + .send(rawBody); + + expect(response.status).toBe(200); + expect(response.body.received).toBe(false); + expect(response.body.error).toBe('Invalid webhook signature'); + }); + + it('should ignore non-payment.captured events', async () => { + const payload = createMockRazorpayPaymentCapturedPayload({ event: 'payment.failed' }); + const rawBody = JSON.stringify(payload); + const signature = generateRazorpaySignature(rawBody, TEST_WEBHOOK_SECRET); + + const response = await request(app) + .post('/api/v1/webhook/razorpay') + .set('Content-Type', 'application/json') + .set('x-razorpay-signature', signature) + .send(rawBody); + + expect(response.status).toBe(200); + expect(response.body.received).toBe(true); + }); + + it('should return 200 (with error) for a valid webhook with invalid notes metadata', async () => { + const payload = createMockRazorpayPaymentCapturedPayload({ + notes: { foo: 'bar' }, + }); + const rawBody = JSON.stringify(payload); + const signature = generateRazorpaySignature(rawBody, TEST_WEBHOOK_SECRET); + + const response = await request(app) + .post('/api/v1/webhook/razorpay') + .set('Content-Type', 'application/json') + .set('x-razorpay-signature', signature) + .send(rawBody); + + expect(response.status).toBe(200); + expect(response.body.received).toBe(true); + }); + + it('should handle duplicate webhook events idempotently', async () => { + const payload = createMockRazorpayPaymentCapturedPayload(); + const rawBody = JSON.stringify(payload); + const signature = generateRazorpaySignature(rawBody, TEST_WEBHOOK_SECRET); + + // First request — process normally + const firstResponse = await request(app) + .post('/api/v1/webhook/razorpay') + .set('Content-Type', 'application/json') + .set('x-razorpay-signature', signature) + .send(rawBody); + + expect(firstResponse.status).toBe(200); + expect(firstResponse.body.received).toBe(true); + + // Second request — should be detected as duplicate and return idempotent: true + const secondResponse = await request(app) + .post('/api/v1/webhook/razorpay') + .set('Content-Type', 'application/json') + .set('x-razorpay-signature', signature) + .send(rawBody); + + expect(secondResponse.status).toBe(200); + expect(secondResponse.body.idempotent).toBe(true); + }); + }); +}); diff --git a/server/tests/setup.ts b/server/tests/setup.ts new file mode 100644 index 0000000000..af9884d75c --- /dev/null +++ b/server/tests/setup.ts @@ -0,0 +1,64 @@ +import { beforeAll, beforeEach, afterAll, afterEach } from 'vitest'; +import mongoose from 'mongoose'; +import { RoleModel } from '../src/models/role.model'; + +beforeAll(async () => { + process.env.NODE_ENV = 'test'; + process.env.JWT_ACCESS_SECRET = process.env.JWT_ACCESS_SECRET || 'test_jwt_access_secret_key_1234567890'; + process.env.JWT_REFRESH_SECRET = process.env.JWT_REFRESH_SECRET || 'test_jwt_refresh_secret_key_1234567890'; + process.env.ACCESS_TOKEN_EXPIRY = '30m'; + process.env.REFRESH_TOKEN_EXPIRY = '7d'; + process.env.RAZORPAY_WEBHOOK_SECRET = process.env.RAZORPAY_WEBHOOK_SECRET || 'test_webhook_secret_1234567890'; + + const baseUri = process.env.MONGODB_URI; + if (!baseUri) { + throw new Error('MONGODB_URI environment variable is not defined by global setup'); + } + + const workerId = process.env.VITEST_POOL_ID || '1'; + const url = new URL(baseUri); + url.pathname = `/test_db_${workerId}`; + url.searchParams.set('retryWrites', 'false'); + const uri = url.toString(); + + if (mongoose.connection.readyState !== 0) { + await mongoose.disconnect(); + } + await mongoose.connect(uri, { retryWrites: false }); +}, 60000); + +beforeEach(async () => { + if (mongoose.connection.readyState !== 0) { + await RoleModel.updateOne( + { name: 'user' }, + { + $setOnInsert: { + name: 'user', + displayName: 'User', + description: 'Standard registered user', + isSystem: true, + priority: 100, + active: true, + deleted: false, + }, + }, + { upsert: true } + ); + } +}); + +afterEach(async () => { + if (mongoose.connection.db) { + const collections = await mongoose.connection.db.collections(); + for (const collection of collections) { + await collection.deleteMany({}); + } + } +}); + +afterAll(async () => { + if (mongoose.connection.readyState !== 0) { + await mongoose.disconnect(); + } +}, 60000); + diff --git a/server/tests/unit/idempotency.middleware.test.ts b/server/tests/unit/idempotency.middleware.test.ts new file mode 100644 index 0000000000..da4643f9c9 --- /dev/null +++ b/server/tests/unit/idempotency.middleware.test.ts @@ -0,0 +1,98 @@ +import { describe, it, expect, beforeEach } from 'vitest'; +import express from 'express'; +import request from 'supertest'; +import { idempotencyMiddleware } from '../../src/middlewares/idempotency.middleware'; +import { IdempotencyKeyModel } from '../../src/models/idempotency-key.model'; + +describe('idempotencyMiddleware', () => { + beforeEach(async () => { + await IdempotencyKeyModel.deleteMany({}); + }); + + it('should pass through when no Idempotency-Key header is present', async () => { + const app = express(); + app.use(express.json()); + app.post('/test', idempotencyMiddleware(), (_req, res) => { + res.status(200).json({ success: true }); + }); + + const response = await request(app).post('/test').send({}); + + expect(response.status).toBe(200); + expect(response.body.success).toBe(true); + }); + + it('should cache the response and replay it on the same key', async () => { + const app = express(); + app.use(express.json()); + app.post('/test', idempotencyMiddleware(), (_req, res) => { + res.status(422).json({ success: false, message: 'validation error' }); + }); + + const first = await request(app) + .post('/test') + .set('Idempotency-Key', 'unit-test-replay') + .send({}); + + expect(first.status).toBe(422); + expect(first.body).toEqual({ success: false, message: 'validation error' }); + + const cacheEntry = await IdempotencyKeyModel.findOne({ key: 'unit-test-replay' }).lean().exec(); + expect(cacheEntry).toBeTruthy(); + expect(cacheEntry?.response.status).toBe(422); + expect(cacheEntry?.response.body).toEqual({ success: false, message: 'validation error' }); + + const second = await request(app) + .post('/test') + .set('Idempotency-Key', 'unit-test-replay') + .send({}); + + expect(second.status).toBe(first.status); + expect(second.body).toEqual(first.body); + }); + + it('should not cache 5xx responses', async () => { + const app = express(); + app.use(express.json()); + app.post('/test', idempotencyMiddleware(), (_req, res) => { + res.status(500).json({ success: false, message: 'Internal server error' }); + }); + + const first = await request(app) + .post('/test') + .set('Idempotency-Key', 'unit-test-5xx') + .send({}); + + expect(first.status).toBe(500); + + const cacheEntry = await IdempotencyKeyModel.findOne({ key: 'unit-test-5xx' }).lean().exec(); + expect(cacheEntry).toBeNull(); + }); + + it('should treat different keys as independent requests', async () => { + const callOrder: number[] = []; + const app = express(); + app.use(express.json()); + app.post('/test', idempotencyMiddleware(), (_req, res) => { + callOrder.push(1); + res.status(200).json({ success: true }); + }); + + await request(app) + .post('/test') + .set('Idempotency-Key', 'key-a') + .send({}); + + await request(app) + .post('/test') + .set('Idempotency-Key', 'key-b') + .send({}); + + expect(callOrder).toHaveLength(2); + + const count = await IdempotencyKeyModel.countDocuments({ + key: { $in: ['key-a', 'key-b'] }, + }); + expect(count).toBe(2); + }); +}); diff --git a/server/tests/unit/owner.repository.test.ts b/server/tests/unit/owner.repository.test.ts new file mode 100644 index 0000000000..a39ff4b205 --- /dev/null +++ b/server/tests/unit/owner.repository.test.ts @@ -0,0 +1,43 @@ +import { describe, it, expect, vi, beforeEach } from 'vitest'; +import { Types } from 'mongoose'; +import { getVenueAnalyticsData } from '../../src/modules/owner/owner.repository'; +import { BookingModel } from '../../src/modules/booking/models/booking.model'; +import { BookingStatus } from '../../src/constants/booking.constants'; + +vi.mock('../../src/modules/booking/models/booking.model', () => ({ + BookingModel: { + aggregate: vi.fn(), + }, +})); + +describe('Owner Repository - Analytics', () => { + beforeEach(() => { + vi.clearAllMocks(); + }); + + describe('getVenueAnalyticsData', () => { + it('should query MongoDB aggregate with both CONFIRMED and COMPLETED statuses', async () => { + const mockVenueId = new Types.ObjectId().toString(); + const mockResult = [ + { year: '2026', month: '07', revenue: 15000, count: 3 }, + ]; + + vi.mocked(BookingModel.aggregate).mockResolvedValueOnce(mockResult); + + const result = await getVenueAnalyticsData(mockVenueId); + + expect(BookingModel.aggregate).toHaveBeenCalledTimes(1); + const pipeline = vi.mocked(BookingModel.aggregate).mock.calls[0][0] as { + $match: Record; + }[]; + + const matchStage = pipeline[0].$match; + expect(matchStage.venueId).toEqual(new Types.ObjectId(mockVenueId)); + expect(matchStage.status).toEqual({ + $in: [BookingStatus.CONFIRMED, BookingStatus.COMPLETED], + }); + + expect(result).toEqual(mockResult); + }); + }); +}); diff --git a/server/tests/unit/responseUtils.test.ts b/server/tests/unit/responseUtils.test.ts new file mode 100644 index 0000000000..b18457f38d --- /dev/null +++ b/server/tests/unit/responseUtils.test.ts @@ -0,0 +1,92 @@ +import { describe, it, expect, vi } from 'vitest'; +import type { Response } from 'express'; +import { ResponseUtil } from '../../src/utils/responseUtils'; + +const mockResponse = () => { + const res = {} as Response; + res.status = vi.fn().mockReturnValue(res); + res.json = vi.fn().mockReturnValue(res); + return res; +}; + +describe('ResponseUtil', () => { + it('should format success response correctly', () => { + const res = mockResponse(); + ResponseUtil.success(res, 'Success message', { key: 'value' }); + + expect(res.status).toHaveBeenCalledWith(200); + expect(res.json).toHaveBeenCalledWith({ + success: true, + message: 'Success message', + data: { key: 'value' }, + }); + }); + + it('should format created response with HTTP status 201', () => { + const res = mockResponse(); + ResponseUtil.created(res, 'Item created', { id: 1 }); + + expect(res.status).toHaveBeenCalledWith(201); + expect(res.json).toHaveBeenCalledWith({ + success: true, + message: 'Item created', + data: { id: 1 }, + }); + }); + + it('should format notFound response with HTTP status 404', () => { + const res = mockResponse(); + ResponseUtil.notFound(res, 'User not found'); + + expect(res.status).toHaveBeenCalledWith(404); + expect(res.json).toHaveBeenCalledWith({ + success: false, + message: 'User not found', + }); + }); + + it('should format badRequest response with HTTP status 400', () => { + const res = mockResponse(); + ResponseUtil.badRequest(res, 'Invalid input', 'Validation error'); + + expect(res.status).toHaveBeenCalledWith(400); + expect(res.json).toHaveBeenCalledWith({ + success: false, + message: 'Invalid input', + error: 'Validation error', + }); + }); + + it('should format unauthorized response with HTTP status 401', () => { + const res = mockResponse(); + ResponseUtil.unauthorized(res, 'Token missing'); + + expect(res.status).toHaveBeenCalledWith(401); + expect(res.json).toHaveBeenCalledWith({ + success: false, + message: 'Token missing', + }); + }); + + it('should format forbidden response with HTTP status 403', () => { + const res = mockResponse(); + ResponseUtil.forbidden(res, 'Access denied'); + + expect(res.status).toHaveBeenCalledWith(403); + expect(res.json).toHaveBeenCalledWith({ + success: false, + message: 'Access denied', + }); + }); + + it('should format internalServerError response with HTTP status 500', () => { + const res = mockResponse(); + ResponseUtil.internalServerError(res, 'Database crash'); + + expect(res.status).toHaveBeenCalledWith(500); + expect(res.json).toHaveBeenCalledWith({ + success: false, + message: 'Database crash', + }); + }); +}); diff --git a/server/tests/unit/validators.test.ts b/server/tests/unit/validators.test.ts new file mode 100644 index 0000000000..964e8c228c --- /dev/null +++ b/server/tests/unit/validators.test.ts @@ -0,0 +1,76 @@ +import { describe, it, expect } from 'vitest'; +import { registerSchema, loginSchema, forgotPasswordSchema } from '../../src/modules/auth/auth.validator'; + +describe('Auth Validators (Zod Schemas)', () => { + describe('registerSchema', () => { + it('should validate valid user registration payload', () => { + const validPayload = { + username: 'johndoe', + email: 'john@example.com', + password: 'Password@123', + }; + + const result = registerSchema.safeParse(validPayload); + expect(result.success).toBe(true); + }); + + it('should reject short username', () => { + const invalidPayload = { + username: 'jo', + email: 'john@example.com', + password: 'Password@123', + }; + + const result = registerSchema.safeParse(invalidPayload); + expect(result.success).toBe(false); + }); + + it('should reject weak password without special character or uppercase', () => { + const invalidPayload = { + username: 'johndoe', + email: 'john@example.com', + password: 'password123', + }; + + const result = registerSchema.safeParse(invalidPayload); + expect(result.success).toBe(false); + }); + }); + + describe('loginSchema', () => { + it('should validate login with email', () => { + const result = loginSchema.safeParse({ + email: 'john@example.com', + password: 'Password@123', + }); + expect(result.success).toBe(true); + }); + + it('should validate login with username', () => { + const result = loginSchema.safeParse({ + username: 'johndoe', + password: 'Password@123', + }); + expect(result.success).toBe(true); + }); + + it('should reject when neither email nor username is provided', () => { + const result = loginSchema.safeParse({ + password: 'Password@123', + }); + expect(result.success).toBe(false); + }); + }); + + describe('forgotPasswordSchema', () => { + it('should validate valid email', () => { + const result = forgotPasswordSchema.safeParse({ email: 'user@example.com' }); + expect(result.success).toBe(true); + }); + + it('should reject invalid email format', () => { + const result = forgotPasswordSchema.safeParse({ email: 'invalid-email' }); + expect(result.success).toBe(false); + }); + }); +}); diff --git a/server/tsconfig.json b/server/tsconfig.json new file mode 100644 index 0000000000..044b705dba --- /dev/null +++ b/server/tsconfig.json @@ -0,0 +1,27 @@ +{ + "compilerOptions": { + "target": "ES2022", + "module": "NodeNext", + "moduleResolution": "NodeNext", + "lib": ["ES2022"], + "types": ["node"], + "outDir": "./dist", + "rootDir": "./src", + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true, + "declaration": true, + "declarationMap": true, + "sourceMap": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "allowSyntheticDefaultImports": true, + "useUnknownInCatchVariables": true + }, + "include": ["src/**/*", "scripts/tools/cleanupBans.ts"], + "exclude": ["node_modules", "dist", "scripts"] +} diff --git a/server/tsconfig.tsbuildinfo b/server/tsconfig.tsbuildinfo new file mode 100644 index 0000000000..9711ecc008 --- /dev/null +++ b/server/tsconfig.tsbuildinfo @@ -0,0 +1 @@ +{"root":["./src/router.ts","./src/server.ts","./src/configs/cors.config.ts","./src/configs/database.config.ts","./src/constants/auth.constants.ts","./src/constants/common.ts","./src/constants/email.constants.ts","./src/constants/env.ts","./src/constants/permissions.ts","./src/constants/venue.constants.ts","./src/middlewares/auth.middleware.ts","./src/middlewares/pagination.middleware.ts","./src/middlewares/rbac.middleware.ts","./src/middlewares/validation.middleware.ts","./src/models/email-task.model.ts","./src/models/permission.model.ts","./src/models/role-permission.model.ts","./src/models/role.model.ts","./src/models/user-role.model.ts","./src/modules/auth/auth.controller.ts","./src/modules/auth/auth.repository.ts","./src/modules/auth/auth.routes.ts","./src/modules/auth/auth.service.ts","./src/modules/auth/auth.validator.ts","./src/modules/auth/models/password-reset-request.model.ts","./src/modules/auth/models/password-reset-token.model.ts","./src/modules/auth/models/refresh-token.model.ts","./src/modules/auth/models/session.model.ts","./src/modules/availability/availability.controller.ts","./src/modules/availability/availability.repository.ts","./src/modules/availability/availability.router.ts","./src/modules/availability/availability.validator.ts","./src/modules/availability/availability.workflow.ts","./src/modules/booking/booking.controller.ts","./src/modules/booking/booking.model.ts","./src/modules/booking/booking.repository.ts","./src/modules/booking/booking.routes.ts","./src/modules/booking/booking.types.ts","./src/modules/booking/booking.validator.ts","./src/modules/booking/failedbooking.model.ts","./src/modules/booking/lock.model.ts","./src/modules/booking/lock.types.ts","./src/modules/booking/processedwebhook.model.ts","./src/modules/rbac/rbac.controller.ts","./src/modules/rbac/rbac.routes.ts","./src/modules/rbac/rbac.service.ts","./src/modules/user/user.controller.ts","./src/modules/user/user.models.ts","./src/modules/user/user.repository.ts","./src/modules/user/user.routes.ts","./src/modules/user/user.service.ts","./src/modules/venue/venue.controller.ts","./src/modules/venue/venue.model.ts","./src/modules/venue/venue.ownership.ts","./src/modules/venue/venue.repository.ts","./src/modules/venue/venue.routes.ts","./src/modules/venue/venue.service.ts","./src/modules/venue/venue.types.ts","./src/modules/venue/venue.validator.ts","./src/modules/venue/venue.workflow.ts","./src/modules/venue/venuedraft.model.ts","./src/modules/webhook/webhook.controller.ts","./src/modules/webhook/webhook.router.ts","./src/services/email.service.ts","./src/services/razorpay.service.ts","./src/services/roles.service.ts","./src/services/cache/permission-cache.service.ts","./src/types/express.ts","./src/types/pagination.types.ts","./src/utils/cacheutils.ts","./src/utils/dbutils.ts","./src/utils/errors.ts","./src/utils/logger.ts","./src/utils/paginationutils.ts","./src/utils/responseutils.ts","./src/utils/shutdownutils.ts","./src/utils/timeutils.ts","./src/utils/tokenutils.ts","./src/utils/winston/logger.ts","./src/utils/winston/requestlogger.ts","./src/workers/email.worker.ts"],"version":"5.9.3"} \ No newline at end of file diff --git a/server/vitest.config.ts b/server/vitest.config.ts new file mode 100644 index 0000000000..35a4850a3b --- /dev/null +++ b/server/vitest.config.ts @@ -0,0 +1,17 @@ +import { defineConfig } from 'vitest/config'; + +export default defineConfig({ + test: { + globals: true, + environment: 'node', + globalSetup: ['./tests/globalSetup.ts'], + setupFiles: ['./tests/setup.ts'], + testTimeout: 60000, + hookTimeout: 120000, + coverage: { + provider: 'v8', + reporter: ['text', 'json', 'html'], + exclude: ['node_modules/', 'dist/', 'tests/'], + }, + }, +}); From e688c47501d876ffa2eedd9ccc52665b0fdc3039 Mon Sep 17 00:00:00 2001 From: Ashish Shaiju <74810128+ashishshaiju@users.noreply.github.com> Date: Sun, 26 Jul 2026 14:04:41 +0530 Subject: [PATCH 2/2] Qa -> main (#53) --- server/src/app.ts | 2 +- server/src/modules/auth/auth.router.ts | 4 ++-- server/src/modules/user/user.router.ts | 2 +- server/src/modules/venue/venue.router.ts | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/server/src/app.ts b/server/src/app.ts index 9cb4a86beb..b5d7af2cdd 100644 --- a/server/src/app.ts +++ b/server/src/app.ts @@ -22,7 +22,7 @@ app.use(helmet()); app.use( rateLimit({ windowMs: 15 * 60 * 1000, - max: 100, + max: 200, message: 'Too many requests from this IP, please try again after 15 minutes', }) ); diff --git a/server/src/modules/auth/auth.router.ts b/server/src/modules/auth/auth.router.ts index 0f6fcee746..f9d0a6f9f6 100644 --- a/server/src/modules/auth/auth.router.ts +++ b/server/src/modules/auth/auth.router.ts @@ -9,7 +9,7 @@ const router: Router = Router(); const secondaryRateLimiter = rateLimit({ windowMs: 15 * 60 * 1000, - max: 5, + max: 10, message: 'Too many requests from this IP. Please try again after 15 minutes.', standardHeaders: true, legacyHeaders: false, @@ -17,7 +17,7 @@ const secondaryRateLimiter = rateLimit({ const loginRateLimiter = rateLimit({ windowMs: 15 * 60 * 1000, - max: 10, + max: 20, message: 'Too many login attempts from this IP. Please try again after 15 minutes.', standardHeaders: true, legacyHeaders: false, diff --git a/server/src/modules/user/user.router.ts b/server/src/modules/user/user.router.ts index c413a2644e..db0679a284 100644 --- a/server/src/modules/user/user.router.ts +++ b/server/src/modules/user/user.router.ts @@ -11,7 +11,7 @@ const router: Router = Router(); const uploadSignatureLimiter = rateLimit({ windowMs: 30 * 60 * 1000, - max: 10, + max: 20, message: 'Too many upload requests, please try again later', }); diff --git a/server/src/modules/venue/venue.router.ts b/server/src/modules/venue/venue.router.ts index 5ff17e8a00..9c885dd236 100644 --- a/server/src/modules/venue/venue.router.ts +++ b/server/src/modules/venue/venue.router.ts @@ -17,7 +17,7 @@ const router: Router = Router(); const uploadSignatureLimiter = rateLimit({ windowMs: 30 * 60 * 1000, - max: 10, + max: 20, message: 'Too many upload requests, please try again later', });

pW6RD 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 e#r{WaMmgZK+O!ivzpX!-1*V3U2Co3O$o~K div { + flex: 1 1 0; + padding: 32px; + @media (max-width: 1024px) { + padding: 24px 20px; + } + } + + .icon { + margin-bottom: 16px; + width: 22px; + height: 22px; + } + + @media (max-width: 1024px) { + flex-direction: column; + text-align: center; + } +} + +#docs { + border-right: 1px solid var(--border); + + @media (max-width: 1024px) { + border-right: none; + border-bottom: 1px solid var(--border); + } +} + +#next-steps ul { + list-style: none; + padding: 0; + display: flex; + gap: 8px; + margin: 32px 0 0; + + .logo { + height: 18px; + } + + a { + color: var(--text-h); + font-size: 16px; + border-radius: 6px; + background: var(--social-bg); + display: flex; + padding: 6px 12px; + align-items: center; + gap: 8px; + text-decoration: none; + transition: box-shadow 0.3s; + + &:hover { + box-shadow: var(--shadow); + } + .button-icon { + height: 18px; + width: 18px; + } + } + + @media (max-width: 1024px) { + margin-top: 20px; + flex-wrap: wrap; + justify-content: center; + + li { + flex: 1 1 calc(50% - 8px); + } + + a { + width: 100%; + justify-content: center; + box-sizing: border-box; + } + } +} + +#spacer { + height: 88px; + border-top: 1px solid var(--border); + @media (max-width: 1024px) { + height: 48px; + } +} + +.ticks { + position: relative; + width: 100%; + + &::before, + &::after { + content: ''; + position: absolute; + top: -4.5px; + border: 5px solid transparent; + } + + &::before { + left: 0; + border-left-color: var(--border); + } + &::after { + right: 0; + border-right-color: var(--border); + } +} diff --git a/admin/src/App.tsx b/admin/src/App.tsx new file mode 100644 index 0000000000..9e9d646b2a --- /dev/null +++ b/admin/src/App.tsx @@ -0,0 +1,24 @@ +import { QueryClientProvider } from "@tanstack/react-query"; +import { queryClient } from "./config/queryClient"; +import { AppRouter } from "./router"; +import { TooltipProvider } from "./components/ui/tooltip"; +import { Toaster } from "react-hot-toast"; + +function App() { + return ( + + + + + + + ); +} + +export default App; diff --git a/admin/src/assets/bmv-logo.png b/admin/src/assets/bmv-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..e66c1f6c214731a7b8163e94a453e2716ca0aa28 GIT binary patch literal 150492 zcmeEuWm_Cw)9o<055Zl7OK^9G;0_7y?(R;469}#e?he7--95N#a6526&$+{U{=vDf z_XE(~)3asOs#Vo{R}&^LD~eR`hy? zHu^^Nu2!}$cfYjB?`o@OU}5A)q;F(mX3a}+@~f4C$jp$JLXB1CgN&`Pk*S%4ySt^*GmglMvi(!u2z=T4qUFhB>yzb^>X}rnSq3l$KKGGOHoAZ zzjwTx@sgN2I@)qEFu1t5(7Q0x+t`~hFmiHoGJIfSU}BB+?)i#GEZ0p-a+>QhRL#DSXL?pW+@D2tx z@IAzbK)Ps5n6GpvxRrE+mG9vfHEGRQk}pS=(|`UNxff3>EcM=Ah;DM-9+^Jz;P=YV zE-Wf4x?bgUf+Gq93BeHm@2~&G;D34W|C1X;k0LSg27rVB0$|tPnY)W#`Y^i`V9(RO zm;!l|sBc`_8G{7?67nUw8T@7UqjhX`PEE~Sx#+hMQsu6~H69!Q3)WFdo<~vWShM$T z->S`!i}1~t`$l}B075XwZRgp#HxID2+Hj86=)2y2Lm0L{1>m4F#ZpL$8*quziav$?}xo@Zl@TM`m0d#X+5F9`(CodG5(SY8*D@yuNd&AdcWc2Ve74(JZ z{9b5VyEMk0I6$H8UbAQ%WB+oxv2;d__tZDjBg)bE=?C|u$1JF`>T-V{N(=f8RqgGv zznf*PlDW^pE6GQ(Ae1d5pe)JBWryMg#=%wAT~vW^^77${B2E zseZT*A9)&tf`gIoO#040F`ShILVfP!ft(T+$s7S2$x@wmUuWcWF=ir2BEGqgt z+U*7$go642#t80fu3p*?0^FnL0}1@O$N~sGb{7iVH`!;U*D8SBAz$aWR#ocjQWsnw zrr`YwRXE;Sa+Ugp2j>uiU@mGtCp&5Q=?`1YRUu_l?cqv*m9B@~-rIm?4HR zMEB|kn(aIi5QhLnw!b^iO#gye{wiLAEi(7F6T$K4lhWDyQ`;(@-UP5Wk>lY=_|?Rq zl~pa*iJsl1(V@$0Pdy*I2CSlxDaLI%ggw;m=hhy8Z{`gR1WvpMGk`@{ogA1ClS<<& zHCPi5NQ${}m;qrhK0<*C4 zUuQP5tV;+Mu>=X}eLdW_4!OB6zMkyqACRhLa5_Ym0RP$u=C;*DbA~kVQ0VxOme0zn z@{UL)fafJE*MxGxm)b0Rf1xMr|lJ{tJ@i7_t&f})kM};LfQ$j)jl(>fi~$7t=y$yFj%?O8 z>n!y*?!RM}sh3KjWRN_GH}G}cm|;UOo#TpDf}4iJPdz~03m#%;O13TshB|Q-!%+Zt z@ZhLE6g1DoWkrsp5g;D?&Ox%5vnjv9#Gmz0Qb8hYFmiHI0c4m+znLZ{Ar1g$e#_JI zYX8xMo$s~^f2gIYwLUK&FSGP4Pp!ZCDNhE_&Ji8EN$_Y40HqXA$;y8K1Ue<7Yl%TH zvjw*IpxZLy#9WGenl9XkKwMtp;{J1r%)J(w^mIPz<>wR9~wZ`M2CU}zOu;<+2y!z(^KEfz7R@jH(%y;XL9+W%)m74ZLaI;6MGs4=VXet&Y zKodY4O`CUrKp3z$!chMcTy2!L^plqrGIQAyUi$6R0W?iWB`xe5R2KzaDEce)%=88g zEbx_phI%L$R4GxyBTWB&l)Q3_m`Vh(qO^~hj|pH&6Qj8(SL%&J!zB5?IJ7e(9NGb{iFWO-@y>v34EH)X zjNMI68DDh4nJGIY$EZN`HY*+Q{0dAdYylq47rDp3zIhBtR1I-zdulEQu)xj)y1Isz zi2!yeT83)hAOSH>)+(XZD>-a(U(+D#XS=5vB3gdMTEof&a0pjAJj+Q6-QU>IWk5~I( zta63k5ia6}Fi$J)1H<#&yv>(KLd77rBl|Bw^c^$iyiw;?>>D{7mW*#; z-<xpI6^+Y+l)6v?7_ou3L%1q#J zoW1ZmjAz?N;NlYHo}e$dI0FdX7M58`9M$2iJ8;Ptw~vd>_vN1PNI9IyaQ=rppNvh122v6V5i_r$p1*Dp7g#D~ zD)^_pOwBz22j5rGp6561Z`#1TGLZxgRPyL#ux2iyM*a1e`F%y*M}R`HP1DJu_Kjd~ z-QL_g-GQ>!e*Qnipq`I6btry8*T@*a!HTq*`A^W9AVy(dfuf3p=qmhTRkQd1gOGu* zgha6c`w~%=r^5w)c;J|3dh~nvWHqI#S^O|_Huc1cENXC-q>7;0$md7bF!gZkH+mgC z>St5sKFkIVQx+H)DU{WNQR{G9-FpeKH^@X^WWFjuS4$8nyv3ZWYS`^Wk-#v%jtam6 z79`>$kaJ4defx12dF8G>g})B^qss`*0zyfAjuSEb$)qL&HtzWc!I?&ZoSW65Yi*S; z_KNuSw+V0TN}K`qDrBM`3-4;N*9MZ38qj1Zb{}Wp+ISx0aGQhvgpuU{0O(eCS60PP z8v7r|N5}S9#4N056l}}ECHC3c8a@zQpdY}@pnhihyo<%cjz zqp@ZQVW{1sFL4odx=C(BdccM~nX$SGOnJ&7BereQ@5|3_QffJk2u%yFaomYPEcj@F zd+IBR4Lu#)p;z}RH3ugeb>Lh00=+nbf0IMdxep>FxsWp~e8AwfT=`|k{BgGM-U7k> z)neaWyAnU<(;{3mT_41=SY}GHQ492@dV^AoA#u$MNT?d*mi~aVVwn#5XYBT4ZI4 z^wA4|xjipsm2uR0KltD!bI+ZL`f+j2LNmDcgJ14w-znMMOnMSEJir$tgK_HQ$We7S zT@KfefefFct7Gn!c3KNq0mZ2>M)6}IegYppX-&FsY%by%w{BC-aikly(75jQ#kAjb z_CAk5kw06y>77iM?hd$K92#;gaMAC2R~Bs|!=Inl*S*=#1cHcWC`bip4CTJv;hwc>STp*O!CdG)O_g+<49XDp?F~;DQ;?Qy%x;Fl>i6o7Kh)zOUqkogV#NNT6Lo7f3(} zH#CkBN8wW|v1R^zf)Ki`k=k8bcFLZQH_hz}b+FU8E{))uZ^4=4r4-ykF)1NxsL53# z24)q%V$#xo3-D4K87{$V{&Yv9)5OYkA3R;7UjbU1)XublH>(_(w2pN zg)Q(GPf8GqeV7BGD#lFtB?DTH&GIi#!&1d49DgaW46gNIGWW033~boV$6#NZGkV@j z-eqef55bH%{=vn;?m9A6&Ug=V6CEwyc0PoNGVglGF93Ne?+PG6%9*6_QYdLg=Qyp@ zvhyS@u?=%r9T@0nn9N(Pw7DHCF`AFZ`LY1Z1F^zoeg$ZvZmP4RQ014`@%YF#Q;n03 z4|nPcyTrds*MiF&P{&Py%%R5XIT?nEi!m4W7ib>8SM`%ly~m($-Tu=c_c*jZl+J+j zXXlG1FEyYBDn_08%v%#2quT$1z4Ufx8IP%gZyN>e=|a(TU#HC-%(NlfL@bDwM`4gf zcb*1K8?9#8K2ECFgphMtgX3mBFV*7^Noy;1r&Rw6zR3Ne4*8J3ad%p}MBwNX=^ZJS zkaEBcAtF#_b^y2oQ7B*F=k72p7o1lc+!hALb?st;xuTu0rA3W!@=!EA&H5Jg^DaMP zUzmnK1%U^F$eFh3w5PVM^OnuD`!6InJ3Gr@B8=V(l+nZH3~*J&zkG>i@*=@1A(ESJ zVr)hS;@C1UWZz5ugwwMnYDd-nqR3-d0MT-X#FG=pW((^8jWldIl{1TI{C&Gwz-#7Cy4)R*W{3NZa`=WX+^v57L}dneh<@hA0Sk;yjlqt(FiFZ zqyv6!x|3>cw1lc>=QzIed+S3%6yIsZ%$M(2aD5bNNUghF4a}`Bt|w2NuJH>YM)5>} zfG=spTIgowNDwE_Q))uO61lb{l&P5@!7ShzLFceT;l{AJVuV~mT6-ELS1T2`+aN&Q zYj-Fq0uwl`?EE(pZNA&#`5Xzd-#a}6S3B`Jyvg%6aPvM33TSVdq!w{8bBh!Q7ie0l z`?XJJW#1?F?B7+4(aN8Qgfp)pQi=6^bh{Wy8ahk<2;PqY>b;<&+z0LOeQPZpFG1T; zC7e&xX?UQh#(KI>kxNyVOVZI_^4J|)88)EshGVYMsk1SQDk_58N7we#grI)c}J@qyh+@k?0BRxI>3VTQfdMeh=LIne;k?8W&|SzisDt1CZ^1Dt8+gV ze3x|D%T>Jweh1Zo8|mDQI_IZX@u-7zrsWCuDFW5tE>R9>RP=a=%(#?&mAG4QB0bEL zva--c5p~xslr^&`m7%JttVe$r?Ofy4-z8|9T&bj3MvA@-XS;f#hVa!ht##Fl3|YPEIYHvu=%l zvMt09i0|R%CqsnSZ1i!S1%(lt`CoH_&SS|33orn~v7X)^aR=Vj75888R_n?G2;Rf- zI-Iu;-#$%@=H&5TeVd+Urpl2HyubSFJv8oM|H6*UbFY!`maU z|75AM(VZ=w`V9pqUKf|>6^=O^O^xjj54nwvjcwAB(&8FRf7^$Bc0l39f~@_u7FUR? zTKTKv3JQSu6(?)H=e*iiT^QnGJp&1Pip;|M2cznbCCePaMkE7SG!i(KG74F~yRi5z z(&w85X5{CBEmz6Yu^7^Tl3w;!F9XlJUuqap^tbQUf8!d6zkAvMS+E^UbMg}zyP8Ex z;$^?&gEr)}%F)zaT3i&iiU36cmGT-VS$1|=Ie^d3P{)(cDjm6x<8TslQ3CiI!a?Y| zLcdJKcyxL;yxd7<*6C+yQ`k1KwI?X@XtZOGNc1dhc2uGD&TkOqaE)EZEr>S%ra)j+LUB5uS%Mmn)1i^V;$%h0M86 zMXj4dH-A<$GWaXiF=eS?n$S*hn(oo{W!Q$)V^w|_PD*Y@tvuuOT--(VY8n&)wf0py z0I>LCUo%y^f0WA0h>e+tYS+;W4u<>+u>V~fw?pteYhg0;JRkD?JA=(t@EgH%e0luX ze7ETX5QS{YkFpp0LT~Pr?-hETF0yiwdX%%fGBK|NtXa)Jg7-(! z+07+WsxVh1S(Mde2%U-6wYO!1@&DdfsBdgNF6r~+wj4Bn^2=j&JfP&kndlju@>sj+ z(5h`8wh(84ohlPZ zg9g0J9|wsQqDJZlQeIHOBTCc4aT{alsbP>|v2By^mKk^TqN07kNMrnO;O|3vP50;p z)0tdM-7E|aXt;LKNb5}b@zcHA^KL#_b z!qHaKJGx6+X%hH^%K!9`&p1Yg2aUp8a5FA2M)@aVA*1^716^p9a1TyiTs*Ng$F>1( zRI6$_S|sIrE5ieFjUlpd3S8mXIxq#WrVwRR&L;azpLL~-2l3{{n}lCccp8#PN1&Hy zm?(nAtA@CmD*hF5J1rmUf>YTaVy8XG#3>*1GZs9GHgj|BNo5kU3)(LVd5Y?Iiscgt z#p8(Eym|4=Ig|m^VAMMbm^Fvkcz6g-8wX2<56G(l@j=zF|0*A-lJs?@M>>4bucfST z2blO>HcZL_{&E7QFSM17H252`1QV7abp>4*{>?VQuBkqhD7X*{$qzoT^Ag#g5e^&K zL!Hk}=iC0Z@8Qh+vxsjSJ=)v=Eka=N;56S)-2TMe>*y#SJGmUKa<1&TtYN1KLzmrW zk5@!JOF-W>JO=T0Ll8JQ7wa!qd)9jnN-Cs5%x@c>!}4N zHZy<;^@0lI15yLfdB|nQourwIHmY=(>p1FVZV~<}#r(K@6Y=Id0~;T=jI!X-wC*8* zC>RQKMpLgrX4-C&&0M`P(4!LC5H^6q{R&rkJ$gY^;tCM|vC!IH_|yCDvw3UjELMS1 z#kxVX2mmo*P*7O~1_V`L1V?yN$hROo?S}QSvtEL`T6(TkpVgMZvWiR*%!vE)$`9N= zhX?G0zfLGjjP@D=y1|zlL1+5-*XF2fRDqx1y0`|k>{w<}_BLYGveLlKp-l&V^Bba! zME7LIY8X^Hj>BYD!~=a7V0(UMCujHp)U2&az2@(~f8UuL_^arKy{{W7-*JrGM1%TS zMQui=bIT}hIVJ-gZnd<44hH0**>=geqQ5=8F;@7)&NE=Ecp(@Uc&58MkdxX{2QX2M zwM?IqAI=}m-Euubq##gr1mP&4ztgXJJe-MZbK^yNUm1jydLJJNU{^KBQxaWYA$?Lo z-V9-zA$aU>Xy|1BPUFF?LaeBj*TX2*8n;cJ+QBSonuS75G|d$qBCRMe?7^QadG*aX zzNXSN@)tJ5`oo+M84dzjDsz_7`kYi-mNR4z()zsz^g*1%DC!=*EcUy9xfqTAx^DML zXeor^^2efwCML(!o{P)}=u{^tive4yGKG&L>x1Ic?67AIw0OdghLy}6`$;=)smq%f z9T2R83tenhHqL!6%E@kqt*W70J7raxr+)G-HDm$L);_3Bax0nOoib zQ4M}$K=CuP_uN8#BO5CX2Upgzvd_w#1kH`DO?k!29~&Xj_~I}0H*@Sjn+uMsC3)Cuc|CvP` zO_5yPhV?&-EGR;F9r-ytY*)*^G`cuOUh{e5^YKa1Jk#0oM_#GzP^e{gO+Mbuml4Ra zW&Gm#)#UO)-O*Q~IPdlG)-KO{A81VLI=%mwbA74aBQ~_<>%j%Lezp7k9 zVDc_I3G;yQSPKJ4MVnrj;pt=Lry~FBOEUT-jvX1vA{Kxs%ShnRrai%pS?!ymuIF*_ z$jnWZmeY~6gVvjrWuCJdolU4OayvbqM!Ul8?zhfdm7`&Sv#dUJ314e0-4e1clrJSD z#a124rQfcjHP8<2Xu9d#Ds4%aztw`pO$tX&$Vv0t4^shsG!MkH13H;L{!+pe_&`+{ z!A_*XWZJ430H{k0JZsd?7*`f;gmWr>-_}b;Jcn5esXJ+Cnn(X+eXs^+gf^9PFmI1-Cxk*N2R9k!aoG{n_nP*V+A6tW#g9hK*IABdZRfqGI5&|`bJ`qUyNg|=nB z9C}u8AsE421YGm484QA}gu;9o7hz{7c-}=gtzPsEGZOrpDL8{9-AMuuEzzQpF{GcJ zYH562oV_dXWSg8u;BGz{)-g`n;o7mobuEV7>B*vM_r&I+?fkSd+$1Ar$6cj&qiI4s zuQ0Wga2V0y44d~Y8KbRe?ys~#0NBd(LXsf)3bPUzRMr$~ZO|Q!45^WHlXGqDjZAd( z!p%1PB8VVx(Tp-;p;~hsapD#)9CnZ+D2ot?8744ZZ*c$WhrERvpQ);+LSB?%4p1a-d`u zjrGd$-;HVG)$gg|t(wk||CIsmpo?kp7jA5}#8c3v@;#pZx}v9DnLD~NTpwn}jYR-N zgY2O`*kMJ4xE*J$Ud_l&Fp*h+WsWa4Y0!lK9Orm96ZJb-C_N%M)kP%b>!=km*Ohwo zlx50twF(T~yY+2-&S5QYE*aXiu1r=vd=-IIcos%3P>dO?6=WRmr0vxs ziO9J(<(#65V}=CM!k#l+)Qy`}QwPk;4GCW)Z!3L^ zRHxGEc{v-%gHs|HQRt#u zlb&P3wW@?y@W*7)0P+NO@7&w}(0E``~ zs#JVF$?5j|$uzXWXY>)c7@I1T$-MPT!w&cK@`80LQT`Dbu_UU14z%A`?68`*J%n0# z;!4REm9<`VK{ArV`^qqY@kt7ThSiN-8HTQa&YAtc#xoRO%QXQBITO6*GcqSS;30lx zdUo5m)2dx)%L(ry$ToxLiD@IcF3B#)#b;pYaE?58}9MYMj9_;cF`JiaFhaF{qh6muBPFeuJa3F_Z#5?$`o$l;%D-w za{QsjS81j^1i;37d;t=>MQu<~9|DJi8_(bA?`fGS1=TcPc0ZkOObn&*H3`hk8~*91 zroo~-Z?sW^28H8f1&OA6;Gx!+hfr2#1?ILB5X5=8md~^P8-qcWIsdGD0al+k+pCI9 zbUtu1GbpNuVo@q*V`ad$bB;4*z9ZYCQs6o1VxLS!CD!0x{aA+d9Lw9DU@AQjY&>Bv zf#P5)vO_M7Ix@VtQVHMMP(h?aXLbSy9VCI(fmAz)8g!(Nkq2jz{yZXd7dmSRgMTE3 z{&`)u;?dhJPV z9PoD$wbI}-Pr#i_NNgsZc;>##%jX_0P6%JRxeZYk zyy0y%5-9D?dr(|i=qiqaUC$4UR}rGjB(m?V$sLHFI{YC}H_>G$n4=nUXKD|-CF_9_ z=((8GgA{8{9p6Q>RwC=g#$v{V>@8X~%#ky1Npm7GX&`_QHl;cD(PRsmzkMJJW-)wG zrr+vXh_@GEk;UWdknbdIza(p2nu0JG{{kKZqUuW8@LR1zc-`pv{b$=fqi#VKzV*a;@UmA4SJ->_^Mk$IqPp5YhZ-y%RALVi*q0?fGHlP7QL}V zG)PLkOK3MVY}A-G)ZbaUZL|)X^`I%x40AXWz~bkoe`VJ-@I6;+L#71|0zAkR^w_=6 ziMeXEI<w zD1mmQ)!pB9icxUK_nC@GkDo>^u9y+LtKf6BoEm{i7H5URC2#)oUK0z4m&TXHscp2Rtf+hhQ--+LD6g~H!QTe`I9GYy$9Ar zDF}FWRWLJVTCnW?R#=$pJ17-YMzaavalPw(D}_) zMmN0if^)VBM{6WD*umM%~eDPKqH4gd8{@ zg`czZG}mBe*o-H{q!B-4aph*JAnezj9IDEHvZZ=1PtM2w0OAt4k{5uS-VUbEdiD($ zL#|;L`4@d5XPlRMxJuz9ofh}2KYIo`V^k);oRsZ`gLuQ9DstvHkQYRn870+^bQULn zNv`Vpdry6f`-Au6h@-^R2GcaqLJ;kHN^3O9Nk}G2u~JAk&K)om=(d#HgJe1B&dBDY zge5v=hOWD4`Usyh3~I zLz!ZPSr;An#DQOwk1{EYZQ!l6cVT4}!s6Dwce>ccWPT+|xBa9Xi7@~(zi*~+WuXz+ zI1&yOv*$!wAfa?&Fzo^3xum-FJ1YfisQF?5nh;N>mndGzjD#Tl~T0Bg;0rzZ&vcu(<{@lgH1_YgE|);_rYf!T$-* zeQD50Lo+Sjdr~H~yByHaZARLE1WFe|8q9NYx$CCpNAst)lZ>;BncVmgt?YPYKh}{6 zEFSOib`^E8jNIhM34@anlG0(C^X6G49sezOc##^j-TlYukBh;M# zMI5-P$C^oqnHCv(`;{cCHSLtmTo%y?OvK9bc+&{9!UTG zn^Z!_?<=&O;!$r)nJNSR8Mg#0l?}E^X9`pRwt|kZ$nWerZ;U4>asY+Gtk5I`3cFgW z6_2~WMYM|p@=g6GEAWU=yb?GK=t?C>SOvR|Mj7S%gy3Z~im)fuV5)vj^yw!#mr~r^ z6ff!aaF*P1dlD=#7V0^wQRBs1qIbcxdY!lZaRh{gP4j{^J~&TCdI9H$=a02aJMrIm zuIdEA^4Xl>MAb*V>EtJ-*mA#+u*F;=#LPM@3>VK8`qPDntW3AsF@KQ7{#)N1jSv4? z>+#_js`1kF&sLg{F;`k7)%*v$x|rn8-@fK(E{1O^R_kr#UKK@b2i7d6Z&OL;%E*nv zY1Y7=nls0lFVTxFh>69Oz>YH_3!*~j*Br^WkR8fdk%A!pBvcr3Et@2d45m79q;7A8 zu|7@O2FBi$$=_T|8lw|_XEi$q2B9r30?#?^7EQU(R-U43idaXgMBG?enS~zS`(+bY z?*o^3x5}HC$^WnHzfgx8_ti)Brf6vH+1Y1WGIzKXyOS`s-v@exX|IrPi?O;44C2vc zoKv3kuttz+_wId)MjAw`^+NT3FSGN`p-R>x<%oD-vH|+pjcPKx{)h$p(iE57Ky1)> z+>&@=MKM8cDO+mSb2j*;KBn$*;EqW?$Z3W~Ln|cFiS{F#MGde*_dbL%T!!YF1DrhBO>_#>yo#P5o_)lNN_OgBC@JzU^Sg;Ph9^SqTpAA|8X2(Ll<)x3h5lq^Qyzzpa9O30Eh`5y8Tl7r~_@vX_q z{HhQQJ^nmyuE>IvG}Ch>!9iQl6>sQ6`;FdZPPr=5@DugNLphBe|6J?{ux{BemS)rj zA9M|OJ}NcMxcyiMP`uXj?JIQ;oD*)%qx|c>(P@aU^daJNTx$!Tx%&jI;m_p?*_8Y# z_3NgBn(Up8vado<#< zda|3pOV%0X%ePw8*_!j8)n*!TTAvD3q_kE-H)TRv+`zvSn8RIU=XoWggvd9v+eWi1 z2n?d~XQWI^p$75O7%S};xWg9JU9rMF>Mht;+5NzPa#QI1a?6*?)OLr_hkyz6TgA~w zIv=+iccavbcoTL*;F%FXFub#ak|3r05X1tO%%W61$95yKO_u}_z0iN z+U5vYQrnTr*BNa%U$MnlLS(U!BsCJy!s{JTehMj|O-am6Yb9~kObw~8aCECsv>rES zRM}UDVz%uPR8F3OZP@W%5*zr*TLNQ*p?*U&_{)g44*^WibfPG@q|k~@w)YZE>9Sb$ zWv{}F&;Z_FwS&BQi_@x4q89u>or6BCcdS4tWQSVx8C;tU`zhq#Ic&cBr)U-iE)-$Y zH0X>~blh$Q`ZvG%lwU$e%68CJ#LbfI49sskrXLm%W{Ecls4))2oZ;eU9Hn}&3;a9r zY%y->AzQVN9Q^bHv7zs!UpzF$7`DO0vt^pR;b+AClxiQYNM!;fTNeiA&QJJ3;kk5U zXDmixf7p9st2m7puE=m^w;Q?p=&yp;2IK8CP6h16Q~Y&Nf!Q~cm>pYfOk8=HxGALieO_qq)Sua~*i^jfjf)YvBs z+3{z)wE`I}q){idG9Z<>G4_jNx;F?x`(nvZ7+^G2h1lo-W+p>3(6>9~UOK8(MY7&U zW1o#ePNkn|$(WI9!b)mchm$2B`(!4$Jo%UpM4L)cJ&At5Rx#5&elBCZt-bh%MIpA% zOB!=aJQqt7h<7XCwh>>Qb5NkC+4ftEaV64kBffi)4H9il$j0r|r-5b8mqy5hO)ZXF zQ-SL8BI=Rgy>b+~BBd9ytk#>vengpKRYr@pJG8`84%PjbPi29K;c+O5@&Z;YgN1=x3{!8kf{R8ZL!?4JU6>M13YSWh3Om zv^EaH5AE=oLuCL=={amzPABo6s{O3*O`-djN`cYR{}dJyOYk;i2lBZYJIg|h2=$BT z-Fi+{>zQgv$j1I6LG25G!^7{$3C;L=`-NOt_9Mkr*%{d=&(X&D2M_b~ONtNinN%jA zvd-uv$aNlEoAbebp-amuv~n&5mC=RVKIX;pm_%2HLO$-*Pduy9+xlZ~_5D(Gs|B*X5F- z)|0u4`w=$Wze{Gs-+`~0kW%854p}sK5Y789{r+MQ)*>c}@=GwaF`Jy}#;oVI0TCwr zxxC_eXO>N{ZgIFI>)9*>@X5D*AwxMpYokHQ0p}{4?5s%*N&Jamr>+^qqOJwgIs{Xz zWiF7!y2mfYcN%BK;R#IGph}^hes%tGSs(QF96q`svs&CJlgj=%n%`(9UH3dqDOV>ag4(64myTR8w7~{V=sbR?L ziy_>;zw8WL4wmk|kHlXXDb$OtL;)H6?Ndcu5z}woq89S$;*?F&akOTeR@R$lr8y>b&FUHFk%tXTg1JLe>7IiwTMiZSn7r(2g5$?< z&@$47TTMtr$aHR{nGle8O2|@XjNS~3HrM+A#&CXHG(5|@a#w6Ic2=T~S2jgZ00K1o zjo5ni+$tPjkI=k20t_Frr!#Bh5`&M0ujWb3%;4`dHe+9FDVza~<<7S-ofMeOVCFX2 z_83U~p;Llg5y_5dk$HKzLmPMv+g79)J1y}%-}CZ#dU1sX23uRF*9GEW_-dABzH)Y* zv!M7V+jm(7LP!Kh*GKJ9z+Mj5X48>Q2`>qt3g`7NPLQf*BHCFPV@d9bcG|OkzcoBJ zeZt9BXcut}JeyO@jAx0}BF-(BcosM??FqLWY=|e1-7$koQ1;B}e=U)tG{3)G5pL4; zs@yxszV97vOLB0#dNYrS*CKX$Cb&?E%WP~%4DM#X{CYA8xuOmQh=g46xde*(VHlws zHvjW)IMyQA9E&S|29%1Z?Ctp7OH7PLE^NX^=q?23+;D9=o&#~?q{mN%z4hr(GxeT@ zv6Gu(!pUxlUHmO4L?R zghNUh?Pmp3wA!jI!CAx(m(*1Z+ZvSK9Nm@uHCERwc8kqyJMskas9Unhot3kB>V!Ds zi+~)j@cvbdRZ>P%g&Y^H{e)Lm4-+FencAiH~Gj zRvgbRjJEq%sTs2KnyHS>mgS?)P9|gaN!i#!h1GGCSnrvwU_vk9V6~)FV=nFieMR|H zaoCu}Ghl6Do!i@u7`E3)y%rgj^KXpsF5n*{EC;RBpz^v54h^Mt$8=lv`xZ2E8}mv1<`HAzG#3OZ*avZ(dgnn<8m#DPbJhxbjo-lhThvB zro21v!z@^T!kZP_1UnX|I2bHi{WOP{uEddSt%$@2PzWfX9O47R^r5*ouo z@INCmUa{mLt4W(Fwk$vI=^pk!Wxy7!bnkys)?WWl1&? zys?=udC6cpVHB5H#1ggzHoHgF!j>VqDe{ZLfR`KA-cO^n9)DxEJuFiR2Z|6q5nV4 z^CMP?86l!<^3+bD$1dU@A+URFv#?S-zQ3^!Qu2O-(GJn)sQp>{E&MgqRDP`dL@$mp zDz_4+Du`}WEKiypU$YpWYOGwbmpT|pd;Y^i6;jPv2{UWj_fU&+Uj^|EW!z=X8=E zI+e#Ss2!|cJ4`cxm?#mUgDq#AG#Nw4FlPTG`L6#nu7Q;~8-3;xcV=_WmF4(=v`|1trgKD;vX`#bs!GIVd+OQr}>6|Q7 zW0*C#kV~Z~RilQRV5J;X{y!Z=B02+q0G^z_WstUW=G33eD_ZwH*!;qzE|Yv?!7HTAbM7d(mqjZJTHP_L=n0r`6T}Nyn)~it zN7ljf3SuwcmB}JYdi_))_~|IXb8+bKu*sbPur@8+Ecd%4`HAhkvsUKdt81ZFed(XC zhj>zXNso0O6)EP80V(9ccjg0|)8SyKfh}07!&s-p02?UVoo|9`iu|g9pD0IK0nf&p z?4Px5{-cx8(*Dnj$V5VY&vM5rE`Qc;HuqaYB3sR^N1rO+iH_X^iT!0sDTBwiVq;Z@&jcJ%rmd-J0biBdC%%)zJy#05Yf%$0=S&QiT zG*LCvarvTl^A;^&YM#9ZW6j5s0JM!WtbN|bN4_7nSp0v82yV_YdJJqlN$=ut90onI zWaTXo^M#r^sN@BhNd-==ZLVsUfka1Ei^k*DpTT}e$*J%=by`9!nK?)&6izP?MI?=P z?X&Sm-l7Z+#O-8+cuUbCUuJMWf~9P-ld6;3dYsLSKP>D7p4;1Jti9{-`Ua8;Zf5={YCIX;$m;vSW^ZgGqzAToeBQM&nsva$_&!^HclYi*ykq!} zxsFHFf(NC!GS2=x08z`?1qkfZ_@@tXI5!uV0DcYbl z6(NXUSbOqh(Q=k@`0qrt!?dbfs zP(v-d4Iuc=ciJ(K+P)<(1uq5)>M^{A>x@bXl;%+mHg4Pm50NLmo2Z06mL|wwZm~^2 zcS^1R+d7^SqsvS+0YA)A`h>Rf+~(0h2N>=7G5b(Qb6heiMrq98XA<+Vp0W<%7kAaE z!sbN>rXMB6`S7ouZPQ&p2IToz=Ec-_C&D4VpYgNjDa|619Zhvzn@WFF^IYxOxc9zg zYw}_5N{V`6$S{JjadR+8z;t?^MTREHm6t6}#=`IBz-vq()dKH}L3)<=&t-dqWLL}F zNEF>!Z6@lVvk!D2Oj#&cC}w-uizI_G)r=e|EjMWByzdlFBxoJOPcv&j&!J@}|l`rPu2 zlypnJD|cfU6QL`<%3|7)Jjw;O#$wJe;J2te-QXqmfmg@^Kdy!Yf0c5z9oAE`VEyp9=J;_5 zl}Y&ti!s;y;lJ)|(|wz5Ygf$C_IH zAT27(ebavXRl{rVmBk1^4F~};Ddvu^f7fqBQ&|O!M)p0CJLo~lx!sPn*rGM_D85qu zR~A|T!sf;175aOiuLq8L7nX|mqG?!0Znql|)q2wvk~kKOP_LU2uJzlcYW^&W~Yek!l~rsZNF@dT~@Tr-mOYpa{AcaHNX@{wmk zb<~5Mv$57r*_VtSvYh6csHsanAqFZfHEuqT*5^sqj+dw;Lanl?A$g8@+gr^s8#i)*9x7=Md;4a(J^IHqh;auhr-ParvCl>m_K%d78F_HI`S|<*%E|^5fKCJe zC|&>%0J$A+NJ{1vXZ@=DakyPqt;=tl0Qi7iO3n3*KsK+K2eH9SIAk zZT$UP-_ok<#XuiF*{{qgCKhFy13$`@2bb7fugZ#cg!s#L5aE57T|U!KngPmz|786| zpT1o&HTH^#@{??6)EyTbXNVYTv#Av^8W)_TYakJG^RZr>5S(nyj0%GZkGF32e}M^& z%Pd*)2k>169PyX7s0c};iF?&6%4gkLV3@%I%%`K8A;#kR*f&76WzKs;d&GNmHcjS-jHY{pzAV2NjTS#<$)udDk%f^zk_xbQ+iGQqU?SQsRyJg?UU$thAqQ{)s z|GsDoM!(_4=-*{A1H0(=D&0Byi#!HQzHyKJwqL# zg?oh}AjGz!u9q0}OWF}FTn4^E-@Gy>B~jL5NnsLG)q7Jm{&I}ZY}nF3AfITL+~znW z;;IK{nxD8AhuMYKqq(y7is0diTlaqv#6ZD z+ke&)6$7n-<-5v3k{65f(NPahF745*IIfE%uUa&7;wEE9p0f>LB8!cq?B6o6_|hbg zgEB^o@#6*-7vCRyGr*Z#^H6pCX4Imdl8D-#T#zyz5eNT zA6%$hl0jbXYyJ>sowGB~-s%nwi!ZH@n|qAlP#9Bp_4hRx{k_G*Q$P&?LJZJN-Mi^S zMCjLFm{vaTozPycw#NyOfbFf-)VblWC%^DRfq3Uy<}m>_ zf$T)^;T264AItOZ<|~ZB|L?+xSGtkGg)0A*X1aoNAb%(~^cDeS6}TVvRSWPMlo>k| z=yqQ$bn1=Mog#gNNwEIeR>nwd3}KiMnDYv&*+PD%)5~tPYnCQ~l?k3{B*QwjOe7aJqRHgtx0u@K_vT>C28ky|cL$adv2+zCm zxuw8J#an7$0RxGPeM3DYcedQrDQX~`f2JVS%zq2W3(LbqnA#*GCz$0 zz^LWA_jczwV9HxnR9CV8zC={Y?dpUv2e=x{%oW~VEg#xJ5YZ<;@y}%cXZs%kf`Jil zefh4YMt^sxtw6~%ChyfZ30uW^hV3!mz&WjL%Q;U)V}k`uH#s&qW@TLKO=+gY<{V0CA#Nz!< z?Z>hwqE(H(g0oN#h0s_OQ5E3oIupWhs0u)!4f0N$r&u5I12HTj)1K&T^mbCgR4dtt zWRmssm6z{j2uB}xXR9<*!P;*S1{1XR*Q_~zc_x!_{1Iy^-E%;=gLT>4+LfHb zkUWPu?>6T1eS~_&>yqj&FnaK z1-SY$QtY7@d1t;aRIJx9aOY0@P)wNDl@hDirB3w)Ac+N@J@*k3%_D$}_Dk!X-Rj&` zu_*+=PchZ^R~LQ!C9hY-0{vrcVqSOv#q{tkN(e!s*v1X70zuA zdxn(u{@)4SU#h#YmU@sapfO97=x*N47cE3%PA-laRj?T66aUP(t3H=4flkumJLPbRd_wY0Pe%0vqyf2In4pxzVLphdern;0dSliMyo&Wp@e z&W7^(oj$UbI73iJdG;x5f;i@g8>?41CwppFN=xxW}Z`&JL+iF7#J|#&v10B`A*-#&#L<{Q2m>9S4ZQ5U1 z=_M)CY4g_0HMrXcd2PE~37G|Z`J1Lc_r(~GtMo2b+1ABm?OPCsLzpwof8IimJ2ulI z$X^JLAWVc-*Quwx$P=xC<9K0z}Q=2G3-)@$VZ=x&+v`{NLKFhXbNg6zXKGo zAQOP-cWeJV0YXxkVb!NFk6V~K;y1Fw|7%tn?6eIHITpy7Dq8+-6yprgOF zBNgRYtT0T}o+I)uu7L^p)}-cQF?I7B7+?W#FDj$O8x)w#laH90<*G*cKF~{c-%l6^ zu8j4oUx7(;wL(W#V5^(4tX7+<);;~*lCn%M9||%FkUbzylrkaNALUjiyw}DdSjp30 zYq5jHmCYB7{f3ryhOfGa?t0ElK|i>q0(SMJXem8@3WYQ1laS-!|kdarO)|?NEw!6)ZzA)0E!HD zT5<}U6gRR4v*r4xa4;l$N2=F!$ucrMtW>Rx>{SgLCcio5gZP2 zRw?nhKmG?rp|ElJ+api(x{HHsz%5Oc-F8<~un2T(?NNSL%#dM06n`roZ3#ZNB36`C z7vT`dsu*)+q9-m!>K>T8i6qz248|BWxsUAi^|TV#U{nUW5J&&)T2jZa%EjtAmf*8^ zY!muq?YN>PC0`%F(m~{M5tK~Ui}Ywg=AtQ?v{o(`gECy=hvujl7$l>q$?qXa(BHoI zPh_^PuMocwq=r*@p((T5xB~M;sM4PSYn4RhhIg6eTQ9OBEeB=9DNexiCObd4R&8ZvN3i%!l~C026^@HWMSo$L`yS z`T{;`-#rUnu}{XlXj=}++t1Ihae8mOnZs`V6nJPeA_t7NUbB`7c7L&~?#PID1Xj16 z3!v~ISAGAwW{nkaJ&FXQWB@UyE0pyeU(YvXz0F-P!9Ou|Hh9ZnkZkT9eXcL?c+{MBC*ae2G$i|Iq`mV?ru4qP(n;4aIH1 z=tqyN-M|KQmV7d~j{W=-h}fx(I^Oy=cjxCoog9=@>cS4bvM?o8^%q{5ezJ$Z&D^uclKHV}m? zLvU5ZMpl^eG&0jeXzqgf))Ga96);f`Esj>YSF(J}AxQv^&>1|$;AyQuX z@i!3#YR(V}fB7ydZG%{W&GnG9J;ZM!Q|F|4GK3p?`fKRs>G-s5q1l9Ls65YK-v zP4EGBHV-d`!!qzER?;Tcgz~}FcIpbk{)Va7N=yu;pVlPIzCAJ1`(-uFZmbz9+_HNT zDMuB{;Oc`XvEQ>CBHbwGYhq=Hd&Fa%@(+{|KYK{?8i2 zCcx|6!`a6KO>m-|-|@y?e6^*UiG2uvWxyYbDb7c3+5eHXgk=7I*68-8MVyeC@7v$6 zSnxc}iV615Z=?_;>i?9paBC5frAQUC%lo>M)0|uIhdBKh@GhqzFhYq7jEZsfqTM%Q z`*bQ5T?&kwTu9$})pH@+icWd}h)o3(ch*3$G~P#R2R-W!p;U17ELSv8!sLdlvGxi! zgubsu(Zu}zY1<0#=w^0*$Z;sTwR|8M2|gb|_LTw|k{-|xkr4&^Udk)~Aqx^mgG`ke zNW|=_h(_xpYh3hGi0~yhVlkh?k-KRLq1eHR0d4i&DXNmzVze z)Uj$?rH1U-30iA`9FDgPp3Z|S(I3|n>-uHJ5_go<|>G@*=iaW)AgWp*5WG@0GX$3yqo(sW7Uus!<9BFB>e5ST0BJ0(?>*r{ai6i0*XOANlf*wx&Le{pU_m4Kcj@+E^^F&zDHX$l( zbhnxUZiI3jYX@ED-I`jRU-&pa|IIXgp;l_q&|_@!Z8mP$A#sSe1rt|=XWiCaWOvSb zmb`itTq;NNt3+EKXFaVSFvM*8oV;o4{oF-r*Ho+q;lcs2)E+TliiH$E;D=;m#8)IZ z5V!ZQeJQEO<|zWy44-gs=lj^%_9+J=@6+|(0pybD{|&Dh9{sCo6;TVLnDDX-^HdgK zEF9u3oZOqBS7Rik@l8fN*@;PK!2~$godJhw{7Z>r>Y~~p)&p#+%HN9 zFBnzV##6Zrevz(h~)jifk3`k0q zX-2^!37R!Y9$S_2Yf_-)_*S$kP3n%3%-+>UOKbT*ew^O#<$B*ra6kf~MmQNs*}Qh? z4HH!jZNUTHxu$rl{J)3P#WU7a9QJ>a0jX;Z2^x0H1|AWgHLe|er-IOWEYD zh%;*)NF?k!@B4eX0LT3!!!UAUKHA(H)xA*DJDSe(M3r=lnBM!%)4ghJVat<~>;=li zCm1i$@F1Hbl*(p-<}N7y!WV7D$z@Q`gsppElVkbf&#VJBBnhk1Fy(bcd9>t6t`(_> zXyEIkM0gR@{OP#B7&d_X%i--xfY4Wwi2L9WiqJjWnAoFi!FTAnk`z)dKNui@fF_J$ zX%z>snQizlt>pvw|G~!R?0X{EA{X``c54-1bx~pg8{qd^r((?PnLiSo_+HPg!y3za}U2~M6T7d>pWyb4)6)I`doOKum z!18;G52P9dI>#AYY>UZ!mMpJxsFvJ+>sia>Vd>Sn4Z`>kFO&_97r|F}H4lQ{X_Y_Y z=vjH4%-6QmKB#DJ{BFB^;mfW>+ky-XW^(CVFT&7rI%6Ko`u5dHMB7+C;_2jgMvJuPfRYR|D`~j@7?>?^AEfn&jdsw4ZvN zuPb{XSg0YcjccnS?uMlZjjt##zx9Wq5|eoW6F2$Q_ebs2kuDlk+haN^5xql0uI1n| zm3=lomQqISU$?k~zC*j_7;baT&)fNi2Cw<4xQK=>O*T4h zm@{MEWPK!JpjL2vw%Pi*zsV0rRzrkXN|hhe-Dnee=~=_hiE=i~21d8;Vp=b_*@wP9 zoaRqU`@g@Yq{SM=Hc3UOVo6|$25Sshe1XdAVlvE@w4g4bQ8$8}0AO@d2r?ZKX4Hx8 zc?Ar|@f65lJuhsENGFy!q=d0qt2<-yAj-T5lb8g??m*wy2IANsUUgm_nu3muf~ktw zhO7X`J_G7bm~xG#pxk6QG`S>h*N}UX4gugPHwI(AnjhZ7Dv9nFw)Q&zBZr?27; z;>8LijK9JL^U}J%8(KRw*?N(=zcy_9(2Q*LhuO*bVV0#|Hko@3&%#Z`VG2T|pmrRo;C9 zd}tlL;v^Ssq%4?aKi33Untc2FZo544=tKYCk4s+dF_Ke;O?SnsWSnNEE35-<6cePM zIEh>t1|r@xkcSS4iL+R#YR$;8s_YLOIb}&JHJackmK^!4f090%-$v4G1hOnZyFg!6$OR`;RWGV;UdRDWDWVr8zWCc zfdnGTjz^#SrCnw+dJfcPHB&YuU8~Ez0?Y{@t4-zYv|k+WtE#FPuv^>L4jMP_er(lo zIdxO0&w z)ZC-(mXB(i3LMe#L`6MOIR8O1PYU=Rqy5iwRM^SU>r9InDA4R!H)%`PT`qVw1bww{ z79`=kr>nwYkF^&MIkt?f1sZ;GdF$5ylj0uxdKCw|RXYp=H9*wW-1)Cx9PRaX?Q|^z z8^ZHa5j$@R@)Vn%2ZTkmV)MP`BfegZVsQ4(h#eVB3acLIKeabrULTCuI+f{!f14V} zZ0URw`G%jQ>_V*I{R4m+rW?UXEEP-3sf`)03)Hr?#g!jf!Iwf<^Dg>)As8U=fN{k3 zc_vM0jfx{Z9c^8js-{Tn<^|z1yyrV_ZbhCW`J6Ng6?sng*lDdT#yZ4-n@m>&^qJtV zi6Liy(}w4yt(gtaR!?=yh}B$74?_t?RPO)i+ZCC=x>KqC2^SF-q#$BO0;B&B%>hCa zf_om|9UCW0*w{RO)9?$yD5m7!#(t%U@y-Dl9`O8!U^TWtUC62BmA)LUn7{j19 zUVsWvz~xVKa)rPG9PIDgwxd0Z=eC;Xx7K1jw_Wp9dX!!`o~co8Zhl;U`Os|55ou7~ z^yul?$>gT-?~{I<>vw>p{*$zyf2}lWr#6+2f*za2LW7=0lVO7z%gY&T_n2pPvEqpJ3j)xvdvPf)r1!~D&tH1EbZ(oqy(RtUGX)lF~lqBDVD#fbjytnSbg@d-Nao& z?S_m%c47URRRC4J0zOTe-P|D=cV*Hco^xH2ik*nPo`|Agl#~LJtftRgr;Y4_9Zf{; z!yuYruKd?!z8kw!xs$>I6{Ug!icWav$RY`wwdJFgSp>aY5#y1#@T_*_9?9Omp|M)j zvPvtwM7VFm^7`$^O>bVa9)g3bf@;D$-6d-T8rd3cdZGg= z;&1vD1(oCXgmaqbsv?xj^eIDq|7Diio#W%m9nKtr-Dj5Kggj?J+)K=l9=IN<5iAl^`nacB;J z<`0EqAz;Nb`+Z2Ten3rmITR%iFJ32>pLo##=nY6J;v)g%6IgAXe^T~&v}QpB^`Nwy z0J$r;|4e9c8~(#Zlkj2!I_iFU6C^4xf%Ab@gX|AL4Br9%A}Xb1=$=4QTLHCkHGU+& zY}a|#>gnO(v2z~he%NOY+@EYU`5~hc-NhBz5&`L^9Kd;h+(f#q7<=IcCzA+eqJP*B zIK15beX_m7W3g0dS%i`w*v#Bcqt&kU%KI686B0FVP-w`Y#y!txr@XlYM%=`9^9H3KX*z`~JAp8HWS6kO~D;H&U@?9JbyZ-Hs zj&TulwGBt8W`%UFjC|Be&T7tPupQ+-U}V##+bD{hr!&-1__FW_g29W5R|nl?i{2IO zMKhSdp^v?+4s#-C@pNew&qED+?Q=K#ZAw&BTyT2Y5(yq|D7NpHfMnS{XkcB7@!-*s z!hCs#W5Vn46s^Y?bj{O?Nuxp?gw8^P%6-WD&*p$ z==(^SyjYiH<0|Xik zXT+6(E@;qcI_Gp4+)0i;hcYYgG4}bLHmFPKLsd?(03n1BOTe`Pz<1GGA`H)ZvMY1# zEb8Qp)|5^_ZQ|kqOYh#x5 zsemF3&cw#VCZ&<9Xbw%`)K_+d;VK!8k|*B<*J?^Wvo~n4*I!cSof7|)Q4M>Gi}8?v z-Y$t=u|CjBZr)HG-P~X0cXJr{JWZc7P)Xwha~I9wy;^cLWRKn?^DvfOEiSefar~~g$%DnMed|&RL)LuTb(Gs2=eATnP2n-Qu zc5B5;B4rK(w&bR1BH_X&1W+vpYK{`%6l zF@ox;=gXpjZvVIg}5)VS15o;1lo`3qjpE z9`uR#m74**GJX|EQRz?1O6Gn(K3*XGk^yI7gl-K8#5ZW&=)>eN$r=%Sz_4?BwGqet zaLWt*maa#k-V4S?6887_p$LkVFFC86C;U}VMi))qf|bVipIdhBr~EO!>10TF)CJM* zC7YUoj|g>=s2mSlnE^*NNx`6_3yH&I?%--6x74+J2(eBVETZ*Dy@z6Glz4c6^YB$d zSIC}0>&3nMP(lyNrL3l#zBIa2!!SdM9dw^o+S^UIOJv3e2?Hy_p(*2SmA<-MREcER;yg zb>9-AzALvJDRzDrQDIVzL>aFjiSuXQonK+bBa)TG;v}$O=dxOaQSt7*+jUM!O>JZwTAavyA<@*P5^Pii#tw z1XV^A7u#WRbc?<>&J}t2BO~M4-9vdE6-ZlB~9&O=M2b4Sm^l`oW_p|I2-7DlfmS#&j2j0r>lB$c)b!_ zT;0|09J&GHSffuI%9=TQS30?Bk|Y3dERetdzgu8_Y5z;ODSYOG=>8%h;4>U85@^D| zm@bZ!CmBqtuT`Tgdsf{kPVE6cBc(~m5Gdm;!_vpr=PI+R>&q=*tA>sr#E5pEFqz%N zgnZ$>zjQCY`d$HnF_{Fk)<>q=$0FU!t%ZCY4f>Ks5C(Ll^r~S+OHnYN+8ZbZJ5xpKVAh!7+#1ecD zRBo#$1ZEaw>FXL5(Dyk$A6}+24#vzTJQYB)Zr5oK(GvpI{R7!awoOd^S2Bp|P=8e@ zKqH}@t$1JNXvLH8UL6>9*A2}EEqV4Zx`f=SQ(kaJ>eAxrLmR0`iI)bY6ApjUl2;32 zd6ZQUb=K6K8(7AdhMaOsod*FU)xB{X4A~?63qbZ#Y~%>-g2_&JWltEmQ!DBhZrtv& zLyRwT8h_OWV*(`(U5hNhEo*PB^-+B1qv)6N>vq@#z>^6f^sRUAuf@#^t)}0EBW+JE zW0E=!lFaI0ue7dfp*DIrVByd$ToBg_19zE27a3Rs#oK~9(GS}p*H%}X*)7b(00O`f zU)bm5DW01y$&l+3LxAWT6V57`pcEd4RFLjAr>CN=;S|{)WbRWEbH=|RO(A`-9?@UC zJDvD@BuOUp>EzFHSo7~kyWv|R=Kp>E9kWXTJUIF@4oiZ@j%w~rt_p*X#rq}|G_eYZZg%jRh@ZOnz(%om zko4O5V8*>&XBJe;1O8GMe1kC%`57WW(bI(YWdw>-D;TCtU}Nzx1A8JaK$wT_E{DK~ ztN9?K)C;8wQ2`HqF38fUVE$qEV46fB)gc8A0}zpF0(6B&%JW3;x>TM{ zJp`7}iWJ@o|GU(QJqzng;+^)uoA28h7AV**P$ly2Z7tVhU_A<05J2R}ZiO+2To~1Q zPk4j90-2bDalHu2a#X5zyLjW{*at2Gq-s0aFYe&OvOOqfj}fCTmc7l3M92*NOS3hj zH^K<2xOm<7$}+660vt`sEox?9eGE5I&aq2Q3FE5-c3mszh!=GVpU%FcLA{xh2_<684K)iYbnmb!7sPl9%Ub@ zb1RxJB|}PDX0hlS3~%&-NS7=`ThPxW|un;)RJ2_)<=H#utGk_2#q3^kq?JG0bk`x`Kz&?4eRC6i{AUV z6@1X!pwtMg!x;AAh?+aYb>w`hHEd}!wv@tuxy6ey3TH40qFX2sA6%-aC&0tY*0)pP zF#Qm|2l?q9!kdR$1dePQ1>#M^lwib%^4}>7K!wHDds*EiA1MjIRibQ3x(rXqJ5MW+ z>#|!>rRZB>+xu5WkUGyKYg*juIZ0x4gSp zMlA<{N+Mv91l zP!HuR#Q5|vQ$0uBGtA9orkf9o*u8hHQxQZefUg?~!!TK`H}}IxS{c{&4P6sS%Lp^8 zw|_?hyaK^I1K=G&&Yw|=4L-EpJ6?^%gSN-kQzmeL2cr8w^fvlLhR0IA!3!ZhQyEgH ztGMe>u~)g|U@5({Wm!N=#YbER(%6-vKIA<~^FxgoMKK-{d=UJ7SiV5q+b>A>twvf4 zf!ey4BZb^I)dcOJraRf6)I3Z@J{`oW29fusbX^%~^R~sdaw7Brn1F@((%>ltTvvO$ zqvQUSBi_^Z0QH#+Q$3!@lV zDp|auU$DYXF?&y)_&Ictgf*>z{bA1E4ey*F1lomL?+t zFikGH(&-z0;3z_rlq}WrYG?JB@7IYPYp?r~cNa9slVSZN54GV%C@9*Gp_S{xRopEJg(^i9xgX+<=C)#Rk|$T6ZAj6VkZA9U;jla z9O4=THsp(u*PaCXllt}yO;IsK?CEoL(Bmqm3DPi$p~d05@=$e7HazF^94j>zuL~CK z{6N}`sSt9vAb1DpCgj%XSKeR9Mg=jyvPSZ*fD!Z8t(ZiQ!ah3lA*|iw6C)jHAN+m~ zy!QsPD4Bz?)02k(DaG2H)6Rr5R5EXi=R6RH9zGY3+1RU!u11X@KU%uTbkLSPNtq6t z*aqy%Y;@!%-}+#iS!Ja`I+h1jkDw`YHp@8S{nCnw366SefP$|G2xev{0?1UDY<4q1fJp4exw7 zb~q<L0*#ts%?o)1T?Yt*aSp;EmVmiP-+nF}It0p}Rlf9O{%`4z*>`#ii)R1`N|^y?CLUz+>zWW!P!H z>LfGjLiSi+tO|H+ukU1hd75fZQNoa_z^FH?{hd=T`D#(Lpg~EQky~j$qHu1Y&mH|C@Fdq4Qts}@Y8X>t47?zG zZB!H*ai-{mpG!^Md9L*(k)7R@{X&;Hp_P3yU6&VAD;N_*_l4S?sdRj;wUGLKG-s~s zUUiFw=nii4ky-oYHX_tCyvDw}vG6)oL4PgpG;4eJu6BFU5eopY1^D_|>I{yukCEFg z8L4Sd(`&^&)CLvTzVeZnTMEjm|H?<`vS_6C*i6Ca-4lkWyrHpoaaRo@K$Q5@6zYUt zHkh*ac07(iOw+dNXj>3ZSEawen$amL^QLPf;c$E_Gy8pK-TS+K(ZgqEb)seg3!i+Q zdOV3^m`Zv(9|qjNz}fx9YMJW3?hZCde*WWUH8l)o&5_h7D}fL~cm2rZsHAWp6zat@ zh6-X`Hh&m0so*ul-{GO{)z*`El3LBpiASM#4)2#P-T;Jzb7&SIxO6q>-8}X?D;&zL zg_*`mqAHh{SUGqI(@X9DkIan!--`6Ig4G-%4?kd$``(HbaxWhVNLu*OdwaZG{_ zQD?b)j!{WacJYeG)~4H=RES^r^u;Cka0|-M-j4HG_+A-y{RT=LHr9zw0kas8(KH%F zAZirAg|;rS>cKY&*JGtXW{SX(7VE8Bp34cidg+>a30q6GGhn5QoY+jhPi4X!G+d-qL;H; zapt%`PDO&LFiWfULBJx+0sVK);~0*jFX!Eg6wBt-?JJ&xWnXp0oYAp7O?^^Z-%3Hy zH821?9ROcRNNx|hcZ<$jN}hkE9GbOyOr(Zoz@BIZ`)oqF9YgF~!*_KuH1mLPM@X~Z zQ+}|x_eEUqi}UQfIrlgB$|>TGr&a(Ts&Xru?zY%E-z<`A4!U+!%;$;BQ z{TsWcgRVo$VzIydg_0rXgK>)l8$!Hhp}TmGfPYMg>M6RH)zw`b`~UnR_xE`kDiO(H zL8K(*KH%PLb^Ba4AME$0O7+)?@>|}mOYy9B$5O&gdpg>u_!_c`era*hH&m=SR}u1}jd}kv zlz}1HVQPGeL7P_9`3>VHXMey;8aVLyRUnUX6E0`Z#5~jVwFMPH8iJfiIB5OXS;$p! zuJ#@UfQ80`$rgfhdHf&Q++aY-s-MF>Axm{=wvQt4HHo)*51I5_tC!l+0f)z;Hn|t#Qi;=QW zLmAZ`W^6fFlb%moQ^sAa1F8DFmwL6VNwjfu%>W zkDIIP0j~X0l2Qt~azP7iK73)YzIfwKoVPt0b$r9Lxr8uLk!Y;b&1fmm*dOb~E7qLh z$Ku5x-F=7XT5lwSsdNHHO!drzSSPDlF$92iRR+9x4!sQ4$E3TOxOUjltYg|>`qt`Z299TYY@}j4%A9HlNN4}1|3O)Z5w-k89s1RS0u{w4^lH+{1wwwApJ9ZQVEyleDK4Ma&0L>r*K5(K0=FXaUs6}{)YzQ zj|2i?FDPqR6Yg*#>6=Y@39eXK6L`4+?)ARB|BhRA&prziB0nzCBicJ&c6ibQ=OCJzB~=4pl7USe7;DVsOWDgkiKD zJNbX;%xm_L2H_P%UpXZar=MAAMEzRWJ5_U|GK0E3d*J~wAWFy#so4{oqAoO2H}mKt z9eMXsl&?({hjW?!{v;`ArC+HvX(NuJ``rE-Qk9=H(SnjTbHyhkNyoKR>7>BNRU&lJ zr`08CpuMUC34s%qBtE#eJ<{pg5e6*?KRnlF>tdnMF@%*)?-`m<+iw3xCYl&4T2WXyLXh=>`EvFldfFuH@^=7| z65zR*@RBQ6V0AOeYQBDwt7@QQ*8&${4D*tyaEj6-aA0Me0vH2oNv(#0(*-XPy~>nF zskSXCRA>^mTGn0e!*ArAWkz%l!^T*X_V(BSDk$si#-$@~iB5 zrgz^m(fx0_>Pf9N$N7smbB2g1=)^oVcC@Gl?)j7@w6aN0(V5!;WibW#x+~3%mk7m~ zzCW`am%krGF?rK$z^4399_9tRA_Ifs@``geHlih)R*qZ}_zm>FzmPJfNU&t?zzYi_ zSNAQBGGr9-xdA}lEo)>(F_OiKyb6!fR zC4?LRq6ls;%0a>o^KISmwid$jI4BAQ&gwd@{heRO!i!!EttP;D0#!iD;9)N=_`qdC z9sq=ne(MTaRTkqv2=w)dW4QNwe+2Q8+pk=# zoSx@g=)VAU2-V{OGYpjW_NI93SAGef`pJKX^4R^DaXoZf<>b;%? z@EQPrloDS&x&Z#O0AD{C%yfJVS2DFu`s3&@RmbKU%XJ$~Ed^PArg=u({Ma5y{%;QIjl zY+Cuk^D_Wm+v#+=P_<}T;pzxiPkX<@NZiNZIN_YbWHPQMlj?V7XJ@~CV`JlZTIsV- z6s+TW(A8$3pE2PY_U=>JJI+}E57~RqhPC#bwr@X?5UZ!y668q$_L_r3X(vOhyE6bD z1aPmt=WIQ}>yCu$uVddEM*&=EPDis-*WbwAi666f64&LWdmVk-+E#il) zi5rMw=4gzEf8a;)=r8;NWNj6D=9Ymnc*9S$Mo|{1$2F?8bqxI)Hs>$LRp0gxaOfX= z13H%-hPcr2Z|mh=LW_g=u~;q34J9zOAJ|0Cq%_h3-Yp)7mwTA`{HwTJCf0c=gMv3UY(5G;Se z^KtD@{S@Y}yEff8y$hcI;zBHc$!@Bl{yk7x%K-<}&Y>(j5KM5#{u{7oa|~COsGWuw z{xLK`^umiGuB2T`27pMc_pB-bJ9kt7h@udn9#uM8edONm(q&)!^s|qAC`-EAnFa9O z0KR=@Ftgw_7yw}2T&a#tIBCY?C29r$@8O(iUHhG60N4xQf0t$Xv`)9d85BNtf$?}U2Jq`DI9E&#Y3zzqPNXCG__?E@}~{?nIXBwi-b z7_e>zf#Vjt_pJc#%3jWg@v_>bl-4R@pNaingbyFW)CbNvJ8wP? z;Jqf0KL}veKA3kx$gw_vAMSLz-`(qV%>WQX{KWf#c{wLT8X5zDm;qpX!3+S-&imff zqa`2yCZtD}{SNIsza+V5&*g_#Pn~+p@}7Oy763$pAt!jOM*~0;@&`80MiYYV9-dL` zZccJVcqV(B_D)baMFBy%G1QIC$KT)WEq?Xqj#eLNa{t>U?DJ#4zB0S`{JGf~8C6vX z0Vq+Z4?7S=|GXaJC9KGv0dbe}vnn5tIoi9Vx96p34GcGRGG4p4#*t_Ibq0WUVPU0% zst3%V!j_*v{0Q=Cg^w~5muDbaLlig%4@@2fHZOMQLIvdgSYD`S%E54RL%I;}0V^j^ z1KO0kp@wJ$XoXcpxB*KK7(M6G2^(`cfd2=;SK9MKqVo+9-c_RkApIg3olN)#5JmHe zpG+oy4B*ul={__M;Lppld}dJ;uCD9M_}4mY&15<&W2**%b52L2(P;ob3gGAMzWUiB zij7MEt^@D_GtysX&+#RDzLn{MZ*F0=8RggQ8T~MT_t<++d`53xBtbGdAAF_{$Nc>x z?i;eBv-LN84wqJkR|0qufTvnr9@$==s46wz5H_W6;QdAjV=$2n5lxjUWyLej}v7~cTk`S$L71%LzDd)joX*m(U# zC!~{h&Akc09d1JOoWZM#XFj&`K+!OxUXq(y5ImT^m@JXs;asYz?T5HN*xH>$horco&Z8o_>7$5 z6yFF$gcu_W-!YmdaMRR5ojQlqxcLBpx0GdhV_ny`=y%7t;~B>Qz|Ry#nI-^Q$G`L! z*2sVB^Y`HdzyQEC0KQcnJ^7}YK@amu=k!d&R`!|nx-~8DKLU951C_TwzUzX$%Lfm> zdHb&2mla?j=$<^9r=E4fTwYt}f6}u6b%*QwOmAY=2>`JCRwvTibT~Ru?-&sgBkE!K zz-O8s^?;wWM zuA?Fdky@HattDZl-ph0|yN(&)0F2i-*2g|g*n9Q0xbwKqr0ap+KHw!gP&~GRA4a%l z4U?LIhQZOCep)Q@nxM#Q!!Xb|<@Fl4y#)Rw0PlaseYj%lP1rqO;J^zD;K>gCUJY=B zF0}9M zb^JdJz?}2m_j)CPk@U#?hpO8!0K^#3G$A%kGgaO2MgVUpisCIz(|lSdQa0e0(}Fnw zFVa8_uMXpoJx>Pl?t9Y@@=1;N0r-ux7?AM<0N<#=C8TX;<+d{NOdA^`N4<6*fM3-p z`m+fFuvC`i`E^}CP6Lk~p_8Gz$Wh-p=Zc~f?}LnaGB6keEB}ao+@P*&tMf6f*9`z( zuYK@l)tk>&+ic-MjLtx}g)MC1)bStl=YDNiIs7NPx1Td$cA|Lc@^J=|bJ!fc^4=u3 zonWvd+0<=3hFcuskvDtUMTAkPX>9QwNKl`Z1lx%DH6IrV1-mvtJEMO*9j z9OW5BDJ$o4<$E)jtvg`Ewfiw*kckFz5|tFI3C17(7;gEopTW^L{X6<7RBMVT%K{u2 zJ@SZ%@Ua27M!ziJ9(gJD{Mzqe;h9fQ!amhsBd(cc?*QnE4fe9KAS@rjN6)(gO8{a~ zAdor#^)MdEiOIq<`agk_vY$mcDx0yBjR8wIj1S(~c=+$VDz5#3vg3mV^Qt(1|DZou zV2HtI4vxgJGfOL4Rx$?)!#U!rst>8b@~`dH_X!pN`~ZL-D~oanHN4H3WtQ|$9V0xw zc305=;OTVwSyj~Em7Z|+K>+58qPVJQnr8xdl1BRPDT-p$AM_lH{~ln?Y^_dO%ox4v z#}NH&5s8|o7?GJs=IZLY2_eR1HHtr>M&(;I)y)IaS*kSM=Doix-gzebY3bPy^^}LskG3 zJWuxSdQ_v^&enV0}5z4uQKA^Z@4r}TQgQH&A6R`%p_ zLHn?Z2tX&$b&n5rjzo-yfDl5Zt22HUz}p_EhUWFVFFbdA;NV*pckaB*1E47G@a_r# zJF?F??`Gq^{Hi6OaRRdt)}sIIK2ayv;TRMc{fc?t${n{a&Fy-jTRr%i)0tk60s83T zxz`+CzU$Y{ncH*SU^wzIHW1ddiI0{g1XjB|m_T(BIh{5%X5utyV6gENHooTPbOk_D z9s88S-fQk@0^of>c?kIPbAYc5*jYB@P!od@nK;4`gGpC!Lfq%hi3^1w4&wrZ0>o9d ze`OW;(;E1hXGj#~eS&wEb5~C5)xTNn?YM;C9K-2MTx8Ci-y&yN5{MJvnc)zbC?GJ! zV{3;GPk~=q0ABV0nE*gpmRHwx{f7V^t4U`s0f+CGog)gwOx-uJm`i@BT22vdkcnku`w7)K!xQX0JX)Y*Xj> zv(<@uF@W9VT(9sh%~^_`r!pWL-=w?BMfN_wF2=~RqPwxl0CQ;nvqmT1tWM@Li5`IO z1@M#oL4Pqc0U-uXI-bBPl?_soYF5}TOaS~5fS=Mpj#=#1V27^+a4mqny?)Uvyr&o$ zF$xVW0HBqmsv~EUSxyfC3?ej54Abf4Fo4ehctcs1udeI*`ZJ^x>;mw2Wm!J4ED9Hy zIfTFx#E>ZgU9fYGy^|@`rfFgb;oShf>@2PV_#YBX7o3%?oq^Y&M_aG2L z456y3y8wKh>Mmykq^m8g|6Qy7@0|W%&@T&5njVr;x=5`PLv%)l>S;Fdsdcn*5db^y zF&R%A=6G1sbG^fR|4$)=_a29rx3GoNhV{e67Phd3lg9h7cQmEtKOH#ws-=bPE{YzZ z#-kZytv(~hmwso8ntmVEnc~*QD9>5KWgmSHsOYuoiF1JSklkHdWp6ee(AvA-i{`^0 zNB{DNA=Uw5c?Dce!F5PRZLFsV#Q+Om^kn$G=SUQM2q-}C5@ar$`f9X0siF@ntyXDP zU$&Zd&YMmpZnH-#7_FMrd>M1W4BaHw(TOMVUUjzbt+elh&g zcKBfdPzm4f0X?~n$bq;FO#n|IB4-== zn)A{+Sf+5w55=lUMhyUj5V&cYw*YvaI&1F>^Z;B5;5#%zZ!du1a5!}8kR~(IXZwCz zXXyvs&$AD-|zQbkWCLM87?z4n;n01ejzo4$stV)697kF!>tKQWj9}nPH06cMiVZQI3C+3LI zM1g7v|58oMGlx>L#h#Ucu`>WW6 z14#tAmcl!N7iS>H7;wkoTR$*Y&VAeC>(!6WKId%VT^PN%bmh+s_ngzCNV>w;CSs%= z2(qd~!dV#}3@2+z;lQX+@LdOP{pftL_#Ia_%kQ^2ng;-O0(cpK|5BEvv&mu8;bC>p zCIO(ITgu4fWL?*>X_`08&(DA3%F4>=cAg&>!{PA!@p$}(ey{&5^k!ql~{>9oG*niegX{g@e$Vz!Hs~Z~i^26XlqdXCS~k zpC*Y5O(VOqvSK>V^{Vsy)ft|sAL!)CkM7v9VZh5D$$ZF>t3hz;rC5VWR z9Xr-cr_(_v^etb&d50Jy zA3AjCu!sNJfbhoIo1X!cDDi02_-=LnpW7ew`-Lx@@`zaLsZZto%hE}zWX}30GvK|{ zPi!^Sn+Z(hzziOb*Csj<_XYqj1@P&u{mHg)rf__Tv4t&cVbl2d_B~e|K78Z;RUHOc`c<--?yi(aWlAmQ6s@i@5Tp>p}e?V$*1TAKlc~QUE38j#640 zA~od9fJ=s)y=Tc&uW51^Ktli|1%wDFmU2OtliPhs2avAbDTbunKR<8Z%?>(@7#JZ2 zaaibT2FwUgApN}kuNSjU@$=o-_L9KW14$ zffxV~q9fV2;ov^}$HiA+M{gh#09s<>19@*ZwTf$75X6OH#nKc9-8yS(Ajj~I&@8XS zX6@KN5hl+)ozaO85X=MkQ2^i9>-FZ1!pxkMPynWk34iNn%tXq2?|5x(d{8FYLc69apmGq1h}YJ}mFBVi<@-S4^cs==jR2kx;1VJ#%Cb!D zlp8jJ*0~_pwBOl#>B{SgV)T&KZ4XPAp;v)O(gf9Y71gkOn;LiTQsZv@&F?=bH8<(^ zYUJBPd%b>H6rQ3*y+aKZR%f8n%8Z)X>a~Wij{nIRw$FN9Y6l&cOyubO>$+ipYmGMi z3q5W>ODimf0Di{%;)e%=z6+ss{^Sz?NOX`gd+*el?g2zhCR5fW+fP5u69BFUJff1# zF|X_O`=xV^98uca!!{-cq%X@$B7Wj+=Nue)fQYA)N!>Kf$93b)e?JS6oo5u+@4oQd zl>-OgvTeuC%VYw8rO#&*0I)WkafF+^7XD`d1jht$1j$S0%C!jqd!K#KRRDwt9|QXA zdH<2m?c28N{GX(Qi+^$jK7LwgeEs%|pK|c<&9B%s|IkZ(QINXOrKTxrwF_~m=&+x$ zhD9SrFrul1T1TmIURn7=uug0=X2fd3aeU;XCGhww?uD1$hrtDhFnPr}ZqL&(8ajAK zvT3pEu=c8x6OJqo1c8WAFyJ`C`GOB0xOJsJTzcUZYXpE=5e zRBYuT%&Dh!F{d5C;(QnH`=@*8ePxB}Q?m~`2^6}g(Ki72uK+F`3zB8)oy2EuZDr9=X~+P!otYfBLth= z;C8xJ?H=bGd?5~Ea>Q$^YfW9(ws+Otdfz$S*XTt69yd2X-($`KNYsHFqog+zQ6Ti` z4)N3mjAV9KqO&r#@;ZkQcsiZ#1MtV{z}?q2(5YcG8lAhgw)Sts;qZ!H*^_ltQTmMz=`NF?MlX$<}E+k zK?EE&wK$UC605k#I1jMG%LuS=u zT_aXggvkV9JV97lLs(uxICc!p@-muZ*|D~YW_1l=Iz^aPh)n|*B8p&!7lFyign~JG z@=DvJ1yfh?Op0nQ1T*(qlA_rSXB5;9>@qW2RmipixD~wVE;B{yeDoeD3XtY?_5e5r z#Lysy1|c-4n;IcBXzB`0RiUY-Xr>c1lS!g&GhRcerb6?<qYji@HXv8^pQ+*EM1# z-*eNzF=PKre+OZ@3J}n+t`0~<6Iz%%QuqUKsu0Vd%^+q;n5+CG%Tu#NidtDBhn2M> zRWTg>>4VVu-$8B!8E>|Zzl>=W!ltdE)beddw>#VDtK;#@opX!iNDb50(CgGw4Mh&Q z(P({;5TyRM19;7S;QZgA%aLEIhQejOD2lSzQ)5kxg{EoL&}o(J_I-OGwV95&T1P`_ zKZf=!IRcaJ319}5jHLjh*Xudw{SE+Mt}8BnTqDc!ob2}}>{O@!ZvgnN!uyAf=0-j5 zi7d)7Mh2S)(8flkl^H2we6_JIJ$EbjLxQd6Sy zvot+sl&<(6ED~y<*mTDqqXMBIh*gk3_0N_SPw&X(1eF*Kp@K z#}3~94RPn{#oZF096qvi!SD-?bB&^=5|SEc*e1?u&_PG_@#ySrO2#y2v5%4SsO>bY~`TJM*ZQtDpa@4 zUVai-g!j(|@aq6xG#CsYH8(fccj6IL=YQAM0a{%LNCQ9`|4kn$Y{_sjZSJr z0HA)q=SHKsCFhH;Qu+Mfbl-t>q&W>B0Myhq>g)(jgU|#tO(RDwx?l(aO)WC9sT+#S zPFIgw*|zB<)lZgXaqVz4?8O*V_W_s*G0GuwAm`ycGF#=m-ZjyUWzUtUdX(wZ%uLQX zHy8}g1@J!s{90M!Fi{ zBkkHWs;eZr>FOIhLQL(RmzkN*q`tkRtBzj=;6+4qMcFI+Ap~lgS^~wi-^FNpVoQ6I zyat;zlCff4z*XWalM~SKF@^>l0}cAUV$dI44&a9-lgTgky??6OeOuVVX@htTwy=dQ zoH9ncF4*O!)ibtX(03#e^rrOYW>PZOSe>}pB!C?r5gri*F@Of!N854JZ@v_F{hybL zB03s^=042v$7l#Y9Kw%A@WT;`(MaAe%)u`%z%MMITv}|8ZA&N@7f@_llxyZk z@S`D$;SjFZ6G7#jIF{9+OsaG`RhU}sD098%A#)ok)2gTDN|xMf2I9d}EmtNPSbv;s z)o2DrYiuN1+k4V>h?4rp(gl!npu&R+5A;g7ULS5SfEy0s=Z1-X#rzzKg?SW<3vw(i z!Y?hNSXw}_xQJqI4t_X<8)fa$@57Y^T;cU7;EECi#x1|_^Z3ZG{6B0TZAZoGw8#_* zQzpd0pRG(#KG~3O2s&{Dc=1JmbV4cC4SUpgVmNxIk#-9$g!S4EnsK%Aa?6_=aOv4b zUlrBw1Mn#Cz0LCgsmsjtC$j39VJQ1xG~zhq>10}K-q)M6Tb*f8zu&(|4W(ZN@FhiA z>?n%Daf}o~qYh*-3X=0+#sF^L+h=)ewWk@Hbc|vhMC|vBELD&_M~!0w$a`NDMRBPv z&Hrft*WJ&QavI1=iXYG%@6YV@dh>AP>Pif+5Q5~9H+tC&qTOKDkWnKh4aGpGuXNi) zqPilte8y-U7cq;p4H zQC!a?*_cS`XfB!n?>$eO$++T%0S8O4Bf3NSiQY;BHPqQF2cyuv zAvTur&)pRi- zM|TVrXCV+&VU6P{1Gpi8-t_?8i|KO!-q-HVE>36pmJFe)D<|q;+qagPqnyDb~ zJg8sFR(K_WBcq-$ z!n6ieQ^d&xE-=6WL!7xrUw{*&b0Cr3E& zhcCyWm;VK5VF^EZeXn9Mu|sIK9f z8Z-@{ra`qj20H?Kha;c*6jna@S)8+N4=NU&)oYq4iRIIBcj{$zfbfUWP_H$UEB#LS zDiFXF(X6h<$=bnx+J5P!Uwhe&H=fRP6%Q1oJpjt0oF^w%4r|1BMAUQxxv{78)P88Z zVlb)3LSrpw^%ybX90XO zfOn*e&Mc@b%SY99{XziGDa&#PIYJD9fXtz(hAU?Ja(C=dEnE9Wy57#GaY-)e+!O8C zz|{VRS;pXGfMo5jhBH@HH39HmoxJ#$`(Wk7EIfd#0sI1hC-r*0dFLDfOd-Uy$sxfU z`Z)~~sg#V$E7>)aXe>~&2))262y)(Q$LIEa%ZJjxpiULXk(oo&9MhBoF9GnuGqmJ+ zq>~LlI2w&ynviH3TM4rvy!Rp#$ODi)0GRn50G@f8BI>UK@bdt^Xf&D|MvjEEDY4Qm z8TQJb8J&@6>fkj+!gM-qVvKLq`o8-#mGgdqPwhDWyd#J9zhz;5*CkwfNoSMn?#%L5 z2b%CHfL0@eXP{X*#)AtlxRXnM&8?rf{&{x(fhg^R2?mPc>`?iNXqTeeiL`Ecy2G-RlGWpr=^~Ls?Wv_@b zGOD9@)&b$yR)L>*#(gh0P8LrF@ERi8?VRie*6K_GseAiAw+UdY%*gY!n%?Za|G^N# zKb@g5-!N3&=_mXB{!TzPe-*ScN?u!e#mwq}_VAjbbTXMRGk;k3)yebDZx-8i72LNB z2E%iTLLL99EH?IMWwUeEXY~7YEs(xTqh8vBq19!q%?#;l1b8)zt}re+2Lon$P{Dp(%h~*YEeQEQ%s+ zTx^pdtkLPLj&ve1bjl%wPwJ-9XDbEJcLVr8bEDBxh*8U}2lBR%SF#j9 zzL1G2M_655TlU_6TL|Gbvo}9QT%dgORRDH-FAfpP0xO_AXVLot8P`c^ER*NTAK5sU zb+3*4U4DT*FVpR!tW@P7%IV#@s`uq*V8ih(JP46--xjv8g_FgnacMtpTl}vq9R5h$i`Ac1TITB zB7EkBFUFzY{$0%VwxMZ`!8u3-0!8$xhv+>5Np6dv5ntA#76Bm9U4)JL%&=MZ8C6S69b}0DPM&_Gglw zq-karb#vTr2k`8&EO$BYoh=IoSi9OxQCK)tE@}G_)QQN_S;qigp-S-CNJmfCC{XEl;@CxtnE-gY~^Us?ey6Y_qbGt5yWr3i)+{#29^Jcg?NpO-V{`%-K=E8k=uzTnC9Q@pkKhVeU zYeow@dT^k~HtuJRa65=pCzH=kWeAAjiUO-EM`JZ!el5+9uv#BD8g8hKm7{)s?UkkG*d9C0G1HT)X=PlRFRnm(h-M zU9CEe^;M~x(6Ozzu0&*U#79r4L(Su(hfa6`002I|>w>HAI(X|}p1_LF@4)u7#)ynjfZei&uS1jLtDF4}+0t5bro#%i3k-Kky>A8C@-Wg*+ zfI9zeMTSPP8jk^@le0P$Jx91{!^__8Oh9Qyd|a~?n#sx$b>y|VO4YN&o; zdPf?+vayVa;5CTG`-0cj)+V|k{7;>tGyUFh0f7Gp;5ofsuV9WgXr%s<>ro>9MF${~ zl~;}&h`#gh}wS(5bYG0pG1$5ZcHvq`Nk>hDK4NcR$QPUuvj!F6EHP4J%Cy?=cL*#_XkkdcsZ|^1D3qW9I zuIqXN;7^ohwnxFHF&d5buC1;8Yro&W()&U}FJ>kHm~}($EWdtPwi5u8>4am5pVA3{ zv!U-JO#sZzEk&CE=#*KwnprkwCW1_$6fyxo1gx!%mjQeyfWMx-`ANb7xD3Fr0eHGE ziXnk@5vcJ2r^XkZSzdF9J(cwn<2D=X>>kQja@sdOSDOCQLS!Bi! zBLdu@S2&D@^XL!e5&RI?{Sfeub1>L;4$5ukz-`+NEbRnu+YM~r3GCPdKIb98?!9p5 z>_xeI58OF>z&m!L>JQN?N7y!;$Kq%a^K(m>pI^jaX(!@fld)+(7!e!IWgG%P4n?omI{yKweGC$rSvTUGi7}=+GGaQM!?-_(0EZQJSfvtGe-UB+9Pr{fh}-udZa)Xuz6Z4PTwv#3dB1%R z{Epoyw(o*p+Rm6;0G>M>4tHDHA94I? z-|N&ttC{+y8n1SEF9r%D0Qit@!g@BMfrbE{)ilkoYnqdRY#~UUysN34B%5rTG1cQ$70nB+vJ{Ub_Y0~mpDv#Vr8pS?!zs%5< zmBGwZmZb;qB&F%I&p?VLW0b5^n{2XFuTzGbE6Ybur_)~s@buAW)Mt(UG~SlCGy65D z<21FOZj30C0N}c=r#dP}10I!>vBf-2S8n8X)y09@H2a^|26N#`NP?A-xJ;h z6mi?)Q}5;j|7q0UTU1V+|4`o3GFiP_ZqPIeU<5E40-6{Rn#hOZv7OSEChl#K%R)`!E*(7d0oGO>(ebB~E5}D7;)a&&I03KhK<@wqD zPdBJ2ii-eTO5}!|K$H}idqDz?BSz0R7f7+wn=O>5I zLuk=aaT1Z+bU=X6H|Om$|zx3i7@^ z@|0RK&ZU+ChLw2^M*}@h!kJHtmwy=cfZ<{AM3y=^5{UiE6+`Q!f=i^V`@-~pg? zs2p%)x{Akt?sK5IR%bDV&=f^eM&-*)5jBCH3r>-FU}kuyS?W1}L%{g1eHh>QIlvX@ z?cR;yo?UQd59A5}va}J9&FK=IoCB-lP>?7okIP3ld9b7aat`nw1mL}2`+T@JzdgGU z7+i8G_WZ~TFg*V}`1u9EJ6R52c!U^Pp2A`{G>z;lP}ksTjWC^{sw&XJ5X*o6kGS(! ze;0GZCE;phI?Y0I0K(4@aI&I3Le0NjVZw$=M z2Kha$+1!lZD7kSgHL#|RF<%1dW@dXeT5UUkJpgu&hJzjeVra^r)W@{PrPrA{q(0d? z3FT*ztE$=$;FkdW{#lp+80hls7nenOb=fNmHE2@V*(wGz0`xVtQDz*ZGc(A>%TBv> zuFc1$nFd$LwJlBUR`S|T7RUqz@!Hz>E&zWp8jW7IwzhU>_ikqlUN`&w(ZUyxDSKrp z-cLv_)qE+vR=HE#8TuTLcE~6t^jJrAAfuW5*H3vnLU|S~EyWq3lRtXWImcC9*Bs-A zbS1#QoW|VsLtO#zL&M?FiSfR<6#&eV0_YT10JvVS_lT;hUJT&5gF$}?W?gzN7nnh4 z^vh+d^kMldG$eq)p$V0i>z4q$`F@a^>WttM!-qcP==jdJ&JTB85_<(?mk!}yk%x(h zEf=ejFV$8VYsheT-e)hyramRQcze~WMHzf ztc9f|02nS3jx8UEJq-S)m>>SnSdJoaOMgBOk8-?+bV@ z4mTp=@pyblCw+gX`;^m$QuElqXwV;QiyX-&#s#K}xBVJg)&!Olbydg6{4cr+bknPQ zbd%a21n`~Cxjo){XV0B^e5Y>&{w^Od_ViZG;|0@>sVst zV=$PRtEyQ8@K0q~{(N26*U#Q#6KGQa4Tl5W7`j_=#fIf=hd<`XAR-D;?qRZX7E*s5 zy4OM-3k(D5u>EngSMmf7aJq=o%SI)k*>*jspX+=zqD6^c2ebG zYr|9yGZ@X@kcV^R$T7svsc!s=lhi-Au!XG^09)9?=>Q{MR)a6}<)94;Q=`D%*+2P= zby42wnAyd_cJ_OTdU^%x8vdlg1kJQ|}%KLW!? zT#Df(55w@{3o*F(LJTjy1alW(hH}@%@RvLs)4E0#BLYWF9RsifBBB^LCkTm85J4p~ z;H^v)(Z%pi6q2}qA3poTFT{tR_(gdCC0F7@S6+=ze(|$$!xw!qK6%wO_{il~;v-M^ zLfrDhFT~`7AAt9ggHxoXE^pL4w^l?l0Zm9zl15XxfW-Mv>i*G*@+9L2)hz5odbM{t1(dzl@@m<;6>G1Qt8Matusl9|tha63 z`{RN;<3{rR7;V=|hF+#vB_8e4mYHR9$w&wh2vL^Tdhh+Ts-75_e@K^rzi{UGVE{j* zM&1i_Q`YZS<^O-`W~V;@;D710Kce^f5k2>fJ-fSqtv%3JgTY+ns5EpXTkaJz4uQB@IrI`w@hziVu#DS3V5nhQi8ka&_Z71 zI=NQppfpHyvSx0TZo5zW-hMB)vil@{QF<~1gTY`AfNx)0TYJ75wPzZxD2k^5_^Dp6 zcU7<7E5V#aH5wh2CzNh&N9Y=@oc;*dE^J#QeN8$}WkyL0yD0s>>zI&9C~XU;8_XL` z+qR}bzgPDA{cF_7dFE-2H0;zA8}ij`weA5Yeq|RIR#o)_0KTFu%V7+%G(H*g8O^M{ z60A?_Dj74LLlXjk_i1F?TTjNx@IXS|h@JM@NVcc`F79Oe-jSz3ph+xx*RI`qSHHjX zX9rN--87Lsi$mXb_emSnrU>V3EIedKD$6~90XHn> zzqmno=E7)KKal1rPh*h1H4VYOXm4QUA`q(Sl&6^9%0=-jk6XFxU~~8gH%$mJV_drv z=MT_tS#?eZA=tsPzf|0${YU^0j^I6Y9ADq8joFg}G_6pgB}YxH)5?WhYv#zPV-4<) za1<-oj*H>LW}kDq@o8MzKen=ZT?8KHT!A`DI>-P*wACg$7vlhU%6NusLt{o5Pq+fE z=Y`?>XP@yvL|K-f1#n|kS3y$aBfKrH}#J%Dc~qCEh}=pZyPxh&<%`+!if ziKVR!W^>gsvp*IR3h2~LTC`022InD_ihB>IdxrszpiFI6?BMi zWi|R+y&2Zmj6g~wIf%g&Vo1DY_2H;#Rdfkc`h8Bnj7HS5ZaR*q4H z1$t#kM07rY?->jRd-Hp25+osL0!B*%a9g27zjZp=aVm0Vp%1lkZ(Ih^1KaPc*jaTq z{^91Zr>^V&0pK}vb91AjD9AY{6DdJf;3QsvIdWQEIq#c^moQs0O9yDYli8W+I_=rB ztL&`*L%y`t2sSZR6b1EreJTon9)KV5vKnVoa(D|{Fl;f-7PfGTV1TM4%l~PFVrSXw ztA}w`X=p!~Ig`I@g=71PA(H_SmP$xg6+{pM7`>tgKDZzC!TsQ-K{Kros~WMY5$Xm_ zh-iWcwitpcaRE&Th%q3HkKq$9`UUiY2)jrQksMf!-GU|U&WV5_Qfr-rw!Ho7um~Ud zAU^jsUxg1}{#YFR&6i>D@sDBK${P0c=W*_6C(fDMiS6YA=2si^Z~P2aU-oi*^vTb_ zr=Rq6jNkl5xT2Jm0fiU(#sGu{#8CyVDsU!!A%qk~Fv<}EVrV*=MUMFP_u%6{@niV( zD_#!fMkZXCML~#B*6*oQXCjIKg%~M@Kru$DrWFtw&7l=h23UoEGS{g!;4@_$*5+C) z;Q{$Jz0MRl=c>eW`Wiw&0luT0oBNLk>E^#Vgbh>5oHpf*X?(epE%i_q1IQFJi4Gwe z4Ep70G@P5CpPO4)m>(@H&W{%LSXi7NEiBBB<`?FMbMvF&Xl^(h4hO@2zd!8tdc(3T zhec5gi=r5M??=8U=NEX%z*!SmI+lH*Lljmq+>rfGhm z*XvzTmZi{i<|3tDDtX509pvI9DeGpIesYqA}NOUzqLV)()1I!g~)_ z$Yz6(l}H}}@PD*#f8IxhwNCKX`6?59-Iap&HuZ0aJhi?an4_m@Ab<}|kG^9&{2wll zZ=3dm=aLx(1Df4gHH^|;m=6p^m0U5;1E7JqV<}mo3Cp33|fBkz@iOGJ`_|0mZ@z)G5aWxP3h5hJUm=IkFm@W43f7Hs(NHM4!z10ZVy^q}7XI zpB!*5R-4Da=?sqx&8}+4(bfIW9J$4%=u2uq2)Z?KWZQ*U$zXCNAdfWZgv8hgM(+6T?geYmiobzzb zQ@__60{BJ^W@+=qZVsvA=dw2`DP&^-O!<}nI%cG?Av&=}G#CsVfX7WHlc(y6l+A(wP`kH*+&I-s4=YET7I4El!L7=v0}VusfQQr=`+ zD$P^+QuTqfE8N<9MUJVD$^G*CcERm9LAqJ-MFDtWuh+Zu6zQ^s2Pw8D0JgA&Q^XBB zb}SqVN1xd9gMwriSC9spi(oS~q7`hdlO#Vx*t76GJyiP-;>c_M z359Mv>q3CjT={l4(U@c-U^7#RfJ1-#*JwWWVGMdB1bvRhxruV9DRWL3D#((c7npEA z^5UPv2d;h!j=c8u*yeiJv272^(E{MTOj0xzxSoPygOUitULSJ{yKv6jZiEkg81H}f zf5vV9^}hns6_EF`Nms-blD4M_V9Dj#!GIk42M=QHS6+&b{f{5S zk+;7Kh>>GmGwK>t*FXp$+m9f#9_+J|C7&3-_oFC9H2|qmD0xL$ULl6N9l6}Mx5gXt zzU2#(_o7eCC=A4aa~Q837Oqn5;jVg37JEkzN_H6@}#ZY?^?k zspY5}G!h*p`&MYQR18g;fa55eP>b_BGx*XuNkTHl;F)b;_J z=&<2sJeeHT+_gUh;EZoVI2;ZiQrGnl0r-MmuUAHyK+}4(OP5;(Sdff9)5UY;T=0>=pFoCEMU0N-Dh<&|ejXC<8gv<=wveL+q$9-^y)zM&}n4kL`wykiV% z8>Lc^{Au~x!8^xI2sMBYXlkR^pM+!T0S(F=^ClfrUr;?{_Gq~sh#VVoWeosd226YC z|5gQjkm@P-nBZfCV}@r|2Ydd!?4H_W?Mh8X^hEvM!ll#wcYOD!=J(!X&fYiS!a)=3 z9{_OWpg*EU@66_l==7;9C^-k z>tpxr8_z!D0g4F#rZ%EvLJz`Z5|>b34iPaXx^r+90Lkslw}|{J8|u z)ITQQ@;=qV>X7ymQQK%btr`H=>mzTO2(?3UO7~MG}^WNsrq6H49ZC(?~ZrNoC}9MB@a@ClXt$&QlYmHx`tPoi&cUWbWaa0`h(UcL1a{6bk>eOS zG-PBFf#K?ijF*(l`5MZTRG;@e?g6%<=~E$<=eNHpRof>0A< z*dO8GZ~Z2?sz4U0jx2qU3a(Z`5+x;!S8&rW{x-G^mwUZK zyoJ5k|LVWR$F6w_!e?)Q^B&ae$>Bx!>?jzDqzr0>h#?ajA)q{R2-D@m@GA5hVob{d zgPnVEVQ+}rf8l4*96cffrD&*#02&5rbp&&eRS1w}gzP{#_{P`cw!is%4E!!cWr)NR z83(j2Z145EOb4;{@9>8m*?BhQT`G<7WThT0?ReX5`}Q4b@AjZYqNs64&Lz3y0ZPmE zHCL{)FR}>%Rs+eFai(aO#E!x{t%0NeUMENvjaf5StExO%2@q;SXJe^jD z0KBS1`HKKPIzxgpfw}Q`{5=4^yx;GS$Pqc4w3EWkc2%hl1C-?+YbP_zNYH2-b?$rb zP!t7`9X}9(Ok-D<-Mnd?eMl9lsWmmMUFWK z=EzN5b6r=luIpIWO{|+HHlc};Baj`FCpENQE)5C_9RpL{l!VelHm=LPp_z{M4S{!5tIM@bHYCpo zwG$f*lVPp%KUiLU4j69VQA~lyRI$1EL{?XvELN6RpS=ioZdvvzkm=U#Ccu*VvZYOe zF3TWKh}Bvc03W9D+9%Rv%mW`04Q>W-LseI8G)=DOnC?sZsxxP~4g?5~Iq!M^zHD(3 zOW89{2NpHGP#+}Eic!;u0;$)wx`@0Her)UFy#s@f0eBaHyY1=|#C8DR0N^RZ;n0WB zAO;!lk&Ro(bUdh|v2#wLWnv=Y>2z98CX-|1@#OZ&bn>C9s@_^v)$8lJeqCMFZ>p;5 zU6aY=W0T3`;AAqHHlYd5gULsBK7w4{=ev5Q$)sFq;Gn6SLIdVV0M5}(NiRqR+#Co% zwko&%g0(#9bM`(*8lf276`o2f=S)W|Q1}AA@NCo$QT{Px5M&}I=h}3!`rPiJW0R&@ zGaWU5rs$On=K`D$aE{R*^h*F&0eIv|`rjlaTn77`hHm{jl}V^8=UPK!V?v%8*nByl z501=|V%YfK#srsmJNxhXAdWIP_qHH5YC>iF#^ zx=G*XF%l(>Hx6L5o&Vce+uSD+&%F#;U67s;bxOy51LJ_;d*2gCT@>HBIxjrfJ^QG~ol&Y4hpH zq`rGHsU}rj2L`jO){(YCM(dW8d3n;?^qEM~*JupF8fkrJ7?s_Rfy^|)@r{t)9QLWutnLU>~c z&A)}Fd1F&I@2so(qtnUs&Z??btGa3cuq=Du7-rbDGAVCeDNxJD${!3gb%VihxCG#N z$(ce_z-}XJlG=to$ZX2((C1eJUZUkmdnIyH@=fdR-l||Ljrg- z?7uz$uU{RnGz0>1NV(iwXL-6_`Bfd&q$y%p(q`0%G~eH`xUzEh4_}UjOY>(L-htuX zm7{ljUxC4H8V;#;qrrgr3ri~ z1sg-re1sUmWem99Z1uATFwDf+(rB=T%OF`bZEi{n!0)abXt9MJel4)nM_xzx@n>aWX+tJ_4SyyQ|E!1 zo*-3{c?3>}j^P*T3enB#F>>QP1(0I4jkLolU$x}TbeFRU$%SOd_$%1}+Q&@ivatfl zhKV)~ZnM}{*Y$S*xTffpnwLrXzVJx<5JF~)WPeQeGWtd4$jlRF+z8;W0sI(%Z_)nt z?EwB8fbY`x->mO{3BarCy8hI(swa^ni*BjyGFvllsg`JtJi zIgYUJTfPmG55Eh$7xyAI0TcrqTdrD7qhqyHg~09?^`1_Re8dK**Dya=K>z4beCpX> z2~5_c6wE-=$O?oQ+wx~lCl&8fcCBYw%0^%k5G1LVB;UWRKmZr0Zo3r$jK&daM~K8g zl)4}W*|;t#Uj7M%F4=9Ph;-- zT>yTdEPD?JvE#JquX3@DmpOFUO9qVbme5hI5l)F*O{;o59v^C&=EDH~62OZ!b;6eb z_)-90p`X7}Y5Emv;QRuB*ECJ@@v5p0hY)J#WaR3sC?IpZTDkI0l^rnt7M>>%ag5aK z^>%6-Kj{>7*O`a5NUcip$5xq0o41dXIuJH70dTJF4e>3`xg8-iu4x*Ix?y3WM?Oa6 zw17M`FL;a`W8{wm_+Bwn@up*%<%Jg=E}{tmbBty$A}U+YQjI0L-HIef>ht04q`axurghV0Dq{rYxf^sd-(9t{8^22%nmX7 z0&oOJmexr3NTHTCjtCCzk$5!SEgJ|o0Rm!8@e={~L|sjyjh=y}Lj{&x;~G<8qiVKF zlmIw1+|c51aoAw(3zz5T7iOPxI?!PL>H%=sXnvkRtzHHQ{bx8r+C0g92H;TDHTRfr zEQZCueI5p5Ov|!-6M%!NOeJdAzZ|*j%+C=K`u#ouSkfHnr)xr|*EG#n0GJ;PdT9kB zjC(hb=`fj^1#=J)>Z*CU)e+N!nP(S1nJCqy_N1zojflCX1L1+_pWZ% z>TdeV8l`<`I-Oo0L;ME-KMmk(0X#?bn6FU%@S6er-==B)xvHvaI7d{L#Sp*~HoJK;OCBoiQ!P!bk6D>=YUOObzUQ4abRNyA zty?+@Epr{aExTIn?7CGuQFs8?0QlnJa8yEdW`ng8LC2;UUJ|`oXdFV|5F3s$P5^ui zz_06u-roh_<+?KHv)b?O)?+__TXoNnU)D*wZvyZep$Q+Ys%nj8GJ$P{fj!&WwNoDF zl3uE*CTMPMZV2ERy0T;oTR35ytP!<^Eo=b*bN!e}TzP0Y7*fd9U46qa3(b_8R^Tz( zX#J>>v39f@%CWleMOx{t#OBm{MG%JDwyBtH$|3nRq(07p3Xk!>z7eWImW5xLy%rN3jlbIX5n zZT>rR=$L1!+uKaxG-X&=%bqU}miy_wXO@VwO`HL;%pF)e@4Sb;VQy~jCN1i{cj{Be z+;ocntkLSua#l*zm`nl~t&J{#mQIljfXooEUrZ*`$z(G9B!EBAiH&at@Dl+39Kd@3 z+@i|&GKBw+0yqHRlK}ogjlb{GjadHxzlhi<>jOPYPHip=kVl9?7Ts;X{Qr_aAWm?Hmk5KLKU&*h{`!-kPi`-RBe2uF~~slsz` z7SErqkA?FeoC99Jwz6;R*duUk^|CYox1Tw^Z;uce4FOfGFzWAgM=<&F(e~k&T(1sJ z2FNY!zG|&H@{Kz%zYX4H%-K$4SfLVZ{IriOw5UViJl;3+h|deub$u&<4_0**)xRxJo}7h_ooyddb`pJs3INv)hr`|3Pfi-c;cyp# zr#R;d8EaeJLgc)rDKc1*Ev=&lRm2$4G))8Gp8y=m9&sXg3V^5d`~7|jJkAJ{>k@e< z7fsUSgHW@s>w^GZtr5mQtNPALl45+gF9q-p05<}-QzuG31K{l%sr_B*to?s6#t%15Q<+j_{M#0&ZMD1wNmnn$=n#Vg z*dazn;XMJkw2(a^Hj9~u3&UDp%DY>)n6p;N?8h?-hfaUbT+rMDlZ)c$s7l3-{gGR&00AdEOEaT(f^}QInIe-e(i0%FbX{AH= zUpk`#+6>&tX7~|;zHdTgr1X{I_1OcljCG zoHn5>%ZoKie77$Oc<;qAGPBWLg3>7|`iZmUy^*vDF-|7c9U7hfgQ`UTD}dWJsf3T! z==&GF#|r`c5i@@_G6$ImP{)@A+E{^DBS5nTPAj=|@=*ANXgC}c0G@UlHa4UJ#nk}5 zwJduJO%o{U^81d_tQT_{!) zSx{%eg7WIU@!Kw4vGASV7kix}(#G|@^g>(b72nT?!ao5Z7W zV70$%_nRtUe~dBZir4D3G*!nxYbs1RAlfQ9p!78F7q+>{_*>s};e~_Q=bQ@s(w_4e z)wAXow-E|Tx||2#Ob4@7nhN7WX%7a6$j$1JeZ{uze{-#jlb?@R0r1MEX^wH~N6Nz{ z(`~#50lA)%23~Pw6-7Z3DeoSB8vGN)%$EYVU@#aYS?FvdViG-rtb7D%!Ca?OeWj`^ z25_*~>%HX!<)UE`!1JAV=Q*F!1hz+#&248RwI#eS;GL{HYC^+JUGE3*3e{QOtTH;| zzD=Q4Isg9v{9gc{3?T&P9E!rHa*{eDg>L2;ZOd=+TlJl7s`qVXgIk(S5o7evUoACc zs~PI2j&5UR1e_yr*8(@Iv;Ri`{9#?!9|dq&>%S50SSQr?>*UIB0Qe~YZwO6TmH0ME zm1vtdC)oRSW1}>zaJi(e1aNL6D=TL&z9+1^HdmwNMD{k>5CTen&N_^{TjXW4A;4Dp zcP?(n5WjJI-4h7#*8+IPpg$M_8vUex5!;4kV#5|uuw*GWipgoQ{HKqEM) zSIUMvu3h?VdP_JSm47{+a6S8gh0 zN80+%?%yt{4*(h>G~`e-K;*CkCGPmqp9eya^fyjY4`m*m^)(=|{>eMI!b3L0GcDAX z!wZcGN*gd-2yiiiqS9X587i0)eF-R>INO{q<(IEb!N?SiR3vRZJz*|r;~?Xj^vLYD zZ1mCSxoR>70k@0?;Rd~A3ren}0LrJtzpQgBP)DTrms%b&YD*tc{@1Tq|5zL9x9N~) z>TRs$xNSt?owi-`D~-20hKAL{deDqP&1$%UnVfS4k$Z%uaCvc6RWAkbUrxb!dT;P` zU4J=%#|;MqUzP>s5iK31yF(X2r=D!f^$B$oVqG_%R^|K0H1hnwCXMk~1ii<*G>y$K z#SlIjLKAd@JyE(_=1D))DI@u34r`56O_Mc|F&vI|0{E||xC&rn-Gp^B;a>ydVm`?ncH|4tVYo%0Q|m27{0ceR!7LWmY&&o zDeaw&b}aR1C$%)4o3?>2gWm?=xjk78uvzdr$G!HYye;iQ7>g>6yFGN4dplUvcK@ED z5a)kU6l9K-{5A~ncoH;lK%W(|eJW-D44|4;cj(gdzc@t$^z#DDwi#>d2%kkOKQ+i9 zO|r8@))he5U;=;uKDd0>2Ny8>odatJtB4*Nb-qW<>>!i zi*D*4LlI-!;nv-+MP3FA4)FlIOdRUUN$}(z?{a()!1bj0#0Z1ySJn=(Q&Uu?b=p0w zteE*^3#SxIgenBkXr7MM%g>rW79KPEoRfv9m;Olv+CA*`iF6f2q5CGZeAKQ6NOA)5 zhTu@GO=1Mz5svKoRQCy=SKzrhyam9mF~m+F6fh&xwf&&ud^)mpI{?mIU0uBnz^L=X z&0}sdnLG`^E;GOgZAv%M!?lb+(%g{vEYqh#WB~80s_ORk_V)?`@Js+t9*st2jFFNI zw$;bF*G!U$5dODGUvdu2%rV3jot%FufKRWJVJDA+DocJ7z^xMe&`wlrq&wv0HHtAa zNS0DO7Qh$JJma1~vwkSkU&Z;KjZ^w+?KWGkmbOAOX8x3}X#8~m*Q?WYGl&2V0eGDT zoV>ni!q_{{-g|hZ4z80SgveC(%Dx7NYkTR2I? zxw%UktUh!!oF^t~9Wf$ORN&7D;O@BHV%GlD&#e&bevK4?B*GxcF2nH@61|8RD3XBF zrRMq^i@;j{+ZO8-GxMCVL?0h~)!$aC7rGaQ%l7Zutxx1Kdbjp1eHkK(?;k!FdPoyhO!nu71)73rQG`1Hn5&;VC$W z;5-6(=(d0@O$l(`lXs#PN>E#?TnIPl<(X~YmP;tmHe|Q#G7*tAbLT#~M?_=}tIJ`8 z!P_6ZZ{KDW-p_yJJe$xmobbI-v~yOkYp?Beu@29+3LBCVr;1y9TDjeLM?cLNHtDw3 zMHF@~r2ERZ(iPQc72YSwJK8Jz{lWIa7thp)uiw&*={9YE+zWOCcn%RQLCjq}ol(;a zYo)ThZ_6zI^jadGOr~{HHy_L*)c2hx1>9hU-YWpSAVz*~RaH}v?#7{nHW~}^M$hV# zISrVZoFfO|3eEeunWgatR}{sS0G>AJ4@&Pn*~Y~Zp_n;N)Szh%&Mt&cWLLUL-Rx7N z|Hstvf4XzXPjw>TMF4((G9K^i%rbW%%-t!qey~&kF-C+K5n=#ILjFfpvhm<%H_~I9 zG$Q+yf1_`@?U=`x-=kPG%qRE3ZCsZ?0~DZz!H$K))5Blk_bfc;$gx8|w@CAQ%3e=PEnP$= zD7p@}jsP&-Qd0oN$h(l2kxSH|OBsPH7Cj zX64SiN87glQ5DB^8Dyn{vw>ip>bAkytCM0ySyCUp#bP@7+V|m_)8hQNb?Jg_m`t9t zy%_aN?-TE&i6hng?6YTC6(D;hh;A93=cB6!508dBUwH*Se!9ok`xRDKaW{bfsH>_b z$mF>Ud3j2+Rin7?rQ8tX=l!i#2(MHv4Uw00q^bwgCI5c4b;FTJ!e@9;I z(}ZJs|KF?YdO60Z!Shnid?Elgrlm2-=tLlZdSyAM`SdrVSFZCzaklzGhJ$XEtql1Y zZ9fJhh7fPo=<3&K+nox{f=;^pZvgL{R?{kmz#OGyonjbf&*{_c+QJtA@X*m{v>6^} z04%8~aNI&I7ek4&KJ(b2UG41mNe z5y6lNGP?&vS?YWNs4HEbvF;j0a#(lH%}DdCBFqd=gzAplu=c4>qb!H0l^%H>|D^b5 zpJyamqDy)Ni^-L8!7`x+(D(wx!0M}BEsp;XBn&>rHa~w3``wmt2gxDs++Xn$$%V$E1Z zeSjBt{o|}p?Lm$WXd%XFjO|xxl7++}VZ18Gdgp51Cv)>QM>1BlA(JAPea`v6qwrbV z>vPPZ1jz4f$#ddC1*7YXmJLTE_4++OH#c{#ZXWk*n(zIzM@0v`iDKklqABFXEL+ijWN3}UK zjh#ta>j;^esFmYn4%_5lw|h9u?g5bFS{y#Q&_CyA4^)Tug#d1tP+MA`w5qY) z$4QWn5WxeljT{eHGv$3yyjQ6SavqiJlki6X{!w+h(*f3vUta;> z_7EeOBS^>fS+XP@BJsX8x_&M1x38_Oo$z=?I&CWpEz((SAJZ8+B5|fr_Zc>B#2N1+ zL;Ipup#6bXVsl9}%euxl0=OWT!?GtsD_f*Z^0CQ4AR?}+ssZr2e!u_wx?1>5;Z~jC zyTK*^ob8>JbVa$aYA*a9)F6&|bYB$q-D3s32@gWKsw$zhpPvK)R19u>)d&@{6AQ*P8MT)9R$3pL&(nybA#(tA?D+D7{4L=vIgHb?|Gs(+s#%fvhFnH3+@ zod|%^$PC_G@wRWJ2vRpW+di8J2;(*G10Q4GzsD%R2N}BTlYunCDSef(O70ZNop<^B z&JVQBePi9X4TE^VAPchbHj{YkIs@I&73l>_vBtLWy3lmHMTErfs&1C2(* zUfC<3q!HTRr4H3o#ga}a%#(A(k#mRb1~B8_90Gb)905F?P8v?{#4TaoG5}C z`oG1@pNt$WWDnB1EzEh*JzD2~j1i$};APXdOIBA`zw{(hFI@)U>CU;4%|slZo*8o+ zd+3%Z$}>C}PgXRF{N-oC`40dXkH??Wy#aoIGM*eJ(meq>DdvQJc~_OQ@+Yzy+``aA zjtX5_@yK-XiGcw`i?lS5^`o{p(w=#mB^El$c?M)}_xv^^0ACB>hkL#93hxVBWG8(* z_22x}=#V`+O(sP&O~X+(iThmuFB{9=6%TsoP8==rR)FX0iqs^?g|9aL!i2d=JO|l^F)iixq_Cb=PnH93g?BX+ZBUZ z_ccC&>?I&w+V%#BC>w^GOt6Zz+qci3`^U|(J3cd0^bR~T$zn$)wuuXsTB2*2b3|y9 zt7AD0HI-yMa3aLJ2Yh_(mIF&z_={;2YP5(_Jk^?PbyEzN(h^@k+eX00123Rw>jPUj>nJ^f?dDI_a`^>LF4G7(6uo7Da` zfLrpLpCKI3ppcI-Bbq!+@+w`Xqh_Y_NZ*K1vAPSuvs6Cb8>~}jFkL_%mAalj*`5m< z8Z1seEFNv(|r24{%PL#k1 zFFKHrOvYnL86`X<$O$U%I~K^AICvUALX&^ui_ql-C{Hv?E>&6&bhv=zGN0p zgp5Ji>XOu6sh}WPWy{Qb6M)~IPN$!pEy!sGtF7}dP17vvWKX9}Meen2FJ*6wM2^Tg znhU_QmX?+l(-&LV!f~)Q0kDNFoCJ!dzF>`yJhJEwJVFq~@;EC1x<@`KpoW}DA4MCl zmQDa|FczF`MCQ~%2-%nk&SgtUd!EA&~}D>7p*JqrL#5YH&ec_|Gdlf=tJM2NTF zj#7n})K~v?^dtLj16t(@UlMrT!(J-9J`$wW+3|`H&}O7mIJrF%t~)ml9&A6%#N$(a5eOcAE09S zbSu9PbO<|b%mwMJe4jW#d9iE23f6NK!P-oZjgS~dmAho{WxQkOEd(@+5VOOU0k=wZ z_Pfm4m{*r|B|r=TAp|PCFNUMh!vXv+&2hS;z51l^Z~%`iijtC1uZlKh;{#Ivl<4^` zUFEwF8t4XYzX9NV>*fs4EXDv{58zL#X>}BkBmk-9XZRtNpEZ|pa%e;}O@j~ubV>X( z`~CiABGwDt*z4iUOrZ&o{QpuCVWpN|jUVL5*ihc^cs#BF{Iy0J9h`mG8OB`zeigvq zt&PVkfNl1Y^Fz)H89%5)!0Ii_q8$J{6u=jz3r`FTpmEN1*6tIvJzp-8=LP20!C`}l z8jzaO$sAO3n&#=J`-8!izAVeU_t~4)$u!gdvlRiX4ucQ^GxL7UVf=s3Q2K`lELwZr zoM+k-)cJ2$r5>W+=U`@}8JK&(BksO?Wq#ZFe|i}84NYti*@?rP^c5y6vKG?74@A@R z^H& z^Pp*jo=8NCP17K%+>APwvlhnM6gCzpe_0NGEz4&Bymd1H2)$nKT#bY;o4S@~iQ2ePHwQ?(6F z1f5~o1MM#6MLI{Te|A*7*^d2WdPXYS?{2_q5Kwu)TE4<_%Amy?)PAfw> zU*Vcox)d7Vaj)_xgQnNgPf7Oa^E2Abj-Bb`?7K6Mb-H`5r)~rrC!~+2)5p1b9cXQB z?MeU_JLi%ul4x(v|EwRj&y%#1%*@m2bWK;1{KrOhI0IM)@b|JIw=G%9R^jMHR(2yy zl1h=`ec=FHF&>XkM?lvWKF_h4foBU_*aCp};hM6UgeMGv^Sm$824&*>7v;zz-^KB5 zqIlL7Y*(yTctpwRp0hicvEiU;P@R)afIDdgHkOsGFwGtBX0~Yg)rrN-ULt(Ba-={+P5lGF6V(8mFTg(togWIIe`n3E#baP0( zzU2#nr>f9{l%Pb5^g98 z7LdI+rArmXq`>NCZ5#IA^#@wkODE*{$`3RAK!9K3fNBOe3sDox3A zk4~*Kgku2y62P0L)2fzY%4&slB!f<>DPw-Cpj*9^;10kgP19Vy3B79o;3)v+9TDXQ zBw(w7jt6A|8DF?*nh4U`UC2mDmB;h^8ozNU@&-?bL2Th zlC@xMXKzPsy}$Mekt2knC{Pv!ilTsu;Kv`a~E{t2hUD{h+_?WluVE=w5lG7aJD=&yf)rXqeDwN<~h=E7?lT zwBc^|vk03c(oPAFp4@r+Jp5~`wIek#aRGw2i2!}g52J;AAK?Lz2YS7oe%c(pA|7il zntjG*5Xa+-1MsN+uusfH!O~Y|4p2Z=0;qUS+O+A8_1bcn2R<@ct3G`?CQ2S4n5ewI z&7A+aEHt@k<7XO2O@KlscfI#imZb;qh?7k51^^EOaB08a^AeS=9GrB0Ym{8>wC}|# z16NgDY5JedMBo=yRXqm4g}t&z-gy9Ry2-r$Hiosshw4Gzv+m9F&u4k;uQk=;Cn3&e z7P;7pvece-SlUC?f1GH47j0ry>AL=5W1bGFaxRU~-RH|B4Wq86Q6lui+s>fFmUWWk zLroJytLQ2SV6rhnc{_jY!U4GO1XoHJIM?NcMjG%lyP@<<(SVI8eOAzRw+wALy9Jg0 zkzcOwC6MMsFwhk!Bj+6@UeOgmfR#x5dbVOWM)Br^*s!L2`peUpM(W-Wwcow7Y3hlr zgpz;|JIG;HT)3Yi$apk9`#E|@vbLq=;9=_MQPda*t5W&n`Q}b9I*;4mT&WhxO zL8j<Kc@yh04C?zImga=@sQLngh0dLZ~)+2^w{31 z^od~yfG_ag`xqHe2Pd-fSht4Kb|VlGs=8(X@9Xt?e|{f2tD(_e|2M{Xa|q(_<7Dt! z^pMaoSI|?R%yQ^TKsfe>5T2@=#GVK)0B|_~7t%y!n^GyKY2NN+gx7;WTvzpN0Dix! zsxuWCccQpOj4HmZsT+==-6x`J_Z^=u4&FKVqJVRb!MI&lzx?5S+z0NL zh?)->s!5n**f`$Codg?q^pEix%SOK5^Y*+|HpErfw@OX*cMf=8HC^E%)A@id%Zi_0 zZfS2Nb&oon&y2vu3=yw3Tb`sr-`!jl96k^JB_2b-gJB4}Iceo_uHIp%dwB}uoV zD`25cct;4tz-WX3oR9JN>g!K3a{N_*UtO7eQ31D?;K{a=GJ538SY_N7f@lv{$Falm z+R+-W4`irxM z4*!}Bl8&rS)-N{d9-A;|cL2EBd+(&%xBVOXd{}cR|45qvLB(QOEo@OWe$1lU>+#fLMHDic@R_rGq)3H5EwVzz#_hI1$Ot1aNZtOB7fGLWlqd z2G;>p)j-{JRs@I>s&z`Y&S^+p9D#}g9u7`3w36x|Vkothw0ASwftvJ!w)%;h8u zW^E_$h1~ic1j!sK8xluAHYV1(6wH{84^DQJJKjC)*SG0Sx6neGm!xrW!(z6rOd*u- z+iMLmGKVItRnzHBlgZ>GuZ`a`9*;k`wz_uX+S=M(tE;Qa)9JK!&M`U1 z&U@LgPB#EgN_DmhD4!7M)FsuoWk?3oU@+JL;F~qAN}1RB-cXk1E&zM`{a#nOPfGsG zYdSBD5F?{$8q{^o9C;PM%d4uoY4$m18La7tUQ^fAF-Zxk({7nE4sPk0vr1|Q=gnC? z1n`*Q5GR_S^C3;RhYdo{63noA4}%*(c-B_2 zAg8I)a6=G`rn>-q=_Yhp)}b?vxYkEn8d_g!#Rwo1<3Xdu0MOiMw6|aOzg{<}evI?J zkj(*AzGTuaYc_eA=@+nqapbD1_5paQZa8=*H=cVyLnOZ-g%ucmJ48q8d;{9aeg=q% zK;&0LeM0=RTHSrqQg8R~9mLU9YNDoN&~XgVlC*6ufgi$ED$29oslQ;z*wN(_b^hC= zfF$aXm7f6);A3n1n+4z>dRYBORS8ZA3=p%>AWZ1h%Kn4%XJzRsej8fweY8inV1f zle+;^qU$)w;tkB}3XT(LyZkl)>FVoDPwYU4p8R`F$@e(`@9$oGM!*2x0^sQEDi=Us zm0o}nE&WjG*nT@YK^hslM2GbsxuZ#?wT$1gJrv}52X!1fThaf9T2qc4j#2arDU@ml#%rDQYDypFKTSvZ zs7(YKZQ((R6HWGu9VH+)X1|af0(37!bg#od8aEn7tYG{_Lu6I z(1<8cx->c|*5;{@hjrA*b&&5;gqMUv>fsProN?3yasJyXfDqa!8C7zUGHtgeEgV=k zMv_Q3Gulj;+4Ux_WVx*0r*F(;B?rFc%4`N)(M#|D&jD|!r z34m;l*+i@&u1wMXVUWwh1y zOwZLr#ss$gGXMaqYikc(URi!IfX908doe}=OZpab0+@pk$Yp^VwfY6CV>N`p)5-K8 zfL{Ud|J?`sG(2DsK^hyUL!a?`)|y6rF`6?cwmG_)fXJXoMakiWY@ufW&02+jnM3i~ zmGN@yp-^|Z6huU~>Mu!@n*uZ&G_MRG%-x<9554{*TMfW0PH`esb%hGmCl?31fA6YI zN4&}o2|^Qz{twCdul$(G-paw2xXIz=c6U0@$>SLI>>s+NH|(G6KN_NA=|@^pYdoV% znh3}?xN9L8*^KD8?c1{e;vuzA%r~u&hy?jB-47@1*s4- zWzs@M(SZ(X>Y@8$0%-!^;{XoX9!9zs0?^TKY}gXZ$pWQx^~M0eqnDO2*SYgOfb>tg zezLrhlpp za;v7`GR8k^7z_sc0UQ<@wB==;9LZB(8P74RY?9!V62Q4SxwM5X92X}#@N8iVTaW~o z#bkB-yt#6I2(NjW*GV`Vx8)ld$Y-xI1FwbXzO6G4nE;1Kem$o~j|sL;+M9bpb`SZO zPXwr)6*c!iv+fipOX!eCJ8V#+bk7*HTv9A&RZ>MUS4jw&Vx%|e1jVQ8+vqPb49ytK zX=vWZbmBM=3y#&2GbfETlP%A8L?BOKW{#RXP|7^>hz*_>&B(SdwO%dFa#gLRrbPpG zuWSu+i9XBQOBBs|T5%sZh!8&6jkDT5(c*WR87Ng(+H6p0DM-B zkK0snyfyorpU*$vt`SSeJ8lPXlSZKbvql7eD}b*6@cm8QymmU7+*vnut=Y3u-3)EH z-fE{&R?@cFcS!}uhlr#jb_ zsV~}Ov{QF5S0tKd{YEB#jelEF~dNMrDM0GR+y{Q!`0t&@YfD@`M}QSXf`_XkHVCh^23007__IIyy~xcz62 z@yac+n#PhHe9j-)u)xC1TAsF_%BNf#YWWY@s)6)9GYA17Mj*$_S$?*fm|dXPv3Cz4BRrA+p+YP0DOi+XxozIb^T$vkEMZS zTws*_lIGwqc0PX5>@)5SZvu)M{@X@wIP8^WYD%L4(k98Oe`(6h02ZEdggQE&RBPiw zG5=T35LxzM0|WRpfa@6?ZT#GDa(5#cmUNL|`K%v0old_<7v7!-3IJaMU}sSjlt0&y z`Tg|0eBa7+Nduyj8L!)QGD*08(rl>)JL0Ngr{}S&d5od#Y-9B2Gv`x{dZW(y=e`OqYMsfTV$1Q3`tV<}$^c z5{>~l+=Past{AZuB&JiFK$zt}qoL3WbmDs@Z-n-~3Cd6Rf(?Fn#t;G7yFln*Mq zy>r>vqEnZ9EB8Ers{t&?K74tf%MR(0tu7|PN1_kNGZwt}mu}F%F3t`+Z+*`C-NUlJ zcPW5}>v4J3&#ccqJnzrFUhm5I_HyOC;~DGM2(6EGRJr4@>Zd2 zaW4vh$q6+!CI5cwoJayi9seEYzv>q(Qa#-=J&_}zMQWF=w;O@lk^Uya*$vhsDFoRy z>31_MgrbmJ|o!|^#|gY)Z@(bUfv!1%O!Ku!!(05<~oQvlxw z;AcV;-aeU3Cq%>qbI!Cq3_w!48N!^F=hm3M?bnPD8q)l&U)S&VFKi!ud@L+1%uT1w zBLU2D+V~c!46Pw2Wua_kKpr)wduZIIM)&;*%bK?4kQo)pIh~AEshc>nvxyA?APxna z*xaVZ!M$M*fE^M!>EL~P2<=*0BDHZl7MXLrmd$_Pyt=x2Xy*R+HSPfL{uo1WI)QBw zf8zAF_pJlT&gY}8rbpVQ6DFsGd`dQT^^CrWcdcyN-uAuSL&kpXQMU zU00t|$NwLw<7o>g0@CpX$c1ET&2*5+;Q(m5Lm)&(3=9TbF*n?lEp+wrft$9w#XmT* zddEt^jwMpx#$DUrM@yw0UyCKsF~h0FAcw*Om`{^@sNCIpOGI09Y7oe@GL?&zc*Igz~yMcUpm@ZK~@rGzFt=q%3?j zt!p%hAFG@4BeVB^5aBR@zXwoBY7H5;&B2~@>kfYjUok{Ki6Nq?8xTn9S=YAb z>#Omy)E*#51mOIts(uN;U+6}pf1!HcA7#fM&m8%={F?kXv*-T=z@Gv5bA8S$8{m%- z@dE(%5+sLuK2S)pyF{eyl+=|7z(S01(7A9uW?Dl=o>phHLwIFf>KNrAT`hXY?7hw) z8r>g)#qqBj$YvA!hS~BWt6OUN&ETGXabiRAI+~whFtjhuwx`hodOnS}D%Vc}LjVr} zP^NT@=|1iKtPFtYYSw->;RWFG5W+73_$%!ff2RG<`qwKq=!buj9e;W+pY8aw?098W zRj*u~PJbQ1qnvX|`Xzl*-%A7w^gDUA&sx!uuEN>E7LJQeDZN|R!h;zMP;}F0736mH zhC_;$swPX{Gh^TDSezM7`YOY^90Z5}w5v0@mp&g)7N+yv3pP{(I)#uoDS|#LcrHpr z=-3JIWF$dkr&1l|o>5m15S!cE{&f{#i;+i)eD4ybQ=<-DwH)?ODxjNuodC?alaa*A z-qxa>WD#sg(T$O4B$k7i?ipPvBYfuUmvV?DYwr_hWvd62Vj5N<69$Y)=(~k~eezc1 z=)J&*+u^R67J_m&y3Epo?_(!j)Kvn14&X%qUNas~4qGQSr7^v;e#Y9L%^?X!x;LWUC&8e}%^ii4q;?#%CuAX9ksYb2XxpGg14B zUfj0fO!;Qyx*-{BdL-jg`=0#X0g&b9bzR*J;N^O3P2ip&WUf>8{Sm|1M!ihtn%var zZA)__dGB?WYAt#ylo6~iX5*eRlLT&9;DMI9eVfV-AW434 zfQ$E#KtNM-oUZQQzWv-+Tz+)lrc#ptKyaQ}Vh8k5t>z;y!qKTOT0lfPbmggh4hPyI zpE9mGddt!I#qFP1BW$#|VKO0udSp5E=EcgY^LJ)z{$ga(@2@8A89`f19lE(tR@Y zi{$**2?1p^APYc}6c;jPI@#yt%JF!7(abY80-b{ zu9M19bMS9AZJq;g9)O+`N4_wZl_8TI0+VwsA~X8^UccY(KVmQ#KA}GtJgMLBUDxaP zuIu-E*Y*4TFKCb6b^Sr_$^Ak9Dg8nJsokUZ#fhu{n1S`N z_I|T^K`x6~LZzo?S#OML1FX*r2_e+F^D{J~q*ru9+3pn`e#xjb`#fzYkue>b()O9V zoMEuCP=-|Z^x8@JL}DvsHCkV}4bboR2LP6wb3QTaanSbv{3OX=q8<@lQkLa4y4NH*w@ob`RT11VBt# zVjQEIQN#=_n@*62*f$#t8boM90|5Kyn&!UVOnD;w0>l5kh^VWARWs(T^gqCo}Gy?bu2CS3md@=Q=-6D@5tJdRb<)(yrs^|&)NIH%#qeMO?P+q+|9doU;O8X zCj0jjJGO3UT-pw6(IkIIV-&X2@tL8M6q;tn4${qK0T6i{9UqB3&}$AHF5aR6=$k@A zj-7WAHlB3KYx@^1vd@&&HPcHK)|$4TL{o!T z(A-`wocniO-_?T;)9Lhf0Pkv=rZ!$Cv~sbVoBBK1!~hbq@2TthY5=|2=geRT z;0polj3Ltc6<2K;k_?Bb-V$A|A6Rv(zgL}PGw=W&;=K1A4ltQ*|I+*PwLqEMh7#uJ z!0fv!wrqVxr8 zNM_cRdKgWo(-WBh$h(yc1V%h%p1kiF?F?Fu@qI9Peq38i2e0mtLHLdUAky;kiH;SV zgh%J>dOpwFY26n99iBaZX3;4~Ywk)L=3@Yn1=Hx~?02*G*$C4Z7XWMrG(EG?MhKFw zGy11jD@*&CbPs{Hw50tBl!-)gh}JLL@1?(a`R7Yl_|kdjUEvDK57{JK`=%pDE_chQ z?Uav;`fnEbH9GIO0N|YUB;3LlTHKQnx`i!lAw#oc{`}ZX9z7h6oET-6kKG34d}z)G z=~ixYrYa=?WTUi38nsSnP6{LJ8u?*%>-OF`jz8+#H}bpm>0f= zEhG?(S5%S8TA_29@L*!9 zjBR$tkTeNMbu@amluUKh&%&z&C*kxD*@QmpSjT69@+oILo65pn_D^k*>_RZ3qtRbV5S? zvPmCip;+r+(;F}lxIwY7!%gbdXB=K_PH1AVa?K-Fu==QlxdoX3aPmAMjL^s0$=c9C zbjYY~pXu6K>;rFa=K1#7`#%U#YkG`>K$IwH634KNl{$o`(N!9d(`2chk}nqlJpJB+ z5&Hf9IRKsvpwGIpvF-C+-NVLf*?XpS0J>IgegeQ-I}bQ96acn+uaQM)pPAmz9-XgM zx+Ga7`>%ECat}vKI2}_=s48vsUHYzjSh^zny}TIr+da}_04cGxX9m^h$`i~(-l0V5 z(mXR(BZ=2eJ8D^LT~&BCFPb zLH5rAvgPawQa)POz^RSFeuKKtfKb;90Oow*LHd|zt1y)w>CTz1Oe8jlr2(@EO6w

3i9EOJoIu%X%+XS1ER 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

CD@%^ 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 wZv{VYyr`+}fPmYrE9mYW?tdTsKi*;M1& literal 0 HcmV?d00001 diff --git a/admin/src/assets/hero.png b/admin/src/assets/hero.png new file mode 100644 index 0000000000000000000000000000000000000000..02251f4b956c55af2d76fd0788124d7eee2b45eb GIT binary patch literal 13057 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 P00000NkvXXu0mjft=yBf literal 0 HcmV?d00001 diff --git a/admin/src/assets/react.svg b/admin/src/assets/react.svg new file mode 100644 index 0000000000..6c87de9bb3 --- /dev/null +++ b/admin/src/assets/react.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/src/assets/vite.svg b/admin/src/assets/vite.svg new file mode 100644 index 0000000000..5101b674df --- /dev/null +++ b/admin/src/assets/vite.svg @@ -0,0 +1 @@ +Vite diff --git a/admin/src/components/bookings/OfflineBookingDialog.tsx b/admin/src/components/bookings/OfflineBookingDialog.tsx new file mode 100644 index 0000000000..845cd75727 --- /dev/null +++ b/admin/src/components/bookings/OfflineBookingDialog.tsx @@ -0,0 +1,124 @@ +import React from "react"; +import { + Dialog, + DialogContent, + DialogDescription, + DialogFooter, + DialogHeader, + DialogTitle, +} from "@/components/ui/dialog"; +import { Input } from "@/components/ui/input"; +import { Label } from "@/components/ui/label"; +import { Button } from "@/components/ui/button"; +import type { OfflineForm } from "@/types/ui"; + +export function OfflineBookingDialog({ + offlineOpen, + setOfflineOpen, + form, + setForm, + handleSubmit, + isPending, + EMPTY_FORM, +}: { + offlineOpen: boolean; + setOfflineOpen: (open: boolean) => void; + form: OfflineForm; + setForm: React.Dispatch>; + handleSubmit: () => void; + isPending: boolean; + EMPTY_FORM: OfflineForm; +}) { + const set = + (field: keyof OfflineForm) => (e: React.ChangeEvent) => + setForm((prev) => ({ ...prev, [field]: e.target.value })); + + return ( +

+ + + New Offline Booking + + Record a cash or walk-in booking directly without an online payment. + + + +
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+ + + + + +
+
+ ); +} diff --git a/admin/src/components/bookings/useBookingColumns.tsx b/admin/src/components/bookings/useBookingColumns.tsx new file mode 100644 index 0000000000..50c5dbfcc8 --- /dev/null +++ b/admin/src/components/bookings/useBookingColumns.tsx @@ -0,0 +1,183 @@ +import { Badge } from "@/components/ui/badge"; +import { BookingDetailPanel } from "@/components/common/panels/BookingDetailPanel"; +import { STATUS_VARIANT } from "@/constants/statusVariants"; +import { VenueDetailPanel } from "@/components/common/panels/VenueDetailPanel"; +import { UserDetailPanel } from "@/components/common/panels/UserDetailPanel"; +import { useApiQuery } from "@/hooks/useApi"; +import { QUERY_KEYS } from "@/config/queryKeys"; +import { API_ENDPOINTS } from "@/constants"; +import { PROFILE_STALE_TIME } from "@/constants/queryConfig"; +import { ROLES } from "@/constants/roles"; + +import type { Booking } from "@/types/models"; +import type { UserProfile } from "@/components/guards/AuthGuard"; + +import { type ActiveModal } from "@/store/useModalStore"; + +export function useBookingColumns({ + openModal, +}: { + openModal: (opts: Omit) => void; +}) { + const { data: profile } = useApiQuery( + QUERY_KEYS.PROFILE, + { method: "GET", url: API_ENDPOINTS.PROFILE }, + { staleTime: PROFILE_STALE_TIME }, + ); + + const isAdmin = + profile?.role === ROLES.ADMIN || profile?.role === ROLES.SUPER_ADMIN; + + const getDisplayStatus = (booking: Booking) => booking.uiStatus; + + const getStatusVariant = (status: string) => { + const statusKey = status.toUpperCase(); + return STATUS_VARIANT[statusKey] ?? "outline"; + }; + + return [ + { + accessorKey: "_id", + header: "Booking ID", + cell: ({ row }: { row: { original: Booking } }) => { + const id: string = row.original._id; + return ( + { + openModal({ + title: `Booking Details`, + size: "xl", + component: BookingDetailPanel, + data: { ...row.original, userRole: "admin" }, + actions: [], + }); + }} + > + BMV-{id.slice(-6).toUpperCase()} + + ); + }, + }, + { + accessorKey: "venueId", + header: "Venue", + cell: ({ row }: { row: { original: Booking } }) => ( + { + if (row.original.venue?._id) { + openModal({ + title: `Venue Details`, + size: "xl", + component: VenueDetailPanel, + data: row.original.venue, + actions: [], + }); + } + }} + > + {row.original.venue?.name ?? "—"} + + ), + }, + { + accessorKey: "userId", + header: "User Account", + headerClassName: isAdmin ? "" : "hidden", + cell: ({ row }: { row: { original: Booking } }) => { + if (!isAdmin) return ; + const user = row.original.user; + if (!user) return ; + return ( + { + openModal({ + title: `User Details`, + size: "lg", + component: UserDetailPanel, + data: user, + actions: [], + }); + }} + > + {user.username} ({user.email}) + + ); + }, + }, + { + accessorKey: "bookerName", + header: "Booked By", + cell: ({ row }: { row: { original: Booking } }) => { + return ( +
+

+ {row.original.bookerName ?? "—"} +

+

+ {row.original.bookerPhone ?? "—"} +

+ {row.original.bookerEmail && ( +

+ {row.original.bookerEmail} +

+ )} +
+ ); + }, + }, + { + accessorKey: "date", + header: "Event Date", + cell: ({ row }: { row: { original: Booking } }) => + new Date(row.original.date).toLocaleDateString(), + }, + { + accessorKey: "status", + header: "Status", + cell: ({ row }: { row: { original: Booking } }) => { + const displayStatus = getDisplayStatus(row.original) ?? "confirmed"; + return ( + + {displayStatus.toUpperCase()} + + ); + }, + }, + { + accessorKey: "totalPrice", + header: "Amount", + cell: ({ row }: { row: { original: Booking } }) => ( + + ₹ + {row.original.price != null + ? (row.original.price as number).toLocaleString("en-IN") + : "0"} + + ), + }, + { + accessorKey: "paymentStatus", + header: "Payment", + cell: ({ row }: { row: { original: Booking } }) => ( + + {(row.original.paymentStatus as string)?.toUpperCase() || "—"} + + ), + }, + { + accessorKey: "createdAt", + header: "Booked On", + cell: ({ row }: { row: { original: Booking } }) => + new Date(row.original.createdAt).toLocaleDateString(), + }, + ]; +} diff --git a/admin/src/components/bookings/useOwnerBookingColumns.tsx b/admin/src/components/bookings/useOwnerBookingColumns.tsx new file mode 100644 index 0000000000..03e861064a --- /dev/null +++ b/admin/src/components/bookings/useOwnerBookingColumns.tsx @@ -0,0 +1,167 @@ +import type { ColumnDef } from "@tanstack/react-table"; +import { Badge } from "@/components/ui/badge"; +import type { Booking } from "@/types/models"; +import { STATUS_VARIANT } from "@/constants/statusVariants"; +import { minutesToTime } from "@/utils/bookingUtils"; +import { type ActiveModal } from "@/store/useModalStore"; +import { BookingDetailPanel } from "@/components/common/panels/BookingDetailPanel"; + +export function useOwnerBookingColumns({ + openModal, + onMarkPaid, + onCancelPending, +}: { + openModal: (opts: Omit) => void; + onMarkPaid?: (bookingId: string) => void; + onCancelPending?: (bookingId: string) => void; +}): ColumnDef[] { + return [ + { + accessorKey: "_id", + header: "Booking ID", + cell: ({ row }) => { + const id: string = row.original._id; + return ( + + openModal({ + title: `Booking Details`, + size: "xl", + component: BookingDetailPanel, + data: { ...row.original, userRole: "owner" }, + actions: [], + }) + } + > + + BMV-{id.slice(-6).toUpperCase()} + {row.original.paymentMethod === "offline" && ( + + Offline + + )} + + + ); + }, + }, + { + accessorKey: "date", + header: "Date", + cell: ({ row }) => ( +
+

{row.original.date}

+

+ {minutesToTime(row.original.startTime)} —{" "} + {minutesToTime(row.original.endTime)} +

+
+ ), + }, + { + accessorKey: "bookerName", + header: "Customer", + cell: ({ row }) => ( +
+ openModal({ + title: `Booking Details`, + size: "xl", + component: BookingDetailPanel, + data: { ...row.original, userRole: "owner" }, + actions: [], + }) + } + > +

{row.original.bookerName ?? "—"}

+

+ {row.original.bookerPhone ?? ""} +

+ {row.original.bookerEmail && ( +

+ {row.original.bookerEmail} +

+ )} +
+ ), + }, + { + accessorKey: "totalPrice", + header: "Amount", + cell: ({ row }) => ( + + ₹{(row.original.price as number)?.toLocaleString("en-IN") ?? 0} + + ), + }, + { + accessorKey: "paymentMethod", + header: "Method", + cell: ({ row }) => ( + + {(row.original.paymentMethod as string) ?? "online"} + + ), + }, + { + accessorKey: "paymentStatus", + header: "Payment", + cell: ({ row }) => ( + + {(row.original.paymentStatus as string)?.toUpperCase() || "—"} + + ), + }, + { + accessorKey: "status", + header: "Status", + cell: ({ row }) => { + const displayStatus = row.original.uiStatus ?? row.original.status; + return ( + + {(displayStatus as string).toUpperCase()} + + ); + }, + }, + { + id: "actions", + header: "Actions", + cell: ({ row }) => { + const paymentStatus = row.original.paymentStatus as string; + if (paymentStatus === "pending") { + return ( +
+ + +
+ ); + } + return null; + }, + }, + ]; +} diff --git a/admin/src/components/calendar/BlockDateDialog.tsx b/admin/src/components/calendar/BlockDateDialog.tsx new file mode 100644 index 0000000000..804ca28739 --- /dev/null +++ b/admin/src/components/calendar/BlockDateDialog.tsx @@ -0,0 +1,90 @@ +import { Lock } from "lucide-react"; +import { + Dialog, + DialogContent, + DialogDescription, + DialogFooter, + DialogHeader, + DialogTitle, +} from "@/components/ui/dialog"; +import { Button } from "@/components/ui/button"; + +export function BlockDateDialog({ + confirmOpen, + setConfirmOpen, + selectedDate, + setSelectedDate, + isCurrentlyBlocked, + handleConfirmAction, + blockPending, + unblockPending, +}: { + confirmOpen: boolean; + setConfirmOpen: (open: boolean) => void; + selectedDate: Date | null; + setSelectedDate: (date: Date | null) => void; + isCurrentlyBlocked: boolean; + handleConfirmAction: () => void; + blockPending: boolean; + unblockPending: boolean; +}) { + return ( + { + setConfirmOpen(o); + if (!o) setSelectedDate(null); + }} + > + + + + + {isCurrentlyBlocked ? "Unblock Date" : "Block Date"} + + + Are you sure you want to {isCurrentlyBlocked ? "unblock" : "block"}{" "} + + {selectedDate + ? selectedDate.toLocaleDateString("en-IN", { + weekday: "long", + year: "numeric", + month: "long", + day: "numeric", + }) + : ""} + + ?{" "} + {isCurrentlyBlocked + ? "Customers will be able to book on this date again." + : "Customers will not be able to book on this date."} + + + + + + + + + ); +} diff --git a/admin/src/components/calendar/BlockedDatesTable.tsx b/admin/src/components/calendar/BlockedDatesTable.tsx new file mode 100644 index 0000000000..05684b26d2 --- /dev/null +++ b/admin/src/components/calendar/BlockedDatesTable.tsx @@ -0,0 +1,91 @@ +import { Unlock } from "lucide-react"; +import type { ColumnDef } from "@tanstack/react-table"; +import { Badge } from "@/components/ui/badge"; +import { Button } from "@/components/ui/button"; +import { DataTable } from "@/components/ui/data-table"; + +import type { BlockedDate } from "@/types/models"; +import type { UseMutationResult } from "@tanstack/react-query"; + +export function BlockedDatesTable({ + tablePage, + setTablePage, + paginatedData, + totalPages, + isLoading, + unblockMutation, +}: { + tablePage: number; + setTablePage: (page: number) => void; + + paginatedData: BlockedDate[]; + totalPages: number; + isLoading: boolean; + + unblockMutation: UseMutationResult< + unknown, + unknown, + { venueId: string; dates: string[] }, + unknown + >; +}) { + const columns: ColumnDef[] = [ + { + accessorKey: "dateObj", + header: "Date", + cell: ({ row }) => + row.original.dateObj.toLocaleDateString("en-IN", { + weekday: "short", + year: "numeric", + month: "short", + day: "numeric", + }), + }, + { + accessorKey: "isPast", + header: "Status", + cell: ({ row }) => + row.original.isPast ? ( + Past + ) : ( + + Upcoming + + ), + }, + { + id: "actions", + cell: ({ row }) => ( + + ), + }, + ]; + + return ( +
+ +
+ ); +} diff --git a/admin/src/components/calendar/CalendarLegend.tsx b/admin/src/components/calendar/CalendarLegend.tsx new file mode 100644 index 0000000000..dbc6b8cd78 --- /dev/null +++ b/admin/src/components/calendar/CalendarLegend.tsx @@ -0,0 +1,45 @@ +export function CalendarLegend({ + hasTempBlock, + hasInactivityBlock, +}: { + hasTempBlock?: boolean; + hasInactivityBlock?: boolean; +}) { + return ( +
+ + ); +}; + +export default BookingCheckout; diff --git a/client/src/pages/Explore/components/VenueMap.tsx b/client/src/pages/Explore/components/VenueMap.tsx new file mode 100644 index 0000000000..43b1a836f5 --- /dev/null +++ b/client/src/pages/Explore/components/VenueMap.tsx @@ -0,0 +1,219 @@ +import { useEffect, useRef } from 'react'; +import L from 'leaflet'; +import 'leaflet/dist/leaflet.css'; +import { useVenuePins, type VenuePin } from '@/hooks/useVenuePins'; +import { + DEFAULT_MAP_CENTER, + DEFAULT_MAP_ZOOM, + MAP_MAX_ZOOM, + MAP_DEBOUNCE_MS, +} from '@/constants/map'; + +interface VenueMapProps { + onBBoxChange?: (bbox: { swLng: number; swLat: number; neLng: number; neLat: number }) => void; + selectedVenueId?: string; + onPinClick?: (venue: VenuePin) => void; + venues?: Array<{ + _id: string; + name: string; + location: { coordinates: [number, number] }; + coverImage: string; + avgRating?: number; + }>; +} + +export function VenueMap({ onBBoxChange, selectedVenueId, onPinClick, venues }: VenueMapProps) { + const mapContainer = useRef(null); + const mapRef = useRef(null); + const { pins, fetchPins, loading, error } = useVenuePins(); + const debounceTimerRef = useRef | null>(null); + const fetchPinsRef = useRef(fetchPins); + const onBBoxChangeRef = useRef(onBBoxChange); + + useEffect(() => { + fetchPinsRef.current = fetchPins; + onBBoxChangeRef.current = onBBoxChange; + }, [fetchPins, onBBoxChange]); + + useEffect(() => { + // Initialize map + const initMap = () => { + try { + if (!mapContainer.current) return; + + // Create map centered on Kerala, India + const map = L.map(mapContainer.current, { + center: DEFAULT_MAP_CENTER, + zoom: DEFAULT_MAP_ZOOM, + zoomControl: true, + scrollWheelZoom: true, + }); + + // Add OpenStreetMap tiles + L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', { + attribution: '© OpenStreetMap contributors', + maxZoom: MAP_MAX_ZOOM, + }).addTo(map); + + mapRef.current = map; + + // Fetch pins on map move + const handleMapMove = () => { + if (debounceTimerRef.current) clearTimeout(debounceTimerRef.current); + + const timer = setTimeout(() => { + const bounds = map.getBounds(); + const bbox = { + swLng: bounds.getWest(), + swLat: bounds.getSouth(), + neLng: bounds.getEast(), + neLat: bounds.getNorth(), + }; + onBBoxChangeRef.current?.(bbox); + fetchPinsRef.current(bbox); + }, MAP_DEBOUNCE_MS); + + debounceTimerRef.current = timer; + }; + + map.on('moveend', handleMapMove); + + // Fetch initial pins + const initialBounds = map.getBounds(); + fetchPinsRef.current({ + swLng: initialBounds.getWest(), + swLat: initialBounds.getSouth(), + neLng: initialBounds.getEast(), + neLat: initialBounds.getNorth(), + }); + + return () => { + map.off('moveend', handleMapMove); + if (debounceTimerRef.current) clearTimeout(debounceTimerRef.current); + }; + } catch (err) { + console.error('Failed to initialize map:', err); + } + }; + + initMap(); + }, []); + + // Add/update markers when pins or venues change + useEffect(() => { + if (!mapRef.current) return; + + const pinsToShow = + venues && venues.length > 0 + ? venues.map((v) => ({ + _id: v._id, + name: v.name, + location: v.location, + coverImage: v.coverImage, + avgRating: v.avgRating || 0, + })) + : pins; + + if (!pinsToShow.length) return; + + const updateMarkers = () => { + // Clear existing markers + if (mapRef.current?.eachLayer) { + mapRef.current.eachLayer((layer: unknown) => { + if (L.Marker && layer instanceof L.Marker && mapRef.current?.removeLayer) { + mapRef.current.removeLayer(layer); + } + }); + } + + // Add new markers + pinsToShow.forEach((pin: VenuePin) => { + const [lng, lat] = pin.location.coordinates; + + const marker = L.marker([lat, lng], { + title: pin.name, + }).addTo(mapRef.current!); + + // Popup with venue info — build DOM programmatically to prevent XSS + const popupDiv = document.createElement('div'); + popupDiv.style.maxWidth = '200px'; + + const img = document.createElement('img'); + // Validate coverImage is HTTPS to prevent protocol-based XSS + if (pin.coverImage && pin.coverImage.startsWith('https://')) { + img.src = pin.coverImage; + } else { + img.src = '/placeholder-venue.png'; // Fallback to safe placeholder + } + img.alt = pin.name; + img.style.cssText = + 'width: 100%; height: 120px; object-fit: cover; border-radius: 4px; margin-bottom: 8px;'; + popupDiv.appendChild(img); + + const title = document.createElement('h4'); + title.textContent = pin.name; + title.style.cssText = 'margin: 0 0 4px 0; font-size: 14px;'; + popupDiv.appendChild(title); + + const rating = document.createElement('div'); + rating.textContent = `⭐ ${pin.avgRating.toFixed(1)}`; + rating.style.cssText = 'font-size: 12px; color: var(--text-secondary);'; + popupDiv.appendChild(rating); + + marker.bindPopup(popupDiv); + + // Handle marker click + marker.on('click', () => { + onPinClick?.(pin); + }); + + // Highlight selected venue + if (selectedVenueId === pin._id) { + marker.setIcon( + L.icon({ + iconUrl: + 'data:image/svg+xml;utf8,', + iconSize: [32, 32], + iconAnchor: [16, 16], + }) + ); + } + }); + }; + + try { + updateMarkers(); + } catch (err) { + console.error(err); + } + }, [pins, venues, selectedVenueId, onPinClick]); + + return ( +
+
+ + {loading && ( +
+ Loading venues... +
+ )} + + {error && ( +
+ {error} +
+ )} + +
+ {pins.length} venue{pins.length !== 1 ? 's' : ''} found +
+
+ ); +} diff --git a/client/src/pages/Explore/index.tsx b/client/src/pages/Explore/index.tsx new file mode 100644 index 0000000000..d33ad94989 --- /dev/null +++ b/client/src/pages/Explore/index.tsx @@ -0,0 +1,191 @@ +import { useState, useRef, useCallback, useEffect } from 'react'; +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from '@/components/ui/select'; +import { Button } from '@/components/ui/button'; +import { useExploreVenues } from '@/hooks/useExploreVenues'; +import { useDebounce } from '@/hooks/useDebounce'; +import { useToggleWishlist, useWishlistSync } from '@/hooks/useWishlist'; +import type { VenueFilters } from '@/types/venue.types'; +import { FILTER_PRICE_STEPS } from '@/constants'; +import { Filter } from 'lucide-react'; +import { ExploreFilters } from '@/components/explore/ExploreFilters'; +import { VenueGrid } from '@/components/explore/VenueGrid'; + +const ExplorePage = () => { + const [filters, setFilters] = useState({}); + const [searchTerm, setSearchTerm] = useState(''); + const [isMobileFiltersOpen, setIsMobileFiltersOpen] = useState(false); + const [priceRangeIndex, setPriceRangeIndex] = useState<[number, number]>([ + 0, + FILTER_PRICE_STEPS.length - 1, + ]); + const [isScrolled, setIsScrolled] = useState(false); + const [togglingVenues, setTogglingVenues] = useState>(new Set()); + + const { toggleWishlist: toggleWishlistFn } = useToggleWishlist(); + useWishlistSync(); + + useEffect(() => { + const handleScroll = () => setIsScrolled(window.scrollY > 200); + window.addEventListener('scroll', handleScroll); + return () => window.removeEventListener('scroll', handleScroll); + }, []); + + const debouncedSearchTerm = useDebounce(searchTerm, 400); + const debouncedPriceRangeIndex = useDebounce(priceRangeIndex, 400); + + const { data, isLoading, isError, hasNextPage, fetchNextPage, isFetchingNextPage, isFetching } = + useExploreVenues({ + ...filters, + searchTerm: debouncedSearchTerm || undefined, + minPrice: FILTER_PRICE_STEPS[debouncedPriceRangeIndex[0]], + maxPrice: FILTER_PRICE_STEPS[debouncedPriceRangeIndex[1]], + }); + + const handleToggleWishlist = useCallback( + async (venueId: string, e: React.MouseEvent) => { + e.preventDefault(); + e.stopPropagation(); + setTogglingVenues((prev) => new Set([...prev, venueId])); + try { + await toggleWishlistFn(venueId); + } finally { + setTogglingVenues((prev) => { + const next = new Set(prev); + next.delete(venueId); + return next; + }); + } + }, + [toggleWishlistFn] + ); + + const observerRef = useRef(null); + const lastVenueElementRef = useCallback( + (node: HTMLDivElement | null) => { + if (isLoading || isFetchingNextPage) return; + if (observerRef.current) observerRef.current.disconnect(); + observerRef.current = new IntersectionObserver((entries) => { + if (entries[0].isIntersecting && hasNextPage) { + fetchNextPage(); + } + }); + if (node) observerRef.current.observe(node); + }, + [isLoading, isFetchingNextPage, hasNextPage, fetchNextPage] + ); + + const handleClearFilters = () => { + setFilters({}); + setSearchTerm(''); + setPriceRangeIndex([0, FILTER_PRICE_STEPS.length - 1]); + }; + + const venues = data?.pages.flatMap((page) => page.venues) || []; + const totalVenues = data?.pages[0]?.pagination?.total || 0; + + return ( +
+
+ + +
+
+
+

+ Find Your Perfect Venue +

+
+

+ Discover halls, resorts, auditoriums, turfs and more for every occasion. +

+
+ +
+ + setSearchTerm(e.target.value)} + /> +
+
+ +
+

+ {totalVenues} Venues Found +

+ +
+ + + + {isFetchingNextPage && ( +
+
+
+ )} +
+
+
+
+ ); +}; + +export default ExplorePage; diff --git a/client/src/pages/Explore/venueDetails/components/BookingSidebar.tsx b/client/src/pages/Explore/venueDetails/components/BookingSidebar.tsx new file mode 100644 index 0000000000..4e86a19179 --- /dev/null +++ b/client/src/pages/Explore/venueDetails/components/BookingSidebar.tsx @@ -0,0 +1,279 @@ +import { FiCalendar } from 'react-icons/fi'; +import { Calendar } from '@/components/ui/calendar'; +import { toLocalDateString } from '@/utils/timeUtils'; +import type { VenueDetail } from '@/types/venue.types'; +import type { Slot } from '@/types/booking.types'; +import { BOOKING_TYPES } from '@/constants/venueConstants'; + +interface BookingSidebarProps { + venue: VenueDetail; + selectedSlots: Slot[]; + setSelectedSlots: (slots: Slot[]) => void; + selectedDate: string; + setSelectedDate: (date: string) => void; + calendarVisible: boolean; + setCalendarVisible: (visible: boolean) => void; + bookableDatesData: { disabledDates: string[]; maxDate: string } | undefined; + isCalendarLoading: boolean; + availabilityResponse: + | { + slots: { + slotId: string; + name: string | null; + startTime: string; + endTime: string; + price: number; + isAvailable: boolean; + reason: string | null; + }[]; + } + | undefined; + isSlotsLoading: boolean; + totalPrice: number; + finalStartTime: string | null; + finalEndTime: string | null; + handleSlotSelect: (slot: Slot) => void; + handleProceedToBook: () => void; + isBlocking: boolean; + getStartingPrice: () => string; +} + +export function BookingSidebar({ + venue, + selectedSlots, + setSelectedSlots, + selectedDate, + setSelectedDate, + calendarVisible, + setCalendarVisible, + bookableDatesData, + isCalendarLoading, + availabilityResponse, + isSlotsLoading, + totalPrice, + finalStartTime, + finalEndTime, + handleSlotSelect, + handleProceedToBook, + isBlocking, +}: BookingSidebarProps) { + return ( +
+
+ + Booking + + +

Reserve your venue

+ +

+ Pick a date, choose your slots and continue to payment. +

+
+ +
+
+ + {!calendarVisible && selectedDate && ( + + )} +
+ +
+ {isCalendarLoading ? ( +
+
+
+ ) : ( +
+ { + if (date) { + const formatted = toLocalDateString(date); + setSelectedDate(formatted); + setSelectedSlots([]); + setCalendarVisible(false); + } + }} + disabled={(date) => { + if (!bookableDatesData) return true; + + const dateStr = toLocalDateString(date); + if (bookableDatesData.disabledDates.includes(dateStr)) { + return true; + } + + const today = new Date(); + today.setHours(0, 0, 0, 0); + const tomorrow = new Date(today); + tomorrow.setDate(tomorrow.getDate() + 1); + const maxDate = new Date(today); + maxDate.setDate(maxDate.getDate() + 90); + return date < tomorrow || date > maxDate; + }} + startMonth={new Date()} + endMonth={ + bookableDatesData?.maxDate + ? new Date(bookableDatesData.maxDate + 'T00:00:00') + : undefined + } + className="rounded-xl w-full flex justify-center" + /> +
+ )} +
+ + {!calendarVisible && selectedDate && ( +
+
+
+ +
+ + Date + +
+

+ {new Date(selectedDate + 'T00:00:00').toLocaleDateString('en-GB', { + weekday: 'short', + day: 'numeric', + month: 'short', + year: 'numeric', + })} +

+
+ )} +
+ +
+
+

+ Available Slots +

+ + {venue?.bookingType === BOOKING_TYPES.FIXED ? 'Fixed' : 'Flexible'} + +
+ + {isSlotsLoading ? ( +
+
+

+ Calculating availability... +

+
+ ) : ( +
+ {!availabilityResponse?.slots || availabilityResponse.slots.length === 0 ? ( +
+ {selectedDate + ? 'No slots available for the selected date.' + : 'Please pick a date to check slots availability.'} +
+ ) : ( +
+ {availabilityResponse.slots.map((slot) => { + const isSelected = selectedSlots.some((s) => s.slotId === slot.slotId); + return ( + + ); + })} +
+ )} +
+ )} +
+ +
+
+
+

Total

+ +

₹{totalPrice}

+
+ +
+

+ {selectedSlots.length} {selectedSlots.length === 1 ? 'Slot' : 'Slots'} +

+ + {finalStartTime && finalEndTime && ( +

+ {finalStartTime} → {finalEndTime} +

+ )} +
+
+
+ + +
+ ); +} diff --git a/client/src/pages/Explore/venueDetails/components/ReviewList.tsx b/client/src/pages/Explore/venueDetails/components/ReviewList.tsx new file mode 100644 index 0000000000..a86d50a0e9 --- /dev/null +++ b/client/src/pages/Explore/venueDetails/components/ReviewList.tsx @@ -0,0 +1,146 @@ +import type { Review } from '@/services/reviewService'; + +interface ReviewListProps { + isReviewsLoading: boolean; + reviews: Review[]; + pagination: { totalPages: number; page: number; total: number } | null; + fetchReviews: (venueId: string, page?: number) => void; + id: string | undefined; +} + +export function ReviewList({ + isReviewsLoading, + reviews, + pagination, + fetchReviews, + id, +}: ReviewListProps) { + if (isReviewsLoading) { + return ( +
+
+
+ ); + } + + if (reviews.length === 0) { + return ( +

+ No reviews yet. Be the first to drop some genuine review in! +

+ ); + } + + return ( +
+ {reviews.map((review) => ( +
+
+
+
+ {review.user.userName.charAt(0).toUpperCase()} +
+ {review.ownerReply &&
} +
+ +
+
+
+

+ {review.user.userName} +

+ {review.user.isVerified && ( + + Verified Customer + + )} +
+
+ {review.rating !== undefined && ( + + {[...Array(5)].map((_, i) => ( + + ★ + + ))} + + )} + + {new Date(review.createdAt).toLocaleDateString('en-GB', { + day: 'numeric', + month: 'short', + year: 'numeric', + })} + +
+
+ {review.comment && ( +

+ {review.comment} +

+ )} +
+ + {review.ownerReply && ( + <> +
+
+
+ +
+
+
+ O +
+
+
+ + Owner + + + {new Date(review.ownerReply.repliedAt).toLocaleDateString('en-GB', { + day: 'numeric', + month: 'short', + year: 'numeric', + })} + +
+

+ {review.ownerReply.text} +

+
+
+
+ + )} +
+
+ ))} + + {pagination && pagination.totalPages > 1 && ( +
+ {[...Array(pagination.totalPages)].map((_, i) => ( + + ))} +
+ )} +
+ ); +} diff --git a/client/src/pages/Explore/venueDetails/index.tsx b/client/src/pages/Explore/venueDetails/index.tsx new file mode 100644 index 0000000000..a4e431c4c5 --- /dev/null +++ b/client/src/pages/Explore/venueDetails/index.tsx @@ -0,0 +1,326 @@ +import { useState, useEffect } from 'react'; +import { useParams, Link } from 'react-router'; +import { FiMapPin, FiArrowRight } from 'react-icons/fi'; +import { TbBuildingOff } from 'react-icons/tb'; + +import { useApiQuery, useApiMutation } from '@/hooks/useApi'; +import { useVenueReviews } from '@/hooks/useVenueReviews'; +import { useAuth } from '@/hooks/useAuth'; +import { useToast } from '@/hooks/useToast'; +import { API_ENDPOINTS } from '@/constants'; +import { BOOKING_TYPES, PRICING_TYPES } from '@/constants/venueConstants'; +import type { VenueDetail } from '@/types/venue.types'; +import { Skeleton } from '@/components/ui/skeleton'; +import { Button } from '@/components/ui/button'; +import { Dialog, DialogContent, DialogTrigger } from '@/components/ui/dialog'; +import ReviewModal from '@/components/common/ReviewModal'; +import type { AxiosError } from 'axios'; + +import { VenueGallery } from '@/components/venue/VenueGallery'; +import { VenueAmenities } from '@/components/venue/VenueAmenities'; +import { VenueInfo } from '@/components/venue/VenueInfo'; + +// Extracted components & hooks +import { useVenueBooking } from '@/hooks/useVenueBooking'; +import { BookingSidebar } from './components/BookingSidebar'; +import { ReviewList } from './components/ReviewList'; + +const VenueDetails = () => { + const { id } = useParams<{ id: string }>(); + const { user } = useAuth(); + const { success, error: showError } = useToast(); + + const [showReviewModal, setShowReviewModal] = useState(false); + const [isReviewsExpanded, setIsReviewsExpanded] = useState(false); + + const { reviews, pagination, isLoading: isReviewsLoading, fetchReviews } = useVenueReviews(); + + useEffect(() => { + if (id) { + fetchReviews(id); + } + }, [id, fetchReviews]); + + const { + data: venue, + isLoading, + isError, + refetch, + } = useApiQuery( + ['venue', id || ''], + { + url: API_ENDPOINTS.VENUE_BY_ID(id as string), + method: 'GET', + }, + { + enabled: !!id, + } + ); + + const booking = useVenueBooking(id, venue); + + const submitReviewMutation = useApiMutation( + { + url: API_ENDPOINTS.VENUE_REVIEWS(id as string), + method: 'POST', + }, + { + onSuccess: () => { + success('Review submitted successfully'); + setShowReviewModal(false); + fetchReviews(id || ''); + }, + onError: (err: Error) => { + const axiosErr = err as AxiosError<{ message: string }>; + showError(axiosErr?.response?.data?.message || 'Failed to submit review'); + }, + } + ); + + if (isLoading) { + return ( +
+
+
+
+ + +
+ + + +
+
+ +
+
+
+ ); + } + + if (isError || !venue) { + return ( +
+
+
+ +
+

Venue Not Found

+

+ The venue you're looking for doesn't exist or may have been removed. +

+
+ + + ← Go to Explore + +
+
+
+ ); + } + + const images = venue.coverImage ? [venue.coverImage, ...(venue.galleryImages || [])] : []; + const amenities = venue.amenities || []; + + const getStartingPrice = () => { + if (venue.bookingType === 'flexibleBooking' && venue.pricing) { + return `₹${venue.pricing.basePrice}/${venue.pricing.pricingType === PRICING_TYPES.FIXED ? 'slot' : 'hr'}`; + } + if (venue.bookingType === BOOKING_TYPES.FIXED && venue.fixedPackages?.length > 0) { + const minPrice = Math.min(...venue.fixedPackages.map((p) => p.price)); + return `₹${minPrice}`; + } + return '--'; + }; + + return ( +
+
+
+
+
+
+ + Explore + + / + {venue.city?.toLowerCase() || 'Unknown City'} + / + + {venue.name?.toLowerCase() || 'Unknown Venue'} + +
+

+ {venue.name} +

+
+

+ + {venue.city}, {venue.district} +

+
+ + {venue.venueType} + +
+
+ + + + + +
+
setIsReviewsExpanded(!isReviewsExpanded)} + > +
+

+ Reviews & Ratings +

+
+ + {venue?.avgRating ? venue.avgRating.toFixed(1) : 'New'} ★ + + + ({pagination?.total ?? venue?.reviewCount ?? 0} reviews) + +
+
+
+ {isReviewsExpanded ? 'Hide' : 'View all'} +
+
+ + {isReviewsExpanded && ( +
+
+

All Reviews

+ {user && ( + + )} +
+ +
+ )} +
+ +
+
+
+

+ Reviews & Ratings +

+ {venue?.avgRating && ( +
+ + + {venue.avgRating.toFixed(1)} + + + ({pagination?.total ?? venue.reviewCount ?? 0} reviews) + +
+ )} +
+ {user && ( + + )} +
+ +
+
+
+ +
+
+ +
+
+
+ +
+ + + + + + + + + +
+ + { + await submitReviewMutation.mutateAsync({ rating, comment }); + }} + /> +
+ ); +}; + +export default VenueDetails; diff --git a/client/src/pages/NotFound/index.tsx b/client/src/pages/NotFound/index.tsx new file mode 100644 index 0000000000..aa64260a92 --- /dev/null +++ b/client/src/pages/NotFound/index.tsx @@ -0,0 +1,45 @@ +import { useNavigate } from 'react-router'; +import { Button } from '@/components/ui/button'; +import { FiHome, FiArrowLeft, FiAlertOctagon } from 'react-icons/fi'; + +const NotFound = () => { + const navigate = useNavigate(); + + return ( +
+
+ {/* Animated Background Ring */} +
+
+ +
+
+ +

404

+

Page Not Found

+ +

+ The venue you are looking for, or the page you requested, might have been moved, deleted, or + is temporarily unavailable. +

+ +
+ + +
+
+ ); +}; + +export default NotFound; diff --git a/client/src/pages/Profile/DevicesCard.tsx b/client/src/pages/Profile/DevicesCard.tsx new file mode 100644 index 0000000000..fcc3d9abb2 --- /dev/null +++ b/client/src/pages/Profile/DevicesCard.tsx @@ -0,0 +1,152 @@ +import { useMemo, useState } from 'react'; +import { formatDistanceToNow } from 'date-fns'; +import { FiMonitor } from 'react-icons/fi'; +import { useSessions } from '@/hooks/useSessions'; +import { useToast } from '@/hooks/useToast'; +import { extractErrorMessage } from '@/utils/toast'; +import { parseUserAgent } from '@/utils/parseUserAgent'; +import * as authService from '@/services/authService'; +import Spinner from '@/components/common/Spinner'; + +const NEW_SESSION_REVOKE_LOCK_MS = 48 * 60 * 60 * 1000; + +const DevicesCard = () => { + const { data: sessions, isLoading, refetch } = useSessions(); + const toast = useToast(); + const [revokingId, setRevokingId] = useState(null); + const [revokingOthers, setRevokingOthers] = useState(false); + const [now] = useState(() => Date.now()); + + const currentSession = useMemo(() => sessions?.find((s) => s.isCurrent), [sessions]); + + const lockInfo = useMemo(() => { + if (!currentSession) return { locked: false, unlocksAt: null as Date | null }; + + const currentAgeMs = now - new Date(currentSession.createdAt).getTime(); + if (currentAgeMs >= NEW_SESSION_REVOKE_LOCK_MS) return { locked: false, unlocksAt: null }; + + const hasOlderSession = (sessions ?? []).some( + (s) => !s.isCurrent && new Date(s.createdAt) < new Date(currentSession.createdAt) + ); + + return { + locked: hasOlderSession, + unlocksAt: new Date( + new Date(currentSession.createdAt).getTime() + NEW_SESSION_REVOKE_LOCK_MS + ), + }; + }, [sessions, currentSession, now]); + + const anyActionInFlight = revokingId !== null || revokingOthers; + + const handleRevoke = async (sessionId: string) => { + if (anyActionInFlight) return; + setRevokingId(sessionId); + try { + await authService.revokeSession(sessionId); + toast.success('Device signed out'); + refetch(); + } catch (error) { + toast.error(extractErrorMessage(error) || 'Failed to sign out that device'); + } finally { + setRevokingId(null); + } + }; + + const handleRevokeOthers = async () => { + if (anyActionInFlight) return; + setRevokingOthers(true); + try { + const result = await authService.logoutOtherSessions(); + toast.success(`Signed out ${result.revokedCount} other device(s)`); + refetch(); + } catch (error) { + toast.error(extractErrorMessage(error) || 'Failed to sign out other devices'); + } finally { + setRevokingOthers(false); + } + }; + + const lockTooltip = lockInfo.unlocksAt + ? `Unlocks ${formatDistanceToNow(lockInfo.unlocksAt, { addSuffix: true })}` + : undefined; + + return ( +
+
+
+ + Devices +
+ {sessions && sessions.length > 1 && ( + + )} +
+ +
+ {isLoading && ( +

+ + Loading devices... +

+ )} + + {sessions?.map((session) => { + const isBlocked = + !session.isCurrent && + lockInfo.locked && + currentSession && + new Date(session.createdAt) < new Date(currentSession.createdAt); + + return ( +
+
+
+

+ {parseUserAgent(session.userAgent)} +

+ {session.isCurrent && ( + + This device + + )} +
+

+ {session.ipAddress} · Active{' '} + {formatDistanceToNow(new Date(session.lastLogin), { addSuffix: true })} +

+
+ + {!session.isCurrent && ( + + )} +
+ ); + })} +
+
+ ); +}; + +export default DevicesCard; diff --git a/client/src/pages/Profile/IdentityCard.tsx b/client/src/pages/Profile/IdentityCard.tsx new file mode 100644 index 0000000000..7831ad30da --- /dev/null +++ b/client/src/pages/Profile/IdentityCard.tsx @@ -0,0 +1,214 @@ +import { useRef, useState } from 'react'; +import { FiUser, FiCamera, FiCheck, FiX, FiEdit2, FiTrash2 } from 'react-icons/fi'; +import { useAuth } from '@/hooks/useAuth'; +import { useAvatarUpload } from '@/hooks/useAvatarUpload'; +import { updateProfile, deleteProfilePicture } from '@/services/userService'; +import { useToast } from '@/hooks/useToast'; +import { extractErrorMessage } from '@/utils/toast'; +import ImageLightbox from '@/components/common/ImageLightbox'; +import AvatarCropEditor from '@/components/common/AvatarCropEditor'; +import Spinner from '@/components/common/Spinner'; + +const IdentityCard = () => { + const { user, updateUser } = useAuth(); + const { uploadAvatar } = useAvatarUpload(); + const toast = useToast(); + const fileInputRef = useRef(null); + + const [editingName, setEditingName] = useState(false); + const [nameDraft, setNameDraft] = useState(user?.username ?? ''); + const [savingName, setSavingName] = useState(false); + + const [viewerOpen, setViewerOpen] = useState(false); + const [cropSrc, setCropSrc] = useState(null); + const [savingAvatar, setSavingAvatar] = useState(false); + const [deleting, setDeleting] = useState(false); + + const handleAvatarClick = () => fileInputRef.current?.click(); + + const handleFileChange = (e: React.ChangeEvent) => { + const file = e.target.files?.[0]; + e.target.value = ''; + if (!file) return; + setCropSrc(URL.createObjectURL(file)); + }; + + const closeCropEditor = () => { + if (cropSrc) URL.revokeObjectURL(cropSrc); + setCropSrc(null); + }; + + const handleCropSave = async (croppedFile: File) => { + setSavingAvatar(true); + try { + const publicId = await uploadAvatar(croppedFile); + try { + const profile = await updateProfile({ profilePicturePublicId: publicId }); + updateUser({ profilePicture: profile.profilePicture }); + toast.success('Profile picture updated'); + closeCropEditor(); + } catch (error) { + toast.error(extractErrorMessage(error) || 'Failed to save profile picture'); + } + } catch { + // useAvatarUpload already has its own error toast for thee upload step + } finally { + setSavingAvatar(false); + } + }; + + const handleDelete = async () => { + if (deleting) return; + if (!window.confirm('Remove your profile picture?')) return; + + setDeleting(true); + try { + await deleteProfilePicture(); + updateUser({ profilePicture: undefined }); + toast.success('Profile picture removed'); + } catch (error) { + toast.error(extractErrorMessage(error) || 'Failed to remove profile picture'); + } finally { + setDeleting(false); + } + }; + + const startEditingName = () => { + setNameDraft(user?.username ?? ''); + setEditingName(true); + }; + + const cancelEditingName = () => setEditingName(false); + + const saveName = async () => { + if (savingName) return; + const trimmed = nameDraft.trim(); + if (!trimmed || trimmed === user?.username) { + setEditingName(false); + return; + } + + setSavingName(true); + try { + const profile = await updateProfile({ username: trimmed }); + updateUser({ username: profile.name }); + toast.success('Name updated'); + setEditingName(false); + } catch (error) { + toast.error(extractErrorMessage(error) || 'Failed to update name'); + } finally { + setSavingName(false); + } + }; + + return ( +
+
+ + + {user?.profilePicture && ( + + )} + +
+ +
+ {editingName ? ( +
+ setNameDraft(e.target.value)} + onKeyDown={(e) => e.key === 'Enter' && saveName()} + disabled={savingName} + className="min-w-0 flex-1 rounded-lg border border-[var(--bg-grey)] bg-[var(--bg-primary)] px-2 py-1 text-sm font-semibold text-[var(--text-primary)] outline-none focus:ring-2 focus:ring-[var(--bg-green)] disabled:opacity-50" + /> + + +
+ ) : ( +
+

{user?.username}

+ +
+ )} +

{user?.email}

+
+ + {viewerOpen && user?.profilePicture && ( + setViewerOpen(false)} /> + )} + + {cropSrc && ( + + )} +
+ ); +}; + +export default IdentityCard; diff --git a/client/src/pages/Profile/SecurityCard.tsx b/client/src/pages/Profile/SecurityCard.tsx new file mode 100644 index 0000000000..83f15d4bd1 --- /dev/null +++ b/client/src/pages/Profile/SecurityCard.tsx @@ -0,0 +1,128 @@ +import { useState } from 'react'; +import { useNavigate } from 'react-router'; +import { FiLock } from 'react-icons/fi'; +import { useAuth } from '@/hooks/useAuth'; +import { useToast } from '@/hooks/useToast'; +import { changePassword } from '@/services/authService'; +import { extractErrorMessage } from '@/utils/toast'; +import Spinner from '@/components/common/Spinner'; + +const SecurityCard = () => { + const { clearSession } = useAuth(); + const toast = useToast(); + const navigate = useNavigate(); + + const [expanded, setExpanded] = useState(false); + const [oldPassword, setOldPassword] = useState(''); + const [newPassword, setNewPassword] = useState(''); + const [confirmPassword, setConfirmPassword] = useState(''); + const [submitting, setSubmitting] = useState(false); + + const reset = () => { + setExpanded(false); + setOldPassword(''); + setNewPassword(''); + setConfirmPassword(''); + }; + + const handleSubmit = async (e: React.FormEvent) => { + e.preventDefault(); + if (submitting) return; + + if (newPassword.length < 8) { + toast.error('New password must be at least 8 characters'); + return; + } + if (newPassword !== confirmPassword) { + toast.error('New passwords do not match'); + return; + } + + setSubmitting(true); + try { + await changePassword(oldPassword, newPassword); + clearSession(); + navigate('/login', { replace: true }); + toast.success('Password changed. Please sign in again.'); + } catch (error) { + toast.error(extractErrorMessage(error) || 'Failed to change password'); + } finally { + setSubmitting(false); + } + }; + + return ( +
+
+
+ + Password +
+ {!expanded && ( + + )} +
+ + {expanded && ( +
+ setOldPassword(e.target.value)} + required + disabled={submitting} + className="w-full rounded-lg border border-[var(--bg-grey)] bg-[var(--bg-primary)] px-3 py-2 text-sm text-[var(--text-primary)] outline-none focus:ring-2 focus:ring-[var(--bg-green)] disabled:opacity-50" + /> + setNewPassword(e.target.value)} + required + disabled={submitting} + className="w-full rounded-lg border border-[var(--bg-grey)] bg-[var(--bg-primary)] px-3 py-2 text-sm text-[var(--text-primary)] outline-none focus:ring-2 focus:ring-[var(--bg-green)] disabled:opacity-50" + /> + setConfirmPassword(e.target.value)} + required + disabled={submitting} + className="w-full rounded-lg border border-[var(--bg-grey)] bg-[var(--bg-primary)] px-3 py-2 text-sm text-[var(--text-primary)] outline-none focus:ring-2 focus:ring-[var(--bg-green)] disabled:opacity-50" + /> +

+ Changing your password signs you out of every device, including this one. +

+
+ + +
+
+ )} +
+ ); +}; + +export default SecurityCard; diff --git a/client/src/pages/Profile/index.tsx b/client/src/pages/Profile/index.tsx new file mode 100644 index 0000000000..09caa28149 --- /dev/null +++ b/client/src/pages/Profile/index.tsx @@ -0,0 +1,42 @@ +import { Link } from 'react-router'; +import { LuCalendarDays } from 'react-icons/lu'; +import { MdOutlineMeetingRoom } from 'react-icons/md'; +import { FiPlusCircle } from 'react-icons/fi'; +import IdentityCard from './IdentityCard'; +import SecurityCard from './SecurityCard'; +import DevicesCard from './DevicesCard'; + +const quickLinks = [ + { to: '/my-bookings', label: 'My Bookings', icon: LuCalendarDays }, + { to: '/list-venue/my-venues', label: 'My Venues', icon: MdOutlineMeetingRoom }, + { to: '/list-venue/add-venue', label: 'Add a Venue', icon: FiPlusCircle }, +]; + +const ProfilePage = () => { + return ( +
+
+

Profile

+ +
+ {quickLinks.map(({ to, label, icon: Icon }) => ( + + + {label} + + ))} +
+ + + + +
+
+ ); +}; + +export default ProfilePage; diff --git a/client/src/pages/Wishlist/index.tsx b/client/src/pages/Wishlist/index.tsx new file mode 100644 index 0000000000..ed2e5d8230 --- /dev/null +++ b/client/src/pages/Wishlist/index.tsx @@ -0,0 +1,205 @@ +import { useEffect, useState } from 'react'; +import { useNavigate } from 'react-router'; +import { useAuth } from '@/hooks/useAuth'; +import { useToast } from '@/hooks/useToast'; +import * as wishlistService from '@/services/wishlistService'; +import { Heart } from 'lucide-react'; +import { Button } from '@/components/ui/button'; + +interface WishlistVenue { + _id: string; + name: string; + city: string; + district: string; + coverImage: string; + maxCapacity?: number; + avgRating: number; + reviewCount: number; +} + +interface PaginationMeta { + total: number; + page: number; + totalPages: number; + hasMore: boolean; +} + +export default function WishlistPage() { + const [venues, setVenues] = useState([]); + const [loading, setLoading] = useState(true); + const [pagination, setPagination] = useState(null); + const [currentPage, setCurrentPage] = useState(1); + + const navigate = useNavigate(); + const { user } = useAuth(); + const { error: showError } = useToast(); + + useEffect(() => { + if (!user) { + navigate('/auth/login'); + return; + } + + const fetchWishlist = async () => { + try { + setLoading(true); + const response = await wishlistService.getMyWishlist(currentPage, 20); + setVenues(response.data?.venues || []); + setPagination(response.data?.pagination || null); + } catch (err) { + const errorMsg = err instanceof Error ? err.message : 'Failed to load wishlist'; + showError(errorMsg); + } finally { + setLoading(false); + } + }; + + fetchWishlist(); + }, [user, currentPage, navigate, showError]); + + const handleViewVenue = (venueId: string) => { + navigate(`/venue/${venueId}`); + }; + + const handleRemoveWishlist = async (venueId: string, e: React.MouseEvent) => { + e.stopPropagation(); + try { + await wishlistService.toggleWishlist(venueId); + setVenues((prev) => prev.filter((v) => v._id !== venueId)); + setPagination((prev) => (prev ? { ...prev, total: Math.max(0, prev.total - 1) } : null)); + } catch (err) { + const errorMsg = err instanceof Error ? err.message : 'Failed to remove from wishlist'; + showError(errorMsg); + } + }; + + if (loading) { + return ( +
+
+
+ ); + } + + if (!venues.length) { + return ( +
+
+
+ +

+ Your wishlist is empty +

+

+ Start adding venues to your wishlist to save them for later +

+ +
+
+
+ ); + } + + return ( +
+
+ {/* Header */} +
+

My Wishlist

+

+ {pagination?.total} venue{pagination?.total !== 1 ? 's' : ''} saved +

+
+ + {/* Venues Grid */} +
+ {venues.map((venue) => ( +
handleViewVenue(venue._id)} + > + {/* Image */} +
+ {venue.coverImage && venue.coverImage.startsWith('https://') ? ( + {venue.name} + ) : ( +
+ )} + +
+ + {/* Content */} +
+

+ {venue.name} +

+

+ {venue.city} + {venue.district && `, ${venue.district}`} +

+ + {/* Rating */} +
+ + ⭐ {(venue.avgRating || 0).toFixed(1)} + + + ({venue.reviewCount || 0} reviews) + +
+ + {/* Capacity */} + {venue.maxCapacity && ( +

+ Capacity: {venue.maxCapacity} guests +

+ )} +
+
+ ))} +
+ + {/* Pagination */} + {pagination && pagination.totalPages > 1 && ( +
+ + +
+ Page {pagination.page} of {pagination.totalPages} +
+ + +
+ )} +
+
+ ); +} diff --git a/client/src/pages/home/components/FeaturedVenues.tsx b/client/src/pages/home/components/FeaturedVenues.tsx new file mode 100644 index 0000000000..b9c2deb835 --- /dev/null +++ b/client/src/pages/home/components/FeaturedVenues.tsx @@ -0,0 +1,69 @@ +import { Link } from 'react-router'; +import { Skeleton } from '@/components/ui/skeleton'; +import { CompactVenueCard } from '@/components/CompactVenueCard'; +import type { PublicVenue } from '@/types/venue.types'; + +interface FeaturedVenuesProps { + isLoading: boolean; + featuredVenues: PublicVenue[]; + togglingVenues: Set; + handleToggleWishlist: (venueId: string, e: React.MouseEvent) => Promise; +} + +export function FeaturedVenues({ + isLoading, + featuredVenues, + togglingVenues, + handleToggleWishlist, +}: FeaturedVenuesProps) { + return ( +
+
+
+
+

+ Featured Properties + On Our Listing +

+
+ + + View All Properties + +
+ +
+ {isLoading + ? Array.from({ length: 8 }).map((_, i) => ( +
+ +
+
+ + + +
+
+
+ )) + : featuredVenues + .slice(0, 8) + .map((venue: PublicVenue) => ( + + ))} +
+
+
+ ); +} diff --git a/client/src/pages/home/components/HeroSection.tsx b/client/src/pages/home/components/HeroSection.tsx new file mode 100644 index 0000000000..78e2d0245a --- /dev/null +++ b/client/src/pages/home/components/HeroSection.tsx @@ -0,0 +1,56 @@ +import { IoLocationOutline, IoSearch } from 'react-icons/io5'; +import heroImage from '@/assets/hero.png'; + +interface HeroSectionProps { + search: string; + setSearch: (search: string) => void; + handleSearch: () => void; +} + +export function HeroSection({ search, setSearch, handleSearch }: HeroSectionProps) { + return ( +
+
+ + Venue Hero + +
+

+ Find the Perfect Venue +
+ for Every Occasion +

+ +

+ Curated spaces for corporate events, weddings, and private gatherings. +

+ +
+
+ + + setSearch(e.target.value)} + className="w-full outline-none bg-transparent text-[var(--text-primary)] placeholder:text-[var(--text-secondary)] text-sm md:text-lg" + /> +
+ + +
+
+
+ ); +} diff --git a/client/src/pages/home/featuredVenues.ts b/client/src/pages/home/featuredVenues.ts new file mode 100644 index 0000000000..bb52c10553 --- /dev/null +++ b/client/src/pages/home/featuredVenues.ts @@ -0,0 +1,46 @@ +export const featuredVenues = [ + { + id: 1, + name: 'Royal Palace Hall', + place: 'Edappally', + price: 1000, + district: 'Ernakulam', + guests: '500 Guests', + rating: 4.8, + image: + 'https://plus.unsplash.com/premium_photo-1664530452329-42682d3a73a7?w=800&auto=format&fit=crop&q=60', + }, + + { + id: 2, + name: 'Grand Celebration Hall', + place: 'Kottakkal', + price: 1000, + district: 'Malappuram', + guests: '300 Guests', + rating: 4.6, + image: 'https://images.unsplash.com/photo-1511578314322-379afb476865?w=800', + }, + + { + id: 3, + name: 'Skyline Event Space', + place: 'Mavoor', + price: 1000, + district: 'Kozhikode', + guests: '200 Guests', + rating: 4.7, + image: 'https://images.unsplash.com/photo-1464366400600-7168b8af9bc3?w=800', + }, + + { + id: 4, + name: 'Green Garden Venue', + place: 'Guruvayur', + price: 1000, + district: 'Thrissur', + guests: '450 Guests', + rating: 4.9, + image: 'https://images.unsplash.com/photo-1517457373958-b7bdd4587205?w=800', + }, +]; diff --git a/client/src/pages/home/index.tsx b/client/src/pages/home/index.tsx new file mode 100644 index 0000000000..9b88600b95 --- /dev/null +++ b/client/src/pages/home/index.tsx @@ -0,0 +1,237 @@ +import { useNavigate } from 'react-router'; +import { useState, useCallback } from 'react'; +import { Link } from 'react-router'; +import { + IoBusinessOutline, + IoCameraOutline, + IoCafeOutline, + IoStarOutline, + IoHomeOutline, + IoLeafOutline, + IoCheckmarkCircle, +} from 'react-icons/io5'; + +import { useApiQuery } from '@/hooks/useApi'; +import { API_ENDPOINTS } from '@/constants'; +import { useToggleWishlist, useWishlistSync } from '@/hooks/useWishlist'; +import type { PublicVenue } from '@/types/venue.types'; + +import { HeroSection } from './components/HeroSection'; +import { FeaturedVenues } from './components/FeaturedVenues'; + +const VENUE_CATEGORIES = [ + { name: 'Wedding Halls', icon: IoStarOutline, value: 'Wedding Hall' }, + { name: 'Corporate Spaces', icon: IoBusinessOutline, value: 'Corporate Space' }, + { name: 'Party Lawns', icon: IoLeafOutline, value: 'Party Lawn' }, + { name: 'Banquet Halls', icon: IoCafeOutline, value: 'Banquet Hall' }, + { name: 'Studios', icon: IoCameraOutline, value: 'Studio' }, + { name: 'Resorts', icon: IoHomeOutline, value: 'Resort' }, +]; + +const HomePage = () => { + const [search, setSearch] = useState(''); + const [togglingVenues, setTogglingVenues] = useState>(new Set()); + + const navigate = useNavigate(); + + const { toggleWishlist: toggleWishlistFn } = useToggleWishlist(); + useWishlistSync(); + + const handleSearch = () => { + const trimmedSearch = search.trim(); + + if (trimmedSearch) { + navigate(`/explore?search=${encodeURIComponent(trimmedSearch)}`); + } else { + navigate('/explore'); + } + }; + + const handleCategoryClick = (category: string) => { + navigate(`/explore?venueTypes=${encodeURIComponent(category)}`); + }; + + const { + data: featuredVenues = [], + isLoading, + isSuccess, + } = useApiQuery(['featured-venues'], { + method: 'GET', + url: API_ENDPOINTS.FEATURED_VENUES, + }); + + const handleToggleWishlist = useCallback( + async (venueId: string, e: React.MouseEvent) => { + e.preventDefault(); + e.stopPropagation(); + + setTogglingVenues((prev) => new Set([...prev, venueId])); + + try { + await toggleWishlistFn(venueId); + } finally { + setTogglingVenues((prev) => { + const next = new Set(prev); + next.delete(venueId); + return next; + }); + } + }, + [toggleWishlistFn] + ); + + return ( +
+ {/* Hero Section */} +
+ + + {/* Features Strip */} +
+
+
+ +

Verified Venues

+
+

+ Handpicked and verified spaces for your perfect event. +

+
+ +
+
+ +

Transparent Pricing

+
+

+ What you see is what you pay. No hidden fees. +

+
+ +
+
+ +

Instant Booking

+
+

+ Secure your date instantly with a seamless checkout. +

+
+
+
+ + {/* Separator */} +
+
+
+ + {/* Categories Showcase */} +
+
+
+

+ Browse by Category +

+

+ Find the perfect space tailored to your specific event needs +

+
+ +
+ {VENUE_CATEGORIES.map((cat, idx) => ( +
handleCategoryClick(cat.value)} + className="flex flex-col items-center justify-center p-6 bg-[var(--bg-tertiary)] rounded-2xl border border-[var(--bg-grey)] hover:shadow-md hover:border-[var(--bg-green)] transition cursor-pointer group" + > +
+ +
+ {cat.name} +
+ ))} +
+
+
+ + {/* Featured Venues Section — only shown when API succeeded with results */} + {(isLoading || (isSuccess && featuredVenues.length > 0)) && ( + + )} + + {/* Become a Host Section */} +
+
+
+

+ List Your Property on BookMyVenue +

+

+ Have a beautiful space? Join thousands of hosts who are earning by renting out their + venues for events, meetings, and parties. +

+
+
+ + Become a Host + +
+
+
+ + {/* Discover BookMyVenue Section */} +
+
+
+

+ Discover More About
Property Rental +

+

+ BookMyVenue provides a seamless experience for both guests looking to book the perfect + space and hosts wanting to maximize their property's potential. +

+ +
+ {[ + 'Verified venues with detailed amenities', + 'Transparent pricing with no hidden fees', + 'Secure payment and instant booking confirmation', + ].map((item, idx) => ( +
+ + {item} +
+ ))} +
+ + + Discover More + +
+
+
+ Beautiful event space +
+
+
+
+
+ ); +}; + +export default HomePage; diff --git a/client/src/pages/listVenue/ListVenueLayout.tsx b/client/src/pages/listVenue/ListVenueLayout.tsx new file mode 100644 index 0000000000..b89c03bc52 --- /dev/null +++ b/client/src/pages/listVenue/ListVenueLayout.tsx @@ -0,0 +1,18 @@ +import { Outlet } from 'react-router'; +import ListSidebar from '@/components/common/ListSidebar'; + +const ListVenueLayout = () => { + return ( +
+ {/* Sidebar */} + + + {/* Right Content */} +
+ +
+
+ ); +}; + +export default ListVenueLayout; diff --git a/client/src/pages/listVenue/addVenue/components/AmenitiesSection.tsx b/client/src/pages/listVenue/addVenue/components/AmenitiesSection.tsx new file mode 100644 index 0000000000..3eec3bcd9e --- /dev/null +++ b/client/src/pages/listVenue/addVenue/components/AmenitiesSection.tsx @@ -0,0 +1,25 @@ +import { Field, ErrorMessage } from 'formik'; +import { AMENITIES_LIST } from '@/constants/venueConstants'; +import { FORM_ERROR_CLASS } from '@/constants/uiClasses'; + +const err = FORM_ERROR_CLASS; + +export function AmenitiesSection() { + return ( +
+

Amenities

+
+ {AMENITIES_LIST.map((item) => ( + + ))} +
+ +
+ ); +} diff --git a/client/src/pages/listVenue/addVenue/components/BasicInfoStep.tsx b/client/src/pages/listVenue/addVenue/components/BasicInfoStep.tsx new file mode 100644 index 0000000000..b55b57818d --- /dev/null +++ b/client/src/pages/listVenue/addVenue/components/BasicInfoStep.tsx @@ -0,0 +1,184 @@ +import { Field, ErrorMessage } from 'formik'; +import { KERALA_DISTRICTS } from '@/constants'; +import { PlaceAutocomplete } from '@/components/PlaceAutocomplete'; +import { VENUE_TYPES, SPACE_ATTRIBUTES, SEATING_CONFIGURATIONS } from '@/constants/venueConstants'; + +const err = 'text-red-500 text-sm mt-1'; + +const BasicInfoStep = () => { + return ( +
+
+

Venue Registration

+

+ Add your venue details to help customers discover your space. +

+
+ +
+
+ {/* Venue Name */} +
+ + + +
+ + {/* Description */} +
+ + + +
+ + {/* Venue Type */} +
+ + + + {VENUE_TYPES.map((type) => ( + + ))} + + +
+ + {/* District */} +
+ + + + {KERALA_DISTRICTS.map((district) => ( + + ))} + + +
+ + {/* City */} +
+ + + +
+ + {/* Pincode */} +
+ + + +
+ + {/* Full Address */} +
+ + + +
+ + {/* Google Maps */} +
+ + + +
+
+ + {/* Space Attributes */} +
+

Space Attributes

+
+ {SPACE_ATTRIBUTES.map((item) => ( + + ))} +
+ +
+ + {/* Seating Configuration */} +
+

Seating Configuration

+
+ {SEATING_CONFIGURATIONS.map((item) => ( + + ))} +
+ +
+ + {/* Max Capacity */} +
+ + + +
+
+
+ ); +}; + +export default BasicInfoStep; diff --git a/client/src/pages/listVenue/addVenue/components/BasicValidation.ts b/client/src/pages/listVenue/addVenue/components/BasicValidation.ts new file mode 100644 index 0000000000..3794f48b81 --- /dev/null +++ b/client/src/pages/listVenue/addVenue/components/BasicValidation.ts @@ -0,0 +1,34 @@ +import * as Yup from 'yup'; + +export const basicInfoSchema = Yup.object({ + VenueName: Yup.string() + .trim() + .required('Venue name is required') + .min(3, 'Minimum 3 characters') + .max(100, 'Maximum 100 characters'), + + VenueDescription: Yup.string() + .trim() + .required('Description is required') + .min(10, 'Minimum 10 characters'), + + venueType: Yup.string().required('Venue type is required'), + + district: Yup.string().required('District is required'), + + city: Yup.string().required('City / Place is required'), + + pincode: Yup.string() + .matches(/^[0-9]{6}$/, 'Invalid pincode') + .required('Pincode is required'), + + fullAddress: Yup.string().required('Address is required').min(5, 'Minimum 5 characters'), + + googleMapsLink: Yup.string().url('Invalid Google Maps URL').nullable().optional(), + + spaceAttributes: Yup.array().min(1, 'Select at least one'), + + seatingConfigurations: Yup.array(), + + maxCapacity: Yup.number().typeError('Must be a number').positive('Must be positive').optional(), +}); diff --git a/client/src/pages/listVenue/addVenue/components/BookingTypeSection.tsx b/client/src/pages/listVenue/addVenue/components/BookingTypeSection.tsx new file mode 100644 index 0000000000..b4fc2701a4 --- /dev/null +++ b/client/src/pages/listVenue/addVenue/components/BookingTypeSection.tsx @@ -0,0 +1,44 @@ +import { Field, ErrorMessage } from 'formik'; +import { FORM_ERROR_CLASS } from '@/constants/uiClasses'; +import { DAYS_OF_WEEK } from '@/constants/common'; + +const err = FORM_ERROR_CLASS; + +export function BookingTypeSection() { + return ( + <> + {/* Booking Type */} +
+ +
+ + +
+ +
+ + {/* Working Days */} +
+

Working Days

+
+ {DAYS_OF_WEEK.map((day) => ( + + ))} +
+ +
+ + ); +} diff --git a/client/src/pages/listVenue/addVenue/components/FinishStep.tsx b/client/src/pages/listVenue/addVenue/components/FinishStep.tsx new file mode 100644 index 0000000000..1cadcad85e --- /dev/null +++ b/client/src/pages/listVenue/addVenue/components/FinishStep.tsx @@ -0,0 +1,298 @@ +import { Field, FieldArray, ErrorMessage, useFormikContext } from 'formik'; +import { useState, useEffect } from 'react'; +import { useToast } from '@/hooks/useToast'; +import { ALLOWED_IMAGE_TYPES, MAX_IMAGE_FILE_SIZE } from '@/constants/upload'; +import { FORM_ERROR_CLASS } from '@/constants/uiClasses'; +import { CANCELLATION_POLICIES, REFUND_TYPES } from '@/constants/bookingConstants'; + +type FinishStepValues = { + contact: { name: string; phone: string; email?: string }; + cancellation: { + policy: string; + refundType: string; + refundRules: { daysBefore: string; refundPercentage: string }[]; + }; + venuePhotos: File[]; + existingImages: { + coverImage: string; + galleryImages: string[]; + }; +}; + +const err = FORM_ERROR_CLASS; + +const FinishStep = () => { + const [previewImages, setPreviewImages] = useState([]); + const { values, setFieldValue } = useFormikContext(); + const { error: showError } = useToast(); + + useEffect(() => { + const urls = values.venuePhotos?.map((file) => URL.createObjectURL(file)) || []; + setPreviewImages(urls); + return () => { + urls.forEach((url) => URL.revokeObjectURL(url)); + }; + }, [values.venuePhotos]); + + const existingCover = values.existingImages?.coverImage || ''; + const existingGallery = values.existingImages?.galleryImages || []; + + const allDisplayItems: Array< + { type: 'existing'; url: string } | { type: 'new'; url: string; index: number } + > = [ + ...(existingCover ? [{ type: 'existing' as const, url: existingCover }] : []), + ...existingGallery.map((url) => ({ type: 'existing' as const, url })), + ...previewImages.map((url, i) => ({ type: 'new' as const, url, index: i })), + ]; + + const hasImages = allDisplayItems.length > 0; + + return ( +
+
+
+

Final Details

+

+ Upload photos and configure final venue settings. +

+
+ +
+ {/* Photos */} +
+

Venue Photos

+

+ Upload venue images. First image becomes cover photo. +

+ + {/* Combined Grid — existing images + new upload previews */} + {hasImages && ( +
+ {allDisplayItems.map((item, index) => ( +
+ + + {index === 0 && ( +
+ Cover +
+ )} + + +
+ ))} +
+ )} + + {/* Upload area */} + + + + + {previewImages.length > 0 && ( +

+ {previewImages.length} new image(s) selected +

+ )} +
+ + {/* Contact */} +
+

Contact Details

+
+
+ + + +
+
+ + + +
+
+
+ + {/* Cancellation Policy */} +
+

Cancellation Policy

+
+ + +
+ +
+ + {/* Refund Rules — only for refundable */} + {values.cancellation.policy === CANCELLATION_POLICIES.REFUNDABLE && ( +
+

Refund Rules

+

+ Configure refund percentage based on cancellation time. +

+ + {/* Refund Type */} +
+ +
+ + +
+ +
+ + {/* Refund Rules — only for time based */} + {values.cancellation.refundType === REFUND_TYPES.TIME_BASED && ( + + {({ push, remove }) => ( +
+ {values.cancellation.refundRules.map((_, index) => ( +
+
+
+ + + +
+
+ + + +
+
+ {index > 0 && ( + + )} +
+ ))} + + +
+ )} +
+ )} +
+ )} +
+
+
+ ); +}; + +export default FinishStep; diff --git a/client/src/pages/listVenue/addVenue/components/FinishValidation.ts b/client/src/pages/listVenue/addVenue/components/FinishValidation.ts new file mode 100644 index 0000000000..44f0d49106 --- /dev/null +++ b/client/src/pages/listVenue/addVenue/components/FinishValidation.ts @@ -0,0 +1,37 @@ +import * as Yup from 'yup'; +import { CANCELLATION_POLICIES, REFUND_TYPES } from '@/constants/bookingConstants'; + +export const finishSchema = Yup.object({ + contact: Yup.object({ + name: Yup.string().trim().required('Contact name is required'), + phone: Yup.string() + .matches(/^[6-9]\d{9}$/, 'Enter valid phone number') + .required('Phone number is required'), + email: Yup.string().email('Must be a valid email').optional(), + }), + cancellation: Yup.object({ + policy: Yup.string().required('Select cancellation policy'), + refundType: Yup.string().when('policy', { + is: CANCELLATION_POLICIES.REFUNDABLE, + then: (schema) => + schema.oneOf([REFUND_TYPES.FULL, REFUND_TYPES.TIME_BASED]).required('Select refund type'), + }), + refundRules: Yup.array().when(['policy', 'refundType'], { + is: (policy: string, type: string) => + policy === CANCELLATION_POLICIES.REFUNDABLE && type === REFUND_TYPES.TIME_BASED, + then: () => + Yup.array( + Yup.object({ + daysBefore: Yup.number().integer().min(0).required('Required'), + refundPercentage: Yup.number().min(0).max(100).required('Required'), + }) + ).min(1, 'Add at least one refund rule'), + }), + }), + venuePhotos: Yup.array().when('existingImages', { + is: (ei: { coverImage: string; galleryImages: string[] }) => + !ei?.coverImage && (!ei?.galleryImages || ei.galleryImages.length === 0), + then: (s) => s.min(1, 'Upload at least one photo'), + otherwise: (s) => s.notRequired(), + }), +}); diff --git a/client/src/pages/listVenue/addVenue/components/FixedBookingSection.tsx b/client/src/pages/listVenue/addVenue/components/FixedBookingSection.tsx new file mode 100644 index 0000000000..8e39ee60e4 --- /dev/null +++ b/client/src/pages/listVenue/addVenue/components/FixedBookingSection.tsx @@ -0,0 +1,111 @@ +import { Field, FieldArray, ErrorMessage } from 'formik'; +import { FORM_ERROR_CLASS, FORM_INPUT_CLASS } from '@/constants/uiClasses'; + +const err = FORM_ERROR_CLASS; +const inputCls = FORM_INPUT_CLASS; + +interface FixedBookingSectionProps { + fixedPackages: { slotName: string; startTime: string; endTime: string; price: string }[]; +} + +export function FixedBookingSection({ fixedPackages }: FixedBookingSectionProps) { + return ( +
+

Fixed Packages

+ + {({ push, remove }) => ( +
+ {(fixedPackages || []).map((_, index) => ( +
+
+
+ + + +
+ +
+ + + +
+ +
+ + + +
+ +
+ + + +
+
+ + {index > 0 && ( + + )} +
+ ))} + + +
+ )} +
+
+ ); +} diff --git a/client/src/pages/listVenue/addVenue/components/FlexibleBookingSection.tsx b/client/src/pages/listVenue/addVenue/components/FlexibleBookingSection.tsx new file mode 100644 index 0000000000..26e71c59f6 --- /dev/null +++ b/client/src/pages/listVenue/addVenue/components/FlexibleBookingSection.tsx @@ -0,0 +1,291 @@ +import { Field, FieldArray, ErrorMessage } from 'formik'; +import { FORM_ERROR_CLASS, FORM_INPUT_CLASS } from '@/constants/uiClasses'; +import { PRICING_TYPES } from '@/constants/venueConstants'; + +const err = FORM_ERROR_CLASS; +const inputCls = FORM_INPUT_CLASS; + +interface FlexibleBookingSectionProps { + openTime?: string; + closeTime?: string; + pricingType: string; + pricingRules: { fromTime: string; toTime: string; price: string }[]; + blockedTimes: { fromTime: string; toTime: string }[]; +} + +export function FlexibleBookingSection({ + openTime, + closeTime, + pricingType, + pricingRules, + blockedTimes, +}: FlexibleBookingSectionProps) { + return ( +
+ {/* Working Hours */} +
+

Working Hours

+
+
+ + + +
+
+ + + +
+
+ {openTime && closeTime && ( +

+ ⏱ All time-based fields below are restricted to{' '} + + {openTime} – {closeTime} + +

+ )} +
+ + {/* Slot Duration & Buffer Time */} +
+
+ +

+ Minimum booking duration for each slot. +

+ + + + + + + + +
+ +
+ +

Time gap between each slot.

+ + + + + + + + + +
+
+ + {/* Pricing Type */} +
+ +
+ + +
+ +
+ + {/* Same Price */} + {pricingType === PRICING_TYPES.FIXED && ( +
+ + + +
+ )} + + {/* Time Based Pricing Rules */} + {pricingType === PRICING_TYPES.TIME_BASED && ( +
+

Pricing Rules

+
+
+ +

+ This base price applies when time-based pricing is active. +

+ + +
+
+ {openTime && closeTime && ( +

+ Times must be within working hours:{' '} + + {openTime} – {closeTime} + +

+ )} + + {({ push, remove }) => ( +
+ {(pricingRules || []).map((_, index) => ( +
+
+
+ + + +
+
+ + + +
+
+ + + +
+
+ {index > 0 && ( + + )} +
+ ))} + +
+ )} +
+
+ )} + + {/* Blocked Times */} +
+

Blocked Time

+

+ Add maintenance, lunch break or unavailable hours. + {openTime && closeTime && ( + <> + {' '} + Times must be within{' '} + + {openTime} – {closeTime} + + . + + )} +

+ + {({ push, remove }) => ( +
+ {(blockedTimes || []).map((_, index) => ( +
+
+
+ + + +
+
+ + + +
+
+ {index > 0 && ( + + )} +
+ ))} + +
+ )} +
+
+
+ ); +} diff --git a/client/src/pages/listVenue/addVenue/components/SlotPreviewPanel.tsx b/client/src/pages/listVenue/addVenue/components/SlotPreviewPanel.tsx new file mode 100644 index 0000000000..530391d2b4 --- /dev/null +++ b/client/src/pages/listVenue/addVenue/components/SlotPreviewPanel.tsx @@ -0,0 +1,175 @@ +import React, { useState, useMemo } from 'react'; +import { Calendar } from '@/components/ui/calendar'; +import type { ISlotConfig, IPreviewSlot } from '@/utils/slotGenerator.types'; +import { + generateSlots, + isWorkingDay, + getNextWorkingDay, + formatDateToString, + parseDateString, +} from '@/utils/slotGenerator.utils'; + +type SlotPreviewPanelProps = ISlotConfig; + +const SlotPreviewPanel: React.FC = ({ + bookingType, + workingDays, + workingHours, + fixedPackages, + slotDuration, + bufferTime, + pricingType, + pricingRules, + blockedTimes, + samePrice, + basePrice, +}) => { + const [selectedPreviewDate, setSelectedPreviewDate] = useState(() => { + const tomorrow = new Date(); + tomorrow.setDate(tomorrow.getDate() + 1); + const nextWorkingDay = getNextWorkingDay(tomorrow, workingDays); + return formatDateToString(nextWorkingDay); + }); + + const slots = useMemo(() => { + if (!selectedPreviewDate) return []; + + const config: ISlotConfig = { + bookingType, + workingDays, + workingHours, + fixedPackages, + slotDuration, + bufferTime, + pricingType, + pricingRules, + blockedTimes, + samePrice, + basePrice, + }; + + return generateSlots(selectedPreviewDate, config); + }, [ + selectedPreviewDate, + bookingType, + workingDays, + workingHours, + fixedPackages, + slotDuration, + bufferTime, + pricingType, + pricingRules, + blockedTimes, + samePrice, + basePrice, + ]); + + const handleDateSelect = (date: Date | undefined) => { + if (date) { + setSelectedPreviewDate(formatDateToString(date)); + } + }; + + const isDateDisabled = (date: Date): boolean => { + return !isWorkingDay(date, workingDays); + }; + + const displayDate = selectedPreviewDate + ? parseDateString(selectedPreviewDate).toLocaleDateString('en-IN', { + weekday: 'short', + day: '2-digit', + month: 'short', + year: 'numeric', + }) + : ''; + + const bookingTypeLabel = bookingType === 'fixedBooking' ? 'Fixed Package' : 'Flexible Booking'; + + return ( +
+ {/* Booking Type Badge */} +
+

Preview

+ + {bookingTypeLabel} + +
+ + {/* Calendar Section */} +
+ +
+ +
+
+ + {/* Selected Date Pill */} + {displayDate && ( +
+
+ {displayDate} +
+
+ )} + + {/* Available Slots Section */} +
+

Available Slots

+ + {!selectedPreviewDate ? ( +
+ Select a date to see slots +
+ ) : slots.length === 0 ? ( +
+ No availability configured yet +
+ ) : ( +
+ {slots.map((slot: IPreviewSlot) => ( + + ))} +
+ )} +
+ + {/* Disclaimer Note */} +
+

+ * Note: This preview is for visualization purposes only. Actual slot generation is handled + server-side and may evaluate additional constraints and edge cases. +

+
+
+ ); +}; + +export default SlotPreviewPanel; diff --git a/client/src/pages/listVenue/addVenue/components/middleStep.tsx b/client/src/pages/listVenue/addVenue/components/middleStep.tsx new file mode 100644 index 0000000000..79fbae2747 --- /dev/null +++ b/client/src/pages/listVenue/addVenue/components/middleStep.tsx @@ -0,0 +1,111 @@ +import { useFormikContext } from 'formik'; +import { BOOKING_TYPES } from '@/constants/venueConstants'; +import SlotPreviewPanel from './SlotPreviewPanel'; +import { BookingTypeSection } from './BookingTypeSection'; +import { FixedBookingSection } from './FixedBookingSection'; +import { FlexibleBookingSection } from './FlexibleBookingSection'; +import { AmenitiesSection } from './AmenitiesSection'; + +type BookingStepValues = { + bookingType: string; + pricingType: string; + fixedPackages: { + slotName: string; + startTime: string; + endTime: string; + price: string; + }[]; + workingDays: string[]; + workingHours: { + open: string; + close: string; + }; + slotDuration: string; + bufferTime: string; + samePrice: string; + pricingRules: { + fromTime: string; + toTime: string; + price: string; + }[]; + blockedTimes: { + fromTime: string; + toTime: string; + }[]; + amenities: string[]; + pricing?: { + basePrice?: string; + }; +}; + +const BookingStep = () => { + const { values } = useFormikContext(); + + const openTime = values.workingHours?.open || undefined; + const closeTime = values.workingHours?.close || undefined; + + return ( +
+
+
+
+
+
+

Booking Configuration

+

+ Configure booking, pricing and venue setup. +

+
+ +
+ + + {values.bookingType === BOOKING_TYPES.FIXED && ( + + )} + + {values.bookingType === BOOKING_TYPES.FLEXIBLE && ( + + )} + + +
+
+
+ +
+
+ ({ + ...pkg, + price: parseFloat(pkg.price) || 0, + }))} + slotDuration={values.slotDuration} + bufferTime={values.bufferTime} + pricingType={values.pricingType} + pricingRules={(values.pricingRules || []).map((rule) => ({ + ...rule, + price: parseFloat(rule.price) || 0, + }))} + blockedTimes={values.blockedTimes || []} + samePrice={values.samePrice} + basePrice={values.pricing?.basePrice} + /> +
+
+
+
+
+ ); +}; + +export default BookingStep; diff --git a/client/src/pages/listVenue/addVenue/components/middleValidation.ts b/client/src/pages/listVenue/addVenue/components/middleValidation.ts new file mode 100644 index 0000000000..7deb671c63 --- /dev/null +++ b/client/src/pages/listVenue/addVenue/components/middleValidation.ts @@ -0,0 +1,251 @@ +import * as Yup from 'yup'; + +// HH:MM → total minutes since midnight for easy comparison +const toMinutes = (t: string): number => { + const [h, m] = t.split(':').map(Number); + return h * 60 + m; +}; + +export const middleSchema = Yup.object({ + bookingType: Yup.string().required('Select booking type'), + + /* Working Days */ + workingDays: Yup.array().min(1, 'Select at least one working day'), + + /* Fixed Booking */ + fixedPackages: Yup.array().when('bookingType', { + is: 'fixedBooking', + then: () => + Yup.array() + .min(1, 'Add at least one package') + .of( + Yup.object({ + slotName: Yup.string().trim().required('Slot name required'), + startTime: Yup.string().required('Start time required'), + endTime: Yup.string().required('End time required'), + price: Yup.number() + .typeError('Enter valid price') + .required('Price required') + .positive('Must be positive'), + }).test('fixed-pkg-times', 'End time must be after start time', function (value) { + const { startTime, toTime } = value as { + startTime?: string; + toTime?: string; + }; + if (startTime && toTime && toMinutes(toTime) <= toMinutes(startTime)) { + return this.createError({ + path: `${this.path}.endTime`, + message: 'End time must be after start time', + }); + } + return true; + }) + ), + otherwise: () => Yup.array(), + }), + + /* Flexible Booking */ + workingHours: Yup.object().when('bookingType', { + is: 'flexibleBooking', + then: () => + Yup.object({ + open: Yup.string().required('Open time required'), + close: Yup.string().required('Close time required'), + }).test('open-before-close', 'Close time must be after open time', function (value) { + const { open, close } = value as { open?: string; close?: string }; + if (open && close && toMinutes(close) <= toMinutes(open)) { + return this.createError({ + path: `${this.path}.close`, + message: 'Close time must be after open time', + }); + } + return true; + }), + otherwise: () => Yup.object(), + }), + + slotDuration: Yup.string().when('bookingType', { + is: 'flexibleBooking', + then: (schema) => schema.required('Select slot duration'), + }), + + bufferTime: Yup.string().when('bookingType', { + is: 'flexibleBooking', + then: (schema) => schema.required('Select buffer time'), + }), + + pricingType: Yup.string().when('bookingType', { + is: 'flexibleBooking', + then: (schema) => schema.required('Select pricing type'), + }), + + pricing: Yup.object().when('pricingType', { + is: 'timeBasedPricing', + then: () => + Yup.object({ + basePrice: Yup.number() + .typeError('Enter valid base price') + .required('Enter base price') + .positive('Must be positive'), + }).required('Base price is required'), + otherwise: () => Yup.object(), + }), + + /* Same Price */ + samePrice: Yup.string().when('pricingType', { + is: 'fixedPricing', + then: (schema) => schema.required('Enter slot price'), + }), + + /* + * pricingRules — validate each row's times stay within workingHours. + * Uses object-level .test() to avoid Yup cyclic-dependency on sibling refs. + */ + pricingRules: Yup.array().when('pricingType', { + is: 'timeBasedPricing', + then: () => + Yup.array() + .min(1, 'Add at least one pricing rule') + .of( + Yup.object({ + fromTime: Yup.string().required('Required'), + toTime: Yup.string().required('Required'), + price: Yup.number() + .typeError('Enter valid price') + .required('Required') + .positive('Must be positive'), + }).test('pricing-rule-times', 'Invalid pricing rule times', function (value) { + const { fromTime, toTime } = value as { + fromTime?: string; + toTime?: string; + }; + + // toTime must be after fromTime + if (fromTime && toTime && toMinutes(toTime) <= toMinutes(fromTime)) { + return this.createError({ + path: `${this.path}.toTime`, + message: 'To time must be after from time', + }); + } + + // Times must stay within workingHours + const workingHours = ( + this.options as { + context?: { workingHours?: { open: string; close: string } }; + } + ).context?.workingHours; + const open = + workingHours?.open ?? + ( + this as unknown as { + from?: { value: { workingHours?: { open?: string } } }[]; + } + ).from?.[2]?.value?.workingHours?.open; + const close = + workingHours?.close ?? + ( + this as unknown as { + from?: { value: { workingHours?: { close?: string } } }[]; + } + ).from?.[2]?.value?.workingHours?.close; + + if (open && close) { + if (fromTime && toMinutes(fromTime) < toMinutes(open)) { + return this.createError({ + path: `${this.path}.fromTime`, + message: `Must be on or after open time (${open})`, + }); + } + if (toTime && toMinutes(toTime) > toMinutes(close)) { + return this.createError({ + path: `${this.path}.toTime`, + message: `Must be on or before close time (${close})`, + }); + } + } + return true; + }) + ), + otherwise: () => Yup.array(), + }), + + /* + * blockedTimes — optional rows, but if filled they must stay within workingHours. + * Object-level test to avoid fromTime ↔ toTime cyclic dependency. + */ + blockedTimes: Yup.array().when('bookingType', { + is: 'flexibleBooking', + then: () => + Yup.array().of( + Yup.object({ + fromTime: Yup.string(), + toTime: Yup.string(), + }).test( + 'blocked-times-pair-and-range', + 'Both From Time and To Time are required together and must stay within working hours', + function (value) { + const { fromTime, toTime } = value as { + fromTime?: string; + toTime?: string; + }; + + // Pair check + if (fromTime && !toTime) { + return this.createError({ + path: `${this.path}.toTime`, + message: 'To time required', + }); + } + if (!fromTime && toTime) { + return this.createError({ + path: `${this.path}.fromTime`, + message: 'From time required', + }); + } + + // If both filled — validate order and bounds + if (fromTime && toTime) { + if (toMinutes(toTime) <= toMinutes(fromTime)) { + return this.createError({ + path: `${this.path}.toTime`, + message: 'To time must be after from time', + }); + } + + // Walk up the form tree to get workingHours + const formValues = ( + this as unknown as { + from?: { + value: { workingHours?: { open?: string; close?: string } }; + }[]; + } + ).from; + const open = formValues?.[1]?.value?.workingHours?.open; + const close = formValues?.[1]?.value?.workingHours?.close; + + if (open && close) { + if (toMinutes(fromTime) < toMinutes(open)) { + return this.createError({ + path: `${this.path}.fromTime`, + message: `Must be on or after open time (${open})`, + }); + } + if (toMinutes(toTime) > toMinutes(close)) { + return this.createError({ + path: `${this.path}.toTime`, + message: `Must be on or before close time (${close})`, + }); + } + } + } + + return true; + } + ) + ), + otherwise: () => Yup.array(), + }), + + /* Amenities */ + amenities: Yup.array().min(1, 'Select at least one amenity'), +}); diff --git a/client/src/pages/listVenue/addVenue/index.tsx b/client/src/pages/listVenue/addVenue/index.tsx new file mode 100644 index 0000000000..b7ef2a117a --- /dev/null +++ b/client/src/pages/listVenue/addVenue/index.tsx @@ -0,0 +1,452 @@ +import { Formik, Form } from 'formik'; +import { useState, useEffect } from 'react'; +import { useNavigate, useParams } from 'react-router'; +import { useAuth } from '@/hooks/useAuth'; +import { useToast } from '@/hooks/useToast'; +import { useImageUpload } from '@/hooks/useImageUpload'; +import Spinner from '@/components/common/Spinner'; +import { + createVenue, + updateVenue, + submitVenue, + getVenueById, + getMyDraft, + upsertVenueDraft, +} from '@/services/venueService'; +import { mapFormToDTO, mapVenueToForm } from '@/utils/venueFormMapper'; +import { + saveDraftSession, + loadDraftSession, + clearDraftSession, + clearDraft, +} from '@/utils/venueDraft'; +import type { AddVenueFormValues } from '@/types/venue.types'; + +import BasicInfoStep from './components/BasicInfoStep'; +import { basicInfoSchema } from './components/BasicValidation'; +import BookingStep from './components/middleStep'; +import FinishStep from './components/FinishStep'; +import { finishSchema } from './components/FinishValidation'; +import { middleSchema } from './components/middleValidation'; + +const BLANK_FORM: AddVenueFormValues = { + VenueName: '', + VenueDescription: '', + venueType: '', + district: '', + state: '', + city: '', + pincode: '', + fullAddress: '', + googleMapsLink: '', + coordinates: null, + spaceAttributes: [], + seatingConfigurations: [], + maxCapacity: '', + bookingType: '', + workingDays: [], + fixedPackages: [{ slotName: '', startTime: '', endTime: '', price: 0 }], + workingHours: { open: '', close: '' }, + flexibleBooking: { slotDuration: '', bufferTime: '' }, + pricing: { + pricingType: '', + basePrice: 0, + pricingRules: [{ fromTime: '', toTime: '', price: 0 }], + }, + blockedTimes: [{ fromTime: '', toTime: '', reason: '' }], + amenities: [], + venuePhotos: [], + existingImages: { + coverImage: '', + galleryImages: [], + }, + contact: { name: '', phone: '', email: '' }, + cancellation: { + policy: '', + refundType: '', + refundRules: [{ daysBefore: '', refundPercentage: '' }], + }, +}; + +const STEP_LABELS = ['Basic Info', 'Booking', 'Final Details']; + +const AddVenue = () => { + const { venueId } = useParams<{ venueId?: string }>(); + const isEditMode = !!venueId; + const [step, setStep] = useState(0); + const [formValues, setFormValues] = useState(BLANK_FORM); + const [initializing, setInitializing] = useState(true); + const [venueData, setVenueData] = useState<{ + _id: string; + currentEditDeadline?: string; + submissionCount?: number; + status: string; + } | null>(null); + const [now, setNow] = useState(new Date()); + const [isNavigating, setIsNavigating] = useState(false); + + const navigate = useNavigate(); + const { user, loading: authLoading } = useAuth(); + const { success: showSuccess, error: showError } = useToast(); + const { uploadFiles, isUploading } = useImageUpload(); + + const stepSchemas = [basicInfoSchema, middleSchema, finishSchema]; + + // Update now every minute for deadline calculations + useEffect(() => { + const interval = setInterval(() => setNow(new Date()), 60000); + return () => clearInterval(interval); + }, []); + + // Determine if deadline has passed + const isDeadlinePassed = venueData?.currentEditDeadline + ? now > new Date(venueData.currentEditDeadline) + : false; + + // Calculate days left + const daysLeft = + venueData?.currentEditDeadline && !isDeadlinePassed + ? Math.max( + 0, + Math.ceil( + (new Date(venueData.currentEditDeadline).getTime() - now.getTime()) / + (24 * 60 * 60 * 1000) + ) + ) + : 0; + + // Load venue data for edit mode + useEffect(() => { + if (isEditMode && venueId) { + const fetchVenue = async () => { + try { + const venue = await getVenueById(venueId); + setVenueData({ + _id: venue._id, + currentEditDeadline: venue.currentEditDeadline, + submissionCount: venue.submissionCount, + status: venue.status, + }); + setFormValues(mapVenueToForm(venue)); + setInitializing(false); + } catch (err) { + console.error('Failed to load venue:', err); + showError('Failed to load venue'); + setInitializing(false); + navigate('/list-venue/my-venues'); + } + }; + void fetchVenue(); + } else { + // New venue mode - load draft + const init = async () => { + if (authLoading) return; + if (!user?.id) { + setInitializing(false); + return; + } + + const session = loadDraftSession(user.id); + if (session && session.formValues) { + console.log('Restoring draft from session:', session.formValues); + setStep(session.step || 0); + setFormValues({ ...BLANK_FORM, ...session.formValues }); + setInitializing(false); + showSuccess('Draft retrieved, you can continue from here.'); + return; + } + + try { + const draft = await getMyDraft(); + console.log('Draft from API:', draft); + if (draft && draft.formValues && Object.keys(draft.formValues).length > 0) { + console.log('Restoring draft from API:', draft.formValues); + const values = { ...BLANK_FORM, ...(draft.formValues as Partial) }; + const resumeStep = typeof draft.step === 'number' ? draft.step : 0; + + setStep(resumeStep); + setFormValues(values); + saveDraftSession(user.id, { venueId: 'draft', step: resumeStep, formValues: values }); + showSuccess('Draft retrieved, you can continue from here.'); + } + } catch (err) { + console.error('Failed to get draft:', err); + } finally { + setInitializing(false); + } + }; + + void init(); + } + }, [venueId, isEditMode, user?.id, authLoading, showSuccess, showError, navigate]); + + if (initializing) { + return ( +
+
+ +

Loading…

+
+
+ ); + } + + return ( + { + if (!user?.id) { + showError('User not authenticated. Please restart.'); + return; + } + try { + setSubmitting(true); + + let newImageUrls: string[] = []; + if (values.venuePhotos?.length > 0) { + newImageUrls = await uploadFiles(values.venuePhotos); + } + + const remainingExisting = [ + values.existingImages.coverImage, + ...values.existingImages.galleryImages, + ].filter(Boolean) as string[]; + + const allImageUrls = [...remainingExisting, ...newImageUrls]; + const dto = mapFormToDTO(values, allImageUrls); + + if (isEditMode && venueId) { + // Update existing venue + await updateVenue(venueId, dto); + // Then submit for review + await submitVenue(venueId); + + clearDraftSession(user.id); + clearDraft(user.id); + showSuccess('Venue resubmitted for review successfully!'); + } else { + // Create new venue + await createVenue(dto); + + clearDraftSession(user.id); + clearDraft(user.id); + showSuccess('Venue submitted for review successfully!'); + } + + navigate('/list-venue/my-venues'); + } catch (error) { + console.error('Submission failed:', error); + showError('Submission failed. Please try again.'); + } finally { + setSubmitting(false); + } + }} + > + {({ validateForm, setTouched, values, errors, isSubmitting, submitForm }) => { + const hasErrors = Object.keys(errors).length > 0; + + const handleNext = async () => { + if (isNavigating) return; + setIsNavigating(true); + try { + const errs = await validateForm(); + const touchAll = (obj: Record): Record => + Object.keys(obj).reduce>((acc, key) => { + const val = obj[key]; + acc[key] = + val && typeof val === 'object' && !Array.isArray(val) + ? touchAll(val as Record) + : Array.isArray(val) + ? (val as unknown[]).map((item) => + item && typeof item === 'object' + ? touchAll(item as Record) + : true + ) + : true; + return acc; + }, {}); + + if (Object.keys(errs).length > 0) { + await setTouched(touchAll(errs) as never, false); + return; + } + + if (!user?.id) { + showError('User not authenticated'); + return; + } + + if (!isEditMode) { + await upsertVenueDraft(step + 1, values); + saveDraftSession(user.id, { venueId: 'draft', step: step + 1, formValues: values }); + } + setStep((s) => s + 1); + } catch (error) { + console.error('Save failed:', error); + showError('Failed to save progress. Please try again.'); + } finally { + setIsNavigating(false); + } + }; + + return ( +
+
+ {STEP_LABELS.map((label, i) => ( +
+ + {i < step ? '✓' : i + 1} + + + {label} + + {i < STEP_LABELS.length - 1 && ( + + )} +
+ ))} +
+ + {/* Deadline banner for edit mode */} + {isEditMode && venueData?.currentEditDeadline && ( +
+
+ {isDeadlinePassed ? ( + + + + + + ) : ( + + + + + + )} +
+

+ {isDeadlinePassed + ? 'Edit Window Expired' + : `⏰ ${daysLeft} day(s) left to resubmit`} +

+

+ Deadline:{' '} + {new Date(venueData.currentEditDeadline!).toLocaleDateString('en-IN', { + day: 'numeric', + month: 'long', + year: 'numeric', + hour: '2-digit', + minute: '2-digit', + })} + . + {isDeadlinePassed + ? ' This venue has been auto-suspended and cannot be resubmitted.' + : ' After this, the venue will be auto-suspended.'} +

+
+
+
+ )} + + {step === 0 && } + {step === 1 && } + {step === 2 && } + +
+ {step > 0 ? ( + + ) : ( +
+ )} + + {hasErrors && ( +
+

+ Please fix the errors before continuing +

+

+ Errors in: {Object.keys(errors).join(', ')} +

+
+ )} + + {step < 2 ? ( + + ) : ( + + )} +
+ + ); + }} + + ); +}; + +export default AddVenue; diff --git a/client/src/pages/listVenue/myVenue/components/VenueCard.tsx b/client/src/pages/listVenue/myVenue/components/VenueCard.tsx new file mode 100644 index 0000000000..1e314a6a56 --- /dev/null +++ b/client/src/pages/listVenue/myVenue/components/VenueCard.tsx @@ -0,0 +1,236 @@ +import { useState } from 'react'; +import { Link } from 'react-router'; +import { Button } from '@/components/ui/button'; +import { DASHBOARD_URL } from '@/constants'; +import type { MyVenue } from '@/types/venue.types'; +import { MdOutlineLocationOn } from 'react-icons/md'; +import { AlertTriangle, AlertCircle } from 'lucide-react'; +import { format, differenceInDays } from 'date-fns'; +import { RejectionHistoryModal } from '@/components/explore/RejectionHistoryModal'; +import VenuePreviewModal from './VenuePreviewModal'; + +interface VenueCardProps { + venue: MyVenue; +} + +const getStatusBadge = (status: MyVenue['status']) => { + switch (status) { + case 'Draft': + return ( + + Draft + + ); + case 'PendingReview': + return ( + + Under Review + + ); + case 'Approved': + return ( + + Approved + + ); + case 'Rejected': + return ( + + Rejected + + ); + case 'Suspended': + return ( + + Suspended + + ); + default: + return null; + } +}; + +const getPreviewButtonLabel = (status: MyVenue['status']): string => { + switch (status) { + case 'PendingReview': + return 'View Submission'; + case 'Rejected': + return 'View Submission'; + case 'Suspended': + return 'View Details'; + case 'Draft': + return 'Preview'; + default: + return 'View Details'; + } +}; + +const VenueCard = ({ venue }: VenueCardProps) => { + const [previewOpen, setPreviewOpen] = useState(false); + const [historyOpen, setHistoryOpen] = useState(false); + + const isDeadlinePassed = + venue.currentEditDeadline && new Date() > new Date(venue.currentEditDeadline); + const daysLeft = venue.currentEditDeadline + ? differenceInDays(new Date(venue.currentEditDeadline), new Date()) + : null; + + const isApproved = venue.status === 'Approved'; + + const latestReason = + venue.rejectionReason ?? + venue.rejectionHistory?.[venue.rejectionHistory.length - 1]?.reason ?? + ''; + const truncatedReason = + latestReason.length > 10 ? latestReason.slice(0, 10) + '…' : latestReason || 'N/A'; + + return ( + <> +
+
+ {venue.coverImage ? ( + {venue.name} + ) : ( +
+ No Image +
+ )} +
{getStatusBadge(venue.status)}
+
+ + {venue.venueType || 'Venue'} + +
+
+ +
+

+ {venue.name} + {venue.isFeatured && ( + + ★ + + )} +

+ +
+ + + {venue.city}, {venue.district ? `${venue.district}, ` : ''} + {venue.state} + +
+ + {venue.status === 'Rejected' && + venue.rejectionHistory && + venue.rejectionHistory.length > 0 && ( + + )} + + {venue.status === 'Rejected' && venue.currentEditDeadline && ( +
+ {isDeadlinePassed ? ( + + ) : ( + + )} + + {isDeadlinePassed + ? 'Deadline passed' + : `${daysLeft} day${daysLeft !== 1 ? 's' : ''} left`} + + {!isDeadlinePassed && ( + + · {format(new Date(venue.currentEditDeadline), 'PP')} + + )} +
+ )} + +
+ {/* View Details / Submission button — Approved links to public page, others open modal */} + {isApproved ? ( + + ) : ( + + )} + + {venue.status === 'Approved' && ( + + )} + + {venue.status === 'Rejected' && + !isDeadlinePassed && + venue.submissionCount && + venue.submissionCount < 10 && ( + + )} + + {venue.status === 'Rejected' && + venue.submissionCount && + venue.submissionCount >= 10 && ( +

+ Max retries (10) exceeded +

+ )} +
+
+
+ + {/* Preview modal — only mounted for non-Approved venues */} + {!isApproved && ( + + )} + + + + ); +}; + +export default VenueCard; diff --git a/client/src/pages/listVenue/myVenue/components/VenuePreviewModal.tsx b/client/src/pages/listVenue/myVenue/components/VenuePreviewModal.tsx new file mode 100644 index 0000000000..46a94ce391 --- /dev/null +++ b/client/src/pages/listVenue/myVenue/components/VenuePreviewModal.tsx @@ -0,0 +1,646 @@ +import { Link } from 'react-router'; +import { Dialog, DialogContent, DialogTitle } from '@/components/ui/dialog'; +import { Button } from '@/components/ui/button'; +import { Skeleton } from '@/components/ui/skeleton'; +import { useApiQuery } from '@/hooks/useApi'; +import { API_ENDPOINTS } from '@/constants'; +import type { MyVenue, VenueDetail } from '@/types/venue.types'; +import { + Clock, + XCircle, + ShieldOff, + FileText, + AlertTriangle, + AlertCircle, + MapPin, + Users, + Tag, + Layers, + ChevronLeft, + ChevronRight, +} from 'lucide-react'; +import { format, differenceInDays } from 'date-fns'; +import { useState, useEffect } from 'react'; + +// Status banner config + +interface StatusConfig { + icon: React.ReactNode; + accentClass: string; // border color + bannerBg: string; + badgeBg: string; + badgeText: string; + badgeBorder?: string; + title: string; + message: string; +} + +const getStatusConfig = (venue: MyVenue): StatusConfig => { + const isDeadlinePassed = + venue.currentEditDeadline && new Date() > new Date(venue.currentEditDeadline); + + switch (venue.status) { + case 'PendingReview': + return { + icon: , + accentClass: 'border-amber-200 dark:border-amber-900/50', + bannerBg: 'bg-amber-50/50 dark:bg-amber-900/10', + badgeBg: 'bg-amber-100 dark:bg-amber-900/30', + badgeBorder: 'border-amber-200 dark:border-amber-800/50', + badgeText: 'text-amber-700 dark:text-amber-400', + title: 'Under Review', + message: + "Your venue is under review by our admin team. You'll be notified by email once a decision is made.", + }; + case 'Rejected': + return { + icon: , + accentClass: 'border-red-200 dark:border-red-900/50', + bannerBg: 'bg-red-50/50 dark:bg-red-900/10', + badgeBg: 'bg-red-100 dark:bg-red-900/30', + badgeBorder: 'border-red-200 dark:border-red-800/50', + badgeText: 'text-red-700 dark:text-red-400', + title: isDeadlinePassed ? 'Rejected — Deadline Passed' : 'Rejected', + message: isDeadlinePassed + ? 'The edit window has expired. This venue has been auto-suspended.' + : 'Please address the feedback and resubmit before your deadline.', + }; + case 'Suspended': + return { + icon: , + accentClass: 'border-red-200 dark:border-red-900/50', + bannerBg: 'bg-red-50/50 dark:bg-red-900/10', + badgeBg: 'bg-red-100 dark:bg-red-900/30', + badgeBorder: 'border-red-200 dark:border-red-800/50', + badgeText: 'text-red-700 dark:text-red-400', + title: 'Suspended', + message: + 'This venue is suspended and not publicly visible. Contact support if you believe this is an error.', + }; + case 'Draft': + default: + return { + icon: , + accentClass: 'border-[var(--bg-grey)]', + bannerBg: 'bg-[var(--bg-primary)]', + badgeBg: 'bg-[var(--bg-grey)]/40', + badgeBorder: 'border-[var(--bg-grey)]', + badgeText: 'text-[var(--text-secondary)]', + title: 'Draft', + message: 'Draft preview. Complete all required fields and submit for review.', + }; + } +}; + +// Image strip +const CompactGallery = ({ images, venueName }: { images: string[]; venueName: string }) => { + const [idx, setIdx] = useState(0); + if (images.length === 0) return null; + + return ( +
+ {`${venueName} +
+ + + {idx + 1} / {images.length} + + + {images.length > 1 && ( + <> + + + + )} +
+ ); +}; + +// Venue detail chips +const DetailChip = ({ + icon, + label, + onClick, + className, +}: { + icon: React.ReactNode; + label: string; + onClick?: () => void; + className?: string; +}) => ( +
+ {icon} + {label} +
+); + +// Pricing View + +const PricingView = ({ venue, onBack }: { venue: VenueDetail; onBack: () => void }) => { + return ( +
+
+ +

Pricing & Working Hours

+
+ +
+ {/* Working Hours */} + {venue.workingHours && venue.workingDays && venue.workingDays.length > 0 && ( +
+

+ Working Hours +

+
+ + {venue.workingDays.join(', ')} + + + {venue.workingHours.open} - {venue.workingHours.close} + +
+
+ )} + + {/* Pricing Details */} +
+

+ {venue.bookingType === 'fixedBooking' ? 'Fixed Packages' : 'Flexible Pricing'} +

+ + {venue.bookingType === 'fixedBooking' && + venue.fixedPackages && + venue.fixedPackages.length > 0 ? ( +
+ {venue.fixedPackages.map((pkg, i) => ( +
+
+

+ {pkg.slotName} +

+

+ {pkg.startTime} - {pkg.endTime} +

+
+
+

₹{pkg.price}

+
+
+ ))} +
+ ) : venue.bookingType === 'flexibleBooking' && venue.pricing ? ( +
+
+ Base Price + + ₹{venue.pricing.basePrice}{' '} + {venue.pricing.pricingType === 'timeBasedPricing' ? '/ hr' : '/ day'} + +
+ + {venue.pricing.pricingType === 'timeBasedPricing' && + venue.pricing.pricingRules && + venue.pricing.pricingRules.length > 0 && ( +
+ + + + + + + + + {venue.pricing.pricingRules.map((rule, i) => ( + + + + + ))} + +
Time WindowPrice / hr
+ {rule.fromTime} - {rule.toTime} + + ₹{rule.price} +
+
+ )} +
+ ) : ( +

+ No pricing details configured. +

+ )} +
+
+
+ ); +}; + +// Skeleton + +const ModalSkeleton = () => ( +
+ +
+ + + + +
+ +
+ {[1, 2, 3, 4].map((i) => ( + + ))} +
+
+); + +// Rejection History Sub-View + +const RejectionHistoryView = ({ myVenue, onBack }: { myVenue: MyVenue; onBack: () => void }) => { + const history = myVenue.rejectionHistory || []; + return ( +
+
+ +

+ Rejection History ({history.length}/10) +

+
+ +
+ {history.length === 0 ? ( +

+ No rejection history available. +

+ ) : ( + history + .slice() + .reverse() + .map((entry, idx) => ( +
+
+ Attempt #{entry.submissionNumber} + Deadline: {format(new Date(entry.editDeadline), 'PPp')} +
+ {entry.extendedAt && ( +

+ Extended on {format(new Date(entry.extendedAt), 'PPp')} +

+ )} +

+ {entry.reason} +

+
+ )) + )} +
+
+ ); +}; + +// Action button per status + +const StatusAction = ({ venue }: { venue: MyVenue }) => { + const isDeadlinePassed = + venue.currentEditDeadline && new Date() > new Date(venue.currentEditDeadline); + + if (venue.status === 'Rejected' && !isDeadlinePassed && (venue.submissionCount ?? 0) < 10) { + return ( + + ); + } + if (venue.status === 'Draft') { + return ( + + ); + } + if (venue.status === 'PendingReview') { + return ( + + ⏳ Awaiting review + + ); + } + return null; +}; + +// Main + +interface VenuePreviewModalProps { + venueId: string; + myVenue: MyVenue; + open: boolean; + onOpenChange: (open: boolean) => void; +} + +const VenuePreviewModal = ({ venueId, myVenue, open, onOpenChange }: VenuePreviewModalProps) => { + const { data: venue, isLoading } = useApiQuery( + ['venue-preview', venueId], + { url: API_ENDPOINTS.VENUE_BY_ID(venueId), method: 'GET' }, + { enabled: open } + ); + + const [view, setView] = useState<'main' | 'pricing' | 'history'>('main'); + + useEffect(() => { + if (!open) { + setTimeout(() => setView('main'), 300); + } + }, [open]); + + const statusConfig = getStatusConfig(myVenue); + const isDeadlinePassed = + myVenue.currentEditDeadline && new Date() > new Date(myVenue.currentEditDeadline); + const daysLeft = myVenue.currentEditDeadline + ? differenceInDays(new Date(myVenue.currentEditDeadline), new Date()) + : null; + + const images = venue?.coverImage + ? [venue.coverImage, ...(venue.galleryImages ?? [])] + : myVenue.coverImage + ? [myVenue.coverImage] + : []; + + return ( + + + {/* Fixed Header (Status Banner) */} +
+ + {myVenue.name} — {statusConfig.title} + + +
+
+ {statusConfig.icon} +
+
+
+ + {statusConfig.title} + +

+ {myVenue.name} +

+
+

+ {statusConfig.message} +

+
+
+ + {/* Rejection deadline */} + {myVenue.status === 'Rejected' && myVenue.currentEditDeadline && ( +
+ {isDeadlinePassed ? ( + + ) : ( + + )} + + {isDeadlinePassed + ? 'Deadline passed' + : `${daysLeft} day${daysLeft !== 1 ? 's' : ''} left`} + + · + {format(new Date(myVenue.currentEditDeadline), 'dd MMM yyyy')} +
+ )} + + {/* Suspension reason */} + {myVenue.status === 'Suspended' && myVenue.suspensionReason && ( +
+ + + Reason: + {myVenue.suspensionReason} + +
+ )} +
+ + {/* Scrollable Body */} +
+ {isLoading ? ( + + ) : view === 'pricing' && venue ? ( + setView('main')} /> + ) : view === 'history' ? ( + setView('main')} /> + ) : venue ? ( +
+ {/* Compact image strip */} + {images.length > 0 && } + + {/* Quick detail chips */} +
+ } label={venue.venueType} /> + {venue.city && ( + } + label={`${venue.city}, ${venue.district}`} + /> + )} + {venue.maxCapacity && ( + } + label={`Up to ${venue.maxCapacity} guests`} + /> + )} + {venue.bookingType && ( + } + label={ + venue.bookingType === 'fixedBooking' ? 'Fixed Packages' : 'Flexible Slots' + } + onClick={() => setView('pricing')} + /> + )} +
+ + {/* Description */} + {venue.description && ( +
+

+ About +

+

+ {venue.description} +

+
+ )} + + {/* Address */} + {venue.address && ( +
+ + + {venue.address}, {venue.pincode} + +
+ )} + + {/* Amenities */} + {venue.amenities && venue.amenities.length > 0 && ( +
+

+ Amenities +

+
+ {venue.amenities.slice(0, 10).map((a, i) => ( + + {a} + + ))} + {venue.amenities.length > 10 && ( + + +{venue.amenities.length - 10} more + + )} +
+
+ )} + + {/* Space attributes */} + {venue.spaceAttributes && venue.spaceAttributes.length > 0 && ( +
+

+ Space Type +

+
+ {venue.spaceAttributes.map((a, i) => ( + + {a} + + ))} +
+
+ )} + + {myVenue.rejectionHistory && myVenue.rejectionHistory.length > 0 && ( +
setView('history')} + className="flex items-center justify-between cursor-pointer pt-3 border-t border-[var(--bg-grey)] group" + > +

+ Rejection Histories ({myVenue.rejectionHistory.length}/10) +

+ +
+ )} +
+ ) : ( +
+

Could not load venue details.

+

+ {myVenue.venueType} · {myVenue.city} +

+
+ )} +
+ + {/* Sticky Footer */} +
+

+ Private owner preview · not publicly visible +

+
+ + +
+
+
+
+ ); +}; + +export default VenuePreviewModal; diff --git a/client/src/pages/listVenue/myVenue/index.tsx b/client/src/pages/listVenue/myVenue/index.tsx new file mode 100644 index 0000000000..9171b568c9 --- /dev/null +++ b/client/src/pages/listVenue/myVenue/index.tsx @@ -0,0 +1,124 @@ +import { Link } from 'react-router'; +import { MdAddBusiness } from 'react-icons/md'; +import { useApiQuery } from '@/hooks/useApi'; +import { API_ENDPOINTS } from '@/constants'; +import type { MyVenue } from '@/types/venue.types'; +import VenueCard from './components/VenueCard'; +import { Button } from '@/components/ui/button'; +import VenueCardSkeleton from '@/components/common/VenueCardSkeleton'; + +interface MyVenuesResponse { + count: number; + venues: MyVenue[]; +} + +const MyVenues = () => { + const { data, isLoading, isError, refetch } = useApiQuery('my-venues', { + url: API_ENDPOINTS.MY_VENUES, + method: 'GET', + }); + + return ( +
+
+
+

My Venues

+

+ Manage your listed venues and check their approval status. +

+
+ + {data?.venues && data.venues.length > 0 && ( + + )} +
+ + {isLoading && } + + {isError && ( +
+

+ Failed to load your venues. Please try again. +

+ +
+ )} + + {data && data.venues.length === 0 && ( +
+
+ +
+

No venues yet

+

+ You haven't listed any venues yet. Start earning by listing your space for events, + weddings, and parties. +

+ +
+ )} + + {data && data.venues.length > 0 && ( +
+ {(() => { + const flagged = data.venues.filter((v) => v.status !== 'Approved'); + const approved = data.venues.filter((v) => v.status === 'Approved'); + return ( + <> + {flagged.length > 0 && ( +
+
+

+ Needs Attention +

+ + {flagged.length} + +
+
+ {flagged.map((venue) => ( + + ))} +
+
+ )} + {approved.length > 0 && ( +
+
+

+ Active Venues +

+ + {approved.length} + +
+
+ {approved.map((venue) => ( + + ))} +
+
+ )} + + ); + })()} +
+ )} +
+ ); +}; + +export default MyVenues; diff --git a/client/src/router.tsx b/client/src/router.tsx new file mode 100644 index 0000000000..a13e4594a9 --- /dev/null +++ b/client/src/router.tsx @@ -0,0 +1,68 @@ +import { BrowserRouter, Routes, Route } from 'react-router'; +import { AdminRedirect } from './components/common/AdminRedirect'; + +import HomePage from './pages/home'; +import ExplorePage from './pages/Explore'; +import RegisterPage from './pages/Auth/register'; +import LoginPage from './pages/Auth/login'; +import ForgotPasswordPage from './pages/Auth/forgotPassword'; +import ResetPasswordPage from './pages/Auth/resetPassword'; +import MainLayout from './layout/MainLayout'; +import ListVenueLayout from './pages/listVenue/ListVenueLayout'; +import MyVenues from './pages/listVenue/myVenue'; +import AddVenue from './pages/listVenue/addVenue'; +import AuthGuard from './components/common/AuthGuard'; +import GuestGuard from './components/common/GuestGuard'; +import VenueDetails from './pages/Explore/venueDetails'; +import WishlistPage from './pages/Wishlist'; +import BookingSummary from './pages/Booking/summary'; +import BookingConfirmation from './pages/Booking/confirmation'; +import MyBookingsPage from './pages/Booking/myBookings'; +import BookingDetailsPage from './pages/Booking/bookingDetails'; +import ProfilePage from './pages/Profile'; +import NotFound from './pages/NotFound'; + +export function AppRouter() { + return ( + + + {/* Public Layout Routes */} + }> + } /> + } /> + } /> + + + {/* Guest-only Routes */} + }> + } /> + } /> + } /> + } /> + + + {/* Protected Routes */} + }> + }> + } /> + } /> + } /> + } /> + } /> + } /> + + + }> + } /> + } /> + } /> + } /> + + + + } /> + } /> + + + ); +} diff --git a/client/src/services/authService.ts b/client/src/services/authService.ts new file mode 100644 index 0000000000..22b19a80cf --- /dev/null +++ b/client/src/services/authService.ts @@ -0,0 +1,29 @@ +import { axiosInstance } from '@/config/axios'; +import { API_ENDPOINTS } from '@/constants'; + +export interface SessionSummary { + id: string; + ipAddress: string; + userAgent: string; + lastLogin: string; + createdAt: string; + isCurrent: boolean; +} + +export async function changePassword(oldPassword: string, newPassword: string): Promise { + await axiosInstance.patch(API_ENDPOINTS.CHANGE_PASSWORD, { oldPassword, newPassword }); +} + +export async function getSessions(): Promise { + const res = await axiosInstance.get(API_ENDPOINTS.SESSIONS); + return res.data?.data ?? res.data; +} + +export async function revokeSession(sessionId: string): Promise { + await axiosInstance.delete(API_ENDPOINTS.SESSION_BY_ID(sessionId)); +} + +export async function logoutOtherSessions(): Promise<{ revokedCount: number }> { + const res = await axiosInstance.post(API_ENDPOINTS.LOGOUT_OTHER_SESSIONS); + return res.data?.data ?? res.data; +} diff --git a/client/src/services/bookingService.ts b/client/src/services/bookingService.ts new file mode 100644 index 0000000000..82d81363fb --- /dev/null +++ b/client/src/services/bookingService.ts @@ -0,0 +1,50 @@ +import { axiosInstance as api } from '@/config/axios'; +import { API_ENDPOINTS } from '@/constants'; +import type { + BookingCardDTO, + BookingDetailDTO, + BookerInfoForm, + CancelBookingResponse, +} from '@/types/booking.types'; + +export type ApiResponse = { success: boolean; data: T; message?: string }; + +export const getMyBookings = async (): Promise< + ApiResponse<{ + bookings: { + upcoming: BookingCardDTO[]; + completed: BookingCardDTO[]; + cancelled: BookingCardDTO[]; + }; + }> +> => { + const response = await api.get(API_ENDPOINTS.MY_BOOKINGS); + return response.data; +}; + +export const getBookingById = async (id: string): Promise> => { + const response = await api.get(API_ENDPOINTS.BOOKING_BY_ID(id)); + return response.data; +}; + +export const saveBookerDetails = async ( + payload: BookerInfoForm & { lockId: string } +): Promise> => { + const { lockId, ...rest } = payload; + const { guestCount, eventType, ...bookerInfo } = rest; + const response = await api.patch(API_ENDPOINTS.SAVE_BOOKER_DETAILS, { + lockId, + guestCount: Number(guestCount), + eventType, + bookerInfo, + }); + return response.data; +}; + +export const cancelBooking = async ( + id: string, + reason?: string +): Promise> => { + const response = await api.delete(API_ENDPOINTS.CANCEL_BOOKING(id), { data: { reason } }); + return response.data; +}; diff --git a/client/src/services/reviewService.ts b/client/src/services/reviewService.ts new file mode 100644 index 0000000000..c127709898 --- /dev/null +++ b/client/src/services/reviewService.ts @@ -0,0 +1,95 @@ +import { axiosInstance } from '@/config/axios'; +import { API_ENDPOINTS } from '@/constants'; + +export interface ReviewDTO { + rating?: number; + comment?: string; +} + +export interface UpdateReviewDTO { + rating?: number; + comment?: string; +} + +export interface Review { + _id: string; + venueId: string; + user: { + id: string; + userName: string; + isVerified?: boolean; + }; + rating?: number; + comment?: string; + createdAt: string; + editedAt?: string; + reviewerRating?: number; + ownerReply?: { + text: string; + repliedAt: string; + }; +} + +export interface ReviewsResponse { + reviews: Review[]; + pagination: { + page: number; + limit: number; + total: number; + totalPages: number; + hasMore: boolean; + }; +} + +export async function getVenueReviews( + venueId: string, + page: number = 1, + limit: number = 10 +): Promise { + const { data } = await axiosInstance.get( + `${API_ENDPOINTS.VENUE_REVIEWS(venueId)}?page=${page}&limit=${limit}` + ); + + interface ReviewRaw { + userId?: { _id?: string; id?: string; username?: string; userName?: string } | string; + userName?: string; + isVerified?: boolean; + [key: string]: unknown; + } + + const reviews = data.data.reviews.map((r: ReviewRaw) => { + const userIdObj = typeof r.userId === 'object' && r.userId !== null ? r.userId : null; + return { + ...r, + user: { + id: userIdObj?._id || userIdObj?.id || r.userId, + userName: userIdObj?.username || userIdObj?.userName || r.userName || 'Unknown', + isVerified: r.isVerified, + }, + }; + }); + + return { + ...data.data, + reviews, + }; +} + +export async function submitReview(venueId: string, dto: ReviewDTO): Promise { + const { data } = await axiosInstance.post(API_ENDPOINTS.VENUE_REVIEWS(venueId), dto); + return data.data; +} + +export async function getMyRating(venueId: string): Promise { + const { data } = await axiosInstance.get(API_ENDPOINTS.VENUE_MY_RATING(venueId)); + return data.data.rating; +} + +export async function updateReview(reviewId: string, dto: UpdateReviewDTO): Promise { + const { data } = await axiosInstance.patch(API_ENDPOINTS.REVIEW_BY_ID(reviewId), dto); + return data.data; +} + +export async function deleteReview(reviewId: string): Promise { + await axiosInstance.delete(API_ENDPOINTS.REVIEW_BY_ID(reviewId)); +} diff --git a/client/src/services/userService.ts b/client/src/services/userService.ts new file mode 100644 index 0000000000..a6ac862fe6 --- /dev/null +++ b/client/src/services/userService.ts @@ -0,0 +1,38 @@ +import { axiosInstance } from '@/config/axios'; +import { API_ENDPOINTS } from '@/constants'; + +export interface UpdateProfileDto { + username?: string; + profilePicturePublicId?: string; +} + +export interface CloudinarySignatureResponse { + signature: string; + timestamp: number; + cloudName: string; + apiKey: string; + uploadPreset: string; + folder: string; +} + +export interface UpdatedProfile { + _id: string; + name: string; + email: string; + profilePicture?: string; +} + +export async function updateProfile(dto: UpdateProfileDto): Promise { + const res = await axiosInstance.patch(API_ENDPOINTS.PROFILE, dto); + return res.data?.data ?? res.data; +} + +export async function getAvatarUploadSignature(): Promise { + const res = await axiosInstance.get(API_ENDPOINTS.PROFILE_UPLOAD_SIGNATURE); + return res.data?.data ?? res.data; +} + +export async function deleteProfilePicture(): Promise { + const res = await axiosInstance.delete(API_ENDPOINTS.PROFILE_PICTURE); + return res.data?.data ?? res.data; +} diff --git a/client/src/services/venueService.ts b/client/src/services/venueService.ts new file mode 100644 index 0000000000..62094b4e09 --- /dev/null +++ b/client/src/services/venueService.ts @@ -0,0 +1,54 @@ +import { axiosInstance } from '@/config/axios'; +import { API_ENDPOINTS } from '@/constants'; +import type { VenueFilters } from '@/types/venue.types'; + +export async function createVenue(dto: unknown) { + const res = await axiosInstance.post(API_ENDPOINTS.VENUES, dto); + return res.data?.data ?? res.data; +} + +export async function submitVenue(venueId: string) { + const res = await axiosInstance.post(API_ENDPOINTS.VENUE_SUBMIT(venueId)); + return res.data?.data ?? res.data; +} + +export async function getUploadSignature() { + const res = await axiosInstance.get(API_ENDPOINTS.UPLOAD_SIGNATURE); + return res.data?.data ?? res.data; +} + +export async function getMyVenues() { + const res = await axiosInstance.get(API_ENDPOINTS.MY_VENUES); + return res.data?.data ?? res.data; +} + +// PUT /venues/draft +export async function upsertVenueDraft(step: number, formValues: unknown) { + const res = await axiosInstance.put(API_ENDPOINTS.VENUE_DRAFT, { step, formValues }); + return res.data?.data ?? res.data; +} + +// GET /venues/draft +export async function getMyDraft(): Promise | null> { + const res = await axiosInstance.get(API_ENDPOINTS.VENUE_DRAFT); + return res.data?.data ?? null; +} + +// PUT /venues/:id +export async function updateVenue(venueId: string, dto: unknown) { + const res = await axiosInstance.put(API_ENDPOINTS.VENUE_UPDATE(venueId), dto); + return res.data?.data ?? res.data; +} +// GET /venues +export async function getPublicVenues(filters: VenueFilters, page: number, limit: number) { + const res = await axiosInstance.get(API_ENDPOINTS.VENUES, { + params: { ...filters, page, limit }, + }); + return res.data?.data ?? res.data; +} + +// GET /venues/:id +export async function getVenueById(id: string) { + const res = await axiosInstance.get(API_ENDPOINTS.VENUE_BY_ID(id)); + return res.data?.data ?? res.data; +} diff --git a/client/src/services/wishlistService.ts b/client/src/services/wishlistService.ts new file mode 100644 index 0000000000..3baac0a1fb --- /dev/null +++ b/client/src/services/wishlistService.ts @@ -0,0 +1,50 @@ +import { axiosInstance } from '@/config/axios'; +import { API_ENDPOINTS } from '@/constants'; + +export interface WishlistResponse { + wishlisted: boolean; +} + +export interface WishlistStatusResponse { + [venueId: string]: boolean; +} + +export async function toggleWishlist(venueId: string): Promise { + const { data } = await axiosInstance.post<{ data: WishlistResponse }>( + API_ENDPOINTS.WISHLIST_TOGGLE(venueId) + ); + return data.data; +} + +export async function getMyWishlist(page: number = 1, limit: number = 20) { + const { data } = await axiosInstance.get(API_ENDPOINTS.WISHLIST, { + params: { page, limit }, + }); + return data; +} + +export async function getWishlistStatus(venueIds: string[]): Promise { + if (!venueIds.length) return {}; + + const { data } = await axiosInstance.get<{ data: WishlistStatusResponse }>( + API_ENDPOINTS.WISHLIST_STATUS, + { + params: { + venueIds: venueIds.join(','), + }, + } + ); + return data.data; +} + +export async function syncWishlist(venueIds: string[]): Promise { + if (!venueIds.length) return {}; + + const { data } = await axiosInstance.post<{ data: WishlistStatusResponse }>( + API_ENDPOINTS.WISHLIST_SYNC, + { + venueIds, + } + ); + return data.data; +} diff --git a/client/src/tests/config/axios.test.ts b/client/src/tests/config/axios.test.ts new file mode 100644 index 0000000000..a53c5da860 --- /dev/null +++ b/client/src/tests/config/axios.test.ts @@ -0,0 +1,87 @@ +import { describe, it, expect, vi, beforeEach } from 'vitest'; + +vi.mock('@/constants', () => ({ + API_BASE_URL: 'http://test.local', + STORAGE_KEYS: { + SESSION_TOKEN: 'x-session-token', + IS_LOGGED_IN: 'isLoggedIn', + USER_ID: 'user_id', + USER_NAME: 'user_name', + USER_ROLE: 'user_role', + }, + API_ENDPOINTS: { + LOGIN: '/auth/login', + REGISTER: '/auth/register', + REFRESH: '/auth/refresh', + LOGOUT: '/auth/logout', + PROFILE: '/user/profile', + VENUES: '/venues', + MY_VENUES: '/venues/my-venues', + VENUE_BY_ID: (id: string) => `/venues/${id}`, + VENUE_SUBMIT: (id: string) => `/venues/${id}/submit`, + VENUE_UPDATE: (id: string) => `/venues/${id}`, + VENUE_DRAFT: '/venues/draft', + UPLOAD_SIGNATURE: '/venues/upload-signature', + MY_BOOKINGS: '/bookings/my-bookings', + BOOKING_BY_ID: (id: string) => `/bookings/${id}`, + SAVE_BOOKER_DETAILS: '/bookings/booker-details', + CANCEL_BOOKING: (id: string) => `/bookings/${id}`, + CHECKOUT: '/bookings/checkout', + RELEASE_LOCK: '/availability/lock', + GET_AVAILABILITY: (id: string) => `/availability/${id}`, + BLOCK_SLOT: (id: string) => `/availability/${id}/block`, + FORGOT_PASSWORD: '/auth/forgot-password', + RESET_PASSWORD: '/auth/reset-password', + SEARCH: '/search', + DASHBOARD: '/dashboard', + }, +})); + +describe('createAxiosInstance', () => { + beforeEach(() => { + vi.resetModules(); + vi.clearAllMocks(); + localStorage.clear(); + }); + + it('should create an axios instance with correct defaults', async () => { + const { createAxiosInstance } = await import('../../config/axios'); + const instance = createAxiosInstance(); + expect(instance.defaults.baseURL).toBe('http://test.local/api/v1'); + expect(instance.defaults.withCredentials).toBe(true); + expect(instance.defaults.timeout).toBe(30000); + }); + + it('should set session token in request interceptor', async () => { + localStorage.setItem('x-session-token', 'test-token-123'); + const { createAxiosInstance } = await import('../../config/axios'); + const instance = createAxiosInstance(); + const interceptor = instance.interceptors.request; + expect(interceptor).toBeDefined(); + }); + + it('should generate session token on request', async () => { + const { createAxiosInstance } = await import('../../config/axios'); + const instance = createAxiosInstance(); + instance.interceptors.request.handlers[0].fulfilled({ headers: {} } as never); + const token = localStorage.getItem('x-session-token'); + expect(token).toBeTruthy(); + expect(token?.length).toBeGreaterThan(0); + }); + + it('should export a singleton axiosInstance', async () => { + const { axiosInstance } = await import('../../config/axios'); + expect(axiosInstance).toBeDefined(); + expect(axiosInstance.defaults.baseURL).toBe('http://test.local/api/v1'); + }); + + it('should handle error extraction from AxiosError message', () => { + const error = new Error('Request failed'); + expect(error.message).toBe('Request failed'); + }); + + it('should handle errors without response', () => { + const error = new Error('Network Error'); + expect(error.message).toBe('Network Error'); + }); +}); diff --git a/client/src/tests/config/queryClient.test.ts b/client/src/tests/config/queryClient.test.ts new file mode 100644 index 0000000000..fd330c9104 --- /dev/null +++ b/client/src/tests/config/queryClient.test.ts @@ -0,0 +1,16 @@ +import { describe, it, expect } from 'vitest'; + +describe('queryClient', () => { + it('should export a QueryClient with correct defaults', async () => { + const { queryClient } = await import('../../config/queryClient'); + expect(queryClient).toBeDefined(); + expect(queryClient.getQueryDefaults).toBeDefined(); + expect(queryClient.getMutationDefaults).toBeDefined(); + }); + + it('should have default staleTime of 5 minutes', async () => { + const { queryClient } = await import('../../config/queryClient'); + const defaults = queryClient.getQueryDefaults(); + expect(defaults).toBeDefined(); + }); +}); diff --git a/client/src/tests/context/AuthContext.test.tsx b/client/src/tests/context/AuthContext.test.tsx new file mode 100644 index 0000000000..3037453e7e --- /dev/null +++ b/client/src/tests/context/AuthContext.test.tsx @@ -0,0 +1,113 @@ +import { describe, it, expect, vi, beforeEach } from 'vitest'; +import { render, screen, waitFor, act } from '@testing-library/react'; + +const mockGet = vi.fn(); +const mockPost = vi.fn(); +const mockClear = vi.fn(); + +vi.mock('@/config/axios', () => ({ + axiosInstance: { + get: mockGet, + post: mockPost, + }, +})); + +vi.mock('@/config/queryClient', () => ({ + queryClient: { + clear: mockClear, + }, +})); + +vi.mock('@/hooks/useToast', () => ({ + useToast: () => ({ success: vi.fn(), error: vi.fn(), info: vi.fn() }), +})); + +vi.mock('@/utils/venueDraft', () => ({ + clearDraft: vi.fn(), + clearDraftSession: vi.fn(), +})); + +vi.mock('@/utils/profileGreeting', () => ({ + resetProfileGreeting: vi.fn(), +})); + +vi.mock('@/constants', () => ({ + STORAGE_KEYS: { + SESSION_TOKEN: 'x-session-token', + IS_LOGGED_IN: 'isLoggedIn', + USER_ID: 'user_id', + USER_NAME: 'user_name', + USER_ROLE: 'user_role', + }, + API_ENDPOINTS: { + LOGIN: '/auth/login', + REGISTER: '/auth/register', + LOGOUT: '/auth/logout', + PROFILE: '/user/profile', + }, +})); + +describe('AuthProvider', () => { + beforeEach(() => { + vi.clearAllMocks(); + localStorage.clear(); + }); + + it('should render children', async () => { + const { AuthProvider } = await import('../../context/AuthContext'); + render( + +
child content
+
+ ); + expect(screen.getByText('child content')).toBeInTheDocument(); + }); + + it('should call verifySession on mount when logged in', async () => { + localStorage.setItem('isLoggedIn', 'true'); + mockGet.mockResolvedValue({ + data: { data: { _id: 'user-1', username: 'john', email: 'john@test.com' } }, + }); + + const { AuthProvider } = await import('../../context/AuthContext'); + render( + +
child
+
+ ); + + await waitFor(() => { + expect(mockGet).toHaveBeenCalledWith('/user/profile'); + }); + }); + + it('should not call verifySession on mount when not logged in', async () => { + const { AuthProvider } = await import('../../context/AuthContext'); + render( + +
child
+
+ ); + + await waitFor(() => { + expect(mockGet).not.toHaveBeenCalled(); + }); + }); + + it('should clear auth data on auth:logout event', async () => { + const { AuthProvider } = await import('../../context/AuthContext'); + render( + +
child
+
+ ); + + act(() => { + window.dispatchEvent(new CustomEvent('auth:logout')); + }); + + await waitFor(() => { + expect(mockClear).toHaveBeenCalled(); + }); + }); +}); diff --git a/client/src/tests/context/ThemeContext.test.tsx b/client/src/tests/context/ThemeContext.test.tsx new file mode 100644 index 0000000000..c8a26cdce4 --- /dev/null +++ b/client/src/tests/context/ThemeContext.test.tsx @@ -0,0 +1,63 @@ +import React from 'react'; +import { describe, it, expect, beforeEach, vi } from 'vitest'; +import { render, screen } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import { ThemeProvider } from '@/context/ThemeContext'; +import { useTheme } from '@/hooks/useTheme'; +import { STORAGE_KEYS } from '@/constants'; + +const TestComponent: React.FC = () => { + const { themePreference, resolvedTheme, setThemePreference } = useTheme(); + + return ( +
+ {themePreference} + {resolvedTheme} + + +
+ ); +}; + +describe('client ThemeContext & ThemeProvider', () => { + beforeEach(() => { + localStorage.clear(); + document.documentElement.classList.remove('dark'); + }); + + it('should render default light theme when no preference stored', () => { + render( + + + + ); + + expect(screen.getByTestId('pref')).toHaveTextContent('light'); + expect(screen.getByTestId('resolved')).toHaveTextContent('light'); + }); + + it('should update theme preference and add "dark" class to document element', async () => { + const user = userEvent.setup(); + + render( + + + + ); + + await user.click(screen.getByText('Set Dark')); + + expect(screen.getByTestId('pref')).toHaveTextContent('dark'); + expect(screen.getByTestId('resolved')).toHaveTextContent('dark'); + expect(document.documentElement.classList.contains('dark')).toBe(true); + expect(localStorage.getItem(STORAGE_KEYS.THEME)).toBe('dark'); + }); + + it('should throw error when useTheme is used outside of ThemeProvider', () => { + const consoleSpy = vi.spyOn(console, 'error').mockImplementation(() => {}); + + expect(() => render()).toThrow('useTheme must be used within a ThemeProvider'); + + consoleSpy.mockRestore(); + }); +}); diff --git a/client/src/tests/hooks/useApi.test.tsx b/client/src/tests/hooks/useApi.test.tsx new file mode 100644 index 0000000000..0d4f0686d7 --- /dev/null +++ b/client/src/tests/hooks/useApi.test.tsx @@ -0,0 +1,156 @@ +import { describe, it, expect, vi, beforeEach } from 'vitest'; +import { renderHook, waitFor } from '@testing-library/react'; +import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; +import type { ReactNode } from 'react'; + +const mockRequest = vi.fn(); +const mockAxiosInstance = Object.assign( + function (config: Record) { + return mockRequest(config); + }, + { + get: vi.fn(), + post: vi.fn(), + put: vi.fn(), + delete: vi.fn(), + request: mockRequest, + defaults: {} as Record, + interceptors: { + request: { use: vi.fn(), eject: vi.fn(), clear: vi.fn() }, + response: { use: vi.fn(), eject: vi.fn(), clear: vi.fn() }, + }, + } +); + +vi.mock('@/config/axios', () => ({ + axiosInstance: mockAxiosInstance, +})); + +vi.mock('@/hooks/useToast', () => ({ + useToast: () => ({ error: vi.fn(), success: vi.fn(), info: vi.fn() }), +})); + +function createWrapper() { + const queryClient = new QueryClient({ + defaultOptions: { + queries: { retry: false, gcTime: 0 }, + }, + }); + + return function Wrapper({ children }: { children: ReactNode }) { + return {children}; + }; +} + +describe('useApiQuery', () => { + beforeEach(() => { + vi.clearAllMocks(); + }); + + it('should fetch data and unwrap response.data.data', async () => { + mockRequest.mockResolvedValue({ + data: { data: { id: 1, name: 'Test' } }, + }); + + const { useApiQuery } = await import('../../hooks/useApi'); + + const { result } = renderHook( + () => useApiQuery<{ id: number; name: string }>(['test'], { method: 'GET', url: '/test' }), + { wrapper: createWrapper() } + ); + + await waitFor(() => expect(result.current.isSuccess).toBe(true)); + expect(result.current.data).toEqual({ id: 1, name: 'Test' }); + expect(mockRequest).toHaveBeenCalledWith({ method: 'GET', url: '/test' }); + }); + + it('should fall back to response.data when data.data is undefined', async () => { + mockRequest.mockResolvedValue({ + data: { message: 'ok' }, + }); + + const { useApiQuery } = await import('../../hooks/useApi'); + + const { result } = renderHook(() => useApiQuery(['test'], { method: 'GET', url: '/test' }), { + wrapper: createWrapper(), + }); + + await waitFor(() => expect(result.current.isSuccess).toBe(true)); + expect(result.current.data).toEqual({ message: 'ok' }); + }); + + it('should pass query options through', async () => { + mockRequest.mockResolvedValue({ + data: { data: 'value' }, + }); + + const { useApiQuery } = await import('../../hooks/useApi'); + const staleTime = 10000; + const enabled = false; + + const { result } = renderHook( + () => useApiQuery(['test'], { method: 'GET', url: '/test' }, { staleTime, enabled }), + { wrapper: createWrapper() } + ); + + expect(result.current.isFetching).toBe(false); + }); + + it('should accept string query key', async () => { + mockRequest.mockResolvedValue({ + data: { data: 'result' }, + }); + + const { useApiQuery } = await import('../../hooks/useApi'); + + const { result } = renderHook(() => useApiQuery('test-key', { method: 'GET', url: '/test' }), { + wrapper: createWrapper(), + }); + + await waitFor(() => expect(result.current.isSuccess).toBe(true)); + expect(result.current.data).toBe('result'); + }); +}); + +describe('useApiMutation', () => { + beforeEach(() => { + vi.clearAllMocks(); + }); + + it('should call mutation with config and merge variables as data', async () => { + mockRequest.mockResolvedValue({ + data: { data: { id: 1 } }, + }); + + const { useApiMutation } = await import('../../hooks/useApi'); + + const { result } = renderHook(() => useApiMutation({ method: 'POST', url: '/create' }), { + wrapper: createWrapper(), + }); + + result.current.mutate({ name: 'New Item' }); + + await waitFor(() => expect(result.current.isSuccess).toBe(true)); + expect(mockRequest).toHaveBeenCalledWith({ + method: 'POST', + url: '/create', + data: { name: 'New Item' }, + }); + expect(result.current.data).toEqual({ id: 1 }); + }); + + it('should fail on network error', async () => { + mockRequest.mockRejectedValue(new Error('Network Error')); + + const { useApiMutation } = await import('../../hooks/useApi'); + + const { result } = renderHook(() => useApiMutation({ method: 'POST', url: '/fail' }), { + wrapper: createWrapper(), + }); + + result.current.mutate({}); + + await waitFor(() => expect(result.current.isError).toBe(true)); + expect(result.current.error).toBeDefined(); + }); +}); diff --git a/client/src/tests/hooks/useAuth.test.tsx b/client/src/tests/hooks/useAuth.test.tsx new file mode 100644 index 0000000000..cc92c111f8 --- /dev/null +++ b/client/src/tests/hooks/useAuth.test.tsx @@ -0,0 +1,18 @@ +import { describe, it, expect, vi } from 'vitest'; +import { renderHook } from '@testing-library/react'; + +vi.mock('@/context/AuthContext', () => ({ + AuthContext: { + Consumer: ({ children }: { children: (value: unknown) => unknown }) => children({}), + }, +})); + +describe('useAuth', () => { + it('should throw when used outside AuthProvider', async () => { + const { useAuth } = await import('../../hooks/useAuth'); + + expect(() => { + renderHook(() => useAuth()); + }).toThrow('useAuth must be used within an AuthProvider'); + }); +}); diff --git a/client/src/tests/hooks/useDebounce.test.ts b/client/src/tests/hooks/useDebounce.test.ts new file mode 100644 index 0000000000..fdff238d52 --- /dev/null +++ b/client/src/tests/hooks/useDebounce.test.ts @@ -0,0 +1,77 @@ +import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest'; +import { renderHook, act } from '@testing-library/react'; + +describe('useDebounce', () => { + beforeEach(() => { + vi.useFakeTimers(); + }); + + afterEach(() => { + vi.useRealTimers(); + }); + + it('should return initial value immediately', async () => { + const { useDebounce } = await import('../../hooks/useDebounce'); + const { result } = renderHook(() => useDebounce('hello', 500)); + expect(result.current).toBe('hello'); + }); + + it('should update value after delay', async () => { + const { useDebounce } = await import('../../hooks/useDebounce'); + const { result, rerender } = renderHook(({ value, delay }) => useDebounce(value, delay), { + initialProps: { value: 'hello', delay: 500 }, + }); + + rerender({ value: 'world', delay: 500 }); + + expect(result.current).toBe('hello'); + + act(() => { + vi.advanceTimersByTime(500); + }); + + expect(result.current).toBe('world'); + }); + + it('should reset timer when value changes', async () => { + const { useDebounce } = await import('../../hooks/useDebounce'); + const { result, rerender } = renderHook(({ value, delay }) => useDebounce(value, delay), { + initialProps: { value: 'a', delay: 500 }, + }); + + rerender({ value: 'ab', delay: 500 }); + + act(() => { + vi.advanceTimersByTime(300); + }); + + rerender({ value: 'abc', delay: 500 }); + + act(() => { + vi.advanceTimersByTime(300); + }); + + expect(result.current).toBe('a'); + + act(() => { + vi.advanceTimersByTime(200); + }); + + expect(result.current).toBe('abc'); + }); + + it('should work with number values', async () => { + const { useDebounce } = await import('../../hooks/useDebounce'); + const { result, rerender } = renderHook(({ value, delay }) => useDebounce(value, delay), { + initialProps: { value: 0, delay: 300 }, + }); + + rerender({ value: 42, delay: 300 }); + + act(() => { + vi.advanceTimersByTime(300); + }); + + expect(result.current).toBe(42); + }); +}); diff --git a/client/src/tests/hooks/useLockTimer.test.ts b/client/src/tests/hooks/useLockTimer.test.ts new file mode 100644 index 0000000000..7867bfef35 --- /dev/null +++ b/client/src/tests/hooks/useLockTimer.test.ts @@ -0,0 +1,90 @@ +import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest'; +import { renderHook, act } from '@testing-library/react'; + +describe('useLockTimer', () => { + beforeEach(() => { + vi.useFakeTimers(); + vi.setSystemTime(new Date('2026-07-25T12:00:00Z')); + }); + + afterEach(() => { + vi.useRealTimers(); + }); + + it('should return 0 remaining when no expiresAt', async () => { + const { useLockTimer } = await import('../../hooks/useLockTimer'); + const { result } = renderHook(() => useLockTimer(null)); + expect(result.current.remainingMs).toBe(0); + expect(result.current.formattedTime).toBe('00:00'); + expect(result.current.isExpired).toBe(false); + }); + + it('should show remaining time in MM:SS', async () => { + const { useLockTimer } = await import('../../hooks/useLockTimer'); + const future = new Date('2026-07-25T12:05:00Z'); + const { result } = renderHook(() => useLockTimer(future)); + + expect(result.current.remainingMs).toBe(5 * 60 * 1000); + expect(result.current.formattedTime).toBe('05:00'); + expect(result.current.isExpired).toBe(false); + }); + + it('should count down every second', async () => { + const { useLockTimer } = await import('../../hooks/useLockTimer'); + const future = new Date('2026-07-25T12:02:00Z'); + const { result } = renderHook(() => useLockTimer(future)); + + expect(result.current.formattedTime).toBe('02:00'); + + act(() => { + vi.advanceTimersByTime(1000); + }); + + expect(result.current.formattedTime).toBe('01:59'); + }); + + it('should mark as expired when time runs out', async () => { + const { useLockTimer } = await import('../../hooks/useLockTimer'); + const future = new Date('2026-07-25T12:00:01Z'); + const onExpire = vi.fn(); + const { result } = renderHook(() => useLockTimer(future, onExpire)); + + expect(result.current.isExpired).toBe(false); + + act(() => { + vi.advanceTimersByTime(1000); + }); + + expect(result.current.isExpired).toBe(true); + expect(result.current.formattedTime).toBe('00:00'); + expect(onExpire).toHaveBeenCalledTimes(1); + }); + + it('should trigger onExpire exactly once when transitioning to expired', async () => { + const { useLockTimer } = await import('../../hooks/useLockTimer'); + const future = new Date('2026-07-25T12:00:01Z'); + const onExpire = vi.fn(); + const { rerender } = renderHook(({ expiresAt, onExpire: oe }) => useLockTimer(expiresAt, oe), { + initialProps: { expiresAt: future, onExpire }, + }); + + expect(onExpire).toHaveBeenCalledTimes(0); + + act(() => { + vi.advanceTimersByTime(1000); + }); + + expect(onExpire).toHaveBeenCalledTimes(1); + + rerender({ expiresAt: new Date('2026-07-25T12:00:01Z'), onExpire }); + + expect(onExpire).toHaveBeenCalledTimes(1); + }); + + it('should round up to nearest second', async () => { + const { useLockTimer } = await import('../../hooks/useLockTimer'); + const future = new Date('2026-07-25T12:00:00.500Z'); + const { result } = renderHook(() => useLockTimer(future)); + expect(result.current.formattedTime).toBe('00:01'); + }); +}); diff --git a/client/src/tests/pages/Auth/login/validation.test.ts b/client/src/tests/pages/Auth/login/validation.test.ts new file mode 100644 index 0000000000..6a18b86ede --- /dev/null +++ b/client/src/tests/pages/Auth/login/validation.test.ts @@ -0,0 +1,33 @@ +import { describe, it, expect } from 'vitest'; + +describe('signinSchema', () => { + it('should validate a valid login', async () => { + const { signinSchema } = await import('../../../../pages/Auth/login/validation'); + const valid = await signinSchema.isValid({ + email: 'user@test.com', + password: 'mypassword', + }); + expect(valid).toBe(true); + }); + + it('should reject missing email', async () => { + const { signinSchema } = await import('../../../../pages/Auth/login/validation'); + await expect(signinSchema.validate({ password: 'mypassword' })).rejects.toThrow( + 'Email is required' + ); + }); + + it('should reject invalid email format', async () => { + const { signinSchema } = await import('../../../../pages/Auth/login/validation'); + await expect( + signinSchema.validate({ email: 'notanemail', password: 'mypassword' }) + ).rejects.toThrow('Enter a valid email address'); + }); + + it('should reject missing password', async () => { + const { signinSchema } = await import('../../../../pages/Auth/login/validation'); + await expect(signinSchema.validate({ email: 'user@test.com' })).rejects.toThrow( + 'Password required' + ); + }); +}); diff --git a/client/src/tests/pages/Auth/register/validation.test.ts b/client/src/tests/pages/Auth/register/validation.test.ts new file mode 100644 index 0000000000..d79d9626d9 --- /dev/null +++ b/client/src/tests/pages/Auth/register/validation.test.ts @@ -0,0 +1,120 @@ +import { describe, it, expect } from 'vitest'; + +describe('signupSchema', () => { + it('should validate a valid signup', async () => { + const { signupSchema } = await import('../../../../pages/Auth/register/validation'); + const valid = await signupSchema.isValid({ + name: 'John Doe', + email: 'user@test.com', + password: 'Passw0rd!', + confirmPassword: 'Passw0rd!', + }); + expect(valid).toBe(true); + }); + + it('should reject missing name', async () => { + const { signupSchema } = await import('../../../../pages/Auth/register/validation'); + await expect( + signupSchema.validate({ + email: 'user@test.com', + password: 'Passw0rd!', + confirmPassword: 'Passw0rd!', + }) + ).rejects.toThrow('Full name is required'); + }); + + it('should reject missing email', async () => { + const { signupSchema } = await import('../../../../pages/Auth/register/validation'); + await expect( + signupSchema.validate({ + name: 'John', + password: 'Passw0rd!', + confirmPassword: 'Passw0rd!', + }) + ).rejects.toThrow('Email is required'); + }); + + it('should reject invalid email', async () => { + const { signupSchema } = await import('../../../../pages/Auth/register/validation'); + await expect( + signupSchema.validate({ + name: 'John', + email: 'bad', + password: 'Passw0rd!', + confirmPassword: 'Passw0rd!', + }) + ).rejects.toThrow('Enter a valid email address'); + }); + + it('should reject password shorter than 8 characters', async () => { + const { signupSchema } = await import('../../../../pages/Auth/register/validation'); + await expect( + signupSchema.validate({ + name: 'John', + email: 'user@test.com', + password: 'Short1!', + confirmPassword: 'Short1!', + }) + ).rejects.toThrow('at least 8 characters'); + }); + + it('should reject password missing lowercase', async () => { + const { signupSchema } = await import('../../../../pages/Auth/register/validation'); + await expect( + signupSchema.validate({ + name: 'John', + email: 'user@test.com', + password: 'UPPERCASE1!', + confirmPassword: 'UPPERCASE1!', + }) + ).rejects.toThrow('lowercase letter'); + }); + + it('should reject password missing uppercase', async () => { + const { signupSchema } = await import('../../../../pages/Auth/register/validation'); + await expect( + signupSchema.validate({ + name: 'John', + email: 'user@test.com', + password: 'lowercase1!', + confirmPassword: 'lowercase1!', + }) + ).rejects.toThrow('uppercase letter'); + }); + + it('should reject password missing number', async () => { + const { signupSchema } = await import('../../../../pages/Auth/register/validation'); + await expect( + signupSchema.validate({ + name: 'John', + email: 'user@test.com', + password: 'NoNumber!', + confirmPassword: 'NoNumber!', + }) + ).rejects.toThrow('at least one number'); + }); + + it('should reject password missing special symbol', async () => { + const { signupSchema } = await import('../../../../pages/Auth/register/validation'); + await expect( + signupSchema.validate({ + name: 'John', + email: 'user@test.com', + password: 'NoSymbol1', + confirmPassword: 'NoSymbol1', + }) + ).rejects.toThrow('special symbol'); + }); + + it('should reject mismatched passwords', async () => { + const { signupSchema } = await import('../../../../pages/Auth/register/validation'); + await expect( + signupSchema.validate({ + name: 'John', + email: 'user@test.com', + password: 'Passw0rd!', + confirmPassword: 'Different1!', + }) + ).rejects.toThrow('Passwords do not match'); + }); +}); diff --git a/client/src/tests/services/authService.test.ts b/client/src/tests/services/authService.test.ts new file mode 100644 index 0000000000..65ce73033c --- /dev/null +++ b/client/src/tests/services/authService.test.ts @@ -0,0 +1,72 @@ +import { describe, it, expect, vi, beforeEach } from 'vitest'; +import { + changePassword, + getSessions, + revokeSession, + logoutOtherSessions, +} from '@/services/authService'; +import { axiosInstance } from '@/config/axios'; +import { API_ENDPOINTS } from '@/constants'; + +vi.mock('@/config/axios', () => ({ + axiosInstance: { + get: vi.fn(), + post: vi.fn(), + patch: vi.fn(), + delete: vi.fn(), + }, +})); + +describe('client authService', () => { + beforeEach(() => { + vi.clearAllMocks(); + }); + + it('should call changePassword endpoint with old and new password', async () => { + vi.mocked(axiosInstance.patch).mockResolvedValueOnce({ data: { success: true } }); + + await changePassword('OldPass123!', 'NewPass123!'); + + expect(axiosInstance.patch).toHaveBeenCalledWith(API_ENDPOINTS.CHANGE_PASSWORD, { + oldPassword: 'OldPass123!', + newPassword: 'NewPass123!', + }); + }); + + it('should fetch user sessions list via getSessions', async () => { + const mockSessions = [ + { + id: 'sess_1', + ipAddress: '127.0.0.1', + userAgent: 'Chrome', + lastLogin: '2026-07-22', + createdAt: '2026-07-22', + isCurrent: true, + }, + ]; + + vi.mocked(axiosInstance.get).mockResolvedValueOnce({ data: { data: mockSessions } }); + + const result = await getSessions(); + + expect(axiosInstance.get).toHaveBeenCalledWith(API_ENDPOINTS.SESSIONS); + expect(result).toEqual(mockSessions); + }); + + it('should revoke a session via revokeSession', async () => { + vi.mocked(axiosInstance.delete).mockResolvedValueOnce({ data: { success: true } }); + + await revokeSession('sess_123'); + + expect(axiosInstance.delete).toHaveBeenCalledWith(API_ENDPOINTS.SESSION_BY_ID('sess_123')); + }); + + it('should call logoutOtherSessions and return revoked count', async () => { + vi.mocked(axiosInstance.post).mockResolvedValueOnce({ data: { data: { revokedCount: 2 } } }); + + const result = await logoutOtherSessions(); + + expect(axiosInstance.post).toHaveBeenCalledWith(API_ENDPOINTS.LOGOUT_OTHER_SESSIONS); + expect(result).toEqual({ revokedCount: 2 }); + }); +}); diff --git a/client/src/tests/services/bookingService.test.ts b/client/src/tests/services/bookingService.test.ts new file mode 100644 index 0000000000..821bc845f6 --- /dev/null +++ b/client/src/tests/services/bookingService.test.ts @@ -0,0 +1,122 @@ +import { describe, it, expect, vi, beforeEach } from 'vitest'; + +const mockGet = vi.fn(); +const mockPatch = vi.fn(); +const mockDelete = vi.fn(); + +vi.mock('@/config/axios', () => ({ + axiosInstance: { + get: mockGet, + patch: mockPatch, + delete: mockDelete, + }, +})); + +vi.mock('@/constants', () => ({ + API_ENDPOINTS: { + MY_BOOKINGS: '/bookings/my-bookings', + BOOKING_BY_ID: (id: string) => `/bookings/${id}`, + SAVE_BOOKER_DETAILS: '/bookings/booker-details', + CANCEL_BOOKING: (id: string) => `/bookings/${id}`, + }, +})); + +describe('bookingService', () => { + beforeEach(() => { + vi.clearAllMocks(); + }); + + describe('getMyBookings', () => { + it('should GET my-bookings and return response data', async () => { + const responseData = { + success: true, + data: { + bookings: { + upcoming: [{ _id: 'b1' }], + completed: [], + cancelled: [], + }, + }, + }; + mockGet.mockResolvedValue({ data: responseData }); + + const { getMyBookings } = await import('../../services/bookingService'); + const result = await getMyBookings(); + + expect(mockGet).toHaveBeenCalledWith('/bookings/my-bookings'); + expect(result).toEqual(responseData); + }); + }); + + describe('getBookingById', () => { + it('should GET booking by id and return response data', async () => { + const responseData = { + success: true, + data: { + _id: 'b1', + venueName: 'Grand Hall', + bookingRef: 'REF-001', + }, + }; + mockGet.mockResolvedValue({ data: responseData }); + + const { getBookingById } = await import('../../services/bookingService'); + const result = await getBookingById('b1'); + + expect(mockGet).toHaveBeenCalledWith('/bookings/b1'); + expect(result).toEqual(responseData); + }); + }); + + describe('saveBookerDetails', () => { + it('should PATCH booker details with lockId', async () => { + mockPatch.mockResolvedValue({ data: { success: true, data: null } }); + + const { saveBookerDetails } = await import('../../services/bookingService'); + const result = await saveBookerDetails({ + lockId: 'lock-1', + guestCount: 50, + eventType: 'wedding', + name: 'John', + email: 'john@test.com', + phone: '9876543210', + place: 'Kochi', + }); + + expect(mockPatch).toHaveBeenCalledWith('/bookings/booker-details', { + lockId: 'lock-1', + guestCount: 50, + eventType: 'wedding', + bookerInfo: { + name: 'John', + email: 'john@test.com', + phone: '9876543210', + place: 'Kochi', + }, + }); + expect(result).toEqual({ success: true, data: null }); + }); + }); + + describe('cancelBooking', () => { + it('should DELETE booking with reason', async () => { + mockDelete.mockResolvedValue({ data: { success: true, data: { refundAmount: 500 } } }); + + const { cancelBooking } = await import('../../services/bookingService'); + const result = await cancelBooking('b1', 'Changed mind'); + + expect(mockDelete).toHaveBeenCalledWith('/bookings/b1', { data: { reason: 'Changed mind' } }); + expect(result).toEqual({ success: true, data: { refundAmount: 500 } }); + }); + + it('should cancel without reason', async () => { + mockDelete.mockResolvedValue({ data: { success: true, data: { refundAmount: 0 } } }); + + const { cancelBooking } = await import('../../services/bookingService'); + const result = await cancelBooking('b1'); + + expect(mockDelete).toHaveBeenCalledWith('/bookings/b1', { data: { reason: undefined } }); + expect(result).toEqual({ success: true, data: { refundAmount: 0 } }); + }); + }); +}); diff --git a/client/src/tests/services/venueService.test.ts b/client/src/tests/services/venueService.test.ts new file mode 100644 index 0000000000..a99f53f564 --- /dev/null +++ b/client/src/tests/services/venueService.test.ts @@ -0,0 +1,138 @@ +import { describe, it, expect, vi, beforeEach } from 'vitest'; + +const mockGet = vi.fn(); +const mockPost = vi.fn(); +const mockPut = vi.fn(); + +vi.mock('@/config/axios', () => ({ + axiosInstance: { + get: mockGet, + post: mockPost, + put: mockPut, + }, +})); + +vi.mock('@/constants', () => ({ + API_ENDPOINTS: { + VENUES: '/venues', + VENUE_SUBMIT: (id: string) => `/venues/${id}/submit`, + UPLOAD_SIGNATURE: '/venues/upload-signature', + MY_VENUES: '/venues/my-venues', + VENUE_DRAFT: '/venues/draft', + VENUE_UPDATE: (id: string) => `/venues/${id}`, + VENUE_BY_ID: (id: string) => `/venues/${id}`, + }, +})); + +describe('venueService', () => { + beforeEach(() => { + vi.clearAllMocks(); + }); + + describe('createVenue', () => { + it('should POST to VENUES endpoint', async () => { + mockPost.mockResolvedValue({ data: { data: { id: 'venue-1' } } }); + const { createVenue } = await import('../../services/venueService'); + const result = await createVenue({ name: 'Test' }); + expect(mockPost).toHaveBeenCalledWith('/venues', { name: 'Test' }); + expect(result).toEqual({ id: 'venue-1' }); + }); + + it('should fall back to response.data', async () => { + mockPost.mockResolvedValue({ data: { id: 'venue-1' } }); + const { createVenue } = await import('../../services/venueService'); + const result = await createVenue({ name: 'Test' }); + expect(result).toEqual({ id: 'venue-1' }); + }); + }); + + describe('submitVenue', () => { + it('should POST to VENUE_SUBMIT endpoint', async () => { + mockPost.mockResolvedValue({ data: { data: { status: 'PendingReview' } } }); + const { submitVenue } = await import('../../services/venueService'); + const result = await submitVenue('venue-1'); + expect(mockPost).toHaveBeenCalledWith('/venues/venue-1/submit'); + expect(result).toEqual({ status: 'PendingReview' }); + }); + }); + + describe('getUploadSignature', () => { + it('should GET upload-signature endpoint', async () => { + mockGet.mockResolvedValue({ data: { data: { signature: 'abc' } } }); + const { getUploadSignature } = await import('../../services/venueService'); + const result = await getUploadSignature(); + expect(mockGet).toHaveBeenCalledWith('/venues/upload-signature'); + expect(result).toEqual({ signature: 'abc' }); + }); + }); + + describe('getMyVenues', () => { + it('should GET my-venues endpoint', async () => { + mockGet.mockResolvedValue({ data: { data: [{ id: 'v1' }] } }); + const { getMyVenues } = await import('../../services/venueService'); + const result = await getMyVenues(); + expect(mockGet).toHaveBeenCalledWith('/venues/my-venues'); + expect(result).toEqual([{ id: 'v1' }]); + }); + }); + + describe('upsertVenueDraft', () => { + it('should PUT to draft endpoint with step and formValues', async () => { + mockPut.mockResolvedValue({ data: { data: { id: 'draft-1' } } }); + const { upsertVenueDraft } = await import('../../services/venueService'); + const formValues = { VenueName: 'Test' }; + const result = await upsertVenueDraft(1, formValues); + expect(mockPut).toHaveBeenCalledWith('/venues/draft', { step: 1, formValues }); + expect(result).toEqual({ id: 'draft-1' }); + }); + }); + + describe('getMyDraft', () => { + it('should GET draft endpoint and return data', async () => { + mockGet.mockResolvedValue({ data: { data: { step: 1 } } }); + const { getMyDraft } = await import('../../services/venueService'); + const result = await getMyDraft(); + expect(mockGet).toHaveBeenCalledWith('/venues/draft'); + expect(result).toEqual({ step: 1 }); + }); + + it('should return null when no draft', async () => { + mockGet.mockResolvedValue({ data: {} }); + const { getMyDraft } = await import('../../services/venueService'); + const result = await getMyDraft(); + expect(result).toBeNull(); + }); + }); + + describe('updateVenue', () => { + it('should PUT to venue update endpoint', async () => { + mockPut.mockResolvedValue({ data: { data: { id: 'venue-1' } } }); + const { updateVenue } = await import('../../services/venueService'); + const result = await updateVenue('venue-1', { name: 'Updated' }); + expect(mockPut).toHaveBeenCalledWith('/venues/venue-1', { name: 'Updated' }); + expect(result).toEqual({ id: 'venue-1' }); + }); + }); + + describe('getPublicVenues', () => { + it('should GET venues with filters, page, limit', async () => { + mockGet.mockResolvedValue({ data: { data: { venues: [{ id: 'v1' }], pagination: {} } } }); + const { getPublicVenues } = await import('../../services/venueService'); + const result = await getPublicVenues({ venueType: ['hall'] }, 1, 12); + expect(mockGet).toHaveBeenCalledWith('/venues', { + params: { venueType: ['hall'], page: 1, limit: 12 }, + }); + expect(result).toEqual({ venues: [{ id: 'v1' }], pagination: {} }); + }); + }); + + describe('getVenueById', () => { + it('should GET venue by id endpoint', async () => { + mockGet.mockResolvedValue({ data: { data: { id: 'venue-1', name: 'Grand Hall' } } }); + const { getVenueById } = await import('../../services/venueService'); + const result = await getVenueById('venue-1'); + expect(mockGet).toHaveBeenCalledWith('/venues/venue-1'); + expect(result).toEqual({ id: 'venue-1', name: 'Grand Hall' }); + }); + }); +}); diff --git a/client/src/tests/setup.ts b/client/src/tests/setup.ts new file mode 100644 index 0000000000..0d74b7352a --- /dev/null +++ b/client/src/tests/setup.ts @@ -0,0 +1,7 @@ +import '@testing-library/jest-dom/vitest'; +import { cleanup } from '@testing-library/react'; +import { afterEach } from 'vitest'; + +afterEach(() => { + cleanup(); +}); diff --git a/client/src/tests/unit/utils/slotGenerator.test.ts b/client/src/tests/unit/utils/slotGenerator.test.ts new file mode 100644 index 0000000000..69160a1686 --- /dev/null +++ b/client/src/tests/unit/utils/slotGenerator.test.ts @@ -0,0 +1,112 @@ +import { describe, it, expect } from 'vitest'; +import { + timeToMinutes, + minutesToTime, + isTimeBlocked, + getPriceForTimeRange, + generateFlexibleSlots, + prepareFixedSlots, + generateSlots, +} from '@/utils/slotGenerator.utils'; +import type { ISlotConfig } from '@/utils/slotGenerator.types'; + +describe('client slotGenerator.utils', () => { + describe('timeToMinutes & minutesToTime', () => { + it('should convert time string to minutes and back', () => { + expect(timeToMinutes('09:30')).toBe(570); + expect(minutesToTime(570)).toBe('09:30'); + }); + }); + + describe('isTimeBlocked', () => { + it('should return false when blockedTimes is empty or undefined', () => { + expect(isTimeBlocked('09:00', '10:00', [])).toBe(false); + expect(isTimeBlocked('09:00', '10:00', undefined)).toBe(false); + }); + + it('should detect overlapping blocked time slots', () => { + const blockedTimes = [{ fromTime: '10:00', toTime: '12:00' }]; + expect(isTimeBlocked('09:00', '10:30', blockedTimes)).toBe(true); + expect(isTimeBlocked('11:30', '13:00', blockedTimes)).toBe(true); + expect(isTimeBlocked('08:00', '09:30', blockedTimes)).toBe(false); + }); + }); + + describe('getPriceForTimeRange', () => { + it('should return default price when no pricing rules are provided', () => { + expect(getPriceForTimeRange('09:00', '10:00', [], '500')).toBe(500); + }); + + it('should apply matching pricing rule price when slot falls within range', () => { + const pricingRules = [{ fromTime: '18:00', toTime: '22:00', price: 1500 }]; + expect(getPriceForTimeRange('19:00', '20:00', pricingRules, '1000')).toBe(1500); + }); + }); + + describe('generateFlexibleSlots & prepareFixedSlots', () => { + it('should generate flexible slots directly via generateFlexibleSlots', () => { + const config: ISlotConfig = { + bookingType: 'flexibleBooking', + workingDays: ['Monday', 'Tuesday'], + workingHours: { open: '09:00', close: '11:00' }, + slotDuration: '60', + bufferTime: '0', + samePrice: '1000', + }; + const slots = generateFlexibleSlots('2026-07-22', config); + expect(slots).toHaveLength(2); + }); + + it('should prepare fixed slots directly via prepareFixedSlots', () => { + const config: ISlotConfig = { + bookingType: 'fixedBooking', + workingDays: ['Monday', 'Tuesday'], + fixedPackages: [ + { slotName: 'Full Package', startTime: '09:00', endTime: '17:00', price: 10000 }, + ], + }; + const slots = prepareFixedSlots('2026-07-22', config); + expect(slots).toHaveLength(1); + expect(slots[0].name).toBe('Full Package'); + }); + }); + + describe('generateSlots', () => { + it('should generate flexible slots correctly within working hours', () => { + const config: ISlotConfig = { + bookingType: 'flexibleBooking', + workingDays: ['Monday', 'Tuesday'], + workingHours: { open: '09:00', close: '12:00' }, + slotDuration: '60', + bufferTime: '0', + samePrice: '1000', + }; + + const slots = generateSlots('2026-07-22', config); + expect(slots).toHaveLength(3); + expect(slots[0]).toEqual({ + id: 'slot-2026-07-22-0', + startTime: '09:00', + endTime: '10:00', + price: 1000, + isAvailable: true, + reason: undefined, + }); + }); + + it('should generate fixed package slots correctly', () => { + const config: ISlotConfig = { + bookingType: 'fixedBooking', + workingDays: ['Monday', 'Tuesday'], + fixedPackages: [ + { slotName: 'Morning Session', startTime: '08:00', endTime: '12:00', price: 2500 }, + { slotName: 'Evening Party', startTime: '16:00', endTime: '22:00', price: 5000 }, + ], + }; + + const slots = generateSlots('2026-07-22', config); + expect(slots).toHaveLength(2); + expect(slots[0].name).toBe('Morning Session'); + }); + }); +}); diff --git a/client/src/tests/unit/utils/timeUtils.test.ts b/client/src/tests/unit/utils/timeUtils.test.ts new file mode 100644 index 0000000000..9a24f9ccc4 --- /dev/null +++ b/client/src/tests/unit/utils/timeUtils.test.ts @@ -0,0 +1,43 @@ +import { describe, it, expect } from 'vitest'; +import { parseTimeToMinutes, formatMinutesToTime, toLocalDateString } from '@/utils/timeUtils'; + +describe('client timeUtils', () => { + describe('parseTimeToMinutes', () => { + it('should parse "00:00" to 0 minutes', () => { + expect(parseTimeToMinutes('00:00')).toBe(0); + }); + + it('should parse "14:30" to 870 minutes', () => { + expect(parseTimeToMinutes('14:30')).toBe(870); + }); + + it('should parse "23:59" to 1439 minutes', () => { + expect(parseTimeToMinutes('23:59')).toBe(1439); + }); + + it('should throw an error for invalid time formats', () => { + expect(() => parseTimeToMinutes('invalid')).toThrow('Invalid time format: invalid'); + }); + }); + + describe('formatMinutesToTime', () => { + it('should format 0 minutes to "00:00"', () => { + expect(formatMinutesToTime(0)).toBe('00:00'); + }); + + it('should format 870 minutes to "14:30"', () => { + expect(formatMinutesToTime(870)).toBe('14:30'); + }); + + it('should format 1439 minutes to "23:59"', () => { + expect(formatMinutesToTime(1439)).toBe('23:59'); + }); + }); + + describe('toLocalDateString', () => { + it('should format date object to YYYY-MM-DD format', () => { + const date = new Date(2026, 6, 22); // Month is 0-indexed (6 = July) + expect(toLocalDateString(date)).toBe('2026-07-22'); + }); + }); +}); diff --git a/client/src/tests/unit/utils/venueFormMapper.test.ts b/client/src/tests/unit/utils/venueFormMapper.test.ts new file mode 100644 index 0000000000..e99173337d --- /dev/null +++ b/client/src/tests/unit/utils/venueFormMapper.test.ts @@ -0,0 +1,52 @@ +import { describe, it, expect } from 'vitest'; +import { mapFormToDTO } from '@/utils/venueFormMapper'; +import type { AddVenueFormValues } from '@/types/venue.types'; + +describe('client venueFormMapper', () => { + describe('mapFormToDTO', () => { + it('should map fixed booking form values to DTO payload', () => { + const mockForm: AddVenueFormValues = { + VenueName: 'Royal Palace Hall', + VenueDescription: 'Grand event hall for luxury weddings', + venueType: 'Convention Center', + district: 'Ernakulam', + state: 'Kerala', + city: 'Kochi', + pincode: '682001', + fullAddress: 'MG Road, Kochi', + googleMapsLink: 'https://maps.google.com', + coordinates: { lat: 9.9312, lng: 76.2673 }, + spaceAttributes: ['AC', 'Parking'], + seatingConfigurations: [], + maxCapacity: '500', + bookingType: 'fixedBooking', + workingDays: ['Monday', 'Tuesday', 'Wednesday'], + fixedPackages: [ + { slotName: 'Full Day Package', startTime: '08:00', endTime: '22:00', price: 25000 }, + ], + workingHours: { open: '', close: '' }, + flexibleBooking: { slotDuration: '', bufferTime: '' }, + pricing: { pricingType: 'fixedPricing', basePrice: 25000, pricingRules: [] }, + pricingType: 'fixedPricing', + samePrice: 25000, + blockedTimes: [], + amenities: ['WiFi', 'Stage'], + venuePhotos: [], + existingImages: { coverImage: '', galleryImages: [] }, + contact: { name: 'Manager John', phone: '9876543210', email: 'john@example.com' }, + cancellation: { policy: 'nonRefundable', refundType: 'fullRefund', refundRules: [] }, + }; + + const dto = mapFormToDTO(mockForm, ['https://res.cloudinary.com/cover.jpg']); + + expect(dto.name).toBe('Royal Palace Hall'); + expect(dto.coverImage).toBe('https://res.cloudinary.com/cover.jpg'); + if ('fixedPackages' in dto) { + expect(dto.fixedPackages).toEqual([ + { slotName: 'Full Day Package', startTime: '08:00', endTime: '22:00', price: 25000 }, + ]); + } + expect(dto.maxCapacity).toBe(500); + }); + }); +}); diff --git a/client/src/tests/utils/redirect.test.ts b/client/src/tests/utils/redirect.test.ts new file mode 100644 index 0000000000..d265a3d830 --- /dev/null +++ b/client/src/tests/utils/redirect.test.ts @@ -0,0 +1,40 @@ +import { describe, it, expect, beforeEach } from 'vitest'; + +describe('getSafeRedirectUrl', () => { + beforeEach(() => { + window.location = { origin: 'http://localhost:5173' } as unknown as Location; + }); + + it('should return fallback for null or undefined', async () => { + const { getSafeRedirectUrl } = await import('../../utils/redirect'); + expect(getSafeRedirectUrl(null)).toBe('/'); + expect(getSafeRedirectUrl(null, '/dashboard')).toBe('/dashboard'); + }); + + it('should return pathname for same-origin URL', async () => { + const { getSafeRedirectUrl } = await import('../../utils/redirect'); + const result = getSafeRedirectUrl('http://localhost:5173/venues/123'); + expect(result).toBe('/venues/123'); + }); + + it('should return pathname with search params for same-origin URL', async () => { + const { getSafeRedirectUrl } = await import('../../utils/redirect'); + const result = getSafeRedirectUrl('http://localhost:5173/search?q=hall'); + expect(result).toBe('/search?q=hall'); + }); + + it('should return fallback for external URL', async () => { + const { getSafeRedirectUrl } = await import('../../utils/redirect'); + expect(getSafeRedirectUrl('https://evil.com/phish')).toBe('/'); + }); + + it('should treat bare string as same-origin relative URL', async () => { + const { getSafeRedirectUrl } = await import('../../utils/redirect'); + expect(getSafeRedirectUrl('not a url')).toBe('/not%20a%20url'); + }); + + it('should use custom fallback when provided', async () => { + const { getSafeRedirectUrl } = await import('../../utils/redirect'); + expect(getSafeRedirectUrl('https://evil.com', '/safe')).toBe('/safe'); + }); +}); diff --git a/client/src/tests/utils/timeUtils.test.ts b/client/src/tests/utils/timeUtils.test.ts new file mode 100644 index 0000000000..f887f78fd2 --- /dev/null +++ b/client/src/tests/utils/timeUtils.test.ts @@ -0,0 +1,73 @@ +import { describe, it, expect } from 'vitest'; + +describe('timeUtils', () => { + describe('parseTimeToMinutes', () => { + it('should parse "14:30" to 870', async () => { + const { parseTimeToMinutes } = await import('../../utils/timeUtils'); + expect(parseTimeToMinutes('14:30')).toBe(870); + }); + + it('should parse "00:00" to 0', async () => { + const { parseTimeToMinutes } = await import('../../utils/timeUtils'); + expect(parseTimeToMinutes('00:00')).toBe(0); + }); + + it('should parse "23:59" to 1439', async () => { + const { parseTimeToMinutes } = await import('../../utils/timeUtils'); + expect(parseTimeToMinutes('23:59')).toBe(1439); + }); + + it('should throw on invalid format', async () => { + const { parseTimeToMinutes } = await import('../../utils/timeUtils'); + expect(() => parseTimeToMinutes('invalid')).toThrow('Invalid time format: invalid'); + }); + + it('should throw on empty string', async () => { + const { parseTimeToMinutes } = await import('../../utils/timeUtils'); + expect(() => parseTimeToMinutes('')).toThrow(); + }); + }); + + describe('formatMinutesToTime', () => { + it('should format 870 to "14:30"', async () => { + const { formatMinutesToTime } = await import('../../utils/timeUtils'); + expect(formatMinutesToTime(870)).toBe('14:30'); + }); + + it('should format 0 to "00:00"', async () => { + const { formatMinutesToTime } = await import('../../utils/timeUtils'); + expect(formatMinutesToTime(0)).toBe('00:00'); + }); + + it('should format 1439 to "23:59"', async () => { + const { formatMinutesToTime } = await import('../../utils/timeUtils'); + expect(formatMinutesToTime(1439)).toBe('23:59'); + }); + + it('should pad single digit hours and minutes', async () => { + const { formatMinutesToTime } = await import('../../utils/timeUtils'); + expect(formatMinutesToTime(1)).toBe('00:01'); + expect(formatMinutesToTime(60)).toBe('01:00'); + }); + }); + + describe('toLocalDateString', () => { + it('should format Date to YYYY-MM-DD', async () => { + const { toLocalDateString } = await import('../../utils/timeUtils'); + const date = new Date(2026, 0, 15); + expect(toLocalDateString(date)).toBe('2026-01-15'); + }); + + it('should pad month and day with zeros', async () => { + const { toLocalDateString } = await import('../../utils/timeUtils'); + const date = new Date(2026, 2, 5); + expect(toLocalDateString(date)).toBe('2026-03-05'); + }); + + it('should handle December dates correctly', async () => { + const { toLocalDateString } = await import('../../utils/timeUtils'); + const date = new Date(2025, 11, 25); + expect(toLocalDateString(date)).toBe('2025-12-25'); + }); + }); +}); diff --git a/client/src/tests/utils/toast.test.ts b/client/src/tests/utils/toast.test.ts new file mode 100644 index 0000000000..7c2d1cd739 --- /dev/null +++ b/client/src/tests/utils/toast.test.ts @@ -0,0 +1,83 @@ +import { describe, it, expect, vi } from 'vitest'; + +const mockSuccess = vi.fn(); +const mockError = vi.fn(); +const mockToast = vi.fn(); + +vi.mock('react-hot-toast', () => ({ + default: Object.assign(mockToast, { success: mockSuccess, error: mockError }), +})); + +describe('toast utils', () => { + beforeEach(() => { + vi.clearAllMocks(); + }); + + describe('showSuccess', () => { + it('should call toast.success with message and options', async () => { + const { showSuccess } = await import('../../utils/toast'); + showSuccess('Operation successful'); + expect(mockSuccess).toHaveBeenCalledWith( + 'Operation successful', + expect.objectContaining({ duration: 3000 }) + ); + }); + }); + + describe('showError', () => { + it('should call toast.error with message and options', async () => { + const { showError } = await import('../../utils/toast'); + showError('Something went wrong'); + expect(mockError).toHaveBeenCalledWith( + 'Something went wrong', + expect.objectContaining({ duration: 4000 }) + ); + }); + }); + + describe('showInfo', () => { + it('should call toast with message and options', async () => { + const { showInfo } = await import('../../utils/toast'); + showInfo('Information'); + expect(mockToast).toHaveBeenCalledWith( + 'Information', + expect.objectContaining({ duration: 3000 }) + ); + }); + }); + + describe('extractErrorMessage', () => { + it('should extract message from Axios-like error response data', async () => { + const { extractErrorMessage } = await import('../../utils/toast'); + const error = { response: { data: { message: 'Email already exists' } } }; + expect(extractErrorMessage(error)).toBe('Email already exists'); + }); + + it('should extract error field from response data', async () => { + const { extractErrorMessage } = await import('../../utils/toast'); + const error = { response: { data: { error: 'Unauthorized' } } }; + expect(extractErrorMessage(error)).toBe('Unauthorized'); + }); + + it('should fall back to error.message', async () => { + const { extractErrorMessage } = await import('../../utils/toast'); + const error = new Error('Network Error'); + expect(extractErrorMessage(error)).toBe('Network Error'); + }); + + it('should use fallback when no message is available', async () => { + const { extractErrorMessage } = await import('../../utils/toast'); + expect(extractErrorMessage({}, 'Default fallback')).toBe('Default fallback'); + }); + + it('should use default fallback when none provided', async () => { + const { extractErrorMessage } = await import('../../utils/toast'); + expect(extractErrorMessage(null)).toBe('An unexpected error occurred'); + }); + + it('should handle non-object errors', async () => { + const { extractErrorMessage } = await import('../../utils/toast'); + expect(extractErrorMessage('string error')).toBe('An unexpected error occurred'); + }); + }); +}); diff --git a/client/src/tests/utils/venueDraft.test.ts b/client/src/tests/utils/venueDraft.test.ts new file mode 100644 index 0000000000..b55b2693de --- /dev/null +++ b/client/src/tests/utils/venueDraft.test.ts @@ -0,0 +1,63 @@ +import { describe, it, expect, beforeEach } from 'vitest'; + +describe('venueDraft', () => { + const userId = 'user-123'; + + beforeEach(() => { + sessionStorage.clear(); + }); + + describe('saveDraftSession / loadDraftSession', () => { + it('should save and load draft session', async () => { + const { saveDraftSession, loadDraftSession } = await import('../../utils/venueDraft'); + const data = { + venueId: 'venue-1', + step: 1, + formValues: { VenueName: 'Test' } as Record, + }; + saveDraftSession(userId, data); + const loaded = loadDraftSession(userId); + expect(loaded).toEqual(data); + }); + + it('should return null when no draft exists', async () => { + const { loadDraftSession } = await import('../../utils/venueDraft'); + expect(loadDraftSession(userId)).toBeNull(); + }); + }); + + describe('clearDraftSession', () => { + it('should remove draft from sessionStorage', async () => { + const { saveDraftSession, clearDraftSession, loadDraftSession } = + await import('../../utils/venueDraft'); + saveDraftSession(userId, { + venueId: 'v1', + step: 0, + formValues: {} as Record, + }); + clearDraftSession(userId); + expect(loadDraftSession(userId)).toBeNull(); + }); + }); + + describe('legacy helpers', () => { + it('saveDraft should store serialized data', async () => { + const { saveDraft, loadDraft } = await import('../../utils/venueDraft'); + saveDraft(userId, { name: 'Test' }); + const loaded = loadDraft<{ name: string }>(userId); + expect(loaded).toEqual({ name: 'Test' }); + }); + + it('clearDraft should remove legacy draft', async () => { + const { saveDraft, clearDraft, loadDraft } = await import('../../utils/venueDraft'); + saveDraft(userId, { name: 'Test' }); + clearDraft(userId); + expect(loadDraft(userId)).toBeNull(); + }); + + it('loadDraft should return null for missing key', async () => { + const { loadDraft } = await import('../../utils/venueDraft'); + expect(loadDraft('nonexistent')).toBeNull(); + }); + }); +}); diff --git a/client/src/tests/utils/venueFormMapper.test.ts b/client/src/tests/utils/venueFormMapper.test.ts new file mode 100644 index 0000000000..3be3b1b07e --- /dev/null +++ b/client/src/tests/utils/venueFormMapper.test.ts @@ -0,0 +1,165 @@ +import { describe, it, expect } from 'vitest'; + +function createBaseFormValues(overrides = {}) { + return { + VenueName: 'Grand Hall', + VenueDescription: 'A beautiful venue', + fullAddress: '123 Main St', + googleMapsLink: '', + venueType: 'hall', + district: 'Ernakulam', + state: 'Kerala', + city: 'Kochi', + pincode: '682001', + spaceAttributes: ['ac'], + seatingConfigurations: ['theatre'], + maxCapacity: '200', + bookingType: 'fixedBooking', + workingDays: ['monday', 'friday'], + amenities: ['parking', 'wifi'], + contact: { name: 'John', phone: '9876543210', email: '' }, + cancellation: { + policy: 'refundable', + refundType: 'fullRefund', + refundRules: [{ daysBefore: '7', refundPercentage: '100' }], + }, + fixedPackages: [{ slotName: 'Morning', startTime: '09:00', endTime: '12:00', price: '5000' }], + workingHours: { open: '09:00', close: '18:00' }, + flexibleBooking: { slotDuration: '60', bufferTime: '15' }, + pricing: { pricingType: 'fixedPricing', basePrice: '0', pricingRules: [] }, + blockedTimes: [], + pricingType: 'fixedPricing', + samePrice: '10000', + venuePhotos: [], + ...overrides, + }; +} + +describe('mapFormToDTO', () => { + it('should map fixed booking form values to DTO', async () => { + const { mapFormToDTO } = await import('../../utils/venueFormMapper'); + const values = createBaseFormValues(); + const result = mapFormToDTO(values as Record, ['cover.jpg', 'gallery1.jpg']); + + expect(result.name).toBe('Grand Hall'); + expect(result.description).toBe('A beautiful venue'); + expect(result.address).toBe('123 Main St'); + expect(result.venueType).toBe('hall'); + expect(result.bookingType).toBe('fixedBooking'); + expect(result.fixedPackages).toHaveLength(1); + expect(result.fixedPackages[0]).toEqual({ + slotName: 'Morning', + startTime: '09:00', + endTime: '12:00', + price: 5000, + }); + expect(result.coverImage).toBe('cover.jpg'); + expect(result.galleryImages).toEqual(['gallery1.jpg']); + expect(result.maxCapacity).toBe(200); + expect(result.contact.name).toBe('John'); + expect(result.cancellation.refundRules[0]).toEqual({ daysBefore: 7, refundPercentage: 100 }); + }); + + it('should map flexible booking form values to DTO', async () => { + const { mapFormToDTO } = await import('../../utils/venueFormMapper'); + const values = createBaseFormValues({ + bookingType: 'flexibleBooking', + fixedPackages: [], + samePrice: undefined, + pricingType: 'timeBasedPricing', + pricing: { + pricingType: 'timeBasedPricing', + basePrice: '2000', + pricingRules: [ + { fromTime: '09:00', toTime: '12:00', price: '5000' }, + { fromTime: '', toTime: '', price: '' }, + ], + }, + }); + const result = mapFormToDTO(values as Record, ['cover.jpg']); + + expect(result.bookingType).toBe('flexibleBooking'); + expect(result.fixedPackages).toBeUndefined(); + expect(result.workingHours).toEqual({ open: '09:00', close: '18:00' }); + expect(result.flexibleBooking).toEqual({ slotDuration: 60, bufferTime: 15 }); + expect(result.pricing.pricingType).toBe('timeBasedPricing'); + expect(result.pricing.basePrice).toBe(2000); + expect(result.pricing.pricingRules).toHaveLength(1); + expect(result.pricing.pricingRules[0]).toEqual({ + fromTime: '09:00', + toTime: '12:00', + price: 5000, + }); + }); + + it('should handle fixedPricing with samePrice for flexible booking', async () => { + const { mapFormToDTO } = await import('../../utils/venueFormMapper'); + const values = createBaseFormValues({ + bookingType: 'flexibleBooking', + fixedPackages: [], + pricingType: 'fixedPricing', + samePrice: '15000', + pricing: { + pricingType: 'fixedPricing', + basePrice: '0', + pricingRules: [], + }, + }); + const result = mapFormToDTO(values as Record, ['cover.jpg']); + expect(result.pricing.pricingType).toBe('fixedPricing'); + expect(result.pricing.basePrice).toBe(15000); + expect(result.pricing.pricingRules).toEqual([]); + }); + + it('should omit googleMapsUrl when link is empty', async () => { + const { mapFormToDTO } = await import('../../utils/venueFormMapper'); + const values = createBaseFormValues(); + const result = mapFormToDTO(values as Record, ['cover.jpg']); + expect(result.googleMapsUrl).toBeUndefined(); + }); + + it('should include googleMapsUrl when link is provided', async () => { + const { mapFormToDTO } = await import('../../utils/venueFormMapper'); + const values = createBaseFormValues({ googleMapsLink: 'https://maps.google.com/xyz' }); + const result = mapFormToDTO(values as Record, ['cover.jpg']); + expect(result.googleMapsUrl).toBe('https://maps.google.com/xyz'); + }); + + it('should filter empty refund rules', async () => { + const { mapFormToDTO } = await import('../../utils/venueFormMapper'); + const values = createBaseFormValues({ + cancellation: { + policy: 'refundable', + refundType: 'timeBasedRefund', + refundRules: [ + { daysBefore: '7', refundPercentage: '100' }, + { daysBefore: '', refundPercentage: '' }, + ], + }, + }); + const result = mapFormToDTO(values as Record, ['cover.jpg']); + expect(result.cancellation.refundRules).toHaveLength(1); + }); + + it('should handle empty maxCapacity', async () => { + const { mapFormToDTO } = await import('../../utils/venueFormMapper'); + const values = createBaseFormValues({ maxCapacity: '' }); + const result = mapFormToDTO(values as Record, ['cover.jpg']); + expect(result.maxCapacity).toBeUndefined(); + }); + + it('should set default slotDuration and bufferTime when empty', async () => { + const { mapFormToDTO } = await import('../../utils/venueFormMapper'); + const values = createBaseFormValues({ + bookingType: 'flexibleBooking', + fixedPackages: [], + flexibleBooking: { slotDuration: '', bufferTime: '' }, + samePrice: '5000', + pricingType: 'fixedPricing', + pricing: { pricingType: 'fixedPricing', basePrice: '0', pricingRules: [] }, + }); + const result = mapFormToDTO(values as Record, ['cover.jpg']); + expect(result.flexibleBooking.slotDuration).toBe(60); + expect(result.flexibleBooking.bufferTime).toBe(0); + }); +}); diff --git a/client/src/types/auth.types.ts b/client/src/types/auth.types.ts new file mode 100644 index 0000000000..ca39b86833 --- /dev/null +++ b/client/src/types/auth.types.ts @@ -0,0 +1,19 @@ +export interface SessionSummary { + id: string; + ipAddress: string; + userAgent: string; + lastLogin: string; + createdAt: string; + isCurrent: boolean; +} + +export interface LoginResponse { + userId?: string; + id?: string; + username: string; + email: string; +} + +export interface AuthMessageResponse { + message?: string; +} diff --git a/client/src/types/booking.types.ts b/client/src/types/booking.types.ts new file mode 100644 index 0000000000..8dcb90a6d1 --- /dev/null +++ b/client/src/types/booking.types.ts @@ -0,0 +1,129 @@ +export interface CheckoutResponse { + orderId: string; + amount: number; + currency: string; +} + +export interface RazorpaySuccessResponse { + razorpay_payment_id: string; + razorpay_order_id: string; + razorpay_signature: string; +} + +export interface RazorpayErrorResponse { + error: { + code: string; + description: string; + source: string; + step: string; + reason: string; + metadata: { + order_id: string; + payment_id: string; + }; + }; +} + +export interface Slot { + slotId: string; + name: string | null; + startTime: string; + endTime: string; + price: number; + isAvailable: boolean; + reason: string | null; +} + +export interface BookingCardDTO { + _id: string; + bookingRef: string; + venueName: string; + venueId: string; + city: string; + district: string; + coverImage: string; + date: string; + timeRange: string; + bookedOn: string; + guestCount?: number; + eventType?: string; + totalPrice: number; + paymentMethod?: string; + paymentStatus?: 'pending' | 'paid' | 'refunded'; + uiStatus: 'upcoming' | 'completed' | 'cancelled' | 'in_progress'; + hasReview?: boolean; +} + +export interface BookingDetailDTO extends BookingCardDTO { + address: string; + contactPhone: string; + contactEmail?: string; + googleMapsUrl?: string; + amenities: string[]; + cancellationPolicy: string; + cancellationRefundPct?: number; + paymentReference: string; + bookerInfo?: { + name: string; + email: string; + phone: string; + place: string; + note?: string; + }; +} + +export interface CancelBookingResponse { + refundAmount: number; +} + +export interface BookerInfoForm { + guestCount: number; + eventType: string; + name: string; + email: string; + phone: string; + place: string; + note?: string; +} + +export interface ApiResponse { + success: boolean; + data: T; + message?: string; +} + +export interface VerifyPaymentPayload { + orderId: string; + paymentId: string; + signature: string; +} + +export interface VerifyPaymentResult { + _id: string; + bookingRef: string; +} + +export interface LockSlotPayload { + date: string; + startTime: string; + endTime: string; +} + +export interface LockSlotResponse { + lockId: string; + expiresAt: string; + amountToPay: number; +} + +export interface BookableDatesResponse { + bookableDates: string[]; + disabledDates: string[]; + maxDate: string; +} + +export interface DayAvailabilityResponse { + venueId: string; + date: string; + bookingType: string; + slots: Slot[]; +} diff --git a/client/src/types/geo.types.ts b/client/src/types/geo.types.ts new file mode 100644 index 0000000000..5b91cf5dfe --- /dev/null +++ b/client/src/types/geo.types.ts @@ -0,0 +1,21 @@ +export interface GeoSearchResult { + displayName: string; + lat: number; + lng: number; + city?: string; + district?: string; + postcode?: string; + boundingbox?: [number, number, number, number]; // [south, north, west, east] +} + +export interface Coordinates { + lat: number | string; + lng: number | string; +} + +export interface VenuePinsBBox { + swLng: number; + swLat: number; + neLng: number; + neLat: number; +} diff --git a/client/src/types/review.types.ts b/client/src/types/review.types.ts new file mode 100644 index 0000000000..dd140cd788 --- /dev/null +++ b/client/src/types/review.types.ts @@ -0,0 +1,39 @@ +export interface ReviewDTO { + rating?: number; + comment?: string; +} + +export interface UpdateReviewDTO { + rating?: number; + comment?: string; +} + +export interface Review { + _id: string; + venueId: string; + user: { + id: string; + userName: string; + isVerified?: boolean; + }; + rating?: number; + comment?: string; + createdAt: string; + editedAt?: string; + reviewerRating?: number; + ownerReply?: { + text: string; + repliedAt: string; + }; +} + +export interface ReviewsResponse { + reviews: Review[]; + pagination: { + page: number; + limit: number; + total: number; + totalPages: number; + hasMore: boolean; + }; +} diff --git a/client/src/types/user.types.ts b/client/src/types/user.types.ts new file mode 100644 index 0000000000..98478addd4 --- /dev/null +++ b/client/src/types/user.types.ts @@ -0,0 +1,36 @@ +export interface User { + id: string; + username: string; + email: string; + profilePicture?: string; +} + +export interface UpdateProfileDto { + username?: string; + profilePicturePublicId?: string; +} + +export interface CloudinarySignatureResponse { + signature: string; + timestamp: number; + cloudName: string; + apiKey: string; + uploadPreset: string; + folder: string; +} + +export interface UpdatedProfile { + _id: string; + name: string; + email: string; + profilePicture?: string; +} + +export interface ProfileResponse { + _id?: string; + id?: string; + username?: string; + name?: string; + email: string; + profilePicture?: string; +} diff --git a/client/src/types/venue.types.ts b/client/src/types/venue.types.ts new file mode 100644 index 0000000000..05f9006f31 --- /dev/null +++ b/client/src/types/venue.types.ts @@ -0,0 +1,262 @@ +export interface IFixedPackage { + slotName: string; + startTime: string; + endTime: string; + price: number; +} + +export interface IPricingRule { + fromTime: string; + toTime: string; + price: number; +} + +export interface IBlockedTime { + fromTime: string; + toTime: string; + reason: string; +} + +export interface IPricing { + pricingType: 'fixedPricing' | 'timeBasedPricing'; + basePrice: number; + pricingRules: IPricingRule[]; +} + +export interface IRefundRule { + daysBefore: number; + refundPercentage: number; +} + +export interface IContact { + name: string; + phone: string; + email?: string | null; +} + +export interface ICancellation { + policy: 'refundable' | 'nonRefundable'; + refundType?: 'fullRefund' | 'timeBasedRefund'; + refundRules: IRefundRule[]; +} + +// ─── Form-only types (pre-coercion, values may be strings) ────────────────── + +export interface IAddVenueFixedPackage { + slotName: string; + startTime: string; + endTime: string; + price: number | string; +} + +export interface IAddVenuePricingRule { + fromTime: string; + toTime: string; + price: number | string; +} + +export interface IAddVenueRefundRule { + daysBefore: number | string; + refundPercentage: number | string; +} + +export interface AddVenueFormValues { + VenueName: string; + VenueDescription: string; + venueType: string; + district: string; + state: string; + city: string; + pincode: string; + fullAddress: string; + googleMapsLink: string; + coordinates?: { + lat: number | string; + lng: number | string; + } | null; + spaceAttributes: string[]; + seatingConfigurations: string[]; + maxCapacity: string; + bookingType: string; + fixedPackages: IAddVenueFixedPackage[]; + workingDays: string[]; + workingHours: { + open: string; + close: string; + }; + + flexibleBooking: { + slotDuration: number | string; + bufferTime: number | string; + }; + + pricing: { + pricingType: string; + basePrice: number | string; + pricingRules: IAddVenuePricingRule[]; + }; + blockedTimes: IBlockedTime[]; + pricingType?: string; + samePrice?: number | string; + amenities: string[]; + venuePhotos: File[]; + existingImages: { + coverImage: string; + galleryImages: string[]; + }; + + contact: { + name: string; + phone: string; + email?: string; + }; + + cancellation: { + policy: string; + refundType: string; + refundRules: IAddVenueRefundRule[]; + }; +} + +export type VenueStatus = 'Draft' | 'PendingReview' | 'Approved' | 'Rejected' | 'Suspended'; + +export interface MyVenue { + _id: string; + name: string; + city: string; + district: string; + state: string; + venueType: string; + coverImage: string; + status: VenueStatus; + rejectionReason?: string; + rejectionHistory?: RejectionEntry[]; + submissionCount?: number; + currentEditDeadline?: string; + suspensionReason?: string; + createdAt: string; + isFeatured?: boolean; +} + +export interface RejectionEntry { + reason: string; + rejectedAt: string; + rejectedBy?: string; + submissionNumber: number; + editDeadline: string; + extendedAt?: string; + extendedBy?: string; + originalDeadline?: string; +} + +export interface VenueDetail { + _id: string; + name: string; + description: string; + venueType: string; + address: string; + city: string; + state: string; + district: string; + pincode: string; + googleMapsUrl?: string; + location?: { + coordinates: [number, number]; + }; + spaceAttributes: string[]; + seatingConfigurations: string[]; + maxCapacity?: number; + bookingType: 'fixedBooking' | 'flexibleBooking'; + fixedPackages: IFixedPackage[]; + workingDays: string[]; + workingHours: { + open: string; + close: string; + }; + flexibleBooking?: { + slotDuration: number; + bufferTime: number; + }; + pricing: IPricing; + blockedTimes?: IBlockedTime[]; + amenities: string[]; + coverImage: string; + galleryImages: string[]; + contact: IContact; + cancellation: ICancellation; + status: VenueStatus; + createdAt: string; + avgRating?: number; + reviewCount?: number; +} + +export interface PublicVenue { + _id: string; + name: string; + description: string; + venueType: string; + city: string; + district: string; + coverImage: string; + maxCapacity: number; + flexibleBooking?: { + slotDuration: number; + bufferTime: number; + }; + amenities?: string[]; + bookingType?: 'fixedBooking' | 'flexibleBooking'; + pricing?: IPricing; + fixedPackages?: { price: number }[]; + avgRating?: number; + reviewCount?: number; +} + +export interface VenueFilters { + searchTerm?: string; + minPrice?: number; + maxPrice?: number; + venueType?: string[]; + district?: string; + capacity?: number; + spaceAttributes?: string[]; + seatingConfigurations?: string[]; + amenities?: string[]; + sortBy?: 'price-low' | 'price-high' | 'rating'; +} + +export interface PaginationMeta { + total: number; + page: number; + limit: number; + skip: number; + totalPages: number; + hasNext: boolean; + hasPrev: boolean; +} + +export interface PaginatedVenuesResponse { + venues: PublicVenue[]; + pagination: PaginationMeta; +} + +export interface MyVenuesResponse { + count: number; + venues: MyVenue[]; +} + +export interface VenuePin { + _id: string; + name: string; + location: { + coordinates: [number, number]; // [lng, lat] + }; + coverImage: string; + avgRating: number; +} + +export interface VenuePinsBBox { + swLng: number; + swLat: number; + neLng: number; + neLat: number; +} diff --git a/client/src/types/wishlist.types.ts b/client/src/types/wishlist.types.ts new file mode 100644 index 0000000000..c7657e6026 --- /dev/null +++ b/client/src/types/wishlist.types.ts @@ -0,0 +1,30 @@ +export interface WishlistResponse { + wishlisted: boolean; +} + +export interface WishlistStatusResponse { + [venueId: string]: boolean; +} + +export interface WishlistVenue { + _id: string; + name: string; + city: string; + district: string; + coverImage: string; + maxCapacity?: number; + avgRating: number; + reviewCount: number; +} + +export interface WishlistPagination { + total: number; + page: number; + totalPages: number; + hasMore: boolean; +} + +export interface WishlistListResponse { + venues: WishlistVenue[]; + pagination: WishlistPagination; +} diff --git a/client/src/utils/bookingUtils.ts b/client/src/utils/bookingUtils.ts new file mode 100644 index 0000000000..4dd6434dc7 --- /dev/null +++ b/client/src/utils/bookingUtils.ts @@ -0,0 +1,7 @@ +export function minutesToTime(minutes: number): string { + const h = Math.floor(minutes / 60) + .toString() + .padStart(2, '0'); + const m = (minutes % 60).toString().padStart(2, '0'); + return `${h}:${m}`; +} diff --git a/client/src/utils/cropImage.ts b/client/src/utils/cropImage.ts new file mode 100644 index 0000000000..9c68580dff --- /dev/null +++ b/client/src/utils/cropImage.ts @@ -0,0 +1,61 @@ +import { MAX_AVATAR_FILE_SIZE } from '@/constants/upload'; + +const MAX_OUTPUT_BYTES = MAX_AVATAR_FILE_SIZE; +const QUALITY_STEPS = [0.92, 0.8, 0.6]; + +interface CropPixels { + x: number; + y: number; + width: number; + height: number; +} + +function loadImage(src: string): Promise { + return new Promise((resolve, reject) => { + const image = new Image(); + image.onload = () => resolve(image); + image.onerror = () => reject(new Error('Failed to load image for cropping')); + image.src = src; + }); +} + +function canvasToBlob(canvas: HTMLCanvasElement, quality: number): Promise { + return new Promise((resolve) => canvas.toBlob(resolve, 'image/jpeg', quality)); +} + +export async function getCroppedImageBlob( + imageSrc: string, + cropPixels: CropPixels, + outputSize = 512 +): Promise { + const image = await loadImage(imageSrc); + + const canvas = document.createElement('canvas'); + canvas.width = outputSize; + canvas.height = outputSize; + const ctx = canvas.getContext('2d'); + if (!ctx) { + throw new Error('Canvas is not supported in this browser'); + } + + ctx.drawImage( + image, + cropPixels.x, + cropPixels.y, + cropPixels.width, + cropPixels.height, + 0, + 0, + outputSize, + outputSize + ); + + for (const quality of QUALITY_STEPS) { + const blob = await canvasToBlob(canvas, quality); + if (blob && blob.size <= MAX_OUTPUT_BYTES) { + return blob; + } + } + + throw new Error('Could not compress the cropped image small enough to upload'); +} diff --git a/client/src/utils/parseUserAgent.ts b/client/src/utils/parseUserAgent.ts new file mode 100644 index 0000000000..387c9027c7 --- /dev/null +++ b/client/src/utils/parseUserAgent.ts @@ -0,0 +1,27 @@ +export function parseUserAgent(userAgent: string): string { + const ua = userAgent.toLowerCase(); + + const os = ua.includes('windows') + ? 'Windows' + : ua.includes('mac os') + ? 'macOS' + : ua.includes('android') + ? 'Android' + : ua.includes('iphone') || ua.includes('ipad') + ? 'iOS' + : ua.includes('linux') + ? 'Linux' + : 'Unknown device'; + + const browser = ua.includes('edg/') + ? 'Edge' + : ua.includes('chrome/') + ? 'Chrome' + : ua.includes('firefox/') + ? 'Firefox' + : ua.includes('safari/') + ? 'Safari' + : 'Unknown browser'; + + return `${browser} on ${os}`; +} diff --git a/client/src/utils/profileGreeting.ts b/client/src/utils/profileGreeting.ts new file mode 100644 index 0000000000..1ac67d9a60 --- /dev/null +++ b/client/src/utils/profileGreeting.ts @@ -0,0 +1,11 @@ +let played = false; + +export const hasPlayedProfileGreeting = () => played; + +export const markProfileGreetingPlayed = () => { + played = true; +}; + +export const resetProfileGreeting = () => { + played = false; +}; diff --git a/client/src/utils/redirect.ts b/client/src/utils/redirect.ts new file mode 100644 index 0000000000..612d69104f --- /dev/null +++ b/client/src/utils/redirect.ts @@ -0,0 +1,14 @@ +export const getSafeRedirectUrl = (url: string | null, fallback = '/'): string => { + if (!url) return fallback; + + try { + const parsed = new URL(url, window.location.origin); + if (parsed.origin === window.location.origin) { + return `${parsed.pathname}${parsed.search}${parsed.hash}`; + } + } catch { + // URL parsing failed + } + + return fallback; +}; diff --git a/client/src/utils/slotGenerator.types.ts b/client/src/utils/slotGenerator.types.ts new file mode 100644 index 0000000000..35b6c5e00f --- /dev/null +++ b/client/src/utils/slotGenerator.types.ts @@ -0,0 +1,47 @@ +export interface IPreviewSlot { + id: string; + startTime: string; // HH:MM format + endTime: string; // HH:MM format + name?: string; + price: number; + isAvailable: boolean; + reason?: string; +} + +export interface IFixedPackage { + slotName: string; + startTime: string; + endTime: string; + price: number; +} + +export interface IPricingRule { + fromTime: string; + toTime: string; + price: number; +} + +export interface IBlockedTime { + fromTime: string; + toTime: string; + reason?: string; +} + +export interface IWorkingHours { + open: string; + close: string; +} + +export interface ISlotConfig { + bookingType: 'fixedBooking' | 'flexibleBooking'; + workingDays: string[]; + workingHours?: IWorkingHours; + fixedPackages?: IFixedPackage[]; + slotDuration?: string; + bufferTime?: string; + pricingType?: string; + pricingRules?: IPricingRule[]; + blockedTimes?: IBlockedTime[]; + samePrice?: string; + basePrice?: string; +} diff --git a/client/src/utils/slotGenerator.utils.ts b/client/src/utils/slotGenerator.utils.ts new file mode 100644 index 0000000000..7447559920 --- /dev/null +++ b/client/src/utils/slotGenerator.utils.ts @@ -0,0 +1,176 @@ +import type { ISlotConfig, IPreviewSlot, IBlockedTime, IPricingRule } from './slotGenerator.types'; + +export const timeToMinutes = (time: string): number => { + const [hours, minutes] = time.split(':').map(Number); + return hours * 60 + minutes; +}; + +export const minutesToTime = (minutes: number): string => { + const hours = Math.floor(minutes / 60); + const mins = minutes % 60; + return `${String(hours).padStart(2, '0')}:${String(mins).padStart(2, '0')}`; +}; + +export const isTimeBlocked = ( + startTime: string, + endTime: string, + blockedTimes?: IBlockedTime[] +): boolean => { + if (!blockedTimes || blockedTimes.length === 0) { + return false; + } + + const rangeStart = timeToMinutes(startTime); + const rangeEnd = timeToMinutes(endTime); + + return blockedTimes.some((blocked) => { + const blockedStart = timeToMinutes(blocked.fromTime); + const blockedEnd = timeToMinutes(blocked.toTime); + + // Check if ranges overlap: ranges overlap if one starts before the other ends + return rangeStart < blockedEnd && rangeEnd > blockedStart; + }); +}; + +export const getPriceForTimeRange = ( + startTime: string, + endTime: string, + pricingRules?: IPricingRule[], + defaultPrice: string = '0' +): number => { + if (!pricingRules || pricingRules.length === 0) { + return parseFloat(defaultPrice) || 0; + } + + const slotStart = timeToMinutes(startTime); + const slotEnd = timeToMinutes(endTime); + + for (const rule of pricingRules) { + const ruleStart = timeToMinutes(rule.fromTime); + const ruleEnd = timeToMinutes(rule.toTime); + + // Check if the pricing rule covers the entire slot + if (ruleStart <= slotStart && slotEnd <= ruleEnd) { + return rule.price; + } + } + + return parseFloat(defaultPrice) || 0; +}; + +export const isWorkingDay = (date: Date, workingDays: string[]): boolean => { + const dayNames = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']; + const dayName = dayNames[date.getDay()]; + return workingDays.includes(dayName); +}; + +export const getNextWorkingDay = (startDate: Date, workingDays: string[]): Date => { + const maxDays = 90; + const currentDate = new Date(startDate); + + for (let i = 0; i < maxDays; i++) { + if (isWorkingDay(currentDate, workingDays)) { + return currentDate; + } + currentDate.setDate(currentDate.getDate() + 1); + } + + return currentDate; +}; + +export const formatDateToString = (date: Date): string => { + const year = date.getFullYear(); + const month = String(date.getMonth() + 1).padStart(2, '0'); + const day = String(date.getDate()).padStart(2, '0'); + return `${year}-${month}-${day}`; +}; + +export const parseDateString = (dateStr: string): Date => { + const [year, month, day] = dateStr.split('-').map(Number); + return new Date(year, month - 1, day); +}; + +export const generateFlexibleSlots = (date: string, config: ISlotConfig): IPreviewSlot[] => { + const slots: IPreviewSlot[] = []; + + if (!config.workingHours || !config.slotDuration) { + return slots; + } + + const slotDurationMinutes = parseInt(config.slotDuration, 10); + if (isNaN(slotDurationMinutes) || slotDurationMinutes <= 0) { + return slots; + } + const openTime = timeToMinutes(config.workingHours.open); + const closeTime = timeToMinutes(config.workingHours.close); + + if (isNaN(openTime) || isNaN(closeTime)) { + return slots; + } + + const bufferTimeMinutes = config.bufferTime ? parseInt(config.bufferTime, 10) : 0; + const safeBufferTime = isNaN(bufferTimeMinutes) ? 0 : bufferTimeMinutes; + + let currentTime = openTime; + let slotIndex = 0; + + while (currentTime + slotDurationMinutes <= closeTime) { + const startTime = minutesToTime(currentTime); + const endTime = minutesToTime(currentTime + slotDurationMinutes); + + const isBlocked = isTimeBlocked(startTime, endTime, config.blockedTimes); + const defaultPrice = + config.pricingType === 'timeBasedPricing' ? config.basePrice || '0' : config.samePrice || '0'; + + const price = getPriceForTimeRange(startTime, endTime, config.pricingRules, defaultPrice); + + const slot: IPreviewSlot = { + id: `slot-${date}-${slotIndex}`, + startTime, + endTime, + price, + isAvailable: !isBlocked, + reason: isBlocked ? 'This time slot is blocked' : undefined, + }; + + slots.push(slot); + currentTime += slotDurationMinutes + safeBufferTime; + slotIndex++; + } + + return slots; +}; + +export const prepareFixedSlots = (date: string, config: ISlotConfig): IPreviewSlot[] => { + const slots: IPreviewSlot[] = []; + + if (!config.fixedPackages || config.fixedPackages.length === 0) { + return slots; + } + + config.fixedPackages.forEach((pkg, index) => { + const isBlocked = isTimeBlocked(pkg.startTime, pkg.endTime, config.blockedTimes); + + const slot: IPreviewSlot = { + id: `fixed-${date}-${index}`, + startTime: pkg.startTime, + endTime: pkg.endTime, + name: pkg.slotName, + price: pkg.price, + isAvailable: !isBlocked, + reason: isBlocked ? 'This package is unavailable' : undefined, + }; + + slots.push(slot); + }); + + return slots; +}; + +export const generateSlots = (date: string, config: ISlotConfig): IPreviewSlot[] => { + if (config.bookingType === 'fixedBooking') { + return prepareFixedSlots(date, config); + } + + return generateFlexibleSlots(date, config); +}; diff --git a/client/src/utils/timeUtils.ts b/client/src/utils/timeUtils.ts new file mode 100644 index 0000000000..fa356532f5 --- /dev/null +++ b/client/src/utils/timeUtils.ts @@ -0,0 +1,25 @@ +// Parses a "HH:MM" string into minutes from midnight. +// Example: "14:30" -> 870 +export function parseTimeToMinutes(timeString: string): number { + const [hours, minutes] = timeString.split(':').map((str) => parseInt(str, 10)); + if (isNaN(hours) || isNaN(minutes)) { + throw new Error(`Invalid time format: ${timeString}`); + } + return hours * 60 + minutes; +} + +// Formats minutes from midnight into "HH:MM". +// Example: 870 -> "14:30" +export function formatMinutesToTime(minutesFromMidnight: number): string { + const h = Math.floor(minutesFromMidnight / 60); + const m = minutesFromMidnight % 60; + return `${h.toString().padStart(2, '0')}:${m.toString().padStart(2, '0')}`; +} + +// Formats a Date object to YYYY-MM-DD using local time (prevents UTC timezone shifts). +export function toLocalDateString(date: Date): string { + const year = String(date.getFullYear()); + const month = String(date.getMonth() + 1).padStart(2, '0'); + const day = String(date.getDate()).padStart(2, '0'); + return `${year}-${month}-${day}`; +} diff --git a/client/src/utils/toast.ts b/client/src/utils/toast.ts new file mode 100644 index 0000000000..3e83f50b7b --- /dev/null +++ b/client/src/utils/toast.ts @@ -0,0 +1,69 @@ +import toast from 'react-hot-toast'; + +const successStyle = { + background: '#059669', + color: '#fff', + borderRadius: '12px', + padding: '12px 16px', + fontSize: '14px', + fontWeight: '500' as const, +}; + +const errorStyle = { + background: '#DC2626', + color: '#fff', + borderRadius: '12px', + padding: '12px 16px', + fontSize: '14px', + fontWeight: '500' as const, +}; + +const infoStyle = { + background: '#000000', + color: '#fff', + borderRadius: '12px', + padding: '12px 16px', + fontSize: '14px', + fontWeight: '500' as const, +}; + +export const showSuccess = (message: string) => { + toast.success(message, { + style: successStyle, + iconTheme: { primary: '#fff', secondary: '#059669' }, + duration: 3000, + }); +}; + +export const showError = (message: string) => { + toast.error(message, { + style: errorStyle, + iconTheme: { primary: '#fff', secondary: '#DC2626' }, + duration: 4000, + }); +}; + +export const showInfo = (message: string) => { + toast(message, { + style: infoStyle, + iconTheme: { primary: '#fff', secondary: '#000000' }, + duration: 3000, + }); +}; + +export const extractErrorMessage = ( + error: unknown, + fallback = 'An unexpected error occurred' +): string => { + if (error && typeof error === 'object') { + const err = error as Record; + const response = err.response as Record | undefined; + const data = response?.data as Record | undefined; + if (data) { + if (typeof data.message === 'string') return data.message; + if (typeof data.error === 'string') return data.error; + } + if (typeof err.message === 'string') return err.message; + } + return fallback; +}; diff --git a/client/src/utils/venueDraft.ts b/client/src/utils/venueDraft.ts new file mode 100644 index 0000000000..fcf395d76a --- /dev/null +++ b/client/src/utils/venueDraft.ts @@ -0,0 +1,45 @@ +import type { AddVenueFormValues } from '@/types/venue.types'; + +// ─── Typed Draft Session ──────────────────────────────────────────────────── + +/** + * Shape stored in sessionStorage for an in-progress venue wizard. + * Cleared on submit or logout. + */ +export interface DraftSession { + venueId: string; // MongoDB _id of the Draft venue document + step: number; // which step to resume on: 0 | 1 | 2 + formValues: AddVenueFormValues; +} + +const getSessionKey = (userId: string): string => `venue_draft_session_${userId}`; + +export const saveDraftSession = (userId: string, data: DraftSession): void => { + sessionStorage.setItem(getSessionKey(userId), JSON.stringify(data)); +}; + +export const loadDraftSession = (userId: string): DraftSession | null => { + const raw = sessionStorage.getItem(getSessionKey(userId)); + return raw ? (JSON.parse(raw) as DraftSession) : null; +}; + +export const clearDraftSession = (userId: string): void => { + sessionStorage.removeItem(getSessionKey(userId)); +}; + +// ─── Legacy helpers (kept for AuthContext.logout compatibility) ───────────── + +const getDraftKey = (userId: string): string => `venue_draft_${userId}`; + +/** @deprecated use saveDraftSession */ +export const saveDraft = (userId: string, values: unknown): void => + sessionStorage.setItem(getDraftKey(userId), JSON.stringify(values)); + +/** @deprecated use loadDraftSession */ +export const loadDraft = (userId: string): T | null => { + const raw = sessionStorage.getItem(getDraftKey(userId)); + return raw ? (JSON.parse(raw) as T) : null; +}; + +/** @deprecated use clearDraftSession */ +export const clearDraft = (userId: string): void => sessionStorage.removeItem(getDraftKey(userId)); diff --git a/client/src/utils/venueFormMapper.ts b/client/src/utils/venueFormMapper.ts new file mode 100644 index 0000000000..5be5984ede --- /dev/null +++ b/client/src/utils/venueFormMapper.ts @@ -0,0 +1,154 @@ +import type { AddVenueFormValues } from '@/types/venue.types'; +import type { VenueDetail } from '@/types/venue.types'; +import type { IFixedPackage } from '@/types/venue.types'; + +export function mapFormToDTO(values: AddVenueFormValues, imageUrls: string[]) { + const base = { + name: values.VenueName, + description: values.VenueDescription, + address: values.fullAddress, + ...(values.googleMapsLink ? { googleMapsUrl: values.googleMapsLink } : {}), + ...(values.coordinates && { + coordinates: [Number(values.coordinates.lng), Number(values.coordinates.lat)], + }), + + venueType: values.venueType, + district: values.district, + state: values.state, + city: values.city, + pincode: values.pincode, + spaceAttributes: values.spaceAttributes, + seatingConfigurations: values.seatingConfigurations, + ...(values.maxCapacity ? { maxCapacity: Number(values.maxCapacity) } : {}), + + bookingType: values.bookingType, + workingDays: values.workingDays, + amenities: values.amenities, + + contact: { + name: values.contact.name, + phone: values.contact.phone, + ...(values.contact.email ? { email: values.contact.email } : {}), + }, + + cancellation: { + policy: values.cancellation.policy, + ...(values.cancellation.refundType ? { refundType: values.cancellation.refundType } : {}), + refundRules: (values.cancellation.refundRules ?? []) + .filter((r) => r.daysBefore !== '' && r.refundPercentage !== '') + .map((r) => ({ + daysBefore: Number(r.daysBefore), + refundPercentage: Number(r.refundPercentage), + })), + }, + + coverImage: imageUrls[0], + galleryImages: imageUrls.slice(1), + }; + + // Fixed booking + if (values.bookingType === 'fixedBooking') { + return { + ...base, + fixedPackages: (values.fixedPackages ?? []).map((p) => ({ + slotName: p.slotName, + startTime: p.startTime, + endTime: p.endTime, + price: Number(p.price), + })), + }; + } + + // Flexible booking + const pricingRules = (values.pricing.pricingRules ?? []) + .filter((r) => r.fromTime && r.toTime && r.price !== '' && r.price !== undefined) + .map((r) => ({ + fromTime: r.fromTime, + toTime: r.toTime, + price: Number(r.price), + })); + + const pricingType = values.pricingType; + const basePrice = + pricingType === 'fixedPricing' + ? Number(values.samePrice ?? 0) + : Number(values.pricing.basePrice ?? 0); + + return { + ...base, + workingHours: { + open: values.workingHours.open, + close: values.workingHours.close, + }, + flexibleBooking: { + slotDuration: + values.flexibleBooking.slotDuration === '' || + values.flexibleBooking.slotDuration === undefined + ? 60 + : Number(values.flexibleBooking.slotDuration), + bufferTime: + values.flexibleBooking.bufferTime === '' || values.flexibleBooking.bufferTime === undefined + ? 0 + : Number(values.flexibleBooking.bufferTime), + }, + pricing: { + pricingType, + basePrice, + pricingRules: pricingType === 'timeBasedPricing' ? pricingRules : [], + }, + blockedTimes: (values.blockedTimes ?? []).filter((b) => b.fromTime && b.toTime), + }; +} + +export function mapVenueToForm(venue: VenueDetail): AddVenueFormValues { + return { + VenueName: venue.name, + VenueDescription: venue.description, + venueType: venue.venueType, + district: venue.district, + state: venue.state || 'Kerala', + city: venue.city, + pincode: venue.pincode, + fullAddress: venue.address, + googleMapsLink: venue.googleMapsUrl || '', + coordinates: venue.location?.coordinates + ? { lat: venue.location.coordinates[1], lng: venue.location.coordinates[0] } + : null, + spaceAttributes: venue.spaceAttributes || [], + seatingConfigurations: venue.seatingConfigurations || [], + maxCapacity: venue.maxCapacity?.toString() || '', + bookingType: venue.bookingType, + workingDays: venue.workingDays || [], + fixedPackages: + venue.bookingType === 'fixedBooking' && venue.fixedPackages?.length + ? venue.fixedPackages.map((p: IFixedPackage) => ({ + slotName: p.slotName, + startTime: p.startTime, + endTime: p.endTime, + price: p.price, + })) + : [{ slotName: '', startTime: '', endTime: '', price: 0 }], + workingHours: venue.workingHours || { open: '', close: '' }, + flexibleBooking: venue.flexibleBooking || { slotDuration: '', bufferTime: '' }, + pricing: venue.pricing || { pricingType: '', basePrice: 0, pricingRules: [] }, + pricingType: venue.pricing?.pricingType || '', + samePrice: venue.pricing?.basePrice || 0, + blockedTimes: venue.blockedTimes || [{ fromTime: '', toTime: '', reason: '' }], + amenities: venue.amenities || [], + venuePhotos: [], + existingImages: { + coverImage: venue.coverImage, + galleryImages: venue.galleryImages || [], + }, + contact: { + name: venue.contact?.name || '', + phone: venue.contact?.phone || '', + email: venue.contact?.email || undefined, + }, + cancellation: { + policy: venue.cancellation?.policy || '', + refundType: venue.cancellation?.refundType || '', + refundRules: venue.cancellation?.refundRules || [{ daysBefore: '', refundPercentage: '' }], + }, + }; +} diff --git a/client/tsconfig.app.json b/client/tsconfig.app.json new file mode 100644 index 0000000000..12edadabd1 --- /dev/null +++ b/client/tsconfig.app.json @@ -0,0 +1,38 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", + "target": "es2023", + "lib": ["ES2023", "DOM"], + "module": "esnext", + "types": ["vite/client"], + "skipLibCheck": true, + "baseUrl": ".", + "paths": { + "@/*": ["./src/*"], + "@components/*": ["./src/components/*"], + "@context/*": ["./src/context/*"], + "@services/*": ["./src/services/*"], + "@types/*": ["./src/types/*"], + "@utils/*": ["./src/utils/*"], + "@config/*": ["./src/config/*"], + "@hooks/*": ["./src/hooks/*"] + }, + "ignoreDeprecations": "6.0", + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "moduleDetection": "force", + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "noUnusedLocals": true, + "noUnusedParameters": true, + "erasableSyntaxOnly": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src"], + "exclude": ["src/tests"] +} diff --git a/client/tsconfig.json b/client/tsconfig.json new file mode 100644 index 0000000000..84c8a23a86 --- /dev/null +++ b/client/tsconfig.json @@ -0,0 +1,7 @@ +{ + "files": [], + "references": [ + { "path": "./tsconfig.app.json" }, + { "path": "./tsconfig.node.json" } + ], +} diff --git a/client/tsconfig.node.json b/client/tsconfig.node.json new file mode 100644 index 0000000000..d3c52ea64c --- /dev/null +++ b/client/tsconfig.node.json @@ -0,0 +1,24 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", + "target": "es2023", + "lib": ["ES2023"], + "module": "esnext", + "types": ["node"], + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "moduleDetection": "force", + "noEmit": true, + + /* Linting */ + "noUnusedLocals": true, + "noUnusedParameters": true, + "erasableSyntaxOnly": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["vite.config.ts"] +} diff --git a/client/vite.config.ts b/client/vite.config.ts new file mode 100644 index 0000000000..0b814fed1b --- /dev/null +++ b/client/vite.config.ts @@ -0,0 +1,24 @@ +import { defineConfig } from "vite"; +import react from "@vitejs/plugin-react"; +import tailwindcss from "@tailwindcss/vite"; +import path from "path"; + +export default defineConfig({ + plugins: [ + react(), + tailwindcss(), + ], + + resolve: { + alias: { + "@": path.resolve(__dirname, "./src/"), + "@components": path.resolve(__dirname, "./src/components"), + "@context": path.resolve(__dirname, "./src/context"), + "@services": path.resolve(__dirname, "./src/services"), + "@types": path.resolve(__dirname, "./src/types"), + "@utils": path.resolve(__dirname, "./src/utils"), + "@config": path.resolve(__dirname, "./src/config"), + "@hooks": path.resolve(__dirname, "./src/hooks"), + }, + }, +}); \ No newline at end of file diff --git a/client/vitest.config.ts b/client/vitest.config.ts new file mode 100644 index 0000000000..ca3cb6bbf6 --- /dev/null +++ b/client/vitest.config.ts @@ -0,0 +1,26 @@ +import { defineConfig } from 'vite'; +import react from '@vitejs/plugin-react'; +import tailwindcss from '@tailwindcss/vite'; +import path from 'path'; + +export default defineConfig({ + plugins: [react(), tailwindcss()], + test: { + globals: true, + environment: 'jsdom', + setupFiles: ['./src/tests/setup.ts'], + include: ['src/tests/**/*.{test,spec}.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'], + }, + resolve: { + alias: { + '@': path.resolve(__dirname, './src/'), + '@components': path.resolve(__dirname, './src/components'), + '@context': path.resolve(__dirname, './src/context'), + '@services': path.resolve(__dirname, './src/services'), + '@types': path.resolve(__dirname, './src/types'), + '@utils': path.resolve(__dirname, './src/utils'), + '@config': path.resolve(__dirname, './src/config'), + '@hooks': path.resolve(__dirname, './src/hooks'), + }, + }, +}); diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000000..0d1f3dbe86 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,22 @@ +# ============================================================================= +# BookMyVenue — Docker Compose (local dev/testing only) +# +# This file is for local development and smoke-testing the containerised +# server. It runs the server service in isolation — no MongoDB, no frontend. +# +# Production deployments should use a proper container registry + orchestrator +# (ECS, Cloud Run, Kubernetes, etc.) and inject secrets via the platform's +# native secrets manager, not an .env file. +# ============================================================================= + +services: + server: + build: + context: ./server + dockerfile: Dockerfile + ports: + - "3000:3003" + env_file: ./server/.env + volumes: + # Persist Winston daily-rotate-file logs outside the container + - ./server/logs:/app/logs diff --git a/docs/api-overview.md b/docs/api-overview.md new file mode 100644 index 0000000000..abfaf49a67 --- /dev/null +++ b/docs/api-overview.md @@ -0,0 +1,137 @@ +# API Overview + +## Base URL +All API routes are mounted under `/api/v1`. Example: +``` +http://localhost:3000/api/v1/health +``` + +## Health Check +``` +GET /api/v1/health +Response: { "success": true, "message": "Service is healthy" } +``` + +## Authentication Flow +The API uses JWT-based authentication with access + refresh token pattern: + +1. **Register**: `POST /api/v1/auth/register` — Create account (username, email, password) +2. **Login**: `POST /api/v1/auth/login` — Returns access token in response body, refresh token in HTTP-only cookie +3. **Access**: Include access token in `Authorization: Bearer ` header +4. **Refresh**: `POST /api/v1/auth/refresh` — Uses refresh token cookie to issue new access token +5. **Logout**: `POST /api/v1/auth/logout` — Revokes current session + +Additional auth endpoints: +- `POST /api/v1/auth/forgot-password` — Sends reset email (rate-limited: 5/15min) +- `POST /api/v1/auth/reset-password` — Resets password with token +- `PATCH /api/v1/auth/change-password` — Change password (authenticated) +- `GET /api/v1/auth/sessions` — List active sessions +- `POST /api/v1/auth/sessions/logout-others` — Sign out other sessions +- `DELETE /api/v1/auth/sessions/:sessionId` — Revoke specific session + +Rate limiting: Login is limited to 10 attempts per 15 minutes per IP. + +## Response Format + +### Success +```json +{ + "success": true, + "message": "Operation completed successfully", + "data": { ... } +} +``` + +### Error +```json +{ + "success": false, + "message": "Error description", + "error": "Detailed error message (optional)" +} +``` + +### Paginated +```json +{ + "success": true, + "message": "Items retrieved successfully", + "data": { + "items": [ ... ], + "pagination": { + "total": 87, + "page": 2, + "limit": 10, + "skip": 10, + "totalPages": 9, + "hasNext": true, + "hasPrev": true + } + } +} +``` + +Pagination query parameters: +| Parameter | Type | Default | Description | +|---|---|---|---| +| `page` | number | `1` | 1-based page number | +| `limit` | number | `20` | Items per page (clamped between min/max) | +| `skip` | number | — | Override skip directly (ignores page) | +| `sort` | string | `-createdAt` | Comma-separated fields; prefix `-` for descending | + +### Status Codes Used by ResponseUtil +| Method | HTTP Status | +|---|---| +| `success()` | 200 | +| `created()` | 201 | +| `error()` | 500 | +| `notFound()` | 404 | +| `badRequest()` | 400 | +| `unauthorized()` | 401 | +| `forbidden()` | 403 | +| `conflict()` | 409 | +| `rateLimitExceeded()` | 429 | +| `validationError()` | 422 | +| `internalServerError()` | 500 | +| `serverUnavailable()` | 503 | + +## Request Validation +All request data is validated using Zod schemas via the validation middleware: +- **Body**: `validateBody(schema)` — Validates `req.body` +- **Params**: `validateParams(schema)` — Validates route parameters +- **Query**: Validation available via middleware pattern + +Validated data is available at `req.validated.body`, `req.validated.params`, or `req.validated.query`. Controllers must never access raw `req.body` directly. + +## Webhook Handling +Webhooks (Razorpay) are mounted at `/api/v1/webhook` **before** the JSON body parser in the middleware stack. This ensures the raw request body is available as a Buffer for HMAC-SHA256 signature verification. + +## Idempotency +Certain endpoints (payment processing, booking creation, venue state changes) support idempotency via the `Idempotency-Key` header: +- Pass a unique key in the request header +- If the same key is reused within a time window, the server returns the original response instead of processing again +- Implemented via `idempotency.middleware.ts` using MongoDB storage + +## Swagger API Documentation +Interactive API documentation is available at `http://localhost:3000/api/v1/swagger` when the server is running. It uses swagger-jsdoc with inline JSDoc annotations in controller/route files. Access is protected by basic authentication (credentials from `SWAGGER_USER`/`SWAGGER_PASS` env vars). + +## API Route Map +All routes under `/api/v1/`: + +| Prefix | Module | Auth Required | +|---|---|---| +| `/auth` | Authentication | Varies by endpoint | +| `/user` | User management | Yes | +| `/venues` | Venue CRUD | Varies | +| `/bookings` | Booking management | Yes | +| `/availability` | Availability schedules | Varies | +| `/owner` | Owner operations | Yes (owner+) | +| `/rbac` | RBAC management | Yes (admin+) | +| `/role` | Role management | Yes (admin+) | +| `/reviews` | Reviews & ratings | Varies | +| `/moderation` | Moderation | Yes (admin+) | +| `/geo` | Geocoding/search | Yes | +| `/wishlist` | User wishlists | Yes | +| `/webhook` | External webhooks | None (HMAC verified) | +| `/swagger` | API docs | Basic auth | +| `/health` | Health check | None | diff --git a/docs/architecture.md b/docs/architecture.md new file mode 100644 index 0000000000..1cba9f3b0c --- /dev/null +++ b/docs/architecture.md @@ -0,0 +1,145 @@ +# BookMyVenue Architecture + +## Overview +BookMyVenue is an open-source venue booking platform built as a pnpm monorepo with three workspaces: `server` (Node.js/Express API), `client` (user-facing React app), and `admin` (owner/admin dashboard). + +## Tech Stack +| Component | Technology | +|---|---| +| Backend | Node.js, Express 5, TypeScript ~5.9 | +| Database | MongoDB via Mongoose 9 | +| Frontend (Client) | React 19, Vite 8, TailwindCSS 4, TypeScript ~6.0 | +| Frontend (Admin) | React 19, Vite 8, Zustand 5, TanStack React Table, Recharts | +| Package Manager | pnpm 10.16.1 (workspaces) | +| API Docs | Swagger/OpenAPI via swagger-jsdoc | +| Payment | Razorpay | +| Email | Resend | +| Media | Cloudinary | + +## Monorepo Structure +``` +BookMyVenue/ +├── server/ # Express API backend +│ └── src/ +│ ├── modules/ # Feature modules (auth, venue, booking, etc.) +│ ├── middlewares/ # Express middlewares +│ ├── models/ # Shared Mongoose models +│ ├── services/ # Shared business logic +│ ├── workers/ # Background job processors +│ ├── configs/ # Configuration files +│ ├── constants/ # App constants (permissions, etc.) +│ ├── utils/ # Utilities (logger, response, errors) +│ └── types/ # TypeScript declarations +├── client/ # User-facing React app +│ └── src/ +│ ├── pages/ # Page components +│ ├── components/ # Reusable UI components +│ ├── hooks/ # Custom React hooks +│ ├── services/ # API service layer (Axios) +│ ├── context/ # React Context state +│ ├── utils/ # Utilities +│ └── constants/ # App constants +└── admin/ # Admin dashboard React app + └── src/ + ├── pages/ + ├── components/ + ├── hooks/ + ├── services/ + ├── store/ # Zustand stores + ├── utils/ + └── constants/ +``` + +## Module Architecture (Server) +Each feature module follows a consistent pattern: + +``` +modules// +├── controller.ts → Express route handlers (reads req.validated) +├── service.ts → Business logic layer +├── repository.ts → Database queries (Mongoose) +├── router.ts → Route definitions with middleware +├── validator.ts → Zod schemas for request validation +├── types.ts → Module-specific TypeScript types +└── models/ → Mongoose schemas (optional, some in root models/) +``` + +Data flows: **Router → Middleware (auth, validation, RBAC, pagination) → Controller → Service → Repository → MongoDB** + +Controllers always access validated data via `req.validated` (not raw `req.body`), populated by the validation middleware. + +## Server Modules (14 total) +| Module | Description | Files | +|---|---|---| +| `auth` | Login, register, JWT tokens, password reset, session management | 5 | +| `venue` | CRUD, draft management, venue submission workflow | 10 | +| `booking` | Booking CRUD, Razorpay payment integration, booking workflow | 8 | +| `availability` | Venue availability schedules | 5 | +| `user` | User profile management, admin user management | 8 | +| `owner` | Owner-specific operations: analytics, block dates, offline bookings, reviews, settings, venue management | 6 | +| `rbac` | Role-based access control | 3 | +| `role` | Role/permission management | 5 | +| `review` | Venue reviews, ratings, moderation | 7 | +| `moderation` | Content moderation: banned users, activity logs, summary dashboard | 13 (2 sub-routers) | +| `geo` | Geocoding/search via OpenStreetMap Nominatim | 3 | +| `wishlist` | User wishlists, toggle, sync, status | 7 | +| `webhook` | Razorpay webhook handling (HMAC verification) | 3 | +| `swagger` | OpenAPI/Swagger documentation UI | 2 | + +## Middleware Stack +Order in `server/src/app.ts`: +1. `helmet()` — Security headers +2. Rate limiter — 100 requests/15 min (global) +3. Webhook router (`/api/v1/webhook`) — Mounted BEFORE body parsing (raw body needed for HMAC) +4. `express.json()`, `express.urlencoded()` — Body parsing (10kb limit) +5. CORS, cookie-parser, compression — Cross-origin, cookies, gzip/brotli +6. Cache-control headers — `no-store` on all API responses +7. Request logger — Winston HTTP logging +8. Main router (`/api/v1`) — All module routes +9. 404 handler — Route/method not found +10. Global error handler — Unhandled exceptions + +## Available Middlewares +- **authMiddleware** (`auth.middleware.ts`) — Validates JWT, populates `req.user` +- **validationMiddleware** (`validation.middleware.ts`) — Validates body/params/query against Zod schemas, stores in `req.validated` +- **rbacMiddleware** (`rbac.middleware.ts`) — Checks user permissions/roles, supports `requirePermission()` and `requireRole()` +- **paginationMiddleware** (`pagination.middleware.ts`) — Parses `page`, `limit`, `sort`, `skip` query params +- **ownerTenantMiddleware** (`ownerTenant.middleware.ts`) — Validates owner access to venue-scoped resources +- **idempotencyMiddleware** (`idempotency.middleware.ts`) — Ensures idempotent payment/booking operations via `Idempotency-Key` header + +## RBAC System +Roles are stored in MongoDB with a hierarchy: +``` +superAdmin (rank 1) → admin (rank 2) → owner (rank 3) → user (rank 4) +``` +- Permissions follow `action:entity` pattern (e.g., `create:venues`, `read:bookings`) +- Role hierarchy is resolved via `$graphLookup` at runtime +- RBAC data must be seeded after fresh DB: `pnpm script seed:rbac` +- Server verifies seed at startup via `verifyRbacSeed()` and exits if missing + +## API Response Format +All responses use `ResponseUtil`: +- **Success**: `{ success: true, message: "...", data?: {...} }` +- **Error**: `{ success: false, message: "...", error?: "..." }` +- **Paginated**: `{ success: true, message: "...", data: { items: [...], pagination: { total, page, limit, skip, totalPages, hasNext, hasPrev } } }` + +`ResponseUtil` methods: `success`, `paginated`, `error`, `created`, `notFound`, `badRequest`, `unauthorized`, `forbidden`, `conflict`, `rateLimitExceeded`, `validationError`, `internalServerError`, `serverUnavailable` + +## Background Workers +3 workers start automatically with the server in `server.ts`: +1. **Email Worker** (`workers/email.worker.ts`) — Processes queued emails from `email-task` MongoDB collection +2. **Ban Expiry Worker** (`workers/banExpiry.worker.ts`) — Automatically lifts expired bans +3. **Venue Edit Deadline Worker** (`workers/venueEditDeadline.worker.ts`) — Manages venue edit deadlines + +## State Management +- **Server**: Stateless (JWT-based auth), MongoDB as single source of truth +- **Client**: React Context + TanStack React Query for server state +- **Admin**: Zustand stores for local state + TanStack React Query for server state + +## Key Design Patterns +- **Draft/Submit workflow**: Venue creation uses a two-phase flow (incremental draft → full submission) +- **Validation**: Zod schemas validated by middleware; controllers never access raw `req.body` +- **Pagination**: Standardized via `paginationMiddleware` with configurable defaults per route +- **Idempotency**: Key-based idempotency for payment/booking endpoints stored in MongoDB +- **Error handling**: Controllers wrap service calls in try/catch with `handleError()` utility; global handler catches unhandled errors +- **Webhook handling**: Raw body preserved via early route mounting for Razorpay HMAC verification diff --git a/docs/modules.md b/docs/modules.md new file mode 100644 index 0000000000..ce97d84a03 --- /dev/null +++ b/docs/modules.md @@ -0,0 +1,155 @@ +# Server Module Reference + +A catalog of all 14 feature modules in `server/src/modules/`. + +--- + +**Module: auth** (5 files) +*Files: auth.controller.ts, auth.repository.ts, auth.router.ts, auth.service.ts, auth.validator.ts* +Handles user authentication and session management: +- Register with username/email/password +- Login with email or username (rate-limited: 10/15min) +- JWT access + refresh token flow +- Token refresh using HTTP-only cookie +- Logout with session revocation +- Forgot/reset password flow (rate-limited: 5/15min) +- Change password (authenticated) +- Session listing and management (revoke single, revoke others) + +--- + +**Module: availability** (5 files) +*Files: availability.controller.ts, availability.repository.ts, availability.router.ts, availability.validator.ts, availability.workflow.ts* +Manages venue availability schedules: +- Recurring weekly availability windows +- Date-specific overrides +- Blocked dates for maintenance/events + +--- + +**Module: booking** (8 files) +*Files: booking.controller.ts, booking.repository.ts, booking.router.ts, booking.service.ts, booking.types.ts, booking.validator.ts, booking.workflow.ts, lock.types.ts* +Complete booking lifecycle: +- Create, list, view, cancel bookings +- Razorpay payment integration +- Booking lock mechanism to prevent double-booking +- Availability validation during booking +- Offline booking creation (owner feature) + +--- + +**Module: geo** (3 files) +*Files: geo.router.ts, geo.service.ts, geo.types.ts* +Geocoding and location search: +- Search places using OpenStreetMap Nominatim +- Returns coordinates, city, district, postcode +- Restricted to Indian locations + +--- + +**Module: moderation** (13 files across 2 sub-routers) +*Files: bannedUser.controller.ts, bannedUser.model.ts, bannedUser.repository.ts, bannedUser.router.ts, bannedUser.service.ts, bannedUser.types.ts, bannedUser.validator.ts, moderation.repository.ts, moderation.router.ts, moderation.service.ts, moderation.types.ts, moderationActivity.model.ts, moderationActivity.service.ts* +Content moderation system: +- Dashboard summary (pending reviews, suspended venues, banned users) +- Ban/unban users with scope (global/venue) and optional expiry +- Moderation activity log (superAdmin only) +- Ban management: list user bans, lift individual bans, lift all bans + +--- + +**Module: owner** (6 files) +*Files: owner.controller.ts, owner.repository.ts, owner.router.ts, owner.service.ts, owner.validator.ts, owner.workflow.ts* +Owner/venue-tenant specific operations: +- Venue analytics dashboard +- Block/unblock dates +- Venue booking management +- Availability calendar +- Offline booking creation +- Review management (reply, report) +- Venue settings management +- Venue state management (activate, request inactivity, block/unblock bookings) +- Delete venue request flow +- Owner tenant verification middleware + +--- + +**Module: rbac** (3 files) +*Files: rbac.controller.ts, rbac.router.ts, rbac.service.ts* +Role-based access control: +- List admins (superAdmin) +- Promote user to admin +- Demote admin to user +- RBAC seeding for new databases + +--- + +**Module: review** (7 files) +*Files: review.controller.ts, review.model.ts, review.ownership.ts, review.repository.ts, review.router.ts, review.service.ts, review.types.ts* +Venue review and rating system: +- Submit, update, delete reviews +- Get venue reviews (public, paginated) +- Get user's own rating for a venue +- Review ownership verification +- Flagged review management (admin) +- Review moderation (admin: flag, remove, restore) + +--- + +**Module: role** (5 files) +*Files: role.controller.ts, role.repository.ts, role.router.ts, role.service.ts, role.validator.ts* +Role and permission management: +- CRUD for roles +- Assign permissions to roles +- Role hierarchy management + +--- + +**Module: swagger** (2 files) +*Files: swagger.config.ts, swagger.router.ts* +OpenAPI/Swagger documentation: +- Generates API docs from JSDoc annotations +- Serves Swagger UI at `/api/v1/swagger` +- Protected by basic authentication + +--- + +**Module: user** (8 files) +*Files: user.controller.ts, user.models.ts, user.repository.ts, user.router.ts, user.service.ts, user.types.ts, user.validator.ts, user.workflow.ts* +User profile and account management: +- View and update profile +- Admin user listing (paginated) +- Toggle user active/ban status +- Admin management (list owners) +- Account deletion workflow + +--- + +**Module: venue** (10 files) +*Files: venue.controller.ts, venue.model.ts, venue.ownership.ts, venue.repository.ts, venue.router.ts, venue.service.ts, venue.types.ts, venue.validator.ts, venue.workflow.ts, venueDraft.model.ts* +Complete venue management: +- CRUD operations for venues +- Draft/submit workflow (incremental draft saves → full submission) +- Venue search and listing with filters +- Featured venue management +- Venue approval/rejection (admin) +- Venue activation/deactivation +- Venue ownership verification +- Image upload signature generation (Cloudinary) + +--- + +**Module: webhook** (3 files) +*Files: webhook.controller.ts, webhook.router.ts, webhook.types.ts* +External webhook handling: +- Razorpay payment webhook with HMAC-SHA256 verification +- Raw body required — mounted before `express.json()` in app.ts + +--- + +**Module: wishlist** (7 files) +*Files: wishlist.controller.ts, wishlist.model.ts, wishlist.repository.ts, wishlist.router.ts, wishlist.service.ts, wishlist.types.ts, wishlist.validator.ts* +User wishlist functionality: +- Toggle venue in wishlist +- Get user's wishlist (paginated) +- Check wishlist status for multiple venues +- Sync guest's local wishlist to account after login diff --git a/favicon/apple-touch-icon.png b/favicon/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..2000537371dbd450d8963ff17e56c4253e56f8ab GIT binary patch literal 18372 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

tFV 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 Hu0mjfnLK{! literal 0 HcmV?d00001 diff --git a/favicon/favicon.ico b/favicon/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..ea259ee47be882ac4834940c02a0b5f6061722af GIT binary patch literal 15086 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 N#-V~)k8RlY{{S}J6)gY& literal 0 HcmV?d00001 diff --git a/favicon/favicon.svg b/favicon/favicon.svg new file mode 100644 index 0000000000..cc652d1204 --- /dev/null +++ b/favicon/favicon.svg @@ -0,0 +1 @@ +RealFaviconGeneratorhttps://realfavicongenerator.net \ No newline at end of file diff --git a/favicon/site.webmanifest b/favicon/site.webmanifest new file mode 100644 index 0000000000..b55d1951c9 --- /dev/null +++ b/favicon/site.webmanifest @@ -0,0 +1,21 @@ +{ + "name": "BookMyVenue", + "short_name": "BMV", + "icons": [ + { + "src": "/web-app-manifest-192x192.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "maskable" + }, + { + "src": "/web-app-manifest-512x512.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "maskable" + } + ], + "theme_color": "#ffffff", + "background_color": "#ffffff", + "display": "standalone" +} \ No newline at end of file diff --git a/favicon/web-app-manifest-192x192.png b/favicon/web-app-manifest-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..86806ded66d00f187ebc6464e2706f6f34def48a GIT binary patch literal 20780 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 a8I%Jn*?FDT_el6dG967raKmHAxc>n?ut07A literal 0 HcmV?d00001 diff --git a/favicon/web-app-manifest-512x512.png b/favicon/web-app-manifest-512x512.png new file mode 100644 index 0000000000000000000000000000000000000000..25386ddb5eb934b154e615dc8c3df6cee2b480d9 GIT binary patch literal 105944 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

+ {[ + { color: "bg-zinc-200", label: "Past / Unavailable" }, + { + color: "bg-blue-100 border border-blue-300", + label: "Booked by customer", + }, + { + color: "bg-red-100 border border-red-300", + label: "Blocked by you", + }, + ...(hasTempBlock + ? [ + { + color: "bg-amber-100 border border-amber-300", + label: "Temporarily blocked", + }, + ] + : []), + ...(hasInactivityBlock + ? [ + { + color: "bg-purple-100 border border-purple-300", + label: "Inactive period", + }, + ] + : []), + { color: "bg-white border border-zinc-300", label: "Available" }, + ].map(({ color, label }) => ( +
+
+ {label} +
+ ))} +
+ ); +} diff --git a/admin/src/components/calendar/VenueCalendar.tsx b/admin/src/components/calendar/VenueCalendar.tsx new file mode 100644 index 0000000000..cf513e5d4b --- /dev/null +++ b/admin/src/components/calendar/VenueCalendar.tsx @@ -0,0 +1,106 @@ +import React from "react"; +import { DayPicker } from "react-day-picker"; +import "react-day-picker/style.css"; + +export function VenueCalendar({ + isLoading, + handleDayClick, + isDisabledDay, + isBooked, + isBlocked, + isTempBlocked, + isInactivityBlocked, + isPast, + isTooFar, + isNonWorkingDay, +}: { + isLoading: boolean; + handleDayClick: (date: Date) => void; + isDisabledDay: (date: Date) => boolean; + isBooked: (date: Date) => boolean; + isBlocked: (date: Date) => boolean; + isTempBlocked: (date: Date) => boolean; + isInactivityBlocked: (date: Date) => boolean; + isPast: (date: Date) => boolean; + isTooFar: (date: Date) => boolean; + isNonWorkingDay: (date: Date) => boolean; +}) { + return ( + <> +
+ {isLoading ? ( +
+ ) : ( +
+ isBooked(date), + blocked: (date) => isBlocked(date), + tempBlocked: (date) => isTempBlocked(date), + inactivityBlocked: (date) => isInactivityBlocked(date), + unavailable: (date) => + isPast(date) || isTooFar(date) || isNonWorkingDay(date), + }} + modifiersClassNames={{ + booked: "rdp-day--booked", + blocked: "rdp-day--blocked", + tempBlocked: "rdp-day--temp-blocked", + inactivityBlocked: "rdp-day--inactivity-blocked", + unavailable: "rdp-day--unavailable", + }} + styles={{ + root: { + "--rdp-accent-color": "#18181b", + } as React.CSSProperties, + }} + /> +
+ )} +
+ + + ); +} diff --git a/admin/src/components/common/CustomTooltip.tsx b/admin/src/components/common/CustomTooltip.tsx new file mode 100644 index 0000000000..007be338e4 --- /dev/null +++ b/admin/src/components/common/CustomTooltip.tsx @@ -0,0 +1,19 @@ +interface TooltipProps { + active?: boolean; + payload?: { value: number }[]; + label?: string; +} + +export function CustomTooltip({ active, payload, label }: TooltipProps) { + if (active && payload && payload.length) { + return ( +
+

{label}

+

+ ₹{payload[0].value.toLocaleString("en-IN")} +

+
+ ); + } + return null; +} diff --git a/admin/src/components/common/Footer.tsx b/admin/src/components/common/Footer.tsx new file mode 100644 index 0000000000..4585589ab1 --- /dev/null +++ b/admin/src/components/common/Footer.tsx @@ -0,0 +1 @@ +// mt diff --git a/admin/src/components/common/MetricCard.tsx b/admin/src/components/common/MetricCard.tsx new file mode 100644 index 0000000000..b6e97d1a8a --- /dev/null +++ b/admin/src/components/common/MetricCard.tsx @@ -0,0 +1,34 @@ +import React from "react"; + +export function MetricCard({ + title, + value, + subtitle, + icon: Icon, + accent, +}: { + title: string; + value: string; + subtitle: string; + icon: React.ElementType; + accent: string; +}) { + return ( +
+
+
+

{title}

+

+ {value} +

+

{subtitle}

+
+
+ +
+
+
+ ); +} diff --git a/admin/src/components/common/ModalRoot.tsx b/admin/src/components/common/ModalRoot.tsx new file mode 100644 index 0000000000..49edb75e74 --- /dev/null +++ b/admin/src/components/common/ModalRoot.tsx @@ -0,0 +1,68 @@ +import { useModalStore } from "@/store/useModalStore"; +import { + Dialog, + DialogContent, + DialogHeader, + DialogTitle, + DialogFooter, +} from "@/components/ui/dialog"; +import { Button } from "@/components/ui/button"; +import { cn } from "@/lib/utils"; +import { Loader2 } from "lucide-react"; + +const SIZE_CLASS = { + sm: "sm:max-w-sm", + md: "sm:max-w-md", + lg: "sm:max-w-2xl", + xl: "sm:max-w-4xl", + "2xl": "sm:max-w-6xl", +}; + +export function ModalRoot() { + const { modal, close } = useModalStore(); + + if (!modal) return null; + + const Component = modal.component; + + return ( + !open && close()}> + + + {modal.title} + +
+ +
+ {modal.actions.length > 0 && ( + + + {modal.actions.map((action, i) => ( + + ))} + + )} +
+
+ ); +} diff --git a/admin/src/components/common/Navbar.tsx b/admin/src/components/common/Navbar.tsx new file mode 100644 index 0000000000..4585589ab1 --- /dev/null +++ b/admin/src/components/common/Navbar.tsx @@ -0,0 +1 @@ +// mt diff --git a/admin/src/components/common/StarRating.tsx b/admin/src/components/common/StarRating.tsx new file mode 100644 index 0000000000..34739d8a1a --- /dev/null +++ b/admin/src/components/common/StarRating.tsx @@ -0,0 +1,16 @@ +export function StarRating({ rating }: { rating: number }) { + return ( +
+ {[...Array(5)].map((_, i) => ( + + ★ + + ))} +
+ ); +} diff --git a/admin/src/components/common/panels/BookingDetailPanel.tsx b/admin/src/components/common/panels/BookingDetailPanel.tsx new file mode 100644 index 0000000000..7a4446a54a --- /dev/null +++ b/admin/src/components/common/panels/BookingDetailPanel.tsx @@ -0,0 +1,302 @@ +import { Badge } from "@/components/ui/badge"; +import { Card } from "@/components/ui/card"; +import { BOOKING_STATUS_COLORS } from "@/constants/bookings"; +import { STATUS_VARIANT } from "@/constants/statusVariants"; +import { minutesToTime } from "@/utils/bookingUtils"; +import { cn } from "@/lib/utils"; +import { + Clock, + Calendar as CalendarIcon, + MapPin, + IndianRupee, + User, + FileText, +} from "lucide-react"; + +interface BookingData { + status: string; + duration?: number; + venueId?: string; + date?: string; + startTime?: number; + endTime?: number; + amountPaid?: number; + platformFee?: number; + taxAmount?: number; + contactNumber?: string; + customerName?: string; + guests?: number; + paymentReference?: string; + createdAt?: string; + _id?: string; + cancellationReason?: string; + eventType?: string; + price?: number; + paymentMethod?: string; + paymentStatus?: string; + userId?: string; + user?: { _id?: string; username?: string; email?: string; phone?: string }; + bookerName?: string; + bookerEmail?: string; + bookerPhone?: string; + bookerInfo?: { name?: string; email?: string; phone?: string }; + venue?: { _id?: string; name?: string; city?: string; address?: string }; + [key: string]: unknown; +} +export function BookingDetailPanel({ + data: rawData, +}: { + data: Record; +}) { + const userRole = (rawData as Record).userRole as + | string + | undefined; + const isOwner = userRole === "owner"; + const data = rawData as unknown as BookingData; + if (!data) return null; + + const statusColor = + BOOKING_STATUS_COLORS[data.status as keyof typeof BOOKING_STATUS_COLORS] ?? + "bg-gray-500/10 text-gray-500"; + + return ( +
+ {/* Header Banner */} +
+
+

+ Booking{" "} + + #{data._id?.slice(-6).toUpperCase()} + +

+
+ + {data.createdAt ? new Date(data.createdAt).toLocaleString() : "N/A"} +
+
+ + {data.status} + +
+ +
+ {/* Booking Schedule */} + +

+ Schedule & Timing +

+
+
+ + Date + + + {data.date ? new Date(data.date).toLocaleDateString() : "N/A"} + +
+
+ + Time Slots + + + {data.startTime !== undefined && data.endTime !== undefined + ? `${minutesToTime(data.startTime)} - ${minutesToTime(data.endTime)}` + : "N/A"} + +
+ {data.eventType && ( +
+ + Type + + + {data.eventType} + +
+ )} +
+
+ + {/* Payment Info */} + +

+ Payment Details +

+
+
+ + Total Amount + + + ₹{data.price} + +
+
+ + Method + + + {data.paymentMethod || "N/A"} + +
+
+ + Payment Status + + + {(data.paymentStatus as string)?.toUpperCase() || "—"} + +
+ {data.paymentReference && ( +
+ + Transaction ID + + + {data.paymentReference} + +
+ )} +
+
+ + {/* Venue Info */} + +

+ Venue Information +

+
+
+ + Venue Name + + + {data.venue?.name || "N/A"} + +
+ {(data.venue?.city || data.venue?.address) && ( +
+ + Location + + + {data.venue?.address}, {data.venue?.city} + +
+ )} + {!isOwner && ( +
+ + Venue ID + + + {data.venue?.name + ? `${data.venue.name} — ${data.venue?._id || data.venueId}` + : data.venue?._id || data.venueId} + +
+ )} +
+
+ + {/* Booker Info */} + +

+ Customer Details +

+
+
+ + Customer Name + + + {(data.bookerName as string) || data.bookerInfo?.name || "N/A"} + +
+ {((data.bookerEmail as string) || + (data.bookerPhone as string) || + data.bookerInfo?.email || + data.bookerInfo?.phone) && ( +
+
+ + Email + + + {(data.bookerEmail as string) || + data.bookerInfo?.email || + "N/A"} + +
+
+ + Phone + + + {(data.bookerPhone as string) || + data.bookerInfo?.phone || + "N/A"} + +
+
+ )} + {isOwner && data.user && ( +
+ Booked by{" "} + + {(data.user as Record)?.username as string} + +
+ )} + {!isOwner && ( +
+ + User ID + + + {data.user + ? `${(data.user as Record).username as string} (${(data.user as Record).email as string}) — ${data.userId}` + : data.userId} + +
+ )} +
+
+
+ + {/* Cancellation / Refund Info */} + {(data.status === "CANCELLED" || data.status === "REFUNDED") && ( + +

+ Cancellation & Refund +

+
+ {data.cancellationReason && ( +
+ + Reason + + + {data.cancellationReason} + +
+ )} +
+
+ )} +
+ ); +} diff --git a/admin/src/components/common/panels/FeaturedVenuesPanel.tsx b/admin/src/components/common/panels/FeaturedVenuesPanel.tsx new file mode 100644 index 0000000000..b2a83ce585 --- /dev/null +++ b/admin/src/components/common/panels/FeaturedVenuesPanel.tsx @@ -0,0 +1,168 @@ +import { useApiQuery, useApiMutation } from "@/hooks/useApi"; +import { API_ENDPOINTS } from "@/constants"; +import { QUERY_KEYS } from "@/config/queryKeys"; +import { useQueryClient } from "@tanstack/react-query"; +import { useToast } from "@/hooks/useToast"; +import { Button } from "@/components/ui/button"; +import { Badge } from "@/components/ui/badge"; +import { Loader2, AlertCircle, XCircle } from "lucide-react"; +import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert"; +import { differenceInDays, differenceInHours } from "date-fns"; + +interface Venue { + _id: string; + name: string; + city: string; + venueType: string; + status: string; + featuredExpiresAt?: string | null; +} + +const getTimeLeft = (expiresAt?: string | null) => { + if (!expiresAt) return "Indefinite"; + const now = new Date(); + const expiryDate = new Date(expiresAt); + if (expiryDate < now) return "Expired"; + + const daysLeft = differenceInDays(expiryDate, now); + if (daysLeft > 0) return `${daysLeft} days left`; + + const hoursLeft = differenceInHours(expiryDate, now); + return `${hoursLeft} hours left`; +}; + +export const FeaturedVenuesPanel = () => { + const queryClient = useQueryClient(); + const { success, error } = useToast(); + + const { + data: venues, + isLoading, + isError, + } = useApiQuery([...QUERY_KEYS.ADMIN_VENUES, "featured"], { + method: "GET", + url: API_ENDPOINTS.FEATURED_VENUES, + }); + + const unfeatureMutation = useApiMutation( + (vars) => ({ + method: "DELETE", + url: `${API_ENDPOINTS.VENUES}/${vars.id}/feature`, + }), + { + onSuccess: () => { + success("Venue removed from featured list"); + queryClient.invalidateQueries({ + queryKey: [...QUERY_KEYS.ADMIN_VENUES, "featured"], + }); + queryClient.invalidateQueries({ queryKey: QUERY_KEYS.ADMIN_VENUES }); + }, + onError: (e: Error) => { + const err = e as import("axios").AxiosError<{ message: string }>; + error(err.response?.data?.message ?? "Failed to un-feature venue"); + }, + }, + ); + + if (isLoading) { + return ( +
+ +

Loading featured venues...

+
+ ); + } + + if (isError) { + return ( +
+ + + Error + + {error instanceof Error + ? error.message + : "Failed to load featured venues"} + + +
+ ); + } + + if (!venues || venues.length === 0) { + return ( +
+
+ +
+

No Featured Venues

+

+ You haven't featured any venues yet. You can feature venues from the + main venues table. +

+
+ ); + } + + return ( +
+
+ {venues.map((venue) => { + const timeLeft = getTimeLeft(venue.featuredExpiresAt); + const isExpired = timeLeft === "Expired"; + + return ( +
+
+

{venue.name}

+
+ + {venue.city} + + + + {venue.venueType} + +
+
+ +
+
+ + Featured + + + {timeLeft} + +
+ +
+
+ ); + })} +
+
+ ); +}; diff --git a/admin/src/components/common/panels/OwnerDetailPanel.tsx b/admin/src/components/common/panels/OwnerDetailPanel.tsx new file mode 100644 index 0000000000..28aa9d9511 --- /dev/null +++ b/admin/src/components/common/panels/OwnerDetailPanel.tsx @@ -0,0 +1,178 @@ +import { Badge } from "@/components/ui/badge"; +import { Card } from "@/components/ui/card"; +import { User, Mail, Phone, Calendar, Store, ShieldCheck } from "lucide-react"; + +interface OwnerData { + username?: string; + name?: string; + email?: string; + phone?: string; + active?: boolean; + _id?: string; + role?: string; + createdAt?: string; + updatedAt?: string; + venues?: { + name?: string; + city?: string; + address?: string; + status?: string; + }[]; + [key: string]: unknown; +} +export function OwnerDetailPanel({ + data: rawData, +}: { + data: Record; +}) { + const data = rawData as unknown as OwnerData; + if (!data) return null; + + return ( +
+ {/* Header Profile Section */} +
+
+ +
+
+

+ {data.username || data.name} +

+
+ + {data.email} + + {data.phone && ( + + {data.phone} + + )} +
+
+
+ + {data.active ? "Active Owner" : "Inactive Account"} + +
+ Verified Partner +
+
+
+ +
+ {/* Venues Overview */} + +
+

+ Registered Venues +

+ {data.venues && ( + + {data.venues.length} Total + + )} +
+ +
+ {data.venues && data.venues.length > 0 ? ( +
+ {data.venues.map((venue, idx) => ( +
+
+ + {venue.name} + + + {venue.city || venue.address} + +
+ + {venue.status} + +
+ ))} +
+ ) : ( +
+ +

No venues registered yet

+
+ )} +
+
+
+ +
+ {/* Account Info */} + +

+ Account Details +

+
+
+ + User ID + + + {data._id} + +
+
+ + Role Type + + + {data.role || "Owner"} + +
+
+
+ + {/* Audit */} + +

+ Timestamps +

+
+
+ + Joined Date + + + {data.createdAt + ? new Date(data.createdAt).toLocaleDateString() + : "N/A"} + +
+
+ + Last Updated + + + {data.updatedAt + ? new Date(data.updatedAt).toLocaleDateString() + : "N/A"} + +
+
+
+
+
+ ); +} diff --git a/admin/src/components/common/panels/UserDetailPanel.tsx b/admin/src/components/common/panels/UserDetailPanel.tsx new file mode 100644 index 0000000000..42ecc87039 --- /dev/null +++ b/admin/src/components/common/panels/UserDetailPanel.tsx @@ -0,0 +1,137 @@ +import { Badge } from "@/components/ui/badge"; +import { Card } from "@/components/ui/card"; +import { Mail, User, Shield, CalendarDays, Phone } from "lucide-react"; + +interface UserData { + _id: string; + username: string; + email: string; + phone?: string; + status: string; + role?: string; + createdAt: string; +} + +export function UserDetailPanel({ + data: rawData, +}: { + data: Record; +}) { + const data = rawData as unknown as UserData; + if (!data) return null; + + const statusVariant = + data.status === "active" + ? "default" + : data.status === "suspended" + ? "destructive" + : "outline"; + + return ( +
+ {/* Header Banner */} +
+
+

+ + {data.username} +

+
+ + {data.email} +
+
+ + {data.status} + +
+ +
+ {/* Account Info */} + +

+ Account Details +

+
+
+ + User ID + + + {data._id} + +
+
+ + Username + + + {data.username} + +
+
+ + Role + + + {data.role || "user"} + +
+
+ + Status + + {data.status} +
+
+ + Registered + + + + {data.createdAt + ? new Date(data.createdAt).toLocaleDateString() + : "N/A"} + +
+
+ + Phone + + + + {data.phone || "N/A"} + +
+
+
+ + {/* Contact Info */} + +

+ Contact Information +

+
+
+ + Email + + {data.email} +
+ {data.phone && ( +
+ + Phone + + {data.phone} +
+ )} +
+
+
+
+ ); +} diff --git a/admin/src/components/common/panels/VenueDetailPanel.tsx b/admin/src/components/common/panels/VenueDetailPanel.tsx new file mode 100644 index 0000000000..d14fc6cfee --- /dev/null +++ b/admin/src/components/common/panels/VenueDetailPanel.tsx @@ -0,0 +1,641 @@ +import { useState } from "react"; +import { createPortal } from "react-dom"; +import { Badge } from "@/components/ui/badge"; +import { Card } from "@/components/ui/card"; +import { Button } from "@/components/ui/button"; +import { RejectionHistoryDialog } from "@/components/venues/RejectionHistoryDialog"; +import { + CalendarDays, + Clock, + MapPin, + Phone, + Mail, + User, + Info, + Banknote, + Users, + CheckCircle2, + XCircle, + AlertCircle, + ChevronLeft, + ChevronRight, + X, +} from "lucide-react"; + +interface RejectionEntry { + reason: string; + rejectedAt: string; + rejectedBy?: string; + submissionNumber: number; + editDeadline: string; + extendedAt?: string; + extendedBy?: string; + originalDeadline?: string; +} + +interface VenueData { + status?: string; + suspensionReason?: string; + rejectionReason?: string; + rejectionHistory?: RejectionEntry[]; + submissionCount?: number; + active?: boolean; + name?: string; + venueType?: string; + bookingType?: string; + coverImage?: string; + galleryImages?: string[]; + capacity?: number; + maxCapacity?: number; + city?: string; + district?: string; + address?: string; + pincode?: string; + pricing?: { + pricingType?: string; + basePrice?: number; + pricePerHour?: number; + pricePerDay?: number; + pricingRules?: { fromTime: string; toTime: string; price: number }[]; + }; + fixedPackages?: { + name?: string; + slotName?: string; + startTime: string; + endTime: string; + price: number; + }[]; + amenities?: string[]; + description?: string; + contact?: { name: string; phone: string; email: string }; + workingDays?: string[]; + createdAt?: string; + updatedAt?: string; + lastSubmittedAt?: string; + currentEditDeadline?: string; + avgRating?: number; + reviewCount?: number; + [key: string]: unknown; +} + +export function VenueDetailPanel({ + data: rawData, +}: { + data: Record; +}) { + const [historyOpen, setHistoryOpen] = useState(false); + const [isDescExpanded, setIsDescExpanded] = useState(false); + const [galleryOpen, setGalleryOpen] = useState(false); + const [currentImageIndex, setCurrentImageIndex] = useState(0); + + const data = rawData as unknown as VenueData; + if (!data) return null; + + const allImages = [data.coverImage, ...(data.galleryImages || [])].filter( + Boolean, + ) as string[]; + + const handleOpenGallery = (index: number) => { + setCurrentImageIndex(index); + setGalleryOpen(true); + }; + + const handlePrevImage = () => { + setCurrentImageIndex((prev) => + prev === 0 ? allImages.length - 1 : prev - 1, + ); + }; + + const handleNextImage = () => { + setCurrentImageIndex((prev) => + prev === allImages.length - 1 ? 0 : prev + 1, + ); + }; + + const pricingRules = data.pricing?.pricingRules; + const fixedPackages = data.fixedPackages; + + const hasStatusAlerts = + (data.status === "Rejected" && data.rejectionReason) || + (data.status === "Suspended" && data.suspensionReason); + + return ( +
+ {/* 1. Hero Cover Image */} + {data.coverImage && ( + + )} + + {/* 2. Gallery Strip */} + {data.galleryImages && data.galleryImages.length > 0 && ( +
+
+ + Gallery Photos{" "} + + {data.galleryImages.length} + + +
+
+ {data.galleryImages.map((url: string, i: number) => ( + + ))} +
+
+ )} + + {/* 3. Status Alerts */} + {hasStatusAlerts && ( +
+ {data.status === "Rejected" && data.rejectionReason && ( +
+ +
+

+ Rejection Reason +

+

+ {data.rejectionReason} +

+
+
+ )} + {data.status === "Suspended" && data.suspensionReason && ( +
+ +
+

+ Suspension Reason +

+

+ {data.suspensionReason} +

+
+
+ )} +
+ )} + + {/* 4. Rejection History Bar */} + {data.rejectionHistory && data.rejectionHistory.length > 0 && ( +
+
+ + {data.rejectionHistory.length} + + Previous Rejections +
+ +
+ )} + + {data.rejectionHistory && data.rejectionHistory.length > 0 && ( + + )} + + {/* 5. Two-column Info Grid */} +
+ {/* Core Details */} + +
+ +

Core Details

+
+
+
+
Type
+
+ {data.venueType || "—"} +
+
+
+
Booking Mode
+
+ {data.bookingType === "fixedBooking" + ? "Fixed Slots" + : "Flexible Time"} +
+
+ {data.workingDays && data.workingDays.length > 0 && ( +
+
Operating Days
+
+ {data.workingDays.map((day) => ( + + {day.slice(0, 3)} + + ))} +
+
+ )} +
+
+ + {/* Location */} + +
+ +

Location

+
+
+
+
City
+
{data.city || "—"}
+
+
+
District
+
{data.district || "—"}
+
+
+
PIN Code
+
{data.pincode || "—"}
+
+
+
+ Address +
+
+ {data.address || "—"} +
+
+
+
+
+ + {/* 6. Pricing & Packages */} + +
+ +

Pricing Structure

+
+ + {data.bookingType === "fixedBooking" && + fixedPackages && + fixedPackages.length > 0 ? ( +
+ {fixedPackages.map((pkg, i) => ( +
+
+ + {pkg.slotName || pkg.name || `Slot ${i + 1}`} + + + ₹{pkg.price} + +
+
+ + + {pkg.startTime} - {pkg.endTime} + +
+
+ ))} +
+ ) : ( +
+ {data.pricing && ( +
+
+

+ Pricing Type +

+

+ {data.pricing.pricingType || "—"} +

+
+
+

+ Base Price +

+

+ ₹{data.pricing.basePrice || "0"} +

+
+
+ )} + + {pricingRules && pricingRules.length > 0 && ( +
+ + + + + + + + + {pricingRules.map((rule, i) => ( + + + + + ))} + +
+ Time Range + + Price Modifier +
+ + {rule.fromTime} - {rule.toTime} + + ₹{rule.price} +
+
+ )} +
+ )} +
+ + {/* 7. Amenities & Contact */} +
+ + {/* 8. Description */} + {data.description && ( + +

Description

+
+

+ {data.description} +

+ {data.description.length > 250 && ( + + )} +
+
+ )} + + {/* 9. Metadata Footer */} +
+ {data.createdAt && ( +
+ + + Created: {new Date(data.createdAt).toLocaleDateString()} + +
+ )} + {data.updatedAt && ( +
+ + + Updated: {new Date(data.updatedAt).toLocaleDateString()} + +
+ )} + {data.submissionCount !== undefined && ( +
+ + Submissions: {data.submissionCount}/10 +
+ )} + {data.avgRating !== undefined && ( +
+ + + {data.avgRating.toFixed(1)} + + ({data.reviewCount || 0} reviews) +
+ )} +
+ + {/* Lightbox Overlay */} + {galleryOpen && + typeof document !== "undefined" && + createPortal( +
{ + e.stopPropagation(); + setGalleryOpen(false); + }} + onPointerDown={(e) => e.stopPropagation()} + > +
e.stopPropagation()} + onPointerDown={(e) => e.stopPropagation()} + > + + +
+ {allImages.length > 0 && ( + {`Gallery + )} +
+ +
+ {currentImageIndex + 1} / {allImages.length} +
+ +
+ + +
+ {allImages.map((img, idx) => ( + + ))} +
+ + +
+
+
, + document.body, + )} +
+ ); +} diff --git a/admin/src/components/guards/AuthGuard.tsx b/admin/src/components/guards/AuthGuard.tsx new file mode 100644 index 0000000000..6dc341a7d4 --- /dev/null +++ b/admin/src/components/guards/AuthGuard.tsx @@ -0,0 +1,62 @@ +import { Navigate, Outlet, useLocation } from "react-router"; +import { Loader2 } from "lucide-react"; +import { useApiQuery } from "@/hooks/useApi"; +import { QUERY_KEYS } from "@/config/queryKeys"; +import { API_ENDPOINTS } from "@/constants"; +import { ROLES } from "@/constants/roles"; +import { PROFILE_STALE_TIME } from "@/constants/queryConfig"; + +export interface UserProfile { + _id: string; + name: string; + email: string; + role: "owner" | "admin" | "superAdmin"; + avatar?: string; + phone?: string; +} + +export function AuthGuard() { + const location = useLocation(); + const { + data: profile, + isLoading, + isError, + } = useApiQuery( + QUERY_KEYS.PROFILE, + { method: "GET", url: API_ENDPOINTS.PROFILE }, + { staleTime: PROFILE_STALE_TIME }, + ); + + if (isLoading) { + return ( +
+ +
+ ); + } + + if (isError || !profile) { + const redirectUrl = `${location.pathname}${location.search}`; + try { + localStorage.setItem("redirectUrl", redirectUrl); + } catch { + // Ignore localStorage errors + } + return ( + + ); + } + + if ( + profile.role !== ROLES.OWNER && + profile.role !== ROLES.ADMIN && + profile.role !== ROLES.SUPER_ADMIN + ) { + return ; + } + + return ; +} diff --git a/admin/src/components/guards/OwnerGuard.tsx b/admin/src/components/guards/OwnerGuard.tsx new file mode 100644 index 0000000000..70475355e8 --- /dev/null +++ b/admin/src/components/guards/OwnerGuard.tsx @@ -0,0 +1,23 @@ +import { Navigate, Outlet, useLocation } from "react-router"; +import { useApiQuery } from "@/hooks/useApi"; +import { QUERY_KEYS } from "@/config/queryKeys"; +import { API_ENDPOINTS } from "@/constants"; +import { ROLES } from "@/constants/roles"; +import { PROFILE_STALE_TIME } from "@/constants/queryConfig"; +import { ROUTES } from "@/constants/routes"; +import type { UserProfile } from "./AuthGuard"; + +export function OwnerGuard() { + const location = useLocation(); + const { data: profile } = useApiQuery( + QUERY_KEYS.PROFILE, + { method: "GET", url: API_ENDPOINTS.PROFILE }, + { staleTime: PROFILE_STALE_TIME }, + ); + + if (profile?.role === ROLES.OWNER && location.pathname === ROUTES.DASHBOARD) { + return ; + } + + return ; +} diff --git a/admin/src/components/guards/RoleGuard.tsx b/admin/src/components/guards/RoleGuard.tsx new file mode 100644 index 0000000000..339fea3e82 --- /dev/null +++ b/admin/src/components/guards/RoleGuard.tsx @@ -0,0 +1,28 @@ +import { Navigate, Outlet } from "react-router"; +import { useApiQuery } from "@/hooks/useApi"; +import { QUERY_KEYS } from "@/config/queryKeys"; +import { API_ENDPOINTS } from "@/constants"; +import { PROFILE_STALE_TIME } from "@/constants/queryConfig"; +import type { UserProfile } from "./AuthGuard"; + +interface RoleGuardProps { + allowedRoles: UserProfile["role"][]; +} + +export function RoleGuard({ allowedRoles }: RoleGuardProps) { + const { data: profile, isLoading } = useApiQuery( + QUERY_KEYS.PROFILE, + { method: "GET", url: API_ENDPOINTS.PROFILE }, + { staleTime: PROFILE_STALE_TIME }, + ); + + if (isLoading) { + return null; + } + + if (!profile || !allowedRoles.includes(profile.role)) { + return ; + } + + return ; +} diff --git a/admin/src/components/layout/MainLayout.tsx b/admin/src/components/layout/MainLayout.tsx new file mode 100644 index 0000000000..fa018a452a --- /dev/null +++ b/admin/src/components/layout/MainLayout.tsx @@ -0,0 +1,17 @@ +import { Outlet } from "react-router"; +import { Sidebar } from "./Sidebar"; +import { ModalRoot } from "@/components/common/ModalRoot"; + +export function MainLayout() { + return ( +
+ +
+
+ +
+
+ +
+ ); +} diff --git a/admin/src/components/layout/Sidebar.tsx b/admin/src/components/layout/Sidebar.tsx new file mode 100644 index 0000000000..8dfdf1f30e --- /dev/null +++ b/admin/src/components/layout/Sidebar.tsx @@ -0,0 +1,291 @@ +import { NavLink, useNavigate } from "react-router"; +import { + CalendarCheck, + Calendar, + BarChart2, + Building2, + Users, + Shield, + UserCog, + AlertTriangle, + LogOut, + Star, + ActivitySquare, + Settings, +} from "lucide-react"; +import bmvLogo from "@/assets/bmv-logo.png"; +import { useApiQuery } from "@/hooks/useApi"; +import { QUERY_KEYS } from "@/config/queryKeys"; +import { API_ENDPOINTS } from "@/constants"; +import { ROLES } from "@/constants/roles"; +import { VENUE_STATUS } from "@/constants/venueStatus"; +import { PROFILE_STALE_TIME } from "@/constants/queryConfig"; +import type { UserProfile } from "@/components/guards/AuthGuard"; +import { cn } from "@/lib/utils"; +import { axiosInstance } from "@/config/axios"; +import { queryClient } from "@/config/queryClient"; +import { Button } from "@/components/ui/button"; +import { useAppStore } from "@/store/useAppStore"; +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from "@/components/ui/select"; + +type NavItem = { + label: string; + path: string | ((venueId: string | null) => string); + icon: React.ElementType; + roles: UserProfile["role"][]; +}; + +interface MyVenue { + _id: string; + name: string; + status: string; +} + +interface MyVenuesResponse { + count: number; + venues: MyVenue[]; +} + +const NAV_CONFIG: NavItem[] = [ + // owner + { + label: "My Venues", + path: "/dashboard/select-venue", + icon: Building2, + roles: [ROLES.OWNER], + }, + { + label: "Bookings", + path: (venueId) => `/dashboard/venue/${venueId}/bookings`, + icon: CalendarCheck, + roles: [ROLES.OWNER], + }, + { + label: "Reviews", + path: (venueId) => `/dashboard/venue/${venueId}/reviews`, + icon: Star, + roles: [ROLES.OWNER], + }, + { + label: "Calendar", + path: (venueId) => `/dashboard/venue/${venueId}/calendar`, + icon: Calendar, + roles: [ROLES.OWNER], + }, + { + label: "Reports", + path: (venueId) => `/dashboard/venue/${venueId}/reports`, + icon: BarChart2, + roles: [ROLES.OWNER], + }, + { + label: "Settings", + path: (venueId) => `/dashboard/venue/${venueId}/settings`, + icon: Settings, + roles: [ROLES.OWNER], + }, + // admin + { + label: "Bookings", + path: "/dashboard/bookings", + icon: CalendarCheck, + roles: [ROLES.ADMIN, ROLES.SUPER_ADMIN], + }, + { + label: "Venues", + path: "/dashboard/venues", + icon: Building2, + roles: [ROLES.ADMIN, ROLES.SUPER_ADMIN], + }, + { + label: "Owners", + path: "/dashboard/owners", + icon: Users, + roles: [ROLES.ADMIN, ROLES.SUPER_ADMIN], + }, + { + label: "Moderation", + path: "/dashboard/moderation", + icon: AlertTriangle, + roles: [ROLES.ADMIN, ROLES.SUPER_ADMIN], + }, + // superAdmin only + { + label: "Team", + path: "/dashboard/team", + icon: Shield, + roles: [ROLES.SUPER_ADMIN], + }, + { + label: "Users", + path: "/dashboard/users", + icon: UserCog, + roles: [ROLES.SUPER_ADMIN], + }, + { + label: "Activity Logs", + path: "/dashboard/logs", + icon: ActivitySquare, + roles: [ROLES.SUPER_ADMIN], + }, +]; + +export function Sidebar() { + const navigate = useNavigate(); + const { activeVenueId, lastVenueSubRoute, setActiveVenue } = useAppStore(); + + const { data: profile } = useApiQuery( + QUERY_KEYS.PROFILE, + { method: "GET", url: API_ENDPOINTS.PROFILE }, + { staleTime: PROFILE_STALE_TIME }, + ); + + const { data: myVenuesData } = useApiQuery( + QUERY_KEYS.MY_VENUES, + { method: "GET", url: API_ENDPOINTS.MY_VENUES }, + { + staleTime: PROFILE_STALE_TIME, + enabled: profile?.role === ROLES.OWNER, + }, + ); + + const handleSignOut = async () => { + try { + await axiosInstance.post(API_ENDPOINTS.LOGOUT); + } catch { + // ignore logout errors on client + } finally { + queryClient.clear(); + navigate("/login"); + } + }; + + const navItems = NAV_CONFIG.filter( + (item) => profile && item.roles.includes(profile.role), + ); + + const venues = myVenuesData?.venues || []; + + return ( +
+ {/* Brand */} +
+ BookMyVenue + + Admin + +
+ + {/* Navigation Links */} + + + {/* Venue Switcher (Only for owners) */} + {profile?.role === ROLES.OWNER && ( +
+ +
+ )} + + {/* User Footer */} +
+
+
+ {profile?.name?.charAt(0).toUpperCase() || "U"} +
+
+

+ {profile?.name} +

+

+ {profile?.role} +

+
+ +
+
+
+ ); +} diff --git a/admin/src/components/layout/TenantLayout.tsx b/admin/src/components/layout/TenantLayout.tsx new file mode 100644 index 0000000000..820550f48b --- /dev/null +++ b/admin/src/components/layout/TenantLayout.tsx @@ -0,0 +1,139 @@ +import { useEffect, useRef } from "react"; +import { Outlet, useLocation, useNavigate, useParams } from "react-router"; +import { Loader2 } from "lucide-react"; +import { useToast } from "@/hooks/useToast"; +import { useAppStore } from "@/store/useAppStore"; +import { useApiQuery } from "@/hooks/useApi"; +import { QUERY_KEYS } from "@/config/queryKeys"; +import { API_ENDPOINTS } from "@/constants"; +import { VENUE_STATUS } from "@/constants/venueStatus"; +import { PROFILE_STALE_TIME } from "@/constants/queryConfig"; + +interface MyVenue { + _id: string; + name: string; + city: string; + venueType: string; + coverImage: string; + status: + | "Draft" + | "PendingReview" + | "Approved" + | "Rejected" + | "Suspended" + | "Inactive"; + rejectionReason?: string; +} + +interface MyVenuesResponse { + count: number; + venues: MyVenue[]; +} + +export function TenantLayout() { + const { venueId } = useParams<{ venueId: string }>(); + const location = useLocation(); + const navigate = useNavigate(); + const { setActiveVenue, setLastVenueSubRoute } = useAppStore(); + const handledFailRef = useRef(null); + const { error } = useToast(); + + const venueSubRoute = location.pathname.split("/").pop() ?? "reports"; + + const { + data: myVenues, + isLoading, + isError, + } = useApiQuery( + QUERY_KEYS.MY_VENUES, + { method: "GET", url: API_ENDPOINTS.MY_VENUES }, + { staleTime: PROFILE_STALE_TIME }, + ); + + const venue = + venueId && myVenues + ? myVenues.venues.find((v) => v._id === venueId) + : undefined; + + const isInactive = venue?.status === VENUE_STATUS.INACTIVE; + + const isAccessDenied = + !isLoading && !isError && !!myVenues && !!venueId && !venue; + const isBlockedStatus = + venue && + venue.status !== VENUE_STATUS.APPROVED && + venue.status !== VENUE_STATUS.INACTIVE; + + useEffect(() => { + if (!venueId || isLoading || isError || !myVenues) return; + + if (!venue || isBlockedStatus) { + if (handledFailRef.current === venueId) return; + handledFailRef.current = venueId; + + if (!venue) { + error("Venue not found or you don't have access."); + } else { + error("This venue is not available for dashboard access."); + } + navigate("/dashboard/select-venue", { replace: true }); + return; + } + + handledFailRef.current = null; + setActiveVenue(venueId, venue.name, venue.status); + }, [ + venueId, + venue, + isBlockedStatus, + myVenues, + isLoading, + isError, + navigate, + setActiveVenue, + error, + ]); + + useEffect(() => { + if (venue && venueSubRoute) { + setLastVenueSubRoute(venueSubRoute); + } + }, [venueSubRoute, venue, setLastVenueSubRoute]); + + if (isLoading) { + return ( +
+ +
+ ); + } + + if (isError) { + return ( +
+

+ Failed to load venues. Please try again. +

+
+ ); + } + + if (isAccessDenied) { + return ( +
+ +
+ ); + } + + return ( + <> + {isInactive && ( +
+ This venue is currently inactive. New bookings are blocked. +
+ )} + + + ); +} diff --git a/admin/src/components/moderation/BannedUsersTable.tsx b/admin/src/components/moderation/BannedUsersTable.tsx new file mode 100644 index 0000000000..9b23731238 --- /dev/null +++ b/admin/src/components/moderation/BannedUsersTable.tsx @@ -0,0 +1,128 @@ +import { RotateCcw } from "lucide-react"; +import { Badge } from "@/components/ui/badge"; +import { Button } from "@/components/ui/button"; +import { DataTable } from "@/components/ui/data-table"; +import { + Tooltip, + TooltipContent, + TooltipProvider, + TooltipTrigger, +} from "@/components/ui/tooltip"; +import type { ModerationSummary } from "@/types"; +import type { UseMutationResult } from "@tanstack/react-query"; + +export function BannedUsersTable({ + bannedUsers, + unbanUserMutation, +}: { + bannedUsers: ModerationSummary["bannedUsers"]; + + unbanUserMutation: UseMutationResult< + unknown, + unknown, + { userId: string }, + unknown + >; +}) { + const columns = [ + { + accessorKey: "username", + header: "User", + cell: ({ + row, + }: { + row: { original: ModerationSummary["bannedUsers"][0] }; + }) => ( +
+

+ {row.original.username} +

+

+ {row.original.email} +

+
+ ), + }, + { + accessorKey: "banReason", + header: "Ban Reason", + cell: ({ + row, + }: { + row: { original: ModerationSummary["bannedUsers"][0] }; + }) => ( +

+ {row.original.banReason} +

+ ), + }, + { + accessorKey: "bannedAt", + header: "Banned On", + cell: ({ + row, + }: { + row: { original: ModerationSummary["bannedUsers"][0] }; + }) => ( +

+ {new Date(row.original.bannedAt).toLocaleDateString()} +

+ ), + }, + { + accessorKey: "status", + header: "Status", + cell: () => ( + + Banned + + ), + }, + { + id: "actions", + header: "Actions", + cell: ({ + row, + }: { + row: { original: ModerationSummary["bannedUsers"][0] }; + }) => ( + + + + + + +

Unban

+
+
+
+ ), + }, + ]; + + return ( + {}} + emptyMessage="No banned users." + /> + ); +} diff --git a/admin/src/components/moderation/FlaggedReviewsTable.tsx b/admin/src/components/moderation/FlaggedReviewsTable.tsx new file mode 100644 index 0000000000..20ca9d9730 --- /dev/null +++ b/admin/src/components/moderation/FlaggedReviewsTable.tsx @@ -0,0 +1,185 @@ +import { Trash2, RotateCcw, ExternalLink } from "lucide-react"; +import { Button } from "@/components/ui/button"; +import { DataTable } from "@/components/ui/data-table"; +import { StarRating } from "@/components/common/StarRating"; +import { + Tooltip, + TooltipContent, + TooltipProvider, + TooltipTrigger, +} from "@/components/ui/tooltip"; +import { CLIENT_APP_URL } from "@/constants"; +import type { ModerationSummary } from "@/types"; +import type { ReviewActionDialogState } from "@/types/ui"; +import type { UseMutationResult } from "@tanstack/react-query"; + +export function FlaggedReviewsTable({ + flaggedReviews, + setReviewDialog, + moderateReviewMutation, +}: { + flaggedReviews: ModerationSummary["flaggedReviews"]; + + setReviewDialog: (opts: ReviewActionDialogState) => void; + + moderateReviewMutation: UseMutationResult< + unknown, + unknown, + { + reviewId: string; + action: "remove" | "reject_hide" | "restore" | "approve_hide"; + reason?: string; + }, + unknown + >; +}) { + const columns = [ + { + accessorKey: "venueName", + header: "Venue & User", + cell: ({ + row, + }: { + row: { original: ModerationSummary["flaggedReviews"][0] }; + }) => ( +
+

+ {row.original.venueName} +

+

+ by {row.original.userName} +

+
+ ), + }, + { + accessorKey: "comment", + header: "Review & Rating", + cell: ({ + row, + }: { + row: { original: ModerationSummary["flaggedReviews"][0] }; + }) => ( + + + +
+ +

+ {row.original.comment} +

+
+
+ + +

{row.original.comment}

+
+
+
+ ), + }, + { + accessorKey: "moderationReason", + header: "Flag Reason", + cell: ({ + row, + }: { + row: { original: ModerationSummary["flaggedReviews"][0] }; + }) => ( +

+ {row.original.moderationReason || "No reason provided"} +

+ ), + }, + { + id: "actions", + header: "Actions", + cell: ({ + row, + }: { + row: { original: ModerationSummary["flaggedReviews"][0] }; + }) => ( +
+ + + + + + +

Remove

+
+
+
+ + + + + + +

Restore

+
+
+
+ + + + + + +

View on site

+
+
+
+
+ ), + }, + ]; + + return ( + {}} + emptyMessage="No flagged reviews found." + /> + ); +} diff --git a/admin/src/components/moderation/HideRequestsTable.tsx b/admin/src/components/moderation/HideRequestsTable.tsx new file mode 100644 index 0000000000..3098ffb59e --- /dev/null +++ b/admin/src/components/moderation/HideRequestsTable.tsx @@ -0,0 +1,188 @@ +import { Button } from "@/components/ui/button"; +import { DataTable } from "@/components/ui/data-table"; +import { StarRating } from "@/components/common/StarRating"; +import { Check, X, ExternalLink } from "lucide-react"; +import { + Tooltip, + TooltipContent, + TooltipProvider, + TooltipTrigger, +} from "@/components/ui/tooltip"; +import { CLIENT_APP_URL } from "@/constants"; +import type { ModerationSummary } from "@/types"; +import type { ReviewActionDialogState } from "@/types/ui"; +import type { UseMutationResult } from "@tanstack/react-query"; + +export function HideRequestsTable({ + hideRequests, + setReviewDialog, + moderateReviewMutation, +}: { + hideRequests: ModerationSummary["hideRequests"]; + + setReviewDialog: (opts: ReviewActionDialogState) => void; + + moderateReviewMutation: UseMutationResult< + unknown, + unknown, + { + reviewId: string; + action: "remove" | "reject_hide" | "restore" | "approve_hide"; + reason?: string; + }, + unknown + >; +}) { + const columns = [ + { + accessorKey: "venueName", + header: "Venue & Parties", + cell: ({ + row, + }: { + row: { original: ModerationSummary["hideRequests"][0] }; + }) => ( +
+

+ {row.original.venueName} +

+

+ Owner: {row.original.ownerUsername} +

+

+ Reviewer: {row.original.userName} +

+
+ ), + }, + { + accessorKey: "comment", + header: "Review & Rating", + cell: ({ + row, + }: { + row: { original: ModerationSummary["hideRequests"][0] }; + }) => ( + + + +
+ +

+ {row.original.comment} +

+
+
+ + +

{row.original.comment}

+
+
+
+ ), + }, + { + accessorKey: "hideRequestReason", + header: "Hide Reason", + cell: ({ + row, + }: { + row: { original: ModerationSummary["hideRequests"][0] }; + }) => ( +

+ {row.original.hideRequestReason} +

+ ), + }, + { + id: "actions", + header: "Actions", + cell: ({ + row, + }: { + row: { original: ModerationSummary["hideRequests"][0] }; + }) => ( +
+ + + + + + +

Approve

+
+
+
+ + + + + + +

Reject

+
+
+
+ + + + + + +

View on site

+
+
+
+
+ ), + }, + ]; + + return ( + {}} + emptyMessage="No pending hide requests." + /> + ); +} diff --git a/admin/src/components/moderation/ReviewActionDialog.tsx b/admin/src/components/moderation/ReviewActionDialog.tsx new file mode 100644 index 0000000000..14ac362aa5 --- /dev/null +++ b/admin/src/components/moderation/ReviewActionDialog.tsx @@ -0,0 +1,133 @@ +import { + Dialog, + DialogContent, + DialogDescription, + DialogFooter, + DialogHeader, + DialogTitle, +} from "@/components/ui/dialog"; +import { Input } from "@/components/ui/input"; +import { Label } from "@/components/ui/label"; +import { Button } from "@/components/ui/button"; +import type { ReviewActionDialogState } from "@/types/ui"; +import { MIN_REASON_LENGTH } from "@/constants/validation"; +import type { UseMutationResult } from "@tanstack/react-query"; + +export function ReviewActionDialog({ + reviewDialog, + setReviewDialog, + reviewReason, + setReviewReason, + moderateReviewMutation, +}: { + reviewDialog: ReviewActionDialogState; + + setReviewDialog: (state: ReviewActionDialogState) => void; + reviewReason: string; + setReviewReason: (val: string) => void; + + moderateReviewMutation: UseMutationResult< + unknown, + unknown, + { + reviewId: string; + action: "remove" | "reject_hide" | "restore" | "approve_hide"; + reason?: string; + }, + unknown + >; +}) { + return ( + setReviewDialog({ ...reviewDialog, open })} + > + + + + {reviewDialog.action === "remove" + ? "Remove Review" + : reviewDialog.action === "approve_hide" + ? "Approve Hide Request" + : "Restore Review"} + + + {reviewDialog.action === "remove" + ? "Are you sure you want to remove this review? This action cannot be undone." + : reviewDialog.action === "approve_hide" + ? "Approving this hide request will remove the review. Please provide a reason (minimum 10 characters)." + : "Restore this review to be visible again?"} + + + + {(reviewDialog.action === "remove" || + reviewDialog.action === "approve_hide") && ( +
+
+ + setReviewReason(e.target.value)} + className="rounded-lg border border-[var(--bg-grey)] bg-[var(--bg-primary)]" + /> + {reviewReason.trim().length > 0 && + reviewReason.trim().length < MIN_REASON_LENGTH && ( +

+ Reason must be at least 10 characters. +

+ )} +
+
+ )} + + + + + +
+
+ ); +} diff --git a/admin/src/components/moderation/SuspendedVenuesTable.tsx b/admin/src/components/moderation/SuspendedVenuesTable.tsx new file mode 100644 index 0000000000..af13df713e --- /dev/null +++ b/admin/src/components/moderation/SuspendedVenuesTable.tsx @@ -0,0 +1,123 @@ +import { RotateCcw } from "lucide-react"; +import { Badge } from "@/components/ui/badge"; +import { Button } from "@/components/ui/button"; +import { DataTable } from "@/components/ui/data-table"; +import { + Tooltip, + TooltipContent, + TooltipProvider, + TooltipTrigger, +} from "@/components/ui/tooltip"; +import type { ModerationSummary } from "@/types"; +import type { UseMutationResult } from "@tanstack/react-query"; + +export function SuspendedVenuesTable({ + suspendedVenues, + unsuspendVenueMutation, +}: { + suspendedVenues: ModerationSummary["suspendedVenues"]; + + unsuspendVenueMutation: UseMutationResult< + unknown, + unknown, + { venueId: string }, + unknown + >; +}) { + const columns = [ + { + accessorKey: "name", + header: "Venue", + cell: ({ + row, + }: { + row: { original: ModerationSummary["suspendedVenues"][0] }; + }) => ( +

+ {row.original.name} +

+ ), + }, + { + accessorKey: "suspensionReason", + header: "Reason", + cell: ({ + row, + }: { + row: { original: ModerationSummary["suspendedVenues"][0] }; + }) => ( +

+ {row.original.suspensionReason} +

+ ), + }, + { + accessorKey: "suspendedAt", + header: "Suspended On", + cell: ({ + row, + }: { + row: { original: ModerationSummary["suspendedVenues"][0] }; + }) => ( +

+ {new Date(row.original.suspendedAt).toLocaleDateString()} +

+ ), + }, + { + accessorKey: "status", + header: "Status", + cell: () => ( + + Suspended + + ), + }, + { + id: "actions", + header: "Actions", + cell: ({ + row, + }: { + row: { original: ModerationSummary["suspendedVenues"][0] }; + }) => ( + + + + + + +

Unsuspend

+
+
+
+ ), + }, + ]; + + return ( + {}} + emptyMessage="No suspended venues." + /> + ); +} diff --git a/admin/src/components/reports/MetricCardsGrid.tsx b/admin/src/components/reports/MetricCardsGrid.tsx new file mode 100644 index 0000000000..d8a1bbb9ed --- /dev/null +++ b/admin/src/components/reports/MetricCardsGrid.tsx @@ -0,0 +1,52 @@ +import { TrendingUp, DollarSign, CalendarCheck } from "lucide-react"; +import { MetricCard } from "@/components/common/MetricCard"; + +export function MetricCardsGrid({ + isLoading, + totalRevenue, + totalBookings, + avgMonthlyRevenue, + monthsLength, +}: { + isLoading: boolean; + totalRevenue: number; + totalBookings: number; + avgMonthlyRevenue: number; + monthsLength: number; +}) { + if (isLoading) { + return ( +
+ {[1, 2, 3].map((i) => ( +
+ ))} +
+ ); + } + + return ( +
+ + + +
+ ); +} diff --git a/admin/src/components/reports/MonthlyBreakdownTable.tsx b/admin/src/components/reports/MonthlyBreakdownTable.tsx new file mode 100644 index 0000000000..85bc0d7120 --- /dev/null +++ b/admin/src/components/reports/MonthlyBreakdownTable.tsx @@ -0,0 +1,50 @@ +import type { MonthData } from "@/types/reports.types"; + +export function MonthlyBreakdownTable({ + isLoading, + months, + monthNames, +}: { + isLoading: boolean; + months: MonthData[]; + monthNames: Record; +}) { + if (isLoading || months.length === 0) return null; + + return ( +
+
+

+ Monthly Breakdown +

+
+ + + + + + + + + + {[...months].reverse().map((row) => ( + + + + + + ))} + +
PeriodBookingsRevenue
+ {monthNames[row.month] ?? row.month} '{row.year.slice(2)} + + {row.count} + + ₹{row.revenue.toLocaleString("en-IN")} +
+
+ ); +} diff --git a/admin/src/components/reports/RevenueChart.tsx b/admin/src/components/reports/RevenueChart.tsx new file mode 100644 index 0000000000..181c3d991e --- /dev/null +++ b/admin/src/components/reports/RevenueChart.tsx @@ -0,0 +1,85 @@ +import { BarChart3 } from "lucide-react"; +import { + AreaChart, + Area, + XAxis, + YAxis, + CartesianGrid, + Tooltip, + ResponsiveContainer, +} from "recharts"; +import { CustomTooltip } from "@/components/common/CustomTooltip"; + +export function RevenueChart({ + isLoading, + chartData, +}: { + isLoading: boolean; + chartData: { label: string; revenue: number; bookings: number }[]; +}) { + return ( +
+
+
+

+ Monthly Revenue +

+

+ Revenue trend from completed bookings +

+
+
+ + {isLoading ? ( +
+ ) : chartData.length === 0 ? ( +
+ +

No completed bookings yet

+
+ ) : ( + + + + + + + + + + + `₹${(v / 1000).toFixed(0)}k`} + tick={{ fontSize: 12, fill: "#9ca3af" }} + tickLine={false} + axisLine={false} + width={52} + /> + } /> + + + + )} +
+ ); +} diff --git a/admin/src/components/reviews/ReplyDialog.tsx b/admin/src/components/reviews/ReplyDialog.tsx new file mode 100644 index 0000000000..11ab945877 --- /dev/null +++ b/admin/src/components/reviews/ReplyDialog.tsx @@ -0,0 +1,80 @@ +import { + Dialog, + DialogContent, + DialogDescription, + DialogFooter, + DialogHeader, + DialogTitle, +} from "@/components/ui/dialog"; +import { Label } from "@/components/ui/label"; +import { Button } from "@/components/ui/button"; +import type { ReplyDialogState } from "@/types/ui"; +import { MAX_TEXT_LENGTH } from "@/constants/validation"; + +export function ReplyDialog({ + replyDialog, + setReplyDialog, + replyText, + setReplyText, + handleReply, + isPending, +}: { + replyDialog: ReplyDialogState; + setReplyDialog: (opts: ReplyDialogState) => void; + replyText: string; + setReplyText: (text: string) => void; + handleReply: () => void; + isPending: boolean; +}) { + return ( + setReplyDialog({ open })} + > + + + Reply to Review + + Share your response to this customer's review. + + + +
+
+ + +
+ {reason.length}/200 +
+
+
+ +
+ + +
+
+
+ ); +}; + +export default CancelBookingModal; diff --git a/client/src/components/common/Footer.tsx b/client/src/components/common/Footer.tsx new file mode 100644 index 0000000000..3501ddf36f --- /dev/null +++ b/client/src/components/common/Footer.tsx @@ -0,0 +1,210 @@ +import { Link, useLocation } from 'react-router'; +import { IoLogoFacebook, IoLogoTwitter, IoLogoInstagram, IoLogoLinkedin } from 'react-icons/io5'; +import bmvLogo from '@/assets/bmv-logo.png'; + +const Footer = () => { + const location = useLocation(); + const isHomePage = location.pathname === '/'; + + if (isHomePage) { + return ( +
+
+
+ {/* Column 1: Brand */} +
+ + BookMyVenue + +

+ Your premier destination for discovering and booking the perfect venues for any + occasion. From weddings to corporate retreats, we make event planning seamless. +

+ +
+ + {/* Column 2: Company */} +
+

+ Company +

+
    +
  • + + About Us + +
  • +
  • + + Legal Information + +
  • +
  • + + Contact Us + +
  • +
  • + + Blogs + +
  • +
+
+ + {/* Column 3: Help Center */} +
+

+ Help Center +

+
    +
  • + + Find a Property + +
  • +
  • + + How To Host? + +
  • +
  • + + Why Us? + +
  • +
  • + + FAQs + +
  • +
+
+ + {/* Column 4: Contact Info */} +
+

+ Contact Info +

+
    +
  • + Phone: + 1-800-BOOK-VENUE +
  • +
  • + Email: + support@bookmyvenue.com +
  • +
  • + + Location: + + Kochi, Kerala, India +
  • +
+
+
+ +
+

+ © {new Date().getFullYear()} BookMyVenue. All rights reserved. +

+
+
+
+ ); + } + + // Regular footer for other pages + return ( +
+
+
+ {/* Brand */} +
+ BookMyVenue + +

+ Find and book the perfect venue for your events. +

+
+ +
+

Quick Links

+ +
+ + Explore Venues + + + + My Bookings + + + + List Your Venue + +
+
+ +
+

Legal

+ +
+ + Privacy Policy + + + + Terms & Conditions + +
+
+
+ +
+ © {new Date().getFullYear()} BookMyVenue. All rights reserved. +
+
+
+ ); +}; + +export default Footer; diff --git a/client/src/components/common/GuestGuard.tsx b/client/src/components/common/GuestGuard.tsx new file mode 100644 index 0000000000..84b2d06d03 --- /dev/null +++ b/client/src/components/common/GuestGuard.tsx @@ -0,0 +1,28 @@ +import React from 'react'; +import { Navigate, Outlet, useLocation } from 'react-router'; +import { getSafeRedirectUrl } from '@/utils/redirect'; +import { useAuth } from '@/hooks/useAuth'; + +const GuestGuard: React.FC = () => { + const { isAuthenticated, loading } = useAuth(); + const location = useLocation(); + + if (loading) { + return ( +
+
+
+ ); + } + + if (isAuthenticated) { + const searchParams = new URLSearchParams(location.search); + const redirectParam = searchParams.get('redirect'); + const safeRedirect = getSafeRedirectUrl(redirectParam); + return ; + } + + return ; +}; + +export default GuestGuard; diff --git a/client/src/components/common/ImageLightbox.tsx b/client/src/components/common/ImageLightbox.tsx new file mode 100644 index 0000000000..1b5179e9de --- /dev/null +++ b/client/src/components/common/ImageLightbox.tsx @@ -0,0 +1,85 @@ +import { useEffect, useState } from 'react'; +import { FiX, FiChevronLeft, FiChevronRight } from 'react-icons/fi'; + +interface ImageLightboxProps { + images: string[]; + initialIndex?: number; + onClose: () => void; +} + +const ImageLightbox = ({ images, initialIndex = 0, onClose }: ImageLightboxProps) => { + const [index, setIndex] = useState(initialIndex); + const hasMultiple = images.length > 1; + + useEffect(() => { + const handleKeyDown = (e: KeyboardEvent) => { + if (e.key === 'Escape') onClose(); + if (hasMultiple && e.key === 'ArrowLeft') { + setIndex((prev) => (prev - 1 + images.length) % images.length); + } + if (hasMultiple && e.key === 'ArrowRight') { + setIndex((prev) => (prev + 1) % images.length); + } + }; + + document.addEventListener('keydown', handleKeyDown); + return () => document.removeEventListener('keydown', handleKeyDown); + }, [onClose, hasMultiple, images.length]); + + if (images.length === 0) return null; + + return ( +
+ + + {hasMultiple && ( + <> + + +
+ {index + 1} / {images.length} +
+ + )} + + e.stopPropagation()} + className="max-h-[90vh] max-w-[90vw] object-contain rounded-lg" + /> +
+ ); +}; + +export default ImageLightbox; diff --git a/client/src/components/common/ImageUpload.tsx b/client/src/components/common/ImageUpload.tsx new file mode 100644 index 0000000000..bd96688d61 --- /dev/null +++ b/client/src/components/common/ImageUpload.tsx @@ -0,0 +1,170 @@ +import { useState, useEffect, useRef } from 'react'; +import { X, Plus } from 'lucide-react'; + +interface ImageUploadProps { + fieldName: 'coverImage' | 'galleryImages'; + existingUrls: string[]; + onChange: (files: File[], existingUrls: string[]) => void; + maxFiles?: number; +} + +export function ImageUpload({ + fieldName, + existingUrls, + onChange, + maxFiles = 10, +}: ImageUploadProps) { + const [previewUrls, setPreviewUrls] = useState(() => existingUrls); + const [files, setFiles] = useState([]); + const [isDragging, setIsDragging] = useState(false); + const prevExistingUrlsRef = useRef(existingUrls); + + useEffect(() => { + if (prevExistingUrlsRef.current !== existingUrls) { + prevExistingUrlsRef.current = existingUrls; + setPreviewUrls(existingUrls); + } + }, [existingUrls]); + + useEffect(() => { + return () => { + previewUrls.forEach((url) => { + if (url.startsWith('blob:')) { + URL.revokeObjectURL(url); + } + }); + }; + }, [previewUrls]); + + const handleFileChange = (newFiles: FileList | File[]) => { + const fileArray = Array.from(newFiles); + const remainingSlots = maxFiles - previewUrls.length; + const filesToAdd = fileArray.slice(0, remainingSlots); + + const newPreviewUrls = filesToAdd.map((file) => URL.createObjectURL(file)); + setPreviewUrls((prev) => [...prev, ...newPreviewUrls]); + setFiles((prev) => [...prev, ...filesToAdd]); + onChange(filesToAdd, previewUrls); + }; + + const removeImage = (index: number) => { + const isExisting = index < existingUrls.length; + + if (isExisting) { + const newExisting = existingUrls.filter((_, i) => i !== index); + setPreviewUrls((prev) => { + const urlToRevoke = prev[index]; + if (urlToRevoke.startsWith('blob:')) { + URL.revokeObjectURL(urlToRevoke); + } + return prev.filter((_, i) => i !== index); + }); + onChange(files, newExisting); + } else { + const fileIndex = index - existingUrls.length; + setPreviewUrls((prev) => { + const urlToRevoke = prev[index]; + if (urlToRevoke.startsWith('blob:')) { + URL.revokeObjectURL(urlToRevoke); + } + return prev.filter((_, i) => i !== index); + }); + setFiles((prev) => prev.filter((_, i) => i !== fileIndex)); + onChange( + files.filter((_, i) => i !== fileIndex), + existingUrls + ); + } + }; + + const handleDragOver = (e: React.DragEvent) => { + e.preventDefault(); + setIsDragging(true); + }; + + const handleDragLeave = (e: React.DragEvent) => { + e.preventDefault(); + setIsDragging(false); + }; + + const handleDrop = (e: React.DragEvent) => { + e.preventDefault(); + setIsDragging(false); + if (e.dataTransfer.files.length > 0) { + handleFileChange(e.dataTransfer.files); + } + }; + + const isCoverImage = fieldName === 'coverImage'; + const maxAllowed = isCoverImage ? 1 : maxFiles; + const canAddMore = previewUrls.length < maxAllowed; + + return ( +
+ + +
+
+ {previewUrls.map((url, index) => ( +
+ {`Preview + +
+ ))} + + {canAddMore && ( + + )} +
+ + {previewUrls.length > 0 && ( +

+ {isCoverImage + ? 'Click X to replace cover image' + : 'Drag to reorder (first image is cover)'} +

+ )} +
+
+ ); +} diff --git a/client/src/components/common/ListSidebar.tsx b/client/src/components/common/ListSidebar.tsx new file mode 100644 index 0000000000..0886d374b5 --- /dev/null +++ b/client/src/components/common/ListSidebar.tsx @@ -0,0 +1,76 @@ +import { Link, useLocation } from 'react-router'; +import { MdOutlineMeetingRoom } from 'react-icons/md'; +import { IoAddCircleOutline } from 'react-icons/io5'; +import bmvLogo from '@/assets/bmv-logo.png'; + +const ListSidebar = () => { + const location = useLocation(); + + const isActive = (path: string) => location.pathname.includes(path); + + return ( + <> + {/* Desktop Sidebar */} + + + {/* Mobile Bottom Nav */} + + + ); +}; + +export default ListSidebar; diff --git a/client/src/components/common/Navbar.tsx b/client/src/components/common/Navbar.tsx new file mode 100644 index 0000000000..e2972c1c05 --- /dev/null +++ b/client/src/components/common/Navbar.tsx @@ -0,0 +1,264 @@ +import { useState, useEffect, useRef } from 'react'; + +import { Link, useLocation } from 'react-router'; +import bmvLogo from '@/assets/bmv-logo.png'; +import { AnimatePresence, motion } from 'framer-motion'; +import ProfileDropdown from './ProfileDropdown'; +import ThemeToggle from './ThemeToggle'; +import { useAuth } from '@/hooks/useAuth'; +import { FiUser } from 'react-icons/fi'; +import { hasPlayedProfileGreeting, markProfileGreetingPlayed } from '@/utils/profileGreeting'; + +// Greet returning users on load so the profile icon reads as clickable: +// icon-only -> pill expands with "Hi there" -> swaps to the user's name -> converges back to the icon. +const GREETING_DELAY_MS = 3500; +const HI_HOLD_MS = 3000; +const NAME_HOLD_MS = 3200; +const PILL_FADE_MS = 750; +const PILL_WIDTH = 70; + +type GreetingStage = 'idle' | 'hi' | 'name' | 'done'; + +const Navbar = () => { + const [openProfile, setOpenProfile] = useState(false); + const [mobileNavOpen, setMobileNavOpen] = useState(false); + const { isAuthenticated, loading, user } = useAuth(); + const location = useLocation(); + const profileButtonRef = useRef(null); + + const isActive = (path: string) => location.pathname === path; + + const [scrolled, setScrolled] = useState(false); + + useEffect(() => { + const onScroll = () => setScrolled(window.scrollY > 20); + window.addEventListener('scroll', onScroll, { passive: true }); + return () => window.removeEventListener('scroll', onScroll); + }, []); + + const [greetingStage, setGreetingStage] = useState(() => + hasPlayedProfileGreeting() ? 'done' : 'idle' + ); + const greetingStarted = useRef(false); + + useEffect(() => { + if (!isAuthenticated || greetingStarted.current || hasPlayedProfileGreeting()) return; + greetingStarted.current = true; + + const timer = setTimeout(() => { + markProfileGreetingPlayed(); + setGreetingStage('hi'); + }, GREETING_DELAY_MS); + return () => clearTimeout(timer); + }, [isAuthenticated]); + + useEffect(() => { + if (greetingStage === 'hi') { + const timer = setTimeout(() => setGreetingStage('name'), HI_HOLD_MS); + return () => clearTimeout(timer); + } + if (greetingStage === 'name') { + const timer = setTimeout(() => setGreetingStage('done'), NAME_HOLD_MS); + return () => clearTimeout(timer); + } + }, [greetingStage]); + + const showGreetingPill = greetingStage === 'hi' || greetingStage === 'name'; + const firstName = user?.username?.split(' ')[0] || 'there'; + + // On mobile: toggle the nav tray. On desktop: toggle the profile dropdown. + const handleProfileClick = () => { + if (window.innerWidth < 768) { + setMobileNavOpen((prev) => !prev); + } else { + setOpenProfile((prev) => !prev); + } + }; + + return ( +
+
+ {/* left - logo */} + + BookMyVenue + + + {/* center nav */} + + + {/* profile / login */} +
+ + {!loading && + (isAuthenticated ? ( +
+ + {/* ProfileDropdown only appears on desktop click */} + + {openProfile && ( + setOpenProfile(false)} + triggerRef={profileButtonRef} + /> + )} + +
+ ) : ( + { + if (window.innerWidth < 768) { + setMobileNavOpen((prev) => !prev); + } + }} + className="px-5 py-2 rounded-xl bg-[var(--bg-secondary)] border-2 border-transparent hover:bg-[var(--bg-primary)] hover:border-2 hover:text-[var(--text-primary)] hover:border-[var(--bg-secondary)] transition-all font-medium text-white text-sm" + > + Login + + ))} +
+
+ + {/* Mobile Nav Tray (Horizontal Slide Down) */} +
+
+
+ setMobileNavOpen(false)} + className={`text-sm font-medium transition-colors ${ + isActive('/explore') + ? 'text-[var(--bg-green)] border-b-2 border-[var(--bg-green)]' + : 'text-[var(--text-secondary)] hover:text-[var(--bg-green)]' + }`} + > + Explore + + setMobileNavOpen(false)} + className={`text-sm font-medium transition-colors ${ + isActive('/list-venue') + ? 'text-[var(--bg-green)] border-b-2 border-[var(--bg-green)]' + : 'text-[var(--text-secondary)] hover:text-[var(--bg-green)]' + }`} + > + List Venue + + setMobileNavOpen(false)} + className={`text-sm font-medium transition-colors ${ + isActive('/my-bookings') + ? 'text-[var(--bg-green)] border-b-2 border-[var(--bg-green)]' + : 'text-[var(--text-secondary)] hover:text-[var(--bg-green)]' + }`} + > + My Bookings + + {isAuthenticated && ( + setMobileNavOpen(false)} + className={`text-sm font-medium transition-colors ${ + isActive('/profile') + ? 'text-[var(--bg-green)] border-b-2 border-[var(--bg-green)]' + : 'text-[var(--text-secondary)] hover:text-[var(--bg-green)]' + }`} + > + Profile + + )} +
+
+
+
+ ); +}; + +export default Navbar; diff --git a/client/src/components/common/ProfileDropdown.tsx b/client/src/components/common/ProfileDropdown.tsx new file mode 100644 index 0000000000..072ec4cc40 --- /dev/null +++ b/client/src/components/common/ProfileDropdown.tsx @@ -0,0 +1,166 @@ +import { useRef, useEffect, useState, type RefObject } from 'react'; +import { Link, useNavigate } from 'react-router'; +import { motion } from 'framer-motion'; +import { FiLogOut, FiUser, FiX, FiHeart } from 'react-icons/fi'; +import { LuCalendarDays } from 'react-icons/lu'; +import { MdOutlineMeetingRoom } from 'react-icons/md'; +import { useAuth } from '@/hooks/useAuth'; + +type ProfileDropdownProps = { + onClose: () => void; + triggerRef?: RefObject; +}; + +// Mobile slides in as a full-height tray; desktop drops down from the avatar. +const desktopVariants = { + initial: { opacity: 0, y: -8, scale: 0.97 }, + animate: { opacity: 1, y: 0, scale: 1 }, + exit: { opacity: 0, y: -8, scale: 0.97 }, +}; + +const mobileVariants = { + initial: { opacity: 0, x: '100%' }, + animate: { opacity: 1, x: 0 }, + exit: { opacity: 0, x: '100%' }, +}; + +const useIsDesktop = () => { + const [isDesktop, setIsDesktop] = useState(() => window.matchMedia('(min-width: 768px)').matches); + + useEffect(() => { + const mql = window.matchMedia('(min-width: 768px)'); + const handleChange = (e: MediaQueryListEvent) => setIsDesktop(e.matches); + mql.addEventListener('change', handleChange); + return () => mql.removeEventListener('change', handleChange); + }, []); + + return isDesktop; +}; + +const ProfileDropdown = ({ onClose, triggerRef }: ProfileDropdownProps) => { + const { user, logout } = useAuth(); + const dropdownRef = useRef(null); + const navigate = useNavigate(); + const isDesktop = useIsDesktop(); + + useEffect(() => { + const handleClickOutside = (event: MouseEvent) => { + const target = event.target as Node; + if (dropdownRef.current && dropdownRef.current.contains(target)) return; + if (triggerRef?.current && triggerRef.current.contains(target)) return; + onClose(); + }; + + document.addEventListener('mousedown', handleClickOutside); + return () => document.removeEventListener('mousedown', handleClickOutside); + }, [onClose, triggerRef]); + + const handleLogout = async () => { + await logout(); + onClose(); + navigate('/login'); + }; + + return ( + <> + {/* Mobile Backdrop */} + + + {/* Header */} +
+ {/* Avatar */} +
+ +
+ + {/* User info */} +
+

+ {user?.username || 'User'} +

+

+ {user?.email || 'user@example.com'} +

+
+ + {/* Close button — mobile only */} + +
+ + {/* Menu items */} +
+ + + Profile + + + + + My Bookings + + + + + My Wishlist + + + + + My Venues + + +
+ +
+
+
+ + ); +}; + +export default ProfileDropdown; diff --git a/client/src/components/common/ReviewModal.tsx b/client/src/components/common/ReviewModal.tsx new file mode 100644 index 0000000000..a5c626ad0b --- /dev/null +++ b/client/src/components/common/ReviewModal.tsx @@ -0,0 +1,115 @@ +import { useState } from 'react'; +import { Star } from 'lucide-react'; +import { Button } from '@/components/ui/button'; +import { Dialog, DialogContent, DialogHeader, DialogTitle } from '@/components/ui/dialog'; +type ReviewModalProps = { + open: boolean; + onOpenChange: (open: boolean) => void; + venueName: string; + onSubmit?: (rating: number, comment: string) => Promise; +}; + +const ReviewModal = ({ open, onOpenChange, venueName, onSubmit }: ReviewModalProps) => { + const [rating, setRating] = useState(0); + const [review, setReview] = useState(''); + const [isSubmitting, setIsSubmitting] = useState(false); + + const handleSubmit = async () => { + if (rating === 0) { + alert('Please select a rating'); + return; + } + + if (!onSubmit) { + alert('Submit handler not configured'); + return; + } + + setIsSubmitting(true); + try { + await onSubmit(rating, review); + setRating(0); + setReview(''); + onOpenChange(false); + } catch (error) { + console.error('Failed to submit review:', error); + alert('Failed to submit review. Please try again.'); + } finally { + setIsSubmitting(false); + } + }; + + return ( + + + + + Add Review + + +

+ Share your experience for {venueName} +

+
+ + {/* Stars */} +
+

Your Rating

+ +
+ {[1, 2, 3, 4, 5].map((star) => ( + + ))} +
+
+ + {/* Review */} +
+

Review

+ + +
+
+ +
+ +
+ { + releaseLock({}); + navigate(-1); + }} + /> +
+
+

Kz5UB>z2QZb9}5E9W}(ut;(Qax>SqGtn6jpYY*_ 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