Skip to content

Commit 37dfccb

Browse files
committed
WonderWave 0.1
0 parents  commit 37dfccb

File tree

113 files changed

+3668
-0
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

113 files changed

+3668
-0
lines changed

backend/.gitIgnore

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
.env
2+
package-lock.json

backend/controllers/authController.js

+61
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
import User from '../models/User.js'
2+
import bcrypt from 'bcryptjs'
3+
import jwt from 'jsonwebtoken'
4+
5+
6+
// User Registration
7+
export const register = async(req, res)=> {
8+
try {
9+
10+
//hashing password
11+
12+
const salt = bcrypt.genSaltSync(10)
13+
const hash = bcrypt.hashSync(req.body.password, salt)
14+
15+
const newUser = new User({
16+
username: req.body.username,
17+
email: req.body.email,
18+
password: hash,
19+
photo: req.body.photo
20+
})
21+
22+
await newUser.save()
23+
res.status(200).json({success:true, message: 'Succefully Created'})
24+
} catch (error) {
25+
res.status(500).json({success:false, message:'Failed to craete, try again'})
26+
}
27+
}
28+
29+
// user Login
30+
export const login = async(req, res)=> {
31+
32+
const email = req.body.email
33+
34+
try {
35+
const user = await User.findOne({email})
36+
37+
//if Doesn't exist
38+
if(!user){
39+
return res.status(404).json({success: false, message: "User not found"})
40+
}
41+
42+
const checkCorrectPassword =await bcrypt.compare(req.body.password, user.password)
43+
44+
if(!checkCorrectPassword){
45+
return res.status(401).json({success: false, message: "Invalid Email or password"})
46+
}
47+
48+
const {password, role, ...rest} = user._doc
49+
50+
const token = jwt.sign({id:user._id, role:user._role}, process.env.JWT_SECRET_KEY, {expiresIn: "7d"})
51+
52+
//Set Token in browser cookies and send to the client
53+
res.cookie('accessToken', token, {
54+
httpOnly:true,
55+
expires: token.expiresIn})
56+
.status(200)
57+
.json({success:true, message:"Succefully Login", data: {...rest}, token, role})
58+
} catch (error) {
59+
res.status(500).json({success: false, message: "Failed to Login"})
60+
}
61+
}
+35
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import Booking from "../models/Booking.js"
2+
3+
//create booking
4+
export const createBooking = async (req, res) => {
5+
const newBooking = new Booking(req.body)
6+
try {
7+
const savedBooking = await newBooking.save()
8+
res.status(200).json({success: true, msg: "Your tour is booked", data:savedBooking})
9+
} catch (error) {
10+
res.status(500).json({success: false, msg: "Internal server error"})
11+
}
12+
}
13+
14+
// get single booking
15+
export const getBooking = async (req, res) => {
16+
const id = req.params.id
17+
try {
18+
const book = await Booking.findById(id)
19+
res.status(200).json({success: true, msg: "Successfull", data:book})
20+
} catch (error) {
21+
res.status(404).json({success: false, msg: "not found"})
22+
}
23+
}
24+
25+
26+
//get all booking
27+
export const getAllBooking = async (req, res) => {
28+
29+
try {
30+
const bookings = await Booking.find()
31+
res.status(200).json({success: true, message: "Successfull", data:bookings})
32+
} catch (error) {
33+
res.status(500).json({success: false, message: "internal server error"})
34+
}
35+
}
+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import Tour from "../models/Tour.js"
2+
import Review from '../models/Review.js'
3+
4+
export const createReview = async (req, res) => {
5+
6+
const tourId = req.params.tourId
7+
const newReview = new Review({...req.body})
8+
try {
9+
const savedReview = await newReview.save()
10+
11+
//after creating a new review now upadate the reviews array
12+
await Tour.findByIdAndUpdate(tourId, {
13+
$push: {reviews: savedReview._id}
14+
})
15+
16+
res.status(200).json({success: true, message: 'Review Submitted', data: savedReview})
17+
18+
} catch (error) {
19+
res.status(500).json({success: true, message: 'Failed to submite'})
20+
}
21+
}

