From 5d52deaa50926d1c8c595e8897d147d9616d818e Mon Sep 17 00:00:00 2001 From: anoop jain Date: Sat, 4 Mar 2023 09:56:13 +0530 Subject: [PATCH 1/5] Create REST APIs --- routes/api.php | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/routes/api.php b/routes/api.php index eb6fa48..3de3e98 100644 --- a/routes/api.php +++ b/routes/api.php @@ -14,6 +14,26 @@ | */ +/* Route::middleware('auth:sanctum')->get('/user', function (Request $request) { return $request->user(); +});*/ + + +Route::group(['prefix'=>'v1'], function (){ + Route::get("users/{id?}",[UserController::class, 'getresources']); + Route::post("users",[UserController::class, 'createresource']); + Route::put("users/{id}",[UserController::class, 'updateresource']); + Route::delete("users/{id}",[UserController::class, 'deleteresource']); + + Route::get("projects/{id?}",[ProjectController::class, 'getprojects']); + Route::post("projects",[ProjectController::class, 'createproject']); + Route::put("projects/{id}",[ProjectController::class, 'updateproject']); + Route::delete("projects/{id}",[ProjectController::class, 'deleteproject']); + + Route::get("tasks/{id?}",[TaskController::class, 'getTasks']); + Route::post("tasks",[TaskController::class, 'createtask']); + Route::put("tasks/{id}",[TaskController::class, 'updatetask']); + Route::delete("tasks/{id}",[TaskController::class, 'deletetask']); + }); From c2e17d076cad8931e072d03b40f70eb8cacf2dc0 Mon Sep 17 00:00:00 2001 From: anoop jain Date: Sat, 4 Mar 2023 10:23:01 +0530 Subject: [PATCH 2/5] Create models --- app/Http/Controllers/ProjectController.php | 52 ++++++++++++++++ app/Http/Controllers/TaskController.php | 60 +++++++++++++++++++ app/Http/Controllers/UserController.php | 57 ++++++++++++++++++ app/Models/Project.php | 16 +++++ app/Models/Task.php | 20 +++++++ app/Models/User.php | 3 +- app/Traits/UUID.php | 29 +++++++++ .../2014_10_12_000000_create_users_table.php | 5 +- ...023_03_03_034916_create_projects_table.php | 32 ++++++++++ .../2023_03_03_035104_create_tasks_table.php | 51 ++++++++++++++++ routes/api.php | 10 +++- 11 files changed, 329 insertions(+), 6 deletions(-) create mode 100644 app/Http/Controllers/ProjectController.php create mode 100644 app/Http/Controllers/TaskController.php create mode 100644 app/Http/Controllers/UserController.php create mode 100644 app/Models/Project.php create mode 100644 app/Models/Task.php create mode 100644 app/Traits/UUID.php create mode 100644 database/migrations/2023_03_03_034916_create_projects_table.php create mode 100644 database/migrations/2023_03_03_035104_create_tasks_table.php diff --git a/app/Http/Controllers/ProjectController.php b/app/Http/Controllers/ProjectController.php new file mode 100644 index 0000000..b8372b3 --- /dev/null +++ b/app/Http/Controllers/ProjectController.php @@ -0,0 +1,52 @@ +0)){ + return $result; + }else{ + return response()->json(['message'=>'No Data Found']); + } + } + + function createproject(Request $req){ + $project = new Project; + $project->name=$req->input('name'); + $project->save(); + return $project; + } + + function updateproject(Request $req){ + $project = Project::find($req->id); + $project->name=$req->input('name'); + $result=$project->save(); + + if($result){ + return response()->json(['message'=>'Successfully Updated']); + }else{ + return response()->json(['message'=>'Update Failed']); + } + } + + function deleteproject(Request $req){ + $project = Project::find($req->id); + $result = $project->delete(); + if($result){ + return response()->json(['message'=>'Successfully Deleted']); + }else{ + return response()->json(['message'=>'Delete Failed']); + } + } +} diff --git a/app/Http/Controllers/TaskController.php b/app/Http/Controllers/TaskController.php new file mode 100644 index 0000000..1636ed0 --- /dev/null +++ b/app/Http/Controllers/TaskController.php @@ -0,0 +1,60 @@ +0)){ + return $result; + }else{ + return response()->json(['message'=>'No Data Found']); + } + } + + function createtask(Request $req){ + $task = new Task; + $task->title=$req->input('title'); + $task->description =$req->input('description'); + $task->status=$req->input('status'); + $task->project_id=$req->input('project_id'); + $task->user_id=$req->input('user_id'); + $task->save(); + return $task; + } + + function updatetask(Request $req){ + $task = Task::find($req->id); + $task->title=$req->input('title'); + $task->description =$req->input('description'); + $task->status=$req->input('status'); + $task->project_id=$req->input('project_id'); + $task->user_id=$req->input('user_id'); + $result=$task->save(); + + if($result){ + return response()->json(['message'=>'Successfully Updated']); + }else{ + return response()->json(['message'=>'Update Failed']); + } + } + + function deletetask(Request $req){ + $task = Task::find($req->id); + $result = $task->delete(); + if($result){ + return response()->json(['message'=>'Successfully Deleted']); + }else{ + return response()->json(['message'=>'Delete Failed']); + } + } +} diff --git a/app/Http/Controllers/UserController.php b/app/Http/Controllers/UserController.php new file mode 100644 index 0000000..2741c78 --- /dev/null +++ b/app/Http/Controllers/UserController.php @@ -0,0 +1,57 @@ +0)){ + return $result; + }else{ + return response()->json(['message'=>'No Data Found']); + } + } + + function createresource(Request $req){ + $user = new User; + $user->name=$req->input('name'); + $user->email=$req->input('email'); + $user->password=md5($req->input('password')); + $user->save(); + return $user; + } + + function updateresource(Request $req){ + $user = User::find($req->id); + $user->name=$req->input('name'); + $user->email->$req->input('email'); + $result=$device->save(); + + if($result){ + return response()->json(['message'=>'Successfully Updated']); + }else{ + return response()->json(['message'=>'Update Failed']); + } + } + + function deleteresource(Request $req){ + $user = User::find($req->id); + $result = $user->delete(); + if($result){ + return response()->json(['message'=>'Successfully Deleted']); + }else{ + return response()->json(['message'=>'Delete Failed']); + } + } + + +} diff --git a/app/Models/Project.php b/app/Models/Project.php new file mode 100644 index 0000000..a46b129 --- /dev/null +++ b/app/Models/Project.php @@ -0,0 +1,16 @@ +getKey() === null) { + $model->setAttribute($model->getKeyName(), Str::uuid()->toString()); + } + }); + } + + public function getIncrementing() + { + return false; + } + + public function getKeyType() + { + return 'string'; + } + +} + +?> \ No newline at end of file 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..bb5c446 100644 --- a/database/migrations/2014_10_12_000000_create_users_table.php +++ b/database/migrations/2014_10_12_000000_create_users_table.php @@ -14,11 +14,12 @@ class CreateUsersTable extends Migration public function up() { Schema::create('users', function (Blueprint $table) { - $table->id(); - $table->string('name'); + $table->uuid('id')->primary(); + $table->string('name')->unique(); $table->string('email')->unique(); $table->timestamp('email_verified_at')->nullable(); $table->string('password'); + $table->enum('role',['ADMIN','PRODUCT_OWNER','TEAM_MEMBER'])->default('TEAM_MEMBER'); $table->rememberToken(); $table->timestamps(); }); diff --git a/database/migrations/2023_03_03_034916_create_projects_table.php b/database/migrations/2023_03_03_034916_create_projects_table.php new file mode 100644 index 0000000..a49f5db --- /dev/null +++ b/database/migrations/2023_03_03_034916_create_projects_table.php @@ -0,0 +1,32 @@ +uuid('id')->primary(); + $table->string('name')->unique(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('projects'); + } +} diff --git a/database/migrations/2023_03_03_035104_create_tasks_table.php b/database/migrations/2023_03_03_035104_create_tasks_table.php new file mode 100644 index 0000000..16a925e --- /dev/null +++ b/database/migrations/2023_03_03_035104_create_tasks_table.php @@ -0,0 +1,51 @@ +uuid('id')->primary(); + $table->string('title')->nullable(false); + $table->string('description')->nullable(); + $table->enum('status',['NOT_STARTED','IN_PROGRESS','READY_FOR_TEST','COMPLETED'])->default('NOT_STARTED'); + $table->uuid('project_id'); + $table->foreign('project_id') + ->references('id') + ->on('projects') + ->nullable(false) + ->onDelete('restrict') + ->onUpdate('restrict'); + $table->uuid('user_id'); + $table->foreign('user_id') + ->references('id') + ->on('users') + ->nullable(false) + ->onDelete('restrict') + ->onUpdate('restrict'); + + $table->timestamps(); + + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('tasks'); + } +} diff --git a/routes/api.php b/routes/api.php index 3de3e98..ec4c1a1 100644 --- a/routes/api.php +++ b/routes/api.php @@ -2,6 +2,9 @@ use Illuminate\Http\Request; use Illuminate\Support\Facades\Route; +use App\Http\Controllers\UserController; +use App\Http\Controllers\ProjectController; +use App\Http\Controllers\TaskController; /* |-------------------------------------------------------------------------- @@ -14,12 +17,11 @@ | */ -/* -Route::middleware('auth:sanctum')->get('/user', function (Request $request) { + +/*Route::middleware('auth:sanctum')->get('/user', function (Request $request) { return $request->user(); });*/ - Route::group(['prefix'=>'v1'], function (){ Route::get("users/{id?}",[UserController::class, 'getresources']); Route::post("users",[UserController::class, 'createresource']); @@ -37,3 +39,5 @@ Route::delete("tasks/{id}",[TaskController::class, 'deletetask']); }); + + From 1ca2972ee24971879573438a77e78d8ce10ea370 Mon Sep 17 00:00:00 2001 From: anoop jain Date: Sun, 5 Mar 2023 19:26:12 +0530 Subject: [PATCH 3/5] Implement features --- app/Http/Controllers/ProjectController.php | 51 ++++---- app/Http/Controllers/TaskController.php | 81 ++++++++----- app/Http/Controllers/UserController.php | 110 +++++++++++++----- app/Http/Kernel.php | 2 +- app/Models/Project.php | 5 +- app/Models/Task.php | 6 +- app/Models/User.php | 10 +- app/Providers/AuthServiceProvider.php | 29 ++++- ...023_03_03_034916_create_projects_table.php | 7 ++ .../2023_03_03_035104_create_tasks_table.php | 12 +- routes/api.php | 41 +++---- 11 files changed, 240 insertions(+), 114 deletions(-) diff --git a/app/Http/Controllers/ProjectController.php b/app/Http/Controllers/ProjectController.php index b8372b3..037f020 100644 --- a/app/Http/Controllers/ProjectController.php +++ b/app/Http/Controllers/ProjectController.php @@ -1,7 +1,9 @@ 0)){ - return $result; + $data = json_decode($result, true); + if(!empty($data)){ + return $result; }else{ return response()->json(['message'=>'No Data Found']); } } function createproject(Request $req){ - $project = new Project; - $project->name=$req->input('name'); - $project->save(); - return $project; - } - - function updateproject(Request $req){ - $project = Project::find($req->id); - $project->name=$req->input('name'); - $result=$project->save(); - - if($result){ - return response()->json(['message'=>'Successfully Updated']); + if(Gate::allows('isProductOwner')){ + $input['name']=$req->input('name'); + $input['product_owner_id']=$req->input('product_owner_id'); + $project = Project::create($input); + return $project; }else{ - return response()->json(['message'=>'Update Failed']); + return response()->json(['message'=>'Only PRODUCT OWNER is Allowed']); } } - function deleteproject(Request $req){ + function updateproject(Request $req){ $project = Project::find($req->id); - $result = $project->delete(); - if($result){ - return response()->json(['message'=>'Successfully Deleted']); + if($project){ + if(Gate::allows('updateProject',$project)){ + $input = $req->all(); + $result=$project->update($input); + if($result){ + return response()->json(['message'=>'Successfully Updated']); + }else{ + return response()->json(['message'=>'Update Failed']); + } + }else{ + return response()->json(['message'=>'Only PRODUCT OWNER is Allowed']); + } }else{ - return response()->json(['message'=>'Delete Failed']); + return response()->json(['message'=>'Invalid Project']); } + } + } diff --git a/app/Http/Controllers/TaskController.php b/app/Http/Controllers/TaskController.php index 1636ed0..212637a 100644 --- a/app/Http/Controllers/TaskController.php +++ b/app/Http/Controllers/TaskController.php @@ -1,9 +1,12 @@ 0)){ + $data = json_decode($result, true); + if(!empty($data)){ return $result; }else{ return response()->json(['message'=>'No Data Found']); @@ -22,39 +25,65 @@ function getTasks($id=null){ } function createtask(Request $req){ - $task = new Task; - $task->title=$req->input('title'); - $task->description =$req->input('description'); - $task->status=$req->input('status'); - $task->project_id=$req->input('project_id'); - $task->user_id=$req->input('user_id'); - $task->save(); - return $task; + $project = Project::find($req->project_id); + if($project){ + if(Gate::allows('taskCreateByOwner',$project)){ + $input = $req->all(); + $input['task_owner_id']=$project->product_owner_id; + $task = Task::create($input); + return $task; + }else{ + return response()->json(['message'=>'Only PROJECT OWNER is Allowed']); + } + }else{ + return response()->json(['message'=>'Invalid Project']); + } } function updatetask(Request $req){ $task = Task::find($req->id); - $task->title=$req->input('title'); - $task->description =$req->input('description'); - $task->status=$req->input('status'); - $task->project_id=$req->input('project_id'); - $task->user_id=$req->input('user_id'); - $result=$task->save(); - - if($result){ - return response()->json(['message'=>'Successfully Updated']); + if($task){ + if(Gate::allows('taskByOwner',$task)){ + $input = $req->all(); + $result=$task->update($input); + if($result){ + return response()->json(['message'=>'Successfully Updated']); + }else{ + return response()->json(['message'=>'Update Failed']); + } + }else if(Gate::allows('taskByTeamMember',$task)){ + $task->status=$req->input('status'); + $result=$task->save(); + if($result){ + return response()->json(['message'=>'Successfully Updated']); + }else{ + return response()->json(['message'=>'Update Failed']); + } + } + else{ + return response()->json(['message'=>'Only PROJECT OWNER OR TEAM MEMBER is Allowed']); + } }else{ - return response()->json(['message'=>'Update Failed']); + return response()->json(['message'=>'Invalid Task']); } } function deletetask(Request $req){ $task = Task::find($req->id); - $result = $task->delete(); - if($result){ - return response()->json(['message'=>'Successfully Deleted']); + if($task){ + if(Gate::allows('taskByOwner',$task)){ + $result = $task->delete(); + if($result){ + return response()->json(['message'=>'Successfully Deleted']); + }else{ + return response()->json(['message'=>'Delete Failed']); + } + }else{ + return response()->json(['message'=>'Only PRODUCT OWNER is Allowed']); + } }else{ - return response()->json(['message'=>'Delete Failed']); + return response()->json(['message'=>'Invalid Task']); } } -} + +} \ No newline at end of file diff --git a/app/Http/Controllers/UserController.php b/app/Http/Controllers/UserController.php index 2741c78..970d1e9 100644 --- a/app/Http/Controllers/UserController.php +++ b/app/Http/Controllers/UserController.php @@ -1,57 +1,113 @@ 0)){ - return $result; + if(Gate::allows('isAdmin')){ + if($id){ + $result = User::find($id); + }else{ + $result = User::all(); + } + $data = json_decode($result, true); + if(!empty($data)){ + return $result; + }else{ + return response()->json(['message'=>'No Data Found']); + } }else{ - return response()->json(['message'=>'No Data Found']); + return response()->json(['message'=>'Only Admin is Allowed']); } } function createresource(Request $req){ - $user = new User; - $user->name=$req->input('name'); - $user->email=$req->input('email'); - $user->password=md5($req->input('password')); - $user->save(); - return $user; + if(Gate::allows('isAdmin')){ + $input = $req->all(); + $input['password']=Hash::make($req->input('password')); + $user = User::create($input); + $response=[ + 'user'=>$user->name, + 'email'=>$user->email, + 'role'=>$user->role, + ]; + return response($response,201); + }else{ + return response()->json(['message'=>'Only Admin is Allowed']); + } } function updateresource(Request $req){ $user = User::find($req->id); - $user->name=$req->input('name'); - $user->email->$req->input('email'); - $result=$device->save(); - - if($result){ - return response()->json(['message'=>'Successfully Updated']); + if($user){ + if(Gate::allows('isAdmin')){ + $input = $req->all(); + $result=$user->update($input); + if($result){ + return response()->json(['message'=>'Successfully Updated']); + }else{ + return response()->json(['message'=>'Update Failed']); + } + }else{ + return response()->json(['message'=>'Only Admin is Allowed']); + } }else{ - return response()->json(['message'=>'Update Failed']); + return response()->json(['message'=>'Invalid User']); } } function deleteresource(Request $req){ $user = User::find($req->id); - $result = $user->delete(); - if($result){ - return response()->json(['message'=>'Successfully Deleted']); + if($user){ + if(Gate::allows('isAdmin')){ + $result = $user->delete(); + if($result){ + return response()->json(['message'=>'Successfully Deleted']); + }else{ + return response()->json(['message'=>'Delete Failed']); + } + }else{ + return response()->json(['message'=>'Only Admin is Allowed']); + } }else{ - return response()->json(['message'=>'Delete Failed']); + return response()->json(['message'=>'Invalid User']); } } + function registerUser(Request $req){ + $user = new User; + $user->name=$req->input('name'); + $user->email=$req->input('email'); + $user->password=Hash::make($req->input('password')); + $user->save(); + $response=[ + 'user'=>$user->name, + 'email'=>$user->email, + 'role'=>$user->role, + ]; + return response($response,201); + } + + + function login(Request $req){ + $user = User::where('email', $req->email)->first(); + if (!$user || !Hash::check($req->password, $user->password)) { + return response([ + 'message' => ['These credentials do not match our records.'] + ], 404); + } + $token = $user->createToken('my-app-token')->plainTextToken; + $response = [ + 'user' => $user, + 'token' => $token + ]; + return response($response, 201); + } } diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php index d3722c2..f0e38c7 100644 --- a/app/Http/Kernel.php +++ b/app/Http/Kernel.php @@ -40,7 +40,7 @@ class Kernel extends HttpKernel ], 'api' => [ - // \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class, + \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class, 'throttle:api', \Illuminate\Routing\Middleware\SubstituteBindings::class, ], diff --git a/app/Models/Project.php b/app/Models/Project.php index a46b129..9140d16 100644 --- a/app/Models/Project.php +++ b/app/Models/Project.php @@ -4,13 +4,16 @@ use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; +use Illuminate\Notifications\Notifiable; +use App\Traits\UUID; class Project extends Model { - use HasFactory; + use HasFactory, Notifiable, UUID; protected $fillable = [ 'name', + 'product_owner_id', ]; } diff --git a/app/Models/Task.php b/app/Models/Task.php index 2b8f072..076e58e 100644 --- a/app/Models/Task.php +++ b/app/Models/Task.php @@ -1,10 +1,9 @@ */ - protected $hidden = [ - 'password', - 'remember_token', - ]; + /** * The attributes that should be cast. * * @var array */ - protected $casts = [ - 'email_verified_at' => 'datetime', - ]; + } diff --git a/app/Providers/AuthServiceProvider.php b/app/Providers/AuthServiceProvider.php index 22b77e6..358c3a1 100644 --- a/app/Providers/AuthServiceProvider.php +++ b/app/Providers/AuthServiceProvider.php @@ -25,6 +25,33 @@ public function boot() { $this->registerPolicies(); - // + Gate::define('isAdmin', function($user) { + return $user->role == 'ADMIN'; + }); + + Gate::define('isProductOwner', function($user) { + return $user->role == 'PRODUCT_OWNER'; + }); + + Gate::define('isTeamMember', function($user) { + return $user->role == 'TEAM_MEMBER'; + }); + + Gate::define('updateProject', function ($user, $project) { + return $user->id == $project->product_owner_id; + }); + + Gate::define('taskCreateByOwner', function ($user, $project) { + return $user->id == $project->product_owner_id; + }); + + Gate::define('taskByOwner', function ($user, $task) { + return $user->id == $task->task_owner_id; + }); + + Gate::define('taskByTeamMember', function ($user, $task) { + return $user->id == $task->team_member_id; + }); + } } diff --git a/database/migrations/2023_03_03_034916_create_projects_table.php b/database/migrations/2023_03_03_034916_create_projects_table.php index a49f5db..28665b6 100644 --- a/database/migrations/2023_03_03_034916_create_projects_table.php +++ b/database/migrations/2023_03_03_034916_create_projects_table.php @@ -16,6 +16,13 @@ public function up() Schema::create('projects', function (Blueprint $table) { $table->uuid('id')->primary(); $table->string('name')->unique(); + $table->uuid('product_owner_id'); + $table->foreign('product_owner_id') + ->references('id') + ->on('users') + ->nullable(false) + ->onDelete('restrict') + ->onUpdate('restrict'); $table->timestamps(); }); } diff --git a/database/migrations/2023_03_03_035104_create_tasks_table.php b/database/migrations/2023_03_03_035104_create_tasks_table.php index 16a925e..c8f4362 100644 --- a/database/migrations/2023_03_03_035104_create_tasks_table.php +++ b/database/migrations/2023_03_03_035104_create_tasks_table.php @@ -26,14 +26,20 @@ public function up() ->nullable(false) ->onDelete('restrict') ->onUpdate('restrict'); - $table->uuid('user_id'); - $table->foreign('user_id') + $table->uuid('team_member_id'); + $table->foreign('team_member_id') + ->references('id') + ->on('users') + ->nullable(false) + ->onDelete('restrict') + ->onUpdate('restrict'); + $table->uuid('task_owner_id'); + $table->foreign('task_owner_id') ->references('id') ->on('users') ->nullable(false) ->onDelete('restrict') ->onUpdate('restrict'); - $table->timestamps(); }); diff --git a/routes/api.php b/routes/api.php index ec4c1a1..4f51b7a 100644 --- a/routes/api.php +++ b/routes/api.php @@ -16,28 +16,25 @@ | is assigned the "api" middleware group. Enjoy building your API! | */ - - -/*Route::middleware('auth:sanctum')->get('/user', function (Request $request) { - return $request->user(); -});*/ - Route::group(['prefix'=>'v1'], function (){ - Route::get("users/{id?}",[UserController::class, 'getresources']); - Route::post("users",[UserController::class, 'createresource']); - Route::put("users/{id}",[UserController::class, 'updateresource']); - Route::delete("users/{id}",[UserController::class, 'deleteresource']); - - Route::get("projects/{id?}",[ProjectController::class, 'getprojects']); - Route::post("projects",[ProjectController::class, 'createproject']); - Route::put("projects/{id}",[ProjectController::class, 'updateproject']); - Route::delete("projects/{id}",[ProjectController::class, 'deleteproject']); - - Route::get("tasks/{id?}",[TaskController::class, 'getTasks']); - Route::post("tasks",[TaskController::class, 'createtask']); - Route::put("tasks/{id}",[TaskController::class, 'updatetask']); - Route::delete("tasks/{id}",[TaskController::class, 'deletetask']); - + Route::post("registeruser",[UserController::class, 'registerUser']); + Route::post("login",[UserController::class, 'login']); }); - +Route::group(['middleware' => ['auth:sanctum']], function () { + Route::group(['prefix'=>'v1'], function (){ + Route::get("users/{id?}",[UserController::class, 'getresources']); + Route::post("users",[UserController::class, 'createresource']); + Route::put("users/{id}",[UserController::class, 'updateresource']); + Route::delete("users/{id}",[UserController::class, 'deleteresource']); + + Route::get("projects/{id?}",[ProjectController::class, 'getprojects']); + Route::post("projects",[ProjectController::class, 'createproject']); + Route::put("projects/{id}",[ProjectController::class, 'updateproject']); + + Route::get("tasks/{id?}",[TaskController::class, 'getTasks']); + Route::post("tasks",[TaskController::class, 'createtask']); + Route::put("tasks/{id}",[TaskController::class, 'updatetask']); + Route::delete("tasks/{id}",[TaskController::class, 'deletetask']); + }); +}); \ No newline at end of file From 60796263f63bedda44509c382421b27855255e8e Mon Sep 17 00:00:00 2001 From: anoop jain Date: Sun, 5 Mar 2023 21:29:46 +0530 Subject: [PATCH 4/5] Implement pagination --- app/Http/Controllers/ProjectController.php | 31 +++++++++++++++++----- routes/api.php | 2 +- 2 files changed, 26 insertions(+), 7 deletions(-) diff --git a/app/Http/Controllers/ProjectController.php b/app/Http/Controllers/ProjectController.php index 037f020..1f6c1bc 100644 --- a/app/Http/Controllers/ProjectController.php +++ b/app/Http/Controllers/ProjectController.php @@ -9,18 +9,37 @@ class ProjectController extends Controller { - function getprojects($id=null){ - if($id){ - $result = Project::find($id); - }else{ - $result = Project::all(); + function getprojects(Request $request){ + + $name=$request->q ? $request->q : ''; + $pageIndex=$request->pageIndex ? $request->pageIndex : '0'; + $pageSize=$request->pageSize ? $request->pageSize : '3'; + $sortBy=$request->sortBy ? $request->sortBy : 'name'; + $sortDirection=$request->sortDirection ? $request->sortDirection : 'ASC'; + $project_query=$data=""; + + if($name){ + $project_query=Project::where("name", "like","%".$name."%"); + + if($pageIndex){ + $project_query->offset($pageIndex); + } + if($pageSize){ + $project_query->limit($pageSize); + } + if($sortDirection){ + $project_query->orderBy($sortBy, $sortDirection); + } + $result = $project_query->get(); + $data = json_decode($result, true); } - $data = json_decode($result, true); + if(!empty($data)){ return $result; }else{ return response()->json(['message'=>'No Data Found']); } + } function createproject(Request $req){ diff --git a/routes/api.php b/routes/api.php index 4f51b7a..af24ba7 100644 --- a/routes/api.php +++ b/routes/api.php @@ -28,7 +28,7 @@ Route::put("users/{id}",[UserController::class, 'updateresource']); Route::delete("users/{id}",[UserController::class, 'deleteresource']); - Route::get("projects/{id?}",[ProjectController::class, 'getprojects']); + Route::get("projects",[ProjectController::class, 'getprojects']); Route::post("projects",[ProjectController::class, 'createproject']); Route::put("projects/{id}",[ProjectController::class, 'updateproject']); From fb06ddb1af3ec7c3775dc82b6a8d512057b510c9 Mon Sep 17 00:00:00 2001 From: anoop jain Date: Sun, 5 Mar 2023 22:36:26 +0530 Subject: [PATCH 5/5] Add postman collection --- ...postman collection.postman_collection.json | 716 ++++++++++++++++++ 1 file changed, 716 insertions(+) create mode 100644 doc/postman collection.postman_collection.json diff --git a/doc/postman collection.postman_collection.json b/doc/postman collection.postman_collection.json new file mode 100644 index 0000000..712bdfd --- /dev/null +++ b/doc/postman collection.postman_collection.json @@ -0,0 +1,716 @@ +{ + "info": { + "_postman_id": "e653fe91-dcea-4d3d-bc86-67829cadf259", + "name": "postman collection", + "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json" + }, + "item": [ + { + "name": "http://127.0.0.1:8000/api/v1/registeruser", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "formdata", + "formdata": [ + { + "key": "name", + "value": "testuser", + "type": "default" + }, + { + "key": "email", + "value": "testuser@email.com", + "type": "default" + }, + { + "key": "password", + "value": "12345", + "type": "default" + } + ] + }, + "url": { + "raw": "http://127.0.0.1:8000/api/v1/registeruser", + "protocol": "http", + "host": [ + "127", + "0", + "0", + "1" + ], + "port": "8000", + "path": [ + "api", + "v1", + "registeruser" + ] + } + }, + "response": [] + }, + { + "name": "http://127.0.0.1:8000/api/v1/registeruser", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "formdata", + "formdata": [ + { + "key": "name", + "value": "admin", + "type": "default" + }, + { + "key": "email", + "value": "admin@email.com", + "type": "default" + }, + { + "key": "password", + "value": "1234", + "type": "default" + } + ] + }, + "url": { + "raw": "http://127.0.0.1:8000/api/v1/login", + "protocol": "http", + "host": [ + "127", + "0", + "0", + "1" + ], + "port": "8000", + "path": [ + "api", + "v1", + "login" + ] + } + }, + "response": [] + }, + { + "name": "http://127.0.0.1:8000/api/v1/users", + "request": { + "auth": { + "type": "bearer", + "bearer": [ + { + "key": "token", + "value": "20|Hpsa7ordgiioOla5iAC7VwDoBc7Jx6qkbypsHvB7", + "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" + ] + } + }, + "response": [] + }, + { + "name": "http://127.0.0.1:8000/api/v1/users", + "request": { + "auth": { + "type": "bearer", + "bearer": [ + { + "key": "token", + "value": "20|Hpsa7ordgiioOla5iAC7VwDoBc7Jx6qkbypsHvB7", + "type": "string" + } + ] + }, + "method": "GET", + "header": [], + "url": { + "raw": "http://127.0.0.1:8000/api/v1/users/a02a43b2-e6fe-46ab-9180-c04e7efb63e8", + "protocol": "http", + "host": [ + "127", + "0", + "0", + "1" + ], + "port": "8000", + "path": [ + "api", + "v1", + "users", + "a02a43b2-e6fe-46ab-9180-c04e7efb63e8" + ] + } + }, + "response": [] + }, + { + "name": "http://127.0.0.1:8000/api/v1/users/a02a43b2-e6fe-46ab-9180-c04e7efb63e8", + "request": { + "auth": { + "type": "bearer", + "bearer": [ + { + "key": "token", + "value": "22|Yi2JcaNMY7cLzixMtifcwkWGKXeHMTc797uVJ9CB", + "type": "string" + } + ] + }, + "method": "PUT", + "header": [], + "body": { + "mode": "formdata", + "formdata": [ + { + "key": "role", + "value": "PRODUCT_OWNER", + "type": "default" + } + ] + }, + "url": { + "raw": "http://127.0.0.1:8000/api/v1/users/a02a43b2-e6fe-46ab-9180-c04e7efb63e8?role=PRODUCT_OWNER", + "protocol": "http", + "host": [ + "127", + "0", + "0", + "1" + ], + "port": "8000", + "path": [ + "api", + "v1", + "users", + "a02a43b2-e6fe-46ab-9180-c04e7efb63e8" + ], + "query": [ + { + "key": "role", + "value": "PRODUCT_OWNER" + } + ] + } + }, + "response": [] + }, + { + "name": "http://127.0.0.1:8000/api/v1/users/074f7880-6b4b-43ca-994a-f0b9d8abaee1", + "request": { + "auth": { + "type": "bearer", + "bearer": [ + { + "key": "token", + "value": "20|Hpsa7ordgiioOla5iAC7VwDoBc7Jx6qkbypsHvB7", + "type": "string" + } + ] + }, + "method": "DELETE", + "header": [], + "url": { + "raw": "http://127.0.0.1:8000/api/v1/users/074f7880-6b4b-43ca-994a-f0b9d8abaee1", + "protocol": "http", + "host": [ + "127", + "0", + "0", + "1" + ], + "port": "8000", + "path": [ + "api", + "v1", + "users", + "074f7880-6b4b-43ca-994a-f0b9d8abaee1" + ] + } + }, + "response": [] + }, + { + "name": "http://127.0.0.1:8000/api/v1/projects", + "request": { + "auth": { + "type": "bearer", + "bearer": [ + { + "key": "token", + "value": "20|Hpsa7ordgiioOla5iAC7VwDoBc7Jx6qkbypsHvB7", + "type": "string" + } + ] + }, + "method": "POST", + "header": [], + "url": { + "raw": "http://127.0.0.1:8000/api/v1/projects", + "protocol": "http", + "host": [ + "127", + "0", + "0", + "1" + ], + "port": "8000", + "path": [ + "api", + "v1", + "projects" + ] + } + }, + "response": [] + }, + { + "name": "http://127.0.0.1:8000/api/v1/users/a02a43b2-e6fe-46ab-9180-c04e7efb63e8", + "request": { + "auth": { + "type": "bearer", + "bearer": [ + { + "key": "token", + "value": "22|Yi2JcaNMY7cLzixMtifcwkWGKXeHMTc797uVJ9CB", + "type": "string" + } + ] + }, + "method": "PUT", + "header": [], + "body": { + "mode": "formdata", + "formdata": [ + { + "key": "role", + "value": "PRODUCT_OWNER", + "type": "default" + } + ] + }, + "url": { + "raw": "http://127.0.0.1:8000/api/v1/users/a02a43b2-e6fe-46ab-9180-c04e7efb63e8?role=PRODUCT_OWNER", + "protocol": "http", + "host": [ + "127", + "0", + "0", + "1" + ], + "port": "8000", + "path": [ + "api", + "v1", + "users", + "a02a43b2-e6fe-46ab-9180-c04e7efb63e8" + ], + "query": [ + { + "key": "role", + "value": "PRODUCT_OWNER" + } + ] + } + }, + "response": [] + }, + { + "name": "http://127.0.0.1:8000/api/v1/projects", + "request": { + "auth": { + "type": "bearer", + "bearer": [ + { + "key": "token", + "value": "23|qPBECr9VvCmWLCJFNjBTV8oEkLL3rykZiBMHD8WI", + "type": "string" + } + ] + }, + "method": "POST", + "header": [], + "body": { + "mode": "formdata", + "formdata": [ + { + "key": "name", + "value": "test project", + "type": "default" + }, + { + "key": "product_owner_id", + "value": "a02a43b2-e6fe-46ab-9180-c04e7efb63e8", + "type": "default" + } + ] + }, + "url": { + "raw": "http://127.0.0.1:8000/api/v1/projects", + "protocol": "http", + "host": [ + "127", + "0", + "0", + "1" + ], + "port": "8000", + "path": [ + "api", + "v1", + "projects" + ] + } + }, + "response": [] + }, + { + "name": "http://127.0.0.1:8000/api/v1/tasks", + "request": { + "auth": { + "type": "bearer", + "bearer": [ + { + "key": "token", + "value": "23|qPBECr9VvCmWLCJFNjBTV8oEkLL3rykZiBMHD8WI", + "type": "string" + } + ] + }, + "method": "POST", + "header": [], + "body": { + "mode": "formdata", + "formdata": [ + { + "key": "title", + "value": "test task", + "type": "default" + }, + { + "key": "description", + "value": "test description", + "type": "default" + }, + { + "key": "project_id", + "value": "3ffc9eac-9c54-4485-848a-0956331dc877", + "type": "default" + }, + { + "key": "team_member_id", + "value": "8cb8bdd4-887b-49f5-8143-3a692158a486", + "type": "default" + } + ] + }, + "url": { + "raw": "http://127.0.0.1:8000/api/v1/tasks", + "protocol": "http", + "host": [ + "127", + "0", + "0", + "1" + ], + "port": "8000", + "path": [ + "api", + "v1", + "tasks" + ] + } + }, + "response": [] + }, + { + "name": "http://127.0.0.1:8000/api/v1/tasks", + "request": { + "auth": { + "type": "bearer", + "bearer": [ + { + "key": "token", + "value": "23|qPBECr9VvCmWLCJFNjBTV8oEkLL3rykZiBMHD8WI", + "type": "string" + } + ] + }, + "method": "GET", + "header": [], + "url": { + "raw": "http://127.0.0.1:8000/api/v1/tasks", + "protocol": "http", + "host": [ + "127", + "0", + "0", + "1" + ], + "port": "8000", + "path": [ + "api", + "v1", + "tasks" + ] + } + }, + "response": [] + }, + { + "name": "http://127.0.0.1:8000/api/v1/tasks/66904872-13fd-4274-be47-da6175746f24", + "request": { + "auth": { + "type": "bearer", + "bearer": [ + { + "key": "token", + "value": "24|DyipzDpbZOIvEoOq4KKyW7TN8pwjuM3kfXNkspTG", + "type": "string" + } + ] + }, + "method": "PUT", + "header": [], + "body": { + "mode": "formdata", + "formdata": [ + { + "key": "status", + "value": "IN_PROGRESS", + "type": "default" + } + ] + }, + "url": { + "raw": "http://127.0.0.1:8000/api/v1/tasks/66904872-13fd-4274-be47-da6175746f24", + "protocol": "http", + "host": [ + "127", + "0", + "0", + "1" + ], + "port": "8000", + "path": [ + "api", + "v1", + "tasks", + "66904872-13fd-4274-be47-da6175746f24" + ] + } + }, + "response": [] + }, + { + "name": "http://127.0.0.1:8000/api/v1/tasks/66904872-13fd-4274-be47-da6175746f24", + "request": { + "auth": { + "type": "bearer", + "bearer": [ + { + "key": "token", + "value": "25|jIWupG8RgkjFBHYZTXqmLaoAqwpjwtTskKd2sBwS", + "type": "string" + } + ] + }, + "method": "PUT", + "header": [], + "body": { + "mode": "formdata", + "formdata": [ + { + "key": "status", + "value": "IN_PROGRESS", + "type": "default" + } + ] + }, + "url": { + "raw": "http://127.0.0.1:8000/api/v1/tasks/f82e2e70-05bf-4795-8e82-d3aa440a920b", + "protocol": "http", + "host": [ + "127", + "0", + "0", + "1" + ], + "port": "8000", + "path": [ + "api", + "v1", + "tasks", + "f82e2e70-05bf-4795-8e82-d3aa440a920b" + ] + } + }, + "response": [] + }, + { + "name": "http://127.0.0.1:8000/api/v1/tasks/f82e2e70-05bf-4795-8e82-d3aa440a920b", + "request": { + "auth": { + "type": "bearer", + "bearer": [ + { + "key": "token", + "value": "25|jIWupG8RgkjFBHYZTXqmLaoAqwpjwtTskKd2sBwS", + "type": "string" + } + ] + }, + "method": "DELETE", + "header": [], + "url": { + "raw": "http://127.0.0.1:8000/api/v1/tasks/f82e2e70-05bf-4795-8e82-d3aa440a920b", + "protocol": "http", + "host": [ + "127", + "0", + "0", + "1" + ], + "port": "8000", + "path": [ + "api", + "v1", + "tasks", + "f82e2e70-05bf-4795-8e82-d3aa440a920b" + ] + } + }, + "response": [] + }, + { + "name": "http://127.0.0.1:8000/api/v1/projects?q=project&pageIndex=0&pageSize=3&sortBy=name&sortDirection=ASC", + "request": { + "auth": { + "type": "bearer", + "bearer": [ + { + "key": "token", + "value": "25|jIWupG8RgkjFBHYZTXqmLaoAqwpjwtTskKd2sBwS", + "type": "string" + } + ] + }, + "method": "GET", + "header": [], + "url": { + "raw": "http://127.0.0.1:8000/api/v1/projects?q=project&pageIndex=0&pageSize=3&sortBy=name&sortDirection=ASC", + "protocol": "http", + "host": [ + "127", + "0", + "0", + "1" + ], + "port": "8000", + "path": [ + "api", + "v1", + "projects" + ], + "query": [ + { + "key": "q", + "value": "project" + }, + { + "key": "pageIndex", + "value": "0" + }, + { + "key": "pageSize", + "value": "3" + }, + { + "key": "sortBy", + "value": "name" + }, + { + "key": "sortDirection", + "value": "ASC" + } + ] + } + }, + "response": [] + }, + { + "name": "http://127.0.0.1:8000/api/v1/projects?q=project&pageIndex=0&pageSize=3&sortBy=name&sortDirection=ASC", + "request": { + "auth": { + "type": "bearer", + "bearer": [ + { + "key": "token", + "value": "25|jIWupG8RgkjFBHYZTXqmLaoAqwpjwtTskKd2sBwS", + "type": "string" + } + ] + }, + "method": "GET", + "header": [], + "url": { + "raw": "http://127.0.0.1:8000/api/v1/projects?q=project&pageIndex=1&pageSize=2&sortBy=name&sortDirection=DESC", + "protocol": "http", + "host": [ + "127", + "0", + "0", + "1" + ], + "port": "8000", + "path": [ + "api", + "v1", + "projects" + ], + "query": [ + { + "key": "q", + "value": "project" + }, + { + "key": "pageIndex", + "value": "1" + }, + { + "key": "pageSize", + "value": "2" + }, + { + "key": "sortBy", + "value": "name" + }, + { + "key": "sortDirection", + "value": "DESC" + } + ] + } + }, + "response": [] + } + ] +} \ No newline at end of file