Skip to content

Feature/rest api #18

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 2 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
57 changes: 57 additions & 0 deletions app/Http/Controllers/API/AuthController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
<?php

namespace App\Http\Controllers\API;
use Illuminate\Auth\Access\Response;
use App\Http\Controllers\Controller;
use App\Models\User;
use Illuminate\Http\Request;
use Validator;
use Hash;

class AuthController extends Controller
{
public function register(Request $request)
{
$validator = Validator::make($request->all(), [
'username' => 'required|max:55|unique:users',
'password' => 'required|min:6'
]);

if($validator->fails()){
return response(['error' => $validator->errors()]);
}

$user = User::create([
'username' => $request->username,
'password' => Hash::make($request->password),
'role' => $request->role,
]);

$accessToken = $user->createToken('authToken')->accessToken;

return response([ 'user' => $user, 'access_token' => $accessToken]);
}

public function login(Request $request)
{
$data = $request->all();

$validator = Validator::make($data, [
'username' => 'required',
'password' => 'required|min:6'
]);

if($validator->fails()){
return response(['error' => $validator->errors()]);
}

if (!auth()->attempt($data)) {
return response(['message' => 'Login credentials are invaild']);
}

$accessToken = auth()->user()->createToken('authToken')->accessToken;

return response(['access_token' => $accessToken]);

}
}
90 changes: 90 additions & 0 deletions app/Http/Controllers/API/ProjectController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
<?php

namespace App\Http\Controllers\API;
use Illuminate\Auth\Access\Response;
use App\Http\Controllers\Controller;
use App\Models\Project;
use Illuminate\Http\Request;
use App\Http\Resources\ProjectResource;
use Validator;

class ProjectController extends Controller
{

public function index()
{
$pageSize = isset($_GET['pageSize'])?$_GET['pageSize']:2;
$sortBy = isset($_GET['sortBy'])?$_GET['sortBy']:'name';
$sortDirection = isset($_GET['sortDirection'])?$_GET['sortDirection']:'ASC';
$Projects = Project::orderBy($sortBy, $sortDirection);
$q = isset($_GET['q'])?$_GET['q']:'';
$Projects = $q?$Projects->where('name', 'LIKE', "%$q%"):$Projects;
$Projects = $Projects->paginate($pageSize);
return response(['Projects' => $Projects]);

}

private function checkUserRole()
{
if(auth('api')->user()->role != 'PRODUCT_OWNER'){
return false;
}
return true;
}

public function store(Request $request)
{
if(!$this->checkUserRole()){
return Response::deny('You must be a PRODUCT_OWNER to continue.');
}
$data = $request->all();

$validator = Validator::make($data, [
'name' => 'required|max:255',
]);

if($validator->fails()){
return response(['error' => $validator->errors(), 'Validation Error']);
}

$Project = Project::create($data);

return response(['Project' => new ProjectResource($Project), 'message' => 'Project created successfully']);
}

public function show(Project $Project)
{

return response(['Project' => new ProjectResource($Project)]);
}

public function update(Request $request, Project $Project)
{
if(!$this->checkUserRole()){
return Response::deny('You must be a PRODUCT_OWNER to continue.');
}
$data = $request->all();

$validator = Validator::make($data, [
'name' => 'required|max:255',
]);

if($validator->fails()){
return response(['error' => $validator->errors(), 'Validation Error']);
}

$Project->update($data);

return response(['Project' => new ProjectResource($Project), 'message' => 'Project updated successfully']);
}

public function destroy(Project $Project)
{
if(!$this->checkUserRole()){
return Response::deny('You must be a PRODUCT_OWNER to continue.');
}
$Project->delete();

return response(['message' => 'Project deleted successfully']);
}
}
124 changes: 124 additions & 0 deletions app/Http/Controllers/API/TaskController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
<?php

namespace App\Http\Controllers\API;
use Illuminate\Auth\Access\Response;
use App\Http\Controllers\Controller;
use App\Models\Task;
use App\Models\User;
use App\Models\Project;
use Illuminate\Http\Request;
use App\Http\Resources\TaskResource;
use Validator;

