-
Урок 1.
00:02:16
Java Master Class
-
Урок 2.
00:00:59
The Next Steps
-
Урок 3.
00:01:55
Practise as I teach (TODO's)
-
Урок 4.
00:01:10
Discord
-
Урок 5.
00:00:38
Linkedin
-
Урок 6.
00:02:33
Textbook
-
Урок 7.
00:01:36
Exercises and Textbook
-
Урок 8.
00:01:06
Exercise Solutions
-
Урок 9.
00:02:10
Commit Your Changes
-
Урок 10.
00:02:36
Linux and Terminal
-
Урок 11.
00:01:36
IntelliJ 6 Months
-
Урок 12.
00:00:59
Intellij New Theme
-
Урок 13.
00:01:38
What we are about to cook (Project and Environment Setup)
-
Урок 14.
00:02:57
Spring Initiliazer
-
Урок 15.
00:02:05
Open the project with IntelliJ
-
Урок 16.
00:02:28
pom.xml
-
Урок 17.
00:02:18
Lets clean up few things
-
Урок 18.
00:02:48
JDK
-
Урок 19.
00:04:11
Your first Spring Boot Application (Getting Started with Spring Boot 3)
-
Урок 20.
00:03:09
Embedded Web Server
-
Урок 21.
00:04:48
Configuring Embedded Web Server
-
Урок 22.
00:02:55
Your first API
-
Урок 23.
00:06:07
@SpringBootApplication @RestController and @GetMapping
-
Урок 24.
00:05:46
Spring Web MVC
-
Урок 25.
00:07:18
JSON For Java
-
Урок 26.
00:05:26
Java Objects to JSON Objects
-
Урок 27.
00:04:12
Introduction to HTTP (HTTP, REST and APIs)
-
Урок 28.
00:03:15
The Evolution of HTTP
-
Урок 29.
00:03:49
HTTP Request and Response Messages
-
Урок 30.
00:04:44
HTTP Methods
-
Урок 31.
00:06:33
HTTP Status Codes
-
Урок 32.
00:09:01
URL
-
Урок 33.
00:03:38
API and REST API
-
Урок 34.
00:06:38
Public APIs and Other Types
-
Урок 35.
00:02:56
Why build APIs
-
Урок 36.
00:07:07
Chrome Developer Tools (Developer Tools)
-
Урок 37.
00:04:35
Exploring XHR for our API
-
Урок 38.
00:09:29
Inspecting Instagram Network Activity
-
Урок 39.
00:03:50
Postman
-
Урок 40.
00:05:09
IntelliJ REST Client
-
Урок 41.
00:02:05
CRUD and Section Overview (CRUD - Read)
-
Урок 42.
00:02:30
Customer Model
-
Урок 43.
00:03:27
Fake Database
-
Урок 44.
00:05:55
API Endpoint
-
Урок 45.
00:07:57
@PathVariable
-
Урок 46.
00:02:02
N Tier Architecture (Structure the Backend)
-
Урок 47.
00:10:40
Refactor - Controller Service and DAO
-
Урок 48.
00:07:03
@RestController @Service @Repository @Component
-
Урок 49.
00:04:58
Application Context (Application Context and Beans)
-
Урок 50.
00:05:09
Inspecting beans
-
Урок 51.
00:02:23
Bean Scopes
-
Урок 52.
00:07:49
Creating Beans
-
Урок 53.
00:01:57
We are not handling error the right way (Error Handling)
-
Урок 54.
00:05:02
Custom Exception
-
Урок 55.
00:02:28
@ResponseStatus
-
Урок 56.
00:02:04
Include error Message to Responses
-
Урок 57.
00:00:51
Section Intro (Databases)
-
Урок 58.
00:02:18
Postgres and Docker
-
Урок 59.
00:02:27
Verifying Docker Installation
-
Урок 60.
00:04:26
Postgres DB with Docker compose
-
Урок 61.
00:01:34
Connecting to Database
-
Урок 62.
00:03:23
Connecting to DB using IntelliJ IDEA
-
Урок 63.
00:02:31
Data Source & JPA
-
Урок 64.
00:03:00
Installing PostgreSQL Driver and Spring Data JPA Dependencies
-
Урок 65.
00:04:49
Configuring Datasource Properties
-
Урок 66.
00:04:51
Create Customer Table
-
Урок 67.
00:01:22
Outro
-
Урок 68.
00:03:45
Entity (Spring Data JPA)
-
Урок 69.
00:02:29
Inspecting The Database
-
Урок 70.
00:02:32
Column Contraints
-
Урок 71.
00:02:26
CustomerRepository
-
Урок 72.
00:02:03
CustomerJPADataAccessService class
-
Урок 73.
00:02:48
@Qualifier
-
Урок 74.
00:04:32
Saving Entities
-
Урок 75.
00:03:44
Exploring JPA Methods
-
Урок 76.
00:02:04
Outro
-
Урок 77.
00:01:04
The Problem (Get Customer By Id Exercise)
-
Урок 78.
00:01:42
Exercise Solution
-
Урок 79.
00:01:36
Intro (CRUD - Create)
-
Урок 80.
00:00:51
Changing CustomerDao Interface
-
Урок 81.
00:01:28
Override insert customer
-
Урок 82.
00:08:36
Business Logic for Adding new Customer
-
Урок 83.
00:02:46
Controller @RequestMapping and @RequestBody
-
Урок 84.
00:04:07
Testing POST Request
-
Урок 85.
00:01:40
Exercise (CRUD - Delete (Exercise))
-
Урок 86.
00:02:35
Exercise Solution
-
Урок 87.
00:03:23
Exercise (CRUD - Update (Exercise))
-
Урок 88.
00:05:03
Exercise Solution
-
Урок 89.
00:01:18
Few Words (Let's Pause)
-
Урок 90.
00:01:52
Intro (Datasources, JDBC & Flyway)
-
Урок 91.
00:03:12
JPA and Hibernate under the hood
-
Урок 92.
00:04:44
JDBC and JDBCTemplate
-
Урок 93.
00:06:37
DataSource and Connection Pools
-
Урок 94.
00:03:38
Flyway and Liquibase
-
Урок 95.
00:06:21
Flyway (Flyway)
-
Урок 96.
00:00:49
Installing Flyway
-
Урок 97.
00:11:28
Applying and Understanding Flyway Migrations
-
Урок 98.
00:03:45
Lets Start Again but Right
-
Урок 99.
00:04:23
Create Customer Table
-
Урок 100.
00:03:19
Inspecting the Customer Table
-
Урок 101.
00:06:59
Working with Sequences
-
Урок 102.
00:01:35
Exercise
-
Урок 103.
00:04:33
Exercise Solution
-
Урок 104.
00:02:45
Migrations Documentation
-
Урок 105.
00:04:36
Match Entity Containts schema
-
Урок 106.
00:05:28
Validating Schema With Hibernate
-
Урок 107.
00:06:39
Exercise Solution
-
Урок 108.
00:01:16
Intro (JDBC Template)
-
Урок 109.
00:03:47
CustomerJDBC class
-
Урок 110.
00:02:28
JDBC Template Documentation
-
Урок 111.
00:03:53
Insert Customer
-
Урок 112.
00:03:49
Test Insert Customer
-
Урок 113.
00:05:31
Select All Customers
-
Урок 114.
00:04:50
RowMapper and ResultSet
-
Урок 115.
00:02:22
Refactor Row Mapper
-
Урок 116.
00:00:40
Exercise
-
Урок 117.
00:04:04
Exercise Solution
-
Урок 118.
00:00:46
Exercise
-
Урок 119.
00:08:19
Exercise Solution
-
Урок 120.
00:04:18
Why multiple DAO implementations
-
Урок 121.
00:01:20
More on databases later
-
Урок 122.
00:04:09
When to use JDBC over JPA (Spring JDBC vs JPA)
-
Урок 123.
00:02:18
Would you ? (Important Question)
-
Урок 124.
00:02:44
Intro (Testing - Setup)
-
Урок 125.
00:02:57
Testcontainers
-
Урок 126.
00:01:26
H2
-
Урок 127.
00:03:37
Intalling Testcontainers
-
Урок 128.
00:06:52
Let's Write a test Testcontainers
-
Урок 129.
00:08:02
Inspecting DB created by Testcontainers
-
Урок 130.
00:05:59
Apply migrations with Flyway
-
Урок 131.
00:03:29
@DynamicPropertySource
-
Урок 132.
00:06:26
Don't Use @SpringBootTest for Unit Tests
-
Урок 133.
00:05:22
Abstract Testcontainres Logic
-
Урок 134.
00:01:27
Intro (Testing JDBC Template)
-
Урок 135.
00:04:53
JDBCTeamplate Test Class
-
Урок 136.
00:04:50
Configure JDBC Template
-
Урок 137.
00:06:07
selectAllCustomers Test
-
Урок 138.
00:05:18
selectCustomerById Test
-
Урок 139.
00:03:20
selectCustomerById Test 2
-
Урок 140.
00:01:17
Exercises
-
Урок 141.
00:02:14
Test Coverage
-
Урок 142.
00:06:43
Exercise Solution
-
Урок 143.
00:00:50
Intro (Testing JPA Repositories)
-
Урок 144.
00:05:07
What do we need to test
-
Урок 145.
00:05:07
The Wrong Way
-
Урок 146.
00:04:58
@DataJpaTest and @AutoConfigureTestDatabase
-
Урок 147.
00:08:27
Writing Tests For CustomerRepository
-
Урок 148.
00:01:36
No Need to Test DB Backed by List (DAO Mock Testing)
-
Урок 149.
00:03:50
Mockito
-
Урок 150.
00:03:12
@Mock
-
Урок 151.
00:03:33
Test Select All Customers
-
Урок 152.
00:03:21
Test selectCustomerById
-
Урок 153.
00:02:36
Exercise Solution
-
Урок 154.
00:01:01
Intro (Testing Business Layer)
-
Урок 155.
00:03:03
Create CustomerServiceTest and MockitoExtension
-
Урок 156.
00:01:17
Test GetAllCustomers
-
Урок 157.
00:05:53
Test getCustomer
-
Урок 158.
00:04:48
Test if getCustomer Returns Empty Optional
-
Урок 159.
00:06:23
Test addCustomer
-
Урок 160.
00:04:09
addCustomer Test Code Explanation
-
Урок 161.
00:03:59
Test addCustomer 2
-
Урок 162.
00:02:16
Exercises
-
Урок 163.
00:04:36
Exercise Solution (Part 1)
-
Урок 164.
00:18:51
Exercise Solution (Part 2)
-
Урок 165.
00:00:43
Exercise
-
Урок 166.
00:05:29
Exercise Solution
-
Урок 167.
00:02:03
Intro (Integration Testing)
-
Урок 168.
00:03:36
@SpringBootTest
-
Урок 169.
00:03:32
WebTestClient
-
Урок 170.
00:07:13
The First Integration - canRegisterCustomer - Part 1
-
Урок 171.
00:04:43
Running canRegisterCustomer Integration Test
-
Урок 172.
00:08:49
The First Integration - canRegisterCustomer - Part 2
-
Урок 173.
00:03:07
canDeleteCustomer Integration Test
-
Урок 174.
00:05:41
Exercise Solution
-
Урок 175.
00:02:55
Intro (The Upcoming Sections)
-
Урок 176.
00:01:44
Intro (The Jar file)
-
Урок 177.
00:07:04
Spring Boot Maven Plugin Jar
-
Урок 178.
00:03:37
Running Jar
-
Урок 179.
00:00:40
Intro (Maven & Tests)
-
Урок 180.
00:04:59
Surefire Plugin
-
Урок 181.
00:03:47
Configuring Surefire Plugin
-
Урок 182.
00:12:46
Maven Failsafe Plugin
-
Урок 183.
00:02:12
The Jar File
-
Урок 184.
00:01:24
Section Outro
-
Урок 185.
00:00:41
Intro (DevOps)
-
Урок 186.
00:07:54
What is DevOps
-
Урок 187.
00:05:04
DevOps Key Practices and Benefits
-
Урок 188.
00:01:03
Outro
-
Урок 189.
00:01:55
Intro (Docker)
-
Урок 190.
00:01:32
What is Docker
-
Урок 191.
00:04:35
Docker vs VM
-
Урок 192.
00:05:57
Undestanding Containers
-
Урок 193.
00:08:51
Docker Images and Containers
-
Урок 194.
00:02:41
Docker Architecture
-
Урок 195.
00:04:14
Docker Registries
-
Урок 196.
00:05:50
Docker Login
-
Урок 197.
00:01:15
Outro
-
Урок 198.
00:00:45
Intro (Jib)
-
Урок 199.
00:02:20
What is Jib
-
Урок 200.
00:08:49
Configuring Jib Plugin
-
Урок 201.
00:04:40
Building Docker Image
-
Урок 202.
00:05:49
Pulling Image and Running Container
-
Урок 203.
00:04:39
Container Comunication
-
Урок 204.
00:06:47
Docker Network In Action
-
Урок 205.
00:07:05
Docker Compose
-
Урок 206.
00:00:55
Section Outro
-
Урок 207.
00:02:18
Outro
-
Урок 208.
00:01:12
Intro (AWS)
-
Урок 209.
00:04:50
Infrastructure Components Overview
-
Урок 210.
00:03:53
AWS Free Tier
-
Урок 211.
00:06:37
AWS Console Overview
-
Урок 212.
00:02:47
Elastic Beanstalk
-
Урок 213.
00:03:17
Elastic Beanstalk Key Terms
-
Урок 214.
00:04:07
Generate New Key Pair
-
Урок 215.
00:02:46
Saving Private Key
-
Урок 216.
00:02:26
Getting Started With Elastic Beanstalk (Elastic Beanstalk)
-
Урок 217.
00:03:38
Elastic Container Service
-
Урок 218.
00:08:33
Dockerrun aws json
-
Урок 219.
00:09:38
Configure More Options
-
Урок 220.
00:03:57
Infrastructure Provisioned By EB
-
Урок 221.
00:07:02
Updating DB Host and Inspecting Logs
-
Урок 222.
00:04:18
SSH MAC & LINUX & Windows
-
Урок 223.
00:04:01
Bastions
-
Урок 224.
00:06:06
Create Customer DB
-
Урок 225.
00:02:55
Hooray we deployed the API
-
Урок 226.
00:04:22
Exploring EB
-
Урок 227.
00:02:42
Cloudformation
-
Урок 228.
00:02:50
Infrastructure As Code
-
Урок 229.
00:02:46
Multiple Environments
-
Урок 230.
00:02:21
There Are Many Other Ways To Deploy
-
Урок 231.
00:01:21
Intro (Git and Github)
-
Урок 232.
00:00:41
What We Need To Do
-
Урок 233.
00:00:52
Organizing Folders (Monorepo)
-
Урок 234.
00:01:18
Create Github Repository
-
Урок 235.
00:06:14
Pushing code to Github
-
Урок 236.
00:08:05
Open the new Folder and Run Application
-
Урок 237.
00:03:56
Intro (Github Actions)
-
Урок 238.
00:04:55
Github Actions Overview
-
Урок 239.
00:01:31
Intro (Continuos Integration)
-
Урок 240.
00:03:45
Creating the workfow
-
Урок 241.
00:05:53
Github Actions Services
-
Урок 242.
00:03:30
Checkout Action
-
Урок 243.
00:03:15
Setup Java Action
-
Урок 244.
00:06:08
Run Shell Command
-
Урок 245.
00:01:16
Commit and Push Workflow
-
Урок 246.
00:03:14
New Feature Branch
-
Урок 247.
00:05:39
Triggering the Workflow With Pull Request
-
Урок 248.
00:04:40
Make Build Workflow Fail
-
Урок 249.
00:01:31
Outro
-
Урок 250.
00:02:44
Intro (Continous Delivery)
-
Урок 251.
00:03:04
Create Deploy Workflow
-
Урок 252.
00:04:35
Postgres Service
-
Урок 253.
00:01:07
Setting Working Directory
-
Урок 254.
00:04:32
Clone Java and Login to Docker Hub
-
Урок 255.
00:02:41
Generate Custom Build Number
-
Урок 256.
00:02:09
Build Number Step
-
Урок 257.
00:05:55
Maven Verify Step
-
Урок 258.
00:05:57
SED Command
-
Урок 259.
00:02:19
Step to Replace tag in Dockerrun aws json
-
Урок 260.
00:02:32
The Deployment Process
-
Урок 261.
00:04:51
Create AWS Github Actions User with Programmatic Access
-
Урок 262.
00:03:58
Github Secrets for AWS
-
Урок 263.
00:04:13
AWS Elastic Beanstalk
-
Урок 264.
00:02:11
Commit and Push Dockerrun.aws.json STEP
-
Урок 265.
00:05:49
Continuous Delivery In Action
-
Урок 266.
00:03:36
Outro
-
Урок 267.
00:01:26
Intro (Slack Integration)
-
Урок 268.
00:01:08
Installing Slack
-
Урок 269.
00:01:34
Workspaces
-
Урок 270.
00:04:13
Webhooks
-
Урок 271.
00:05:11
Exercise
-
Урок 272.
00:03:57
Exercise Solution
-
Урок 273.
00:06:09
Deployment In Action With Slack Messaging
-
Урок 274.
00:02:08
Discord Webhooks
-
Урок 275.
00:01:14
Intro (Javascript)
-
Урок 276.
00:02:09
Your First Javascript Code
-
Урок 277.
00:04:00
What is Javacript and How it works
-
Урок 278.
00:02:18
Visual Studio Code (VS Code)
-
Урок 279.
00:02:48
NodeJS and NPM
-
Урок 280.
00:03:51
Running JS with using Node
-
Урок 281.
00:07:57
Code Runner
-
Урок 282.
00:03:05
Comments
-
Урок 283.
00:04:17
Quotes and Colons
-
Урок 284.
00:05:22
Variables
-
Урок 285.
00:01:59
Datatypes
-
Урок 286.
00:06:07
Strings
-
Урок 287.
00:06:01
Objects
-
Урок 288.
00:04:17
Boolean
-
Урок 289.
00:05:09
Arrays
-
Урок 290.
00:05:39
Functions
-
Урок 291.
00:06:06
Built in functions
-
Урок 292.
00:04:29
Loops
-
Урок 293.
00:04:51
Other types of For Loops
-
Урок 294.
00:04:50
While Loop
-
Урок 295.
00:04:09
Comparison Operators
-
Урок 296.
00:02:16
Logical Operator
-
Урок 297.
00:07:16
If Statement
-
Урок 298.
00:03:09
Ternary if statement
-
Урок 299.
00:03:37
Switch Statement
-
Урок 300.
00:04:45
Hoisting
-
Урок 301.
00:01:35
Let Keyword
-
Урок 302.
00:06:10
Const Keyword
-
Урок 303.
00:04:10
When to Use Const vs Let
-
Урок 304.
00:04:26
Type Coercion
-
Урок 305.
00:03:48
Triple Equals
-
Урок 306.
00:06:04
Functions Overview
-
Урок 307.
00:06:09
Arrow Functions
-
Урок 308.
00:03:29
Function Default Parameter
-
Урок 309.
00:07:48
Callbacks
-
Урок 310.
00:06:55
Working with Objects
-
Урок 311.
00:05:14
Object Destructing
-
Урок 312.
00:04:23
Spread Operator on Objects
-
Урок 313.
00:05:18
Working with Arrays
-
Урок 314.
00:03:31
Arrays.Map
-
Урок 315.
00:03:40
Array Destructuring
-
Урок 316.
00:07:44
Default Exports
-
Урок 317.
00:07:51
Name Exports and Imports
-
Урок 318.
00:05:00
Your first Promise
-
Урок 319.
00:05:43
synchronous vs asynchronous code
-
Урок 320.
00:06:15
Async Await
-
Урок 321.
00:07:25
Promise all
-
Урок 322.
00:07:52
Promise base http client
-
Урок 323.
00:01:02
Outro
-
Урок 324.
00:01:37
What is React (React)
-
Урок 325.
00:01:29
Vite
-
Урок 326.
00:05:10
Scaffolding React App with Vite
-
Урок 327.
00:03:35
Application Folder Stucture
-
Урок 328.
00:04:27
SRC folder
-
Урок 329.
00:03:48
Understanding Available Scripts
-
Урок 330.
00:02:35
Clean up code to start fresh
-
Урок 331.
00:00:41
Intro (Basics of React)
-
Урок 332.
00:05:30
JSX
-
Урок 333.
00:03:03
Components
-
Урок 334.
00:04:13
Creating Components
-
Урок 335.
00:05:50
Components and Props
-
Урок 336.
00:03:50
Props Children
-
Урок 337.
00:08:19
Tranformations with Map
-
Урок 338.
00:04:28
UseState hook
-
Урок 339.
00:07:00
UseEffect Hooks
-
Урок 340.
00:01:24
Outro
-
Урок 341.
00:01:32
Intro (React Building Our Web App)
-
Урок 342.
00:04:09
UI Libraries
-
Урок 343.
00:03:22
Installing Chakra
-
Урок 344.
00:03:29
Testing ChakraUI installation
-
Урок 345.
00:06:29
SideBar
-
Урок 346.
00:05:24
Customize The SideBar
-
Урок 347.
00:04:40
Axios and getCustomers method
-
Урок 348.
00:02:57
Vite environement variables
-
Урок 349.
00:03:32
Lets try to fetch data from the server
-
Урок 350.
00:03:13
CORS
-
Урок 351.
00:07:38
Allow CORS on the backend
-
Урок 352.
00:09:08
Render Customers & Loading Spinner
-
Урок 353.
00:03:53
Card Component
-
Урок 354.
00:03:13
Wrap and Wrap Item
-
Урок 355.
00:07:30
Customizing Card
-
Урок 356.
00:04:18
Include sha and commit to CD workflow
-
Урок 357.
00:03:42
Watch CD Workflow Deploy CORS changes
-
Урок 358.
00:02:10
Intro (Backend and React - Gender Exercise (Challenging))
-
Урок 359.
00:03:16
Exercise
-
Урок 360.
00:06:45
Add New Migration (Backend and React - Gender Exercise Solution)
-
Урок 361.
00:05:02
Updating Customer Contructor to Include Gender
-
Урок 362.
00:08:11
Fixing Tests
-
Урок 363.
00:06:10
Fixing Integration Tests
-
Урок 364.
00:06:14
Add Gender and Profile Picture to Frontend
-
Урок 365.
00:07:56
Deployment
-
Урок 366.
00:03:47
Pull Lastest amigoscode-api version
-
Урок 367.
00:01:43
Outro
-
Урок 368.
00:01:00
Intro (React - New Customer Feature)
-
Урок 369.
00:03:36
Create Customer Button
-
Урок 370.
00:05:06
Drawer
-
Урок 371.
00:03:36
Installing Formik and YUP
-
Урок 372.
00:04:42
CreateCustomerForm component
-
Урок 373.
00:08:27
Customise Form (Part 1)
-
Урок 374.
00:04:46
Customise Form (Part 2)
-
Урок 375.
00:04:14
Disable submit button if form not valid
-
Урок 376.
00:02:10
Axios Post
-
Урок 377.
00:05:48
onSubmit
-
Урок 378.
00:06:50
Fetch customers on save
-
Урок 379.
00:05:43
Toasts and Notifications
-
Урок 380.
00:05:13
Using success and error notifications
-
Урок 381.
00:01:08
Exercise (React - Delete Customer Exercise)
-
Урок 382.
00:12:23
Exercise Solution
-
Урок 383.
00:00:42
Exercise (React - Update Customer Exercise)
-
Урок 384.
00:17:11
Exercise Solution
-
Урок 385.
00:05:52
Final Touches
-
Урок 386.
00:01:07
Intro (Dockerise React App and Docker Compose)
-
Урок 387.
00:07:34
Dockerfile react frontend
-
Урок 388.
00:04:10
Building React Frontend Docker Image
-
Урок 389.
00:05:18
Running React Frontend Container
-
Урок 390.
00:04:02
Looking inside the container
-
Урок 391.
00:04:47
Adding react service to docker compose
-
Урок 392.
00:01:10
Intro (React Frontend Deployment)
-
Урок 393.
00:07:11
Docker Build Args
-
Урок 394.
00:07:05
React Frontend Container Definition
-
Урок 395.
00:04:04
Deploying
-
Урок 396.
00:08:15
AWS Security Group and Rules
-
Урок 397.
00:05:24
Adding Security Group Rule
-
Урок 398.
00:02:58
Outro
-
Урок 399.
00:02:33
Exercise (AWS - Exercise)
-
Урок 400.
00:21:25
Exercise Solution
-
Урок 401.
00:01:34
Intro (Security & JWT Overview)
-
Урок 402.
00:01:34
The Problem
-
Урок 403.
00:01:44
Spring Security
-
Урок 404.
00:02:55
Exploring Spring Security Documentation
-
Урок 405.
00:03:52
Introduction to JWT
-
Урок 406.
00:05:12
The Structure of JWT
-
Урок 407.
00:01:51
How We Are Going to Secure Our Endpoints
-
Урок 408.
00:05:15
Installing Dependencies (Implementing Security)
-
Урок 409.
00:03:02
Starting the server
-
Урок 410.
00:05:01
Generate JWT Token
-
Урок 411.
00:06:31
Generate JWT Token - Signing
-
Урок 412.
00:01:01
Important
-
Урок 413.
00:04:09
Send Signed Token to Client
-
Урок 414.
00:06:50
Allow Only POST Requests to Register Customers
-
Урок 415.
00:02:13
Inspecting JWT Token
-
Урок 416.
00:06:36
Security FIlter Chain
-
Урок 417.
00:01:43
The Next Steps
-
Урок 418.
00:03:21
UserDetails
-
Урок 419.
00:06:55
Implement UserDetails
-
Урок 420.
00:08:34
Fixing Tests
-
Урок 421.
00:07:10
UserDetailsService
-
Урок 422.
00:07:42
Password Encoder and BCrypt
-
Урок 423.
00:07:36
Hashed Passowords In Action
-
Урок 424.
00:03:24
Authentication Provider
-
Урок 425.
00:05:58
DaoAuthenticationProvider
-
Урок 426.
00:02:10
JWT Token Validation Overview
-
Урок 427.
00:04:50
JWT Auth Filter and Extract Token
-
Урок 428.
00:03:08
Extract Subject From Token
-
Урок 429.
00:09:07
Validate Token and Set Authentication
-
Урок 430.
00:03:31
Registering The Filter
-
Урок 431.
00:04:46
Attatching JWT to Requests
-
Урок 432.
00:03:12
Fixing CustomerRepositoryTest
-
Урок 433.
00:01:17
Lets Pause
-
Урок 434.
00:13:05
Spring Security Architecture Explained
-
Урок 435.
00:01:02
Outro
-
Урок 436.
00:01:46
Intro (DTO Pattern)
-
Урок 437.
00:16:01
DTO Pattern
-
Урок 438.
00:09:00
Fixing canRegisterCustomer Integration Test (Implementing Security PART 2)
-
Урок 439.
00:03:44
We Have A Problem With Spring Security
-
Урок 440.
00:05:14
Authentication Entrypoint
-
Урок 441.
00:08:17
@ControllerAdvice and @ExceptionHandler
-
Урок 442.
00:04:15
Handle InsufficientAuthenticationException and Exception
-
Урок 443.
00:00:48
Exercise
-
Урок 444.
00:05:02
Exercise Solution canDeleteCustomer
-
Урок 445.
00:05:26
Exercise Solution canUpdateCustomer
-
Урок 446.
00:02:39
CORS Issue Again
-
Урок 447.
00:07:02
Spring Security CORS
-
Урок 448.
00:01:28
Login Exercise
-
Урок 449.
00:14:12
Login Exercise Solution
-
Урок 450.
00:12:17
Login Integration Test
-
Урок 451.
00:03:41
Test Login using Postman
-
Урок 452.
00:01:59
POST Mistake
-
Урок 453.
00:07:47
Deployment
-
Урок 454.
00:03:08
Testing API
-
Урок 455.
00:00:24
Exercise
-
Урок 456.
00:02:49
Exercise Solution
-
Урок 457.
00:00:55
Outro
-
Урок 458.
00:00:38
Intro (React - Login & Registration)
-
Урок 459.
00:01:55
Section Intro
-
Урок 460.
00:03:39
Installing React Router
-
Урок 461.
00:04:39
React Router Routes
-
Урок 462.
00:03:45
Login Page
-
Урок 463.
00:04:34
Syling Right Side of Login Page
-
Урок 464.
00:06:51
Login Form P1
-
Урок 465.
00:07:38
Login Form P2
-
Урок 466.
00:02:02
Login Post Method
-
Урок 467.
00:02:55
React Context
-
Урок 468.
00:08:05
AuthProvider
-
Урок 469.
00:07:39
Using Context
-
Урок 470.
00:05:35
Performing Login
-
Урок 471.
00:04:07
Local Storage
-
Урок 472.
00:03:19
Adding to Local Storage
-
Урок 473.
00:02:54
Redirected After Successful login
-
Урок 474.
00:05:23
Attach Authorization Header to HTTP Requests
-
Урок 475.
00:05:08
Add Password To Create New Customer
-
Урок 476.
00:05:59
Logout
-
Урок 477.
00:06:01
Add Details about Current Logged in Customer
-
Урок 478.
00:06:19
Protected Route
-
Урок 479.
00:06:28
Check Token Expiration with JWT Decode
-
Урок 480.
00:08:10
UseEffect in AuthProvider
-
Урок 481.
00:02:20
Redirect to Dashboard if logged in
-
Урок 482.
00:03:48
Testing when token expires
-
Урок 483.
00:07:31
Login Page Deployment
-
Урок 484.
00:01:01
Exercise
-
Урок 485.
00:08:07
Exercise Solution (Part 1)
-
Урок 486.
00:11:42
Exercise Solution (Part 2)
-
Урок 487.
00:04:52
Deployment for Registration
-
Урок 488.
00:03:56
Intro (AWS Load Balancers, Route53, Certificate Manager and SSL/TLS)
-
Урок 489.
00:04:40
Section Overview
-
Урок 490.
00:03:55
Load Balancers Overview
-
Урок 491.
00:02:10
The Need For a Brand New Environment
-
Урок 492.
00:10:38
Create new EB Environment with ALB
-
Урок 493.
00:05:05
Deploy new version with correct DB details
-
Урок 494.
00:07:49
Understanding ALB health checks
-
Урок 495.
00:07:48
Actuator and Health Endpoint
-
Урок 496.
00:02:05
Update Github Secrets
-
Урок 497.
00:07:16
Deploy Actuator Changes
-
Урок 498.
00:06:49
Changing LB Health Endpoint
-
Урок 499.
00:02:27
Route 53 - Register Domain
-
Урок 500.
00:04:42
Create A Record for Load Balancer
-
Урок 501.
00:02:29
SSL and TLS
-
Урок 502.
00:03:13
Issuing Certificate with Certificate Manager
-
Урок 503.
00:06:31
HTTPS Listener
-
Урок 504.
00:03:42
HTTP to HTTPS Redirects
-
Урок 505.
00:01:44
Outro
-
Урок 506.
00:05:30
Managed Hosting Services for Web Apps (AWS Amplify - React Deployment)
-
Урок 507.
00:04:20
Installing AWS Amplify
-
Урок 508.
00:01:55
Choosing Repo and Branch
-
Урок 509.
00:04:15
Build Settings (Part 1)
-
Урок 510.
00:06:34
Build Settings (Part 2)
-
Урок 511.
00:05:00
Deployment
-
Урок 512.
00:07:14
Custom Domain
-
Урок 513.
00:01:49
Protect Web App
-
Урок 514.
00:02:40
Previews
-
Урок 515.
00:13:03
Change React UI
-
Урок 516.
00:06:34
Raise PR
-
Урок 517.
00:03:07
Merge PR
-
Урок 518.
00:00:43
Intro (Typescript)
-
Урок 519.
00:01:49
Your first Typescript code
-
Урок 520.
00:00:44
Nodejs installation
-
Урок 521.
00:00:59
VS code
-
Урок 522.
00:01:44
Install Typescript
-
Урок 523.
00:05:12
TS-node code runner settings
-
Урок 524.
00:03:37
Comments
-
Урок 525.
00:06:47
Declare variables
-
Урок 526.
00:04:59
String type
-
Урок 527.
00:03:04
Number type
-
Урок 528.
00:01:54
Boolean type
-
Урок 529.
00:05:03
Array type
-
Урок 530.
00:04:16
Object type
-
Урок 531.
00:03:22
Any type
-
Урок 532.
00:04:15
Union type
-
Урок 533.
00:04:25
Alias type
-
Урок 534.
00:03:00
Tuple type
-
Урок 535.
00:05:35
Enum type
-
Урок 536.
00:04:06
Never type
-
Урок 537.
00:05:10
Unknown type
-
Урок 538.
00:05:56
Literal type
-
Урок 539.
00:14:01
Functions
-
Урок 540.
00:04:11
Classes
-
Урок 541.
00:06:45
Class Access Modifiers
-
Урок 542.
00:01:49
Class read only Access Modifiers
-
Урок 543.
00:07:12
Inheritance
-
Урок 544.
00:07:07
Getters and setters
-
Урок 545.
00:05:52
Static properties and methods
-
Урок 546.
00:07:03
Abstract class
-
Урок 547.
00:05:47
Interfaces I
-
Урок 548.
00:03:37
Interfaces II
-
Урок 549.
00:04:53
Interfaces III
-
Урок 550.
00:02:37
Interface Functions
-
Урок 551.
00:01:56
Interface Optionals
-
Урок 552.
00:10:14
Intro to Generics
-
Урок 553.
00:11:57
Generics Classes and Interfaces
-
Урок 554.
00:00:19
Outro
-
Урок 555.
00:00:44
Intro (Getting Started with Angular)
-
Урок 556.
00:01:37
What is angular
-
Урок 557.
00:02:09
What is a module
-
Урок 558.
00:04:35
Components in angular
-
Урок 559.
00:04:32
Install angular cli
-
Урок 560.
00:03:09
Bootstrap the app with npm
-
Урок 561.
00:07:04
Explain project structure (src folder)
-
Урок 562.
00:03:44
Explain project structure (package json file)
-
Урок 563.
00:08:30
Explain project structure (angular json file)
-
Урок 564.
00:05:19
Strip sample application
-
Урок 565.
00:04:42
Create a new angular component (Basics of Angular)
-
Урок 566.
00:02:57
Display and use a component
-
Урок 567.
00:05:43
Data binding
-
Урок 568.
00:03:38
Two ways binding
-
Урок 569.
00:03:48
Event binding
-
Урок 570.
00:09:09
Directives - Conditions - Nglf (Part 1)
-
Урок 571.
00:06:26
Directives - conditions - Ngfor (Part 2)
-
Урок 572.
00:06:07
Inputs
-
Урок 573.
00:08:04
Output (Part 1)
-
Урок 574.
00:06:20
Output (Part 2)
-
Урок 575.
00:08:09
Services (Part 1)
-
Урок 576.
00:08:44
Services (Part 2)
-
Урок 577.
00:03:15
Routing-bootstrapping
-
Урок 578.
00:03:54
Routing - Definition
-
Урок 579.
00:07:47
Routing - Declaring a new route
-
Урок 580.
00:06:51
Routing - Navigating to different routes by template and by injecting
-
Урок 581.
00:06:21
Walking through PrimeNG Website (Angular - Application Skeleton)
-
Урок 582.
00:03:17
Cleanup the Project
-
Урок 583.
00:04:16
Adding PrimeNG Dependencies
-
Урок 584.
00:03:14
Import PrimeNG Styles
-
Урок 585.
00:01:35
Make Sure the Imports Work
-
Урок 586.
00:01:23
Explaining Login and Register Pages
-
Урок 587.
00:04:12
Explaining the Future Design of the App
-
Урок 588.
00:03:34
Splitting the App into Components
-
Урок 589.
00:10:15
Create the Customer Component
-
Урок 590.
00:09:44
Create Menu Bar Component
-
Урок 591.
00:06:34
Create Menu Item Component
-
Урок 592.
00:16:42
Header Bar Component
-
Урок 593.
00:02:06
Add Create Customer Button
-
Урок 594.
00:06:36
Add the Sidebar
-
Урок 595.
00:07:09
Create Mana-Customer Component (Part 1)
-
Урок 596.
00:05:24
Create Mana-Customer Component (Part 2)
-
Урок 597.
00:00:47
Create Login Component (Angular - Login Page)
-
Урок 598.
00:00:32
Exercise 1 - Add Routing for Login Page
-
Урок 599.
00:01:24
Exercise 1 - Solution
-
Урок 600.
00:06:58
Implement Login Page UI (Part 1)
-
Урок 601.
00:08:49
Implement Login Page UI (Part 2)
-
Урок 602.
00:01:57
Create the Authentication Service
-
Урок 603.
00:02:55
Create the Authentication Model
-
Урок 604.
00:00:28
Exercise 2 - Bind the Authentication Model to the Login Form
-
Урок 605.
00:02:43
Exercise 2 - Solution
-
Урок 606.
00:04:17
Implement the Login Method
-
Урок 607.
00:03:16
Consume the Login Method and Console Log the Result
-
Урок 608.
00:01:47
Import the HTTP Client Module
-
Урок 609.
00:02:15
Test the Login Method and Analyse the Response
-
Урок 610.
00:05:31
Create Authentication Response Object
-
Урок 611.
00:01:29
Make the Login Method Returns Authentication Response
-
Урок 612.
00:06:11
Catch the Authentication Error and Display the Error Message
-
Урок 613.
00:03:50
Implement Success Login - Store Unauthorised Response and Redirect the User
-
Урок 614.
00:01:02
Why Securing a Route
-
Урок 615.
00:01:51
What is a Guard
-
Урок 616.
00:01:43
Create the Access Guard Service
-
Урок 617.
00:02:04
Use the Access Guard to Secure the Customers Route
-
Урок 618.
00:02:28
Add the Angular-JWT Library
-
Урок 619.
00:06:29
Implement the Access Guard and Secure the Customers Route
-
Урок 620.
00:00:54
Create Customer Service (Angular - Fetch All Customers)
-
Урок 621.
00:00:23
Exercise 1 - Find all Customers
-
Урок 622.
00:01:23
Exercise 1 - Solution
-
Урок 623.
00:04:08
Display all Customers (Part 1)
-
Урок 624.
00:02:53
Ddd the Authorisation Header to the Request
-
Урок 625.
00:01:14
Display all customers (Part 2)
-
Урок 626.
00:03:17
Generate Environments Files
-
Урок 627.
00:04:15
Add Application Properties
-
Урок 628.
00:04:40
Update the Services to use the Values from Environment file
-
Урок 629.
00:02:40
Present the Hard Coded JWT Token (problematic)
-
Урок 630.
00:02:00
Create the HTTP Interceptor
-
Урок 631.
00:03:02
Make Angular use the Interceptor
-
Урок 632.
00:03:25
Implement the Interceptor
-
Урок 633.
00:01:40
Create Customer Card Component
-
Урок 634.
00:12:13
Implement Customer Card UI
-
Урок 635.
00:00:12
Exercise 2 - Display Customer Information in the Card component
-
Урок 636.
00:04:08
Exercise 2 - Solution
-
Урок 637.
00:02:07
Add Customer Registration Object as Input (Angular - Create Customer)
-
Урок 638.
00:01:45
Create the Customer Registration Request Object
-
Урок 639.
00:02:18
Add Binding to the Form
-
Урок 640.
00:00:30
Exercise 1 - Disable the Submit button if the customer is not valid
-
Урок 641.
00:05:12
Exercise 1 Solution
-
Урок 642.
00:00:34
Exercise 2 - Delegate the Submit Operation to the Parent Component
-
Урок 643.
00:02:06
Exercise 2 - Solution
-
Урок 644.
00:03:09
Consume the Submit Event and Console Log the Customer Information
-
Урок 645.
00:02:00
Create POST Customer Service Method
-
Урок 646.
00:00:29
Exercise 3 - Save and Refresh the Customers List
-
Урок 647.
00:05:20
Exercise 3 - Solution
-
Урок 648.
00:02:13
Add Style to the Displayed Cards
-
Урок 649.
00:02:05
Add Toast Component
-
Урок 650.
00:03:38
Display Succes Message after Saving New Customer
-
Урок 651.
00:05:15
Add Dynamic Profile Picture to the Customer Card
-
Урок 652.
00:01:39
Exercise - Implement the Delete Functionality (including the confirm dialogue)
-
Урок 653.
00:02:59
Delegate the Delete Event to the Parent and Console Log the Customer DTO
-
Урок 654.
00:02:20
Add the Confirmation Dialogue Component
-
Урок 655.
00:04:31
Display the Confirmation Dialogue and Console Log the Confirm Delete Action
-
Урок 656.
00:01:35
Create Delete Customer Method (HTTP)
-
Урок 657.
00:01:54
Perform Delete Action and Refresh the Customers List
-
Урок 658.
00:00:55
Explaining the Update Functionnality (Angular - Update customer)
-
Урок 659.
00:01:18
Create Customer Update Request Model
-
Урок 660.
00:01:48
Create Customer Update Methods (service)
-
Урок 661.
00:04:11
Add Operation Input and Manage Fields Display
-
Урок 662.
00:03:13
Display Title Depending on the Operation
-
Урок 663.
00:05:27
Delegate the Update Event to the Parent and Display Customer Information in the Form
-
Урок 664.
00:02:13
Adjust the Create Customer (button) Click Envent
-
Урок 665.
00:03:13
Adjust the Disabling of the Submit Button
-
Урок 666.
00:04:29
Implement Update Customer (Part 1)
-
Урок 667.
00:04:04
Extend the Customer Object and Test the Update Functionality (Part 2)
-
Урок 668.
00:03:39
Correctly Display the Manage Customer Title
-
Урок 669.
00:04:09
Implement Cancel Button
-
Урок 670.
00:02:01
Exercise 1 - Display Username and Role in the Header
-
Урок 671.
00:03:28
Exercise 1 - Soluion
-
Урок 672.
00:04:43
Logout
-
Урок 673.
00:01:37
Exercise - Implement the Registration Functionality (Angular - Register New Customer)
-
Урок 674.
00:00:59
Create Register Component
-
Урок 675.
00:02:08
Add Routing to Register Page
-
Урок 676.
00:03:56
Implement the Register UI (Part 1)
-
Урок 677.
00:04:41
Implement the Register UI (Part 2)
-
Урок 678.
00:01:36
Add Binding to the Customer Registration Request
-
Урок 679.
00:06:57
Register a User and Redirect to Customers Page
-
Урок 680.
00:02:20
Redirect Angular (Angular - Tidy Up)
-
Урок 681.
00:02:57
Tidy Up Some Files
-
Урок 682.
00:01:57
Commit Changes
-
Урок 683.
00:00:49
Exercise (Angular - Deployment Exercise + Solution)
-
Урок 684.
00:03:46
Product Environment Configuration
-
Урок 685.
00:04:34
AWS Amplify Configuration
-
Урок 686.
00:03:33
Deploying Frontend
-
Урок 687.
00:04:16
Custom Domain With Free SSL Certificate
-
Урок 688.
00:01:51
Access Control
-
Урок 689.
00:05:34
AWS Amplify Continuos Integration
-
Урок 690.
00:05:34
AWS Amplify Continuos Delivery
-
Урок 691.
00:01:22
Outro (Angular Outro)
-
Урок 692.
00:01:47
Intro (Limit and Pagination)
-
Урок 693.
00:12:53
The Problem and Fix
-
Урок 694.
00:00:45
Outro
-
Урок 695.
00:02:23
The Exercise (File Upload Exercise)
-
Урок 696.
00:04:08
Documentation and POM (S3 File Uploads)
-
Урок 697.
00:04:37
Create User
-
Урок 698.
00:02:33
Create Access and Secret Keys
-
Урок 699.
00:03:58
Storing Credentials
-
Урок 700.
00:02:38
Amazon S3
-
Урок 701.
00:05:16
S3Client Bean
-
Урок 702.
00:04:21
Implement PutObject Method
-
Урок 703.
00:03:26
Implement GetObject Method
-
Урок 704.
00:02:43
Create S3 Bucket
-
Урок 705.
00:08:46
Testing Uploads and Downloads
-
Урок 706.
00:04:46
Bucket Name as Config
-
Урок 707.
00:05:17
Upload and Download API Endpoints
-
Урок 708.
00:06:03
Implement Service method to upload
-
Урок 709.
00:05:01
Implement Service method to download
-
Урок 710.
00:08:07
ProfileImageId New Column
-
Урок 711.
00:06:57
SQL and JPQL Queries
-
Урок 712.
00:02:38
Include new coloum in select statements
-
Урок 713.
00:05:03
Stroring and Retrieving Profile Image Id from DBNew Lesson
-
Урок 714.
00:06:18
Fixing Compilation and Tests
-
Урок 715.
00:11:56
Test canPutObject
-
Урок 716.
00:05:52
Test canGetObject
-
Урок 717.
00:04:33
Test canGetObject Exception
-
Урок 718.
00:11:18
Test uploadCustomerProfileImage Part 1
-
Урок 719.
00:06:01
Test uploadCustomerProfileImage Part 2
-
Урок 720.
00:04:15
Test uploadCustomerProfileImage Part 3
-
Урок 721.
00:05:25
Test downloadCustomerProfileImage Part 1
-
Урок 722.
00:05:46
Test downloadCustomerProfileImage Part 2
-
Урок 723.
00:02:40
Test downloadCustomerProfileImage Part 3
-
Урок 724.
00:04:30
Exception Handling Documentation
-
Урок 725.
00:06:48
Test JPA Repository Query
-
Урок 726.
00:02:24
Test JPA DAO Implementation
-
Урок 727.
00:02:49
Test JDBC DAO Implementation
-
Урок 728.
00:05:07
Adding Pictures To Test Folder
-
Урок 729.
00:07:46
Picture Upload IT Part 1
-
Урок 730.
00:07:55
Increase Multipart File Size
-
Урок 731.
00:06:55
Download Picture Integration Test
-
Урок 732.
00:03:11
Permit All to Download Picture
-
Урок 733.
00:03:44
FakeS3
-
Урок 734.
00:06:38
FakeS3 PutObject
-
Урок 735.
00:02:15
FakeS3 GetObject
-
Урок 736.
00:02:04
Mock S3
-
Урок 737.
00:04:13
Mock S3 In Action
-
Урок 738.
00:06:09
Roles and Policies
-
Урок 739.
00:07:41
IAM Policy Simulator
-
Урок 740.
00:02:12
Different Profiles Per Environment (Spring Profiles)
-
Урок 741.
00:05:33
Working With Profiles
-
Урок 742.
00:05:34
Test Profile Configuration
-
Урок 743.
00:02:39
Deployment
-
Урок 744.
00:03:47
SSH Into EC2
-
Урок 745.
00:01:20
React Drop Zone (React - File Upload)
-
Урок 746.
00:04:05
Syling Dropzone
-
Урок 747.
00:04:36
Using Dropzone
-
Урок 748.
00:04:53
Dropzone Upload FIle
-
Урок 749.
00:03:37
Testing Picture upload
-
Урок 750.
00:02:24
Reload Profile Picture On Upload
-
Урок 751.
00:02:25
Display Profile Picture
-
Урок 752.
00:02:09
MediaType IMAGE_JPEG_VALUE
-
Урок 753.
00:05:12
CI_CD Backend and Frontend
-
Урок 754.
00:03:20
Test Live Application
-
Урок 755.
00:02:32
Outro (File Upload Outro)
-
Урок 756.
00:03:03
We Built The Building Blocks and Potential Features (Few Words)
-
Урок 757.
00:01:25
Improve Things as you Wish
-
Урок 758.
00:02:11
Secrets Management
-
Урок 759.
00:01:06
Next steps
-
Урок 760.
00:01:54
Testimonial
https://github.com/amigoscode/full-stack-professional/issues/18
I'm so angry with the new bloke... he just doesn't know how to explain things.... Actually, there is a chain of events you should know.....
You may end up with the following error:
ERROR TypeError: Cannot read properties of undefined (reading 'username') angular
Basically, when you main page is load, it tries to get the object from those two lines
[(ngModel)]="authenticationRequest.username"
[(ngModel)]="authenticationRequest.password"
the thing is my authenticationRequest - wasn't initialised and I constantly get the error.
That is why he initialises the variable with the empty in LoginComponent
object authenticationRequest: AuthenticationRequest = {};
and that's why he uses optional operator in the both two fields in the AuthenticationRequest interface
username?: string;
password?: string;
Gosh, I'm not a new to programming, but if he doesn't clear things up... it's hard to trace the error.... he just does things and you should figure out how it works and take everything for granted.
The author uses the 15th version of PrimeNG whereas nowadays the 16th is available. I'm new to Angular so I cannot say exactly the difference between those versions however you don't need to use single quotes within the usual quotes. It won't work
Here is how it should be:
transitionOptions="300ms cubic-bezier(0, 0, 0.2, 1)"
https://github.com/amigoscode/full-stack-professional/issues/17
Oh my gooooood. The more I watch the less I like.... he is soooooooo impatient and unreasonable. I have just implemented the feature of fetching a user by id. Instead of using the null in the initial state in AuthContext.jsx - I used a blank object as a kind of a guest with ROLE_GUEST.
Each request I take the user's id from the localStorage, fetch the user from the database by the id and place the user into the state. Before that I retrieve user's email from JWT and compare - if they are the same - ok. If any of localStorage values have been removed from the client's side (jwt or user id) I redirect the user to the login page and delete any data in their localStorage.
What he does in the Login component is he checks if the user is null (state). The difference is he doesn't fetch the user from the database (there is no async request) and it works. In my case, by the time it checks the user it is yet GIMMICK (guest! or it would've been null if I have done the same as he did). Anyway, what we actually need to check is not the user's state, but if the user is authenticated:
const navigate = useNavigate();
useEffect(() => {
const token = localStorage.getItem("access_token");
const id = localStorage.getItem("customer_id");
if (token && id) {
navigate("dashboard")
}
}, [])
The whole story is written in his github:
https://github.com/amigoscode/full-stack-professional/issues/16
I'm so pissed off with the Mama Samba. First of all we haven't implemented a method fetching a user by email. Do we need to implement it? - No! Fetching a user by their emails isn't a good idea. When we create a database our primary key is customers ids. Meaning it would be the fastest way to fetch the user. Moreover we already have an implementation of fetching a user by the user's id.
Come on! Mama Jambo! You could've done more than that!
I am going to be a champion for opening new cases in his GitHub. :D
https://github.com/amigoscode/full-stack-professional/issues/15
that's to say: WebSecurityConfiguration.java
.requestMatchers(HttpMethod.GET, "/api/v1/customers")
.permitAll()
He signs in to his account, then is redirected to main page (dashboard), but in the end the backend part blocks the GET request and it doesn't show the user in the list.
Why do you say we don't have the ability to create a new user within the UI ? Bloody hell, we have created a page which is available by the link http://localhost:5173/container
It's the first page we have created utilising React. Take a rest from all your hard work mate, you're tired of recording.....
I will leave the code in case you have the same issue:
@ExceptionHandler(AuthenticationServiceException.class)
public ResponseEntity handleException(
AuthenticationServiceException e,
HttpServletRequest request
) {
return new ResponseEntity(
new ApiError(
request.getRequestURI(),
e.getMessage(),
HttpStatus.UNAUTHORIZED.value(),
LocalDateTime.now()
),
HttpStatus.UNAUTHORIZED
);
}
Let's say we may try to override the value of VITE_API_BASE_URL by exposing the variable with a specific value in Dockerrun.aws.json
What he is showing in the lesson is just madness.
https://github.com/amigoscode/full-stack-professional/issues/13
So if you follow my example written in lesson 113 - 116 (down below) relating to new BeanPropertyRowMapper(Customer.class),
you need to change something. Just place getGender() and convert it to String.
@Override
public void insertCustomer(Customer customer) {
var sql = "INSERT INTO customer(name, email, age, gender) VALUES (?, ?, ?, ?)";
jdbcTemplate.update(
sql,
customer.getName(),
customer.getEmail(),
customer.getAge(),
customer.getGender().toString()
);
}
@Override
public void updateCustomer(Customer customer) {
var sql = """
UPDATE customer
SET (name, email, age, gender) = (?, ?, ?, ?)
WHERE id = ?
""";
jdbcTemplate.update(
sql,
customer.getName(),
customer.getEmail(),
customer.getAge(),
customer.getGender().toString(),
customer.getId()
);
}
2. Select your username in the top-right corner and from the drop-down menu select Account Settings.
3. Select the Security tab and then New Access Token.
(Hope it helps)
https://github.com/amigoscode/full-stack-professional/issues/12
I don't know what the difference is since I use MacOS as well as Mama Samba. However, mine is 13.3.1 Ventura. It must be the only difference.
sed -i -E 's_(/:)([^"]*)_\1'${BUILD_NUMBER}'_' Dockerrun.aws.json
!!! don't forget to replate & with your data !!!
As for his port at 03:40 - I didn't understand the issue.... how his local version of Postgres might interfere with the version of Postgres on Github (containerised)?
https://github.com/amigoscode/full-stack-professional/issues/11
https://github.com/amigoscode/full-stack-professional/issues/10
Yes, he has some irritating issues with scrolling frantically window up and down now and again, shaking the cursor like crazy....
But it's just the way he explains things. Embrace his peculiarities. You may be surrounded by people at work who would make you feel even worse. All people are strange and complicated. We are all different.
Configuring Jib plugin - the issue with mvn clean package
https://github.com/amigoscode/full-stack-professional/issues/9
You re going to encounter the issue. Mind I'm working with JDK 20. There is a chance yours is a former version;
https://github.com/amigoscode/full-stack-professional/issues/8
That's really strange! We've got a block **@BeforeEach** setup.... why don't we place the piece of code into it?
```
var customer = new Customer(
FAKER.name().fullName(),
FAKER.internet().safeEmailAddress(),
new Random().nextInt(18, 99)
);
customerJDBCDataAccessServiceUnitTest.insertCustomer(customer);
```
Why does he use the email address to find the customer we've just inserted? He basically relies on a method he hasn't tested yet. It's a shame!
If the previous test is passed we mainly need to rely on it instead.
```
@Test
void selectCustomerById() {
var customer1 = customerJDBCDataAccessServiceUnitTest.selectAllCustomers()
.stream()
.findAny()
.orElseThrow();
var customer2 = customerJDBCDataAccessServiceUnitTest.selectCustomerById(customer1.getId())
.orElseThrow();
assertThat(customer1.getId()).isEqualTo(customer2.getId());
}
```
We don't care what email our inserted user has.... All we care about is if there is a user at all. We get the user and then we test our method looking the user by its ID. Here is the code:
```
@BeforeEach
void setUp() {
customerJDBCDataAccessServiceUnitTest = new CustomerJDBCDataAccessService(getJdbcTemplate());
var customer = new Customer(
FAKER.name().fullName(),
FAKER.internet().safeEmailAddress(),
new Random().nextInt(18, 99)
);
customerJDBCDataAccessServiceUnitTest.insertCustomer(customer);
}
@Test
void selectAllCustomers() {
var customers = customerJDBCDataAccessServiceUnitTest.selectAllCustomers();
assertThat(customers).isNotEmpty();
}
@Test
void selectCustomerById() {
var customer1 = customerJDBCDataAccessServiceUnitTest.selectAllCustomers()
.stream()
.findAny()
.orElseThrow();
var customer2 = customerJDBCDataAccessServiceUnitTest.selectCustomerById(customer1.getId())
.orElseThrow();
assertThat(customer1.getId()).isEqualTo(customer2.getId());
}
```
export FORMAT="ID\t{{.ID}}\nNAME\t{{.Names}}\nIMAGE\t{{.Image}}\nPORTS\t{{.Ports}}\nCOMMAND\t{{.Command}}\nCREATED\t{{.CreatedAt}}\nSTATUS\t{{.Status}}\n"
docker ps --format=$FORMAT
BTW Before the129th lesson, don't use
assertThat(postgreSQLContainer.isHealthy()).isTrue();
it won't work with "postgres:latest". There should be a specific release supporting the feature.
updateCustomer has more unnecessary logic!
Okay folks, I just share with you my implementation. What he does is just overkill.
@Override
public void updateCustomer(Customer customer) {
var sql = """
UPDATE customer
SET (name, email, age) = (?, ?, ?)
WHERE id = ?
""";
jdbcTemplate.update(
sql,
customer.getName(),
customer.getEmail(),
customer.getAge(),
customer.getId()
);
}
@Override
public Optional selectCustomerById(Integer customerId) {
var sql = "SELECT * FROM customer c WHERE c.id = ?";
return jdbcTemplate.query(
sql,
new BeanPropertyRowMapper(Customer.class),
customerId
).stream().findAny();
}
My implementation is succinct:
@Override
public List selectAllCustomers() {
var sql = "SELECT * FROM customer";
return jdbcTemplate.query(sql, new BeanPropertyRowMapper(Customer.class));
}
and don't forget to inject the Postgres language into query. I don't know why he hasn't shown it yet.
Wow! The updateCustomer method is shown at 2:10 with a quite ridiculous implementation. Why do we need to overload the method with the logic? What's the point in all those conditions? If he had a choice between PUT and PATCH - yes, this logic would be justified, but for the PUT itself - it doesn't matter if there is a change in any object's field or it updates partially, let's say just the email or name.
The code looks disgusting and verbose.
PUT is a method of modifying resource where the client sends data that updates the entire resource .
PATCH is a method of modifying resources where the client sends partial data that is to be updated without modifying the entire data.
````
@PutMapping(
path = "{customerId}",
consumes = {
MediaType.APPLICATION_JSON_VALUE,
MediaType.APPLICATION_XML_VALUE
}
)
public void updateCustomerById(
@PathVariable("customerId") Integer customerId,
@RequestBody CustomerDto customerDto
) {
customerService.updateCustomerById(customerId, customerDto);
}
````
In the controller we use @PutMapping. PUT would update the entire resource regardless you change one field or all of them. Why bother putting any additional logic?
````
public void updateCustomerById(Integer customerId, CustomerDto customerDto) {
var customer = getCustomer(customerId);
customer.setName(customerDto.name());
customer.setEmail(customerDto.email());
customer.setAge(customerDto.age());
customerDao.updateCustomer(customer);
}
````
DONE!
public void updateCustomer(Customer customer) {
customers.add(customer)
}
And how is the method going to override the actual object in the List if it simply adds a new object to the end of the List? That's really interesting.