active_metadata 0.2.2 → 0.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,30 @@
1
+ class CreateTestResources < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :documents do |t|
4
+ t.string :name
5
+ t.string :surname
6
+ t.boolean :keep_alive
7
+ t.timestamps
8
+ end
9
+
10
+ create_table :sections do |t|
11
+ t.string :title
12
+ t.integer :document_id
13
+ t.timestamps
14
+ end
15
+
16
+ create_table :users do |t|
17
+ t.string :email
18
+ t.string :firstname
19
+ t.string :lastname
20
+ t.timestamps
21
+ end
22
+
23
+ end
24
+
25
+ def self.down
26
+ drop_table :documents
27
+ drop_table :sections
28
+ drop_table :users
29
+ end
30
+ end
@@ -0,0 +1,71 @@
1
+ class ActiveMetadataMigrations < ActiveRecord::Migration
2
+ def self.up
3
+
4
+ create_table :notes do |t|
5
+ t.text :note
6
+ t.string :label
7
+ t.string :document_class
8
+ t.integer :document_id
9
+ t.integer :created_by
10
+ t.integer :updated_by
11
+ t.timestamps
12
+ end
13
+
14
+ add_index :notes, :document_id
15
+ add_index :notes, :label
16
+ add_index :notes, :updated_at
17
+
18
+ create_table :histories do |t|
19
+ t.text :value
20
+ t.string :label
21
+ t.string :document_class
22
+ t.integer :document_id
23
+ t.integer :created_by
24
+ t.timestamps
25
+ end
26
+
27
+ add_index :histories, :document_id
28
+ add_index :histories, :label
29
+ add_index :histories, :created_at
30
+
31
+ create_table :attachments do |t|
32
+ t.string :label
33
+ t.integer :document_id
34
+ t.string :document_class
35
+ t.integer :created_by
36
+ t.integer :updated_by
37
+ t.integer :counter
38
+ t.string :attach_file_name
39
+ t.string :attach_content_type
40
+ t.integer :attach_file_size
41
+ t.datetime :attach_updated_at
42
+ t.timestamps
43
+ end
44
+
45
+ add_index :attachments, :document_id
46
+ add_index :attachments, :label
47
+ add_index :attachments, :attach_updated_at
48
+
49
+ create_table :watchers do |t|
50
+ t.integer :owner_id
51
+ t.string :label
52
+ t.string :document_class
53
+ t.integer :document_id
54
+ t.timestamps
55
+ end
56
+
57
+ add_index :watchers, :document_id
58
+ add_index :watchers, :label
59
+ add_index :watchers, :owner_id
60
+ add_index :watchers, :created_at
61
+
62
+ end
63
+
64
+ def self.down
65
+ drop_table :notes
66
+ drop_table :histories
67
+ drop_table :attachments
68
+ drop_table :watchers
69
+ end
70
+
71
+ end
data/db/test.sqlite3 CHANGED
Binary file
@@ -2,12 +2,13 @@ module ActiveMetadata
2
2
 
3
3
  CONFIG = File.exists?('config/active_metadata.yml') ? YAML.load_file('config/active_metadata.yml')[Rails.env] : {}
4
4
  CONFIG['cache_expires_in'] ||= 60
5
-
5
+
6
6
  ## Define ModelMethods
7
7
  module Base
8
-
8
+
9
9
  require 'paperclip'
10
10
  require "active_metadata/persistence/persistence"
11
+ require "active_metadata/helpers"
11
12
 
12
13
  def self.included(klass)
13
14
  klass.class_eval do
@@ -19,24 +20,26 @@ module ActiveMetadata
19
20
 
20
21
  def acts_as_metadata *args
21
22
  after_save :save_history
22
-
23
+
23
24
  class_variable_set("@@metadata_id_from", args.empty? ? nil : args[0][:metadata_id_from])
24
25
 
25
26
  include ActiveMetadata::Base::InstanceMethods
26
- include ActiveMetadata::Persistence
27
-
27
+ include ActiveMetadata::Persistence
28
+
28
29
  end
29
30
 
30
31
  end
31
32
 
32
33
  module InstanceMethods
33
-
34
+
35
+ include ActiveMetadata::Helpers
36
+
34
37
  def self.included(klass)
