Fixed services migration, disabled agents after deletion of a service

Dominik Sander 10 ans auparavant
Parent
Commettre
db968e6f4f

+ 11 - 0
app/models/service.rb

@@ -4,9 +4,20 @@ class Service < ActiveRecord::Base
4 4
   serialize :options, Hash
5 5
 
6 6
   belongs_to :user
7
+  has_many :agents
7 8
 
8 9
   validates_presence_of :user_id, :provider, :name, :token
9 10
 
11
+  before_destroy :disable_agents
12
+
13
+  def disable_agents
14
+    self.agents.each do |agent|
15
+      agent.service_id = nil
16
+      agent.disabled = true
17
+      agent.save!(validate: false)
18
+    end
19
+  end
20
+
10 21
   def toggle_availability!
11 22
     self.global = !self.global
12 23
     self.save!

+ 20 - 4
db/migrate/20140525150140_migrate_agents_to_service_authentication.rb

@@ -1,11 +1,27 @@
1 1
 class MigrateAgentsToServiceAuthentication < ActiveRecord::Migration
2
+  def twitter_consumer_key(agent)
3
+    agent.options['consumer_key'].presence || agent.credential('twitter_consumer_key')
4
+  end
5
+
6
+  def twitter_consumer_secret(agent)
7
+    agent.options['consumer_secret'].presence || agent.credential('twitter_consumer_secret')
8
+  end
9
+
10
+  def twitter_oauth_token(agent)
11
+    agent.options['oauth_token'].presence || agent.options['access_key'].presence || agent.credential('twitter_oauth_token')
12
+  end
13
+
14
+  def twitter_oauth_token_secret(agent)
15
+    agent.options['oauth_token_secret'].presence || agent.options['access_secret'].presence || agent.credential('twitter_oauth_token_secret')
16
+  end
17
+
2 18
   def up
3 19
     agents = Agent.where(type: ['Agents::TwitterUserAgent', 'Agents::TwitterStreamAgent', 'Agents::TwitterPublishAgent']).each do |agent|
4 20
       service = agent.user.services.create!(
5 21
         provider: 'twitter',
6 22
         name: "Migrated '#{agent.name}'",
7
-        token: agent.twitter_oauth_token,
8
-        secret: agent.twitter_oauth_token_secret
23
+        token: twitter_oauth_token(agent),
24
+        secret: twitter_oauth_token_secret(agent)
9 25
       )
10 26
       agent.service_id = service.id
11 27
       agent.save!
@@ -15,8 +31,8 @@ class MigrateAgentsToServiceAuthentication < ActiveRecord::Migration
15 31
 
16 32
         Your Twitter agents were successfully migrated. You need to update your .env file and add the following two lines:
17 33
 
18
-        TWITTER_OAUTH_KEY=#{agents.first.twitter_consumer_key}
19
-        TWITTER_OAUTH_SECRET=#{agents.first.twitter_consumer_secret}
34
+        TWITTER_OAUTH_KEY=#{twitter_consumer_key(agents.first)}
35
+        TWITTER_OAUTH_SECRET=#{twitter_consumer_secret(agents.first)}
20 36
 
21 37
 
22 38
       EOF

+ 5 - 0
spec/fixtures/agents.yml

@@ -101,3 +101,8 @@ bob_manual_event_agent:
101 101
   type: Agents::ManualEventAgent
102 102
   user: bob
103 103
   name: "Bob's event testing agent"
104
+
105
+bob_basecamp_agent:
106
+  type: Agents::BasecampAgent
107
+  user: bob
108
+  service: generic

+ 9 - 0
spec/models/service_spec.rb

@@ -14,6 +14,15 @@ describe Service do
14 14
     @service.global.should == false
15 15
   end
16 16
 
17
+  it "disables all agents before beeing destroyed" do
18
+    agent = agents(:bob_basecamp_agent)
19
+    service = agent.service
20
+    service.destroy
21
+    agent.reload
22
+    agent.service_id.should be_nil
23
+    agent.disabled.should be_true
24
+  end
25
+
17 26
   describe "preparing for a request" do
18 27
     before(:each) do
19 28
       @service = services(:generic)