All Episodes

November 21, 2024 • 37 mins

Join Michael and Jake as they dive into Laracon AU highlights, reveal new coffee adventures, and discuss dynamic directories and tenant file storage.

Mark as Played
Transcript

Episode Transcript

Available transcripts are automatically generated. Complete accuracy is not guaranteed.
Michael (00:00):
Hey. I'm Michael Duranda.

Jake (00:02):
And hi. I'm Jake Bennett.

Michael (00:07):
And this is episode 166 of the North Meet South web
podcast.

Jake (00:14):
We've pink you still have the pink hair. I do.

Michael (00:19):
I still have it. The pink I forgot that it was set
up. It's been that long since werecorded one of these podcasts.

Jake (00:24):
It has been a while. It has been a while. And so we've
got a couple of things we'regonna cover today, folks. We're
gonna continue on the tenantstorage journey Mhmm. Talking
about file systems and storing

Speaker 3 (00:36):
file paths and directories

Jake (00:36):
in your database, and we're gonna referencing those
things inside of your code withmagic strings and enums and all
sorts of fun stuff.

Michael (00:47):
And we're

Jake (00:48):
also going to talk about Laracon AU. Why don't we start
with Laracon AU?

Michael (00:51):
Sure.

Jake (00:52):
How was it, my friend? Good. Awesome. I saw some people
tweeting, like, today saying,you know, best conference I've
ever been a part of. Like, itwas absolutely incredible.
All the good things. And sosounds like it was a huge hit.

Michael (01:05):
Yeah. It's it's fun that, 2 weeks on from the
conference, people are stilltalking about it, and people are
still posting about it. I'vebeen saying LinkedIn, like,
where I never get any tractionfor anything really. There's
been quite a bit of, discussionand well wishes and and support

(01:28):
of the conference there, whichis which is really nice. I
think, by and large, we kind ofnailed all the aspects of of
what we were trying to achievethis year, which I think is the
most important thing that we Imean, as you know, we we put a
lot of time and effort intoputting networking as the center

(01:48):
of of the event this year.
Like last year, that was a kindof, a missing piece. And so a
big focus in everything thatthat I did this year was to make
sure that networking was frontand center, that we made it
possible for people to talk, toshare, to engage with the
speakers, to engage withsponsors, which is, you know, a

(02:10):
first for us. We've we've alwayshad sponsors at the events, but
we've kind of been spaceconstrained in a in a way that
meant that people didn't reallyget a chance to speak with the
sponsors. So I think that wasthat was possible with the the
foyer that we had this year. Wecatered breakfast and lunch and
afternoon tea this year, whichmade it possible for people to
kind of stick around in thebreaks and actually talk to each

(02:31):
other without having to go andfigure out where they were gonna
go and get food and things likethat.
So that was good, and all of thefeedback from the speakers talks
was has been really good aswell. We're going to or we will
have, by the time this recordingcomes out, publish all the all
the videos. So, yeah, lookinglooking forward to that, and,

(02:53):
you know, everyone else gettingan opportunity to see those
videos. I mean, we did the livestream this year as well, which
was something new

Jake (02:59):
for us. Right.

Michael (03:01):
We we hadn't previously like, we'd always recorded the
videos, but we hadn't done alive stream. And and, you know,
Taylor came to me a few monthsago and asked, you know, are we
gonna be able to live stream thethe Nightwatch announcement? I
said, well, I'll find out if wecan do it. And then we didn't
really wanna communicate it inany way because number 1, we

(03:21):
hadn't done it. Number 2, thevenue couldn't actually provide
us a hard line to

Jake (03:28):
Oh, really? Okay.

Michael (03:29):
Do the streaming. They just they had no ethernet where
the cameras were set up. So, butthe the video team that we use,
Bigspin, are very good at whatthey do. And they had, like,
some bonded 4 g device. So they,you know, they had 2 different
providers on there, and theywere able to like, they were
able to stream it at full 10:80.

Jake (03:51):
No Starlink?

Michael (03:52):
No Starlink. No. That's a that's an idea for the future.
But, yeah. So that so we wedidn't we we had always planned
to specifically do the Laravelannouncement.
If nothing else, we wanted tostream that component of the
conference, But we kind of leftany announcement about that
until we had gotten into thetheater and were actually able

(04:13):
to test the, you know, thethroughput and thing. And, like,
being able to test it the daybefore and being able to
actually use it when there's,you know, 400 people in the room
with their laptops and theirphones and their iPads and
whatever else is a is a verydifferent proposition. But,
yeah, we had a consistent streamacross 2 days. So, yeah, Happy

(04:34):
with that. The way that turnedout.

Jake (04:35):
Yeah. That's that's awesome. Super cool. Did they
give any indication why theycall it Night Watch?

Michael (04:41):
I don't think so. I

Jake (04:43):
have to go back to the studio.

Michael (04:45):
Just another name.

Jake (04:46):
Just another name.

Michael (04:48):
Yeah. So, yeah. We just finished, putting together all,
like, the thumbnails for the thevideos. Because, you know,
that's the thing we do. Video.
Yeah. We got all the all thephotos back from the
photographer on the weekend. SoI

