Unread Notifications

Latest Notifications

No Notifications

You're all set! Start a discussion by leaving a comment on a lesson or replying to an existing comment.

Let's Build with AdonisJS

Rebuilding Jagr.Co, Start & Auth

1:49:54 Watch
54:47 Read

In this livestream we create a new project, install and configure the Lucid and Auth packages. Define our migrations and model schema. And hammer down basic authentication.

Watch on YouTube

Join me live as I begin rebuilding Jagr.Co with AdonisJS. In this livestream we create a new project, install and configure the Lucid and Auth packages. Define our migrations and model schema. And hammer down basic authentication. We also add TailwindCSS to our project using Webpack Encore.

Transcript

Looking for something specific? Feel free to search the page for keywords to find a specific portion of the live stream that interests you most.

0:51

okay so um yeah so i thought i'd just uh live stream some actual building stuff

0:56

so i thought as a beginner point i'd start rebuilding uh yeager.co

1:02

where all of my lessons live so here i did a bad job i didn't resize

1:08

that to the screen properly do that real quick

1:14

okay there we go um so essentially it's got a home page with all of the posts and stuff listed

1:21

on it then you go into a post and there's two different versions so

1:26

there's the post not in a series which would be like this one where the video gets more screen real estate

1:33

and then there is the version where it is within a series where then the series bar is over on the

1:40

right hand side and the video gets smaller um then there's a whole back end side to it

1:46

as well so here if i log in really quick

1:56

so you get the whole crud side as well where all of the posts are managed all of the series are managed topics

2:04

uh comments so all that fun stuff let me turn my

2:09

pc's sound off

2:14

so so yeah i thought it'd uh be a good starting point to just start

2:21

building this back out i it this current site is built in adonis

2:26

but i used it as my adonis playground so it's got kind of a messy code base

2:31

where i was just trying different stuff out so it could use a good rebuild um so i'm going to go ahead and

2:38

node npm and net adonis ts app at latest

2:45

jager dot co do the web version

2:55

all right give that a second to install all of the dependencies

3:23

this is the first time i'm installing an adonis apple creating an adonis application on this pc so it might take

3:29

a little bit longer than usual as well

3:37

okay there we go

3:44

let's go ahead and get that opened up

3:55

all right and so i'm going to go ahead and install all of the things that i know i need at

4:01

least out of the bat uh so we'll do mpmi js

4:08

off wait a minute oh lucid first npm i at adonis js

4:14

lucid there we go

4:19

node ace configure adonis

4:25

js lucid so the current code base is on my sql i'm going to be transitioning over

4:32

to postgres so i will copy the postgres

4:40

variable definitions and go into my env.ts and paste that in um anytime i'm adding

4:47

an additional module i kind of like to separate them by so these are the defaults and then i'll give them a separation by space and then

4:53

i'll do like the auth and then i'll do drive and all that fun stuff so i'll separate them out

4:58

using a space so that they're a little bit easier to group that way all right so that should be good um

5:07

let's go ahead and do off next so npm i don't js off

5:16

okay configure

5:22

js off i will use lucid i will use web

5:30

model name will be user yes please create the migration for that

5:36

okay so now we should have database migration users and we should have app

5:43

models user as well

5:54

all right so next i guess let's go ahead and start

6:00

hammering out all of the fun models and migrations

6:07

um let's see

6:16

don't quite remember off the top of my head what the schema is for it so i will go into the current code base and take a

6:22

look at least as a starting point

6:29

so let's see we got roles users posts topics assets

6:35

all that fun stuff so let's just start hammering some of this stuff out

6:42

so let's do node ace

6:49

make migration or no make model

7:13

there we go did it in the wrong order node ace make

7:19

model see we already have users so we'll do post next

7:25

on a model and a controller for that one

7:32

and then we'll do topic do a model and controller for that one as well

7:42

then we got the post topic tables so let's do just a migration for that one

7:56

post topics now that is the table that should work

8:03

okay nowadays make model

8:08

asset do a model on the migration or yeah i don't wanna control her for that

8:15

and then we got post authors profiles appearances i don't know if i'm

8:22

gonna do appearances and all that stuff uh let's see node ace

8:27

model

8:34

let's just do a migration for the post authors

8:56

all right i'll skip over appearances for right now um and then we got post histories so i track history changes on

9:02

that on post changes so we'll do that as well i suppose

9:08

and that one just needs to be a miguel let's do a model for that one too

9:16

post history we don't need a controller for it

9:21

since that'll save along with any post saves as well so we'll just do a model and a migration for that one

9:31

then we got series so maybe right here is a good spot to stop we have posts we have users

9:40

and we'll just start rigging those up instead of hammering through all of them

9:48

so we should have asset post post history profile role topic user

9:54

all right so i actually want roles to be created

10:00

first so i'm going to rename that and tell you what i'll just copy the user's

10:06

timestamp and offset it by negative one

10:15

because i'm gonna have a role id on my user and i'm going to have a

10:23

foreign key attaching them so the rules table will want to be created first so the role will just be i think if i

10:31

remember correctly um that is just a name

10:38

oh i gave it a description too okay we'll follow suit with that

10:43

so table string name 50

10:49

table okay so that one should be good and then

10:54

users in addition to all of this stuff we will also do i like to do my form key

11:02

assignments first so we'll do table dot integer role id unsigned

11:09

not nullable let's see that references

11:16

id in table rows i don't want the cascade

11:23

and we'll make that not nullable and then we'll also default to one for

11:29

that see posts

11:34

well anything else for the user i guess

11:45

username and then i also put deleted on deleted that on there as well so

11:51

okay just do username for right now

12:01

okay so users should be good roles should be good let's move on to posts next

12:14

all right i am just going to copy all of this

12:22

everything except for the deleted ad and let's just paste that in there

12:30

uh did i copy created that and updated that no okay

12:36

so give that a save okay topics

12:44

i believe yeah let me just copy that as well

12:55

uh i don't know if i want a user id on it this time we'll leave it there it won't hurt

13:01

anything

13:13

all right and then we have our create post topics table which binds our post to a topic

13:21

so that looks correct still i don't want to change anything there so i will keep these columns as well

13:32

um let's actually put foreign keys on them so unsigned

13:37

references id in table posts

13:46

and dot references id in table

13:53

topics okay so that should be good for that one and

13:59

then we have the assets um you might be able to stop

14:04

there for right well then we get down to the post author so we'll go ahead and do these two i guess

14:10

okay so all of this should remain the same i

14:17