35
- [:notes,:attachments,:history].each do |item|
36
- klass.send(:define_method,"#{item.to_s}_cache_key".to_sym) do |field|
37
- "#{Rails.env}/active_metadata/#{item.to_s}/#{self.class}/#{metadata_id}/#{field}/"
38
- end
39
- end
38
+ [:notes, :attachments, :history].each do |item|
39
+ klass.send(:define_method, "#{item.to_s}_cache_key".to_sym) do |field|
40
+ "#{Rails.env}/active_metadata/#{item.to_s}/#{self.class}/#{metadata_id}/#{field}/"
41
+ end
42
+ end
40
43
  end
41
44
 
42
45
  def metadata_id
@@ -48,16 +51,70 @@ module ActiveMetadata
48
51
  end
49
52
  receiver.id
50
53
  end
51
-
54
+
52
55
  def current_user_id
53
56
  if User.respond_to?(:current) && !User.current.nil?
54
- User.current.id
57
+ User.current.id
55
58
  else
56
59
  nil
57
- end
58
- end
59
-
60
+ end
61
+ end
62
+
63
+ # Resolve concurrency using the passed timestamps and the active_metadata histories
64
+ # To be called from controller before updating the model. Params that contains a conflict are removed from the params list.
65
+ # Returns 2 values containing the the deleted params with the related history:
66
+ # [{:key => [passed_value,history]}]
67
+ #
68
+ # first result is the WARNINGS array: conflict appears on a field not touched by the user that submit the value
69
+ # first result is the FATALS Array : if the conflict appears on a field modified by the user that submit the value
70
+ # an empty array is returned by default
71
+ def manage_concurrency(params, timestamp)
72
+ warnings = []
73
+ fatals = []
74
+
75
+ # scan params
76
+ params.each do |key, val|
77
+ # ensure the query order
78
+ histories = history_for key.to_sym, "created_at DESC"
79
+ latest_history = histories.first
80
+
81
+ # if form timestamp is subsequent the history last change go on
82
+ # if history does not exists yet go on
83
+ next if latest_history.nil? || timestamp > latest_history.created_at
84
+
85
+ #if the timestamp is previous of the last history change
86
+ if timestamp < latest_history.created_at
87
+ #remove the key from the update process
88
+ params.delete key
89
+
90
+ # We have a conflict.
91
+ # Check if the actual submission has been modified
92
+ histories.each do |h|
93
+ # Looking for the value that was loaded by the user. First history with a ts that is younger than the form ts
94
+ next if timestamp > h.created_at
95
+
96
+ # History stores values as strings so any boolean is stored as "0" or "1"
97
+ # We need to translate the params passed for a safer comparison.
98
+ if self.column_for_attribute(key).type == :boolean
99
+ b_val = to_bool(h.value)
100
+ end
101
+
102
+ if [h.value, b_val].include? val
103
+ warnings << {key => [val, h]}
104
+ else
105
+ fatals << {key => [val, h]}
106
+ end
107
+ end
108
+
109
+ end
110
+
111
+ end
112
+
113
+ return warnings, fatals
114
+ end
115
+
60
116
  end # InstanceMethods
117
+
61
118
  end
62
119
 
63
120
  end
@@ -0,0 +1,9 @@
1
+ module ActiveMetadata::Helpers
2
+
3
+ def to_bool str
4
+ return true if str == true || str =~ (/(true|t|yes|y|1)$/i)
5
+ return false if str == false || str.blank? || str =~ (/(false|f|no|n|0)$/i)
6
+ raise ArgumentError.new("invalid value for Boolean: \"#{str}\"")
7
+ end
8
+
9
+ end
@@ -15,9 +15,9 @@ module ActiveMetadata::Persistence::ActiveRecord::History
15
15
  end
16
16
  end
17
17
 
18
- def history_for field
18
+ def history_for field, order="created_at DESC"
19
19
  Rails.cache.fetch(history_cache_key(field), :expires_in => ActiveMetadata::CONFIG['cache_expires_in'].minutes) do
20
- fetch_histories_for field
20
+ fetch_histories_for field, order
21
21
  end
22
22
  end
23
23
 
@@ -27,8 +27,8 @@ module ActiveMetadata::Persistence::ActiveRecord::History
27
27
  Rails.cache.delete history_cache_key(field)
