FEATURE: User Status API (#19149)
This adds API scope for the user status. This also adds a get method to the user status controller. We didn't need a dedicated method that returns status before because the server returns status with user objects, but I think we need to provide this method for API clients.
This commit is contained in:
parent
9e42473af4
commit
6357a3ce33
|
@ -3,6 +3,13 @@
|
||||||
class UserStatusController < ApplicationController
|
class UserStatusController < ApplicationController
|
||||||
requires_login
|
requires_login
|
||||||
|
|
||||||
|
def get
|
||||||
|
ensure_feature_enabled
|
||||||
|
respond_to do |format|
|
||||||
|
format.json { render json: UserStatusSerializer.new(current_user.user_status, root: false) }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def set
|
def set
|
||||||
ensure_feature_enabled
|
ensure_feature_enabled
|
||||||
description = params.require(:description)
|
description = params.require(:description)
|
||||||
|
|
|
@ -63,6 +63,10 @@ class ApiKeyScope < ActiveRecord::Base
|
||||||
delete: { actions: %w[admin/users#destroy] },
|
delete: { actions: %w[admin/users#destroy] },
|
||||||
list: { actions: %w[admin/users#index] },
|
list: { actions: %w[admin/users#index] },
|
||||||
},
|
},
|
||||||
|
user_status: {
|
||||||
|
read: { actions: %w[user_status#get] },
|
||||||
|
update: { actions: %w[user_status#set user_status#clear] },
|
||||||
|
},
|
||||||
email: {
|
email: {
|
||||||
receive_emails: { actions: %w[admin/email#handle_mail admin/email#smtp_should_reject] }
|
receive_emails: { actions: %w[admin/email#handle_mail admin/email#smtp_should_reject] }
|
||||||
},
|
},
|
||||||
|
|
|
@ -4518,6 +4518,9 @@ en:
|
||||||
anonymize: Anonymize user accounts.
|
anonymize: Anonymize user accounts.
|
||||||
delete: Delete user accounts.
|
delete: Delete user accounts.
|
||||||
list: Get a list of users.
|
list: Get a list of users.
|
||||||
|
user_status:
|
||||||
|
read: Read user status.
|
||||||
|
update: Update user status.
|
||||||
email:
|
email:
|
||||||
receive_emails: Combine this scope with the mail-receiver to process incoming emails.
|
receive_emails: Combine this scope with the mail-receiver to process incoming emails.
|
||||||
badges:
|
badges:
|
||||||
|
|
|
@ -1037,6 +1037,7 @@ Discourse::Application.routes.draw do
|
||||||
post "/presence/update" => "presence#update"
|
post "/presence/update" => "presence#update"
|
||||||
get "/presence/get" => "presence#get"
|
get "/presence/get" => "presence#get"
|
||||||
|
|
||||||
|
get "user-status" => "user_status#get"
|
||||||
put "user-status" => "user_status#set"
|
put "user-status" => "user_status#set"
|
||||||
delete "user-status" => "user_status#clear"
|
delete "user-status" => "user_status#clear"
|
||||||
|
|
||||||
|
|
|
@ -421,6 +421,7 @@ RSpec.describe Admin::ApiController do
|
||||||
"email",
|
"email",
|
||||||
"posts",
|
"posts",
|
||||||
"uploads",
|
"uploads",
|
||||||
|
"user_status",
|
||||||
"global",
|
"global",
|
||||||
"badges",
|
"badges",
|
||||||
"categories",
|
"categories",
|
||||||
|
|
|
@ -1,6 +1,46 @@
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
RSpec.describe UserStatusController do
|
RSpec.describe UserStatusController do
|
||||||
|
describe '#get' do
|
||||||
|
it 'requires user to be logged in' do
|
||||||
|
get "/user-status.json"
|
||||||
|
expect(response.status).to eq(403)
|
||||||
|
end
|
||||||
|
|
||||||
|
it "returns 404 if the feature is disabled" do
|
||||||
|
user = Fabricate(:user)
|
||||||
|
sign_in(user)
|
||||||
|
SiteSetting.enable_user_status = false
|
||||||
|
|
||||||
|
get "/user-status.json"
|
||||||
|
|
||||||
|
expect(response.status).to eq(404)
|
||||||
|
end
|
||||||
|
|
||||||
|
describe 'when feature is enabled and a user is logged in' do
|
||||||
|
fab!(:user) { Fabricate(:user) }
|
||||||
|
|
||||||
|
before do
|
||||||
|
sign_in(user)
|
||||||
|
SiteSetting.enable_user_status = true
|
||||||
|
end
|
||||||
|
|
||||||
|
it "returns user status" do
|
||||||
|
status = "off to dentist"
|
||||||
|
status_emoji = "tooth"
|
||||||
|
ends_at = "2100-01-01T18:00:00.000Z"
|
||||||
|
user.set_status!(status, status_emoji, DateTime.parse(ends_at))
|
||||||
|
|
||||||
|
get "/user-status.json"
|
||||||
|
|
||||||
|
expect(response.status).to eq(200)
|
||||||
|
expect(response.parsed_body["description"]).to eq(status)
|
||||||
|
expect(response.parsed_body["emoji"]).to eq(status_emoji)
|
||||||
|
expect(response.parsed_body["ends_at"]).to eq(ends_at)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
describe '#set' do
|
describe '#set' do
|
||||||
it 'requires user to be logged in' do
|
it 'requires user to be logged in' do
|
||||||
put "/user-status.json", params: { description: "off to dentist" }
|
put "/user-status.json", params: { description: "off to dentist" }
|
||||||
|
|
Loading…
Reference in New Issue