Class: ApiOperation::PayloadDigest

Inherits:
Object
  • Object
show all
Defined in:
app/models/api_operation/payload_digest.rb

Overview

Computes the digest of an API operation payload, which tells a repeated request from a changed one.

The payload is parsed and written again as compact JSON, with the object keys sorted at every level, and the SHA-256 of that text is the digest. So key order, whitespace and how a decimal is written (e.g. 1.10 or 1.1) don't change the digest, while array order, values, and whether a number is an integer or a decimal (1 or 1.0) do.

Class Method Summary collapse

Class Method Details

.hexdigest(payload) ⇒ String

Returns the SHA-256 hex digest, 64 characters.

Parameters:

  • payload (String) —

    the payload as JSON text

Returns:

  • (String) —

    the SHA-256 hex digest, 64 characters

Raises:

  • (JSON::ParserError) —

    if the payload is not valid JSON



15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# File 'app/models/api_operation/payload_digest.rb', line 15

 do
  # NOTE: The following attribute is not required for Microarray Genotyping.
  # I think this might be broken and suggests that there should be separate classes for project: one for
  # next-gen sequencing that includes this attribute in it's metadata, and one for microarray genotyping
  # that doesn't.
  include ProjectManager::Associations
  include BudgetDivision::Associations

  custom_attribute(:project_cost_code, required: true)
  custom_attribute(:funding_comments)
  custom_attribute(:collaborators)
  custom_attribute(:external_funding_source)
  custom_attribute(:sequencing_budget_cost_centre)
  custom_attribute(:project_funding_model, in: PROJECT_FUNDING_MODELS)
  custom_attribute(:gt_committee_tracking_id)

  before_validation do |record|
    record.project_cost_code = nil if record.project_cost_code.blank?
    record.project_funding_model = nil if record.project_funding_model.blank?
  end
end