Merge branch 'tusooa/api-spec-property-map' into 'develop'
OpenApiSpex: overhaul See merge request pleroma/pleroma!3832
This commit is contained in:
commit
755279e253
|
@ -6,7 +6,70 @@ defmodule Mix.Tasks.Pleroma.OpenapiSpec do
|
||||||
def run([path]) do
|
def run([path]) do
|
||||||
# Load Pleroma application to get version info
|
# Load Pleroma application to get version info
|
||||||
Application.load(:pleroma)
|
Application.load(:pleroma)
|
||||||
spec = Pleroma.Web.ApiSpec.spec(server_specific: false) |> Jason.encode!()
|
|
||||||
File.write(path, spec)
|
spec_json = Pleroma.Web.ApiSpec.spec(server_specific: false) |> Jason.encode!()
|
||||||
|
# to get rid of the structs
|
||||||
|
spec_regened = spec_json |> Jason.decode!()
|
||||||
|
|
||||||
|
check_specs!(spec_regened)
|
||||||
|
|
||||||
|
File.write(path, spec_json)
|
||||||
|
end
|
||||||
|
|
||||||
|
defp check_specs!(spec) do
|
||||||
|
with :ok <- check_specs(spec) do
|
||||||
|
:ok
|
||||||
|
else
|
||||||
|
{_, errors} ->
|
||||||
|
IO.puts(IO.ANSI.format([:red, :bright, "Spec check failed, errors:"]))
|
||||||
|
Enum.map(errors, &IO.puts/1)
|
||||||
|
|
||||||
|
raise "Spec check failed"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def check_specs(spec) do
|
||||||
|
errors =
|
||||||
|
spec["paths"]
|
||||||
|
|> Enum.flat_map(fn {path, %{} = endpoints} ->
|
||||||
|
Enum.map(
|
||||||
|
endpoints,
|
||||||
|
fn {method, endpoint} ->
|
||||||
|
with :ok <- check_endpoint(spec, endpoint) do
|
||||||
|
:ok
|
||||||
|
else
|
||||||
|
error ->
|
||||||
|
"#{endpoint["operationId"]} (#{method} #{path}): #{error}"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
)
|
||||||
|
|> Enum.reject(fn res -> res == :ok end)
|
||||||
|
end)
|
||||||
|
|
||||||
|
if errors == [] do
|
||||||
|
:ok
|
||||||
|
else
|
||||||
|
{:error, errors}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
defp check_endpoint(spec, endpoint) do
|
||||||
|
valid_tags = available_tags(spec)
|
||||||
|
|
||||||
|
with {_, [_ | _] = tags} <- {:tags, endpoint["tags"]},
|
||||||
|
{_, []} <- {:unavailable, Enum.reject(tags, &(&1 in valid_tags))} do
|
||||||
|
:ok
|
||||||
|
else
|
||||||
|
{:tags, _} ->
|
||||||
|
"No tags specified"
|
||||||
|
|
||||||
|
{:unavailable, tags} ->
|
||||||
|
"Tags #{inspect(tags)} not available. Please add it in \"x-tagGroups\" in Pleroma.Web.ApiSpec"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
defp available_tags(spec) do
|
||||||
|
spec["x-tagGroups"]
|
||||||
|
|> Enum.flat_map(fn %{"tags" => tags} -> tags end)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -95,7 +95,8 @@ def spec(opts \\ []) do
|
||||||
"Relays",
|
"Relays",
|
||||||
"Report managment",
|
"Report managment",
|
||||||
"Status administration",
|
"Status administration",
|
||||||
"User administration"
|
"User administration",
|
||||||
|
"Announcement management"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
%{"name" => "Applications", "tags" => ["Applications", "Push subscriptions"]},
|
%{"name" => "Applications", "tags" => ["Applications", "Push subscriptions"]},
|
||||||
|
@ -110,10 +111,12 @@ def spec(opts \\ []) do
|
||||||
"Follow requests",
|
"Follow requests",
|
||||||
"Mascot",
|
"Mascot",
|
||||||
"Markers",
|
"Markers",
|
||||||
"Notifications"
|
"Notifications",
|
||||||
|
"Filters",
|
||||||
|
"Settings"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
%{"name" => "Instance", "tags" => ["Custom emojis"]},
|
%{"name" => "Instance", "tags" => ["Custom emojis", "Instance misc"]},
|
||||||
%{"name" => "Messaging", "tags" => ["Chats", "Conversations"]},
|
%{"name" => "Messaging", "tags" => ["Chats", "Conversations"]},
|
||||||
%{
|
%{
|
||||||
"name" => "Statuses",
|
"name" => "Statuses",
|
||||||
|
@ -125,10 +128,21 @@ def spec(opts \\ []) do
|
||||||
"Retrieve status information",
|
"Retrieve status information",
|
||||||
"Scheduled statuses",
|
"Scheduled statuses",
|
||||||
"Search",
|
"Search",
|
||||||
"Status actions"
|
"Status actions",
|
||||||
|
"Media attachments"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
%{"name" => "Miscellaneous", "tags" => ["Emoji packs", "Reports", "Suggestions"]}
|
%{
|
||||||
|
"name" => "Miscellaneous",
|
||||||
|
"tags" => [
|
||||||
|
"Emoji packs",
|
||||||
|
"Reports",
|
||||||
|
"Suggestions",
|
||||||
|
"Announcements",
|
||||||
|
"Remote interaction",
|
||||||
|
"Others"
|
||||||
|
]
|
||||||
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -461,7 +461,7 @@ def blocks_operation do
|
||||||
|
|
||||||
def lookup_operation do
|
def lookup_operation do
|
||||||
%Operation{
|
%Operation{
|
||||||
tags: ["Account lookup"],
|
tags: ["Retrieve account information"],
|
||||||
summary: "Find a user by nickname",
|
summary: "Find a user by nickname",
|
||||||
operationId: "AccountController.lookup",
|
operationId: "AccountController.lookup",
|
||||||
parameters: [
|
parameters: [
|
||||||
|
|
|
@ -17,7 +17,7 @@ def open_api_operation(action) do
|
||||||
|
|
||||||
def index_operation do
|
def index_operation do
|
||||||
%Operation{
|
%Operation{
|
||||||
tags: ["Announcement managment"],
|
tags: ["Announcement management"],
|
||||||
summary: "Retrieve a list of announcements",
|
summary: "Retrieve a list of announcements",
|
||||||
operationId: "AdminAPI.AnnouncementController.index",
|
operationId: "AdminAPI.AnnouncementController.index",
|
||||||
security: [%{"oAuth" => ["admin:read"]}],
|
security: [%{"oAuth" => ["admin:read"]}],
|
||||||
|
@ -46,7 +46,7 @@ def index_operation do
|
||||||
|
|
||||||
def show_operation do
|
def show_operation do
|
||||||
%Operation{
|
%Operation{
|
||||||
tags: ["Announcement managment"],
|
tags: ["Announcement management"],
|
||||||
summary: "Display one announcement",
|
summary: "Display one announcement",
|
||||||
operationId: "AdminAPI.AnnouncementController.show",
|
operationId: "AdminAPI.AnnouncementController.show",
|
||||||
security: [%{"oAuth" => ["admin:read"]}],
|
security: [%{"oAuth" => ["admin:read"]}],
|
||||||
|
@ -69,7 +69,7 @@ def show_operation do
|
||||||
|
|
||||||
def delete_operation do
|
def delete_operation do
|
||||||
%Operation{
|
%Operation{
|
||||||
tags: ["Announcement managment"],
|
tags: ["Announcement management"],
|
||||||
summary: "Delete one announcement",
|
summary: "Delete one announcement",
|
||||||
operationId: "AdminAPI.AnnouncementController.delete",
|
operationId: "AdminAPI.AnnouncementController.delete",
|
||||||
security: [%{"oAuth" => ["admin:write"]}],
|
security: [%{"oAuth" => ["admin:write"]}],
|
||||||
|
@ -92,7 +92,7 @@ def delete_operation do
|
||||||
|
|
||||||
def create_operation do
|
def create_operation do
|
||||||
%Operation{
|
%Operation{
|
||||||
tags: ["Announcement managment"],
|
tags: ["Announcement management"],
|
||||||
summary: "Create one announcement",
|
summary: "Create one announcement",
|
||||||
operationId: "AdminAPI.AnnouncementController.create",
|
operationId: "AdminAPI.AnnouncementController.create",
|
||||||
security: [%{"oAuth" => ["admin:write"]}],
|
security: [%{"oAuth" => ["admin:write"]}],
|
||||||
|
@ -107,7 +107,7 @@ def create_operation do
|
||||||
|
|
||||||
def change_operation do
|
def change_operation do
|
||||||
%Operation{
|
%Operation{
|
||||||
tags: ["Announcement managment"],
|
tags: ["Announcement management"],
|
||||||
summary: "Change one announcement",
|
summary: "Change one announcement",
|
||||||
operationId: "AdminAPI.AnnouncementController.change",
|
operationId: "AdminAPI.AnnouncementController.change",
|
||||||
security: [%{"oAuth" => ["admin:write"]}],
|
security: [%{"oAuth" => ["admin:write"]}],
|
||||||
|
|
|
@ -70,7 +70,7 @@ def index_operation do
|
||||||
|
|
||||||
def show_operation do
|
def show_operation do
|
||||||
%Operation{
|
%Operation{
|
||||||
tags: ["Status adminitration)"],
|
tags: ["Status administration"],
|
||||||
summary: "Get status",
|
summary: "Get status",
|
||||||
operationId: "AdminAPI.StatusController.show",
|
operationId: "AdminAPI.StatusController.show",
|
||||||
parameters: [id_param() | admin_api_params()],
|
parameters: [id_param() | admin_api_params()],
|
||||||
|
@ -84,7 +84,7 @@ def show_operation do
|
||||||
|
|
||||||
def update_operation do
|
def update_operation do
|
||||||
%Operation{
|
%Operation{
|
||||||
tags: ["Status adminitration)"],
|
tags: ["Status administration"],
|
||||||
summary: "Change the scope of a status",
|
summary: "Change the scope of a status",
|
||||||
operationId: "AdminAPI.StatusController.update",
|
operationId: "AdminAPI.StatusController.update",
|
||||||
parameters: [id_param() | admin_api_params()],
|
parameters: [id_param() | admin_api_params()],
|
||||||
|
@ -99,7 +99,7 @@ def update_operation do
|
||||||
|
|
||||||
def delete_operation do
|
def delete_operation do
|
||||||
%Operation{
|
%Operation{
|
||||||
tags: ["Status adminitration)"],
|
tags: ["Status administration"],
|
||||||
summary: "Delete status",
|
summary: "Delete status",
|
||||||
operationId: "AdminAPI.StatusController.delete",
|
operationId: "AdminAPI.StatusController.delete",
|
||||||
parameters: [id_param() | admin_api_params()],
|
parameters: [id_param() | admin_api_params()],
|
||||||
|
@ -143,7 +143,7 @@ def admin_account do
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
tags: %Schema{type: :string},
|
tags: %Schema{type: :string},
|
||||||
is_confirmed: %Schema{type: :string}
|
is_confirmed: %Schema{type: :boolean}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
|
@ -15,7 +15,7 @@ def open_api_operation(action) do
|
||||||
|
|
||||||
def index_operation do
|
def index_operation do
|
||||||
%Operation{
|
%Operation{
|
||||||
tags: ["Announcement"],
|
tags: ["Announcements"],
|
||||||
summary: "Retrieve a list of announcements",
|
summary: "Retrieve a list of announcements",
|
||||||
operationId: "MastodonAPI.AnnouncementController.index",
|
operationId: "MastodonAPI.AnnouncementController.index",
|
||||||
security: [%{"oAuth" => []}],
|
security: [%{"oAuth" => []}],
|
||||||
|
@ -28,7 +28,7 @@ def index_operation do
|
||||||
|
|
||||||
def mark_read_operation do
|
def mark_read_operation do
|
||||||
%Operation{
|
%Operation{
|
||||||
tags: ["Announcement"],
|
tags: ["Announcements"],
|
||||||
summary: "Mark one announcement as read",
|
summary: "Mark one announcement as read",
|
||||||
operationId: "MastodonAPI.AnnouncementController.mark_read",
|
operationId: "MastodonAPI.AnnouncementController.mark_read",
|
||||||
security: [%{"oAuth" => ["write:accounts"]}],
|
security: [%{"oAuth" => ["write:accounts"]}],
|
||||||
|
|
|
@ -17,7 +17,7 @@ def open_api_operation(action) do
|
||||||
|
|
||||||
def index_operation do
|
def index_operation do
|
||||||
%Operation{
|
%Operation{
|
||||||
tags: ["Directory"],
|
tags: ["Others"],
|
||||||
summary: "Profile directory",
|
summary: "Profile directory",
|
||||||
operationId: "DirectoryController.index",
|
operationId: "DirectoryController.index",
|
||||||
parameters:
|
parameters:
|
||||||
|
|
|
@ -13,7 +13,7 @@ def open_api_operation(action) do
|
||||||
|
|
||||||
def show_operation do
|
def show_operation do
|
||||||
%Operation{
|
%Operation{
|
||||||
tags: ["Instance"],
|
tags: ["Instance misc"],
|
||||||
summary: "Retrieve instance information",
|
summary: "Retrieve instance information",
|
||||||
description: "Information about the server",
|
description: "Information about the server",
|
||||||
operationId: "InstanceController.show",
|
operationId: "InstanceController.show",
|
||||||
|
@ -25,7 +25,7 @@ def show_operation do
|
||||||
|
|
||||||
def peers_operation do
|
def peers_operation do
|
||||||
%Operation{
|
%Operation{
|
||||||
tags: ["Instance"],
|
tags: ["Instance misc"],
|
||||||
summary: "Retrieve list of known instances",
|
summary: "Retrieve list of known instances",
|
||||||
operationId: "InstanceController.peers",
|
operationId: "InstanceController.peers",
|
||||||
responses: %{
|
responses: %{
|
||||||
|
|
|
@ -133,7 +133,11 @@ defp name_param do
|
||||||
defp files_object do
|
defp files_object do
|
||||||
%Schema{
|
%Schema{
|
||||||
type: :object,
|
type: :object,
|
||||||
additionalProperties: %Schema{type: :string},
|
additionalProperties: %Schema{
|
||||||
|
type: :string,
|
||||||
|
description: "Filename of the emoji",
|
||||||
|
extensions: %{"x-additionalPropertiesName": "Emoji name"}
|
||||||
|
},
|
||||||
description: "Object with emoji names as keys and filenames as values"
|
description: "Object with emoji names as keys and filenames as values"
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
|
@ -227,13 +227,29 @@ defp ok_response do
|
||||||
|
|
||||||
defp emoji_packs_response do
|
defp emoji_packs_response do
|
||||||
Operation.response(
|
Operation.response(
|
||||||
"Object with pack names as keys and pack contents as values",
|
"Emoji packs and the count",
|
||||||
"application/json",
|
"application/json",
|
||||||
%Schema{
|
%Schema{
|
||||||
type: :object,
|
type: :object,
|
||||||
additionalProperties: emoji_pack(),
|
properties: %{
|
||||||
|
packs: %Schema{
|
||||||
|
type: :object,
|
||||||
|
description: "Object with pack names as keys and pack contents as values",
|
||||||
|
additionalProperties: %Schema{
|
||||||
|
emoji_pack()
|
||||||
|
| extensions: %{"x-additionalPropertiesName": "Pack name"}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
count: %Schema{
|
||||||
|
type: :integer,
|
||||||
|
description: "Number of emoji packs"
|
||||||
|
}
|
||||||
|
},
|
||||||
example: %{
|
example: %{
|
||||||
"emojos" => emoji_pack().example
|
"packs" => %{
|
||||||
|
"emojos" => emoji_pack().example
|
||||||
|
},
|
||||||
|
"count" => 1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
@ -274,7 +290,11 @@ defp emoji_pack do
|
||||||
defp files_object do
|
defp files_object do
|
||||||
%Schema{
|
%Schema{
|
||||||
type: :object,
|
type: :object,
|
||||||
additionalProperties: %Schema{type: :string},
|
additionalProperties: %Schema{
|
||||||
|
type: :string,
|
||||||
|
description: "Filename",
|
||||||
|
extensions: %{"x-additionalPropertiesName": "Emoji name"}
|
||||||
|
},
|
||||||
description: "Object with emoji names as keys and filenames as values"
|
description: "Object with emoji names as keys and filenames as values"
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
|
@ -13,7 +13,7 @@ def open_api_operation(action) do
|
||||||
|
|
||||||
def show_operation do
|
def show_operation do
|
||||||
%Operation{
|
%Operation{
|
||||||
tags: ["Instance"],
|
tags: ["Instance misc"],
|
||||||
summary: "Retrieve federation status",
|
summary: "Retrieve federation status",
|
||||||
description: "Information about instances deemed unreachable by the server",
|
description: "Information about instances deemed unreachable by the server",
|
||||||
operationId: "PleromaInstances.show",
|
operationId: "PleromaInstances.show",
|
||||||
|
|
|
@ -440,7 +440,7 @@ def bookmarks_operation do
|
||||||
|
|
||||||
def show_history_operation do
|
def show_history_operation do
|
||||||
%Operation{
|
%Operation{
|
||||||
tags: ["Retrieve status history"],
|
tags: ["Retrieve status information"],
|
||||||
summary: "Status history",
|
summary: "Status history",
|
||||||
description: "View history of a status",
|
description: "View history of a status",
|
||||||
operationId: "StatusController.show_history",
|
operationId: "StatusController.show_history",
|
||||||
|
@ -457,7 +457,7 @@ def show_history_operation do
|
||||||
|
|
||||||
def show_source_operation do
|
def show_source_operation do
|
||||||
%Operation{
|
%Operation{
|
||||||
tags: ["Retrieve status source"],
|
tags: ["Retrieve status information"],
|
||||||
summary: "Status source",
|
summary: "Status source",
|
||||||
description: "View source of a status",
|
description: "View source of a status",
|
||||||
operationId: "StatusController.show_source",
|
operationId: "StatusController.show_source",
|
||||||
|
@ -474,7 +474,7 @@ def show_source_operation do
|
||||||
|
|
||||||
def update_operation do
|
def update_operation do
|
||||||
%Operation{
|
%Operation{
|
||||||
tags: ["Update status"],
|
tags: ["Status actions"],
|
||||||
summary: "Update status",
|
summary: "Update status",
|
||||||
description: "Change the content of a status",
|
description: "Change the content of a status",
|
||||||
operationId: "StatusController.update",
|
operationId: "StatusController.update",
|
||||||
|
|
|
@ -17,7 +17,7 @@ def open_api_operation(action) do
|
||||||
|
|
||||||
def emoji_operation do
|
def emoji_operation do
|
||||||
%Operation{
|
%Operation{
|
||||||
tags: ["Emojis"],
|
tags: ["Custom emojis"],
|
||||||
summary: "List all custom emojis",
|
summary: "List all custom emojis",
|
||||||
operationId: "UtilController.emoji",
|
operationId: "UtilController.emoji",
|
||||||
parameters: [],
|
parameters: [],
|
||||||
|
@ -30,7 +30,8 @@ def emoji_operation do
|
||||||
properties: %{
|
properties: %{
|
||||||
image_url: %Schema{type: :string},
|
image_url: %Schema{type: :string},
|
||||||
tags: %Schema{type: :array, items: %Schema{type: :string}}
|
tags: %Schema{type: :array, items: %Schema{type: :string}}
|
||||||
}
|
},
|
||||||
|
extensions: %{"x-additionalPropertiesName": "Emoji name"}
|
||||||
},
|
},
|
||||||
example: %{
|
example: %{
|
||||||
"firefox" => %{
|
"firefox" => %{
|
||||||
|
@ -45,7 +46,7 @@ def emoji_operation do
|
||||||
|
|
||||||
def frontend_configurations_operation do
|
def frontend_configurations_operation do
|
||||||
%Operation{
|
%Operation{
|
||||||
tags: ["Configuration"],
|
tags: ["Others"],
|
||||||
summary: "Dump frontend configurations",
|
summary: "Dump frontend configurations",
|
||||||
operationId: "UtilController.frontend_configurations",
|
operationId: "UtilController.frontend_configurations",
|
||||||
parameters: [],
|
parameters: [],
|
||||||
|
@ -53,7 +54,12 @@ def frontend_configurations_operation do
|
||||||
200 =>
|
200 =>
|
||||||
Operation.response("List", "application/json", %Schema{
|
Operation.response("List", "application/json", %Schema{
|
||||||
type: :object,
|
type: :object,
|
||||||
additionalProperties: %Schema{type: :object}
|
additionalProperties: %Schema{
|
||||||
|
type: :object,
|
||||||
|
description:
|
||||||
|
"Opaque object representing the instance-wide configuration for the frontend",
|
||||||
|
extensions: %{"x-additionalPropertiesName": "Frontend name"}
|
||||||
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -132,7 +138,7 @@ defp change_email_request do
|
||||||
|
|
||||||
def update_notificaton_settings_operation do
|
def update_notificaton_settings_operation do
|
||||||
%Operation{
|
%Operation{
|
||||||
tags: ["Accounts"],
|
tags: ["Settings"],
|
||||||
summary: "Update Notification Settings",
|
summary: "Update Notification Settings",
|
||||||
security: [%{"oAuth" => ["write:accounts"]}],
|
security: [%{"oAuth" => ["write:accounts"]}],
|
||||||
operationId: "UtilController.update_notificaton_settings",
|
operationId: "UtilController.update_notificaton_settings",
|
||||||
|
@ -207,6 +213,7 @@ def captcha_operation do
|
||||||
%Operation{
|
%Operation{
|
||||||
summary: "Get a captcha",
|
summary: "Get a captcha",
|
||||||
operationId: "UtilController.captcha",
|
operationId: "UtilController.captcha",
|
||||||
|
tags: ["Others"],
|
||||||
parameters: [],
|
parameters: [],
|
||||||
responses: %{
|
responses: %{
|
||||||
200 => Operation.response("Success", "application/json", %Schema{type: :object})
|
200 => Operation.response("Success", "application/json", %Schema{type: :object})
|
||||||
|
@ -356,7 +363,7 @@ defp delete_alias_request do
|
||||||
|
|
||||||
def healthcheck_operation do
|
def healthcheck_operation do
|
||||||
%Operation{
|
%Operation{
|
||||||
tags: ["Accounts"],
|
tags: ["Others"],
|
||||||
summary: "Quick status check on the instance",
|
summary: "Quick status check on the instance",
|
||||||
security: [%{"oAuth" => ["write:accounts"]}],
|
security: [%{"oAuth" => ["write:accounts"]}],
|
||||||
operationId: "UtilController.healthcheck",
|
operationId: "UtilController.healthcheck",
|
||||||
|
@ -371,7 +378,7 @@ def healthcheck_operation do
|
||||||
|
|
||||||
def remote_subscribe_operation do
|
def remote_subscribe_operation do
|
||||||
%Operation{
|
%Operation{
|
||||||
tags: ["Accounts"],
|
tags: ["Remote interaction"],
|
||||||
summary: "Remote Subscribe",
|
summary: "Remote Subscribe",
|
||||||
operationId: "UtilController.remote_subscribe",
|
operationId: "UtilController.remote_subscribe",
|
||||||
parameters: [],
|
parameters: [],
|
||||||
|
@ -381,7 +388,7 @@ def remote_subscribe_operation do
|
||||||
|
|
||||||
def remote_interaction_operation do
|
def remote_interaction_operation do
|
||||||
%Operation{
|
%Operation{
|
||||||
tags: ["Accounts"],
|
tags: ["Remote interaction"],
|
||||||
summary: "Remote interaction",
|
summary: "Remote interaction",
|
||||||
operationId: "UtilController.remote_interaction",
|
operationId: "UtilController.remote_interaction",
|
||||||
requestBody: request_body("Parameters", remote_interaction_request(), required: true),
|
requestBody: request_body("Parameters", remote_interaction_request(), required: true),
|
||||||
|
@ -407,7 +414,7 @@ defp remote_interaction_request do
|
||||||
|
|
||||||
def show_subscribe_form_operation do
|
def show_subscribe_form_operation do
|
||||||
%Operation{
|
%Operation{
|
||||||
tags: ["Accounts"],
|
tags: ["Remote interaction"],
|
||||||
summary: "Show remote subscribe form",
|
summary: "Show remote subscribe form",
|
||||||
operationId: "UtilController.show_subscribe_form",
|
operationId: "UtilController.show_subscribe_form",
|
||||||
parameters: [],
|
parameters: [],
|
||||||
|
|
|
@ -144,7 +144,11 @@ defmodule Pleroma.Web.ApiSpec.Schemas.Status do
|
||||||
properties: %{
|
properties: %{
|
||||||
content: %Schema{
|
content: %Schema{
|
||||||
type: :object,
|
type: :object,
|
||||||
additionalProperties: %Schema{type: :string},
|
additionalProperties: %Schema{
|
||||||
|
type: :string,
|
||||||
|
description: "Alternate representation in the MIME type specified",
|
||||||
|
extensions: %{"x-additionalPropertiesName": "MIME type"}
|
||||||
|
},
|
||||||
description:
|
description:
|
||||||
"A map consisting of alternate representations of the `content` property with the key being it's mimetype. Currently the only alternate representation supported is `text/plain`"
|
"A map consisting of alternate representations of the `content` property with the key being it's mimetype. Currently the only alternate representation supported is `text/plain`"
|
||||||
},
|
},
|
||||||
|
@ -195,7 +199,11 @@ defmodule Pleroma.Web.ApiSpec.Schemas.Status do
|
||||||
},
|
},
|
||||||
spoiler_text: %Schema{
|
spoiler_text: %Schema{
|
||||||
type: :object,
|
type: :object,
|
||||||
additionalProperties: %Schema{type: :string},
|
additionalProperties: %Schema{
|
||||||
|
type: :string,
|
||||||
|
description: "Alternate representation in the MIME type specified",
|
||||||
|
extensions: %{"x-additionalPropertiesName": "MIME type"}
|
||||||
|
},
|
||||||
description:
|
description:
|
||||||
"A map consisting of alternate representations of the `spoiler_text` property with the key being it's mimetype. Currently the only alternate representation supported is `text/plain`."
|
"A map consisting of alternate representations of the `spoiler_text` property with the key being it's mimetype. Currently the only alternate representation supported is `text/plain`."
|
||||||
},
|
},
|
||||||
|
|
|
@ -269,14 +269,11 @@ def update_credentials(%{assigns: %{user: user}, body_params: params} = conn, _p
|
||||||
end
|
end
|
||||||
|
|
||||||
defp normalize_fields_attributes(fields) do
|
defp normalize_fields_attributes(fields) do
|
||||||
if Enum.all?(fields, &is_tuple/1) do
|
if(Enum.all?(fields, &is_tuple/1), do: Enum.map(fields, fn {_, v} -> v end), else: fields)
|
||||||
Enum.map(fields, fn {_, v} -> v end)
|
|> Enum.map(fn
|
||||||
else
|
%{} = field -> %{"name" => field.name, "value" => field.value}
|
||||||
Enum.map(fields, fn
|
field -> field
|
||||||
%{} = field -> %{"name" => field.name, "value" => field.value}
|
end)
|
||||||
field -> field
|
|
||||||
end)
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
@doc "GET /api/v1/accounts/relationships"
|
@doc "GET /api/v1/accounts/relationships"
|
||||||
|
|
2
mix.exs
2
mix.exs
|
@ -196,7 +196,7 @@ defp deps do
|
||||||
{:restarter, path: "./restarter"},
|
{:restarter, path: "./restarter"},
|
||||||
{:majic, "~> 1.0"},
|
{:majic, "~> 1.0"},
|
||||||
{:eblurhash, "~> 1.2.2"},
|
{:eblurhash, "~> 1.2.2"},
|
||||||
{:open_api_spex, "~> 3.10"},
|
{:open_api_spex, "~> 3.16"},
|
||||||
{:ecto_psql_extras, "~> 0.6"},
|
{:ecto_psql_extras, "~> 0.6"},
|
||||||
|
|
||||||
# indirect dependency version override
|
# indirect dependency version override
|
||||||
|
|
2
mix.lock
2
mix.lock
|
@ -83,7 +83,7 @@
|
||||||
"nimble_pool": {:hex, :nimble_pool, "0.2.6", "91f2f4c357da4c4a0a548286c84a3a28004f68f05609b4534526871a22053cde", [:mix], [], "hexpm", "1c715055095d3f2705c4e236c18b618420a35490da94149ff8b580a2144f653f"},
|
"nimble_pool": {:hex, :nimble_pool, "0.2.6", "91f2f4c357da4c4a0a548286c84a3a28004f68f05609b4534526871a22053cde", [:mix], [], "hexpm", "1c715055095d3f2705c4e236c18b618420a35490da94149ff8b580a2144f653f"},
|
||||||
"nodex": {:git, "https://git.pleroma.social/pleroma/nodex", "cb6730f943cfc6aad674c92161be23a8411f15d1", [ref: "cb6730f943cfc6aad674c92161be23a8411f15d1"]},
|
"nodex": {:git, "https://git.pleroma.social/pleroma/nodex", "cb6730f943cfc6aad674c92161be23a8411f15d1", [ref: "cb6730f943cfc6aad674c92161be23a8411f15d1"]},
|
||||||
"oban": {:hex, :oban, "2.13.4", "b4c4f48f4c89cc01036670eefa28aa9c03d09aadd402655475b936983d597006", [:mix], [{:ecto_sql, "~> 3.6", [hex: :ecto_sql, repo: "hexpm", optional: false]}, {:jason, "~> 1.1", [hex: :jason, repo: "hexpm", optional: false]}, {:postgrex, "~> 0.16", [hex: :postgrex, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "a7d26f82b409e2d7928fbb75a17716e06ad3f783ebe9af260e3dd23abed7f124"},
|
"oban": {:hex, :oban, "2.13.4", "b4c4f48f4c89cc01036670eefa28aa9c03d09aadd402655475b936983d597006", [:mix], [{:ecto_sql, "~> 3.6", [hex: :ecto_sql, repo: "hexpm", optional: false]}, {:jason, "~> 1.1", [hex: :jason, repo: "hexpm", optional: false]}, {:postgrex, "~> 0.16", [hex: :postgrex, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "a7d26f82b409e2d7928fbb75a17716e06ad3f783ebe9af260e3dd23abed7f124"},
|
||||||
"open_api_spex": {:hex, :open_api_spex, "3.10.0", "94e9521ad525b3fcf6dc77da7c45f87fdac24756d4de588cb0816b413e7c1844", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:plug, "~> 1.7", [hex: :plug, repo: "hexpm", optional: false]}, {:poison, "~> 3.1", [hex: :poison, repo: "hexpm", optional: true]}], "hexpm", "2dbb2bde3d2b821f06936e8dfaf3284331186556291946d84eeba3750ac28765"},
|
"open_api_spex": {:hex, :open_api_spex, "3.16.0", "9843af4e87550cd8ac5821b10e4c74f1d51f0d4e3310f824d780614743423b25", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:plug, "~> 1.7", [hex: :plug, repo: "hexpm", optional: false]}, {:poison, "~> 3.0 or ~> 4.0 or ~> 5.0", [hex: :poison, repo: "hexpm", optional: true]}, {:ymlr, "~> 2.0 or ~> 3.0", [hex: :ymlr, repo: "hexpm", optional: true]}], "hexpm", "bb0be24a648b73e8fc8cbda17f514b8486262275e8b33e8b5ae66283df972129"},
|
||||||
"parse_trans": {:hex, :parse_trans, "3.3.1", "16328ab840cc09919bd10dab29e431da3af9e9e7e7e6f0089dd5a2d2820011d8", [:rebar3], [], "hexpm", "07cd9577885f56362d414e8c4c4e6bdf10d43a8767abb92d24cbe8b24c54888b"},
|
"parse_trans": {:hex, :parse_trans, "3.3.1", "16328ab840cc09919bd10dab29e431da3af9e9e7e7e6f0089dd5a2d2820011d8", [:rebar3], [], "hexpm", "07cd9577885f56362d414e8c4c4e6bdf10d43a8767abb92d24cbe8b24c54888b"},
|
||||||
"pbkdf2_elixir": {:hex, :pbkdf2_elixir, "1.2.1", "9cbe354b58121075bd20eb83076900a3832324b7dd171a6895fab57b6bb2752c", [:mix], [{:comeonin, "~> 5.3", [hex: :comeonin, repo: "hexpm", optional: false]}], "hexpm", "d3b40a4a4630f0b442f19eca891fcfeeee4c40871936fed2f68e1c4faa30481f"},
|
"pbkdf2_elixir": {:hex, :pbkdf2_elixir, "1.2.1", "9cbe354b58121075bd20eb83076900a3832324b7dd171a6895fab57b6bb2752c", [:mix], [{:comeonin, "~> 5.3", [hex: :comeonin, repo: "hexpm", optional: false]}], "hexpm", "d3b40a4a4630f0b442f19eca891fcfeeee4c40871936fed2f68e1c4faa30481f"},
|
||||||
"phoenix": {:hex, :phoenix, "1.6.15", "0a1d96bbc10747fd83525370d691953cdb6f3ccbac61aa01b4acb012474b047d", [:mix], [{:castore, ">= 0.0.0", [hex: :castore, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix_pubsub, "~> 2.0", [hex: :phoenix_pubsub, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 1.0 or ~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: false]}, {:plug, "~> 1.10", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.2", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:plug_crypto, "~> 1.2", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "d70ab9fbf6b394755ea88b644d34d79d8b146e490973151f248cacd122d20672"},
|
"phoenix": {:hex, :phoenix, "1.6.15", "0a1d96bbc10747fd83525370d691953cdb6f3ccbac61aa01b4acb012474b047d", [:mix], [{:castore, ">= 0.0.0", [hex: :castore, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix_pubsub, "~> 2.0", [hex: :phoenix_pubsub, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 1.0 or ~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: false]}, {:plug, "~> 1.10", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.2", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:plug_crypto, "~> 1.2", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "d70ab9fbf6b394755ea88b644d34d79d8b146e490973151f248cacd122d20672"},
|
||||||
|
|
|
@ -0,0 +1,62 @@
|
||||||
|
# Pleroma: A lightweight social networking server
|
||||||
|
# Copyright © 2017-2022 Pleroma Authors <https://pleroma.social/>
|
||||||
|
# SPDX-License-Identifier: AGPL-3.0-only
|
||||||
|
|
||||||
|
defmodule Mix.Tasks.Pleroma.OpenapiSpecTest do
|
||||||
|
use Pleroma.DataCase, async: true
|
||||||
|
|
||||||
|
alias Mix.Tasks.Pleroma.OpenapiSpec
|
||||||
|
|
||||||
|
@spec_base %{
|
||||||
|
"paths" => %{
|
||||||
|
"/cofe" => %{
|
||||||
|
"get" => %{
|
||||||
|
"operationId" => "Some.operation",
|
||||||
|
"tags" => []
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"/mew" => %{
|
||||||
|
"post" => %{
|
||||||
|
"operationId" => "Another.operation",
|
||||||
|
"tags" => ["mew mew"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"x-tagGroups" => [
|
||||||
|
%{
|
||||||
|
"name" => "mew",
|
||||||
|
"tags" => ["mew mew", "abc"]
|
||||||
|
},
|
||||||
|
%{
|
||||||
|
"name" => "lol",
|
||||||
|
"tags" => ["lol lol", "xyz"]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
describe "check_specs/1" do
|
||||||
|
test "Every operation must have a tag" do
|
||||||
|
assert {:error, ["Some.operation (get /cofe): No tags specified"]} ==
|
||||||
|
OpenapiSpec.check_specs(@spec_base)
|
||||||
|
end
|
||||||
|
|
||||||
|
test "Every tag must be in tag groups" do
|
||||||
|
spec =
|
||||||
|
@spec_base
|
||||||
|
|> put_in(["paths", "/cofe", "get", "tags"], ["abc", "def", "not specified"])
|
||||||
|
|
||||||
|
assert {:error,
|
||||||
|
[
|
||||||
|
"Some.operation (get /cofe): Tags #{inspect(["def", "not specified"])} not available. Please add it in \"x-tagGroups\" in Pleroma.Web.ApiSpec"
|
||||||
|
]} == OpenapiSpec.check_specs(spec)
|
||||||
|
end
|
||||||
|
|
||||||
|
test "No errors if ok" do
|
||||||
|
spec =
|
||||||
|
@spec_base
|
||||||
|
|> put_in(["paths", "/cofe", "get", "tags"], ["abc", "mew mew"])
|
||||||
|
|
||||||
|
assert :ok == OpenapiSpec.check_specs(spec)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in New Issue