backend/controllers/tourController.js

+101
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
import Tour from './../models/Tour.js'
2+
3+
export const createTour = async (req, res) => {
4+
const newTour = new Tour(req.body)
5+
6+
try {
7+
const savedTour = await newTour.save()
8+
res.status(200).json({success:true, message: 'Succefully Created', data: savedTour})
9+
} catch (error) {
10+
res.status(500).json({success:false, message: 'Failed to Create. try again'})
11+
}
12+
}
13+
14+
//update tour
15+
export const updateTour = async (req, res) => {
16+
const id = req.params.id
17+
try {
18+
const updateTour = await Tour.findByIdAndUpdate(id, {
19+
$set: req.body
20+
}, {new:true})
21+
22+
res.status(200).json({success:true, message: 'Succefully updated', data: updateTour})
23+
24+
} catch (error) {
25+
res.status(500).json({success:false, message: 'Failed to update. try again'})
26+
}
27+
}
28+
export const deleteTour = async (req, res) => {
29+
const id = req.params.id
30+
try {
31+
const deletedTour = await Tour.findByIdAndDelete(id)
32+
33+
res.status(200).json({success:true, message: 'Succefully Deleted'})
34+
35+
} catch (error) {
36+
res.status(500).json({success:false, message: 'Failed to Delete'})
37+
}
38+
}
39+
export const getSingleTour = async (req, res) => {
40+
const id = req.params.id
41+
try {
42+
const tour = await Tour.findById(id).populate('reviews')
43+
44+
res.status(200).json({success:true, message: 'Succefull', data: tour})
45+
46+
} catch (error) {
47+
res.status(404).json({success:false, message: 'Not Found'})
48+
}
49+
}
50+
51+
export const getAllTour = async (req, res) => {
52+
53+
//for paginaion
54+
const page = parseInt(req.query.page)
55+
56+
try {
57+
const tours = await Tour.find({}).populate('reviews').skip(page * 8).limit(8)
58+
59+
res.status(200).json({success:true, count: tours.length, message: 'Succefully', data: tours})
60+
} catch (error) {
61+
res.status(404).json({success:false, message: 'Not Found'})
62+
}
63+
}
64+
65+
// get tour by search
66+
export const getTourBySearch = async(req, res) => {
67+
68+
const city = new RegExp(req.query.city, 'i')
69+
const distance = parseInt(req.query.distance)
70+
const maxGroupSize = parseInt(req.query.maxGroupSize)
71+
72+
try {
73+
//gte (Greater than Equal)
74+
const tours = await Tour.find({city, distance:{$gte:distance}, maxGroupSize:{$gte:maxGroupSize}}).populate('reviews')
75+
res.status(200).json({success:true, count: tours.length, message: 'Succefully', data: tours})
76+
77+
} catch (error) {
78+
res.status(404).json({success:false, message: 'Not Found'})
79+
}
80+
}
81+
82+
export const getFeaturedTour = async (req, res) => {
83+
84+
try {
85+
const tours = await Tour.find({featured: true}).populate('reviews').limit(8)
86+
87+
res.status(200).json({success:true, message: 'Succefully', data: tours})
88+
} catch (error) {
89+
res.status(404).json({success:false, message: 'Not Found'})
90+
}
91+
}
92+
93+
// Geat Tour Counts
94+
export const getTourCount = async(req, res) => {
95+
try {
96+
const tourCount = await Tour.estimatedDocumentCount()
97+
res.status(200).json({success: true, data: tourCount})
98+
} catch (error) {
99+
res.status(500).json({success:false, message: 'failed to fetch'})
100+
}
101+
}

backend/controllers/userController.js

