Class: StoreTasks

Inherits:
Volt::TaskHandler show all
Defined in:
app/volt/tasks/store_tasks.rb

Instance Method Summary collapse

Methods inherited from Volt::TaskHandler

inherited, known_handlers, method_missing, #store

Constructor Details

#initialize(channel = nil, dispatcher = nil) ⇒ StoreTasks

Returns a new instance of StoreTasks.



5
6
7
8
# File 'app/volt/tasks/store_tasks.rb', line 5

def initialize(channel = nil, dispatcher = nil)
  @channel = channel
  @dispatcher = dispatcher
end

Instance Method Details

#dbObject



10
11
12
# File 'app/volt/tasks/store_tasks.rb', line 10

def db
  @@db ||= Volt::DataStore.fetch
end

#delete(collection, id) ⇒ Object



58
59
60
61
62
# File 'app/volt/tasks/store_tasks.rb', line 58

def delete(collection, id)
  db[collection].remove('_id' => id)

  QueryTasks.live_query_pool.updated_collection(collection, @channel)
end

#load_model(collection, path, data) ⇒ Object



14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# File 'app/volt/tasks/store_tasks.rb', line 14

def load_model(collection, path, data)
  model_name = collection.singularize.camelize

  # TODO: Security check to make sure we have a valid model
  # and don't load classes we shouldn't
  begin
    model_class = Object.send(:const_get, model_name)
  rescue NameError => e
    model_class = Volt::Model
  end

  if model_class
    # Load the model, use the Store persistor and set the path
    model = model_class.new(data, persistor: Volt::Persistors::StoreFactory.new(nil), path: path)
    return model
  end

  return nil
end

#save(collection, path, data) ⇒ Object



34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'app/volt/tasks/store_tasks.rb', line 34

def save(collection, path, data)
  data = data.symbolize_keys
  model = load_model(collection, path, data)

  errors = model.errors

  if model.errors.size == 0

    # On the backend, the promise is resolved before its returned, so we can
    # return from within it.
    #
    # Pass the channel as a thread-local so that we don't update the client
    # who sent the update.
    Thread.current['in_channel'] = @channel
    model.persistor.changed do |errors|
      Thread.current['in_channel'] = nil

      return errors
    end
  else
    return errors
  end
end