Jake (05:03):
saw people posting them. Yeah. That looks great. Great.
Really, really good.

Michael (05:06):
Been been going through those. You know, we we do that
largely for the speakers sothat, you know, they can put
their portfolios and and, youknow, if they submit to speak at
other conferences or they we doheadshots for them if they want,
so they can update theirLinkedIn and whatever other
social media that they're using,or, you know, their website,
whatever whatever they wanna usethose for, we do that as well.
So yeah. It was,

Speaker 3 (05:28):
it was

Michael (05:28):
very cool then.

Jake (05:28):
Peak, speaker perk. Right? That's like a well thought
through sort of thing becauseyou're right. Like, everybody
wants to be able to have thosethings, but unless it's done
intentionally, sometimes itdoesn't happen. Like, headshots
for sure don't really happen.
You know what I mean? Like, youget, like, the on stage speaker
shot, but that's a great idea.The headshots, it's a good it's
a good one. Yeah. Just as wekeep

Michael (05:48):
taking you know, and, like, you you know,

Speaker 4 (05:51):
as a conference speaker, you you put a

Michael (05:52):
ton of effort into it. Yeah. Right. You know, some
conferences, I know, you know,ours does. I'm pretty sure
Laracon US does.
It'll cover accommodation andflights and and travel and
things like that for thespeakers, but many won't pay for
you to actually speaknecessarily. Like, most
conferences won't pay speakersto present. You know, there's

(06:14):
remuneration, as I said, in orreimbursement in terms of
flights and accommodation andthings like that. And so all
these little extra things thatthat we can do, you know,
there's the the speaker sponsordinner. There's the the
headshots.
Like, we we do those as well forfor the speakers just to, you
know, make it seem like it's nota huge waste of I mean, not that

(06:37):
it's a waste

Speaker 3 (06:41):
of time, but, you know, it's a lot of time goes
into it, and it's nice to beable to

Michael (06:41):
get something out on the other side of it as well. So

Jake (06:44):
Yeah. Absolutely. No. It's good planning on your part. I
love that.
It's, it's just, like,intentional. You know what I
mean? And so, like, it's it justtakes time to, like, think
through that stuff and, like,put the planning in place to
make that happen. So good onyou. Good on you, mate.
Thanks. Also, you got a coffeemaker recently. A new coffee
maker? Yes. Tell me about thisadventure.

Michael (07:04):
Well, my old one, well, because I was away for a week.
And I came back, and it was abit bit weak in the in the steam
wand department. Like, it was itwas going, but it was not going
very well. I'm like, oh, Ibetter clean it out. You know,
it's probably gotten to thattime again.
And I I went through thecleaning cycle, and like, it was
okay. I'm like, this is on itslast legs. And then there was,

(07:27):
like, a early Christmas slashBlack Friday slash whatever you
want to sell at this place. AndI was like, alright. I'll buy
that.
And so there's this this companymakes, like, 10 or 12 different
models of of coffee machinefrom, like, just a basic manual
one all the way up to, like,fully automatic.

Jake (07:45):
Does your

Michael (07:46):
espresso, whatever. And so I got, like, the 3rd tier
model, but it was on sale forless than the 2nd tier model
was, which which was the one Iwas looking at. So I got that.
And, yeah, I went to to make acoffee with my old machine
yesterday and, like, the steamone just completely stopped. So
I ended up with a a tepidcoffee, which is not ideal.

(08:09):
I'm like, no. I'm not drinkingit. But fortunately, the new one
arrived yesterday, so I got thatout and just dialing it in at
the moment. I don't know if, youknow, people have bought
espresso machines, but you'vegotta mess with the setting.
Basically, every time you get

Jake (08:21):
a new

Michael (08:21):
bag of beans, you've gotta go through and dial in to
make

Jake (08:24):
sure the

Michael (08:24):
grind size is correct. You you supposed to.

Jake (08:27):
If you

Michael (08:27):
always buy the same beans, it's alright. But you
never know when they wereroasted relative to when when
you got them, you know, how howmuch they were roasted and
things like that. And the grindamount will impact the quality
of the espresso and how muchcrema you get in there and
things like that.

Jake (08:43):
So just

Michael (08:44):
just working my way through it. But I don't normally
drink espresso. Like, I justhave a a latte once a day and
and and that's it. But I've beenhaving I'm trying to keep myself
to no more than 2, because justtrying to get get it right. So
but I'm pretty happy.
It's kinda noisy though, butit's, it's I I was always about

(09:05):
the life of, like, I'll grindthe beans. I'll put them in the

Jake (09:08):
But it's so much time.

Michael (09:09):
The thing I mean, it's not a huge amount of time, but
it was also part of my morningroutine to do all of that. But I
thought, no, this one this onedoes the espresso automatically.
So I just push a button in it,you know, I can program it so
that it's like, this is how Iwant my shot, you know, the
temperature, the how much, youknow, infusion there is and all
that kind of stuff. And so Sure.

Jake (09:26):
Yeah. Yeah. Just put

Michael (09:26):
the thing in there and off it goes. But I do need to
learn how to use the steam wandon this thing because it's,
like, way more powerful eventhan, like, when it was working,
but way more powerful than myold one. And it and it's on the
left hand side. So and it onlygoes in one direction. And so
it's a matter of figuring out,like, how do I hold this thing
and and all of that with mywrong hand.
So

Jake (09:46):
I'm looking to see what one we got. We bought well, not
we. Our company bought 1. Itstarts with a j.

Michael (09:56):
A Jura. It's a fairly common one. Yeah. Yeah. J u r a.
It's Yep.

Jake (10:01):
It's really nice. It's like a commercial version. You
know what I mean? So it's likeYep. It's pretty sweet.

Michael (10:06):
Yeah. It's fairly it's fairly common in office
environments. But, yeah, thisone was this is a a gaggia a
gaggia something. Butapparently, this guy that you
know, 80 years ago, he inventedthe espresso. Achilles Gaggia,
his name was.
It's an Italian Really?

Jake (10:23):
He invented the drink itself? And so this is his
machine?

Michael (10:26):
Yeah. This is his machine.

Jake (10:27):
So That's pretty cool.

Michael (10:28):
Philips I think Philips, like, the electronics
company Philips bought Yeah.

Speaker 3 (10:32):
Yeah.

Michael (10:33):
Gaggia, like, in the early mid, like, the 2010s.
Sure. And then try to, like, youknow, move all the manufacturing
and change the way that it wasall done. And apparently, it was
a bit of a disaster. And then in2019, I went back to having
everything manufactured in Italyagain.
And, yeah, it's been good eversince.

Jake (10:52):
And away you go. And now it's good again. Yeah.

Michael (10:53):
Good machine.

Jake (10:54):
That's pretty cool, dude. When I when I, head to your
house in Aussieland, I'm gonnaI'm gonna have to have, you'll
have to have one waiting for me.Sounds good?

Michael (11:01):
Yeah. It's, it's the kind of like, you look at it and
go, gee, they're expensive. Butwhen you think how much coffee
you drink, and, like, if I wasto buy a cup of coffee, like, a
a coffee every day, you know,we're talking 5, $6 a day. We're
talking, you know, 300 let'ssay, 340 days of the year. It

(11:21):
adds up.
So

Jake (11:23):
Oh, absolutely. It does. Yep. Yeah. For sure.
And so yeah. Like, it makes it alittle bit easier to justify.
Right? And so and it's so it'sso much more convenient too.
Like, you know, like I said,like, you know, it's part of
your morning ritual, morningroutine sort of deal, but, it's
nice sometimes just to have,like, you push the button and
it's done.
It feels so nice. Here's mycoffee. I'm good to go. So
that's cool. Yeah.
I've kinda actually so this iscrazy. We have that Jira or

(11:45):
whatever. Is it Jira? Yeah.Yeah.
It's good. But, sometimes Istill like Keurig. Like, I
literally just got this, like,Keurig coffee. It's just like
it's fine. Like, I don't needanything fancy.
I just literally and, like, theJura's being used by somebody
else and, like, grab me aKeurig. I don't care.

Michael (12:01):
Yeah. I think also the thing with the, the office
coffee machine is that you get,like, whatever subscription
beans come with, like, themaintenance contract for the
machine, and they're notnecessarily gonna be fresh or

Jake (12:14):
So what I will tell you is this is this is the secret.
Jordan Brill, who you know

Michael (12:20):
Uh-huh.

Jake (12:20):
His parents actually roast their own coffee. They have a
company called Pyramid CityRoasters.

Michael (12:25):
Sort of.

Jake (12:25):
And so we get fresh beans, like, you know, they are it is
top notch. It is really goodstuff actually. So That's,

Michael (12:33):
that's probably probably why that machine's busy
all the time then.

Jake (12:38):
It is. That's exactly correct.

Michael (12:39):
Like, the beans, like, the way it's especially, like,
if you buy a coffee machine andthen you go and buy beans from
the supermarket, and you look atthe date on when those things
were like, it it can be, like,weeks to months Oh, yeah. Before
you

Jake (12:51):
get that.

Michael (12:51):
And, like, the beans beans, you generally wanna use
within 2 weeks. So yeah.

Jake (12:58):
Jordan actually is messaging me right now. He, came
over tonight while I was at abasketball game with my son, and
he was like, hey. Can I borrowyour belt sander? I'm like,
yeah. Sure.
So I opened up my garage doorfor him, and he went and grabbed
the belt sander, and he'srefinishing his, kitchen table
or his, like, one of his tables.And so I thought the game was
one of my one of our friends,one of our our, you know, our

(13:20):
our mutual friends. And I Isaid, yeah. Jordan Sexton. He
said, what's he doing?
I was like, oh, he grabbed mybelt sander. He's like, does
that dude ever stop? I'm like, Idon't think he does. Do not
think he does. He just alwayshas project going on.

Michael (13:32):
So good

