Skip to content

API Database Schema ​

Database: walkthroughnepalORM: Prisma 7.1 + @prisma/adapter-pgMigrations: 17 migrations in prisma/migrations/

Models ​

Admin ​

Administrator accounts for the main platform admin panel (supplier approval, activity moderation, user management).

FieldTypeNotes
idInt (PK, autoincrement)
usernameString (unique)Login username
emailString (unique)Login email
passwordStringbcrypt-hashed
roleAdminType enumSUPERADMIN, MODERATOR, or SUPPORT
createdAtDateTime
updatedAtDateTime

User ​

Registered travelers who can book activities, leave reviews, and manage wishlists.

FieldTypeNotes
idInt (PK, autoincrement)
roleStringDefault "USER"
emailString (unique)Login email
passwordStringbcrypt-hashed
phoneString?
dateOfBirthDateTime?
emailVerifiedBooleanDefault false
nameStringDisplay name
usernameString (unique)Public username
imageString?Avatar URL
bioString?
metaJson?Additional metadata

Relations: Booking[], Review[], wishlists[]

Supplier ​

Activity providers who register and manage their offerings.

FieldTypeNotes
supplierIdInt (PK, autoincrement)
typeSupplierType enumINDIVIDUAL or COMPANY
fullNameStringDisplay name
emailString (unique)Login email
passwordStringbcrypt-hashed
phoneString
addressString
legalNameStringBusiness legal name
professionalLicenseNumberString
companyDescriptionString
companyLogoString?
isVerifiedBooleanDefault false — admin must verify
metaJson?
bioString?
licenseString?License document URL
languagesString[]Spoken languages

Relations: activities[]

Activity ​

The core product — treks, tours, and activities available for booking.

FieldTypeNotes
idInt (PK, autoincrement)
titleString
shortDescriptionString?Brief summary
fullDescriptionString?Detailed HTML description
highlightsString[]Key features
locationsString[]
keywordsString[]SEO keywords
inclusionsString[]What's included
exclusionsString[]What's excluded
priceFloat?Base price
publishedBooleanDefault false
statusActivityStatus enumAPPROVED, REJECTED, or PENDING_APPROVAL
durationString?e.g., "5 days"
guestCapacityInt?Maximum group size
imagesString[]Array of image URLs
itineraryJson?Day-by-day plan
meetingPointString?
whatToBringString[]
additionalInfoJson?
difficultyLevelDifficultyLevel?EASY, MODERATE, HARD, or EXTREME
isFeaturedBoolean
popularityScoreIntComputed by cron job
viewsIntPage view counter
averageRatingFloatComputed from reviews
bookingsCountIntIncremented on confirmed booking
canonicalPathString?SEO canonical URL
urlHistoryString[]Old URLs for redirects

Relations: city, region, supplier, tripCategory, tripType, availability, Booking[], Review[], wishlists, featuredTags[]

Indexes: published, status, supplierId, cityId, regionId, tripCategoryId, tripTypeId, difficultyLevel, popularityScore, averageRating, views, isFeatured

Booking ​

A traveler's booking for a specific activity.

FieldTypeNotes
idInt (PK, autoincrement)
activityIdInt (FK → Activity)
userIdInt (FK → User)
startDateDateTimeTrip start
daysIntDuration
groupSizeIntNumber of travelers
totalPriceDecimal
statusBookingStatus enumPENDING_PAYMENT, CONFIRMED, CANCELLED, or FAILED
endDateDateTimeComputed from startDate + days

Unique constraint: [userId, activityId, startDate] Relations: activity, user, payment

Payment ​

Payment records linked to bookings.

FieldTypeNotes
idInt (PK, autoincrement)
bookingIdInt (FK, unique → Booking)One payment per booking
amountDecimal
currencyCURRENCY enumUSD or NPR
statusPaymentStatus enumPENDING, SUCCESS, FAILED, or REFUNDED
transactionIdString?
providerPaymentProvider enumSTRIPE or PAYPAL (only Stripe implemented)
stripePaymentIntentIdString?Stripe reference

Review ​

Post-booking reviews left by users.

FieldTypeNotes
idInt (PK, autoincrement)
ratingInt1–5
textStringReview content
reviewerIdInt (FK → User)
activityIdInt (FK → Activity)

Availability ​

Activity availability calendar.

