Modeling cocard

Overall Picture

models

Home controller

bin/rails g controller Home index \
  --no-stylesheets --no-javascripts --no-helper

model Location

bin/rails g scaffold Location \
  lid:string \
  description:string \
  --no-stylesheets --no-javascripts --no-helper

i.e. NRH, BNA. Only for grouping and information.

model Context

Context for SOAP requests.

bin/rails g scaffold Context \
  mandant:string \
  client_system:string \
  workplace:string \
  description:string \
  --no-stylesheets --no-javascripts --no-helper

i.e. ORBIS, Ein1. Used as Mandant_id in SOAP requests.

model Connector

bin/rails g scaffold Connector \
  name:string \
  short_name:string \
  ip:inet \
  admin_url:string \
  sds_url:string \
  manual_update:boolean \
  id_contract:string \
  serial:string \
  use_tls:boolean \
  authentication:integer \
  auth_user:string \
  auth_password:string \
    --no-stylesheets --no-javascripts --no-helper

bin/rails g migration AddReadonlyToConnector \
  sds_xml:text \
  sds_updated_at: \
  connector_services:jsonb \
  last_check:timestamp last_ok:timestamp \
  condition:integer:index \
  condition_message:string  \
  soap_request_success:boolean \
  vpnti_online:boolean \
  firmware_version:string \
  acknowledge_id:bigint \
  iccsn:string \
  expiration_date:date \
  rebooted_at:timestamp
Install ActionText
bin/rails action_text:install
app/models/connector.rb
class Connector < ApplicationRecord
  has_rich_text :description
end

model CardTerminal

bin/rails g scaffold CardTerminal \
  displayname:string \
  location:belongs_to \
  room:string \
  contact:string \
  plugged_in:string \
  delivery_date:date \
  supplier:string \
  serial:string \
  id_product:string \
  pin_mode:integer \
  idle_message:string \
  --no-stylesheets --no-javascripts --no-helper

bin/rails g migration AddInternalToCardTerminal \
  properties:jsonb \
  name:string \
  ct_id:string \
  mac:macaddr \
  ip:inet \
  current_ip:inet \
  slots:integer \
  connected:boolean \
  condition:integer \
  condition_message:string  \
  last_ok:timestamp last_check:timestamp \
  connector:belongs_to \
  network:belongs_to \
  firmware_version:string \
  acknowledge_id:bigint \
  rebooted_at:timestamp
enum pin_mode: { off: 0, on_demand: 1, auto: 2 }
app/models/card_terminal.rb
class CardTerminal < ApplicationRecord
  has_rich_text :description
end

model CardTerminalSlot

bin/rails g model CardTerminalSlot \
  card_terminal:belongs_to \
  slot:integer \
  --no-stylesheets --no-javascripts --no-helper

model Card

bin/rails g scaffold Card \
  name:string \
  operational_state:belongs_to \
  location:belongs_to \
  lanr:string \
  bsnr:string \
  fachrichtung:string \
  telematikid:string \
  private_information:rich_text \
  --no-stylesheets --no-javascripts --no-helper

bin/rails g migration AddInternalToCard \
  properties:jsonb \
  card_handle:string \
  card_type:string \
  iccsn:string \
  slotid:integer \
  insert_time:timestamp \
  card_holder_name:string \
  expiration_date:date \
  condition:integer \
  condition_message:string  \
  last_check:timestamp last_ok:timestamp \
  acknowledge_id:bigint \
  card_terminal_slot:belongs_to

bin/rails g migration AddCertificateToCard \
  certificate:text \
  cert_subject_cn:string \
  cert_subject_title:string \
  cert_subject_sn:string \
  cert_subject_givenname:string \
  cert_subject_street:string \
  cert_subject_postalcode:string \
  cert_subject_l:string \
  cert_subject_o:string

bin/rails g migration AddDeletedAtToCard \
  deleted_at:timestamp
app/models/card_terminal.rb
class Card < ApplicationRecord
  has_rich_text :description
end

model OperationalState

bin/rails g scaffold OperationalState \
  name:string \
  description:string \
  operational:boolean:index \
  --no-stylesheets --no-javascripts --no-helper