don't want to change anything there um and then i define the asset type as an enum outside of the database so that

14:24

won't reference any foreign key or anything like that so that should be a-okay

14:30

and then we have the create post assets tables which binds a post to an asset nothing's going to change there

14:37

pretty simplistic table so and oh did i not create that

14:45

migration

14:51

doesn't look like i did okay well all that needs is a migration so i'm

14:57

just going to copy the assets migration and paste that in

15:03

and then just to make sure that it runs after the assets tables created i'm going to increment

15:08

how did i copy oh i copied the wrong table my bad

15:14

all right yep be gone with it copy assets

15:20

and paste as it there we go okay now i have two copies of that all

15:26

right it's early in the morning for me i'm sorry if i'm not making too much sense

15:32

okay so let's see so instead of just assets here let's increment the timestamp

15:38

by one so that this gets created after and then i also meant to change the name from just assets to asset

15:46

uh posts is that what it was binding to so it was

15:51

looking at yes okay

16:01

hey how's it going um yes it should be i think youtube automatically saves

16:06

streams so it should be saved

16:13

i don't think i'm recording it so it should but it youtube should save it

16:21

all right and then instead of all that fun stuff we want the post id and the asset id

16:28

then we also want a foreign key there so references id in table

16:34

posts and references id

16:39

in table asset id

16:48

give that a save and then we're on to profiles and post

16:53

history so

16:59

post authors

17:12

did i not create a post authors i post histories

17:17

skip over that one too okay well all that one needs is a migration as well and that one can be anywhere so i'm

17:22

going to go ahead and just make a new migration for that

17:31

i thought i made it though yes that's profiles posted nope okay

17:38

what was it create post assets table all right so

17:44

post assets no i just made that i'm looking at the wrong one

17:52

post authors oh okay right and i didn't make that

17:59

post topics asset posts post histories okay

18:08

author posts all right well now that one's created so

18:14

i'll go in the order that they are up here on github so i don't get lost like that hopefully again

18:21

all right everything there will remain the same again author type id is just an enum

18:27

outside of the database so no foreign key on that one

18:33

but we will put it on the post and user so references id and table

18:41

posts and references id

18:47

and table users okay and then i think

18:54

profiles was next maybe yes

19:00

all right all that fun stuff should still be applicable i think

19:08

doesn't hurt to have it

19:17

and then the avatar asset id is going to

19:27

be in id and table

19:32

assets sorry about my chair it's a really old

19:38

chair so if it comes through sorry about that

19:47

you always wonder how it can work on a white ide um yeah i so i tend to record on a dark one

19:54

just because i know most people prefer that but yeah i actually really like a light ide it's

20:00

i don't know it's easier on my eyes for some reason more contrast maybe i don't know

20:11

um let's see and then i skipped appearances and went with post histories

20:17

so this is pretty much just a direct copy of the post table with just all of the

20:23

important stuff that would need to be captured so

20:29

an alternative name for this could have been post snapshots um in hindsight that probably would be

20:35

better so maybe i will just change the name of that

20:42

since we're rebuilding now would be a good time to go ahead and make that change

20:54

okay and then post id we're going to want a forall key on that so

21:02

that should now be good

21:10

um i'm gonna go ahead and tack on a used tz on that time stamp

21:21

or not let me give me here

21:30

okay okay well

21:36

just do without it for right now it's no big deal

21:41

and then author posts i think i skipped over that one didn't i

21:46

or no i already did that when i went back to it yes okay

21:54

so now we should be good to go ahead and jump this stuff over into the models

22:01

so i like to go in the order of my migrations and then just kind of follow through with whatever is in the model so

22:08

here we have roles which has a name and description both of type string

22:15

so we'll do column public name string

22:21

column public description string

22:26

and then we have users most of this should be taken care of thanks to lucid so we should just need

22:32

to add the role id of number and the username of string

22:41

so we'll do act column public

22:47

username string and i should have done world id first so column

22:52

public role id of number

23:01

okay should be good on the users now so now we've got to do the post and

23:10

computer keeps going to sleep sorry what i like to do whenever i have a lot

23:16

of columns to copy over into a migration is i just copy all of the migrations

23:22

that lucid doesn't automatically add for me so like the id and they created an updated app

23:28

and i like to paste that directly into the model

23:37

and then use multi-line to just clean that up a little bit so

23:42

what i'll do is i will copy the type

23:48

remove everything beforehand take the public cut everything after the name and then i

23:53

will just paste in the type and for the most part it's pretty accurate so you can see string is

23:59

good um and then you pretty much just got to take care of these so body is of type string

24:05

integer changes to number

24:12

number and timestamp changes to date time

24:19

and then all we have to do is add on the column decorator to these so

24:24

get all of them again at column if i can spell column right there we go

24:30

and then go down one to the end of the line and hit enter again to get your spacing so

24:35

just a little quick cheat for that and then um i don't have it on this computer but there is an

24:42

extension called camel case

24:47

change case maybe

24:53

yeah i think this is a change case that you can install so let me go ahead

24:58

and just undo a couple of steps here okay and then what we can do is

25:03

highlight all of these and use that extension to change

25:09

to camelcase there we go all right and then we'll just reapply

25:15

oh put the enter in the wrong spot big column and voila

25:20

so now we have our model ready and we just need to change the types that

25:26

need additional decorating so that should just be this publish up

25:32

so date time and it's not going to auto create or auto update so we can just leave it at that

25:38

get rid of that extra space okay

25:43

let's see so that was posts so then we got topics so that one is just a user id

25:49

a name and a slug so topic topic topic there it is

25:56

column public i'm blanking user id name and select okay

26:02

user id of type number column

26:08

public name of type string and column public

26:14

slug of type string and then post topics is a intermediary

26:21

table so we don't need to do anything with that and then we have assets

26:27

well actually we could go ahead and just add in the relationship while we're at this point

26:32

um now we'll go back through afterwards and add in relationships so let's go to assets

26:38

and i have a feeling i'm getting to blank and not be able to remember five so i'm just going to copy and paste these in

26:53

and then

27:01

public get rid of that oh i forgot to check for the nullable not nullable

27:07

i'll go back through i'll go back through and do that that's no biggie

27:16

camel castle put the space in the wrong spot

27:25

and then we got a number there which will actually change to an enum

27:31

once we get the enums in here and then the byte size will be a number as well

27:38

so we can save that

27:50

uh yeah they should be i didn't check anything to make sure that it would be but i'm pretty sure youtube auto makes

27:57

the stream available afterward um so we should be good there

28:04

hey roman thanks for stopping by everybody um

28:10

so let's see where did i leave off here we got the assets yes so then we have asset post which is a

28:16

menu to many which we'll circle back to and then we have the profiles so again we got a lot of columns here so

28:22

i'm just going to copy it go into the profile model paste these guys in

28:30

and work to clean it up so we have the types

28:38

prefix that with public get rid of everything after drop the type on there which we'll fix

28:43

here in a second at column hit enter

28:49

and user id be up i forgot the camel case go back

28:54

camel case go forward oh something i changed it can't go forward right

29:01

that column there we go

29:06

all right you become a number you become a number

29:12

and you become a string all right

29:20

so that was profiles and then we got post snapshot which is i forgot to

29:25

change the name of the model for that so go ahead and take care of that too so we got post

29:31

snapshot change the class name on that too before i forget

29:37

post snapshot there we go

29:44

so we'll do the same thing that we've been doing here just copy all of these go into the model paste it in

29:54

and there we go

30:15

okay number number

30:21

uh time stamp date time

30:29

number and is that the last one string

30:34

well really should just do a final replace number

30:40

number okay i didn't think i would have too many more after i said that but okay there we go number number date time

30:48

and daytime let me put my phone on silent

30:57

okay and that gets a date time as well and so does that one

31:06

okay and then we'll circle back after we get oh all that we got left is the menu to

31:13

many for the uh for the uh author to post relationship so we'll go ahead and circle back and take care of the

31:19

nullable items so

31:25

normally i'd do this as i'd paste them in but i forgot to do that so let's see

31:30

we have revision that should really be not nullable

31:38

all right page title description meta description canonical

31:44

body video url okay really everything beyond

31:51

the slug on the post history or post snapshot now

31:56

is nullable so let's just go down to the slug here

32:01

and we'll do or null on the end of that

32:07

oh i copied the whole thing okay well

32:12

let me retry that copy there there we go

32:29

down to delete that there we go okay

32:34

so that was it for the post snapshot profiles what you got

32:43

my nullable avatar asset id is nullable and everything afterward is nullable as

32:49

well so go into profile

32:54

and do the same there

33:10

all right assets bite size alt text and credit

33:20

uh oh right here

33:27

okay and then topics nothing there posts

33:33

this again should be everything after slug i believe yeah so uh post puff post there you are

33:43

so everything after slug

34:02

and okay and then user i don't think yeah no nothing in there

34:09

and a rule should be nothing as well so that should be good okay so there should all be good now we

34:14

just got the relationships to go ahead and add in so

34:22

i guess we'll go ahead and start with roles on the user so user

34:28

i like to put my relationships down below the columns um and then after the hooks

34:34

so at

34:39

it belongs to

34:46

yep although you did not import it for me there we go public roll roll

34:53

um that belongs to type of roll there we go

34:59

see co-pilot's catching on it's getting getting a couple things wrong but it's catching on okay there we go

35:05

so we'll do the inverse as well so on the roll our roll will have many users so

35:10

has many user good oh gotta import it there

35:17

public user it's close has

35:22

many type of user there we go all right so roland user is taken care of

35:30

uh let's see so that should be good for that and then we have our post

35:36

which doesn't directly relate to the user it has an intermediary table doing that

35:41

so nothing directly off of the user that needs a

35:47

belongs to or anything like that so we'll move on from there up until we get

35:52

down to the intermediary table then we'll assign that so our topic does belong to a specific user

35:58

though yeah i'm going to go ahead and just put a foreign key on that as well

36:06

okay so topic topic topic okay

36:14

it belongs to user

36:19

public user um belongs to type of user there we go

36:26

and then the inverse of that

36:33

user has many topic public

36:40

topics there you go you're catching on you got to import stuff but you're catching on there

36:46

all right so that should be good for the topics now where was that right here all right so

36:55

then we have the post topics huh oh yeah okay that was user topics now we

37:01

got the post topics so uh go into topic this has an intermediary table so it is

37:07

a mini to many so at many too many

37:15

post

37:20

pivot table is not topic post but

37:26

post topics and i believe that has a sort order on

37:31

it yes so i'm going to go ahead and put pivot columns on there with the

37:38

sort order and then we got public posts ah you're so close co-pilot you're so

37:44

close that needs to be a capital a money to many all right there we go

37:51

so then we got to do the inverse of that so the post also has many

37:56

actually i'm going to go ahead and just copy it since the only thing needs to change is the name and the types

38:04

okay oh yeah and the imports so many to many

38:12

many to many post changes to topic

38:19

topic pivot table and columns stay the same and instead of this being post it is

38:26

topics okay so now down to assets

38:32

um it has the asset type id which i will be defining as an enum not directly in the

38:38

database so that should be good and then we get on asset posts where again we have something very

38:44

similar to what we just did with the topic and assets or topic and posts

38:50

so at many too many

38:58

posts pivot table

39:07

asset posts pivot column again this should have a sort

39:13

order on it public posts

39:19

many to many type of post all right and then the inverse of that

39:27

is many too many

39:33

asset pivot table

39:39

asset the posts

39:46

blank there all right there we go public there you go

39:53

all right oh yeah control d thank you about that

40:00

corey um i have a tendency to forget about that or what the um

40:05

keyboard shortcut is for it um so let's see

40:11

nope okay got that wrong

40:18

ctrl d um

40:25

on a mac today so i don't know if it's different for mac or maybe that's actually working and

40:30

it's just taking me back up to the top of the page yep okay that's what's happening

40:38

okay i'll play around with that later but thank you for that [Music]

40:44

okay so we got down to the asset posts so now we have

40:50

the profile which belongs to a specific user and then the avatar asset id as

40:55

well so profile

41:01

this yeah belongs to belongs to

41:07

user got import user public use user not users

41:15

belongs to type of user and then i will go ahead and do the asset as well

41:22

which should be the same so it belongs to if i can type it there we go

41:30

asset public asset

41:37

yeah that's just one okay belongs to type of asset

41:44

so then on the user we need to add

41:50

profile and then on the i don't think it makes sense to define

41:56

profile on that asset so i'll skip that so at

42:02

what is this has one has one

42:10

pro nope not promise profile there we go i hope you didn't import it

42:17

profile there we go now we got it public

42:23

profile has one profile gotta import has one

42:28

okay so that should be good and then we have the post snapshots

42:36

so [Music] we'll want to define this on both sides so post snapshot belongs to a post so

42:43

app belongs to post

42:48

public post belongs to type of post