FieldTypeNotes
idString (cuid)
unavailableDatesDateTime[]Dates the activity is not available
availableRangeJson?Optional date range for availability
activityIdInt (FK, unique → Activity)One availability record per activity

TripCategory ​

Classification for activities (e.g., Trekking, Tour, Cultural).

FieldTypeNotes
idString (cuid)
categoryHandleString (unique)URL-safe slug
categoryNameString?Display name
categoryImageString?

TripType ​

Activity type (e.g., Group, Private).

FieldTypeNotes
idString (cuid)
tripTypeHandleString (unique)URL-safe slug
tripTypeNameString?Display name
tripTypeImageString?

City ​

Cities where activities operate. Also used by Blog (legacy) — now shared with CMS.

FieldTypeNotes
idString (cuid)
cityNameString
cityHandleString (unique)URL-safe slug
cityImageString?

Region ​

Geographic regions containing cities.

FieldTypeNotes
idString (cuid)
regionNameString
regionHandleString
regionImageString?

NewsletterSubscriber ​

Email newsletter subscriptions.

FieldTypeNotes
idString (cuid)
emailString (unique)
unsubSecretString (unique)For one-click unsubscribe
isActiveBooleanDefault true
unsubscribedAtDateTime?

Wishlist ​

User-saved activities.

FieldTypeNotes
idString (cuid)
itemIdInt (FK, unique → Activity)
userIdInt (FK → User)
createdAtDateTime

Unique constraint: [userId, itemId]

FeaturedTag ​

Tags for promotional/featured content placement.

FieldTypeNotes
idString (cuid)
nameString
slugString (unique)
descriptionString?

ActivityFeaturedTag ​

Junction table for M:N relationship between Activity and FeaturedTag.

FieldTypeNotes
activityIdInt (FK → Activity)Composite PK
featuredTagIdString (FK → FeaturedTag)Composite PK

Media ​

Media library for uploaded files.

FieldTypeNotes
idString (cuid)
urlString
filenameString
mimeTypeString?
fileSizeInt?
categoryMediaCategory enumUNRELATED or SUPPLIER_DOC
relatedIdString?Polymorphic reference

LegalDocument ​

Legal and policy documents.

FieldTypeNotes
idString (cuid)
categoryLegalCategory enum (unique)One of: TERMS_AND_CONDITIONS, PRIVACY_POLICY, CANCELLATION_POLICY, SUPPLIER_AGREEMENT, COMMUNITY_GUIDELINES, PLATFORM_TERMS_OF_SERVICE, GUEST_TERMS_AND_CONDITIONS
titleString?
contentStringHTML content
slugString? (unique)
publishedBoolean
metaJson?

Enums ​

prisma
enum AdminType { SUPERADMIN, MODERATOR, SUPPORT }
enum SupplierType { INDIVIDUAL, COMPANY }
enum DifficultyLevel { EASY, MODERATE, HARD, EXTREME }
enum ActivityStatus { APPROVED, REJECTED, PENDING_APPROVAL }
enum BookingStatus { PENDING_PAYMENT, CONFIRMED, CANCELLED, FAILED }
enum PaymentStatus { PENDING, SUCCESS, FAILED, REFUNDED }
enum CURRENCY { USD, NPR }
enum PaymentProvider { STRIPE, PAYPAL }
enum MediaCategory { UNRELATED, SUPPLIER_DOC }
enum LegalCategory { TERMS_AND_CONDITIONS, PRIVACY_POLICY, CANCELLATION_POLICY, SUPPLIER_AGREEMENT, COMMUNITY_GUIDELINES, PLATFORM_TERMS_OF_SERVICE, GUEST_TERMS_AND_CONDITIONS }

Removed Models (Editorial Migration) ​

The following models existed in the API schema but were removed during the editorial migration. The tables remain in the database but are no longer managed by Prisma:

  • Blog — replaced by Post in CMS database
  • BlogCategory — replaced by PostCategory in CMS database
  • Author — migrated to CMS database
  • BlogGenerationImport — replaced by GenerationBatch in CMS
  • BlogGenerationImportRow — replaced by simplified generation tracking
  • BlogGenerationJob — replaced by simplified generation tracking
  • BusinessLink — feature removed
  • PostType enum — replaced by category-based type system
  • ImportStatus, GenerationStatus, JobMode, JobStatus enums — no longer needed

Built with VitePress