28
28
  end
29
29
 
30
- def fetch_histories_for field
31
- History.all(:conditions => {:document_id => metadata_id,:label => field}, :order => "created_at DESC")
30
+ def fetch_histories_for field, order
31
+ History.all(:conditions => {:document_id => metadata_id,:label => field}, :order => order)
32
32
  end
33
33
 
34
34
 
@@ -1,3 +1,3 @@
1
1
  module ActiveMetadata
2
- VERSION = "0.2.2"
2
+ VERSION = "0.2.3"
3
3
  end
@@ -0,0 +1,105 @@
1
+ require "spec_helper"
2
+
3
+ describe "Manage Concurrency" do
4
+
5
+ before(:each) do
6
+ @document = Document.create! { |d| d.name = "John" }
7
+ @document.reload
8
+ end
9
+
10
+ describe "when a field is modified and the form ts is subsequent of the history ts" do
11
+
12
+ it "should save the new value and history must be updated with the latest change" do
13
+ sleep 0.2.seconds
14
+
15
+ params = {:name => "nuovo nome"}
16
+ warn,fatal = @document.manage_concurrency params,Time.now
17
+ @document.update_attributes(params)
18
+
19
+ warn.should be_empty
20
+ fatal.should be_empty
21
+ hs = @document.history_for(:name)
22
+ hs.count.should eq 2
23
+ hs.first.value.should eq "nuovo nome"
24
+ Document.last.name.should eq "nuovo nome"
25
+ end
26
+
27
+ end
28
+
29
+ describe "when a field is modified and the form ts is preceding the history ts" do
30
+
31
+ it "should not change the model value and the history if the newest history value is equal to the submitted once, param should be retuned as warning" do
32
+ form_timestamp = Time.now
33
+ params = {:name => "nuovo nome"}
34
+
35
+ #someone change the field value
36
+ sleep 0.2.seconds
37
+ warn,fatal = @document.manage_concurrency params,Time.now
38
+ @document.update_attributes(params)
39
+
40
+ # user submit pushing the same value that was already saved by another user
41
+ sleep 0.2.seconds
42
+ warn,fatal = @document.manage_concurrency params,form_timestamp
43
+ @document.update_attributes(params)
44
+
45
+ warn.size.should eq 1
46
+ warn[0][:name][0].should eq "nuovo nome"
47
+ fatal.should be_empty
48
+ hs = @document.history_for(:name)
49
+ #last change shoudl not be recorded in history
50
+ hs.count.should eq 2
51
+ hs.first.value.should eq "nuovo nome"
52
+ Document.last.name.should eq "nuovo nome"
53
+
54
+ end
55
+
56
+ it "should reject the change if the history newest value is different from the submitted once, param should be returned as fatal" do
57
+ form_timestamp = Time.now
58
+ params = {:name => "nuovo nome"}
59
+
60
+ #someone change the field value
61
+ sleep 0.2.seconds
62
+ warn,fatal = @document.manage_concurrency params,Time.now
63
+ @document.update_attributes(params)
64
+
65
+ # user submit a new value
66
+ sleep 0.2.seconds
67
+ different_params = {:name => "altro nome"}
68
+ warn,fatal = @document.manage_concurrency different_params,form_timestamp
69
+ @document.update_attributes(different_params)
70
+
71
+ fatal.size.should eq 1
72
+ fatal[0][:name][0].should eq "altro nome"
73
+ warn.should be_empty
74
+ hs = @document.history_for(:name)
75
+ #last change shoudl not be recorded in history
76
+ hs.count.should eq 2
77
+ hs.first.value.should eq "nuovo nome"
78
+ Document.last.name.should eq "nuovo nome"
79
+
80
+ end
81
+
82
+ it "should return both fatals and warnings if required" do
83
+ form_timestamp = Time.now
84
+ params = {:name => "nuovo nome", :keep_alive => false}
85
+
86
+ #someone change the field value
87
+ sleep 0.2.seconds
88
+ warn,fatal = @document.manage_concurrency params,Time.now
89
+ @document.update_attributes(params)
90
+
91
+ # user submit a new value
92
+ sleep 0.2.seconds
93
+ different_params = {:name => "altro nome", :keep_alive => false}
94
+ warn,fatal = @document.manage_concurrency different_params,form_timestamp
95
+ @document.update_attributes(different_params)
96
+
97
+ fatal.size.should eq 1
98
+ fatal[0][:name][0].should eq "altro nome"
99
+ warn.size.should eq 1
100
+ warn[0][:keep_alive][0].should eq false
101
+ end
102
+
103
+ end
104
+
105
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active_metadata
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.2
4
+ version: 0.2.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,11 +10,11 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2011-10-13 00:00:00.000000000Z
13
+ date: 2011-10-19 00:00:00.000000000Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rspec-rails
17
- requirement: &2170647660 !ruby/object:Gem::Requirement
17
+ requirement: &2168675080 !ruby/object:Gem::Requirement
18
18
  none: false
