Move single used schemas to Marker operation schema
authorEgor Kislitsyn <egor@kislitsyn.com>
Tue, 5 May 2020 12:45:34 +0000 (16:45 +0400)
committerEgor Kislitsyn <egor@kislitsyn.com>
Tue, 5 May 2020 12:45:34 +0000 (16:45 +0400)
lib/pleroma/web/api_spec/operations/marker_operation.ex
lib/pleroma/web/api_spec/schemas/marker.ex [deleted file]
lib/pleroma/web/api_spec/schemas/markers_response.ex [deleted file]
lib/pleroma/web/api_spec/schemas/markers_upsert_request.ex [deleted file]
lib/pleroma/web/mastodon_api/controllers/marker_controller.ex
lib/pleroma/web/mastodon_api/views/marker_view.ex
test/web/mastodon_api/controllers/marker_controller_test.exs

index 60adc7c7d91184f31ecf0c45c69e7c9fcdca8a4f..06620492a32daa6e320b1c652cba574325ac36ca 100644 (file)
@@ -6,8 +6,6 @@ defmodule Pleroma.Web.ApiSpec.MarkerOperation do
   alias OpenApiSpex.Operation
   alias OpenApiSpex.Schema
   alias Pleroma.Web.ApiSpec.Helpers
-  alias Pleroma.Web.ApiSpec.Schemas.MarkersResponse
-  alias Pleroma.Web.ApiSpec.Schemas.MarkersUpsertRequest
 
   def open_api_operation(action) do
     operation = String.to_existing_atom("#{action}_operation")
@@ -16,7 +14,7 @@ defmodule Pleroma.Web.ApiSpec.MarkerOperation do
 
   def index_operation do
     %Operation{
-      tags: ["markers"],
+      tags: ["Markers"],
       summary: "Get saved timeline position",
       security: [%{"oAuth" => ["read:statuses"]}],
       operationId: "MarkerController.index",
@@ -32,21 +30,111 @@ defmodule Pleroma.Web.ApiSpec.MarkerOperation do
         )
       ],
       responses: %{
-        200 => Operation.response("Marker", "application/json", MarkersResponse)
+        200 => Operation.response("Marker", "application/json", response()),
+        403 => Operation.response("Error", "application/json", api_error())
       }
     }
   end
 
   def upsert_operation do
     %Operation{
-      tags: ["markers"],
+      tags: ["Markers"],
       summary: "Save position in timeline",
       operationId: "MarkerController.upsert",
-      requestBody: Helpers.request_body("Parameters", MarkersUpsertRequest, required: true),
+      requestBody: Helpers.request_body("Parameters", upsert_request(), required: true),
       security: [%{"oAuth" => ["follow", "write:blocks"]}],
       responses: %{
-        200 => Operation.response("Marker", "application/json", MarkersResponse)
+        200 => Operation.response("Marker", "application/json", response()),
+        403 => Operation.response("Error", "application/json", api_error())
       }
     }
   end
+
+  defp marker do
+    %Schema{
+      title: "Marker",
+      description: "Schema for a marker",
+      type: :object,
+      properties: %{
+        last_read_id: %Schema{type: :string},
+        version: %Schema{type: :integer},
+        updated_at: %Schema{type: :string},
+        pleroma: %Schema{
+          type: :object,
+          properties: %{
+            unread_count: %Schema{type: :integer}
+          }
+        }
+      },
+      example: %{
+        "last_read_id" => "35098814",
+        "version" => 361,
+        "updated_at" => "2019-11-26T22:37:25.239Z",
+        "pleroma" => %{"unread_count" => 5}
+      }
+    }
+  end
+
+  defp response do
+    %Schema{
+      title: "MarkersResponse",
+      description: "Response schema for markers",
+      type: :object,
+      properties: %{
+        notifications: %Schema{allOf: [marker()], nullable: true},
+        home: %Schema{allOf: [marker()], nullable: true}
+      },
+      items: %Schema{type: :string},
+      example: %{
+        "notifications" => %{
+          "last_read_id" => "35098814",
+          "version" => 361,
+          "updated_at" => "2019-11-26T22:37:25.239Z",
+          "pleroma" => %{"unread_count" => 0}
+        },
+        "home" => %{
+          "last_read_id" => "103206604258487607",
+          "version" => 468,
+          "updated_at" => "2019-11-26T22:37:25.235Z",
+          "pleroma" => %{"unread_count" => 10}
+        }
+      }
+    }
+  end
+
+  defp upsert_request do
+    %Schema{
+      title: "MarkersUpsertRequest",
+      description: "Request schema for marker upsert",
+      type: :object,
+      properties: %{
+        notifications: %Schema{
+          type: :object,
+          properties: %{
+            last_read_id: %Schema{type: :string}
+          }
+        },
+        home: %Schema{
+          type: :object,
+          properties: %{
+            last_read_id: %Schema{type: :string}
+          }
+        }
+      },
+      example: %{
+        "home" => %{
+          "last_read_id" => "103194548672408537",
+          "version" => 462,
+          "updated_at" => "2019-11-24T19:39:39.337Z"
+        }
+      }
+    }
+  end
+
+  defp api_error do
+    %Schema{
+      type: :object,
+      properties: %{error: %Schema{type: :string}}
+    }
+  end
 end
