RSM-6 Team features

This commit is contained in:
2020-10-03 21:36:35 +01:00
parent 7c0c244e21
commit 75f4404259
26 changed files with 24416 additions and 23165 deletions

View File

@@ -0,0 +1,189 @@
<?php
namespace App\Http\Controllers;
use App\Http\Requests\EditTeamRequest;
use App\Http\Requests\NewTeamRequest;
use App\Http\Requests\SendInviteRequest;
use App\Mail\InviteToTeam;
use App\Team;
use App\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Mail;
use Mpociot\Teamwork\Facades\Teamwork;
use Mpociot\Teamwork\TeamInvite;
class TeamController extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
return view('dashboard.teams.teams')
->with('teams', Team::all());
}
/**
* Show the form for creating a new resource.
*
* @return \Illuminate\Http\Response
*/
public function create()
{
//
}
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(NewTeamRequest $request)
{
Team::create([
'name' => $request->teamName,
'owner_id' => Auth::user()->id
]);
$request->session()->flash('success', 'Team successfully created.');
return redirect()->back();
}
/**
* Display the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function show($id)
{
//
}
/**
* Show the form for editing the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function edit(Team $team)
{
return view('dashboard.teams.edit-team')
->with('team', $team)
->with('users', User::all());
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param int $id
* @return \Illuminate\Http\Response
*/
public function update(EditTeamRequest $request, Team $team)
{
$team->description = $request->teamDescription;
$team->openJoin = $request->joinType;
$team->save();
$request->session()->flash('success', 'Team edited successfully.');
return redirect()->to(route('teams.index'));
}
/**
* Remove the specified resource from storage.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function destroy($id)
{
//
}
public function invite(SendInviteRequest $request, Team $team)
{
$user = User::findOrFail($request->user);
if (!$team->openJoin)
{
if (!Teamwork::hasPendingInvite($user->email, $team))
{
Teamwork::inviteToTeam($user, $team, function(TeamInvite $invite) use ($user) {
Mail::to($user)->send(new InviteToTeam($invite));
});
$request->session()->flash('success', 'Invite sent! They can now accept or deny it.');
}
else
{
$request->session()->flash('error', 'This user has already been invited.');
}
}
else
{
$request->session()->flash('error', 'You can\'t invite users to public teams.');
}
return redirect()->back();
}
public function processInviteAction(Request $request, $action, $token)
{
switch($action)
{
case 'accept':
$invite = Teamwork::getInviteFromAcceptToken($token);
if ($invite && $invite->user->is(Auth::user()))
{
Teamwork::acceptInvite($invite);
$request->session()->flash('success', 'Invite accepted! You have now joined ' . $invite->team->name . '.');
}
else
{
$request->session()->flash('error', 'Invalid or expired invite URL.');
}
break;
case 'deny':
$invite = Teamwork::getInviteFromDenyToken($token);
if ($invite && $invite->user->is(Auth::user()))
{
Teamwork::denyInvite($invite);
$request->session()->flash('success', 'Invite denied! Ask for another invite if this isn\'t what you meant.');
}
else
{
$request->session()->flash('error', 'Invalid or expired invite URL.');
}
break;
default:
$request->session()->flash('error', 'Sorry, but the invite URL you followed was malformed. Try asking for another invite, or submit a bug report.');
}
// This page will show the user's current teams
return redirect()->to(route('teams.index'));
}
}

View File

@@ -0,0 +1,31 @@
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class EditTeamRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'teamDescription' => 'required|string|max:200',
'joinType' => 'required|boolean'
];
}
}

View File

@@ -0,0 +1,30 @@
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class NewTeamRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'teamName' => 'required|max:200|string'
];
}
}

View File

@@ -0,0 +1,30 @@
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class SendInviteRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'user' => 'required|integer'
];
}
}

55
app/Mail/InviteToTeam.php Normal file
View File

@@ -0,0 +1,55 @@
<?php
namespace App\Mail;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
use Mpociot\Teamwork\TeamInvite;
class InviteToTeam extends Mailable
{
use Queueable, SerializesModels;
public $teamName;
public $name;
public $inviterName;
public $denyToken;
public $acceptToken;
/**
* Create a new message instance.
*
* @return void
*/
public function __construct(TeamInvite $invite)
{
$this->teamName = $invite->team->name;
$this->name = $invite->user->name;
$this->inviterName = $invite->inviter->name;
$this->acceptToken = $invite->accept_token;
$this->denyToken = $invite->deny_token;
}
/**
* Build the message.
*
* @return $this
*/
public function build()
{
return $this
->subject('You have just been invited to ' . $this->teamName)
->view('mail.invited-to-team');
}
}

View File

@@ -9,6 +9,8 @@ class Team extends TeamworkTeam
{
public $fillable = [
'owner_id',
'name'
'name',
'description',
'openJoin'
];
}

View File

@@ -5,12 +5,16 @@ namespace App;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Log;
use Mpociot\Teamwork\Traits\UsedByTeams;
use GrahamCampbell\Markdown\Facades\Markdown;
class Vacancy extends Model
{
use UsedByTeams;
public $fillable = [
'permissionGroupName',