19
19
  requirements:
20
20
  - - ! '>='
@@ -22,10 +22,10 @@ dependencies:
22
22
  version: '0'
23
23
  type: :development
24
24
  prerelease: false
25
- version_requirements: *2170647660
25
+ version_requirements: *2168675080
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: sqlite3
28
- requirement: &2170646500 !ruby/object:Gem::Requirement
28
+ requirement: &2168674400 !ruby/object:Gem::Requirement
29
29
  none: false
30
30
  requirements:
31
31
  - - ! '>='
@@ -33,10 +33,10 @@ dependencies:
33
33
  version: '0'
34
34
  type: :development
35
35
  prerelease: false
36
- version_requirements: *2170646500
36
+ version_requirements: *2168674400
37
37
  - !ruby/object:Gem::Dependency
38
38
  name: sqlite3-ruby
39
- requirement: &2170645220 !ruby/object:Gem::Requirement
39
+ requirement: &2168673660 !ruby/object:Gem::Requirement
40
40
  none: false
41
41
  requirements:
42
42
  - - ! '>='
@@ -44,10 +44,10 @@ dependencies:
44
44
  version: '0'
45
45
  type: :development
46
46
  prerelease: false
47
- version_requirements: *2170645220
47
+ version_requirements: *2168673660
48
48
  - !ruby/object:Gem::Dependency
49
49
  name: cucumber
50
- requirement: &2170640380 !ruby/object:Gem::Requirement
50
+ requirement: &2168672720 !ruby/object:Gem::Requirement
51
51
  none: false
52
52
  requirements:
53
53
  - - ! '>='
@@ -55,10 +55,10 @@ dependencies:
55
55
  version: '0'
56
56
  type: :development
57
57
  prerelease: false
58
- version_requirements: *2170640380
58
+ version_requirements: *2168672720
59
59
  - !ruby/object:Gem::Dependency
60
60
  name: ci_reporter
61
- requirement: &2170639580 !ruby/object:Gem::Requirement
61
+ requirement: &2168672140 !ruby/object:Gem::Requirement
62
62
  none: false
63
63
  requirements:
64
64
  - - ! '>='
@@ -66,10 +66,10 @@ dependencies:
66
66
  version: '0'
67
67
  type: :development
68
68
  prerelease: false
69
- version_requirements: *2170639580
69
+ version_requirements: *2168672140
70
70
  - !ruby/object:Gem::Dependency
71
71
  name: rails
72
- requirement: &2170638800 !ruby/object:Gem::Requirement
72
+ requirement: &2168671320 !ruby/object:Gem::Requirement
73
73
  none: false
74
74
  requirements:
75
75
  - - =
@@ -77,10 +77,10 @@ dependencies:
77
77
  version: 3.0.1
78
78
  type: :runtime
79
79
  prerelease: false
80
- version_requirements: *2170638800
80
+ version_requirements: *2168671320
81
81
  - !ruby/object:Gem::Dependency
82
82
  name: activerecord
83
- requirement: &2170638040 !ruby/object:Gem::Requirement
83
+ requirement: &2168670740 !ruby/object:Gem::Requirement
84
84
  none: false
85
85
  requirements:
86
86
  - - =
@@ -88,10 +88,10 @@ dependencies:
88
88
  version: 3.0.1
89
89
  type: :runtime
90
90
  prerelease: false
91
- version_requirements: *2170638040
91
+ version_requirements: *2168670740
92
92
  - !ruby/object:Gem::Dependency