42:54

and then the post has many um snapshots so that has

43:01

many post snapshot and i'm going to just name this

43:09

snapshot off of the post since i seem to see i feel like that's self-defining so i'm going to

43:15

manually define the table as

43:24

post snapshots did i get the is it i think i thought it was table name but

43:29

i feel like no all right i'll look here in a second

43:36

public snapshots has

43:41

many type of post snapshot okay let's go take a look

44:01

relationship options

44:12

oh you know what i might be overthinking it maybe it doesn't need it

44:18

i bet you it doesn't i do need to go collapse my node modules now though there we go

44:24

okay so because it should still pull the table name off of the actual post snapshot table so we should still be

44:31

good there or the post snapshot model i mean sorry about that

44:36

okay and then we have the author to post i don't think i've done that yet so

44:43

author type id is going to be an enum outside of the database so we just need to worry about the post id and the user id so

44:51

let's see so we'll do user first so user

44:57

at and then this is going to be a mini to mini

45:03

post

45:09

see the pivot table should follow through with the norm but we do want to grab the pivot column

45:16

author type id so we'll do pivot column

45:22

author type id public posts has many type of posts

45:34

why the red squiggly here

45:49

argument of type user is not assigned multiple perimeter of type posts many to many posts

46:08

all right i feel like i'm doing something stupid let's see

46:14

if i get rid of the options is it still no

46:24

let me try retyping it

46:32

post imported

46:44

what am i having a brain fart with post id user id author posts

47:04

all right well let's see if i can define the inverse see if maybe i have an epiphany there so many to many

47:13

user we'll skip on that for right now public

47:18

users let's do authors

47:23

i need a mini i did not no no it's important okay type

47:29

of user yeah so that one's fine

47:50

imports all look right

48:24

did i have has many here i bet you i did overlooked it

48:35

okay oops okay so should be all of those good

48:43

um all right

48:50

shall we try running the migrations i suppose

48:57

node ace migration run

49:08

that's a first

49:15

uncut exception detected process will shut down

49:20

client pat oh yeah all right don't forget to set up your um emv

49:27

my bad on that so let's see the database name is not

49:32

lucid but yeager i think so

49:38

now we should be good i believe that's all that i needed to change there so let's clear that and rerun it no

49:45

password must be a oh yeah password is password my super secure

49:50

password there all right

49:57

user's not losing i need to read man i need to wake up and read postgres

50:05

i was using many to mini well thank you i don't know maybe an import was missing for it or something i don't

50:11

know clear

50:17

there we go we at least got some ran so asset posts

50:23

migrating it failed to create table asset relation assets already exists

50:32

[Music]

50:38

did i create two that's the one that i was having copy and paste issues with it

50:44

so we have assets there yep all right so it needs to be asset

50:49

posts

50:54

all right so node is migration let's just go ahead and roll back those ones that did run

51:02

and try re-running and oh no same table

51:09

foreign key asset id references asset id relation asset id does not exist

51:18

oh dang it assets

51:23

i'm going to blame co-pilot on that one node ace migration

51:30

roll back node base migration

51:35

there we go now we got it all right next i um guess let's go ahead and get those

51:42

enums populated in um so you can either place enums like in the contracts

51:49

directory i kind of like placing them with an app personal preference um

51:56

so i just do enums just like that and let's go grab them because i have no

52:01

clue what i had app

52:07

enums oh yeah i didn't do the auth attempt

52:12

table either okay well um

52:25

yeah absolutely in real videos everything gets edited out but in live streams it

52:31

humanizes people it shows that not everybody's perfect

52:38

so i'm actually going to pull this down just so that i can copy the enums directory

52:46

as opposed to copying and pasting each file content so

52:52

click clone

53:02

okay c code uh

53:07

it's this one i don't like this view let's do that for you there we go um app

53:15

enums and i'm just going to copy all of those

53:20

and then let's go back into [Music] our current directory

53:28

app enums and paste all of those in

53:36

get back into yagerko all right

53:45

and there they are so i didn't change anything with any of the enum

53:51

columns so all of these should still be accurate so they're just simple genomes that export out

53:57

um some of them have descriptions with them as well uh

54:04

yeah like this where it's kind of human readable so that those are just objects at that

54:10

point but um yeah so pretty simplistic files there so those should be good and then i guess

54:17

let's start rigging up off since that's where i typically start

54:23

so i'm going to make a controller for that

54:33

there we go for a second there i thought i just typed assets controller all right

54:44

computer keeps going to sleep you have to change the sleep timer on that

54:51

all right so let's see public async

54:58

show sign up

55:08

okay grab the view out of that and return view dot render

55:21

let that sign up let's go ahead and create that file so views

55:28

off signup.edge

55:34

uh while we're in here i am going to create

55:42

a layout file as well so we'll do oh i forget how i name this stuff

55:49

whether it's capital or lowercase auth

55:55

layout.i just off.edge yeah there we go

56:01

okay and then i did i okay i guess visual studio code comes with that out of the box now so that's

56:07

good

56:14

all right and i actually forget what that needs to be like whether it's at content or

56:21

whatnot so i'm going to go look here i'm already here i can go ahead and

56:27

look here so resources views

56:33

layouts ah app should work

56:43

ah section right so at section

56:51

content at and section

56:56

and then if i'm remembering correctly this is at layout off

57:02

nope what am i doing layouts edge layouts off

57:09

okay and we'll just put an h1 here

57:14

working just to make sure into the routes

57:20

route.get sign up

57:31

show sign up i'm pretty excited with off

57:37

there we go all right let's try booting it up i actually don't think i've tried booting

57:42

this up yet so let's give that a go

57:53

oh that's very true thank you roman so if i go back into layouts here i

57:59

mentioned that this is a self-closing section so i can just do at exclamation point to have that

58:05

self-close instead of having that enclosed tag there so save a line there

58:12

and let's see if that booted up yep so let's go instead of here let's go to localhost

58:19

3333 and it works so let's go to sign

58:26

up

58:33

oh yeah i have a section and i did not put my

58:41

content within that section so section content

58:53

is it section or is it something else well we'll test it and see yep there it is okay it's section

59:00

i couldn't remember if the inverse side was something different so there we go so at least we're getting a render out and that seems to be working okay

59:09

so let's just do a simplistic form here and form

59:17

method post action will be

59:24

off dot sign up that's what i named the show isn't it i need to change that to auth dot show

59:29

sign up ah dot sign up dot shell there we go that'll work

59:35

and then within here that should be good we'll name the actual post route