Jake (13:32):
on him. It's looking good. He sent me some pictures.

Michael (13:35):
When I come to Laracon US next year Yes. That, he
should bring me some of thesePyramid City coffee.

Jake (13:43):
Oh, yes. Oh, absolutely. He would love to. He'll listen
to this. He'll bring him he'llprobably send you some in
Aussieland, man, for your newcoffee machine.

Michael (13:50):
So expensive.

Jake (13:51):
No. You probably would. He's that he's that kinda guy.
You know? He's just that kindaguy.

Michael (13:55):
I would appreciate it.

Jake (13:57):
Speaking of that kinda guy. Yes. Yeah. So Jordan and I
are on a little venture hereworking on an application, which
has been pretty cool, and someother developers on on our team.
But, I think I can try andexplain what it is.
It's basically a data exchange.I wanna call it I mean, I'm

(14:18):
using this, you know how Inertiais. So, like, Inertia is like a
protocol. Right? It's not like apackage library.
It's like a protocol. It'sbasically what it is. Like, it
it standardizes how you passitems from the Laravel back end
to the JavaScript front end sortof thing, And it can use, you
know, Laravel. It can use, Ruby.It can use whatever.
Right? That's the idea. This isessentially like a data exchange

(14:39):
protocol, I will call it,between insurance carriers and
their subrogation vendors thatthey wanna use. So you have many
insurance carriers, manysubrogation vendors. Subrogation
vendors is is what we do, by theway, Wilbur does.
And so the process of gettingdata from an insurance carrier
to your system of record is anabsolute pain in the butt, and
everybody does it 5 differentways. Right? So every single

(15:00):
time you bring on a new carrier,it's a brand new integration
path. It's like, someone wannado SFTP, someone wanna do email,
someone wanna do Excel sheets,someone wanna actually, you
know, send them to a a, youknow, your claim uploader on on
the web or whatever. It's amess.
Everybody has a different way ofdoing it. Yep. The cool thing is
that all of these carriers aregoing to this platform called
Guidewire, which is a claimssystem that's like, you know, I

(15:24):
mean, it's a piece of software,but they're they're creating a
cloud version of it now. Sothey're pushing everybody to go
to the cloud version. Well, wewere approved as a partner, and
we now have a Guidewire cloudaccelerator that plugs in and
then gives us access to theirAPIs.
So what we do is we grab thedata, we let them you know, they
transport it to us, essentially.We standardize it, and we

(15:44):
provide it in convenient formatsto the subrogation vendor. So we
have a UI, we have batches, andthen we also have API. So it's
like no code, low code, fullcode is the idea. Right?
There's, like, all 3 pathsavailable. So, like, a a vent a
vendor could get started on day1, or they could go, like, full
integration mode and never touchit with a human. Right? Just go

(16:05):
APIs. So that's the pitch forit.
But some of this is we'redealing with a lot of file paths
and a lot of directories. Andone of the things we had talked
about on the show previouslywas, like, tenant, file systems.
How do we deal with that? Right?And so what we decided to do is
each team has its own disk.
So on the on the team record,there actually is a disk column.

(16:27):
And so when we are pulling outanything for a team, we use
storage disk and then tenantdisk, and then we specify the
team disk in there. And so thatworks pretty well. But we still
have these file paths. Like, wehave a relatively robust file
structure system that we need tomaintain in order to be able to
allow them to have, like, sthree access to these buckets,

(16:48):
and it needs to be consistentlynamed.
So, like, they have, like, youknow, vendor, uploads,
downloads. Under uploads, youhave, you know, claim updates,
notes, documents, whatever. Youhave all these different file
structures. And we were tryingto figure out, like, I hate
magic strings. Don't we all?
Right? We hate magic strings inour in our code. And so I was
trying to figure out, like,yeah, especially now. Now that

(17:10):
we have enums, it's like enumsto the rescue. Right?
The only issue was that, ourfile paths had dynamic parts to
them.

Michael (17:21):
Mhmm. Right?

Jake (17:22):
So you'd have a file path, but you'd have, like, an import
ID would need to be a part ofthe file path or, like, a date
would need to be a part of thatfile path. And so I'm like, man,
this is super frustrating. Howdo I do this consistently
between the classes and thetests and all that stuff? And
then it hit me. I was like, wealready do this in Laravel.
Like, we use named routes.That's how we solve this problem

(17:43):
when you're talking about, youknow, going from web.php to,
like, your tests to all thatstuff. We use named routes.

Speaker 3 (17:49):
Mhmm.

Jake (17:49):
And so, what we did is we used an enum called directories.
We had directories, doublecolon, doodot, and then whatever
you wanna name that named path.Right? So I would say something
like directories, doodot,vendor, uploads, claim updates,

(18:10):
like that. That would be likethe enum.
And, then what we can do is thatthing, that enum, is equal to a
string that looks exactly likewhat you would expect a named
route to look like. Right? Thepath. So you have, like, vendor
slash curly brace importidcurlybrace/curly bracedatecurly