93
93
  name: paperclip
94
- requirement: &2170637440 !ruby/object:Gem::Requirement
94
+ requirement: &2168670280 !ruby/object:Gem::Requirement
95
95
  none: false
96
96
  requirements:
97
97
  - - ! '>='
@@ -99,10 +99,10 @@ dependencies:
99
99
  version: '0'
100
100
  type: :runtime
101
101
  prerelease: false
102
- version_requirements: *2170637440
102
+ version_requirements: *2168670280
103
103
  - !ruby/object:Gem::Dependency
104
104
  name: to_xls
105
- requirement: &2170636980 !ruby/object:Gem::Requirement
105
+ requirement: &2168669560 !ruby/object:Gem::Requirement
106
106
  none: false
107
107
  requirements:
108
108
  - - ! '>='
@@ -110,7 +110,7 @@ dependencies:
110
110
  version: '0'
111
111
  type: :runtime
112
112
  prerelease: false
113
- version_requirements: *2170636980
113
+ version_requirements: *2168669560
114
114
  description: First implementation will write metadata on mongodb
115
115
  email:
116
116
  - acampolonghi@gmail.com
@@ -120,6 +120,7 @@ extensions: []
120
120
  extra_rdoc_files: []
121
121
  files:
122
122
  - lib/active_metadata/base.rb
123
+ - lib/active_metadata/helpers.rb
123
124
  - lib/active_metadata/persistence/active_record/attachment.rb
124
125
  - lib/active_metadata/persistence/active_record/history.rb
125
126
  - lib/active_metadata/persistence/active_record/note.rb
@@ -136,12 +137,6 @@ files:
136
137
  - lib/model/active_record/history.rb
137
138
  - lib/model/active_record/note.rb
138
139
  - lib/model/active_record/watcher.rb
139
- - lib/model/mongoid/active_meta.rb
140
- - lib/model/mongoid/attachment.rb
141
- - lib/model/mongoid/history.rb
142
- - lib/model/mongoid/label.rb
143
- - lib/model/mongoid/note.rb
144
- - lib/model/mongoid/watcher.rb
145
140
  - lib/rails/railties/tasks.rake
146
141
  - lib/rake/active_record_tasks.rb
147
142
  - lib/rake/task.rb
@@ -169,18 +164,8 @@ files:
169
164
  - config/initializers/inflections.rb
170
165
  - config/mongoid.yml
171
166
  - config/routes.rb
172
- - db/development.sqlite3
173
- - db/migrate/001_create_document.rb
174
- - db/migrate/002_add_surname_to_document.rb
175
- - db/migrate/003_create_section.rb
176
- - db/migrate/004_create_user.rb
177
- - db/migrate/005_create_inboxes.rb
178
- - db/migrate/006_create_alert_message.rb
179
- - db/migrate/007_create_notes.rb
180
- - db/migrate/008_create_history.rb
181
- - db/migrate/009_create_watcher.rb
182
- - db/migrate/010_create_attachment.rb
183
- - db/migrate/011_add_created_by_to_histories.rb
167
+ - db/migrate/01_create_test_resources.rb
168
+ - db/migrate/02_active_metadata_migrations.rb
184
169
  - db/test.sqlite3
185
170
  - features/step_definitions/add_a_user_to_a_watcher_steps.rb
186
171
  - features/step_definitions/trigger_alert_on_modify_steps.rb
@@ -191,6 +176,7 @@ files:
191
176
  - features/watchlist/trigger_alert_on_modify.feature
192
177
  - spec/active_metadata_spec.rb
193
178
  - spec/benchmark_spec.rb
179
+ - spec/concurrency_spec.rb
194
180
  - spec/controllers/metadata_controller_spec.rb
195
181
  - spec/spec_helper.rb
196
182
  - spec/support/document.rb
@@ -233,6 +219,7 @@ test_files:
233
219
  - features/watchlist/trigger_alert_on_modify.feature
234
220
  - spec/active_metadata_spec.rb
235
221
  - spec/benchmark_spec.rb
222
+ - spec/concurrency_spec.rb
236
223
  - spec/controllers/metadata_controller_spec.rb
237
224
  - spec/spec_helper.rb
238
225
  - spec/support/document.rb
