Sha256: be5c6aeb47c7f46dd870c10e6edd4f7e704052a500b9f234a62f4d98e8240f07

Contents?: true

Size: 1.37 KB

Versions: 1

Compression:

Stored size: 1.37 KB

Contents

require 'rack'
require 'rack/contrib'

require 'sinatra/base'
require 'sinatra/param'

require 'sequel'

module Rack
  class PushNotification < Sinatra::Base
    use Rack::PostBodyContentTypeParser
    helpers Sinatra::Param

    disable :raise_errors, :show_exceptions

    autoload :Device, 'rack/push-notification/models/device'

    configure do
      if ENV['DATABASE_URL']
        Sequel.extension :pg_inet, :pg_array, :migration

        DB = Sequel.connect(ENV['DATABASE_URL'])
        DB.extend Sequel::Postgres::PGArray::DatabaseMethods
        Sequel::Migrator.run(DB, ::File.join(::File.dirname(__FILE__), 'push-notification/migrations'), table: 'push_notification_schema_info')
      end
    end

    before do
      content_type :json
    end

    put '/devices/:token/?' do
      param :languages, Array
      param :tags, Array

      record = Device.find(token: params[:token]) || Device.new
      record.set(params.update({ip_address: request.ip}))

      code = record.new? ? 201 : 200

      if record.save
        status code
        {device: record}.to_json
      else
        status 400
        {errors: record.errors}.to_json
      end
    end

    delete '/devices/:token/?' do
      record = Device.find(token: params[:token]) or halt 404

      if record.destroy
        status 200
      else
        status 400
        {errors: record.errors}.to_json
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
rack-push-notification-0.5.1 ./lib/rack/push-notification.rb