Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
added messaging.
courses publishes to routing key: sis.courses
users publishes to routing key: sis.users

set your rabbitmq server as an environment variable. see docker-compose
file for example

---

commented out publishing to ldap on new user creation.
James Babb committed Jun 3, 2019
1 parent c1d9656 commit 93875b6
Showing 9 changed files with 4,551 additions and 7 deletions.
2 changes: 2 additions & 0 deletions Sources/SIS/Gemfile
@@ -50,3 +50,5 @@ end

# Windows does not include zoneinfo files, so bundle the tzinfo-data gem
gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]

gem "bunny", ">= 2.14.1"
185 changes: 185 additions & 0 deletions Sources/SIS/Gemfile.lock
@@ -0,0 +1,185 @@
GEM
remote: https://rubygems.org/
specs:
actioncable (5.0.7.2)
actionpack (= 5.0.7.2)
nio4r (>= 1.2, < 3.0)
websocket-driver (~> 0.6.1)
actionmailer (5.0.7.2)
actionpack (= 5.0.7.2)
actionview (= 5.0.7.2)
activejob (= 5.0.7.2)
mail (~> 2.5, >= 2.5.4)
rails-dom-testing (~> 2.0)
actionpack (5.0.7.2)
actionview (= 5.0.7.2)
activesupport (= 5.0.7.2)
rack (~> 2.0)
rack-test (~> 0.6.3)
rails-dom-testing (~> 2.0)
rails-html-sanitizer (~> 1.0, >= 1.0.2)
actionview (5.0.7.2)
activesupport (= 5.0.7.2)
builder (~> 3.1)
erubis (~> 2.7.0)
rails-dom-testing (~> 2.0)
rails-html-sanitizer (~> 1.0, >= 1.0.3)
activejob (5.0.7.2)
activesupport (= 5.0.7.2)
globalid (>= 0.3.6)
activemodel (5.0.7.2)
activesupport (= 5.0.7.2)
activerecord (5.0.7.2)
activemodel (= 5.0.7.2)
activesupport (= 5.0.7.2)
arel (~> 7.0)
activesupport (5.0.7.2)
concurrent-ruby (~> 1.0, >= 1.0.2)
i18n (>= 0.7, < 2)
minitest (~> 5.1)
tzinfo (~> 1.1)
amq-protocol (2.3.0)
arel (7.1.4)
bindex (0.7.0)
builder (3.2.3)
bunny (2.14.2)
amq-protocol (~> 2.3, >= 2.3.0)
byebug (11.0.1)
coffee-rails (4.2.2)
coffee-script (>= 2.2.0)
railties (>= 4.0.0)
coffee-script (2.4.1)
coffee-script-source
execjs
coffee-script-source (1.12.2)
concurrent-ruby (1.1.5)
crass (1.0.4)
erubis (2.7.0)
execjs (2.7.0)
ffi (1.10.0)
globalid (0.4.2)
activesupport (>= 4.2.0)
i18n (1.6.0)
concurrent-ruby (~> 1.0)
jbuilder (2.8.0)
activesupport (>= 4.2.0)
multi_json (>= 1.2)
jquery-rails (4.3.3)
rails-dom-testing (>= 1, < 3)
railties (>= 4.2.0)
thor (>= 0.14, < 2.0)
listen (3.0.8)
rb-fsevent (~> 0.9, >= 0.9.4)
rb-inotify (~> 0.9, >= 0.9.7)
loofah (2.2.3)
crass (~> 1.0.2)
nokogiri (>= 1.5.9)
mail (2.7.1)
mini_mime (>= 0.1.1)
method_source (0.9.2)
mini_mime (1.0.1)
mini_portile2 (2.4.0)
minitest (5.11.3)
multi_json (1.13.1)
mysql2 (0.4.10)
net-ldap (0.16.1)
nio4r (2.3.1)
nokogiri (1.10.2)
mini_portile2 (~> 2.4.0)
puma (3.12.1)
rack (2.0.7)
rack-test (0.6.3)
rack (>= 1.0)
rails (5.0.7.2)
actioncable (= 5.0.7.2)
actionmailer (= 5.0.7.2)
actionpack (= 5.0.7.2)
actionview (= 5.0.7.2)
activejob (= 5.0.7.2)
activemodel (= 5.0.7.2)
activerecord (= 5.0.7.2)
activesupport (= 5.0.7.2)
bundler (>= 1.3.0)
railties (= 5.0.7.2)
sprockets-rails (>= 2.0.0)
rails-dom-testing (2.0.3)
activesupport (>= 4.2.0)
nokogiri (>= 1.6)
rails-html-sanitizer (1.0.4)
loofah (~> 2.2, >= 2.2.2)
railties (5.0.7.2)
actionpack (= 5.0.7.2)
activesupport (= 5.0.7.2)
method_source
rake (>= 0.8.7)
thor (>= 0.18.1, < 2.0)
rake (12.3.2)
rb-fsevent (0.10.3)
rb-inotify (0.10.0)
ffi (~> 1.0)
sass (3.7.4)
sass-listen (~> 4.0.0)
sass-listen (4.0.0)
rb-fsevent (~> 0.9, >= 0.9.4)
rb-inotify (~> 0.9, >= 0.9.7)
sass-rails (5.0.7)
railties (>= 4.0.0, < 6)
sass (~> 3.1)
sprockets (>= 2.8, < 4.0)
sprockets-rails (>= 2.0, < 4.0)
tilt (>= 1.1, < 3)
spring (2.0.2)
activesupport (>= 4.2)
spring-watcher-listen (2.0.1)
listen (>= 2.7, < 4.0)
spring (>= 1.2, < 3.0)
sprockets (3.7.2)
concurrent-ruby (~> 1.0)
rack (> 1, < 3)
sprockets-rails (3.2.1)
actionpack (>= 4.0)
activesupport (>= 4.0)
sprockets (>= 3.0.0)
thor (0.20.3)
thread_safe (0.3.6)
tilt (2.0.9)
turbolinks (5.2.0)
turbolinks-source (~> 5.2)
turbolinks-source (5.2.0)
tzinfo (1.2.5)
thread_safe (~> 0.1)
uglifier (4.1.20)
execjs (>= 0.3.0, < 3)
web-console (3.7.0)
actionview (>= 5.0)
activemodel (>= 5.0)
bindex (>= 0.4.0)
railties (>= 5.0)
websocket-driver (0.6.5)
websocket-extensions (>= 0.1.0)
websocket-extensions (0.1.3)

