Team functionality (#459)
* add api enpoints for adding, removing, updating user to workspace and leaving workspace * feat: updates client site workspace settings * refactor and add domain setting ui in modal * move workspace user functionality to its own component * adds tests * fix linting * updates select input to FlatSelectInput * moves workspace user role edit to seperated component * move user adding to its own component * adds check to usure users exist before checking is admin * fix loading users * feat: invite user to team functionality * fix token coulmn * fix self host mode changes * tests for user invite * Refactor back-end * Rename variables * Improve some styling elements + refactor workspace settings * More styling * More UI polishing * More UI fixes * PHP linting * Implemented most of the logic for team-functionnality * Fix user avatar URL * WIP remove users on cancellation * Finished pricing for team functionality * Fix tests * Fix linting * Added pricing_enabled helper * Fix pricing_enabled shortcut * Debug CI * Disable pricing when testing --------- Co-authored-by: LL-Etiane <lukongleinyuyetiane@gmail.com> Co-authored-by: Lukong Etiane <83535251+LL-Etiane@users.noreply.github.com> Co-authored-by: Julien Nahum <julien@nahum.net>
This commit is contained in:
87
app/Models/UserInvite.php
Normal file
87
app/Models/UserInvite.php
Normal file
@@ -0,0 +1,87 @@
|
||||
<?php
|
||||
|
||||
namespace App\Models;
|
||||
|
||||
use App\Jobs\Billing\WorkspaceUsersUpdated;
|
||||
use App\Mail\UserInvitationEmail;
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Support\Facades\Mail;
|
||||
use Illuminate\Support\Str;
|
||||
|
||||
class UserInvite extends Model
|
||||
{
|
||||
use HasFactory;
|
||||
|
||||
public const PENDING_STATUS = 'pending';
|
||||
public const ACCEPTED_STATUS = 'accepted';
|
||||
|
||||
protected $fillable = [
|
||||
'email',
|
||||
'role',
|
||||
'workspace_id',
|
||||
'valid_until',
|
||||
'status',
|
||||
'token',
|
||||
];
|
||||
|
||||
public static function inviteUser(
|
||||
string $email,
|
||||
string $role,
|
||||
Workspace $workspace,
|
||||
Carbon $validUntil = null
|
||||
): self {
|
||||
// Generate a token
|
||||
do {
|
||||
$token = Str::random(100);
|
||||
} while (UserInvite::where('token', $token)->exists());
|
||||
|
||||
$invite = self::create([
|
||||
'email' => $email,
|
||||
'role' => $role,
|
||||
'workspace_id' => $workspace->id,
|
||||
'valid_until' => $validUntil ?? now()->addDays(7),
|
||||
'token' => $token,
|
||||
]);
|
||||
$invite->sendEmail();
|
||||
return $invite;
|
||||
}
|
||||
|
||||
public function getLink()
|
||||
{
|
||||
return front_url('/register?email=' . urlencode($this->email) . '&invite_token=' . urlencode($this->token));
|
||||
}
|
||||
|
||||
public function hasExpired()
|
||||
{
|
||||
return Carbon::parse($this->valid_until)->isPast();
|
||||
}
|
||||
|
||||
public function workspace()
|
||||
{
|
||||
return $this->belongsTo(Workspace::class);
|
||||
}
|
||||
|
||||
public function markAsAccepted()
|
||||
{
|
||||
$this->update(['status' => self::ACCEPTED_STATUS]);
|
||||
WorkspaceUsersUpdated::dispatch($this->workspace);
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function sendEmail()
|
||||
{
|
||||
Mail::to($this->email)->send(new UserInvitationEmail($this));
|
||||
}
|
||||
|
||||
public function scopeNotExpired($query)
|
||||
{
|
||||
return $query->where('valid_until', '>', now());
|
||||
}
|
||||
|
||||
public function scopePending($query)
|
||||
{
|
||||
return $query->where('status', self::PENDING_STATUS);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user