# AppManager Welcome to the new gem of Hulkapps.com ! An API wrapper of Hulkapps.com's AppManager portal. * [Installation](#step1) * [Configuration](#step2) * [Usage](#step3) * [Extras](#step4) ### Installation * Add following line to your application's Gemfile: ```ruby gem 'app_manager' ``` * Execute following in terminal: ``` bundle install ``` ``` rails g app_manager:install ``` this install command will mount routes in your rails route and will create a config file at ```config/initializers/app_manager.rb``` ``` rails db:migrate ``` ### Configuration * Set Shopify API version to 2022-04 as app_manager is best compatible with this version. * Please map new fields (which added by app manager migration) in 'config.field_names' in below initializer file which is generated by install command. Please note: this is important step. * Please update blank fields in initializer file. Please copy 'uuid' from this [file](https://docs.google.com/spreadsheets/d/1cw2nSKxAHTGn4Cfa98RNdtfHT3zdtwu9bQD7s7hErXc/edit#gid=0) and paste in the following file and make sure that is unique per feature. After copying put your 'app name' next to 'uuid' column in this [file](https://docs.google.com/spreadsheets/d/1cw2nSKxAHTGn4Cfa98RNdtfHT3zdtwu9bQD7s7hErXc/edit#gid=0). ``` AppManager.configure do |config| config.enable_caching = false # Optional, True to enable app-manager api response caching, default is enabled from gem config.expires_in = 1.days # Optional, Example: 30.seconds, 5.minutes or 2.days Default caching is for 1.days from gem config.app_url = '' # App URL like https://volumediscount.hulkapps.dev/ or #https://5044-2409-4052-209a-69da-9d7-925a-9418-a9c3.ngrok.io config.shopify_api_key = '' # Shopify api key of app config.shopify_api_version = '' # Must be 2022-04 or latest config.shopify_table_name = 'shops' # Table name which is generated by shopify mostly it is 'shops' config.shopify_domain_field = 'shopify_domain' #shopify domain field config.plan_id_or_name_field = 'plan_id' config.shopify_app_slug = '' #Add your app slug here config.field_names = { 'name' => 'shopify_domain', # demo-rahul-tiwari.myshopify.com 'shopify_email' => 'email', # rahul.t@hulkapps.com 'shopify_token' => 'shopify_token', 'shopify_plan' => 'shopify_plan', # partner_test 'plan_id' => 'plan_id', # 1. t 'created_at' => 'created_at', # 2022-04-15 10:43:05 'trial_activated_at' => 'trial_activated_at', # field name that stores trial start/activated date 'grandfathered' => 'grandfathered', 'total_trial_days' => '' #optional, put a trial days field from your shops table otherwise leave it blank } config.plan_features = [ { "uuid" => "b48a3a6c-c1fb-11ec-9d64-0242ac120002", "name" => "Features 1", "slug" => "feature-1", "description" => "Feature Description", "value_type" => "integer", "format" => "count", "display_order" => 1, "hidden_feature" => false, "group_order" => "1", "group" => "Group Name", }, { "uuid" => "9f18f95a-bfaf-11ec-9d64-0242ac120002", "name" => "Features 2", "slug" => "feature-2", "description" => "Feature Description", "value_type" => "boolean", "format" => "percentage", "display_order" => 2, "hidden_feature" => false, "group_order" => "1", "group" => "Group Name", }, { "uuid" => "9f190a26-bfaf-11ec-9d64-0242ac120002", "name" => "Features 3", "slug" => "feature-3", "description" => "Feature Description", "value_type" => "string", "format" => "string", "display_order" => 3, "hidden_feature" => false, "group_order" => "1", "group" => "Group Name", }, { "uuid" => "9f191340-bfaf-11ec-9d64-0242ac12000", "name" => "Features 4", "slug" => "feature-4", "description" => "Feature Description", "value_type" => "array", "values" => [ "val-1" => "val 1", "val-2" => "val 2", "val-3" => "val 3", ], "format" => "string", "display_order" => 4, "hidden_feature" => false, "group_order" => "1", "group" => "Group Name", } ] end #Required, Values type : integer, boolean, string, array # #Format: percentage, count, string ``` * You must have to set ENV variable with key 'APP_MANAGER_ACCESS_TOKEN' in your application.yml or .env file like this: ``` APP_MANAGER_ACCESS_TOKEN: 'XXXXXXXXXXXXXXXXXXX' APP_MANAGER_API_URL: 'https://XXXXXXXX.com' ``` * App Manager provides a rake task that must needs to include in your existing app cron for every 10 minutes. Like if you are using [whenever](https://github.com/javan/whenever) gem then you MUST need to include following rake take in your 'schedule.rb' (created by whenever gem) ``` every 10.minutes do rake 'sync:local_app_manager' end ``` ### Usage * App Manager provides a helper module which needs to include in your 'shop' model something like below ``` class Shop < ActiveRecord::Base include AppManager::Model end ``` and then you can use follwing methods with your shop objects. ``` @shop.has_plan # return true or false @shop.plan_features # return array of plan features of your shop's plan @shop.has_feature('feature-1') # provide slug of feature which you set in your 'config.plan_features' in config/initializers/app_manager.rb #return true/false @shop.get_feature('feature-3') # provide slug of feature and this returns value of feature which is set in portal. @shop.get_remaining_days # return integer based on trial activated date. @shop.get_plan # return current plan hash if you pass @shop.get_plan(plan_id) it will return that particular plan hash like @shop.get_plan(311) @shop.get_charge # return current charge hash from app manager with 'active_charge' & 'cancelled_charge' keys, it will return nil if current plan is free @shop.cancel_charge # it will cancel charge in app manager and will return success to true if done from app manager @shop.set_default_plan(plan_id=nil) #if plan id is passed nil, then it will set the free(public and $0 price) plan_id in database and if passed it will set that plan_id in database. @shop.get_plans_by_features(feature_slugs) # pass feature_slugs as an array even if one slug and it will return plans array which have that slug found. Example: @shop.get_plans_by_features(['quantity-based-discount']) @shop.get_plans_by_features(['quantity-based-discount','multiple-discount-types']) you can pass string argument 'exclude_current_plan' which will return all plans that matching features except current plan @shop.get_plans_by_features(['quantity-based-discount'],'exclude_current_plan') @shop.get_plans_by_features(['quantity-based-discount','multiple-discount-types'],'exclude_current_plan') @shop.get_all_plans # return all app plans array @shop.get_active_charge_app_manager # return active charge hash from app manager otherwise nil @shop.update_app_manager_charge # return true if shop has shopify recurring charge but app manager doesn't then it update to app manager and return true otherwise nil @shop.get_current_shopify_charge # return active charge hash from shopify https://shopify.dev/docs/api/admin-graphql/2022-10/queries/currentAppInstallation otherwise nil @shop.active_shopify_charge_id # return active shopify charge id if shop has any current shopify reccurring charge otherwise nil @shop.cancel_current_shopify_charge # It will cancel charge in shopify if there is any, if success then it will cancel charge in app manager as well using (@shop.cancel_charge ) and will make plan_id and grandfathered field to false. It will clear cache as well. ``` ### Extras * To view the app_manager ruby gem is working in your rails app you can use rails console and initialize app_manager instance like with App Manager Portal access: ```ruby ob = AppManager::Client.new(ENV['APP_MANAGER_ACCESS_TOKEN']) ``` To get banners use this command: ```ruby ob.get_banners ``` * For Vue UI Library in Rails Project: Please make sure you have following line in your route file otherwise add this manually. mount AppManager::Engine, at: "/" ## Development After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment. To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and the created tag, and push the `.gem` file to [rubygems.org](https://rubygems.org). ## Contributing Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/app_manager. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [code of conduct](https://github.com/[USERNAME]/app_manager/blob/master/CODE_OF_CONDUCT.md). ## Code of Conduct Everyone interacting in the AppManager project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/[USERNAME]/app_manager/blob/master/CODE_OF_CONDUCT.md).