From c60573954fd596572f77d82b3daee8abd0feafd3 Mon Sep 17 00:00:00 2001 From: Ben Greenberg Date: Tue, 18 May 2021 16:11:17 +0300 Subject: [PATCH] start work on activities --- Gemfile.lock | 13 ++++ bin/pipedrive_orbit | 0 lib/pipedrive_orbit/client.rb | 9 +++ lib/pipedrive_orbit/interactions/activity.rb | 70 ++++++++++++++++++++ lib/pipedrive_orbit/orbit.rb | 9 +++ lib/pipedrive_orbit/pipedrive.rb | 52 +++++++++++++++ pipedrive_orbit.gemspec | 3 +- 7 files changed, 155 insertions(+), 1 deletion(-) mode change 100644 => 100755 bin/pipedrive_orbit create mode 100644 lib/pipedrive_orbit/interactions/activity.rb diff --git a/Gemfile.lock b/Gemfile.lock index 5147801..7b709df 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -2,6 +2,7 @@ PATH remote: . specs: pipedrive_orbit (0.0.1) + activesupport (~> 6.1) dotenv (~> 2.7) http (~> 4.4) json (~> 2.5) @@ -12,10 +13,17 @@ PATH GEM remote: https://rubygems.org/ specs: + activesupport (6.1.3.2) + concurrent-ruby (~> 1.0, >= 1.0.2) + i18n (>= 1.6, < 2) + minitest (>= 5.1) + tzinfo (~> 2.0) + zeitwerk (~> 2.3) addressable (2.7.0) public_suffix (>= 2.0.2, < 5.0) ast (2.4.2) byebug (11.1.3) + concurrent-ruby (1.1.8) crack (0.4.5) rexml diff-lcs (1.4.4) @@ -37,7 +45,10 @@ GEM http-form_data (2.3.0) http-parser (1.2.3) ffi-compiler (>= 1.0, < 2.0) + i18n (1.8.10) + concurrent-ruby (~> 1.0) json (2.5.1) + minitest (5.14.4) orbit_activities (0.0.2) http (~> 4.4) json (~> 2.5) @@ -77,6 +88,8 @@ GEM parser (>= 3.0.1.1) ruby-progressbar (1.11.0) thor (1.1.0) + tzinfo (2.0.4) + concurrent-ruby (~> 1.0) unf (0.1.4) unf_ext unf_ext (0.0.7.7) diff --git a/bin/pipedrive_orbit b/bin/pipedrive_orbit old mode 100644 new mode 100755 diff --git a/lib/pipedrive_orbit/client.rb b/lib/pipedrive_orbit/client.rb index a99b2de..ce803a5 100644 --- a/lib/pipedrive_orbit/client.rb +++ b/lib/pipedrive_orbit/client.rb @@ -47,5 +47,14 @@ def notes orbit_workspace: @orbit_workspace ).process_notes end + + def activities + PipedriveOrbit::Pipedrive.new( + pipedrive_api_key: @pipedrive_api_key, + pipedrive_url: @pipedrive_url, + orbit_api_key: @orbit_api_key, + orbit_workspace: @orbit_workspace + ).process_activities + end end end \ No newline at end of file diff --git a/lib/pipedrive_orbit/interactions/activity.rb b/lib/pipedrive_orbit/interactions/activity.rb new file mode 100644 index 0000000..852754b --- /dev/null +++ b/lib/pipedrive_orbit/interactions/activity.rb @@ -0,0 +1,70 @@ +# frozen_string_literal: true + +require "json" + +module PipedriveOrbit + module Interactions + class Activity + def initialize(activity:, pipedrive_url:, orbit_workspace:, orbit_api_key:) + @activity = activity + @pipedrive_url = pipedrive_url + @orbit_workspace = orbit_workspace + @orbit_api_key = orbit_api_key + + after_initialize! + end + + def after_initialize! + OrbitActivities::Request.new( + api_key: @orbit_api_key, + workspace_id: @orbit_workspace, + user_agent: "community-ruby-pipedrive-orbit/#{PipedriveOrbit::VERSION}", + body: construct_body.to_json + ) + end + + def construct_member + hash = { name: @activity["person_name"] } unless @activity["person_name"].nil? + + return hash unless hash.nil? + + if !@activity["attendees"].nil? + hash = { email: @activity["attendees"][0]["email_address"] } + end + + hash + end + + def construct_body + hash = { + activity: { + activity_type: "pipedrive:activity", + tags: ["channel:pipedrive"], + title: "Added New #{@activity["type"].capitalize} Activity to Pipedrive", + description: construct_description, + occurred_at: @activity["add_time"], + key: @activity["id"], + member: {} + }, + identity: { + source: "pipedrive" + } + } + + hash[:activity][:member].merge!(construct_member) + hash[:activity][:member].merge!(company: @activity["org_name"]) unless @activity["org_name"].nil? + hash[:identity].merge!(construct_member) + + hash + end + + def construct_description + if @activity["note"] + return @activity["note"] + end + + "#{@activity["subject"]} was added by #{@activity["owner_name"]}" + end + end + end +end \ No newline at end of file diff --git a/lib/pipedrive_orbit/orbit.rb b/lib/pipedrive_orbit/orbit.rb index 43567e2..f88430f 100644 --- a/lib/pipedrive_orbit/orbit.rb +++ b/lib/pipedrive_orbit/orbit.rb @@ -11,6 +11,15 @@ def self.call(type:, data:, orbit_workspace:, orbit_api_key:) orbit_api_key: orbit_api_key ) end + + if type == "activity" + PipedriveOrbit::Interactions::Activity.new( + activity: data[:activity], + pipedrive_url: data[:pipedrive_url], + orbit_workspace: orbit_workspace, + orbit_api_key: orbit_api_key + ) + end end end end \ No newline at end of file diff --git a/lib/pipedrive_orbit/pipedrive.rb b/lib/pipedrive_orbit/pipedrive.rb index 4f0375b..a69f03f 100644 --- a/lib/pipedrive_orbit/pipedrive.rb +++ b/lib/pipedrive_orbit/pipedrive.rb @@ -1,5 +1,7 @@ # frozen_string_literal: true +require "active_support/time" + module PipedriveOrbit class Pipedrive def initialize(params = {}) @@ -26,6 +28,56 @@ def process_notes end end + def process_activities + activities = get_activities + + return get_activities["error"] if get_activities["success"] == false + return "No new activities in the past day!" if activities.nil? + + activities["data"].each do |activity| + next if no_member_info(activity) + + PipedriveOrbit::Orbit.call( + type: "activity", + data: { + activity: activity, + pipedrive_url: @pipedrive_url + }, + orbit_workspace: @orbit_workspace, + orbit_api_key: @orbit_api_key + ) + end + end + + def get_activities + url = URI("https://api.pipedrive.com/v1/activities") + url.query = "user_id=0&start_date=#{create_start_date}&end_date=#{create_end_date}&api_token=#{@pipedrive_api_key}" + https = Net::HTTP.new(url.host, url.port) + https.use_ssl = true + + request = Net::HTTP::Get.new(url) + + response = https.request(request) + + response = JSON.parse(response.body) + end + + def no_member_info(activity) + return true if activity["person_name"].nil? && activity["attendees"].nil? + + false + end + + def create_start_date + date = Date.parse(Time.now.utc.to_date.to_s)-1.day + date.strftime("%Y-%m-%d") + end + + def create_end_date + date = Date.parse(Time.now.utc.to_date.to_s) + date.strftime("%Y-%m-%d") + end + def get_notes url = URI("https://api.pipedrive.com/v1/notes") url.query = "sort=add_time DESC&api_token=#{@pipedrive_api_key}" diff --git a/pipedrive_orbit.gemspec b/pipedrive_orbit.gemspec index f7d8f6d..fee7640 100644 --- a/pipedrive_orbit.gemspec +++ b/pipedrive_orbit.gemspec @@ -25,7 +25,8 @@ Gem::Specification.new do |spec| spec.bindir = "bin" spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) } spec.require_paths = ["lib"] - + + spec.add_dependency "activesupport", "~> 6.1" spec.add_dependency "http", "~> 4.4" spec.add_dependency "json", "~> 2.5" spec.add_dependency "zeitwerk", "~> 2.4"