Урок 1.00:12:10
2.0 - Creating a code directory and a git repo
Урок 2.00:13:13
2.1 - A basic web application
Урок 3.00:10:03
2.1 [ASIDE] - What is a web request?
Урок 4.00:09:15
2.2 - Explaining our web application in detail
Урок 5.00:10:33
2.3 - Dynamic reloading
Урок 6.00:08:03
3.1 - Setting the Content-Type header
Урок 7.00:08:27
3.2 - Adding a contact page
Урок 8.00:07:35
3.3 - Adding a 404 page
Урок 9.00:15:20
3.4 - net/http's ServeMux
Урок 10.00:07:48
3.5 - github.com/julienschmidt's httprouter
Урок 11.00:07:07
3.6 - Gorilla Web Toolkit's mux package
Урок 12.00:09:57
3.7 - Implementing the gorilla/mux router
Урок 13.00:07:11
3.Ex0 - Exercises overview
Урок 14.00:05:35
3.Ex1 - Adding an FAQ page
Урок 15.00:05:25
3.Ex2 - Adding a 404 page
Урок 16.00:07:44
3.Ex3 - Using httprouter
Урок 17.00:07:22
4.0 - What are templates?
Урок 18.00:14:51
4.1 - Our first HTML template
Урок 19.00:07:24
4.2 - Code injection and contextual encoding
Урок 20.00:03:34
4.Ex0 - Exercises overview
Урок 21.00:03:12
4.Ex1 - Rendering a custom field
Урок 22.00:06:03
4.Ex2 - Rendering additional data attributes
Урок 23.00:04:09
4.Ex3 - Rendering with nested structures
Урок 24.00:02:58
5.0 - Intro to the MVC videos
Урок 25.00:13:17
5.1 - What is MVC?
Урок 26.00:05:59
5.2 - Walking through a web request with MVC
Урок 27.00:06:36
5.Ex0 - Exercises
Урок 28.00:11:58
6.0 - Creating our first view
Урок 29.00:05:49
6.1 - Creating the contact view
Урок 30.00:08:44
6.2 - Named and nested templates
Урок 31.00:08:39
6.3 - Creating the View type
Урок 32.00:12:31
6.4 - Using the View type
Урок 33.00:25:13
6.5 - Creating a Bootstrap layout
Урок 34.00:12:46
6.6 - Adding a navigation bar
Урок 35.00:17:04
6.7 - Cleaning up our code by globbing template files
Урок 36.00:09:51
6.8 - Simplifying our view rendering logic
Урок 37.00:03:50
6.9 - Moving our footer to the bootstrap layout
Урок 38.00:04:43
6.10 - Summary
Урок 39.00:13:37
7.0 - Creating the signup page
Урок 40.00:13:56
7.1 - Wrapping the signup form in a bootstrap panel
Урок 41.00:03:30
7.2 - Adding a signup link to the navbar
Урок 42.00:14:19
7.3 - An introduction to REST
Урок 43.00:29:05
7.4 - Creating our first controller - the users controller
Урок 44.00:22:39
7.5 - CRUD, HTTP verbs with Gorilla mux, and the create action
Урок 45.00:13:05
7.6 - Parsing the signup form (parsing POST forms)
Урок 46.00:19:56
7.7 - Parsing forms with gorilla schema
Урок 47.00:14:27
7.8 - DRYing up our form parsing code
Урок 48.00:15:24
7.9 - Creating a controller for our mostly static pages
Урок 49.00:13:31
7.10 - Making views easier to create
Урок 50.00:05:05
8.0 - What does it mean to persist data?
Урок 51.00:07:50
8.1 - Web applications use databases to persist data
Урок 52.00:03:08
8.2 - We will be using PostgreSQL
Урок 53.00:06:09
8.3 - SQL has many great educational resources
Урок 54.00:04:38
8.4 - Postgres is scalable and relatively easy to use
Урок 55.00:07:37
8.5 - Setting up and connecting to Postgres
Урок 56.00:07:16
8.6 - SQL basics and creating tables to interact with
Урок 57.00:18:24
8.7 - Connecting to our database with Go's sql package
Урок 58.00:15:52
8.8 - Writing records to our database with Go's sql package
Урок 59.00:12:59
8.9 - Querying for records with Go's sql package
Урок 60.00:15:31
8.10 - Handling relational data with Go's sql package
Урок 61.00:08:27
8.11 - Setting up GORM
Урок 62.00:14:19
8.12 - Creating our first model with GORM
Урок 63.00:13:35
8.13 - Creating records and logging with GORM
Урок 64.00:16:42
8.14 - Querying records with GORM
Урок 65.00:12:18
8.15 - Error handling with GORM
Урок 66.00:11:15
8.16 - Relational data with GORM
Урок 67.00:09:27
9.1 - Creating the User model
Урок 68.00:19:10
9.2 - Creating the UserService
Урок 69.00:07:22
9.3 - The create user method
Урок 70.00:16:12
9.4 - What does a model test look like?
Урок 71.00:26:11
9.5 - Finishing the UserService implementation
Урок 72.00:25:02
9.6 - Connecting models and controllers
Урок 73.00:14:20
10.0 - An intro to building an auth system
Урок 74.00:13:37
10.1 - Store hashes, not passwords
Урок 75.00:10:40
10.2 - Implementing bcrypt hashing
Урок 76.00:05:27
10.3 - Using passwords from the signup form
Урок 77.00:14:28
10.4 - Salt and pepper
Урок 78.00:14:00
10.5 - Creating the login form
Урок 79.00:17:55
10.6 - Authenticating users
Урок 80.00:19:41
11.0 - Remembering users and creating our first cookie
Урок 81.00:05:44
11.1 - Viewing cookies via code
Урок 82.00:09:04
11.2 - Creating cookies on login and signup
Урок 83.00:19:42
11.3 - Securing our cookies from tampering
Урок 84.00:13:09
11.4 - Generating remember tokens
Урок 85.00:07:29
11.4 [ASIDE] - Why 32 bytes?
Урок 86.00:16:28
11.5 - Writing a remember token hasher
Урок 87.00:19:29
11.6 - Hashing remember tokens on user creation and update
Урок 88.00:15:10
11.7 - Storing remember tokens in cookies
Урок 89.00:07:33
11.8 - Securing our cookies from XSS
Урок 90.00:10:50
11.9 - Securing our cookies from theft and CSRF
Урок 91.00:14:03
12.0 - Validating and normalizing
Урок 92.00:08:41
12.1 - Static types vs interfaces
Урок 93.00:11:43
12.1 [ASIDE] - Emebedding, interfaces, and chaining
Урок 94.00:18:11
12.2 - The UserDB interface
Урок 95.00:17:55
12.3 - The UserService interface
Урок 96.00:21:46
12.4.0 - Organizing validation code
Урок 97.00:07:04
12.4.1 - Remember token normalizer
Урок 98.00:04:31
12.4.2 - Ensuring remember tokens are set on create
Урок 99.00:06:59
12.4.3 - Ensuring a valid ID on delete
Урок 100.00:09:45
12.5.0 - Converting emails to lowercase and trimming whitespace
Урок 101.00:04:11
12.5.1 - Requiring email addresses
Урок 102.00:16:28
12.5.2 - Verifying emails match a pattern
Урок 103.00:10:09
12.5.3 - Verifying an email address isn't taken
Урок 104.00:15:12
12.6 - Validating and normalizing passwords
Урок 105.00:12:41
12.7 - Validating and normalizing remember tokens
Урок 106.00:06:08
13.1 - Bootstrap alerts
Урок 107.00:05:19
13.2 - Dynamic alerts
Урок 108.00:05:09
13.3 - Only show alerts when necessary
Урок 109.00:10:25
13.4 - Creating the views.Data type
Урок 110.00:13:11
13.5 - Handling signup errors
Урок 111.00:18:02
13.6 - Only display public errors
Урок 112.00:09:45
13.7 - Handling login errors
Урок 113.00:11:42
13.8 - Handling rendering errors
Урок 114.00:04:36
14.0 - Intro to the gallery chapter
Урок 115.00:07:31
14.1 - The gallery model
Урок 116.00:07:49
14.2 - Sharing a GORM connection and the GalleryService
Урок 117.00:06:12
14.3 - Utilizing our shared GORM connection (the Services type)
Урок 118.00:07:47
14.4 - Moving close to the Services type
Урок 119.00:05:55
14.5 - Implementing the GalleryService
Урок 120.00:09:35
14.6 - Creating the galleries controller
Урок 121.00:06:26
14.7 - Implementing the Gallery create action
Урок 122.00:15:23
14.8 - Gallery validators and normalizers
Урок 123.00:20:13
14.9 - Requiring users to be logged in to view specific pages
Урок 124.00:15:57
14.10 - Adding users to the request context
Урок 125.00:35:59
14.11 - Rendering individual galleries
Урок 126.00:13:39
14.12 - Galleries edit action
Урок 127.00:06:35
14.13 - Galleries update action
Урок 128.00:05:21
14.14 - GalleryService update method
Урок 129.00:13:01
14.15 - Gallery delete action
Урок 130.00:22:26
14.16 - Gallery index action
Урок 131.00:35:12
14.17 - Navbar updates
Урок 132.00:25:23
15.1 - File upload HTML form
Урок 133.00:24:49
15.2 - File upload handler
Урок 134.00:18:50
15.3 - The ImageService and create method
Урок 135.00:16:04
15.4 - Finding images by Gallery ID
Урок 136.00:21:58
15.5 - Rendering images
Урок 137.00:32:52
15.6 - Deleting images
Урок 138.00:19:51
16.1 - Error cleanup
Урок 139.00:07:59
16.2 - Serving static assets
Урок 140.00:26:13
16.3 - CSRF protection
Урок 141.00:06:36
16.4 - Don't lookup the user when serving static assets
Урок 142.00:07:46
16.5 - URL encoding image path bug
Урок 143.00:23:06
16.6 - Starting with config variables
Урок 144.00:21:55
16.7 - Functional options for services
Урок 145.00:15:54
16.8 - Loading a JSON config
Урок 146.00:06:29
16.9 - Setting up a droplet (server) on Digital Ocean
Урок 147.00:07:53
16.10 - Installing postgres on our prod server
Урок 148.00:13:36
16.11 - Caddy server
Урок 149.00:32:28
16.12 - Deploy script
Урок 150.00:13:40
17.1 - Deleting cookies and logging out users
Урок 151.00:18:10
17.2 - Redirecting with alerts
Урок 152.00:34:29
17.3 - Emailing users
Урок 153.00:12:26
17.4 - Persisting form data
Урок 154.00:29:17
17.5.1 - Resetting passwords - Creating the pwReset DB table
Урок 155.00:24:30
17.5.2 - Resetting passwords - Implementing UserService methods
Урок 156.00:05:08
17.5.3 - Resetting passwords - Form HTML templates
Урок 157.00:20:59
17.5.4 - Resetting passwords - Controller updates
Урок 158.00:21:04
17.5.5 - Resetting passwords - Sending emails and building links
Урок 159.00:06:34
18.1 - Intro to OAuth
Урок 160.00:13:07
18.2 - Setting up a Dropbox Application
Урок 161.00:09:16
18.3 - Go's OAuth2 Package
Урок 162.00:16:28
18.4 - Dropbox OAuth Spike (Part 1)
Урок 163.00:11:59
18.5 - Dropbox OAuth Spike (Part 2)
Урок 164.00:09:22
18.6.1 - Persisting OAuth Tokens - Explaining the Token
Урок 165.00:35:46
18.6.2 - Persisting OAuth Tokens - OAuth Model
Урок 166.00:13:17
18.6.3 - Persisting OAuth Tokens - Connecting It All
Урок 167.00:17:51
18.7 - Making Dropbox API Calls
Урок 168.00:09:29
18.8 - Refactoring to Controllers
Урок 169.00:12:23
18.9 - Generic OAuth Controller
Урок 170.00:20:08
19.1 - Intro to the Dropbox SDK
Урок 171.00:15:20
19.2 - Custom Dropbox Package
Урок 172.00:54:28
19.3 - Dropbox Chooser
Урок 173.00:33:53
Mark Bates - Go Buffalo
Урок 174.00:35:15
Joe Fitzgerald & Zac Bergquist - Atom + Go
Урок 175.00:27:18
Matt Holt - Caddy & Securing your Server
Урок 176.00:35:24
Michael Hartl - Learning Just Enough
Урок 177.00:28:35
Ryan Patterson - Technical Interviews
Урок 178.00:42:36
Mattan Griffel - Learning to Code
Урок 179.00:41:20
Charlie Guo - Doing the Unscalable
Урок 180.00:42:58
Ryan Jackson - Starting a Tech Company
Урок 181.00:40:05
Adam Wathan - Testing and More
https://coursehunter.net/course/veb-razrabotka-s-go-obnovlenie-2022
p.s. Ah, no! In the same lesson is just a bit further at 7:30, there is also an adorable moment.
We call Public() function on an object of modelError type. How the hell does he get a message with a privateError type in a dismissive component of Alert if func (d *Data) SetAlert(err error) in data.go - must return A GENERIC MESSAGE of AlertMsgGeneric = "Something went wrong, please try again or contact us if the problem persists"
Bloody idiot...