11defmodule Front.ProjectPage.Model do
22 use TypedStruct
33 alias Front . { Async , Decorators , Models }
4+ alias InternalApi.PlumberWF.ListKeysetRequest.Direction , as: KeysetDirection
45 require Logger
56
67 typedstruct do
78 field ( :project , Front.Model.Project . t ( ) )
89 field ( :page_token , String . t ( ) )
910 field ( :direction , String . t ( ) )
11+ field ( :list_mode , String . t ( ) )
1012 field ( :user_page? , boolean ( ) )
1113 field ( :ref_types , String . t ( ) )
1214 field ( :workflows , [ Front.Model.Workflow . t ( ) ] , enforce: true )
@@ -35,6 +37,7 @@ defmodule Front.ProjectPage.Model do
3537 field ( :user_id , String . t ( ) )
3638 field ( :page_token , String . t ( ) , default: "" )
3739 field ( :direction , String . t ( ) )
40+ field ( :list_mode , String . t ( ) , default: "latest" )
3841 field ( :user_page? , boolean ( ) )
3942 field ( :ref_types , [ String . t ( ) ] )
4043 end
@@ -51,7 +54,8 @@ defmodule Front.ProjectPage.Model do
5154 @ spec get ( LoadParams . t ( ) ) :: { :ok , __MODULE__ . t ( ) } | { :error , String . t ( ) }
5255 def get ( params , opts \\ [ ] ) do
5356 with true <- first_page? ( params ) ,
54- true <- everyones_page? ( params ) do
57+ true <- everyones_page? ( params ) ,
58+ true <- cacheable_mode? ( params ) do
5559 fetch_from_cache ( params , opts [ :force_cold_boot ] )
5660 else
5761 false ->
@@ -79,7 +83,7 @@ defmodule Front.ProjectPage.Model do
7983 end
8084
8185 def cache_key ( params ) do
82- "#{ cache_prefix ( ) } /#{ cache_version ( ) } /project_id=#{ params . project_id } /ref_types=#{ params . ref_types } /"
86+ "#{ cache_prefix ( ) } /#{ cache_version ( ) } /project_id=#{ params . project_id } /ref_types=#{ params . ref_types } /list_mode= #{ params . list_mode } / "
8387 end
8488
8589 @ spec refresh ( LoadParams . t ( ) ) :: { :ok , t ( ) , atom ( ) } | { :error , String . t ( ) }
@@ -167,6 +171,7 @@ defmodule Front.ProjectPage.Model do
167171 project: project ,
168172 page_token: params . page_token ,
169173 direction: params . direction ,
174+ list_mode: params . list_mode ,
170175 user_page?: params . user_page? ,
171176 ref_types: params . ref_types ,
172177 workflows: workflows ,
@@ -186,8 +191,16 @@ defmodule Front.ProjectPage.Model do
186191
187192 defp first_page? ( params ) , do: params . page_token == ""
188193 defp everyones_page? ( params ) , do: params . user_page? == false
194+ defp cacheable_mode? ( params ) , do: ( params . list_mode || "latest" ) == "latest"
189195
190196 defp list_workflows ( params ) do
197+ case params . list_mode do
198+ "all_pipelines" -> list_workflows_keyset ( params )
199+ _ -> list_workflows_latest ( params )
200+ end
201+ end
202+
203+ defp list_workflows_latest ( params ) do
191204 list_params = [
192205 page_size: 10 ,
193206 page_token: params . page_token ,
@@ -196,12 +209,7 @@ defmodule Front.ProjectPage.Model do
196209 git_ref_types: params . ref_types
197210 ]
198211
199- list_params =
200- if params . user_page? do
201- list_params |> Keyword . merge ( requester_id: params . user_id )
202- else
203- list_params
204- end
212+ list_params = maybe_put_requester ( list_params , params . user_page? , params . user_id )
205213
206214 workflow_api_metric_name =
207215 if params . user_page? do
@@ -222,4 +230,47 @@ defmodule Front.ProjectPage.Model do
222230
223231 { workflows , next_page_token , previous_page_token }
224232 end
233+
234+ defp list_workflows_keyset ( params ) do
235+ direction = keyset_direction ( params . direction )
236+
237+ list_params =
238+ [
239+ page_size: 10 ,
240+ page_token: params . page_token ,
241+ direction: direction ,
242+ project_id: params . project_id ,
243+ git_ref_types: params . ref_types
244+ ]
245+ |> maybe_put_requester ( params . user_page? , params . user_id )
246+ |> Enum . reject ( fn { _ , value } -> is_nil ( value ) or value == "" end )
247+
248+ workflow_api_metric_name =
249+ if params . user_page? do
250+ "project_page_model_list_keyset_by_me"
251+ else
252+ "project_page_model_list_keyset"
253+ end
254+
255+ { wfs , next_page_token , previous_page_token } =
256+ Watchman . benchmark ( workflow_api_metric_name , fn ->
257+ Models.Workflow . list_keyset ( list_params )
258+ end )
259+
260+ workflows =
261+ Watchman . benchmark ( "project_page_model_decorate_workflows" , fn ->
262+ Decorators.Workflow . decorate_many ( wfs )
263+ end )
264+
265+ { workflows , next_page_token , previous_page_token }
266+ end
267+
268+ defp maybe_put_requester ( list_params , true , requester_id ) ,
269+ do: Keyword . merge ( list_params , requester_id: requester_id )
270+
271+ defp maybe_put_requester ( list_params , _requester? , _requester_id ) , do: list_params
272+
273+ defp keyset_direction ( "next" ) , do: KeysetDirection . value ( :NEXT )
274+ defp keyset_direction ( "previous" ) , do: KeysetDirection . value ( :PREVIOUS )
275+ defp keyset_direction ( _ ) , do: nil
225276end
0 commit comments