(18:32):
brace/filing.csv or whatever itis. Right?
And now what we can do is we canuse those as placeholders. So
import ID and date are nowplaceholders. And so what I did
originally, although we did havesome discussions about this
today on our chat, what I didoriginally is I just sort of
mocked what Laravel does withthe route helper. Right? So you

(18:54):
just call in Laravel, you callroute and then you pass the
named route as a string,typically.
Although, now you can do it asan enum as well if you'd like
to. And then as a secondargument, you have any of the
path parameters. Right? So youpass in an array and you'd say
import ID, fat arrow, you know,1 comma date equals now format

(19:15):
ymd. Whatever.
Mhmm. And that's it. And it andit and it pops it out. Right? So
instead of using route though,we use a helper called
directory.
So directory, you pass in theenum, then you pass in the array
of those values. And then as anoptional last argument, you can
also pass in a file name. So thereason we have to do this is
because sometimes you only needthe directory location, and

(19:36):
sometimes I actually need thefull file path of a file name in
that in that directory.

Michael (19:41):
Yeah.

Jake (19:42):
And so the file name as a last argument is optional, but
if you pass it in, it'll put afinal directory separator and
then the file name dot, youknow, whatever it is. Mhmm. So
this has been incredibly helpfulbecause in all the places where
we were previously using justthese, like, glued together
strings, and I had absolutelyzero confidence that our tests
were actually doing what theywere supposed to be doing, like

(20:04):
they were actually testing thecorrect location. Now I have a
lot of confidence that they arehitting the right locations
because I can use the enum, toensure that that's the case. And
then if I ever need to changethem, I command command click on
that enum case, and any of theplaces where it needs to change,
I can go look at.
So Mhmm. Oh my gosh. Soincredibly helpful. And so

(20:26):
that's a great Yeah.

Michael (20:27):
It's not like it gives you that consistency,
especially, like, when you'redealing with situations where
you need to retrieve thosethings later. And what you would
previously have done is, youknow, do the thing here in, like
you save it over here. And thenlater, you need to then go and
fetch it. So you need to go andlook at the place where you've
saved it to make sure that youload the same thing back out,

(20:48):
you know, figure out all theparts and prefixes and and
variables and things like that.So putting it into an AM is
good.
So it's good from theconsistency perspective there.
The one thing that you wouldprobably wanna consider, whether
or not it's a it's a real thing,is, like, if you ever need to

(21:08):
change the paths. Right. Like,everything that's already saved,
you need to handle thesituation. Like, do you go and
move all of those?
Do you do, like, a migration ofthe, you know, from the old path
to the new path? Do you decide,like, no, we can never do this?
Or do you, like, handle, youknow, we create a new, you know,
e num member and, like, this ishow we do it moving forward if

(21:30):
we ever wanna change it.

Jake (21:32):
It's a really good question. And I actually was
just looking this up. Becauseyou're you're hitting on sort of
a second thing. So the firstthing I was concerned about was
how do I make sure that I'mconsistently generating these
paths in my code? And thatproblem, I feel like, is solved.
The second problem, though, ishow do I store these in my
database? Right? What is thecorrect method to store these in
my database so that I can laterretrieve them? Right? Because,

(21:55):
unless I'm storing all of thepieces that I used to create
that string, I will not be ableto recreate that string later
Yeah.
Using that same method. Sothere's a couple options. Right?
I can actually store the entirefile path in the database
record, but that makes itdifficult, like you said, to to
move things. Yeah.

(22:16):
So I've actually I I kindalooked up a couple different
options for how people do this.Mhmm. Let me see. Let me make
sure that I've I'm presentingthe whole problem before I
before I jump into the solution,though. So yeah.
Like, you

Michael (22:34):
Where you're at is

Jake (22:35):
You're the where Go ahead.

Michael (22:36):
Where I think most people normally land is that you
would store the path to whateverthat file is in the database.
And then if you're using whetheryour own implementation or
something like Sparsity MediaLibrary, where you attach these
things then to a model, at leastyou've always got reference back
to the thing that it was relatedto. But, yeah, if you if you

(22:56):
wanna move around, you you know,you need those variables back
out. You need to know how to getback there, which is which is a
thing. So I think you wouldprobably not want to ever ever
change those things once they'reset.
And that way, you don't everhave to worry about going back
to this directories helper,because you would only ever pull

(23:19):
it out of storage using the pathreference and the disk. So, you
know, you do storage disk Yeah.Dollar team, disk or whatever
whatever it is, arrow, and thenwhatever the path is from from
that record. If you're wantingto be able to move things where
you would have to, like, pulldown that file and then, you
know, get whatever the directoryis at that time and then update

(23:42):
the path, you could probably dosome, like, date based things
and put a match statement inthere. That's like, if the thing
was before this date, like, goand get this value otherwise.
Like, you could there there arecertainly ways of doing it. But
I think the only time it'sreally gonna be problematic is
if you need to move existingfiles.

