/**
* {@inheritdoc}
*/
public function getImages($publicKey, Query $query, Images $model)
{
// Initialize return value
$images = [];
// Query data
$queryData = ['publicKey' => $publicKey];
$from = $query->from();
$to = $query->to();
if ($from || $to) {
$tmp = [];
if ($from !== null) {
$tmp['$gte'] = $from;
}
if ($to !== null) {
$tmp['$lte'] = $to;
}
$queryData['added'] = $tmp;
}
$imageIdentifiers = $query->imageIdentifiers();
if (!empty($imageIdentifiers)) {
$queryData['imageIdentifier']['$in'] = $imageIdentifiers;
}
$checksums = $query->checksums();
if (!empty($checksums)) {
$queryData['checksum']['$in'] = $checksums;
}
$originalChecksums = $query->originalChecksums();
if (!empty($originalChecksums)) {
$queryData['originalChecksum']['$in'] = $originalChecksums;
}
// Sorting
$sort = ['added' => -1];
if ($querySort = $query->sort()) {
$sort = [];
foreach ($querySort as $s) {
$sort[$s['field']] = $s['sort'] === 'asc' ? 1 : -1;
}
}
// Fields to fetch
$fields = array_fill_keys(['extension', 'added', 'checksum', 'originalChecksum', 'updated', 'publicKey', 'imageIdentifier', 'mime', 'size', 'width', 'height'], true);
if ($query->returnMetadata()) {
$fields['metadata'] = true;
}
try {
$cursor = $this->getImageCollection()->find($queryData, $fields)->limit($query->limit())->sort($sort);
// Skip some images if a page has been set
if (($page = $query->page()) > 1) {
$skip = $query->limit() * ($page - 1);
$cursor->skip($skip);
}
foreach ($cursor as $image) {
unset($image['_id']);
$image['added'] = new DateTime('@' . $image['added'], new DateTimeZone('UTC'));
$image['updated'] = new DateTime('@' . $image['updated'], new DateTimeZone('UTC'));
$images[] = $image;
}
// Update model
$model->setHits($cursor->count());
} catch (MongoException $e) {
throw new DatabaseException('Unable to search for images', 500, $e);
}
return $images;
}