@@ -24,6 +24,7 @@ defmodule Livebook.Hubs.TeamClient do
2424 deployment_groups: [ ] ,
2525 app_deployments: [ ] ,
2626 agents: [ ] ,
27+ app_folders: [ ] ,
2728 app_deployment_statuses: nil
2829 ]
2930
@@ -172,6 +173,14 @@ defmodule Livebook.Hubs.TeamClient do
172173 GenServer . call ( registry_name ( id ) , { :user_can_deploy? , user_id , deployment_group_id } )
173174 end
174175
176+ @ doc """
177+ Returns a list of cached app folders.
178+ """
179+ @ spec get_app_folders ( String . t ( ) ) :: list ( Teams.AppFolder . t ( ) )
180+ def get_app_folders ( id ) do
181+ GenServer . call ( registry_name ( id ) , :get_app_folders )
182+ end
183+
175184 @ doc """
176185 Returns if the Team client is connected.
177186 """
@@ -370,6 +379,10 @@ defmodule Livebook.Hubs.TeamClient do
370379 end
371380 end
372381
382+ def handle_call ( :get_app_folders , _caller , state ) do
383+ { :reply , state . app_folders , state }
384+ end
385+
373386 @ impl true
374387 def handle_info ( :connected , state ) do
375388 Hubs.Broadcasts . hub_connected ( state . hub . id )
@@ -611,7 +624,8 @@ defmodule Livebook.Hubs.TeamClient do
611624 file: nil ,
612625 deployed_by: app_deployment . deployed_by ,
613626 deployed_at: DateTime . from_gregorian_seconds ( app_deployment . deployed_at ) ,
614- authorization_groups: authorization_groups
627+ authorization_groups: authorization_groups ,
628+ app_folder_id: nullify ( app_deployment . app_folder_id )
615629 }
616630 end
617631
@@ -630,7 +644,8 @@ defmodule Livebook.Hubs.TeamClient do
630644 for authorization_group <- authorization_groups do
631645 % Teams.AuthorizationGroup {
632646 provider_id: authorization_group . provider_id ,
633- group_name: authorization_group . group_name
647+ group_name: authorization_group . group_name ,
648+ app_folder_id: nullify ( authorization_group . app_folder_id )
634649 }
635650 end
636651 end
@@ -664,6 +679,24 @@ defmodule Livebook.Hubs.TeamClient do
664679 }
665680 end
666681
682+ defp put_app_folder ( state , app_folder ) do
683+ state = remove_app_folder ( state , app_folder )
684+
685+ % { state | app_folders: [ app_folder | state . app_folders ] }
686+ end
687+
688+ defp remove_app_folder ( state , app_folder ) do
689+ % { state | app_folders: Enum . reject ( state . app_folders , & ( & 1 . id == app_folder . id ) ) }
690+ end
691+
692+ defp build_app_folder ( state , % LivebookProto.AppFolder { } = app_folder ) do
693+ % Teams.AppFolder {
694+ id: app_folder . id ,
695+ name: app_folder . name ,
696+ hub_id: state . hub . id
697+ }
698+ end
699+
667700 defp handle_event ( :secret_created , % Secrets.Secret { } = secret , state ) do
668701 Hubs.Broadcasts . secret_created ( secret )
669702
@@ -787,6 +820,7 @@ defmodule Livebook.Hubs.TeamClient do
787820 |> dispatch_deployment_groups ( user_connected )
788821 |> dispatch_app_deployments ( user_connected )
789822 |> dispatch_agents ( user_connected )
823+ |> dispatch_app_folders ( user_connected )
790824 |> dispatch_connection ( )
791825 end
792826
@@ -798,6 +832,7 @@ defmodule Livebook.Hubs.TeamClient do
798832 |> dispatch_deployment_groups ( agent_connected )
799833 |> dispatch_app_deployments ( agent_connected )
800834 |> dispatch_agents ( agent_connected )
835+ |> dispatch_app_folders ( agent_connected )
801836 |> dispatch_connection ( )
802837 end
803838
@@ -873,6 +908,43 @@ defmodule Livebook.Hubs.TeamClient do
873908 update_hub ( state , org_updated )
874909 end
875910
911+ defp handle_event ( :app_folder_created , % Teams.AppFolder { } = app_folder , state ) do
912+ Teams.Broadcasts . app_folder_created ( app_folder )
913+ put_app_folder ( state , app_folder )
914+ end
915+
916+ defp handle_event ( :app_folder_created , app_folder_created , state ) do
917+ handle_event (
918+ :app_folder_created ,
919+ build_app_folder ( state , app_folder_created . app_folder ) ,
920+ state
921+ )
922+ end
923+
924+ defp handle_event ( :app_folder_updated , % Teams.AppFolder { } = app_folder , state ) do
925+ Teams.Broadcasts . app_folder_updated ( app_folder )
926+ put_app_folder ( state , app_folder )
927+ end
928+
929+ defp handle_event ( :app_folder_updated , app_folder_updated , state ) do
930+ handle_event (
931+ :app_folder_updated ,
932+ build_app_folder ( state , app_folder_updated . app_folder ) ,
933+ state
934+ )
935+ end
936+
937+ defp handle_event ( :app_folder_deleted , % Teams.AppFolder { } = app_folder , state ) do
938+ Teams.Broadcasts . app_folder_deleted ( app_folder )
939+ remove_app_folder ( state , app_folder )
940+ end
941+
942+ defp handle_event ( :app_folder_deleted , % { id: id } , state ) do
943+ with { :ok , app_folder } <- fetch_app_folder ( id , state ) do
944+ handle_event ( :app_folder_deleted , app_folder , state )
945+ end
946+ end
947+
876948 defp dispatch_secrets ( state , % { secrets: secrets } ) do
877949 decrypted_secrets = Enum . map ( secrets , & build_secret ( state , & 1 ) )
878950
@@ -936,6 +1008,19 @@ defmodule Livebook.Hubs.TeamClient do
9361008 dispatch_events ( state , agent_joined: joined , agent_left: left )
9371009 end
9381010
1011+ defp dispatch_app_folders ( state , % { app_folders: app_folders } ) do
1012+ app_folders = Enum . map ( app_folders , & build_app_folder ( state , & 1 ) )
1013+
1014+ { created , deleted , updated } =
1015+ diff ( state . app_folders , app_folders , & ( & 1 . id == & 2 . id ) )
1016+
1017+ dispatch_events ( state ,
1018+ app_folder_deleted: deleted ,
1019+ app_folder_created: created ,
1020+ app_folder_updated: updated
1021+ )
1022+ end
1023+
9391024 defp dispatch_connection ( % { hub: % { id: id } } = state ) do
9401025 Teams.Broadcasts . client_connected ( id )
9411026 state
@@ -1064,6 +1149,8 @@ defmodule Livebook.Hubs.TeamClient do
10641149 defp fetch_app_deployment_from_slug ( slug , state ) ,
10651150 do: fetch_entry ( state . app_deployments , & ( & 1 . slug == slug ) , state )
10661151
1152+ defp fetch_app_folder ( id , state ) , do: fetch_entry ( state . app_folders , & ( & 1 . id == id ) , state )
1153+
10671154 defp fetch_entry ( entries , fun , state ) do
10681155 if entry = Enum . find ( entries , fun ) do
10691156 { :ok , entry }
0 commit comments