+60
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
import User from './../models/User.js'
2+
3+
export const createUser = async (req, res) => {
4+
const newUser = new User(req.body)
5+
6+
try {
7+
const savedUser = await newUser.save()
8+
res.status(200).json({success:true, message: 'Succefully Created', data: savedUser})
9+
} catch (error) {
10+
res.status(500).json({success:false, message: 'Failed to Create. try again'})
11+
}
12+
}
13+
14+
//update User
15+
export const updateUser = async (req, res) => {
16+
const id = req.params.id
17+
try {
18+
const updateUser = await User.findByIdAndUpdate(id, {
19+
$set: req.body
20+
}, {new:true})
21+
22+
res.status(200).json({success:true, message: 'Succefully updated', data: updateUser})
23+
24+
} catch (error) {
25+
res.status(500).json({success:false, message: 'Failed to update. try again'})
26+
}
27+
}
28+
export const deleteUser = async (req, res) => {
29+
const id = req.params.id
30+
try {
31+
const deletedUser = await User.findByIdAndDelete(id)
32+
33+
res.status(200).json({success:true, message: 'Succefully Deleted'})
34+
35+
} catch (error) {
36+
res.status(500).json({success:false, message: 'Failed to Delete'})
37+
}
38+
}
39+
export const getSingleUser = async (req, res) => {
40+
const id = req.params.id
41+
try {
42+
const user = await User.findById(id)
43+
44+
res.status(200).json({success:true, message: 'Succefull', data: user})
45+
46+
} catch (error) {
47+
res.status(404).json({success:false, message: 'Not Found'})
48+
}
49+
}
50+
51+
export const getAllUser = async (req, res) => {
52+
53+
try {
54+
const users = await User.find({})
55+
56+
res.status(200).json({success:true, message: 'Succefully', data: users})
57+
} catch (error) {
58+
res.status(404).json({success:false, message: 'Not Found'})
59+
}
60+
}

backend/index.js

+46
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import express from 'express'
2+
import dotenv from 'dotenv'
3+
import mongoose from 'mongoose'
4+
import cors from 'cors'
5+
import cookieParser from 'cookie-parser'
6+
7+
import tourRoute from './routes/tours.js'
8+
import userRoute from './routes/users.js'
9+
import authRoute from './routes/auth.js'
10+
import reviewRoute from './routes/reviews.js'
11+
import bookingRoute from './routes/bookings.js'
12+
13+
dotenv.config()
14+
15+
const app = express()
16+
const port = process.env.PORT || 8000;
17+
18+
// database connect
19+
mongoose.set("strictQuery" , false)
20+
const connect = async () => {
21+
try {
22+
await mongoose.connect(process.env.MONGO_URI, {
23+
useNewUrlParser: true,
24+
useUnifiedTopology: true
25+
})
26+
console.log("Mongodb connected");
27+
} catch (error) {
28+
console.log("Eror connecting in DB")
29+
}
30+
}
31+
32+
33+
//middleware
34+
app.use(express.json());
35+
app.use(cors({ origin: 'http://localhost:3000', credentials: true }));
36+
app.use(cookieParser());
37+
app.use('/api/v1/auth', authRoute);
38+
app.use('/api/v1/tours', tourRoute);
39+
app.use('/api/v1/users', userRoute);
40+
app.use('/api/v1/review', reviewRoute);
41+
app.use('/api/v1/booking', bookingRoute);
42+
43+
app.listen(port, ()=> {
44+
connect()
45+
console.log('Server started', port)
46+
})

backend/models/Booking.js

+36
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import mongoose from "mongoose";
2+
3+
const bookingSchema = new mongoose.Schema(
4+
{
5+
userId: {
6+
type: String
7+
},
8+
userEmail: {
9+
type: String,
10+
required: true,
11+
},
12+
tourName: {
13+
type: String,
14+
required: true
15+
},
16+
fullName: {
17+
type: String,
18+
required: true,
19+
},
20+
guestSize:{
21+
type:Number,
22+
required:true
23+
},
24+
phone:{
25+
type:Number,
26+
required:true
27+
},
28+
bookAt:{
29+
type:Date,
30+
required:true
31+
}
32+
},
33+
{ timestamps: true }
34+
);
35+
36+
export default mongoose.model("Booking", bookingSchema);

0 commit comments

Comments
 (0)