diff --git a/lib/pleroma/web/api_spec/schemas/marker.ex b/lib/pleroma/web/api_spec/schemas/marker.ex
deleted file mode 100644 (file)
index 64fca59..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-# Pleroma: A lightweight social networking server
-# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>
-# SPDX-License-Identifier: AGPL-3.0-only
-
-defmodule Pleroma.Web.ApiSpec.Schemas.Marker do
-  require OpenApiSpex
-  alias OpenApiSpex.Schema
-
-  OpenApiSpex.schema(%{
-    title: "Marker",
-    description: "Schema for a marker",
-    type: :object,
-    properties: %{
-      last_read_id: %Schema{type: :string},
-      version: %Schema{type: :integer},
-      updated_at: %Schema{type: :string},
-      pleroma: %Schema{
-        type: :object,
-        properties: %{
-          unread_count: %Schema{type: :integer}
-        }
-      }
-    },
-    example: %{
-      "last_read_id" => "35098814",
-      "version" => 361,
-      "updated_at" => "2019-11-26T22:37:25.239Z",
-      "pleroma" => %{"unread_count" => 5}
-    }
-  })
-end
diff --git a/lib/pleroma/web/api_spec/schemas/markers_response.ex b/lib/pleroma/web/api_spec/schemas/markers_response.ex
deleted file mode 100644 (file)
index cb11219..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-# Pleroma: A lightweight social networking server
-# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>
-# SPDX-License-Identifier: AGPL-3.0-only
-
-defmodule Pleroma.Web.ApiSpec.Schemas.MarkersResponse do
-  require OpenApiSpex
-  alias OpenApiSpex.Schema
-
-  alias Pleroma.Web.ApiSpec.Schemas.Marker
-
-  OpenApiSpex.schema(%{
-    title: "MarkersResponse",
-    description: "Response schema for markers",
-    type: :object,
-    properties: %{
-      notifications: %Schema{allOf: [Marker], nullable: true},
-      home: %Schema{allOf: [Marker], nullable: true}
-    },
-    items: %Schema{type: :string},
-    example: %{
-      "notifications" => %{
-        "last_read_id" => "35098814",
-        "version" => 361,
-        "updated_at" => "2019-11-26T22:37:25.239Z",
-        "pleroma" => %{"unread_count" => 0}
-      },
-      "home" => %{
-        "last_read_id" => "103206604258487607",
-        "version" => 468,
-        "updated_at" => "2019-11-26T22:37:25.235Z",
-        "pleroma" => %{"unread_count" => 10}
-      }
-    }
-  })
-end
diff --git a/lib/pleroma/web/api_spec/schemas/markers_upsert_request.ex b/lib/pleroma/web/api_spec/schemas/markers_upsert_request.ex
deleted file mode 100644 (file)
index 97dcc24..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-# Pleroma: A lightweight social networking server
-# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>
-# SPDX-License-Identifier: AGPL-3.0-only
-
-defmodule Pleroma.Web.ApiSpec.Schemas.MarkersUpsertRequest do
-  require OpenApiSpex
-  alias OpenApiSpex.Schema
-
-  OpenApiSpex.schema(%{
-    title: "MarkersUpsertRequest",
-    description: "Request schema for marker upsert",
-    type: :object,
-    properties: %{
-      notifications: %Schema{
-        type: :object,
-        properties: %{
-          last_read_id: %Schema{type: :string}
-        }
-      },
-      home: %Schema{
-        type: :object,
-        properties: %{
-          last_read_id: %Schema{type: :string}
-        }
-      }
-    },
-    example: %{
-      "home" => %{
-        "last_read_id" => "103194548672408537",
-        "version" => 462,
-        "updated_at" => "2019-11-24T19:39:39.337Z"
-      }
-    }
-  })
-end
index b94171b365d429a07d582ee4006361cc4713dc63..85310edfa7c938d84d371cf0d2409aa300d42520 100644 (file)
@@ -6,6 +6,8 @@ defmodule Pleroma.Web.MastodonAPI.MarkerController do
   use Pleroma.Web, :controller
   alias Pleroma.Plugs.OAuthScopesPlug
 
