Quiz - Data in Microservices
Sync Communication Between Services
Event-Based Communication
A Crazy Way of Storing Data
Pros and Cons of Async Communication
Important - Optional Boilerplate
Testing the Posts Service
Implementing a Comments Service
Addressing Default Export and ReactDom.render Warnings
Fetching and Rendering Posts
Request Minimization Strategies
Common Questions Around Async Events
Important Note about Node v15 and Unhandled Promise Rejections
A Basic Event Bus Implementation
Emitting Comment Creation Events
Creating the Data Query Service
Issues with Comment Filtering
How to Handle Resource Updates
Creating the Moderation Service
Adding Comment Moderation
Reminder about Node v15 and Error Catching
Rendering Comments by Status
Dealing with Missing Events
Required Node v15+ Update for Query Service
Warning on Docker Desktop for Linux
IMPORTANT Note for Minikube and MicroK8s Users
Important Kubernetes Terminology
ErrImagePull ErrImageNeverPull and ImagePullBackoff Errors
Common Commands Around Deployments
Preferred Method for Updating Deployments
Creating a NodePort Service
Accessing NodePort Services
Setting Up Cluster IP Services
Building a Deployment for the Event Bus
Adding ClusterIP Services
How to Communicate Between Services
Updating Service Addresses
Adding Query Moderation and Comments
Load Balancers and Ingress
Important - DO NOT SKIP - Ingress Nginx Installation Info
Ingress v1 API Required Update + pathType Warning
Writing Ingress Config Files
Important Note About Port 80
Important Note to Add Environment Variable
Skaffold API version Update
First Time Skaffold Startup
Note on Remote Development
Free Google Cloud Credits
Google Cloud Initial Setup
Kubernetes Cluster Creation
Initializing the GCloud SDK
Installing the GCloud Context
Updating the Skaffold Config
Handling Validation Errors
Surprising Complexity Around Errors
Solution for Error Handling
Building an Error Handling Middleware
Communicating More Info to the Error Handler
Encoding More Information In an Error
Subclassing for Custom Errors
Property 'param' does not exist on type 'AlternativeValidationError'
Converting Errors to Responses
serializeErrors' not assignable to the same property in base type 'CustomError'
Verifying Our Custom Errors
How to Define New Custom Errors
Uh Oh... Async Error Handling
Creating Databases in Kubernetes
Understanding the Signup Flow
Getting TypeScript and Mongoose to Cooperate
Type Checking User Properties
Adding Static Properties to a Model
Defining Extra Document Properties
What's That Angle Bracket For?
Reminder on Password Hashing
Comparing Hashed Password
Fundamental Authentication Strategies
Huge Issues with Authentication Strategies
Solving Issues with Option #2
Reminder on Cookies vs JWT's
Microservices Auth Requirements
Issues with JWT's and Server Side Rendering
Securely Storing Secrets with Kubernetes
Creating and Accessing Secrets
Accessing Env Variables in a Pod
Common Response Properties
Formatting JSON Properties
Common Request Validation Middleware
Returning the Current User
Creating a Current User Middleware
Augmenting Type Definitions
Requiring Auth for Route Access
Replacing --only=prod Install Flag
Required MongoMemoryServer Updates
Changing Node Env During Tests
Tests Around Sign In Functionality
Issues with Cookies During Testing
globalThis has no index signature TS Error
Testing Non-Authed Requests
Reminder on Server Side Rendering
Suggestion Regarding a Default Export Warning
Running Next in Kubernetes
Small Update for Custom Webpack Config
Note on File Change Detection
Handling Email and Password Inputs
Successful Account Signup
Handling Validation Errors
Using the useRequest Hook
Overview on Server Side Rendering
A note about ECONNREFUSED errors
Cross Namespace Service Communication
When is GetInitialProps Called?
On the Server or the Browser
Ingress-Nginx Namespace and Service - Important Update
Passing Through the Cookies
Content on the Landing Page
Issues with Custom App GetInitialProps
Handling Multiple GetInitialProps
Error: Invalid <Link> with <a> child
Conditionally Showing Links
React App Catchup & Checkpoint
Ticketing Service Overview
Running the Ticket Service
Faking Authentication During Tests
A Required Session Fix and a Global Signin Reminder
Testing Request Validation
Validating Title and Price
Reminder on Mongoose with TypeScript
Defining the Ticket Model
Creation via Route Handler
Complete Index Route Implementation
NATS Server Status - IMPORTANT NOTE
Creating a NATS Streaming Deployment
Big Notes on NATS Streaming
Building a NATS Test Project
Port-Forwarding with Kubectl
Small Required Command Change
[Optional] More Possible Concurrency Solutions
Solving Concurrency Issues
Concurrency Control with the Tickets App
The Listener Abstract Class
Leveraging TypeScript for Listener Validation
Enforcing Listener Subjects
Quick Note: 'readonly' in Typescript
Where Does this Get Used?
Using the Custom Publisher
Awaiting Event Publication
Common Event Definitions Summary
Updating the Common Module
Publishing Ticket Creation
Node Nats Streaming Installation
TS Error - Did you forget to include 'void' in your type argument
Accessing the NATS Client
Handling Publish Failures
Providing a Mock Implementation
Ensuring Mock Invocations
Scaffolding the Orders Service
Scaffolding a Few Route Handlers
Associating Orders and Tickets
Creating an Order Status Enum
Defining the Ticket Model
Convenience Document Methods
globalThis has no index signature TS Error
Small Update for "Value of type 'typeof ObjectId' is not callable"
Asserting Reserved Tickets
A Slightly Complicated Test
Fetching Individual Orders
Heads Up Regarding Some Mongoose TS Errors
Simple onMessage Implementation
Ticket Updated Listener Implementation
Initializing the Listeners
Reminder on Versioning Records
Optimistic Concurrency Control
Mongoose Update-If-Current
Implementing OCC with Mongoose
Test functions cannot both take a 'done' callback and return something Error
Including Versions in Events
Updating Tickets Event Definitions
Property 'version' is missing TS Errors After Running Skaffold
[Optional] Versioning Without Update-If-Current
Testing the Ticket Updated Listener
Listeners in the Tickets Service
Strategies for Locking a Ticket
Setup for Testing Reservation
Private vs Protected Properties
Publishing While Listening
Rejecting Edits of Reserved Tickets
Skaffold errors - Expiration Image Can't be Pulled
A Touch of Kubernetes Setup
Queueing a Job on Event Arrival
Defining the Expiration Complete Event
Publishing an Event on Job Processing
Handling an Expiration Event
Emitting the Order Cancelled Event
Testing the Expiration Complete Listener
globalThis has no index signature TS Error
Marking an Order as Cancelled
Payments Flow with Stripe
Implementing the Create Charge Handler
Testing Order Validation Before Payment
Testing Same-User Validation
Creating a Charge with Stripe
Manual Testing of Payments
Automated Payment Testing
A More Realistic Test Setup
Realistic Test Implementation
Tying an Order and Charge Together
Publishing a Payment Created Event
Marking an Order as Complete
Important Info About the Next Lecture - Don't Skip
Don't Cancel Completed Orders!
Reminder on Data Fetching with Next
Reminder on Invalid <Link> with <a> child Errors
Linking to Wildcard Routes
Programmatic Navigation to Wildcard Routes
Displaying the Expiration
Showing a Stripe Payment Form
Module not found: Can't resolve 'prop-types'
Filtering Reserved Tickets
Rendering a List of Orders
Git Repository Approaches
Tests in GitHub Actions Hang - Jest did not exit
Running Tests on PR Creation
Running Tests in Parallel
Creating a Hosted Cluster
Reminder on Kubernetes Context
Reminder on Swapping Contexts
Building an Image in an Action
Restarting the Deployment
Applying Kubernetes Manifests
Prod vs Dev Manifest Files
Don't Forget Ingress-Nginx!
Testing Automated Deployment
Three Important Changes Needed to Deploy - Do Not Skip!
Configuring the Domain Name
Finished Code and Diagrams
Installing Docker on macOS
Installing Docker with WSL2 on Windows 10/11
Installing Docker on Linux
But Really... What's a Container?
How's Docker Running on Your Computer?
Overriding Default Commands
Listing Running Containers
Restarting Stopped Containers
Removing Stopped Containers
Executing Commands in Running Containers
The Purpose of the 'it' Flag
Getting a Command Prompt in a Container
Buildkit for Docker Desktop
The Build Process in Detail
Quick Note for Windows Users
Manual Image Generation with Docker Commit
Required Node Base Image Version
Container Port Forwarding
Specifying a Working Directory
Minimizing Cache Busting and Rebuilds
Important Axios Version Information
Executing Typescript Code
Catching Errors with TypeScript
Do Not Skip - Course Overview
Type Annotations and Inference
Annotations With Variables
Object Literal Annotations
Annotations Around Functions
When Inference Doesn't Work
More on Annotations Around Functions
Inference Around Functions
Annotations for Anonymous Functions
Destructuring with Annotations
Annotations Around Objects
Multiple Typees in Arrays
Fixing Annotations With Interfaces
Code Reuse with Interfaces
General Plan with Interfaces
Updated Parcel Instructions
IMPORTANT Info About Faker Installation
Using Type Definition Files
Export Statements in TypeScript
Important Note About Google Maps Key
Adding Google Maps Support
Required Update for New @types Library
Google Maps Integration with TypeScript
Exploring Type Definition Files
Why Use Private Modifiers? Here's Why
Restricting Access with Interfaces
Updating Interface Definitions
Optional Implements Clauses