All language subtitles for 015 Building Handler Factory Functions_ Delete_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,110 --> 00:00:02,100 In this video, 2 00:00:02,100 --> 00:00:05,090 we're gonna be building a handler factory function 3 00:00:05,090 --> 00:00:07,460 in order to delete review documents, 4 00:00:07,460 --> 00:00:10,640 but also documents from all the other collections, 5 00:00:10,640 --> 00:00:12,713 all with one simple function. 6 00:00:14,150 --> 00:00:17,970 So, as I mentioned right at the beginning of this section, 7 00:00:17,970 --> 00:00:21,540 adding very similar handlers to all of our controllers 8 00:00:21,540 --> 00:00:25,010 will create a lot of duplicate code, right? 9 00:00:25,010 --> 00:00:26,880 Because all these update handlers, 10 00:00:26,880 --> 00:00:28,580 or all these delete handlers, 11 00:00:28,580 --> 00:00:30,420 or all these create handlers, 12 00:00:30,420 --> 00:00:33,640 they really all just look basically the same, right? 13 00:00:33,640 --> 00:00:36,070 Also, imagine that we wanted to change 14 00:00:36,070 --> 00:00:40,010 like some https status code or status message. 15 00:00:40,010 --> 00:00:43,380 Then we would have to go into each and every controller 16 00:00:43,380 --> 00:00:45,900 and then change all the handlers in there. 17 00:00:45,900 --> 00:00:49,470 And so, instead of manually writing all these handlers, 18 00:00:49,470 --> 00:00:52,410 why not simply create a factory function 19 00:00:52,410 --> 00:00:54,830 that's gonna return these handlers for us? 20 00:00:54,830 --> 00:00:57,710 So, a factory function is exactly that. 21 00:00:57,710 --> 00:01:00,690 It's a function that returns another function, 22 00:01:00,690 --> 00:01:02,950 and in this case our handler function. 23 00:01:02,950 --> 00:01:06,230 So, for deleting, for creating, for updating, 24 00:01:06,230 --> 00:01:08,780 and also for reading resources. 25 00:01:08,780 --> 00:01:13,400 Okay and I know that this whole concept can be a bit complex 26 00:01:13,400 --> 00:01:14,980 to wrap your head around, 27 00:01:14,980 --> 00:01:16,930 and that's the reason why I left this 28 00:01:16,930 --> 00:01:19,350 for the later part of this course. 29 00:01:19,350 --> 00:01:21,460 But now, I believe that you're actually ready 30 00:01:21,460 --> 00:01:23,580 to implement this kinda stuff. 31 00:01:23,580 --> 00:01:25,900 So this kind of logic is what every advanced 32 00:01:25,900 --> 00:01:28,800 JavaScript developer should be able to implement, 33 00:01:28,800 --> 00:01:31,770 and so again I believe that at this point in the course 34 00:01:31,770 --> 00:01:34,860 you're really ready to start using advanced concept 35 00:01:34,860 --> 00:01:36,570 like this, all right. 36 00:01:36,570 --> 00:01:39,510 But enough talk, let me now show you how it actually works 37 00:01:39,510 --> 00:01:42,860 by using the delete handler as a first example. 38 00:01:42,860 --> 00:01:47,540 And so actually we have one in the tour controller, 39 00:01:47,540 --> 00:01:50,063 and so let's go ahead and copy that one, 40 00:01:51,410 --> 00:01:52,763 so delete tour. 41 00:01:53,760 --> 00:01:56,490 Okay, so I copied it basically 42 00:01:56,490 --> 00:01:58,283 as a template for us to follow. 43 00:01:59,710 --> 00:02:02,770 So let's create a new file, and I'm going to do that 44 00:02:02,770 --> 00:02:03,883 in the controllers. 45 00:02:04,910 --> 00:02:05,743 All right, 46 00:02:07,150 --> 00:02:08,310 so handler... 47 00:02:09,990 --> 00:02:11,883 factory.js. 48 00:02:13,160 --> 00:02:15,690 And I'm doing this is the controllers folder, 49 00:02:15,690 --> 00:02:18,060 well because the functions that we're gonna write here 50 00:02:18,060 --> 00:02:20,070 will basically return controllers. 51 00:02:20,070 --> 00:02:21,860 And so for me it makes a lot of sense 52 00:02:21,860 --> 00:02:23,010 that you put them here. 53 00:02:24,530 --> 00:02:26,300 So let's just copy this part here, 54 00:02:26,300 --> 00:02:28,640 just to keep it as a reference. 55 00:02:28,640 --> 00:02:32,010 So again the goal here is to basically create a function, 56 00:02:32,010 --> 00:02:33,580 which will then return a function 57 00:02:33,580 --> 00:02:35,750 that looks like this one here. 58 00:02:35,750 --> 00:02:37,870 But of course not only for the tour, 59 00:02:37,870 --> 00:02:40,670 but for every single model that we have in our application 60 00:02:40,670 --> 00:02:42,840 and that we might have in the future. 61 00:02:42,840 --> 00:02:45,270 So this function needs to be prepared for that, 62 00:02:45,270 --> 00:02:49,150 and so what that means is that inside the factory function, 63 00:02:49,150 --> 00:02:51,843 we will pass in the model, all right. 64 00:02:53,760 --> 00:02:55,937 So let's call this one deleteOne. 65 00:02:59,070 --> 00:03:00,960 And it's called like this, again, 66 00:03:00,960 --> 00:03:02,830 because this function is not only going 67 00:03:02,830 --> 00:03:04,610 to work to delete tours, 68 00:03:04,610 --> 00:03:07,580 but also to delete reviews and users 69 00:03:07,580 --> 00:03:09,630 and in the future some other documents 70 00:03:09,630 --> 00:03:10,923 that we might also have. 71 00:03:12,582 --> 00:03:14,750 So as I was saying in the beginning, 72 00:03:14,750 --> 00:03:17,680 we will pass the model into this function. 73 00:03:17,680 --> 00:03:21,930 So we pass the model and then we create a new function, 74 00:03:21,930 --> 00:03:23,620 and that function will right away 75 00:03:23,620 --> 00:03:26,438 then return our async function, 76 00:03:26,438 --> 00:03:27,271 so basically all of this or async handler function. 77 00:03:33,580 --> 00:03:37,310 Okay, and so now all we need to do is to actually change 78 00:03:37,310 --> 00:03:41,663 from the specific tool model to the more generic model. 79 00:03:43,685 --> 00:03:48,240 Then here we will also change this from tour to the document 80 00:03:48,240 --> 00:03:51,890 because again, we will not know what kinda document is this. 81 00:03:51,890 --> 00:03:54,810 So this function will not really know if it is a tour, 82 00:03:54,810 --> 00:03:56,963 or if it is a review, or a user. 83 00:03:58,220 --> 00:04:02,063 And so we need to take the tour out of all of this, 84 00:04:03,760 --> 00:04:05,550 and that's actually it. 85 00:04:05,550 --> 00:04:07,870 So this basically the generalization 86 00:04:07,870 --> 00:04:11,710 of this specific function, which worked only for tours, 87 00:04:11,710 --> 00:04:14,263 and now this new one works for every model. 88 00:04:16,586 --> 00:04:20,420 What we also need to do here is to import this catchAsync 89 00:04:20,420 --> 00:04:21,793 and also this AppError. 90 00:04:25,040 --> 00:04:26,290 So catchAsync... 91 00:04:32,630 --> 00:04:35,023 and I believe it's in the utilities folder. 92 00:04:36,280 --> 00:04:40,213 And then, not AppError but catchAsync. 93 00:04:43,780 --> 00:04:45,030 Then duplicate this here, 94 00:04:48,070 --> 00:04:51,243 AppError, and this here is uppercase. 95 00:04:52,320 --> 00:04:54,840 Give it a save, and we're now ready 96 00:04:54,840 --> 00:04:56,323 to actually test this out. 97 00:04:58,240 --> 00:05:01,490 So this is how it's going to work, 98 00:05:01,490 --> 00:05:05,333 first of all we need to import that handler factory. 99 00:05:06,760 --> 00:05:07,843 And so let's say, 100 00:05:10,310 --> 00:05:12,560 and I'm simply going to call it factory here. 101 00:05:15,070 --> 00:05:19,730 So require, and it's in the same folder, 102 00:05:19,730 --> 00:05:21,113 so handler factory. 103 00:05:23,300 --> 00:05:28,110 All right and so let's comment this one here out, 104 00:05:28,110 --> 00:05:29,510 or actually not all of this. 105 00:05:31,380 --> 00:05:34,343 Yeah or actually we can comment it out, 106 00:05:37,300 --> 00:05:41,917 and so the new exports.deletes tour will be... 107 00:05:45,670 --> 00:05:50,670 factory.deleteOne and then pass in the model, 108 00:05:50,900 --> 00:05:52,410 which is tour. 109 00:05:52,410 --> 00:05:55,053 And that's it, that's all we need to do. 110 00:05:55,960 --> 00:05:58,650 So just to recap very quickly here, 111 00:05:58,650 --> 00:06:01,450 so we call this deleteOne function, 112 00:06:01,450 --> 00:06:03,550 then in there we pass the model, 113 00:06:03,550 --> 00:06:06,520 and so what's going to happen is that this function 114 00:06:06,520 --> 00:06:09,433 will then right away return this handler function 115 00:06:09,433 --> 00:06:10,773 that we had before. 116 00:06:11,630 --> 00:06:15,070 Simply the specific model, which before was the tour, 117 00:06:15,070 --> 00:06:17,200 is now going to be replaced with the one 118 00:06:17,200 --> 00:06:18,923 that we passed into the function. 119 00:06:19,920 --> 00:06:23,160 And by the way this works because of JavaScript closures, 120 00:06:23,160 --> 00:06:25,690 which is just a fancy way of saying 121 00:06:25,690 --> 00:06:28,670 that this inner function here will get access 122 00:06:28,670 --> 00:06:30,820 to the variables of the outer function 123 00:06:30,820 --> 00:06:33,643 even after the outer has already returned. 124 00:06:34,992 --> 00:06:37,370 So calling this function here 125 00:06:37,370 --> 00:06:39,660 will then return another function, 126 00:06:39,660 --> 00:06:43,000 which will then sit here and wait until it is finally called 127 00:06:43,000 --> 00:06:46,260 as soon as we hit the corresponding route. 128 00:06:46,260 --> 00:06:48,343 And so let's now try exactly that. 129 00:06:49,380 --> 00:06:50,873 So delete tour, 130 00:06:52,670 --> 00:06:54,773 okay, and let's choose a tour 131 00:06:54,773 --> 00:06:57,580 that we don't really need here for now. 132 00:06:57,580 --> 00:06:59,130 So let's say... 133 00:07:00,050 --> 00:07:01,970 now let's say here The Snow Adventurer 134 00:07:01,970 --> 00:07:03,970 'cause it also doesn't have any reviews. 135 00:07:07,900 --> 00:07:10,133 So let's send that, 136 00:07:11,230 --> 00:07:14,350 oh and now we don't have permission to preform the action, 137 00:07:14,350 --> 00:07:17,633 and that's because we're not logged in as an admin. 138 00:07:18,890 --> 00:07:20,413 So let's try that, 139 00:07:22,280 --> 00:07:25,913 and so this is the admin that we need to be logged in. 140 00:07:27,200 --> 00:07:28,740 Okay, so that's done. 141 00:07:28,740 --> 00:07:33,300 And so now this should work, and indeed it did work. 142 00:07:33,300 --> 00:07:36,300 And so that's proof that our factory function 143 00:07:36,300 --> 00:07:37,883 is really doing it's job. 144 00:07:38,870 --> 00:07:41,820 Okay 'cause if you now come back here, 145 00:07:41,820 --> 00:07:46,530 we had 10 results and so now we should only get nine, 146 00:07:46,530 --> 00:07:47,513 so perfect. 147 00:07:49,010 --> 00:07:51,510 And now the goal is to be able to use this 148 00:07:51,510 --> 00:07:53,373 in each and every single controller. 149 00:07:54,870 --> 00:07:57,230 So let's copy this here 150 00:07:59,010 --> 00:08:00,483 and go to the reviews. 151 00:08:01,870 --> 00:08:03,670 Oh and of course we need it up here, 152 00:08:04,950 --> 00:08:08,090 right in the beginning, now right, 153 00:08:08,090 --> 00:08:12,320 and so now export.deleteReview 154 00:08:15,850 --> 00:08:18,893 is equal to factory.deleteOne 155 00:08:22,600 --> 00:08:24,680 with the review model. 156 00:08:24,680 --> 00:08:26,710 And that's it, that's all we need to do 157 00:08:26,710 --> 00:08:29,890 in order to implement the delete handler. 158 00:08:29,890 --> 00:08:33,293 Now of course we also need to specify the route handler. 159 00:08:35,640 --> 00:08:39,000 Now of course we need to specify the route itself, 160 00:08:39,000 --> 00:08:41,243 and so let's do that here as well. 161 00:08:43,789 --> 00:08:47,450 So router.route 162 00:08:49,710 --> 00:08:52,553 because here we actually need the ID parameter. 163 00:08:55,152 --> 00:09:00,053 And now delete is simply reviewController.deleteReview, 164 00:09:02,940 --> 00:09:05,970 and I'm not messing with the permission here, 165 00:09:05,970 --> 00:09:07,910 neither with authentication 166 00:09:07,910 --> 00:09:10,190 because for now I just want to make this work 167 00:09:10,190 --> 00:09:13,053 and worry about that stuff a bit later in this section. 168 00:09:14,350 --> 00:09:19,350 Okay, so let's close this stuff up here. 169 00:09:21,590 --> 00:09:23,623 So get all reviews, 170 00:09:26,280 --> 00:09:27,113 all right, 171 00:09:29,300 --> 00:09:33,430 let's save this and this one as well. 172 00:09:33,430 --> 00:09:35,890 So that now we can start with a blank sheet here 173 00:09:37,390 --> 00:09:39,710 and let's just start by getting all reviews, 174 00:09:39,710 --> 00:09:41,933 so that we can now delete one. 175 00:09:42,880 --> 00:09:46,463 And so let's delete, well just this one. 176 00:09:52,663 --> 00:09:55,830 Okay, now we also need of course this, 177 00:10:00,350 --> 00:10:03,563 and then the delete http method. 178 00:10:04,750 --> 00:10:06,900 We need no authorization at this point, 179 00:10:06,900 --> 00:10:08,840 so let's just send it. 180 00:10:08,840 --> 00:10:11,980 And indeed no content, so 204. 181 00:10:11,980 --> 00:10:14,360 And if we now get all the reviews, 182 00:10:14,360 --> 00:10:16,883 then we should be back to having just three. 183 00:10:17,730 --> 00:10:22,730 Yep, that works and so let's move on to the next one. 184 00:10:23,340 --> 00:10:26,203 Okay so reviews, reviews. 185 00:10:28,680 --> 00:10:32,220 Let's get this line of code here and now finally add it 186 00:10:32,220 --> 00:10:34,183 to the user controller as well. 187 00:10:39,130 --> 00:10:42,700 All right, and of course all of this, 188 00:10:42,700 --> 00:10:45,450 I understand it's a bit confusing now messing 189 00:10:45,450 --> 00:10:47,200 with all of these different files, 190 00:10:47,200 --> 00:10:50,190 but we just need to do it once and then we're done 191 00:10:50,190 --> 00:10:51,533 with all that confusion. 192 00:10:52,636 --> 00:10:55,033 So here we already had the export.deleteUser, 193 00:10:55,986 --> 00:11:00,845 now all we need to do is to then call our factory function, 194 00:11:00,845 --> 00:11:03,428 so deleteOne and then the user. 195 00:11:06,220 --> 00:11:09,140 Now only the administrator should later be able 196 00:11:09,140 --> 00:11:12,760 to actually delete users because remember that 197 00:11:12,760 --> 00:11:14,750 when the user deletes himself, 198 00:11:14,750 --> 00:11:17,750 then they will not actually get deleted 199 00:11:17,750 --> 00:11:20,350 but only active will be set to false. 200 00:11:20,350 --> 00:11:22,400 But the administrator on the other hand 201 00:11:22,400 --> 00:11:25,710 is really gonna be able to delete the user effectively 202 00:11:25,710 --> 00:11:26,940 from the database. 203 00:11:26,940 --> 00:11:28,550 But again, we're going to worry 204 00:11:28,550 --> 00:11:31,023 about that permission stuff a bit later. 205 00:11:31,980 --> 00:11:35,487 For now, let's check in the userRoutes 206 00:11:37,057 --> 00:11:39,210 if the route is actually implemented, 207 00:11:39,210 --> 00:11:41,560 and yeah it is down here. 208 00:11:41,560 --> 00:11:43,730 And so since we now implemented this, 209 00:11:43,730 --> 00:11:47,653 let's also test it here again also on Postman. 210 00:11:49,290 --> 00:11:50,983 So first let's save this one. 211 00:11:54,440 --> 00:11:55,360 So... 212 00:11:56,210 --> 00:11:59,373 delete review, 213 00:12:02,000 --> 00:12:07,000 and now let's simply copy this 214 00:12:08,420 --> 00:12:10,910 into yet another route. 215 00:12:10,910 --> 00:12:13,063 So delete and then one user, 216 00:12:14,340 --> 00:12:16,690 but I'm actually not really going to do it now. 217 00:12:17,970 --> 00:12:22,253 All I want is to just get some random ID. 218 00:12:23,350 --> 00:12:26,703 Or actually let's just create a new user, 219 00:12:27,780 --> 00:12:31,323 so basically sign up, and then delete that one right away. 220 00:12:32,500 --> 00:12:35,563 So hello, like this. 221 00:12:38,690 --> 00:12:43,360 Get all users, and then it's this guy here. 222 00:12:43,360 --> 00:12:46,963 And so let's delete him right away, 223 00:12:48,310 --> 00:12:51,560 so we send, we get 204 no content. 224 00:12:51,560 --> 00:12:53,833 And of course, now he should be gone. 225 00:12:54,840 --> 00:12:56,740 Now if we try to see her again, 226 00:12:56,740 --> 00:12:58,680 so basically trying to delete a user 227 00:12:58,680 --> 00:13:01,320 that is no longer there, we should get an error. 228 00:13:01,320 --> 00:13:04,673 So let's take a look, and indeed no document found 229 00:13:04,673 --> 00:13:06,330 with that ID. 230 00:13:06,330 --> 00:13:09,203 And so this means that in our factory function, 231 00:13:10,570 --> 00:13:15,550 so right here, all of this the AppError and the catchAsync, 232 00:13:15,550 --> 00:13:17,240 all of that is still intact. 233 00:13:17,240 --> 00:13:20,490 So everything still works just the same as before. 234 00:13:20,490 --> 00:13:23,283 Now so that was also important to test here. 235 00:13:25,670 --> 00:13:27,860 Let's just quickly save this here as well, 236 00:13:27,860 --> 00:13:31,660 so each and every single endpoint that we're implementing, 237 00:13:31,660 --> 00:13:33,810 I'm also adding it here into Postman 238 00:13:33,810 --> 00:13:36,890 because a bit later we will then actually be able 239 00:13:36,890 --> 00:13:39,420 to actually create some API documentation 240 00:13:39,420 --> 00:13:43,970 based on all of this that we have saved here in Postman. 241 00:13:43,970 --> 00:13:47,713 So that's yet another handy feature of this application. 242 00:13:50,253 --> 00:13:51,960 So we have delete the current user, 243 00:13:51,960 --> 00:13:54,520 and again that's different from just deleting the user 244 00:13:54,520 --> 00:13:56,800 because this one here is for administration 245 00:13:56,800 --> 00:13:59,803 and this one is for the currently logged in user, 246 00:14:00,820 --> 00:14:01,963 so very different. 247 00:14:03,320 --> 00:14:06,750 Okay, so this was our first factory function 248 00:14:06,750 --> 00:14:09,660 only for deleting and only for you to understand 249 00:14:09,660 --> 00:14:11,290 the concept itself. 250 00:14:11,290 --> 00:14:13,740 Next up, we're then gonna implement factory functions 251 00:14:13,740 --> 00:14:16,293 for updating and for creating documents. 19534

Can't find what you're looking for?
Get subtitles in any language from opensubtitles.com, and translate them here.