Jake (24:05):
The good news for me is that and and agree. I agree.
It's like you don't know whatyou don't know. So it's like you
wanna maintain as muchflexibility as you can. Yeah.
I I would say the good thing forme though is that most of these
files are not super long lived.Like, they're not insanely
relevant after about a week. Soit's not like I'm gonna have
months years worth of data thatneed to get moved if I do change

(24:28):
file paths. I could probablyjust say, like, the life of
these is 30 days max. And if youhaven't gotten it by the time 30
days is around, I'm not storingthem for you anymore.
Yeah. So Are you using

Michael (24:37):
s 3? Because you you said like, you set up your
expiration rules, and that wouldjust disappear automatically. So
you don't have

Jake (24:43):
to worry about it. Yeah. That's a great call actually.
Yeah. I've done that before.

Michael (24:46):
Life cycle rules. You set them up on the because if
you don't need to worry aboutit, you can set up the life
cycle rules, which would makesure it's deleted. And then
you'd probably schedule sometask to, you know, model prune
and and delete the the data fromyour database. You're not
keeping that as well, if ifthat's where you were going.

Jake (25:04):
Yeah. No. That's that's interesting. The life cycle
hooks thing, I hadn't thoughtabout that. Yeah.
I mean, that actually issomething really interesting
that I've tried a couple times,is those life cycle hooks in s 3
or those life cycle rules. Iactually had it bite me the
other day because we've beenusing airdrop to to push items

(25:24):
up to s 3 and then pull themdown in production. And I went
to redeploy an existingdeployment in, in one of our
sites. And it was like, okay.Great.
No problem. I'll just pull downthat airdrop thing and Not there
anymore. It's not there anymore.

Michael (25:36):
You're gonna

Speaker 3 (25:36):
be careful

Michael (25:36):
with the with the left yeah. You're gonna be careful
with the life cycle rules.

Jake (25:40):
Yeah. Yeah. And so I just extended the life cycle rule. It
was, like, 30 days, and then Iextended it to a year. Like, it
doesn't matter.
It's a year. It's not a bigdeal. It's not there's not that
much stuff in there. So Mhmm. Soanyway so here's what I would
say though.
The the the trick for me, whichmakes it a little bit
complicated, is I have one areaof the code and the storage in
which is under my completecontrol. So, like, I'm totally

(26:03):
aware of what it is, and nobodyreally can modify or mess with
the structure of it. So one wayyou could do that is if you
just, for the record, whichyou're creating a uploaded file
for, you just have, like, a UUIDor a UUID, and you just name
that file that. No extension.Just you literally name it that.
And, then inside of the databaserecord itself, you would save,

(26:26):
like, the original uploaded namewith the extension.

Michael (26:29):
Yeah.

Jake (26:30):
So what that does is it basically allows you to make
sure that there's never going tobe duplicate file names. It
doesn't matter, You know? Andthen when you need to download
it or need to let somebodydownload it from your service,
you just say, like, okay. We'llgo grab the ULID at this
location and then pull it outand save it as this. You could
do that.
Right? And that basically makesit completely transportable. You

(26:51):
can put it wherever you want. Itdoesn't even matter. However,
there's another part of my codewhere I'm taking pieces that I
have generated.
So let me just let me bespecific, I suppose. Each day
at, like, 1 AM, I generate aclaim batch dot CSV, and I have
a record for it in the UI wherethey can go download it. And
that's the part that I control,and that's completely under my

(27:12):
control. But I also have asecondary location that I push
it to, that same CSV, where theycan download it straight from,
like, an s three bucketthemselves. So they get the
credentials to that s threebucket.
If they don't want to come intothe UI and download it, they can
just hook up to s 3 and downloadit. That one probably has to be
named whatever I'm gonna nameit. Right? Like, 202411 dash 19

(27:33):
dash claim batch CSV, somethinglike that. You know what I mean?
Someone does have to be named.And so I kinda have to deal with
both sides of the world there. II I don't think it'd be super
friendly to just drop, like, aULID with no extension file name
into that location. You know,it's gotta be named some sort of
sensical way that they couldfigure out this is the correct
file I'm looking for. So, yeah,I'm working through that part

(27:56):
right now as far as how I'mgonna save it in the database
because that is something thatI'm doing really inconsistently
across the board right now, andI'd like to just land on a way
in which we're gonna do that.
And so we'll see.

Michael (28:08):
Yeah. It'd be interesting to see where you
land on that. But, yeah, it'slike it's a consideration, but
it may not actually be aproblem. Right. It's yeah.
It's

Jake (28:18):
not a problem yet. It's not a problem. Yeah. Because
each of our each of our importsthat we store use sort of like
the Spassie media library waywhere it's like you know,
Spassie media library, the waythat they do it is they use an
ID of the record itself in themedia library. So there's an
auto incrementing ID on themedia table that you have from

(28:39):
Spassie.
So one through infinity. Right?And whenever something is
attached to record number 1 inmedia library, it creates a
folder of ID 1 slash and theneverything gets stored
underneath that and then 2,whatever. So instead of saying,
like, hey. You know, instead ofnaming them with some UUID, they

