-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbootcamps.js
131 lines (90 loc) · 3.59 KB
/
bootcamps.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
const ErrorResponse = require('../utils/errorResponse');
const asyncHandler = require('../middleware/async')
const geocoder = require('../utils/geocoder')
const Bootcamp = require('../models/bootcamp')
exports.getBootcamps = asyncHandler(async (req, res, next) =>{
let query;
// Copy req.query
const reqQuery = { ...req.query }
// Fields to exclude
const removeFields = ['select', 'sort', 'page', 'limit']
// Loop over removeFields and delete them from reqQuery
removeFields.forEach(param => delete reqQuery[param])
// Create Query String
let queryStr = JSON.stringify(reqQuery)
// Create operators($gt, $gte, etc)
queryStr = queryStr.replace(/\b(gt|gte|lt|lte|in)\b/g, match => `$${match}`);
// Finding resource
query = Bootcamp.find(JSON.parse(queryStr))
// Select fields
if(req.query.select){
const fields = req.query.select.split(',').join(' ');
console.log(fields)
}
// Select Sorting
if (req.query.sort) {
const sortBy = req.query.sort.splt(',').join('')
query = query.sort(sortBy)
} else {
query = query.sort('-createdAt')
}
// Pagination
const page = parseInt(req.query.page, 10)|| 1;
const limit = parseInt(req.query.limit, 10)|| 100;
const skip = (page -1) * limit;
// Executing query
const bootcamps = await query;
res.status(200).json({ success: true, count: bootcamps.length, data: bootcamps})
})
exports.getBootcamp = asyncHandler(async (req, res, next) =>{
const bootcamp = await Bootcamp.findById(req.params.id)
if(!bootcamp) {
return next(new ErrorResponse(`Bootcamp not found with id of${req.params.id}`, 404));
}
res.status(200).json({ success: true, data: bootcamp })
});
exports.createBootcamp = asyncHandler(async (req, res, next) =>{
const bootcamp = await Bootcamp.create(req.body)
res.status(201).json({
success: true,
data: bootcamp
});
});
exports.updateBootcamp = asyncHandler(async(req, res, next) =>{
const bootcamp = await Bootcamp.findByIdAndUpdate(req.params.id, req.body, {
new: true,
runValidators: true
});
if(!bootcamp) {
return next(new ErrorResponse(`Bootcamp not found with id of${req.params.id}`, 404));
}
res.status(200).json({success: true, data:bootcamp})
})
exports.deleteBootcamp = asyncHandler(async(req, res, next) =>{
const bootcamp = await Bootcamp.findByIdAndDelete(req.params.id);
if(!bootcamp) {
return next(
new ErrorResponse(`Bootcamp not found with id of ${req.params.id}`, 404)
)
}
res.status(200).json({ success: true, data: {}})
})
exports.getBootcampsInRadius = asyncHandler(async(req, res, next) => {
const {zipcode, distance} = req.params;
// Get lat/lng from geocoder
const loc = await geocoder.geocode(zipcode)
const lat = loc[0].latitude;
const lng = loc[0].longitude
// Calc radius using radians
// Divide Dist by radius of earth
// Earth = 3,963 mi / 6,378km
const radius = distance / 3963
const bootcamps = await Bootcamp.find({
location: { $geoWithin: {$centerSphere: [[ lng, lat], radius] } }
})
res.status(200).json({
success: true,
count: bootcamps.length,
data: bootcamps
})
})