Browse Source

Extract apps actions from `MastodonAPIController` to `AppController`

object-id-column
Egor Kislitsyn 4 years ago
parent
commit
2dad6dd020
No known key found for this signature in database GPG Key ID: 1B49CB15B71E7805
6 changed files with 103 additions and 82 deletions
  1. +1
    -1
      lib/pleroma/web/activity_pub/views/user_view.ex
  2. +39
    -0
      lib/pleroma/web/mastodon_api/controllers/app_controller.ex
  3. +1
    -30
      lib/pleroma/web/mastodon_api/controllers/mastodon_api_controller.ex
  4. +2
    -2
      lib/pleroma/web/router.ex
  5. +60
    -0
      test/web/mastodon_api/controllers/app_controller_test.exs
  6. +0
    -49
      test/web/mastodon_api/mastodon_api_controller_test.exs

+ 1
- 1
lib/pleroma/web/activity_pub/views/user_view.ex View File

@@ -22,7 +22,7 @@ defmodule Pleroma.Web.ActivityPub.UserView do
def render("endpoints.json", %{user: %User{local: true} = _user}) do
%{
"oauthAuthorizationEndpoint" => Helpers.o_auth_url(Endpoint, :authorize),
"oauthRegistrationEndpoint" => Helpers.mastodon_api_url(Endpoint, :create_app),
"oauthRegistrationEndpoint" => Helpers.app_url(Endpoint, :create),
"oauthTokenEndpoint" => Helpers.o_auth_url(Endpoint, :token_exchange),
"sharedInbox" => Helpers.activity_pub_url(Endpoint, :inbox),
"uploadMedia" => Helpers.activity_pub_url(Endpoint, :upload_media)


+ 39
- 0
lib/pleroma/web/mastodon_api/controllers/app_controller.ex View File

@@ -0,0 +1,39 @@
# Pleroma: A lightweight social networking server
# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
# SPDX-License-Identifier: AGPL-3.0-only

defmodule Pleroma.Web.MastodonAPI.AppController do
use Pleroma.Web, :controller

alias Pleroma.Repo
alias Pleroma.Web.OAuth.App
alias Pleroma.Web.OAuth.Scopes
alias Pleroma.Web.OAuth.Token

action_fallback(Pleroma.Web.MastodonAPI.FallbackController)

@local_mastodon_name "Mastodon-Local"

@doc "POST /api/v1/apps"
def create(conn, params) do
scopes = Scopes.fetch_scopes(params, ["read"])

app_attrs =
params
|> Map.drop(["scope", "scopes"])
|> Map.put("scopes", scopes)

with cs <- App.register_changeset(%App{}, app_attrs),
false <- cs.changes[:client_name] == @local_mastodon_name,
{:ok, app} <- Repo.insert(cs) do
render(conn, "show.json", app: app)
end
end

@doc "GET /api/v1/apps/verify_credentials"
def verify_credentials(%{assigns: %{user: _user, token: token}} = conn, _) do
with %Token{app: %App{} = app} <- Repo.preload(token, :app) do
render(conn, "short.json", app: app)
end
end
end

+ 1
- 30
lib/pleroma/web/mastodon_api/controllers/mastodon_api_controller.ex View File

@@ -11,19 +11,16 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
alias Pleroma.Config
alias Pleroma.Pagination
alias Pleroma.Plugs.RateLimiter
alias Pleroma.Repo
alias Pleroma.Stats
alias Pleroma.User
alias Pleroma.Web
alias Pleroma.Web.ActivityPub.ActivityPub
alias Pleroma.Web.CommonAPI
alias Pleroma.Web.MastodonAPI.AccountView
alias Pleroma.Web.MastodonAPI.AppView
alias Pleroma.Web.MastodonAPI.MastodonView
alias Pleroma.Web.MastodonAPI.StatusView
alias Pleroma.Web.OAuth.App
alias Pleroma.Web.OAuth.Authorization
alias Pleroma.Web.OAuth.Scopes
alias Pleroma.Web.OAuth.Token
alias Pleroma.Web.TwitterAPI.TwitterAPI

@@ -31,35 +28,9 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do

plug(RateLimiter, :password_reset when action == :password_reset)

@local_mastodon_name "Mastodon-Local"

action_fallback(Pleroma.Web.MastodonAPI.FallbackController)

def create_app(conn, params) do
scopes = Scopes.fetch_scopes(params, ["read"])

app_attrs =
params
|> Map.drop(["scope", "scopes"])
|> Map.put("scopes", scopes)

with cs <- App.register_changeset(%App{}, app_attrs),
false <- cs.changes[:client_name] == @local_mastodon_name,
{:ok, app} <- Repo.insert(cs) do
conn
|> put_view(AppView)
|> render("show.json", %{app: app})
end
end

def verify_app_credentials(%{assigns: %{user: _user, token: token}} = conn, _) do
with %Token{app: %App{} = app} <- Repo.preload(token, :app) do
conn
|> put_view(AppView)
|> render("short.json", %{app: app})
end
end

@local_mastodon_name "Mastodon-Local"
@mastodon_api_level "2.7.2"

def masto_instance(conn, _params) do


+ 2
- 2
lib/pleroma/web/router.ex View File

@@ -464,8 +464,8 @@ defmodule Pleroma.Web.Router do

get("/instance", MastodonAPIController, :masto_instance)
get("/instance/peers", MastodonAPIController, :peers)
post("/apps", MastodonAPIController, :create_app)
get("/apps/verify_credentials", MastodonAPIController, :verify_app_credentials)
post("/apps", AppController, :create)
get("/apps/verify_credentials", AppController, :verify_credentials)
get("/custom_emojis", MastodonAPIController, :custom_emojis)

get("/statuses/:id/card", StatusController, :card)


+ 60
- 0
test/web/mastodon_api/controllers/app_controller_test.exs View File

@@ -0,0 +1,60 @@
# Pleroma: A lightweight social networking server
# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
# SPDX-License-Identifier: AGPL-3.0-only

defmodule Pleroma.Web.MastodonAPI.AppControllerTest do
use Pleroma.Web.ConnCase, async: true

alias Pleroma.Repo
alias Pleroma.Web.OAuth.App
alias Pleroma.Web.Push

import Pleroma.Factory

test "apps/verify_credentials", %{conn: conn} do
token = insert(:oauth_token)

conn =
conn
|> assign(:user, token.user)
|> assign(:token, token)
|> get("/api/v1/apps/verify_credentials")

app = Repo.preload(token, :app).app

expected = %{
"name" => app.client_name,
"website" => app.website,
"vapid_key" => Push.vapid_config() |> Keyword.get(:public_key)
}

assert expected == json_response(conn, 200)
end

test "creates an oauth app", %{conn: conn} do
user = insert(:user)
app_attrs = build(:oauth_app)

conn =
conn
|> assign(:user, user)
|> post("/api/v1/apps", %{
client_name: app_attrs.client_name,
redirect_uris: app_attrs.redirect_uris
})

[app] = Repo.all(App)

expected = %{
"name" => app.client_name,
"website" => app.website,
"client_id" => app.client_id,
"client_secret" => app.client_secret,
"id" => app.id |> to_string(),
"redirect_uri" => app.redirect_uris,
"vapid_key" => Push.vapid_config() |> Keyword.get(:public_key)
}

assert expected == json_response(conn, 200)
end
end

+ 0
- 49
test/web/mastodon_api/mastodon_api_controller_test.exs View File

@@ -12,8 +12,6 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
alias Pleroma.Tests.ObanHelpers
alias Pleroma.User
alias Pleroma.Web.CommonAPI
alias Pleroma.Web.OAuth.App
alias Pleroma.Web.Push

import Pleroma.Factory
import Swoosh.TestAssertions
@@ -27,53 +25,6 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
clear_config([:instance, :public])
clear_config([:rich_media, :enabled])

test "apps/verify_credentials", %{conn: conn} do
token = insert(:oauth_token)

conn =
conn
|> assign(:user, token.user)
|> assign(:token, token)
|> get("/api/v1/apps/verify_credentials")

app = Repo.preload(token, :app).app

expected = %{
"name" => app.client_name,
"website" => app.website,
"vapid_key" => Push.vapid_config() |> Keyword.get(:public_key)
}

assert expected == json_response(conn, 200)
end

test "creates an oauth app", %{conn: conn} do
user = insert(:user)
app_attrs = build(:oauth_app)

conn =
conn
|> assign(:user, user)
|> post("/api/v1/apps", %{
client_name: app_attrs.client_name,
redirect_uris: app_attrs.redirect_uris
})

[app] = Repo.all(App)

expected = %{
"name" => app.client_name,
"website" => app.website,
"client_id" => app.client_id,
"client_secret" => app.client_secret,
"id" => app.id |> to_string(),
"redirect_uri" => app.redirect_uris,
"vapid_key" => Push.vapid_config() |> Keyword.get(:public_key)
}

assert expected == json_response(conn, 200)
end

test "getting a list of mutes", %{conn: conn} do
user = insert(:user)
other_user = insert(:user)


Loading…
Cancel
Save