Class: Identizer::IdentityStore::ConfigStore

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

Overview

Default store: an LDAP-flavoured directory persisted to a JSON file the web admin writes, seeded from in-code DirectoryEntry seeds until the file fills.

Instance Method Summary collapse

Constructor Details

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

Returns a new instance of ConfigStore.



18
19
20
21
22
# File 'lib/identizer/identity_store.rb', line 18

def initialize(path:, seed: [], base_dn: DirectoryEntry::DEFAULT_BASE_DN)
  @path = path
  @base_dn = base_dn
  @seed = Array(seed).map { |entry| DirectoryEntry.from(entry, base_dn: base_dn) }
end

Instance Method Details

#delete(email) ⇒ Object



51
52
53
54
# File 'lib/identizer/identity_store.rb', line 51

def delete(email)
  email = email.to_s.strip
  write(current_hashes.reject { |hash| hash["mail"] == email })
end

#emailsObject



31
32
33
# File 'lib/identizer/identity_store.rb', line 31

def emails
  entries.map(&:mail)
end

#entriesObject



24
25
26
27
28
29
# File 'lib/identizer/identity_store.rb', line 24

def entries
  hashes = read
  return @seed if hashes.nil? # no usable file yet -> fall back to the seed

  hashes.map { |entry| DirectoryEntry.from(entry, base_dn: @base_dn) }
end

#identity_for(email) ⇒ Object



35
36
37
38
39
40
41
# File 'lib/identizer/identity_store.rb', line 35

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

Create or replace a directory entry, keyed by mail.



44
45
46
47
48
49
# File 'lib/identizer/identity_store.rb', line 44

def upsert(attrs)
  entry = DirectoryEntry.from(attrs, base_dn: @base_dn)
  remaining = current_hashes.reject { |hash| hash["mail"] == entry.mail }
  write(remaining + [entry.to_h])
  entry
end