@@ -34,26 +34,26 @@ defmodule DatabaseMigration do
34
34
35
35
require Logger
36
36
37
- @ schema_mappings % {
38
- "User" => User ,
39
- "Org" => User ,
40
- "GithubUser" => User ,
41
- "Account" => Identity ,
42
- "OrgMember" => Member ,
43
- "Task" => Ticket ,
44
- "GithubIssue" => nil ,
45
- "GithubPullRequest" => nil ,
46
- "Bounty" => Bounty ,
47
- "Reward" => nil ,
48
- "Attempt" => Attempt ,
49
- "Claim" => Claim ,
50
- "BountyCharge" => Transaction ,
51
- "BountyTransfer" => Transaction ,
52
- "GithubInstallation" => Installation ,
53
- "StripeAccount" => Account ,
54
- "StripeCustomer" => Customer ,
55
- "StripePaymentMethod" => PaymentMethod
56
- }
37
+ @ schema_mappings [
38
+ { "User" , User } ,
39
+ { "Org" , User } ,
40
+ { "GithubUser" , User } ,
41
+ { "Account" , Identity } ,
42
+ { "OrgMember" , Member } ,
43
+ { "Task" , Ticket } ,
44
+ { "GithubIssue" , nil } ,
45
+ { "GithubPullRequest" , nil } ,
46
+ { "Bounty" , Bounty } ,
47
+ { "Reward" , nil } ,
48
+ { "Attempt" , Attempt } ,
49
+ { "Claim" , Claim } ,
50
+ { "BountyCharge" , Transaction } ,
51
+ { "BountyTransfer" , Transaction } ,
52
+ { "GithubInstallation" , Installation } ,
53
+ { "StripeAccount" , Account } ,
54
+ { "StripeCustomer" , Customer } ,
55
+ { "StripePaymentMethod" , PaymentMethod }
56
+ ]
57
57
58
58
@ backfilled_tables [
59
59
"accounts" ,
@@ -71,9 +71,9 @@ defmodule DatabaseMigration do
71
71
"users"
72
72
]
73
73
74
- @ relevant_tables Map . keys ( @ schema_mappings )
74
+ defp relevant_tables , do: @ schema_mappings |> Enum . map ( fn { k , _v } -> k end ) |> Enum . dedup ( )
75
75
76
- defp transform ( "Task" , row , db ) do
76
+ defp transform ( { "Task" , Ticket } , row , db ) do
77
77
if row [ "forge" ] != "github" do
78
78
raise "Unknown forge: #{ row [ "forge" ] } "
79
79
end
@@ -133,7 +133,7 @@ defmodule DatabaseMigration do
133
133
row
134
134
end
135
135
136
- defp transform ( "User" , row , db ) do
136
+ defp transform ( { "User" , User } , row , db ) do
137
137
# TODO: reenable
138
138
# if !row["\"emailVerified\""] || String.length(row["\"emailVerified\""]) < 10 do
139
139
# raise "Email not verified: #{inspect(row)}"
@@ -189,7 +189,7 @@ defmodule DatabaseMigration do
189
189
}
190
190
end
191
191
192
- defp transform ( "Org" , row , _db ) do
192
+ defp transform ( { "Org" , User } , row , _db ) do
193
193
% {
194
194
"id" => row [ "id" ] ,
195
195
"provider" => row [ "github_handle" ] && "github" ,
@@ -238,7 +238,7 @@ defmodule DatabaseMigration do
238
238
}
239
239
end
240
240
241
- defp transform ( "GithubUser" , % { user_id: nil } = row , _db ) do
241
+ defp transform ( { "GithubUser" , User } , % { user_id: nil } = row , _db ) do
242
242
if row [ "type" ] != "User" do
243
243
raise "GithubUser is not a User: #{ inspect ( row ) } "
244
244
end
@@ -291,9 +291,9 @@ defmodule DatabaseMigration do
291
291
}
292
292
end
293
293
294
- defp transform ( "GithubUser" , _row , _db ) , do: nil
294
+ defp transform ( { "GithubUser" , User } , _row , _db ) , do: nil
295
295
296
- defp transform ( "Account" , row , _db ) do
296
+ defp transform ( { "Account" , Identity } , row , _db ) do
297
297
% {
298
298
"id" => row [ "id" ] ,
299
299
"user_id" => row [ "\" userId\" " ] ,
@@ -308,7 +308,7 @@ defmodule DatabaseMigration do
308
308
}
309
309
end
310
310
311
- defp transform ( "OrgMember" , row , _db ) do
311
+ defp transform ( { "OrgMember" , Member } , row , _db ) do
312
312
% {
313
313
"id" => row [ "id" ] ,
314
314
"org_id" => row [ "org_id" ] ,
@@ -319,7 +319,7 @@ defmodule DatabaseMigration do
319
319
}
320
320
end
321
321
322
- defp transform ( "Bounty" , row , db ) do
322
+ defp transform ( { "Bounty" , Bounty } , row , db ) do
323
323
reward = db |> Map . get ( "Reward" , [ ] ) |> Enum . find ( & ( & 1 [ "bounty_id" ] == row [ "id" ] ) )
324
324
325
325
amount = if reward , do: Money . from_integer ( String . to_integer ( reward [ "amount" ] ) , reward [ "currency" ] )
@@ -335,7 +335,7 @@ defmodule DatabaseMigration do
335
335
}
336
336
end
337
337
338
- defp transform ( "Attempt" , row , db ) do
338
+ defp transform ( { "Attempt" , Attempt } , row , db ) do
339
339
bounty = db |> Map . get ( "Bounty" , [ ] ) |> Enum . find ( & ( & 1 [ "id" ] == row [ "bounty_id" ] ) )
340
340
341
341
github_user = db |> Map . get ( "GithubUser" , [ ] ) |> Enum . find ( & ( & 1 [ "id" ] == row [ "github_user_id" ] ) )
@@ -361,7 +361,7 @@ defmodule DatabaseMigration do
361
361
}
362
362
end
363
363
364
- defp transform ( "Claim" , row , db ) do
364
+ defp transform ( { "Claim" , Claim } , row , db ) do
365
365
bounty = db |> Map . get ( "Bounty" , [ ] ) |> Enum . find ( & ( & 1 [ "id" ] == row [ "bounty_id" ] ) )
366
366
367
367
task = db |> Map . get ( "Task" , [ ] ) |> Enum . find ( & ( & 1 [ "id" ] == bounty [ "task_id" ] ) )
@@ -393,7 +393,7 @@ defmodule DatabaseMigration do
393
393
}
394
394
end
395
395
396
- defp transform ( "BountyCharge" , row , db ) do
396
+ defp transform ( { "BountyCharge" , Transaction } , row , db ) do
397
397
user = db |> Map . get ( "Org" , [ ] ) |> Enum . find ( & ( & 1 [ "id" ] == row [ "org_id" ] ) )
398
398
399
399
amount = Money . from_integer ( String . to_integer ( row [ "amount" ] ) , row [ "currency" ] )
@@ -438,7 +438,7 @@ defmodule DatabaseMigration do
438
438
}
439
439
end
440
440
441
- defp transform ( "BountyTransfer" , row , db ) do
441
+ defp transform ( { "BountyTransfer" , Transaction } , row , db ) do
442
442
claim = db |> Map . get ( "Claim" , [ ] ) |> Enum . find ( & ( & 1 [ "id" ] == row [ "claim_id" ] ) )
443
443
444
444
github_user = db |> Map . get ( "GithubUser" , [ ] ) |> Enum . find ( & ( & 1 [ "id" ] == claim [ "github_user_id" ] ) )
@@ -487,7 +487,7 @@ defmodule DatabaseMigration do
487
487
}
488
488
end
489
489
490
- defp transform ( "GithubInstallation" , row , _db ) do
490
+ defp transform ( { "GithubInstallation" , Installation } , row , _db ) do
491
491
% {
492
492
"id" => row [ "id" ] ,
493
493
"provider" => "github" ,
@@ -503,7 +503,7 @@ defmodule DatabaseMigration do
503
503
}
504
504
end
505
505
506
- defp transform ( "StripeAccount" , row , _db ) do
506
+ defp transform ( { "StripeAccount" , Account } , row , _db ) do
507
507
% {
508
508
"id" => row [ "id" ] ,
509
509
"provider" => "stripe" ,
@@ -526,7 +526,7 @@ defmodule DatabaseMigration do
526
526
}
527
527
end
528
528
529
- defp transform ( "StripeCustomer" , row , _db ) do
529
+ defp transform ( { "StripeCustomer" , Customer } , row , _db ) do
530
530
% {
531
531
"id" => row [ "id" ] ,
532
532
"provider" => "stripe" ,
@@ -539,7 +539,7 @@ defmodule DatabaseMigration do
539
539
}
540
540
end
541
541
542
- defp transform ( "StripePaymentMethod" , row , db ) do
542
+ defp transform ( { "StripePaymentMethod" , PaymentMethod } , row , db ) do
543
543
customer = db |> Map . get ( "StripeCustomer" , [ ] ) |> Enum . find ( & ( & 1 [ "id" ] == row [ "customer_id" ] ) )
544
544
545
545
if ! customer do
@@ -586,12 +586,13 @@ defmodule DatabaseMigration do
586
586
& collect_after_fun / 1
587
587
)
588
588
|> Enum . reduce ( % { } , fn
589
- { table , data } , acc when table in @ relevant_tables ->
590
- parsed_data = parse_copy_data ( data )
591
- Map . put ( acc , table , parsed_data )
592
-
593
- _ , acc ->
594
- acc
589
+ { table , data } , acc ->
590
+ if table in relevant_tables ( ) do
591
+ parsed_data = parse_copy_data ( data )
592
+ Map . put ( acc , table , parsed_data )
593
+ else
594
+ acc
595
+ end
595
596
end )
596
597
end
597
598
@@ -628,24 +629,25 @@ defmodule DatabaseMigration do
628
629
defp collect_after_fun ( { table , acc } ) , do: { :cont , { table , Enum . reverse ( acc ) } , nil }
629
630
630
631
defp process_chunk ( chunk , db ) do
631
- case_result =
632
- case extract_copy_section ( chunk ) do
633
- % { table: table } = section when table in @ relevant_tables ->
634
- transform_section ( section , db )
635
-
636
- _ ->
637
- nil
638
- end
632
+ case extract_copy_section ( chunk ) do
633
+ % { table: table } = section ->
634
+ @ schema_mappings
635
+ |> Enum . filter ( fn { k , _v } -> k == table end )
636
+ |> Enum . map ( fn { _k , v } -> transform_section ( section , v , db ) end )
637
+ |> Enum . reject ( & is_nil / 1 )
638
+ |> Enum . map ( & load_copy_section / 1 )
639
639
640
- load_copy_section ( case_result )
640
+ _ ->
641
+ [ ]
642
+ end
641
643
end
642
644
643
- defp transform_section ( % { table: table , columns: _columns , data: data } , db ) do
645
+ defp transform_section ( % { table: table , columns: _columns , data: data } , schema , db ) do
644
646
transformed_data =
645
647
data
646
648
|> Enum . map ( fn row ->
647
649
# try do
648
- transform ( table , row , db )
650
+ transform ( { table , schema } , row , db )
649
651
# rescue
650
652
# e ->
651
653
# IO.puts("Error transforming row in table #{table}: #{inspect(row)}")
@@ -654,9 +656,9 @@ defmodule DatabaseMigration do
654
656
# end
655
657
end )
656
658
|> Enum . reject ( & is_nil / 1 )
657
- |> Enum . map ( & post_transform ( table , & 1 ) )
659
+ |> Enum . map ( & post_transform ( schema , & 1 ) )
658
660
659
- transformed_table_name = transform_table_name ( table )
661
+ transformed_table_name = schema . __schema__ ( :source )
660
662
661
663
if Enum . empty? ( transformed_data ) do
662
664
nil
@@ -666,11 +668,7 @@ defmodule DatabaseMigration do
666
668
end
667
669
end
668
670
669
- defp transform_table_name ( table_name ) , do: if ( schema = @ schema_mappings [ table_name ] , do: schema . __schema__ ( :source ) )
670
-
671
- defp post_transform ( table_name , row ) do
672
- schema = @ schema_mappings [ table_name ]
673
-
671
+ defp post_transform ( schema , row ) do
674
672
default_fields =
675
673
schema . __struct__ ( )
676
674
|> Map . from_struct ( )
@@ -732,8 +730,6 @@ defmodule DatabaseMigration do
732
730
new_handle
733
731
end
734
732
735
- defp load_copy_section ( nil ) , do: [ ]
736
-
737
733
defp load_copy_section ( % { table: table_name , columns: columns , data: data } ) do
738
734
copy_statement = "COPY #{ table_name } (#{ Enum . join ( columns , ", " ) } ) FROM stdin;\n "
739
735
0 commit comments