@@ -182,12 +182,13 @@ fn start_connection_with_retry(db_config: pog.Config, attempts_left: Int) {
182182@ external ( erlang , "timer" , "sleep" )
183183fn sleep ( time_ms : Int ) -> Nil
184184
185- pub fn maybe_initialize_db ( db_config : pog . Config ) {
185+ pub fn ensure_initialized ( db_config : pog . Config ) {
186186 case db_exists ( db_config ) {
187187 True -> {
188- logger . debug ( "Database '" <> db_config . database <> "' exists." )
189-
190- Nil
188+ logger . info (
189+ "Database '" <> db_config . database <> "' exists. Ensuring migrations and bootstrap data are applied..." ,
190+ )
191+ ensure_existing_database_is_ready ( db_config )
191192 }
192193 False -> {
193194 logger . info (
@@ -201,6 +202,15 @@ pub fn maybe_initialize_db(db_config: pog.Config) {
201202 }
202203}
203204
205+ fn ensure_existing_database_is_ready ( db_config : pog . Config ) {
206+ let assert Ok ( database_url ) = database_url_for ( db_config . database )
207+
208+ let assert Ok ( _ ) = run_migrate_command_with ( "up" , database_url )
209+ let _ = ensure_active_jwk ( db_config )
210+
211+ Nil
212+ }
213+
204214fn db_exists ( db_config : pog . Config ) -> Bool {
205215 let db_name = db_config . database
206216
@@ -318,9 +328,51 @@ fn seed_database(db_config: pog.Config) -> Result(Nil, String) {
318328 seed ( started . data )
319329}
320330
331+ fn ensure_active_jwk ( db_config : pog . Config ) -> Result ( Nil , String ) {
332+ let seed_pool_name = process . new_name ( "migrate_active_jwk_pool" )
333+ let seed_db_config = pog . Config ( .. db_config , pool_name : seed_pool_name )
334+
335+ use started <- result . try (
336+ start_connection_with_retry ( seed_db_config , 20 )
337+ |> result . map_error ( string . inspect ) ,
338+ )
339+
340+ let db = started . data
341+
342+ case jwks . get_active_jwk ( db ) {
343+ Ok ( _ ) -> {
344+ logger . info ( "Active JWK already present." )
345+ Ok ( Nil )
346+ }
347+ Error ( _ ) -> {
348+ logger . info ( "No active JWK found. Generating bootstrap JWK..." )
349+ seed_jwk ( db )
350+ }
351+ }
352+ }
353+
321354fn seed ( db : pog . Connection ) -> Result ( Nil , String ) {
322355 logger . info ( "Seeding database..." )
323356
357+ use _ <- result . try ( seed_jwk ( db ) )
358+
359+ case seeds . load_from_file ( db , "seeds.yml" ) {
360+ Ok ( _ ) -> {
361+ logger . info ( "Database seeded." )
362+
363+ Ok ( Nil )
364+ }
365+ Error ( e ) -> {
366+ logger . error ( "Failed to seed database: " <> e )
367+
368+ Error ( e )
369+ }
370+ }
371+ }
372+
373+ fn seed_jwk ( db : pog . Connection ) -> Result ( Nil , String ) {
374+ logger . info ( "Ensuring active JWK is present..." )
375+
324376 use active_jwk <- result . try (
325377 jwk . generate ( )
326378 |> result . map_error ( fn ( e ) {
@@ -337,18 +389,7 @@ fn seed(db: pog.Connection) -> Result(Nil, String) {
337389 |> result . map_error ( database . humanize_error ) ,
338390 )
339391
340- case seeds . load_from_file ( db , "seeds.yml" ) {
341- Ok ( _ ) -> {
342- logger . info ( "Database seeded." )
343-
344- Ok ( Nil )
345- }
346- Error ( e ) -> {
347- logger . error ( "Failed to seed database: " <> e )
348-
349- Error ( e )
350- }
351- }
392+ Ok ( Nil )
352393}
353394
354395fn run_migrate_command ( command : String ) -> Result ( String , String ) {
0 commit comments