@@ -30,27 +30,135 @@
* @link https://github.com/imbo/imbo
*/

// Fetch the container
$container = require __DIR__ . '/../bootstrap/bootstrap.php';
namespace Imbo;

use Imbo\Database\DatabaseInterface,
Imbo\Storage\StorageInterface,
Imbo\EventListener\ListenerInterface,
Imbo\Http\Request\Request,
Imbo\Http\Response\Response,
Imbo\Http\Response\ResponseWriter,
Imbo\Image\Image,
Imbo\EventManager\EventManager,
Imbo\Exception\InvalidArgumentException;

// Fetch the configuration
$configPath = __DIR__ . '/../config/config.php';
$config = require $configPath;

// Create a new DIC and inject the configuration
$container = new Container();
$container->config = $config;

// Image object that can be used by the image resource
$container->image = $container->shared(function(Container $container) {
return new Image();
});

// Resources
$container->metadataResource = $container->shared(function(Container $container) {
return new Resource\Metadata();
});
$container->imagesResource = $container->shared(function(Container $container) {
return new Resource\Images();
});
$container->imageResource = $container->shared(function(Container $container) {
return new Resource\Image($container->image);
});
$container->userResource = $container->shared(function(Container $container) {
return new Resource\User();
});

// Create the database entry
$container->database = $container->shared(function(Container $container) {
$config = $container->config['database'];
$driver = $config['driver'];

if (is_string($driver)) {
if (!empty($config['params'])) {
$driver = new $driver($config['params']);
} else {
$driver = new $driver();
}
}

if (!$driver instanceof DatabaseInterface) {
throw new InvalidArgumentException('Invalid database driver', 500);
}

return $driver;
});

// Create the storage entry
$container->storage = $container->shared(function(Container $container) {
$config = $container->config['storage'];
$driver = $config['driver'];

if (is_string($driver)) {
if (!empty($config['params'])) {
$driver = new $driver($config['params']);
} else {
$driver = new $driver();
}
}

if (!$driver instanceof StorageInterface) {
throw new InvalidArgumentException('Invalid storage driver', 500);
}

return $driver;
});

// Create request and response objects
$container->request = new Request($_GET, $_POST, $_SERVER);
$container->response = new Response();

// Event manager
$container->eventManager = $container->shared(function(Container $container) {
$listeners = $container->config['eventListeners'];
$manager = new EventManager($container->request, $container->response, $container->image);

foreach ($listeners as $def) {
if (empty($def['listener'])) {
throw new InvalidArgumentException('Missing listener definition', 500);
}

$listener = $def['listener'];

if ($listener instanceof ListenerInterface) {
if (!empty($def['publicKeys']) && is_array($def['publicKeys'])) {
$listener->setPublicKeys($def['publicKeys']);
}

$manager->attachListener($listener);
} else if (is_callable($listener) && !empty($def['events']) && is_array($def['events'])) {
$manager->attach($def['events'], $listener);
} else {
throw new InvalidArgumentException('Invalid listener', 500);
}
}

return $manager;
});

// Fetch some entries from the container
$request = $container->request;
$response = $container->response;

// Add a version header
$response->getHeaders()->set('X-Imbo-Version', Imbo\Version::getVersionNumber());
$response->getHeaders()->set('X-Imbo-Version', Version::getVersionNumber());

// Create the front controller and handle the request
$frontController = new Imbo\FrontController($container);
$frontController = new FrontController($container);

try {
$frontController->handle($request, $response);
} catch (Imbo\Exception $exception) {
} catch (Exception $exception) {
$response->setStatusCode($exception->getCode());
$internalCode = $exception->getImboErrorCode();

if ($internalCode === null) {
$internalCode = Imbo\Exception::ERR_UNSPECIFIED;
$internalCode = Exception::ERR_UNSPECIFIED;
}

$data = array(
@@ -67,7 +175,7 @@
$data['imageIdentifier'] = $identifier;
}

$responseWriter = new Imbo\Http\Response\ResponseWriter();
$responseWriter = new ResponseWriter();
$responseWriter->write($data, $request, $response);
}

@@ -79,8 +79,10 @@ public function setUp() {
$this->signatureValidator = $this->getMock('Imbo\Validate\SignatureInterface');

$container = new Container();
$container->auth = array(
$this->publicKey => $this->privateKey,
$container->config = array(
'auth' => array(
$this->publicKey => $this->privateKey,
),
);
$container->database = $this->getMock('Imbo\Database\DatabaseInterface');
$container->storage = $this->getMock('Imbo\Storage\StorageInterface');