<?php
namespace Khansia\Access;
use Khansia\Generic\Result;
use Khansia\Generic\Objects\Map;
/* extends dari mapper agar bisa mapping properti class ke tabel */
class User extends \Khansia\Generic\Objects\Mapper {
const STATUS_ACTIVE = 10;
const STATUS_NOTACTIVE = 20;
const STATUS_BLOCKED = 30;
const CODE_AUTH_INVALID = 31;
const CODE_AUTH_SUSPEND = 32;
const CODE_AUTH_LOCKED = 33;
const CODE_AUTH_FAILED = 34;
const RETRIES_TRUE = TRUE;
const RETRIES_FALSE = FALSE;
protected $_storage;
protected $_config;
protected $_loaded = false;
public function __construct(User\Storage\Skeleton $storage) {
/* simpan user storage */
$this->_storage = $storage;
/* load config */
//$this->_config = $this->_storage->fetchConfig('USER');
/*
map properti class ke tabel
sehingga nama field di tabel dapat diwakili oleh property class
*/
parent::__construct(
array(),
array(
new Map('iduser','id'),
new Map('username'),
new Map('password'),
new Map('name'),
new Map('role'),
new Map('status'),
new Map('deviceid'),
new Map('token'),
new Map('create_dtm'),
new Map('retries'),
),
parent::CASE_INSENSITIVE
);
}
/**
save
*/
public function save($update = false) {
/* simpan via storage */
$result = $this->_storage->save($this, $update);
if ($result->code == 0) {
$this->id = $result->data;
}
return $result;
}
public function load($id, $mode = User\Storage::LOADBY_ID){
/* load dari storage */
if ($data = $this->_storage->load($id, $mode)) {
/* load sukses, set data properti class dari hasil query */
$this->push($data);
/* set loaded */
$this->_loaded = true;
return true;
} else {
$this->_loaded = false;
}
}
public function loadAccess($id){
/* load access data */
$acc = $this->_storage->getAccess($id);
return $acc;
}
public function authenticate($credential, $data = array(), $retriesMode = self::RETRIES_FALSE){
$result = new Result();
$retries = 0;
/* loaded */
if ($this->id && $this->_loaded) {
/* jika user aktif */
if (($this->status == self::STATUS_ACTIVE)) {
if($this->password == md5($credential)){
$authenticated = true;
}else{
$authenticated = false;
}
if ($authenticated) {
$this->retries = 'NULL';
$this->save(true);
/* QA: auth success */
$result->code = $result::CODE_SUCCESS;
$result->info = 'user_auth_success';
}else{
/* cek user jika gagal password sebanyak 3x */
if($retriesMode == self::RETRIES_TRUE){
if($this->retries == 'NULL'){
$ret_data = 0;
}else{
$ret_data = (int) $this->retries;
}
if($ret_data < 3){
$this->retries = $ret_data + 1;
}
if((int) $this->retries == 3){ // jika sudah mencapai 3x then
$this->status = self::STATUS_BLOCKED;
}
$this->save(true);
}
/* QA: fail invalid passwd */
$result->code = self::CODE_AUTH_FAILED;
$result->info = 'user_auth_failed';
}
}else{
/* QA: user is locked */
$result->code = self::CODE_AUTH_LOCKED;
$result->info = 'user_auth_locked';
}
}else{
/* QA: user not loaded */
$result->code = self::CODE_AUTH_INVALID;
$result->info = 'user_auth_invalid';
}
/* return result */
return $result;
}
}