]> git.openstreetmap.org Git - rails.git/blob - app/controllers/api/user_preferences_controller.rb
Lock note during status update to avoid race condition
[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     around_action :api_call_handle_error
10
11     before_action :set_request_formats
12
13     ##
14     # return all the preferences
15     def index
16       @user_preferences = current_user.preferences
17
18       respond_to do |format|
19         format.xml
20         format.json
21       end
22     end
23
24     ##
25     # return the value for a single preference
26     def show
27       pref = UserPreference.find([current_user.id, params[:preference_key]])
28
29       render :plain => pref.v.to_s
30     end
31
32     # update the entire set of preferences
33     def update_all
34       old_preferences = current_user.preferences.index_by(&:k)
35
36       new_preferences = {}
37
38       doc = XML::Parser.string(request.raw_post, :options => XML::Parser::Options::NOERROR).parse
39
40       doc.find("//preferences/preference").each do |pt|
41         if preference = old_preferences.delete(pt["k"])
42           preference.v = pt["v"]
43         elsif new_preferences.include?(pt["k"])
44           raise OSM::APIDuplicatePreferenceError, pt["k"]
45         else
46           preference = current_user.preferences.build(:k => pt["k"], :v => pt["v"])
47         end
48
49         new_preferences[preference.k] = preference
50       end
51
52       old_preferences.each_value(&:delete)
53
54       new_preferences.each_value(&:save!)
55
56       render :plain => ""
57     end
58
59     ##
60     # update the value of a single preference
61     def update
62       begin
63         pref = UserPreference.find([current_user.id, params[:preference_key]])
64       rescue ActiveRecord::RecordNotFound
65         pref = UserPreference.new
66         pref.user = current_user
67         pref.k = params[:preference_key]
68       end
69
70       pref.v = request.raw_post.chomp.force_encoding("UTF-8")
71       pref.save!
72
73       render :plain => ""
74     end
75
76     ##
77     # delete a single preference
78     def destroy
79       UserPreference.find([current_user.id, params[:preference_key]]).delete
80
81       render :plain => ""
82     end
83   end
84 end