{"openapi":"3.0.0","info":{"title":"TNisu Backend API Documentation","version":"1.0.0","description":"API documentation for TNisu Backend application covering all routes and services.","contact":{"name":"API Support"}},"servers":[{"url":"http://192.168.29.225:9000","description":"Network Server"},{"url":"http://localhost:9000","description":"Local Server"}],"components":{"securitySchemes":{"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Enter your JWT token in the format: Bearer <token>"}}},"security":[{"BearerAuth":[]}],"tags":[{"name":"Admin & Auth","description":"Admin authentication & verification endpoints"},{"name":"Users","description":"User management and profile endpoints"},{"name":"Tours","description":"Tour management endpoints"},{"name":"Cloudinary Storage","description":"Cloudinary image upload and deletion endpoints"},{"name":"S3 Storage","description":"S3 file upload presigned URL generation"},{"name":"Members","description":"Member management endpoints"},{"name":"Posts","description":"Community post management endpoints"},{"name":"Images","description":"Image upload & media management endpoints"},{"name":"Leads","description":"Track & trek lead management"},{"name":"Expenses","description":"Expense tracking endpoints"},{"name":"Notifications","description":"Notification management endpoints"},{"name":"Check Points","description":"Trek checkpoint endpoints"},{"name":"Checked Points","description":"User checkpoint check-in endpoints"},{"name":"Included Items","description":"Tour included items endpoints"},{"name":"Not Included Items","description":"Tour excluded items endpoints"},{"name":"Bookings","description":"Tour booking endpoints"},{"name":"Baggage","description":"Check-in baggage guidance endpoints"},{"name":"Backpack","description":"Backpack item list endpoints"},{"name":"Notes","description":"Important tour notes endpoints"},{"name":"Interested","description":"User interest in tours endpoints"},{"name":"Accommodation","description":"Accommodation management endpoints"},{"name":"Allocated Accommodation","description":"Room allocation endpoints"},{"name":"Transport","description":"Transport details management"},{"name":"Boarding Points","description":"Transport boarding points"},{"name":"Allocated Transport","description":"Bus/seat transport allocation"},{"name":"FAQs","description":"Frequently Asked Questions endpoints"}],"paths":{"/api/admin/login":{"post":{"tags":["Admin & Auth"],"summary":"Admin login","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","example":"admin@tnisu.com"},"password":{"type":"string","example":"admin123"}}}}}},"responses":{"200":{"description":"Login successful"},"400":{"description":"Invalid credentials"}}}},"/api/admin/verify":{"post":{"tags":["Admin & Auth"],"summary":"Verify admin session / token","responses":{"200":{"description":"Token verified successfully"}}}},"/api/users/signup":{"post":{"tags":["Users"],"summary":"Create new user (SuperAdmin only)","security":[{"BearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"username":{"type":"string"},"email":{"type":"string"},"password":{"type":"string"},"role":{"type":"string","enum":["admin","superAdmin","user"]}}}}}},"responses":{"201":{"description":"User created"}}}},"/api/users/signin":{"post":{"tags":["Users"],"summary":"User signin","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string"},"password":{"type":"string"}}}}}},"responses":{"200":{"description":"Signed in successfully"}}}},"/api/users/logout":{"post":{"tags":["Users"],"summary":"Logout user","responses":{"200":{"description":"Logged out successfully"}}}},"/api/users/get-all":{"get":{"tags":["Users"],"summary":"Get all users (SuperAdmin only)","security":[{"BearerAuth":[]}],"responses":{"200":{"description":"List of users"}}}},"/api/users/delete":{"delete":{"tags":["Users"],"summary":"Delete user (SuperAdmin only)","security":[{"BearerAuth":[]}],"parameters":[{"name":"id","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"User deleted"}}}},"/api/users/createProfile":{"post":{"tags":["Users"],"summary":"Create user profile","responses":{"200":{"description":"Profile created"}}}},"/api/users/updateProfile":{"post":{"tags":["Users"],"summary":"Update user profile","responses":{"200":{"description":"Profile updated"}}}},"/api/users/getProfile":{"get":{"tags":["Users"],"summary":"Get user profile","responses":{"200":{"description":"User profile details"}}}},"/api/tour/create-tour":{"post":{"tags":["Tours"],"summary":"Create new tour (Admin only)","security":[{"BearerAuth":[]}],"responses":{"201":{"description":"Tour created successfully"}}}},"/api/tour/get-alltours":{"get":{"tags":["Tours"],"summary":"Get all tours","responses":{"200":{"description":"List of all tours"}}}},"/api/tour/get-tour":{"get":{"tags":["Tours"],"summary":"Get tour details by ID","parameters":[{"name":"id","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Tour details"}}}},"/api/tour/update-tour":{"post":{"tags":["Tours"],"summary":"Update existing tour","responses":{"200":{"description":"Tour updated"}}}},"/api/tour/delete-tour":{"delete":{"tags":["Tours"],"summary":"Delete tour (Admin only)","security":[{"BearerAuth":[]}],"parameters":[{"name":"id","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Tour deleted"}}}},"/api/clone-tour":{"get":{"tags":["Tours"],"summary":"Clone existing tour (Admin only)","security":[{"BearerAuth":[]}],"parameters":[{"name":"tourId","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Tour cloned"}}}},"/api/cloudinary/upload":{"post":{"tags":["Cloudinary Storage"],"summary":"Upload image to Cloudinary (file or base64/URL)","requestBody":{"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"image":{"type":"string","format":"binary","description":"Image file"},"folder":{"type":"string","example":"trekies"}}}},"application/json":{"schema":{"type":"object","properties":{"image":{"type":"string","description":"Base64 data URI or image URL"},"folder":{"type":"string","example":"trekies"}}}}}},"responses":{"200":{"description":"Image uploaded successfully to Cloudinary"},"400":{"description":"Invalid input / file missing"},"500":{"description":"Cloudinary upload error"}}}},"/api/cloudinary/delete":{"delete":{"tags":["Cloudinary Storage"],"summary":"Delete image from Cloudinary by public_id","parameters":[{"name":"public_id","in":"query","schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"public_id":{"type":"string","example":"trekies/sample_image_id"}}}}}},"responses":{"200":{"description":"Image deleted successfully from Cloudinary"},"400":{"description":"Public ID missing"},"500":{"description":"Cloudinary delete error"}}}},"/api/putObject":{"post":{"tags":["S3 Storage"],"summary":"Generate S3 presigned upload URL","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"filename":{"type":"string"},"contentType":{"type":"string"}}}}}},"responses":{"200":{"description":"Presigned URL generated"}}}},"/api/member/add-member":{"post":{"tags":["Members"],"summary":"Add member to tour","responses":{"200":{"description":"Member added"}}}},"/api/member/get-member":{"get":{"tags":["Members"],"summary":"Get members list","responses":{"200":{"description":"Members list"}}}},"/api/member/delete-member":{"delete":{"tags":["Members"],"summary":"Delete member","responses":{"200":{"description":"Member deleted"}}}},"/api/Post/create-post":{"post":{"tags":["Posts"],"summary":"Create post","responses":{"201":{"description":"Post created"}}}},"/api/Post/get-posts":{"get":{"tags":["Posts"],"summary":"Get all posts","responses":{"200":{"description":"List of posts"}}}},"/api/Post/get-post":{"get":{"tags":["Posts"],"summary":"Get post by ID","parameters":[{"name":"id","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Post details"}}}},"/api/Post/delete-post":{"delete":{"tags":["Posts"],"summary":"Delete post","parameters":[{"name":"id","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Post deleted"}}}},"/api/image/create-image":{"post":{"tags":["Images"],"summary":"Upload / Save image record","responses":{"201":{"description":"Image saved"}}}},"/api/image/get-image":{"get":{"tags":["Images"],"summary":"Get image list","responses":{"200":{"description":"Images list"}}}},"/api/image/delete-image":{"delete":{"tags":["Images"],"summary":"Delete image","responses":{"200":{"description":"Image deleted"}}}},"/api/lead/create-lead":{"post":{"tags":["Leads"],"summary":"Create trek lead","responses":{"201":{"description":"Lead created"}}}},"/api/lead/get-tour":{"get":{"tags":["Leads"],"summary":"Get all tours for leads","responses":{"200":{"description":"Tours list"}}}},"/api/lead/get-leads":{"get":{"tags":["Leads"],"summary":"Get trek leads list","responses":{"200":{"description":"Leads list"}}}},"/api/expanse/add-expanse":{"post":{"tags":["Expenses"],"summary":"Add new expense","responses":{"201":{"description":"Expense added"}}}},"/api/expanse/get-expanses":{"get":{"tags":["Expenses"],"summary":"Get expenses list","responses":{"200":{"description":"Expenses list"}}}},"/api/expanse/update-expanse":{"post":{"tags":["Expenses"],"summary":"Update expense","responses":{"200":{"description":"Expense updated"}}}},"/api/expanse/delete-expanse":{"delete":{"tags":["Expenses"],"summary":"Delete expense","responses":{"200":{"description":"Expense deleted"}}}},"/api/notification/create":{"post":{"tags":["Notifications"],"summary":"Create notification","responses":{"201":{"description":"Notification created"}}}},"/api/notification/update":{"post":{"tags":["Notifications"],"summary":"Update notification","responses":{"200":{"description":"Notification updated"}}}},"/api/notification/get":{"get":{"tags":["Notifications"],"summary":"Get notifications","responses":{"200":{"description":"Notifications list"}}}},"/api/create-point":{"post":{"tags":["Check Points"],"summary":"Create check point","responses":{"201":{"description":"Check point created"}}}},"/api/update-point":{"post":{"tags":["Check Points"],"summary":"Update check point","responses":{"200":{"description":"Check point updated"}}}},"/api/delete-point":{"delete":{"tags":["Check Points"],"summary":"Delete check point","responses":{"200":{"description":"Check point deleted"}}}},"/api/get-points":{"get":{"tags":["Check Points"],"summary":"Get all check points","responses":{"200":{"description":"Check points list"}}}},"/api/get-points-ByTourId":{"get":{"tags":["Check Points"],"summary":"Get check points by tour ID with checked users","parameters":[{"name":"tourId","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Check points with checked users"}}}},"/api/get-latestUnchecked":{"get":{"tags":["Check Points"],"summary":"Get latest unchecked point","responses":{"200":{"description":"Latest unchecked point details"}}}},"/api/checked/add":{"post":{"tags":["Checked Points"],"summary":"Add user checked point","responses":{"201":{"description":"Checked point recorded"}}}},"/api/checked/get":{"get":{"tags":["Checked Points"],"summary":"Get checked points","responses":{"200":{"description":"Checked points list"}}}},"/api/checked/getUserById":{"get":{"tags":["Checked Points"],"summary":"Get checked user by check point ID","parameters":[{"name":"checkPointId","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Checked users list"}}}},"/api/checked/delete":{"delete":{"tags":["Checked Points"],"summary":"Delete checked point","responses":{"200":{"description":"Checked point deleted"}}}},"/api/checked/reset":{"delete":{"tags":["Checked Points"],"summary":"Reset checked points","responses":{"200":{"description":"Checked points reset"}}}},"/api/included/add":{"post":{"tags":["Included Items"],"summary":"Add included item (Admin only)","security":[{"BearerAuth":[]}],"responses":{"201":{"description":"Item added"}}}},"/api/included/update":{"post":{"tags":["Included Items"],"summary":"Update included item","responses":{"200":{"description":"Item updated"}}}},"/api/included/delete":{"delete":{"tags":["Included Items"],"summary":"Delete included item (Admin only)","security":[{"BearerAuth":[]}],"responses":{"200":{"description":"Item deleted"}}}},"/api/included/get":{"get":{"tags":["Included Items"],"summary":"Get included items","responses":{"200":{"description":"Included items list"}}}},"/api/notIncluded/add":{"post":{"tags":["Not Included Items"],"summary":"Add excluded item (Admin only)","security":[{"BearerAuth":[]}],"responses":{"201":{"description":"Item added"}}}},"/api/notIncluded/update":{"post":{"tags":["Not Included Items"],"summary":"Update excluded item","responses":{"200":{"description":"Item updated"}}}},"/api/notIncluded/delete":{"delete":{"tags":["Not Included Items"],"summary":"Delete excluded item (Admin only)","security":[{"BearerAuth":[]}],"responses":{"200":{"description":"Item deleted"}}}},"/api/notIncluded/get":{"get":{"tags":["Not Included Items"],"summary":"Get excluded items","responses":{"200":{"description":"Excluded items list"}}}},"/api/booking/add":{"post":{"tags":["Bookings"],"summary":"Create booking","responses":{"201":{"description":"Booking created"}}}},"/api/booking/get":{"get":{"tags":["Bookings"],"summary":"Get all bookings","responses":{"200":{"description":"Bookings list"}}}},"/api/booking/getbyid":{"get":{"tags":["Bookings"],"summary":"Get booking details by ID","parameters":[{"name":"id","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Booking details"}}}},"/api/booking/update":{"post":{"tags":["Bookings"],"summary":"Update booking","responses":{"200":{"description":"Booking updated"}}}},"/api/booking/delete":{"delete":{"tags":["Bookings"],"summary":"Delete booking","parameters":[{"name":"id","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Booking deleted"}}}},"/api/booking/get-my-tour":{"get":{"tags":["Bookings"],"summary":"Get user's booked tours","responses":{"200":{"description":"User tours list"}}}},"/api/baggage/add":{"post":{"tags":["Baggage"],"summary":"Add baggage item (Admin only)","security":[{"BearerAuth":[]}],"responses":{"201":{"description":"Baggage item added"}}}},"/api/baggage/delete":{"delete":{"tags":["Baggage"],"summary":"Delete baggage item (Admin only)","security":[{"BearerAuth":[]}],"responses":{"200":{"description":"Baggage item deleted"}}}},"/api/baggage/get":{"get":{"tags":["Baggage"],"summary":"Get baggage items","responses":{"200":{"description":"Baggage items list"}}}},"/api/backpack/add":{"post":{"tags":["Backpack"],"summary":"Add backpack item (Admin only)","security":[{"BearerAuth":[]}],"responses":{"201":{"description":"Backpack item added"}}}},"/api/backpack/delete":{"delete":{"tags":["Backpack"],"summary":"Delete backpack item (Admin only)","security":[{"BearerAuth":[]}],"responses":{"200":{"description":"Backpack item deleted"}}}},"/api/backpack/get":{"get":{"tags":["Backpack"],"summary":"Get backpack items list","responses":{"200":{"description":"Backpack items list"}}}},"/api/notes/create":{"post":{"tags":["Notes"],"summary":"Create note","responses":{"201":{"description":"Note created"}}}},"/api/notes/update":{"post":{"tags":["Notes"],"summary":"Update note","responses":{"200":{"description":"Note updated"}}}},"/api/notes/get":{"get":{"tags":["Notes"],"summary":"Get notes","responses":{"200":{"description":"Notes list"}}}},"/api/notes/delete":{"delete":{"tags":["Notes"],"summary":"Delete note","responses":{"200":{"description":"Note deleted"}}}},"/api/interested/create":{"post":{"tags":["Interested"],"summary":"Register interest in tour","responses":{"201":{"description":"Interest registered"}}}},"/api/interested/update":{"post":{"tags":["Interested"],"summary":"Update interest","responses":{"200":{"description":"Interest updated"}}}},"/api/interested/delete":{"delete":{"tags":["Interested"],"summary":"Remove interest","responses":{"200":{"description":"Interest removed"}}}},"/api/interested/get":{"get":{"tags":["Interested"],"summary":"Get interested users by tour ID","parameters":[{"name":"tourId","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Interested users list"}}}},"/api/accommodation/create":{"post":{"tags":["Accommodation"],"summary":"Create accommodation","responses":{"201":{"description":"Accommodation created"}}}},"/api/accommodation/get":{"get":{"tags":["Accommodation"],"summary":"Get accommodation by ID","parameters":[{"name":"id","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Accommodation details"}}}},"/api/accommodation/getByTour":{"get":{"tags":["Accommodation"],"summary":"Get all accommodations","responses":{"200":{"description":"All accommodations list"}}}},"/api/accommodation/update":{"post":{"tags":["Accommodation"],"summary":"Update accommodation","responses":{"200":{"description":"Accommodation updated"}}}},"/api/accommodation/delete":{"delete":{"tags":["Accommodation"],"summary":"Delete accommodation","responses":{"200":{"description":"Accommodation deleted"}}}},"/api/accommodation/getByTourId":{"get":{"tags":["Accommodation"],"summary":"Get accommodation by tour ID","parameters":[{"name":"tourId","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Accommodation by tour ID"}}}},"/api/allocated/create":{"post":{"tags":["Allocated Accommodation"],"summary":"Create room allocation","responses":{"201":{"description":"Allocation created"}}}},"/api/allocated/get":{"get":{"tags":["Allocated Accommodation"],"summary":"Get room allocations by tour ID","parameters":[{"name":"tourId","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Allocations list"}}}},"/api/allocated/delete":{"delete":{"tags":["Allocated Accommodation"],"summary":"Delete room allocation","responses":{"200":{"description":"Allocation deleted"}}}},"/api/allocated/getByAcco":{"get":{"tags":["Allocated Accommodation"],"summary":"Get allocations by accommodation ID","parameters":[{"name":"accommodationId","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Allocations list"}}}},"/api/allocated/getByRoom":{"get":{"tags":["Allocated Accommodation"],"summary":"Get allocations by room ID","parameters":[{"name":"roomId","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Allocations list"}}}},"/api/transport/create":{"post":{"tags":["Transport"],"summary":"Create transport details","responses":{"201":{"description":"Transport created"}}}},"/api/transport/get":{"get":{"tags":["Transport"],"summary":"Get transport by ID","parameters":[{"name":"id","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Transport details"}}}},"/api/transport/update":{"post":{"tags":["Transport"],"summary":"Update transport","responses":{"200":{"description":"Transport updated"}}}},"/api/transport/delete":{"delete":{"tags":["Transport"],"summary":"Delete transport","responses":{"200":{"description":"Transport deleted"}}}},"/api/transport/getByTourId":{"get":{"tags":["Transport"],"summary":"Get transport by tour ID","parameters":[{"name":"tourId","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Transport list by tour ID"}}}},"/api/board/create":{"post":{"tags":["Boarding Points"],"summary":"Create boarding point","responses":{"201":{"description":"Boarding point created"}}}},"/api/board/get":{"get":{"tags":["Boarding Points"],"summary":"Get boarding points by transport ID","parameters":[{"name":"transportId","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Boarding points list"}}}},"/api/board/update":{"post":{"tags":["Boarding Points"],"summary":"Update boarding point","responses":{"200":{"description":"Boarding point updated"}}}},"/api/board/delete":{"delete":{"tags":["Boarding Points"],"summary":"Delete boarding point","responses":{"200":{"description":"Boarding point deleted"}}}},"/api/board/getById":{"get":{"tags":["Boarding Points"],"summary":"Get boarding point by ID","parameters":[{"name":"id","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Boarding point details"}}}},"/api/allocatedTransport/create":{"post":{"tags":["Allocated Transport"],"summary":"Create allocated transport (seat/bus)","responses":{"201":{"description":"Transport allocation created"}}}},"/api/allocatedTransport/get":{"get":{"tags":["Allocated Transport"],"summary":"Get allocated transport","responses":{"200":{"description":"Allocated transport list"}}}},"/api/allocatedTransport/delete":{"delete":{"tags":["Allocated Transport"],"summary":"Delete allocated transport","responses":{"200":{"description":"Transport allocation deleted"}}}},"/api/allocatedTransport/getByBus":{"get":{"tags":["Allocated Transport"],"summary":"Get allocated transport by bus number","parameters":[{"name":"busNumber","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Allocations for bus"}}}},"/api/faq/get":{"get":{"tags":["FAQs"],"summary":"Get all FAQs","responses":{"200":{"description":"List of FAQs"}}}},"/api/faq/create":{"post":{"tags":["FAQs"],"summary":"Create FAQ","responses":{"201":{"description":"FAQ created"}}}},"/api/faq/update":{"put":{"tags":["FAQs"],"summary":"Update FAQ","responses":{"200":{"description":"FAQ updated"}}}},"/api/faq/delete":{"delete":{"tags":["FAQs"],"summary":"Delete FAQ","responses":{"200":{"description":"FAQ deleted"}}}}}}