You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

159 lines
5.0 KiB

<?php
namespace App\Http\Controllers;
use App\Models\Project;
use App\Models\Business;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class ProjectController extends Controller
{
public function index(Request $request, int $business)
{
// permit('businessAccess');
return Project::where('business_id', $business)->get();
}
public function store(Request $request, string $business)
{
permit('businessProjects');
Project::create($request->merge(['business_id' => $business])->all());
return Business::info($request->route('business'), true);
}
public function update(Request $request, int $business, string $project)
{
permit('projectEdit', ['project_id' => $project]);
$project = Project::findOrFail($project);
$project->update($request->except('business_id'));
return Business::info($request->route('business'), true);
}
public function delete(Request $request, int $business, string $project)
{
permit('businessProjects');
$project = Project::findOrFail($project);
$project->delete();
return Business::info($request->route('business'));
}
public function restore(Request $request, int $business, string $project)
{
$project = Project::onlyTrashed()->findOrFail($project);
$project->restore();
return response(['message' => 'project successfully restored.']);
}
public function storeOrUpdateUser($business, $project, Request $request)
{
permit('projectUsers', ['project_id' => $project]);
$validatedData = $this->validate($request, [
'level' => 'required|numeric|between:1,3',
'user_id' => 'required|numeric|not_in:'.auth()->id(),
]);
$this->checkAddUserPolicy($request->user_id, $request->level);
$projectModel = Project::findOrFail($project);
DB::transaction(function () use ($business, $validatedData, $request, $projectModel) {
$projectModel->members()->sync([$request->user_id => $validatedData], false);
if (!can('businessAccess', ['user_id' => $request->user_id])) {
// Register user to business with zero level
//User not exist in the business before
$this->addUserWithZeroLevel($request->user_id, $business);
}
}, 3);
return Business::info($projectModel->business_id, true);
}
public function checkAddUserPolicy($user, $level)
{
if (can('businessAccess', ['user_id' => $user])
&& $level < request('_business_info')['info']['users'][$user]['level']) {// before in business
abort(405);
}
}
public function addUserWithZeroLevel($user_id, $business)
{
$businessModel = Business::findOrFail($business);
return $businessModel->users()->sync([$user_id => [
'level' => 0,
'user_id' => $user_id
]], false);
}
public function deleteUser($business, $project, $user)
{
permit('projectAccess', ['project_id' => $project]);
$this->checkDeleteUserPolicy($user, $project);
$projectModel = Project::findOrFail($project);
DB::transaction(function () use ($project, $business, $user, $projectModel) {
$this->detachMember($projectModel, $user);
if (!can('isActiveUser', ['user_id' => $user]) && !$this->haveOneProject($user, $project)) {
// User level in business is zero
// And haven't another project then remove it form business
$businessModel = Business::findOrFail($business);
$this->detachUser($businessModel, $user);
}
}, 3);
return Business::info($projectModel->business_id, true);
}
public function detachMember($project, $user)
{
return $project->members()->detach($user) ? true : abort(404);
}
public function detachUser($business, $user)
{
return $business->users()->detach($user) ? true : abort(404);
}
public function haveOneProject($user, $project)
{
foreach (request('_business_info')['info']['projects'] as $id => $item) {
if ($item['members'][$user]['level'] > enum('levels.inactive.id') && $id != $project) {
return true;
}
}
return false;
}
public function checkDeleteUserPolicy($user, $project)
{
if (!can('isProjectOwner', ['project_id' => $project]) && (auth()->id() != $user) ) {
abort(405);
}
}
public function setAvatar(Request $request, int $business, string $project)
{
$project = Project::findOrFail($project);
if ($request->hasFile('avatar')) {
$project->saveAsAvatar($request->file('avatar'));
}
return $project;
}
public function unSetAvatar(Request $request,int $business ,string $project)
{
$project = Project::findOrFail($project);
$project->deleteAvatar();
return $project;
}
}