1 00:00:00,980 --> 00:00:02,760 All right, in this lecture, 2 00:00:02,760 --> 00:00:04,720 we're going to talk about something called 3 00:00:04,720 --> 00:00:06,910 nested routes, what they are, 4 00:00:06,910 --> 00:00:08,690 why we need them, and how we can 5 00:00:08,690 --> 00:00:11,163 actually implement them in Express. 6 00:00:12,944 --> 00:00:15,470 Let's think for a second how in practice, 7 00:00:15,470 --> 00:00:18,566 we actually want to create a new review. 8 00:00:18,566 --> 00:00:21,520 Up until this point, when creating new reviews, 9 00:00:21,520 --> 00:00:24,020 we always manually passed the tour ID 10 00:00:24,020 --> 00:00:26,920 and the user ID into the request body, 11 00:00:26,920 --> 00:00:30,300 and then created the review from there, right. 12 00:00:30,300 --> 00:00:33,180 That's okay during development, but of course, 13 00:00:33,180 --> 00:00:34,980 that's not how a review will 14 00:00:34,980 --> 00:00:36,433 be created in the real world. 15 00:00:37,680 --> 00:00:40,610 So, in the real world, the user ID 16 00:00:40,610 --> 00:00:44,010 should ideally come from the currently logged in user 17 00:00:44,010 --> 00:00:47,740 and a tour ID should come from the current tour. 18 00:00:47,740 --> 00:00:49,700 That should ideally be encoded 19 00:00:49,700 --> 00:00:51,877 right in the route, so in the URL. 20 00:00:53,020 --> 00:00:56,300 When submitting a post request for a new review, 21 00:00:56,300 --> 00:01:00,140 we will want to submit that to a URL like this. 22 00:01:00,140 --> 00:01:03,143 Let's write that down here just as a comment. 23 00:01:05,826 --> 00:01:08,869 Ideally, we will want to do a request 24 00:01:08,869 --> 00:01:13,869 for post, for tour, and the ID of the tour, 25 00:01:15,490 --> 00:01:19,343 it doesn't really matter here, and then reviews. 26 00:01:20,650 --> 00:01:23,100 Okay, so now, just like this, 27 00:01:23,100 --> 00:01:25,580 we have the tour ID right in the URL 28 00:01:25,580 --> 00:01:28,030 and the user ID will then also come 29 00:01:28,030 --> 00:01:29,913 from the currently logged in user. 30 00:01:31,130 --> 00:01:35,330 What we see here is now a so-called nested route. 31 00:01:35,330 --> 00:01:37,330 They make a lot of sense when there is 32 00:01:37,330 --> 00:01:40,570 a clear parent-child relationship between resources. 33 00:01:40,570 --> 00:01:43,840 That is clearly the case here, right. 34 00:01:43,840 --> 00:01:47,530 Reviews is clearly a child of tour. 35 00:01:47,530 --> 00:01:49,320 This nested route basically means 36 00:01:49,320 --> 00:01:51,580 to access the reviews resource 37 00:01:51,580 --> 00:01:54,810 on the tour's resource, all right. 38 00:01:54,810 --> 00:01:57,420 In the same way, we will actually also want to 39 00:01:57,420 --> 00:02:01,193 access reviews from a certain tour in the same way. 40 00:02:02,310 --> 00:02:05,560 Let's say then a get request, 41 00:02:05,560 --> 00:02:09,650 and again for tour slash tour ID and slash reviews. 42 00:02:09,650 --> 00:02:11,390 This would then ideally get us 43 00:02:11,390 --> 00:02:13,583 all the reviews for this tour. 44 00:02:14,970 --> 00:02:17,110 We could go even further 45 00:02:17,110 --> 00:02:19,653 and also specify the ID of the review. 46 00:02:21,840 --> 00:02:24,490 So again, just a random string here, 47 00:02:24,490 --> 00:02:25,703 but you get the point. 48 00:02:26,643 --> 00:02:28,550 In this case, we would get review 49 00:02:28,550 --> 00:02:30,420 with the ID of this here 50 00:02:30,420 --> 00:02:32,603 on the tour with this ID. 51 00:02:34,140 --> 00:02:36,520 This is what nested routes are all about. 52 00:02:36,520 --> 00:02:40,220 This is a way more easier way of reading 53 00:02:40,220 --> 00:02:44,795 and understanding how the API works for our API users. 54 00:02:44,795 --> 00:02:47,130 It's way easier then messing around with 55 00:02:47,130 --> 00:02:50,100 query strings and all that stuff like that. 56 00:02:50,100 --> 00:02:52,580 Also, it really shows how there is 57 00:02:52,580 --> 00:02:55,850 this clear relationship between these resources, 58 00:02:55,850 --> 00:02:58,610 again, reviews and tours. 59 00:02:58,610 --> 00:03:00,410 All right, but enough talk. 60 00:03:00,410 --> 00:03:02,510 Let's now actually implement this 61 00:03:02,510 --> 00:03:04,600 starting with the post route. 62 00:03:04,600 --> 00:03:08,100 Now, since the route actually starts with tours, 63 00:03:08,100 --> 00:03:11,150 it will be of course redirected to our tour router. 64 00:03:11,150 --> 00:03:14,600 We're going to have to implement this functionality 65 00:03:14,600 --> 00:03:16,890 at least for now, in the tour router, 66 00:03:16,890 --> 00:03:19,530 even though that seems a bit counter-intuitive 67 00:03:19,530 --> 00:03:21,793 since we're in fact, dealing with reviews. 68 00:03:23,190 --> 00:03:26,650 But again, for now, let's implement it like this. 69 00:03:26,650 --> 00:03:29,690 We come to our user router 70 00:03:32,040 --> 00:03:33,550 and first, since we're actually 71 00:03:33,550 --> 00:03:34,870 going to use reviews here, 72 00:03:34,870 --> 00:03:37,483 we need to import the review controller. 73 00:03:42,370 --> 00:03:46,140 Controller require. 74 00:03:46,140 --> 00:03:49,763 Maybe I should have just copied the line from before. 75 00:03:52,080 --> 00:03:55,693 Controllers, and review controller. 76 00:03:57,380 --> 00:04:01,010 All right, now here at the very bottom, 77 00:04:01,010 --> 00:04:02,730 and let's actually get our code 78 00:04:02,730 --> 00:04:04,970 for this example from here 79 00:04:08,100 --> 00:04:09,223 just as a reference. 80 00:04:13,518 --> 00:04:15,750 So that we can now actually implement it. 81 00:04:15,750 --> 00:04:18,910 The route that we're going to implement here is 82 00:04:20,960 --> 00:04:24,673 slash ID and then reviews. 83 00:04:26,240 --> 00:04:28,600 This tour part here, as you already know, 84 00:04:28,600 --> 00:04:30,457 is where we mounted this router 85 00:04:30,457 --> 00:04:33,300 and so therefore, we do not have to repeat it here. 86 00:04:33,300 --> 00:04:37,090 But then, we have the tour ID and then slash reviews. 87 00:04:37,090 --> 00:04:38,590 In order to make this really clear, 88 00:04:38,590 --> 00:04:40,440 let's actually call it tour ID 89 00:04:42,850 --> 00:04:44,040 since we're now dealing with 90 00:04:44,040 --> 00:04:45,440 different resources here. 91 00:04:45,440 --> 00:04:48,363 So it's a bit clearer to really call it what it is. 92 00:04:52,885 --> 00:04:55,844 We now want to implement the create review. 93 00:04:55,844 --> 00:04:58,094 Authcontroller dot protect. 94 00:05:00,960 --> 00:05:04,403 We also want to restrict access only to users, 95 00:05:11,472 --> 00:05:15,805 and then of course, our review controller dot create 96 00:05:19,740 --> 00:05:22,033 review, all right. 97 00:05:22,980 --> 00:05:26,000 Again, it is a bit weird and counter-intuitive 98 00:05:26,000 --> 00:05:28,880 to actually call the review controller 99 00:05:28,880 --> 00:05:30,593 here in the user route. 100 00:05:31,620 --> 00:05:34,273 Well actually, it should not be in the user route. 101 00:05:35,200 --> 00:05:36,990 For some reason, I opened the user routes 102 00:05:36,990 --> 00:05:41,140 and not the tour routes, so sorry for that one. 103 00:05:41,140 --> 00:05:44,403 Let's cut it from here, come to our tour routes, 104 00:05:45,420 --> 00:05:47,320 and actually do it here at the bottom. 105 00:05:49,697 --> 00:05:52,523 Of course we also need to get the review controller. 106 00:05:56,490 --> 00:05:59,580 So now we should be good to go. 107 00:05:59,580 --> 00:06:01,640 That was a stupid bug. 108 00:06:01,640 --> 00:06:03,920 But anyway, what I was saying is that 109 00:06:03,920 --> 00:06:06,610 it doesn't make much sense to actually call 110 00:06:06,610 --> 00:06:09,720 the review controller in the tour route, 111 00:06:09,720 --> 00:06:12,300 but again, for now, we need to do it like this 112 00:06:12,300 --> 00:06:15,000 because the route starts with tour. 113 00:06:15,000 --> 00:06:17,680 It's this router that will get activated. 114 00:06:17,680 --> 00:06:19,460 In the next video, we're going to fix that, 115 00:06:19,460 --> 00:06:21,350 but for now, we just want to make it work 116 00:06:21,350 --> 00:06:22,870 and to become familiar with 117 00:06:22,870 --> 00:06:25,840 this whole concept of nested routes. 118 00:06:25,840 --> 00:06:29,540 Anyway, we now got our tour ID right in the route, 119 00:06:29,540 --> 00:06:30,880 but of course, we need to let 120 00:06:30,880 --> 00:06:34,250 the controller know that it should now use this tour ID 121 00:06:34,250 --> 00:06:37,113 and also the currently logged in user's ID. 122 00:06:38,100 --> 00:06:39,240 We now need to go ahead 123 00:06:39,240 --> 00:06:41,400 and update our review controller 124 00:06:43,630 --> 00:06:45,433 right here at create review. 125 00:06:53,817 --> 00:06:56,370 What we're going to do is this. 126 00:06:56,370 --> 00:07:01,360 We will say, if there is no request dot body 127 00:07:02,990 --> 00:07:06,210 dot tour, so basically if we didn't specify 128 00:07:06,210 --> 00:07:08,180 the tour ID and the body, 129 00:07:08,180 --> 00:07:10,870 then we want to define that 130 00:07:10,870 --> 00:07:12,603 as the one coming from the URL. 131 00:07:14,080 --> 00:07:17,373 Req dot body dot tour equals request, 132 00:07:19,210 --> 00:07:21,910 and now remember how that URL parameter 133 00:07:21,910 --> 00:07:25,850 is on request dot params and then of course, 134 00:07:25,850 --> 00:07:29,603 the name of the parameter itself, so tour ID. 135 00:07:32,930 --> 00:07:34,640 This is the first part and second, 136 00:07:34,640 --> 00:07:37,060 we also need to do the same with the user. 137 00:07:38,450 --> 00:07:41,740 If there is no request dot user, 138 00:07:41,740 --> 00:07:46,710 or actually, request dot body dot user, 139 00:07:46,710 --> 00:07:50,180 well then the request dot body dot user 140 00:07:51,910 --> 00:07:56,910 should be request dot user dot ID. 141 00:07:58,750 --> 00:08:01,520 And again, we get request dot user from 142 00:08:01,520 --> 00:08:05,193 the protect middleware, and that's actually it. 143 00:08:06,130 --> 00:08:11,130 Let's just put a comment here, nested routes. 144 00:08:13,390 --> 00:08:15,120 With this, we actually make it so 145 00:08:15,120 --> 00:08:17,700 that the user can still specify manually 146 00:08:17,700 --> 00:08:19,603 the tour and the user ID. 147 00:08:20,677 --> 00:08:21,860 What we're doing here is simply 148 00:08:21,860 --> 00:08:24,250 to define them when they are not there 149 00:08:24,250 --> 00:08:27,343 or when they are not specified in the request body. 150 00:08:28,827 --> 00:08:32,263 This should be enough for us to test this now. 151 00:08:33,410 --> 00:08:35,320 All right, so let's take a look 152 00:08:35,320 --> 00:08:37,853 at the users that we got at this point. 153 00:08:41,820 --> 00:08:43,610 We have these two regular users, 154 00:08:43,610 --> 00:08:46,610 we have the test user and we have Jonas here, 155 00:08:46,610 --> 00:08:49,390 but we forgot his password. 156 00:08:49,390 --> 00:08:51,550 Let's go ahead and delete this user 157 00:08:51,550 --> 00:08:53,730 and create a new one. 158 00:08:53,730 --> 00:08:58,730 All right, so in Compass, the users, 159 00:09:00,400 --> 00:09:01,773 and it's this one. 160 00:09:07,220 --> 00:09:09,723 Let's recreate this user basically. 161 00:09:11,220 --> 00:09:14,793 All we really need is these two pieces of data. 162 00:09:17,110 --> 00:09:18,543 Actually that's sign up. 163 00:09:26,820 --> 00:09:28,310 The same name, the same email 164 00:09:29,600 --> 00:09:31,743 and the same password as well. 165 00:09:35,657 --> 00:09:38,690 At this point, we are already logged in as this user, 166 00:09:38,690 --> 00:09:42,170 so-called Jonas, let's keep that in mind. 167 00:09:42,170 --> 00:09:44,950 Next up, we need to choose which tour 168 00:09:44,950 --> 00:09:47,600 we actually want to create the review on. 169 00:09:47,600 --> 00:09:49,790 Let's again do it here at The Forest Hiker 170 00:09:49,790 --> 00:09:52,773 so that then we get multiple reviews on the same tour. 171 00:09:54,240 --> 00:09:55,090 What we're going to now 172 00:09:55,090 --> 00:09:57,380 is to basically access that nested route 173 00:09:57,380 --> 00:09:58,430 that we just created. 174 00:10:02,135 --> 00:10:03,350 We have the tours. 175 00:10:03,350 --> 00:10:05,980 Now we need to get the tour ID, 176 00:10:05,980 --> 00:10:08,050 and again, we're going to use this one 177 00:10:08,050 --> 00:10:09,323 for The Forest Hiker, 178 00:10:12,490 --> 00:10:16,430 and then slash reviews, 179 00:10:16,430 --> 00:10:18,283 and then remember a post. 180 00:10:19,230 --> 00:10:21,963 Then we also need to specify the authorization, 181 00:10:23,100 --> 00:10:27,010 so bearer token, and then now in the body, 182 00:10:27,010 --> 00:10:28,610 all we really need is to 183 00:10:28,610 --> 00:10:30,673 specify the rating and the review. 184 00:10:36,830 --> 00:10:37,860 The rating is five 185 00:10:45,220 --> 00:10:47,160 and then some text here. 186 00:10:47,160 --> 00:10:50,913 So this should actually already be enough to try this out. 187 00:10:51,920 --> 00:10:52,753 Let's send it. 188 00:10:53,769 --> 00:10:56,520 Now we don't have permission to perform this action, 189 00:10:56,520 --> 00:11:00,100 for some reason, so that's weird. 190 00:11:00,100 --> 00:11:03,460 We signed up as this Jonas, 191 00:11:03,460 --> 00:11:05,610 and it's actually just a normal user 192 00:11:06,490 --> 00:11:08,203 like it's supposed to be. 193 00:11:09,090 --> 00:11:11,533 Let's take a look at our router. 194 00:11:13,154 --> 00:11:17,170 Here, oh okay, it's user, not users. 195 00:11:19,120 --> 00:11:22,930 A small bug like that can, as you see, 196 00:11:22,930 --> 00:11:27,333 crash this entire route, so let's try it again now. 197 00:11:28,530 --> 00:11:31,750 And now we actually get the final review 198 00:11:31,750 --> 00:11:35,300 with both the tour and the user correctly defined. 199 00:11:35,300 --> 00:11:38,140 At least I hope so. 200 00:11:38,140 --> 00:11:41,250 The tour ID, you see, ends here in 951, 201 00:11:41,250 --> 00:11:43,260 and so it's exactly the same here. 202 00:11:43,260 --> 00:11:47,640 The user is this 1f3, and so indeed, 203 00:11:47,640 --> 00:11:49,343 it is this exact same one. 204 00:11:50,660 --> 00:11:53,280 All right, and so now we should actually be able 205 00:11:53,280 --> 00:11:56,170 to confirm that, and so this get tour here 206 00:11:56,170 --> 00:11:59,230 is actually already the one that we were 207 00:11:59,230 --> 00:12:01,165 creating the new review on. 208 00:12:01,165 --> 00:12:04,460 Let's take a look, and indeed, 209 00:12:04,460 --> 00:12:06,660 we now get two reviews. 210 00:12:06,660 --> 00:12:09,140 This one is the one that we just created. 211 00:12:09,140 --> 00:12:11,790 It is on the correct tour and of course, 212 00:12:11,790 --> 00:12:15,450 also the correct user with the name of Jonas. 213 00:12:15,450 --> 00:12:17,973 Awesome, that's really cool. 214 00:12:19,620 --> 00:12:22,520 Let's go ahead and save this. 215 00:12:22,520 --> 00:12:24,720 I'm going to create a new folder here again. 216 00:12:25,610 --> 00:12:29,473 I'm going to call it tours slash reviews. 217 00:12:31,086 --> 00:12:33,663 Now in here, let's create, 218 00:12:34,705 --> 00:12:39,705 create new review on tour. 219 00:12:46,220 --> 00:12:49,537 That should actually be outside and just like this. 220 00:12:54,397 --> 00:12:56,103 Let's actually put that one here. 221 00:12:57,450 --> 00:13:01,293 It doesn't really work as it should for some reason. 222 00:13:02,130 --> 00:13:03,403 And here we go. 223 00:13:05,800 --> 00:13:08,260 All right, that worked just fine, 224 00:13:08,260 --> 00:13:10,870 but as I mentioned before, the implementation 225 00:13:10,870 --> 00:13:13,450 is a bit confusing at this point. 226 00:13:13,450 --> 00:13:16,890 And again, that is because we technically defined 227 00:13:16,890 --> 00:13:19,333 a review route in the tour router. 228 00:13:20,220 --> 00:13:22,650 That's a bit confusing, and so in the next video, 229 00:13:22,650 --> 00:13:24,193 we are going to fix that.