public function listSetsAction(Request $request)
{
$fileCache = $this->get('file_cache');
$data = [];
/** @var \Doctrine\ORM\EntityManager $em */
$em = $this->getDoctrine()->getManager();
$from = $request->get('from', false);
$until = $request->get('until', false);
$qb = $em->createQueryBuilder();
$qb->select("j")->from("OjsJournalBundle:Journal", 'j');
$qb->andWhere('j.status = ' . JournalStatuses::STATUS_PUBLISHED);
if ($from) {
$_from = new \DateTime();
$_from->setTimestamp(strtotime($from));
$qb->where($qb->expr()->gte('j.created', ':from'))->setParameter('from', $_from);
}
if ($until) {
$_until = new \DateTime();
$_until->setTimestamp(strtotime($until));
$condition = $qb->expr()->lte('j.created', ':until');
if ($from) {
$qb->andWhere($condition);
} else {
$qb->where($condition);
}
$qb->setParameter('until', $_until);
}
$paginator = $this->get('knp_paginator');
$resumptionToken = $request->get('resumptionToken');
if ($resumptionToken) {
$currentPage = (int) $fileCache->fetch($resumptionToken);
} else {
$currentPage = 1;
}
$sets = $paginator->paginate($qb->getQuery(), $currentPage, 100);
$data['records'] = $sets;
$key = md5(StringHelper::generateKey());
$fileCache->save($key, $currentPage + 1, 60 * 60 * 24);
$data['resumptionToken'] = $key;
$data['isLast'] = $sets->getTotalItemCount() >= $currentPage * 100 ? true : false;
$data['currentPage'] = $currentPage;
$data['metadataPrefix'] = $request->get('metadataPrefix', 'oai_dc');
return $this->response('OjsOAIBundle:Default:sets.xml.twig', $data);
}