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