(29:00):
basically just say, I'm gonnacreate a subdirectory and then
drop your file in there and thatway we'll avoid any collisions.
So they keep the original namewhen they save it as the value
that's in, you know, in s 3 orwherever you're gonna have it.
So that's cool. The other thingthat's interesting too is, like,
we are having each vendor, eachtenant in the system has its own

(29:22):
disk, in Laravel, but the neatthing about that is we can also
allow people to host their ownstorage. So if they want to pay
for their own storage, if theywanna put it in s 3, if they
wanna put it in Cloudflare r 2,or if they wanted to put it in
Azure blob, it doesn't matter.Like, we can push it wherever
they want.
As long as we have a driver forLaravel that suits that, doesn't

(29:42):
make any difference, which isreally cool. So some of the
tactics was

Michael (29:48):
away from you as well?

Jake (29:50):
Correct.

Michael (29:50):
To to store those things.

Jake (29:52):
Correct.

Michael (29:52):
And which, you know, it would have compliance and
whatever else, benefits outsideof just, like, yeah, we're not
paying for it. Well, no. Itmeans that that that stuff gets
pushed straight to their ownthing, and they can access it in
whatever way they need to accessit, which is good.

Jake (30:10):
You hit the nail on the head though with the compliance
stuff, dude, because that'sexactly it. It's like, I do not
wanna be responsible for somedata loss, data leakage garbage.
It's like, it's on their side.We are just a pass through.
That's that's my goal.
Right? So it's like for anypartners that we have that are
over x number of claims a monthor something like that, we'll
just require them to have theirown storage. Yeah. Yep. Yep.

(30:34):
Amazing. So it's been good. It'sbeen good. It's been a good
project. Really excited aboutit.
The other thing that we couldtalk about in 2 weeks if we want
to or we could talk about now isdocumentation stuff, but that's
been a that's been sort of funtoo, trying to figure out what
we're gonna use fordocumentation. There's lots of
libraries out there. Have youused any libraries for
documentation stuff?

Michael (30:54):
I used like, I've used VPress, and I know that VPress
was used for a while. So, JamesBrooks was was posting that
they're starting to move theLaravel documentation things to
Mintlify, m I

Speaker 4 (31:10):
n t l I f y.

Michael (31:12):
So that's probably that's probably what everyone
will use now.

Jake (31:15):
It's Well, so it's interesting. Right? So, I mean,
I I don't want to be that guy,but should I be that guy? Go on.
Okay.
Alright. So Laravel gets venturemoney.

Michael (31:32):
Mhmm.

Jake (31:32):
Right? K. Then they have a Sentry integration on Forge.
Sentry is also backed by thesame venture company. Mhmm.
Right? And then they move thedocumentation to Mintlify, which
is also a venture backedcompany. Are we seeing a trend
here? Right? I think it's sortof like a I scratch your back,
you scratch mine sort of deal.
All in

Michael (31:52):
the family kinda thing?

Jake (31:53):
Correct. Where it's like, hey. We need to redo our docs.
Why don't we just use this otherproduct that we also have
investments in? Great.
Let's go to Mintlify. You knowwhat I mean? So it's sort of
like, hey, everybody who's aLaravel user, we're now using
Mintlify. It's like freeadvertising. You know what I
mean?
And so Yeah. That's kinda mytake.

Michael (32:10):
I I

Jake (32:11):
don't even know that it says for, like, Mintlify as
$1,000,000. What's that now?

Michael (32:15):
Low, free advertising for the low low price of
$50,000,000.

Jake (32:20):
Right. Exactly. Exactly. But but you know what I'm
saying? Like, Mintlify, I think,like, maybe it is or isn't the
absolute best case, like, optionfor, like, your docs.
But it's what they're using, andso it's, like, great. And it's
fine. I mean, I looked at theplatform.

Michael (32:33):
It depends on what

Jake (32:34):
kind of

Michael (32:34):
docs you what what kind of docs you're building as well.
Like, if it's developerdocumentation, it's okay. But,
like, the the hesitation isalways unless it's, a, kept up
to date, and, b, hostedsomewhere that you can access
it, you know, before you havefor for onboarding, for example,
if you've got documentation thatyou need to build before you can
spin up a repo, that's probablynot ideal. But, certainly, like,

(32:59):
we we use ClickUp for some formost things, I think, because
anyone can write thatdocumentation. So we just mark
down this this crazy week andthings like that as well.
But, yeah, It's always alwaysinteresting to to see that kind
of stuff. But it it looks nice,Mintlify. It's Yeah.

Jake (33:14):
It really does. Explain

Michael (33:16):
it. It's, you know, it's the, the commercial not
like, it's not a pay thing, butit's the commercial version of
like, this is what happens whensome money goes into a company
building a thing.

Jake (33:29):
Mhmm. Mhmm. Yeah. The challenge and so how much time
are we at right now?

Michael (33:35):
We're over. We're done. We're finished.

Jake (33:36):
We're over. Okay. So here, I'll give you the quick teaser
version of it. Right? So we werelooking at we were looking at
documentation stuff and we werelooking at VitePress, which I've
gotta say, VitePress is freakingawesome.

