X-Git-Url: https://git.rapsys.eu/airbundle/blobdiff_plain/23954ee32f947d886a22d18a3ca531655c3f4c39..f4a4896b30863744c6d9c5cdbe172e8c24ea1b1b:/Repository/SessionRepository.php diff --git a/Repository/SessionRepository.php b/Repository/SessionRepository.php index d695bcd..cf79a18 100644 --- a/Repository/SessionRepository.php +++ b/Repository/SessionRepository.php @@ -142,6 +142,127 @@ SQL; ->getOneOrNullResult(); } + /** + * Fetch sessions by date period + * + * @param $period The date period + * @param $locale The locale + */ + public function fetchAllByDatePeriod($period, $locale = null) { + //Get entity manager + $em = $this->getEntityManager(); + + //Get quote strategy + $qs = $em->getConfiguration()->getQuoteStrategy(); + $dp = $em->getConnection()->getDatabasePlatform(); + + //Get quoted table names + //XXX: this allow to make this code table name independent + $tables = [ + 'RapsysAirBundle:Application' => $qs->getTableName($em->getClassMetadata('RapsysAirBundle:Application'), $dp), + 'RapsysAirBundle:Location' => $qs->getTableName($em->getClassMetadata('RapsysAirBundle:Location'), $dp), + 'RapsysAirBundle:Session' => $qs->getTableName($em->getClassMetadata('RapsysAirBundle:Session'), $dp), + 'RapsysAirBundle:Snippet' => $qs->getTableName($em->getClassMetadata('RapsysAirBundle:Snippet'), $dp), + 'RapsysAirBundle:User' => $qs->getTableName($em->getClassMetadata('RapsysAirBundle:User'), $dp), + ':afterid' => 4, + "\t" => '', + "\n" => ' ' + ]; + + //Set the request + //TODO: exclude opera and others ? + $req = <<addScalarResult('id', 'id', 'integer') + ->addScalarResult('date', 'date', 'date') + ->addScalarResult('locked', 'locked', 'datetime') + ->addScalarResult('updated', 'updated', 'datetime') + ->addScalarResult('start', 'start', 'datetime') + ->addScalarResult('stop', 'stop', 'datetime') + ->addScalarResult('l_id', 'l_id', 'integer') + ->addScalarResult('l_address', 'l_address', 'string') + ->addScalarResult('l_zipcode', 'l_zipcode', 'string') + ->addScalarResult('l_city', 'l_city', 'string') + ->addScalarResult('l_latitude', 'l_latitude', 'float') + ->addScalarResult('l_longitude', 'l_longitude', 'float') + ->addScalarResult('l_short', 'l_short', 'string') + ->addScalarResult('l_title', 'l_title', 'string') + ->addScalarResult('t_id', 't_id', 'integer') + ->addScalarResult('t_title', 't_title', 'string') + ->addScalarResult('a_id', 'a_id', 'integer') + ->addScalarResult('a_canceled', 'a_canceled', 'datetime') + ->addScalarResult('au_id', 'au_id', 'integer') + ->addScalarResult('au_forename', 'au_forename', 'string') + ->addScalarResult('au_pseudonym', 'au_pseudonym', 'string') + ->addScalarResult('p_id', 'p_id', 'integer') + ->addScalarResult('p_description', 'p_description', 'string') + ->addScalarResult('p_class', 'p_class', 'string') + ->addScalarResult('p_short', 'p_short', 'string') + ->addScalarResult('p_rate', 'p_rate', 'integer') + ->addScalarResult('p_contact', 'p_contact', 'string') + ->addScalarResult('p_donate', 'p_donate', 'string') + ->addScalarResult('p_link', 'p_link', 'string') + ->addScalarResult('p_profile', 'p_profile', 'string') + ->addIndexByScalar('id'); + + //Fetch result + $res = $em + ->createNativeQuery($req, $rsm) + ->setParameter('begin', $period->getStartDate()) + ->setParameter('end', $period->getEndDate()) + ->setParameter('locale', $locale); + + //Return result + return $res->getResult(); + } + /** * Fetch session by id * @@ -163,7 +284,6 @@ SQL; 'RapsysAirBundle:Application' => $qs->getTableName($em->getClassMetadata('RapsysAirBundle:Application'), $dp), 'RapsysAirBundle:Group' => $qs->getTableName($em->getClassMetadata('RapsysAirBundle:Group'), $dp), 'RapsysAirBundle:GroupUser' => $qs->getJoinTableName($em->getClassMetadata('RapsysAirBundle:User')->getAssociationMapping('groups'), $em->getClassMetadata('RapsysAirBundle:User'), $dp), - 'RapsysAirBundle:Link' => $qs->getTableName($em->getClassMetadata('RapsysAirBundle:Link'), $dp), 'RapsysAirBundle:Location' => $qs->getTableName($em->getClassMetadata('RapsysAirBundle:Location'), $dp), 'RapsysAirBundle:Session' => $qs->getTableName($em->getClassMetadata('RapsysAirBundle:Session'), $dp), 'RapsysAirBundle:Snippet' => $qs->getTableName($em->getClassMetadata('RapsysAirBundle:Snippet'), $dp), @@ -204,15 +324,24 @@ SELECT l.city AS l_city, l.latitude AS l_latitude, l.longitude AS l_longitude, + l.updated AS l_updated, s.slot_id AS t_id, t.title AS t_title, + t.updated AS t_updated, s.application_id AS a_id, + a.canceled AS a_canceled, a.user_id AS au_id, au.pseudonym AS au_pseudonym, p.id AS p_id, p.description AS p_description, - GROUP_CONCAT(i.type ORDER BY i.id SEPARATOR "\\n") AS i_type, - GROUP_CONCAT(i.url ORDER BY i.id SEPARATOR "\\n") AS i_url, + p.class AS p_class, + p.contact AS p_contact, + p.donate AS p_donate, + p.link AS p_link, + p.profile AS p_profile, + p.rate AS p_rate, + p.hat AS p_hat, + p.updated AS p_updated, GROUP_CONCAT(sa.id ORDER BY sa.user_id SEPARATOR "\\n") AS sa_id, GROUP_CONCAT(IFNULL(sa.score, 'NULL') ORDER BY sa.user_id SEPARATOR "\\n") AS sa_score, GROUP_CONCAT(sa.created ORDER BY sa.user_id SEPARATOR "\\n") AS sa_created, @@ -226,7 +355,6 @@ JOIN RapsysAirBundle:Slot AS t ON (t.id = s.slot_id) LEFT JOIN RapsysAirBundle:Application AS a ON (a.id = s.application_id) LEFT JOIN RapsysAirBundle:User AS au ON (au.id = a.user_id) LEFT JOIN RapsysAirBundle:Snippet AS p ON (p.location_id = s.location_id AND p.user_id = a.user_id AND p.locale = :locale) -LEFT JOIN RapsysAirBundle:Link AS i ON (i.user_id = a.user_id) LEFT JOIN RapsysAirBundle:Application AS sa ON (sa.session_id = s.id) LEFT JOIN RapsysAirBundle:User AS sau ON (sau.id = sa.user_id) WHERE s.id = :sid @@ -268,15 +396,24 @@ SQL; ->addScalarResult('l_city', 'l_city', 'string') ->addScalarResult('l_latitude', 'l_latitude', 'float') ->addScalarResult('l_longitude', 'l_longitude', 'float') + ->addScalarResult('l_updated', 'l_updated', 'datetime') ->addScalarResult('t_id', 't_id', 'integer') ->addScalarResult('t_title', 't_title', 'string') + ->addScalarResult('t_updated', 't_updated', 'datetime') ->addScalarResult('a_id', 'a_id', 'integer') + ->addScalarResult('a_canceled', 'a_canceled', 'datetime') ->addScalarResult('au_id', 'au_id', 'integer') ->addScalarResult('au_pseudonym', 'au_pseudonym', 'string') - ->addScalarResult('i_type', 'i_type', 'string') - ->addScalarResult('i_url', 'i_url', 'string') ->addScalarResult('p_id', 'p_id', 'integer') ->addScalarResult('p_description', 'p_description', 'text') + ->addScalarResult('p_class', 'p_class', 'text') + ->addScalarResult('p_contact', 'p_contact', 'text') + ->addScalarResult('p_donate', 'p_donate', 'text') + ->addScalarResult('p_link', 'p_link', 'text') + ->addScalarResult('p_profile', 'p_profile', 'text') + ->addScalarResult('p_rate', 'p_rate', 'integer') + ->addScalarResult('p_hat', 'p_hat', 'boolean') + ->addScalarResult('p_updated', 'p_updated', 'datetime') //XXX: is a string because of \n separator ->addScalarResult('sa_id', 'sa_id', 'string') //XXX: is a string because of \n separator @@ -310,7 +447,7 @@ SQL; * @param $sessionId The session id * @param $granted The session is granted */ - public function fetchCalendarByDatePeriod(TranslatorInterface $translator, $period, $locationId = null, $sessionId = null, $granted = false) { + public function fetchCalendarByDatePeriod(TranslatorInterface $translator, $period, $locationId = null, $sessionId = null, $granted = false, $locale = null) { //Get entity manager $em = $this->getEntityManager(); @@ -327,6 +464,7 @@ SQL; 'RapsysAirBundle:Group' => $qs->getTableName($em->getClassMetadata('RapsysAirBundle:Group'), $dp), 'RapsysAirBundle:Location' => $qs->getTableName($em->getClassMetadata('RapsysAirBundle:Location'), $dp), 'RapsysAirBundle:Slot' => $qs->getTableName($em->getClassMetadata('RapsysAirBundle:Slot'), $dp), + 'RapsysAirBundle:Snippet' => $qs->getTableName($em->getClassMetadata('RapsysAirBundle:Snippet'), $dp), 'RapsysAirBundle:User' => $qs->getTableName($em->getClassMetadata('RapsysAirBundle:User'), $dp), ':afterid' => 4, "\t" => '', @@ -338,7 +476,7 @@ SQL; //When granted is set if (empty($granted)) { - //Set application and user as optional + //Set application and user as optional $grantSql = 'LEFT '; } @@ -353,6 +491,7 @@ SQL; //Set the request $req = <<addScalarResult('l_short', 'l_short', 'string') ->addScalarResult('l_title', 'l_title', 'string') ->addScalarResult('a_id', 'a_id', 'integer') + ->addScalarResult('a_canceled', 'a_canceled', 'datetime') ->addScalarResult('au_id', 'au_id', 'integer') ->addScalarResult('au_pseudonym', 'au_pseudonym', 'string') + ->addScalarResult('p_rate', 'p_rate', 'integer') + ->addScalarResult('p_hat', 'p_hat', 'boolean') //XXX: is a string because of \n separator ->addScalarResult('sau_id', 'sau_id', 'string') //XXX: is a string because of \n separator @@ -422,7 +568,8 @@ SQL; $res = $em ->createNativeQuery($req, $rsm) ->setParameter('begin', $period->getStartDate()) - ->setParameter('end', $period->getEndDate()); + ->setParameter('end', $period->getEndDate()) + ->setParameter('locale', $locale); //Add optional location id if (!empty($locationId)) { @@ -488,7 +635,11 @@ SQL; $class = []; if (!empty($session['a_id'])) { $applications = [ $session['au_id'] => $session['au_pseudonym'] ]; - $class[] = 'granted'; + if (!empty($session['a_canceled'])) { + $class[] = 'canceled'; + } else { + $class[] = 'granted'; + } } elseif ($count > 1) { $class[] = 'disputed'; } elseif (!empty($session['locked'])) { @@ -574,7 +725,7 @@ SQL; } //Add the session - $calendar[$Ymd]['sessions'][$session['t_id'].sprintf('%02d', $session['l_id'])] = [ + $calendar[$Ymd]['sessions'][$session['t_id'].sprintf('%05d', $session['id'])] = [ 'id' => $session['id'], 'start' => $session['start'], 'stop' => $session['stop'], @@ -585,7 +736,9 @@ SQL; 'slottitle' => $translator->trans($session['t_title']), 'weather' => $weather, 'weathertitle' => implode(' ', $weathertitle), - 'applications' => $applications + 'applications' => $applications, + 'rate' => $session['p_rate'], + 'hat' => $session['p_hat'] ]; } } @@ -606,7 +759,7 @@ SQL; * @param $userId The user id * @param $sessionId The session id */ - public function fetchUserCalendarByDatePeriod(TranslatorInterface $translator, $period, $userId = null, $sessionId = null) { + public function fetchUserCalendarByDatePeriod(TranslatorInterface $translator, $period, $userId = null, $sessionId = null, $locale = null) { //Get entity manager $em = $this->getEntityManager(); @@ -623,6 +776,7 @@ SQL; 'RapsysAirBundle:Group' => $qs->getTableName($em->getClassMetadata('RapsysAirBundle:Group'), $dp), 'RapsysAirBundle:Location' => $qs->getTableName($em->getClassMetadata('RapsysAirBundle:Location'), $dp), 'RapsysAirBundle:Slot' => $qs->getTableName($em->getClassMetadata('RapsysAirBundle:Slot'), $dp), + 'RapsysAirBundle:Snippet' => $qs->getTableName($em->getClassMetadata('RapsysAirBundle:Snippet'), $dp), 'RapsysAirBundle:User' => $qs->getTableName($em->getClassMetadata('RapsysAirBundle:User'), $dp), ':afterid' => 4, "\t" => '', @@ -661,12 +815,15 @@ SELECT s.application_id AS a_id, a.user_id AS au_id, au.pseudonym AS au_pseudonym, + p.rate AS p_rate, + p.hat AS p_hat, GROUP_CONCAT(sa.user_id ORDER BY sa.user_id SEPARATOR "\\n") AS sau_id, GROUP_CONCAT(CONCAT("- ", sau.pseudonym) ORDER BY sa.user_id SEPARATOR "\\n") AS sau_pseudonym FROM RapsysAirBundle:Session AS s JOIN RapsysAirBundle:Location AS l ON (l.id = s.location_id) JOIN RapsysAirBundle:Slot AS t ON (t.id = s.slot_id) ${userJoinSql}LEFT JOIN RapsysAirBundle:Application AS a ON (a.id = s.application_id) +LEFT JOIN RapsysAirBundle:Snippet AS p ON (p.location_id = s.location_id AND p.user_id = a.user_id AND p.locale = :locale) LEFT JOIN RapsysAirBundle:User AS au ON (au.id = a.user_id) LEFT JOIN RapsysAirBundle:Application AS sa ON (sa.session_id = s.id) LEFT JOIN RapsysAirBundle:User AS sau ON (sau.id = sa.user_id) @@ -702,6 +859,8 @@ SQL; ->addScalarResult('a_id', 'a_id', 'integer') ->addScalarResult('au_id', 'au_id', 'integer') ->addScalarResult('au_pseudonym', 'au_pseudonym', 'string') + ->addScalarResult('p_rate', 'p_rate', 'integer') + ->addScalarResult('p_hat', 'p_hat', 'boolean') //XXX: is a string because of \n separator ->addScalarResult('sau_id', 'sau_id', 'string') //XXX: is a string because of \n separator @@ -714,6 +873,7 @@ SQL; ->setParameter('begin', $period->getStartDate()) ->setParameter('end', $period->getEndDate()) ->setParameter('uid', $userId) + ->setParameter('locale', $locale) ->getResult(); //Init calendar @@ -876,7 +1036,9 @@ SQL; 'slottitle' => $translator->trans($session['t_title']), 'weather' => $weather, 'weathertitle' => implode(' ', $weathertitle), - 'applications' => $applications + 'applications' => $applications, + 'rate' => $session['p_rate'], + 'hat' => $session['p_hat'] ]; } } @@ -1307,4 +1469,173 @@ SQL; //Return best ranked application return $ret; } + + + /** + * Rekey sessions and applications by chronological session id + * + * @return bool The rekey success or failure + */ + function rekey(): bool { + //Get entity manager + $em = $this->getEntityManager(); + + //Get connection + $cnx = $em->getConnection(); + + //Get quote strategy + $qs = $em->getConfiguration()->getQuoteStrategy(); + $dp = $em->getConnection()->getDatabasePlatform(); + + //Get quoted table names + //XXX: this allow to make this code table name independent + $tables = [ + 'RapsysAirBundle:Application' => $qs->getTableName($em->getClassMetadata('RapsysAirBundle:Application'), $dp), + 'RapsysAirBundle:Session' => $qs->getTableName($em->getClassMetadata('RapsysAirBundle:Session'), $dp), + ':afterid' => 4, + "\t" => '', + "\n" => ' ' + ]; + + //Set the request + $req = <<addScalarResult('id', 'id', 'integer') + ->addScalarResult('sa_id', 'sa_id', 'string'); + #->addIndexByScalar('id'); + + //Fetch result + $rnq = $em->createNativeQuery($req, $rsm); + + //Get result set + $res = $rnq->getResult(); + + //Start transaction + $cnx->beginTransaction(); + + //Set update session request + $sreq = << $data) { + //Set temp id + $res[$id]['t_id'] = $max + $id + 1; + + //Set new id + $res[$id]['n_id'] = $id + 1; + + //Explode application ids + $res[$id]['sa_id'] = explode("\n", $data['sa_id']); + + //Without change + if ($res[$id]['n_id'] == $res[$id]['id']) { + //Remove unchanged session + unset($res[$id]); + } + } + + //With changes + if (!empty($res)) { + //Disable foreign key checks + $cnx->prepare('SET foreign_key_checks = 0')->execute(); + + //Update to temp id + foreach($res as $id => $data) { + //Run session update + $cnx->executeUpdate($sreq, ['nid' => $res[$id]['t_id'], 'id' => $res[$id]['id']]); + + //Run applications update + $cnx->executeUpdate($areq, ['nid' => $res[$id]['t_id'], 'id' => $res[$id]['id']]); + } + + //Update to new id + foreach($res as $id => $data) { + //Run session update + $cnx->executeUpdate($sreq, ['nid' => $res[$id]['n_id'], 'id' => $res[$id]['t_id']]); + + //Run applications update + $cnx->executeUpdate($areq, ['nid' => $res[$id]['n_id'], 'id' => $res[$id]['t_id']]); + } + + //Restore foreign key checks + $cnx->prepare('SET foreign_key_checks = 1')->execute(); + + //Commit transaction + $cnx->commit(); + + //Set update auto_increment request + $ireq = <<exec($ireq); + //Without changes + } else { + //Rollback transaction + $cnx->rollback(); + } + } catch(\Exception $e) { + //Rollback transaction + $cnx->rollback(); + + //Throw exception + throw $e; + } + + //Return success + return true; + } }