Would you like to inspect the original subtitles? These are the user uploaded subtitles that are being translated:
1
00:00:01,010 --> 00:00:03,969
All right, and now just to finish this part,
2
00:00:03,969 --> 00:00:07,183
let's create some factories for getting documents.
3
00:00:08,740 --> 00:00:11,963
And let's start with getOne here, okay?
4
00:00:12,910 --> 00:00:17,910
Exports.getOne, but this one is actually a bit trickier,
5
00:00:18,580 --> 00:00:20,690
and that's because we have a populate
6
00:00:20,690 --> 00:00:22,710
in the getTour handler.
7
00:00:22,710 --> 00:00:24,803
So, let's take a look at that.
8
00:00:25,900 --> 00:00:30,090
So, right here, in this one, we have this populate here,
9
00:00:30,090 --> 00:00:32,570
which is different from all the other get handlers
10
00:00:32,570 --> 00:00:35,220
in the other resources, right?
11
00:00:35,220 --> 00:00:37,620
But, well, this is not really a problem
12
00:00:37,620 --> 00:00:40,670
because we will simply allow ourselves to pass in
13
00:00:40,670 --> 00:00:45,670
a populate options object into our getOne function, okay?
14
00:00:48,030 --> 00:00:50,840
So, instead of simply passing in the model,
15
00:00:50,840 --> 00:00:55,700
we will also have populate, so options, all right.
16
00:00:57,890 --> 00:01:00,370
And so, from here we will then return
17
00:01:00,370 --> 00:01:02,053
the normal handler function.
18
00:01:03,360 --> 00:01:06,563
So, let's go ahead and again copy all of this,
19
00:01:10,850 --> 00:01:11,683
all right.
20
00:01:13,730 --> 00:01:15,330
So, we don't need this one here.
21
00:01:17,690 --> 00:01:19,743
Then here, as always, it is model,
22
00:01:23,140 --> 00:01:25,800
and here it is doc.
23
00:01:25,800 --> 00:01:27,993
Well, actually here, document,
24
00:01:30,520 --> 00:01:33,850
and here, once again, data equal to doc.
25
00:01:33,850 --> 00:01:36,210
Now, we also need to make some changes here now
26
00:01:36,210 --> 00:01:38,390
because of this populate,
27
00:01:38,390 --> 00:01:41,610
so basically, we will first create the query,
28
00:01:41,610 --> 00:01:44,950
and then, if there is the populate options object,
29
00:01:44,950 --> 00:01:46,550
we will then add that to the query,
30
00:01:46,550 --> 00:01:50,810
and then by the end, await that query, okay?
31
00:01:50,810 --> 00:01:51,643
Make sense?
32
00:01:53,390 --> 00:01:55,890
So, let's translate what I just said.
33
00:01:55,890 --> 00:02:00,773
So, the query is simply equal to Model.findById,
34
00:02:02,770 --> 00:02:04,993
like this, right?
35
00:02:06,630 --> 00:02:10,979
Then, if there is a populate options object,
36
00:02:10,979 --> 00:02:12,193
well, then in that case,
37
00:02:13,420 --> 00:02:15,020
query is gonna be
38
00:02:15,020 --> 00:02:20,020
query.populate with the populate options, okay?
39
00:02:24,410 --> 00:02:27,370
And then, finally we await our query,
40
00:02:27,370 --> 00:02:28,853
and save it in the document.
41
00:02:30,010 --> 00:02:35,010
So, await query just like this, all right.
42
00:02:36,210 --> 00:02:38,660
And so, that's actually it.
43
00:02:38,660 --> 00:02:40,360
So, this logic that we have here
44
00:02:40,360 --> 00:02:43,200
with not awaiting the query right away,
45
00:02:43,200 --> 00:02:45,300
but instead just saving it into a variable,
46
00:02:45,300 --> 00:02:48,220
so that we can then, in the next step, manipulate it.
47
00:02:48,220 --> 00:02:50,770
We actually already did this kind of stuff before
48
00:02:50,770 --> 00:02:54,020
when we were building our API features, right?
49
00:02:54,020 --> 00:02:57,210
So, only in the end, when the entire query is ready,
50
00:02:57,210 --> 00:03:00,563
we will then await it and store it somewhere in a variable.
51
00:03:02,260 --> 00:03:06,600
Now, let's go ahead and actually use this one everywhere,
52
00:03:06,600 --> 00:03:08,803
starting of course with the Tour.
53
00:03:10,470 --> 00:03:12,170
So, getTour will now be
54
00:03:13,670 --> 00:03:15,473
factory.getOne,
55
00:03:18,260 --> 00:03:20,900
and pass in the Tour
56
00:03:20,900 --> 00:03:24,440
and populate options object, remember that?
57
00:03:24,440 --> 00:03:29,440
And so, what we're gonna do is to say path and reviews.
58
00:03:31,590 --> 00:03:35,540
Right, so remember that the path property is basically
59
00:03:35,540 --> 00:03:37,720
the field that we want to populate,
60
00:03:37,720 --> 00:03:40,950
and then we can also specify select,
61
00:03:40,950 --> 00:03:43,750
so remember this one, where we specify
62
00:03:43,750 --> 00:03:47,770
which of the fields we actually want to get, right?
63
00:03:47,770 --> 00:03:48,603
But in this case,
64
00:03:48,603 --> 00:03:50,050
we don't have any of that,
65
00:03:50,050 --> 00:03:51,900
and so let's just leave it like this.
66
00:03:53,180 --> 00:03:57,723
And now, we can actually go ahead and delete all of this.
67
00:03:58,910 --> 00:04:00,570
So, great.
68
00:04:00,570 --> 00:04:03,473
And, just to make sure, let's actually quickly test this.
69
00:04:06,200 --> 00:04:07,963
So, we'll gt a certain Tour,
70
00:04:10,880 --> 00:04:12,630
and, indeed, it still works.
71
00:04:12,630 --> 00:04:15,503
Let's see if this one had some reviews.
72
00:04:16,630 --> 00:04:19,209
Oh, yeah, actually it does, and you see
73
00:04:19,209 --> 00:04:22,993
that the population process is also still working.
74
00:04:24,920 --> 00:04:28,177
So, that was successful, I would say.
75
00:04:28,177 --> 00:04:30,870
And so, now lets also use this getOne
76
00:04:30,870 --> 00:04:32,710
in all the other resources.
77
00:04:32,710 --> 00:04:36,833
So, the user controller here where we have,
78
00:04:38,200 --> 00:04:40,603
let's see where it is, ah, down here.
79
00:04:43,760 --> 00:04:47,047
So, let's say factory.getOne,
80
00:04:48,930 --> 00:04:52,290
but only with the user model,
81
00:04:52,290 --> 00:04:54,343
and no populate options object.
82
00:04:56,900 --> 00:04:58,740
Okay, and since we're here,
83
00:04:58,740 --> 00:05:02,030
let's actually just change the error message
84
00:05:02,030 --> 00:05:03,850
here for create user,
85
00:05:03,850 --> 00:05:07,583
so this route is not defined, it never will be,
86
00:05:08,980 --> 00:05:11,703
and please use signup instead.
87
00:05:17,010 --> 00:05:19,110
Next up, and finally,
88
00:05:19,110 --> 00:05:23,410
the same thing for the reviews basically.
89
00:05:23,410 --> 00:05:25,063
So, exports.getReview
90
00:05:29,018 --> 00:05:31,427
is equal factory.getOne review,
91
00:05:35,450 --> 00:05:40,193
and I think we don't have (mumbles) our routes just yet.
92
00:05:41,360 --> 00:05:46,357
And, indeed, we don't, so adding this real quick here,
93
00:05:46,357 --> 00:05:49,107
reviewController.getReview, okay?
94
00:05:54,300 --> 00:05:56,423
Let's just quickly test this one as well,
95
00:05:58,870 --> 00:06:01,300
just because I also want to then add it
96
00:06:01,300 --> 00:06:03,203
here to Postman, okay?
97
00:06:04,950 --> 00:06:08,453
So, just copying this one because it's similar,
98
00:06:10,560 --> 00:06:12,393
and then, indeed, it is get.
99
00:06:15,300 --> 00:06:20,300
And, yep, works perfectly fine, store it here in reviews,
100
00:06:23,730 --> 00:06:24,987
and getReview.
101
00:06:28,258 --> 00:06:30,560
All right, an now all that's missing is
102
00:06:30,560 --> 00:06:35,560
basically a getAll factory function, right?
103
00:06:36,070 --> 00:06:37,320
So, basically, to replace
104
00:06:39,200 --> 00:06:42,380
this getAllTours, getAllUsers,
105
00:06:42,380 --> 00:06:46,003
which we should also have somewhere here,
106
00:06:46,970 --> 00:06:50,530
so getAllUsers, and also getAllReviews,
107
00:06:50,530 --> 00:06:53,540
so let's again copy it here from the Tour controller
108
00:06:53,540 --> 00:06:56,380
because actually this is the one that is really complete
109
00:06:56,380 --> 00:06:59,920
because it has all these API features,
110
00:06:59,920 --> 00:07:03,390
and so, after creating our getAll factory function,
111
00:07:03,390 --> 00:07:07,083
all of the three resources will then get these API features.
112
00:07:09,299 --> 00:07:12,840
So again, copying all of this,
113
00:07:15,230 --> 00:07:17,433
exports.getAll,
114
00:07:24,630 --> 00:07:28,390
and so now, we will actually have to require
115
00:07:28,390 --> 00:07:29,743
these API features here,
116
00:07:31,690 --> 00:07:35,780
and in fact we can actually remove it from here
117
00:07:35,780 --> 00:07:38,320
because we will no longer need it
118
00:07:38,320 --> 00:07:43,277
because we now transfer this to the handler factory, right?
119
00:07:45,360 --> 00:07:49,403
Now, here all we need to do is then to replace, as always,
120
00:07:50,370 --> 00:07:53,243
with model, and then here,
121
00:07:56,300 --> 00:07:58,703
doc and data.
122
00:08:01,700 --> 00:08:03,253
Now, okay, perfect.
123
00:08:07,480 --> 00:08:09,133
So, let's see if this works,
124
00:08:13,947 --> 00:08:17,453
getAll with Tour.
125
00:08:22,530 --> 00:08:25,530
And now, I really want to see if this still works
126
00:08:25,530 --> 00:08:28,300
with all these features,
127
00:08:28,300 --> 00:08:31,380
and so it's here, getAll Tours,
128
00:08:31,380 --> 00:08:33,830
and so, let's add our query string here,
129
00:08:33,830 --> 00:08:38,467
and let's say duration greater or equal than let's say a 10,
130
00:08:43,039 --> 00:08:47,063
and sort by price.
131
00:08:50,470 --> 00:08:53,133
Okay, and so we get two results here.
132
00:08:56,170 --> 00:08:58,490
Okay, it's not working.
133
00:08:58,490 --> 00:09:03,030
Anyway, we get the two (chuckles) results here,
134
00:09:03,030 --> 00:09:06,290
and they both have a duration greater than 10,
135
00:09:06,290 --> 00:09:09,360
and the price is 1497,
136
00:09:09,360 --> 00:09:13,420
and the second one is higher, okay?
137
00:09:13,420 --> 00:09:15,810
Let's put it here like to seven,
138
00:09:15,810 --> 00:09:17,673
so we get a bit more results.
139
00:09:19,949 --> 00:09:21,249
Okay, and now we get five.
140
00:09:23,560 --> 00:09:27,480
Okay, anyway, let's now do the same for the reviews
141
00:09:28,910 --> 00:09:32,440
because I'm really excited to test out these API features
142
00:09:32,440 --> 00:09:34,350
on the reviews as well.
143
00:09:34,350 --> 00:09:36,510
Now, one problem that we have here is
144
00:09:36,510 --> 00:09:39,740
that this route handler actually has these two lines of code
145
00:09:40,706 --> 00:09:44,610
that all the other getAll handlers do not have, okay?
146
00:09:44,610 --> 00:09:47,730
But, what we're going to do here is to simply copy this code
147
00:09:47,730 --> 00:09:50,730
into our handler factory as well, okay?
148
00:09:50,730 --> 00:09:52,150
That's kind of a hack
149
00:09:52,150 --> 00:09:56,040
because we really only need this one for getAll reviews,
150
00:09:56,040 --> 00:09:59,210
but to get around this would be a bit too much work
151
00:09:59,210 --> 00:10:02,500
here in this situation, and once more,
152
00:10:02,500 --> 00:10:05,623
I simply want to keep it simple here, all right.
153
00:10:07,010 --> 00:10:08,593
So, let's copy this here,
154
00:10:10,530 --> 00:10:15,150
and I'm adding a comment here to allow
155
00:10:16,500 --> 00:10:21,500
for nested getReviews on Tour, okay?
156
00:10:24,980 --> 00:10:29,533
And so this filter, we will then also pass it in here, okay?
157
00:10:31,260 --> 00:10:33,363
So again, this is a small hack,
158
00:10:35,400 --> 00:10:37,460
but I'm gonna leave it here like this
159
00:10:37,460 --> 00:10:41,770
because I think it is reasonable, all right.
160
00:10:41,770 --> 00:10:44,223
Anyway, let's now get rid of this,
161
00:10:45,260 --> 00:10:48,373
so factory.getAll and review, okay?
162
00:10:54,476 --> 00:10:57,493
Let's actually put this down here next to all the others.
163
00:11:02,430 --> 00:11:03,430
And now, as you see,
164
00:11:03,430 --> 00:11:07,340
we actually do not even need this catchAsync here anymore,
165
00:11:07,340 --> 00:11:09,200
so I'm gonna comment it out here
166
00:11:09,200 --> 00:11:12,300
because, who knows, maybe in the future we're gonna need it
167
00:11:12,300 --> 00:11:15,523
for some other Middleware function here, all right.
168
00:11:16,870 --> 00:11:18,660
So, that looks nice and clean,
169
00:11:18,660 --> 00:11:21,783
and let's now test out the getAll reviews.
170
00:11:23,420 --> 00:11:28,420
All right, so let's actually just save changes here as well.
171
00:11:30,240 --> 00:11:32,310
These ones we don't need,
172
00:11:32,310 --> 00:11:36,143
but I actually want to get all the reviews.
173
00:11:37,530 --> 00:11:39,743
So, right now we have four reviews,
174
00:11:40,980 --> 00:11:43,430
and so let's now try to filter for reviews
175
00:11:43,430 --> 00:11:46,853
only with a rating of four, let's say.
176
00:11:48,860 --> 00:11:53,860
So, query string, rating equal four.
177
00:11:57,820 --> 00:12:00,170
Oh, and it actually works,
178
00:12:00,170 --> 00:12:02,850
so nice, that's really nice.
179
00:12:02,850 --> 00:12:06,780
So, just like this, we get access to all these API features
180
00:12:06,780 --> 00:12:11,780
like filtering, sorting, pagination, and all that good stuff
181
00:12:11,810 --> 00:12:13,988
that we implemented (chuckles)
182
00:12:13,988 --> 00:12:15,890
a long time ago in the course, right?
183
00:12:15,890 --> 00:12:17,380
And, I also want to make sure
184
00:12:17,380 --> 00:12:21,423
that this getAll reviews on Tour also still works.
185
00:12:22,300 --> 00:12:24,120
So, let's check that,
186
00:12:24,120 --> 00:12:26,893
and, yeah, you see that it actually does.
187
00:12:28,050 --> 00:12:30,380
So, the Tour ID that we have here is
188
00:12:30,380 --> 00:12:34,490
exactly the one right here and right here.
189
00:12:34,490 --> 00:12:36,840
So, that one is also still working,
190
00:12:36,840 --> 00:12:39,580
and so let's finally also use getAll
191
00:12:39,580 --> 00:12:44,060
for the user controller, all right.
192
00:12:44,060 --> 00:12:46,733
So, basically replacing simply this,
193
00:12:47,760 --> 00:12:52,760
so factory.getAll user, all right.
194
00:12:55,180 --> 00:12:57,174
And, let's actually put this one
195
00:12:57,174 --> 00:13:01,483
here close to the other ones, all right.
196
00:13:04,960 --> 00:13:06,910
And, then this one as well,
197
00:13:06,910 --> 00:13:09,650
so basically having all of these ones generated
198
00:13:09,650 --> 00:13:11,590
by factory functions together,
199
00:13:11,590 --> 00:13:14,383
and then all the others simply above them.
200
00:13:15,800 --> 00:13:18,580
All right, let's do the same here,
201
00:13:18,580 --> 00:13:20,290
this one is already nice and clean,
202
00:13:20,290 --> 00:13:23,153
and the same for the Tour controller,
203
00:13:24,170 --> 00:13:25,620
so what else do we have here?
204
00:13:27,430 --> 00:13:29,263
This one we can get rid of,
205
00:13:30,690 --> 00:13:34,000
and, okay, I think it looks nice like this.
206
00:13:34,000 --> 00:13:37,150
Again, we can comment out this piece of code
207
00:13:37,150 --> 00:13:40,410
because, for now at least, we don't need it anymore.
208
00:13:40,410 --> 00:13:44,623
And so, just to test it again here with the users,
209
00:13:45,640 --> 00:13:47,423
let's get all of them together,
210
00:13:48,890 --> 00:13:50,973
and, indeed, here they are.
211
00:13:53,320 --> 00:13:55,960
We can now also say that we only want the ones
212
00:13:55,960 --> 00:13:58,873
with the role of user,
213
00:14:00,490 --> 00:14:03,760
and, indeed, that works as well.
214
00:14:03,760 --> 00:14:07,500
Great, and that actually wraps up this part
215
00:14:07,500 --> 00:14:10,170
of creating handler factory functions,
216
00:14:10,170 --> 00:14:14,300
and this really was a huge step forwards in our project,
217
00:14:14,300 --> 00:14:16,030
so remember that, a bit later,
218
00:14:16,030 --> 00:14:18,710
we will also create a booking resource,
219
00:14:18,710 --> 00:14:22,080
and so you see that probably we're gonna be able to create
220
00:14:22,080 --> 00:14:25,070
the main API for these bookings
221
00:14:25,070 --> 00:14:27,310
in like five seconds or something,
222
00:14:27,310 --> 00:14:32,310
simply using these five factory functions, all right.
223
00:14:32,350 --> 00:14:34,750
Anyway, good work, great job,
224
00:14:34,750 --> 00:14:36,683
and I'll see you in the next one.
17345
Can't find what you're looking for?
Get subtitles in any language from opensubtitles.com, and translate them here.