model Log

bin/rails g scaffold Log \
  loggable:references{polymorphic} \
  action:string \
  last_seen:timestamp \
  since:timestamp \
  level:string:index \
  message:text \
  is_valid:boolean \
  condition:integer \
  acknowledge_id:bigint \
  --no-stylesheets --no-javascripts --no-helper
acknowledge_id contains the current acknowledge if available.

model Network

bin/rails g scaffold Network \
  netzwerk:cidr \
  description:rich_text \
  location:belongs_to \
  accessibility:integer \
  --no-stylesheets --no-javascripts --no-helper
enum accessibility: { none: -1, ping: 0 }

model Workplace

bin/rails g scaffold Workplace \
  description:rich_text
  --no-stylesheets --no-javascripts --no-helper

bin/rails g migration AddNameToWorkplace \
  name:string lastseen:timestamp

model ClientCertificate

bin/rails g scaffold ClientCertificate \
  name:string \
  client_system:string \
  description:rich_text \
  cert:text \
  pkey:text \
  passphrase:string \
  --no-stylesheets --no-javascripts --no-helper

model Note

bin/rails g scaffold Note \
  notable:belongs_to{polymorphic} \
  user:belongs_to \
  valid_until:datetime \
  type:integer \
  message:rich_text \
  --no-stylesheets --no-javascripts --no-helper
enum type: { plain: 0, acknowledge: 1 }

HABTM Tables

ConnectorLocation

Join Tables for HABTM
bin/rails g migration CreateJoinTableConnectorLocation \
  connector location

Add index and set index to unique:

class CreateJoinTableConnectorLocation < ActiveRecord::Migration[7.1]
  def change
    create_join_table :connectors, :locations do |t|
      t.index [:location_id, :connector_id], unique: true
      t.index [:connector_id, :location_id], unique: true
    end
  end
end

ConnectorClientCertificate

Join Tables for HABTM
bin/rails g migration CreateJoinTableConnectorClientCertificate \
  connector client_certificate

Add index and set index to unique:

class CreateJoinTableConnectorClientCertificate < ActiveRecord::Migration[7.1]
  def change
    create_join_table :connectors, :client_certificates do |t|
      t.index [:client_certificate_id, :connector_id], unique: true
      t.index [:connector_id, :client_certificate_id], unique: true
    end
  end
end

HABTM Connector—​Context through ConnectorContext

HABTM for Connector and Context with additional attributes

bin/rails g model ConnectorContext \
  connector:belongs_to \
  context:belongs_to \
  position:integer:index \
  --no-stylesheets --no-javascripts --no-helper
Unique Index for ConnectorContext
t.index [:connector_id, :context_id], unique: true
t.index [:context_id, :connector_id], unique: true

HABTM Card—​Context through ConnectorContext

HABTM for Card and Context with additional attributes

bin/rails g model CardContext \
  card:belongs_to \
  context:belongs_to \
  position:integer:index \
  pin_status:string:index \
  left_tries:integer \
  --no-stylesheets --no-javascripts --no-helper
Unique Index for CardContext
t.index [:card_id, :context_id], unique: true
t.index [:context_id, :card_id], unique: true

HABTM Terminal—​Workplaces through TerminalWorkplaces

HABTM for Terminals and Workplaces with additional attributes

bin/rails g model TerminalWorkplaces \
  card_terminal:belongs_to \
  workplace:belongs_to \
  mandant:string:index \
  client_system:string:index \
  --no-stylesheets --no-javascripts --no-helper
Unique Index for TerminalWorkplaces
t.index [:card_terminal_id, :mandant,\
         :client_system, :workplace_id], unique: true
t.index [:workplace_id, :card_terminal_id]
t.index [:card_terminal_id, :workplace_id]

model SinglePicture

aka TI-Lagebild

bin/rails g model SinglePicture \
  time:timestamp \
  ci:string \
  tid:string \
  bu:string:index \
  organization:string \
  pdt:string:index \
  product:string \
  availability:integer:index \
  comment:string \
  name:string \
  muted:boolean \
  --no-stylesheets --no-javascripts --no-helper