59:42

off dot sign up and let's see i have username email

59:49

and password so we'll just do simple inputs for right now

59:55

type equals string string is that right

1:00:01

text name equals username

1:00:07

and we'll put a placeholder on there as username enter

1:00:13

username go back and change that later all right i'll do one for email

1:00:19

and then one for password email

1:00:26

password email

1:00:32

password all right get ourselves a button type of

1:00:38

submit sign up sounds good all right

1:00:44

close the terminal there i don't know when that opened up

1:00:51

i do yeah i prefer to use the uh edge engine over a separate front-end

1:00:57

framework edge does most of what i need most of the time

1:01:03

if i need a front-end framework it's because i'm specifically building something that's spa-based

1:01:08

a single page application based where i need constant changing

1:01:14

page stuff with edge for the most part you can replace sections pretty easily just using ajax calls

1:01:22

if you do need dynamic stuff so and we'll get into that in later streams

1:01:28

i don't know if we'll get we'll get that far in this one today um

1:01:34

but yeah so let's go ahead and create our sign up so off controller

1:01:41

public async sign up

1:01:46

request response

1:01:58

well look at you co-pilot get me most of the way there all right create

1:02:04

username email password um

1:02:10

import user okay so the user gets created there

1:02:17

i'm pretty sure that's all that we need for the user and then we can actually sign that user directly in so using um

1:02:24

i'm going to import off here awaits

1:02:30

off dots i believe login is the one that takes a user yes login

1:02:37

and then let's go ahead and yeah for right now let's redirect just

1:02:42

redirect back to the home page and let's go ahead and grab the session

1:02:48

too we don't have session stuff rigged up at all yet but um we can plop something on that temporary welcome

1:02:55

home page just to make sure that it actually came through so we'll flash

1:03:02

success welcome the egg or something like that

1:03:07

give that a save oh yes um what are you doing up here let's see

1:03:16

um most of the time i use validation for this

1:03:21

but i believe it would be all maybe only only

1:03:28

yeah i think either one would work but i'll go with only um for right now so we'll just do this to test to make sure

1:03:35

everything's working um didn't have any brain farts with it and then we'll add in a validation step to it as well so

1:03:40

let's go ahead and refresh here yep didn't define the route that's very true

1:03:46

routes route dot post sign up off controller as

1:03:53

yeah that's that's pretty close i'm just gonna do off dot sign up on that one though but yeah that should do it

1:04:00

go ahead and refresh again all right there's our super simplistic form so we'll do test user one

1:04:07

email of well i'll do a fake email testuser1

1:04:13

at gmail.com and

1:04:19

all goes well missing get away

1:04:25

for this website missing method signup oh it's all lowercase in it

1:04:33

where are you yep all lowercase so maybe i should uh

1:04:39

stick with one naming convention there huh here actually i'm gonna change this to

1:04:44

sign up show there we go that's better

1:04:51

so sign up show sign up

1:04:57

okay no let's go ahead and just re-enter the form make sure everything works okay so

1:05:04

resubmit the page test user one test user one at gmail.com

1:05:14

and oh yeah npm i

1:05:20

p h c argon 2 there's no at in front of that right yes

1:05:25

okay

1:05:40

all right there we go so that's for hashing our password um so

1:05:46

just needed to install that there again i'm gonna go ahead and resubmit from the start

1:05:52

so test user one test well yeah that would have been on create so

1:05:58

our user would not be created yet and

1:06:04

okay incremental steps here insert into users updated at username

1:06:10

values returning id inserter update on table user violates foreign key constraint user role

1:06:17

i default oh i didn't give it a roll id did i i thought i set a default on that though did it not

1:06:26

user roll id default to one

1:06:37

and i defined it within the model yeah

1:06:47

maybe let's see if it works if i manually define a role id there

1:06:56

let's give that a try

1:07:02

at least try to narrow down what might have happened there

1:07:07

okay yeah so it's something that i have configured for the database here

1:07:25

oh i don't have any rolls i didn't i didn't create a seed of course

1:07:31

so role id one does not exist is the issue

1:07:36

so if we come back and whoop into the database

1:07:42

into the database reload am i using the right database

1:07:48

[Laughter] uh all right it should be named jager

1:08:02

yep database name is jager all right well i was going to pop a database or

1:08:09

rolled just right in there but i guess let's go ahead and just create a seeder to do it for us

1:08:15

actually i think i already have one

1:08:22

and i can just copy and paste from here that way i can make check and make sure

1:08:28

i didn't miss any other seeds that i might need starter seed there we go

1:08:34

oh nope just rolls okay i'm gonna go ahead and just copy

1:08:39

that then [Music]

1:08:44

and what's that go into seeds i'll just use node to make it or

1:08:51

the acli to make it so node ace make

1:08:56

cedar i think starter

1:09:02

seed there we go okay and now we got the seeders file and i

1:09:09

just gonna copy and paste that okay so one is a basic authenticated user two

1:09:16

is an administrator so now let's run node ace db

1:09:21

seed there we go npm run dev

1:09:29

there we go all right back to here

1:09:34

try this one more time test user one

1:09:39

test user one at gmail.com some password there we go now we got it

1:09:46

working

1:09:52

it's all the small stuff that you forget right all right so our sign up is working um

1:10:01

i guess let's go ahead and drop some off check on the home page the welcome page to make sure

1:10:08

that the auth actually went through and our user is authenticated if i can read there we go

1:10:17

so just do pre off dot user dot

1:10:22

uh let's do the user name okay

1:10:30

okay cut that back a little bit let's try the user undefined

1:10:38

let's check out the kernel there we are all right

1:10:43

right here imports at ioc

1:10:49

adonis core silent no no maybe that's in my project instead

1:10:56

of there middleware yep so instead of doing ioc that will be app

1:11:05

middleware silent off which will run off check which will propagate the user onto the auth module

1:11:14

so now we should be good to do off user username i'm going to place a

1:11:20

i don't remember if that works in

1:11:26

an edge i don't remember if that works i think it does but all right there we go so we are

1:11:32

authenticated there we go we got our test user one so authentication seems to be sticking

1:11:39

so that should be good let's go ahead and do validation on this so

1:11:47

i can either plop it directly into here or i can make a separate file for it i

1:11:54

think for right now i'm just going to plop it directly into here um

1:12:00

so let's see let's import no i'm the one that capitalizes schema

1:12:05

rules from adonis core validator and then what i personally like to do is i like to name my shimashima after it's

1:12:11

made so i call a capital schema

