PageRenderTime 49ms CodeModel.GetById 17ms RepoModel.GetById 1ms app.codeStats 0ms

/src/MD/MondialatorBundle/Controller/UserController.php

https://gitlab.com/HugoGarrido/mondialator
PHP | 586 lines | 413 code | 130 blank | 43 comment | 22 complexity | 3ac563f59a6aeb8e234565cba46a8ee8 MD5 | raw file
  1. <?php
  2. namespace MD\MondialatorBundle\Controller;
  3. use MD\MondialatorBundle\Entity\User;
  4. use MD\MondialatorBundle\Entity\Media;
  5. use MD\MondialatorBundle\Entity\Social;
  6. use Symfony\Bundle\FrameworkBundle\Controller\Controller;
  7. use Symfony\Component\HttpFoundation\Request;
  8. use Symfony\Component\HttpFoundation\JsonResponse;
  9. use Symfony\Component\HttpFoundation\Response;
  10. use GuzzleHttp;
  11. use \Firebase\JWT\JWT;
  12. class UserController extends Controller
  13. {
  14. public function defaultAction(){
  15. return $this->render('MDMondialatorBundle:User:index.html.twig');
  16. }
  17. /**
  18. * Return an user to put in profile view
  19. */
  20. public function viewAction($id) {
  21. $em = $this
  22. ->getDoctrine()
  23. ->getManager()
  24. ;
  25. $repository = $em->getRepository('MDMondialatorBundle:User');
  26. $user = $repository->findUserById($id)->getArrayResult();
  27. $u = $repository->find($user[0]['id']);
  28. $follow = $u->getFollowersId();
  29. $following = $u->getFollowingId();
  30. $followAllData = $u->getFollowers();
  31. $followingAllData = $u->getFollowing();
  32. $followAll = [];
  33. $followingAll = [];
  34. foreach ($followAllData as $follower) {
  35. array_push($followAll, $follower->jsonSerialize());
  36. }
  37. foreach ($followingAllData as $follower) {
  38. array_push($followingAll, $follower->jsonSerialize());
  39. }
  40. $user[0]['followAll'] = $followAll;
  41. $user[0]['followingAll'] = $followingAll;
  42. $repository = $em->getRepository('MDMondialatorBundle:Submission');
  43. $subs = $repository->getSubmissionByUser($u)->getArrayResult();
  44. $user[0]['submission'] = $subs;
  45. $user[0]['follow'] = $follow;
  46. $user[0]['following'] = $following;
  47. return new JsonResponse(
  48. array(
  49. "data" => $user,
  50. "status" => Response::HTTP_OK,
  51. )
  52. );
  53. }
  54. public function addAction(Request $request) {
  55. if($request->getMethod()=='POST'){
  56. $user = new User();
  57. $user->setFirstname($request->get('firstname'));
  58. $user->setLastname($request->get('lastname'));
  59. $user->setEmail($request->get('email'));
  60. $user->setPassword($request->get('password'));
  61. $em= $this->getDoctrine()->getManager();
  62. $em->persist($user);
  63. $em->flush();
  64. return new Response("User ajouté avec l'id ".$user->getId());
  65. }
  66. }
  67. /**
  68. * Login using oauth2
  69. * return: jwt token
  70. */
  71. public function loginAction(Request $request, $provider) {
  72. if($request->getMethod() == 'POST'){
  73. $em= $this->getDoctrine()->getManager();
  74. if($provider == "mondialator"){
  75. $params = [
  76. 'email' => $request->request->get('email'),
  77. 'password' => $request->request->get('password')
  78. ];
  79. $userDatas = $this->loginMondialator($params);
  80. }
  81. else{
  82. $providerId = $em->getRepository('MDMondialatorBundle:SocialType')
  83. ->findBy(array('name' => $provider))
  84. ;
  85. $params = [
  86. 'code' => $request->request->get('code'),
  87. 'client_id' => $request->request->get('clientId'),
  88. 'redirect_uri' => $request->request->get('redirectUri'),
  89. ];
  90. $userDatas = $this->handleProvider($params, $provider);
  91. }
  92. /*
  93. * Create User
  94. */
  95. if($userDatas['isKnowUser'] == false){
  96. $em= $this->getDoctrine()->getManager();
  97. $user = new User();
  98. $user->setFirstname($userDatas['first_name']);
  99. $user->setLastname($userDatas['last_name']);
  100. $user->setEmail($userDatas['email']);
  101. $user->setCountry($userDatas['locale']);
  102. $user->setScore(100);
  103. $user->setNbLike(0);
  104. $user->setNbSubmission(0);
  105. $user->setAchievement($em->getRepository('MDMondialatorBundle:Achievement')->find(1));
  106. $pict = new Media($em);
  107. $pict->setUrl($userDatas['picture']);
  108. $pict->setAlt($userDatas['name']);
  109. $user->setPicture($pict);
  110. $em->persist($user);
  111. $socialType = $em->getRepository('MDMondialatorBundle:SocialType')
  112. ->findBy(['name' => $provider]);
  113. $social = new Social();
  114. $social->setSocialId($userDatas['id']);
  115. $social->setToken($userDatas['accessToken']);
  116. $social->setUser($user);
  117. $social->setType($socialType[0]);
  118. $em->persist($social);
  119. $em->flush();
  120. return new JsonResponse(
  121. array(
  122. 'token' => $this->createToken($user),
  123. 'status' => Response::HTTP_OK
  124. )
  125. );
  126. }
  127. else{
  128. // User is in DB
  129. return new JsonResponse(
  130. array(
  131. 'token' => $this->createToken($userDatas['knowUser']),
  132. 'status' => Response::HTTP_OK,
  133. )
  134. );
  135. }
  136. }
  137. return new JsonResponse(array('status' => Response::HTTP_BAD_REQUEST));
  138. }
  139. /**
  140. * Handle the provider with params
  141. */
  142. public function handleProvider($params, $provider){
  143. if($provider == "facebook"){
  144. return $this->loginFacebook($params);
  145. }
  146. }
  147. /**
  148. * Handle facebook login
  149. * return: users infos
  150. */
  151. public function loginFacebook($params){
  152. $params['client_secret'] = $this->getParameter('facebook_secret');
  153. $urlMe = 'https://graph.facebook.com/v2.5/me';
  154. $urlAccess = 'https://graph.facebook.com/v2.5/oauth/access_token';
  155. $default = ["verify" => $this->get('kernel')->getRootDir().'/../cert.pem'];
  156. $client = new GuzzleHttp\Client($default);
  157. $accessTokenResponse = $client->request('GET', $urlAccess, ['query' => $params]);
  158. $accessToken = json_decode($accessTokenResponse->getBody(), true);
  159. // Step 2. Retrieve profile information about the current user.
  160. $fields = 'id,email,first_name,last_name,link,name,picture,locale';
  161. $profileResponse = $client->request('GET', $urlMe, [
  162. 'query' => [
  163. 'access_token' => $accessToken['access_token'],
  164. 'fields' => $fields
  165. ]
  166. ]);
  167. $profile = json_decode($profileResponse->getBody(), true);
  168. $profile['accessToken'] = $accessToken['access_token'];
  169. // Check is user already exists
  170. $profile['isKnowUser'] = false;
  171. $em= $this->getDoctrine()->getManager();
  172. $possibleUser = $em->getRepository('MDMondialatorBundle:User')->findBy(array('email' => $profile['email']));
  173. if(count($possibleUser) > 0){
  174. $profile['isKnowUser'] = true;
  175. $profile['knowUser'] = $possibleUser[0];
  176. return $profile;
  177. }
  178. // Search the country from locale info
  179. $countryCode = explode("_", $profile['locale'])[1];
  180. $em= $this->getDoctrine()->getManager();
  181. $country = $em->getRepository('MDMondialatorBundle:Country')
  182. ->findBy(array('iso' => $countryCode))
  183. ;
  184. $profile['locale'] = $country[0];
  185. $profile['picture'] = 'https://graph.facebook.com/v2.5/'.$profile['id'].'/picture?type=large';
  186. return $profile;
  187. }
  188. /**
  189. * Handle mail/mdp login (SPEED)
  190. * return: users infos
  191. */
  192. public function loginMondialator($params){
  193. $em = $this->getDoctrine()->getManager();
  194. $possibleUser = $em->getRepository('MDMondialatorBundle:User')->findBy(array('email' => $params['email']));
  195. if(count($possibleUser) > 0){
  196. $profile['isKnowUser'] = true;
  197. if($params["password"] == $possibleUser[0]->getPassword()){
  198. $profile['knowUser'] = $possibleUser[0];
  199. return $profile;
  200. }else{
  201. return 0;
  202. }
  203. }
  204. }
  205. /**
  206. * Return user data from user id stocked in json web token
  207. * return: users infos
  208. */
  209. public function getUserAction(Request $request){
  210. if($request->getMethod() == 'GET'){
  211. $jwt = $request->headers->get('authorization');
  212. $decoded = $this->resolveToken($jwt);
  213. $repository = $this
  214. ->getDoctrine()
  215. ->getManager()
  216. ->getRepository('MDMondialatorBundle:User')
  217. ;
  218. $u = $repository->find($decoded->sub);
  219. $follow = $u->getFollowersId();
  220. $following = $u->getFollowingId();
  221. $user = $repository->findUserById($decoded->sub)->getArrayResult();
  222. $user[0]['follow'] = $follow;
  223. $user[0]['following'] = $following;
  224. return new JsonResponse(
  225. array(
  226. 'user' => $user,
  227. 'status' => Response::HTTP_OK
  228. )
  229. );
  230. }
  231. return new JsonResponse(array('status' => Response::HTTP_BAD_REQUEST));
  232. }
  233. public function editAction($id){
  234. //Récupération de l'user à éditer
  235. $repository = $this
  236. ->getDoctrine()
  237. ->getManager()
  238. ->getRepository('MDMondialatorBundle:User')
  239. ;
  240. $user = $repository->find($id);
  241. $em= $this->getDoctrine()->getManager();
  242. $em->flush();
  243. return new Response("OK");
  244. }
  245. /**
  246. * Create a new follower
  247. */
  248. public function addfollowAction(Request $request){
  249. if($request->getMethod() == "POST"){
  250. $jwt = $request->headers->get('authorization');
  251. $decoded = $this->resolveToken($jwt);
  252. $userid = $decoded->sub;
  253. $followid = $request->request->get('followid');
  254. if($userid==$followid){
  255. return new JsonResponse(array("status" => Response::HTTP_BAD_REQUEST));
  256. }
  257. $repository = $this
  258. ->getDoctrine()
  259. ->getManager()
  260. ->getRepository('MDMondialatorBundle:User')
  261. ;
  262. $user = $repository->find($userid);
  263. $following = $repository->find($followid);
  264. //Regarder si ce follow débloque un achievement
  265. $this->checkAchievementFollowAction($following);
  266. $user->setFollowing($following);
  267. $em = $this->getDoctrine()->getManager();
  268. $em->persist($user);
  269. $em->flush();
  270. return new JsonResponse(array("status" => Response::HTTP_OK));
  271. }
  272. return new JsonResponse(array("status" => Response::HTTP_BAD_REQUEST));
  273. }
  274. /**
  275. * Delete a follower
  276. */
  277. public function removefollowAction(Request $request){
  278. if($request->getMethod() == "POST"){
  279. $jwt = $request->headers->get('authorization');
  280. $decoded = $this->resolveToken($jwt);
  281. $userid = $decoded->sub;
  282. $followid = $request->request->get('followid');
  283. if($userid==$followid){
  284. return new JsonResponse(array("status" => Response::HTTP_BAD_REQUEST));
  285. }
  286. $repository = $this
  287. ->getDoctrine()
  288. ->getManager()
  289. ->getRepository('MDMondialatorBundle:User')
  290. ;
  291. $user = $repository->find($userid);
  292. $following = $repository->find($followid);
  293. $user->removeFollowing($following);
  294. $em = $this->getDoctrine()->getManager();
  295. $em->persist($user);
  296. $em->flush();
  297. return new JsonResponse(array("status" => Response::HTTP_OK));
  298. }
  299. return new JsonResponse(array("status" => Response::HTTP_BAD_REQUEST));
  300. }
  301. /**
  302. * Return user's followers based on ids
  303. */
  304. public function getFollowerData(Request $request){
  305. }
  306. /**
  307. * Return users that are following an user based on ids
  308. */
  309. public function getFollowingData(Request $request){
  310. }
  311. /**
  312. * Return the user score
  313. */
  314. public function getScoreAction(Request $request){
  315. if($request->getMethod() == "GET"){
  316. $jwt = $request->headers->get('authorization');
  317. $decoded = $this->resolveToken($jwt);
  318. $userid = $decoded->sub;
  319. $em = $this->getDoctrine()->getManager();
  320. $repository = $em->getRepository('MDMondialatorBundle:User');
  321. $u = $repository->find($userid);
  322. return new JsonResponse(array(
  323. 'status' => Response::HTTP_OK,
  324. 'score' => $u->getScore()
  325. )
  326. );
  327. }
  328. return new JsonResponse(array("status" => Response::HTTP_BAD_REQUEST));
  329. }
  330. /**
  331. * Return the user followers
  332. */
  333. public function getFollowersAction(Request $request){
  334. if($request->getMethod() == "GET"){
  335. $jwt = $request->headers->get('authorization');
  336. $decoded = $this->resolveToken($jwt);
  337. $userid = $decoded->sub;
  338. $em = $this->getDoctrine()->getManager();
  339. $repository = $em->getRepository('MDMondialatorBundle:User');
  340. $u = $repository->find($userid);
  341. return new JsonResponse(array(
  342. 'status' => Response::HTTP_OK,
  343. 'follows' => $u->getFollowersId()
  344. )
  345. );
  346. }
  347. return new JsonResponse(array("status" => Response::HTTP_BAD_REQUEST));
  348. }
  349. /**
  350. * Return the user achievements
  351. */
  352. public function getAchievementsAction(Request $request){
  353. if($request->getMethod() == "GET"){
  354. $jwt = $request->headers->get('authorization');
  355. $decoded = $this->resolveToken($jwt);
  356. $userid = $decoded->sub;
  357. $em = $this->getDoctrine()->getManager();
  358. $repository = $em->getRepository('MDMondialatorBundle:User');
  359. $u = $repository->find($userid);
  360. $achievements = $u->getAchievement();
  361. $repository = $em->getRepository('MDMondialatorBundle:Achievement');
  362. $achievement = $repository->findbyId($achievements[count($achievements) - 1]->getId())->getArrayResult();
  363. return new JsonResponse(array(
  364. 'status' => Response::HTTP_OK,
  365. 'achievements' => $achievement
  366. )
  367. );
  368. }
  369. return new JsonResponse(array("status" => Response::HTTP_BAD_REQUEST));
  370. }
  371. /**
  372. * Generate JSON Web Token.
  373. */
  374. protected function createToken($user){
  375. $payload = [
  376. 'sub' => $user->getId(),
  377. 'iat' => time(),
  378. 'exp' => time() + (2 * 7 * 24 * 60 * 60)
  379. ];
  380. return JWT::encode($payload, $this->getParameter('secret'));
  381. }
  382. /**
  383. *
  384. */
  385. protected function resolveToken($jwt){
  386. if (strpos($jwt, 'Bearer') !== false) {
  387. $jwt = explode("Bearer ", $jwt)[1];
  388. }
  389. $decoded = JWT::decode($jwt, $this->getParameter('secret'),array('HS256'));
  390. return $decoded;
  391. }
  392. public function checkAchievementFollowAction($user){
  393. $repository = $this
  394. ->getDoctrine()
  395. ->getManager()
  396. ->getRepository('MDMondialatorBundle:AchievementType')
  397. ;
  398. $achievementsTypeFollow = $repository->findOneByName('Follow');
  399. $repository = $this
  400. ->getDoctrine()
  401. ->getManager()
  402. ->getRepository('MDMondialatorBundle:Achievement')
  403. ;
  404. $achievementsFollow = $repository->findByType($achievementsTypeFollow);
  405. $repository = $this
  406. ->getDoctrine()
  407. ->getManager()
  408. ->getRepository('MDMondialatorBundle:User')
  409. ;
  410. $followingBdd = $repository->findOneById($user->getId());
  411. $userNbFollow =(int) count((array)$followingBdd->getFollowers());
  412. $userAchievements = $user->getAchievement();
  413. $userAchArray[]= array();
  414. foreach ($userAchievements as $achievement) {
  415. $userAchArray[] = $achievement;
  416. }
  417. foreach ($achievementsFollow as $achievement) {
  418. if((int)$achievement->getRank()<=$userNbFollow && !(in_array($achievement, $userAchArray))){
  419. $user->setAchievement($achievement);
  420. }
  421. }
  422. $em = $this->getDoctrine()->getManager();
  423. $em->persist($user);
  424. $em->flush();
  425. return new JsonResponse(
  426. array(
  427. 'status' => Response::HTTP_OK,
  428. )
  429. );
  430. }
  431. }