UsersController.php 8.63 KB
<?php
/**
 *
 * @author Adhidarma <adhisimon@gmail.com>
 */

class UsersController extends Controller {
    protected function getModel() {
        $model = new UserModel($this->f3);
        return $model;
    }

    protected function getRoleModel() {
        $model = new RoleModel($this->f3);
        return $model;
    }

    protected function getUserRoleModel() {
        $model = new UserRoleModel($this->f3);
        return $model;
    }

    /**
     * Login action.
     */
    function formLogin($f3) {
        $f3->set('TEMPLATE_FILE', 'templates/bootstrap-signin.html');
    }

    function login($f3, $params) {
        $user = $this->getModel()->getByEmail($f3->get('POST.email'));

        if (empty($user) or empty($f3->get('POST.password'))) {
            $this->pushAlertToSession('Kesalahan pada alamat email atau password', 'alert-danger');
            $f3->reroute('/login');
        }

        if (!$user['enable']) {
            $this->pushAlertToSession('Anda tidak bisa login sebagai user yang non-aktif', 'alert-danger');
            $f3->reroute('/login');
        }

        if (!$this->isMatchPassword($f3->get('POST.password'), $user)) {
            $this->pushAlertToSession('Kesalahan pada alamat email atau password', 'alert-danger');
            $f3->reroute('/login');
        }

        $this->updateSession($user);
        $f3->reroute('/');
    }

    function logout($f3) {
        $f3->clear('SESSION.user_id');
        $f3->reroute('/login');
    }


    function home($f3, $params) {
        $f3->reroute("/users/index");
    }

    /**
     * Users list action.
     */
    function index($f3) {
        $this->needOneOfRoleTitles(array('operator', 'admin'));

        $mapper = $this->getModel()->getMapper();
        $items = $mapper->find();

        $f3->set('items', $items);
        $this->setPageTitle('List pengguna');
        $this->setViewFile('users/index.html');
    }

    /**
     * Create an user action.
     */
    function formAdd($f3) {
        $this->needOneOfRoleTitles(array('operator', 'admin'));

        $this->setPageTitle('Membuat user baru');
        $f3->set('VIEW_FILE', 'users/add.html');
    }

    /**
     * Do create user action
     */
    function add($f3) {
        $this->needOneOfRoleTitles(array('operator', 'admin'));

        $data = $f3->get('POST');
        if (empty($data['password']) || ($data['password'] !== $data['passwordConfirmation'])) {
            $this->pushAlertToSession("Passwords don't match!", "alert-danger");
            $f3->reroute('/users/add');
        }

        // check existance
        $user = $this->getModel()->getMapper();
        $user->load(array('email=?', trim($data['email'])));
        if (!$user->dry()) {
            $this->pushAlertToSession("Email address already used by another user.", "alert-danger");
            $f3->reroute('/users/add');
        }

        $user = $this->getModel()->getMapper();

        $user['email'] = trim($data['email']);
        $user['fullname'] = trim($data['fullname']);
        $user['phone'] = trim($data['phone']);
        $user['password'] = crypt($data['password']);
        $user['created'] = date('Y-m-d H:i:s');

        $user->save();

        $f3->reroute('/users/index');
    }

    /**
     * View user's detail
     */
    function view($f3, $params) {
        $this->needLogin();
        
    	if ($params['id'] != $f3->get('ACTIVE_VISITOR.id')) {
    		$this->needOneOfRoleTitles(array('admin', 'operator'));
    	}
        
        $item = $this->getModel()->getById($params['id']);
        if (!$item) {
            die("User's not found");
        }

        $user_role_model = new UserRoleModel();
        $item['role_ids'] = $user_role_model->getRoleIdsByUserId($params['id']);
        $f3->set('item', $item);

        $role_model = new RoleModel();
        $available_roles = $role_model->getMapper()->find();
        $f3->set('available_roles', $available_roles);

        $this->setViewFile('users/view.html');
        $this->setPageTitle(strtoupper($item['fullname']));
    }

    /**
     * Mengaktifkan seorang user.
     */
    function setToEnable($f3, $params) {
        $this->needOneOfRoleTitles(array('operator', 'admin'));

        $id = $params['id'];

        $item = $this->getModel()->getMapperItemByFieldValue('id', $id);
        if ($item->dry()) {
            die("User is not found");
        }

        $item['enable'] = 1;
        $item->save();

        $this->pushAlertToSession("Saved.", "alert-success");
        $f3->reroute("/users/view/$id");
    }

