Skip to content

Commit

Permalink
add command to create aggregate root
Browse files Browse the repository at this point in the history
  • Loading branch information
mmp4k committed Oct 28, 2017
1 parent acbc498 commit 04faeb4
Show file tree
Hide file tree
Showing 4 changed files with 122 additions and 2 deletions.
32 changes: 31 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,8 @@ You can also use singe command to create your ValueObject, Command.

* [Examples](#examples)
* [Create single ValueObject](#create-single-valueobject)
* [Create single Command](#create-single-command)
* [Create single Command](#create-single-command)
* [Create single AggregateRoot with Events](#create-single-aggregateroot-with-events)
* [Installation](#installation)

## Examples
Expand Down Expand Up @@ -127,6 +128,35 @@ Creating files:
[v] ./spec/Model/CommandHandler/RemoveUserHandlerSpec.php
```

## Create single AggregateRoot with Events

You need to run that command:

```
proophgen ar Model/Admin \!AdminCreated AdminRemoved AdminBlocked
```

As a result you should to see something similar to:

```
Creating files:
[v] ./src/Model/Admin.php
[v] ./src/Model/AdminRepository.php
[v] ./src/Model/Admin/Exception/AdminNotFound.php
[v] ./src/Model/Admin/Event/AdminCreated.php
[v] ./src/Model/Admin/Event/AdminRemoved.php
[v] ./src/Model/Admin/Event/AdminBlocked.php
[v] ./src/Infrastructure/Admin/InMemory.php
[v] ./src/Infrastructure/Admin/EventSourced.php
[v] ./spec/Model/AdminSpec.php
[v] ./spec/Infrastructure/Admin/EventSourcedSpec.php
[v] ./spec/Model/Admin/Exception/AdminNotFoundSpec.php
[v] ./spec/Infrastructure/Admin/InMemorySpec.php
[v] ./spec/Model/Admin/Event/AdminCreatedSpec.php
[v] ./spec/Model/Admin/Event/AdminRemovedSpec.php
[v] ./spec/Model/Admin/Event/AdminBlockedSpec.php
```

## Installation

Go to [releases page on github](https://github.com/mmp4k/proophgen/releases) and download `proophgen.phar`.
3 changes: 2 additions & 1 deletion proophgen
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,12 @@ try {

use Symfony\Component\Console\Application;

$application = new Application('proophgen', '0.1.5');
$application = new Application('proophgen', '0.1.6');

$application->add(new \Pilsniak\Command\DoCommand());
$application->add(new \Pilsniak\Command\ValueObjectCommand());
$application->add(new \Pilsniak\Command\CommandGeneratorCommand());
$application->add(new \Pilsniak\Command\AggregateRootCommand());
// ... register commands

$application->run();
Expand Down
83 changes: 83 additions & 0 deletions src/Pilsniak/Command/AggregateRootCommand.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
<?php

namespace Pilsniak\Command;

use gossi\codegen\generator\CodeFileGenerator;
use League\Flysystem\Adapter\Local;
use Pilsniak\FlySystem\FileSystem;
use Pilsniak\ProophGen\Model\AggregateRoot;
use Pilsniak\ProophGen\Model\Event;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Pilsniak\GossiCodeGenerator\AggregateRootGenerator\AggregateRootCodeGenerator;
use Pilsniak\GossiCodeGenerator\AggregateRootGenerator\AggregateRootEventGenerator;
use Pilsniak\GossiCodeGenerator\AggregateRootGenerator\AggregateRootEventSourcedRepository;
use Pilsniak\GossiCodeGenerator\AggregateRootGenerator\AggregateRootExceptionNotFoundGenerator;
use Pilsniak\GossiCodeGenerator\AggregateRootGenerator\AggregateRootInMemoryRepository;
use Pilsniak\GossiCodeGenerator\AggregateRootGenerator\AggregateRootRepositoryInterfaceGenerator;
use Pilsniak\GossiCodeGenerator\AggregateRootGenerator\PhpSpecGenerator;
use Pilsniak\ProophGen\ProophGenerator\AggregateRootGenerator;

class AggregateRootCommand extends Command
{
protected function configure()
{
$this->setName('aggregate-root');
$this->setDescription('Create aggregate root');
$this->setAliases(['ar']);
$this->addArgument('name', InputArgument::REQUIRED);
$this->addArgument('events', InputArgument::IS_ARRAY);
}

protected function execute(InputInterface $input, OutputInterface $output)
{
$events = [];
foreach ($input->getArgument('events') as $event) {
$isCreator = $event{0} === '!' ? true : false;
if ($isCreator) {
$event = substr($event, 1);
}
$events[] = new Event(str_replace('/', '\\',$event), $isCreator);
}

$aggregateRoot = new AggregateRoot(str_replace('/', '\\', $input->getArgument('name')), $events);

$codeFileGenerator = new CodeFileGenerator([
'generateDocblock' => false,
'generateScalarTypeHints' => true,
'generateReturnTypeHints' => true,
'declareStrictTypes' => true
]);

$aggregateRootCodeGenerator = new AggregateRootCodeGenerator($codeFileGenerator);
$aggregateRootEventGenerator = new AggregateRootEventGenerator($codeFileGenerator);
$aggregateRootExceptionNotFoundGenerator = new AggregateRootExceptionNotFoundGenerator($codeFileGenerator);
$aggregateRootRepositoryInterfaceGenerator = new AggregateRootRepositoryInterfaceGenerator($codeFileGenerator);
$aggregateRootRepositoryInMemoryGenerator = new AggregateRootInMemoryRepository($codeFileGenerator);
$aggregateRootRepositoryEventSourcedGenerator = new AggregateRootEventSourcedRepository($codeFileGenerator);
$rootGenerator = new AggregateRootGenerator(
new \Pilsniak\GossiCodeGenerator\AggregateRootGenerator($aggregateRootCodeGenerator, $aggregateRootExceptionNotFoundGenerator, $aggregateRootEventGenerator, $aggregateRootRepositoryInterfaceGenerator, $aggregateRootRepositoryInMemoryGenerator, $aggregateRootRepositoryEventSourcedGenerator),
new PhpSpecGenerator(
new PhpSpecGenerator\PhpSpecAggregateCode($codeFileGenerator),
new PhpSpecGenerator\PhpSpecEventSourced($codeFileGenerator),
new PhpSpecGenerator\PhpSpecEvent($codeFileGenerator),
new PhpSpecGenerator\PhpSpecExceptionNotFound($codeFileGenerator),
new PhpSpecGenerator\PhpSpecInMemoryRepository($codeFileGenerator)
)
);

$filesToSave = $rootGenerator->generate($aggregateRoot);

$fileSystem = new FileSystem(new \League\Flysystem\Filesystem(new Local('./')));

$output->writeln('Creating files:');
foreach ($filesToSave as $fileToSave) {
$fileSystem->save($fileToSave->filename(), $fileToSave->fileContent());
$output->writeln('[v] ' . $fileToSave->filename());
}
}


}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

use Pilsniak\ProophGen\AggregateRootExecuter;
use Pilsniak\ProophGen\Model\AggregateRoot;
use Pilsniak\ProophGen\Model\FileToSave;
use Pilsniak\ProophGen\ProophGenerator\AggregateRootGenerator\PhpSpecAggregateRootExecuter;

class AggregateRootGenerator
Expand All @@ -23,6 +24,11 @@ public function __construct(AggregateRootExecuter $aggregateRootExecuter, PhpSpe
$this->phpSpecAggregateRootExecuter = $phpSpecAggregateRootExecuter;
}

/**
* @param AggregateRoot $aggregateRoot
*
* @return array|FileToSave[]
*/
public function generate(AggregateRoot $aggregateRoot): array
{
return array_merge(
Expand Down

0 comments on commit 04faeb4

Please sign in to comment.