diff --git a/config/acl.yaml b/config/acl.yaml index 50b26ed4..b37e7580 100644 --- a/config/acl.yaml +++ b/config/acl.yaml @@ -19,6 +19,8 @@ access_keys: label: Delete - id: user.role.sadmin label: Super Admin Role + - id: user.profile + label: User Profile - id: role label: Role Access acls: diff --git a/config/routes/user.yaml b/config/routes/user.yaml index cd44b326..5b8dedbe 100644 --- a/config/routes/user.yaml +++ b/config/routes/user.yaml @@ -32,3 +32,12 @@ user_delete: controller: App\Controller\UserController::destroy methods: [DELETE] +user_profile: + path: /profile + controller: App\Controller\UserController::profileForm + methods: [GET] + +user_profile_submit: + path: /profile + controller: App\Controller\UserController::profileSubmit + methods: [POST] diff --git a/src/Controller/UserController.php b/src/Controller/UserController.php index 4defeaf5..2d53dbbb 100644 --- a/src/Controller/UserController.php +++ b/src/Controller/UserController.php @@ -93,7 +93,6 @@ class UserController extends BaseController $row['contact_num'] = $orow->getContactNumber(); $row['enabled'] = $orow->isEnabled(); - // add row metadata $row['meta'] = [ 'update_url' => '', @@ -145,10 +144,10 @@ class UserController extends BaseController // create new row $em = $this->getDoctrine()->getManager(); - $row = new User(); + $obj = new User(); // set and save values - $row->setUsername($req->request->get('username')) + $obj->setUsername($req->request->get('username')) ->setFirstName($req->request->get('first_name')) ->setLastName($req->request->get('last_name')) ->setEmail($req->request->get('email')) @@ -169,13 +168,13 @@ class UserController extends BaseController if ($role->isSuperAdmin() && !$this->isGranted('user.role.sadmin')) continue; - $row->addRole($role); + $obj->addRole($role); } } } // validate - $errors = $validator->validate($row); + $errors = $validator->validate($obj); // initialize error list $error_array = []; @@ -196,11 +195,11 @@ class UserController extends BaseController $error_array['confirm_password'] = 'Passwords do not match.'; } else { // encode password - $enc = $ef->getEncoder($row); - $encoded_password = $enc->encodePassword($req->request->get('password'), $row->getSalt()); + $enc = $ef->getEncoder($obj); + $encoded_password = $enc->encodePassword($req->request->get('password'), $obj->getSalt()); // set password - $row->setPassword($encoded_password); + $obj->setPassword($encoded_password); } // check if any errors were found @@ -212,7 +211,7 @@ class UserController extends BaseController ], 422); } else { // validated! save the entity - $em->persist($row); + $em->persist($obj); $em->flush(); // return successful response @@ -231,17 +230,16 @@ class UserController extends BaseController // get row data $em = $this->getDoctrine()->getManager(); - $row = $em->getRepository(User::class)->find($id); + $obj = $em->getRepository(User::class)->find($id); // make sure this row exists - if (empty($row)) + if (empty($obj)) throw $this->createNotFoundException('The item does not exist'); // get roles - $em = $this->getDoctrine()->getManager(); $params['roles'] = $em->getRepository(Role::class)->findAll(); - $params['obj'] = $row; + $params['obj'] = $obj; // response return $this->render('user/form.html.twig', $params); @@ -253,14 +251,14 @@ class UserController extends BaseController // get row data $em = $this->getDoctrine()->getManager(); - $row = $em->getRepository(User::class)->find($id); + $obj = $em->getRepository(User::class)->find($id); // make sure this row exists - if (empty($row)) + if (empty($obj)) throw $this->createNotFoundException('The item does not exist'); // set and save values - $row->setUsername($req->request->get('username')) + $obj->setUsername($req->request->get('username')) ->setFirstName($req->request->get('first_name')) ->setLastName($req->request->get('last_name')) ->setEmail($req->request->get('email')) @@ -277,12 +275,12 @@ class UserController extends BaseController $role = $em->getRepository(Role::class)->find($role_id); if (!empty($role)) - $row->addRole($role); + $obj->addRole($role); } } // validate - $errors = $validator->validate($row); + $errors = $validator->validate($obj); // initialize error list $error_array = []; @@ -302,11 +300,11 @@ class UserController extends BaseController $error_array['confirm_password'] = 'Passwords do not match.'; } else { // encode password - $enc = $ef->getEncoder($row); - $encoded_password = $enc->encodePassword($req->request->get('password'), $row->getSalt()); + $enc = $ef->getEncoder($obj); + $encoded_password = $enc->encodePassword($req->request->get('password'), $obj->getSalt()); // set password - $row->setPassword($encoded_password); + $obj->setPassword($encoded_password); } } @@ -336,13 +334,13 @@ class UserController extends BaseController // get row data $em = $this->getDoctrine()->getManager(); - $row = $em->getRepository(User::class)->find($id); + $obj = $em->getRepository(User::class)->find($id); - if (empty($row)) + if (empty($obj)) throw $this->createNotFoundException('The item does not exist'); // delete this row - $em->remove($row); + $em->remove($obj); $em->flush(); // response @@ -362,4 +360,90 @@ class UserController extends BaseController ->setParameter('filter', '%' . $datatable['query']['data-rows-search'] . '%'); } } + + public function profileForm() + { + $this->denyAccessUnlessGranted('user.profile', null, 'No access.'); + + $params = $this->initParameters('user_profile'); + $params['mode'] = 'profile'; + + // get row data + $em = $this->getDoctrine()->getManager(); + $obj = $this->getUser(); + + // make sure this row exists + if (empty($obj)) + throw $this->createNotFoundException('The item does not exist'); + + $params['obj'] = $obj; + + // response + return $this->render('user/form.html.twig', $params); + } + + public function profileSubmit(Request $req, EncoderFactoryInterface $ef, ValidatorInterface $validator) + { + $this->denyAccessUnlessGranted('user.profile', null, 'No access.'); + + // get row data + $em = $this->getDoctrine()->getManager(); + $obj = $this->getUser(); + + // make sure this row exists + if (empty($obj)) + throw $this->createNotFoundException('The item does not exist'); + + // set and save values + $obj->setFirstName($req->request->get('first_name')) + ->setLastName($req->request->get('last_name')) + ->setEmail($req->request->get('email')) + ->setContactNumber($req->request->get('contact_no')); + + // validate + $errors = $validator->validate($obj); + + // initialize error list + $error_array = []; + + // add errors to list + foreach ($errors as $error) { + $error_array[$error->getPropertyPath()] = $error->getMessage(); + } + + // get password inputs + $password = $req->request->get('password'); + $confirm_password = $req->request->get('confirm_password'); + + // custom validation for password fields + if ($password || $confirm_password) { + if ($password != $confirm_password) { + $error_array['confirm_password'] = 'Passwords do not match.'; + } else { + // encode password + $enc = $ef->getEncoder($obj); + $encoded_password = $enc->encodePassword($req->request->get('password'), $obj->getSalt()); + + // set password + $obj->setPassword($encoded_password); + } + } + + // check if any errors were found + if (!empty($error_array)) { + // return validation failure response + return $this->json([ + 'success' => false, + 'errors' => $error_array + ], 422); + } else { + // validated! save the entity + $em->flush(); + + // return successful response + return $this->json([ + 'success' => 'Changes have been saved!' + ]); + } + } } diff --git a/templates/base.html.twig b/templates/base.html.twig index 9441df15..410b42fc 100644 --- a/templates/base.html.twig +++ b/templates/base.html.twig @@ -599,7 +599,7 @@