mirror of
https://github.com/openfoodfoundation/openfoodnetwork
synced 2026-01-24 20:36:49 +00:00
84 lines
2.0 KiB
Ruby
84 lines
2.0 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
# rubocop:disable Metrics/MethodLength
|
|
|
|
class JsonApiSchema
|
|
module Structure
|
|
extend self
|
|
|
|
def schema(data_properties)
|
|
{
|
|
type: :object,
|
|
properties: {
|
|
data: {
|
|
type: :object,
|
|
properties: data_properties
|
|
},
|
|
meta: { type: :object },
|
|
links: { type: :object }
|
|
},
|
|
required: [:data]
|
|
}
|
|
end
|
|
|
|
def collection(data_properties)
|
|
{
|
|
type: :object,
|
|
properties: {
|
|
data: {
|
|
type: :array,
|
|
items: {
|
|
type: :object,
|
|
properties: data_properties
|
|
}
|
|
},
|
|
meta: {
|
|
type: :object,
|
|
properties: {
|
|
pagination: {
|
|
type: :object,
|
|
properties: {
|
|
results: { type: :integer, example: 250 },
|
|
pages: { type: :integer, example: 5 },
|
|
page: { type: :integer, example: 2 },
|
|
per_page: { type: :integer, example: 50 },
|
|
}
|
|
}
|
|
},
|
|
required: [:pagination]
|
|
},
|
|
links: {
|
|
type: :object,
|
|
properties: {
|
|
self: { type: :string },
|
|
first: { type: :string },
|
|
prev: { type: :string, nullable: true },
|
|
next: { type: :string, nullable: true },
|
|
last: { type: :string }
|
|
}
|
|
}
|
|
},
|
|
required: [:data, :meta, :links]
|
|
}
|
|
end
|
|
|
|
def data_properties(object_name, attributes, required, relationship_properties)
|
|
{
|
|
id: { type: :string, example: "1" },
|
|
type: { type: :string, example: object_name },
|
|
attributes: {
|
|
type: :object,
|
|
properties: attributes,
|
|
required: required
|
|
},
|
|
relationships: {
|
|
type: :object,
|
|
properties: relationship_properties
|
|
}
|
|
}
|
|
end
|
|
end
|
|
end
|
|
|
|
# rubocop:enable Metrics/MethodLength
|