slack-ruby / slack-ruby-bot-server

A library that enables you to write a complete Slack bot service with Slack button integration, in Ruby.
MIT License
268 stars 75 forks source link

Document adding a RESTful API #151

Open dblock opened 2 years ago

dblock commented 2 years ago

Coming from https://github.com/slack-ruby/slack-ruby-bot-server/issues/150#issuecomment-1293818003, document how to add a RESTful API.

This monkey-patching should work:

module SlackRubyBotServer
  module Api
    module Endpoints
      class MyEndpoint < Grape::API
         get 'foobar' do
             { ok: true }
         end
      end

      class RootEndpoint < Grape::API
        mount MyEndpoint
      end
    end
  end
end

We should document, and possibly implement a cleaner way to do this.

It's a bit of a rabbit hole. The root endpoint is https://github.com/slack-ruby/slack-ruby-bot-server/blob/master/lib/slack-ruby-bot-server/api/endpoints/root_endpoint.rb, invoked from https://github.com/slack-ruby/slack-ruby-bot-server/blob/99e91edbc3092dc9f9665fb8c9be3eebff3252f1/lib/slack-ruby-bot-server/api/middleware.rb#L40. It's extended in https://github.com/slack-ruby/slack-ruby-bot-server-events/blob/fb68e18314a58f7d345f98e015243307b24c8f88/lib/slack-ruby-bot-server/api/endpoints.rb#L24 for events. The instance of that middleware (https://github.com/slack-ruby/slack-ruby-bot-server/blob/99e91edbc3092dc9f9665fb8c9be3eebff3252f1/lib/slack-ruby-bot-server/api/middleware.rb#L15) is started in

Altonymous commented 2 years ago

So I had already figured out how to do it on my own prior to looking at this.

In essence all I did was modify config.ru to run SlackRubyBotServer alongside my Grape::API class...

run Rack::Cascade.new [SlackRubyBotServer::Api::Middleware.instance, MyApp::API]

Altonymous commented 2 years ago

It looks like the recommended way is to mount my Grape API in config/routes.rb for Rails 7. However, when I attempt to do that instead of the above it stops working. The only way I've been able to get both to successfully work together is the Cascade method above.

dblock commented 2 years ago

I like the Rack::Cascade solution because it's clean and independent, but then it doesn't sit behind other stack items, it's a whole stack of its own (e.g. caching or Rack::Cors). I think in the end the mot efficient solution is a single middleware stack where the bot API is mounted next to any other API. Would love to see 1) a proper extension point, 2) a working example added to the sample app, 3) documentation, and 4) a Rails sample/version.

Altonymous commented 2 years ago

Yeah, I'm at the point now where the Cascade isn't working so great. I'm trying to understand better what your monkey-patch above is doing.. to see if I can get it working in my app. Not sure I quite understand what it's doing quite yet though.

Thanks for the guidance so far!

Altonymous commented 2 years ago

I have been unsuccessful in getting your monkey-patch to work yet.

I tried adding the below to my config.ru. Which I thought was an equivalent to what you posted above.. but it continues to block other routes.

module SlackRubyBotServer
  module Api
    module Endpoints
      class MyEndpoint < Grape::API
         mount MyApp::API
      end

      class RootEndpoint < Grape::API
        mount MyEndpoint
      end
    end
  end
end

run SlackRubyBotServer::Api::Middleware.instance