diff --git a/.env.development.sample b/.env.development.sample index 6e97883..7c45d80 100644 --- a/.env.development.sample +++ b/.env.development.sample @@ -3,3 +3,4 @@ DATABASE_URL="postgresql://username:password@localhost/omniscrapper_hq_developme SERVE_STATIC_ASSETS="true" WEB_SESSIONS_SECRET="00bdb001d8f18ee8e8e4b7d063877243348fa8cb2c3879a52052c33871f09228" API_SESSIONS_SECRET="985f2d9f9d1f729e3204d011354792a148e548f599b3554b2bedc591949240d0" +SCHEDULER_API=http://localhost:2301/api/graphql diff --git a/Gemfile b/Gemfile index 9b8a871..e92cd00 100644 --- a/Gemfile +++ b/Gemfile @@ -28,6 +28,7 @@ gem 'dry-validation' gem 'graphql' gem 'sidekiq' +gem 'graphql-client' gem 'json-schema' gem 'pagy', '~> 3.6.0' diff --git a/Gemfile.lock b/Gemfile.lock index 12044ae..6ae359c 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -130,6 +130,9 @@ GEM websocket-driver (>= 0.6, < 0.8) ffi (1.11.1) graphql (1.9.15) + graphql-client (0.16.0) + activesupport (>= 3.0) + graphql (~> 1.8) haml (5.0.4) temple (>= 0.8.0) tilt @@ -374,6 +377,7 @@ DEPENDENCIES dry-system-hanami! dry-validation graphql + graphql-client haml hanami (~> 1.3) hanami-fabrication diff --git a/apps/web/config/routes.rb b/apps/web/config/routes.rb index bae6a5d..e08fa6e 100644 --- a/apps/web/config/routes.rb +++ b/apps/web/config/routes.rb @@ -12,3 +12,4 @@ end end resources :outputs, only: [:index, :new, :create] +resources :schedules, only: [:index] diff --git a/apps/web/controllers/schedules/index.rb b/apps/web/controllers/schedules/index.rb new file mode 100644 index 0000000..a6b3b05 --- /dev/null +++ b/apps/web/controllers/schedules/index.rb @@ -0,0 +1,18 @@ +module Web + module Controllers + module Schedules + class Index + include Web::Action + include Import[ + operation: 'operations.schedule.index' + ] + + expose :schedules + + def call(_) + @schedules = operation.call + end + end + end + end +end diff --git a/apps/web/templates/schedules/index.html.haml b/apps/web/templates/schedules/index.html.haml new file mode 100644 index 0000000..e41cea8 --- /dev/null +++ b/apps/web/templates/schedules/index.html.haml @@ -0,0 +1,17 @@ +%table.table.table-bordered.table-hover.table-sm + %thead + %tr + %th Name + %th Task + %th Frequency + %th + %tbody + - schedules.each do |event| + %tr + %td= schedule.name + %td= schedule.task_id + %td= schedule.frequency + %td + = edit_button("#") + = remove_button("#") + diff --git a/apps/web/templates/shared/_navbar.html.haml b/apps/web/templates/shared/_navbar.html.haml index d8a6da5..d8b3a2b 100644 --- a/apps/web/templates/shared/_navbar.html.haml +++ b/apps/web/templates/shared/_navbar.html.haml @@ -15,6 +15,8 @@ = link_to 'Outputs', routes.outputs_path, class: 'nav-link' %li.nav-item = link_to 'Tasks', routes.tasks_path, class: 'nav-link' + %li.nav-item + = link_to 'Schedules', routes.schedules_path, class: 'nav-link' %li.nav-item = link_to 'Results', routes.test_results_path, class: 'nav-link' %li.nav-item diff --git a/apps/web/views/schedules/index.rb b/apps/web/views/schedules/index.rb new file mode 100644 index 0000000..3f5614e --- /dev/null +++ b/apps/web/views/schedules/index.rb @@ -0,0 +1,9 @@ +module Web + module Views + module Schedules + class Index + include Web::View + end + end + end +end diff --git a/lib/omniscrapper_hq/entities/event.rb b/lib/omniscrapper_hq/entities/event.rb new file mode 100644 index 0000000..476c8ea --- /dev/null +++ b/lib/omniscrapper_hq/entities/event.rb @@ -0,0 +1,15 @@ +class Event + attr_reader :id, :name, :task_id, :frequency_period, :frequency_quantity + + def initialize(id:, name:, task_id:, frequency_period:, frequency_quantity:) + @id = id + @name = name + @task_id = task_id + @frequency_period = frequency_period + @frequency_quantity = frequency_quantity + end + + def frequency + "#{frequency_quantity} #{frequency_period}" + end +end diff --git a/lib/omniscrapper_hq/operations/schedule/index.rb b/lib/omniscrapper_hq/operations/schedule/index.rb new file mode 100644 index 0000000..cdf03a9 --- /dev/null +++ b/lib/omniscrapper_hq/operations/schedule/index.rb @@ -0,0 +1,32 @@ +module Operations + module Schedule + class Index < Base + GRAPHQL_CLIENT ||= System::Container['omniscrapper.graphql_client'] + + Query ||= GRAPHQL_CLIENT.parse <<-'GRAPHQL' + query { + events { + id, + name, + taskId, + frequencyPeriod, + frequencyQuantity + } + } + GRAPHQL + + def call + results = GRAPHQL_CLIENT.query(Query) + results.data.events.map do |event| + ::Event.new( + id: event.id, + name: event.name, + task_id: event.task_id, + frequency_quantity: event.frequency_quantity, + frequency_period: event.frequency_period + ) + end + end + end + end +end diff --git a/spec/web/controllers/events/index_spec.rb b/spec/web/controllers/events/index_spec.rb new file mode 100644 index 0000000..9a559ba --- /dev/null +++ b/spec/web/controllers/events/index_spec.rb @@ -0,0 +1,9 @@ +RSpec.describe Web::Controllers::Events::Index, type: :action do + let(:action) { described_class.new } + let(:params) { Hash[] } + + it 'is successful' do + response = action.call(params) + expect(response[0]).to eq 200 + end +end diff --git a/spec/web/views/events/index_spec.rb b/spec/web/views/events/index_spec.rb new file mode 100644 index 0000000..f897401 --- /dev/null +++ b/spec/web/views/events/index_spec.rb @@ -0,0 +1,10 @@ +RSpec.describe Web::Views::Events::Index, type: :view do + let(:exposures) { Hash[format: :html] } + let(:template) { Hanami::View::Template.new('apps/web/templates/events/index.html.erb') } + let(:view) { described_class.new(template, exposures) } + let(:rendered) { view.render } + + it 'exposes #format' do + expect(view.format).to eq exposures.fetch(:format) + end +end diff --git a/system/container.rb b/system/container.rb index de3ee25..dff6269 100644 --- a/system/container.rb +++ b/system/container.rb @@ -1,5 +1,7 @@ require 'dry/system/container' require 'dry/system/hanami' +require 'graphql/client' +require 'graphql/client/http' module System class Container < Dry::System::Container @@ -16,5 +18,11 @@ class Container < Dry::System::Container register 'omniscrapper.root' do OmniScrapper end + + register 'omniscrapper.graphql_client' do + http = GraphQL::Client::HTTP.new(ENV['SCHEDULER_API']) + schema = GraphQL::Client.load_schema(http) + GraphQL::Client.new(schema: schema, execute: http) + end end end