Michael (33:49):
It's Yeah. It's pretty

Jake (33:49):
good. So good.

Speaker 4 (33:50):
It looks really It's it's not down

Michael (33:53):
to get started. You can bolt your your view stuff in
there as well. Like, Minnify isgreat if you want to pay, you
know, to have it hosted for you.But I think I think VeePress is
probably the way to go for mostopen source things and internal
documentation and things likethat would be easy enough.

Jake (34:11):
It really is so good. Now the thing I will say about it is
that it's a little bit difficultto host within your existing
application. Right? I said thisis gonna be a teaser, so I
promise it will be. But if youwant to have it inside of your
existing Laravel app, so if youhave, like, myapp.com and and
you don't wanna havedocs.myapp.com, you wanna have,

(34:33):
like, myapp.com/docs, which youcan have for a number of
different reasons, then you'vegot to do some work and some
weird stuff to get VPress to dothat.
We have to, and this sounds soweird, our documentation
requires login. You have to belogged in.

Michael (34:50):
Right.

Jake (34:50):
And it's just because of, like, some agreements that there
are with these different, youknow, carriers and things like
that. They're very, you know,touchy and

Michael (34:57):
that sort of stuff. They don't want anyone to have
access to their stuff directly.

Jake (35:01):
Correct. And so we have to have people who've been approved
to be able to see it be able tosee it. So we have to protect it
behind Laravel's authenticationstuff. And so we're currently in
the process of moving over ourVeePress documentation over to
Prizet, which is a library thatwe talked about on air, for
Laravel News not too long ago.So it, it's like a markdown

(35:23):
implement, you know, it usesmarkdown and then it it looks
very similar to VitePress, but,I think it uses, like, Folio or
something behind the scenes,maybe.
Vault, something like that. Sointeresting. Anyway, we can talk
about that next time and we canalso talk about, getting a
Filament app to run at the rootof your application while also

(35:44):
using Jetstream and Fortify. Funtimes.

Michael (35:47):
We can do that next time, because my video is frozen
for those of you watching onYouTube.

Jake (35:51):
I saw that. Yeah. So

Michael (35:53):
just just trying to figure out this whole doc
situation. I was saying to ChrisChris Faddow, like, watch out
with that that, cam link becausejust hang on. I'll be right
back. Apparently, I have frozen.So

Jake (36:12):
Yeah. No worries.

Michael (36:16):
Yeah. My recording stopped. You won't get my video
back, but that's okay. We'lljust deal with it. I

Jake (36:22):
No worries. Should I wrap this one up for us?

Michael (36:25):
Yeah. That's alright. I'll I'll I'll wrap it, and then
yeah. I was talking to Chris fornow about this thing. I said, be
careful with your Cam Link goinginto a dock because they're
they're incompatible.

Speaker 3 (36:35):
And he

Michael (36:35):
goes, oh, it seems to be working. I'm like, yeah. It
will work. In so far as, like, Iplugged it in and it looked like
it was working, but then as wehave just seen here, or at some
point, potentially just stopworking. So Just stop working.
We will wrap it here, I think.

Jake (36:49):
Sounds good. Do you want me to do it or is this still
recording on your side or no?

Michael (36:52):
You you do it. Just in case it's not recording on my
side.

Jake (36:55):
Sounds good. Everyone, thanks so much for listening to
episode 166. You can find Shonasfor this episode at
northmeetsouth.audio/166. If youlike the podcast, please please
rate it up in your pod catcherof choice. 5 stars would be
incredible.
And if you have any questions,hit us up on Twitter at on x or
on bluesky. I don't know if yourhandle's the same. I think mine
might be close.Atjacabennett@michaeldorindaor@northsouthaudio.

(37:17):
Alright, folks.
Till next time. See you later.
Advertise With Us

Popular Podcasts

Crime Junkie

Crime Junkie

Does hearing about a true crime case always leave you scouring the internet for the truth behind the story? Dive into your next mystery with Crime Junkie. Every Monday, join your host Ashley Flowers as she unravels all the details of infamous and underreported true crime cases with her best friend Brit Prawat. From cold cases to missing persons and heroes in our community who seek justice, Crime Junkie is your destination for theories and stories you won’t hear anywhere else. Whether you're a seasoned true crime enthusiast or new to the genre, you'll find yourself on the edge of your seat awaiting a new episode every Monday. If you can never get enough true crime... Congratulations, you’ve found your people. Follow to join a community of Crime Junkies! Crime Junkie is presented by audiochuck Media Company.

24/7 News: The Latest

24/7 News: The Latest

The latest news in 4 minutes updated every hour, every day.

Stuff You Should Know

Stuff You Should Know

If you've ever wanted to know about champagne, satanism, the Stonewall Uprising, chaos theory, LSD, El Nino, true crime and Rosa Parks, then look no further. Josh and Chuck have you covered.

Music, radio and podcasts, all free. Listen online or download the iHeart App.

Connect

© 2025 iHeartMedia, Inc.