All language subtitles for 017 Factory Functions_ Reading_Downloadly.ir_en

af Afrikaans
sq Albanian
am Amharic
ar Arabic
hy Armenian
az Azerbaijani
eu Basque
be Belarusian
bn Bengali
bs Bosnian
bg Bulgarian
ca Catalan
ceb Cebuano
ny Chichewa
zh-CN Chinese (Simplified)
zh-TW Chinese (Traditional)
co Corsican
hr Croatian
cs Czech
da Danish
nl Dutch
en English
eo Esperanto
et Estonian
tl Filipino
fi Finnish
fr French
fy Frisian
gl Galician
ka Georgian
de German
el Greek
gu Gujarati
ht Haitian Creole
ha Hausa
haw Hawaiian
iw Hebrew
hi Hindi
hmn Hmong
hu Hungarian
is Icelandic
ig Igbo
id Indonesian
ga Irish
it Italian
ja Japanese
jw Javanese
kn Kannada
kk Kazakh
km Khmer
ko Korean
ku Kurdish (Kurmanji)
ky Kyrgyz
lo Lao
la Latin
lv Latvian
lt Lithuanian
lb Luxembourgish
mk Macedonian
mg Malagasy
ms Malay
ml Malayalam
mt Maltese
mi Maori
mr Marathi
mn Mongolian
my Myanmar (Burmese)
ne Nepali
no Norwegian
ps Pashto
fa Persian Download
pl Polish
pt Portuguese
pa Punjabi
ro Romanian
ru Russian
sm Samoan
gd Scots Gaelic
sr Serbian
st Sesotho
sn Shona
sd Sindhi
si Sinhala
sk Slovak
sl Slovenian
so Somali
es Spanish
su Sundanese
sw Swahili
sv Swedish
tg Tajik
ta Tamil
te Telugu
th Thai
tr Turkish
uk Ukrainian
ur Urdu
uz Uzbek
vi Vietnamese
cy Welsh
xh Xhosa
yi Yiddish
yo Yoruba
zu Zulu
or Odia (Oriya)
rw Kinyarwanda
tk Turkmen
tt Tatar
ug Uyghur
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.