diff --git a/Docs/ACN-coding-test.postman_collection.json b/Docs/ACN-coding-test.postman_collection.json new file mode 100644 index 0000000..8e393e6 --- /dev/null +++ b/Docs/ACN-coding-test.postman_collection.json @@ -0,0 +1,248 @@ +{ + "info": { + "$ref": "#/definitions/info" + }, + "item": [ + { + "name": "User Registration", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"name\": \"Test User\",\n \"email\": \"test22@gmail.com\",\n \"password\": \"test@123\",\n \"role_id\":2\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://127.0.0.1:8000/api/auth/register", + "protocol": "http", + "host": [ + "127", + "0", + "0", + "1" + ], + "port": "8000", + "path": [ + "api", + "auth", + "register" + ] + }, + "description": "Registration API" + }, + "response": [] + }, + { + "name": "Login Api", + "request": { + "method": "POST", + "header": [ + { + "key": "Accept", + "value": "application/json", + "type": "text" + }, + { + "key": "", + "value": "", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"email\": \"test22@gmail.com\" ,\n \"password\": \"test@123\" \n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://127.0.0.1:8000/api/auth/login", + "protocol": "http", + "host": [ + "127", + "0", + "0", + "1" + ], + "port": "8000", + "path": [ + "api", + "auth", + "login" + ] + }, + "description": "Login Api" + }, + "response": [] + }, + { + "name": "Retrieve All Users", + "request": { + "auth": { + "type": "bearer", + "bearer": [ + { + "key": "token", + "value": "{{ADMIN_SESSION_JWT}}", + "type": "string" + } + ] + }, + "method": "GET", + "header": [], + "url": { + "raw": "http://127.0.0.1:8000/api/v1/users", + "protocol": "http", + "host": [ + "127", + "0", + "0", + "1" + ], + "port": "8000", + "path": [ + "api", + "v1", + "users" + ] + }, + "description": "Only ADMIN USER CAN SEE" + }, + "response": [] + }, + { + "name": "Retrieve Single User", + "request": { + "auth": { + "type": "bearer", + "bearer": [ + { + "key": "token", + "value": "{{ADMIN_SESSION_JWT}}", + "type": "string" + } + ] + }, + "method": "GET", + "header": [], + "url": { + "raw": "http://127.0.0.1:8000/api/v1/users/4", + "protocol": "http", + "host": [ + "127", + "0", + "0", + "1" + ], + "port": "8000", + "path": [ + "api", + "v1", + "users", + "4" + ] + }, + "description": "Only Admin User Can See all record and others logged in user can see only their record." + }, + "response": [] + }, + { + "name": "Update User Using Put Method", + "request": { + "auth": { + "type": "bearer", + "bearer": [ + { + "key": "token", + "value": "{{ADMIN_SESSION_JWT}}", + "type": "string" + } + ] + }, + "method": "PUT", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"name\": \"TEST\",\n \"email\": \"test22@gmail.com\",\n \"role_id\":2\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://127.0.0.1:8000/api/v1/users/4", + "protocol": "http", + "host": [ + "127", + "0", + "0", + "1" + ], + "port": "8000", + "path": [ + "api", + "v1", + "users", + "4" + ] + }, + "description": "Only Admin User Can Update." + }, + "response": [] + }, + { + "name": "Update User Using Patch Method", + "request": { + "auth": { + "type": "bearer", + "bearer": [ + { + "key": "token", + "value": "{{ADMIN_SESSION_JWT}}", + "type": "string" + } + ] + }, + "method": "PATCH", + "header": [], + "body": { + "mode": "raw", + "raw": "{\n \"name\": \"test user\"\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://127.0.0.1:8000/api/v1/users/4", + "protocol": "http", + "host": [ + "127", + "0", + "0", + "1" + ], + "port": "8000", + "path": [ + "api", + "v1", + "users", + "4" + ] + }, + "description": "Only Name Can Update" + }, + "response": [] + } + + ] +} \ No newline at end of file diff --git a/app/Http/Controllers/Api/AuthController.php b/app/Http/Controllers/Api/AuthController.php new file mode 100644 index 0000000..7168969 --- /dev/null +++ b/app/Http/Controllers/Api/AuthController.php @@ -0,0 +1,104 @@ +all(), + [ + 'username' => 'required', + 'password' => 'required', + 'role_id' => 'required' + ]); + + if($validateUser->fails()){ + return response()->json([ + 'status' => false, + 'message' => 'validation error', + 'errors' => $validateUser->errors() + ], 401); + } + + $user = User::create([ + 'username' => $request->username, + 'password' => Hash::make($request->password), + 'role_id' => $request->role_id + ]); + + return response()->json([ + 'status' => true, + 'message' => 'User Created Successfully', + 'token' => $user->createToken("API TOKEN")->plainTextToken + ], 200); + + } catch (\Throwable $th) { + return response()->json([ + 'status' => false, + 'message' => $th->getMessage() + ], 500); + } + } + + /** + * Login The User + * @param Request $request + * @return User + */ + public function loginUser(Request $request) + { + try { + $validateUser = Validator::make($request->all(), + [ + 'username' => 'required|username', + 'password' => 'required' + ]); + + if($validateUser->fails()){ + return response()->json([ + 'status' => false, + 'message' => 'validation error', + 'errors' => $validateUser->errors() + ], 401); + } + + if(!Auth::attempt($request->only(['username', 'password']))){ + return response()->json([ + 'status' => false, + 'message' => 'username & Password does not match with our record.', + ], 401); + } + + $user = User::with('userrole')->where('username', $request->username)->first(); + Log::info("enter1=". $user); + + return response()->json([ + 'status' => true, + 'message' => 'User Logged In Successfully', + 'token' => $user->createToken("API TOKEN")->plainTextToken + ], 200); + + } catch (\Throwable $th) { + return response()->json([ + 'status' => false, + 'message' => $th->getMessage() + ], 500); + } + } +} \ No newline at end of file diff --git a/app/Http/Controllers/Api/ProjectController.php b/app/Http/Controllers/Api/ProjectController.php new file mode 100644 index 0000000..0eac0ba --- /dev/null +++ b/app/Http/Controllers/Api/ProjectController.php @@ -0,0 +1,228 @@ +user()->userrole->role_name) == 'PRODUCT_OWNER') { + //Validated + $validateProject = Validator::make($request->all(), + [ + 'name' => 'required', + ]); + + if($validateProject->fails()){ + return response()->json([ + 'status' => false, + 'message' => 'validation error', + 'errors' => $validateProject->errors() + ], 401); + } + + $project = Project::create([ + 'name' => $request->name, + 'user_id' => auth()->user()->id, + ]); + + return response()->json([ + 'status' => true, + 'message' => 'Project Created Successfully', + ], 200); + } + else{ + return response([ + 'message' => 'Only PRODUCT_OWNER Role User Can Create Project.', + ]); + } + + } catch (\Throwable $th) { + return response()->json([ + 'status' => false, + 'message' => $th->getMessage() + ], 500); + } + } + public function get(Request $request) + { + try { + $data = []; + if(strtoupper(auth()->user()->userrole->role_name) == 'ADMIN') { + $data = Project::with('projectUser')->find($request->id); + } else if(strtoupper(auth()->user()->userrole->role_name) == 'PRODUCT_OWNER') { + $data = Project::with('projectUser')->where('user_id','=', auth()->user()->id)->find($request->id); + }else{ + $data = []; + } + if($data){ + http_response_code(200); + return response([ + 'message' => 'Data successfully retrieved.', + 'data' => $data + ]); + } + else{ + http_response_code(200); + return response([ + 'message' => 'No Record Found!!', + ]); + } + } catch (RequestException $r) { + + http_response_code(400); + return response([ + 'message' => 'Failed to retrieve data.', + 'errorCode' => 4103 + ],400); + } + } + public function getAll(Request $request) + { + try { + $data = []; + if(strtoupper(auth()->user()->userrole->role_name) == 'ADMIN') { + + \DB::enableQueryLog(); + ; + $data = Project::with('projectUser')->where('name','LIKE','%'.$request->q.'%')->orderby($request->sortBy,$request->sortDirection)->paginate($request->pageSize); + $data->count(); + } else if(strtoupper(auth()->user()->userrole->role_name) == 'PRODUCT_OWNER') { + $data = Project::with('projectUser')->where('user_id','=', auth()->user()->id)->where('name','LIKE','%'.$request->q.'%')->orderby($request->sortBy,$request->sortDirection)->paginate($request->pageSize); + $data->count(); + }else{ + return response([ + 'message' => 'Unauthorized User!!', + ]); + } + + + http_response_code(200); + return response([ + 'message' => 'Data successfully retrieved.', + 'data' => $data + ]); + } catch (RequestException $r) { + + http_response_code(400); + return response([ + 'message' => 'Failed to retrieve data.', + 'errorCode' => 4103 + ],400); + } + } + public function update(Request $request, $id) + { + try { + $data = Project::findOrFail($id); + if(strtoupper(auth()->user()->userrole->role_name) == 'PRODUCT_OWNER' && auth()->user()->id == $data->user_id) { + $validateProject = Validator::make($request->all(), + [ + 'name' => 'required', + ]); + + if($validateProject->fails()){ + return response()->json([ + 'status' => false, + 'message' => 'validation error', + 'errors' => $validateProject->errors() + ], 401); + } + + $data->name = $request->name; + $data->save(); + + return response([ + 'message' => 'Update Successful', + ]); + }else{ + return response([ + 'message' => 'Only Owner Can Update Project', + ]); + } + + } catch (RequestException $r) { + + http_response_code(400); + return response([ + 'message' => 'Data failed to be updated Project.', + 'errorCode' => 4101, + ], 400); + } + } + public function patchupdate(Request $request, $id) + { + try { + $data = Project::findOrFail($id); + if(strtoupper(auth()->user()->userrole->role_name) == 'PRODUCT_OWNER' && auth()->user()->id == $data->user_id) { + $validateProject = Validator::make($request->all(), + [ + 'name' => 'required', + ]); + + if($validateProject->fails()){ + return response()->json([ + 'status' => false, + 'message' => 'validation error', + 'errors' => $validateProject->errors() + ], 401); + } + + $data->name = $request->name; + $data->save(); + + http_response_code(200); + return response([ + 'message' => 'Update Successful', + ]); + }else{ + return response([ + 'message' => 'Only Owner Can Update Project', + ]); + } + + } catch (RequestException $r) { + + http_response_code(400); + return response([ + 'message' => 'Data failed to be updated Project.', + 'errorCode' => 4101, + ], 400); + } + } + public function delete($id) + { + try { + $data = Project::find($id); + if(strtoupper(auth()->user()->userrole->role_name) == 'PRODUCT_OWNER' && auth()->user()->id == $data->user_id) { + $data->delete(); + return response([ + 'message' => 'Data successfully deleted.', + ]); + }else{ + return response([ + 'message' => 'Only Owner Can Delete Project', + ]); + } + + } catch (RequestException $r) { + + http_response_code(400); + return response([ + 'message' => 'Data failed to be deleted.', + 'errorCode' => 4102, + ], 400); + } + } +} \ No newline at end of file diff --git a/app/Http/Controllers/Api/TaskController.php b/app/Http/Controllers/Api/TaskController.php new file mode 100644 index 0000000..59a7a9f --- /dev/null +++ b/app/Http/Controllers/Api/TaskController.php @@ -0,0 +1,271 @@ +user()->userrole->role_name) == 'PRODUCT_OWNER') { + $validateTask = Validator::make($request->all(), + [ + 'title' => 'required', + 'user_id' => 'required', + 'project_id' => 'required', + ]); + + if($validateTask->fails()){ + return response()->json([ + 'status' => false, + 'message' => 'validation error', + 'errors' => $validateTask->errors() + ], 401); + } + $task = Task::create([ + 'title' => $request->title, + 'description' => $request->description, + 'status_id' => 1, + 'user_id' => $request->user_id, + 'project_id' => $request->project_id, + ]); + + return response()->json([ + 'status' => true, + 'message' => 'Task Created Successfully', + ], 200); + }else{ + return response([ + 'message' => 'Only PRODUCT_OWNER Role User Can Create Task.', + ]); + } + + } catch (\Throwable $th) { + return response()->json([ + 'status' => false, + 'message' => $th->getMessage() + ], 500); + } + } + public function get(Request $request) + { + try { + if(strtoupper(auth()->user()->userrole->role_name) == 'ADMIN') { + $data = Task::with(['taskUser' => function ($q) { + return $q->select('id', 'name'); + }, 'taskProject' => function ($q) { + return $q->select('id', 'name','user_id'); + }, 'taskStatus' => function ($q) { + return $q->select('id', 'status'); + }])->find($request->id); + }else if(strtoupper(auth()->user()->userrole->role_name) == 'PRODUCT_OWNER') { + $data = Task::with(['taskUser' => function ($q) { + return $q->select('id', 'name'); + }, 'taskProject' => function ($q) { + return $q->select('id', 'name','user_id'); + }, 'taskStatus' => function ($q) { + return $q->select('id', 'status'); + }])->whereHas('taskProject', function ($q) { + return $q->where('user_id', '=', auth()->user()->id); + })->find($request->id); + }else if(strtoupper(auth()->user()->userrole->role_name) == 'TEAM_MEMBER') { + $data = Task::with(['taskUser' => function ($q) { + return $q->select('id', 'name'); + }, 'taskProject' => function ($q) { + return $q->select('id', 'name','user_id'); + }, 'taskStatus' => function ($q) { + return $q->select('id', 'status'); + }])->where('user_id', '=', auth()->user()->id)->find($request->id); + } + if($data){ + http_response_code(200); + return response([ + 'message' => 'Data successfully retrieved.', + 'data' => $data + ]); + } + else{ + http_response_code(200); + return response([ + 'message' => 'No Record Found!!', + ]); + } + } catch (RequestException $r) { + + http_response_code(400); + return response([ + 'message' => 'Failed to retrieve data.', + 'errorCode' => 4103 + ],400); + } + } + public function getAll(Request $request) + { + try { + $data = []; + if(strtoupper(auth()->user()->userrole->role_name) == 'ADMIN') { + $data = Task::with(['taskUser' => function ($q) { + return $q->select('id', 'name'); + }, 'taskProject' => function ($q) { + return $q->select('id', 'name','user_id'); + }, 'taskStatus' => function ($q) { + return $q->select('id', 'status'); + }])->orderby('id', 'desc')->get(); + }else if(strtoupper(auth()->user()->userrole->role_name) == 'PRODUCT_OWNER') { + $data = Task::with(['taskUser' => function ($q) { + return $q->select('id', 'name'); + }, 'taskProject' => function ($q) { + return $q->select('id', 'name','user_id'); + }, 'taskStatus' => function ($q) { + return $q->select('id', 'status'); + }])->whereHas('taskProject', function ($q) { + return $q->where('user_id', '=', auth()->user()->id); + })->orderby('id', 'desc')->get(); + }else if(strtoupper(auth()->user()->userrole->role_name) == 'TEAM_MEMBER') { + $data = Task::with(['taskUser' => function ($q) { + return $q->select('id', 'name'); + }, 'taskProject' => function ($q) { + return $q->select('id', 'name','user_id'); + }, 'taskStatus' => function ($q) { + return $q->select('id', 'status'); + }])->orderby('id', 'desc')->where('user_id', '=', auth()->user()->id)->get(); + } + // return view('tasklist', compact('pro')); + return response([ + 'message' => 'Data successfully retrieved.', + 'data' => $data + ]); + } catch (RequestException $r) { + + http_response_code(400); + return response([ + 'message' => 'Failed to retrieve data.', + 'errorCode' => 4103 + ],400); + } + } + public function update(Request $request, $id) + { + try { + $data = Task::findOrFail($id); + if(strtoupper(auth()->user()->userrole->role_name) == 'PRODUCT_OWNER') { + $validateTask = Validator::make($request->all(), + [ + 'title' => 'required' + ]); + + if($validateTask->fails()){ + return response()->json([ + 'status' => false, + 'message' => 'validation error', + 'errors' => $validateTask->errors() + ], 401); + } + + $data->title = $request->title; + $data->description = $request->description; + // $data->status_id = $request->status_id; + $data->user_id = $request->user_id; + $data->project_id = $request->project_id; + $data->save(); + + http_response_code(200); + return response([ + 'message' => 'Update Successful', + ]); + } + else{ + return response([ + 'message' => 'Only Owner Can Update Task', + ]); + } + + } catch (RequestException $r) { + + http_response_code(400); + return response([ + 'message' => 'Data failed to be updated.', + 'errorCode' => 4101, + ], 400); + } + } + public function patchupdate(Request $request, $id) + { + try { + $data = Task::findOrFail($id); + if(strtoupper(auth()->user()->userrole->role_name) == 'TEAM_MEMBER') { + + if(auth()->user()->id != $data->user_id){ + return response([ + 'message' => 'This is not your Task', + ]); + } + $validateTask = Validator::make($request->all(), + [ + 'status_id' => 'required', + ]); + if($validateTask->fails()){ + return response()->json([ + 'status' => false, + 'message' => 'validation error', + 'errors' => $validateTask->errors() + ], 401); + } + $data->status_id = $request->status_id; + $data->save(); + return response([ + 'message' => 'Update Successful', + 'data' => $data + ]); + }else{ + return response([ + 'message' => 'Only Team Member Can Update Task Status', + ]); + } + + } catch (RequestException $r) { + + http_response_code(400); + return response([ + 'message' => 'Data failed to be updated.', + 'errorCode' => 4101, + ], 400); + } + } + public function delete($id) + { + try { + if(strtoupper(auth()->user()->userrole->role_name) == 'PRODUCT_OWNER') { + $data = Task::find($id); + $data->delete(); + + http_response_code(200); + return response([ + 'message' => 'Data successfully deleted.', + ]); + }else{ + return response([ + 'message' => 'Only Owner Can Delete Task', + ]); + } + + } catch (RequestException $r) { + + http_response_code(400); + return response([ + 'message' => 'Data failed to be deleted.', + 'errorCode' => 4102, + ], 400); + } + } +} \ No newline at end of file diff --git a/app/Http/Controllers/Api/UserController.php b/app/Http/Controllers/Api/UserController.php new file mode 100644 index 0000000..722a078 --- /dev/null +++ b/app/Http/Controllers/Api/UserController.php @@ -0,0 +1,152 @@ +user_id); + + if($data){ + http_response_code(200); + return response([ + 'message' => 'Successfull', + 'data' => $data + ]); + } + else{ + http_response_code(200); + return response([ + 'message' => 'No Record Found', + ]); + } + } catch (RequestException $r) { + + http_response_code(400); + return response([ + 'message' => 'Failed', + 'errorCode' => 4103 + ],400); + } + } + public function getAll(Request $request) + { + try { + $data = User::orderby('id', 'desc')->get(); + http_response_code(200); + return response([ + 'message' => 'Successfull', + 'data' => $data + ]); + } catch (RequestException $r) { + + http_response_code(400); + return response([ + 'message' => 'Failed', + 'errorCode' => 4103 + ],400); + } + } + public function update(Request $request, $id) + { + // Log::info("update=". $request->name); + $validateUser = Validator::make($request->all(), + [ + 'username' => 'required', + 'role_id' => 'required' + ]); + + if($validateUser->fails()){ + return response()->json([ + 'status' => false, + 'message' => 'validation error', + 'errors' => $validateUser->errors() + ], 401); + } + try { + $data = User::findOrFail($id); + $data->username = $request->username; + $data->role_id = $request->role_id; + $data->save(); + + http_response_code(200); + return response([ + 'message' => 'Update Successful', + ]); + + } catch (RequestException $r) { + + http_response_code(400); + return response([ + 'message' => 'Data failed to be updated.', + 'errorCode' => 4101, + ], 400); + } + } + public function patchupdate(Request $request, $id) + { + // Log::info("update=". $request->name); + $validateUser = Validator::make($request->all(), + [ + 'username' => 'required', + 'role_id' => 'required' + ]); + + if($validateUser->fails()){ + return response()->json([ + 'status' => false, + 'message' => 'validation error', + 'errors' => $validateUser->errors() + ], 401); + } + try { + $data = User::findOrFail($id); + $data->name = $request->name; + $data->email = $request->email; + $data->role_id = $request->role_id; + $data->save(); + + http_response_code(200); + return response([ + 'message' => 'Update Successful', + ]); + + } catch (RequestException $r) { + + http_response_code(400); + return response([ + 'message' => 'Data failed to be updated', + 'errorCode' => 4101, + ], 400); + } + } + public function delete($id) + { + try { + $data = User::find($id); + $data->delete(); + + http_response_code(200); + return response([ + 'message' => 'Data successfully deleted', + ]); + } catch (RequestException $r) { + + http_response_code(400); + return response([ + 'message' => 'Data failed to be deleted', + 'errorCode' => 4102, + ], 400); + } + } +} \ No newline at end of file diff --git a/app/Http/Controllers/Api/UserRoleController.php b/app/Http/Controllers/Api/UserRoleController.php new file mode 100644 index 0000000..4b3a211 --- /dev/null +++ b/app/Http/Controllers/Api/UserRoleController.php @@ -0,0 +1,180 @@ +all(), + [ + 'role_name' => 'required', + ]); + + if($validateRole->fails()){ + return response()->json([ + 'status' => false, + 'message' => 'validation error', + 'errors' => $validateRole->errors() + ], 401); + } + + $role = UserRole::create([ + 'role_name' => $request->role_name, + ]); + + return response()->json([ + 'status' => true, + 'message' => 'User Role Created Successfully', + ], 200); + + } catch (\Throwable $th) { + return response()->json([ + 'status' => false, + 'message' => $th->getMessage() + ], 500); + } + } + public function get(Request $request) + { + try { + $data = UserRole::find($request->id); + + if($data){ + http_response_code(200); + return response([ + 'message' => 'Data successfully retrieved.', + 'data' => $data + ]); + } + else{ + http_response_code(200); + return response([ + 'message' => 'No Record Found!!', + ]); + } + } catch (RequestException $r) { + + http_response_code(400); + return response([ + 'message' => 'Failed to retrieve data.', + 'errorCode' => 4103 + ],400); + } + } + public function getAll(Request $request) + { + try { + $data = Role::orderby('id', 'desc')->get(); + + http_response_code(200); + return response([ + 'message' => 'Data successfully retrieved.', + 'data' => $data + ]); + } catch (RequestException $r) { + + http_response_code(400); + return response([ + 'message' => 'Failed to retrieve data.', + 'errorCode' => 4103 + ],400); + } + } + public function update(Request $request, $id) + { + $validateRole = Validator::make($request->all(), + [ + 'role_name' => 'required', + ]); + + if($validateRole->fails()){ + return response()->json([ + 'status' => false, + 'message' => 'validation error', + 'errors' => $validateRole->errors() + ], 401); + } + try { + $data = Role::findOrFail($id); + $data->role_name = $request->role_name; + $data->save(); + + http_response_code(200); + return response([ + 'message' => 'Update Successful', + ]); + + } catch (RequestException $r) { + + http_response_code(400); + return response([ + 'message' => 'Data failed to be updated.', + 'errorCode' => 4101, + ], 400); + } + } + public function patchupdate(Request $request, $id) + { + $validateRole = Validator::make($request->all(), + [ + 'role_name' => 'required', + ]); + + if($validateRole->fails()){ + return response()->json([ + 'status' => false, + 'message' => 'validation error', + 'errors' => $validateRole->errors() + ], 401); + } + try { + $data = Role::findOrFail($id); + $data->role_name = $request->role_name; + $data->save(); + + http_response_code(200); + return response([ + 'message' => 'Update Successful', + ]); + + } catch (RequestException $r) { + + http_response_code(400); + return response([ + 'message' => 'Data failed to be updated.', + 'errorCode' => 4101, + ], 400); + } + } + public function delete($id) + { + try { + $data = Role::find($id); + $data->delete(); + + http_response_code(200); + return response([ + 'message' => 'Data successfully deleted.', + ]); + + } catch (RequestException $r) { + + http_response_code(400); + return response([ + 'message' => 'Data failed to be deleted.', + 'errorCode' => 4102, + ], 400); + } + } +} \ No newline at end of file diff --git a/app/Http/Controllers/Api/taskStatusController.php b/app/Http/Controllers/Api/taskStatusController.php new file mode 100644 index 0000000..1eb6a03 --- /dev/null +++ b/app/Http/Controllers/Api/taskStatusController.php @@ -0,0 +1,180 @@ +all(), + [ + 'status' => 'required', + ]); + + if($validateStatus->fails()){ + return response()->json([ + 'status' => false, + 'message' => 'validation error', + 'errors' => $validateStatus->errors() + ], 401); + } + + $status = TaskStatus::create([ + 'status' => $request->status, + ]); + + return response()->json([ + 'status' => true, + 'message' => 'User Role Created Successfully', + ], 200); + + } catch (\Throwable $th) { + return response()->json([ + 'status' => false, + 'message' => $th->getMessage() + ], 500); + } + } + public function get(Request $request) + { + try { + $data = TaskStatus::find($request->id); + + if($data){ + http_response_code(200); + return response([ + 'message' => 'Data successfully retrieved.', + 'data' => $data + ]); + } + else{ + http_response_code(200); + return response([ + 'message' => 'No Record Found!!', + ]); + } + } catch (RequestException $r) { + + http_response_code(400); + return response([ + 'message' => 'Failed to retrieve data.', + 'errorCode' => 4103 + ],400); + } + } + public function getAll(Request $request) + { + try { + $data = TaskStatus::orderby('id', 'desc')->get(); + + http_response_code(200); + return response([ + 'message' => 'Data successfully retrieved.', + 'data' => $data + ]); + } catch (RequestException $r) { + + http_response_code(400); + return response([ + 'message' => 'Failed to retrieve data.', + 'errorCode' => 4103 + ],400); + } + } + public function update(Request $request, $id) + { + $validateStatus = Validator::make($request->all(), + [ + 'status' => 'required', + ]); + + if($validateStatus->fails()){ + return response()->json([ + 'status' => false, + 'message' => 'validation error', + 'errors' => $validateStatus->errors() + ], 401); + } + try { + $data = TaskStatus::findOrFail($id); + $data->status = $request->status; + $data->save(); + + http_response_code(200); + return response([ + 'message' => 'Update Successful', + ]); + + } catch (RequestException $r) { + + http_response_code(400); + return response([ + 'message' => 'Data failed to be updated.', + 'errorCode' => 4101, + ], 400); + } + } + public function patchupdate(Request $request, $id) + { + $validateStatus = Validator::make($request->all(), + [ + 'status' => 'required', + ]); + + if($validateStatus->fails()){ + return response()->json([ + 'status' => false, + 'message' => 'validation error', + 'errors' => $validateStatus->errors() + ], 401); + } + try { + $data = TaskStatus::findOrFail($id); + $data->status = $request->status; + $data->save(); + + http_response_code(200); + return response([ + 'message' => 'Update Successful', + ]); + + } catch (RequestException $r) { + + http_response_code(400); + return response([ + 'message' => 'Data failed to be updated.', + 'errorCode' => 4101, + ], 400); + } + } + public function delete($id) + { + try { + $data = TaskStatus::find($id); + $data->delete(); + + http_response_code(200); + return response([ + 'message' => 'Data successfully deleted.', + ]); + + } catch (RequestException $r) { + + http_response_code(400); + return response([ + 'message' => 'Data failed to be deleted.', + 'errorCode' => 4102, + ], 400); + } + } +} \ No newline at end of file diff --git a/app/Models/Project.php b/app/Models/Project.php new file mode 100644 index 0000000..669665a --- /dev/null +++ b/app/Models/Project.php @@ -0,0 +1,22 @@ +hasOne('App\Models\User', 'id', 'user_id'); + } +} \ No newline at end of file diff --git a/app/Models/Role.php b/app/Models/Role.php new file mode 100644 index 0000000..cc5de93 --- /dev/null +++ b/app/Models/Role.php @@ -0,0 +1,14 @@ +hasOne('App\Models\User', 'id', 'user_id'); + } + public function taskProject() + { + return $this->belongsTo('App\Models\Project', 'project_id'); + } + public function taskStatus() + { + return $this->hasOne('App\Models\TaskStatus', 'id', 'status_id'); + } +} \ No newline at end of file diff --git a/app/Models/TaskStatus.php b/app/Models/TaskStatus.php new file mode 100644 index 0000000..bb123b6 --- /dev/null +++ b/app/Models/TaskStatus.php @@ -0,0 +1,14 @@ + */ protected $fillable = [ - 'name', - 'email', + 'username', 'password', + 'role_id', ]; /** @@ -41,4 +41,8 @@ class User extends Authenticatable protected $casts = [ 'email_verified_at' => 'datetime', ]; + public function userRole() + { + return $this->hasOne('App\Models\UserRole', 'id', 'role_id'); + } } diff --git a/database/migrations/2014_10_12_000000_create_users_table.php b/database/migrations/2014_10_12_000000_create_users_table.php index 621a24e..b46d3cd 100644 --- a/database/migrations/2014_10_12_000000_create_users_table.php +++ b/database/migrations/2014_10_12_000000_create_users_table.php @@ -15,10 +15,9 @@ public function up() { Schema::create('users', function (Blueprint $table) { $table->id(); - $table->string('name'); - $table->string('email')->unique(); - $table->timestamp('email_verified_at')->nullable(); - $table->string('password'); + $table->string('username'); + $table->string('password'); + $table->timestamp('email_verified_at')->nullable(); $table->rememberToken(); $table->timestamps(); }); diff --git a/database/migrations/2023_03_10_085339_create_projects_table.php b/database/migrations/2023_03_10_085339_create_projects_table.php new file mode 100644 index 0000000..b0bde15 --- /dev/null +++ b/database/migrations/2023_03_10_085339_create_projects_table.php @@ -0,0 +1,36 @@ +id(); + $table->string('name')->unique(); + $table->biginteger('user_id')->unsigned(); + $table->timestamps(); + }); + Schema::table('tasks', function($table) { + $table->foreign('user_id')->references('id')->on('users'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('projects'); + } +} \ No newline at end of file diff --git a/database/migrations/2023_03_10_085825_create_tasks_table.php b/database/migrations/2023_03_10_085825_create_tasks_table.php new file mode 100644 index 0000000..60884fe --- /dev/null +++ b/database/migrations/2023_03_10_085825_create_tasks_table.php @@ -0,0 +1,41 @@ +id(); + $table->string('title'); + $table->string('description')->nullable(); + $table->biginteger('status_id')->unsigned(); + $table->biginteger('user_id')->unsigned(); + $table->biginteger('project_id')->unsigned(); + $table->timestamps(); + }); + Schema::table('tasks', function($table) { + $table->foreign('user_id')->references('id')->on('users'); + $table->foreign('project_id')->references('id')->on('projects'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('tasks'); + } +} + \ No newline at end of file diff --git a/database/migrations/2023_03_10_090058_create_roles_table.php b/database/migrations/2023_03_10_090058_create_roles_table.php new file mode 100644 index 0000000..002949a --- /dev/null +++ b/database/migrations/2023_03_10_090058_create_roles_table.php @@ -0,0 +1,32 @@ +id(); + $table->string('name'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('roles'); + } +} \ No newline at end of file diff --git a/database/migrations/2023_03_10_140838_create_task_statuses_table.php b/database/migrations/2023_03_10_140838_create_task_statuses_table.php new file mode 100644 index 0000000..72fb034 --- /dev/null +++ b/database/migrations/2023_03_10_140838_create_task_statuses_table.php @@ -0,0 +1,32 @@ +id(); + $table->string('status',200); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('task_statuses'); + } +} \ No newline at end of file diff --git a/routes/api.php b/routes/api.php index eb6fa48..a9e3d0a 100644 --- a/routes/api.php +++ b/routes/api.php @@ -2,6 +2,7 @@ use Illuminate\Http\Request; use Illuminate\Support\Facades\Route; +use App\Http\Controllers\Api\UserController; /* |-------------------------------------------------------------------------- @@ -14,6 +15,11 @@ | */ -Route::middleware('auth:sanctum')->get('/user', function (Request $request) { - return $request->user(); +Route::group(['middleware' => ['auth:sanctum']], function () { + Route::name('users')->get('/v1/users', [UserController::class, 'index']); + Route::name('users')->get('/v1/users/{id}', [UserController::class, 'show']); + Route::name('users')->post('/v1/users',[UserController::class, 'store']); + Route::name('users')->put('/v1/users/{id}',[UserController::class, 'update']); + Route::name('users')->delete('/v1/users/{id}',[UserController::class, 'destroy']); + Route::name('users')->patch('/v1/users/{id}',[UserController::class, 'edit']); }); diff --git a/tests/Feature/ProjectTest.php b/tests/Feature/ProjectTest.php new file mode 100644 index 0000000..1615c40 --- /dev/null +++ b/tests/Feature/ProjectTest.php @@ -0,0 +1,70 @@ +get('/api/v1/projects'); + + $response->assertStatus(302); + } + + public function test_project_create_with_user_role_product_owner() + { + $user = User::where('role_id', '=', 2)->first(); //role = product owner + $project = [ + 'name' => 'Project 1', + 'user_id' => $user->id + ]; + $response = $this->actingAs($user) + ->withSession(['banned' => false]) + ->post('/api/v1/projects', $project); + $statusCode = $response->getStatusCode(); + if ($statusCode == 500){ //because project name unique, cant craete duplicate. + $response->assertStatus(500); + }else{ + $response->assertStatus(200); + } + $lp = Project::latest()->first(); + if ($statusCode == 200){ + $userTeams = User::where('role_id', '=', 3)->take(2)->get(); + foreach($userTeams as $key => $ut){ + $this->create_task($this->actingAs($user), $key, $ut, $user, $lp); + } + } + } + + + public function create_task($actingAs, $key, $ut, $user, $lp){ + $task = [ + 'title' => 'Task ' . $key, + 'description' => 'Task ' . $key, + 'project_id' => $lp->id, + 'status_id' => 1, //1 refers not startecd the task yet + 'user_id' => $ut->id, + ]; + $response = $actingAs + ->withSession(['banned' => false]) + ->post('/api/v1/tasks', $task); + $statusCode = $response->getStatusCode(); + if ($statusCode == 500){ + $response->assertStatus(500); + }else{ + $response->assertStatus(200); + } + } +} diff --git a/tests/Feature/TaskTest.php b/tests/Feature/TaskTest.php new file mode 100644 index 0000000..8643b62 --- /dev/null +++ b/tests/Feature/TaskTest.php @@ -0,0 +1,35 @@ +first(); + $task = Task::where('status_id', '=', 1)->where('user_id', '=', $user->id)->first(); + if($task){ + $ts = [ + 'status_id' => 2, //2 refers status IN_PROGRESS + ]; + $response = $this->actingAs($user) + ->withSession(['banned' => false]) + ->patch('/api/v1/tasks/'. $task->id, $ts); + $statusCode = $response->getStatusCode(); + if ($statusCode == 500){ + $response->assertStatus(500); + }else{ + $response->assertStatus(200); + } + }else{ + $this->assertTrue(true); + } + } +} \ No newline at end of file diff --git a/tests/Feature/UserTest.php b/tests/Feature/UserTest.php new file mode 100644 index 0000000..175587e --- /dev/null +++ b/tests/Feature/UserTest.php @@ -0,0 +1,90 @@ +get('/users'); + + $response->assertStatus(404); + } + public function test_user_product_owner_register() + { + $user = [ + 'username' => 'Product Owner', + 'password' => 'passwordtest', + 'role_id' => 2 // PRODUCT_OWNER + ]; + + $response = $this->post('/api/auth/register', $user); + $statusCode = $response->getStatusCode(); + if ($statusCode == 401){ + $response->assertStatus(401); + }else{ + $response->assertStatus(200); + } + } + + public function test_user_team_member_one_register() + { + $user = [ + 'username' => 'Team Member 1', + 'password' => 'passwordtest', + 'role_id' => 3 // TEAM_MEMBER + ]; + + $response = $this->post('/api/auth/register', $user); + $statusCode = $response->getStatusCode(); + if ($statusCode == 401){ + $response->assertStatus(401); + }else{ + $response->assertStatus(200); + } + } + + public function test_user_team_member_two_register() + { + $user = [ + 'username' => 'Team Member 2', + 'password' => 'passwordtest', + 'role_id' => 3 // TEAM_MEMBER + ]; + + $response = $this->post('/api/auth/register', $user); + $statusCode = $response->getStatusCode(); + if ($statusCode == 401){ + $response->assertStatus(401); + }else{ + $response->assertStatus(200); + } + } + + public function test_user_team_member_three_register() + { + $user = [ + 'username' => 'Team Member 3', + 'password' => 'passwordtest', + 'role_id' => 3 // TEAM_MEMBER + ]; + + $response = $this->post('/api/auth/register', $user); + $statusCode = $response->getStatusCode(); + if ($statusCode == 401){ + $response->assertStatus(401); + }else{ + $response->assertStatus(200); + } + } +}