Add invite_code to POST /api/v1/accounts

This commit is contained in:
Claire 2023-11-10 11:38:09 +01:00
parent fa50876e10
commit c01f13d04a
3 changed files with 50 additions and 16 deletions

View file

@ -92,10 +92,14 @@ class Api::V1::AccountsController < Api::BaseController
end end
def account_params def account_params
params.permit(:username, :email, :password, :agreement, :locale, :reason, :time_zone) params.permit(:username, :email, :password, :agreement, :locale, :reason, :time_zone, :invite_code)
end
def invite
Invite.find_by(code: params[:invite_code]) if params[:invite_code].present?
end end
def check_enabled_registrations def check_enabled_registrations
forbidden unless allowed_registration?(request.remote_ip, nil) forbidden unless allowed_registration?(request.remote_ip, invite)
end end
end end

View file

@ -8,7 +8,7 @@ class AppSignUpService < BaseService
@remote_ip = remote_ip @remote_ip = remote_ip
@params = params @params = params
raise Mastodon::NotPermittedError unless allowed_registration?(remote_ip, nil) raise Mastodon::NotPermittedError unless allowed_registration?(remote_ip, invite)
ApplicationRecord.transaction do ApplicationRecord.transaction do
create_user! create_user!
@ -36,8 +36,12 @@ class AppSignUpService < BaseService
) )
end end
def invite
Invite.find_by(code: @params[:invite_code]) if @params[:invite_code].present?
end
def user_params def user_params
@params.slice(:email, :password, :agreement, :locale, :time_zone) @params.slice(:email, :password, :agreement, :locale, :time_zone, :invite_code)
end end
def account_params def account_params

View file

@ -10,6 +10,23 @@ RSpec.describe AppSignUpService, type: :service do
let(:remote_ip) { IPAddr.new('198.0.2.1') } let(:remote_ip) { IPAddr.new('198.0.2.1') }
describe '#call' do describe '#call' do
let(:params) { good_params }
shared_examples 'successful registration' do
it 'creates an unconfirmed user with access token and the app\'s scope', :aggregate_failures do
access_token = subject.call(app, remote_ip, params)
expect(access_token).to_not be_nil
expect(access_token.scopes.to_s).to eq 'read write'
user = User.find_by(id: access_token.resource_owner_id)
expect(user).to_not be_nil
expect(user.confirmed?).to be false
expect(user.account).to_not be_nil
expect(user.invite_request).to be_nil
end
end
context 'when registrations are closed' do context 'when registrations are closed' do
around do |example| around do |example|
tmp = Setting.registrations_mode tmp = Setting.registrations_mode
@ -23,24 +40,33 @@ RSpec.describe AppSignUpService, type: :service do
it 'raises an error', :aggregate_failures do it 'raises an error', :aggregate_failures do
expect { subject.call(app, remote_ip, good_params) }.to raise_error Mastodon::NotPermittedError expect { subject.call(app, remote_ip, good_params) }.to raise_error Mastodon::NotPermittedError
end end
context 'when using a valid invite' do
let(:params) { good_params.merge({ invite_code: invite.code }) }
let(:invite) { Fabricate(:invite) }
before do
invite.user.approve!
end
it_behaves_like 'successful registration'
end
context 'when using an invalid invite' do
let(:params) { good_params.merge({ invite_code: invite.code }) }
let(:invite) { Fabricate(:invite, uses: 1, max_uses: 1) }
it 'raises an error', :aggregate_failures do
expect { subject.call(app, remote_ip, params) }.to raise_error Mastodon::NotPermittedError
end
end
end end
it 'raises an error when params are missing' do it 'raises an error when params are missing' do
expect { subject.call(app, remote_ip, {}) }.to raise_error ActiveRecord::RecordInvalid expect { subject.call(app, remote_ip, {}) }.to raise_error ActiveRecord::RecordInvalid
end end
it 'creates an unconfirmed user with access token and the app\'s scope', :aggregate_failures do it_behaves_like 'successful registration'
access_token = subject.call(app, remote_ip, good_params)
expect(access_token).to_not be_nil
expect(access_token.scopes.to_s).to eq 'read write'
user = User.find_by(id: access_token.resource_owner_id)
expect(user).to_not be_nil
expect(user.confirmed?).to be false
expect(user.account).to_not be_nil
expect(user.invite_request).to be_nil
end
context 'when given an invite request text' do context 'when given an invite request text' do
it 'creates an account with invite request text' do it 'creates an account with invite request text' do