lib/roda/endpoints/endpoint/item.rb in roda-endpoints-0.1.0 vs lib/roda/endpoints/endpoint/item.rb in roda-endpoints-0.2.0

- old
+ new

@@ -1,116 +1,35 @@ # frozen_string_literal: true -require 'roda/endpoints/endpoint' +require 'roda/endpoints/endpoint/singleton' require 'roda/endpoints/endpoint/data' -require 'roda/endpoints/endpoint/caching' class Roda module Endpoints class Endpoint # HTTP endpoint representing a specific item of collection uniquely # identified by some parameter. - class Item < Endpoint - include Data - include Caching + class Item < Singleton + prepend Data - self.attributes += %i(id by finder last_modified) + self.attributes += %i(id by on) self.defaults = defaults.merge( by: :fetch, - finder: lambda do - repository.public_send(by, id) - end, - last_modified: :updated_at + on: :id, + finder: -> { repository.public_send(by, id) } ) # @return [Symbol] attr_reader :by - # @return [Symbol] - attr_reader :id + # @return [Integer] + def id + captures.first + end - # @return [Symbol] - attr_reader :finder - # @return [Endpoint::Collection] def collection parent - end - - # @return [ROM::Struct] - def entity - @entity ||= fetch_entity - end - - def fetch_entity - instance_exec(&finder) - end - - def last_modified - @last_modified ? entity.public_send(@last_modified) : super - end - - route do |r, endpoint| - endpoint.verbs.each do |verb| - # @route #{verb} /{collection.name}/{id} - # STDOUT.puts [verb].pretty_inspect - r.public_send(verb, transaction: verb) - end - end - - transaction :get do |endpoint| - step :retrieve, with: endpoint.operation_for(:get) - end - - transaction :patch do |endpoint| - step :validate, with: endpoint.validation_for(:patch) - step :persist, with: endpoint.operation_for(:patch) - end - - transaction :put do |endpoint| - step :validate, with: endpoint.validation_for(:put) - # step :reset, with: 'endpoints.operations.reset' - step :persist, with: endpoint.operation_for(:put) - end - - transaction :delete do |endpoint| - step :validate, with: endpoint.validation_for(:delete) - step :persist, with: endpoint.operation_for(:delete) - end - - # @route GET /{collection.name}/{id} - # @param [Hash] params - # @return [Dry::Monads::Either] - verb :get do |_params| - Right(entity) - end - - # @route PATCH /{collection.name}/{id} - # @return [Dry::Monads::Either] - verb :patch do |params| - changeset = params[name] - Right(repository.update(id, changeset)) - end - - # @route PUT /{collection.name}/{id} - # @return [Dry::Monads::Either] - verb :put do |params| - changeset = entity.to_hash.keys.each_with_object( - {} - ) do |key, changeset| - changeset[key] = nil - end.merge(params[name] || {}) - Right(repository.update(id, changeset)) - end - - # @route DELETE /{collection.name}/{id} - # @return [Dry::Monads::Either] - verb :delete do |_params| - if (result = repository.delete(id)) - Right(nil) - else - Left(result) - end end end end end end