PLATFORMS
ruby

DEPENDENCIES
bunny (>= 2.14.1)
byebug
coffee-rails (~> 4.2)
jbuilder (~> 2.5)
jquery-rails
listen (~> 3.0.5)
mysql2 (>= 0.3.18, < 0.5)
net-ldap
puma (~> 3.0)
rails (~> 5.0.0, >= 5.0.0.1)
sass-rails (~> 5.0)
spring
spring-watcher-listen (~> 2.0.0)
turbolinks (~> 5)
tzinfo-data
uglifier (>= 1.3.0)
web-console

BUNDLED WITH
1.17.3
3 changes: 3 additions & 0 deletions Sources/SIS/app/controllers/courses_controller.rb
@@ -30,6 +30,7 @@ def create

respond_to do |format|
if @course.save
@course.publish_to_rabbit('NEW')
format.html { redirect_to @course, notice: 'Course was successfully created.' }
format.json { render :show, status: :created, location: @course }
else
@@ -44,6 +45,7 @@ def create
def update
respond_to do |format|
if @course.update(course_params)
@course.publish_to_rabbit('UPDATE')
format.html { redirect_to @course, notice: 'Course was successfully updated.' }
format.json { render :show, status: :ok, location: @course }
else
@@ -56,6 +58,7 @@ def update
# DELETE /courses/1
# DELETE /courses/1.json
def destroy
@course.publish_to_rabbit('DELETE')
@course.destroy
respond_to do |format|
format.html { redirect_to courses_url, notice: 'Course was successfully destroyed.' }
8 changes: 5 additions & 3 deletions Sources/SIS/app/controllers/users_controller.rb
@@ -27,10 +27,10 @@ def edit
# POST /users.json
def create
@user = User.new(user_params)
@user.write_to_ldap

