Готовы ли вы повысить свои навыки программирования и стать профессиональным Full Stack разработчиком? Наш новый курс продолжительностью более 50 часов разработан таким образом, чтобы оснастить вас последними инструментами и техниками для создания впечатляющих приложений Full Stack, которые поразят пользователей и вашу команду.
За следующие три месяца вы научитесь создавать впечатляющие, отзывчивые пользовательские интерфейсы, которые безупречно взаимодействуют с надежными и масштабируемыми серверами на стороне бэк-энда, используя стандартные технологии отрасли, такие как:
Spring Boot 3
Разработка HTTP и API
Инструменты разработчика для максимальной производительности
Надежные техники обработки ошибок
Работа с базами данных и PostgreSQL
Spring Data JPA
Flyway для безшовной миграции баз данных
JDBC для эффективного взаимодействия с базами данных
Стратегии тестирования для надежного кода
Docker для контейнеризации и развертывания
AWS для хостинга и масштабирования на основе облака
Лучшие практики DevOps для гибкой, коллаборативной разработки
JavaScript и React для разработки фронтенда
Spring Security 6 для создания безопасных и аутентифицированных приложений
Системы регистрации и входа для управления пользователями
TypeScript для создания масштабируемого кода с типизацией
Angular для создания мощных и отзывчивых пользовательских интерфейсов на фронтенде.
Для кого предназначен курс?
Изучение разработки Full Stack может быть сложным, особенно для начинающих и профессионалов, которые только знакомятся с сервис-ориентированной архитектурой.
Поэтому курс Full-Stack Professional был разработан таким образом, чтобы предоставить всеобъемлющий пакет обучения пошагово, подходящий для любого человека с базовыми знаниями программирования и опытом работы по крайней мере с одним языком программирования.
Независимо от того, являетесь ли вы профессиональным программистом, стремящимся расширить свой набор навыков, или новичком, который только начинает свой путь в мире программирования, наш курс научит всему, что вам нужно для создания сложных веб-приложений от начала до конца.
Посмотреть больше
Это пробный урок. Оформите подписку, чтобы получить доступ ко всем материалам курса. Премиум
Урок 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)
Нельсон - инженер-программист, выпускник с отличием 1-го класса по информатике. В последние годы Нельсон программировал на разных языках программирования, таких как PHP, Python, C #. В первую очередь он пишет Java и JavaScript, фокусируясь на крупных распределенных системах, размещенных в облаке.
tbh not the best course, a lot of things he is just reading from the docs and a person who is trying to learn cannot understand a shit from docs, they need much more simplified explanation. A lot about frond-end is VERY bad made he basically says "repeat after me" without explanation. You will still google A LOT just to understand things from this course cuz his explanations are just crap
pyemkey
mrrubox1
What other course do you consider being better than this one?
mrrubox1
Lesson 318. WTF is promise. No explanation about it, NOTHING. Like we already know the concept of it. And lessons that comes after is just not understandable because he didnt exaplain what promise is.
rawstyle
mrrubox1
Yeah it sucks, but if you still need explanation then check this out: https://javascript.info/async
moonchildeverlasting
rawstyle
promises async is the cornerstone of development - i just means - do this and wait for that... or do this and dont wait for that.
spuraigor
Lessons 395 in deploy to aws a have error in react container exec format error wtf?
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.
hazartilirot
Lesson 594
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:
Lesson 553 - I'm a bit perplexed. What do you mean we are going to create an backend application? How about Angular?
hazartilirot
Wow, I have just reached TYPESCRIPT section! Folks! Mama Samba is no longer in the videos! :D He is retired. :D
hazartilirot
Lesson 481, timeline 02:00
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:
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!
hazartilirot
Lesson 475 timeline 02:45
I am going to be a champion for opening new cases in his GitHub. :D
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.
hazartilirot
Lesson 470
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.....
hazartilirot
LESSON 449 + 450 - It's hard to tell why I cannot pass the very first and basic test with bad credentials.... however I had to change BadCredentialException to more common exception. I debugged the app, there was a trace of InternalAuthenticationServiceException. Both exceptions implement AuthenticationServiceException so I decided to use it as a solution:
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
);
}
hazartilirot
LESSON 440 - It's not the only issue! The real problem is that if a clien'ts header includes Bearer with JWT token - we get 404 error, but if we make a GET request as an authenticated user - we get the 200th status. What the heck?
hazartilirot
hazartilirot
Finally, he explains it in the 442-d lesson. Oh, dear......
hazartilirot
LESSON 421 - I think nobody realises how sick and tired I'm of the same expression he always uses - "this is pretty much it". He is just crazy... It drives me mad. :D
hazartilirot
Lesson 393 - Wow, the method with injecting ONE environment variable into .env file is just overwhelming! I bet there should be a better and simpler way to expose values of environment variables within the settings of our AWS instance.
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.
hazartilirot
hazartilirot
This is exactly what he does in the next lesson, but he removes the entire section of environment variable for the frontend. **facepalm**
hazartilirot
Lesson 375 disable attribute in Button is no longer valid
LESSON 323 - Well, If I initially didn't know Javascript I would never pick the language up from his lessons. He barely scratched the surface.
hazartilirot
Lesson 284 - Don't listen to Mama Samba. Use CONST in most cases and seldom use LET if you need a variable to change. But you must never use VAR unless you know the difference.
hazartilirot
hazartilirot
Finally, he explains the reason you must avoid using VAR in the 300th.
hazartilirot
Lesson 280. Bloody hell.... Why does he explain Javascript from scratch? On top of that he has switched Intellij IDEA to VS Code!!!!!!!!!!!!
hazartilirot
LESSON 261 - He seems to have forgotten to show how he retrieved DOCKERHUB_ACCESS_TOKEN and DOCKERHUB_USERNAME values from Docker or did I miss something? I think I didn't skip any lesson....
lino479Nick
hazartilirot
1. Sign in to Docker Hub.
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)
hazartilirot
LESSON 258 I personally had an issue with substituting the latest string with an environment variable. Here's what I suggest doing:
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.
lino479Nick
hazartilirot
(I ssh-ed in the EC2 instance and ran this command)
sed -i -E 's_(/:)([^"]*)_\1'${BUILD_NUMBER}'_' Dockerrun.aws.json
!!! don't forget to replate & with your data !!!
hazartilirot
LESSON 252 - Before you type the Github Workflow schema select it at the bottom right corner of the Intellij IDEA. Literally select Schema and type Github workflow - it will helps you to autocomplete the parameters.
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)?
hazartilirot
"To be honest, this is (pretty much) it" - is the most used expression by Mama Samba))))))
hazartilirot
LESSON 236 ADD the line POSTGRES_DB: customer to compose.yml
This course is a huge scam, it has no quality whatsoever. The practical project of the course is a joke, terrible, ugly, and poor. This guy is supported by fanboys who are infatuated with him. There are better options on Udemy. Anyone who says this course is good is blind, because this course is garbage. It's not worth my precious time with this crap, but thanks for bringing it up anyway, at least it prevents people from being tricked into buying this crap from this scammer.
hazartilirot
george
Talking of quality what do you mean? Could you be more specific. He uses a decent microphone recording his video in full hd, his pronunciation is quite legible, he uses background when he appears in a flesh, he provides slides and documentations. He refers to the official docs. He wants to encompass the whole range of technologies. It is not about Spring Boot in particular.
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.
idk name
george
why??
hazartilirot
LESSON 200 (IT MIGHT BE CHANGED IN THE FUTURE)
Configuring Jib plugin - the issue with mvn clean package
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)
);
Lesson 116 - I have found it and it's much easier than the fuss you suggest with the RowMapper! Just use new BeanPropertyRowMapper(Customer.class) - and Bob's your uncle! :D
@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();
}
hazartilirot
Lesson 113 - OMG!
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.
hazartilirot
?lesson=88
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.
barneymorris.us
hazartilirot
hi, can i contact you somehow directly?
hazartilirot
barneymorris.us
Find me on Telegram. I use the same. nickname Don't forget to place AT before it.
zapolski.shop
hazartilirot
i agree with you. Can you give a correct implementation?
hazartilirot
zapolski.shop
Oh Christ! I've just realised I should've implemented Model Mapper for Dto to map an Entity and vice versa,.
hazartilirot
zapolski.shop
As simple as that:
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.
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);
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.
Anonymous
Omg nigger teacher wtf
hazartilirot
Anonymous
Mate, I've just passed the 67th lesson, the video is called Outro. Basically he appears in the episode and says that you can suck his black dick and lick his balls with your tongue. He told something about your white arse. He's going to smash your bitch up or something alike. Unfortunately I couldn't make it out. Anyway I was the first who watched it, I pay my debts. I have passed the information. Prepare yourself for the duty! :D
Anonymous
hazartilirot
Wow wow untermensch, stay with your degenerated fantasies silent, now.
Amstel
Anonymous
What a cretin, dumbstard
oops
Anonymous
it's 2023, and people like you still exists(
Amstel
oops
Not his fault. His brain is operating on Pentium II bro.
Anonymous
Amstel
Lol, like niggers brain?
Anonymous
oops
Google iq lefty,
alex.pham2010
good course
Команда внимательно читает ваши комментарии и оперативно на них реагирует. Вы можете спокойно оставлять запросы на обновления или задавать любые вопросы о курсе здесь.
Если вы когда-нибудь задумывались о том, что значит поднять сервер или что означают все эти непонятные термины, такие как «балансировщик нагрузки» или «обратный прокси», этот курс для вас. От понимания различных типов баз данных до защиты вашего веб-сервера - Джем Янг научит вас навыкам, необходимым для работы в стеке. Этот курс преподается с точки зрения инженера по интерфейсу и дает инструменты и знания для создания рабо
Лучший способ научиться — это что-то построить. Следуйте инструкциям и создайте приложение с нуля. От технического задания до развертывания. Использование React, Node.js, Typescript, Postgres.
Лучший способ научиться - что-то построить. Следуйте инструкциям и создайте клон Spotify с нуля. От спецификации проекта до развертывания. Использование React, Node.js, Typescript и Postgres.
Добро пожаловать на самый полный курс Java от Amigoscode! Он включает в себя все, что вам нужно для полного понимания Java, правильного написания кода и создания собственных приложений. Ранее в этом году я больше года преподавал Java Bootcamp в Лондоне. Тогда меня осенила идея: почему бы не донести всю эту ценность до сообщества Amigoscode в виде мастер-класса? Благодаря шести месяцам подготовки и потрясающим усилиям команды Amigoscode, я рад соо
Краткий курс: Создание веб-приложения Full-Stack за выходные!
Crash Course: Build a Full-Stack Web App in a Weekend!
Хотите быстро изучить основы современной веб-разработки? Хотите узнать, подходит ли создание веб-сайтов и приложений в качестве карьерного пути для вас? Или может быть, вы просто хотите узнать, чем занимаются ваши друзья-веб-разработчики весь день? В любом из этих случаев... Добро пожаловать на мой курс по краткосрочному обучению веб-разработке! Вместе мы создадим за несколько дней веселое, небольшое, но полноценное веб-приложение.
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.