diff --git a/.github/workflows/production.yml b/.github/workflows/production.yml new file mode 100644 index 0000000..538ecf8 --- /dev/null +++ b/.github/workflows/production.yml @@ -0,0 +1,19 @@ +name: Deploy to Production + +on: + push: + branches: + - master + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v1 + + - name: Deploy app + env: + TOKEN: ${{ secrets.HEROKU_API_TOKEN }} + APP: ${{ secrets.HEROKU_APP_PRODUCTION }} + run: git push -f https://heroku:$TOKEN@git.heroku.com/$APP.git HEAD:master diff --git a/.github/workflows/staging.yml b/.github/workflows/staging.yml new file mode 100644 index 0000000..4241c30 --- /dev/null +++ b/.github/workflows/staging.yml @@ -0,0 +1,19 @@ +name: Deploy to Staging + +on: + push: + branches: + - develop + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v1 + + - name: Deploy app + env: + TOKEN: ${{ secrets.HEROKU_API_TOKEN }} + APP: ${{ secrets.HEROKU_APP_STAGING }} + run: git push -f https://heroku:$TOKEN@git.heroku.com/$APP.git HEAD:master diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..d6cba8d --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,29 @@ +# Changelogs + +**v1.3.0 - 21/11/2019** +- Preload Zones in State query +- Updated to the latest Rails 5 +- Updated dependencies +- Added monitoriing +- Integrated Github Actions + +**v1.2.3 - 07/04/2019** +- Resolve minor issue + +**v1.2.2 - 06/04/2019** +- Resolve minor issue + +**v1.2.1 - 04/01/2019** +- Resolve minor issue + +**v1.2.0 - 04/01/2019** +- Added v2 scraper to scrape from e-solat's new format + +**v1.1.0 - 02/09/2018** +- Added backup scraper to scrape from a backup source + +**v1.0.1 - 15/01/2018** +- Modify sanitiser to offset incorrect prayer times + +**v1.0.0 - 01/02/2017** +- Initial API Release diff --git a/Gemfile b/Gemfile index e6891e5..6cf3baa 100644 --- a/Gemfile +++ b/Gemfile @@ -6,26 +6,25 @@ git_source(:github) do |repo_name| "https://github.com/#{repo_name}.git" end -gem 'rails', '~> 5.0.1' -gem 'pg', '~> 0.19.0' -gem 'puma', '~> 3.0' -gem 'sass-rails', '~> 5.0' -gem 'coffee-rails', '~> 4.2.1' -gem 'jquery-rails', '~> 4.2.2' -gem 'uglifier', '>= 1.3.0' -gem 'turbolinks', '~> 5' -gem 'jbuilder', '~> 2.5' -gem 'httparty', '~> 0.16.2' -gem 'figaro', git: 'https://github.com/zaimramlan/figaro.git' +gem 'rails', '~> 5.2.0' +gem 'pg', '~> 0.19.0' +gem 'puma', '~> 3.12.1' +gem 'sass-rails', '~> 5.0' +gem 'coffee-rails', '~> 4.2.1' +gem 'jquery-rails', '~> 4.2.2' +gem 'uglifier', '>= 1.3.0' +gem 'turbolinks', '~> 5' +gem 'jbuilder', '~> 2.5' +gem 'httparty', '~> 0.16.2' +gem 'figaro', git: 'https://github.com/zaimramlan/figaro.git' gem 'nokogiri' +gem 'newrelic_rpm' group :development do - gem 'web-console', '>= 3.3.0' - gem 'spring', '~> 2.0' + gem 'web-console', '>= 3.3.0' + gem 'spring', '~> 2.0' gem 'spring-watcher-listen', '~> 2.0.0' - gem 'byebug', '~> 9.0', '>= 9.0.6', platform: :mri - gem 'listen', '~> 3.0.5' - gem 'awesome_print', '~> 1.7' + gem 'byebug', '~> 9.0', '>= 9.0.6', platform: :mri + gem 'listen', '~> 3.0.5' + gem 'awesome_print', '~> 1.7' end - -gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby] diff --git a/Gemfile.lock b/Gemfile.lock index fb5da2b..49a369c 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -8,67 +8,73 @@ GIT GEM remote: https://rubygems.org/ specs: - actioncable (5.0.1) - actionpack (= 5.0.1) - nio4r (~> 1.2) - websocket-driver (~> 0.6.1) - actionmailer (5.0.1) - actionpack (= 5.0.1) - actionview (= 5.0.1) - activejob (= 5.0.1) + actioncable (5.2.3) + actionpack (= 5.2.3) + nio4r (~> 2.0) + websocket-driver (>= 0.6.1) + actionmailer (5.2.3) + actionpack (= 5.2.3) + actionview (= 5.2.3) + activejob (= 5.2.3) mail (~> 2.5, >= 2.5.4) rails-dom-testing (~> 2.0) - actionpack (5.0.1) - actionview (= 5.0.1) - activesupport (= 5.0.1) + actionpack (5.2.3) + actionview (= 5.2.3) + activesupport (= 5.2.3) rack (~> 2.0) - rack-test (~> 0.6.3) + rack-test (>= 0.6.3) rails-dom-testing (~> 2.0) rails-html-sanitizer (~> 1.0, >= 1.0.2) - actionview (5.0.1) - activesupport (= 5.0.1) + actionview (5.2.3) + activesupport (= 5.2.3) builder (~> 3.1) - erubis (~> 2.7.0) + erubi (~> 1.4) rails-dom-testing (~> 2.0) - rails-html-sanitizer (~> 1.0, >= 1.0.2) - activejob (5.0.1) - activesupport (= 5.0.1) + rails-html-sanitizer (~> 1.0, >= 1.0.3) + activejob (5.2.3) + activesupport (= 5.2.3) globalid (>= 0.3.6) - activemodel (5.0.1) - activesupport (= 5.0.1) - activerecord (5.0.1) - activemodel (= 5.0.1) - activesupport (= 5.0.1) - arel (~> 7.0) - activesupport (5.0.1) + activemodel (5.2.3) + activesupport (= 5.2.3) + activerecord (5.2.3) + activemodel (= 5.2.3) + activesupport (= 5.2.3) + arel (>= 9.0) + activestorage (5.2.3) + actionpack (= 5.2.3) + activerecord (= 5.2.3) + marcel (~> 0.3.1) + activesupport (5.2.3) concurrent-ruby (~> 1.0, >= 1.0.2) - i18n (~> 0.7) + i18n (>= 0.7, < 2) minitest (~> 5.1) tzinfo (~> 1.1) - arel (7.1.4) - awesome_print (1.7.0) - builder (3.2.2) - byebug (9.0.6) - coffee-rails (4.2.1) + arel (9.0.0) + awesome_print (1.8.0) + bindex (0.8.1) + builder (3.2.3) + byebug (9.1.0) + coffee-rails (4.2.2) coffee-script (>= 2.2.0) - railties (>= 4.0.0, < 5.2.x) + railties (>= 4.0.0) coffee-script (2.4.1) coffee-script-source execjs coffee-script-source (1.12.2) - concurrent-ruby (1.0.4) - debug_inspector (0.0.2) - erubis (2.7.0) + concurrent-ruby (1.1.5) + crass (1.0.5) + erubi (1.9.0) execjs (2.7.0) - ffi (1.9.14) - globalid (0.3.7) - activesupport (>= 4.1.0) - httparty (0.16.2) + ffi (1.11.2) + globalid (0.4.2) + activesupport (>= 4.2.0) + httparty (0.16.4) + mime-types (~> 3.0) multi_xml (>= 0.5.2) - i18n (0.7.0) - jbuilder (2.6.1) - activesupport (>= 3.0.0, < 5.1) - multi_json (~> 1.2) + i18n (1.7.0) + concurrent-ruby (~> 1.0) + jbuilder (2.9.1) + activesupport (>= 4.2.0) jquery-rails (4.2.2) rails-dom-testing (>= 1, < 3) railties (>= 4.2.0) @@ -76,90 +82,99 @@ GEM listen (3.0.8) rb-fsevent (~> 0.9, >= 0.9.4) rb-inotify (~> 0.9, >= 0.9.7) - loofah (2.0.3) + loofah (2.3.1) + crass (~> 1.0.2) nokogiri (>= 1.5.9) - mail (2.6.4) - mime-types (>= 1.16, < 4) - method_source (0.8.2) - mime-types (3.1) + mail (2.7.1) + mini_mime (>= 0.1.1) + marcel (0.3.3) + mimemagic (~> 0.3.2) + method_source (0.9.2) + mime-types (3.3) mime-types-data (~> 3.2015) - mime-types-data (3.2016.0521) - mini_portile2 (2.1.0) - minitest (5.10.1) - multi_json (1.12.1) + mime-types-data (3.2019.1009) + mimemagic (0.3.3) + mini_mime (1.0.2) + mini_portile2 (2.4.0) + minitest (5.13.0) multi_xml (0.6.0) - nio4r (1.2.1) - nokogiri (1.7.0.1) - mini_portile2 (~> 2.1.0) + newrelic_rpm (6.7.0.359) + nio4r (2.5.2) + nokogiri (1.10.5) + mini_portile2 (~> 2.4.0) pg (0.19.0) - puma (3.6.2) - rack (2.0.1) - rack-test (0.6.3) - rack (>= 1.0) - rails (5.0.1) - actioncable (= 5.0.1) - actionmailer (= 5.0.1) - actionpack (= 5.0.1) - actionview (= 5.0.1) - activejob (= 5.0.1) - activemodel (= 5.0.1) - activerecord (= 5.0.1) - activesupport (= 5.0.1) - bundler (>= 1.3.0, < 2.0) - railties (= 5.0.1) + puma (3.12.1) + rack (2.0.7) + rack-test (1.1.0) + rack (>= 1.0, < 3) + rails (5.2.3) + actioncable (= 5.2.3) + actionmailer (= 5.2.3) + actionpack (= 5.2.3) + actionview (= 5.2.3) + activejob (= 5.2.3) + activemodel (= 5.2.3) + activerecord (= 5.2.3) + activestorage (= 5.2.3) + activesupport (= 5.2.3) + bundler (>= 1.3.0) + railties (= 5.2.3) sprockets-rails (>= 2.0.0) - rails-dom-testing (2.0.2) - activesupport (>= 4.2.0, < 6.0) - nokogiri (~> 1.6) - rails-html-sanitizer (1.0.3) - loofah (~> 2.0) - railties (5.0.1) - actionpack (= 5.0.1) - activesupport (= 5.0.1) + rails-dom-testing (2.0.3) + activesupport (>= 4.2.0) + nokogiri (>= 1.6) + rails-html-sanitizer (1.3.0) + loofah (~> 2.3) + railties (5.2.3) + actionpack (= 5.2.3) + activesupport (= 5.2.3) method_source rake (>= 0.8.7) - thor (>= 0.18.1, < 2.0) - rake (12.0.0) - rb-fsevent (0.9.8) - rb-inotify (0.9.7) - ffi (>= 0.5.0) - sass (3.4.23) - sass-rails (5.0.6) - railties (>= 4.0.0, < 6) + thor (>= 0.19.0, < 2.0) + rake (13.0.1) + 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.1.0) + railties (>= 5.2.0) sass (~> 3.1) sprockets (>= 2.8, < 4.0) sprockets-rails (>= 2.0, < 4.0) tilt (>= 1.1, < 3) - spring (2.0.0) - activesupport (>= 4.2) + spring (2.1.0) spring-watcher-listen (2.0.1) listen (>= 2.7, < 4.0) spring (>= 1.2, < 3.0) - sprockets (3.7.1) + sprockets (3.7.2) concurrent-ruby (~> 1.0) rack (> 1, < 3) - sprockets-rails (3.2.0) + sprockets-rails (3.2.1) actionpack (>= 4.0) activesupport (>= 4.0) sprockets (>= 3.0.0) - thor (0.19.4) - thread_safe (0.3.5) - tilt (2.0.5) - turbolinks (5.0.1) - turbolinks-source (~> 5) - turbolinks-source (5.0.0) - tzinfo (1.2.2) + thor (0.20.3) + thread_safe (0.3.6) + tilt (2.0.10) + turbolinks (5.2.1) + turbolinks-source (~> 5.2) + turbolinks-source (5.2.0) + tzinfo (1.2.5) thread_safe (~> 0.1) - uglifier (3.0.4) + uglifier (4.2.0) execjs (>= 0.3.0, < 3) - web-console (3.4.0) + web-console (3.7.0) actionview (>= 5.0) activemodel (>= 5.0) - debug_inspector + bindex (>= 0.4.0) railties (>= 5.0) - websocket-driver (0.6.4) + websocket-driver (0.7.1) websocket-extensions (>= 0.1.0) - websocket-extensions (0.1.2) + websocket-extensions (0.1.4) PLATFORMS ruby @@ -173,15 +188,15 @@ DEPENDENCIES jbuilder (~> 2.5) jquery-rails (~> 4.2.2) listen (~> 3.0.5) + newrelic_rpm nokogiri pg (~> 0.19.0) - puma (~> 3.0) - rails (~> 5.0.1) + puma (~> 3.12.1) + rails (~> 5.2.0) sass-rails (~> 5.0) spring (~> 2.0) spring-watcher-listen (~> 2.0.0) turbolinks (~> 5) - tzinfo-data uglifier (>= 1.3.0) web-console (>= 3.3.0) diff --git a/README.md b/README.md index c26b20b..07ee0db 100644 --- a/README.md +++ b/README.md @@ -10,8 +10,8 @@ Malaysia prayer times (waktu solat) JSON API @ E-Solat API. Data from [JAKIM's E ## About -- Built with Ruby (2.3.1) on Rails (5.0.1) -- Deployed on Heroku on midnight of 01 Feb 2017 +- Built with Ruby (2.4.2) on Rails (5.2.3) +- First deployed on Heroku on midnight of 01 Feb 2017 - Data updates every midnight ## Documentation @@ -24,41 +24,18 @@ Malaysia prayer times (waktu solat) JSON API @ E-Solat API. Data from [JAKIM's E 2. https://waktu-solat-api.herokuapp.com/api/v1/zones.json 3. https://waktu-solat-api.herokuapp.com/api/v1/states.json -## Changelogs +## Future Improvements -**v1.2.3 - 07/04/2019** -- Resolve minor issue - -**v1.2.2 - 06/04/2019** -- Resolve minor issue - -**v1.2.1 - 04/01/2019** -- Resolve minor issue - -**v1.2.0 - 04/01/2019** -- Added v2 scraper to scrape from e-solat's new format - -**v1.1.0 - 02/09/2018** -- Added backup scraper to scrape from a backup source - -**v1.0.1 - 15/01/2018** -- Modify sanitiser to offset incorrect prayer times - -**v1.0.0 - 01/02/2017** -- Initial API Release - -## Improvements - -- Pagination for `/prayer_times.json` +- [ ] Pagination for `/prayer_times.json` ## Contributing -Do fork this project and improve where you see fit. Submit your Pull Request for merge review. +Do fork this project and improve where you see fit. Submit your Pull Request for merge review. Use the [prepare repository](https://github.com/zaimramlan/waktu-solat-api#prepare-repository) section to help setup the repo on your local environment. ## Prepare Repository -Clone the repo and install the dependencies +Clone the repo and install the dependencies ``` bash $ git clone https://github.com/zaimramlan/waktu-solat-api.git @@ -66,19 +43,19 @@ $ cd waktu-solat-api $ bundle install ``` -Set up the database +Set up the database ``` bash $ rake db:create db:migrate ``` -Download the list of states, zones and prayer times +Download the list of states, zones and prayer times ``` bash $ rake esolat:v2:scrapezones esolat:v2:scrapetimes ``` -Run the Server +Run the Server ``` bash $ rails server diff --git a/app/models/state.rb b/app/models/state.rb index 09022a3..6fb0165 100644 --- a/app/models/state.rb +++ b/app/models/state.rb @@ -3,7 +3,7 @@ class State < ApplicationRecord def self.details array = Array.new - states = State.all + states = State.all.includes(:zones) states.each {|state| data = {name: state.name, zones: state.zones}; array.push(data)} array diff --git a/config/application.yml b/config/application.yml index a272dbd..ddb73a3 100644 --- a/config/application.yml +++ b/config/application.yml @@ -2,3 +2,4 @@ BACKUP_ZONE_URL: '' BACKUP_PRAYER_TIMES_URL: '' MAIN_ZONE_URL: '' MAIN_PRAYER_TIMES_URL: '' +NEW_RELIC_LICENSE_KEY: '' diff --git a/config/initializers/new_framework_defaults.rb b/config/initializers/new_framework_defaults.rb index 671abb6..dec6272 100644 --- a/config/initializers/new_framework_defaults.rb +++ b/config/initializers/new_framework_defaults.rb @@ -17,8 +17,5 @@ # Require `belongs_to` associations by default. Previous versions had false. Rails.application.config.active_record.belongs_to_required_by_default = true -# Do not halt callback chains when a callback returns false. Previous versions had true. -ActiveSupport.halt_callback_chains_on_return_false = false - # Configure SSL options to enable HSTS with subdomains. Previous versions had false. Rails.application.config.ssl_options = { hsts: { subdomains: true } } diff --git a/config/newrelic.yml b/config/newrelic.yml new file mode 100644 index 0000000..b67633e --- /dev/null +++ b/config/newrelic.yml @@ -0,0 +1,19 @@ +common: &default_settings + license_key: <%= ENV['NEW_RELIC_LICENSE_KEY'] %> + app_name: Waktu Solat API + log_level: info + +development: + <<: *default_settings + app_name: Waktu Solat API (Development) + +test: + <<: *default_settings + monitor_mode: false + +staging: + <<: *default_settings + app_name: Waktu Solat API (Staging) + +production: + <<: *default_settings diff --git a/db/schema.rb b/db/schema.rb index 2bcee87..914d2f3 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,35 +10,35 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20170114094404) do +ActiveRecord::Schema.define(version: 2017_01_14_094404) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" - create_table "prayer_times", force: :cascade do |t| - t.string "name" - t.string "time" + create_table "prayer_times", id: :serial, force: :cascade do |t| + t.string "name" + t.string "time" t.datetime "created_at", null: false t.datetime "updated_at", null: false end - create_table "prayer_times_zones", force: :cascade do |t| + create_table "prayer_times_zones", id: :serial, force: :cascade do |t| t.integer "zone_id" t.integer "prayer_time_id" - t.index ["prayer_time_id"], name: "index_prayer_times_zones_on_prayer_time_id", using: :btree - t.index ["zone_id"], name: "index_prayer_times_zones_on_zone_id", using: :btree + t.index ["prayer_time_id"], name: "index_prayer_times_zones_on_prayer_time_id" + t.index ["zone_id"], name: "index_prayer_times_zones_on_zone_id" end - create_table "states", force: :cascade do |t| - t.string "name" + create_table "states", id: :serial, force: :cascade do |t| + t.string "name" t.datetime "created_at", null: false t.datetime "updated_at", null: false end - create_table "zones", force: :cascade do |t| - t.string "name" - t.integer "state_id" - t.string "code" + create_table "zones", id: :serial, force: :cascade do |t| + t.string "name" + t.integer "state_id" + t.string "code" t.datetime "created_at", null: false t.datetime "updated_at", null: false end