user creation admin api will create multiple users
This commit is contained in:
parent
62516be9c4
commit
5c028b8f92
|
@ -46,6 +46,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
||||||
- Configuration: Added `extra_cookie_attrs` for setting non-standard cookie attributes. Defaults to ["SameSite=Lax"] so that remote follows work.
|
- Configuration: Added `extra_cookie_attrs` for setting non-standard cookie attributes. Defaults to ["SameSite=Lax"] so that remote follows work.
|
||||||
- Timelines: Messages involving people you have blocked will be excluded from the timeline in all cases instead of just repeats.
|
- Timelines: Messages involving people you have blocked will be excluded from the timeline in all cases instead of just repeats.
|
||||||
- Admin API: Move the user related API to `api/pleroma/admin/users`
|
- Admin API: Move the user related API to `api/pleroma/admin/users`
|
||||||
|
- Admin API: `POST /api/pleroma/admin/users` will take list of users
|
||||||
- Pleroma API: Support for emoji tags in `/api/pleroma/emoji` resulting in a breaking API change
|
- Pleroma API: Support for emoji tags in `/api/pleroma/emoji` resulting in a breaking API change
|
||||||
- Mastodon API: Support for `exclude_types`, `limit` and `min_id` in `/api/v1/notifications`
|
- Mastodon API: Support for `exclude_types`, `limit` and `min_id` in `/api/v1/notifications`
|
||||||
- Mastodon API: Add `languages` and `registrations` to `/api/v1/instance`
|
- Mastodon API: Add `languages` and `registrations` to `/api/v1/instance`
|
||||||
|
|
|
@ -46,24 +46,31 @@ def user_unfollow(conn, %{"follower" => follower_nick, "followed" => followed_ni
|
||||||
|> json("ok")
|
|> json("ok")
|
||||||
end
|
end
|
||||||
|
|
||||||
def user_create(
|
def users_create(conn, %{"users" => users}) do
|
||||||
conn,
|
result =
|
||||||
%{"nickname" => nickname, "email" => email, "password" => password}
|
Enum.map(users, fn %{"nickname" => nickname, "email" => email, "password" => password} ->
|
||||||
) do
|
user_data = %{
|
||||||
user_data = %{
|
nickname: nickname,
|
||||||
nickname: nickname,
|
name: nickname,
|
||||||
name: nickname,
|
email: email,
|
||||||
email: email,
|
password: password,
|
||||||
password: password,
|
password_confirmation: password,
|
||||||
password_confirmation: password,
|
bio: "."
|
||||||
bio: "."
|
}
|
||||||
}
|
|
||||||
|
|
||||||
changeset = User.register_changeset(%User{}, user_data, need_confirmation: false)
|
changeset = User.register_changeset(%User{}, user_data, need_confirmation: false)
|
||||||
{:ok, user} = User.register(changeset)
|
|
||||||
|
case User.register(changeset) do
|
||||||
|
{:ok, user} ->
|
||||||
|
AccountView.render("created.json", %{user: user})
|
||||||
|
|
||||||
|
{:error, changeset} ->
|
||||||
|
AccountView.render("create-error.json", %{changeset: changeset})
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
conn
|
conn
|
||||||
|> json(user.nickname)
|
|> json(result)
|
||||||
end
|
end
|
||||||
|
|
||||||
def user_show(conn, %{"nickname" => nickname}) do
|
def user_show(conn, %{"nickname" => nickname}) do
|
||||||
|
|
|
@ -44,4 +44,50 @@ def render("invites.json", %{invites: invites}) do
|
||||||
invites: render_many(invites, AccountView, "invite.json", as: :invite)
|
invites: render_many(invites, AccountView, "invite.json", as: :invite)
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def render("created.json", %{user: user}) do
|
||||||
|
%{
|
||||||
|
type: "success",
|
||||||
|
code: 201,
|
||||||
|
data: %{
|
||||||
|
nickname: user.nickname,
|
||||||
|
email: user.email
|
||||||
|
}
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
def render("create-error.json", %{changeset: %Ecto.Changeset{changes: changes, errors: errors}}) do
|
||||||
|
%{
|
||||||
|
type: "error",
|
||||||
|
code: 409,
|
||||||
|
error: parse_error(errors),
|
||||||
|
data: %{
|
||||||
|
nickname: Map.get(changes, :nickname),
|
||||||
|
email: Map.get(changes, :email)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
defp parse_error([]), do: ""
|
||||||
|
|
||||||
|
defp parse_error(errors) do
|
||||||
|
## when nickname is duplicate ap_id constraint error is raised
|
||||||
|
nickname_error = Keyword.get(errors, :nickname) || Keyword.get(errors, :ap_id)
|
||||||
|
email_error = Keyword.get(errors, :email)
|
||||||
|
password_error = Keyword.get(errors, :password)
|
||||||
|
|
||||||
|
cond do
|
||||||
|
nickname_error ->
|
||||||
|
"nickname #{elem(nickname_error, 0)}"
|
||||||
|
|
||||||
|
email_error ->
|
||||||
|
"email #{elem(email_error, 0)}"
|
||||||
|
|
||||||
|
password_error ->
|
||||||
|
"password #{elem(password_error, 0)}"
|
||||||
|
|
||||||
|
true ->
|
||||||
|
""
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -156,7 +156,7 @@ defmodule Pleroma.Web.Router do
|
||||||
post("/user", AdminAPIController, :user_create)
|
post("/user", AdminAPIController, :user_create)
|
||||||
|
|
||||||
delete("/users", AdminAPIController, :user_delete)
|
delete("/users", AdminAPIController, :user_delete)
|
||||||
post("/users", AdminAPIController, :user_create)
|
post("/users", AdminAPIController, :users_create)
|
||||||
patch("/users/:nickname/toggle_activation", AdminAPIController, :user_toggle_activation)
|
patch("/users/:nickname/toggle_activation", AdminAPIController, :user_toggle_activation)
|
||||||
put("/users/tag", AdminAPIController, :tag_users)
|
put("/users/tag", AdminAPIController, :tag_users)
|
||||||
delete("/users/tag", AdminAPIController, :untag_users)
|
delete("/users/tag", AdminAPIController, :untag_users)
|
||||||
|
|
|
@ -31,12 +31,87 @@ test "Create" do
|
||||||
|> assign(:user, admin)
|
|> assign(:user, admin)
|
||||||
|> put_req_header("accept", "application/json")
|
|> put_req_header("accept", "application/json")
|
||||||
|> post("/api/pleroma/admin/users", %{
|
|> post("/api/pleroma/admin/users", %{
|
||||||
"nickname" => "lain",
|
"users" => [
|
||||||
"email" => "lain@example.org",
|
%{
|
||||||
"password" => "test"
|
"nickname" => "lain",
|
||||||
|
"email" => "lain@example.org",
|
||||||
|
"password" => "test"
|
||||||
|
}
|
||||||
|
]
|
||||||
})
|
})
|
||||||
|
|
||||||
assert json_response(conn, 200) == "lain"
|
assert json_response(conn, 200) == [
|
||||||
|
%{
|
||||||
|
"code" => 201,
|
||||||
|
"data" => %{
|
||||||
|
"email" => "lain@example.org",
|
||||||
|
"nickname" => "lain"
|
||||||
|
},
|
||||||
|
"type" => "success"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
end
|
||||||
|
|
||||||
|
test "Cannot create user with exisiting email" do
|
||||||
|
admin = insert(:user, info: %{is_admin: true})
|
||||||
|
user = insert(:user)
|
||||||
|
|
||||||
|
conn =
|
||||||
|
build_conn()
|
||||||
|
|> assign(:user, admin)
|
||||||
|
|> put_req_header("accept", "application/json")
|
||||||
|
|> post("/api/pleroma/admin/users", %{
|
||||||
|
"users" => [
|
||||||
|
%{
|
||||||
|
"nickname" => "lain",
|
||||||
|
"email" => user.email,
|
||||||
|
"password" => "test"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
})
|
||||||
|
|
||||||
|
assert json_response(conn, 200) == [
|
||||||
|
%{
|
||||||
|
"code" => 409,
|
||||||
|
"data" => %{
|
||||||
|
"email" => user.email,
|
||||||
|
"nickname" => "lain"
|
||||||
|
},
|
||||||
|
"error" => "email has already been taken",
|
||||||
|
"type" => "error"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
end
|
||||||
|
|
||||||
|
test "Cannot create user with exisiting nickname" do
|
||||||
|
admin = insert(:user, info: %{is_admin: true})
|
||||||
|
user = insert(:user)
|
||||||
|
|
||||||
|
conn =
|
||||||
|
build_conn()
|
||||||
|
|> assign(:user, admin)
|
||||||
|
|> put_req_header("accept", "application/json")
|
||||||
|
|> post("/api/pleroma/admin/users", %{
|
||||||
|
"users" => [
|
||||||
|
%{
|
||||||
|
"nickname" => user.nickname,
|
||||||
|
"email" => "someuser@plerama.social",
|
||||||
|
"password" => "test"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
})
|
||||||
|
|
||||||
|
assert json_response(conn, 200) == [
|
||||||
|
%{
|
||||||
|
"code" => 409,
|
||||||
|
"data" => %{
|
||||||
|
"email" => "someuser@plerama.social",
|
||||||
|
"nickname" => user.nickname
|
||||||
|
},
|
||||||
|
"error" => "nickname has already been taken",
|
||||||
|
"type" => "error"
|
||||||
|
}
|
||||||
|
]
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue