vendor/uvdesk/api-bundle/API/Customers.php line 23

Open in your IDE?
  1. <?php
  2. namespace Webkul\UVDesk\ApiBundle\API;
  3. use Doctrine\ORM\EntityManagerInterface;
  4. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  5. use Symfony\Component\DependencyInjection\ContainerInterface;
  6. use Symfony\Component\HttpFoundation\Request;
  7. use Symfony\Component\HttpFoundation\Response;
  8. use Symfony\Component\HttpFoundation\JsonResponse;
  9. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  10. use Webkul\UVDesk\CoreFrameworkBundle\Entity\User;
  11. use Webkul\UVDesk\CoreFrameworkBundle\Entity\SupportRole;
  12. use Webkul\UVDesk\CoreFrameworkBundle\Entity\UserInstance;
  13. use Webkul\UVDesk\CoreFrameworkBundle\Services\UserService;
  14. use Webkul\UVDesk\CoreFrameworkBundle\FileSystem\FileSystem;
  15. use Webkul\UVDesk\CoreFrameworkBundle\Workflow\Events as CoreWorkflowEvents;
  16. use Symfony\Component\EventDispatcher\EventDispatcherInterface;
  17. use Symfony\Component\Filesystem\Filesystem as Fileservice;
  18. class Customers extends AbstractController
  19. {
  20. public function loadCustomers(Request $request, EntityManagerInterface $entityManager)
  21. {
  22. $qb = $entityManager->createQueryBuilder();
  23. $qb
  24. ->select("
  25. u.id,
  26. u.email,
  27. u.firstName,
  28. u.lastName,
  29. u.isEnabled,
  30. userInstance.isActive,
  31. userInstance.isVerified,
  32. userInstance.designation,
  33. userInstance.contactNumber
  34. ")
  35. ->from(User::class, 'u')
  36. ->leftJoin('u.userInstance', 'userInstance')
  37. ->where('userInstance.supportRole = :roles')
  38. ->setParameter('roles', 4)
  39. ;
  40. $collection = $qb->getQuery()->getResult();
  41. return new JsonResponse([
  42. 'success' => true,
  43. 'collection' => $collection,
  44. ]);
  45. }
  46. public function loadCustomerDetails($id, Request $request)
  47. {
  48. $user = $this->getDoctrine()->getRepository(User::class)->findOneById($id);
  49. if (empty($user)) {
  50. return new JsonResponse([
  51. 'success' => false,
  52. 'message' => "No customer account details were found with id '$id'.",
  53. ], 404);
  54. }
  55. $customerDetails = [
  56. 'id' => $user->getId(),
  57. 'firstName' => $user->getFirstName(),
  58. 'lastName' => $user->getLastName(),
  59. 'userEmail' => $user->getUsername(),
  60. 'isEnabled' => $user->getIsEnabled(),
  61. 'isActive' => $user->getCustomerInstance()->getIsActive(),
  62. 'isVerified' => $user->getCustomerInstance()->getIsVerified(),
  63. 'contactNumber' => $user->getCustomerInstance()->getContactNumber()
  64. ];
  65. return new JsonResponse([
  66. 'success' => true,
  67. 'customer' => $customerDetails
  68. ]);
  69. }
  70. public function createCustomerRecord(Request $request, ContainerInterface $container, EntityManagerInterface $entityManager, UserService $userService)
  71. {
  72. $params = $request->request->all()? : json_decode($request->getContent(),true);
  73. foreach($params as $key => $value) {
  74. if (!in_array($key, ['email', 'user_form', 'firstName', 'lastName','contactNumber','isActive'])) {
  75. unset($params[$key]);
  76. }
  77. }
  78. if (empty($params['email']) || empty($params['firstName'])) {
  79. $json['error'] = $container->get('translator')->trans('required fields: email and firstName.');
  80. return new JsonResponse($json, Response::HTTP_BAD_REQUEST);
  81. }
  82. $user = $entityManager->getRepository(User::class)->findOneBy(array('email' => $params['email']));
  83. $customerInstance = !empty($user) ? $user->getCustomerInstance() : null;
  84. $uploadedFiles = $request->files->get('user_form');
  85. // Profile upload validation
  86. $validMimeType = ['image/jpeg', 'image/png', 'image/jpg'];
  87. if (isset( $uploadedFiles)) {
  88. if (!in_array($uploadedFiles->getMimeType(), $validMimeType)) {
  89. return new JsonResponse([
  90. 'success' => false,
  91. 'message' => 'Profile image is not valid, please upload a valid format.',
  92. ], 404);
  93. }
  94. }
  95. if (!empty($customerInstance)) {
  96. return new JsonResponse([
  97. 'success' => false,
  98. 'message' => 'User with same email already exist.',
  99. ], 404);
  100. }
  101. $fullname = trim(implode(' ', [$params['firstName'], $params['lastName']]));
  102. $supportRole = $entityManager->getRepository(SupportRole::class)->findOneByCode('ROLE_CUSTOMER');
  103. $user = $userService->createUserInstance($params['email'], $fullname, $supportRole, [
  104. 'contact' => $params['contactNumber'],
  105. 'source' => 'website',
  106. 'active' => !empty($params['isActive']) ? true : false,
  107. 'image' => $uploadedFiles,
  108. ]);
  109. if (!empty($user)) {
  110. $user->setIsEnabled(true);
  111. $entityManager->persist($user);
  112. $entityManager->flush();
  113. }
  114. return new JsonResponse([
  115. 'success' => true,
  116. 'message' => 'Customer saved successfully.',
  117. ]);
  118. }
  119. public function updateCustomerRecord($id, Request $request, FileSystem $fileSystem, ContainerInterface $container, EventDispatcherInterface $eventDispatcher, UserPasswordEncoderInterface $passwordEncoder)
  120. {
  121. $params = $request->request->all()? : json_decode($request->getContent(),true);
  122. foreach ($params as $key => $value) {
  123. if (!in_array($key, ['email', 'user_form', 'firstName', 'lastName','contactNumber','isActive'])) {
  124. unset($params[$key]);
  125. }
  126. }
  127. if (empty($params['email']) || empty($params['firstName'])) {
  128. $json['error'] = $container->get('translator')->trans('required fields: email and firstName.');
  129. return new JsonResponse($json, Response::HTTP_BAD_REQUEST);
  130. }
  131. $dataFiles = $request->files->get('user_form');
  132. $em = $this->getDoctrine()->getManager();
  133. $repository = $em->getRepository(User::class);
  134. if ($id) {
  135. $user = $repository->findOneBy(['id' => $id]);
  136. if (!$user) {
  137. $id = $id;
  138. return new JsonResponse([
  139. 'success' => false,
  140. 'message' => "User not found with this id '$id' ."
  141. ], 404);
  142. }
  143. }
  144. // Customer Profile upload validation
  145. $validMimeType = ['image/jpeg', 'image/png', 'image/jpg'];
  146. if (isset($dataFiles)) {
  147. if (!in_array($dataFiles->getMimeType(), $validMimeType)) {
  148. return new JsonResponse([
  149. 'success' => false,
  150. 'message' => 'Profile image is not valid, please upload a valid format',
  151. ],404);
  152. }
  153. }
  154. if ($id) {
  155. $checkUser = $em->getRepository(User::class)->findOneBy(array('email' => $params['email']));
  156. $errorFlag = 0;
  157. if ($checkUser) {
  158. if($checkUser->getId() != $id)
  159. $errorFlag = 1;
  160. }
  161. if (!$errorFlag && 'hello@uvdesk.com' !== $user->getEmail()) {
  162. if (
  163. isset($params['password']['first'])
  164. && !empty(trim($params['password']['first']))
  165. && isset($params['password']['second'])
  166. && !empty(trim($params['password']['second']))
  167. ) {
  168. if (trim($params['password']['first']) == trim($params['password']['second'])){
  169. $encodedPassword = $passwordEncoder->encodePassword($user, $params['password']['first']);
  170. $user->setPassword($encodedPassword);
  171. } else {
  172. return new JsonResponse([
  173. 'success' => false,
  174. 'message' => 'Both password does not match together.',
  175. ], 404);
  176. }
  177. }
  178. $email = $user->getEmail();
  179. $user->setFirstName($params['firstName']);
  180. $user->setLastName($params['lastName']);
  181. $user->setEmail($email);
  182. $user->setIsEnabled(true);
  183. $em->persist($user);
  184. // User Instance
  185. $userInstance = $em->getRepository(UserInstance::class)->findOneBy(array('user' => $user->getId(), 'supportRole' => 4));
  186. $userInstance->setUser($user);
  187. $userInstance->setIsActive(isset($params['isActive']) ? $params['isActive'] : 0);
  188. $userInstance->setIsVerified(0);
  189. if (isset($params['contactNumber'])) {
  190. $userInstance->setContactNumber($params['contactNumber']);
  191. }
  192. if (isset($dataFiles)) {
  193. // Removed profile image from database and path
  194. $fileService = new Fileservice;
  195. if ($userInstance->getProfileImagePath()) {
  196. $fileService->remove($this->getParameter('kernel.project_dir').'/public'.$userInstance->getProfileImagePath());
  197. }
  198. $assetDetails = $fileSystem->getUploadManager()->uploadFile($dataFiles, 'profile');
  199. $userInstance->setProfileImagePath($assetDetails['path']);
  200. } else {
  201. $userInstance->setProfileImagePath(null);
  202. }
  203. $em->persist($userInstance);
  204. $em->flush();
  205. $user->addUserInstance($userInstance);
  206. $em->persist($user);
  207. $em->flush();
  208. // Trigger customer created event
  209. $event = new CoreWorkflowEvents\Customer\Update();
  210. $event
  211. ->setUser($user)
  212. ;
  213. $eventDispatcher->dispatch($event, 'uvdesk.automation.workflow.execute');
  214. return new JsonResponse([
  215. 'success' => true,
  216. 'message' => 'Customer updated successfully.',
  217. ]);
  218. }
  219. }
  220. return new JsonResponse([
  221. 'success' => false,
  222. 'message' => "Invalid credentials provided."
  223. ], 404);
  224. }
  225. public function deleteCustomerRecord(Request $request, $customerId, UserService $userService, EventDispatcherInterface $eventDispatcher)
  226. {
  227. $em = $this->getDoctrine()->getManager();
  228. $user = $em->getRepository(User::class)->findOneBy(['id' => $customerId]);
  229. if (empty($user)) {
  230. return new JsonResponse([
  231. 'success' => false,
  232. 'message' => "Customer not found with this id '$customerId'."
  233. ],404);
  234. }
  235. $userInstance = $em->getRepository(UserInstance::class)->findOneBy(array('user' => $user->getId(), 'supportRole' => 4));
  236. if (empty($userInstance)) {
  237. return new JsonResponse([
  238. 'success' => false,
  239. 'message' => "Authorization failed."
  240. ], 404);
  241. }
  242. $userService->removeCustomer($user);
  243. // Trigger customer created event
  244. $event = new CoreWorkflowEvents\Customer\Delete();
  245. $event
  246. ->setUser($user)
  247. ;
  248. $eventDispatcher->dispatch($event, 'uvdesk.automation.workflow.execute');
  249. return new JsonResponse([
  250. 'success' => true,
  251. 'message' => "Customer removed successfully."
  252. ]);
  253. }
  254. }