1:12:17

is that wrong as is that right there i think it says so then i do const schema equals await

1:12:25

schema.create we got username

1:12:31

rules uh wait no that's not right

1:12:37

schema dot string and

1:12:43

let's trim it

1:12:48

and that is an extra right there and then we do rules dots and this is

1:12:55

very much so required and um let's see is there a unique one yes

1:13:01

there is spot on so that should be good

1:13:06

and then email see trim true required unique spot on thank you

1:13:12

and password i like it i'm also going to add them in with or min with midlength to it

1:13:21

six is a little light let's jump that up to eight okay so there is our schema so then we

1:13:27

can do const data equals

1:13:32

awaits oh you're close request dot validate

1:13:38

schema and then instead of manually popping that in there we can do just data

1:13:47

so now we can get rid of that right there and that should be

1:13:53

all good we can try they don't have any log out um

1:13:59

that's okay let's see i'm not familiar with

1:14:07

safari's devtools i don't know why i'm using safari either

1:14:13

cookies cookies there's cookies delete them all

1:14:19

yeah i should do it and then if i where do i close it right there if i refresh there we go now we

1:14:26

got n a so the um knowledge what is that coalescence

1:14:32

uh right here does work i thought it did and then we should be able to go back to

1:14:38

sign up test user two

1:14:44

test user two at gmail.com some password that is

1:14:51

now let's test the validation less than eight okay so we came back here so i'm going to assume that that

1:14:57

means that the validation worked i don't have any of the errors popping onto the page yet i guess we can go ahead and do

1:15:02

that um

1:15:10

sign up let's see if i can remember how to do that so let's first clean this up a little bit i

1:15:16

guess so

1:15:24

what am i doing no oh

1:15:30

i don't have tailwind in here yet either do i oh man what am i gonna do

1:15:37

all right well i'll just um

1:15:42

wrap these in dips for right now there we go

1:15:54

okay and then underneath the div we'll do a small and this one would be

1:16:02

nope that's wrong it's giving me laravel syntax

1:16:09

uh let's see what is that that is flash

1:16:14

messages dot get uh

1:16:20

errors dot username i think and then we can wrap this up in an if

1:16:30

flash messages dot has errors.username

1:16:37

then we can end if all right let's stop right there just uh check to see whether or not that works

1:16:44

in itself so sign up oh okay

1:16:50

all right i got that wrong then let's go take a look

1:17:01

yeah just search for it

1:17:13

oh i'm missing an s okay simple things

1:17:19

back to here refresh there we go now they're all in the line

1:17:24

and there we go now we got our validation failed messages so that seems to be working so i'm gonna go ahead and

1:17:30

move these off into a component um that way it'll just it'll be easier to style it once i do get

1:17:36

tailwind in here so let's create a new file components

1:17:44

input.edge and i didn't copy it so or did i maybe i did but now i definitely have a copy

1:17:51

so we'll paste that in here and we are going to take

1:17:57

the type otherwise it should be strip ring if i can spell it

1:18:04

text text there we go the name

1:18:09

will be just the name and that will be required and then the placeholder

1:18:16

will be there then we do errors

1:18:26

well now we need to specifically take in the error since it's a component so we would do at if

1:18:33

just do errors um

1:18:38

yeah and end if and then we will drop

1:18:45

that in there and we will do

1:18:51

just errors dot join just like that

1:18:57

give that a save come back out here get rid of that at

1:19:02

com okay component components.input

1:19:14

name is username and

1:19:20

placeholder is enter username

1:19:25

and then the errors would then be flash messages dot get

1:19:33

errors dot username so let's test that out again see if

1:19:38

that's working still so send that off and there we go so now we can

1:19:44

copy this component in place of these two so do

1:19:51

one and two

1:19:56

and instead of well let's start with this one so instead of username here this would be email

1:20:02

and that also needs the type of email enter email

1:20:08

and errors dot email this one here needs a type of

1:20:15

password name is password enter password

1:20:21

and that will be password as well so now if we refresh this unexpected

1:20:28

token forgot the comma always forget the comma there we go all right

1:20:33

sign up all of them have their errors

1:20:39

oh yeah i added required um and they are all automatically required

1:20:44

because i did not specify that they are optional so this rules that required is a little

1:20:50

redundant so i can just go ahead and remove that on each of them

1:20:57

now if we try that again we should just get one of those error messages there it is okay

1:21:04

and now if did i create a test user too is this going to work for me now it's not

1:21:10

all right let me try adding in another connection for it jager postgres

1:21:16

postgres postgres jaeger no no that's password sorry database

1:21:22

should be maybe that's what i did wrong last time i set it up

1:21:35

there we go all right let me delete this one then okay

1:21:41

so users all right we only have test user once we're good to use test user two here

1:21:46

test user two at gmail.com

1:21:53

and there we go now we have test user too so our validation is working we have simple input components

1:22:01

[Music] i guess let's go ahead and get tailwind added since

1:22:07

our forms are just going to be super basic without it i

1:22:13

let's see i'm going to have to take a look at the documentation on that don't do it enough to exactly remember how to

1:22:18

do it let's see guides

1:22:26

asset manager okay we already have encore configured

1:22:31

because i started my application with it so we're good there um

1:22:41

actually resources where are you here you are we

1:22:47

have our css file already so really this should just be adding in tailwind um

1:22:52

because i'm pretty sure our encore is already started with the css

1:22:57

yeah there's js and then we just need to add in like uh

1:23:05

enabling post css yeah and then we're probably gonna have to

1:23:10

configure it with tailwind i'm gonna cheat i'm gonna look and see what i did here

1:23:17

actually i'm gonna look and see what i did on a newer project because that might be out of date so let's see github.com

1:23:26

no that one's not using all right i'll just go to github

1:23:31

let's see what we got

1:23:39

yeah no yeah this one

1:23:55

scroll down all right so here i was using view three i don't think i need that so nope nope

1:24:01

okay no additional configurations needed you just need to enable the css loader

1:24:06

and then install tailwind so

1:24:13

so let's see i

1:24:18

css get started installation

1:24:30

okay

1:24:46

hey uh tina hopefully i'm pronouncing your name right thanks for stopping by

1:24:56

all right and then what is the command to add that default

1:25:01

here it is tailwind config if i can copy it

1:25:07

okay so then we should be good to go ahead and start stuff back up i think

1:25:14

no oh okay well that makes it easy enough

1:25:23

let's install post css loader 2. npm run dev and

1:25:30

all right now we're started up so now all that i need to do is add these in