class TaskController extends Controller
{
public $tasks_status = ['NOT_STARTED', 'IN_PROGRESS', 'READY_FOR_TEST', 'COMPLETED'];


public function index()
{
$Tasks = Task::all();
return response(['Tasks' => TaskResource::collection($Tasks)]);
}

private function checkUserRole()
{
if(auth('api')->user()->role != 'PRODUCT_OWNER'){
return false;
}
return true;
}
public function store(Request $request)
{
if(!$this->checkUserRole()){
return Response::deny('You must be a PRODUCT_OWNER to continue creating tasks.');
}
$data = $request->all();
$data['status'] = 'NOT_STARTED';

$validator = Validator::make($data, [
'title' => 'required|max:255',
'status' => 'required',
'project_id' => 'required',
'user_id' => 'required',
]);

if($validator->fails()){
return response(['error' => $validator->errors(), 'Validation Error']);
}

if(!in_array($data['status'], $this->tasks_status)){
return Response::deny("You must provide task status from following ['NOT_STARTED', 'IN_PROGRESS', 'READY_FOR_TEST', 'COMPLETED']");
}

$user = User::find($request->user_id);
if(!$user){
return Response::deny("User not found to assign task!");
}
$project = Project::find($request->project_id);

if(!$project){
return Response::deny("Project not found!");
}
$Task = Task::create($data);


$user->role = 'PRODUCT_OWNER';

$user->save();

return response(['Task' => new TaskResource($Task), 'message' => 'Task created successfully']);
}

public function show(Task $Task)
{
return response(['Task' => new TaskResource($Task)]);
}

public function update(Request $request, Task $Task)
{

$data = $request->all();
if(!$this->checkUserRole()){
if(auth('api')->user()->id != $data['user_id']){
return Response::deny('You have no permission to edit task');
}
return Response::deny('You must be a PRODUCT_OWNER to continue creating tasks.');
}

$validator = Validator::make($data, [
'title' => 'required|max:255',
'status' => 'required',
'project_id' => 'required',
'user_id' => 'required',
]);

if($validator->fails()){
return response(['error' => $validator->errors(), 'Validation Error']);
}
if(!in_array($data['status'], $this->tasks_status)){
return Response::deny("You must provide task status from following ['NOT_STARTED', 'IN_PROGRESS', 'READY_FOR_TEST', 'COMPLETED']");
}

$user = User::find($request->user_id);
if(!$user){
return Response::deny("User not found to assign task!");
}
$project = Project::find($request->project_id);

if(!$project){
return Response::deny("Project not found!");
}

$Task->update($data);

return response(['Task' => new TaskResource($Task), 'message' => 'Task updated successfully']);
}

public function destroy(Task $Task)
{
$Task->delete();

return response(['message' => 'Task deleted successfully']);
}
}
92 changes: 92 additions & 0 deletions app/Http/Controllers/API/UserController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
<?php

namespace App\Http\Controllers\API;
use Illuminate\Auth\Access\Response;
use App\Http\Controllers\Controller;
use App\Models\User;
use Illuminate\Http\Request;
use App\Http\Resources\UserResource;
use Validator;

class UserController extends Controller
{
public function __construct(Request $request) {
if($request->username != 'Admin'){
return Response::deny('You must be an administrator to continue accessing users.');
}
}

public function index()
{
$Users = User::all();
return response(['Users' => UserResource::collection($Users)]);
}

private function checkUserRole()
{
if(auth('api')->user()->role != 'Admin'){
return false;
}
return true;
}
public function store(Request $request)
{
if(!$this->checkUserRole()){
return Response::deny('You must be a Admin to continue using users.');
}
$data = $request->all();

$validator = Validator::make($data, [
'username' => 'required',
'password' => 'required|min:6',
'role' => 'required',
]);

if($validator->fails()){
return response(['error' => $validator->errors(), 'Validation Error']);
}

$User = User::create($data);

return response(['User' => new UserResource($User), 'message' => 'User created successfully']);
}

public function show(User $User)
{
if(!$this->checkUserRole()){
return Response::deny('You must be a Admin to continue using users.');
}
return response(['User' => new UserResource($User)]);
}

public function update(Request $request, User $User)
{
if(!$this->checkUserRole()){
return Response::deny('You must be a Admin to continue using users.');
}
$data = $request->all();

$validator = Validator::make($data, [
'username' => 'required',
'password' => 'required|min:6',
]);

if($validator->fails()){
return response(['error' => $validator->errors(), 'Validation Error']);
}

$User->update($data);

return response(['User' => new UserResource($User), 'message' => 'User updated successfully']);
}

public function destroy(User $User)
{
if(!$this->checkUserRole()){
return Response::deny('You must be a Admin to continue using users.');
}
$User->delete();

return response(['message' => 'User deleted successfully']);
}
}
13 changes: 13 additions & 0 deletions app/Http/Resources/ProjectResource.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<?php

namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\JsonResource;

class ProjectResource extends JsonResource
{
public function toArray($request)
{
return parent::toArray($request);
}
}
13 changes: 13 additions & 0 deletions app/Http/Resources/TaskResource.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<?php

namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\JsonResource;

class TaskResource extends JsonResource
{
public function toArray($request)
{
return parent::toArray($request);
}
}
Loading