Skip to content

Instantly share code, notes, and snippets.

@sandosh
Created December 5, 2014 07:45
Show Gist options
  • Save sandosh/c9ed0b6e20396dcfa18e to your computer and use it in GitHub Desktop.
Save sandosh/c9ed0b6e20396dcfa18e to your computer and use it in GitHub Desktop.
diff --git a/src/Nous/FollowBundle/Repository/FollowRepository.php b/src/Nous/FollowBundle/Repository/FollowRepository.php
index 93fdb5b..9de0b0b 100644
--- a/src/Nous/FollowBundle/Repository/FollowRepository.php
+++ b/src/Nous/FollowBundle/Repository/FollowRepository.php
@@ -157,4 +157,23 @@ class FollowRepository extends EntityRepository
return $pager;
}
+
+ public function getFollowingIdsForUser(User $user)
+ {
+ $qb = $this->_em->createQueryBuilder();
+
+ $qb
+ ->select('IDENTITY(f.following) as id')
+ ->from($this->getEntityName(), 'f')
+ ->where('f.follower = :user')
+ ->andWhere('f.status = :active')
+ ->orderBy('f.updatedAt', 'DESC')
+ ->setParameter('user', $user)
+ ->setParameter('active', Follow::STATUS_ACTIVE)
+ ;
+
+ $result = $qb->getQuery()->getScalarResult();
+ return array_map('current', $result);
+
+ }
}
diff --git a/src/Nous/UserBundle/Api/Assembler/UserAssembler.php b/src/Nous/UserBundle/Api/Assembler/UserAssembler.php
index cef6bc4..303d34a 100644
--- a/src/Nous/UserBundle/Api/Assembler/UserAssembler.php
+++ b/src/Nous/UserBundle/Api/Assembler/UserAssembler.php
@@ -69,6 +69,11 @@ class UserAssembler extends Assembler
$userResource->twitter = $user->getProfile()->getTwitter();
$userResource->instagram = $user->getProfile()->getInstagram();
$userResource->pinterest = $user->getProfile()->getPinterest();
+ if ($this->currentUserService->getUser()) {
+ $userResource->isComplete = true;
+ } else {
+ $userResource->isComplete = !$user->hasRole(User::ROLE_INCOMPLETE);
+ }
$statistics = new StatisticsResource();
$statistics->followers = $user->getStatistics()->getFollowers();
diff --git a/src/Nous/UserBundle/Api/Controller/UsersController.php b/src/Nous/UserBundle/Api/Controller/UsersController.php
index ea5e15a..9f4ccef 100644
--- a/src/Nous/UserBundle/Api/Controller/UsersController.php
+++ b/src/Nous/UserBundle/Api/Controller/UsersController.php
@@ -14,7 +14,10 @@ use FOS\RestBundle\Controller\Annotations\QueryParam,
FOS\RestBundle\Controller\Annotations\View,
FOS\RestBundle\Controller\Annotations\Get,
FOS\RestBundle\Request\ParamFetcherInterface,
- FOS\RestBundle\View\View as FosView
+ FOS\RestBundle\View\View as FosView,
+ FOS\RestBundle\Controller\Annotations\Post,
+ FOS\UserBundle\Event\GetResponseUserEvent,
+ FOS\UserBundle\FOSUserEvents
;
use Nelmio\ApiDocBundle\Annotation\ApiDoc;
@@ -23,8 +26,59 @@ use Nous\SiteBundle\Controller\Controller as BaseController;
use Nous\UserBundle\Api\Resource\Collection\UserCollection;
+use Nous\UserBundle\Api\Form\RegisterType,
+ Nous\UserBundle\Api\Resource\NewUser;
+
+use Tbbc\RestUtilBundle\Error\Exception\FormErrorException;
+
class UsersController extends BaseController
{
+
+ /**
+ * Create an user
+ *
+ * @View(statusCode=200)
+ * @ApiDoc(
+ * input="Nous\UserBundle\Api\Form\RegisterType",
+ * output="Nous\UserBundle\Api\Resource\User",
+ * statusCodes={
+ * 200="Returned when successful",
+ * 400="Returned when posted data contains errors"
+ * }
+ * )
+ */
+ public function postUsersAction(Request $request)
+ {
+
+ $new_user = new NewUser();
+ $form = $this->createNamedForm('', new RegisterType(), $new_user);
+ $form->handleRequest($request);
+
+ if ($form->isValid()) {
+ $dispatcher = $this->container->get('event_dispatcher');
+
+ $user = $this->getUserManager()->createUser();
+ $user->setEnabled(true);
+
+ $event = new GetResponseUserEvent($user, $request);
+ $dispatcher->dispatch(FOSUserEvents::REGISTRATION_INITIALIZE, $event);
+
+ if (null !== $event->getResponse()) {
+ return $event->getResponse();
+ }
+
+ $user->setUsername($new_user->username);
+ $user->setPlainPassword($new_user->password);
+ $user->setEmail($new_user->email);
+
+ $this->getUserManager()->updateUser($user);
+
+ return array('user' => $this->getUserAssembler()->entityToResource($user));
+ }
+ throw new FormErrorException($form, $this->getTranslator());
+ }
+
+
/**
* Search users
*
diff --git a/src/Nous/UserBundle/Api/Resource/User.php b/src/Nous/UserBundle/Api/Resource/User.php
index 1833f1f..1b87024 100644
--- a/src/Nous/UserBundle/Api/Resource/User.php
+++ b/src/Nous/UserBundle/Api/Resource/User.php
@@ -37,4 +37,6 @@ class User
public $statistics;
public $isFollowing;
+
+ public $isComplete;
}
diff --git a/src/Nous/UserBundle/Resources/config/serializer/Api.Resource.User.xml b/src/Nous/UserBundle/Resources/config/serializer/Api.Resource.User.xml
index 2000e2e..aa62dd0 100644
--- a/src/Nous/UserBundle/Resources/config/serializer/Api.Resource.User.xml
+++ b/src/Nous/UserBundle/Resources/config/serializer/Api.Resource.User.xml
@@ -17,5 +17,6 @@
<property name="pinterest" expose="true" type="string" />
<property name="statistics" expose="true" type="Nous\UserBundle\Api\Resource\Statistics" />
<property name="isFollowing" expose="true" type="boolean" />
+ <property name="isComplete" expose="true" type="boolean" />
</class>
</serializer>
diff --git a/src/Nous/UserBundle/Resources/config/validation.xml b/src/Nous/UserBundle/Resources/config/validation.xml
index 7e0d7ea..d732806 100644
--- a/src/Nous/UserBundle/Resources/config/validation.xml
+++ b/src/Nous/UserBundle/Resources/config/validation.xml
@@ -185,4 +185,50 @@
</property>
</class>
+ <class name="Nous\UserBundle\Api\Resource\NewUser">
+ <property name="password">
+ <constraint name="NotBlank">
+ <option name="message">fos_user.password.blank</option>
+ </constraint>
+ <constraint name="Length">
+ <option name="min">5</option>
+ <option name="max">4096</option>
+ <option name="minMessage">fos_user.password.short</option>
+ </constraint>
+ </property>
+
+ <property name="username">
+ <constraint name="Length">
+ <option name="min">3</option>
+ <option name="max">255</option>
+ <option name="groups">
+ <value>Registration</value>
+ <value>Profile</value>
+ </option>
+ </constraint>
+ <constraint name="Regex">
+ <option name="pattern">/^(?![0-9]*$)[a-zA-Z0-9]+$/</option>
+ <option name="message">Username can only contain letters and numbers</option>
+ <option name="groups">
+ <value>Registration</value>
+ <value>Profile</value>
+ </option>
+ </constraint>
+ </property>
+
+ <property name="email">
+ <constraint name="NotBlank">
+ <option name="message">account.email.NotBlank</option>
+ </constraint>
+ <constraint name="Email" />
+ <constraint name="Length">
+ <option name="min">2</option>
+ <option name="max">254</option>
+ </constraint>
+ </property>
+
+ <constraint name="Nous\UserBundle\Validator\UsernameIsUnique"/>
+ <constraint name="Nous\UserBundle\Validator\EmailIsUnique"/>
+ </class>
+
</constraint-mapping>
diff --git a/src/Nous/UserBundle/Security/Listener/RequestListener.php b/src/Nous/UserBundle/Security/Listener/RequestListener.php
index 6fd7d5d..d501e0a 100644
--- a/src/Nous/UserBundle/Security/Listener/RequestListener.php
+++ b/src/Nous/UserBundle/Security/Listener/RequestListener.php
@@ -14,6 +14,8 @@ use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException,
Symfony\Component\Security\Core\Authentication\Token\AnonymousToken
;
+use FOS\OAuthServerBundle\Security\Authentication\Token\OAuthToken;
+
use Nous\UserBundle\Entity\User;
class RequestListener
@@ -34,11 +36,15 @@ class RequestListener
public function onKernelRequest(GetResponseEvent $event)
{
- if (!$this->security->getToken() instanceof TokenInterface || $this->security->getToken() instanceof AnonymousToken) {
+ if (!$this->security->getToken() instanceof TokenInterface
+ || $this->security->getToken() instanceof AnonymousToken
+ || $this->security->getToken() instanceof OAuthToken) {
+
return;
}
$user = $this->security->getToken()->getUser();
+
if ($user instanceof User) {
if ($user->hasRole(User::ROLE_FACEBOOK)) {
$route = 'postregistration_facebook';
diff --git a/src/Nous/UserBundle/Service/CurrentUserService.php b/src/Nous/UserBundle/Service/CurrentUserService.php
index 721c866..1e76fce 100644
--- a/src/Nous/UserBundle/Service/CurrentUserService.php
+++ b/src/Nous/UserBundle/Service/CurrentUserService.php
@@ -87,6 +87,8 @@ class CurrentUserService
}
public function followsUser(User $user) {
+ file_put_contents("/tmp/follow", $user->getId().'--->'.json_encode($this->getFollowedUserIDs()));
+
return in_array($user->getId(), $this->getFollowedUserIDs());
}
@@ -155,10 +157,7 @@ class CurrentUserService
return array();
}
if (!is_array($this->followed_users)) {
- $follows = $this->follow_repo->getAllFollowingsForUser($this->getUser());
- $this->followed_users = $this->mapArrayOfEntitiesToIDs($follows, function(Follow $follow) {
- return $follow->getFollowing()->getId();
- });
+ $this->followed_users = $this->follow_repo->getFollowingIdsForUser($this->getUser());
}
return $this->followed_users;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment