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