Skip to content

Commit

Permalink
WIP in-model serialization
Browse files Browse the repository at this point in the history
  • Loading branch information
elsom25 committed May 8, 2024
1 parent bd04e25 commit 34e1c3f
Show file tree
Hide file tree
Showing 11 changed files with 92,418 additions and 189 deletions.
86 changes: 82 additions & 4 deletions app/models/property.rb
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,11 @@ class Property < ApplicationRecord
scope :extended, -> { where.not(base_friendly_id: nil) }

has_many :categories_properties, dependent: :destroy, foreign_key: :property_friendly_id, primary_key: :friendly_id

has_many :categories, through: :categories_properties

has_many :properties_property_values, dependent: :destroy

has_many :property_values, through: :properties_property_values, foreign_key: :property_value_friendly_id

belongs_to :base_property,
Expand All @@ -23,15 +25,52 @@ class Property < ApplicationRecord
foreign_key: :base_friendly_id,
primary_key: :friendly_id

def property_value_friendly_ids=(ids)
self.property_values = PropertyValue.where(friendly_id: ids)
end

validates :name, presence: true
validates :friendly_id, presence: true, uniqueness: true
validates :handle, presence: true
validate :property_values_match_base, if: :extended?

class << self
def new_from_data(data)
new(row_from_data(data))
end

def insert_all_from_data(data)
insert_all(Array(data).map { row_from_data(_1) })
end

def as_json(properties, version:)
{
"version" => version,
"attributes" => properties.map(&:as_json),
}
end

def as_txt(properties, version:)
header = <<~HEADER
# Shopify Product Taxonomy - Attributes: #{version}
# Format: {GID} : {Attribute name}
HEADER
padding = reorder("LENGTH(id) desc").first.gid.size
[
header,
*properties.map { _1.as_txt(padding:) },
].join("\n")
end

private

def row_from_data(data)
{
"id" => data["id"],
"friendly_id" => data["friendly_id"],
"name" => data["name"],
"handle" => data["handle"],
"base_friendly_id" => data["values_from"],
}
end
end

def gid
if extended?
base_property.gid
Expand All @@ -48,6 +87,45 @@ def extended?
!base?
end

def property_value_friendly_ids=(friendly_id)
self.property_values = PropertyValue.where(friendly_id:)
end

def as_json_for_data
{
"id" => id,
"name" => name,
"friendly_id" => friendly_id,
"handle" => handle,
"values" => property_values.reorder(:id).map(&:as_json_for_data),
}
end

def as_json
{
"id" => gid,
"name" => name,
"handle" => handle,
"extended_attributes" => extended_properties.map do
{
"name" => _1.name,
"handle" => _1.handle,
}
end,
"values" => property_values.map do
{
"id" => _1.gid,
"name" => _1.name,
"handle" => _1.handle,
}
end,
}
end

def as_txt(padding: 0)
"#{gid.ljust(padding)} : #{name}"
end

private

def property_values_match_base
Expand Down
71 changes: 67 additions & 4 deletions app/models/property_value.rb
Original file line number Diff line number Diff line change
Expand Up @@ -8,21 +8,59 @@ class PropertyValue < ApplicationRecord
foreign_key: :property_value_friendly_id,
primary_key: :friendly_id,
inverse_of: :property_value

has_many :properties, through: :properties_property_values

belongs_to :primary_property,
class_name: "Property",
foreign_key: :primary_property_friendly_id,
primary_key: :friendly_id

def primary_property_friendly_id=(friendly_id)
self.primary_property = Property.find_by(friendly_id:)
end

validates :name, presence: true
validates :friendly_id, presence: true, uniqueness: true
validates :handle, presence: true, uniqueness: { scope: :primary_property_friendly_id }

class << self
def new_from_data(data)
new(row_from_data(data))
end

def insert_all_from_data(data)
insert_all(Array(data).map { row_from_data(_1) })
end

def as_json(property_values, version:)
{
"version" => version,
"values" => property_values.map(&:as_json),
}
end

def as_txt(property_values, version:)
header = <<~HEADER
# Shopify Product Taxonomy - Attribute Values: #{version}
# Format: {GID} : {Value name} [{Attribute name}]
HEADER
padding = reorder("LENGTH(id) desc").first.gid.size
[
header,
*property_values.map { _1.as_txt(padding: padding) },
].join("\n")
end

private

def row_from_data(data)
{
"id" => data["id"],
"name" => data["name"],
"handle" => data["handle"],
"friendly_id" => data["friendly_id"],
"primary_property_friendly_id" => data["friendly_id"].split("__").first,
}
end
end

def gid
"gid://shopify/TaxonomyValue/#{id}"
end
Expand All @@ -34,4 +72,29 @@ def full_name
name
end
end

def primary_property_friendly_id=(friendly_id)
self.primary_property = Property.find_by(friendly_id:)
end

def as_json_for_data
{
"id" => id,
"name" => name,
"friendly_id" => friendly_id,
"handle" => handle,
}
end

def as_json
{
"id" => gid,
"name" => name,
"handle" => handle,
}
end

def as_txt(padding: 0)
"#{gid.ljust(padding)} : #{full_name}"
end
end
9 changes: 8 additions & 1 deletion app/serializers/distribution/category_serializer.rb
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,14 @@ def as_json(category)
"name" => category.name,
"full_name" => category.full_name,
"parent_id" => category.parent&.gid,
"attributes" => category.properties.map { PropertySerializer.as_simple_json(_1) },
"attributes" => category.properties.map do
{
"id" => _1.gid,
"name" => _1.name,
"handle" => _1.handle,
"extended" => _1.extended?,
}
end,
"children" => category.children.map { as_simple_json(_1) },
"ancestors" => category.ancestors.map { as_simple_json(_1) },
}
Expand Down
54 changes: 0 additions & 54 deletions app/serializers/distribution/property_serializer.rb

This file was deleted.

46 changes: 0 additions & 46 deletions app/serializers/distribution/property_value_serializer.rb

This file was deleted.

35 changes: 0 additions & 35 deletions app/serializers/source/property_serializer.rb

This file was deleted.

34 changes: 0 additions & 34 deletions app/serializers/source/property_value_serializer.rb

This file was deleted.

Loading

0 comments on commit 34e1c3f

Please sign in to comment.