Renamed owner_contact to registrant

This commit is contained in:
Priit Tark 2015-04-16 12:23:06 +03:00
parent 92f41ebe0b
commit 8cd3dcf551
21 changed files with 126 additions and 812 deletions

View file

@ -3,7 +3,7 @@ class Admin::DomainsController < AdminController
before_action :set_domain, only: [:show, :edit, :update, :zonefile] before_action :set_domain, only: [:show, :edit, :update, :zonefile]
def index def index
@q = Domain.includes(:registrar, :owner_contact).search(params[:q]) @q = Domain.includes(:registrar, :registrant).search(params[:q])
@domains = @q.result.page(params[:page]) @domains = @q.result.page(params[:page])
end end

View file

@ -156,7 +156,7 @@ class Epp::DomainsController < EppController
def find_domain def find_domain
domain_name = params[:parsed_frame].css('name').text.strip.downcase domain_name = params[:parsed_frame].css('name').text.strip.downcase
@domain = Epp::Domain.where(name: domain_name).includes(owner_contact: :registrar).first @domain = Epp::Domain.where(name: domain_name).includes(registrant: :registrar).first
unless @domain unless @domain
epp_errors << { epp_errors << {

View file

@ -34,7 +34,7 @@ class Epp::KeyrelaysController < EppController
def find_domain def find_domain
domain_name = params[:parsed_frame].css('name').text.strip.downcase domain_name = params[:parsed_frame].css('name').text.strip.downcase
domain = Epp::Domain.includes(:owner_contact).find_by(name: domain_name) domain = Epp::Domain.includes(:registrant).find_by(name: domain_name)
unless domain unless domain
epp_errors << { epp_errors << {

View file

@ -74,7 +74,7 @@ class Contact < ActiveRecord::Base
def find_orphans def find_orphans
Contact.where(' Contact.where('
NOT EXISTS( NOT EXISTS(
select 1 from domains d where d.owner_contact_id = contacts.id select 1 from domains d where d.registrant_id = contacts.id
) AND NOT EXISTS( ) AND NOT EXISTS(
select 1 from domain_contacts dc where dc.contact_id = contacts.id select 1 from domain_contacts dc where dc.contact_id = contacts.id
) )
@ -138,7 +138,7 @@ class Contact < ActiveRecord::Base
# Find a way to use self.domains with contact # Find a way to use self.domains with contact
def domains_owned def domains_owned
Domain.where(owner_contact_id: id) Domain.where(registrant_id: id)
end end
def relations_with_domain? def relations_with_domain?

View file

@ -7,7 +7,7 @@ class Domain < ActiveRecord::Base
paginates_per 10 # just for showoff paginates_per 10 # just for showoff
belongs_to :registrar belongs_to :registrar
belongs_to :owner_contact, class_name: 'Contact' belongs_to :registrant, class_name: 'Contact'
has_many :domain_contacts, dependent: :destroy has_many :domain_contacts, dependent: :destroy
has_many :admin_domain_contacts has_many :admin_domain_contacts
@ -39,10 +39,10 @@ class Domain < ActiveRecord::Base
has_many :legal_documents, as: :documentable has_many :legal_documents, as: :documentable
accepts_nested_attributes_for :legal_documents, reject_if: proc { |attrs| attrs[:body].blank? } accepts_nested_attributes_for :legal_documents, reject_if: proc { |attrs| attrs[:body].blank? }
delegate :code, to: :owner_contact, prefix: true delegate :code, to: :registrant, prefix: true
delegate :email, to: :owner_contact, prefix: true delegate :email, to: :registrant, prefix: true
delegate :ident, to: :owner_contact, prefix: true delegate :ident, to: :registrant, prefix: true
delegate :phone, to: :owner_contact, prefix: true delegate :phone, to: :registrant, prefix: true
delegate :name, to: :registrar, prefix: true delegate :name, to: :registrar, prefix: true
before_create :generate_auth_info before_create :generate_auth_info
@ -57,7 +57,7 @@ class Domain < ActiveRecord::Base
validates :name_dirty, domain_name: true, uniqueness: true validates :name_dirty, domain_name: true, uniqueness: true
validates :period, numericality: { only_integer: true } validates :period, numericality: { only_integer: true }
validates :owner_contact, :registrar, presence: true validates :registrant, :registrar, presence: true
validate :validate_period validate :validate_period
@ -103,7 +103,7 @@ class Domain < ActiveRecord::Base
validate :validate_nameserver_ips validate :validate_nameserver_ips
attr_accessor :owner_contact_typeahead, :update_me attr_accessor :registrant_typeahead, :update_me
def subordinate_nameservers def subordinate_nameservers
nameservers.select { |x| x.hostname.end_with?(name) } nameservers.select { |x| x.hostname.end_with?(name) }
@ -138,8 +138,8 @@ class Domain < ActiveRecord::Base
self[:name_dirty] = value self[:name_dirty] = value
end end
def owner_contact_typeahead def registrant_typeahead
@owner_contact_typeahead || owner_contact.try(:name) || nil @registrant_typeahead || registrant.try(:name) || nil
end end
def pending_transfer def pending_transfer
@ -234,7 +234,7 @@ class Domain < ActiveRecord::Base
log[:admin_contacts] = admin_contacts.map(&:attributes) log[:admin_contacts] = admin_contacts.map(&:attributes)
log[:tech_contacts] = tech_contacts.map(&:attributes) log[:tech_contacts] = tech_contacts.map(&:attributes)
log[:nameservers] = nameservers.map(&:attributes) log[:nameservers] = nameservers.map(&:attributes)
log[:owner_contact] = [owner_contact.try(:attributes)] log[:registrant] = [registrant.try(:attributes)]
log log
end end
@ -244,7 +244,7 @@ class Domain < ActiveRecord::Base
Estonia .ee Top Level Domain WHOIS server Estonia .ee Top Level Domain WHOIS server
domain: #{name} domain: #{name}
registrant: #{owner_contact.name} registrant: #{registrant.name}
status: #{domain_statuses.map(&:value).join(', ')} status: #{domain_statuses.map(&:value).join(', ')}
registered: #{registered_at and registered_at.to_s(:db)} registered: #{registered_at and registered_at.to_s(:db)}
changed: #{updated_at and updated_at.to_s(:db)} changed: #{updated_at and updated_at.to_s(:db)}

View file

@ -24,7 +24,7 @@ class Epp::Domain < Domain
[:base, :domain_status_prohibits_operation] [:base, :domain_status_prohibits_operation]
], ],
'2306' => [ # Parameter policy error '2306' => [ # Parameter policy error
[:owner_contact, :blank], [:registrant, :blank],
[:base, :ds_data_with_key_not_allowed], [:base, :ds_data_with_key_not_allowed],
[:base, :ds_data_not_allowed], [:base, :ds_data_not_allowed],
[:base, :key_data_not_allowed], [:base, :key_data_not_allowed],
@ -68,9 +68,9 @@ class Epp::Domain < Domain
end end
def attach_default_contacts def attach_default_contacts
return if owner_contact.blank? return if registrant.blank?
tech_contacts << owner_contact if tech_contacts.blank? tech_contacts << registrant if tech_contacts.blank?
admin_contacts << owner_contact if admin_contacts.blank? && owner_contact.priv? admin_contacts << registrant if admin_contacts.blank? && registrant.priv?
end end
# rubocop: disable Metrics/PerceivedComplexity # rubocop: disable Metrics/PerceivedComplexity
@ -84,9 +84,9 @@ class Epp::Domain < Domain
oc = Contact.find_by(code: code).try(:id) oc = Contact.find_by(code: code).try(:id)
if oc if oc
at[:owner_contact_id] = oc at[:registrant_id] = oc
else else
add_epp_error('2303', 'registrant', code, [:owner_contact, :not_found]) add_epp_error('2303', 'registrant', code, [:registrant, :not_found])
end end
end end
@ -430,7 +430,7 @@ class Epp::Domain < Domain
# TODO: Eager load problems here. Investigate how it's possible not to query contact again # TODO: Eager load problems here. Investigate how it's possible not to query contact again
# Check if versioning works with update_column # Check if versioning works with update_column
def transfer_contacts(registrar_id) def transfer_contacts(registrar_id)
transfer_owner_contact(registrar_id) transfer_registrant(registrar_id)
transfer_domain_contacts(registrar_id) transfer_domain_contacts(registrar_id)
end end
@ -452,15 +452,15 @@ class Epp::Domain < Domain
oc oc
end end
def transfer_owner_contact(registrar_id) def transfer_registrant(registrar_id)
return if owner_contact.registrar_id == registrar_id return if registrant.registrar_id == registrar_id
is_other_domains_contact = DomainContact.where('contact_id = ? AND domain_id != ?', owner_contact_id, id).count > 0 is_other_domains_contact = DomainContact.where('contact_id = ? AND domain_id != ?', registrant_id, id).count > 0
if owner_contact.domains_owned.count > 1 || is_other_domains_contact if registrant.domains_owned.count > 1 || is_other_domains_contact
oc = copy_and_transfer_contact(owner_contact_id, registrar_id) oc = copy_and_transfer_contact(registrant_id, registrar_id)
self.owner_contact_id = oc.id self.registrant_id = oc.id
else else
transfer_contact(owner_contact_id, registrar_id) transfer_contact(registrant_id, registrar_id)
end end
end end
@ -471,11 +471,11 @@ class Epp::Domain < Domain
is_other_domains_contact = DomainContact.where('contact_id = ? AND domain_id != ?', c.id, id).count > 0 is_other_domains_contact = DomainContact.where('contact_id = ? AND domain_id != ?', c.id, id).count > 0
# if contact used to be owner contact but was copied, then contact must be transferred # if contact used to be owner contact but was copied, then contact must be transferred
# (owner_contact_id_was != c.id) # (registrant_id_was != c.id)
if c.domains.count > 1 || is_other_domains_contact if c.domains.count > 1 || is_other_domains_contact
# copy contact # copy contact
if owner_contact_id_was == c.id # owner contact was copied previously, do not copy it again if registrant_id_was == c.id # owner contact was copied previously, do not copy it again
oc = OpenStruct.new(id: owner_contact_id) oc = OpenStruct.new(id: registrant_id)
else else
oc = copy_and_transfer_contact(c.id, registrar_id) oc = copy_and_transfer_contact(c.id, registrar_id)
end end

View file

@ -2,7 +2,7 @@
- nameservers = children[:nameservers] || [] - nameservers = children[:nameservers] || []
- tech_contacts = children[:tech_contacts] || [] - tech_contacts = children[:tech_contacts] || []
- admin_contacts = children[:admin_contacts] || [] - admin_contacts = children[:admin_contacts] || []
- owner_contact = children[:owner_contact] || [] - registrant = children[:registrant] || []
%td %td
%p.nowrap %p.nowrap
@ -19,7 +19,7 @@
= domain.status = domain.status
%td %td
- owner_contact.each do |oc| - registrant.each do |oc|
%p %p
= oc[:name] = oc[:name]
= oc[:phone] = oc[:phone]
@ -75,16 +75,16 @@
-# = ',' + children[:domain][:status] -# = ',' + children[:domain][:status]
-# %td{ class: changes.include?(:owner_contact) ? 'edit-highlight' : 'no-highlight' } -# %td{ class: changes.include?(:registrant) ? 'edit-highlight' : 'no-highlight' }
-# - if children[:owner_contact] -# - if children[:registrant]
-# %p{:style => "font-size:x-small;"} -# %p{:style => "font-size:x-small;"}
-# = children[:owner_contact][:name] -# = children[:registrant][:name]
-# = "," -# = ","
-# = children[:owner_contact][:phone] -# = children[:registrant][:phone]
-# = "," -# = ","
-# = children[:owner_contact][:email] -# = children[:registrant][:email]
-# = "," -# = ","
-# = children[:owner_contact][:code] -# = children[:registrant][:code]
-# %td{ class: changes.include?(:admin_contacts) ? 'edit-highlight' : 'no-highlight' } -# %td{ class: changes.include?(:admin_contacts) ? 'edit-highlight' : 'no-highlight' }
-# - if children[:admin_contacts] -# - if children[:admin_contacts]

View file

@ -1,6 +1,6 @@
.row .row
.col-sm-12 .col-sm-12
%h2.text-center-xs= t('domains') %h2.text-center-xs= t(:domains)
%hr %hr
.row .row
.col-md-12 .col-md-12
@ -24,16 +24,16 @@
%th{class: 'col-xs-2'} %th{class: 'col-xs-2'}
= sort_link(@q, 'name') = sort_link(@q, 'name')
%th{class: 'col-xs-2'} %th{class: 'col-xs-2'}
= sort_link(@q, 'owner_contact_name', t('owner')) = sort_link(@q, 'registrant_name', t(:registrant))
%th{class: 'col-xs-2'} %th{class: 'col-xs-2'}
= sort_link(@q, 'valid_to', t('valid_to')) = sort_link(@q, 'valid_to', t(:valid_to))
%th{class: 'col-xs-2'} %th{class: 'col-xs-2'}
= sort_link(@q, 'registrar_name', t('registrar')) = sort_link(@q, 'registrar_name', t(:registrar))
%tbody %tbody
- @domains.each do |x| - @domains.each do |x|
%tr %tr
%td= link_to(x, admin_domain_path(x)) %td= link_to(x, admin_domain_path(x))
%td= link_to(x.owner_contact, [:admin, x.owner_contact]) %td= link_to(x.registrant, [:admin, x.registrant])
%td= l(x.valid_to, format: :short) %td= l(x.valid_to, format: :short)
%td= link_to(x.registrar, admin_registrar_path(x.registrar)) if x.registrar %td= link_to(x.registrar, admin_registrar_path(x.registrar)) if x.registrar
.row .row

View file

@ -1,19 +1,19 @@
.panel.panel-default .panel.panel-default
.panel-heading .panel-heading
%h3.panel-title= t('owner') %h3.panel-title= t(:registrant)
.panel-body .panel-body
%dl.dl-horizontal %dl.dl-horizontal
%dt= t('name') %dt= t(:name)
%dd= link_to(@domain.owner_contact, [:admin, @domain.owner_contact]) %dd= link_to(@domain.registrant, [:admin, @domain.registrant])
%dt= t('code') %dt= t(:code)
%dd= @domain.owner_contact_code %dd= @domain.registrant_code
%dt= t('identity_code') %dt= t(:identity_code)
%dd= @domain.owner_contact_ident %dd= @domain.registrant_ident
%dt= t('email') %dt= t(:email)
%dd= @domain.owner_contact_email %dd= @domain.registrant_email
%dt= t('phone') %dt= t(:phone)
%dd= @domain.owner_contact_phone %dd= @domain.registrant_phone

View file

@ -12,7 +12,7 @@ xml.epp_head do
xml.tag!('domain:status', 's' => ds.value) if ds.description.blank? xml.tag!('domain:status', 's' => ds.value) if ds.description.blank?
end end
xml.tag!('domain:registrant', @domain.owner_contact_code) xml.tag!('domain:registrant', @domain.registrant_code)
@domain.tech_contacts.each do |tc| @domain.tech_contacts.each do |tc|
xml.tag!('domain:contact', tc.code, 'type' => 'tech') xml.tag!('domain:contact', tc.code, 'type' => 'tech')

View file

@ -63,7 +63,7 @@ en:
invalid: 'Domain name is invalid' invalid: 'Domain name is invalid'
reserved: 'Domain name is reserved or restricted' reserved: 'Domain name is reserved or restricted'
taken: 'Domain name already exists' taken: 'Domain name already exists'
owner_contact: registrant:
blank: 'Registrant is missing' blank: 'Registrant is missing'
not_found: 'Registrant not found' not_found: 'Registrant not found'
domain_contacts: domain_contacts:
@ -201,7 +201,7 @@ en:
name: 'Domain name' name: 'Domain name'
name_dirty: 'Domain name' name_dirty: 'Domain name'
name_puny: 'Domain name' name_puny: 'Domain name'
owner_contact: 'Registrant' registrant: 'Registrant'
nameservers: 'Nameservers' nameservers: 'Nameservers'
domain: domain:
<<: *epp_domain_attributes <<: *epp_domain_attributes

View file

@ -0,0 +1,5 @@
class RenameDomainOwnerToRegistrant < ActiveRecord::Migration
def change
rename_column :domains, :owner_contact_id, :registrant_id
end
end

View file

@ -249,7 +249,7 @@ ActiveRecord::Schema.define(version: 20150416080828) do
t.string "status" t.string "status"
t.datetime "valid_from" t.datetime "valid_from"
t.datetime "valid_to" t.datetime "valid_to"
t.integer "owner_contact_id" t.integer "registrant_id"
t.string "auth_info" t.string "auth_info"
t.datetime "created_at" t.datetime "created_at"
t.datetime "updated_at" t.datetime "updated_at"

View file

@ -1,691 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.38.0 (20140413.2041)
-->
<!-- Title: models_diagram Pages: 1 -->
<svg width="2763pt" height="1905pt"
viewBox="0.00 0.00 2762.94 1905.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 1901)">
<title>models_diagram</title>
<polygon fill="white" stroke="none" points="-4,4 -4,-1901 2758.94,-1901 2758.94,4 -4,4"/>
<!-- _diagram_info -->
<g id="node1" class="node"><title>_diagram_info</title>
<text text-anchor="start" x="873.5" y="-1793.1" font-family="Times,serif" font-size="13.00">Models diagram</text>
<text text-anchor="start" x="873.5" y="-1779.1" font-family="Times,serif" font-size="13.00">Date: Dec 15 2014 &#45; 14:23</text>
<text text-anchor="start" x="873.5" y="-1765.1" font-family="Times,serif" font-size="13.00">Migration version: 20141202114457</text>
<text text-anchor="start" x="873.5" y="-1751.1" font-family="Times,serif" font-size="13.00">Generated by RailRoady 1.2.0</text>
<text text-anchor="start" x="873.5" y="-1737.1" font-family="Times,serif" font-size="13.00">http://railroady.prestonlee.com</text>
</g>
<!-- Ability -->
<g id="node2" class="node"><title>Ability</title>
<polygon fill="none" stroke="black" points="1098,-1745.5 1098,-1791.5 1153,-1791.5 1153,-1745.5 1098,-1745.5"/>
<text text-anchor="middle" x="1125.5" y="-1776.3" font-family="Times,serif" font-size="14.00">Ability</text>
<polyline fill="none" stroke="black" points="1098,-1768.5 1153,-1768.5 "/>
<text text-anchor="middle" x="1125.5" y="-1753.3" font-family="Times,serif" font-size="14.00"> </text>
</g>
<!-- ContactDisclosure -->
<g id="node3" class="node"><title>ContactDisclosure</title>
<path fill="none" stroke="black" d="M1058,-519C1058,-519 1165,-519 1165,-519 1171,-519 1177,-525 1177,-531 1177,-531 1177,-688 1177,-688 1177,-694 1171,-700 1165,-700 1165,-700 1058,-700 1058,-700 1052,-700 1046,-694 1046,-688 1046,-688 1046,-531 1046,-531 1046,-525 1052,-519 1058,-519"/>
<text text-anchor="middle" x="1111.5" y="-684.8" font-family="Times,serif" font-size="14.00">ContactDisclosure</text>
<polyline fill="none" stroke="black" points="1046,-677 1177,-677 "/>
<text text-anchor="start" x="1054" y="-661.8" font-family="Times,serif" font-size="14.00">id :integer</text>
<text text-anchor="start" x="1054" y="-646.8" font-family="Times,serif" font-size="14.00">contact_id :integer</text>
<text text-anchor="start" x="1054" y="-631.8" font-family="Times,serif" font-size="14.00">phone :boolean</text>
<text text-anchor="start" x="1054" y="-616.8" font-family="Times,serif" font-size="14.00">fax :boolean</text>
<text text-anchor="start" x="1054" y="-601.8" font-family="Times,serif" font-size="14.00">email :boolean</text>
<text text-anchor="start" x="1054" y="-586.8" font-family="Times,serif" font-size="14.00">created_at :datetime</text>
<text text-anchor="start" x="1054" y="-571.8" font-family="Times,serif" font-size="14.00">updated_at :datetime</text>
<text text-anchor="start" x="1054" y="-556.8" font-family="Times,serif" font-size="14.00">name :boolean</text>
<text text-anchor="start" x="1054" y="-541.8" font-family="Times,serif" font-size="14.00">org_name :boolean</text>
<text text-anchor="start" x="1054" y="-526.8" font-family="Times,serif" font-size="14.00">address :boolean</text>
</g>
<!-- DomainStatusVersion -->
<g id="node4" class="node"><title>DomainStatusVersion</title>
<path fill="none" stroke="black" d="M731,-0.5C731,-0.5 844,-0.5 844,-0.5 850,-0.5 856,-6.5 856,-12.5 856,-12.5 856,-124.5 856,-124.5 856,-130.5 850,-136.5 844,-136.5 844,-136.5 731,-136.5 731,-136.5 725,-136.5 719,-130.5 719,-124.5 719,-124.5 719,-12.5 719,-12.5 719,-6.5 725,-0.5 731,-0.5"/>
<text text-anchor="middle" x="787.5" y="-121.3" font-family="Times,serif" font-size="14.00">DomainStatusVersion</text>
<polyline fill="none" stroke="black" points="719,-113.5 856,-113.5 "/>
<text text-anchor="start" x="727" y="-98.3" font-family="Times,serif" font-size="14.00">id :integer</text>
<text text-anchor="start" x="727" y="-83.3" font-family="Times,serif" font-size="14.00">item_type :string</text>
<text text-anchor="start" x="727" y="-68.3" font-family="Times,serif" font-size="14.00">item_id :integer</text>
<text text-anchor="start" x="727" y="-53.3" font-family="Times,serif" font-size="14.00">event :string</text>
<text text-anchor="start" x="727" y="-38.3" font-family="Times,serif" font-size="14.00">whodunnit :string</text>
<text text-anchor="start" x="727" y="-23.3" font-family="Times,serif" font-size="14.00">object :text</text>
<text text-anchor="start" x="727" y="-8.3" font-family="Times,serif" font-size="14.00">created_at :datetime</text>
</g>
<!-- DomainContact -->
<g id="node5" class="node"><title>DomainContact</title>
<path fill="none" stroke="black" d="M1023,-248.5C1023,-248.5 1130,-248.5 1130,-248.5 1136,-248.5 1142,-254.5 1142,-260.5 1142,-260.5 1142,-357.5 1142,-357.5 1142,-363.5 1136,-369.5 1130,-369.5 1130,-369.5 1023,-369.5 1023,-369.5 1017,-369.5 1011,-363.5 1011,-357.5 1011,-357.5 1011,-260.5 1011,-260.5 1011,-254.5 1017,-248.5 1023,-248.5"/>
<text text-anchor="middle" x="1076.5" y="-354.3" font-family="Times,serif" font-size="14.00">DomainContact</text>
<polyline fill="none" stroke="black" points="1011,-346.5 1142,-346.5 "/>
<text text-anchor="start" x="1019" y="-331.3" font-family="Times,serif" font-size="14.00">id :integer</text>
<text text-anchor="start" x="1019" y="-316.3" font-family="Times,serif" font-size="14.00">contact_id :integer</text>
<text text-anchor="start" x="1019" y="-301.3" font-family="Times,serif" font-size="14.00">domain_id :integer</text>
<text text-anchor="start" x="1019" y="-286.3" font-family="Times,serif" font-size="14.00">contact_type :string</text>
<text text-anchor="start" x="1019" y="-271.3" font-family="Times,serif" font-size="14.00">created_at :datetime</text>
<text text-anchor="start" x="1019" y="-256.3" font-family="Times,serif" font-size="14.00">updated_at :datetime</text>
</g>
<!-- Right -->
<g id="node6" class="node"><title>Right</title>
<path fill="none" stroke="black" d="M1183,-1723C1183,-1723 1290,-1723 1290,-1723 1296,-1723 1302,-1729 1302,-1735 1302,-1735 1302,-1802 1302,-1802 1302,-1808 1296,-1814 1290,-1814 1290,-1814 1183,-1814 1183,-1814 1177,-1814 1171,-1808 1171,-1802 1171,-1802 1171,-1735 1171,-1735 1171,-1729 1177,-1723 1183,-1723"/>
<text text-anchor="middle" x="1236.5" y="-1798.8" font-family="Times,serif" font-size="14.00">Right</text>
<polyline fill="none" stroke="black" points="1171,-1791 1302,-1791 "/>
<text text-anchor="start" x="1179" y="-1775.8" font-family="Times,serif" font-size="14.00">id :integer</text>
<text text-anchor="start" x="1179" y="-1760.8" font-family="Times,serif" font-size="14.00">code :string</text>
<text text-anchor="start" x="1179" y="-1745.8" font-family="Times,serif" font-size="14.00">created_at :datetime</text>
<text text-anchor="start" x="1179" y="-1730.8" font-family="Times,serif" font-size="14.00">updated_at :datetime</text>
</g>
<!-- Role -->
<g id="node25" class="node"><title>Role</title>
<path fill="none" stroke="black" d="M1183,-1460C1183,-1460 1290,-1460 1290,-1460 1296,-1460 1302,-1466 1302,-1472 1302,-1472 1302,-1539 1302,-1539 1302,-1545 1296,-1551 1290,-1551 1290,-1551 1183,-1551 1183,-1551 1177,-1551 1171,-1545 1171,-1539 1171,-1539 1171,-1472 1171,-1472 1171,-1466 1177,-1460 1183,-1460"/>
<text text-anchor="middle" x="1236.5" y="-1535.8" font-family="Times,serif" font-size="14.00">Role</text>
<polyline fill="none" stroke="black" points="1171,-1528 1302,-1528 "/>
<text text-anchor="start" x="1179" y="-1512.8" font-family="Times,serif" font-size="14.00">id :integer</text>
<text text-anchor="start" x="1179" y="-1497.8" font-family="Times,serif" font-size="14.00">name :string</text>
<text text-anchor="start" x="1179" y="-1482.8" font-family="Times,serif" font-size="14.00">created_at :datetime</text>
<text text-anchor="start" x="1179" y="-1467.8" font-family="Times,serif" font-size="14.00">updated_at :datetime</text>
</g>
<!-- Right&#45;&gt;Role -->
<g id="edge1" class="edge"><title>Right&#45;&gt;Role</title>
<path fill="none" stroke="#d92d82" d="M1236.5,-1712.73C1236.5,-1668.27 1236.5,-1605.87 1236.5,-1561.38"/>
<polygon fill="#d92d82" stroke="#d92d82" points="1236.5,-1712.93 1232,-1722.93 1236.5,-1717.93 1236.5,-1722.93 1236.5,-1722.93 1236.5,-1722.93 1236.5,-1717.93 1241,-1722.93 1236.5,-1712.93 1236.5,-1712.93"/>
<polygon fill="#d92d82" stroke="#d92d82" points="1236.5,-1561.32 1241,-1551.32 1236.5,-1556.32 1236.5,-1551.32 1236.5,-1551.32 1236.5,-1551.32 1236.5,-1556.32 1232,-1551.32 1236.5,-1561.32 1236.5,-1561.32"/>
</g>
<!-- Contact -->
<g id="node7" class="node"><title>Contact</title>
<path fill="none" stroke="black" d="M958.5,-789.5C958.5,-789.5 1076.5,-789.5 1076.5,-789.5 1082.5,-789.5 1088.5,-795.5 1088.5,-801.5 1088.5,-801.5 1088.5,-1063.5 1088.5,-1063.5 1088.5,-1069.5 1082.5,-1075.5 1076.5,-1075.5 1076.5,-1075.5 958.5,-1075.5 958.5,-1075.5 952.5,-1075.5 946.5,-1069.5 946.5,-1063.5 946.5,-1063.5 946.5,-801.5 946.5,-801.5 946.5,-795.5 952.5,-789.5 958.5,-789.5"/>
<text text-anchor="middle" x="1017.5" y="-1060.3" font-family="Times,serif" font-size="14.00">Contact</text>
<polyline fill="none" stroke="black" points="946.5,-1052.5 1088.5,-1052.5 "/>
<text text-anchor="start" x="954.5" y="-1037.3" font-family="Times,serif" font-size="14.00">id :integer</text>
<text text-anchor="start" x="954.5" y="-1022.3" font-family="Times,serif" font-size="14.00">code :string</text>
<text text-anchor="start" x="954.5" y="-1007.3" font-family="Times,serif" font-size="14.00">type :string</text>
<text text-anchor="start" x="954.5" y="-992.3" font-family="Times,serif" font-size="14.00">reg_no :string</text>
<text text-anchor="start" x="954.5" y="-977.3" font-family="Times,serif" font-size="14.00">phone :string</text>
<text text-anchor="start" x="954.5" y="-962.3" font-family="Times,serif" font-size="14.00">email :string</text>
<text text-anchor="start" x="954.5" y="-947.3" font-family="Times,serif" font-size="14.00">fax :string</text>
<text text-anchor="start" x="954.5" y="-932.3" font-family="Times,serif" font-size="14.00">created_at :datetime</text>
<text text-anchor="start" x="954.5" y="-917.3" font-family="Times,serif" font-size="14.00">updated_at :datetime</text>
<text text-anchor="start" x="954.5" y="-902.3" font-family="Times,serif" font-size="14.00">ident :string</text>
<text text-anchor="start" x="954.5" y="-887.3" font-family="Times,serif" font-size="14.00">ident_type :string</text>
<text text-anchor="start" x="954.5" y="-872.3" font-family="Times,serif" font-size="14.00">created_by_id :integer</text>
<text text-anchor="start" x="954.5" y="-857.3" font-family="Times,serif" font-size="14.00">updated_by_id :integer</text>
<text text-anchor="start" x="954.5" y="-842.3" font-family="Times,serif" font-size="14.00">auth_info :string</text>
<text text-anchor="start" x="954.5" y="-827.3" font-family="Times,serif" font-size="14.00">name :string</text>
<text text-anchor="start" x="954.5" y="-812.3" font-family="Times,serif" font-size="14.00">org_name :string</text>
<text text-anchor="start" x="954.5" y="-797.3" font-family="Times,serif" font-size="14.00">registrar_id :integer</text>
</g>
<!-- Contact&#45;&gt;ContactDisclosure -->
<g id="edge3" class="edge"><title>Contact&#45;&gt;ContactDisclosure</title>
<path fill="none" stroke="#846881" d="M1061.44,-781.461C1068.77,-756.435 1076.19,-731.07 1083,-707.811"/>
<ellipse fill="none" stroke="#846881" cx="1060.26" cy="-785.464" rx="4.00001" ry="4.00001"/>
<ellipse fill="#846881" stroke="#846881" cx="1084.16" cy="-703.846" rx="4.00001" ry="4.00001"/>
<text text-anchor="middle" x="1095" y="-759.8" font-family="Times,serif" font-size="14.00">disclosure</text>
</g>
<!-- Contact&#45;&gt;DomainContact -->
<g id="edge4" class="edge"><title>Contact&#45;&gt;DomainContact</title>
<path fill="none" stroke="#171045" d="M1016.81,-781.213C1018.15,-693.334 1022.89,-580.466 1036.5,-481 1041.12,-447.201 1049.35,-410.28 1057.14,-379.424"/>
<ellipse fill="none" stroke="#171045" cx="1016.75" cy="-785.37" rx="4" ry="4"/>
<polygon fill="#171045" stroke="#171045" points="1057.17,-379.317 1064.01,-370.747 1058.41,-374.474 1059.65,-369.63 1059.65,-369.63 1059.65,-369.63 1058.41,-374.474 1055.29,-368.513 1057.17,-379.317 1057.17,-379.317"/>
</g>
<!-- ContactVersion -->
<g id="node20" class="node"><title>ContactVersion</title>
<path fill="none" stroke="black" d="M1207,-541.5C1207,-541.5 1310,-541.5 1310,-541.5 1316,-541.5 1322,-547.5 1322,-553.5 1322,-553.5 1322,-665.5 1322,-665.5 1322,-671.5 1316,-677.5 1310,-677.5 1310,-677.5 1207,-677.5 1207,-677.5 1201,-677.5 1195,-671.5 1195,-665.5 1195,-665.5 1195,-553.5 1195,-553.5 1195,-547.5 1201,-541.5 1207,-541.5"/>
<text text-anchor="middle" x="1258.5" y="-662.3" font-family="Times,serif" font-size="14.00">ContactVersion</text>
<polyline fill="none" stroke="black" points="1195,-654.5 1322,-654.5 "/>
<text text-anchor="start" x="1203" y="-639.3" font-family="Times,serif" font-size="14.00">id :integer</text>
<text text-anchor="start" x="1203" y="-624.3" font-family="Times,serif" font-size="14.00">item_type :string</text>
<text text-anchor="start" x="1203" y="-609.3" font-family="Times,serif" font-size="14.00">item_id :integer</text>
<text text-anchor="start" x="1203" y="-594.3" font-family="Times,serif" font-size="14.00">event :string</text>
<text text-anchor="start" x="1203" y="-579.3" font-family="Times,serif" font-size="14.00">whodunnit :string</text>
<text text-anchor="start" x="1203" y="-564.3" font-family="Times,serif" font-size="14.00">object :text</text>
<text text-anchor="start" x="1203" y="-549.3" font-family="Times,serif" font-size="14.00">created_at :datetime</text>
</g>
<!-- Contact&#45;&gt;ContactVersion -->
<g id="edge6" class="edge"><title>Contact&#45;&gt;ContactVersion</title>
<path fill="none" stroke="#7a300b" d="M1094.1,-850.457C1124.16,-816.871 1157.98,-776.758 1185.5,-738 1196.94,-721.884 1208.15,-703.842 1218.21,-686.517"/>
<ellipse fill="none" stroke="#7a300b" cx="1091.21" cy="-853.675" rx="4.00002" ry="4.00002"/>
<polygon fill="#7a300b" stroke="#7a300b" points="1218.39,-686.21 1227.27,-679.776 1220.87,-681.873 1223.36,-677.536 1223.36,-677.536 1223.36,-677.536 1220.87,-681.873 1219.46,-675.297 1218.39,-686.21 1218.39,-686.21"/>
<text text-anchor="middle" x="1192.5" y="-759.8" font-family="Times,serif" font-size="14.00">versions</text>
</g>
<!-- Address -->
<g id="node26" class="node"><title>Address</title>
<path fill="none" stroke="black" d="M1352,-519C1352,-519 1459,-519 1459,-519 1465,-519 1471,-525 1471,-531 1471,-531 1471,-688 1471,-688 1471,-694 1465,-700 1459,-700 1459,-700 1352,-700 1352,-700 1346,-700 1340,-694 1340,-688 1340,-688 1340,-531 1340,-531 1340,-525 1346,-519 1352,-519"/>
<text text-anchor="middle" x="1405.5" y="-684.8" font-family="Times,serif" font-size="14.00">Address</text>
<polyline fill="none" stroke="black" points="1340,-677 1471,-677 "/>
<text text-anchor="start" x="1348" y="-661.8" font-family="Times,serif" font-size="14.00">id :integer</text>
<text text-anchor="start" x="1348" y="-646.8" font-family="Times,serif" font-size="14.00">contact_id :integer</text>
<text text-anchor="start" x="1348" y="-631.8" font-family="Times,serif" font-size="14.00">country_id :integer</text>
<text text-anchor="start" x="1348" y="-616.8" font-family="Times,serif" font-size="14.00">city :string</text>
<text text-anchor="start" x="1348" y="-601.8" font-family="Times,serif" font-size="14.00">street :string</text>
<text text-anchor="start" x="1348" y="-586.8" font-family="Times,serif" font-size="14.00">zip :string</text>
<text text-anchor="start" x="1348" y="-571.8" font-family="Times,serif" font-size="14.00">created_at :datetime</text>
<text text-anchor="start" x="1348" y="-556.8" font-family="Times,serif" font-size="14.00">updated_at :datetime</text>
<text text-anchor="start" x="1348" y="-541.8" font-family="Times,serif" font-size="14.00">street2 :string</text>
<text text-anchor="start" x="1348" y="-526.8" font-family="Times,serif" font-size="14.00">street3 :string</text>
</g>
<!-- Contact&#45;&gt;Address -->
<g id="edge2" class="edge"><title>Contact&#45;&gt;Address</title>
<path fill="none" stroke="#e6e9ed" d="M1095.96,-896.462C1164.1,-863.114 1262.29,-807.729 1330.5,-738 1339.57,-728.726 1347.98,-718.148 1355.64,-707.141"/>
<ellipse fill="none" stroke="#e6e9ed" cx="1092.23" cy="-898.272" rx="4.00002" ry="4.00002"/>
<ellipse fill="#e6e9ed" stroke="#e6e9ed" cx="1358.07" cy="-703.553" rx="4.00002" ry="4.00002"/>
</g>
<!-- Domain -->
<g id="node27" class="node"><title>Domain</title>
<path fill="none" stroke="black" d="M719.5,-481.5C719.5,-481.5 853.5,-481.5 853.5,-481.5 859.5,-481.5 865.5,-487.5 865.5,-493.5 865.5,-493.5 865.5,-725.5 865.5,-725.5 865.5,-731.5 859.5,-737.5 853.5,-737.5 853.5,-737.5 719.5,-737.5 719.5,-737.5 713.5,-737.5 707.5,-731.5 707.5,-725.5 707.5,-725.5 707.5,-493.5 707.5,-493.5 707.5,-487.5 713.5,-481.5 719.5,-481.5"/>
<text text-anchor="middle" x="786.5" y="-722.3" font-family="Times,serif" font-size="14.00">Domain</text>
<polyline fill="none" stroke="black" points="707.5,-714.5 865.5,-714.5 "/>
<text text-anchor="start" x="715.5" y="-699.3" font-family="Times,serif" font-size="14.00">id :integer</text>
<text text-anchor="start" x="715.5" y="-684.3" font-family="Times,serif" font-size="14.00">name :string</text>
<text text-anchor="start" x="715.5" y="-669.3" font-family="Times,serif" font-size="14.00">registrar_id :integer</text>
<text text-anchor="start" x="715.5" y="-654.3" font-family="Times,serif" font-size="14.00">registered_at :datetime</text>
<text text-anchor="start" x="715.5" y="-639.3" font-family="Times,serif" font-size="14.00">status :string</text>
<text text-anchor="start" x="715.5" y="-624.3" font-family="Times,serif" font-size="14.00">valid_from :datetime</text>
<text text-anchor="start" x="715.5" y="-609.3" font-family="Times,serif" font-size="14.00">valid_to :datetime</text>
<text text-anchor="start" x="715.5" y="-594.3" font-family="Times,serif" font-size="14.00">owner_contact_id :integer</text>
<text text-anchor="start" x="715.5" y="-579.3" font-family="Times,serif" font-size="14.00">auth_info :string</text>
<text text-anchor="start" x="715.5" y="-564.3" font-family="Times,serif" font-size="14.00">created_at :datetime</text>
<text text-anchor="start" x="715.5" y="-549.3" font-family="Times,serif" font-size="14.00">updated_at :datetime</text>
<text text-anchor="start" x="715.5" y="-534.3" font-family="Times,serif" font-size="14.00">name_dirty :string</text>
<text text-anchor="start" x="715.5" y="-519.3" font-family="Times,serif" font-size="14.00">name_puny :string</text>
<text text-anchor="start" x="715.5" y="-504.3" font-family="Times,serif" font-size="14.00">period :integer</text>
<text text-anchor="start" x="715.5" y="-489.3" font-family="Times,serif" font-size="14.00">period_unit :string</text>
</g>
<!-- Contact&#45;&gt;Domain -->
<g id="edge5" class="edge"><title>Contact&#45;&gt;Domain</title>
<path fill="none" stroke="#099468" d="M937.434,-894.164C889.123,-867.14 831.16,-825.751 800.5,-771 796.325,-763.545 792.948,-755.584 790.236,-747.344"/>
<polygon fill="#099468" stroke="#099468" points="937.565,-894.236 944.171,-902.989 941.95,-896.64 946.334,-899.043 946.334,-899.043 946.334,-899.043 941.95,-896.64 948.497,-895.097 937.565,-894.236 937.565,-894.236"/>
<polygon fill="#099468" stroke="#099468" points="790.178,-747.148 791.668,-736.284 788.765,-742.352 787.351,-737.556 787.351,-737.556 787.351,-737.556 788.765,-742.352 783.035,-738.829 790.178,-747.148 790.178,-747.148"/>
</g>
<!-- DomainVersion -->
<g id="node8" class="node"><title>DomainVersion</title>
<path fill="none" stroke="black" d="M878,-233.5C878,-233.5 981,-233.5 981,-233.5 987,-233.5 993,-239.5 993,-245.5 993,-245.5 993,-372.5 993,-372.5 993,-378.5 987,-384.5 981,-384.5 981,-384.5 878,-384.5 878,-384.5 872,-384.5 866,-378.5 866,-372.5 866,-372.5 866,-245.5 866,-245.5 866,-239.5 872,-233.5 878,-233.5"/>
<text text-anchor="middle" x="929.5" y="-369.3" font-family="Times,serif" font-size="14.00">DomainVersion</text>
<polyline fill="none" stroke="black" points="866,-361.5 993,-361.5 "/>
<text text-anchor="start" x="874" y="-346.3" font-family="Times,serif" font-size="14.00">id :integer</text>
<text text-anchor="start" x="874" y="-331.3" font-family="Times,serif" font-size="14.00">item_type :string</text>
<text text-anchor="start" x="874" y="-316.3" font-family="Times,serif" font-size="14.00">item_id :integer</text>
<text text-anchor="start" x="874" y="-301.3" font-family="Times,serif" font-size="14.00">event :string</text>
<text text-anchor="start" x="874" y="-286.3" font-family="Times,serif" font-size="14.00">whodunnit :string</text>
<text text-anchor="start" x="874" y="-271.3" font-family="Times,serif" font-size="14.00">object :text</text>
<text text-anchor="start" x="874" y="-256.3" font-family="Times,serif" font-size="14.00">created_at :datetime</text>
<text text-anchor="start" x="874" y="-241.3" font-family="Times,serif" font-size="14.00">snapshot :text</text>
</g>
<!-- Setting -->
<g id="node9" class="node"><title>Setting</title>
<path fill="none" stroke="black" d="M1332,-1700.5C1332,-1700.5 1439,-1700.5 1439,-1700.5 1445,-1700.5 1451,-1706.5 1451,-1712.5 1451,-1712.5 1451,-1824.5 1451,-1824.5 1451,-1830.5 1445,-1836.5 1439,-1836.5 1439,-1836.5 1332,-1836.5 1332,-1836.5 1326,-1836.5 1320,-1830.5 1320,-1824.5 1320,-1824.5 1320,-1712.5 1320,-1712.5 1320,-1706.5 1326,-1700.5 1332,-1700.5"/>
<text text-anchor="middle" x="1385.5" y="-1821.3" font-family="Times,serif" font-size="14.00">Setting</text>
<polyline fill="none" stroke="black" points="1320,-1813.5 1451,-1813.5 "/>
<text text-anchor="start" x="1328" y="-1798.3" font-family="Times,serif" font-size="14.00">id :integer</text>
<text text-anchor="start" x="1328" y="-1783.3" font-family="Times,serif" font-size="14.00">var :string</text>
<text text-anchor="start" x="1328" y="-1768.3" font-family="Times,serif" font-size="14.00">value :text</text>
<text text-anchor="start" x="1328" y="-1753.3" font-family="Times,serif" font-size="14.00">thing_id :integer</text>
<text text-anchor="start" x="1328" y="-1738.3" font-family="Times,serif" font-size="14.00">thing_type :string</text>
<text text-anchor="start" x="1328" y="-1723.3" font-family="Times,serif" font-size="14.00">created_at :datetime</text>
<text text-anchor="start" x="1328" y="-1708.3" font-family="Times,serif" font-size="14.00">updated_at :datetime</text>
</g>
<!-- Nameserver -->
<g id="node10" class="node"><title>Nameserver</title>
<path fill="none" stroke="black" d="M12,-241C12,-241 119,-241 119,-241 125,-241 131,-247 131,-253 131,-253 131,-365 131,-365 131,-371 125,-377 119,-377 119,-377 12,-377 12,-377 6,-377 0,-371 0,-365 0,-365 0,-253 0,-253 0,-247 6,-241 12,-241"/>
<text text-anchor="middle" x="65.5" y="-361.8" font-family="Times,serif" font-size="14.00">Nameserver</text>
<polyline fill="none" stroke="black" points="0,-354 131,-354 "/>
<text text-anchor="start" x="8" y="-338.8" font-family="Times,serif" font-size="14.00">id :integer</text>
<text text-anchor="start" x="8" y="-323.8" font-family="Times,serif" font-size="14.00">hostname :string</text>
<text text-anchor="start" x="8" y="-308.8" font-family="Times,serif" font-size="14.00">ipv4 :string</text>
<text text-anchor="start" x="8" y="-293.8" font-family="Times,serif" font-size="14.00">created_at :datetime</text>
<text text-anchor="start" x="8" y="-278.8" font-family="Times,serif" font-size="14.00">updated_at :datetime</text>
<text text-anchor="start" x="8" y="-263.8" font-family="Times,serif" font-size="14.00">ipv6 :string</text>
<text text-anchor="start" x="8" y="-248.8" font-family="Times,serif" font-size="14.00">domain_id :integer</text>
</g>
<!-- NameserverVersion -->
<g id="node15" class="node"><title>NameserverVersion</title>
<path fill="none" stroke="black" d="M14,-0.5C14,-0.5 117,-0.5 117,-0.5 123,-0.5 129,-6.5 129,-12.5 129,-12.5 129,-124.5 129,-124.5 129,-130.5 123,-136.5 117,-136.5 117,-136.5 14,-136.5 14,-136.5 8,-136.5 2,-130.5 2,-124.5 2,-124.5 2,-12.5 2,-12.5 2,-6.5 8,-0.5 14,-0.5"/>
<text text-anchor="middle" x="65.5" y="-121.3" font-family="Times,serif" font-size="14.00">NameserverVersion</text>
<polyline fill="none" stroke="black" points="2,-113.5 129,-113.5 "/>
<text text-anchor="start" x="10" y="-98.3" font-family="Times,serif" font-size="14.00">id :integer</text>
<text text-anchor="start" x="10" y="-83.3" font-family="Times,serif" font-size="14.00">item_type :string</text>
<text text-anchor="start" x="10" y="-68.3" font-family="Times,serif" font-size="14.00">item_id :integer</text>
<text text-anchor="start" x="10" y="-53.3" font-family="Times,serif" font-size="14.00">event :string</text>
<text text-anchor="start" x="10" y="-38.3" font-family="Times,serif" font-size="14.00">whodunnit :string</text>
<text text-anchor="start" x="10" y="-23.3" font-family="Times,serif" font-size="14.00">object :text</text>
<text text-anchor="start" x="10" y="-8.3" font-family="Times,serif" font-size="14.00">created_at :datetime</text>
</g>
<!-- Nameserver&#45;&gt;NameserverVersion -->
<g id="edge7" class="edge"><title>Nameserver&#45;&gt;NameserverVersion</title>
<path fill="none" stroke="#3620af" d="M65.5,-232.805C65.5,-205.547 65.5,-174.716 65.5,-147.244"/>
<ellipse fill="none" stroke="#3620af" cx="65.5" cy="-236.93" rx="4" ry="4"/>
<polygon fill="#3620af" stroke="#3620af" points="65.5001,-146.893 70,-136.893 65.5,-141.893 65.5,-136.893 65.5,-136.893 65.5,-136.893 65.5,-141.893 61,-136.893 65.5001,-146.893 65.5001,-146.893"/>
<text text-anchor="middle" x="88.5" y="-158.8" font-family="Times,serif" font-size="14.00">versions</text>
</g>
<!-- EppUser -->
<g id="node11" class="node"><title>EppUser</title>
<path fill="none" stroke="black" d="M802,-1166C802,-1166 909,-1166 909,-1166 915,-1166 921,-1172 921,-1178 921,-1178 921,-1320 921,-1320 921,-1326 915,-1332 909,-1332 909,-1332 802,-1332 802,-1332 796,-1332 790,-1326 790,-1320 790,-1320 790,-1178 790,-1178 790,-1172 796,-1166 802,-1166"/>
<text text-anchor="middle" x="855.5" y="-1316.8" font-family="Times,serif" font-size="14.00">EppUser</text>
<polyline fill="none" stroke="black" points="790,-1309 921,-1309 "/>
<text text-anchor="start" x="798" y="-1293.8" font-family="Times,serif" font-size="14.00">id :integer</text>
<text text-anchor="start" x="798" y="-1278.8" font-family="Times,serif" font-size="14.00">registrar_id :integer</text>
<text text-anchor="start" x="798" y="-1263.8" font-family="Times,serif" font-size="14.00">username :string</text>
<text text-anchor="start" x="798" y="-1248.8" font-family="Times,serif" font-size="14.00">password :string</text>
<text text-anchor="start" x="798" y="-1233.8" font-family="Times,serif" font-size="14.00">active :boolean</text>
<text text-anchor="start" x="798" y="-1218.8" font-family="Times,serif" font-size="14.00">csr :text</text>
<text text-anchor="start" x="798" y="-1203.8" font-family="Times,serif" font-size="14.00">crt :text</text>
<text text-anchor="start" x="798" y="-1188.8" font-family="Times,serif" font-size="14.00">created_at :datetime</text>
<text text-anchor="start" x="798" y="-1173.8" font-family="Times,serif" font-size="14.00">updated_at :datetime</text>
</g>
<!-- EppUser&#45;&gt;Contact -->
<g id="edge8" class="edge"><title>EppUser&#45;&gt;Contact</title>
<path fill="none" stroke="#8a341c" d="M901.553,-1158.59C914.099,-1134.24 928.028,-1107.2 941.756,-1080.55"/>
<ellipse fill="none" stroke="#8a341c" cx="899.684" cy="-1162.22" rx="4.00002" ry="4.00002"/>
<polygon fill="#8a341c" stroke="#8a341c" points="941.822,-1080.42 950.402,-1073.59 944.112,-1075.97 946.401,-1071.53 946.401,-1071.53 946.401,-1071.53 944.112,-1075.97 942.401,-1069.47 941.822,-1080.42 941.822,-1080.42"/>
</g>
<!-- Country -->
<g id="node12" class="node"><title>Country</title>
<path fill="none" stroke="black" d="M1481,-1715.5C1481,-1715.5 1588,-1715.5 1588,-1715.5 1594,-1715.5 1600,-1721.5 1600,-1727.5 1600,-1727.5 1600,-1809.5 1600,-1809.5 1600,-1815.5 1594,-1821.5 1588,-1821.5 1588,-1821.5 1481,-1821.5 1481,-1821.5 1475,-1821.5 1469,-1815.5 1469,-1809.5 1469,-1809.5 1469,-1727.5 1469,-1727.5 1469,-1721.5 1475,-1715.5 1481,-1715.5"/>
<text text-anchor="middle" x="1534.5" y="-1806.3" font-family="Times,serif" font-size="14.00">Country</text>
<polyline fill="none" stroke="black" points="1469,-1798.5 1600,-1798.5 "/>
<text text-anchor="start" x="1477" y="-1783.3" font-family="Times,serif" font-size="14.00">id :integer</text>
<text text-anchor="start" x="1477" y="-1768.3" font-family="Times,serif" font-size="14.00">iso :string</text>
<text text-anchor="start" x="1477" y="-1753.3" font-family="Times,serif" font-size="14.00">name :string</text>
<text text-anchor="start" x="1477" y="-1738.3" font-family="Times,serif" font-size="14.00">created_at :datetime</text>
<text text-anchor="start" x="1477" y="-1723.3" font-family="Times,serif" font-size="14.00">updated_at :datetime</text>
</g>
<!-- ZonefileSetting -->
<g id="node13" class="node"><title>ZonefileSetting</title>
<path fill="none" stroke="black" d="M1630,-1670.5C1630,-1670.5 1767,-1670.5 1767,-1670.5 1773,-1670.5 1779,-1676.5 1779,-1682.5 1779,-1682.5 1779,-1854.5 1779,-1854.5 1779,-1860.5 1773,-1866.5 1767,-1866.5 1767,-1866.5 1630,-1866.5 1630,-1866.5 1624,-1866.5 1618,-1860.5 1618,-1854.5 1618,-1854.5 1618,-1682.5 1618,-1682.5 1618,-1676.5 1624,-1670.5 1630,-1670.5"/>
<text text-anchor="middle" x="1698.5" y="-1851.3" font-family="Times,serif" font-size="14.00">ZonefileSetting</text>
<polyline fill="none" stroke="black" points="1618,-1843.5 1779,-1843.5 "/>
<text text-anchor="start" x="1626" y="-1828.3" font-family="Times,serif" font-size="14.00">id :integer</text>
<text text-anchor="start" x="1626" y="-1813.3" font-family="Times,serif" font-size="14.00">origin :string</text>
<text text-anchor="start" x="1626" y="-1798.3" font-family="Times,serif" font-size="14.00">ttl :integer</text>
<text text-anchor="start" x="1626" y="-1783.3" font-family="Times,serif" font-size="14.00">refresh :integer</text>
<text text-anchor="start" x="1626" y="-1768.3" font-family="Times,serif" font-size="14.00">retry :integer</text>
<text text-anchor="start" x="1626" y="-1753.3" font-family="Times,serif" font-size="14.00">expire :integer</text>
<text text-anchor="start" x="1626" y="-1738.3" font-family="Times,serif" font-size="14.00">minimum_ttl :integer</text>
<text text-anchor="start" x="1626" y="-1723.3" font-family="Times,serif" font-size="14.00">email :string</text>
<text text-anchor="start" x="1626" y="-1708.3" font-family="Times,serif" font-size="14.00">master_nameserver :string</text>
<text text-anchor="start" x="1626" y="-1693.3" font-family="Times,serif" font-size="14.00">created_at :datetime</text>
<text text-anchor="start" x="1626" y="-1678.3" font-family="Times,serif" font-size="14.00">updated_at :datetime</text>
</g>
<!-- CachedNameserver -->
<g id="node14" class="node"><title>CachedNameserver</title>
<path fill="none" stroke="black" d="M1809,-1730.5C1809,-1730.5 1908,-1730.5 1908,-1730.5 1914,-1730.5 1920,-1736.5 1920,-1742.5 1920,-1742.5 1920,-1794.5 1920,-1794.5 1920,-1800.5 1914,-1806.5 1908,-1806.5 1908,-1806.5 1809,-1806.5 1809,-1806.5 1803,-1806.5 1797,-1800.5 1797,-1794.5 1797,-1794.5 1797,-1742.5 1797,-1742.5 1797,-1736.5 1803,-1730.5 1809,-1730.5"/>
<text text-anchor="middle" x="1858.5" y="-1791.3" font-family="Times,serif" font-size="14.00">CachedNameserver</text>
<polyline fill="none" stroke="black" points="1797,-1783.5 1920,-1783.5 "/>
<text text-anchor="start" x="1805" y="-1768.3" font-family="Times,serif" font-size="14.00">hostname :string</text>
<text text-anchor="start" x="1805" y="-1753.3" font-family="Times,serif" font-size="14.00">ipv4 :string</text>
<text text-anchor="start" x="1805" y="-1738.3" font-family="Times,serif" font-size="14.00">ipv6 :string</text>
</g>
<!-- Epp::EppDomain -->
<g id="node16" class="node"><title>Epp::EppDomain</title>
<path fill="none" stroke="black" d="M1950.5,-1640.5C1950.5,-1640.5 2084.5,-1640.5 2084.5,-1640.5 2090.5,-1640.5 2096.5,-1646.5 2096.5,-1652.5 2096.5,-1652.5 2096.5,-1884.5 2096.5,-1884.5 2096.5,-1890.5 2090.5,-1896.5 2084.5,-1896.5 2084.5,-1896.5 1950.5,-1896.5 1950.5,-1896.5 1944.5,-1896.5 1938.5,-1890.5 1938.5,-1884.5 1938.5,-1884.5 1938.5,-1652.5 1938.5,-1652.5 1938.5,-1646.5 1944.5,-1640.5 1950.5,-1640.5"/>
<text text-anchor="middle" x="2017.5" y="-1881.3" font-family="Times,serif" font-size="14.00">Epp::EppDomain</text>
<polyline fill="none" stroke="black" points="1938.5,-1873.5 2096.5,-1873.5 "/>
<text text-anchor="start" x="1946.5" y="-1858.3" font-family="Times,serif" font-size="14.00">id :integer</text>
<text text-anchor="start" x="1946.5" y="-1843.3" font-family="Times,serif" font-size="14.00">name :string</text>
<text text-anchor="start" x="1946.5" y="-1828.3" font-family="Times,serif" font-size="14.00">registrar_id :integer</text>
<text text-anchor="start" x="1946.5" y="-1813.3" font-family="Times,serif" font-size="14.00">registered_at :datetime</text>
<text text-anchor="start" x="1946.5" y="-1798.3" font-family="Times,serif" font-size="14.00">status :string</text>
<text text-anchor="start" x="1946.5" y="-1783.3" font-family="Times,serif" font-size="14.00">valid_from :datetime</text>
<text text-anchor="start" x="1946.5" y="-1768.3" font-family="Times,serif" font-size="14.00">valid_to :datetime</text>
<text text-anchor="start" x="1946.5" y="-1753.3" font-family="Times,serif" font-size="14.00">owner_contact_id :integer</text>
<text text-anchor="start" x="1946.5" y="-1738.3" font-family="Times,serif" font-size="14.00">auth_info :string</text>
<text text-anchor="start" x="1946.5" y="-1723.3" font-family="Times,serif" font-size="14.00">created_at :datetime</text>
<text text-anchor="start" x="1946.5" y="-1708.3" font-family="Times,serif" font-size="14.00">updated_at :datetime</text>
<text text-anchor="start" x="1946.5" y="-1693.3" font-family="Times,serif" font-size="14.00">name_dirty :string</text>
<text text-anchor="start" x="1946.5" y="-1678.3" font-family="Times,serif" font-size="14.00">name_puny :string</text>
<text text-anchor="start" x="1946.5" y="-1663.3" font-family="Times,serif" font-size="14.00">period :integer</text>
<text text-anchor="start" x="1946.5" y="-1648.3" font-family="Times,serif" font-size="14.00">period_unit :string</text>
</g>
<!-- Epp::DomainContact -->
<g id="node31" class="node"><title>Epp::DomainContact</title>
<ellipse fill="none" stroke="black" cx="1537.5" cy="-1505.5" rx="85.5853" ry="18"/>
<text text-anchor="middle" x="1537.5" y="-1501.8" font-family="Times,serif" font-size="14.00">Epp::DomainContact</text>
</g>
<!-- Epp::EppDomain&#45;&gt;Epp::DomainContact -->
<g id="edge9" class="edge"><title>Epp::EppDomain&#45;&gt;Epp::DomainContact</title>
<path fill="none" stroke="#4900e5" d="M1931.66,-1641.87C1930.62,-1641.23 1929.56,-1640.61 1928.5,-1640 1881.84,-1613.41 1738.69,-1638.25 1687.5,-1622 1634.24,-1605.09 1585.56,-1559.7 1558.87,-1531.11"/>
<ellipse fill="none" stroke="#4900e5" cx="1935.07" cy="-1644.14" rx="4.00002" ry="4.00002"/>
<polygon fill="#4900e5" stroke="#4900e5" points="1558.69,-1530.91 1555.26,-1520.5 1555.32,-1527.22 1551.94,-1523.53 1551.94,-1523.53 1551.94,-1523.53 1555.32,-1527.22 1548.62,-1526.57 1558.69,-1530.91 1558.69,-1530.91"/>
</g>
<!-- Epp::Contact -->
<g id="node32" class="node"><title>Epp::Contact</title>
<ellipse fill="none" stroke="black" cx="1698.5" cy="-1505.5" rx="57.3905" ry="18"/>
<text text-anchor="middle" x="1698.5" y="-1501.8" font-family="Times,serif" font-size="14.00">Epp::Contact</text>
</g>
<!-- Epp::EppDomain&#45;&gt;Epp::Contact -->
<g id="edge10" class="edge"><title>Epp::EppDomain&#45;&gt;Epp::Contact</title>
<path fill="none" stroke="#7ef3c3" d="M1929.77,-1640.74C1929.35,-1640.49 1928.92,-1640.24 1928.5,-1640 1884.2,-1614.64 1734.31,-1659.33 1699.5,-1622 1677.65,-1598.57 1682.68,-1559.39 1689.56,-1533.25"/>
<polygon fill="#7ef3c3" stroke="#7ef3c3" points="1930.02,-1640.9 1935.93,-1650.14 1934.21,-1643.64 1938.39,-1646.37 1938.39,-1646.37 1938.39,-1646.37 1934.21,-1643.64 1940.85,-1642.61 1930.02,-1640.9 1930.02,-1640.9"/>
<polygon fill="#7ef3c3" stroke="#7ef3c3" points="1689.57,-1533.21 1696.66,-1524.84 1690.95,-1528.4 1692.33,-1523.6 1692.33,-1523.6 1692.33,-1523.6 1690.95,-1528.4 1688.01,-1522.35 1689.57,-1533.21 1689.57,-1533.21"/>
<text text-anchor="middle" x="1736.5" y="-1610.8" font-family="Times,serif" font-size="14.00">tech_contacts</text>
</g>
<!-- Epp::EppDomain&#45;&gt;Epp::Contact -->
<g id="edge11" class="edge"><title>Epp::EppDomain&#45;&gt;Epp::Contact</title>
<path fill="none" stroke="#b2fe58" d="M1930.09,-1641.04C1929.56,-1640.69 1929.03,-1640.34 1928.5,-1640 1890.08,-1615.44 1870.64,-1636.75 1827.5,-1622 1797.59,-1611.77 1788.89,-1609.1 1764.5,-1589 1744.73,-1572.71 1726.89,-1549.64 1714.76,-1532.04"/>
<polygon fill="#b2fe58" stroke="#b2fe58" points="1930.34,-1641.21 1935.82,-1650.71 1934.4,-1644.14 1938.45,-1647.06 1938.45,-1647.06 1938.45,-1647.06 1934.4,-1644.14 1941.08,-1643.41 1930.34,-1641.21 1930.34,-1641.21"/>
<polygon fill="#b2fe58" stroke="#b2fe58" points="1714.53,-1531.7 1712.69,-1520.88 1711.74,-1527.54 1708.95,-1523.39 1708.95,-1523.39 1708.95,-1523.39 1711.74,-1527.54 1705.22,-1525.9 1714.53,-1531.7 1714.53,-1531.7"/>
<text text-anchor="middle" x="1870.5" y="-1610.8" font-family="Times,serif" font-size="14.00">admin_contacts</text>
</g>
<!-- Epp::Nameserver -->
<g id="node33" class="node"><title>Epp::Nameserver</title>
<ellipse fill="none" stroke="black" cx="1846.5" cy="-1505.5" rx="72.5877" ry="18"/>
<text text-anchor="middle" x="1846.5" y="-1501.8" font-family="Times,serif" font-size="14.00">Epp::Nameserver</text>
</g>
<!-- Epp::EppDomain&#45;&gt;Epp::Nameserver -->
<g id="edge12" class="edge"><title>Epp::EppDomain&#45;&gt;Epp::Nameserver</title>
<path fill="none" stroke="#182824" d="M1933.83,-1639.79C1907.07,-1598.95 1880.08,-1557.75 1863.33,-1532.19"/>
<ellipse fill="none" stroke="#182824" cx="1936.07" cy="-1643.2" rx="4.00002" ry="4.00002"/>
<polygon fill="#182824" stroke="#182824" points="1863.12,-1531.87 1861.41,-1521.04 1860.38,-1527.69 1857.64,-1523.51 1857.64,-1523.51 1857.64,-1523.51 1860.38,-1527.69 1853.88,-1525.97 1863.12,-1531.87 1863.12,-1531.87"/>
</g>
<!-- Epp::DomainStatus -->
<g id="node34" class="node"><title>Epp::DomainStatus</title>
<ellipse fill="none" stroke="black" cx="2017.5" cy="-1505.5" rx="79.8859" ry="18"/>
<text text-anchor="middle" x="2017.5" y="-1501.8" font-family="Times,serif" font-size="14.00">Epp::DomainStatus</text>
</g>
<!-- Epp::EppDomain&#45;&gt;Epp::DomainStatus -->
<g id="edge13" class="edge"><title>Epp::EppDomain&#45;&gt;Epp::DomainStatus</title>
<path fill="none" stroke="#a5b2f7" d="M2017.5,-1632.37C2017.5,-1594.92 2017.5,-1557.97 2017.5,-1533.89"/>
<ellipse fill="none" stroke="#a5b2f7" cx="2017.5" cy="-1636.44" rx="4" ry="4"/>
<polygon fill="#a5b2f7" stroke="#a5b2f7" points="2017.5,-1533.78 2022,-1523.78 2017.5,-1528.78 2017.5,-1523.78 2017.5,-1523.78 2017.5,-1523.78 2017.5,-1528.78 2013,-1523.78 2017.5,-1533.78 2017.5,-1533.78"/>
</g>
<!-- Epp::DomainTransfer -->
<g id="node35" class="node"><title>Epp::DomainTransfer</title>
<ellipse fill="none" stroke="black" cx="2203.5" cy="-1505.5" rx="88.2844" ry="18"/>
<text text-anchor="middle" x="2203.5" y="-1501.8" font-family="Times,serif" font-size="14.00">Epp::DomainTransfer</text>
</g>
<!-- Epp::EppDomain&#45;&gt;Epp::DomainTransfer -->
<g id="edge14" class="edge"><title>Epp::EppDomain&#45;&gt;Epp::DomainTransfer</title>
<path fill="none" stroke="#baf988" d="M2101.65,-1646.83C2103.28,-1644.53 2104.89,-1642.25 2106.5,-1640 2133.49,-1602.1 2165.28,-1558.55 2184.91,-1531.78"/>
<ellipse fill="none" stroke="#baf988" cx="2099.04" cy="-1650.5" rx="4.00002" ry="4.00002"/>
<polygon fill="#baf988" stroke="#baf988" points="2184.92,-1531.77 2194.47,-1526.37 2187.88,-1527.74 2190.84,-1523.71 2190.84,-1523.71 2190.84,-1523.71 2187.88,-1527.74 2187.21,-1521.04 2184.92,-1531.77 2184.92,-1531.77"/>
</g>
<!-- Epp::Dnskey -->
<g id="node36" class="node"><title>Epp::Dnskey</title>
<ellipse fill="none" stroke="black" cx="2366.5" cy="-1505.5" rx="56.59" ry="18"/>
<text text-anchor="middle" x="2366.5" y="-1501.8" font-family="Times,serif" font-size="14.00">Epp::Dnskey</text>
</g>
<!-- Epp::EppDomain&#45;&gt;Epp::Dnskey -->
<g id="edge15" class="edge"><title>Epp::EppDomain&#45;&gt;Epp::Dnskey</title>
<path fill="none" stroke="#7ceff2" d="M2103.11,-1642.45C2104.23,-1641.61 2105.36,-1640.8 2106.5,-1640 2179.61,-1588.98 2225.76,-1637.6 2300.5,-1589 2322.47,-1574.71 2340.47,-1550.68 2352.09,-1532.23"/>
<ellipse fill="none" stroke="#7ceff2" cx="2099.93" cy="-1644.95" rx="4.00002" ry="4.00002"/>
<polygon fill="#7ceff2" stroke="#7ceff2" points="2352.24,-1531.98 2361.28,-1525.76 2354.84,-1527.7 2357.43,-1523.43 2357.43,-1523.43 2357.43,-1523.43 2354.84,-1527.7 2353.58,-1521.09 2352.24,-1531.98 2352.24,-1531.98"/>
</g>
<!-- Epp::Keyrelay -->
<g id="node37" class="node"><title>Epp::Keyrelay</title>
<ellipse fill="none" stroke="black" cx="2502.5" cy="-1505.5" rx="61.99" ry="18"/>
<text text-anchor="middle" x="2502.5" y="-1501.8" font-family="Times,serif" font-size="14.00">Epp::Keyrelay</text>
</g>
<!-- Epp::EppDomain&#45;&gt;Epp::Keyrelay -->
<g id="edge16" class="edge"><title>Epp::EppDomain&#45;&gt;Epp::Keyrelay</title>
<path fill="none" stroke="#d875be" d="M2103.41,-1641.99C2104.43,-1641.31 2105.46,-1640.65 2106.5,-1640 2114.27,-1635.14 2424.51,-1593.48 2432.5,-1589 2456.15,-1575.73 2475.39,-1551.19 2487.67,-1532.31"/>
<ellipse fill="none" stroke="#d875be" cx="2100.07" cy="-1644.39" rx="4.00002" ry="4.00002"/>
<polygon fill="#d875be" stroke="#d875be" points="2487.83,-1532.05 2496.95,-1525.95 2490.48,-1527.81 2493.13,-1523.57 2493.13,-1523.57 2493.13,-1523.57 2490.48,-1527.81 2489.31,-1521.19 2487.83,-1532.05 2487.83,-1532.05"/>
</g>
<!-- Epp::DomainVersion -->
<g id="node38" class="node"><title>Epp::DomainVersion</title>
<ellipse fill="none" stroke="black" cx="2668.5" cy="-1505.5" rx="86.3847" ry="18"/>
<text text-anchor="middle" x="2668.5" y="-1501.8" font-family="Times,serif" font-size="14.00">Epp::DomainVersion</text>
</g>
<!-- Epp::EppDomain&#45;&gt;Epp::DomainVersion -->
<g id="edge17" class="edge"><title>Epp::EppDomain&#45;&gt;Epp::DomainVersion</title>
<path fill="none" stroke="#fdbc02" d="M2103.37,-1641.91C2104.4,-1641.26 2105.45,-1640.62 2106.5,-1640 2140.39,-1620.07 2243.41,-1626.22 2282.5,-1622 2411.91,-1608.04 2454.33,-1641.36 2573.5,-1589 2603.21,-1575.95 2630.42,-1550.27 2648.04,-1531.01"/>
<ellipse fill="none" stroke="#fdbc02" cx="2099.97" cy="-1644.23" rx="4.00002" ry="4.00002"/>
<polygon fill="#fdbc02" stroke="#fdbc02" points="2648.1,-1530.93 2658.11,-1526.45 2651.43,-1527.2 2654.75,-1523.46 2654.75,-1523.46 2654.75,-1523.46 2651.43,-1527.2 2651.39,-1520.47 2648.1,-1530.93 2648.1,-1530.93"/>
<text text-anchor="middle" x="2544.5" y="-1610.8" font-family="Times,serif" font-size="14.00">versions</text>
</g>
<!-- Message -->
<g id="node17" class="node"><title>Message</title>
<path fill="none" stroke="black" d="M951.5,-1173.5C951.5,-1173.5 1081.5,-1173.5 1081.5,-1173.5 1087.5,-1173.5 1093.5,-1179.5 1093.5,-1185.5 1093.5,-1185.5 1093.5,-1312.5 1093.5,-1312.5 1093.5,-1318.5 1087.5,-1324.5 1081.5,-1324.5 1081.5,-1324.5 951.5,-1324.5 951.5,-1324.5 945.5,-1324.5 939.5,-1318.5 939.5,-1312.5 939.5,-1312.5 939.5,-1185.5 939.5,-1185.5 939.5,-1179.5 945.5,-1173.5 951.5,-1173.5"/>
<text text-anchor="middle" x="1016.5" y="-1309.3" font-family="Times,serif" font-size="14.00">Message</text>
<polyline fill="none" stroke="black" points="939.5,-1301.5 1093.5,-1301.5 "/>
<text text-anchor="start" x="947.5" y="-1286.3" font-family="Times,serif" font-size="14.00">id :integer</text>
<text text-anchor="start" x="947.5" y="-1271.3" font-family="Times,serif" font-size="14.00">registrar_id :integer</text>
<text text-anchor="start" x="947.5" y="-1256.3" font-family="Times,serif" font-size="14.00">body :string</text>
<text text-anchor="start" x="947.5" y="-1241.3" font-family="Times,serif" font-size="14.00">attached_obj_type :string</text>
<text text-anchor="start" x="947.5" y="-1226.3" font-family="Times,serif" font-size="14.00">attached_obj_id :string</text>
<text text-anchor="start" x="947.5" y="-1211.3" font-family="Times,serif" font-size="14.00">queued :boolean</text>
<text text-anchor="start" x="947.5" y="-1196.3" font-family="Times,serif" font-size="14.00">created_at :datetime</text>
<text text-anchor="start" x="947.5" y="-1181.3" font-family="Times,serif" font-size="14.00">updated_at :datetime</text>
</g>
<!-- EppSession -->
<g id="node18" class="node"><title>EppSession</title>
<path fill="none" stroke="black" d="M2127,-1715.5C2127,-1715.5 2234,-1715.5 2234,-1715.5 2240,-1715.5 2246,-1721.5 2246,-1727.5 2246,-1727.5 2246,-1809.5 2246,-1809.5 2246,-1815.5 2240,-1821.5 2234,-1821.5 2234,-1821.5 2127,-1821.5 2127,-1821.5 2121,-1821.5 2115,-1815.5 2115,-1809.5 2115,-1809.5 2115,-1727.5 2115,-1727.5 2115,-1721.5 2121,-1715.5 2127,-1715.5"/>
<text text-anchor="middle" x="2180.5" y="-1806.3" font-family="Times,serif" font-size="14.00">EppSession</text>
<polyline fill="none" stroke="black" points="2115,-1798.5 2246,-1798.5 "/>
<text text-anchor="start" x="2123" y="-1783.3" font-family="Times,serif" font-size="14.00">id :integer</text>
<text text-anchor="start" x="2123" y="-1768.3" font-family="Times,serif" font-size="14.00">session_id :string</text>
<text text-anchor="start" x="2123" y="-1753.3" font-family="Times,serif" font-size="14.00">data :text</text>
<text text-anchor="start" x="2123" y="-1738.3" font-family="Times,serif" font-size="14.00">created_at :datetime</text>
<text text-anchor="start" x="2123" y="-1723.3" font-family="Times,serif" font-size="14.00">updated_at :datetime</text>
</g>
<!-- AddressVersion -->
<g id="node19" class="node"><title>AddressVersion</title>
<path fill="none" stroke="black" d="M1354,-241C1354,-241 1457,-241 1457,-241 1463,-241 1469,-247 1469,-253 1469,-253 1469,-365 1469,-365 1469,-371 1463,-377 1457,-377 1457,-377 1354,-377 1354,-377 1348,-377 1342,-371 1342,-365 1342,-365 1342,-253 1342,-253 1342,-247 1348,-241 1354,-241"/>
<text text-anchor="middle" x="1405.5" y="-361.8" font-family="Times,serif" font-size="14.00">AddressVersion</text>
<polyline fill="none" stroke="black" points="1342,-354 1469,-354 "/>
<text text-anchor="start" x="1350" y="-338.8" font-family="Times,serif" font-size="14.00">id :integer</text>
<text text-anchor="start" x="1350" y="-323.8" font-family="Times,serif" font-size="14.00">item_type :string</text>
<text text-anchor="start" x="1350" y="-308.8" font-family="Times,serif" font-size="14.00">item_id :integer</text>
<text text-anchor="start" x="1350" y="-293.8" font-family="Times,serif" font-size="14.00">event :string</text>
<text text-anchor="start" x="1350" y="-278.8" font-family="Times,serif" font-size="14.00">whodunnit :string</text>
<text text-anchor="start" x="1350" y="-263.8" font-family="Times,serif" font-size="14.00">object :text</text>
<text text-anchor="start" x="1350" y="-248.8" font-family="Times,serif" font-size="14.00">created_at :datetime</text>
</g>
<!-- Keyrelay -->
<g id="node21" class="node"><title>Keyrelay</title>
<path fill="none" stroke="black" d="M161.5,-188.5C161.5,-188.5 297.5,-188.5 297.5,-188.5 303.5,-188.5 309.5,-194.5 309.5,-200.5 309.5,-200.5 309.5,-417.5 309.5,-417.5 309.5,-423.5 303.5,-429.5 297.5,-429.5 297.5,-429.5 161.5,-429.5 161.5,-429.5 155.5,-429.5 149.5,-423.5 149.5,-417.5 149.5,-417.5 149.5,-200.5 149.5,-200.5 149.5,-194.5 155.5,-188.5 161.5,-188.5"/>
<text text-anchor="middle" x="229.5" y="-414.3" font-family="Times,serif" font-size="14.00">Keyrelay</text>
<polyline fill="none" stroke="black" points="149.5,-406.5 309.5,-406.5 "/>
<text text-anchor="start" x="157.5" y="-391.3" font-family="Times,serif" font-size="14.00">id :integer</text>
<text text-anchor="start" x="157.5" y="-376.3" font-family="Times,serif" font-size="14.00">domain_id :integer</text>
<text text-anchor="start" x="157.5" y="-361.3" font-family="Times,serif" font-size="14.00">pa_date :datetime</text>
<text text-anchor="start" x="157.5" y="-346.3" font-family="Times,serif" font-size="14.00">key_data_flags :string</text>
<text text-anchor="start" x="157.5" y="-331.3" font-family="Times,serif" font-size="14.00">key_data_protocol :string</text>
<text text-anchor="start" x="157.5" y="-316.3" font-family="Times,serif" font-size="14.00">key_data_alg :string</text>
<text text-anchor="start" x="157.5" y="-301.3" font-family="Times,serif" font-size="14.00">key_data_public_key :text</text>
<text text-anchor="start" x="157.5" y="-286.3" font-family="Times,serif" font-size="14.00">auth_info_pw :string</text>
<text text-anchor="start" x="157.5" y="-271.3" font-family="Times,serif" font-size="14.00">expiry_relative :string</text>
<text text-anchor="start" x="157.5" y="-256.3" font-family="Times,serif" font-size="14.00">expiry_absolute :datetime</text>
<text text-anchor="start" x="157.5" y="-241.3" font-family="Times,serif" font-size="14.00">requester_id :integer</text>
<text text-anchor="start" x="157.5" y="-226.3" font-family="Times,serif" font-size="14.00">accepter_id :integer</text>
<text text-anchor="start" x="157.5" y="-211.3" font-family="Times,serif" font-size="14.00">created_at :datetime</text>
<text text-anchor="start" x="157.5" y="-196.3" font-family="Times,serif" font-size="14.00">updated_at :datetime</text>
</g>
<!-- ReservedDomain -->
<g id="node22" class="node"><title>ReservedDomain</title>
<path fill="none" stroke="black" d="M2276,-1723C2276,-1723 2383,-1723 2383,-1723 2389,-1723 2395,-1729 2395,-1735 2395,-1735 2395,-1802 2395,-1802 2395,-1808 2389,-1814 2383,-1814 2383,-1814 2276,-1814 2276,-1814 2270,-1814 2264,-1808 2264,-1802 2264,-1802 2264,-1735 2264,-1735 2264,-1729 2270,-1723 2276,-1723"/>
<text text-anchor="middle" x="2329.5" y="-1798.8" font-family="Times,serif" font-size="14.00">ReservedDomain</text>
<polyline fill="none" stroke="black" points="2264,-1791 2395,-1791 "/>
<text text-anchor="start" x="2272" y="-1775.8" font-family="Times,serif" font-size="14.00">id :integer</text>
<text text-anchor="start" x="2272" y="-1760.8" font-family="Times,serif" font-size="14.00">name :string</text>
<text text-anchor="start" x="2272" y="-1745.8" font-family="Times,serif" font-size="14.00">created_at :datetime</text>
<text text-anchor="start" x="2272" y="-1730.8" font-family="Times,serif" font-size="14.00">updated_at :datetime</text>
</g>
<!-- Registrar -->
<g id="node23" class="node"><title>Registrar</title>
<path fill="none" stroke="black" d="M960,-1422.5C960,-1422.5 1073,-1422.5 1073,-1422.5 1079,-1422.5 1085,-1428.5 1085,-1434.5 1085,-1434.5 1085,-1576.5 1085,-1576.5 1085,-1582.5 1079,-1588.5 1073,-1588.5 1073,-1588.5 960,-1588.5 960,-1588.5 954,-1588.5 948,-1582.5 948,-1576.5 948,-1576.5 948,-1434.5 948,-1434.5 948,-1428.5 954,-1422.5 960,-1422.5"/>
<text text-anchor="middle" x="1016.5" y="-1573.3" font-family="Times,serif" font-size="14.00">Registrar</text>
<polyline fill="none" stroke="black" points="948,-1565.5 1085,-1565.5 "/>
<text text-anchor="start" x="956" y="-1550.3" font-family="Times,serif" font-size="14.00">id :integer</text>
<text text-anchor="start" x="956" y="-1535.3" font-family="Times,serif" font-size="14.00">name :string</text>
<text text-anchor="start" x="956" y="-1520.3" font-family="Times,serif" font-size="14.00">reg_no :string</text>
<text text-anchor="start" x="956" y="-1505.3" font-family="Times,serif" font-size="14.00">vat_no :string</text>
<text text-anchor="start" x="956" y="-1490.3" font-family="Times,serif" font-size="14.00">address :string</text>
<text text-anchor="start" x="956" y="-1475.3" font-family="Times,serif" font-size="14.00">country_id :integer</text>
<text text-anchor="start" x="956" y="-1460.3" font-family="Times,serif" font-size="14.00">billing_address :string</text>
<text text-anchor="start" x="956" y="-1445.3" font-family="Times,serif" font-size="14.00">created_at :datetime</text>
<text text-anchor="start" x="956" y="-1430.3" font-family="Times,serif" font-size="14.00">updated_at :datetime</text>
</g>
<!-- Registrar&#45;&gt;Contact -->
<g id="edge19" class="edge"><title>Registrar&#45;&gt;Contact</title>
<path fill="none" stroke="#6448d9" d="M1089.16,-1415.46C1094.54,-1405.61 1099.15,-1395.38 1102.5,-1385 1139.6,-1269.94 1129.01,-1230.95 1102.5,-1113 1099.8,-1100.99 1096.2,-1088.84 1092,-1076.81"/>
<ellipse fill="none" stroke="#6448d9" cx="1087.1" cy="-1419.09" rx="4.00002" ry="4.00002"/>
<polygon fill="#6448d9" stroke="#6448d9" points="1091.93,-1076.61 1092.74,-1065.67 1090.22,-1071.91 1088.51,-1067.21 1088.51,-1067.21 1088.51,-1067.21 1090.22,-1071.91 1084.28,-1068.74 1091.93,-1076.61 1091.93,-1076.61"/>
</g>
<!-- Registrar&#45;&gt;EppUser -->
<g id="edge20" class="edge"><title>Registrar&#45;&gt;EppUser</title>
<path fill="none" stroke="#7596d4" d="M950.893,-1415.73C943.837,-1405.48 936.904,-1395.09 930.5,-1385 921.614,-1371 912.643,-1355.88 904.147,-1341"/>
<ellipse fill="none" stroke="#7596d4" cx="953.264" cy="-1419.15" rx="4.00002" ry="4.00002"/>
<polygon fill="#7596d4" stroke="#7596d4" points="904.135,-1340.98 903.119,-1330.06 901.669,-1336.63 899.204,-1332.28 899.204,-1332.28 899.204,-1332.28 901.669,-1336.63 895.289,-1334.5 904.135,-1340.98 904.135,-1340.98"/>
</g>
<!-- Registrar&#45;&gt;Message -->
<g id="edge22" class="edge"><title>Registrar&#45;&gt;Message</title>
<path fill="none" stroke="#ecee2a" d="M1016.5,-1414.05C1016.5,-1388.32 1016.5,-1360.4 1016.5,-1335.01"/>
<ellipse fill="none" stroke="#ecee2a" cx="1016.5" cy="-1418.22" rx="4" ry="4"/>
<polygon fill="#ecee2a" stroke="#ecee2a" points="1016.5,-1334.68 1021,-1324.68 1016.5,-1329.68 1016.5,-1324.68 1016.5,-1324.68 1016.5,-1324.68 1016.5,-1329.68 1012,-1324.68 1016.5,-1334.68 1016.5,-1334.68"/>
</g>
<!-- User -->
<g id="node24" class="node"><title>User</title>
<path fill="none" stroke="black" d="M1162,-1113.5C1162,-1113.5 1311,-1113.5 1311,-1113.5 1317,-1113.5 1323,-1119.5 1323,-1125.5 1323,-1125.5 1323,-1372.5 1323,-1372.5 1323,-1378.5 1317,-1384.5 1311,-1384.5 1311,-1384.5 1162,-1384.5 1162,-1384.5 1156,-1384.5 1150,-1378.5 1150,-1372.5 1150,-1372.5 1150,-1125.5 1150,-1125.5 1150,-1119.5 1156,-1113.5 1162,-1113.5"/>
<text text-anchor="middle" x="1236.5" y="-1369.3" font-family="Times,serif" font-size="14.00">User</text>
<polyline fill="none" stroke="black" points="1150,-1361.5 1323,-1361.5 "/>
<text text-anchor="start" x="1158" y="-1346.3" font-family="Times,serif" font-size="14.00">id :integer</text>
<text text-anchor="start" x="1158" y="-1331.3" font-family="Times,serif" font-size="14.00">username :string</text>
<text text-anchor="start" x="1158" y="-1316.3" font-family="Times,serif" font-size="14.00">password :string</text>
<text text-anchor="start" x="1158" y="-1301.3" font-family="Times,serif" font-size="14.00">role_id :integer</text>
<text text-anchor="start" x="1158" y="-1286.3" font-family="Times,serif" font-size="14.00">created_at :datetime</text>
<text text-anchor="start" x="1158" y="-1271.3" font-family="Times,serif" font-size="14.00">updated_at :datetime</text>
<text text-anchor="start" x="1158" y="-1256.3" font-family="Times,serif" font-size="14.00">email :string</text>
<text text-anchor="start" x="1158" y="-1241.3" font-family="Times,serif" font-size="14.00">sign_in_count :integer</text>
<text text-anchor="start" x="1158" y="-1226.3" font-family="Times,serif" font-size="14.00">current_sign_in_at :datetime</text>
<text text-anchor="start" x="1158" y="-1211.3" font-family="Times,serif" font-size="14.00">last_sign_in_at :datetime</text>
<text text-anchor="start" x="1158" y="-1196.3" font-family="Times,serif" font-size="14.00">current_sign_in_ip :inet</text>
<text text-anchor="start" x="1158" y="-1181.3" font-family="Times,serif" font-size="14.00">last_sign_in_ip :inet</text>
<text text-anchor="start" x="1158" y="-1166.3" font-family="Times,serif" font-size="14.00">admin :boolean</text>
<text text-anchor="start" x="1158" y="-1151.3" font-family="Times,serif" font-size="14.00">identity_code :string</text>
<text text-anchor="start" x="1158" y="-1136.3" font-family="Times,serif" font-size="14.00">registrar_id :integer</text>
<text text-anchor="start" x="1158" y="-1121.3" font-family="Times,serif" font-size="14.00">country_id :integer</text>
</g>
<!-- Registrar&#45;&gt;User -->
<g id="edge21" class="edge"><title>Registrar&#45;&gt;User</title>
<path fill="none" stroke="#163d67" d="M1091.2,-1447.13C1106.62,-1433.76 1122.2,-1419.01 1135.5,-1404 1138.71,-1400.38 1141.89,-1396.64 1145.04,-1392.82"/>
<ellipse fill="none" stroke="#163d67" cx="1088.11" cy="-1449.78" rx="4.00002" ry="4.00002"/>
<polygon fill="#163d67" stroke="#163d67" points="1145.18,-1392.66 1154.96,-1387.7 1148.32,-1388.77 1151.46,-1384.88 1151.46,-1384.88 1151.46,-1384.88 1148.32,-1388.77 1147.95,-1382.05 1145.18,-1392.66 1145.18,-1392.66"/>
</g>
<!-- Registrar&#45;&gt;Domain -->
<g id="edge18" class="edge"><title>Registrar&#45;&gt;Domain</title>
<path fill="none" stroke="#f9eadf" d="M939.757,-1488.06C884.928,-1471.87 814.992,-1441.13 780.5,-1385 660.651,-1189.98 702.849,-911.846 744.575,-747.375"/>
<ellipse fill="none" stroke="#f9eadf" cx="943.885" cy="-1489.24" rx="4.00001" ry="4.00001"/>
<polygon fill="#f9eadf" stroke="#f9eadf" points="744.577,-747.368 751.425,-738.804 745.822,-742.526 747.067,-737.683 747.067,-737.683 747.067,-737.683 745.822,-742.526 742.708,-736.563 744.577,-747.368 744.577,-747.368"/>
</g>
<!-- Role&#45;&gt;User -->
<g id="edge23" class="edge"><title>Role&#45;&gt;User</title>
<path fill="none" stroke="#d471c1" d="M1236.5,-1451.64C1236.5,-1434.65 1236.5,-1414.93 1236.5,-1394.61"/>
<ellipse fill="none" stroke="#d471c1" cx="1236.5" cy="-1455.88" rx="4" ry="4"/>
<polygon fill="#d471c1" stroke="#d471c1" points="1236.5,-1394.6 1241,-1384.6 1236.5,-1389.6 1236.5,-1384.6 1236.5,-1384.6 1236.5,-1384.6 1236.5,-1389.6 1232,-1384.6 1236.5,-1394.6 1236.5,-1394.6"/>
</g>
<!-- Address&#45;&gt;AddressVersion -->
<g id="edge24" class="edge"><title>Address&#45;&gt;AddressVersion</title>
<path fill="none" stroke="#17d730" d="M1405.5,-510.854C1405.5,-470.863 1405.5,-425.236 1405.5,-387.586"/>
<ellipse fill="none" stroke="#17d730" cx="1405.5" cy="-514.94" rx="4" ry="4"/>
<polygon fill="#17d730" stroke="#17d730" points="1405.5,-387.19 1410,-377.19 1405.5,-382.19 1405.5,-377.19 1405.5,-377.19 1405.5,-377.19 1405.5,-382.19 1401,-377.19 1405.5,-387.19 1405.5,-387.19"/>
<text text-anchor="middle" x="1428.5" y="-451.8" font-family="Times,serif" font-size="14.00">versions</text>
</g>
<!-- Domain&#45;&gt;DomainContact -->
<g id="edge25" class="edge"><title>Domain&#45;&gt;DomainContact</title>
<path fill="none" stroke="#7c1bfd" d="M872.037,-547.693C913.877,-515.523 963.314,-473.693 1001.5,-430 1015.19,-414.341 1028.02,-395.918 1039.07,-378.27"/>
<ellipse fill="none" stroke="#7c1bfd" cx="868.835" cy="-550.141" rx="4.00002" ry="4.00002"/>
<polygon fill="#7c1bfd" stroke="#7c1bfd" points="1039.11,-378.203 1048.18,-372.041 1041.73,-373.944 1044.35,-369.684 1044.35,-369.684 1044.35,-369.684 1041.73,-373.944 1040.52,-367.328 1039.11,-378.203 1039.11,-378.203"/>
</g>
<!-- Domain&#45;&gt;Contact -->
<g id="edge26" class="edge"><title>Domain&#45;&gt;Contact</title>
<path fill="none" stroke="#82fe6f" d="M808.506,-747.141C811.947,-755.461 815.918,-763.492 820.5,-771 849.203,-818.032 896.789,-857.374 938.001,-885.336"/>
<polygon fill="#82fe6f" stroke="#82fe6f" points="808.439,-746.968 809.04,-736.018 806.641,-742.303 804.842,-737.637 804.842,-737.637 804.842,-737.637 806.641,-742.303 800.643,-739.256 808.439,-746.968 808.439,-746.968"/>
<polygon fill="#82fe6f" stroke="#82fe6f" points="938.101,-885.403 943.923,-894.696 942.26,-888.178 946.42,-890.952 946.42,-890.952 946.42,-890.952 942.26,-888.178 948.917,-887.209 938.101,-885.403 938.101,-885.403"/>
<text text-anchor="middle" x="857.5" y="-759.8" font-family="Times,serif" font-size="14.00">tech_contacts</text>
</g>
<!-- Domain&#45;&gt;Contact -->
<g id="edge27" class="edge"><title>Domain&#45;&gt;Contact</title>
<path fill="none" stroke="#f74388" d="M871.55,-724.465C879.347,-735.098 887.094,-745.733 894.5,-756 909.555,-776.87 925.453,-799.274 940.64,-820.859"/>
<polygon fill="#f74388" stroke="#f74388" points="871.503,-724.4 869.21,-713.677 868.543,-720.371 865.583,-716.341 865.583,-716.341 865.583,-716.341 868.543,-720.371 861.956,-719.005 871.503,-724.4 871.503,-724.4"/>
<polygon fill="#f74388" stroke="#f74388" points="940.673,-820.905 942.741,-831.674 943.548,-824.995 946.423,-829.086 946.423,-829.086 946.423,-829.086 943.548,-824.995 950.104,-826.499 940.673,-820.905 940.673,-820.905"/>
<text text-anchor="middle" x="948.5" y="-759.8" font-family="Times,serif" font-size="14.00">admin_contacts</text>
</g>
<!-- Domain&#45;&gt;DomainVersion -->
<g id="edge33" class="edge"><title>Domain&#45;&gt;DomainVersion</title>
<path fill="none" stroke="#9b111b" d="M850.883,-474.106C863.993,-446.741 877.425,-418.703 889.392,-393.721"/>
<ellipse fill="none" stroke="#9b111b" cx="849.08" cy="-477.869" rx="4.00002" ry="4.00002"/>
<polygon fill="#9b111b" stroke="#9b111b" points="889.412,-393.681 897.79,-386.607 891.572,-389.172 893.732,-384.662 893.732,-384.662 893.732,-384.662 891.572,-389.172 889.674,-382.718 889.412,-393.681 889.412,-393.681"/>
<text text-anchor="middle" x="885.5" y="-451.8" font-family="Times,serif" font-size="14.00">versions</text>
</g>
<!-- Domain&#45;&gt;Nameserver -->
<g id="edge28" class="edge"><title>Domain&#45;&gt;Nameserver</title>
<path fill="none" stroke="#6ee754" d="M699.265,-604.193C566.349,-593.594 310.646,-556.917 140.5,-430 124.821,-418.304 111.639,-402.276 100.919,-385.741"/>
<ellipse fill="none" stroke="#6ee754" cx="703.462" cy="-604.517" rx="4" ry="4"/>
<polygon fill="#6ee754" stroke="#6ee754" points="100.81,-385.565 99.3609,-374.696 98.1738,-381.317 95.5373,-377.068 95.5373,-377.068 95.5373,-377.068 98.1738,-381.317 91.7137,-379.441 100.81,-385.565 100.81,-385.565"/>
</g>
<!-- Domain&#45;&gt;Keyrelay -->
<g id="edge32" class="edge"><title>Domain&#45;&gt;Keyrelay</title>
<path fill="none" stroke="#dea5bb" d="M699.371,-590.882C599.525,-567.367 434.73,-518.087 318.5,-430 318.219,-429.787 317.938,-429.573 317.658,-429.358"/>
<ellipse fill="none" stroke="#dea5bb" cx="703.442" cy="-591.829" rx="4.00001" ry="4.00001"/>
<polygon fill="#dea5bb" stroke="#dea5bb" points="317.413,-429.157 312.523,-419.341 313.543,-425.99 309.673,-422.824 309.673,-422.824 309.673,-422.824 313.543,-425.99 306.824,-426.307 317.413,-429.157 317.413,-429.157"/>
</g>
<!-- Dnskey -->
<g id="node28" class="node"><title>Dnskey</title>
<path fill="none" stroke="black" d="M340,-211C340,-211 491,-211 491,-211 497,-211 503,-217 503,-223 503,-223 503,-395 503,-395 503,-401 497,-407 491,-407 491,-407 340,-407 340,-407 334,-407 328,-401 328,-395 328,-395 328,-223 328,-223 328,-217 334,-211 340,-211"/>
<text text-anchor="middle" x="415.5" y="-391.8" font-family="Times,serif" font-size="14.00">Dnskey</text>
<polyline fill="none" stroke="black" points="328,-384 503,-384 "/>
<text text-anchor="start" x="336" y="-368.8" font-family="Times,serif" font-size="14.00">id :integer</text>
<text text-anchor="start" x="336" y="-353.8" font-family="Times,serif" font-size="14.00">domain_id :integer</text>
<text text-anchor="start" x="336" y="-338.8" font-family="Times,serif" font-size="14.00">flags :integer</text>
<text text-anchor="start" x="336" y="-323.8" font-family="Times,serif" font-size="14.00">protocol :integer</text>
<text text-anchor="start" x="336" y="-308.8" font-family="Times,serif" font-size="14.00">alg :integer</text>
<text text-anchor="start" x="336" y="-293.8" font-family="Times,serif" font-size="14.00">public_key :text</text>
<text text-anchor="start" x="336" y="-278.8" font-family="Times,serif" font-size="14.00">delegation_signer_id :integer</text>
<text text-anchor="start" x="336" y="-263.8" font-family="Times,serif" font-size="14.00">ds_key_tag :string</text>
<text text-anchor="start" x="336" y="-248.8" font-family="Times,serif" font-size="14.00">ds_alg :integer</text>
<text text-anchor="start" x="336" y="-233.8" font-family="Times,serif" font-size="14.00">ds_digest_type :integer</text>
<text text-anchor="start" x="336" y="-218.8" font-family="Times,serif" font-size="14.00">ds_digest :string</text>
</g>
<!-- Domain&#45;&gt;Dnskey -->
<g id="edge31" class="edge"><title>Domain&#45;&gt;Dnskey</title>
<path fill="none" stroke="#20855b" d="M700.33,-561.834C643.758,-528.997 569.894,-481.798 512.5,-430 507.099,-425.126 501.753,-419.936 496.51,-414.551"/>
<ellipse fill="none" stroke="#20855b" cx="704.027" cy="-563.968" rx="4.00002" ry="4.00002"/>
<polygon fill="#20855b" stroke="#20855b" points="496.318,-414.349 492.692,-404 492.874,-410.724 489.43,-407.099 489.43,-407.099 489.43,-407.099 492.874,-410.724 486.168,-410.199 496.318,-414.349 496.318,-414.349"/>
</g>
<!-- DomainTransfer -->
<g id="node29" class="node"><title>DomainTransfer</title>
<path fill="none" stroke="black" d="M533.5,-218.5C533.5,-218.5 697.5,-218.5 697.5,-218.5 703.5,-218.5 709.5,-224.5 709.5,-230.5 709.5,-230.5 709.5,-387.5 709.5,-387.5 709.5,-393.5 703.5,-399.5 697.5,-399.5 697.5,-399.5 533.5,-399.5 533.5,-399.5 527.5,-399.5 521.5,-393.5 521.5,-387.5 521.5,-387.5 521.5,-230.5 521.5,-230.5 521.5,-224.5 527.5,-218.5 533.5,-218.5"/>
<text text-anchor="middle" x="615.5" y="-384.3" font-family="Times,serif" font-size="14.00">DomainTransfer</text>
<polyline fill="none" stroke="black" points="521.5,-376.5 709.5,-376.5 "/>
<text text-anchor="start" x="529.5" y="-361.3" font-family="Times,serif" font-size="14.00">id :integer</text>
<text text-anchor="start" x="529.5" y="-346.3" font-family="Times,serif" font-size="14.00">domain_id :integer</text>
<text text-anchor="start" x="529.5" y="-331.3" font-family="Times,serif" font-size="14.00">status :string</text>
<text text-anchor="start" x="529.5" y="-316.3" font-family="Times,serif" font-size="14.00">transfer_requested_at :datetime</text>
<text text-anchor="start" x="529.5" y="-301.3" font-family="Times,serif" font-size="14.00">transferred_at :datetime</text>
<text text-anchor="start" x="529.5" y="-286.3" font-family="Times,serif" font-size="14.00">transfer_from_id :integer</text>
<text text-anchor="start" x="529.5" y="-271.3" font-family="Times,serif" font-size="14.00">transfer_to_id :integer</text>
<text text-anchor="start" x="529.5" y="-256.3" font-family="Times,serif" font-size="14.00">created_at :datetime</text>
<text text-anchor="start" x="529.5" y="-241.3" font-family="Times,serif" font-size="14.00">updated_at :datetime</text>
<text text-anchor="start" x="529.5" y="-226.3" font-family="Times,serif" font-size="14.00">wait_until :datetime</text>
</g>
<!-- Domain&#45;&gt;DomainTransfer -->
<g id="edge30" class="edge"><title>Domain&#45;&gt;DomainTransfer</title>
<path fill="none" stroke="#bdb231" d="M709.667,-474.379C697.021,-452.304 684.12,-429.784 672.085,-408.776"/>
<ellipse fill="none" stroke="#bdb231" cx="711.744" cy="-478.005" rx="4.00002" ry="4.00002"/>
<polygon fill="#bdb231" stroke="#bdb231" points="671.954,-408.548 670.888,-397.634 669.469,-404.209 666.984,-399.871 666.984,-399.871 666.984,-399.871 669.469,-404.209 663.079,-402.107 671.954,-408.548 671.954,-408.548"/>
</g>
<!-- DomainStatus -->
<g id="node30" class="node"><title>DomainStatus</title>
<path fill="none" stroke="black" d="M739.5,-263.5C739.5,-263.5 835.5,-263.5 835.5,-263.5 841.5,-263.5 847.5,-269.5 847.5,-275.5 847.5,-275.5 847.5,-342.5 847.5,-342.5 847.5,-348.5 841.5,-354.5 835.5,-354.5 835.5,-354.5 739.5,-354.5 739.5,-354.5 733.5,-354.5 727.5,-348.5 727.5,-342.5 727.5,-342.5 727.5,-275.5 727.5,-275.5 727.5,-269.5 733.5,-263.5 739.5,-263.5"/>
<text text-anchor="middle" x="787.5" y="-339.3" font-family="Times,serif" font-size="14.00">DomainStatus</text>
<polyline fill="none" stroke="black" points="727.5,-331.5 847.5,-331.5 "/>
<text text-anchor="start" x="735.5" y="-316.3" font-family="Times,serif" font-size="14.00">id :integer</text>
<text text-anchor="start" x="735.5" y="-301.3" font-family="Times,serif" font-size="14.00">domain_id :integer</text>
<text text-anchor="start" x="735.5" y="-286.3" font-family="Times,serif" font-size="14.00">description :string</text>
<text text-anchor="start" x="735.5" y="-271.3" font-family="Times,serif" font-size="14.00">value :string</text>
</g>
<!-- Domain&#45;&gt;DomainStatus -->
<g id="edge29" class="edge"><title>Domain&#45;&gt;DomainStatus</title>
<path fill="none" stroke="#602509" d="M786.953,-473.235C787.082,-434.833 787.215,-395.184 787.317,-364.58"/>
<ellipse fill="none" stroke="#602509" cx="786.939" cy="-477.476" rx="4" ry="4"/>
<polygon fill="#602509" stroke="#602509" points="787.317,-364.563 791.851,-354.578 787.334,-359.563 787.351,-354.563 787.351,-354.563 787.351,-354.563 787.334,-359.563 782.851,-354.548 787.317,-364.563 787.317,-364.563"/>
</g>
<!-- DomainStatus&#45;&gt;DomainStatusVersion -->
<g id="edge34" class="edge"><title>DomainStatus&#45;&gt;DomainStatusVersion</title>
<path fill="none" stroke="#5f5f07" d="M787.5,-255.259C787.5,-223.525 787.5,-182.553 787.5,-147.165"/>
<ellipse fill="none" stroke="#5f5f07" cx="787.5" cy="-259.42" rx="4" ry="4"/>
<polygon fill="#5f5f07" stroke="#5f5f07" points="787.5,-146.863 792,-136.863 787.5,-141.863 787.5,-136.863 787.5,-136.863 787.5,-136.863 787.5,-141.863 783,-136.863 787.5,-146.863 787.5,-146.863"/>
<text text-anchor="middle" x="810.5" y="-158.8" font-family="Times,serif" font-size="14.00">versions</text>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 68 KiB

After

Width:  |  Height:  |  Size: 0 B

Before After
Before After

View file

@ -36,7 +36,7 @@ Content-Type: application/json
"status": null, "status": null,
"valid_from": "2015-04-16T00:00:00.000Z", "valid_from": "2015-04-16T00:00:00.000Z",
"valid_to": "2016-04-16T00:00:00.000Z", "valid_to": "2016-04-16T00:00:00.000Z",
"owner_contact_id": 1, "registrant_id": 1,
"auth_info": "3ec9a29d618023920b61758c339b638f", "auth_info": "3ec9a29d618023920b61758c339b638f",
"created_at": "2015-04-16T08:48:39.992Z", "created_at": "2015-04-16T08:48:39.992Z",
"updated_at": "2015-04-16T08:48:39.991Z", "updated_at": "2015-04-16T08:48:39.991Z",

View file

@ -402,11 +402,11 @@ namespace :import do
# registrant # registrant
ActiveRecord::Base.connection.execute( ActiveRecord::Base.connection.execute(
"UPDATE domains "\ "UPDATE domains "\
"SET owner_contact_id = contacts.id "\ "SET registrant_id = contacts.id "\
"FROM contacts "\ "FROM contacts "\
"WHERE contacts.legacy_id = legacy_registrant_id "\ "WHERE contacts.legacy_id = legacy_registrant_id "\
"AND legacy_registrant_id IS NOT NULL "\ "AND legacy_registrant_id IS NOT NULL "\
"AND owner_contact_id IS NULL" "AND registrant_id IS NULL"
) )
# registrar # registrar

View file

@ -402,15 +402,15 @@ describe 'EPP Contact', epp: true do
end end
it 'fails if contact has associated domain' do it 'fails if contact has associated domain' do
@domain = Fabricate(:domain, registrar: @registrar1, owner_contact: @contact) @domain = Fabricate(:domain, registrar: @registrar1, registrant: @contact)
@domain.owner_contact.present?.should == true @domain.registrant.present?.should == true
response = delete_request response = delete_request
response[:msg].should == 'Object association prohibits operation [domains]' response[:msg].should == 'Object association prohibits operation [domains]'
response[:result_code].should == '2305' response[:result_code].should == '2305'
response[:results].count.should == 1 response[:results].count.should == 1
@domain.owner_contact.present?.should == true @domain.registrant.present?.should == true
end end
it 'fails with wrong authentication info' do it 'fails with wrong authentication info' do
@ -511,7 +511,7 @@ describe 'EPP Contact', epp: true do
contact.css('ident').first.text.should == '37605030299' contact.css('ident').first.text.should == '37605030299'
end end
it 'returns no authorization error for wrong password when owner' do it 'returns no authorization error for wrong password when registrant' do
response = info_request({ authInfo: { pw: { value: 'wrong-pw' } } }) response = info_request({ authInfo: { pw: { value: 'wrong-pw' } } })
response[:msg].should == 'Command completed successfully' response[:msg].should == 'Command completed successfully'

View file

@ -75,7 +75,7 @@ describe 'EPP Domain', epp: true do
'Required parameter missing: extension > extdata > legalDocument [legal_document]' 'Required parameter missing: extension > extdata > legalDocument [legal_document]'
end end
context 'with citizen as an owner' do context 'with citizen as a registrant' do
it 'creates a domain' do it 'creates a domain' do
dn = next_domain_name dn = next_domain_name
response = epp_plain_request(domain_create_xml({ response = epp_plain_request(domain_create_xml({
@ -642,7 +642,7 @@ describe 'EPP Domain', epp: true do
end end
end end
context 'with juridical persion as an owner' do context 'with juridical persion as a registrant' do
it 'creates a domain with contacts' do it 'creates a domain with contacts' do
xml = domain_create_xml({ xml = domain_create_xml({
registrant: { value: 'juridical_1234' }, registrant: { value: 'juridical_1234' },
@ -881,8 +881,8 @@ describe 'EPP Domain', epp: true do
end end
it 'transfers domain with contacts' do it 'transfers domain with contacts' do
original_oc_id = domain.owner_contact.id original_oc_id = domain.registrant.id
original_oc_code = domain.owner_contact.code original_oc_code = domain.registrant.code
original_contact_codes = domain.contacts.pluck(:code) original_contact_codes = domain.contacts.pluck(:code)
@ -899,12 +899,12 @@ describe 'EPP Domain', epp: true do
end end
# all domain contacts should be under registrar2 now # all domain contacts should be under registrar2 now
domain.owner_contact.reload domain.registrant.reload
domain.owner_contact.registrar_id.should == @registrar2.id domain.registrant.registrar_id.should == @registrar2.id
domain.owner_contact.id.should == original_oc_id domain.registrant.id.should == original_oc_id
# must generate new code # must generate new code
domain.owner_contact.code.should_not == original_oc_code domain.registrant.code.should_not == original_oc_code
domain.contacts.each do |c| domain.contacts.each do |c|
c.registrar_id.should == @registrar2.id c.registrar_id.should == @registrar2.id
@ -913,9 +913,9 @@ describe 'EPP Domain', epp: true do
end end
it 'transfers domain when registrant has more domains' do it 'transfers domain when registrant has more domains' do
Fabricate(:domain, owner_contact: domain.owner_contact) Fabricate(:domain, registrant: domain.registrant)
original_oc_id = domain.owner_contact.id original_oc_id = domain.registrant.id
original_oc_code = domain.owner_contact.code original_oc_code = domain.registrant.code
original_contact_codes = domain.contacts.pluck(:code) original_contact_codes = domain.contacts.pluck(:code)
@ -933,11 +933,11 @@ describe 'EPP Domain', epp: true do
# all domain contacts should be under registrar2 now # all domain contacts should be under registrar2 now
domain.reload domain.reload
domain.owner_contact.registrar_id.should == @registrar2.id domain.registrant.registrar_id.should == @registrar2.id
# owner_contact should be a new record # registrant should be a new record
domain.owner_contact.id.should_not == original_oc_id domain.registrant.id.should_not == original_oc_id
# must generate new code # must generate new code
domain.owner_contact.code.should_not == original_oc_code domain.registrant.code.should_not == original_oc_code
domain.contacts.each do |c| domain.contacts.each do |c|
c.registrar_id.should == @registrar2.id c.registrar_id.should == @registrar2.id
@ -947,10 +947,10 @@ describe 'EPP Domain', epp: true do
it 'transfers domain when registrant is admin or tech contact on some other domain' do it 'transfers domain when registrant is admin or tech contact on some other domain' do
d = Fabricate(:domain) d = Fabricate(:domain)
d.tech_contacts << domain.owner_contact d.tech_contacts << domain.registrant
original_oc_id = domain.owner_contact.id original_oc_id = domain.registrant.id
original_oc_code = domain.owner_contact.code original_oc_code = domain.registrant.code
original_contact_codes = domain.contacts.pluck(:code) original_contact_codes = domain.contacts.pluck(:code)
@ -968,11 +968,11 @@ describe 'EPP Domain', epp: true do
# all domain contacts should be under registrar2 now # all domain contacts should be under registrar2 now
domain.reload domain.reload
domain.owner_contact.registrar_id.should == @registrar2.id domain.registrant.registrar_id.should == @registrar2.id
# owner_contact should be a new record # registrant should be a new record
domain.owner_contact.id.should_not == original_oc_id domain.registrant.id.should_not == original_oc_id
# must generate new code # must generate new code
domain.owner_contact.code.should_not == original_oc_code domain.registrant.code.should_not == original_oc_code
domain.contacts.each do |c| domain.contacts.each do |c|
c.registrar_id.should == @registrar2.id c.registrar_id.should == @registrar2.id
@ -988,7 +988,7 @@ describe 'EPP Domain', epp: true do
d = Fabricate(:domain) d = Fabricate(:domain)
d.tech_contacts << old_contact d.tech_contacts << old_contact
d.admin_contacts << old_contact d.admin_contacts << old_contact
original_oc_id = domain.owner_contact.id original_oc_id = domain.registrant.id
original_contact_count = Contact.count original_contact_count = Contact.count
original_domain_contact_count = DomainContact.count original_domain_contact_count = DomainContact.count
@ -1006,9 +1006,9 @@ describe 'EPP Domain', epp: true do
# all domain contacts should be under registrar2 now # all domain contacts should be under registrar2 now
domain.reload domain.reload
domain.owner_contact.registrar_id.should == @registrar2.id domain.registrant.registrar_id.should == @registrar2.id
# owner_contact should not be a new record # registrant should not be a new record
domain.owner_contact.id.should == original_oc_id domain.registrant.id.should == original_oc_id
# old contact must not change # old contact must not change
old_contact.registrar_id.should == @registrar1.id old_contact.registrar_id.should == @registrar1.id
@ -1042,7 +1042,7 @@ describe 'EPP Domain', epp: true do
d.tech_contacts << old_contact d.tech_contacts << old_contact
d.admin_contacts << old_contact_2 d.admin_contacts << old_contact_2
original_oc_id = domain.owner_contact.id original_oc_id = domain.registrant.id
original_contact_count = Contact.count original_contact_count = Contact.count
original_domain_contact_count = DomainContact.count original_domain_contact_count = DomainContact.count
@ -1060,9 +1060,9 @@ describe 'EPP Domain', epp: true do
# all domain contacts should be under registrar2 now # all domain contacts should be under registrar2 now
domain.reload domain.reload
domain.owner_contact.registrar_id.should == @registrar2.id domain.registrant.registrar_id.should == @registrar2.id
# owner_contact should not be a new record # registrant should not be a new record
domain.owner_contact.id.should == original_oc_id domain.registrant.id.should == original_oc_id
# old contact must not change # old contact must not change
old_contact.registrar_id.should == @registrar1.id old_contact.registrar_id.should == @registrar1.id
@ -1088,12 +1088,12 @@ describe 'EPP Domain', epp: true do
original_domain_contact_count.should == DomainContact.count original_domain_contact_count.should == DomainContact.count
end end
it 'transfers domain and references exsisting owner contact to domain contacts' do it 'transfers domain and references exsisting registrant to domain contacts' do
d = Fabricate(:domain) d = Fabricate(:domain)
d.tech_contacts << domain.owner_contact d.tech_contacts << domain.registrant
domain.tech_contacts << domain.owner_contact domain.tech_contacts << domain.registrant
original_owner_contact_id = domain.owner_contact_id original_registrant_id = domain.registrant_id
pw = domain.auth_info pw = domain.auth_info
xml = domain_transfer_xml({ xml = domain_transfer_xml({
@ -1108,11 +1108,11 @@ describe 'EPP Domain', epp: true do
end end
domain.reload domain.reload
# owner contact must be an new record # registrant must be an new record
domain.owner_contact_id.should_not == original_owner_contact_id domain.registrant_id.should_not == original_registrant_id
# new owner contact must be a tech contact # new registrant must be a tech contact
domain.domain_contacts.where(contact_id: domain.owner_contact_id).count.should == 1 domain.domain_contacts.where(contact_id: domain.registrant_id).count.should == 1
end end
it 'does not transfer contacts if they are already under new registrar' do it 'does not transfer contacts if they are already under new registrar' do
@ -1121,11 +1121,11 @@ describe 'EPP Domain', epp: true do
c.save c.save
end end
domain.owner_contact.registrar_id = @registrar2.id domain.registrant.registrar_id = @registrar2.id
domain.owner_contact.save domain.registrant.save
original_oc_id = domain.owner_contact_id original_oc_id = domain.registrant_id
original_oc_code = domain.owner_contact.code original_oc_code = domain.registrant.code
original_contacts_codes = domain.contacts.pluck(:code) original_contacts_codes = domain.contacts.pluck(:code)
pw = domain.auth_info pw = domain.auth_info
@ -1142,9 +1142,9 @@ describe 'EPP Domain', epp: true do
domain.reload domain.reload
domain.owner_contact.id.should == original_oc_id domain.registrant.id.should == original_oc_id
domain.owner_contact.code.should == original_oc_code domain.registrant.code.should == original_oc_code
domain.owner_contact.registrar_id.should == @registrar2.id domain.registrant.registrar_id.should == @registrar2.id
original_contacts_codes.should == domain.contacts.pluck(:code) original_contacts_codes.should == domain.contacts.pluck(:code)
@ -1278,7 +1278,7 @@ describe 'EPP Domain', epp: true do
response[:msg].should == 'Authorization error' response[:msg].should == 'Authorization error'
end end
it 'ignores transfer when owner registrar requests transfer' do it 'ignores transfer wha registrant registrar requests transfer' do
pw = domain.auth_info pw = domain.auth_info
xml = domain_transfer_xml({ xml = domain_transfer_xml({
name: { value: domain.name }, name: { value: domain.name },
@ -1370,7 +1370,7 @@ describe 'EPP Domain', epp: true do
d = Domain.last d = Domain.last
d.owner_contact_code.should == 'citizen_1234' d.registrant_code.should == 'citizen_1234'
d.auth_info.should == existing_pw d.auth_info.should == existing_pw
end end
@ -1765,7 +1765,7 @@ describe 'EPP Domain', epp: true do
inf_data.css('name').text.should == domain.name inf_data.css('name').text.should == domain.name
inf_data.css('status').text.should == 'Payment overdue.' inf_data.css('status').text.should == 'Payment overdue.'
inf_data.css('status').first[:s].should == 'clientHold' inf_data.css('status').first[:s].should == 'clientHold'
inf_data.css('registrant').text.should == domain.owner_contact_code inf_data.css('registrant').text.should == domain.registrant_code
admin_contacts_from_request = inf_data.css('contact[type="admin"]').map(&:text) admin_contacts_from_request = inf_data.css('contact[type="admin"]').map(&:text)
admin_contacts_existing = domain.admin_contacts.pluck(:code) admin_contacts_existing = domain.admin_contacts.pluck(:code)

View file

@ -3,7 +3,7 @@ Fabricator(:domain) do
valid_to Date.new(2014, 8, 7) valid_to Date.new(2014, 8, 7)
period 1 period 1
period_unit 'y' period_unit 'y'
owner_contact(fabricator: :contact) registrant(fabricator: :contact)
nameservers(count: 3) nameservers(count: 3)
admin_domain_contacts(count: 1) { Fabricate(:admin_domain_contact) } admin_domain_contacts(count: 1) { Fabricate(:admin_domain_contact) }
tech_domain_contacts(count: 1) { Fabricate(:tech_domain_contact) } tech_domain_contacts(count: 1) { Fabricate(:tech_domain_contact) }

View file

@ -326,13 +326,13 @@ describe Contact, '.destroy_orphans' do
end end
it 'should find one orphan' do it 'should find one orphan' do
Fabricate(:domain, owner_contact: @contact_1) Fabricate(:domain, registrant: @contact_1)
Contact.find_orphans.count.should == 1 Contact.find_orphans.count.should == 1
Contact.find_orphans.last.should == @contact_2 Contact.find_orphans.last.should == @contact_2
end end
it 'should find no orphans' do it 'should find no orphans' do
Fabricate(:domain, owner_contact: @contact_1, admin_contacts: [@contact_2]) Fabricate(:domain, registrant: @contact_1, admin_contacts: [@contact_2])
cc = Contact.count cc = Contact.count
Contact.find_orphans.count.should == 0 Contact.find_orphans.count.should == 0
Contact.destroy_orphans Contact.destroy_orphans

View file

@ -7,7 +7,7 @@ describe Domain do
it { should belong_to(:registrar) } it { should belong_to(:registrar) }
it { should have_many(:nameservers) } it { should have_many(:nameservers) }
it { should belong_to(:owner_contact) } it { should belong_to(:registrant) }
it { should have_many(:tech_contacts) } it { should have_many(:tech_contacts) }
it { should have_many(:admin_contacts) } it { should have_many(:admin_contacts) }
it { should have_many(:domain_transfers) } it { should have_many(:domain_transfers) }
@ -156,7 +156,7 @@ describe Domain do
# d = Domain.new # d = Domain.new
# expect(d.valid?).to be false # expect(d.valid?).to be false
# expect(d.errors.messages).to match_array({ # expect(d.errors.messages).to match_array({
# owner_contact: ['Registrant is missing'], # registrant: ['Registrant is missing'],
# admin_contacts: ['Admin contacts count must be between 1 - infinity'], # admin_contacts: ['Admin contacts count must be between 1 - infinity'],
# nameservers: ['Nameservers count must be between 2-11'], # nameservers: ['Nameservers count must be between 2-11'],
# registrar: ['Registrar is missing'], # registrar: ['Registrar is missing'],