Skip to content

Commit 10aabf5

Browse files
committed
Add support for extra app data
1 parent c617b49 commit 10aabf5

File tree

6 files changed

+108
-2
lines changed

6 files changed

+108
-2
lines changed

app/controllers/api/v8/users_controller.rb

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,82 @@ def show
6969
administrator: user.administrator
7070
)
7171
end
72+
73+
def create
74+
authorize! :create, User
75+
76+
@user = User.new
77+
78+
@user.login = params[:user][:username].to_s.strip
79+
80+
set_email
81+
set_password
82+
set_user_fields
83+
set_extra_data
84+
85+
if @user.errors.empty? && @user.save
86+
UserMailer.email_confirmation(@user).deliver_now
87+
render json: {
88+
success: true,
89+
message: 'User created.'
90+
}
91+
else
92+
render json: {
93+
success: false,
94+
errors: @user.errors
95+
}
96+
end
97+
end
98+
99+
private
100+
101+
def set_email
102+
user_params = params[:user]
103+
104+
return if !@user.new_record? && user_params[:email_confirmation].blank?
105+
106+
if user_params[:email].blank?
107+
@user.errors.add(:email, 'needed')
108+
elsif user_params[:email] != user_params[:email_confirmation]
109+
@user.errors.add(:email_confirmation, 'did not match')
110+
else
111+
@user.email = user_params[:email].strip
112+
end
113+
end
114+
115+
def set_password
116+
user_params = params[:user]
117+
if user_params[:password].blank?
118+
@user.errors.add(:password, 'needed')
119+
elsif user_params[:password] != user_params[:password_confirmation]
120+
@user.errors.add(:password_confirmation, 'did not match')
121+
else
122+
@user.password = user_params[:password]
123+
end
124+
end
125+
126+
def set_user_fields
127+
return if params[:user_field].nil?
128+
changes = {}
129+
UserField.all.select { |f| f.visible_to?(current_user) }.each do |field|
130+
value_record = @user.field_value_record(field)
131+
old_value = value_record.ruby_value
132+
value_record.set_from_form(params[:user_field][field.name])
133+
new_value = value_record.ruby_value
134+
changes[field.name] = { from: old_value, to: new_value } unless new_value == old_value
135+
end
136+
changes
137+
end
138+
139+
def set_extra_data
140+
extra_fields = params['user']['extra_fields']
141+
return if extra_fields.nil?
142+
namespace = extra_fields['namespace']
143+
raise "Namespace not defined" unless namespace
144+
extra_fields['data'].each do |record|
145+
@user.user_app_data.new(namespace: namespace, field_name: record['field_name'], value: record[:value])
146+
end
147+
end
72148
end
73149
end
74150
end

app/models/user.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ class User < ActiveRecord::Base
1616
has_many :awarded_points, dependent: :delete_all
1717
has_many :action_tokens, dependent: :delete_all
1818
has_many :user_field_values, dependent: :delete_all, autosave: true
19+
has_many :user_app_data, dependent: :delete_all, autosave: true
1920
has_many :unlocks, dependent: :delete_all
2021
has_many :uncomputed_unlocks, dependent: :delete_all
2122
has_many :reviews, foreign_key: :reviewer_id, inverse_of: :reviewer, dependent: :nullify

app/models/user_app_datum.rb

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
class UserAppDatum < ActiveRecord::Base
2+
belongs_to :user
3+
end

config/routes.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@
4242
namespace :v8, defaults: {format: 'json'} do
4343
resources :apidocs, only: :index, path: 'documentation'
4444

45-
resources :users, only: :show
45+
resources :users, only: [:show, :create]
4646

4747
resources :organizations, param: :slug, path: 'org', only: %i{index show} do
4848
resources :courses, module: :organizations, param: :name, only: :show do
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
class CreateUserAppData < ActiveRecord::Migration
2+
def change
3+
create_table :user_app_data do |t|
4+
t.string :field_name
5+
t.text :value
6+
t.string :namespace
7+
t.references :user, index: true, foreign_key: true
8+
t.timestamps
9+
end
10+
11+
add_index :user_app_data, [:user_id, :field_name, :namespace], unique: true
12+
end
13+
end

db/schema.rb

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
#
1212
# It's strongly recommended that you check this file into your version control system.
1313

14-
ActiveRecord::Schema.define(version: 20180322124723) do
14+
ActiveRecord::Schema.define(version: 20180425091037) do
1515

1616
# These are extensions that must be enabled in order to support this database
1717
enable_extension "plpgsql"
@@ -377,6 +377,18 @@
377377

378378
add_index "unlocks", ["user_id", "course_id", "exercise_name"], name: "index_unlocks_on_user_id_and_course_id_and_exercise_name", unique: true, using: :btree
379379

380+
create_table "user_app_data", force: :cascade do |t|
381+
t.string "field_name"
382+
t.text "value"
383+
t.string "namespace"
384+
t.integer "user_id"
385+
t.datetime "created_at"
386+
t.datetime "updated_at"
387+
end
388+
389+
add_index "user_app_data", ["user_id", "field_name", "namespace"], name: "index_user_app_data_on_user_id_and_field_name_and_namespace", unique: true, using: :btree
390+
add_index "user_app_data", ["user_id"], name: "index_user_app_data_on_user_id", using: :btree
391+
380392
create_table "user_field_values", force: :cascade do |t|
381393
t.integer "user_id", null: false
382394
t.string "field_name", null: false
@@ -426,5 +438,6 @@
426438
add_foreign_key "submissions", "users", on_delete: :cascade
427439
add_foreign_key "test_case_runs", "submissions", on_delete: :cascade
428440
add_foreign_key "test_scanner_cache_entries", "courses", on_delete: :cascade
441+
add_foreign_key "user_app_data", "users"
429442
add_foreign_key "user_field_values", "users", on_delete: :cascade
430443
end

0 commit comments

Comments
 (0)