Skip to content

Instantly share code, notes, and snippets.

@roy-bukapeta
Last active January 11, 2016 16:58
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save roy-bukapeta/cf77590e382a0b0afe87 to your computer and use it in GitHub Desktop.
Save roy-bukapeta/cf77590e382a0b0afe87 to your computer and use it in GitHub Desktop.
API IUWASH for Mobile App
<?php
namespace app\controllers;
use Yii;
use yii\web\UploadedFile;
use app\models\Formulir;
use dektrium\user\Finder;
use dektrium\user\models\LoginForm;
class ApiController extends \yii\web\Controller
{
public function beforeAction($action)
{
Yii::$app->controller->enableCsrfValidation = false;
return parent::beforeAction($action);
}
public function actionIndex()
{
return $this->render('index');
}
/***
* Function Tanggal
* Untuk generate tanggal sekarang
***/
public function Tanggal()
{
date_default_timezone_set('Asia/Jakarta');
return str_replace(['.'], [''], microtime(true));
}
/***
* API Login
* Merupakan authentication pada mobile app
*
* Method :
* POST
*
* Parameters :
* username (STRING)
* password (STRING)
* base_url (STRING)
*
* Return (JSON) :
* user_id (INTEGER)
* username (STRING)
* authenticated (BOOLEAN) - ( TRUE = 'login success' OR FALSE = 'login failed' )
* base_url (STRING)
***/
public function actionLogin()
{
if (Yii::$app->request->post()) {
$finder = Yii::createObject(Finder::className());
$model = Yii::createObject(LoginForm::className());
$model->login = $_POST['username'];
$model->password = $_POST['password'];
if($model->validate()) {
return json_encode(['Message' => ['user_id'=>$finder->findUserByUsername($_POST['username'])->id, 'username'=> $_POST['username'], 'authenticated'=> TRUE, 'baseurl'=> 'http://iuwash.local-server.link'], 'Status' => 'Success']);
}else{
return json_encode(['Message' => ['username'=> $_POST['username'], 'authenticated'=> FALSE, 'baseurl'=> 'http://iuwash.local-server.link'], 'Status' => 'Success']);
}
}else{
return json_encode(['Message' => 'Method must be POST', 'Status' => 'Failed']);
}
}
/***
* API Create
* Merupakan insert data dari mobile app ke Tabel Formulir
*
* Method :
* POST
*
* Parameters :
* responden_nama (STRING)
* responden_nama_jalan (STRING)
* responden_no_rumah (STRING)
* responden_rt (STRING)
* responden_rw (STRING)
* responden_kelurahan (STRING)
* responden_kecamatan (STRING)
* responden_kabupaten (STRING)
* responden_propinsi (STRING)
* responden_kode_pos (STRING)
* responden_id_pelanggan (STRING)
* responden_id_pelanggan_pdam (STRING)
* responden_kepimilikan (STRING)
* responden_sumber_air_bersih (STRING)
* responden_jarak_dari_septiktank (STRING)
* responden_tipe_bangunan (STRING)
* responden_daerah_banjir (STRING)
* responden_daya_pln (STRING)
* responden_rekening_pdam_atau_air_bulan_terakhir (STRING)
* responden_jumlah_penghuni (STRING)
* responden_foto_rumah (JSON)
* sanitasi_jenis_jamban (STRING)
* sanitasi_punya_septiktank (STRING)
* ltt_akses (STRING)
* ltt_lokasi_septiktank (STRING)
* ltt_jarak_septiktank_dari_jalan (STRING)
* ltt_lebar_jalan (STRING)
* sanitasi_sumber_air_limbah (STRING)
* sanitasi_bahan_atau_material (STRING)
* sanitasi_jumlah_septiktank (STRING)
* sanitasi_dibangun_pada (STRING)
* sanitasi_ukuran_septiktank (STRING)
* sanitasi_penyaluran_buangan_septiktank (STRING)
* sanitasi_sedot_tinja (STRING)
* sanitasi_sedot_tinja_ya_waktunya (STRING)
* sanitasi_sedot_tinja_ya_biaya_sedot (STRING)
* sanitasi_sedot_tinja_ya_mekanisme_pembayaran (STRING)
* sanitasi_sedot_tinja_tidak_minat_memiliki_st (STRING)
* media_informasi_yang_paling_disukai (STRING)
* foto (JSON)
* coordinate_latitude (FLOAT)
* coordinate_longitude (FLOAT)
* id_user (INTEGER)
*
* Return (JSON) :
* Message (ARRAY)
* Create (STRING) - ( Created | Failed )
* Status (STRING) - ( Success | Failed )
***/
public function actionCreate()
{
if (Yii::$app->request->post()) {
$model = New Formulir();
/* Untuk mengakomodir upload gambar (responden_foto_rumah & foto) */
$date_time_rfr = $this->tanggal();
$date_time_foto = $this->tanggal();
if ($_FILES) {
if ($_FILES['responden_foto_rumah']) {
/* create folder @app/web/uploads/foto/$this->tanggal() */
$create_folder = exec('mkdir ' .Yii::getAlias('@webroot') . '/uploads/foto/' . $date_time_rfr);
/* save .jpg to path @app/web/uploads/foto/$this->tanggal()/filename.jpg */
move_uploaded_file($_FILES['responden_foto_rumah']['tmp_name'], Yii::getAlias('@webroot') . '/uploads/foto/' . $date_time_rfr . '/' . $_FILES['responden_foto_rumah']['name']);
/* Intervensi path gambar ke Field responden_foto_rumah */
$_POST['responden_foto_rumah'] = $date_time_rfr . '/' . $_FILES['responden_foto_rumah']['name'];
}
if ($_FILES['foto']) {
/* create folder @app/web/uploads/foto/$this->tanggal() */
$create_folder = exec('mkdir ' .Yii::getAlias('@webroot') . '/uploads/foto/' . $date_time_foto);
/* save .jpg to path @app/web/uploads/foto/$this->tanggal()/filename.jpg */
move_uploaded_file($_FILES['foto']['tmp_name'], Yii::getAlias('@webroot') . '/uploads/foto/' . $date_time_foto . '/' . $_FILES['foto']['name']);
/* Intervensi path gambar ke Field foto */
$_POST['foto'] = $date_time_foto . '/' . $_FILES['foto']['name'];
}
}
/***
* Convert WKT to Geometry
* From coordinate_latitude and coordinate_longitude To Geomentry
**/
$wkt = Yii::$app->db->createCommand("SELECT ST_GeomFromText('POINT(".$_POST['coordinate_latitude']." ".$_POST['coordinate_longitude'].")', 4326) AS geomentry")->queryAll();
$the_geom = $wkt[0]['geomentry'];
/* Intervensi dari hasil convert (geometry) ke Field Point */
$_POST['point'] = $the_geom;
/* Merge kiriman POST dengan nama model */
$data['Formulir'] = $_POST;
if($model->load($data) && $model->save()) {
return json_encode(['Message' => ['create'=> 'Created'], 'Status' => 'Success']);
}else{
return json_encode(['Message' => ['create'=> 'Failed'], 'Status' => 'Success']);
}
}else{
return json_encode(['Message' => 'Method must be POST', 'Status' => 'Failed']);
}
}
/***
* API READ
* Merupakan Membaca data Formulir berdasarkan id (Primary Key) dari mobile app
*
* Method :
* GET
*
* Parameters :
* id (INTEGER)
*
* Return (JSON) :
* Message (ARRAY)
* responden_nama (STRING)
* responden_nama_jalan (STRING)
* responden_no_rumah (STRING)
* responden_rt (STRING)
* responden_rw (STRING)
* responden_kelurahan (STRING)
* responden_kecamatan (STRING)
* responden_kabupaten (STRING)
* responden_propinsi (STRING)
* responden_kode_pos (STRING)
* responden_id_pelanggan (STRING)
* responden_id_pelanggan_pdam (STRING)
* responden_kepimilikan (STRING)
* responden_sumber_air_bersih (STRING)
* responden_jarak_dari_septiktank (STRING)
* responden_tipe_bangunan (STRING)
* responden_daerah_banjir (STRING)
* responden_daya_pln (STRING)
* responden_rekening_pdam_atau_air_bulan_terakhir (STRING)
* responden_jumlah_penghuni (STRING)
* responden_foto_rumah (JSON)
* sanitasi_jenis_jamban (STRING)
* sanitasi_punya_septiktank (STRING)
* ltt_akses (STRING)
* ltt_lokasi_septiktank (STRING)
* ltt_jarak_septiktank_dari_jalan (STRING)
* ltt_lebar_jalan (STRING)
* sanitasi_sumber_air_limbah (STRING)
* sanitasi_bahan_atau_material (STRING)
* sanitasi_jumlah_septiktank (STRING)
* sanitasi_dibangun_pada (STRING)
* sanitasi_ukuran_septiktank (STRING)
* sanitasi_penyaluran_buangan_septiktank (STRING)
* sanitasi_sedot_tinja (STRING)
* sanitasi_sedot_tinja_ya_waktunya (STRING)
* sanitasi_sedot_tinja_ya_biaya_sedot (STRING)
* sanitasi_sedot_tinja_ya_mekanisme_pembayaran (STRING)
* sanitasi_sedot_tinja_tidak_minat_memiliki_st (STRING)
* media_informasi_yang_paling_disukai (STRING)
* foto (JSON)
* coordinate_latitude (FLOAT)
* coordinate_longitude (FLOAT)
* Status (STRING) - ( Success | Failed )
***/
public function actionRead($id)
{
if (Yii::$app->request->get()) {
$model = Formulir::find()->select('id, responden_nama, responden_nama_jalan, responden_no_rumah, responden_rt, responden_rw, responden_kelurahan, responden_kecamatan, responden_kabupaten, responden_propinsi, responden_kode_pos, responden_id_pelanggan, responden_id_pelanggan_pdam, responden_kepimilikan, responden_sumber_air_bersih, responden_jarak_dari_septiktank, responden_tipe_bangunan, responden_daerah_banjir, responden_daya_pln, responden_rekening_pdam_atau_air_bulan_terakhir, responden_jumlah_penghuni, responden_foto_rumah, sanitasi_jenis_jamban, sanitasi_punya_septiktank, ltt_akses, ltt_lokasi_septiktank, ltt_jarak_septiktank_dari_jalan, ltt_lebar_jalan, sanitasi_sumber_air_limbah, sanitasi_bahan_atau_material, sanitasi_jumlah_septiktank, sanitasi_dibangun_pada, sanitasi_ukuran_septiktank, sanitasi_penyaluran_buangan_septiktank, sanitasi_sedot_tinja, sanitasi_sedot_tinja_ya_waktunya, sanitasi_sedot_tinja_ya_biaya_sedot, sanitasi_sedot_tinja_ya_mekanisme_pembayaran, sanitasi_sedot_tinja_tidak_minat_memiliki_st, media_informasi_yang_paling_disukai, foto, coordinate_latitude, coordinate_longitude')->where(['id'=>$_GET['id']])->AsArray()->OrderBy('id')->one();
if($model) {
return json_encode(['Message' => $model, 'Status' => 'Success']);
}else{
return json_encode(['Message' => NULL, 'Status' => 'Failed']);
}
}else{
return json_encode(['Message' => 'Method must be GET', 'Status' => 'Failed']);
}
}
/***
* API UPDATE
* Merupakan Merubah value pada data Formulir berdasarkan id (Primary Key) dari mobile app
*
* Method :
* POST
*
* Parameters :
* id (INTEGER)
* responden_nama (STRING)
* responden_nama_jalan (STRING)
* responden_no_rumah (STRING)
* responden_rt (STRING)
* responden_rw (STRING)
* responden_kelurahan (STRING)
* responden_kecamatan (STRING)
* responden_kabupaten (STRING)
* responden_propinsi (STRING)
* responden_kode_pos (STRING)
* responden_id_pelanggan (STRING)
* responden_id_pelanggan_pdam (STRING)
* responden_kepimilikan (STRING)
* responden_sumber_air_bersih (STRING)
* responden_jarak_dari_septiktank (STRING)
* responden_tipe_bangunan (STRING)
* responden_daerah_banjir (STRING)
* responden_daya_pln (STRING)
* responden_rekening_pdam_atau_air_bulan_terakhir (STRING)
* responden_jumlah_penghuni (STRING)
* responden_foto_rumah (JSON)
* sanitasi_jenis_jamban (STRING)
* sanitasi_punya_septiktank (STRING)
* ltt_akses (STRING)
* ltt_lokasi_septiktank (STRING)
* ltt_jarak_septiktank_dari_jalan (STRING)
* ltt_lebar_jalan (STRING)
* sanitasi_sumber_air_limbah (STRING)
* sanitasi_bahan_atau_material (STRING)
* sanitasi_jumlah_septiktank (STRING)
* sanitasi_dibangun_pada (STRING)
* sanitasi_ukuran_septiktank (STRING)
* sanitasi_penyaluran_buangan_septiktank (STRING)
* sanitasi_sedot_tinja (STRING)
* sanitasi_sedot_tinja_ya_waktunya (STRING)
* sanitasi_sedot_tinja_ya_biaya_sedot (STRING)
* sanitasi_sedot_tinja_ya_mekanisme_pembayaran (STRING)
* sanitasi_sedot_tinja_tidak_minat_memiliki_st (STRING)
* media_informasi_yang_paling_disukai (STRING)
* foto (JSON)
* coordinate_latitude (FLOAT)
* coordinate_longitude (FLOAT)
* id_user (INTEGER)
*
* Return (JSON) :
* Message (ARRAY)
* Update (STRING) - ( Updated | Failed )
* Status (STRING) - ( Success | Failed )
***/
public function actionUpdate()
{
if (Yii::$app->request->post()) {
$model = Formulir::findOne($_POST['id']);
/***
* Convert WKT to Geometry
* From coordinate_latitude and coordinate_longitude To Geomentry
**/
$wkt = Yii::$app->db->createCommand("SELECT ST_GeomFromText('POINT(".$_POST['coordinate_latitude']." ".$_POST['coordinate_longitude'].")', 4326) AS geomentry")->queryAll();
$the_geom = $wkt[0]['geomentry'];
/* Intervensi dari hasil convert (geometry) ke Field Point */
$_POST['point'] = $the_geom;
/* Merge kiriman POST dengan nama model */
$data['Formulir'] = $_POST;
if($model->load($data) && $model->save()) {
return json_encode(['Message' => ['update'=> 'Updated'], 'Status' => 'Success']);
}else{
return json_encode(['Message' => ['update'=> 'Failed'], 'Status' => 'Success']);
}
}else{
return json_encode(['Message' => 'Method must be POST', 'Status' => 'Failed']);
}
}
/***
* API DELETE
* Merupakan menghapus data Formulir berdasarkan id (Primary Key) dari mobile app
*
* Method :
* POST
*
* Parameters :
* id (INTEGER)
*
* Return (JSON) :
* Message (ARRAY)
* Delete (STRING) - ( Deleted | Failed )
* Status (STRING) - ( Success | Failed )
***/
public function actionDelete($id)
{
if (Yii::$app->request->post()) {
$model = Formulir::findOne($_POST['id'])->delete();
if($model) {
return json_encode(['Message' => ['delete'=> 'deleted'], 'Status' => 'Success']);
}else{
return json_encode(['Message' => ['delete'=> 'Failed'], 'Status' => 'Success']);
}
}else{
return json_encode(['Message' => 'Method must be POST', 'Status' => 'Failed']);
}
}
/***
* API SEARCH
* Merupakan mencari data Formulir berdasarkan radius tertentu dari titik mobile app berada dengan keyword tertentu
*
* Method :
* POST
*
* Parameters :
* id (INTEGER)
* radius (INTEGER)
* keyword (STRING)
* latitude (FLOAT)
* longitude (FLOAT)
*
* Return (JSON) :
* Message (ARRAY)
* id
* coordinate_latitude
* coordinate_longitude
* responden_nama
* responden_id_pelanggan
* responden_id_pelanggan_pdam
* Status (STRING) - ( Success | Failed )
***/
public function actionSearch()
{
if (Yii::$app->request->post()) {
$query_keyword = $_POST['keyword'];
$coordinate_latitude = $_POST['latitude'];
$coordinate_longitude = $_POST['longitude'];
$query_radius = ($_POST['radius'] / 110000 * abs(cos(deg2rad($coordinate_longitude)))) * 4; // Meter
if ($query_keyword) {
/* Mengambil data berdasarkan radius area dan keyword tertentu */
$search = Yii::$app->db->createCommand("SELECT id, coordinate_latitude, coordinate_longitude, responden_nama, responden_id_pelanggan, responden_id_pelanggan_pdam FROM formulir INNER JOIN ST_Buffer(ST_GeomFromText('POINT(".$coordinate_latitude." ".$coordinate_longitude.")',4326), ".$query_radius.") As buffer ON ST_covers(buffer,point) AND LOWER(responden_nama||responden_nama_jalan||responden_no_rumah||responden_rt||responden_rw||responden_kelurahan||responden_kecamatan||responden_kabupaten||responden_propinsi||responden_id_pelanggan||responden_id_pelanggan_pdam||responden_kepimilikan||responden_sumber_air_bersih||responden_jarak_dari_septiktank||responden_tipe_bangunan||responden_daerah_banjir||responden_daya_pln||responden_rekening_pdam_atau_air_bulan_terakhir||responden_jumlah_penghuni||sanitasi_jenis_jamban||sanitasi_punya_septiktank||ltt_akses||ltt_lokasi_septiktank||ltt_jarak_septiktank_dari_jalan||ltt_lebar_jalan||sanitasi_sumber_air_limbah||sanitasi_bahan_atau_material||sanitasi_jumlah_septiktank||sanitasi_dibangun_pada||sanitasi_ukuran_septiktank||sanitasi_penyaluran_buangan_septiktank||sanitasi_sedot_tinja||sanitasi_sedot_tinja_ya_waktunya||sanitasi_sedot_tinja_ya_biaya_sedot||sanitasi_sedot_tinja_ya_mekanisme_pembayaran||sanitasi_sedot_tinja_tidak_minat_memiliki_st||media_informasi_yang_paling_disukai) LIKE '%".strtolower($query_keyword)."%'")->queryAll();
}else{
/* Mengambil data berdasarkan radius area dan keyword tertentu */
$search = Yii::$app->db->createCommand("SELECT id, coordinate_latitude, coordinate_longitude, responden_nama, responden_id_pelanggan, responden_id_pelanggan_pdam FROM formulir INNER JOIN ST_Buffer(ST_GeomFromText('POINT(".$coordinate_latitude." ".$coordinate_longitude.")',4326), ".$query_radius.") As buffer ON ST_covers(buffer,point)")->queryAll();
}
if($search) {
return json_encode(['Message' => $search, 'Status' => 'Success']);
}else{
return json_encode(['Message' => ['search'=> 'No data'], 'Status' => 'Success']);
}
}else{
return json_encode(['Message' => 'Method must be POST', 'Status' => 'Failed']);
}
}
/***
* API SEARCH COLUMN
* Merupakan mencari data Formulir berdasarkan radius tertentu dari titik mobile app berada dengan keyword dan column tertentu
*
* Method :
* POST
*
* Parameters :
* id (INTEGER)
* radius (INTEGER)
* keyword (STRING)
* column (STRING)
* latitude (FLOAT)
* longitude (FLOAT)
*
* Return (JSON) :
* Message (ARRAY)
* id
* coordinate_latitude
* coordinate_longitude
* responden_nama
* responden_id_pelanggan
* responden_id_pelanggan_pdam
* Status (STRING) - ( Success | Failed )
***/
public function actionSearchcolumn()
{
if (Yii::$app->request->post()) {
$query_keyword = $_POST['keyword'];
$query_column = $_POST['column'];
$coordinate_latitude = $_POST['latitude'];
$coordinate_longitude = $_POST['longitude'];
$query_radius = ($_POST['radius'] / 110000 * abs(cos(deg2rad($coordinate_longitude)))) * 4; // Meter
/* Mengambil data berdasarkan radius area dan keyword tertentu */
$search = Yii::$app->db->createCommand("SELECT id, coordinate_latitude, coordinate_longitude, responden_nama, responden_id_pelanggan, responden_id_pelanggan_pdam FROM formulir INNER JOIN ST_Buffer(ST_GeomFromText('POINT(".$coordinate_latitude." ".$coordinate_longitude.")',4326), ".$query_radius.") As buffer ON ST_covers(buffer,point) AND CONCAT_WS('|','".$query_column."') LIKE '%".$query_keyword."%';")->queryAll();
if($search) {
return json_encode(['Message' => $search, 'Status' => 'Success']);
}else{
return json_encode(['Message' => ['searchcolumn'=> 'No data'], 'Status' => 'Success']);
}
}else{
return json_encode(['Message' => 'Method must be POST', 'Status' => 'Failed']);
}
}
/***
* API DATA
* Merupakan mencari semua data Formulir
*
* Method :
* GET
*
* Return (JSON) :
* Message (ARRAY)
* id
* coordinate_latitude
* coordinate_longitude
* responden_nama
* responden_id_pelanggan
* responden_id_pelanggan_pdam
* Status (STRING) - ( Success | Failed )
***/
public function actionData()
{
/* Mengambil data berdasarkan radius area tertentu */
$data = Formulir::find()->select('id, coordinate_latitude, coordinate_longitude, responden_nama, responden_id_pelanggan, responden_id_pelanggan_pdam')->AsArray()->OrderBy('id')->all();
if($data) {
return json_encode(['Message' => $data, 'Status' => 'Success']);
}else{
return json_encode(['Message' => ['data'=> 'No data'], 'Status' => 'Success']);
}
}
/***
* API DATA OWN
* Merupakan mencari data Formulir berdasarkan kepemilikan (id_user)
*
* Method :
* POST
*
* Parameters :
* id_user (INTEGER)
*
* Return (JSON) :
* Message (ARRAY)
* id
* coordinate_latitude
* coordinate_longitude
* responden_nama
* responden_id_pelanggan
* responden_id_pelanggan_pdam
* Status (STRING) - ( Success | Failed )
***/
public function actionDataown()
{
if (Yii::$app->request->post()) {
$query_radius = $_POST['id_user'];
/* Mengambil data berdasarkan id_user tertentu */
$data_own = Formulir::find()->select('id, coordinate_latitude, coordinate_longitude, responden_nama, responden_id_pelanggan, responden_id_pelanggan_pdam')->where(['id_user'=>$_POST['id_user']])->AsArray()->OrderBy('id')->all();
if($data_own) {
return json_encode(['Message' => $data_own, 'Status' => 'Success']);
}else{
return json_encode(['Message' => ['data'=> 'No data'], 'Status' => 'Success']);
}
}else{
return json_encode(['Message' => 'Method must be POST', 'Status' => 'Failed']);
}
}
/***
* API DATA RADIUS
* Merupakan mencari data Formulir berdasarkan radius tertentu dari titik kordinat mobile app
*
* Method :
* POST
*
* Parameters :
* radius (INTEGER)
* latitude (FLOAT)
* longitude (FLOAT)
*
* Return (JSON) :
* Message (ARRAY)
* id
* coordinate_latitude
* coordinate_longitude
* responden_nama
* responden_id_pelanggan
* responden_id_pelanggan_pdam
* Status (STRING) - ( Success | Failed )
***/
public function actionDataradius()
{
if (Yii::$app->request->post()) {
$coordinate_latitude = $_POST['latitude'];
$coordinate_longitude = $_POST['longitude'];
$query_radius = $_POST['radius'] / 110000 * abs(cos(deg2rad($coordinate_longitude))); // Meter
/* Mengambil data berdasarkan radius area tertentu */
$data_radius = Yii::$app->db->createCommand("SELECT id, coordinate_latitude, coordinate_longitude, responden_nama, responden_id_pelanggan, responden_id_pelanggan_pdam FROM formulir INNER JOIN ST_Buffer(ST_GeomFromText('POINT(".$coordinate_latitude." ".$coordinate_longitude.")',4326), ".$query_radius.") As buffer ON ST_covers(buffer,point);")->queryAll();
if($data_radius) {
return json_encode(['Message' => $data_radius, 'Status' => 'Success']);
}else{
return json_encode(['Message' => ['data'=> 'No data'], 'Status' => 'Success']);
}
}else{
return json_encode(['Message' => 'Method must be POST', 'Status' => 'Failed']);
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment