Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/yhirano55/pubsub_notifier

:postbox::bee: Pub/Sub Notifier for Rails
https://github.com/yhirano55/pubsub_notifier

activejob pubsub rails5 ruby wisper

Last synced: 3 days ago
JSON representation

:postbox::bee: Pub/Sub Notifier for Rails

Awesome Lists containing this project

README

        

# PubsubNotifier

[![Build Status](https://travis-ci.org/yhirano55/pubsub_notifier.svg?branch=master)](https://travis-ci.org/yhirano55/pubsub_notifier)
[![Gem Version](https://badge.fury.io/rb/pubsub_notifier.svg)](https://badge.fury.io/rb/pubsub_notifier)

Publish-Subscribe Notifier for Ruby on Rails.

This gem relies on [krisleech/wisper](https://github.com/krisleech/wisper/) provides Pub/Sub capabilities.

## Installation

```ruby
gem 'pubsub_notifier'
```

And you can run the generator, which will set up an application notifier with some useful defaults for you:

```bash
rails g pubsub_notifier:install
```

After generating your application notifier, restart the Rails server so that Rails can pick up any classes in the new `app/notifiers/` directory.

Optionally, you need to perform asynchronously. Add `sidekiq` or `resuque` to your Gemfile:

```ruby
gem 'sidekiq'
```

Then set your queue adapter of active_job:

```ruby
Rails.application.config.active_job.queue_adapter = :sidekiq
```

## Usage

### ActiveRecord

```ruby
class User < ApplicationRecord
subscribe :UserMailer
subscribe :UserNotifier, async: true, queue: :high
end

class UserMailer < ApplicationMailer
acts_as_notifier

default from: '[email protected]'

def welcome(user)
@user = user
mail(to: @user.email, subject: 'Welcome to My Awesome Site')
end
end

class UserNotifier < ApplicationNotifier
use :slack, channel: '#general', username: 'angel', icon_emoji: ':innocent:'

def welcome(user)
notify_success("#{user.name} has joined.")
end
end

user = User.first
user.broadcast(:welcome) # or user.publish(:welcome)
```

### Pure Ruby Object

```ruby
class Register
include PubsubNotifier::Proxy

subscribe :UserRegisterNotifier

attr_accessor :name

validates :name, presence: true

def execute
if valid?
broadcast(:success)
else
broadcast(:failure)
end
end
end

class UserRegisterNotifier < ApplicationNotifier
use :slack, channel: '#random', username: 'noreply', icon_emoji: ':grinning:'

def success(context)
notify_success('succeed')
end

def failure(context)
notify_failure('failure')
end
end

register = Register.new(name: 'hello')
register.execute
```

### Configuration

```ruby
# config/initializers/pubsub_notifier.rb
PubsubNotifier.config.logger = Rails.logger

require "pubsub_notifier/slack_client"

PubsubNotifier::SlackClient.configure do |config|
config.default_channel = ENV['SLACK_DEFAULT_CHANNEL']
config.default_username = ENV['SLACK_DEFAULT_USERNAME']
config.default_icon_emoji = ENV['SLACK_DEFAULT_ICON_EMOJI']
config.webhook_url = ENV['SLACK_WEBHOOK_URL']
end
```

### Generate a Notifier class

You can generate a notifier class by generate command:

```bash
rails g notifier user
create app/notifiers/user_notifier.rb
invoke test_unit
create test/notifiers/user_notifier_test.rb
```

### Implement Notification Client

You can easily implement Client for Notification like plugin:

```ruby
module PubsubNotifier
class SomethingClient < ::PubsubNotifier::Client::Base
def initialize(options = {})
# implement this
end

def notify_success(message)
# implement this
end

def notify_failure(message)
# implement this
end

def something_special(*args)
# implement if you need
end
end
end

PubsubNotifier.clients :something, PubsubNotifier::SomethingClient
```

Then you can use on a notifier class:

```ruby
class SomeNotifier < ApplicationNotifier
use :something

def welcome(recipient)
notify_success(recipient.name)
end
end
```

If you want to know more information to implement notification client, please check `lib/pubsub_notifier/slack_client.rb`.

## License

The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).