Class: Pvectl::Repositories::Base Abstract

Inherits:
Object
  • Object
show all
Defined in:
lib/pvectl/repositories/base.rb,
sig/pvectl/repositories/base.rbs

Overview

This class is abstract.

Subclass and implement #list, #get, and #build_model.

Abstract base class for repositories.

Repositories encapsulate Proxmox API communication and are responsible for converting raw API data to domain models. Each repository handles one resource type (VMs, Containers, Nodes, etc.).

Examples:

Implementing a repository

class Vm < Base
  def list(node: nil)
    response = connection.client["cluster/resources"].get(params: { type: "vm" })
    response.map { |data| build_model(data) }
  end

  def get(vmid)
    list.find { |vm| vm.vmid == vmid.to_i }
  end

  protected

  def build_model(data)
    Models::Vm.new(data)
  end
end

See Also:

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(connection) ⇒ Base

Creates repository with connection.

Parameters:

  • Proxmox API connection



38
39
40
# File 'lib/pvectl/repositories/base.rb', line 38

def initialize(connection)
  @connection = connection
end

Instance Attribute Details

#connectionConnection (readonly)

Returns the API connection.

Returns:

  • the API connection



62
63
64
# File 'lib/pvectl/repositories/base.rb', line 62

def connection
  @connection
end

Instance Method Details

#build_model(data) ⇒ Models::Base

Builds model from API response data.

Parameters:

  • API response hash

Returns:

  • model instance

Raises:

  • if not implemented by subclass



69
70
71
# File 'lib/pvectl/repositories/base.rb', line 69

def build_model(data)
  raise NotImplementedError, "#{self.class}#build_model must be implemented"
end

#extract_data(response) ⇒ Hash, Object

Extracts data from hash response. If response has :data key, returns its value. Otherwise returns response.

Parameters:

  • API response

Returns:

  • extracted data



92
93
94
95
96
# File 'lib/pvectl/repositories/base.rb', line 92

def extract_data(response)
  return response unless response.is_a?(Hash)

  response[:data] || response
end

#get(id) ⇒ Models::Base?

Gets a single resource by ID.

Parameters:

  • resource identifier

Returns:

  • model or nil if not found

Raises:

  • if not implemented by subclass



55
56
57
# File 'lib/pvectl/repositories/base.rb', line 55

def get(id)
  raise NotImplementedError, "#{self.class}#get must be implemented"
end

#listArray<Models::Base>

Lists all resources.

Returns:

  • collection of models

Raises:

  • if not implemented by subclass



46
47
48
# File 'lib/pvectl/repositories/base.rb', line 46

def list
  raise NotImplementedError, "#{self.class}#list must be implemented"
end

#models_from(response, model_class) ⇒ Array

Creates model instances from API response.

Parameters:

  • API response (will be unwrapped)

  • model class to instantiate

Returns:

  • array of model instances



103
104
105
106
107
# File 'lib/pvectl/repositories/base.rb', line 103

def models_from(response, model_class)
  return [] if response.nil?

  unwrap(response).map { |data| model_class.new(data) }
end

#unwrap(response) ⇒ Array

Unwraps API response to array format. Handles: Array (passthrough), Hash with :data key, Hash without :data.

Parameters:

  • API response

Returns:

  • unwrapped array



78
79
80
81
82
83
84
85
# File 'lib/pvectl/repositories/base.rb', line 78

def unwrap(response)
  case response
  when Array then response
  when Hash then response[:data] || response.to_a
  when nil then []
  else response.to_a
  end
end