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