Add frontend preference route
[akkoma] / lib / pleroma / web / akkoma_api / controllers / frontend_settings_controller.ex
1 defmodule Pleroma.Web.AkkomaAPI.FrontendSettingsController do
2 use Pleroma.Web, :controller
3
4 alias Pleroma.Web.Plugs.OAuthScopesPlug
5 alias Pleroma.Akkoma.FrontendSettingsProfile
6
7 @unauthenticated_access %{fallback: :proceed_unauthenticated, scopes: []}
8
9 plug(
10 OAuthScopesPlug,
11 @unauthenticated_access
12 when action in [
13 :available_frontends,
14 :update_preferred_frontend
15 ]
16 )
17
18 plug(
19 OAuthScopesPlug,
20 %{@unauthenticated_access | scopes: ["read:accounts"]}
21 when action in [
22 :list_profiles,
23 :get_profile
24 ]
25 )
26
27 plug(
28 OAuthScopesPlug,
29 %{@unauthenticated_access | scopes: ["write:accounts"]}
30 when action in [
31 :update_profile,
32 :delete_profile
33 ]
34 )
35
36 plug(Pleroma.Web.ApiSpec.CastAndValidate)
37 defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.FrontendSettingsOperation
38
39 action_fallback(Pleroma.Web.MastodonAPI.FallbackController)
40
41 @doc "GET /api/v1/akkoma/frontend_settings/:frontend_name/:profile_name"
42 def get_profile(conn, %{frontend_name: frontend_name, profile_name: profile_name}) do
43 with %FrontendSettingsProfile{} = profile <-
44 FrontendSettingsProfile.get_by_user_and_frontend_name_and_profile_name(
45 conn.assigns.user,
46 frontend_name,
47 profile_name
48 ) do
49 conn
50 |> json(%{
51 settings: profile.settings,
52 version: profile.version
53 })
54 else
55 nil -> {:error, :not_found}
56 end
57 end
58
59 @doc "GET /api/v1/akkoma/frontend_settings/:frontend_name"
60 def list_profiles(conn, %{frontend_name: frontend_name}) do
61 with profiles <-
62 FrontendSettingsProfile.get_all_by_user_and_frontend_name(
63 conn.assigns.user,
64 frontend_name
65 ),
66 data <-
67 Enum.map(profiles, fn profile ->
68 %{name: profile.profile_name, version: profile.version}
69 end) do
70 json(conn, data)
71 end
72 end
73
74 @doc "DELETE /api/v1/akkoma/frontend_settings/:frontend_name/:profile_name"
75 def delete_profile(conn, %{frontend_name: frontend_name, profile_name: profile_name}) do
76 with %FrontendSettingsProfile{} = profile <-
77 FrontendSettingsProfile.get_by_user_and_frontend_name_and_profile_name(
78 conn.assigns.user,
79 frontend_name,
80 profile_name
81 ),
82 {:ok, _} <- FrontendSettingsProfile.delete_profile(profile) do
83 json(conn, %{deleted: "ok"})
84 else
85 nil -> {:error, :not_found}
86 end
87 end
88
89 @doc "PUT /api/v1/akkoma/frontend_settings/:frontend_name/:profile_name"
90 def update_profile(%{body_params: %{settings: settings, version: version}} = conn, %{
91 frontend_name: frontend_name,
92 profile_name: profile_name
93 }) do
94 with {:ok, profile} <-
95 FrontendSettingsProfile.create_or_update(
96 conn.assigns.user,
97 frontend_name,
98 profile_name,
99 settings,
100 version
101 ) do
102 conn
103 |> json(profile.settings)
104 end
105 end
106
107 @doc "GET /api/v1/akkoma/preferred_frontend/available"
108 def available_frontends(conn, _params) do
109 available = Pleroma.Config.get([:frontends, :pickable])
110
111 conn
112 |> json(available)
113 end
114
115 @doc "PUT /api/v1/akkoma/preferred_frontend"
116 def update_preferred_frontend(
117 %{body_params: %{frontend_name: preferred_frontend}} = conn,
118 _params
119 ) do
120 conn
121 |> put_resp_cookie("preferred_frontend", preferred_frontend)
122 |> json(%{frontend_name: preferred_frontend})
123 end
124 end