453 lines
		
	
	
	
		
			14 KiB
		
	
	
	
		
			Elixir
		
	
	
	
	
	
			
		
		
	
	
			453 lines
		
	
	
	
		
			14 KiB
		
	
	
	
		
			Elixir
		
	
	
	
	
	
# Pleroma: A lightweight social networking server
 | 
						|
# Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/>
 | 
						|
# 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{
 | 
						|
      tags: ["User administration"],
 | 
						|
      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{
 | 
						|
      tags: ["User administration"],
 | 
						|
      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{
 | 
						|
      tags: ["User administration"],
 | 
						|
      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{
 | 
						|
      tags: ["User administration"],
 | 
						|
      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{
 | 
						|
      tags: ["User administration"],
 | 
						|
      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{
 | 
						|
      tags: ["User administration"],
 | 
						|
      summary: "Approve multiple users",
 | 
						|
      operationId: "AdminAPI.UserController.approve",
 | 
						|
      security: [%{"oAuth" => ["admin:write:accounts"]}],
 | 
						|
      parameters: admin_api_params(),
 | 
						|
      requestBody:
 | 
						|
        request_body(
 | 
						|
          "Parameters",
 | 
						|
          %Schema{
 | 
						|
            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",
 | 
						|
            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{
 | 
						|
      tags: ["User administration"],
 | 
						|
      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{
 | 
						|
      tags: ["User administration"],
 | 
						|
      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{
 | 
						|
      tags: ["User administration"],
 | 
						|
      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{
 | 
						|
      tags: ["User administration"],
 | 
						|
      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
 |