Class: Identizer::IdentityStore::SqliteStore

Inherits:
Object
  • Object
show all
Defined in:
lib/identizer/identity_store/sqlite_store.rb

Overview

Optional SQLite-backed directory. Same interface as ConfigStore, so it drops in via ‘config.identity_store`. Requires the `sqlite3` gem (not a default dependency) — add it to your Gemfile to use this adapter.

require "identizer/identity_store/sqlite_store"
config.identity_store = Identizer::IdentityStore::SqliteStore.new(path: "dev.sqlite3")

Instance Method Summary collapse

Constructor Details

#initialize(path:, base_dn: DirectoryEntry::DEFAULT_BASE_DN, seed: []) ⇒ SqliteStore

Returns a new instance of SqliteStore.



15
16
17
18
19
20
# File 'lib/identizer/identity_store/sqlite_store.rb', line 15

def initialize(path:, base_dn: DirectoryEntry::DEFAULT_BASE_DN, seed: [])
  @base_dn = base_dn
  @db = SQLite3::Database.new(path.to_s)
  @db.execute("CREATE TABLE IF NOT EXISTS entries (mail TEXT PRIMARY KEY, data TEXT NOT NULL)")
  seed_if_empty(Array(seed))
end

Instance Method Details

#delete(email) ⇒ Object



49
50
51
# File 'lib/identizer/identity_store/sqlite_store.rb', line 49

def delete(email)
  @db.execute("DELETE FROM entries WHERE mail = ?", [email.to_s.strip])
end

#emailsObject



28
29
30
# File 'lib/identizer/identity_store/sqlite_store.rb', line 28

def emails
  entries.map(&:mail)
end

#entriesObject



22
23
24
25
26
# File 'lib/identizer/identity_store/sqlite_store.rb', line 22

def entries
  @db.execute("SELECT data FROM entries ORDER BY mail").map do |row|
    DirectoryEntry.from(JSON.parse(row[0]), base_dn: @base_dn)
  end
end

#identity_for(email) ⇒ Object



32
33
34
35
36
37
38
# File 'lib/identizer/identity_store/sqlite_store.rb', line 32

def identity_for(email)
  email = email.to_s.strip
  return nil if email.empty?

  entry = entries.find { |candidate| candidate.mail == email }
  (entry || DirectoryEntry.from({ "mail" => email }, base_dn: @base_dn)).to_identity
end

#upsert(attrs) ⇒ Object



40
41
42
43
44
45
46
47
# File 'lib/identizer/identity_store/sqlite_store.rb', line 40

def upsert(attrs)
  entry = DirectoryEntry.from(attrs, base_dn: @base_dn)
  @db.execute(<<~SQL, [entry.mail, JSON.generate(entry.to_h)])
    INSERT INTO entries (mail, data) VALUES (?, ?)
    ON CONFLICT(mail) DO UPDATE SET data = excluded.data
  SQL
  entry
end