respond_to do |format|
respond_to do |format|
if @user.save
@user.write_to_ldap
@user.publish_to_rabbit('NEW')
format.html { redirect_to @user, notice: 'User was successfully created.' }
format.json { render :show, status: :created, location: @user }
else
@@ -45,6 +45,7 @@ def create
def update
respond_to do |format|
if @user.update(user_params)
@user.publish_to_rabbit('UPDATE')
format.html { redirect_to @user, notice: 'User was successfully updated.' }
format.json { render :show, status: :ok, location: @user }
else
@@ -57,6 +58,7 @@ def update
# DELETE /users/1
# DELETE /users/1.json
def destroy
@user.publish_to_rabbit('DELETE')
@user.destroy
respond_to do |format|
format.html { redirect_to users_url, notice: 'User was successfully destroyed.' }
25 changes: 25 additions & 0 deletions Sources/SIS/app/models/course.rb
@@ -1,3 +1,28 @@
class Course < ActiveRecord::Base
has_and_belongs_to_many :users

def publish_to_rabbit(action)
# Message payload
msg = {:course => self, :action => action}


# TODO: connection should be pooled and created on app start?
rabbit_connection = Bunny.new(ENV['RABBITMQ_URI'] || 'amqp://localhost')
rabbit_connection.start

channel = rabbit_connection.create_channel

# TODO: allow user to specify exchange in config
exchange = channel.default_exchange

# Publish that something about UID changed
# This should cover both course enrollments and general data about them.
exchange.publish(msg.to_json, :routing_key => 'sis.course')

logger.info('Published message: ' + msg.to_json)

rabbit_connection.close
end


end
32 changes: 29 additions & 3 deletions Sources/SIS/app/models/user.rb
@@ -1,4 +1,6 @@
require 'net/ldap'
require 'bunny'
require 'json'

class User < ApplicationRecord
has_and_belongs_to_many :courses
@@ -28,11 +30,35 @@ def write_to_ldap
}

# connect and add the entry
Net::LDAP.open( :host => ldap_host, :port => ldap_port, :base => ldap_base, :auth => { :method => :simple, :username => ldap_user, :password => ldap_pass }) do |ldap|
ldap.add( :dn => dn, :attributes => attr)
end
# Babb: assuming midpoint is adding to ldap? commented out for now.
# TODO: remove publish_to_ldap from controller
###Net::LDAP.open( :host => ldap_host, :port => ldap_port, :base => ldap_base, :auth => { :method => :simple, :username => ldap_user, :password => ldap_pass }) do |ldap|
### ldap.add( :dn => dn, :attributes => attr)
###end
end

def publish_to_rabbit(action)
# Message payload
msg = {:uid => uid, :action => action}


# TODO: connection should be pooled and created on app start?
rabbit_connection = Bunny.new(ENV['RABBITMQ_URI'] || 'amqp://localhost')
rabbit_connection.start

channel = rabbit_connection.create_channel

# TODO: allow user to specify exchange in config
exchange = channel.default_exchange

# Publish that something about UID changed
# This should cover both course enrollments and general data about them.
exchange.publish(msg.to_json, :routing_key => 'sis.user')

logger.info('Published message: ' + msg.to_json)

rabbit_connection.close
end


end
13 changes: 13 additions & 0 deletions Sources/SIS/docker-compose.yml
@@ -18,3 +18,16 @@ services:
- "3000:3000"
depends_on:
- sis-db
- sis-rabbit
environment:
- RABBITMQ_URI=amqp://tier-demo-rabbit
sis-rabbit:
image: rabbitmq:3-management
container_name: tier-demo-rabbit
ports:
- 4369:4369
- 5671:5671
- 5672:5672
- 15671:15671
- 15672:15672
- 25672:25672

0 comments on commit 93875b6

Please sign in to comment.