    /**
     * Mendeaktifasi seorang user.
     */
    function setToDisable($f3, $params) {
        $this->needOneOfRoleTitles(array('operator', 'admin'));

        $id = $params['id'];

        $item = $this->getModel()->getMapperItemByFieldValue('id', $id);
        if ($item->dry()) {
            die("User is not found");
        }

        $item['enable'] = 0;
        $item->save();

        $this->pushAlertToSession("Saved.", "alert-success");
        $f3->reroute("/users/view/$id");
    }

    /**
     * Menampilkan form edit user.
     */
    function formEdit($f3, $params) {
    	$this->needLogin();
    	
    	if ($params['id'] != $f3->get('ACTIVE_VISITOR.id')) {
    		$this->needOneOfRoleTitles(array('admin', 'operator'));
    	}
    	
        $id = $params['id'];
        $item = $this->getModel()->getById($id);

        if (!$item) {
            die("User is not found");
        }
        $f3->set('item', $item);

        $this->setPageTitle('Edit user');
        $this->setViewFile('users/form-edit.html');
    }

    /**
     * Menyimpan hasil edit user.
     */
    function edit($f3, $params) {
	    if ($params['id'] != $f3->get('ACTIVE_VISITOR.id')) {
    		$this->needOneOfRoleTitles(array('admin', 'operator'));
    	}
    	

        $id = $params['id'];
        $item = $this->getModel()->getMapperItemByFieldValue('id', $id);
        if ($item->dry()) {
            die("User is not found");
        }

        $item['email'] = trim($f3->get('POST.email'));
        $item['fullname'] = trim($f3->get('POST.fullname'));
        $item['phone'] = trim($f3->get('POST.phone'));

        $item['modified'] = date('Y-m-d H:i:s');

        $item->save();

        $this->pushAlertToSession("User editted.", "alert-success");
        $f3->reroute('/users/view/' . $id);
    }

    function formEditPassword($f3, $params) {
        $this->needLogin();
        
        if ($params['id'] != $f3->get('ACTIVE_VISITOR.id')) {
        	$this->needOneOfRoleTitles(array('admin', 'operator'));
        }
        
        if (empty($params['id'])) {
            $f3->reroute('/users/edit-password/' . $f3->get('ACTIVE_VISITOR.id'));
        }

        $user = $this->getModel()->getById($params['id']);

        $this->setPageTitle('Ubah password ' . $user['email']);
        $this->setViewFile('users/edit-password.html');
    }

    function editPassword($f3, $params) {
        $this->needLogin();
        
        if ($params['id'] != $f3->get('ACTIVE_VISITOR.id')) {
        	$this->needOneOfRoleTitles(array('admin', 'operator'));
        }

        $active_user = $f3->get('ACTIVE_VISITOR');

        $data = $f3->get('POST');

        if (!$this->isMatchPassword($data['password'], $f3->get('ACTIVE_VISITOR'))) {
            $this->pushAlertToSession('"Password anda saat ini" tidak sesuai', 'alert-danger');
            $f3->reroute('/users/edit-password/' . $params['id']);
        }

        if (!$f3->get('ACTIVE_VISITOR_IS_ADMIN') && ($f3->get('ACTIVE_VISITOR')['id'] != $params['id'])) {
            $this->pushAlertToSession('Anda tidak berhak mengubah password user yang diinginkan', 'alert-danger');
            $f3->reroute('/users/edit-password/' . $params['id']);
        }

        if ($data['newPassword'] != $data['newPasswordConfirmation']) {
            $this->pushAlertToSession('"Password baru" tidak sesuai', 'alert-danger');
            $f3->reroute('/users/edit-password/' . $params['id']);
        }

        if (empty($data['newPassword'])) {
            $this->pushAlertToSession('"Password baru" belum terisi', 'alert-danger');
            $f3->reroute('/users/edit-password/' . $params['id']);
        }

        $user = $this->getModel()->getMapperItemByFieldValue('id', $params['id']);
        if ($user->dry())  {
            $this->pushAlertToSession('User tidak terdefinisi', 'alert-danger');
            $f3->reroute('/users/edit-password/' . $params['id']);
        }

        $user['password'] = crypt($data['newPassword']);
        $user->save();

        $this->pushAlertToSession('Password telah diubah', 'alert-info');
        $f3->reroute('/users/view/' . $params['id']);
    }

    function isMatchPassword($plain, $user) {
        return (crypt($plain, $user['password']) == $user['password']);
    }
}