Skip to content

Commit 82ebdbf

Browse files
authored
Merge pull request #4 from mongoosejs/IslandRhythms/findByVehicle
added find reviews by vehicle route
2 parents 9115aa6 + 6e00a57 commit 82ebdbf

File tree

4 files changed

+62
-1
lines changed

4 files changed

+62
-1
lines changed
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import express, { Request, Response } from 'express';
2+
import Review from '../../models/review';
3+
4+
async function findByVehicle (request: Request, response: Response) {
5+
const limit = request.body.limit != null ? request.body.limit : 5;
6+
const skip = request.body.skip != null ? request.body.skip : 5;
7+
const reviews = await Review.find({ vehicleId: request.body.vehicleId }).sort({ createdAt: -1 }).skip(skip).limit(limit);
8+
return response.status(200).json({ reviews: reviews });
9+
};
10+
11+
export default findByVehicle;

typescript-express-reviews/src/api/Vehicle/findById.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import Vehicle from '../../models/vehicle';
33
import Review from '../../models/review';
44

55
async function last5(request: Request, response: Response) {
6-
const limit = request.body.limit ? request.body.limit : 5;
6+
const limit = request.body.limit != null ? request.body.limit : 5;
77
const vehicle = await Vehicle.findById({ _id: request.body.vehicleId });
88
const reviews = await Review.find({ vehicleId: request.body.vehicleId }).sort({ createdAt: -1 }).limit(limit);
99

typescript-express-reviews/src/api/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import register from './User/register';
33
import login from './User/login';
44
import create from './Review/create';
55
import last5 from './Vehicle/findById';
6+
import findByVehicle from './Review/findByVehicle';
67
import bodyParser from 'body-parser';
78
import connect from '../models/connect';
89

@@ -22,6 +23,7 @@ void async function main() {
2223
app.use('/login', login);
2324
app.use('/review/create', create);
2425
app.use('/vehicle/recent/reviews', last5);
26+
app.use('/vehicle/reviews', findByVehicle);
2527

2628
await app.listen(port);
2729
console.log('Listening on port ' + port);

typescript-express-reviews/tests/Vehicle.test.ts

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import Review from '../src/models/review';
44
import User from '../src/models/user';
55
import { describe, it } from 'mocha';
66
import last5 from '../src/api/Vehicle/findById';
7+
import findByVehicle from '../src/api/Review/findByVehicle';
78
import assert from 'assert';
89
import sinon from 'sinon';
910

@@ -60,4 +61,51 @@ describe('Vehicle', function() {
6061
assert.equal(res.json.getCall(0).args[0].reviews.length, 5);
6162
assert(res.json.getCall(0).args[0].reviews[0].text.endsWith('6'));
6263
});
64+
65+
it('Should find all the reviews for the given vehicleId, adhering to the skip and limit parameters', async function() {
66+
const mockRequest = (body) => ({
67+
body
68+
})
69+
const mockResponse = (): ResponseStub => {
70+
const res: ResponseStub = {
71+
status: sinon.stub().returnsThis(),
72+
json: sinon.stub().returnsThis()
73+
};
74+
return res;
75+
};
76+
const user = await User.create({
77+
email: 'test@localhost.com',
78+
firstName: 'Test',
79+
lastName: 'Testerson'
80+
});
81+
const vehicle = await Vehicle.create(
82+
{
83+
make: 'Tesla',
84+
model: 'Model S',
85+
year: 2022,
86+
images: [
87+
'https://tesla-cdn.thron.com/delivery/public/image/tesla/6139697c-9d6a-4579-837e-a9fc5df4a773/bvlatuR/std/1200x628/Model-3-Homepage-Social-LHD',
88+
'https://www.tesla.com/sites/default/files/images/blogs/models_blog_post.jpg'
89+
],
90+
numReviews: 0,
91+
averageReview: 0
92+
},
93+
);
94+
for (let i = 0; i < 7; i++) {
95+
await Review.create({
96+
rating: i > 5 ? 5 : i,
97+
text: 'This is a review that must have length greater than 30. ' + i,
98+
vehicleId: vehicle._id,
99+
userId: user._id
100+
});
101+
}
102+
vehicle.numReviews = 6;
103+
vehicle.averageReview = 3;
104+
await vehicle.save();
105+
const req = mockRequest({ vehicleId: vehicle._id, limit: 0, skip: 0 });
106+
const res = mockResponse();
107+
await findByVehicle(req, res);
108+
assert.equal(res.json.getCall(0).args[0].reviews.length, 7);
109+
assert(res.json.getCall(0).args[0].reviews[0].text.endsWith('6'));
110+
});
63111
});

0 commit comments

Comments
 (0)