diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..d5490c7 --- /dev/null +++ b/composer.json @@ -0,0 +1,45 @@ +{ + "name": "symfony/framework-standard-edition", + "description": "The \"Symfony Standard Edition\" distribution", + "autoload": { + "psr-0": { "": "src/" } + }, + "require": { + "php": ">=5.3.3", + "symfony/symfony": "2.1.*", + "doctrine/orm": ">=2.2.3,<2.4-dev", + "doctrine/doctrine-bundle": "1.0.*", + "twig/extensions": "1.0.*", + "symfony/assetic-bundle": "2.1.*", + "symfony/swiftmailer-bundle": "2.1.*", + "symfony/monolog-bundle": "2.1.*", + "sensio/distribution-bundle": "2.1.*", + "sensio/framework-extra-bundle": "2.1.*", + "sensio/generator-bundle": "2.1.*", + "jms/security-extra-bundle": "1.2.*", + "jms/di-extra-bundle": "1.1.*", + "knplabs/doctrine-behaviors": "dev-master" + }, + "scripts": { + "post-install-cmd": [ + "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::buildBootstrap", + "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::clearCache", + "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::installAssets", + "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::installRequirementsFile" + ], + "post-update-cmd": [ + "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::buildBootstrap", + "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::clearCache", + "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::installAssets", + "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::installRequirementsFile" + ] + }, + "config": { + "bin-dir": "bin" + }, + "minimum-stability": "dev", + "extra": { + "symfony-app-dir": "app", + "symfony-web-dir": "web" + } +} diff --git a/src/BodyRep/Controller/AuthController.php b/src/BodyRep/Controller/AuthController.php new file mode 100644 index 0000000..2795ee6 --- /dev/null +++ b/src/BodyRep/Controller/AuthController.php @@ -0,0 +1,68 @@ +generateUrl('_login')); + } + + /** + /** + * @Route("/login", name="_login") + * @Template() + */ + public function loginAction() + { + $request = $this->getRequest(); + $session = $request->getSession(); + + // get the login error if there is one + if ($request->attributes->has(SecurityContext::AUTHENTICATION_ERROR)) { + $error = $request->attributes->get(SecurityContext::AUTHENTICATION_ERROR); + } else { + $error = $session->get(SecurityContext::AUTHENTICATION_ERROR); + } + + return $this->render('BodyRep:Auth:login.html.twig', array( + // last username entered by the user + 'last_username' => $session->get(SecurityContext::LAST_USERNAME), + 'error' => $error, + )); + } + /** + * @Route("/login/check", name="_login_check") + * @Template() + */ + public function securityCheckAction() + { + // The security layer will intercept this request + } + /** + * @Route("/logout", name="_logout") + * @Template() + */ + public function logoutAction() + { + // The security layer will intercept this request + } + + public function navbarAction() + { + // The security layer will intercept this request + } +} \ No newline at end of file diff --git a/src/BodyRep/Controller/CommentController.php b/src/BodyRep/Controller/CommentController.php new file mode 100644 index 0000000..5e55ff7 --- /dev/null +++ b/src/BodyRep/Controller/CommentController.php @@ -0,0 +1,65 @@ +getUser()->getUsername() == $username) + return new RedirectResponse($this->generateUrl('_member_profile')); + + $db = $this->getDoctrine()->getManager(); + + $query = $db->createQuery(' + SELECT p + FROM BodyRep:Profile p + WHERE p.username = :username') + ->setParameter('username', $username) + ->setMaxResults(1); + if (sizeof($query->getResult()) != 1) + throw $this->createNotFoundException("User '".$username."' not found"); + + $profile = $query->getSingleResult(); + $username = $this->getUser()->getUsername(); + $db = $this->getDoctrine()->getManager(); + $query = $db->createQuery(' + SELECT m + FROM BodyRep:Member m + WHERE m.username = :username') + ->setParameter('username', $username) + ->setMaxResults(1); + + if (sizeof($query->getResult()) != 1) + throw $this->createNotFoundException("User '".$username."' not found"); + + $member = $query->getSingleResult(); + + return (array('sFullName' => $profile->getFullName(), 'name' => $member->getFullName())); + + } + /** + * @Route("/rep", name="_profile_reputation") + * @Template() + */ + public function reputationAction($username) + { + return $this->indexAction($username); + } + + +} diff --git a/src/BodyRep/Controller/LandingController.php b/src/BodyRep/Controller/LandingController.php index 8e64ec3..e72c501 100644 --- a/src/BodyRep/Controller/LandingController.php +++ b/src/BodyRep/Controller/LandingController.php @@ -22,6 +22,7 @@ class LandingController extends Controller * or @Template annotation as demonstrated in DemoController. * */ + return $this->render('BodyRep:Landing:index.html.twig'); } diff --git a/src/BodyRep/Controller/MemberController.php b/src/BodyRep/Controller/MemberController.php index 3e86708..be7d9db 100644 --- a/src/BodyRep/Controller/MemberController.php +++ b/src/BodyRep/Controller/MemberController.php @@ -1,50 +1,63 @@ get('request')->attributes->has(SecurityContext::AUTHENTICATION_ERROR)) { - $error = $this->get('request')->attributes->get(SecurityContext::AUTHENTICATION_ERROR); - } else { - $error = $this->get('request')->getSession()->get(SecurityContext::AUTHENTICATION_ERROR); - } + parent::setContainer($container); - return array( - 'last_username' => $this->get('request')->getSession()->get(SecurityContext::LAST_USERNAME), - 'error' => $error, - ); + # Lookup member if logged in + $user = $this->getUser(); + + if (method_exists($user, 'getUsername')) + { + $db = $this->getDoctrine()->getManager(); + $username = $this->getUser()->getUsername(); + + $query = $db->createQuery(' + SELECT m + FROM BodyRep:Member m + WHERE m.username = :username') + ->setParameter('username', $username) + ->setMaxResults(1); + + if (sizeof($query->getResult()) != 1) + throw $this->createNotFoundException("User '".$username."' not found"); + + $this->member = $query->getSingleResult(); + } + else + trigger_error("Container cannot determine member information"); } - - /** - * @Route("/login_check", name="_security_check") - */ - public function securityCheckAction() + + + private function getMember() { - // The security layer will intercept this request + return $this->member; } - - /** - * @Route("/logout", name="_logout") - */ - public function logoutAction() + + public function navbarAction() { // The security layer will intercept this request } @@ -56,20 +69,9 @@ class MemberController extends Controller public function indexAction() { $username = $this->getUser()->getUsername(); - $db = $this->getDoctrine()->getManager(); - $query = $db->createQuery(' - SELECT m - FROM BodyRep:Member m - WHERE m.username = :username') - ->setParameter('username', $username) - ->setMaxResults(1); + - if (sizeof($query->getResult()) != 1) - throw $this->createNotFoundException("User '".$username."' not found"); - - $member = $query->getSingleResult(); - - return array('name' => $member->getFullName()); + return array('name' => $this->getMember()->getFullName()); } /** @@ -78,7 +80,7 @@ class MemberController extends Controller */ public function profileAction() { - $username = $this->getUser()->getUsername(); + $username = $this->getUser()->getUsername(); $db = $this->getDoctrine()->getManager(); $query = $db->createQuery(' @@ -91,22 +93,10 @@ class MemberController extends Controller throw $this->createNotFoundException("User '".$username."' not found"); $profile = $query->getSingleResult(); - $db = $this->getDoctrine()->getManager(); - $query = $db->createQuery(' - SELECT m - FROM BodyRep:Member m - WHERE m.username = :username') - ->setParameter('username', $username) - ->setMaxResults(1); - - if (sizeof($query->getResult()) != 1) - throw $this->createNotFoundException("User '".$username."' not found"); - - $member = $query->getSingleResult(); - - - return (array('sFullName' => $profile->getFullName(), 'name' => $member->getFullName())); + + return (array('sFullName' => $profile->getFullName(), 'name' => $this->getMember()->getFullName())); } + /** * @Route("/profile/edit", name="_member_profile_edit") * @Template() @@ -114,41 +104,19 @@ class MemberController extends Controller public function editProfileAction() { $username = $this->getUser()->getUsername(); - $db = $this->getDoctrine()->getManager(); - $query = $db->createQuery(' - SELECT m - FROM BodyRep:Member m - WHERE m.username = :username') - ->setParameter('username', $username) - ->setMaxResults(1); + $form = $this->get('form.factory')->create(new Profile(), array('fullname' => $this->getMember()->getFullName())); + $error = ''; - if (sizeof($query->getResult()) != 1) - throw $this->createNotFoundException("User '".$username."' not found"); - - $member = $query->getSingleResult(); - $form = $this->get('form.factory')->create(new Profile(), array('fullname' => $member->getFullName())); - $error = ''; - - return array('form' => $form->createView(), 'error' => ''); + return array('form' => $form->createView(), 'error' => ''); } - /** + + /** * @Route("/profile/save", name="_member_profile_save") */ public function saveAction() { $username = $this->getUser()->getUsername(); $db = $this->getDoctrine()->getManager(); - $query = $db->createQuery(' - SELECT m - FROM BodyRep:Member m - WHERE m.username = :username') - ->setParameter('username', $username) - ->setMaxResults(1); - - if (sizeof($query->getResult()) != 1) - throw $this->createNotFoundException("User '".$username."' not found"); - - $member = $query->getSingleResult(); $json = array('result' => 0); $form = $this->get('form.factory')->create(new Profile()); @@ -156,18 +124,30 @@ class MemberController extends Controller $form->bind($request); + $np1 = $request->get('_newpass1'); + $np2 = $request->get('_newpass2'); + // if (!empty($np1) && !$np1 != $np2) + // $form->get("fullname")->addError(new FormError('Passwords do not match')); - if ($form->isValid()) + if ($form->isValid() && sizeof($_POST) > 0) { $json['result'] = 1; + if (!empty($np1)) + { + $factory = $this->get('security.encoder_factory'); + $encoder = $factory->getEncoder($this->getUser()); + $password = $encoder->encodePassword($np1, $this->getUser()->getSalt()); + + $this->member->setPassword($password); + } $d = $form->getClientData(); - $member->setFullName($d['fullname']); - $db->persist($member); + $this->getMember()->setFullName($d['fullname']); + $db->persist($this->getMember()); $db->flush(); } $resp = new Response (json_encode($json)); - $resp->headers->set('Content-Type', 'text/plain'); + $resp->headers->set('Content-Type', 'application/json'); return $resp; } @@ -179,7 +159,7 @@ class MemberController extends Controller { /* - * Integreted suggester response + * Integrated suggester response * */ $em = $this->getDoctrine()->getManager(); @@ -208,7 +188,5 @@ class MemberController extends Controller } else*/ return array('search' => $res); - - } } diff --git a/src/BodyRep/Controller/ProfileController.php b/src/BodyRep/Controller/ProfileController.php index 662b6c5..f60a462 100644 --- a/src/BodyRep/Controller/ProfileController.php +++ b/src/BodyRep/Controller/ProfileController.php @@ -14,11 +14,12 @@ use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template; class ProfileController extends Controller { /** - * @Route("/{username}", name="_profile") + * @Route("/", name="_profile") * @Template() */ public function indexAction($username) { + if ($this->getUser()->getUsername() == $username) return new RedirectResponse($this->generateUrl('_member_profile')); @@ -48,10 +49,17 @@ class ProfileController extends Controller $member = $query->getSingleResult(); - return (array('sFullName' => $profile->getFullName(), 'name' => $member->getFullName())); } + /** + * @Route("/rep", name="_profile_reputation") + * @Template() + */ + public function reputationAction($username) + { + return $this->indexAction($username); + } } diff --git a/src/BodyRep/DependencyInjection/BodyRepExtension.php b/src/BodyRep/DependencyInjection/BodyRepExtension.php index 92bd84b..52c0661 100644 --- a/src/BodyRep/DependencyInjection/BodyRepExtension.php +++ b/src/BodyRep/DependencyInjection/BodyRepExtension.php @@ -3,16 +3,16 @@ namespace BodyRep\DependencyInjection; use Symfony\Component\DependencyInjection\ContainerBuilder; -use Symfony\Component\DependencyInjection\Loader\XmlFileLoader; use Symfony\Component\HttpKernel\DependencyInjection\Extension; -use Symfony\Component\Config\FileLocator; +#use Symfony\Component\DependencyInjection\Loader\YamlFileLoader; +#use Symfony\Component\Config\FileLocator; class BodyRepExtension extends Extension { public function load(array $configs, ContainerBuilder $container) { - $loader = new XmlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config')); - $loader->load('services.xml'); + #$loader = new YamlFileLoader($container, new FileLocator(__DIR__)); + #$loader->load('/data/www/br/src/BodyRep/Resources/config/services.yml'); } public function getAlias() diff --git a/src/BodyRep/Entity/Comment.php b/src/BodyRep/Entity/Comment.php new file mode 100644 index 0000000..5c56dc3 --- /dev/null +++ b/src/BodyRep/Entity/Comment.php @@ -0,0 +1,115 @@ +id; + } + + /** + * Set author + * + * @param string $author + * @return Comment + */ + public function setAuthor($author) + { + $this->author = $author; + + return $this; + } + + /** + * Get author + * + * @return string + */ + public function getAuthor() + { + return $this->author; + } + + /** + * Set text + * + * @param string $text + * @return Comment + */ + public function setText($text) + { + $this->text = $text; + + return $this; + } + + /** + * Get text + * + * @return string + */ + public function getText() + { + return $this->text; + } + + /** + * Set created + * + * @param timestamp $created + * @return Comment + */ + public function setCreated(\timestamp $created) + { + $this->created = $created; + + return $this; + } + + /** + * Get created + * + * @return timestamp + */ + public function getCreated() + { + return $this->created; + } +} \ No newline at end of file diff --git a/src/BodyRep/Entity/Member.php b/src/BodyRep/Entity/Member.php index 29f13f8..83c0dce 100644 --- a/src/BodyRep/Entity/Member.php +++ b/src/BodyRep/Entity/Member.php @@ -114,6 +114,20 @@ class Member implements UserInterface return $this; } + /** + * Set password + * + * @param string $password + * @return Member + */ + public function setPassword($password) + { + $this->password = $password; + + return $this; + } + + /** * Get fullName * diff --git a/src/BodyRep/Entity/User.php b/src/BodyRep/Entity/User.php new file mode 100644 index 0000000..66e8cba --- /dev/null +++ b/src/BodyRep/Entity/User.php @@ -0,0 +1,110 @@ +roles; + } + + public function getSalt() + { + return $this->salt; + } + + public function getUsername() + { + return $this->username; + } + + public function eraseCredentials() + { + } + + public function getPassword() + { + return $this->password; + } + + /** + * Get id + * + * @return integer + */ + public function getId() + { + return $this->id; + } + + /** + * Set username + * + * @param string $username + * @return User + */ + public function setUsername($username) + { + $this->username = $username; + + return $this; + } + + /** + * Set password + * + * @param string $password + * @return User + */ + public function setPassword($password) + { + $this->password = $password; + + return $this; + } + + /** + * Set salt + * + * @param string $salt + * @return User + */ + public function setSalt($salt) + { + $this->salt = $salt; + + return $this; + } +} \ No newline at end of file diff --git a/src/BodyRep/Entity/UserRepository.php b/src/BodyRep/Entity/UserRepository.php new file mode 100644 index 0000000..5e55cfd --- /dev/null +++ b/src/BodyRep/Entity/UserRepository.php @@ -0,0 +1,15 @@ +mailer = $mailer; + } + + public function onCommentEvent(CommentEvent $event) + { + $post = $event->getPost(); + $comment = $event->getComment(); + + foreach ($post->getSubscribers() as $subscriber) { + $message = Swift_Message::newInstance() + ->setSubject('New comment posted on ' . $post->getTitle()) + ->setFrom('send@example.com') + ->setTo($subscriber->getEmail()) + ->setBody("Hey, somebody left a new comment on a post you're subscribed to! It says: " . $comment->getBody()) + ; + $this->mailer->send($message); + } + } +} + +?> \ No newline at end of file diff --git a/src/BodyRep/EventListener/ControllerListener.php b/src/BodyRep/EventListener/ControllerListener.php index 41b6f92..a4f81fb 100644 --- a/src/BodyRep/EventListener/ControllerListener.php +++ b/src/BodyRep/EventListener/ControllerListener.php @@ -23,4 +23,24 @@ class ControllerListener $this->extension->setController($event->getController()); } } + public function preExecute(\Symfony\Component\HttpKernel\Event\GetResponseForControllerResultEvent $event){ + //result returned by the controller + $data = $event->getControllerResult(); + + //Get the current route + $route = $event->getRequest()->get('_route'); + + /* @var $request \Symfony\Component\HttpFoundation\Request */ + $request = $event->getRequest(); + $template = $request->get('_template'); + $route = $request->get('_route'); + + if(substr($route,0,7) == 'mobile_'){ + $newTemplate = str_replace('html.twig','mobile.html.twig',$template); + + //Overwrite original template with the mobile one + $response = $this->templating->renderResponse($newTemplate, $data); + $event->setResponse($response); + } + } } diff --git a/src/BodyRep/EventListener/KernelListener.php b/src/BodyRep/EventListener/KernelListener.php new file mode 100644 index 0000000..f8f4989 --- /dev/null +++ b/src/BodyRep/EventListener/KernelListener.php @@ -0,0 +1,20 @@ +public function preExecute(\Symfony\Component\HttpKernel\Event\GetResponseForControllerResultEvent $event){ + //result returned by the controller + $data = $event->getControllerResult(); + + //Get the current route + $route = $event->getRequest()->get('_route'); + + /* @var $request \Symfony\Component\HttpFoundation\Request */ + $request = $event->getRequest(); + $template = $request->get('_template'); + $route = $request->get('_route'); + + if(substr($route,0,7) == 'mobile_'){ + $newTemplate = str_replace('html.twig','mobile.html.twig',$template); + + //Overwrite original template with the mobile one + $response = $this->templating->renderResponse($newTemplate, $data); + $event->setResponse($response); + } +} \ No newline at end of file diff --git a/src/BodyRep/EventListener/LoginListener.php b/src/BodyRep/EventListener/LoginListener.php new file mode 100644 index 0000000..840f60a --- /dev/null +++ b/src/BodyRep/EventListener/LoginListener.php @@ -0,0 +1,46 @@ +context = $context; + $this->em = $doctrine->getEntityManager(); + } + + /** + * Do the magic. + * + * @param Event $event + */ + public function onSecurityInteractiveLogin(Event $event) + { + $user = $this->context->getToken()->getUser(); + + // do all your magic here + } +} + +?> \ No newline at end of file diff --git a/src/BodyRep/Resources/views/Auth/login.html.twig b/src/BodyRep/Resources/views/Auth/login.html.twig new file mode 100644 index 0000000..907d51c --- /dev/null +++ b/src/BodyRep/Resources/views/Auth/login.html.twig @@ -0,0 +1,34 @@ +{% extends 'BodyRep::layout.html.twig' %} +{% block js %} + $(document).ready(function() + { + if($('#username').val().length > 0) + $('#password').focus(); + else + $('#username').focus(); + }); +{% endblock %} + +{% block content %} + + +
Loading
{{ comment.text }}
+