1:25:36

i believe to our starting css file

1:25:42

i'm going to go ahead and nuke this and just paste these in here

1:25:48

see if it uh yeah not updated okay let's give it a try let's give it a test

1:25:55

so change our title here to text

1:26:01

red 500. the good old make the text read the test and see if it's working

1:26:09

no no it doesn't look like it okay

1:26:14

um yeah okay so the post css i probably

1:26:22

need to add a post css config yeah maybe yeah right here

1:26:28

all right i'm gonna go ahead and copy that and post css config.js add that to the root

1:26:37

so let's go inside of there so that we know that we're going off of the root here post css config js

1:26:45

paste that in there uh let's see it looks like i'm already also using post css nested here

1:26:51

um to keep with my norm i'm going to go ahead and install that plugin as well so

1:26:56

npm i post css nested

1:27:02

okay run dev

1:27:08

and actually make sure that all that ran through okay

1:27:15

uh close this and yeah okay cool there we go it's red awesome

1:27:20

and the text size reset too so that's another uh way to tell that it's working now

1:27:28

cool cool um

1:27:34

so what next we need login we need log out

1:27:41

so let's add a simple log out first since it'd be nifty to be able to log

1:27:46

out our users so that we can go back and test log in instead of having to clear the cookies so

1:27:52

within our resource nope not within our resource well i guess we could add the button first but let's go ahead and add

1:27:58

the functionality first so public async

1:28:03

since i'm going with sign up here let's go ahead and do sign out for the name here

1:28:10

do response and off i think that's all that we'll need and we'll do session two we'll put a session message on there

1:28:27

okay uh

1:28:36

co-pilot's controlling my stream all right now let's add the route

1:28:44

route dot um see do i normally do a get request or a post request

1:28:50

put put i think yeah it would work sign out

1:28:56

of controller sign out most of the time i don't fully

1:29:02

rebuild the auth i just copy and paste it from project.project so

1:29:09

but it'd be good to just rebuild it from scratch for once

1:29:15

all right so we have our uh request here so now we just need to add a button that sends off that request

1:29:22

to i'd say probably the layout so we'll give ourselves some kind of

1:29:29

funky header here bg gray gray with an a 100

1:29:40

flex flex uh between

1:29:48

flex items nope nope item center

1:29:53

justify between item center there we go okay do it div that would be like the

1:30:00

header and then we'll do the div which would be our log out

1:30:09

okay so i think normally i do just like a

1:30:15

straight get request but i'm going to try something let's try just the anchor anchor href

1:30:22

going to the route hopefully remember how i usually do it but let's see what did i name that um

1:30:27

i'll sign out yeah i'll sign out

1:30:34

see if this works

1:30:40

and let's wrap that up in an if because we don't want to show it if we're not authenticated so if auth user

1:30:48

okay so that should just log us out redirect

1:30:54

us back to the homepage

1:31:00

elk welcome's not using v well this is the off layout i don't want to use the off layout let's create a main layout

1:31:07

cut this out of here first

1:31:13

okay main.edge there we go html5

1:31:20

there we go paste that in there we'll do the same thing

1:31:29

nope section section content there we go let's get them mixed up

1:31:35

okay and then we need to on welcome.edge

1:31:41

take everything out but let's see we'll keep this div because i'll end up putting main within

1:31:47

the layout i think and

1:31:55

do at no get rid of everything there we go at

1:32:00

layout equals layouts and main

1:32:05

at section content

1:32:12

okay and plop the div in there so now that should be using there's our sign out okay

1:32:20

so if i click sign out and there we go so yeah that worked i wonder if that is how i usually do it

1:32:26

i don't remember okay so we have our sign out working

1:32:34

and our sign up working so let's go ahead and do our sign in

1:32:39

so public async sign in show

1:32:51

return view.render thank you and public async

1:32:58

sign in request response off

1:33:05

session okay

1:33:12

uh no no i normally don't validate the login because you want that to be kind of loose in case your signup changes

1:33:21

your signup validation changes you don't want to lock the user out so do const

1:33:29

email password equals requests only

1:33:38

yep email password and then let's see

1:33:44

await off dot attempt email password

1:33:53

sure that works and sure so i i think that's it

1:33:59

we'll test it we'll see all right so we got sign up sign up

1:34:06

route dot get sign in off

1:34:11

controller sign in show as sign in show route dot post

1:34:20

sign in off controller uh sign in

1:34:26

is off sign in and it's starting to drive me a little bit crazy so i'm gonna line these up

1:34:33

there we go that's better okay next we need to add in

1:34:41

i don't even think the view is created yet so we need to add within our auth folder a

1:34:47

sign in dot edge at layout layouts

1:34:54

off at section content and

1:35:01

section um i'm going to go ahead and copy the

1:35:06

sign up content because it's pretty close i guess i could just copy the whole file but that's all right

1:35:16

so that changes the sign in we won't use the username and i think that's it

1:35:26

so let's give that a go um actually let's go ahead and add routes to the our temporary header

1:35:37

and let's go ahead and extract our temporary header into a partial so views

1:35:42

i'm gonna do a partial instead of a component that way it has access to all of the data that's on our uh

1:35:48

edge that's that's available with an edge so partials header dot edge

1:35:56

paste that in there that way we have direct access to auth we have direct access to

1:36:01

anything else that might be added so session all that fun stuff and let's add that back into our layouts

1:36:08

is at um is it is it just partial

1:36:16

i'm questioning myself that it's just partial i don't remember do i have the authentic

1:36:22

off but the documentation open i don't let's get that open

1:36:27

and search for partials

1:36:37

include yeah i didn't think it was partial

1:36:42

include partials header and

1:36:49

okay add that to our off layout as well pardon my dog

1:36:58

have a good night all right

1:37:04

let's see so within our header in addition to those let's add in our

1:37:10

simple menu so if our user is not logged in we don't want to show sign out we

1:37:16

want to show sign up sign in so at href

1:37:22

route off dot sign up or wait no sign in usually comes first

1:37:27

don't know sign in

1:37:34

sign in nope not all of it just the button there

1:37:40

we go and then sign up

1:37:45

and take a

1:37:50

marshmallow three on that

1:37:58

okay so back into here

1:38:05

there we go so that uh that that should be over on the right but i'm not gonna fret that

1:38:11

for right now so all right testing our sign in here could use some spacing too

1:38:18

all right so we have test user 1 and test user 2 created so we'll test with test user 1 first i suppose

1:38:25

and there we go so sign in is working cool

