Skip to content

rwxdash/forced

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

16 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Forced

This plugin is for Rails APIs that supports multiple mobile applications and want to force an update to those applications.

Read the link below to get some insight.

Installation

Add this line to your application's Gemfile:

gem 'forced'

And then execute:

$ bundle

Or install it yourself as:

$ gem install forced

And then, run:

# this will create a migration file.
$ bundle exec rails g forced:install

# this will migrate it.
$ bundle exec rails db:migrate

After all these are done, add the line below to your routes file.

mount Forced::Engine => "/forced"

You endpoint and tables are set!

Usage

If you want a parent for your Forced::Client records, you can add is_versionable to the desired parent model. Beware that both Forced::Client to Forced::Version relation and is_versionable to Forced::Client relation are set to dependent: :destroy.

The Forced::Client's polymorphic relation is optional as well. So, you can use the gem without setting a parent class relation. It'll work exactly the same.

For example, imagine you have a Brand model to identify each application. Adding the line below to your model, will hold a relation for has_many :clients

class Brand < ApplicationRecord
  # ...

  # If you haven't read the above paragraph, please do.
  # This is optional.
  is_versionable

  # ...
end

Then, you can call your clients with;

Brand.find(:id).clients
# => #<ActiveRecord::Associations::CollectionProxy [...]>

Brand.find(:id).clients.to_sql
# => "SELECT "forced_clients".* FROM "forced_clients" WHERE "forced_clients"."owner_id" = :id AND "forced_clients"."owner_type" = 'Brand'"

The Forced module needs to get the coming request to prepare the response. As long as request headers contains X-Platform and X-Client-Version, you are good to go.

  • X-Platform will need to match with Forced::Client identifier:string attribute in order to search the available versions.
  • X-Client-Version should contain a semantic version number, e.g. 1.0.0

Then send a GET request to {{url}}/forced/status. This will return the below JSON. (/forced is where you mounted the engine!)

{
    "update": "force_update",
    "latest_version": "1.0.0",
    "current_time": "2018-07-13T16:28:22.829Z"
}

If you want to return some version of this hash, you can access the response by calling the Response.call(request) method. See below.

response = Forced::Response.call(request)

To change the default response from the mounted endpoint, create a StatusController like below.

# In order this to work,
# you need to create this file in the correct path,
# that is;
#
# app/controllers/forced/status_controller.rb

module Forced
  class StatusController < ::ApplicationController
    def index
      response = Forced::Response.call(request)

      # Do what you want to do with the response hash.
    end
  end
end

To create a record, you can use your Rails console. Forced::Client is polymorphic and keeps foreign_key and foreign_type columns as owner_#. So, when you are creating a Forced::Client instance, use owner: for your reference column, e.g. Forced::Client.create(owner: Brand.first)

Forced::Client.new
# => #<Forced::Client id: nil, owner_type: nil, owner_id: nil, identifier: nil, deleted_at: nil, created_at: nil, updated_at: nil>

Forced::Version.new
# => #<Forced::Version id: nil, client_id: nil, version: nil, force_update: false, changelog: nil, deleted_at: nil, created_at: nil, updated_at: nil>

Responses

All available under Forced::MESSAGES hash table. You can override the values as you wish. Also checkout the check_update_status private method in base.rb to understand the cases.

Upgrading from 0.2.0 to 1.2.0

New migrations and tables have a different name, so, unless you are using custom calls, you can optionally and gradually create a migration for old table and move your records into the new table.

If you had some trouble or found something that wasn't suppose to be there, feel free to open an issue.

License

The gem is available as open source under the terms of the MIT License.

About

Easy force update control for APIs that support mobile clients.

Resources

License

Stars

Watchers

Forks

Packages

No packages published