@@ -5,12 +5,12 @@ defmodule Diff.Storage.GCS do
55
66 @ gs_xml_url "https://storage.googleapis.com"
77
8- def get ( package , from_version , to_version ) do
8+ def get_diff ( package , from_version , to_version , diff_id ) do
99 with { :ok , hash } <- combined_checksum ( package , from_version , to_version ) ,
10- url = url ( key ( package , from_version , to_version , hash ) ) ,
11- { :ok , 200 , _headers , stream } <-
12- Diff.HTTP . retry ( "gs" , fn -> Diff.HTTP . get_stream ( url , headers ( ) ) end ) do
13- { :ok , stream }
10+ url = url ( diff_key ( package , from_version , to_version , hash , diff_id ) ) ,
11+ { :ok , 200 , _headers , body } <-
12+ Diff.HTTP . retry ( "gs" , fn -> Diff.HTTP . get ( url , headers ( ) ) end ) do
13+ { :ok , body }
1414 else
1515 { :ok , 404 , _headers , _body } ->
1616 { :error , :not_found }
@@ -25,23 +25,82 @@ defmodule Diff.Storage.GCS do
2525 end
2626 end
2727
28- def put ( package , from_version , to_version , stream ) do
28+ def put_diff ( package , from_version , to_version , diff_id , diff_data ) do
2929 with { :ok , hash } <- combined_checksum ( package , from_version , to_version ) ,
30- url = url ( key ( package , from_version , to_version , hash ) ) ,
30+ url = url ( diff_key ( package , from_version , to_version , hash , diff_id ) ) ,
3131 { :ok , 200 , _headers , _body } <-
32- Diff.HTTP . retry ( "gs" , fn -> Diff.HTTP . put_stream ( url , headers ( ) , stream ) end ) do
32+ Diff.HTTP . retry ( "gs" , fn -> Diff.HTTP . put ( url , headers ( ) , diff_data ) end ) do
3333 :ok
3434 else
3535 { :ok , status , _headers , _body } ->
3636 Logger . error ( "Failed to put diff to storage. Status #{ status } " )
37- { :error , :not_found }
37+ { :error , :storage_error }
3838
3939 error ->
4040 Logger . error ( "Failed to put diff to storage. Reason #{ inspect ( error ) } " )
4141 error
4242 end
4343 end
4444
45+ def list_diffs ( package , from_version , to_version ) do
46+ case get_metadata ( package , from_version , to_version ) do
47+ { :ok , % { total_diffs: total_diffs } } ->
48+ diff_ids = 0 .. ( total_diffs - 1 ) |> Enum . map ( & "diff-#{ & 1 } " )
49+ { :ok , diff_ids }
50+
51+ { :error , :not_found } ->
52+ { :ok , [ ] }
53+
54+ error ->
55+ error
56+ end
57+ end
58+
59+ def get_metadata ( package , from_version , to_version ) do
60+ with { :ok , hash } <- combined_checksum ( package , from_version , to_version ) ,
61+ url = url ( metadata_key ( package , from_version , to_version , hash ) ) ,
62+ { :ok , 200 , _headers , body } <-
63+ Diff.HTTP . retry ( "gs" , fn -> Diff.HTTP . get ( url , headers ( ) ) end ) do
64+ case Jason . decode ( body , keys: :atoms ) do
65+ { :ok , metadata } -> { :ok , metadata }
66+ { :error , _ } -> { :error , :invalid_metadata }
67+ end
68+ else
69+ { :ok , 404 , _headers , _body } ->
70+ { :error , :not_found }
71+
72+ { :ok , status , _headers , _body } ->
73+ Logger . error ( "Failed to get metadata from storage. Status #{ status } " )
74+ { :error , :not_found }
75+
76+ { :error , reason } ->
77+ Logger . error ( "Failed to get metadata from storage. Reason #{ inspect ( reason ) } " )
78+ { :error , :not_found }
79+ end
80+ end
81+
82+ def put_metadata ( package , from_version , to_version , metadata ) do
83+ with { :ok , hash } <- combined_checksum ( package , from_version , to_version ) ,
84+ url = url ( metadata_key ( package , from_version , to_version , hash ) ) ,
85+ { :ok , json } <- Jason . encode ( metadata ) ,
86+ { :ok , 200 , _headers , _body } <-
87+ Diff.HTTP . retry ( "gs" , fn -> Diff.HTTP . put ( url , headers ( ) , json ) end ) do
88+ :ok
89+ else
90+ { :ok , status , _headers , _body } ->
91+ Logger . error ( "Failed to put metadata to storage. Status #{ status } " )
92+ { :error , :storage_error }
93+
94+ { :error , % Jason.EncodeError { } } ->
95+ Logger . error ( "Failed to encode metadata as JSON" )
96+ { :error , :invalid_metadata }
97+
98+ error ->
99+ Logger . error ( "Failed to put metadata to storage. Reason #{ inspect ( error ) } " )
100+ error
101+ end
102+ end
103+
45104 defp headers ( ) do
46105 token = Goth . fetch! ( Diff.Goth )
47106 [ { "authorization" , "#{ token . type } #{ token . token } " } ]
@@ -53,8 +112,12 @@ defmodule Diff.Storage.GCS do
53112 end
54113 end
55114
56- defp key ( package , from_version , to_version , hash ) do
57- "diffs/#{ package } -#{ from_version } -#{ to_version } -#{ hash } .html"
115+ defp diff_key ( package , from_version , to_version , hash , diff_id ) do
116+ "diffs/#{ package } -#{ from_version } -#{ to_version } -#{ hash } -#{ diff_id } .json"
117+ end
118+
119+ defp metadata_key ( package , from_version , to_version , hash ) do
120+ "metadata/#{ package } -#{ from_version } -#{ to_version } -#{ hash } .json"
58121 end
59122
60123 defp url ( key ) do
0 commit comments