1:38:31

and then we also need to add handlers so like if i were to try to sign in with test user

1:38:39

3 which does not exist and imagine at this point in time we're

1:38:44

going to get an error because i'm not handling the attempt call right yeah we're failing out some i don't have

1:38:51

the error actually rendering out on the page but yeah um

1:38:57

so we would want to handle that and show something to the user so

1:39:03

within our auth controller here if i can remember how to do this do we just wrap this up at a try catch

1:39:10

i believe so

1:39:22

yeah that's close enough but i think this is something different response dots

1:39:34

i'm gonna cheat i'm gonna go look and see what i'm doing i don't fully remember

1:39:40

so let's see app auth

1:39:47

register show login login

1:39:54

i got all the bad attempt stuff to keep you from being able to just spam the

1:39:59

login trying to guess passwords and where's the actual attempt so the attempt is right here

1:40:07

and then oh yeah they remember me i forgot about that and let's see so that's within a try

1:40:13

catch if you fail out then i got form with the message and the message is either one of these so

1:40:19

okay and then we just okay it's re response redirect and then chained off of that is

1:40:25

back i knew that what copilot's given me here was wrong but i couldn't remember exactly how it was

1:40:32

wrong so there we go response redirect back and then instead of yeah we do form because it's a whole

1:40:38

form message you're not directly passing it onto a particular

1:40:51

okay

1:40:56

all right and then i'm just going to copy the paste that message that does not contain

1:41:02

the incorrect attempts we will circle back and do that later

1:41:07

okay and then let's see if i can remember how i'm

1:41:12

showing that so sign in all right let's do div roll equals alert

1:41:21

class equals bg red 100 text

1:41:27

red 600 p3 rounded

1:41:34

border border red 200.

1:41:41

and let's

1:41:46

see flash messages dot get

1:41:51

errors dot four see if that's right at if

1:42:00

err one too many r's there errors dot form

1:42:06

and if plop that guy on in there

1:42:12

and let's go try to get our login wrong so yeah you could probably just end it up with nothing yep there it goes so there

1:42:18

we go um none of my styling went in there

1:42:24

oh oh oh yeah um i don't have the style sheets in there at all do i

1:42:30

let me go back and i'm just going to copy and paste the default from here then

1:42:35

entry point styles entry point scripts and let's plop those into our layouts i

1:42:43

knew some something was looking wrong because our header should have been on the right

1:42:50

all right let's try that now that's looking okay well that shouldn't be in the header but it's

1:42:57

it's a little bit right i must not have closed something in my header

1:43:05

let's see if oh i got the oh that's a start div yeah that needs to be an end if

1:43:10

that looks better that looks more right he's padding but that's that's better

1:43:16

uh let's do px6py2 at py3

1:43:22

sure and then margin bottom let's add a margin bottom to that too marching bottom six so we'll get an actual header

1:43:28

in here later on but just to get things going okay so now if we hit sign up we'll get

1:43:35

a big red error the provided email or password is incorrect being vague not necessarily

1:43:40

saying that the email is wrong or the passwords wrong so that if somebody's trying to steal somebody's account they

1:43:46

don't know which one they got wrong necessarily okay

1:43:55

so that should be good for that and then if

1:44:00

we actually do sign in test user one

1:44:09

oh the button still says sign up let's change that too

1:44:17

sign in let's actually make that capital two there we go

1:44:22

okay test user one

1:44:28

gmail.com all right cool so our header switched to

1:44:34

sign out our user's still authenticated if we click sign out that still works

1:44:40

so everything authentication wise seems to be working okay so far um

1:44:46

i guess let's go ahead and stylize this a little bit

1:44:52

so not you not you but oh i did have the dock open twice okay

1:44:58

[Music] i'm um use tailwind ui here

1:45:09

uh i don't know if i'm allowed to show this on stream actually

1:45:15

i don't remember what the rules are with that uh let's see so i'll just get the

1:45:21

plugin installed actually i think it's just at tailwind

1:45:28

css forms

1:45:34

yeah oh wait yeah no that's the right project okay and then

1:45:41

what i think within the tailwind config under plugins just hit

1:45:48

require that yeah and then let's do npm run

1:45:56

dev get our server started back up and

1:46:02

okay that's definitely different

1:46:12

let's see where is our there we go

1:46:23

do they use form control 2 or is that just the pooch trap thing doesn't seem to be doing anything

1:46:28

all right well i'll uh i won't bore you guys with the styling stuff

1:46:37

but yeah so then we should also on our sign up

1:46:44

include a link to sign in and vice versa

1:46:49

so for our auth let's see layout let's take the content here and wrap it

1:46:55

up a little bit so for class max width um

1:47:02

md mx auto

1:47:08

all right and then we'll plop our content in there and then so now that should yeah

1:47:18

and then we can do an h1 sign up

1:47:24

or create your free account or something like that

1:47:40

okay and then we'll do a paragraph there

1:47:46

with uh already have an account

1:47:54

that's pretty close off dot sign in

1:48:00

and since we're going with that verbiage we'll do sign in and since that's in a sentence we'll do

1:48:08

sign in and then we'll do the same thing for the inverse side let's actually check make sure that that looks decent

1:48:14

it's okay it's not great but it's okay

1:48:19

it at least tells you where you're at and then log sign in

1:48:25

sign in to

1:48:32

sign into your account need an

1:48:38

account sign up

1:48:43

sign up so we'll make this one a sentence form two instead of having capitalizations

1:48:49

for each word okay so now create your free account i

1:48:54

already have an account sign in click sign in takes you to sign up for it sign in oh i read that backwards sign in your

1:49:00

account need an account sign up so there we go

1:49:07

cool cool cool uh let's see how long have we been going here

1:49:14

obs won't open up

1:49:19

[Music]

1:49:26

okay well at least i have controls up there all right but i i think i'm going to stop there for right now uh and then

1:49:32

i'll think of a better approach on what to do in the next stream i just kind of wanted to get something started here to

1:49:38

see how this went um check and see how i do how it would do on the stream uh like quality wise

1:49:45

all that fun stuff so thank you all for stopping by hopefully we'll do this again more and soon so thank you all for

1:49:52

stopping by i appreciate it

Comment

  1. alifn27
    Commented 4 weeks ago

    gg

    1. tomgobich
      Commented 3 weeks ago

      Thank you! :)

Prepared By

Tom Gobich

Burlington, KY

Owner of Adocasts, JavaScript developer, educator, PlayStation gamer, burrito eater.

Visit Website