328 lines
10 KiB
PHP
328 lines
10 KiB
PHP
<?php
|
|
|
|
namespace App\Controllers\Backend;
|
|
|
|
use App\Controllers\BaseController;
|
|
use App\Models\User;
|
|
use CodeIgniter\HTTP\ResponseInterface;
|
|
use App\Models\Outlet;
|
|
use CodeIgniter\RESTful\ResourceController;
|
|
|
|
class UserController extends ResourceController
|
|
{
|
|
private $user;
|
|
private $outletModel;
|
|
|
|
public function __construct()
|
|
{
|
|
$this->user = new User();
|
|
$this->outletModel = new Outlet();
|
|
}
|
|
|
|
public function index()
|
|
{
|
|
$user_id = $this->request->getVar('user_id');
|
|
|
|
// Get the requesting user's data to check their role
|
|
$requesting_user = $this->user->find($user_id);
|
|
|
|
if (!$requesting_user) {
|
|
$response = [
|
|
'status' => 'error',
|
|
'message' => 'Requesting user not found.',
|
|
'data' => null
|
|
];
|
|
return $this->respond($response, 404);
|
|
}
|
|
|
|
// If user is admin, get all users
|
|
if ($requesting_user['role'] === 'admin') {
|
|
$users = $this->user->findAll();
|
|
} else {
|
|
// If not admin, only return their own data
|
|
$users = [$this->user->find($user_id)];
|
|
}
|
|
|
|
if (empty($users)) {
|
|
$response = [
|
|
'status' => 'error',
|
|
'message' => 'No user data found.',
|
|
'data' => null
|
|
];
|
|
return $this->respond($response, 200);
|
|
}
|
|
|
|
$response = [
|
|
'status' => 'success',
|
|
'message' => 'User data retrieved successfully.',
|
|
'data' => $users
|
|
];
|
|
return $this->respond($response, 200);
|
|
}
|
|
|
|
//Create User Function
|
|
public function create()
|
|
{
|
|
$validationRules = [
|
|
'username' => 'required',
|
|
'name' => 'required',
|
|
'password_hash' => 'required',
|
|
'role' => 'required',
|
|
'status' => 'required',
|
|
];
|
|
|
|
// Add conditional validation for outlet_id when role is 'Outlet'
|
|
if ($this->request->getVar('role') === 'outlet') {
|
|
$validationRules['outlet_id'] = 'required|integer';
|
|
}
|
|
|
|
if (!$this->validate($validationRules)) {
|
|
$response = [
|
|
'status' => 'error',
|
|
'message' => 'Validation failed.',
|
|
'data' => $this->validator->getErrors()
|
|
];
|
|
return $this->respond($response, 422);
|
|
}
|
|
|
|
// Get menu permissions from request
|
|
$menuPermissions = $this->request->getVar('menuPermissions');
|
|
|
|
// Convert permissions to JSON string if they exist
|
|
$permissionsJson = null;
|
|
if ($menuPermissions) {
|
|
$permissionsJson = json_encode($menuPermissions);
|
|
if (json_last_error() !== JSON_ERROR_NONE) {
|
|
$response = [
|
|
'status' => 'error',
|
|
'message' => 'Invalid permissions format.',
|
|
'data' => null
|
|
];
|
|
return $this->respond($response, 400);
|
|
}
|
|
}
|
|
|
|
$userData = [
|
|
'username' => $this->request->getVar('username'),
|
|
'name' => $this->request->getVar('name'),
|
|
'password_hash' => md5($this->request->getVar('password_hash')),
|
|
'role' => $this->request->getVar('role'),
|
|
'status' => $this->request->getVar('status'),
|
|
'user_permissions' => $permissionsJson, // Store permissions as JSON string
|
|
];
|
|
|
|
// Only add outlet_id if role is 'Outlet'
|
|
if ($this->request->getVar('role') === 'outlet') {
|
|
$userData['outlet_id'] = $this->request->getVar('outlet_id');
|
|
}
|
|
|
|
$id = $this->user->insert($userData);
|
|
|
|
if ($id) {
|
|
$result = $this->user->find($id);
|
|
|
|
$response = [
|
|
'status' => 'success',
|
|
'message' => 'User created successfully.',
|
|
'data' => $result
|
|
];
|
|
return $this->respond($response, 201);
|
|
}
|
|
|
|
$response = [
|
|
'status' => 'error',
|
|
'message' => 'Failed to create user.',
|
|
'data' => null
|
|
];
|
|
return $this->respond($response, 500);
|
|
}
|
|
|
|
// show the required data.
|
|
public function show($id = null)
|
|
{
|
|
$user = $this->user->find($id);
|
|
|
|
if (!$user) {
|
|
$response = [
|
|
'status' => 'error',
|
|
'message' => 'User not found.',
|
|
'data' => null
|
|
];
|
|
return $this->respond($response, 404);
|
|
}
|
|
|
|
$response = [
|
|
'status' => 'success',
|
|
'message' => 'User retrieved successfully.',
|
|
'data' => $user
|
|
];
|
|
return $this->respond($response, 200);
|
|
}
|
|
|
|
// Update the data
|
|
public function update($id = null)
|
|
{
|
|
// Find existing user
|
|
$existingUser = $this->user->find($id);
|
|
|
|
if (!$existingUser) {
|
|
$response = [
|
|
'status' => 'error',
|
|
'message' => 'User not found.',
|
|
'data' => null
|
|
];
|
|
return $this->respond($response, 404);
|
|
}
|
|
|
|
// Get new data from request
|
|
$input = $this->request->getJSON(true); // Get JSON data
|
|
if (empty($input)) {
|
|
// fallback: try to get POST vars
|
|
$input = $this->request->getPost();
|
|
}
|
|
|
|
// Prepare data array only with fields that are present
|
|
$data = [];
|
|
|
|
// Map frontend field names to backend field names
|
|
if (isset($input['username'])) {
|
|
$data['username'] = $input['username'];
|
|
}
|
|
if (isset($input['name'])) {
|
|
$data['name'] = $input['name'];
|
|
}
|
|
if (isset($input['password'])) {
|
|
$data['password_hash'] = password_hash($input['password'], PASSWORD_DEFAULT);
|
|
}
|
|
|
|
// Handle userRoles -> role mapping
|
|
if (isset($input['role'])) {
|
|
$data['role'] = $input['role'];
|
|
|
|
// Handle outlet_id based on role change
|
|
if ($input['role'] === 'outlet') {
|
|
// Require outlet_id when changing to Outlet role
|
|
if (!isset($input['outlet_id'])) {
|
|
$response = [
|
|
'status' => 'error',
|
|
'message' => 'Outlet ID is required when role is Outlet.',
|
|
'data' => null
|
|
];
|
|
return $this->respond($response, 422);
|
|
}
|
|
$data['outlet_id'] = $input['outlet_id'];
|
|
} else {
|
|
// Clear outlet_id when changing to non-Outlet role
|
|
$data['outlet_id'] = null;
|
|
}
|
|
}
|
|
|
|
// Handle activeStatus -> status mapping
|
|
if (isset($input['activeStatus'])) {
|
|
$data['status'] = strtolower($input['activeStatus']);
|
|
}
|
|
|
|
// Handle outlet separately if role isn't being changed but user is Outlet
|
|
if (isset($input['outlet']) && $existingUser['role'] === 'outlet') {
|
|
$data['outlet_id'] = $input['outlet'];
|
|
}
|
|
|
|
// Handle menu permissions
|
|
if (isset($input['menuPermissions'])) {
|
|
$menuPermissions = $input['menuPermissions'];
|
|
$permissionsJson = null;
|
|
|
|
if ($menuPermissions && is_array($menuPermissions)) {
|
|
if (!empty($menuPermissions)) {
|
|
$permissionsJson = json_encode($menuPermissions);
|
|
if (json_last_error() !== JSON_ERROR_NONE) {
|
|
$response = [
|
|
'status' => 'error',
|
|
'message' => 'Invalid permissions format.',
|
|
'data' => null
|
|
];
|
|
return $this->respond($response, 400);
|
|
}
|
|
}
|
|
}
|
|
|
|
$data['user_permissions'] = $permissionsJson;
|
|
}
|
|
|
|
// If no fields to update, return an error
|
|
if (empty($data)) {
|
|
$response = [
|
|
'status' => 'error',
|
|
'message' => 'No data provided to update.',
|
|
'data' => null
|
|
];
|
|
return $this->respond($response, 400);
|
|
}
|
|
|
|
// Validate outlet_id if being set
|
|
if (isset($data['outlet_id']) && $data['outlet_id'] !== null) {
|
|
if (!$this->outletModel->find($data['outlet_id'])) {
|
|
$response = [
|
|
'status' => 'error',
|
|
'message' => 'Specified outlet does not exist.',
|
|
'data' => null
|
|
];
|
|
return $this->respond($response, 422);
|
|
}
|
|
}
|
|
|
|
// Add updated_at timestamp
|
|
$data['updated_at'] = date('Y-m-d H:i:s');
|
|
|
|
try {
|
|
// Update user
|
|
$this->user->update($id, $data);
|
|
|
|
// Return updated user data
|
|
$updatedUser = $this->user->find($id);
|
|
|
|
$response = [
|
|
'status' => 'success',
|
|
'message' => 'User updated successfully.',
|
|
'data' => $updatedUser
|
|
];
|
|
return $this->respond($response, 200);
|
|
|
|
} catch (\Exception $e) {
|
|
log_message('error', 'User update failed: ' . $e->getMessage());
|
|
|
|
$response = [
|
|
'status' => 'error',
|
|
'message' => 'Failed to update user.',
|
|
'data' => null
|
|
];
|
|
return $this->respond($response, 500);
|
|
}
|
|
}
|
|
// Delete User Function
|
|
public function delete($id = null)
|
|
{
|
|
$existingUser = $this->user->find($id);
|
|
|
|
if (!$existingUser) {
|
|
$response = [
|
|
'status' => 'error',
|
|
'message' => 'User not found.',
|
|
'data' => null
|
|
];
|
|
return $this->respond($response, 404);
|
|
}
|
|
|
|
$this->user->delete($id);
|
|
|
|
$response = [
|
|
'status' => 'success',
|
|
'message' => 'User deleted successfully.',
|
|
'data' => null
|
|
];
|
|
return $this->respond($response, 200);
|
|
}
|
|
|
|
|
|
}
|