Skip to content

Support for queries on standard projections #4

@basz

Description

@basz

From @basz on March 16, 2017 15:37

on chat

I'm thinking bout updating the middleware component to add support for queries on standard projections. Would that be useful?

sounds good

It is possible to query standard projections. One QueryStandardProjection query could do it, but we would loose out on permissions etc.. so... quick and dirty

trait StandardQueryTrait {
 public function streamName(): string {
    return $this->metadata()['stream_name'];
 }

 public function result($state) {
   return $state;
  }
}
abstract class QueryStandardProjection extends Messaging\Query implements Messaging\PayloadConstructable  {
   use Messaging\StandardQueryTrait;
}

class StandardQueryHandler {
    private $projectionManager;

    public function __construct(ProjectionManager $projectionManager)
    {
        $this-> projectionManager = $projectionManager;
    }

    public function onEvent(QueryStandardProjection $query, Deferred $deferred)
    {
        // use projectionManager to retrieve state of $query->streamName()

      $deferred->resolve($query->makeResult($state));
    }
}

class MyQuery extends QueryStandardProjection {
   public function result($state) {
     return ValueObject::fromArray($state);
  }
}

routes

        [
            'name'            => 'query::something',
            'path'            => '/path',
            'middleware'      => [
                StandardQueryMiddleware::class,
            ],
            'allowed_methods' => ['OPTION', 'GET'],
            'options'         => [
                'values' => [
                    StandardQueryMiddleware::NAME_ATTRIBUTE => MyQuery::class,
                    StandardQueryMiddleware::STREAM_NAME => 'my_projection',
                ],
            ],
        ],

Which add a StandardQueryMiddleware.

It's just an rough idea... Looking for input

Copied from original issue: prooph/psr7-middleware#22

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions