]> git.openstreetmap.org Git - rails.git/blobdiff - app/abilities/api_capability.rb
Apply the 4 suggestions from @gravitystorm
[rails.git] / app / abilities / api_capability.rb
index beb4d39bf3fa62ba20641899a89220cb91594b71..04d7fe10ab0953928a89c455b87761ae2c0ed173 100644 (file)
@@ -5,29 +5,35 @@ class ApiCapability
 
   def initialize(token)
     if Settings.status != "database_offline"
-      can [:create, :comment, :close, :reopen], Note if capability?(token, :allow_write_notes)
-      can [:show, :data], Trace if capability?(token, :allow_read_gpx)
-      can [:create, :update, :destroy], Trace if capability?(token, :allow_write_gpx)
-      can [:details], User if capability?(token, :allow_read_prefs)
-      can [:gpx_files], User if capability?(token, :allow_read_gpx)
-      can [:index, :show], UserPreference if capability?(token, :allow_read_prefs)
-      can [:update, :update_all, :destroy], UserPreference if capability?(token, :allow_write_prefs)
+      user = if token.respond_to?(:resource_owner_id)
+               User.find(token.resource_owner_id)
+             elsif token.respond_to?(:user)
+               token.user
+             end
 
-      if token&.user&.terms_agreed?
-        can [:create, :update, :upload, :close, :subscribe, :unsubscribe], Changeset if capability?(token, :allow_write_api)
-        can :create, ChangesetComment if capability?(token, :allow_write_api)
-        can [:create, :update, :delete], Node if capability?(token, :allow_write_api)
-        can [:create, :update, :delete], Way if capability?(token, :allow_write_api)
-        can [:create, :update, :delete], Relation if capability?(token, :allow_write_api)
+      can [:create, :comment, :close, :reopen], Note if scope?(token, :write_notes)
+      can [:show, :data], Trace if scope?(token, :read_gpx)
+      can [:create, :update, :destroy], Trace if scope?(token, :write_gpx)
+      can [:details], User if scope?(token, :read_prefs)
+      can [:gpx_files], User if scope?(token, :read_gpx)
+      can [:index, :show], UserPreference if scope?(token, :read_prefs)
+      can [:update, :update_all, :destroy], UserPreference if scope?(token, :write_prefs)
+
+      if user&.terms_agreed?
+        can [:create, :update, :upload, :close, :subscribe, :unsubscribe], Changeset if scope?(token, :write_api)
+        can :create, ChangesetComment if scope?(token, :write_api)
+        can [:create, :update, :delete], Node if scope?(token, :write_api)
+        can [:create, :update, :delete], Way if scope?(token, :write_api)
+        can [:create, :update, :delete], Relation if scope?(token, :write_api)
       end
 
-      if token&.user&.moderator?
-        can [:destroy, :restore], ChangesetComment if capability?(token, :allow_write_api)
-        can :destroy, Note if capability?(token, :allow_write_notes)
-        if token&.user&.terms_agreed?
-          can :redact, OldNode if capability?(token, :allow_write_api)
-          can :redact, OldWay if capability?(token, :allow_write_api)
-          can :redact, OldRelation if capability?(token, :allow_write_api)
+      if user&.moderator?
+        can [:destroy, :restore], ChangesetComment if scope?(token, :write_api)
+        can :destroy, Note if scope?(token, :write_notes)
+        if user&.terms_agreed?
+          can :redact, OldNode if scope?(token, :write_api)
+          can :redact, OldWay if scope?(token, :write_api)
+          can :redact, OldRelation if scope?(token, :write_api)
         end
       end
     end
@@ -35,7 +41,7 @@ class ApiCapability
 
   private
 
-  def capability?(token, cap)
-    token&.read_attribute(cap)
+  def scope?(token, scope)
+    token&.includes_scope?(scope)
   end
 end