Binary file
@@ -1,12 +0,0 @@
1
- class CreateDocument < ActiveRecord::Migration
2
- def self.up
3
- create_table :documents do |t|
4
- t.string :name
5
- t.timestamps
6
- end
7
- end
8
-
9
- def self.down
10
- drop_table :documents
11
- end
12
- end
@@ -1,9 +0,0 @@
1
- class AddSurnameToDocument < ActiveRecord::Migration
2
- def self.up
3
- add_column :documents, :surname, :string
4
- end
5
-
6
- def self.down
7
- remove_column :documents, :surname
8
- end
9
- end
@@ -1,13 +0,0 @@
1
- class CreateSection < ActiveRecord::Migration
2
- def self.up
3
- create_table :sections do |t|
4
- t.string :title
5
- t.integer :document_id
6
- t.timestamps
7
- end
8
- end
9
-
10
- def self.down
11
- drop_table :sections
12
- end
13
- end
@@ -1,14 +0,0 @@
1
- class CreateUser < ActiveRecord::Migration
2
- def self.up
3
- create_table :users do |t|
4
- t.string :email
5
- t.string :firstname
6
- t.string :lastname
7
- t.timestamps
8
- end
9
- end
10
-
11
- def self.down
12
- drop_table :users
13
- end
14
- end
@@ -1,19 +0,0 @@
1
- class CreateInboxes < ActiveRecord::Migration
2
- def self.up
3
- create_table :inboxes do |t|
4
- t.string :label
5
- t.string :object_class
6
- t.integer :object_id
7
- t.string :alert_type
8
- t.string :old_value
9
- t.string :new_value
10
- t.text :content
11
- t.integer :user_id
12
- t.timestamps
13
- end
14
- end
15
-
16
- def self.down
17
- drop_table :inboxes
18
- end
19
- end
@@ -1,37 +0,0 @@
1
- class CreateAlertMessage < ActiveRecord::Migration
2
- def self.up
3
- drop_table :inboxes
4
-
5
- create_table :inboxes do |t|
6
- t.integer :user_id
7
- end
8
-
9
- create_table :alert_messages do |t|
10
- t.string :label
11
- t.string :model_class
12
- t.integer :model_id
13
- t.string :alert_type
14
- t.text :old_value
15
- t.text :new_value
16
- t.integer :inbox_id
17
- t.boolean :read
18
-
19
- t.timestamps
20
- end
21
- end
22
-
23
- def self.down
24
- drop_table :alert_messages
25
- create_table :inboxes do |t|
26
- t.string :label
27
- t.string :object_class
28
- t.integer :object_id
29
- t.string :alert_type
30
- t.string :old_value
31
- t.string :new_value
32
- t.text :content
33
- t.integer :user_id
34
- t.timestamps
35
- end
36
- end
37
- end
@@ -1,22 +0,0 @@
1
- class CreateNotes < ActiveRecord::Migration
2
- def self.up
3
- create_table :notes do |t|
4
- t.text :note
5
- t.string :label
6
- t.integer :document_id
7
- t.integer :created_by
8
- t.integer :updated_by
9
- t.timestamps
10
- end
11
-
12
- add_index :notes, :document_id
13
- add_index :notes, :label
14
- add_index :notes, :updated_at
15
-
16
- end
17
-
18
- def self.down
19
- drop_table :notes
20
- end
21
-
22
- end
@@ -1,20 +0,0 @@
1
- class CreateHistory < ActiveRecord::Migration
2
- def self.up
3
- create_table :histories do |t|
4
- t.text :value
5
- t.string :label
6
- t.integer :document_id
7
- t.timestamps
8
- end
9
-
10
- add_index :histories, :document_id
11
- add_index :histories, :label
12
- add_index :histories, :created_at
13
-
14
- end
15
-
16
- def self.down
17
- drop_table :histories
18
- end
19
-
20
- end
@@ -1,21 +0,0 @@
1
- class CreateWatcher < ActiveRecord::Migration
2
- def self.up
3
- create_table :watchers do |t|
4
- t.integer :owner_id
5
- t.string :label
6
- t.integer :document_id
7
- t.timestamps
8
- end
9
-
10
- add_index :watchers, :document_id
11
- add_index :watchers, :label
12
- add_index :watchers, :owner_id
13
- add_index :watchers, :created_at
14
-
15
- end
16
-
17
- def self.down
18
- drop_table :watchers
19
- end
20
-
21
- end
@@ -1,26 +0,0 @@
1
- class CreateAttachment < ActiveRecord::Migration
2
- def self.up
3
- create_table :attachments do |t|
4
- t.string :label
5
- t.integer :document_id
6
- t.integer :created_by
7
- t.integer :updated_by
8
- t.integer :counter
9
- t.string :attach_file_name
10
- t.string :attach_content_type
11
- t.integer :attach_file_size
12
- t.datetime :attach_updated_at
13
- t.timestamps
14
- end
15
-
16
- add_index :attachments, :document_id
17
- add_index :attachments, :label
18
- add_index :attachments, :attach_updated_at
19
-
20
- end
21
-
22
- def self.down
23
- drop_table :attachments
24
- end
25
-
26
- end
@@ -1,10 +0,0 @@
1
- class AddCreatedByToHistories < ActiveRecord::Migration
2
- def self.up
3
- add_column :histories, :created_by, :integer
4
- end
5
-
6
- def self.down
7
- remove_column :histories, :created_by
8
- end
9
-
10
- end
@@ -1,6 +0,0 @@
1
- class ActiveMeta
2
- include Mongoid::Document
3
- field :document_id, type: Integer
4
- has_many :labels, :class_name => "Label"
5
- index :document_id
6
- end
@@ -1,25 +0,0 @@
1
- class Attachment
2
- include Mongoid::Document
3
- include Mongoid::Paperclip
4
-
5
- belongs_to :label
6
- has_mongoid_attached_file :attach,
7
- :path => "#{ActiveMetadata::CONFIG['attachment_base_path']}/:document_id/:label/:counter/:basename.:extension",
8
- :url => "#{ActiveMetadata::CONFIG['attachment_base_url']}/:document_id/:label/:counter/:basename.:extension"
9
-
10
- field :created_by, :type => Integer
11
- field :counter, :type => Integer
12
-
13
- Paperclip.interpolates :document_id do |attachment,style|
14
- attachment.instance.label.active_meta.document_id
15
- end
16
-
17
- Paperclip.interpolates :label do |attachment,style|
18
- attachment.instance.label.name
19
- end
20
-
21
- Paperclip.interpolates :counter do |attachment,style|
22
- attachment.instance.counter
23
- end
24
-
25
- end
@@ -1,9 +0,0 @@
1
- class History
2
- include Mongoid::Document
3
- store_in :history
4
-
5
- belongs_to :label
6
-
7
- field :value, :type => String
8
-
9
- end
@@ -1,14 +0,0 @@
1
- class Label
2
- include Mongoid::Document
3
- field :name
4
-
5
- belongs_to :active_meta, :class_name => "ActiveMeta"
6
-
7
- has_many :notes, :class_name => "Note"
8
- has_many :histories, :class_name => "History"
9
- has_many :attachments, :class_name => "Attachment"
10
- has_many :watchers, :class_name => "Watcher"
11
-
12
- index :name
13
-
14
- end
@@ -1,10 +0,0 @@
1
- class Note
2
- include Mongoid::Document
3
- belongs_to :label
4
-
5
- field :note, :type => String
6
- field :updated_by, :type => Integer
7
- field :updated_at, :type => Time
8
-
9
- index :updated_at
10
- end
@@ -1,24 +0,0 @@
1
- class Watcher
2
- include Mongoid::Document
3
-
4
- belongs_to :label
5
-
6
- field :owner_id, :type => Integer
7
-
8
- def notify_changes(matched_label, old_value, new_value, model_class, model_id)
9
- create_inbox_alert(User.find(owner_id).inbox, matched_label, old_value, new_value, model_class, model_id)
10
- end
11
-
12
- def create_inbox_alert(inbox, label, old_value, new_value, model_class, model_id)
13
- Message.create! do |message|
14
- message.label = label
15
- message.model_class = model_class.to_s
16
- message.model_id = model_id
17
- message.alert_type = :model_value_changed
18
- message.old_value = old_value
19
- message.new_value = new_value
20
- message.inbox_id = inbox.id
21
- message.read = false
22
- end
23
- end
24
- end