Class: Api::V2::BaseResource Abstract
- Inherits:
-
JSONAPI::Resource
- Object
- JSONAPI::Resource
- Api::V2::BaseResource
- Defined in:
- app/resources/api/v2/base_resource.rb
Overview
This class is abstract and should not be instantiated directly.
For more information about JSON:API, see the JSON:API Specifications or refer to the JSONAPI::Resources package.
Provides a base class for JSON:API representations of ApplicationRecord sub-classes. This class extends JSONAPI::Resource
and serves as the foundation for all API v2 resources.
Key Features:
-
Implements JSON:API standard resource handling.
-
Provides global model hints for common resource models.
-
Defines attribute and relationship access restrictions (
readonly
,write_once
,writeonly
). -
Customizes the creatable, updatable, and fetchable fields logic.
Direct Known Subclasses
AliquotResource, AssetAuditResource, AssetResource, BaitLibraryLayoutResource, BarcodePrinterResource, BulkTransferResource, CommentResource, CustomMetadatumCollectionResource, LabwareResource, LaneResource, LotResource, LotTypeResource, OrderResource, PickListResource, PlateConversionResource, PlateCreationResource, PlatePurposeResource, PlateResource, PlateTemplateResource, PolyMetadatumResource, PooledPlateCreationResource, PreCapturePoolResource, PrimerPanelResource, ProjectResource, PurposeResource, QcAssayResource, QcFileResource, QcResultResource, QcableResource, RackedTubeResource, ReceptacleResource, RequestMetadataResource, RequestResource, RequestTypeResource, SampleManifestResource, SampleMetadataResource, SampleResource, SpecificTubeCreationResource, StateChangeResource, StudyResource, SubmissionPoolResource, SubmissionResource, SubmissionTemplateResource, TagGroupAdapterTypeResource, TagGroupResource, TagLayoutResource, TagLayoutTemplateResource, TagResource, TemplateResource, TransferRequestCollectionResource, TransferRequestResource, TransferResource, TransferTemplateResource, TubeFromTubeCreationResource, TubePurposeResource, TubeRackResource, TubeRackStatusResource, TubeResource, UserResource, VolumeUpdateResource, WellResource, WorkCompletionResource, WorkOrderResource
Class Method Summary collapse
-
.apply_includes(records, options = {}) ⇒ Object
Extends the default behaviour to add our default inclusions if provided.
-
.creatable_fields(context) ⇒ Set<Symbol>
Determines which fields can be set when creating a new resource.
-
.default_includes(*inclusions) ⇒ Object
Eager load specified models by default.
- .inclusions ⇒ Object
-
.resolve_relationship_names_to_relations(resource_klass, model_includes, options = {}) ⇒ Object
The majority of this is lifted from JSONAPI::Resource We've had to modify the when Symbol chunk to handle nested includes We disable the cops for the shared section to avoid accidental drift due to auto-correct.
-
.updatable_fields(context) ⇒ Set<Symbol>
Determines which fields can be updated after a resource has been created.
Instance Method Summary collapse
-
#fetchable_fields ⇒ Set<Symbol>
Determines which fields can be read when fetching a resource.
Class Method Details
.apply_includes(records, options = {}) ⇒ Object
Extends the default behaviour to add our default inclusions if provided
95 96 97 98 99 100 101 |
# File 'app/resources/api/v2/base_resource.rb', line 95 def self.apply_includes(records, = {}) if @default_includes.present? super(records.preload(*inclusions), ) else super end end |
.creatable_fields(context) ⇒ Set<Symbol>
Determines which fields can be set when creating a new resource.
58 59 60 61 |
# File 'app/resources/api/v2/base_resource.rb', line 58 def self.creatable_fields(context) super - _attributes.select { |_attr, | [:readonly] }.keys - _relationships.select { |_rel_key, rel| rel.[:readonly] }.keys end |
.default_includes(*inclusions) ⇒ Object
Eager load specified models by default. Useful when attributes are dependent on an associated model.
86 87 88 |
# File 'app/resources/api/v2/base_resource.rb', line 86 def self.default_includes(*inclusions) @default_includes = inclusions.freeze end |
.inclusions ⇒ Object
90 91 92 |
# File 'app/resources/api/v2/base_resource.rb', line 90 def self.inclusions @default_includes || [].freeze end |
.resolve_relationship_names_to_relations(resource_klass, model_includes, options = {}) ⇒ Object
The majority of this is lifted from JSONAPI::Resource We've had to modify the when Symbol chunk to handle nested includes We disable the cops for the shared section to avoid accidental drift due to auto-correct. rubocop:disable all
108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 |
# File 'app/resources/api/v2/base_resource.rb', line 108 def self.resolve_relationship_names_to_relations(resource_klass, model_includes, = {}) case model_includes when Array return model_includes.map { |value| resolve_relationship_names_to_relations(resource_klass, value, ) } when Hash model_includes.keys.each do |key| relationship = resource_klass._relationships[key] value = model_includes[key] model_includes.delete(key) # MODIFICATION BEGINS included_relationships = resolve_relationship_names_to_relations(relationship.resource_klass, value, ) model_includes[relationship.relation_name()] = relationship.resource_klass.inclusions + included_relationships # MODIFICATION ENDS end return model_includes when Symbol relationship = resource_klass._relationships[model_includes] # MODIFICATION BEGINS # return relationship.relation_name(options) inclusions = relationship.resource_klass.inclusions { relationship.relation_name() => inclusions } # MODIFICATION ENDS end end |
.updatable_fields(context) ⇒ Set<Symbol>
Determines which fields can be updated after a resource has been created.
67 68 69 70 |
# File 'app/resources/api/v2/base_resource.rb', line 67 def self.updatable_fields(context) super - _attributes.select { |_attr, | [:readonly] || [:write_once] }.keys - _relationships.select { |_rel_key, rel| rel.[:readonly] || rel.[:write_once] }.keys end |
Instance Method Details
#fetchable_fields ⇒ Set<Symbol>
Determines which fields can be read when fetching a resource.
79 80 81 82 |
# File 'app/resources/api/v2/base_resource.rb', line 79 def fetchable_fields super - self.class._attributes.select { |_attr, | [:writeonly] }.keys - self.class._relationships.select { |_rel_key, rel| rel.[:writeonly] }.keys end |