diff options
Diffstat (limited to 'lib/api')
| -rw-r--r-- | lib/api/helpers.rb | 26 | ||||
| -rw-r--r-- | lib/api/services.rb | 86 | 
2 files changed, 57 insertions, 55 deletions
| diff --git a/lib/api/helpers.rb b/lib/api/helpers.rb index 1ebf9a1f022..76c9cc2e3a4 100644 --- a/lib/api/helpers.rb +++ b/lib/api/helpers.rb @@ -55,6 +55,32 @@ module API        end      end +    def project_service +      @project_service ||= begin +        underscored_service = params[:service_slug].underscore + +        if Service.available_services_names.include?(underscored_service) +          user_project.build_missing_services + +          service_method = "#{underscored_service}_service" +           +          send_service(service_method) +        end +      end +    +      @project_service || not_found!("Service") +    end + +    def send_service(service_method) +      user_project.send(service_method) +    end + +    def service_attributes +      @service_attributes ||= project_service.fields.inject([]) do |arr, hash| +        arr << hash[:name].to_sym +      end +    end +      def find_group(id)        begin          group = Group.find(id) diff --git a/lib/api/services.rb b/lib/api/services.rb index 3ad59cf3adf..73645cedea4 100644 --- a/lib/api/services.rb +++ b/lib/api/services.rb @@ -4,73 +4,49 @@ module API      before { authenticate! }      before { authorize_admin_project } +      resource :projects do -      # Set GitLab CI service for project -      # -      # Parameters: -      #   token (required) - CI project token -      #   project_url (required) - CI project url +      # Set <service_slug> service for project        #        # Example Request: +      #        #   PUT /projects/:id/services/gitlab-ci -      put ":id/services/gitlab-ci" do -        required_attributes! [:token, :project_url] -        attrs = attributes_for_keys [:token, :project_url] -        user_project.build_missing_services - -        if user_project.gitlab_ci_service.update_attributes(attrs.merge(active: true)) -          true -        else -          not_found! -        end -      end - -      # Delete GitLab CI service settings        # -      # Example Request: -      #   DELETE /projects/:id/services/gitlab-ci -      delete ":id/services/gitlab-ci" do -        if user_project.gitlab_ci_service -          user_project.gitlab_ci_service.update_attributes( -            active: false, -            token: nil, -            project_url: nil -          ) -        end -      end +      put ':id/services/:service_slug' do +        if project_service +          validators = project_service.class.validators.select do |s| +            s.class == ActiveRecord::Validations::PresenceValidator && +              s.attributes != [:project_id] +          end -      # Set Hipchat service for project -      # -      # Parameters: -      #   token (required) - Hipchat token -      #   room (required) - Hipchat room name -      # -      # Example Request: -      #   PUT /projects/:id/services/hipchat -      put ':id/services/hipchat' do -        required_attributes! [:token, :room] -        attrs = attributes_for_keys [:token, :room] -        user_project.build_missing_services +          required_attributes! validators.map(&:attributes).flatten.uniq +          attrs = attributes_for_keys service_attributes  -        if user_project.hipchat_service.update_attributes( -            attrs.merge(active: true)) -          true -        else -          not_found! +          if project_service.update_attributes(attrs.merge(active: true)) +            true +          else +            not_found! +          end          end        end -      # Delete Hipchat service settings +      # Delete <service_slug> service for project        #        # Example Request: -      #   DELETE /projects/:id/services/hipchat -      delete ':id/services/hipchat' do -        if user_project.hipchat_service -          user_project.hipchat_service.update_attributes( -            active: false, -            token: nil, -            room: nil -          ) +      # +      #   DELETE /project/:id/services/gitlab-ci +      # +      delete ':id/services/:service_slug' do +        if project_service +          attrs = service_attributes.inject({}) do |hash, key| +            hash.merge!(key => nil) +          end +           +          if project_service.update_attributes(attrs.merge(active: false)) +            true +          else +            not_found! +          end          end        end      end | 