+  plug(Pleroma.Web.ApiSpec.CastAndValidate)
+
   plug(
     OAuthScopesPlug,
     %{scopes: ["read:statuses"]}
@@ -15,7 +17,6 @@ defmodule Pleroma.Web.MastodonAPI.MarkerController do
   plug(OAuthScopesPlug, %{scopes: ["write:statuses"]} when action == :upsert)
 
   action_fallback(Pleroma.Web.MastodonAPI.FallbackController)
-  plug(OpenApiSpex.Plug.CastAndValidate)
 
   defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.MarkerOperation
 
@@ -27,10 +28,7 @@ defmodule Pleroma.Web.MastodonAPI.MarkerController do
 
   # POST /api/v1/markers
   def upsert(%{assigns: %{user: user}, body_params: params} = conn, _) do
-    params =
-      params
-      |> Map.from_struct()
-      |> Map.new(fn {key, value} -> {to_string(key), value} end)
+    params = Map.new(params, fn {key, value} -> {to_string(key), value} end)
 
     with {:ok, result} <- Pleroma.Marker.upsert(user, params),
          markers <- Map.values(result) do
index 985368fe5a771463fb780403a17871fbf6d7bcab..9705b7a914290d1ed3a58f60d81e1b7603877cc9 100644 (file)
@@ -6,12 +6,13 @@ defmodule Pleroma.Web.MastodonAPI.MarkerView do
   use Pleroma.Web, :view
 
   def render("markers.json", %{markers: markers}) do
-    Enum.reduce(markers, %{}, fn m, acc ->
-      Map.put_new(acc, m.timeline, %{
-        last_read_id: m.last_read_id,
-        version: m.lock_version,
-        updated_at: NaiveDateTime.to_iso8601(m.updated_at)
-      })
+    Map.new(markers, fn m ->
+      {m.timeline,
+       %{
+         last_read_id: m.last_read_id,
+         version: m.lock_version,
+         updated_at: NaiveDateTime.to_iso8601(m.updated_at)
+       }}
     end)
   end
 end
index 1c85ed032ef3b1f641887ae8e6f7e5325399e3c1..bce719bea3dfefe2fb82b60657aff3f2cadec3c9 100644 (file)
@@ -4,10 +4,8 @@
 
 defmodule Pleroma.Web.MastodonAPI.MarkerControllerTest do
   use Pleroma.Web.ConnCase
-  alias Pleroma.Web.ApiSpec
 
   import Pleroma.Factory
-  import OpenApiSpex.TestAssertions
 
   describe "GET /api/v1/markers" do
     test "gets markers with correct scopes", %{conn: conn} do
@@ -25,7 +23,7 @@ defmodule Pleroma.Web.MastodonAPI.MarkerControllerTest do
         |> assign(:user, user)
         |> assign(:token, token)
         |> get("/api/v1/markers?timeline[]=notifications")
-        |> json_response(200)
+        |> json_response_and_validate_schema(200)
 
       assert response == %{
                "notifications" => %{
@@ -34,8 +32,6 @@ defmodule Pleroma.Web.MastodonAPI.MarkerControllerTest do
                  "version" => 0
                }
              }
-
-      assert_schema(response, "MarkersResponse", ApiSpec.spec())
     end
 
     test "gets markers with missed scopes", %{conn: conn} do
@@ -49,7 +45,7 @@ defmodule Pleroma.Web.MastodonAPI.MarkerControllerTest do
         |> assign(:user, user)
         |> assign(:token, token)
         |> get("/api/v1/markers", %{timeline: ["notifications"]})
-        |> json_response(403)
+        |> json_response_and_validate_schema(403)
 
       assert response == %{"error" => "Insufficient permissions: read:statuses."}
     end
@@ -69,7 +65,7 @@ defmodule Pleroma.Web.MastodonAPI.MarkerControllerTest do
           home: %{last_read_id: "777"},
           notifications: %{"last_read_id" => "69420"}
         })
-        |> json_response(200)
+        |> json_response_and_validate_schema(200)
 
       assert %{
                "notifications" => %{
@@ -78,8 +74,6 @@ defmodule Pleroma.Web.MastodonAPI.MarkerControllerTest do
                  "version" => 0
                }
              } = response
-
-      assert_schema(response, "MarkersResponse", ApiSpec.spec())
     end
 
     test "updates exist marker", %{conn: conn} do
@@ -101,7 +95,7 @@ defmodule Pleroma.Web.MastodonAPI.MarkerControllerTest do
           home: %{last_read_id: "777"},
           notifications: %{"last_read_id" => "69888"}
         })
-        |> json_response(200)
+        |> json_response_and_validate_schema(200)
 
       assert response == %{
                "notifications" => %{
@@ -110,8 +104,6 @@ defmodule Pleroma.Web.MastodonAPI.MarkerControllerTest do
                  "version" => 0
                }
              }
-
-      assert_schema(response, "MarkersResponse", ApiSpec.spec())
     end
 
     test "creates a marker with missed scopes", %{conn: conn} do
@@ -122,11 +114,12 @@ defmodule Pleroma.Web.MastodonAPI.MarkerControllerTest do
         conn
         |> assign(:user, user)
         |> assign(:token, token)
+        |> put_req_header("content-type", "application/json")
         |> post("/api/v1/markers", %{
           home: %{last_read_id: "777"},
           notifications: %{"last_read_id" => "69420"}
         })
-        |> json_response(403)
+        |> json_response_and_validate_schema(403)
 
       assert response == %{"error" => "Insufficient permissions: write:statuses."}
     end