Class: WatermelonDbSync::SyncPull

Inherits:
Sync
  • Object
show all
Defined in:
lib/watermelon_db_sync/sync_pull.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods inherited from Sync

last_global_seqs, next_global_seqs

Constructor Details

#initialize(params) ⇒ SyncPull

Returns a new instance of SyncPull.



6
7
8
9
10
11
12
# File 'lib/watermelon_db_sync/sync_pull.rb', line 6

def initialize(params)
  @last_pulled_version = params[:last_pulled_version] || 0
  @push_id = params[:push_id]
  @format_response = {created: [], updated: [], deleted: [] }
  @models = WatermelonDbSync.configuration.sync_models
  @data = {last_global_seqs: 0, response: build_default_response}
end

Instance Attribute Details

#dataObject

Returns the value of attribute data.



4
5
6
# File 'lib/watermelon_db_sync/sync_pull.rb', line 4

def data
  @data
end

#last_pulled_versionObject

Returns the value of attribute last_pulled_version.



4
5
6
# File 'lib/watermelon_db_sync/sync_pull.rb', line 4

def last_pulled_version
  @last_pulled_version
end

#modelsObject

Returns the value of attribute models.



4
5
6
# File 'lib/watermelon_db_sync/sync_pull.rb', line 4

def models
  @models
end

Instance Method Details

#build_default_responseObject



58
59
60
61
62
63
64
65
66
# File 'lib/watermelon_db_sync/sync_pull.rb', line 58

def build_default_response
  default = Hash.new { |hash, key| hash[key] = {} }
  @models.each do |model|
    default[eval(model).table_name.to_sym][:created] = {}
    default[eval(model).table_name.to_sym][:deleted] = {}
    default[eval(model).table_name.to_sym][:updated] = {}
  end
  default
end

#get_from_allObject



18
19
20
21
22
23
24
25
26
27
28
29
30
# File 'lib/watermelon_db_sync/sync_pull.rb', line 18

def get_from_all
  begin
    max_list = []
    @models.each do |model|
      max_list << self.query(eval(model))
    end

    @data[:last_global_seqs] = max_list.flatten.max || @last_pulled_version.to_i #Sync.last_global_seqs
    return true
  rescue => e
    e.message
  end
end

#pullObject



14
15
16
# File 'lib/watermelon_db_sync/sync_pull.rb', line 14

def pull
  self.get_from_all
end

#query(model = nil) ⇒ Object

Filtered by push_id, for differentiate record just pushed



33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/watermelon_db_sync/sync_pull.rb', line 33

def query(model=nil)

  all_with_deleted = model.with_deleted.where("version_created > #{@last_pulled_version} OR version > #{@last_pulled_version}")
  max_list = all_with_deleted.pluck(:version, :version_created)

  all_with_deleted = all_with_deleted.where("push_id != ? or push_id is ?", @push_id, nil) if @push_id.present?

  created = all_with_deleted.where(deleted_at_server: nil).where("version_created > #{@last_pulled_version}")

  updated = all_with_deleted.where(deleted_at_server: nil).where("created_at_server != updated_at_server")
  new_updated = []
  updated.each do |obj_updated|
    new_updated << obj_updated unless created.map{|d|d.as_json}.include?(obj_updated.as_json)
  end
  
  deleted = all_with_deleted.only_deleted
  deleted = deleted.pluck(:id)
  
  @data[:response][model.table_name.to_sym][:created] = created&.as_json
  @data[:response][model.table_name.to_sym][:updated] = new_updated&.as_json
  @data[:response][model.table_name.to_sym][:deleted] = deleted&.as_json
  
  max_list
end