Merge branch 'develop' into feature/disable-account
This commit is contained in:
commit
c157e27a00
|
@ -16,11 +16,13 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
||||||
- Configuration: `link_name` option
|
- Configuration: `link_name` option
|
||||||
- Configuration: `fetch_initial_posts` option
|
- Configuration: `fetch_initial_posts` option
|
||||||
- Configuration: `notify_email` option
|
- Configuration: `notify_email` option
|
||||||
- Pleroma API: User subscribtions
|
- Pleroma API: User subscriptions
|
||||||
|
- Pleroma API: Healthcheck endpoint
|
||||||
- Admin API: Endpoints for listing/revoking invite tokens
|
- Admin API: Endpoints for listing/revoking invite tokens
|
||||||
- Admin API: Endpoints for making users follow/unfollow each other
|
- Admin API: Endpoints for making users follow/unfollow each other
|
||||||
- Mastodon API: [Scheduled statuses](https://docs.joinmastodon.org/api/rest/scheduled-statuses/)
|
- Mastodon API: [Scheduled statuses](https://docs.joinmastodon.org/api/rest/scheduled-statuses/)
|
||||||
- Mastodon API: `/api/v1/notifications/destroy_multiple` (glitch-soc extension)
|
- Mastodon API: `/api/v1/notifications/destroy_multiple` (glitch-soc extension)
|
||||||
|
- Mastodon API: `/api/v1/pleroma/accounts/:id/favourites` (API extension)
|
||||||
- Mastodon API: [Reports](https://docs.joinmastodon.org/api/rest/reports/)
|
- Mastodon API: [Reports](https://docs.joinmastodon.org/api/rest/reports/)
|
||||||
- ActivityPub C2S: OAuth endpoints
|
- ActivityPub C2S: OAuth endpoints
|
||||||
- Metadata RelMe provider
|
- Metadata RelMe provider
|
||||||
|
@ -41,7 +43,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
||||||
- 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`
|
||||||
- Mastodon API: Provide plaintext versions of cw/content in the Status entity
|
- Mastodon API: Provide plaintext versions of cw/content in the Status entity
|
||||||
- Mastodon API: Add `pleroma.conversation_id` field to the Status entity
|
- Mastodon API: Add `pleroma.conversation_id`, `pleroma.in_reply_to_account_acct` fields to the Status entity
|
||||||
- Mastodon API: Add `pleroma.tags`, `pleroma.relationship{}`, `pleroma.is_moderator`, `pleroma.is_admin`, `pleroma.confirmation_pending` fields to the User entity
|
- Mastodon API: Add `pleroma.tags`, `pleroma.relationship{}`, `pleroma.is_moderator`, `pleroma.is_admin`, `pleroma.confirmation_pending` fields to the User entity
|
||||||
- Mastodon API: Add `pleroma.is_seen` to the Notification entity
|
- Mastodon API: Add `pleroma.is_seen` to the Notification entity
|
||||||
- Mastodon API: Add `pleroma.local` to the Status entity
|
- Mastodon API: Add `pleroma.local` to the Status entity
|
||||||
|
|
|
@ -230,7 +230,8 @@
|
||||||
welcome_user_nickname: nil,
|
welcome_user_nickname: nil,
|
||||||
welcome_message: nil,
|
welcome_message: nil,
|
||||||
max_report_comment_size: 1000,
|
max_report_comment_size: 1000,
|
||||||
safe_dm_mentions: false
|
safe_dm_mentions: false,
|
||||||
|
healthcheck: false
|
||||||
|
|
||||||
config :pleroma, :markup,
|
config :pleroma, :markup,
|
||||||
# XXX - unfortunately, inline images must be enabled by default right now, because
|
# XXX - unfortunately, inline images must be enabled by default right now, because
|
||||||
|
|
|
@ -20,6 +20,7 @@ Has these additional fields under the `pleroma` object:
|
||||||
|
|
||||||
- `local`: true if the post was made on the local instance.
|
- `local`: true if the post was made on the local instance.
|
||||||
- `conversation_id`: the ID of the conversation the status is associated with (if any)
|
- `conversation_id`: the ID of the conversation the status is associated with (if any)
|
||||||
|
- `in_reply_to_account_acct`: the `acct` property of User entity for replied user (if any)
|
||||||
- `content`: 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`
|
- `content`: 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`
|
||||||
- `spoiler_text`: 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`
|
- `spoiler_text`: 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`
|
||||||
|
|
||||||
|
|
|
@ -86,7 +86,7 @@ Request parameters can be passed via [query strings](https://en.wikipedia.org/wi
|
||||||
* `token`: invite token required when the registrations aren't public.
|
* `token`: invite token required when the registrations aren't public.
|
||||||
* Response: JSON. Returns a user object on success, otherwise returns `{"error": "error_msg"}`
|
* Response: JSON. Returns a user object on success, otherwise returns `{"error": "error_msg"}`
|
||||||
* Example response:
|
* Example response:
|
||||||
```
|
```json
|
||||||
{
|
{
|
||||||
"background_image": null,
|
"background_image": null,
|
||||||
"cover_photo": "https://pleroma.soykaf.com/images/banner.png",
|
"cover_photo": "https://pleroma.soykaf.com/images/banner.png",
|
||||||
|
@ -196,6 +196,62 @@ See [Admin-API](Admin-API.md)
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## `/api/v1/pleroma/accounts/:id/favourites`
|
||||||
|
### Returns favorites timeline of any user
|
||||||
|
* Method `GET`
|
||||||
|
* Authentication: not required
|
||||||
|
* Params:
|
||||||
|
* `id`: the id of the account for whom to return results
|
||||||
|
* `limit`: optional, the number of records to retrieve
|
||||||
|
* `since_id`: optional, returns results that are more recent than the specified id
|
||||||
|
* `max_id`: optional, returns results that are older than the specified id
|
||||||
|
* Response: JSON, returns a list of Mastodon Status entities on success, otherwise returns `{"error": "error_msg"}`
|
||||||
|
* Example response:
|
||||||
|
```json
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"account": {
|
||||||
|
"id": "9hptFmUF3ztxYh3Svg",
|
||||||
|
"url": "https://pleroma.example.org/users/nick2",
|
||||||
|
"username": "nick2",
|
||||||
|
...
|
||||||
|
},
|
||||||
|
"application": {"name": "Web", "website": null},
|
||||||
|
"bookmarked": false,
|
||||||
|
"card": null,
|
||||||
|
"content": "This is :moominmamma: note 0",
|
||||||
|
"created_at": "2019-04-15T15:42:15.000Z",
|
||||||
|
"emojis": [],
|
||||||
|
"favourited": false,
|
||||||
|
"favourites_count": 1,
|
||||||
|
"id": "9hptFmVJ02khbzYJaS",
|
||||||
|
"in_reply_to_account_id": null,
|
||||||
|
"in_reply_to_id": null,
|
||||||
|
"language": null,
|
||||||
|
"media_attachments": [],
|
||||||
|
"mentions": [],
|
||||||
|
"muted": false,
|
||||||
|
"pinned": false,
|
||||||
|
"pleroma": {
|
||||||
|
"content": {"text/plain": "This is :moominmamma: note 0"},
|
||||||
|
"conversation_id": 13679,
|
||||||
|
"local": true,
|
||||||
|
"spoiler_text": {"text/plain": "2hu"}
|
||||||
|
},
|
||||||
|
"reblog": null,
|
||||||
|
"reblogged": false,
|
||||||
|
"reblogs_count": 0,
|
||||||
|
"replies_count": 0,
|
||||||
|
"sensitive": false,
|
||||||
|
"spoiler_text": "2hu",
|
||||||
|
"tags": [{"name": "2hu", "url": "/tag/2hu"}],
|
||||||
|
"uri": "https://pleroma.example.org/objects/198ed2a1-7912-4482-b559-244a0369e984",
|
||||||
|
"url": "https://pleroma.example.org/notice/9hptFmVJ02khbzYJaS",
|
||||||
|
"visibility": "public"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
```
|
||||||
|
|
||||||
## `/api/pleroma/notification_settings`
|
## `/api/pleroma/notification_settings`
|
||||||
### Updates user notification settings
|
### Updates user notification settings
|
||||||
* Method `PUT`
|
* Method `PUT`
|
||||||
|
@ -206,3 +262,20 @@ See [Admin-API](Admin-API.md)
|
||||||
* `remote`: BOOLEAN field, receives notifications from people on remote instances
|
* `remote`: BOOLEAN field, receives notifications from people on remote instances
|
||||||
* `local`: BOOLEAN field, receives notifications from people on the local instance
|
* `local`: BOOLEAN field, receives notifications from people on the local instance
|
||||||
* Response: JSON. Returns `{"status": "success"}` if the update was successful, otherwise returns `{"error": "error_msg"}`
|
* Response: JSON. Returns `{"status": "success"}` if the update was successful, otherwise returns `{"error": "error_msg"}`
|
||||||
|
|
||||||
|
## `/api/pleroma/healthcheck`
|
||||||
|
### Healthcheck endpoint with additional system data.
|
||||||
|
* Method `GET`
|
||||||
|
* Authentication: not required
|
||||||
|
* Params: none
|
||||||
|
* Response: JSON, statuses (200 - healthy, 503 unhealthy).
|
||||||
|
* Example response:
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"pool_size": 0, # database connection pool
|
||||||
|
"active": 0, # active processes
|
||||||
|
"idle": 0, # idle processes
|
||||||
|
"memory_used": 0.00, # Memory used
|
||||||
|
"healthy": true # Instance state
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
|
@ -103,6 +103,7 @@ config :pleroma, Pleroma.Emails.Mailer,
|
||||||
* `welcome_user_nickname`: The nickname of the local user that sends the welcome message.
|
* `welcome_user_nickname`: The nickname of the local user that sends the welcome message.
|
||||||
* `max_report_comment_size`: The maximum size of the report comment (Default: `1000`)
|
* `max_report_comment_size`: The maximum size of the report comment (Default: `1000`)
|
||||||
* `safe_dm_mentions`: If set to true, only mentions at the beginning of a post will be used to address people in direct messages. This is to prevent accidental mentioning of people when talking about them (e.g. "@friend hey i really don't like @enemy"). (Default: `false`)
|
* `safe_dm_mentions`: If set to true, only mentions at the beginning of a post will be used to address people in direct messages. This is to prevent accidental mentioning of people when talking about them (e.g. "@friend hey i really don't like @enemy"). (Default: `false`)
|
||||||
|
* `healthcheck`: if set to true, system data will be shown on ``/api/pleroma/healthcheck``.
|
||||||
|
|
||||||
## :logger
|
## :logger
|
||||||
* `backends`: `:console` is used to send logs to stdout, `{ExSyslogger, :ex_syslogger}` to log to syslog, and `Quack.Logger` to log to Slack
|
* `backends`: `:console` is used to send logs to stdout, `{ExSyslogger, :ex_syslogger}` to log to syslog, and `Quack.Logger` to log to Slack
|
||||||
|
@ -486,3 +487,8 @@ config :ueberauth, Ueberauth,
|
||||||
microsoft: {Ueberauth.Strategy.Microsoft, [callback_params: []]}
|
microsoft: {Ueberauth.Strategy.Microsoft, [callback_params: []]}
|
||||||
]
|
]
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## :emoji
|
||||||
|
* `shortcode_globs`: Location of custom emoji files. `*` can be used as a wildcard. Example `["/emoji/custom/**/*.png"]`
|
||||||
|
* `groups`: Emojis are ordered in groups (tags). This is an array of key-value pairs where the key is the groupname and the value the location or array of locations. `*` can be used as a wildcard. Example `[Custom: ["/emoji/*.png", "/emoji/custom/*.png"]]`
|
||||||
|
* `default_manifest`: Location of the JSON-manifest. This manifest contains information about the emoji-packs you can download. Currently only one manifest can be added (no arrays).
|
||||||
|
|
|
@ -28,6 +28,11 @@ foo, /emoji/custom/foo.png
|
||||||
|
|
||||||
The files should be PNG (APNG is okay with `.png` for `image/png` Content-type) and under 50kb for compatibility with mastodon.
|
The files should be PNG (APNG is okay with `.png` for `image/png` Content-type) and under 50kb for compatibility with mastodon.
|
||||||
|
|
||||||
|
Default file extentions and locations for emojis are set in `config.exs`. To use different locations or file-extentions, add the `shortcode_globs` to your secrets file (`prod.secret.exs` or `dev.secret.exs`) and edit it. Note that not all fediverse-software will show emojis with other file extentions:
|
||||||
|
```elixir
|
||||||
|
config :pleroma, :emoji, shortcode_globs: ["/emoji/custom/**/*.png", "/emoji/custom/**/*.gif"]
|
||||||
|
```
|
||||||
|
|
||||||
## Emoji tags (groups)
|
## Emoji tags (groups)
|
||||||
|
|
||||||
Default tags are set in `config.exs`. To set your own tags, copy the structure to your secrets file (`prod.secret.exs` or `dev.secret.exs`) and edit it.
|
Default tags are set in `config.exs`. To set your own tags, copy the structure to your secrets file (`prod.secret.exs` or `dev.secret.exs`) and edit it.
|
||||||
|
|
|
@ -0,0 +1,60 @@
|
||||||
|
defmodule Pleroma.Healthcheck do
|
||||||
|
@moduledoc """
|
||||||
|
Module collects metrics about app and assign healthy status.
|
||||||
|
"""
|
||||||
|
alias Pleroma.Healthcheck
|
||||||
|
alias Pleroma.Repo
|
||||||
|
|
||||||
|
defstruct pool_size: 0,
|
||||||
|
active: 0,
|
||||||
|
idle: 0,
|
||||||
|
memory_used: 0,
|
||||||
|
healthy: true
|
||||||
|
|
||||||
|
@type t :: %__MODULE__{
|
||||||
|
pool_size: non_neg_integer(),
|
||||||
|
active: non_neg_integer(),
|
||||||
|
idle: non_neg_integer(),
|
||||||
|
memory_used: number(),
|
||||||
|
healthy: boolean()
|
||||||
|
}
|
||||||
|
|
||||||
|
@spec system_info() :: t()
|
||||||
|
def system_info do
|
||||||
|
%Healthcheck{
|
||||||
|
memory_used: Float.round(:erlang.memory(:total) / 1024 / 1024, 2)
|
||||||
|
}
|
||||||
|
|> assign_db_info()
|
||||||
|
|> check_health()
|
||||||
|
end
|
||||||
|
|
||||||
|
defp assign_db_info(healthcheck) do
|
||||||
|
database = Application.get_env(:pleroma, Repo)[:database]
|
||||||
|
|
||||||
|
query =
|
||||||
|
"select state, count(pid) from pg_stat_activity where datname = '#{database}' group by state;"
|
||||||
|
|
||||||
|
result = Repo.query!(query)
|
||||||
|
pool_size = Application.get_env(:pleroma, Repo)[:pool_size]
|
||||||
|
|
||||||
|
db_info =
|
||||||
|
Enum.reduce(result.rows, %{active: 0, idle: 0}, fn [state, cnt], states ->
|
||||||
|
if state == "active" do
|
||||||
|
Map.put(states, :active, states.active + cnt)
|
||||||
|
else
|
||||||
|
Map.put(states, :idle, states.idle + cnt)
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|> Map.put(:pool_size, pool_size)
|
||||||
|
|
||||||
|
Map.merge(healthcheck, db_info)
|
||||||
|
end
|
||||||
|
|
||||||
|
@spec check_health(Healthcheck.t()) :: Healthcheck.t()
|
||||||
|
def check_health(%{pool_size: pool_size, active: active} = check)
|
||||||
|
when active >= pool_size do
|
||||||
|
%{check | healthy: false}
|
||||||
|
end
|
||||||
|
|
||||||
|
def check_health(check), do: check
|
||||||
|
end
|
|
@ -11,7 +11,7 @@ defmodule Mix.Tasks.Pleroma.Emoji do
|
||||||
|
|
||||||
## ls-packs
|
## ls-packs
|
||||||
|
|
||||||
mix pleroma.emoji ls-packs [OPTION...]
|
mix pleroma.emoji ls-packs [OPTION...]
|
||||||
|
|
||||||
Lists the emoji packs and metadata specified in the manifest.
|
Lists the emoji packs and metadata specified in the manifest.
|
||||||
|
|
||||||
|
@ -23,10 +23,10 @@ defmodule Mix.Tasks.Pleroma.Emoji do
|
||||||
|
|
||||||
## get-packs
|
## get-packs
|
||||||
|
|
||||||
mix pleroma.emoji get-packs [OPTION...] PACKS
|
mix pleroma.emoji get-packs [OPTION...] PACKS
|
||||||
|
|
||||||
Fetches, verifies and installs the specified PACKS from the
|
Fetches, verifies and installs the specified PACKS from the
|
||||||
manifest into the `STATIC-DIR/emoji/PACK-NAME
|
manifest into the `STATIC-DIR/emoji/PACK-NAME`
|
||||||
|
|
||||||
### Options
|
### Options
|
||||||
|
|
||||||
|
@ -34,7 +34,7 @@ defmodule Mix.Tasks.Pleroma.Emoji do
|
||||||
|
|
||||||
## gen-pack
|
## gen-pack
|
||||||
|
|
||||||
mix pleroma.emoji gen-pack PACK-URL
|
mix pleroma.emoji gen-pack PACK-URL
|
||||||
|
|
||||||
Creates a new manifest entry and a file list from the specified
|
Creates a new manifest entry and a file list from the specified
|
||||||
remote pack file. Currently, only .zip archives are recognized
|
remote pack file. Currently, only .zip archives are recognized
|
||||||
|
|
|
@ -162,7 +162,7 @@ def run(["new", nickname, email | rest]) do
|
||||||
def run(["rm", nickname]) do
|
def run(["rm", nickname]) do
|
||||||
Common.start_pleroma()
|
Common.start_pleroma()
|
||||||
|
|
||||||
with %User{local: true} = user <- User.get_by_nickname(nickname) do
|
with %User{local: true} = user <- User.get_cached_by_nickname(nickname) do
|
||||||
User.delete(user)
|
User.delete(user)
|
||||||
Mix.shell().info("User #{nickname} deleted.")
|
Mix.shell().info("User #{nickname} deleted.")
|
||||||
else
|
else
|
||||||
|
@ -174,7 +174,7 @@ def run(["rm", nickname]) do
|
||||||
def run(["toggle_activated", nickname]) do
|
def run(["toggle_activated", nickname]) do
|
||||||
Common.start_pleroma()
|
Common.start_pleroma()
|
||||||
|
|
||||||
with %User{} = user <- User.get_by_nickname(nickname) do
|
with %User{} = user <- User.get_cached_by_nickname(nickname) do
|
||||||
{:ok, user} = User.deactivate(user, !user.info.deactivated)
|
{:ok, user} = User.deactivate(user, !user.info.deactivated)
|
||||||
|
|
||||||
Mix.shell().info(
|
Mix.shell().info(
|
||||||
|
@ -189,7 +189,7 @@ def run(["toggle_activated", nickname]) do
|
||||||
def run(["reset_password", nickname]) do
|
def run(["reset_password", nickname]) do
|
||||||
Common.start_pleroma()
|
Common.start_pleroma()
|
||||||
|
|
||||||
with %User{local: true} = user <- User.get_by_nickname(nickname),
|
with %User{local: true} = user <- User.get_cached_by_nickname(nickname),
|
||||||
{:ok, token} <- Pleroma.PasswordResetToken.create_token(user) do
|
{:ok, token} <- Pleroma.PasswordResetToken.create_token(user) do
|
||||||
Mix.shell().info("Generated password reset token for #{user.nickname}")
|
Mix.shell().info("Generated password reset token for #{user.nickname}")
|
||||||
|
|
||||||
|
@ -211,14 +211,14 @@ def run(["reset_password", nickname]) do
|
||||||
def run(["unsubscribe", nickname]) do
|
def run(["unsubscribe", nickname]) do
|
||||||
Common.start_pleroma()
|
Common.start_pleroma()
|
||||||
|
|
||||||
with %User{} = user <- User.get_by_nickname(nickname) do
|
with %User{} = user <- User.get_cached_by_nickname(nickname) do
|
||||||
Mix.shell().info("Deactivating #{user.nickname}")
|
Mix.shell().info("Deactivating #{user.nickname}")
|
||||||
User.deactivate(user)
|
User.deactivate(user)
|
||||||
|
|
||||||
{:ok, friends} = User.get_friends(user)
|
{:ok, friends} = User.get_friends(user)
|
||||||
|
|
||||||
Enum.each(friends, fn friend ->
|
Enum.each(friends, fn friend ->
|
||||||
user = User.get_by_id(user.id)
|
user = User.get_cached_by_id(user.id)
|
||||||
|
|
||||||
Mix.shell().info("Unsubscribing #{friend.nickname} from #{user.nickname}")
|
Mix.shell().info("Unsubscribing #{friend.nickname} from #{user.nickname}")
|
||||||
User.unfollow(user, friend)
|
User.unfollow(user, friend)
|
||||||
|
@ -226,7 +226,7 @@ def run(["unsubscribe", nickname]) do
|
||||||
|
|
||||||
:timer.sleep(500)
|
:timer.sleep(500)
|
||||||
|
|
||||||
user = User.get_by_id(user.id)
|
user = User.get_cached_by_id(user.id)
|
||||||
|
|
||||||
if Enum.empty?(user.following) do
|
if Enum.empty?(user.following) do
|
||||||
Mix.shell().info("Successfully unsubscribed all followers from #{user.nickname}")
|
Mix.shell().info("Successfully unsubscribed all followers from #{user.nickname}")
|
||||||
|
@ -250,7 +250,7 @@ def run(["set", nickname | rest]) do
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
|
|
||||||
with %User{local: true} = user <- User.get_by_nickname(nickname) do
|
with %User{local: true} = user <- User.get_cached_by_nickname(nickname) do
|
||||||
user =
|
user =
|
||||||
case Keyword.get(options, :moderator) do
|
case Keyword.get(options, :moderator) do
|
||||||
nil -> user
|
nil -> user
|
||||||
|
@ -277,7 +277,7 @@ def run(["set", nickname | rest]) do
|
||||||
def run(["tag", nickname | tags]) do
|
def run(["tag", nickname | tags]) do
|
||||||
Common.start_pleroma()
|
Common.start_pleroma()
|
||||||
|
|
||||||
with %User{} = user <- User.get_by_nickname(nickname) do
|
with %User{} = user <- User.get_cached_by_nickname(nickname) do
|
||||||
user = user |> User.tag(tags)
|
user = user |> User.tag(tags)
|
||||||
|
|
||||||
Mix.shell().info("Tags of #{user.nickname}: #{inspect(tags)}")
|
Mix.shell().info("Tags of #{user.nickname}: #{inspect(tags)}")
|
||||||
|
@ -290,7 +290,7 @@ def run(["tag", nickname | tags]) do
|
||||||
def run(["untag", nickname | tags]) do
|
def run(["untag", nickname | tags]) do
|
||||||
Common.start_pleroma()
|
Common.start_pleroma()
|
||||||
|
|
||||||
with %User{} = user <- User.get_by_nickname(nickname) do
|
with %User{} = user <- User.get_cached_by_nickname(nickname) do
|
||||||
user = user |> User.untag(tags)
|
user = user |> User.untag(tags)
|
||||||
|
|
||||||
Mix.shell().info("Tags of #{user.nickname}: #{inspect(tags)}")
|
Mix.shell().info("Tags of #{user.nickname}: #{inspect(tags)}")
|
||||||
|
@ -379,7 +379,7 @@ def run(["revoke_invite", token]) do
|
||||||
def run(["delete_activities", nickname]) do
|
def run(["delete_activities", nickname]) do
|
||||||
Common.start_pleroma()
|
Common.start_pleroma()
|
||||||
|
|
||||||
with %User{local: true} = user <- User.get_by_nickname(nickname) do
|
with %User{local: true} = user <- User.get_cached_by_nickname(nickname) do
|
||||||
User.delete_user_activities(user)
|
User.delete_user_activities(user)
|
||||||
Mix.shell().info("User #{nickname} statuses deleted.")
|
Mix.shell().info("User #{nickname} statuses deleted.")
|
||||||
else
|
else
|
||||||
|
|
|
@ -39,7 +39,7 @@ def used_changeset(struct) do
|
||||||
|
|
||||||
def reset_password(token, data) do
|
def reset_password(token, data) do
|
||||||
with %{used: false} = token <- Repo.get_by(PasswordResetToken, %{token: token}),
|
with %{used: false} = token <- Repo.get_by(PasswordResetToken, %{token: token}),
|
||||||
%User{} = user <- User.get_by_id(token.user_id),
|
%User{} = user <- User.get_cached_by_id(token.user_id),
|
||||||
{:ok, _user} <- User.reset_password(user, data),
|
{:ok, _user} <- User.reset_password(user, data),
|
||||||
{:ok, token} <- Repo.update(used_changeset(token)) do
|
{:ok, token} <- Repo.update(used_changeset(token)) do
|
||||||
{:ok, token}
|
{:ok, token}
|
||||||
|
|
|
@ -76,7 +76,7 @@ def render_activities(activities) do
|
||||||
|> Enum.map(fn activity ->
|
|> Enum.map(fn activity ->
|
||||||
user = User.get_cached_by_ap_id(activity.data["actor"])
|
user = User.get_cached_by_ap_id(activity.data["actor"])
|
||||||
|
|
||||||
object = Object.normalize(activity.data["object"])
|
object = Object.normalize(activity)
|
||||||
like_count = object["like_count"] || 0
|
like_count = object["like_count"] || 0
|
||||||
announcement_count = object["announcement_count"] || 0
|
announcement_count = object["announcement_count"] || 0
|
||||||
|
|
||||||
|
|
|
@ -80,7 +80,7 @@ def get_lists_from_activity(%Activity{actor: ap_id}) do
|
||||||
|
|
||||||
# Get lists to which the account belongs.
|
# Get lists to which the account belongs.
|
||||||
def get_lists_account_belongs(%User{} = owner, account_id) do
|
def get_lists_account_belongs(%User{} = owner, account_id) do
|
||||||
user = User.get_by_id(account_id)
|
user = User.get_cached_by_id(account_id)
|
||||||
|
|
||||||
query =
|
query =
|
||||||
from(
|
from(
|
||||||
|
|
|
@ -203,7 +203,7 @@ def skip?(
|
||||||
|
|
||||||
def skip?(:follows, activity, %{info: %{notification_settings: %{"follows" => false}}} = user) do
|
def skip?(:follows, activity, %{info: %{notification_settings: %{"follows" => false}}} = user) do
|
||||||
actor = activity.data["actor"]
|
actor = activity.data["actor"]
|
||||||
followed = User.get_by_ap_id(actor)
|
followed = User.get_cached_by_ap_id(actor)
|
||||||
User.following?(user, followed)
|
User.following?(user, followed)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -39,7 +39,7 @@ def fetch_object_from_id(id) do
|
||||||
Logger.info("Couldn't get object via AP, trying out OStatus fetching...")
|
Logger.info("Couldn't get object via AP, trying out OStatus fetching...")
|
||||||
|
|
||||||
case OStatus.fetch_activity_from_url(id) do
|
case OStatus.fetch_activity_from_url(id) do
|
||||||
{:ok, [activity | _]} -> {:ok, Object.normalize(activity.data["object"], false)}
|
{:ok, [activity | _]} -> {:ok, Object.normalize(activity, false)}
|
||||||
e -> e
|
e -> e
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -284,6 +284,7 @@ defp autofollow_users(user) do
|
||||||
def register(%Ecto.Changeset{} = changeset) do
|
def register(%Ecto.Changeset{} = changeset) do
|
||||||
with {:ok, user} <- Repo.insert(changeset),
|
with {:ok, user} <- Repo.insert(changeset),
|
||||||
{:ok, user} <- autofollow_users(user),
|
{:ok, user} <- autofollow_users(user),
|
||||||
|
{:ok, user} <- set_cache(user),
|
||||||
{:ok, _} <- Pleroma.User.WelcomeMessage.post_welcome_message_to_user(user),
|
{:ok, _} <- Pleroma.User.WelcomeMessage.post_welcome_message_to_user(user),
|
||||||
{:ok, _} <- try_send_confirmation_email(user) do
|
{:ok, _} <- try_send_confirmation_email(user) do
|
||||||
{:ok, user}
|
{:ok, user}
|
||||||
|
@ -468,10 +469,13 @@ def get_by_guessed_nickname(ap_id) do
|
||||||
name = List.last(String.split(ap_id, "/"))
|
name = List.last(String.split(ap_id, "/"))
|
||||||
nickname = "#{name}@#{domain}"
|
nickname = "#{name}@#{domain}"
|
||||||
|
|
||||||
get_by_nickname(nickname)
|
get_cached_by_nickname(nickname)
|
||||||
end
|
end
|
||||||
|
|
||||||
def set_cache(user) do
|
def set_cache({:ok, user}), do: set_cache(user)
|
||||||
|
def set_cache({:error, err}), do: {:error, err}
|
||||||
|
|
||||||
|
def set_cache(%User{} = user) do
|
||||||
Cachex.put(:user_cache, "ap_id:#{user.ap_id}", user)
|
Cachex.put(:user_cache, "ap_id:#{user.ap_id}", user)
|
||||||
Cachex.put(:user_cache, "nickname:#{user.nickname}", user)
|
Cachex.put(:user_cache, "nickname:#{user.nickname}", user)
|
||||||
Cachex.put(:user_cache, "user_info:#{user.id}", user_info(user))
|
Cachex.put(:user_cache, "user_info:#{user.id}", user_info(user))
|
||||||
|
@ -559,6 +563,7 @@ def get_or_fetch_by_nickname(nickname) do
|
||||||
with [_nick, _domain] <- String.split(nickname, "@"),
|
with [_nick, _domain] <- String.split(nickname, "@"),
|
||||||
{:ok, user} <- fetch_by_nickname(nickname) do
|
{:ok, user} <- fetch_by_nickname(nickname) do
|
||||||
if Pleroma.Config.get([:fetch_initial_posts, :enabled]) do
|
if Pleroma.Config.get([:fetch_initial_posts, :enabled]) do
|
||||||
|
# TODO turn into job
|
||||||
{:ok, _} = Task.start(__MODULE__, :fetch_initial_posts, [user])
|
{:ok, _} = Task.start(__MODULE__, :fetch_initial_posts, [user])
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -1021,7 +1026,7 @@ def block(blocker, %User{ap_id: ap_id} = blocked) do
|
||||||
|
|
||||||
# helper to handle the block given only an actor's AP id
|
# helper to handle the block given only an actor's AP id
|
||||||
def block(blocker, %{ap_id: ap_id}) do
|
def block(blocker, %{ap_id: ap_id}) do
|
||||||
block(blocker, User.get_by_ap_id(ap_id))
|
block(blocker, get_cached_by_ap_id(ap_id))
|
||||||
end
|
end
|
||||||
|
|
||||||
def unblock(blocker, %{ap_id: ap_id}) do
|
def unblock(blocker, %{ap_id: ap_id}) do
|
||||||
|
@ -1051,7 +1056,7 @@ def blocks?(user, %{ap_id: ap_id}) do
|
||||||
end
|
end
|
||||||
|
|
||||||
def subscribed_to?(user, %{ap_id: ap_id}) do
|
def subscribed_to?(user, %{ap_id: ap_id}) do
|
||||||
with %User{} = target <- User.get_by_ap_id(ap_id) do
|
with %User{} = target <- get_cached_by_ap_id(ap_id) do
|
||||||
Enum.member?(target.info.subscribers, user.ap_id)
|
Enum.member?(target.info.subscribers, user.ap_id)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -1239,7 +1244,7 @@ def fetch_by_ap_id(ap_id) do
|
||||||
end
|
end
|
||||||
|
|
||||||
def get_or_fetch_by_ap_id(ap_id) do
|
def get_or_fetch_by_ap_id(ap_id) do
|
||||||
user = get_by_ap_id(ap_id)
|
user = get_cached_by_ap_id(ap_id)
|
||||||
|
|
||||||
if !is_nil(user) and !User.needs_update?(user) do
|
if !is_nil(user) and !User.needs_update?(user) do
|
||||||
user
|
user
|
||||||
|
@ -1262,7 +1267,7 @@ def get_or_fetch_by_ap_id(ap_id) do
|
||||||
def get_or_create_instance_user do
|
def get_or_create_instance_user do
|
||||||
relay_uri = "#{Pleroma.Web.Endpoint.url()}/relay"
|
relay_uri = "#{Pleroma.Web.Endpoint.url()}/relay"
|
||||||
|
|
||||||
if user = get_by_ap_id(relay_uri) do
|
if user = get_cached_by_ap_id(relay_uri) do
|
||||||
user
|
user
|
||||||
else
|
else
|
||||||
changes =
|
changes =
|
||||||
|
@ -1309,13 +1314,11 @@ defp blank?(""), do: nil
|
||||||
defp blank?(n), do: n
|
defp blank?(n), do: n
|
||||||
|
|
||||||
def insert_or_update_user(data) do
|
def insert_or_update_user(data) do
|
||||||
data =
|
data
|
||||||
data
|
|> Map.put(:name, blank?(data[:name]) || data[:nickname])
|
||||||
|> Map.put(:name, blank?(data[:name]) || data[:nickname])
|
|> remote_user_creation()
|
||||||
|
|> Repo.insert(on_conflict: :replace_all, conflict_target: :nickname)
|
||||||
cs = User.remote_user_creation(data)
|
|> set_cache()
|
||||||
|
|
||||||
Repo.insert(cs, on_conflict: :replace_all, conflict_target: :nickname)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def ap_enabled?(%User{local: true}), do: true
|
def ap_enabled?(%User{local: true}), do: true
|
||||||
|
@ -1331,8 +1334,8 @@ def get_or_fetch(nickname), do: get_or_fetch_by_nickname(nickname)
|
||||||
# this is because we have synchronous follow APIs and need to simulate them
|
# this is because we have synchronous follow APIs and need to simulate them
|
||||||
# with an async handshake
|
# with an async handshake
|
||||||
def wait_and_refresh(_, %User{local: true} = a, %User{local: true} = b) do
|
def wait_and_refresh(_, %User{local: true} = a, %User{local: true} = b) do
|
||||||
with %User{} = a <- User.get_by_id(a.id),
|
with %User{} = a <- User.get_cached_by_id(a.id),
|
||||||
%User{} = b <- User.get_by_id(b.id) do
|
%User{} = b <- User.get_cached_by_id(b.id) do
|
||||||
{:ok, a, b}
|
{:ok, a, b}
|
||||||
else
|
else
|
||||||
_e ->
|
_e ->
|
||||||
|
@ -1342,8 +1345,8 @@ def wait_and_refresh(_, %User{local: true} = a, %User{local: true} = b) do
|
||||||
|
|
||||||
def wait_and_refresh(timeout, %User{} = a, %User{} = b) do
|
def wait_and_refresh(timeout, %User{} = a, %User{} = b) do
|
||||||
with :ok <- :timer.sleep(timeout),
|
with :ok <- :timer.sleep(timeout),
|
||||||
%User{} = a <- User.get_by_id(a.id),
|
%User{} = a <- User.get_cached_by_id(a.id),
|
||||||
%User{} = b <- User.get_by_id(b.id) do
|
%User{} = b <- User.get_cached_by_id(b.id) do
|
||||||
{:ok, a, b}
|
{:ok, a, b}
|
||||||
else
|
else
|
||||||
_e ->
|
_e ->
|
||||||
|
@ -1382,7 +1385,7 @@ def tag(user_identifiers, tags) when is_list(user_identifiers) do
|
||||||
end
|
end
|
||||||
|
|
||||||
def tag(nickname, tags) when is_binary(nickname),
|
def tag(nickname, tags) when is_binary(nickname),
|
||||||
do: tag(User.get_by_nickname(nickname), tags)
|
do: tag(get_by_nickname(nickname), tags)
|
||||||
|
|
||||||
def tag(%User{} = user, tags),
|
def tag(%User{} = user, tags),
|
||||||
do: update_tags(user, Enum.uniq((user.tags || []) ++ normalize_tags(tags)))
|
do: update_tags(user, Enum.uniq((user.tags || []) ++ normalize_tags(tags)))
|
||||||
|
@ -1394,7 +1397,7 @@ def untag(user_identifiers, tags) when is_list(user_identifiers) do
|
||||||
end
|
end
|
||||||
|
|
||||||
def untag(nickname, tags) when is_binary(nickname),
|
def untag(nickname, tags) when is_binary(nickname),
|
||||||
do: untag(User.get_by_nickname(nickname), tags)
|
do: untag(get_by_nickname(nickname), tags)
|
||||||
|
|
||||||
def untag(%User{} = user, tags),
|
def untag(%User{} = user, tags),
|
||||||
do: update_tags(user, (user.tags || []) -- normalize_tags(tags))
|
do: update_tags(user, (user.tags || []) -- normalize_tags(tags))
|
||||||
|
|
|
@ -38,6 +38,7 @@ defmodule Pleroma.User.Info do
|
||||||
field(:salmon, :string, default: nil)
|
field(:salmon, :string, default: nil)
|
||||||
field(:hide_followers, :boolean, default: false)
|
field(:hide_followers, :boolean, default: false)
|
||||||
field(:hide_follows, :boolean, default: false)
|
field(:hide_follows, :boolean, default: false)
|
||||||
|
field(:hide_favorites, :boolean, default: true)
|
||||||
field(:pinned_activities, {:array, :string}, default: [])
|
field(:pinned_activities, {:array, :string}, default: [])
|
||||||
field(:flavour, :string, default: nil)
|
field(:flavour, :string, default: nil)
|
||||||
|
|
||||||
|
@ -202,6 +203,7 @@ def profile_update(info, params) do
|
||||||
:banner,
|
:banner,
|
||||||
:hide_follows,
|
:hide_follows,
|
||||||
:hide_followers,
|
:hide_followers,
|
||||||
|
:hide_favorites,
|
||||||
:background,
|
:background,
|
||||||
:show_role
|
:show_role
|
||||||
])
|
])
|
||||||
|
|
|
@ -168,7 +168,7 @@ def stream_out(activity) do
|
||||||
public = "https://www.w3.org/ns/activitystreams#Public"
|
public = "https://www.w3.org/ns/activitystreams#Public"
|
||||||
|
|
||||||
if activity.data["type"] in ["Create", "Announce", "Delete"] do
|
if activity.data["type"] in ["Create", "Announce", "Delete"] do
|
||||||
object = Object.normalize(activity.data["object"])
|
object = Object.normalize(activity)
|
||||||
Pleroma.Web.Streamer.stream("user", activity)
|
Pleroma.Web.Streamer.stream("user", activity)
|
||||||
Pleroma.Web.Streamer.stream("list", activity)
|
Pleroma.Web.Streamer.stream("list", activity)
|
||||||
|
|
||||||
|
@ -197,7 +197,7 @@ def stream_out(activity) do
|
||||||
if !Enum.member?(activity.data["cc"] || [], public) &&
|
if !Enum.member?(activity.data["cc"] || [], public) &&
|
||||||
!Enum.member?(
|
!Enum.member?(
|
||||||
activity.data["to"],
|
activity.data["to"],
|
||||||
User.get_by_ap_id(activity.data["actor"]).follower_address
|
User.get_cached_by_ap_id(activity.data["actor"]).follower_address
|
||||||
),
|
),
|
||||||
do: Pleroma.Web.Streamer.stream("direct", activity)
|
do: Pleroma.Web.Streamer.stream("direct", activity)
|
||||||
end
|
end
|
||||||
|
@ -890,7 +890,7 @@ def fetch_and_prepare_user_from_ap_id(ap_id) do
|
||||||
end
|
end
|
||||||
|
|
||||||
def make_user_from_ap_id(ap_id) do
|
def make_user_from_ap_id(ap_id) do
|
||||||
if _user = User.get_by_ap_id(ap_id) do
|
if _user = User.get_cached_by_ap_id(ap_id) do
|
||||||
Transmogrifier.upgrade_user_from_ap_id(ap_id)
|
Transmogrifier.upgrade_user_from_ap_id(ap_id)
|
||||||
else
|
else
|
||||||
with {:ok, data} <- fetch_and_prepare_user_from_ap_id(ap_id) do
|
with {:ok, data} <- fetch_and_prepare_user_from_ap_id(ap_id) do
|
||||||
|
|
|
@ -537,7 +537,7 @@ def handle_incoming(
|
||||||
data
|
data
|
||||||
)
|
)
|
||||||
when object_type in ["Person", "Application", "Service", "Organization"] do
|
when object_type in ["Person", "Application", "Service", "Organization"] do
|
||||||
with %User{ap_id: ^actor_id} = actor <- User.get_by_ap_id(object["id"]) do
|
with %User{ap_id: ^actor_id} = actor <- User.get_cached_by_ap_id(object["id"]) do
|
||||||
{:ok, new_user_data} = ActivityPub.user_data_from_user_object(object)
|
{:ok, new_user_data} = ActivityPub.user_data_from_user_object(object)
|
||||||
|
|
||||||
banner = new_user_data[:info]["banner"]
|
banner = new_user_data[:info]["banner"]
|
||||||
|
@ -964,7 +964,7 @@ def perform(:user_upgrade, user) do
|
||||||
end
|
end
|
||||||
|
|
||||||
def upgrade_user_from_ap_id(ap_id) do
|
def upgrade_user_from_ap_id(ap_id) do
|
||||||
with %User{local: false} = user <- User.get_by_ap_id(ap_id),
|
with %User{local: false} = user <- User.get_cached_by_ap_id(ap_id),
|
||||||
{:ok, data} <- ActivityPub.fetch_and_prepare_user_from_ap_id(ap_id),
|
{:ok, data} <- ActivityPub.fetch_and_prepare_user_from_ap_id(ap_id),
|
||||||
already_ap <- User.ap_enabled?(user),
|
already_ap <- User.ap_enabled?(user),
|
||||||
{:ok, user} <- user |> User.upgrade_changeset(data) |> User.update_and_set_cache() do
|
{:ok, user} <- user |> User.upgrade_changeset(data) |> User.update_and_set_cache() do
|
||||||
|
|
|
@ -19,7 +19,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIController do
|
||||||
action_fallback(:errors)
|
action_fallback(:errors)
|
||||||
|
|
||||||
def user_delete(conn, %{"nickname" => nickname}) do
|
def user_delete(conn, %{"nickname" => nickname}) do
|
||||||
User.get_by_nickname(nickname)
|
User.get_cached_by_nickname(nickname)
|
||||||
|> User.delete()
|
|> User.delete()
|
||||||
|
|
||||||
conn
|
conn
|
||||||
|
@ -27,8 +27,8 @@ def user_delete(conn, %{"nickname" => nickname}) do
|
||||||
end
|
end
|
||||||
|
|
||||||
def user_follow(conn, %{"follower" => follower_nick, "followed" => followed_nick}) do
|
def user_follow(conn, %{"follower" => follower_nick, "followed" => followed_nick}) do
|
||||||
with %User{} = follower <- User.get_by_nickname(follower_nick),
|
with %User{} = follower <- User.get_cached_by_nickname(follower_nick),
|
||||||
%User{} = followed <- User.get_by_nickname(followed_nick) do
|
%User{} = followed <- User.get_cached_by_nickname(followed_nick) do
|
||||||
User.follow(follower, followed)
|
User.follow(follower, followed)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -37,8 +37,8 @@ def user_follow(conn, %{"follower" => follower_nick, "followed" => followed_nick
|
||||||
end
|
end
|
||||||
|
|
||||||
def user_unfollow(conn, %{"follower" => follower_nick, "followed" => followed_nick}) do
|
def user_unfollow(conn, %{"follower" => follower_nick, "followed" => followed_nick}) do
|
||||||
with %User{} = follower <- User.get_by_nickname(follower_nick),
|
with %User{} = follower <- User.get_cached_by_nickname(follower_nick),
|
||||||
%User{} = followed <- User.get_by_nickname(followed_nick) do
|
%User{} = followed <- User.get_cached_by_nickname(followed_nick) do
|
||||||
User.unfollow(follower, followed)
|
User.unfollow(follower, followed)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -67,7 +67,7 @@ def user_create(
|
||||||
end
|
end
|
||||||
|
|
||||||
def user_show(conn, %{"nickname" => nickname}) do
|
def user_show(conn, %{"nickname" => nickname}) do
|
||||||
with %User{} = user <- User.get_by_nickname(nickname) do
|
with %User{} = user <- User.get_cached_by_nickname(nickname) do
|
||||||
conn
|
conn
|
||||||
|> json(AccountView.render("show.json", %{user: user}))
|
|> json(AccountView.render("show.json", %{user: user}))
|
||||||
else
|
else
|
||||||
|
@ -76,7 +76,7 @@ def user_show(conn, %{"nickname" => nickname}) do
|
||||||
end
|
end
|
||||||
|
|
||||||
def user_toggle_activation(conn, %{"nickname" => nickname}) do
|
def user_toggle_activation(conn, %{"nickname" => nickname}) do
|
||||||
user = User.get_by_nickname(nickname)
|
user = User.get_cached_by_nickname(nickname)
|
||||||
|
|
||||||
{:ok, updated_user} = User.deactivate(user, !user.info.deactivated)
|
{:ok, updated_user} = User.deactivate(user, !user.info.deactivated)
|
||||||
|
|
||||||
|
@ -131,7 +131,7 @@ defp maybe_parse_filters(filters) do
|
||||||
|
|
||||||
def right_add(conn, %{"permission_group" => permission_group, "nickname" => nickname})
|
def right_add(conn, %{"permission_group" => permission_group, "nickname" => nickname})
|
||||||
when permission_group in ["moderator", "admin"] do
|
when permission_group in ["moderator", "admin"] do
|
||||||
user = User.get_by_nickname(nickname)
|
user = User.get_cached_by_nickname(nickname)
|
||||||
|
|
||||||
info =
|
info =
|
||||||
%{}
|
%{}
|
||||||
|
@ -156,7 +156,7 @@ def right_add(conn, _) do
|
||||||
end
|
end
|
||||||
|
|
||||||
def right_get(conn, %{"nickname" => nickname}) do
|
def right_get(conn, %{"nickname" => nickname}) do
|
||||||
user = User.get_by_nickname(nickname)
|
user = User.get_cached_by_nickname(nickname)
|
||||||
|
|
||||||
conn
|
conn
|
||||||
|> json(%{
|
|> json(%{
|
||||||
|
@ -178,7 +178,7 @@ def right_delete(
|
||||||
|> put_status(403)
|
|> put_status(403)
|
||||||
|> json(%{error: "You can't revoke your own admin status."})
|
|> json(%{error: "You can't revoke your own admin status."})
|
||||||
else
|
else
|
||||||
user = User.get_by_nickname(nickname)
|
user = User.get_cached_by_nickname(nickname)
|
||||||
|
|
||||||
info =
|
info =
|
||||||
%{}
|
%{}
|
||||||
|
@ -204,7 +204,7 @@ def right_delete(conn, _) do
|
||||||
|
|
||||||
def set_activation_status(conn, %{"nickname" => nickname, "status" => status}) do
|
def set_activation_status(conn, %{"nickname" => nickname, "status" => status}) do
|
||||||
with {:ok, status} <- Ecto.Type.cast(:boolean, status),
|
with {:ok, status} <- Ecto.Type.cast(:boolean, status),
|
||||||
%User{} = user <- User.get_by_nickname(nickname),
|
%User{} = user <- User.get_cached_by_nickname(nickname),
|
||||||
{:ok, _} <- User.deactivate(user, !status),
|
{:ok, _} <- User.deactivate(user, !status),
|
||||||
do: json_response(conn, :no_content, "")
|
do: json_response(conn, :no_content, "")
|
||||||
end
|
end
|
||||||
|
@ -277,7 +277,7 @@ def revoke_invite(conn, %{"token" => token}) do
|
||||||
|
|
||||||
@doc "Get a password reset token (base64 string) for given nickname"
|
@doc "Get a password reset token (base64 string) for given nickname"
|
||||||
def get_password_reset(conn, %{"nickname" => nickname}) do
|
def get_password_reset(conn, %{"nickname" => nickname}) do
|
||||||
(%User{local: true} = user) = User.get_by_nickname(nickname)
|
(%User{local: true} = user) = User.get_cached_by_nickname(nickname)
|
||||||
{:ok, token} = Pleroma.PasswordResetToken.create_token(user)
|
{:ok, token} = Pleroma.PasswordResetToken.create_token(user)
|
||||||
|
|
||||||
conn
|
conn
|
||||||
|
|
|
@ -24,7 +24,7 @@ defmodule Pleroma.Web.UserSocket do
|
||||||
def connect(%{"token" => token}, socket) do
|
def connect(%{"token" => token}, socket) do
|
||||||
with true <- Pleroma.Config.get([:chat, :enabled]),
|
with true <- Pleroma.Config.get([:chat, :enabled]),
|
||||||
{:ok, user_id} <- Phoenix.Token.verify(socket, "user socket", token, max_age: 84_600),
|
{:ok, user_id} <- Phoenix.Token.verify(socket, "user socket", token, max_age: 84_600),
|
||||||
%User{} = user <- Pleroma.User.get_by_id(user_id) do
|
%User{} = user <- Pleroma.User.get_cached_by_id(user_id) do
|
||||||
{:ok, assign(socket, :user_name, user.nickname)}
|
{:ok, assign(socket, :user_name, user.nickname)}
|
||||||
else
|
else
|
||||||
_e -> :error
|
_e -> :error
|
||||||
|
|
|
@ -284,7 +284,7 @@ def thread_muted?(user, activity) do
|
||||||
|
|
||||||
def report(user, data) do
|
def report(user, data) do
|
||||||
with {:account_id, %{"account_id" => account_id}} <- {:account_id, data},
|
with {:account_id, %{"account_id" => account_id}} <- {:account_id, data},
|
||||||
{:account, %User{} = account} <- {:account, User.get_by_id(account_id)},
|
{:account, %User{} = account} <- {:account, User.get_cached_by_id(account_id)},
|
||||||
{:ok, {content_html, _, _}} <- make_report_content_html(data["comment"]),
|
{:ok, {content_html, _, _}} <- make_report_content_html(data["comment"]),
|
||||||
{:ok, statuses} <- get_report_statuses(account, data),
|
{:ok, statuses} <- get_report_statuses(account, data),
|
||||||
{:ok, activity} <-
|
{:ok, activity} <-
|
||||||
|
|
|
@ -226,7 +226,7 @@ def make_note_data(
|
||||||
}
|
}
|
||||||
|
|
||||||
if in_reply_to do
|
if in_reply_to do
|
||||||
in_reply_to_object = Object.normalize(in_reply_to.data["object"])
|
in_reply_to_object = Object.normalize(in_reply_to)
|
||||||
|
|
||||||
object
|
object
|
||||||
|> Map.put("inReplyTo", in_reply_to_object.data["id"])
|
|> Map.put("inReplyTo", in_reply_to_object.data["id"])
|
||||||
|
@ -284,7 +284,7 @@ defp shortname(name) do
|
||||||
end
|
end
|
||||||
|
|
||||||
def confirm_current_password(user, password) do
|
def confirm_current_password(user, password) do
|
||||||
with %User{local: true} = db_user <- User.get_by_id(user.id),
|
with %User{local: true} = db_user <- User.get_cached_by_id(user.id),
|
||||||
true <- Pbkdf2.checkpw(password, db_user.password_hash) do
|
true <- Pbkdf2.checkpw(password, db_user.password_hash) do
|
||||||
{:ok, db_user}
|
{:ok, db_user}
|
||||||
else
|
else
|
||||||
|
|
|
@ -186,7 +186,7 @@ def perform(type, _) do
|
||||||
end
|
end
|
||||||
|
|
||||||
def ap_enabled_actor(id) do
|
def ap_enabled_actor(id) do
|
||||||
user = User.get_by_ap_id(id)
|
user = User.get_cached_by_ap_id(id)
|
||||||
|
|
||||||
if User.ap_enabled?(user) do
|
if User.ap_enabled?(user) do
|
||||||
{:ok, user}
|
{:ok, user}
|
||||||
|
|
|
@ -304,7 +304,7 @@ def public_timeline(%{assigns: %{user: user}} = conn, params) do
|
||||||
end
|
end
|
||||||
|
|
||||||
def user_statuses(%{assigns: %{user: reading_user}} = conn, params) do
|
def user_statuses(%{assigns: %{user: reading_user}} = conn, params) do
|
||||||
with %User{} = user <- User.get_by_id(params["id"]) do
|
with %User{} = user <- User.get_cached_by_id(params["id"]) do
|
||||||
activities = ActivityPub.fetch_user_activities(user, reading_user, params)
|
activities = ActivityPub.fetch_user_activities(user, reading_user, params)
|
||||||
|
|
||||||
conn
|
conn
|
||||||
|
@ -546,7 +546,7 @@ def unpin_status(%{assigns: %{user: user}} = conn, %{"id" => ap_id_or_id}) do
|
||||||
def bookmark_status(%{assigns: %{user: user}} = conn, %{"id" => id}) do
|
def bookmark_status(%{assigns: %{user: user}} = conn, %{"id" => id}) do
|
||||||
with %Activity{} = activity <- Activity.get_by_id_with_object(id),
|
with %Activity{} = activity <- Activity.get_by_id_with_object(id),
|
||||||
%Object{} = object <- Object.normalize(activity),
|
%Object{} = object <- Object.normalize(activity),
|
||||||
%User{} = user <- User.get_by_nickname(user.nickname),
|
%User{} = user <- User.get_cached_by_nickname(user.nickname),
|
||||||
true <- Visibility.visible_for_user?(activity, user),
|
true <- Visibility.visible_for_user?(activity, user),
|
||||||
{:ok, user} <- User.bookmark(user, object.data["id"]) do
|
{:ok, user} <- User.bookmark(user, object.data["id"]) do
|
||||||
conn
|
conn
|
||||||
|
@ -558,7 +558,7 @@ def bookmark_status(%{assigns: %{user: user}} = conn, %{"id" => id}) do
|
||||||
def unbookmark_status(%{assigns: %{user: user}} = conn, %{"id" => id}) do
|
def unbookmark_status(%{assigns: %{user: user}} = conn, %{"id" => id}) do
|
||||||
with %Activity{} = activity <- Activity.get_by_id_with_object(id),
|
with %Activity{} = activity <- Activity.get_by_id_with_object(id),
|
||||||
%Object{} = object <- Object.normalize(activity),
|
%Object{} = object <- Object.normalize(activity),
|
||||||
%User{} = user <- User.get_by_nickname(user.nickname),
|
%User{} = user <- User.get_cached_by_nickname(user.nickname),
|
||||||
true <- Visibility.visible_for_user?(activity, user),
|
true <- Visibility.visible_for_user?(activity, user),
|
||||||
{:ok, user} <- User.unbookmark(user, object.data["id"]) do
|
{:ok, user} <- User.unbookmark(user, object.data["id"]) do
|
||||||
conn
|
conn
|
||||||
|
@ -750,7 +750,7 @@ def hashtag_timeline(%{assigns: %{user: user}} = conn, params) do
|
||||||
end
|
end
|
||||||
|
|
||||||
def followers(%{assigns: %{user: for_user}} = conn, %{"id" => id} = params) do
|
def followers(%{assigns: %{user: for_user}} = conn, %{"id" => id} = params) do
|
||||||
with %User{} = user <- User.get_by_id(id),
|
with %User{} = user <- User.get_cached_by_id(id),
|
||||||
followers <- MastodonAPI.get_followers(user, params) do
|
followers <- MastodonAPI.get_followers(user, params) do
|
||||||
followers =
|
followers =
|
||||||
cond do
|
cond do
|
||||||
|
@ -767,7 +767,7 @@ def followers(%{assigns: %{user: for_user}} = conn, %{"id" => id} = params) do
|
||||||
end
|
end
|
||||||
|
|
||||||
def following(%{assigns: %{user: for_user}} = conn, %{"id" => id} = params) do
|
def following(%{assigns: %{user: for_user}} = conn, %{"id" => id} = params) do
|
||||||
with %User{} = user <- User.get_by_id(id),
|
with %User{} = user <- User.get_cached_by_id(id),
|
||||||
followers <- MastodonAPI.get_friends(user, params) do
|
followers <- MastodonAPI.get_friends(user, params) do
|
||||||
followers =
|
followers =
|
||||||
cond do
|
cond do
|
||||||
|
@ -792,7 +792,7 @@ def follow_requests(%{assigns: %{user: followed}} = conn, _params) do
|
||||||
end
|
end
|
||||||
|
|
||||||
def authorize_follow_request(%{assigns: %{user: followed}} = conn, %{"id" => id}) do
|
def authorize_follow_request(%{assigns: %{user: followed}} = conn, %{"id" => id}) do
|
||||||
with %User{} = follower <- User.get_by_id(id),
|
with %User{} = follower <- User.get_cached_by_id(id),
|
||||||
{:ok, follower} <- CommonAPI.accept_follow_request(follower, followed) do
|
{:ok, follower} <- CommonAPI.accept_follow_request(follower, followed) do
|
||||||
conn
|
conn
|
||||||
|> put_view(AccountView)
|
|> put_view(AccountView)
|
||||||
|
@ -806,7 +806,7 @@ def authorize_follow_request(%{assigns: %{user: followed}} = conn, %{"id" => id}
|
||||||
end
|
end
|
||||||
|
|
||||||
def reject_follow_request(%{assigns: %{user: followed}} = conn, %{"id" => id}) do
|
def reject_follow_request(%{assigns: %{user: followed}} = conn, %{"id" => id}) do
|
||||||
with %User{} = follower <- User.get_by_id(id),
|
with %User{} = follower <- User.get_cached_by_id(id),
|
||||||
{:ok, follower} <- CommonAPI.reject_follow_request(follower, followed) do
|
{:ok, follower} <- CommonAPI.reject_follow_request(follower, followed) do
|
||||||
conn
|
conn
|
||||||
|> put_view(AccountView)
|
|> put_view(AccountView)
|
||||||
|
@ -872,7 +872,7 @@ def unfollow(%{assigns: %{user: follower}} = conn, %{"id" => id}) do
|
||||||
end
|
end
|
||||||
|
|
||||||
def mute(%{assigns: %{user: muter}} = conn, %{"id" => id}) do
|
def mute(%{assigns: %{user: muter}} = conn, %{"id" => id}) do
|
||||||
with %User{} = muted <- User.get_by_id(id),
|
with %User{} = muted <- User.get_cached_by_id(id),
|
||||||
{:ok, muter} <- User.mute(muter, muted) do
|
{:ok, muter} <- User.mute(muter, muted) do
|
||||||
conn
|
conn
|
||||||
|> put_view(AccountView)
|
|> put_view(AccountView)
|
||||||
|
@ -886,7 +886,7 @@ def mute(%{assigns: %{user: muter}} = conn, %{"id" => id}) do
|
||||||
end
|
end
|
||||||
|
|
||||||
def unmute(%{assigns: %{user: muter}} = conn, %{"id" => id}) do
|
def unmute(%{assigns: %{user: muter}} = conn, %{"id" => id}) do
|
||||||
with %User{} = muted <- User.get_by_id(id),
|
with %User{} = muted <- User.get_cached_by_id(id),
|
||||||
{:ok, muter} <- User.unmute(muter, muted) do
|
{:ok, muter} <- User.unmute(muter, muted) do
|
||||||
conn
|
conn
|
||||||
|> put_view(AccountView)
|
|> put_view(AccountView)
|
||||||
|
@ -907,7 +907,7 @@ def mutes(%{assigns: %{user: user}} = conn, _) do
|
||||||
end
|
end
|
||||||
|
|
||||||
def block(%{assigns: %{user: blocker}} = conn, %{"id" => id}) do
|
def block(%{assigns: %{user: blocker}} = conn, %{"id" => id}) do
|
||||||
with %User{} = blocked <- User.get_by_id(id),
|
with %User{} = blocked <- User.get_cached_by_id(id),
|
||||||
{:ok, blocker} <- User.block(blocker, blocked),
|
{:ok, blocker} <- User.block(blocker, blocked),
|
||||||
{:ok, _activity} <- ActivityPub.block(blocker, blocked) do
|
{:ok, _activity} <- ActivityPub.block(blocker, blocked) do
|
||||||
conn
|
conn
|
||||||
|
@ -922,7 +922,7 @@ def block(%{assigns: %{user: blocker}} = conn, %{"id" => id}) do
|
||||||
end
|
end
|
||||||
|
|
||||||
def unblock(%{assigns: %{user: blocker}} = conn, %{"id" => id}) do
|
def unblock(%{assigns: %{user: blocker}} = conn, %{"id" => id}) do
|
||||||
with %User{} = blocked <- User.get_by_id(id),
|
with %User{} = blocked <- User.get_cached_by_id(id),
|
||||||
{:ok, blocker} <- User.unblock(blocker, blocked),
|
{:ok, blocker} <- User.unblock(blocker, blocked),
|
||||||
{:ok, _activity} <- ActivityPub.unblock(blocker, blocked) do
|
{:ok, _activity} <- ActivityPub.unblock(blocker, blocked) do
|
||||||
conn
|
conn
|
||||||
|
@ -1087,8 +1087,45 @@ def favourites(%{assigns: %{user: user}} = conn, params) do
|
||||||
|> render("index.json", %{activities: activities, for: user, as: :activity})
|
|> render("index.json", %{activities: activities, for: user, as: :activity})
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def user_favourites(%{assigns: %{user: for_user}} = conn, %{"id" => id} = params) do
|
||||||
|
with %User{} = user <- User.get_by_id(id),
|
||||||
|
false <- user.info.hide_favorites do
|
||||||
|
params =
|
||||||
|
params
|
||||||
|
|> Map.put("type", "Create")
|
||||||
|
|> Map.put("favorited_by", user.ap_id)
|
||||||
|
|> Map.put("blocking_user", for_user)
|
||||||
|
|
||||||
|
recipients =
|
||||||
|
if for_user do
|
||||||
|
["https://www.w3.org/ns/activitystreams#Public"] ++
|
||||||
|
[for_user.ap_id | for_user.following]
|
||||||
|
else
|
||||||
|
["https://www.w3.org/ns/activitystreams#Public"]
|
||||||
|
end
|
||||||
|
|
||||||
|
activities =
|
||||||
|
recipients
|
||||||
|
|> ActivityPub.fetch_activities(params)
|
||||||
|
|> Enum.reverse()
|
||||||
|
|
||||||
|
conn
|
||||||
|
|> add_link_headers(:favourites, activities)
|
||||||
|
|> put_view(StatusView)
|
||||||
|
|> render("index.json", %{activities: activities, for: for_user, as: :activity})
|
||||||
|
else
|
||||||
|
nil ->
|
||||||
|
{:error, :not_found}
|
||||||
|
|
||||||
|
true ->
|
||||||
|
conn
|
||||||
|
|> put_status(403)
|
||||||
|
|> json(%{error: "Can't get favorites"})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def bookmarks(%{assigns: %{user: user}} = conn, _) do
|
def bookmarks(%{assigns: %{user: user}} = conn, _) do
|
||||||
user = User.get_by_id(user.id)
|
user = User.get_cached_by_id(user.id)
|
||||||
|
|
||||||
activities =
|
activities =
|
||||||
user.bookmarks
|
user.bookmarks
|
||||||
|
@ -1145,7 +1182,7 @@ def add_to_list(%{assigns: %{user: user}} = conn, %{"id" => id, "account_ids" =>
|
||||||
accounts
|
accounts
|
||||||
|> Enum.each(fn account_id ->
|
|> Enum.each(fn account_id ->
|
||||||
with %Pleroma.List{} = list <- Pleroma.List.get(id, user),
|
with %Pleroma.List{} = list <- Pleroma.List.get(id, user),
|
||||||
%User{} = followed <- User.get_by_id(account_id) do
|
%User{} = followed <- User.get_cached_by_id(account_id) do
|
||||||
Pleroma.List.follow(list, followed)
|
Pleroma.List.follow(list, followed)
|
||||||
end
|
end
|
||||||
end)
|
end)
|
||||||
|
@ -1157,7 +1194,7 @@ def remove_from_list(%{assigns: %{user: user}} = conn, %{"id" => id, "account_id
|
||||||
accounts
|
accounts
|
||||||
|> Enum.each(fn account_id ->
|
|> Enum.each(fn account_id ->
|
||||||
with %Pleroma.List{} = list <- Pleroma.List.get(id, user),
|
with %Pleroma.List{} = list <- Pleroma.List.get(id, user),
|
||||||
%User{} = followed <- Pleroma.User.get_by_id(account_id) do
|
%User{} = followed <- Pleroma.User.get_cached_by_id(account_id) do
|
||||||
Pleroma.List.unfollow(list, followed)
|
Pleroma.List.unfollow(list, followed)
|
||||||
end
|
end
|
||||||
end)
|
end)
|
||||||
|
@ -1450,7 +1487,7 @@ def logout(conn, _) do
|
||||||
def relationship_noop(%{assigns: %{user: user}} = conn, %{"id" => id}) do
|
def relationship_noop(%{assigns: %{user: user}} = conn, %{"id" => id}) do
|
||||||
Logger.debug("Unimplemented, returning unmodified relationship")
|
Logger.debug("Unimplemented, returning unmodified relationship")
|
||||||
|
|
||||||
with %User{} = target <- User.get_by_id(id) do
|
with %User{} = target <- User.get_cached_by_id(id) do
|
||||||
conn
|
conn
|
||||||
|> put_view(AccountView)
|
|> put_view(AccountView)
|
||||||
|> render("relationship.json", %{user: user, target: target})
|
|> render("relationship.json", %{user: user, target: target})
|
||||||
|
|
|
@ -68,7 +68,7 @@ def render("relationships.json", %{user: user, targets: targets}) do
|
||||||
defp do_render("account.json", %{user: user} = opts) do
|
defp do_render("account.json", %{user: user} = opts) do
|
||||||
image = User.avatar_url(user) |> MediaProxy.url()
|
image = User.avatar_url(user) |> MediaProxy.url()
|
||||||
header = User.banner_url(user) |> MediaProxy.url()
|
header = User.banner_url(user) |> MediaProxy.url()
|
||||||
user_info = User.user_info(user)
|
user_info = User.get_cached_user_info(user)
|
||||||
bot = (user.info.source_data["type"] || "Person") in ["Application", "Service"]
|
bot = (user.info.source_data["type"] || "Person") in ["Application", "Service"]
|
||||||
|
|
||||||
emojis =
|
emojis =
|
||||||
|
|
|
@ -31,7 +31,7 @@ defp get_replied_to_activities(activities) do
|
||||||
|> Activity.create_by_object_ap_id()
|
|> Activity.create_by_object_ap_id()
|
||||||
|> Repo.all()
|
|> Repo.all()
|
||||||
|> Enum.reduce(%{}, fn activity, acc ->
|
|> Enum.reduce(%{}, fn activity, acc ->
|
||||||
object = Object.normalize(activity.data["object"])
|
object = Object.normalize(activity)
|
||||||
Map.put(acc, object.data["id"], activity)
|
Map.put(acc, object.data["id"], activity)
|
||||||
end)
|
end)
|
||||||
end
|
end
|
||||||
|
@ -238,6 +238,7 @@ def render("status.json", %{activity: %{data: %{"object" => _object}} = activity
|
||||||
pleroma: %{
|
pleroma: %{
|
||||||
local: activity.local,
|
local: activity.local,
|
||||||
conversation_id: get_context_id(activity),
|
conversation_id: get_context_id(activity),
|
||||||
|
in_reply_to_account_acct: reply_to_user && reply_to_user.nickname,
|
||||||
content: %{"text/plain" => content_plaintext},
|
content: %{"text/plain" => content_plaintext},
|
||||||
spoiler_text: %{"text/plain" => summary_plaintext}
|
spoiler_text: %{"text/plain" => summary_plaintext}
|
||||||
}
|
}
|
||||||
|
@ -316,7 +317,7 @@ def render("attachment.json", %{attachment: attachment}) do
|
||||||
end
|
end
|
||||||
|
|
||||||
def get_reply_to(activity, %{replied_to_activities: replied_to_activities}) do
|
def get_reply_to(activity, %{replied_to_activities: replied_to_activities}) do
|
||||||
object = Object.normalize(activity.data["object"])
|
object = Object.normalize(activity)
|
||||||
|
|
||||||
with nil <- replied_to_activities[object.data["inReplyTo"]] do
|
with nil <- replied_to_activities[object.data["inReplyTo"]] do
|
||||||
# If user didn't participate in the thread
|
# If user didn't participate in the thread
|
||||||
|
|
|
@ -90,7 +90,7 @@ defp allow_request(stream, nil) when stream in @anonymous_streams do
|
||||||
# Authenticated streams.
|
# Authenticated streams.
|
||||||
defp allow_request(stream, {"access_token", access_token}) when stream in @streams do
|
defp allow_request(stream, {"access_token", access_token}) when stream in @streams do
|
||||||
with %Token{user_id: user_id} <- Repo.get_by(Token, token: access_token),
|
with %Token{user_id: user_id} <- Repo.get_by(Token, token: access_token),
|
||||||
user = %User{} <- User.get_by_id(user_id) do
|
user = %User{} <- User.get_cached_by_id(user_id) do
|
||||||
{:ok, user}
|
{:ok, user}
|
||||||
else
|
else
|
||||||
_ -> {:error, 403}
|
_ -> {:error, 403}
|
||||||
|
|
|
@ -143,7 +143,7 @@ def token_exchange(conn, %{"grant_type" => "authorization_code"} = params) do
|
||||||
fixed_token = fix_padding(params["code"]),
|
fixed_token = fix_padding(params["code"]),
|
||||||
%Authorization{} = auth <-
|
%Authorization{} = auth <-
|
||||||
Repo.get_by(Authorization, token: fixed_token, app_id: app.id),
|
Repo.get_by(Authorization, token: fixed_token, app_id: app.id),
|
||||||
%User{} = user <- User.get_by_id(auth.user_id),
|
%User{} = user <- User.get_cached_by_id(auth.user_id),
|
||||||
{:ok, token} <- Token.exchange_token(app, auth),
|
{:ok, token} <- Token.exchange_token(app, auth),
|
||||||
{:ok, inserted_at} <- DateTime.from_naive(token.inserted_at, "Etc/UTC") do
|
{:ok, inserted_at} <- DateTime.from_naive(token.inserted_at, "Etc/UTC") do
|
||||||
response = %{
|
response = %{
|
||||||
|
|
|
@ -27,7 +27,7 @@ defmodule Pleroma.Web.OAuth.Token do
|
||||||
def exchange_token(app, auth) do
|
def exchange_token(app, auth) do
|
||||||
with {:ok, auth} <- Authorization.use_token(auth),
|
with {:ok, auth} <- Authorization.use_token(auth),
|
||||||
true <- auth.app_id == app.id do
|
true <- auth.app_id == app.id do
|
||||||
create_token(app, User.get_by_id(auth.user_id), auth.scopes)
|
create_token(app, User.get_cached_by_id(auth.user_id), auth.scopes)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -84,7 +84,7 @@ def to_simple_form(activity, user, with_author \\ false)
|
||||||
def to_simple_form(%{data: %{"type" => "Create"}} = activity, user, with_author) do
|
def to_simple_form(%{data: %{"type" => "Create"}} = activity, user, with_author) do
|
||||||
h = fn str -> [to_charlist(str)] end
|
h = fn str -> [to_charlist(str)] end
|
||||||
|
|
||||||
object = Object.normalize(activity.data["object"])
|
object = Object.normalize(activity)
|
||||||
|
|
||||||
updated_at = object.data["published"]
|
updated_at = object.data["published"]
|
||||||
inserted_at = object.data["published"]
|
inserted_at = object.data["published"]
|
||||||
|
|
|
@ -294,7 +294,7 @@ def make_user(uri, update \\ false) do
|
||||||
}
|
}
|
||||||
|
|
||||||
with false <- update,
|
with false <- update,
|
||||||
%User{} = user <- User.get_by_ap_id(data.ap_id) do
|
%User{} = user <- User.get_cached_by_ap_id(data.ap_id) do
|
||||||
{:ok, user}
|
{:ok, user}
|
||||||
else
|
else
|
||||||
_e -> User.insert_or_update_user(data)
|
_e -> User.insert_or_update_user(data)
|
||||||
|
|
|
@ -135,6 +135,7 @@ defmodule Pleroma.Web.Router do
|
||||||
post("/password_reset", UtilController, :password_reset)
|
post("/password_reset", UtilController, :password_reset)
|
||||||
get("/emoji", UtilController, :emoji)
|
get("/emoji", UtilController, :emoji)
|
||||||
get("/captcha", UtilController, :captcha)
|
get("/captcha", UtilController, :captcha)
|
||||||
|
get("/healthcheck", UtilController, :healthcheck)
|
||||||
end
|
end
|
||||||
|
|
||||||
scope "/api/pleroma", Pleroma.Web do
|
scope "/api/pleroma", Pleroma.Web do
|
||||||
|
@ -395,6 +396,8 @@ defmodule Pleroma.Web.Router do
|
||||||
get("/accounts/:id", MastodonAPIController, :user)
|
get("/accounts/:id", MastodonAPIController, :user)
|
||||||
|
|
||||||
get("/search", MastodonAPIController, :search)
|
get("/search", MastodonAPIController, :search)
|
||||||
|
|
||||||
|
get("/pleroma/accounts/:id/favourites", MastodonAPIController, :user_favourites)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -81,7 +81,7 @@ def handle_cast(%{action: :stream, topic: "list", item: item}, topics) do
|
||||||
_ ->
|
_ ->
|
||||||
Pleroma.List.get_lists_from_activity(item)
|
Pleroma.List.get_lists_from_activity(item)
|
||||||
|> Enum.filter(fn list ->
|
|> Enum.filter(fn list ->
|
||||||
owner = User.get_by_id(list.user_id)
|
owner = User.get_cached_by_id(list.user_id)
|
||||||
|
|
||||||
Visibility.visible_for_user?(item, owner)
|
Visibility.visible_for_user?(item, owner)
|
||||||
end)
|
end)
|
||||||
|
|
|
@ -22,7 +22,7 @@ defmodule Pleroma.Web.TwitterAPI.UtilController do
|
||||||
|
|
||||||
def show_password_reset(conn, %{"token" => token}) do
|
def show_password_reset(conn, %{"token" => token}) do
|
||||||
with %{used: false} = token <- Repo.get_by(PasswordResetToken, %{token: token}),
|
with %{used: false} = token <- Repo.get_by(PasswordResetToken, %{token: token}),
|
||||||
%User{} = user <- User.get_by_id(token.user_id) do
|
%User{} = user <- User.get_cached_by_id(token.user_id) do
|
||||||
render(conn, "password_reset.html", %{
|
render(conn, "password_reset.html", %{
|
||||||
token: token,
|
token: token,
|
||||||
user: user
|
user: user
|
||||||
|
@ -113,13 +113,13 @@ defp is_status?(acct) do
|
||||||
def do_remote_follow(conn, %{
|
def do_remote_follow(conn, %{
|
||||||
"authorization" => %{"name" => username, "password" => password, "id" => id}
|
"authorization" => %{"name" => username, "password" => password, "id" => id}
|
||||||
}) do
|
}) do
|
||||||
followee = User.get_by_id(id)
|
followee = User.get_cached_by_id(id)
|
||||||
avatar = User.avatar_url(followee)
|
avatar = User.avatar_url(followee)
|
||||||
name = followee.nickname
|
name = followee.nickname
|
||||||
|
|
||||||
with %User{} = user <- User.get_cached_by_nickname(username),
|
with %User{} = user <- User.get_cached_by_nickname(username),
|
||||||
true <- Pbkdf2.checkpw(password, user.password_hash),
|
true <- Pbkdf2.checkpw(password, user.password_hash),
|
||||||
%User{} = _followed <- User.get_by_id(id),
|
%User{} = _followed <- User.get_cached_by_id(id),
|
||||||
{:ok, follower} <- User.follow(user, followee),
|
{:ok, follower} <- User.follow(user, followee),
|
||||||
{:ok, _activity} <- ActivityPub.follow(follower, followee) do
|
{:ok, _activity} <- ActivityPub.follow(follower, followee) do
|
||||||
conn
|
conn
|
||||||
|
@ -141,7 +141,7 @@ def do_remote_follow(conn, %{
|
||||||
end
|
end
|
||||||
|
|
||||||
def do_remote_follow(%{assigns: %{user: user}} = conn, %{"user" => %{"id" => id}}) do
|
def do_remote_follow(%{assigns: %{user: user}} = conn, %{"user" => %{"id" => id}}) do
|
||||||
with %User{} = followee <- User.get_by_id(id),
|
with %User{} = followee <- User.get_cached_by_id(id),
|
||||||
{:ok, follower} <- User.follow(user, followee),
|
{:ok, follower} <- User.follow(user, followee),
|
||||||
{:ok, _activity} <- ActivityPub.follow(follower, followee) do
|
{:ok, _activity} <- ActivityPub.follow(follower, followee) do
|
||||||
conn
|
conn
|
||||||
|
@ -374,4 +374,22 @@ def disable_account(%{assigns: %{user: user}} = conn, params) do
|
||||||
def captcha(conn, _params) do
|
def captcha(conn, _params) do
|
||||||
json(conn, Pleroma.Captcha.new())
|
json(conn, Pleroma.Captcha.new())
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def healthcheck(conn, _params) do
|
||||||
|
info =
|
||||||
|
if Pleroma.Config.get([:instance, :healthcheck]) do
|
||||||
|
Pleroma.Healthcheck.system_info()
|
||||||
|
else
|
||||||
|
%{}
|
||||||
|
end
|
||||||
|
|
||||||
|
conn =
|
||||||
|
if info[:healthy] do
|
||||||
|
conn
|
||||||
|
else
|
||||||
|
Plug.Conn.put_status(conn, :service_unavailable)
|
||||||
|
end
|
||||||
|
|
||||||
|
json(conn, info)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -243,7 +243,7 @@ def get_user(user \\ nil, params) do
|
||||||
end
|
end
|
||||||
|
|
||||||
%{"screen_name" => nickname} ->
|
%{"screen_name" => nickname} ->
|
||||||
case User.get_by_nickname(nickname) do
|
case User.get_cached_by_nickname(nickname) do
|
||||||
nil -> {:error, "No user with such screen_name"}
|
nil -> {:error, "No user with such screen_name"}
|
||||||
target -> {:ok, target}
|
target -> {:ok, target}
|
||||||
end
|
end
|
||||||
|
|
|
@ -434,7 +434,7 @@ def password_reset(conn, params) do
|
||||||
end
|
end
|
||||||
|
|
||||||
def confirm_email(conn, %{"user_id" => uid, "token" => token}) do
|
def confirm_email(conn, %{"user_id" => uid, "token" => token}) do
|
||||||
with %User{} = user <- User.get_by_id(uid),
|
with %User{} = user <- User.get_cached_by_id(uid),
|
||||||
true <- user.local,
|
true <- user.local,
|
||||||
true <- user.info.confirmation_pending,
|
true <- user.info.confirmation_pending,
|
||||||
true <- user.info.confirmation_token == token,
|
true <- user.info.confirmation_token == token,
|
||||||
|
@ -587,7 +587,7 @@ def friend_requests(conn, params) do
|
||||||
|
|
||||||
def approve_friend_request(conn, %{"user_id" => uid} = _params) do
|
def approve_friend_request(conn, %{"user_id" => uid} = _params) do
|
||||||
with followed <- conn.assigns[:user],
|
with followed <- conn.assigns[:user],
|
||||||
%User{} = follower <- User.get_by_id(uid),
|
%User{} = follower <- User.get_cached_by_id(uid),
|
||||||
{:ok, follower} <- CommonAPI.accept_follow_request(follower, followed) do
|
{:ok, follower} <- CommonAPI.accept_follow_request(follower, followed) do
|
||||||
conn
|
conn
|
||||||
|> put_view(UserView)
|
|> put_view(UserView)
|
||||||
|
@ -599,7 +599,7 @@ def approve_friend_request(conn, %{"user_id" => uid} = _params) do
|
||||||
|
|
||||||
def deny_friend_request(conn, %{"user_id" => uid} = _params) do
|
def deny_friend_request(conn, %{"user_id" => uid} = _params) do
|
||||||
with followed <- conn.assigns[:user],
|
with followed <- conn.assigns[:user],
|
||||||
%User{} = follower <- User.get_by_id(uid),
|
%User{} = follower <- User.get_cached_by_id(uid),
|
||||||
{:ok, follower} <- CommonAPI.reject_follow_request(follower, followed) do
|
{:ok, follower} <- CommonAPI.reject_follow_request(follower, followed) do
|
||||||
conn
|
conn
|
||||||
|> put_view(UserView)
|
|> put_view(UserView)
|
||||||
|
@ -632,7 +632,7 @@ def raw_empty_array(conn, _params) do
|
||||||
|
|
||||||
defp build_info_cng(user, params) do
|
defp build_info_cng(user, params) do
|
||||||
info_params =
|
info_params =
|
||||||
["no_rich_text", "locked", "hide_followers", "hide_follows", "show_role"]
|
["no_rich_text", "locked", "hide_followers", "hide_follows", "hide_favorites", "show_role"]
|
||||||
|> Enum.reduce(%{}, fn key, res ->
|
|> Enum.reduce(%{}, fn key, res ->
|
||||||
if value = params[key] do
|
if value = params[key] do
|
||||||
Map.put(res, key, value == "true")
|
Map.put(res, key, value == "true")
|
||||||
|
|
|
@ -37,7 +37,7 @@ def webfinger(resource, fmt) when fmt in ["XML", "JSON"] do
|
||||||
regex = ~r/(acct:)?(?<username>\w+)@#{host}/
|
regex = ~r/(acct:)?(?<username>\w+)@#{host}/
|
||||||
|
|
||||||
with %{"username" => username} <- Regex.named_captures(regex, resource),
|
with %{"username" => username} <- Regex.named_captures(regex, resource),
|
||||||
%User{} = user <- User.get_by_nickname(username) do
|
%User{} = user <- User.get_cached_by_nickname(username) do
|
||||||
{:ok, represent_user(user, fmt)}
|
{:ok, represent_user(user, fmt)}
|
||||||
else
|
else
|
||||||
_e ->
|
_e ->
|
||||||
|
|
|
@ -0,0 +1,22 @@
|
||||||
|
defmodule Pleroma.HealthcheckTest do
|
||||||
|
use Pleroma.DataCase
|
||||||
|
alias Pleroma.Healthcheck
|
||||||
|
|
||||||
|
test "system_info/0" do
|
||||||
|
result = Healthcheck.system_info() |> Map.from_struct()
|
||||||
|
|
||||||
|
assert Map.keys(result) == [:active, :healthy, :idle, :memory_used, :pool_size]
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "check_health/1" do
|
||||||
|
test "pool size equals active connections" do
|
||||||
|
result = Healthcheck.check_health(%Healthcheck{pool_size: 10, active: 10})
|
||||||
|
refute result.healthy
|
||||||
|
end
|
||||||
|
|
||||||
|
test "chech_health/1" do
|
||||||
|
result = Healthcheck.check_health(%Healthcheck{pool_size: 10, active: 9})
|
||||||
|
assert result.healthy
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -46,7 +46,7 @@ test "it creates a notification for subscribed users" do
|
||||||
describe "create_notification" do
|
describe "create_notification" do
|
||||||
test "it doesn't create a notification for user if the user blocks the activity author" do
|
test "it doesn't create a notification for user if the user blocks the activity author" do
|
||||||
activity = insert(:note_activity)
|
activity = insert(:note_activity)
|
||||||
author = User.get_by_ap_id(activity.data["actor"])
|
author = User.get_cached_by_ap_id(activity.data["actor"])
|
||||||
user = insert(:user)
|
user = insert(:user)
|
||||||
{:ok, user} = User.block(user, author)
|
{:ok, user} = User.block(user, author)
|
||||||
|
|
||||||
|
@ -124,7 +124,7 @@ test "it disables notifications from people the user follows" do
|
||||||
|
|
||||||
test "it doesn't create a notification for user if he is the activity author" do
|
test "it doesn't create a notification for user if he is the activity author" do
|
||||||
activity = insert(:note_activity)
|
activity = insert(:note_activity)
|
||||||
author = User.get_by_ap_id(activity.data["actor"])
|
author = User.get_cached_by_ap_id(activity.data["actor"])
|
||||||
|
|
||||||
assert nil == Notification.create_notification(activity, author)
|
assert nil == Notification.create_notification(activity, author)
|
||||||
end
|
end
|
||||||
|
|
|
@ -31,7 +31,7 @@ test "relay is followed" do
|
||||||
local_user = Relay.get_actor()
|
local_user = Relay.get_actor()
|
||||||
assert local_user.ap_id =~ "/relay"
|
assert local_user.ap_id =~ "/relay"
|
||||||
|
|
||||||
target_user = User.get_by_ap_id(target_instance)
|
target_user = User.get_cached_by_ap_id(target_instance)
|
||||||
refute target_user.local
|
refute target_user.local
|
||||||
|
|
||||||
activity = Utils.fetch_latest_follow(local_user, target_user)
|
activity = Utils.fetch_latest_follow(local_user, target_user)
|
||||||
|
@ -48,7 +48,7 @@ test "relay is unfollowed" do
|
||||||
Mix.Tasks.Pleroma.Relay.run(["follow", target_instance])
|
Mix.Tasks.Pleroma.Relay.run(["follow", target_instance])
|
||||||
|
|
||||||
%User{ap_id: follower_id} = local_user = Relay.get_actor()
|
%User{ap_id: follower_id} = local_user = Relay.get_actor()
|
||||||
target_user = User.get_by_ap_id(target_instance)
|
target_user = User.get_cached_by_ap_id(target_instance)
|
||||||
follow_activity = Utils.fetch_latest_follow(local_user, target_user)
|
follow_activity = Utils.fetch_latest_follow(local_user, target_user)
|
||||||
|
|
||||||
Mix.Tasks.Pleroma.Relay.run(["unfollow", target_instance])
|
Mix.Tasks.Pleroma.Relay.run(["unfollow", target_instance])
|
||||||
|
|
|
@ -50,7 +50,7 @@ test "user is created" do
|
||||||
assert_received {:mix_shell, :info, [message]}
|
assert_received {:mix_shell, :info, [message]}
|
||||||
assert message =~ "created"
|
assert message =~ "created"
|
||||||
|
|
||||||
user = User.get_by_nickname(unsaved.nickname)
|
user = User.get_cached_by_nickname(unsaved.nickname)
|
||||||
assert user.name == unsaved.name
|
assert user.name == unsaved.name
|
||||||
assert user.email == unsaved.email
|
assert user.email == unsaved.email
|
||||||
assert user.bio == unsaved.bio
|
assert user.bio == unsaved.bio
|
||||||
|
@ -75,7 +75,7 @@ test "user is not created" do
|
||||||
assert_received {:mix_shell, :info, [message]}
|
assert_received {:mix_shell, :info, [message]}
|
||||||
assert message =~ "will not be created"
|
assert message =~ "will not be created"
|
||||||
|
|
||||||
refute User.get_by_nickname(unsaved.nickname)
|
refute User.get_cached_by_nickname(unsaved.nickname)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -88,7 +88,7 @@ test "user is deleted" do
|
||||||
assert_received {:mix_shell, :info, [message]}
|
assert_received {:mix_shell, :info, [message]}
|
||||||
assert message =~ " deleted"
|
assert message =~ " deleted"
|
||||||
|
|
||||||
user = User.get_by_nickname(user.nickname)
|
user = User.get_cached_by_nickname(user.nickname)
|
||||||
assert user.info.deactivated
|
assert user.info.deactivated
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -109,7 +109,7 @@ test "user is deactivated" do
|
||||||
assert_received {:mix_shell, :info, [message]}
|
assert_received {:mix_shell, :info, [message]}
|
||||||
assert message =~ " deactivated"
|
assert message =~ " deactivated"
|
||||||
|
|
||||||
user = User.get_by_nickname(user.nickname)
|
user = User.get_cached_by_nickname(user.nickname)
|
||||||
assert user.info.deactivated
|
assert user.info.deactivated
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -121,7 +121,7 @@ test "user is activated" do
|
||||||
assert_received {:mix_shell, :info, [message]}
|
assert_received {:mix_shell, :info, [message]}
|
||||||
assert message =~ " activated"
|
assert message =~ " activated"
|
||||||
|
|
||||||
user = User.get_by_nickname(user.nickname)
|
user = User.get_cached_by_nickname(user.nickname)
|
||||||
refute user.info.deactivated
|
refute user.info.deactivated
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -150,7 +150,7 @@ test "user is unsubscribed" do
|
||||||
assert_received {:mix_shell, :info, [message]}
|
assert_received {:mix_shell, :info, [message]}
|
||||||
assert message =~ "Successfully unsubscribed"
|
assert message =~ "Successfully unsubscribed"
|
||||||
|
|
||||||
user = User.get_by_nickname(user.nickname)
|
user = User.get_cached_by_nickname(user.nickname)
|
||||||
assert Enum.empty?(user.following)
|
assert Enum.empty?(user.following)
|
||||||
assert user.info.deactivated
|
assert user.info.deactivated
|
||||||
end
|
end
|
||||||
|
@ -178,7 +178,7 @@ test "All statuses set" do
|
||||||
assert_received {:mix_shell, :info, [message]}
|
assert_received {:mix_shell, :info, [message]}
|
||||||
assert message =~ ~r/Admin status .* true/
|
assert message =~ ~r/Admin status .* true/
|
||||||
|
|
||||||
user = User.get_by_nickname(user.nickname)
|
user = User.get_cached_by_nickname(user.nickname)
|
||||||
assert user.info.is_moderator
|
assert user.info.is_moderator
|
||||||
assert user.info.locked
|
assert user.info.locked
|
||||||
assert user.info.is_admin
|
assert user.info.is_admin
|
||||||
|
@ -204,7 +204,7 @@ test "All statuses unset" do
|
||||||
assert_received {:mix_shell, :info, [message]}
|
assert_received {:mix_shell, :info, [message]}
|
||||||
assert message =~ ~r/Admin status .* false/
|
assert message =~ ~r/Admin status .* false/
|
||||||
|
|
||||||
user = User.get_by_nickname(user.nickname)
|
user = User.get_cached_by_nickname(user.nickname)
|
||||||
refute user.info.is_moderator
|
refute user.info.is_moderator
|
||||||
refute user.info.locked
|
refute user.info.locked
|
||||||
refute user.info.is_admin
|
refute user.info.is_admin
|
||||||
|
|
|
@ -124,9 +124,9 @@ test "follow takes a user and another user" do
|
||||||
|
|
||||||
{:ok, user} = User.follow(user, followed)
|
{:ok, user} = User.follow(user, followed)
|
||||||
|
|
||||||
user = User.get_by_id(user.id)
|
user = User.get_cached_by_id(user.id)
|
||||||
|
|
||||||
followed = User.get_by_ap_id(followed.ap_id)
|
followed = User.get_cached_by_ap_id(followed.ap_id)
|
||||||
assert followed.info.follower_count == 1
|
assert followed.info.follower_count == 1
|
||||||
|
|
||||||
assert User.ap_followers(followed) in user.following
|
assert User.ap_followers(followed) in user.following
|
||||||
|
@ -189,7 +189,7 @@ test "unfollow takes a user and another user" do
|
||||||
|
|
||||||
{:ok, user, _activity} = User.unfollow(user, followed)
|
{:ok, user, _activity} = User.unfollow(user, followed)
|
||||||
|
|
||||||
user = User.get_by_id(user.id)
|
user = User.get_cached_by_id(user.id)
|
||||||
|
|
||||||
assert user.following == []
|
assert user.following == []
|
||||||
end
|
end
|
||||||
|
@ -199,7 +199,7 @@ test "unfollow doesn't unfollow yourself" do
|
||||||
|
|
||||||
{:error, _} = User.unfollow(user, user)
|
{:error, _} = User.unfollow(user, user)
|
||||||
|
|
||||||
user = User.get_by_id(user.id)
|
user = User.get_cached_by_id(user.id)
|
||||||
assert user.following == [user.ap_id]
|
assert user.following == [user.ap_id]
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -557,8 +557,8 @@ test "gets all friends (followed users) for a given user" do
|
||||||
|
|
||||||
{:ok, res} = User.get_friends(user)
|
{:ok, res} = User.get_friends(user)
|
||||||
|
|
||||||
followed_one = User.get_by_ap_id(followed_one.ap_id)
|
followed_one = User.get_cached_by_ap_id(followed_one.ap_id)
|
||||||
followed_two = User.get_by_ap_id(followed_two.ap_id)
|
followed_two = User.get_cached_by_ap_id(followed_two.ap_id)
|
||||||
assert Enum.member?(res, followed_one)
|
assert Enum.member?(res, followed_one)
|
||||||
assert Enum.member?(res, followed_two)
|
assert Enum.member?(res, followed_two)
|
||||||
refute Enum.member?(res, not_followed)
|
refute Enum.member?(res, not_followed)
|
||||||
|
@ -569,7 +569,7 @@ test "gets all friends (followed users) for a given user" do
|
||||||
test "it sets the info->note_count property" do
|
test "it sets the info->note_count property" do
|
||||||
note = insert(:note)
|
note = insert(:note)
|
||||||
|
|
||||||
user = User.get_by_ap_id(note.data["actor"])
|
user = User.get_cached_by_ap_id(note.data["actor"])
|
||||||
|
|
||||||
assert user.info.note_count == 0
|
assert user.info.note_count == 0
|
||||||
|
|
||||||
|
@ -580,7 +580,7 @@ test "it sets the info->note_count property" do
|
||||||
|
|
||||||
test "it increases the info->note_count property" do
|
test "it increases the info->note_count property" do
|
||||||
note = insert(:note)
|
note = insert(:note)
|
||||||
user = User.get_by_ap_id(note.data["actor"])
|
user = User.get_cached_by_ap_id(note.data["actor"])
|
||||||
|
|
||||||
assert user.info.note_count == 0
|
assert user.info.note_count == 0
|
||||||
|
|
||||||
|
@ -595,7 +595,7 @@ test "it increases the info->note_count property" do
|
||||||
|
|
||||||
test "it decreases the info->note_count property" do
|
test "it decreases the info->note_count property" do
|
||||||
note = insert(:note)
|
note = insert(:note)
|
||||||
user = User.get_by_ap_id(note.data["actor"])
|
user = User.get_cached_by_ap_id(note.data["actor"])
|
||||||
|
|
||||||
assert user.info.note_count == 0
|
assert user.info.note_count == 0
|
||||||
|
|
||||||
|
@ -697,7 +697,7 @@ test "blocks tear down cyclical follow relationships" do
|
||||||
assert User.following?(blocked, blocker)
|
assert User.following?(blocked, blocker)
|
||||||
|
|
||||||
{:ok, blocker} = User.block(blocker, blocked)
|
{:ok, blocker} = User.block(blocker, blocked)
|
||||||
blocked = User.get_by_id(blocked.id)
|
blocked = User.get_cached_by_id(blocked.id)
|
||||||
|
|
||||||
assert User.blocks?(blocker, blocked)
|
assert User.blocks?(blocker, blocked)
|
||||||
|
|
||||||
|
@ -715,7 +715,7 @@ test "blocks tear down blocker->blocked follow relationships" do
|
||||||
refute User.following?(blocked, blocker)
|
refute User.following?(blocked, blocker)
|
||||||
|
|
||||||
{:ok, blocker} = User.block(blocker, blocked)
|
{:ok, blocker} = User.block(blocker, blocked)
|
||||||
blocked = User.get_by_id(blocked.id)
|
blocked = User.get_cached_by_id(blocked.id)
|
||||||
|
|
||||||
assert User.blocks?(blocker, blocked)
|
assert User.blocks?(blocker, blocked)
|
||||||
|
|
||||||
|
@ -733,7 +733,7 @@ test "blocks tear down blocked->blocker follow relationships" do
|
||||||
assert User.following?(blocked, blocker)
|
assert User.following?(blocked, blocker)
|
||||||
|
|
||||||
{:ok, blocker} = User.block(blocker, blocked)
|
{:ok, blocker} = User.block(blocker, blocked)
|
||||||
blocked = User.get_by_id(blocked.id)
|
blocked = User.get_cached_by_id(blocked.id)
|
||||||
|
|
||||||
assert User.blocks?(blocker, blocked)
|
assert User.blocks?(blocker, blocked)
|
||||||
|
|
||||||
|
@ -911,9 +911,9 @@ test ".delete deactivates a user, all follow relationships and all create activi
|
||||||
|
|
||||||
{:ok, _} = User.delete(user)
|
{:ok, _} = User.delete(user)
|
||||||
|
|
||||||
followed = User.get_by_id(followed.id)
|
followed = User.get_cached_by_id(followed.id)
|
||||||
follower = User.get_by_id(follower.id)
|
follower = User.get_cached_by_id(follower.id)
|
||||||
user = User.get_by_id(user.id)
|
user = User.get_cached_by_id(user.id)
|
||||||
|
|
||||||
assert user.info.deactivated
|
assert user.info.deactivated
|
||||||
|
|
||||||
|
@ -1067,7 +1067,7 @@ test "works with URIs" do
|
||||||
results = User.search("http://mastodon.example.org/users/admin", resolve: true)
|
results = User.search("http://mastodon.example.org/users/admin", resolve: true)
|
||||||
result = results |> List.first()
|
result = results |> List.first()
|
||||||
|
|
||||||
user = User.get_by_ap_id("http://mastodon.example.org/users/admin")
|
user = User.get_cached_by_ap_id("http://mastodon.example.org/users/admin")
|
||||||
|
|
||||||
assert length(results) == 1
|
assert length(results) == 1
|
||||||
assert user == result |> Map.put(:search_rank, nil) |> Map.put(:search_type, nil)
|
assert user == result |> Map.put(:search_rank, nil) |> Map.put(:search_type, nil)
|
||||||
|
|
|
@ -50,7 +50,7 @@ test "it returns a json representation of the user with accept application/json"
|
||||||
|> put_req_header("accept", "application/json")
|
|> put_req_header("accept", "application/json")
|
||||||
|> get("/users/#{user.nickname}")
|
|> get("/users/#{user.nickname}")
|
||||||
|
|
||||||
user = User.get_by_id(user.id)
|
user = User.get_cached_by_id(user.id)
|
||||||
|
|
||||||
assert json_response(conn, 200) == UserView.render("user.json", %{user: user})
|
assert json_response(conn, 200) == UserView.render("user.json", %{user: user})
|
||||||
end
|
end
|
||||||
|
@ -65,7 +65,7 @@ test "it returns a json representation of the user with accept application/activ
|
||||||
|> put_req_header("accept", "application/activity+json")
|
|> put_req_header("accept", "application/activity+json")
|
||||||
|> get("/users/#{user.nickname}")
|
|> get("/users/#{user.nickname}")
|
||||||
|
|
||||||
user = User.get_by_id(user.id)
|
user = User.get_cached_by_id(user.id)
|
||||||
|
|
||||||
assert json_response(conn, 200) == UserView.render("user.json", %{user: user})
|
assert json_response(conn, 200) == UserView.render("user.json", %{user: user})
|
||||||
end
|
end
|
||||||
|
@ -83,7 +83,7 @@ test "it returns a json representation of the user with accept application/ld+js
|
||||||
)
|
)
|
||||||
|> get("/users/#{user.nickname}")
|
|> get("/users/#{user.nickname}")
|
||||||
|
|
||||||
user = User.get_by_id(user.id)
|
user = User.get_cached_by_id(user.id)
|
||||||
|
|
||||||
assert json_response(conn, 200) == UserView.render("user.json", %{user: user})
|
assert json_response(conn, 200) == UserView.render("user.json", %{user: user})
|
||||||
end
|
end
|
||||||
|
@ -572,7 +572,7 @@ test "it works for more than 10 users", %{conn: conn} do
|
||||||
user = insert(:user)
|
user = insert(:user)
|
||||||
|
|
||||||
Enum.each(1..15, fn _ ->
|
Enum.each(1..15, fn _ ->
|
||||||
user = User.get_by_id(user.id)
|
user = User.get_cached_by_id(user.id)
|
||||||
other_user = insert(:user)
|
other_user = insert(:user)
|
||||||
User.follow(user, other_user)
|
User.follow(user, other_user)
|
||||||
end)
|
end)
|
||||||
|
|
|
@ -228,18 +228,30 @@ test "increases user note count only for public activities" do
|
||||||
user = insert(:user)
|
user = insert(:user)
|
||||||
|
|
||||||
{:ok, _} =
|
{:ok, _} =
|
||||||
CommonAPI.post(User.get_by_id(user.id), %{"status" => "1", "visibility" => "public"})
|
CommonAPI.post(User.get_cached_by_id(user.id), %{
|
||||||
|
"status" => "1",
|
||||||
|
"visibility" => "public"
|
||||||
|
})
|
||||||
|
|
||||||
{:ok, _} =
|
{:ok, _} =
|
||||||
CommonAPI.post(User.get_by_id(user.id), %{"status" => "2", "visibility" => "unlisted"})
|
CommonAPI.post(User.get_cached_by_id(user.id), %{
|
||||||
|
"status" => "2",
|
||||||
|
"visibility" => "unlisted"
|
||||||
|
})
|
||||||
|
|
||||||
{:ok, _} =
|
{:ok, _} =
|
||||||
CommonAPI.post(User.get_by_id(user.id), %{"status" => "2", "visibility" => "private"})
|
CommonAPI.post(User.get_cached_by_id(user.id), %{
|
||||||
|
"status" => "2",
|
||||||
|
"visibility" => "private"
|
||||||
|
})
|
||||||
|
|
||||||
{:ok, _} =
|
{:ok, _} =
|
||||||
CommonAPI.post(User.get_by_id(user.id), %{"status" => "3", "visibility" => "direct"})
|
CommonAPI.post(User.get_cached_by_id(user.id), %{
|
||||||
|
"status" => "3",
|
||||||
|
"visibility" => "direct"
|
||||||
|
})
|
||||||
|
|
||||||
user = User.get_by_id(user.id)
|
user = User.get_cached_by_id(user.id)
|
||||||
assert user.info.note_count == 2
|
assert user.info.note_count == 2
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -772,23 +784,35 @@ test "decrements user note count only for public activities" do
|
||||||
user = insert(:user, info: %{note_count: 10})
|
user = insert(:user, info: %{note_count: 10})
|
||||||
|
|
||||||
{:ok, a1} =
|
{:ok, a1} =
|
||||||
CommonAPI.post(User.get_by_id(user.id), %{"status" => "yeah", "visibility" => "public"})
|
CommonAPI.post(User.get_cached_by_id(user.id), %{
|
||||||
|
"status" => "yeah",
|
||||||
|
"visibility" => "public"
|
||||||
|
})
|
||||||
|
|
||||||
{:ok, a2} =
|
{:ok, a2} =
|
||||||
CommonAPI.post(User.get_by_id(user.id), %{"status" => "yeah", "visibility" => "unlisted"})
|
CommonAPI.post(User.get_cached_by_id(user.id), %{
|
||||||
|
"status" => "yeah",
|
||||||
|
"visibility" => "unlisted"
|
||||||
|
})
|
||||||
|
|
||||||
{:ok, a3} =
|
{:ok, a3} =
|
||||||
CommonAPI.post(User.get_by_id(user.id), %{"status" => "yeah", "visibility" => "private"})
|
CommonAPI.post(User.get_cached_by_id(user.id), %{
|
||||||
|
"status" => "yeah",
|
||||||
|
"visibility" => "private"
|
||||||
|
})
|
||||||
|
|
||||||
{:ok, a4} =
|
{:ok, a4} =
|
||||||
CommonAPI.post(User.get_by_id(user.id), %{"status" => "yeah", "visibility" => "direct"})
|
CommonAPI.post(User.get_cached_by_id(user.id), %{
|
||||||
|
"status" => "yeah",
|
||||||
|
"visibility" => "direct"
|
||||||
|
})
|
||||||
|
|
||||||
{:ok, _} = Object.normalize(a1) |> ActivityPub.delete()
|
{:ok, _} = Object.normalize(a1) |> ActivityPub.delete()
|
||||||
{:ok, _} = Object.normalize(a2) |> ActivityPub.delete()
|
{:ok, _} = Object.normalize(a2) |> ActivityPub.delete()
|
||||||
{:ok, _} = Object.normalize(a3) |> ActivityPub.delete()
|
{:ok, _} = Object.normalize(a3) |> ActivityPub.delete()
|
||||||
{:ok, _} = Object.normalize(a4) |> ActivityPub.delete()
|
{:ok, _} = Object.normalize(a4) |> ActivityPub.delete()
|
||||||
|
|
||||||
user = User.get_by_id(user.id)
|
user = User.get_cached_by_id(user.id)
|
||||||
assert user.info.note_count == 10
|
assert user.info.note_count == 10
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -99,7 +99,7 @@ test "it works for incoming notices" do
|
||||||
|
|
||||||
assert object["sensitive"] == true
|
assert object["sensitive"] == true
|
||||||
|
|
||||||
user = User.get_by_ap_id(object["actor"])
|
user = User.get_cached_by_ap_id(object["actor"])
|
||||||
|
|
||||||
assert user.info.note_count == 1
|
assert user.info.note_count == 1
|
||||||
end
|
end
|
||||||
|
@ -212,7 +212,7 @@ test "it works for incoming follow requests" do
|
||||||
assert data["actor"] == "http://mastodon.example.org/users/admin"
|
assert data["actor"] == "http://mastodon.example.org/users/admin"
|
||||||
assert data["type"] == "Follow"
|
assert data["type"] == "Follow"
|
||||||
assert data["id"] == "http://mastodon.example.org/users/admin#follows/2"
|
assert data["id"] == "http://mastodon.example.org/users/admin#follows/2"
|
||||||
assert User.following?(User.get_by_ap_id(data["actor"]), user)
|
assert User.following?(User.get_cached_by_ap_id(data["actor"]), user)
|
||||||
end
|
end
|
||||||
|
|
||||||
test "it works for incoming follow requests from hubzilla" do
|
test "it works for incoming follow requests from hubzilla" do
|
||||||
|
@ -229,7 +229,7 @@ test "it works for incoming follow requests from hubzilla" do
|
||||||
assert data["actor"] == "https://hubzilla.example.org/channel/kaniini"
|
assert data["actor"] == "https://hubzilla.example.org/channel/kaniini"
|
||||||
assert data["type"] == "Follow"
|
assert data["type"] == "Follow"
|
||||||
assert data["id"] == "https://hubzilla.example.org/channel/kaniini#follows/2"
|
assert data["id"] == "https://hubzilla.example.org/channel/kaniini#follows/2"
|
||||||
assert User.following?(User.get_by_ap_id(data["actor"]), user)
|
assert User.following?(User.get_cached_by_ap_id(data["actor"]), user)
|
||||||
end
|
end
|
||||||
|
|
||||||
test "it works for incoming likes" do
|
test "it works for incoming likes" do
|
||||||
|
@ -540,7 +540,7 @@ test "it works for incomming unfollows with an existing follow" do
|
||||||
assert data["object"]["object"] == user.ap_id
|
assert data["object"]["object"] == user.ap_id
|
||||||
assert data["actor"] == "http://mastodon.example.org/users/admin"
|
assert data["actor"] == "http://mastodon.example.org/users/admin"
|
||||||
|
|
||||||
refute User.following?(User.get_by_ap_id(data["actor"]), user)
|
refute User.following?(User.get_cached_by_ap_id(data["actor"]), user)
|
||||||
end
|
end
|
||||||
|
|
||||||
test "it works for incoming blocks" do
|
test "it works for incoming blocks" do
|
||||||
|
@ -557,7 +557,7 @@ test "it works for incoming blocks" do
|
||||||
assert data["object"] == user.ap_id
|
assert data["object"] == user.ap_id
|
||||||
assert data["actor"] == "http://mastodon.example.org/users/admin"
|
assert data["actor"] == "http://mastodon.example.org/users/admin"
|
||||||
|
|
||||||
blocker = User.get_by_ap_id(data["actor"])
|
blocker = User.get_cached_by_ap_id(data["actor"])
|
||||||
|
|
||||||
assert User.blocks?(blocker, user)
|
assert User.blocks?(blocker, user)
|
||||||
end
|
end
|
||||||
|
@ -584,8 +584,8 @@ test "incoming blocks successfully tear down any follow relationship" do
|
||||||
assert data["object"] == blocked.ap_id
|
assert data["object"] == blocked.ap_id
|
||||||
assert data["actor"] == blocker.ap_id
|
assert data["actor"] == blocker.ap_id
|
||||||
|
|
||||||
blocker = User.get_by_ap_id(data["actor"])
|
blocker = User.get_cached_by_ap_id(data["actor"])
|
||||||
blocked = User.get_by_ap_id(data["object"])
|
blocked = User.get_cached_by_ap_id(data["object"])
|
||||||
|
|
||||||
assert User.blocks?(blocker, blocked)
|
assert User.blocks?(blocker, blocked)
|
||||||
|
|
||||||
|
@ -614,7 +614,7 @@ test "it works for incoming unblocks with an existing block" do
|
||||||
assert data["object"]["object"] == user.ap_id
|
assert data["object"]["object"] == user.ap_id
|
||||||
assert data["actor"] == "http://mastodon.example.org/users/admin"
|
assert data["actor"] == "http://mastodon.example.org/users/admin"
|
||||||
|
|
||||||
blocker = User.get_by_ap_id(data["actor"])
|
blocker = User.get_cached_by_ap_id(data["actor"])
|
||||||
|
|
||||||
refute User.blocks?(blocker, user)
|
refute User.blocks?(blocker, user)
|
||||||
end
|
end
|
||||||
|
@ -645,7 +645,7 @@ test "it works for incoming accepts which were pre-accepted" do
|
||||||
|
|
||||||
assert activity.data["object"] == follow_activity.data["id"]
|
assert activity.data["object"] == follow_activity.data["id"]
|
||||||
|
|
||||||
follower = User.get_by_id(follower.id)
|
follower = User.get_cached_by_id(follower.id)
|
||||||
|
|
||||||
assert User.following?(follower, followed) == true
|
assert User.following?(follower, followed) == true
|
||||||
end
|
end
|
||||||
|
@ -667,7 +667,7 @@ test "it works for incoming accepts which were orphaned" do
|
||||||
{:ok, activity} = Transmogrifier.handle_incoming(accept_data)
|
{:ok, activity} = Transmogrifier.handle_incoming(accept_data)
|
||||||
assert activity.data["object"] == follow_activity.data["id"]
|
assert activity.data["object"] == follow_activity.data["id"]
|
||||||
|
|
||||||
follower = User.get_by_id(follower.id)
|
follower = User.get_cached_by_id(follower.id)
|
||||||
|
|
||||||
assert User.following?(follower, followed) == true
|
assert User.following?(follower, followed) == true
|
||||||
end
|
end
|
||||||
|
@ -687,7 +687,7 @@ test "it works for incoming accepts which are referenced by IRI only" do
|
||||||
{:ok, activity} = Transmogrifier.handle_incoming(accept_data)
|
{:ok, activity} = Transmogrifier.handle_incoming(accept_data)
|
||||||
assert activity.data["object"] == follow_activity.data["id"]
|
assert activity.data["object"] == follow_activity.data["id"]
|
||||||
|
|
||||||
follower = User.get_by_id(follower.id)
|
follower = User.get_cached_by_id(follower.id)
|
||||||
|
|
||||||
assert User.following?(follower, followed) == true
|
assert User.following?(follower, followed) == true
|
||||||
end
|
end
|
||||||
|
@ -706,7 +706,7 @@ test "it fails for incoming accepts which cannot be correlated" do
|
||||||
|
|
||||||
:error = Transmogrifier.handle_incoming(accept_data)
|
:error = Transmogrifier.handle_incoming(accept_data)
|
||||||
|
|
||||||
follower = User.get_by_id(follower.id)
|
follower = User.get_cached_by_id(follower.id)
|
||||||
|
|
||||||
refute User.following?(follower, followed) == true
|
refute User.following?(follower, followed) == true
|
||||||
end
|
end
|
||||||
|
@ -725,7 +725,7 @@ test "it fails for incoming rejects which cannot be correlated" do
|
||||||
|
|
||||||
:error = Transmogrifier.handle_incoming(accept_data)
|
:error = Transmogrifier.handle_incoming(accept_data)
|
||||||
|
|
||||||
follower = User.get_by_id(follower.id)
|
follower = User.get_cached_by_id(follower.id)
|
||||||
|
|
||||||
refute User.following?(follower, followed) == true
|
refute User.following?(follower, followed) == true
|
||||||
end
|
end
|
||||||
|
@ -750,7 +750,7 @@ test "it works for incoming rejects which are orphaned" do
|
||||||
{:ok, activity} = Transmogrifier.handle_incoming(reject_data)
|
{:ok, activity} = Transmogrifier.handle_incoming(reject_data)
|
||||||
refute activity.local
|
refute activity.local
|
||||||
|
|
||||||
follower = User.get_by_id(follower.id)
|
follower = User.get_cached_by_id(follower.id)
|
||||||
|
|
||||||
assert User.following?(follower, followed) == false
|
assert User.following?(follower, followed) == false
|
||||||
end
|
end
|
||||||
|
@ -772,7 +772,7 @@ test "it works for incoming rejects which are referenced by IRI only" do
|
||||||
|
|
||||||
{:ok, %Activity{data: _}} = Transmogrifier.handle_incoming(reject_data)
|
{:ok, %Activity{data: _}} = Transmogrifier.handle_incoming(reject_data)
|
||||||
|
|
||||||
follower = User.get_by_id(follower.id)
|
follower = User.get_cached_by_id(follower.id)
|
||||||
|
|
||||||
assert User.following?(follower, followed) == false
|
assert User.following?(follower, followed) == false
|
||||||
end
|
end
|
||||||
|
@ -1026,7 +1026,7 @@ test "it upgrades a user to activitypub" do
|
||||||
{:ok, unrelated_activity} = CommonAPI.post(user_two, %{"status" => "test"})
|
{:ok, unrelated_activity} = CommonAPI.post(user_two, %{"status" => "test"})
|
||||||
assert "http://localhost:4001/users/rye@niu.moe/followers" in activity.recipients
|
assert "http://localhost:4001/users/rye@niu.moe/followers" in activity.recipients
|
||||||
|
|
||||||
user = User.get_by_id(user.id)
|
user = User.get_cached_by_id(user.id)
|
||||||
assert user.info.note_count == 1
|
assert user.info.note_count == 1
|
||||||
|
|
||||||
{:ok, user} = Transmogrifier.upgrade_user_from_ap_id("https://niu.moe/users/rye")
|
{:ok, user} = Transmogrifier.upgrade_user_from_ap_id("https://niu.moe/users/rye")
|
||||||
|
@ -1034,7 +1034,7 @@ test "it upgrades a user to activitypub" do
|
||||||
assert user.info.note_count == 1
|
assert user.info.note_count == 1
|
||||||
assert user.follower_address == "https://niu.moe/users/rye/followers"
|
assert user.follower_address == "https://niu.moe/users/rye/followers"
|
||||||
|
|
||||||
user = User.get_by_id(user.id)
|
user = User.get_cached_by_id(user.id)
|
||||||
assert user.info.note_count == 1
|
assert user.info.note_count == 1
|
||||||
|
|
||||||
activity = Activity.get_by_id(activity.id)
|
activity = Activity.get_by_id(activity.id)
|
||||||
|
@ -1063,7 +1063,7 @@ test "it upgrades a user to activitypub" do
|
||||||
unrelated_activity = Activity.get_by_id(unrelated_activity.id)
|
unrelated_activity = Activity.get_by_id(unrelated_activity.id)
|
||||||
refute user.follower_address in unrelated_activity.recipients
|
refute user.follower_address in unrelated_activity.recipients
|
||||||
|
|
||||||
user_two = User.get_by_id(user_two.id)
|
user_two = User.get_cached_by_id(user_two.id)
|
||||||
assert user.follower_address in user_two.following
|
assert user.follower_address in user_two.following
|
||||||
refute "..." in user_two.following
|
refute "..." in user_two.following
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
defmodule Pleroma.Web.ActivityPub.UtilsTest do
|
defmodule Pleroma.Web.ActivityPub.UtilsTest do
|
||||||
use Pleroma.DataCase
|
use Pleroma.DataCase
|
||||||
alias Pleroma.Activity
|
alias Pleroma.Activity
|
||||||
alias Pleroma.Repo
|
|
||||||
alias Pleroma.User
|
alias Pleroma.User
|
||||||
alias Pleroma.Web.ActivityPub.ActivityPub
|
alias Pleroma.Web.ActivityPub.ActivityPub
|
||||||
alias Pleroma.Web.ActivityPub.Utils
|
alias Pleroma.Web.ActivityPub.Utils
|
||||||
|
@ -12,8 +11,8 @@ defmodule Pleroma.Web.ActivityPub.UtilsTest do
|
||||||
describe "fetch the latest Follow" do
|
describe "fetch the latest Follow" do
|
||||||
test "fetches the latest Follow activity" do
|
test "fetches the latest Follow activity" do
|
||||||
%Activity{data: %{"type" => "Follow"}} = activity = insert(:follow_activity)
|
%Activity{data: %{"type" => "Follow"}} = activity = insert(:follow_activity)
|
||||||
follower = Repo.get_by(User, ap_id: activity.data["actor"])
|
follower = User.get_cached_by_ap_id(activity.data["actor"])
|
||||||
followed = Repo.get_by(User, ap_id: activity.data["object"])
|
followed = User.get_cached_by_ap_id(activity.data["object"])
|
||||||
|
|
||||||
assert activity == Utils.fetch_latest_follow(follower, followed)
|
assert activity == Utils.fetch_latest_follow(follower, followed)
|
||||||
end
|
end
|
||||||
|
|
|
@ -89,8 +89,8 @@ test "allows to force-follow another user" do
|
||||||
"followed" => user.nickname
|
"followed" => user.nickname
|
||||||
})
|
})
|
||||||
|
|
||||||
user = User.get_by_id(user.id)
|
user = User.get_cached_by_id(user.id)
|
||||||
follower = User.get_by_id(follower.id)
|
follower = User.get_cached_by_id(follower.id)
|
||||||
|
|
||||||
assert User.following?(follower, user)
|
assert User.following?(follower, user)
|
||||||
end
|
end
|
||||||
|
@ -112,8 +112,8 @@ test "allows to force-unfollow another user" do
|
||||||
"followed" => user.nickname
|
"followed" => user.nickname
|
||||||
})
|
})
|
||||||
|
|
||||||
user = User.get_by_id(user.id)
|
user = User.get_cached_by_id(user.id)
|
||||||
follower = User.get_by_id(follower.id)
|
follower = User.get_cached_by_id(follower.id)
|
||||||
|
|
||||||
refute User.following?(follower, user)
|
refute User.following?(follower, user)
|
||||||
end
|
end
|
||||||
|
@ -145,13 +145,13 @@ test "it appends specified tags to users with specified nicknames", %{
|
||||||
user2: user2
|
user2: user2
|
||||||
} do
|
} do
|
||||||
assert json_response(conn, :no_content)
|
assert json_response(conn, :no_content)
|
||||||
assert User.get_by_id(user1.id).tags == ["x", "foo", "bar"]
|
assert User.get_cached_by_id(user1.id).tags == ["x", "foo", "bar"]
|
||||||
assert User.get_by_id(user2.id).tags == ["y", "foo", "bar"]
|
assert User.get_cached_by_id(user2.id).tags == ["y", "foo", "bar"]
|
||||||
end
|
end
|
||||||
|
|
||||||
test "it does not modify tags of not specified users", %{conn: conn, user3: user3} do
|
test "it does not modify tags of not specified users", %{conn: conn, user3: user3} do
|
||||||
assert json_response(conn, :no_content)
|
assert json_response(conn, :no_content)
|
||||||
assert User.get_by_id(user3.id).tags == ["unchanged"]
|
assert User.get_cached_by_id(user3.id).tags == ["unchanged"]
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -181,13 +181,13 @@ test "it removes specified tags from users with specified nicknames", %{
|
||||||
user2: user2
|
user2: user2
|
||||||
} do
|
} do
|
||||||
assert json_response(conn, :no_content)
|
assert json_response(conn, :no_content)
|
||||||
assert User.get_by_id(user1.id).tags == []
|
assert User.get_cached_by_id(user1.id).tags == []
|
||||||
assert User.get_by_id(user2.id).tags == ["y"]
|
assert User.get_cached_by_id(user2.id).tags == ["y"]
|
||||||
end
|
end
|
||||||
|
|
||||||
test "it does not modify tags of not specified users", %{conn: conn, user3: user3} do
|
test "it does not modify tags of not specified users", %{conn: conn, user3: user3} do
|
||||||
assert json_response(conn, :no_content)
|
assert json_response(conn, :no_content)
|
||||||
assert User.get_by_id(user3.id).tags == ["unchanged"]
|
assert User.get_cached_by_id(user3.id).tags == ["unchanged"]
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -257,7 +257,7 @@ test "deactivates the user", %{conn: conn} do
|
||||||
conn
|
conn
|
||||||
|> put("/api/pleroma/admin/activation_status/#{user.nickname}", %{status: false})
|
|> put("/api/pleroma/admin/activation_status/#{user.nickname}", %{status: false})
|
||||||
|
|
||||||
user = User.get_by_id(user.id)
|
user = User.get_cached_by_id(user.id)
|
||||||
assert user.info.deactivated == true
|
assert user.info.deactivated == true
|
||||||
assert json_response(conn, :no_content)
|
assert json_response(conn, :no_content)
|
||||||
end
|
end
|
||||||
|
@ -269,7 +269,7 @@ test "activates the user", %{conn: conn} do
|
||||||
conn
|
conn
|
||||||
|> put("/api/pleroma/admin/activation_status/#{user.nickname}", %{status: true})
|
|> put("/api/pleroma/admin/activation_status/#{user.nickname}", %{status: true})
|
||||||
|
|
||||||
user = User.get_by_id(user.id)
|
user = User.get_cached_by_id(user.id)
|
||||||
assert user.info.deactivated == false
|
assert user.info.deactivated == false
|
||||||
assert json_response(conn, :no_content)
|
assert json_response(conn, :no_content)
|
||||||
end
|
end
|
||||||
|
|
|
@ -169,15 +169,15 @@ test "represent a relationship" do
|
||||||
test "represent an embedded relationship" do
|
test "represent an embedded relationship" do
|
||||||
user =
|
user =
|
||||||
insert(:user, %{
|
insert(:user, %{
|
||||||
info: %{note_count: 5, follower_count: 3, source_data: %{"type" => "Service"}},
|
info: %{note_count: 5, follower_count: 0, source_data: %{"type" => "Service"}},
|
||||||
nickname: "shp@shitposter.club",
|
nickname: "shp@shitposter.club",
|
||||||
inserted_at: ~N[2017-08-15 15:47:06.597036]
|
inserted_at: ~N[2017-08-15 15:47:06.597036]
|
||||||
})
|
})
|
||||||
|
|
||||||
other_user = insert(:user)
|
other_user = insert(:user)
|
||||||
|
|
||||||
{:ok, other_user} = User.follow(other_user, user)
|
{:ok, other_user} = User.follow(other_user, user)
|
||||||
{:ok, other_user} = User.block(other_user, user)
|
{:ok, other_user} = User.block(other_user, user)
|
||||||
|
{:ok, _} = User.follow(insert(:user), user)
|
||||||
|
|
||||||
expected = %{
|
expected = %{
|
||||||
id: to_string(user.id),
|
id: to_string(user.id),
|
||||||
|
@ -186,7 +186,7 @@ test "represent an embedded relationship" do
|
||||||
display_name: user.name,
|
display_name: user.name,
|
||||||
locked: false,
|
locked: false,
|
||||||
created_at: "2017-08-15T15:47:06.000Z",
|
created_at: "2017-08-15T15:47:06.000Z",
|
||||||
followers_count: 3,
|
followers_count: 1,
|
||||||
following_count: 0,
|
following_count: 0,
|
||||||
statuses_count: 5,
|
statuses_count: 5,
|
||||||
note: user.bio,
|
note: user.bio,
|
||||||
|
|
|
@ -445,7 +445,7 @@ test "get a status", %{conn: conn} do
|
||||||
describe "deleting a status" do
|
describe "deleting a status" do
|
||||||
test "when you created it", %{conn: conn} do
|
test "when you created it", %{conn: conn} do
|
||||||
activity = insert(:note_activity)
|
activity = insert(:note_activity)
|
||||||
author = User.get_by_ap_id(activity.data["actor"])
|
author = User.get_cached_by_ap_id(activity.data["actor"])
|
||||||
|
|
||||||
conn =
|
conn =
|
||||||
conn
|
conn
|
||||||
|
@ -1167,7 +1167,7 @@ test "gets a users statuses", %{conn: conn} do
|
||||||
|
|
||||||
test "unimplemented pinned statuses feature", %{conn: conn} do
|
test "unimplemented pinned statuses feature", %{conn: conn} do
|
||||||
note = insert(:note_activity)
|
note = insert(:note_activity)
|
||||||
user = User.get_by_ap_id(note.data["actor"])
|
user = User.get_cached_by_ap_id(note.data["actor"])
|
||||||
|
|
||||||
conn =
|
conn =
|
||||||
conn
|
conn
|
||||||
|
@ -1178,7 +1178,7 @@ test "unimplemented pinned statuses feature", %{conn: conn} do
|
||||||
|
|
||||||
test "gets an users media", %{conn: conn} do
|
test "gets an users media", %{conn: conn} do
|
||||||
note = insert(:note_activity)
|
note = insert(:note_activity)
|
||||||
user = User.get_by_ap_id(note.data["actor"])
|
user = User.get_cached_by_ap_id(note.data["actor"])
|
||||||
|
|
||||||
file = %Plug.Upload{
|
file = %Plug.Upload{
|
||||||
content_type: "image/jpg",
|
content_type: "image/jpg",
|
||||||
|
@ -1253,8 +1253,8 @@ test "/api/v1/follow_requests works" do
|
||||||
|
|
||||||
{:ok, _activity} = ActivityPub.follow(other_user, user)
|
{:ok, _activity} = ActivityPub.follow(other_user, user)
|
||||||
|
|
||||||
user = User.get_by_id(user.id)
|
user = User.get_cached_by_id(user.id)
|
||||||
other_user = User.get_by_id(other_user.id)
|
other_user = User.get_cached_by_id(other_user.id)
|
||||||
|
|
||||||
assert User.following?(other_user, user) == false
|
assert User.following?(other_user, user) == false
|
||||||
|
|
||||||
|
@ -1273,8 +1273,8 @@ test "/api/v1/follow_requests/:id/authorize works" do
|
||||||
|
|
||||||
{:ok, _activity} = ActivityPub.follow(other_user, user)
|
{:ok, _activity} = ActivityPub.follow(other_user, user)
|
||||||
|
|
||||||
user = User.get_by_id(user.id)
|
user = User.get_cached_by_id(user.id)
|
||||||
other_user = User.get_by_id(other_user.id)
|
other_user = User.get_cached_by_id(other_user.id)
|
||||||
|
|
||||||
assert User.following?(other_user, user) == false
|
assert User.following?(other_user, user) == false
|
||||||
|
|
||||||
|
@ -1286,8 +1286,8 @@ test "/api/v1/follow_requests/:id/authorize works" do
|
||||||
assert relationship = json_response(conn, 200)
|
assert relationship = json_response(conn, 200)
|
||||||
assert to_string(other_user.id) == relationship["id"]
|
assert to_string(other_user.id) == relationship["id"]
|
||||||
|
|
||||||
user = User.get_by_id(user.id)
|
user = User.get_cached_by_id(user.id)
|
||||||
other_user = User.get_by_id(other_user.id)
|
other_user = User.get_cached_by_id(other_user.id)
|
||||||
|
|
||||||
assert User.following?(other_user, user) == true
|
assert User.following?(other_user, user) == true
|
||||||
end
|
end
|
||||||
|
@ -1310,7 +1310,7 @@ test "/api/v1/follow_requests/:id/reject works" do
|
||||||
|
|
||||||
{:ok, _activity} = ActivityPub.follow(other_user, user)
|
{:ok, _activity} = ActivityPub.follow(other_user, user)
|
||||||
|
|
||||||
user = User.get_by_id(user.id)
|
user = User.get_cached_by_id(user.id)
|
||||||
|
|
||||||
conn =
|
conn =
|
||||||
build_conn()
|
build_conn()
|
||||||
|
@ -1320,8 +1320,8 @@ test "/api/v1/follow_requests/:id/reject works" do
|
||||||
assert relationship = json_response(conn, 200)
|
assert relationship = json_response(conn, 200)
|
||||||
assert to_string(other_user.id) == relationship["id"]
|
assert to_string(other_user.id) == relationship["id"]
|
||||||
|
|
||||||
user = User.get_by_id(user.id)
|
user = User.get_cached_by_id(user.id)
|
||||||
other_user = User.get_by_id(other_user.id)
|
other_user = User.get_cached_by_id(other_user.id)
|
||||||
|
|
||||||
assert User.following?(other_user, user) == false
|
assert User.following?(other_user, user) == false
|
||||||
end
|
end
|
||||||
|
@ -1606,7 +1606,7 @@ test "following / unfollowing a user", %{conn: conn} do
|
||||||
|
|
||||||
assert %{"id" => _id, "following" => true} = json_response(conn, 200)
|
assert %{"id" => _id, "following" => true} = json_response(conn, 200)
|
||||||
|
|
||||||
user = User.get_by_id(user.id)
|
user = User.get_cached_by_id(user.id)
|
||||||
|
|
||||||
conn =
|
conn =
|
||||||
build_conn()
|
build_conn()
|
||||||
|
@ -1615,7 +1615,7 @@ test "following / unfollowing a user", %{conn: conn} do
|
||||||
|
|
||||||
assert %{"id" => _id, "following" => false} = json_response(conn, 200)
|
assert %{"id" => _id, "following" => false} = json_response(conn, 200)
|
||||||
|
|
||||||
user = User.get_by_id(user.id)
|
user = User.get_cached_by_id(user.id)
|
||||||
|
|
||||||
conn =
|
conn =
|
||||||
build_conn()
|
build_conn()
|
||||||
|
@ -1709,7 +1709,7 @@ test "muting / unmuting a user", %{conn: conn} do
|
||||||
|
|
||||||
assert %{"id" => _id, "muting" => true} = json_response(conn, 200)
|
assert %{"id" => _id, "muting" => true} = json_response(conn, 200)
|
||||||
|
|
||||||
user = User.get_by_id(user.id)
|
user = User.get_cached_by_id(user.id)
|
||||||
|
|
||||||
conn =
|
conn =
|
||||||
build_conn()
|
build_conn()
|
||||||
|
@ -1764,7 +1764,7 @@ test "blocking / unblocking a user", %{conn: conn} do
|
||||||
|
|
||||||
assert %{"id" => _id, "blocking" => true} = json_response(conn, 200)
|
assert %{"id" => _id, "blocking" => true} = json_response(conn, 200)
|
||||||
|
|
||||||
user = User.get_by_id(user.id)
|
user = User.get_cached_by_id(user.id)
|
||||||
|
|
||||||
conn =
|
conn =
|
||||||
build_conn()
|
build_conn()
|
||||||
|
@ -1988,6 +1988,199 @@ test "returns the favorites of a user", %{conn: conn} do
|
||||||
assert [] = json_response(third_conn, 200)
|
assert [] = json_response(third_conn, 200)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe "getting favorites timeline of specified user" do
|
||||||
|
setup do
|
||||||
|
[current_user, user] = insert_pair(:user, %{info: %{hide_favorites: false}})
|
||||||
|
[current_user: current_user, user: user]
|
||||||
|
end
|
||||||
|
|
||||||
|
test "returns list of statuses favorited by specified user", %{
|
||||||
|
conn: conn,
|
||||||
|
current_user: current_user,
|
||||||
|
user: user
|
||||||
|
} do
|
||||||
|
[activity | _] = insert_pair(:note_activity)
|
||||||
|
CommonAPI.favorite(activity.id, user)
|
||||||
|
|
||||||
|
response =
|
||||||
|
conn
|
||||||
|
|> assign(:user, current_user)
|
||||||
|
|> get("/api/v1/pleroma/accounts/#{user.id}/favourites")
|
||||||
|
|> json_response(:ok)
|
||||||
|
|
||||||
|
[like] = response
|
||||||
|
|
||||||
|
assert length(response) == 1
|
||||||
|
assert like["id"] == activity.id
|
||||||
|
end
|
||||||
|
|
||||||
|
test "returns favorites for specified user_id when user is not logged in", %{
|
||||||
|
conn: conn,
|
||||||
|
user: user
|
||||||
|
} do
|
||||||
|
activity = insert(:note_activity)
|
||||||
|
CommonAPI.favorite(activity.id, user)
|
||||||
|
|
||||||
|
response =
|
||||||
|
conn
|
||||||
|
|> get("/api/v1/pleroma/accounts/#{user.id}/favourites")
|
||||||
|
|> json_response(:ok)
|
||||||
|
|
||||||
|
assert length(response) == 1
|
||||||
|
end
|
||||||
|
|
||||||
|
test "returns favorited DM only when user is logged in and he is one of recipients", %{
|
||||||
|
conn: conn,
|
||||||
|
current_user: current_user,
|
||||||
|
user: user
|
||||||
|
} do
|
||||||
|
{:ok, direct} =
|
||||||
|
CommonAPI.post(current_user, %{
|
||||||
|
"status" => "Hi @#{user.nickname}!",
|
||||||
|
"visibility" => "direct"
|
||||||
|
})
|
||||||
|
|
||||||
|
CommonAPI.favorite(direct.id, user)
|
||||||
|
|
||||||
|
response =
|
||||||
|
conn
|
||||||
|
|> assign(:user, current_user)
|
||||||
|
|> get("/api/v1/pleroma/accounts/#{user.id}/favourites")
|
||||||
|
|> json_response(:ok)
|
||||||
|
|
||||||
|
assert length(response) == 1
|
||||||
|
|
||||||
|
anonymous_response =
|
||||||
|
conn
|
||||||
|
|> get("/api/v1/pleroma/accounts/#{user.id}/favourites")
|
||||||
|
|> json_response(:ok)
|
||||||
|
|
||||||
|
assert length(anonymous_response) == 0
|
||||||
|
end
|
||||||
|
|
||||||
|
test "does not return others' favorited DM when user is not one of recipients", %{
|
||||||
|
conn: conn,
|
||||||
|
current_user: current_user,
|
||||||
|
user: user
|
||||||
|
} do
|
||||||
|
user_two = insert(:user)
|
||||||
|
|
||||||
|
{:ok, direct} =
|
||||||
|
CommonAPI.post(user_two, %{
|
||||||
|
"status" => "Hi @#{user.nickname}!",
|
||||||
|
"visibility" => "direct"
|
||||||
|
})
|
||||||
|
|
||||||
|
CommonAPI.favorite(direct.id, user)
|
||||||
|
|
||||||
|
response =
|
||||||
|
conn
|
||||||
|
|> assign(:user, current_user)
|
||||||
|
|> get("/api/v1/pleroma/accounts/#{user.id}/favourites")
|
||||||
|
|> json_response(:ok)
|
||||||
|
|
||||||
|
assert length(response) == 0
|
||||||
|
end
|
||||||
|
|
||||||
|
test "paginates favorites using since_id and max_id", %{
|
||||||
|
conn: conn,
|
||||||
|
current_user: current_user,
|
||||||
|
user: user
|
||||||
|
} do
|
||||||
|
activities = insert_list(10, :note_activity)
|
||||||
|
|
||||||
|
Enum.each(activities, fn activity ->
|
||||||
|
CommonAPI.favorite(activity.id, user)
|
||||||
|
end)
|
||||||
|
|
||||||
|
third_activity = Enum.at(activities, 2)
|
||||||
|
seventh_activity = Enum.at(activities, 6)
|
||||||
|
|
||||||
|
response =
|
||||||
|
conn
|
||||||
|
|> assign(:user, current_user)
|
||||||
|
|> get("/api/v1/pleroma/accounts/#{user.id}/favourites", %{
|
||||||
|
since_id: third_activity.id,
|
||||||
|
max_id: seventh_activity.id
|
||||||
|
})
|
||||||
|
|> json_response(:ok)
|
||||||
|
|
||||||
|
assert length(response) == 3
|
||||||
|
refute third_activity in response
|
||||||
|
refute seventh_activity in response
|
||||||
|
end
|
||||||
|
|
||||||
|
test "limits favorites using limit parameter", %{
|
||||||
|
conn: conn,
|
||||||
|
current_user: current_user,
|
||||||
|
user: user
|
||||||
|
} do
|
||||||
|
7
|
||||||
|
|> insert_list(:note_activity)
|
||||||
|
|> Enum.each(fn activity ->
|
||||||
|
CommonAPI.favorite(activity.id, user)
|
||||||
|
end)
|
||||||
|
|
||||||
|
response =
|
||||||
|
conn
|
||||||
|
|> assign(:user, current_user)
|
||||||
|
|> get("/api/v1/pleroma/accounts/#{user.id}/favourites", %{limit: "3"})
|
||||||
|
|> json_response(:ok)
|
||||||
|
|
||||||
|
assert length(response) == 3
|
||||||
|
end
|
||||||
|
|
||||||
|
test "returns empty response when user does not have any favorited statuses", %{
|
||||||
|
conn: conn,
|
||||||
|
current_user: current_user,
|
||||||
|
user: user
|
||||||
|
} do
|
||||||
|
response =
|
||||||
|
conn
|
||||||
|
|> assign(:user, current_user)
|
||||||
|
|> get("/api/v1/pleroma/accounts/#{user.id}/favourites")
|
||||||
|
|> json_response(:ok)
|
||||||
|
|
||||||
|
assert Enum.empty?(response)
|
||||||
|
end
|
||||||
|
|
||||||
|
test "returns 404 error when specified user is not exist", %{conn: conn} do
|
||||||
|
conn = get(conn, "/api/v1/pleroma/accounts/test/favourites")
|
||||||
|
|
||||||
|
assert json_response(conn, 404) == %{"error" => "Record not found"}
|
||||||
|
end
|
||||||
|
|
||||||
|
test "returns 403 error when user has hidden own favorites", %{
|
||||||
|
conn: conn,
|
||||||
|
current_user: current_user
|
||||||
|
} do
|
||||||
|
user = insert(:user, %{info: %{hide_favorites: true}})
|
||||||
|
activity = insert(:note_activity)
|
||||||
|
CommonAPI.favorite(activity.id, user)
|
||||||
|
|
||||||
|
conn =
|
||||||
|
conn
|
||||||
|
|> assign(:user, current_user)
|
||||||
|
|> get("/api/v1/pleroma/accounts/#{user.id}/favourites")
|
||||||
|
|
||||||
|
assert json_response(conn, 403) == %{"error" => "Can't get favorites"}
|
||||||
|
end
|
||||||
|
|
||||||
|
test "hides favorites for new users by default", %{conn: conn, current_user: current_user} do
|
||||||
|
user = insert(:user)
|
||||||
|
activity = insert(:note_activity)
|
||||||
|
CommonAPI.favorite(activity.id, user)
|
||||||
|
|
||||||
|
conn =
|
||||||
|
conn
|
||||||
|
|> assign(:user, current_user)
|
||||||
|
|> get("/api/v1/pleroma/accounts/#{user.id}/favourites")
|
||||||
|
|
||||||
|
assert user.info.hide_favorites
|
||||||
|
assert json_response(conn, 403) == %{"error" => "Can't get favorites"}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
describe "updating credentials" do
|
describe "updating credentials" do
|
||||||
test "updates the user's bio", %{conn: conn} do
|
test "updates the user's bio", %{conn: conn} do
|
||||||
user = insert(:user)
|
user = insert(:user)
|
||||||
|
@ -2124,7 +2317,7 @@ test "get instance stats", %{conn: conn} do
|
||||||
{:ok, _} = TwitterAPI.create_status(user, %{"status" => "cofe"})
|
{:ok, _} = TwitterAPI.create_status(user, %{"status" => "cofe"})
|
||||||
|
|
||||||
# Stats should count users with missing or nil `info.deactivated` value
|
# Stats should count users with missing or nil `info.deactivated` value
|
||||||
user = User.get_by_id(user.id)
|
user = User.get_cached_by_id(user.id)
|
||||||
info_change = Changeset.change(user.info, %{deactivated: nil})
|
info_change = Changeset.change(user.info, %{deactivated: nil})
|
||||||
|
|
||||||
{:ok, _user} =
|
{:ok, _user} =
|
||||||
|
|
|
@ -21,7 +21,7 @@ test "Mention notification" do
|
||||||
mentioned_user = insert(:user)
|
mentioned_user = insert(:user)
|
||||||
{:ok, activity} = CommonAPI.post(user, %{"status" => "hey @#{mentioned_user.nickname}"})
|
{:ok, activity} = CommonAPI.post(user, %{"status" => "hey @#{mentioned_user.nickname}"})
|
||||||
{:ok, [notification]} = Notification.create_notifications(activity)
|
{:ok, [notification]} = Notification.create_notifications(activity)
|
||||||
user = User.get_by_id(user.id)
|
user = User.get_cached_by_id(user.id)
|
||||||
|
|
||||||
expected = %{
|
expected = %{
|
||||||
id: to_string(notification.id),
|
id: to_string(notification.id),
|
||||||
|
|
|
@ -128,6 +128,7 @@ test "a note activity" do
|
||||||
pleroma: %{
|
pleroma: %{
|
||||||
local: true,
|
local: true,
|
||||||
conversation_id: convo_id,
|
conversation_id: convo_id,
|
||||||
|
in_reply_to_account_acct: nil,
|
||||||
content: %{"text/plain" => HtmlSanitizeEx.strip_tags(note.data["object"]["content"])},
|
content: %{"text/plain" => HtmlSanitizeEx.strip_tags(note.data["object"]["content"])},
|
||||||
spoiler_text: %{"text/plain" => HtmlSanitizeEx.strip_tags(note.data["object"]["summary"])}
|
spoiler_text: %{"text/plain" => HtmlSanitizeEx.strip_tags(note.data["object"]["summary"])}
|
||||||
}
|
}
|
||||||
|
@ -178,7 +179,7 @@ test "contains mentions" do
|
||||||
|
|
||||||
status = StatusView.render("status.json", %{activity: activity})
|
status = StatusView.render("status.json", %{activity: activity})
|
||||||
|
|
||||||
actor = User.get_by_ap_id(activity.actor)
|
actor = User.get_cached_by_ap_id(activity.actor)
|
||||||
|
|
||||||
assert status.mentions ==
|
assert status.mentions ==
|
||||||
Enum.map([user, actor], fn u -> AccountView.render("mention.json", %{user: u}) end)
|
Enum.map([user, actor], fn u -> AccountView.render("mention.json", %{user: u}) end)
|
||||||
|
|
|
@ -6,7 +6,6 @@ defmodule Pleroma.Web.OStatus.OStatusControllerTest do
|
||||||
use Pleroma.Web.ConnCase
|
use Pleroma.Web.ConnCase
|
||||||
import Pleroma.Factory
|
import Pleroma.Factory
|
||||||
alias Pleroma.Object
|
alias Pleroma.Object
|
||||||
alias Pleroma.Repo
|
|
||||||
alias Pleroma.User
|
alias Pleroma.User
|
||||||
alias Pleroma.Web.CommonAPI
|
alias Pleroma.Web.CommonAPI
|
||||||
alias Pleroma.Web.OStatus.ActivityRepresenter
|
alias Pleroma.Web.OStatus.ActivityRepresenter
|
||||||
|
@ -41,7 +40,8 @@ test "decodes a salmon with a changed magic key", %{conn: conn} do
|
||||||
assert response(conn, 200)
|
assert response(conn, 200)
|
||||||
|
|
||||||
# Set a wrong magic-key for a user so it has to refetch
|
# Set a wrong magic-key for a user so it has to refetch
|
||||||
salmon_user = User.get_by_ap_id("http://gs.example.org:4040/index.php/user/1")
|
salmon_user = User.get_cached_by_ap_id("http://gs.example.org:4040/index.php/user/1")
|
||||||
|
|
||||||
# Wrong key
|
# Wrong key
|
||||||
info_cng =
|
info_cng =
|
||||||
User.Info.remote_user_creation(salmon_user.info, %{
|
User.Info.remote_user_creation(salmon_user.info, %{
|
||||||
|
@ -52,7 +52,7 @@ test "decodes a salmon with a changed magic key", %{conn: conn} do
|
||||||
salmon_user
|
salmon_user
|
||||||
|> Ecto.Changeset.change()
|
|> Ecto.Changeset.change()
|
||||||
|> Ecto.Changeset.put_embed(:info, info_cng)
|
|> Ecto.Changeset.put_embed(:info, info_cng)
|
||||||
|> Repo.update()
|
|> User.update_and_set_cache()
|
||||||
|
|
||||||
conn =
|
conn =
|
||||||
build_conn()
|
build_conn()
|
||||||
|
@ -86,7 +86,7 @@ test "returns 404 for a missing feed", %{conn: conn} do
|
||||||
|
|
||||||
test "gets an object", %{conn: conn} do
|
test "gets an object", %{conn: conn} do
|
||||||
note_activity = insert(:note_activity)
|
note_activity = insert(:note_activity)
|
||||||
user = User.get_by_ap_id(note_activity.data["actor"])
|
user = User.get_cached_by_ap_id(note_activity.data["actor"])
|
||||||
[_, uuid] = hd(Regex.scan(~r/.+\/([\w-]+)$/, note_activity.data["object"]["id"]))
|
[_, uuid] = hd(Regex.scan(~r/.+\/([\w-]+)$/, note_activity.data["object"]["id"]))
|
||||||
url = "/objects/#{uuid}"
|
url = "/objects/#{uuid}"
|
||||||
|
|
||||||
|
|
|
@ -30,7 +30,7 @@ test "handle incoming note - GS, Salmon" do
|
||||||
{:ok, [activity]} = OStatus.handle_incoming(incoming)
|
{:ok, [activity]} = OStatus.handle_incoming(incoming)
|
||||||
object = Object.normalize(activity.data["object"])
|
object = Object.normalize(activity.data["object"])
|
||||||
|
|
||||||
user = User.get_by_ap_id(activity.data["actor"])
|
user = User.get_cached_by_ap_id(activity.data["actor"])
|
||||||
assert user.info.note_count == 1
|
assert user.info.note_count == 1
|
||||||
assert activity.data["type"] == "Create"
|
assert activity.data["type"] == "Create"
|
||||||
assert object.data["type"] == "Note"
|
assert object.data["type"] == "Note"
|
||||||
|
@ -296,8 +296,8 @@ test "handle incoming follows" do
|
||||||
assert activity.data["object"] == "https://pawoo.net/users/pekorino"
|
assert activity.data["object"] == "https://pawoo.net/users/pekorino"
|
||||||
refute activity.local
|
refute activity.local
|
||||||
|
|
||||||
follower = User.get_by_ap_id(activity.data["actor"])
|
follower = User.get_cached_by_ap_id(activity.data["actor"])
|
||||||
followed = User.get_by_ap_id(activity.data["object"])
|
followed = User.get_cached_by_ap_id(activity.data["object"])
|
||||||
|
|
||||||
assert User.following?(follower, followed)
|
assert User.following?(follower, followed)
|
||||||
end
|
end
|
||||||
|
@ -320,8 +320,8 @@ test "handle incoming unfollows with existing follow" do
|
||||||
assert activity.data["object"]["object"] == "https://pawoo.net/users/pekorino"
|
assert activity.data["object"]["object"] == "https://pawoo.net/users/pekorino"
|
||||||
refute activity.local
|
refute activity.local
|
||||||
|
|
||||||
follower = User.get_by_ap_id(activity.data["actor"])
|
follower = User.get_cached_by_ap_id(activity.data["actor"])
|
||||||
followed = User.get_by_ap_id(activity.data["object"]["object"])
|
followed = User.get_cached_by_ap_id(activity.data["object"]["object"])
|
||||||
|
|
||||||
refute User.following?(follower, followed)
|
refute User.following?(follower, followed)
|
||||||
end
|
end
|
||||||
|
@ -355,7 +355,7 @@ test "tries to use the information in poco fields" do
|
||||||
|
|
||||||
{:ok, user} = OStatus.find_or_make_user(uri)
|
{:ok, user} = OStatus.find_or_make_user(uri)
|
||||||
|
|
||||||
user = Pleroma.User.get_by_id(user.id)
|
user = Pleroma.User.get_cached_by_id(user.id)
|
||||||
assert user.name == "Constance Variable"
|
assert user.name == "Constance Variable"
|
||||||
assert user.nickname == "lambadalambda@social.heldscal.la"
|
assert user.nickname == "lambadalambda@social.heldscal.la"
|
||||||
assert user.local == false
|
assert user.local == false
|
||||||
|
|
|
@ -99,7 +99,7 @@ test "it pushes an activity to remote accounts it's addressed to" do
|
||||||
}
|
}
|
||||||
|
|
||||||
{:ok, activity} = Repo.insert(%Activity{data: activity_data, recipients: activity_data["to"]})
|
{:ok, activity} = Repo.insert(%Activity{data: activity_data, recipients: activity_data["to"]})
|
||||||
user = User.get_by_ap_id(activity.data["actor"])
|
user = User.get_cached_by_ap_id(activity.data["actor"])
|
||||||
{:ok, user} = Pleroma.Web.WebFinger.ensure_keys_present(user)
|
{:ok, user} = Pleroma.Web.WebFinger.ensure_keys_present(user)
|
||||||
|
|
||||||
poster = fn url, _data, _headers ->
|
poster = fn url, _data, _headers ->
|
||||||
|
|
|
@ -270,7 +270,7 @@ test "returns 200 to authenticated request when the instance is public",
|
||||||
test "returns one status", %{conn: conn} do
|
test "returns one status", %{conn: conn} do
|
||||||
user = insert(:user)
|
user = insert(:user)
|
||||||
{:ok, activity} = CommonAPI.post(user, %{"status" => "Hey!"})
|
{:ok, activity} = CommonAPI.post(user, %{"status" => "Hey!"})
|
||||||
actor = Repo.get_by!(User, ap_id: activity.data["actor"])
|
actor = User.get_cached_by_ap_id(activity.data["actor"])
|
||||||
|
|
||||||
conn =
|
conn =
|
||||||
conn
|
conn
|
||||||
|
@ -720,7 +720,7 @@ test "with credentials", %{conn: conn, user: current_user} do
|
||||||
|> with_credentials(current_user.nickname, "test")
|
|> with_credentials(current_user.nickname, "test")
|
||||||
|> post("/api/friendships/create.json", %{user_id: followed.id})
|
|> post("/api/friendships/create.json", %{user_id: followed.id})
|
||||||
|
|
||||||
current_user = User.get_by_id(current_user.id)
|
current_user = User.get_cached_by_id(current_user.id)
|
||||||
assert User.ap_followers(followed) in current_user.following
|
assert User.ap_followers(followed) in current_user.following
|
||||||
|
|
||||||
assert json_response(conn, 200) ==
|
assert json_response(conn, 200) ==
|
||||||
|
@ -735,8 +735,8 @@ test "for restricted account", %{conn: conn, user: current_user} do
|
||||||
|> with_credentials(current_user.nickname, "test")
|
|> with_credentials(current_user.nickname, "test")
|
||||||
|> post("/api/friendships/create.json", %{user_id: followed.id})
|
|> post("/api/friendships/create.json", %{user_id: followed.id})
|
||||||
|
|
||||||
current_user = User.get_by_id(current_user.id)
|
current_user = User.get_cached_by_id(current_user.id)
|
||||||
followed = User.get_by_id(followed.id)
|
followed = User.get_cached_by_id(followed.id)
|
||||||
|
|
||||||
refute User.ap_followers(followed) in current_user.following
|
refute User.ap_followers(followed) in current_user.following
|
||||||
|
|
||||||
|
@ -765,7 +765,7 @@ test "with credentials", %{conn: conn, user: current_user} do
|
||||||
|> with_credentials(current_user.nickname, "test")
|
|> with_credentials(current_user.nickname, "test")
|
||||||
|> post("/api/friendships/destroy.json", %{user_id: followed.id})
|
|> post("/api/friendships/destroy.json", %{user_id: followed.id})
|
||||||
|
|
||||||
current_user = User.get_by_id(current_user.id)
|
current_user = User.get_cached_by_id(current_user.id)
|
||||||
assert current_user.following == [current_user.ap_id]
|
assert current_user.following == [current_user.ap_id]
|
||||||
|
|
||||||
assert json_response(conn, 200) ==
|
assert json_response(conn, 200) ==
|
||||||
|
@ -789,7 +789,7 @@ test "with credentials", %{conn: conn, user: current_user} do
|
||||||
|> with_credentials(current_user.nickname, "test")
|
|> with_credentials(current_user.nickname, "test")
|
||||||
|> post("/api/blocks/create.json", %{user_id: blocked.id})
|
|> post("/api/blocks/create.json", %{user_id: blocked.id})
|
||||||
|
|
||||||
current_user = User.get_by_id(current_user.id)
|
current_user = User.get_cached_by_id(current_user.id)
|
||||||
assert User.blocks?(current_user, blocked)
|
assert User.blocks?(current_user, blocked)
|
||||||
|
|
||||||
assert json_response(conn, 200) ==
|
assert json_response(conn, 200) ==
|
||||||
|
@ -816,7 +816,7 @@ test "with credentials", %{conn: conn, user: current_user} do
|
||||||
|> with_credentials(current_user.nickname, "test")
|
|> with_credentials(current_user.nickname, "test")
|
||||||
|> post("/api/blocks/destroy.json", %{user_id: blocked.id})
|
|> post("/api/blocks/destroy.json", %{user_id: blocked.id})
|
||||||
|
|
||||||
current_user = User.get_by_id(current_user.id)
|
current_user = User.get_cached_by_id(current_user.id)
|
||||||
assert current_user.info.blocks == []
|
assert current_user.info.blocks == []
|
||||||
|
|
||||||
assert json_response(conn, 200) ==
|
assert json_response(conn, 200) ==
|
||||||
|
@ -847,7 +847,7 @@ test "with credentials", %{conn: conn, user: current_user} do
|
||||||
|> with_credentials(current_user.nickname, "test")
|
|> with_credentials(current_user.nickname, "test")
|
||||||
|> post("/api/qvitter/update_avatar.json", %{img: avatar_image})
|
|> post("/api/qvitter/update_avatar.json", %{img: avatar_image})
|
||||||
|
|
||||||
current_user = User.get_by_id(current_user.id)
|
current_user = User.get_cached_by_id(current_user.id)
|
||||||
assert is_map(current_user.avatar)
|
assert is_map(current_user.avatar)
|
||||||
|
|
||||||
assert json_response(conn, 200) ==
|
assert json_response(conn, 200) ==
|
||||||
|
@ -956,7 +956,7 @@ test "with credentials", %{conn: conn, user: current_user} do
|
||||||
|> post(request_path)
|
|> post(request_path)
|
||||||
|
|
||||||
activity = Activity.get_by_id(note_activity.id)
|
activity = Activity.get_by_id(note_activity.id)
|
||||||
activity_user = User.get_by_ap_id(note_activity.data["actor"])
|
activity_user = User.get_cached_by_ap_id(note_activity.data["actor"])
|
||||||
|
|
||||||
assert json_response(response, 200) ==
|
assert json_response(response, 200) ==
|
||||||
ActivityView.render("activity.json", %{
|
ActivityView.render("activity.json", %{
|
||||||
|
@ -994,7 +994,7 @@ test "with credentials", %{conn: conn, user: current_user} do
|
||||||
|> post(request_path)
|
|> post(request_path)
|
||||||
|
|
||||||
activity = Activity.get_by_id(note_activity.id)
|
activity = Activity.get_by_id(note_activity.id)
|
||||||
activity_user = User.get_by_ap_id(note_activity.data["actor"])
|
activity_user = User.get_cached_by_ap_id(note_activity.data["actor"])
|
||||||
|
|
||||||
assert json_response(response, 200) ==
|
assert json_response(response, 200) ==
|
||||||
ActivityView.render("activity.json", %{
|
ActivityView.render("activity.json", %{
|
||||||
|
@ -1022,7 +1022,7 @@ test "it creates a new user", %{conn: conn} do
|
||||||
|
|
||||||
user = json_response(conn, 200)
|
user = json_response(conn, 200)
|
||||||
|
|
||||||
fetched_user = User.get_by_nickname("lain")
|
fetched_user = User.get_cached_by_nickname("lain")
|
||||||
assert user == UserView.render("show.json", %{user: fetched_user})
|
assert user == UserView.render("show.json", %{user: fetched_user})
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -1116,7 +1116,7 @@ test "it redirects to root url", %{conn: conn, user: user} do
|
||||||
test "it confirms the user account", %{conn: conn, user: user} do
|
test "it confirms the user account", %{conn: conn, user: user} do
|
||||||
get(conn, "/api/account/confirm_email/#{user.id}/#{user.info.confirmation_token}")
|
get(conn, "/api/account/confirm_email/#{user.id}/#{user.info.confirmation_token}")
|
||||||
|
|
||||||
user = User.get_by_id(user.id)
|
user = User.get_cached_by_id(user.id)
|
||||||
|
|
||||||
refute user.info.confirmation_pending
|
refute user.info.confirmation_pending
|
||||||
refute user.info.confirmation_token
|
refute user.info.confirmation_token
|
||||||
|
@ -1742,7 +1742,7 @@ test "with credentials, valid password and matching new password and confirmatio
|
||||||
})
|
})
|
||||||
|
|
||||||
assert json_response(conn, 200) == %{"status" => "success"}
|
assert json_response(conn, 200) == %{"status" => "success"}
|
||||||
fetched_user = User.get_by_id(current_user.id)
|
fetched_user = User.get_cached_by_id(current_user.id)
|
||||||
assert Pbkdf2.checkpw("newpass", fetched_user.password_hash) == true
|
assert Pbkdf2.checkpw("newpass", fetched_user.password_hash) == true
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -1783,8 +1783,8 @@ test "it lists friend requests" do
|
||||||
|
|
||||||
{:ok, _activity} = ActivityPub.follow(other_user, user)
|
{:ok, _activity} = ActivityPub.follow(other_user, user)
|
||||||
|
|
||||||
user = User.get_by_id(user.id)
|
user = User.get_cached_by_id(user.id)
|
||||||
other_user = User.get_by_id(other_user.id)
|
other_user = User.get_cached_by_id(other_user.id)
|
||||||
|
|
||||||
assert User.following?(other_user, user) == false
|
assert User.following?(other_user, user) == false
|
||||||
|
|
||||||
|
@ -1823,8 +1823,8 @@ test "it approves a friend request" do
|
||||||
|
|
||||||
{:ok, _activity} = ActivityPub.follow(other_user, user)
|
{:ok, _activity} = ActivityPub.follow(other_user, user)
|
||||||
|
|
||||||
user = User.get_by_id(user.id)
|
user = User.get_cached_by_id(user.id)
|
||||||
other_user = User.get_by_id(other_user.id)
|
other_user = User.get_cached_by_id(other_user.id)
|
||||||
|
|
||||||
assert User.following?(other_user, user) == false
|
assert User.following?(other_user, user) == false
|
||||||
|
|
||||||
|
@ -1846,8 +1846,8 @@ test "it denies a friend request" do
|
||||||
|
|
||||||
{:ok, _activity} = ActivityPub.follow(other_user, user)
|
{:ok, _activity} = ActivityPub.follow(other_user, user)
|
||||||
|
|
||||||
user = User.get_by_id(user.id)
|
user = User.get_cached_by_id(user.id)
|
||||||
other_user = User.get_by_id(other_user.id)
|
other_user = User.get_cached_by_id(other_user.id)
|
||||||
|
|
||||||
assert User.following?(other_user, user) == false
|
assert User.following?(other_user, user) == false
|
||||||
|
|
||||||
|
@ -1916,7 +1916,7 @@ test "it performs the upload and sets `data[actor]` with AP id of uploader user"
|
||||||
describe "POST /api/media/metadata/create" do
|
describe "POST /api/media/metadata/create" do
|
||||||
setup do
|
setup do
|
||||||
object = insert(:note)
|
object = insert(:note)
|
||||||
user = User.get_by_ap_id(object.data["actor"])
|
user = User.get_cached_by_ap_id(object.data["actor"])
|
||||||
%{object: object, user: user}
|
%{object: object, user: user}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -78,7 +78,7 @@ test "create a status" do
|
||||||
|
|
||||||
assert activity.data["object"] == object.data["id"]
|
assert activity.data["object"] == object.data["id"]
|
||||||
|
|
||||||
user = User.get_by_ap_id(user.ap_id)
|
user = User.get_cached_by_ap_id(user.ap_id)
|
||||||
|
|
||||||
assert user.info.note_count == 1
|
assert user.info.note_count == 1
|
||||||
end
|
end
|
||||||
|
@ -129,7 +129,7 @@ test "Follow another user using screen_name" do
|
||||||
|
|
||||||
assert User.ap_followers(followed) in user.following
|
assert User.ap_followers(followed) in user.following
|
||||||
|
|
||||||
followed = User.get_by_ap_id(followed.ap_id)
|
followed = User.get_cached_by_ap_id(followed.ap_id)
|
||||||
assert followed.info.follower_count == 1
|
assert followed.info.follower_count == 1
|
||||||
|
|
||||||
{:error, msg} = TwitterAPI.follow(user, %{"screen_name" => followed.nickname})
|
{:error, msg} = TwitterAPI.follow(user, %{"screen_name" => followed.nickname})
|
||||||
|
@ -281,7 +281,7 @@ test "it registers a new user and returns the user." do
|
||||||
|
|
||||||
{:ok, user} = TwitterAPI.register_user(data)
|
{:ok, user} = TwitterAPI.register_user(data)
|
||||||
|
|
||||||
fetched_user = User.get_by_nickname("lain")
|
fetched_user = User.get_cached_by_nickname("lain")
|
||||||
|
|
||||||
assert UserView.render("show.json", %{user: user}) ==
|
assert UserView.render("show.json", %{user: user}) ==
|
||||||
UserView.render("show.json", %{user: fetched_user})
|
UserView.render("show.json", %{user: fetched_user})
|
||||||
|
@ -299,7 +299,7 @@ test "it registers a new user with empty string in bio and returns the user." do
|
||||||
|
|
||||||
{:ok, user} = TwitterAPI.register_user(data)
|
{:ok, user} = TwitterAPI.register_user(data)
|
||||||
|
|
||||||
fetched_user = User.get_by_nickname("lain")
|
fetched_user = User.get_cached_by_nickname("lain")
|
||||||
|
|
||||||
assert UserView.render("show.json", %{user: user}) ==
|
assert UserView.render("show.json", %{user: user}) ==
|
||||||
UserView.render("show.json", %{user: fetched_user})
|
UserView.render("show.json", %{user: fetched_user})
|
||||||
|
@ -394,7 +394,7 @@ test "returns user on success" do
|
||||||
|
|
||||||
{:ok, user} = TwitterAPI.register_user(data)
|
{:ok, user} = TwitterAPI.register_user(data)
|
||||||
|
|
||||||
fetched_user = User.get_by_nickname("vinny")
|
fetched_user = User.get_cached_by_nickname("vinny")
|
||||||
invite = Repo.get_by(UserInviteToken, token: invite.token)
|
invite = Repo.get_by(UserInviteToken, token: invite.token)
|
||||||
|
|
||||||
assert invite.used == true
|
assert invite.used == true
|
||||||
|
@ -417,7 +417,7 @@ test "returns error on invalid token" do
|
||||||
{:error, msg} = TwitterAPI.register_user(data)
|
{:error, msg} = TwitterAPI.register_user(data)
|
||||||
|
|
||||||
assert msg == "Invalid token"
|
assert msg == "Invalid token"
|
||||||
refute User.get_by_nickname("GrimReaper")
|
refute User.get_cached_by_nickname("GrimReaper")
|
||||||
end
|
end
|
||||||
|
|
||||||
test "returns error on expired token" do
|
test "returns error on expired token" do
|
||||||
|
@ -437,7 +437,7 @@ test "returns error on expired token" do
|
||||||
{:error, msg} = TwitterAPI.register_user(data)
|
{:error, msg} = TwitterAPI.register_user(data)
|
||||||
|
|
||||||
assert msg == "Expired token"
|
assert msg == "Expired token"
|
||||||
refute User.get_by_nickname("GrimReaper")
|
refute User.get_cached_by_nickname("GrimReaper")
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -462,7 +462,7 @@ test "returns error on expired token" do
|
||||||
check_fn = fn invite ->
|
check_fn = fn invite ->
|
||||||
data = Map.put(data, "token", invite.token)
|
data = Map.put(data, "token", invite.token)
|
||||||
{:ok, user} = TwitterAPI.register_user(data)
|
{:ok, user} = TwitterAPI.register_user(data)
|
||||||
fetched_user = User.get_by_nickname("vinny")
|
fetched_user = User.get_cached_by_nickname("vinny")
|
||||||
|
|
||||||
assert UserView.render("show.json", %{user: user}) ==
|
assert UserView.render("show.json", %{user: user}) ==
|
||||||
UserView.render("show.json", %{user: fetched_user})
|
UserView.render("show.json", %{user: fetched_user})
|
||||||
|
@ -499,7 +499,7 @@ test "returns an error on overdue date", %{data: data} do
|
||||||
{:error, msg} = TwitterAPI.register_user(data)
|
{:error, msg} = TwitterAPI.register_user(data)
|
||||||
|
|
||||||
assert msg == "Expired token"
|
assert msg == "Expired token"
|
||||||
refute User.get_by_nickname("vinny")
|
refute User.get_cached_by_nickname("vinny")
|
||||||
invite = Repo.get_by(UserInviteToken, token: invite.token)
|
invite = Repo.get_by(UserInviteToken, token: invite.token)
|
||||||
|
|
||||||
refute invite.used
|
refute invite.used
|
||||||
|
@ -534,7 +534,7 @@ test "returns user on success, after him registration fails" do
|
||||||
}
|
}
|
||||||
|
|
||||||
{:ok, user} = TwitterAPI.register_user(data)
|
{:ok, user} = TwitterAPI.register_user(data)
|
||||||
fetched_user = User.get_by_nickname("vinny")
|
fetched_user = User.get_cached_by_nickname("vinny")
|
||||||
invite = Repo.get_by(UserInviteToken, token: invite.token)
|
invite = Repo.get_by(UserInviteToken, token: invite.token)
|
||||||
|
|
||||||
assert invite.used == true
|
assert invite.used == true
|
||||||
|
@ -555,7 +555,7 @@ test "returns user on success, after him registration fails" do
|
||||||
{:error, msg} = TwitterAPI.register_user(data)
|
{:error, msg} = TwitterAPI.register_user(data)
|
||||||
|
|
||||||
assert msg == "Expired token"
|
assert msg == "Expired token"
|
||||||
refute User.get_by_nickname("GrimReaper")
|
refute User.get_cached_by_nickname("GrimReaper")
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -585,7 +585,7 @@ test "returns user on success" do
|
||||||
}
|
}
|
||||||
|
|
||||||
{:ok, user} = TwitterAPI.register_user(data)
|
{:ok, user} = TwitterAPI.register_user(data)
|
||||||
fetched_user = User.get_by_nickname("vinny")
|
fetched_user = User.get_cached_by_nickname("vinny")
|
||||||
invite = Repo.get_by(UserInviteToken, token: invite.token)
|
invite = Repo.get_by(UserInviteToken, token: invite.token)
|
||||||
|
|
||||||
refute invite.used
|
refute invite.used
|
||||||
|
@ -610,7 +610,7 @@ test "error after max uses" do
|
||||||
}
|
}
|
||||||
|
|
||||||
{:ok, user} = TwitterAPI.register_user(data)
|
{:ok, user} = TwitterAPI.register_user(data)
|
||||||
fetched_user = User.get_by_nickname("vinny")
|
fetched_user = User.get_cached_by_nickname("vinny")
|
||||||
invite = Repo.get_by(UserInviteToken, token: invite.token)
|
invite = Repo.get_by(UserInviteToken, token: invite.token)
|
||||||
assert invite.used == true
|
assert invite.used == true
|
||||||
|
|
||||||
|
@ -630,7 +630,7 @@ test "error after max uses" do
|
||||||
{:error, msg} = TwitterAPI.register_user(data)
|
{:error, msg} = TwitterAPI.register_user(data)
|
||||||
|
|
||||||
assert msg == "Expired token"
|
assert msg == "Expired token"
|
||||||
refute User.get_by_nickname("GrimReaper")
|
refute User.get_cached_by_nickname("GrimReaper")
|
||||||
end
|
end
|
||||||
|
|
||||||
test "returns error on overdue date" do
|
test "returns error on overdue date" do
|
||||||
|
@ -650,7 +650,7 @@ test "returns error on overdue date" do
|
||||||
{:error, msg} = TwitterAPI.register_user(data)
|
{:error, msg} = TwitterAPI.register_user(data)
|
||||||
|
|
||||||
assert msg == "Expired token"
|
assert msg == "Expired token"
|
||||||
refute User.get_by_nickname("GrimReaper")
|
refute User.get_cached_by_nickname("GrimReaper")
|
||||||
end
|
end
|
||||||
|
|
||||||
test "returns error on with overdue date and after max" do
|
test "returns error on with overdue date and after max" do
|
||||||
|
@ -672,7 +672,7 @@ test "returns error on with overdue date and after max" do
|
||||||
{:error, msg} = TwitterAPI.register_user(data)
|
{:error, msg} = TwitterAPI.register_user(data)
|
||||||
|
|
||||||
assert msg == "Expired token"
|
assert msg == "Expired token"
|
||||||
refute User.get_by_nickname("GrimReaper")
|
refute User.get_cached_by_nickname("GrimReaper")
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -688,7 +688,7 @@ test "it returns the error on registration problems" do
|
||||||
{:error, error_object} = TwitterAPI.register_user(data)
|
{:error, error_object} = TwitterAPI.register_user(data)
|
||||||
|
|
||||||
assert is_binary(error_object[:error])
|
assert is_binary(error_object[:error])
|
||||||
refute User.get_by_nickname("lain")
|
refute User.get_cached_by_nickname("lain")
|
||||||
end
|
end
|
||||||
|
|
||||||
test "it assigns an integer conversation_id" do
|
test "it assigns an integer conversation_id" do
|
||||||
|
@ -709,7 +709,7 @@ test "fetches a user by uri" do
|
||||||
id = "https://mastodon.social/users/lambadalambda"
|
id = "https://mastodon.social/users/lambadalambda"
|
||||||
user = insert(:user)
|
user = insert(:user)
|
||||||
{:ok, represented} = TwitterAPI.get_external_profile(user, id)
|
{:ok, represented} = TwitterAPI.get_external_profile(user, id)
|
||||||
remote = User.get_by_ap_id(id)
|
remote = User.get_cached_by_ap_id(id)
|
||||||
|
|
||||||
assert represented["id"] == UserView.render("show.json", %{user: remote, for: user})["id"]
|
assert represented["id"] == UserView.render("show.json", %{user: remote, for: user})["id"]
|
||||||
|
|
||||||
|
|
|
@ -246,6 +246,12 @@ test "show follow account page if the `acct` is a account link", %{conn: conn} d
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test "GET /api/pleroma/healthcheck", %{conn: conn} do
|
||||||
|
conn = get(conn, "/api/pleroma/healthcheck")
|
||||||
|
|
||||||
|
assert conn.status in [200, 503]
|
||||||
|
end
|
||||||
|
|
||||||
describe "POST /api/pleroma/disable_account" do
|
describe "POST /api/pleroma/disable_account" do
|
||||||
test "it returns HTTP 200", %{conn: conn} do
|
test "it returns HTTP 200", %{conn: conn} do
|
||||||
user = insert(:user)
|
user = insert(:user)
|
||||||
|
|
|
@ -292,7 +292,7 @@ test "A blocked user for the blocker" do
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
blocker = User.get_by_id(blocker.id)
|
blocker = User.get_cached_by_id(blocker.id)
|
||||||
assert represented == UserView.render("show.json", %{user: user, for: blocker})
|
assert represented == UserView.render("show.json", %{user: user, for: blocker})
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue