demo transaksi

This commit is contained in:
2026-04-01 11:55:47 +07:00
parent 619d758027
commit 7417222c79
166 changed files with 3111 additions and 5265 deletions

View File

@@ -11,14 +11,15 @@ class appnotification extends CI_Controller
is_logged_in();
$this->load->model('notification_model', 'notif');
$this->load->model('Pelanggan_model', 'pelanggan_model');
$this->load->library('form_validation');
}
public function index()
{
$data['pelanggan_list'] = $this->pelanggan_model->get_all_for_notification_picker();
$this->load->view('includes/header');
$this->load->view('appnotification/index');
$this->load->view('appnotification/index', $data);
$this->load->view('includes/footer');
}
@@ -33,10 +34,57 @@ class appnotification extends CI_Controller
return;
}
$topic = $this->input->post('topic');
$title = $this->input->post('title');
$message = $this->input->post('message');
$send_target = $this->input->post('send_target');
if ($send_target === 'users') {
$user_ids = $this->input->post('user_ids');
if (!is_array($user_ids)) {
$user_ids = array();
}
$user_ids = array_unique(array_filter(array_map('intval', $user_ids)));
if (empty($user_ids)) {
$this->session->set_flashdata('error', 'Pilih minimal satu pengguna (user).');
redirect('appnotification/index');
return;
}
$sent = 0;
$skipped = 0;
foreach ($user_ids as $uid) {
if ($uid <= 0) {
continue;
}
$row = $this->pelanggan_model->get_notification_row_by_id($uid);
if (!$row) {
$skipped++;
continue;
}
$tok = isset($row->token) ? trim((string) $row->token) : '';
if ($tok === '' || !fcm_v1_is_valid_device_token($tok)) {
$skipped++;
continue;
}
if ($this->notif->send_notif($title, $message, $tok)) {
$sent++;
} else {
$skipped++;
}
}
if ($sent > 0) {
$msg = 'Notifikasi terkirim ke ' . $sent . ' pengguna.';
if ($skipped > 0) {
$msg .= ' ' . $skipped . ' dilewati (tanpa token FCM valid atau gagal kirim).';
}
$this->session->set_flashdata('send', $msg);
} else {
$this->session->set_flashdata('error', 'Tidak ada notifikasi terkirim. Pastikan pengguna memiliki token FCM valid (login dari aplikasi).');
}
redirect('appnotification/index');
return;
}
$topic = $this->input->post('topic');
$ok = $this->notif->send_notif($title, $message, $topic);
if ($ok) {
$this->session->set_flashdata('send', 'Notifikasi berhasil dikirim');

View File

@@ -76,10 +76,24 @@ class Driver extends REST_Controller
$data = file_get_contents("php://input");
$decoded_data = json_decode($data);
if (!$decoded_data || !isset($decoded_data->password)) {
$this->response(array('code' => '400', 'message' => 'Invalid request', 'data' => []), 200);
return;
}
if (function_exists('fcm_v1_validate_login_device_token_from_app')) {
$fcm_err = fcm_v1_validate_login_device_token_from_app($decoded_data);
if (is_array($fcm_err)) {
$this->response(
array('code' => $fcm_err['code'], 'message' => $fcm_err['message'], 'data' => []),
200
);
return;
}
}
// Only save reg_id (FCM token) when valid. Invalid/placeholder tokens are updated by relogin.
$token_from_regid = isset($decoded_data->reg_id) ? trim((string) $decoded_data->reg_id) : '';
$token_from_token = isset($decoded_data->token) ? trim((string) $decoded_data->token) : '';
$token = $token_from_regid !== '' ? $token_from_regid : $token_from_token;
$token = function_exists('fcm_v1_device_token_from_request')
? fcm_v1_device_token_from_request($decoded_data)
: '';
$reg_id = array();
if ($token !== '' && function_exists('fcm_v1_is_valid_device_token') && fcm_v1_is_valid_device_token($token)) {
$reg_id['reg_id'] = $token;
@@ -149,8 +163,10 @@ class Driver extends REST_Controller
);
$ins = $this->Driver_model->my_location($data);
// When driver sends valid FCM token (reg_id) with location, update so they receive order requests. Invalid/placeholder tokens are updated by relogin.
$reg_id = isset($decoded_data->reg_id) ? trim((string) $decoded_data->reg_id) : '';
// When driver sends valid FCM token with location, update so they receive order requests.
$reg_id = function_exists('fcm_v1_device_token_from_request')
? fcm_v1_device_token_from_request($decoded_data)
: (isset($decoded_data->reg_id) ? trim((string) $decoded_data->reg_id) : '');
if ($reg_id !== '' && isset($decoded_data->id_driver) && function_exists('fcm_v1_is_valid_device_token') && fcm_v1_is_valid_device_token($reg_id)) {
$this->Driver_model->update_driver_reg_id($decoded_data->id_driver, $reg_id);
}
@@ -372,6 +388,22 @@ class Driver extends REST_Controller
}
}
/**
* Persist driver accept exchange on transaksi row (admin order detail API log).
*/
private function log_driver_accept_api($id_transaksi, $raw_body, $response_message)
{
$id_transaksi = (int) $id_transaksi;
if ($id_transaksi <= 0) {
return;
}
$line = json_encode(array(
'driver_request_raw' => $raw_body,
'backend_response' => $response_message,
), JSON_UNESCAPED_UNICODE);
$this->Pelanggan_model->append_transaksi_driver_request_log($id_transaksi, $line);
}
function accept_post()
{
if (!isset($_SERVER['PHP_AUTH_USER'])) {
@@ -383,6 +415,7 @@ class Driver extends REST_Controller
$data = file_get_contents("php://input");
$dec_data = json_decode($data);
log_message('debug', 'accept_post: payload=' . $data);
$tid_for_log = (is_object($dec_data) && isset($dec_data->id_transaksi)) ? (int) $dec_data->id_transaksi : 0;
$data_req = array(
'id_driver' => $dec_data->id,
@@ -390,13 +423,13 @@ class Driver extends REST_Controller
);
$condition = array(
'id_driver' => $dec_data->id,
'status' => '1'
'id_driver' => $dec_data->id
);
$cek_login = $this->Driver_model->get_status_driver($condition);
log_message('debug', 'accept_post: get_status_driver rows=' . $cek_login->num_rows());
if ($cek_login->num_rows() > 0) {
$driver_status = $cek_login->num_rows() > 0 ? (string) $cek_login->row('status') : '';
log_message('debug', 'accept_post: get_status_driver rows=' . $cek_login->num_rows() . ' status=' . $driver_status);
if ($cek_login->num_rows() > 0 && ($driver_status === '1' || $driver_status === '4')) {
$acc_req = $this->Driver_model->accept_request($data_req);
log_message('debug', 'accept_post: accept_request result=' . json_encode($acc_req));
@@ -405,6 +438,7 @@ class Driver extends REST_Controller
'message' => 'berhasil',
'data' => 'berhasil'
);
$this->log_driver_accept_api($tid_for_log, $data, $message);
$this->response($message, 200);
} else {
if ($acc_req['data'] == 'canceled') {
@@ -412,12 +446,14 @@ class Driver extends REST_Controller
'message' => 'canceled',
'data' => 'canceled'
);
$this->log_driver_accept_api($tid_for_log, $data, $message);
$this->response($message, 200);
} else {
$message = array(
'message' => 'unknown fail',
'data' => 'canceled'
);
$this->log_driver_accept_api($tid_for_log, $data, $message);
$this->response($message, 200);
}
}
@@ -426,6 +462,7 @@ class Driver extends REST_Controller
'message' => 'unknown fail',
'data' => 'canceled'
);
$this->log_driver_accept_api($tid_for_log, $data, $message);
$this->response($message, 200);
}
}

View File

@@ -65,9 +65,31 @@ class Merchant extends REST_Controller
$data = file_get_contents("php://input");
$decoded_data = json_decode($data);
$no_telepon_val =
isset($decoded_data->no_telepon) ? trim((string)$decoded_data->no_telepon) : '';
$email_val = isset($decoded_data->email)
? trim((string)$decoded_data->email)
: '';
if (!$decoded_data || !isset($decoded_data->password) || ($no_telepon_val === '' && $email_val === '')) {
$this->response(array('code' => '400', 'message' => 'Invalid request', 'data' => []), 200);
return;
}
$login_by_phone = $no_telepon_val !== '';
if (function_exists('fcm_v1_validate_login_device_token_from_app')) {
$fcm_err = fcm_v1_validate_login_device_token_from_app($decoded_data);
if (is_array($fcm_err)) {
$this->response(
array('code' => $fcm_err['code'], 'message' => $fcm_err['message'], 'data' => []),
200
);
return;
}
}
// Only save FCM token when valid (relogin overwrites invalid/placeholder tokens).
$token = isset($decoded_data->token) ? trim((string) $decoded_data->token) : '';
$token = (isset($decoded_data->reg_id) && trim((string) $decoded_data->reg_id) !== '') ? trim((string) $decoded_data->reg_id) : $token;
$token = function_exists('fcm_v1_device_token_from_request')
? fcm_v1_device_token_from_request($decoded_data)
: '';
$reg_id = array();
if ($token !== '' && function_exists('fcm_v1_is_valid_device_token') && fcm_v1_is_valid_device_token($token)) {
$reg_id['token_merchant'] = $token;
@@ -75,10 +97,18 @@ class Merchant extends REST_Controller
$condition = array(
'password' => sha1($decoded_data->password),
'telepon_mitra' => $decoded_data->no_telepon,
//'token' => $decoded_data->token
);
$check_banned = $this->Merchantapi_model->check_banned($decoded_data->no_telepon);
if ($login_by_phone) {
$condition['telepon_mitra'] = $no_telepon_val;
} else {
$condition['email_mitra'] = $email_val;
}
$check_banned = $login_by_phone
? $this->Merchantapi_model->check_banned($no_telepon_val)
: $this->Merchantapi_model->check_banned_by_email($email_val);
if ($check_banned) {
$message = array(
'message' => 'banned',
@@ -90,7 +120,19 @@ class Merchant extends REST_Controller
$message = array();
if ($cek_login->num_rows() > 0) {
if (!empty($reg_id)) {
$this->Merchantapi_model->edit_profile_token($reg_id, $decoded_data->no_telepon);
$loginRow = $cek_login->row();
$phone_for_token = '';
if ($login_by_phone) {
$phone_for_token = $no_telepon_val;
} else if (!empty($loginRow) && isset($loginRow->telepon_merchant) && $loginRow->telepon_merchant !== '') {
$phone_for_token = $loginRow->telepon_merchant;
} else if (!empty($loginRow) && isset($loginRow->telepon_mitra) && $loginRow->telepon_mitra !== '') {
$phone_for_token = $loginRow->telepon_mitra;
}
if ($phone_for_token !== '') {
$this->Merchantapi_model->edit_profile_token($reg_id, $phone_for_token);
}
}
$get_pelanggan = $this->Merchantapi_model->get_data_merchant($condition);
$message = array(
@@ -102,7 +144,7 @@ class Merchant extends REST_Controller
} else {
$message = array(
'code' => '404',
'message' => 'nomor hp atau password salah!',
'message' => 'nomor hp/email atau password salah!',
'data' => []
);
$this->response($message, 200);
@@ -450,24 +492,24 @@ class Merchant extends REST_Controller
$token = $this->wallet->gettoken($iduser);
$regid = $this->wallet->getregid($iduser);
$tokenmerchant = $this->wallet->gettokenmerchant($iduser);
if ($token == NULL and $tokenmerchant == NULL and $regid != NULL) {
$topic = null;
if ($token == NULL and $tokenmerchant == NULL and $regid != NULL && !empty(trim((string) $regid['reg_id']))) {
$topic = $regid['reg_id'];
} else if ($regid == NULL and $tokenmerchant == NULL and $token != NULL) {
} else if ($regid == NULL and $tokenmerchant == NULL and $token != NULL && !empty(trim((string) $token['token']))) {
$topic = $token['token'];
} else if ($regid == NULL and $token == NULL and $tokenmerchant != NULL) {
} else if ($regid == NULL and $token == NULL and $tokenmerchant != NULL && !empty(trim((string) $tokenmerchant['token_merchant']))) {
$topic = $tokenmerchant['token_merchant'];
}
$title = 'Sukses';
$message = 'Permintaan berhasil dikirim';
$saldo = $this->wallet->getsaldo($iduser);
$this->wallet->ubahsaldo($iduser, $amount, $saldo);
//$this->wallet->ubahstatuswithdrawbyid($id);
$this->wallet->send_notif($title, $message, $topic);
if ($topic !== null) {
$this->wallet->send_notif($title, $message, $topic);
}
/* END EDIT */
$message = array(

View File

@@ -18,6 +18,71 @@ class Pelanggan extends REST_Controller
date_default_timezone_set('Asia/Jakarta');
}
/**
* Structured API request log for order-related endpoints.
*/
private function log_order_api_request($endpoint, $rawBody)
{
log_message('debug', '[ORDER_API][' . $endpoint . '][REQUEST] ' . $rawBody);
}
/**
* Structured API response log for order-related endpoints.
*/
private function log_order_api_response($endpoint, $responsePayload)
{
log_message('debug', '[ORDER_API][' . $endpoint . '][RESPONSE] ' . json_encode($responsePayload));
}
/**
* Log candidate drivers targeted by customer order flow.
*/
private function log_order_driver_targets($endpoint, $idTransaksi, $driverList)
{
$ids = array();
if (is_array($driverList)) {
foreach ($driverList as $d) {
if (is_object($d) && isset($d->id)) {
$ids[] = (string) $d->id;
} else if (is_array($d) && isset($d['id'])) {
$ids[] = (string) $d['id'];
}
}
}
log_message(
'debug',
'[ORDER_API][' . $endpoint . '][DRIVER_TARGETS] id_transaksi=' . $idTransaksi .
' total=' . count($ids) . ' driver_ids=' . implode(',', $ids)
);
}
/**
* Store raw request/response on transaksi row for dashboard detail (requires DB columns).
*/
private function save_order_creation_logs($id_transaksi, $raw_request, $response_payload, $driver_targets)
{
$id_transaksi = (int) $id_transaksi;
if ($id_transaksi <= 0) {
return;
}
$rows = array();
if (is_array($driver_targets)) {
foreach ($driver_targets as $d) {
$rows[] = json_decode(json_encode($d), true);
}
}
$backend_driver = json_encode(array(
'note' => 'Candidate drivers from get_data_driver_histroy after order create; client apps may use Firebase/FCM for dispatch.',
'candidate_drivers' => $rows,
), JSON_UNESCAPED_UNICODE);
$this->Pelanggan_model->save_transaksi_api_log(
$id_transaksi,
$raw_request,
json_encode($response_payload, JSON_UNESCAPED_UNICODE),
$backend_driver
);
}
function index_get()
{
$this->response("Api for Ontime!", 200);
@@ -120,9 +185,20 @@ class Pelanggan extends REST_Controller
$this->response(array('code' => '400', 'message' => 'Invalid request', 'data' => []), 200);
return;
}
if (function_exists('fcm_v1_validate_login_device_token_from_app')) {
$fcm_err = fcm_v1_validate_login_device_token_from_app($decoded_data);
if (is_array($fcm_err)) {
$this->response(
array('code' => $fcm_err['code'], 'message' => $fcm_err['message'], 'data' => []),
200
);
return;
}
}
// Only save FCM token when valid (relogin overwrites invalid/placeholder tokens).
$token = isset($decoded_data->token) ? trim((string) $decoded_data->token) : '';
$token = (isset($decoded_data->reg_id) && trim((string) $decoded_data->reg_id) !== '') ? trim((string) $decoded_data->reg_id) : $token;
$token = function_exists('fcm_v1_device_token_from_request')
? fcm_v1_device_token_from_request($decoded_data)
: '';
$reg_id = array();
if ($token !== '' && function_exists('fcm_v1_is_valid_device_token') && fcm_v1_is_valid_device_token($token)) {
$reg_id['token'] = $token;
@@ -236,7 +312,9 @@ class Pelanggan extends REST_Controller
// Generate a deterministic placeholder based on email so the column is never empty.
// This placeholder is intentionally SHORT / starting with "R" + digits so
// fcm_v1_is_valid_device_token() will treat it as invalid for push.
$incomingToken = isset($dec_data->token) ? trim((string) $dec_data->token) : '';
$incomingToken = function_exists('fcm_v1_device_token_from_request')
? fcm_v1_device_token_from_request($dec_data)
: (isset($dec_data->token) ? trim((string) $dec_data->token) : '');
if ($incomingToken === '') {
$emailForToken = isset($dec_data->email) ? strtolower(trim((string) $dec_data->email)) : '';
if ($emailForToken !== '') {
@@ -1007,6 +1085,7 @@ class Pelanggan extends REST_Controller
function request_transaksi_post()
{
$endpoint = 'request_transaksi_post';
if (!isset($_SERVER['PHP_AUTH_USER'])) {
header("WWW-Authenticate: Basic realm=\"Private Area\"");
header("HTTP/1.0 401 Unauthorized");
@@ -1014,18 +1093,19 @@ class Pelanggan extends REST_Controller
} else {
$cek = $this->Pelanggan_model->check_banned_user($_SERVER['PHP_AUTH_USER']);
if ($cek) {
log_message('debug', 'request_transaksi_post: banned user ' . $_SERVER['PHP_AUTH_USER']);
$message = array(
'message' => 'fail',
'data' => 'Status User Banned'
);
log_message('debug', '[ORDER_API][' . $endpoint . '] banned user ' . $_SERVER['PHP_AUTH_USER']);
$this->log_order_api_response($endpoint, $message);
$this->response($message, 200);
}
}
$data = file_get_contents("php://input");
$dec_data = json_decode($data);
log_message('debug', 'request_transaksi_post: payload=' . $data);
$this->log_order_api_request($endpoint, $data);
$data_req = array(
'id_pelanggan' => $dec_data->id_pelanggan,
@@ -1046,9 +1126,23 @@ class Pelanggan extends REST_Controller
);
$request = $this->Pelanggan_model->insert_transaksi($data_req);
$idTransaksiNum = 0;
if ($request['status'] && !empty($request['data'])) {
foreach ($request['data'] as $row) {
if (is_object($row) && isset($row->id)) {
$idTransaksiNum = (int) $row->id;
break;
}
}
}
if ($request['status']) {
if (isset($request['data'][0]->id)) {
log_message('debug', 'request_transaksi_post: success id_transaksi=' . $request['data'][0]->id . ' id_pelanggan=' . $dec_data->id_pelanggan . ' fitur=' . $dec_data->order_fitur);
$idTransaksi = $idTransaksiNum > 0 ? $idTransaksiNum : 'unknown';
$driverTargets = $idTransaksiNum > 0
? $this->Pelanggan_model->get_data_driver_histroy($idTransaksiNum)->result()
: array();
$this->log_order_driver_targets($endpoint, $idTransaksi, $driverTargets);
if ($idTransaksiNum > 0) {
log_message('debug', 'request_transaksi_post: success id_transaksi=' . $idTransaksiNum . ' id_pelanggan=' . $dec_data->id_pelanggan . ' fitur=' . $dec_data->order_fitur);
} else {
log_message('debug', 'request_transaksi_post: success (no id in data) payload=' . json_encode($request['data']));
}
@@ -1056,6 +1150,8 @@ class Pelanggan extends REST_Controller
'message' => 'success',
'data' => $request['data']
);
$this->log_order_api_response($endpoint, $message);
$this->save_order_creation_logs($idTransaksiNum, $data, $message, $driverTargets);
$this->response($message, 200);
} else {
log_message('error', 'request_transaksi_post: insert_transaksi fail data=' . json_encode($request['data']));
@@ -1063,12 +1159,14 @@ class Pelanggan extends REST_Controller
'message' => 'fail',
'data' => $request['data']
);
$this->log_order_api_response($endpoint, $message);
$this->response($message, 200);
}
}
function check_status_transaksi_post()
{
$endpoint = 'check_status_transaksi_post';
if (!isset($_SERVER['PHP_AUTH_USER'])) {
header("WWW-Authenticate: Basic realm=\"Private Area\"");
header("HTTP/1.0 401 Unauthorized");
@@ -1077,14 +1175,19 @@ class Pelanggan extends REST_Controller
$data = file_get_contents("php://input");
$dec_data = json_decode($data);
log_message('debug', 'check_status_transaksi_post: payload=' . $data);
$this->log_order_api_request($endpoint, $data);
$dataTrans = array(
'id_transaksi' => $dec_data->id_transaksi
);
$getStatus = $this->Pelanggan_model->check_status($dataTrans);
log_message('debug', 'check_status_transaksi_post: result=' . json_encode($getStatus));
$this->log_order_driver_targets(
$endpoint,
isset($dec_data->id_transaksi) ? $dec_data->id_transaksi : 'unknown',
isset($getStatus['list_driver']) ? $getStatus['list_driver'] : array()
);
$this->log_order_api_response($endpoint, $getStatus);
$this->response($getStatus, 200);
}
@@ -1321,6 +1424,7 @@ class Pelanggan extends REST_Controller
function request_transaksi_send_post()
{
$endpoint = 'request_transaksi_send_post';
if (!isset($_SERVER['PHP_AUTH_USER'])) {
header("WWW-Authenticate: Basic realm=\"Private Area\"");
header("HTTP/1.0 401 Unauthorized");
@@ -1332,12 +1436,15 @@ class Pelanggan extends REST_Controller
'message' => 'fail',
'data' => 'Status User Banned'
);
log_message('debug', '[ORDER_API][' . $endpoint . '] banned user ' . $_SERVER['PHP_AUTH_USER']);
$this->log_order_api_response($endpoint, $message);
$this->response($message, 200);
}
}
$data = file_get_contents("php://input");
$dec_data = json_decode($data);
$this->log_order_api_request($endpoint, $data);
$data_req = array(
'id_pelanggan' => $dec_data->id_pelanggan,
@@ -1368,16 +1475,29 @@ class Pelanggan extends REST_Controller
$request = $this->Pelanggan_model->insert_transaksi_send($data_req, $dataDetail);
if ($request['status']) {
$resultRows = $request['data']->result();
$message = array(
'message' => 'success',
'data' => $request['data']->result()
'data' => $resultRows
);
$idTransaksiNum = 0;
if (!empty($resultRows[0]) && is_object($resultRows[0]) && isset($resultRows[0]->id)) {
$idTransaksiNum = (int) $resultRows[0]->id;
}
$idTransaksi = $idTransaksiNum > 0 ? $idTransaksiNum : 'unknown';
$driverTargets = $idTransaksiNum > 0
? $this->Pelanggan_model->get_data_driver_histroy($idTransaksiNum)->result()
: array();
$this->log_order_driver_targets($endpoint, $idTransaksi, $driverTargets);
$this->log_order_api_response($endpoint, $message);
$this->save_order_creation_logs($idTransaksiNum, $data, $message, $driverTargets);
$this->response($message, 200);
} else {
$message = array(
'message' => 'fail',
'data' => []
);
$this->log_order_api_response($endpoint, $message);
$this->response($message, 200);
}
}
@@ -1457,6 +1577,7 @@ class Pelanggan extends REST_Controller
function inserttransaksimerchant_post()
{
$endpoint = 'inserttransaksimerchant_post';
if (!isset($_SERVER['PHP_AUTH_USER'])) {
header("WWW-Authenticate: Basic realm=\"Private Area\"");
header("HTTP/1.0 401 Unauthorized");
@@ -1468,12 +1589,15 @@ class Pelanggan extends REST_Controller
'message' => 'fail',
'data' => 'Status User Banned'
);
log_message('debug', '[ORDER_API][' . $endpoint . '] banned user ' . $_SERVER['PHP_AUTH_USER']);
$this->log_order_api_response($endpoint, $message);
$this->response($message, 200);
}
}
$data = file_get_contents("php://input");
$dec_data = json_decode($data);
$this->log_order_api_request($endpoint, $data);
$data_transaksi = array(
'id_pelanggan' => $dec_data->id_pelanggan,
@@ -1531,9 +1655,14 @@ class Pelanggan extends REST_Controller
$message = array(
'message' => 'success',
'data' => $result['data'],
);
$tid = isset($result['id_transaksi']) ? (int) $result['id_transaksi'] : 0;
$driverTargets = $tid > 0
? $this->Pelanggan_model->get_data_driver_histroy($tid)->result()
: array();
$this->log_order_driver_targets($endpoint, $tid ?: 'unknown', $driverTargets);
$this->log_order_api_response($endpoint, $message);
$this->save_order_creation_logs($tid, $data, $message, $driverTargets);
$this->response($message, 200);
} else {
$message = array(
@@ -1541,6 +1670,7 @@ class Pelanggan extends REST_Controller
'data' => []
);
$this->log_order_api_response($endpoint, $message);
$this->response($message, 200);
}
} else {
@@ -1549,6 +1679,7 @@ class Pelanggan extends REST_Controller
'data' => []
);
$this->log_order_api_response($endpoint, $message);
$this->response($message, 200);
}
}