]> git.openstreetmap.org Git - rails.git/blob - app/controllers/api/user_preferences_controller.rb
Merge remote-tracking branch 'upstream/pull/5377'
[rails.git] / app / controllers / api / user_preferences_controller.rb
1 # Update and read user preferences, which are arbitrary key/val pairs
2 module Api
3   class UserPreferencesController < ApiController
4     before_action :check_api_writable, :only => [:update_all, :update, :destroy]
5     before_action :authorize
6
7     authorize_resource
8
9     before_action :set_request_formats
10
11     ##
12     # return all the preferences
13     def index
14       @user_preferences = current_user.preferences
15
16       respond_to do |format|
17         format.xml
18         format.json
19       end
20     end
21
22     ##
23     # return the value for a single preference
24     def show
25       pref = UserPreference.find([current_user.id, params[:preference_key]])
26
27       render :plain => pref.v.to_s
28     end
29
30     # update the entire set of preferences
31     def update_all
32       old_preferences = current_user.preferences.index_by(&:k)
33
34       new_preferences = {}
35
36       doc = XML::Parser.string(request.raw_post, :options => XML::Parser::Options::NOERROR).parse
37
38       doc.find("//preferences/preference").each do |pt|
39         if preference = old_preferences.delete(pt["k"])
40           preference.v = pt["v"]
41         elsif new_preferences.include?(pt["k"])
42           raise OSM::APIDuplicatePreferenceError, pt["k"]
43         else
44           preference = current_user.preferences.build(:k => pt["k"], :v => pt["v"])
45         end
46
47         new_preferences[preference.k] = preference
48       end
49
50       old_preferences.each_value(&:delete)
51
52       new_preferences.each_value(&:save!)
53
54       render :plain => ""
55     end
56
57     ##
58     # update the value of a single preference
59     def update
60       begin
61         pref = UserPreference.find([current_user.id, params[:preference_key]])
62       rescue ActiveRecord::RecordNotFound
63         pref = UserPreference.new
64         pref.user = current_user
65         pref.k = params[:preference_key]
66       end
67
68       pref.v = request.raw_post.chomp.force_encoding("UTF-8")
69       pref.save!
70
71       render :plain => ""
72     end
73
74     ##
75     # delete a single preference
76     def destroy
77       UserPreference.find([current_user.id, params[:preference_key]]).delete
78
79       render :plain => ""
80     end
81   end
82 end