2021-03-02 09:49:17 -07:00
|
|
|
# Pleroma: A lightweight social networking server
|
2023-01-01 04:11:47 -07:00
|
|
|
# Copyright © 2017-2023 Pleroma Authors <https://pleroma.social/>
|
2021-03-02 09:49:17 -07:00
|
|
|
# SPDX-License-Identifier: AGPL-3.0-only
|
|
|
|
|
|
|
|
defmodule Pleroma.Web.ApiSpec.Admin.UserOperation do
|
|
|
|
alias OpenApiSpex.Operation
|
|
|
|
alias OpenApiSpex.Schema
|
|
|
|
alias Pleroma.Web.ApiSpec.Schemas.ActorType
|
|
|
|
alias Pleroma.Web.ApiSpec.Schemas.ApiError
|
|
|
|
|
|
|
|
import Pleroma.Web.ApiSpec.Helpers
|
|
|
|
|
|
|
|
def open_api_operation(action) do
|
|
|
|
operation = String.to_existing_atom("#{action}_operation")
|
|
|
|
apply(__MODULE__, operation, [])
|
|
|
|
end
|
|
|
|
|
|
|
|
def index_operation do
|
|
|
|
%Operation{
|
2021-03-04 10:13:53 -07:00
|
|
|
tags: ["User administration"],
|
2021-03-02 09:49:17 -07:00
|
|
|
summary: "List users",
|
|
|
|
operationId: "AdminAPI.UserController.index",
|
|
|
|
security: [%{"oAuth" => ["admin:read:accounts"]}],
|
|
|
|
parameters: [
|
|
|
|
Operation.parameter(:filters, :query, :string, "Comma separated list of filters"),
|
|
|
|
Operation.parameter(:query, :query, :string, "Search users query"),
|
|
|
|
Operation.parameter(:name, :query, :string, "Search by display name"),
|
|
|
|
Operation.parameter(:email, :query, :string, "Search by email"),
|
|
|
|
Operation.parameter(:page, :query, :integer, "Page Number"),
|
|
|
|
Operation.parameter(:page_size, :query, :integer, "Number of users to return per page"),
|
|
|
|
Operation.parameter(
|
|
|
|
:actor_types,
|
|
|
|
:query,
|
|
|
|
%Schema{type: :array, items: ActorType},
|
|
|
|
"Filter by actor type"
|
|
|
|
),
|
|
|
|
Operation.parameter(
|
|
|
|
:tags,
|
|
|
|
:query,
|
|
|
|
%Schema{type: :array, items: %Schema{type: :string}},
|
|
|
|
"Filter by tags"
|
|
|
|
)
|
|
|
|
| admin_api_params()
|
|
|
|
],
|
|
|
|
responses: %{
|
|
|
|
200 =>
|
|
|
|
Operation.response(
|
|
|
|
"Response",
|
|
|
|
"application/json",
|
|
|
|
%Schema{
|
|
|
|
type: :object,
|
|
|
|
properties: %{
|
|
|
|
users: %Schema{type: :array, items: user()},
|
|
|
|
count: %Schema{type: :integer},
|
|
|
|
page_size: %Schema{type: :integer}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
),
|
|
|
|
403 => Operation.response("Forbidden", "application/json", ApiError)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
end
|
|
|
|
|
|
|
|
def create_operation do
|
|
|
|
%Operation{
|
2021-03-04 10:13:53 -07:00
|
|
|
tags: ["User administration"],
|
2021-03-02 09:49:17 -07:00
|
|
|
summary: "Create a single or multiple users",
|
|
|
|
operationId: "AdminAPI.UserController.create",
|
|
|
|
security: [%{"oAuth" => ["admin:write:accounts"]}],
|
|
|
|
parameters: admin_api_params(),
|
|
|
|
requestBody:
|
|
|
|
request_body(
|
|
|
|
"Parameters",
|
|
|
|
%Schema{
|
|
|
|
description: "POST body for creating users",
|
|
|
|
type: :object,
|
|
|
|
properties: %{
|
|
|
|
users: %Schema{
|
|
|
|
type: :array,
|
|
|
|
items: %Schema{
|
|
|
|
type: :object,
|
|
|
|
properties: %{
|
|
|
|
nickname: %Schema{type: :string},
|
|
|
|
email: %Schema{type: :string},
|
|
|
|
password: %Schema{type: :string}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
),
|
|
|
|
responses: %{
|
|
|
|
200 =>
|
|
|
|
Operation.response("Response", "application/json", %Schema{
|
|
|
|
type: :array,
|
|
|
|
items: %Schema{
|
|
|
|
type: :object,
|
|
|
|
properties: %{
|
|
|
|
code: %Schema{type: :integer},
|
|
|
|
type: %Schema{type: :string},
|
|
|
|
data: %Schema{
|
|
|
|
type: :object,
|
|
|
|
properties: %{
|
|
|
|
email: %Schema{type: :string, format: :email},
|
|
|
|
nickname: %Schema{type: :string}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}),
|
|
|
|
403 => Operation.response("Forbidden", "application/json", ApiError),
|
|
|
|
409 =>
|
|
|
|
Operation.response("Conflict", "application/json", %Schema{
|
|
|
|
type: :array,
|
|
|
|
items: %Schema{
|
|
|
|
type: :object,
|
|
|
|
properties: %{
|
|
|
|
code: %Schema{type: :integer},
|
|
|
|
error: %Schema{type: :string},
|
|
|
|
type: %Schema{type: :string},
|
|
|
|
data: %Schema{
|
|
|
|
type: :object,
|
|
|
|
properties: %{
|
|
|
|
email: %Schema{type: :string, format: :email},
|
|
|
|
nickname: %Schema{type: :string}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|
|
|
|
end
|
|
|
|
|
|
|
|
def show_operation do
|
|
|
|
%Operation{
|
2021-03-04 10:13:53 -07:00
|
|
|
tags: ["User administration"],
|
2021-03-02 09:49:17 -07:00
|
|
|
summary: "Show user",
|
|
|
|
operationId: "AdminAPI.UserController.show",
|
|
|
|
security: [%{"oAuth" => ["admin:read:accounts"]}],
|
|
|
|
parameters: [
|
|
|
|
Operation.parameter(
|
|
|
|
:nickname,
|
|
|
|
:path,
|
|
|
|
:string,
|
|
|
|
"User nickname or ID"
|
|
|
|
)
|
|
|
|
| admin_api_params()
|
|
|
|
],
|
|
|
|
responses: %{
|
|
|
|
200 => Operation.response("Response", "application/json", user()),
|
|
|
|
403 => Operation.response("Forbidden", "application/json", ApiError),
|
|
|
|
404 => Operation.response("Not Found", "application/json", ApiError)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
end
|
|
|
|
|
|
|
|
def follow_operation do
|
|
|
|
%Operation{
|
2021-03-04 10:13:53 -07:00
|
|
|
tags: ["User administration"],
|
2021-03-02 09:49:17 -07:00
|
|
|
summary: "Follow",
|
|
|
|
operationId: "AdminAPI.UserController.follow",
|
|
|
|
security: [%{"oAuth" => ["admin:write:follows"]}],
|
|
|
|
parameters: admin_api_params(),
|
|
|
|
requestBody:
|
|
|
|
request_body(
|
|
|
|
"Parameters",
|
|
|
|
%Schema{
|
|
|
|
type: :object,
|
|
|
|
properties: %{
|
|
|
|
follower: %Schema{type: :string, description: "Follower nickname"},
|
|
|
|
followed: %Schema{type: :string, description: "Followed nickname"}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
),
|
|
|
|
responses: %{
|
|
|
|
200 => Operation.response("Response", "application/json", %Schema{type: :string}),
|
|
|
|
403 => Operation.response("Forbidden", "application/json", ApiError)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
end
|
|
|
|
|
|
|
|
def unfollow_operation do
|
|
|
|
%Operation{
|
2021-03-04 10:13:53 -07:00
|
|
|
tags: ["User administration"],
|
2021-03-02 09:49:17 -07:00
|
|
|
summary: "Unfollow",
|
|
|
|
operationId: "AdminAPI.UserController.unfollow",
|
|
|
|
security: [%{"oAuth" => ["admin:write:follows"]}],
|
|
|
|
parameters: admin_api_params(),
|
|
|
|
requestBody:
|
|
|
|
request_body(
|
|
|
|
"Parameters",
|
|
|
|
%Schema{
|
|
|
|
type: :object,
|
|
|
|
properties: %{
|
|
|
|
follower: %Schema{type: :string, description: "Follower nickname"},
|
|
|
|
followed: %Schema{type: :string, description: "Followed nickname"}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
),
|
|
|
|
responses: %{
|
|
|
|
200 => Operation.response("Response", "application/json", %Schema{type: :string}),
|
|
|
|
403 => Operation.response("Forbidden", "application/json", ApiError)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
end
|
|
|
|
|
|
|
|
def approve_operation do
|
|
|
|
%Operation{
|
2021-03-04 10:13:53 -07:00
|
|
|
tags: ["User administration"],
|
2021-03-02 09:49:17 -07:00
|
|
|
summary: "Approve multiple users",
|
|
|
|
operationId: "AdminAPI.UserController.approve",
|
|
|
|
security: [%{"oAuth" => ["admin:write:accounts"]}],
|
|
|
|
parameters: admin_api_params(),
|
|
|
|
requestBody:
|
|
|
|
request_body(
|
|
|
|
"Parameters",
|
|
|
|
%Schema{
|
2021-11-26 14:19:01 -07:00
|
|
|
description: "POST body for approving multiple users",
|
|
|
|
type: :object,
|
|
|
|
properties: %{
|
|
|
|
nicknames: %Schema{
|
|
|
|
type: :array,
|
|
|
|
items: %Schema{type: :string}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
),
|
|
|
|
responses: %{
|
|
|
|
200 =>
|
|
|
|
Operation.response("Response", "application/json", %Schema{
|
|
|
|
type: :object,
|
|
|
|
properties: %{user: %Schema{type: :array, items: user()}}
|
|
|
|
}),
|
|
|
|
403 => Operation.response("Forbidden", "application/json", ApiError)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
end
|
|
|
|
|
|
|
|
def suggest_operation do
|
|
|
|
%Operation{
|
|
|
|
tags: ["User administration"],
|
|
|
|
summary: "Suggest multiple users",
|
|
|
|
operationId: "AdminAPI.UserController.suggest",
|
|
|
|
security: [%{"oAuth" => ["admin:write:accounts"]}],
|
|
|
|
parameters: admin_api_params(),
|
|
|
|
requestBody:
|
|
|
|
request_body(
|
|
|
|
"Parameters",
|
|
|
|
%Schema{
|
|
|
|
description: "POST body for adding multiple suggested users",
|
|
|
|
type: :object,
|
|
|
|
properties: %{
|
|
|
|
nicknames: %Schema{
|
|
|
|
type: :array,
|
|
|
|
items: %Schema{type: :string}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
),
|
|
|
|
responses: %{
|
|
|
|
200 =>
|
|
|
|
Operation.response("Response", "application/json", %Schema{
|
|
|
|
type: :object,
|
|
|
|
properties: %{user: %Schema{type: :array, items: user()}}
|
|
|
|
}),
|
|
|
|
403 => Operation.response("Forbidden", "application/json", ApiError)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
end
|
|
|
|
|
|
|
|
def unsuggest_operation do
|
|
|
|
%Operation{
|
|
|
|
tags: ["User administration"],
|
|
|
|
summary: "Unsuggest multiple users",
|
|
|
|
operationId: "AdminAPI.UserController.unsuggest",
|
|
|
|
security: [%{"oAuth" => ["admin:write:accounts"]}],
|
|
|
|
parameters: admin_api_params(),
|
|
|
|
requestBody:
|
|
|
|
request_body(
|
|
|
|
"Parameters",
|
|
|
|
%Schema{
|
|
|
|
description: "POST body for removing multiple suggested users",
|
2021-03-02 09:49:17 -07:00
|
|
|
type: :object,
|
|
|
|
properties: %{
|
|
|
|
nicknames: %Schema{
|
|
|
|
type: :array,
|
|
|
|
items: %Schema{type: :string}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
),
|
|
|
|
responses: %{
|
|
|
|
200 =>
|
|
|
|
Operation.response("Response", "application/json", %Schema{
|
|
|
|
type: :object,
|
|
|
|
properties: %{user: %Schema{type: :array, items: user()}}
|
|
|
|
}),
|
|
|
|
403 => Operation.response("Forbidden", "application/json", ApiError)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
end
|
|
|
|
|
|
|
|
def toggle_activation_operation do
|
|
|
|
%Operation{
|
2021-03-04 10:13:53 -07:00
|
|
|
tags: ["User administration"],
|
2021-03-02 09:49:17 -07:00
|
|
|
summary: "Toggle user activation",
|
|
|
|
operationId: "AdminAPI.UserController.toggle_activation",
|
|
|
|
security: [%{"oAuth" => ["admin:write:accounts"]}],
|
|
|
|
parameters: [
|
|
|
|
Operation.parameter(:nickname, :path, :string, "User nickname")
|
|
|
|
| admin_api_params()
|
|
|
|
],
|
|
|
|
responses: %{
|
|
|
|
200 => Operation.response("Response", "application/json", user()),
|
|
|
|
403 => Operation.response("Forbidden", "application/json", ApiError)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
end
|
|
|
|
|
|
|
|
def activate_operation do
|
|
|
|
%Operation{
|
2021-03-04 10:13:53 -07:00
|
|
|
tags: ["User administration"],
|
2021-03-02 09:49:17 -07:00
|
|
|
summary: "Activate multiple users",
|
|
|
|
operationId: "AdminAPI.UserController.activate",
|
|
|
|
security: [%{"oAuth" => ["admin:write:accounts"]}],
|
|
|
|
parameters: admin_api_params(),
|
|
|
|
requestBody:
|
|
|
|
request_body(
|
|
|
|
"Parameters",
|
|
|
|
%Schema{
|
|
|
|
description: "POST body for deleting multiple users",
|
|
|
|
type: :object,
|
|
|
|
properties: %{
|
|
|
|
nicknames: %Schema{
|
|
|
|
type: :array,
|
|
|
|
items: %Schema{type: :string}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
),
|
|
|
|
responses: %{
|
|
|
|
200 =>
|
|
|
|
Operation.response("Response", "application/json", %Schema{
|
|
|
|
type: :object,
|
|
|
|
properties: %{user: %Schema{type: :array, items: user()}}
|
|
|
|
}),
|
|
|
|
403 => Operation.response("Forbidden", "application/json", ApiError)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
end
|
|
|
|
|
|
|
|
def deactivate_operation do
|
|
|
|
%Operation{
|
2021-03-04 10:13:53 -07:00
|
|
|
tags: ["User administration"],
|
2021-03-02 09:49:17 -07:00
|
|
|
summary: "Deactivates multiple users",
|
|
|
|
operationId: "AdminAPI.UserController.deactivate",
|
|
|
|
security: [%{"oAuth" => ["admin:write:accounts"]}],
|
|
|
|
parameters: admin_api_params(),
|
|
|
|
requestBody:
|
|
|
|
request_body(
|
|
|
|
"Parameters",
|
|
|
|
%Schema{
|
|
|
|
description: "POST body for deleting multiple users",
|
|
|
|
type: :object,
|
|
|
|
properties: %{
|
|
|
|
nicknames: %Schema{
|
|
|
|
type: :array,
|
|
|
|
items: %Schema{type: :string}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
),
|
|
|
|
responses: %{
|
|
|
|
200 =>
|
|
|
|
Operation.response("Response", "application/json", %Schema{
|
|
|
|
type: :object,
|
|
|
|
properties: %{user: %Schema{type: :array, items: user()}}
|
|
|
|
}),
|
|
|
|
403 => Operation.response("Forbidden", "application/json", ApiError)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
end
|
|
|
|
|
|
|
|
def delete_operation do
|
|
|
|
%Operation{
|
2021-03-04 10:13:53 -07:00
|
|
|
tags: ["User administration"],
|
2021-03-02 09:49:17 -07:00
|
|
|
summary: "Removes a single or multiple users",
|
|
|
|
operationId: "AdminAPI.UserController.delete",
|
|
|
|
security: [%{"oAuth" => ["admin:write:accounts"]}],
|
|
|
|
parameters: [
|
|
|
|
Operation.parameter(
|
|
|
|
:nickname,
|
|
|
|
:query,
|
|
|
|
:string,
|
|
|
|
"User nickname"
|
|
|
|
)
|
|
|
|
| admin_api_params()
|
|
|
|
],
|
|
|
|
requestBody:
|
|
|
|
request_body(
|
|
|
|
"Parameters",
|
|
|
|
%Schema{
|
|
|
|
description: "POST body for deleting multiple users",
|
|
|
|
type: :object,
|
|
|
|
properties: %{
|
|
|
|
nicknames: %Schema{
|
|
|
|
type: :array,
|
|
|
|
items: %Schema{type: :string}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
),
|
|
|
|
responses: %{
|
|
|
|
200 =>
|
|
|
|
Operation.response("Response", "application/json", %Schema{
|
|
|
|
description: "Array of nicknames",
|
|
|
|
type: :array,
|
|
|
|
items: %Schema{type: :string}
|
|
|
|
}),
|
|
|
|
403 => Operation.response("Forbidden", "application/json", ApiError)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
end
|
|
|
|
|
|
|
|
defp user do
|
|
|
|
%Schema{
|
|
|
|
type: :object,
|
|
|
|
properties: %{
|
|
|
|
id: %Schema{type: :string},
|
|
|
|
email: %Schema{type: :string, format: :email},
|
|
|
|
avatar: %Schema{type: :string, format: :uri},
|
|
|
|
nickname: %Schema{type: :string},
|
|
|
|
display_name: %Schema{type: :string},
|
|
|
|
is_active: %Schema{type: :boolean},
|
|
|
|
local: %Schema{type: :boolean},
|
|
|
|
roles: %Schema{
|
|
|
|
type: :object,
|
|
|
|
properties: %{
|
|
|
|
admin: %Schema{type: :boolean},
|
|
|
|
moderator: %Schema{type: :boolean}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
tags: %Schema{type: :array, items: %Schema{type: :string}},
|
|
|
|
is_confirmed: %Schema{type: :boolean},
|
|
|
|
is_approved: %Schema{type: :boolean},
|
|
|
|
url: %Schema{type: :string, format: :uri},
|
|
|
|
registration_reason: %Schema{type: :string, nullable: true},
|
|
|
|
actor_type: %Schema{type: :string}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
end
|
|
|
|
end
|