Module: Plasma::Storage

Defined in:
lib/plasma/storage.rb,
lib/plasma/storage/record.rb,
lib/plasma/storage/variable.rb,
lib/plasma/storage/application_record.rb

Overview

This module handles the storage operations for PLASMA applications

Defined Under Namespace

Classes: ApplicationRecord, Record, Variable

Class Method Summary collapse

Class Method Details

.add_record(fields = {}) ⇒ Object



58
59
60
# File 'lib/plasma/storage.rb', line 58

def self.add_record(fields = {})
  Plasma::Storage::Record.create(data: fields)
end

.define_default_schemaObject

rubocop:disable Metrics/MethodLength



13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# File 'lib/plasma/storage.rb', line 13

def self.define_default_schema
  ActiveRecord::Schema.define(verbose: false) do
    create_table :records do |t|
      t.json :data
      t.timestamps
    end

    create_table :variables, id: false do |t|
      t.string :key, primary_key: true
      t.json :value
    end

    create_table :settings do |t|
      t.string :group, null: false
      t.json :data
      t.timestamps
    end

    add_index :settings, :group, unique: true
  end
end

.dump_to_jsonObject



91
92
93
94
95
96
# File 'lib/plasma/storage.rb', line 91

def self.dump_to_json
  {
    records: find_records,
    variables: Plasma::Storage::Variable.all.pluck(:key, :value).to_h
  }.to_json
end

.establish_connectionObject



41
42
43
44
45
46
47
# File 'lib/plasma/storage.rb', line 41

def self.establish_connection
  ActiveRecord::Base.establish_connection(
    adapter: "sqlite3",
    database: ":memory:"
  )
  ActiveRecord::Migration.verbose = false
end

.find_recordsObject



62
63
64
# File 'lib/plasma/storage.rb', line 62

def self.find_records
  Plasma::Storage::Record.all.map { |r| r.data.merge(id: r.id, created_at: r.created_at) }
end

.find_records_by_field(field, value) ⇒ Object



66
67
68
69
# File 'lib/plasma/storage.rb', line 66

def self.find_records_by_field(field, value)
  Plasma::Storage::Record.all.select { |r| r.data[field.to_s] == value || r.data[field.to_sym] == value }
                         .map { |r| r.data.merge(id: r.id, created_at: r.created_at) }
end

.find_records_with_field(field) ⇒ Object



71
72
73
74
75
# File 'lib/plasma/storage.rb', line 71

def self.find_records_with_field(field)
  records = Plasma::Storage::Record.all
  filtered = records.select { |r| r.data.key?(field.to_s) || r.data.key?(field.to_sym) }
  filtered.map { |r| r.data.merge(id: r.id, created_at: r.created_at) }
end

.get_var(key) ⇒ Object



87
88
89
# File 'lib/plasma/storage.rb', line 87

def self.get_var(key)
  Plasma::Storage::Variable.find_by(key: key)&.value
end

.load_schemaObject



49
50
51
52
53
54
55
56
# File 'lib/plasma/storage.rb', line 49

def self.load_schema
  schema_path = File.join(Dir.pwd, "db", "schema.rb")
  if File.exist?(schema_path)
    load schema_path
  else
    define_default_schema
  end
end

.set_var(key, value) ⇒ Object



83
84
85
# File 'lib/plasma/storage.rb', line 83

def self.set_var(key, value)
  Plasma::Storage::Variable.create_or_find_by(key: key).update(value: value)
end

.setupObject

rubocop:enable Metrics/MethodLength



36
37
38
39
# File 'lib/plasma/storage.rb', line 36

def self.setup
  establish_connection
  load_schema
end

.update_record_field(id, field, value) ⇒ Object



77
78
79
80
81
# File 'lib/plasma/storage.rb', line 77

def self.update_record_field(id, field, value)
  record = Plasma::Storage::Record.find(id)
  record.data[field] = value
  record.save!
end