opnform-host-nginx/api/app/Models/Workspace.php

215 lines
5.3 KiB
PHP
Raw Normal View History

2022-09-20 21:59:52 +02:00
<?php
namespace App\Models;
use App\Models\Forms\Form;
use App\Models\Traits\CachableAttributes;
use App\Models\Traits\CachesAttributes;
2022-09-20 21:59:52 +02:00
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Collection;
2022-09-20 21:59:52 +02:00
class Workspace extends Model implements CachableAttributes
2022-09-20 21:59:52 +02:00
{
2024-02-23 11:54:12 +01:00
use CachesAttributes;
use HasFactory;
public const MAX_FILE_SIZE_FREE = 5000000; // 5 MB
public const MAX_FILE_SIZE_PRO = 50000000; // 50 MB
public const MAX_DOMAIN_PRO = 1;
2022-09-20 21:59:52 +02:00
protected $fillable = [
'name',
'icon',
'user_id',
'custom_domain',
'settings'
2022-09-20 21:59:52 +02:00
];
protected $appends = [
'is_pro',
'is_trialing',
2024-02-23 11:54:12 +01:00
'is_enterprise',
2022-09-20 21:59:52 +02:00
];
protected function casts(): array
{
return [
'custom_domains' => 'array',
'settings' => 'array'
];
}
protected $cachableAttributes = [
'is_pro',
'is_enterprise',
'is_risky',
'submissions_count',
'max_file_size',
2024-02-23 11:54:12 +01:00
'custom_domain_count',
];
2022-09-20 21:59:52 +02:00
public function getMaxFileSizeAttribute()
{
if (!pricing_enabled()) {
return self::MAX_FILE_SIZE_PRO;
}
2024-02-23 11:54:12 +01:00
return $this->remember('max_file_size', 15 * 60, function (): int {
// Return max file size depending on subscription
foreach ($this->owners as $owner) {
if ($owner->is_subscribed) {
if ($license = $owner->activeLicense()) {
// In case of special License
return $license->max_file_size;
}
}
2024-02-23 11:54:12 +01:00
return self::MAX_FILE_SIZE_PRO;
}
return self::MAX_FILE_SIZE_FREE;
});
}
public function getCustomDomainCountLimitAttribute()
{
if (!pricing_enabled()) {
return null;
}
2024-02-23 11:54:12 +01:00
return $this->remember('custom_domain_count', 15 * 60, function (): ?int {
foreach ($this->owners as $owner) {
if ($owner->is_subscribed) {
if ($license = $owner->activeLicense()) {
// In case of special License
return $license->custom_domain_limit_count;
}
2024-02-23 11:54:12 +01:00
2023-12-03 15:33:29 +01:00
return self::MAX_DOMAIN_PRO;
}
}
return 0;
});
}
public function getIsProAttribute()
{
if (!pricing_enabled()) {
return true; // If no paid plan so TRUE for ALL
}
2024-02-23 11:54:12 +01:00
return $this->remember('is_pro', 15 * 60, function (): bool {
// Make sure at least one owner is pro
foreach ($this->owners as $owner) {
if ($owner->is_subscribed) {
return true;
}
}
2024-02-23 11:54:12 +01:00
return false;
});
}
public function getIsTrialingAttribute()
{
if (!pricing_enabled()) {
return false; // If no paid plan so FALSE for ALL
}
return $this->remember('is_trialing', 15 * 60, function (): bool {
// Make sure at least one owner is pro
foreach ($this->owners as $owner) {
if ($owner->onTrial()) {
return true;
}
}
return false;
});
}
2022-09-20 21:59:52 +02:00
public function getIsEnterpriseAttribute()
{
if (!pricing_enabled()) {
return true; // If no paid plan so TRUE for ALL
}
2022-09-20 21:59:52 +02:00
2024-02-23 11:54:12 +01:00
return $this->remember('is_enterprise', 15 * 60, function (): bool {
// Make sure at least one owner is pro
foreach ($this->owners as $owner) {
if ($owner->has_enterprise_subscription) {
return true;
}
2022-09-20 21:59:52 +02:00
}
2024-02-23 11:54:12 +01:00
return false;
});
2022-09-20 21:59:52 +02:00
}
public function getIsRiskyAttribute()
{
2024-02-23 11:54:12 +01:00
return $this->remember('is_risky', 15 * 60, function (): bool {
// A workspace is risky if all of his users are risky
foreach ($this->owners as $owner) {
if (!$owner->is_risky) {
return false;
}
}
return true;
});
}
public function getSubmissionsCountAttribute()
{
2024-02-23 11:54:12 +01:00
return $this->remember('submissions_count', 15 * 60, function (): int {
$total = 0;
foreach ($this->forms as $form) {
$total += $form->submissions_count;
}
return $total;
});
}
2022-09-20 21:59:52 +02:00
/**
* Relationships
*/
public function users()
{
return $this->belongsToMany(User::class);
}
public function invites()
{
return $this->hasMany(UserInvite::class);
}
2022-09-20 21:59:52 +02:00
public function owners()
{
return $this->users()->wherePivot('role', 'admin');
}
public function billingOwners(): Collection
{
return $this->owners->filter(fn ($owner) => $owner->is_subscribed);
}
2022-09-20 21:59:52 +02:00
public function forms()
{
return $this->hasMany(Form::class);
}
Readonly User (#637) * Readonly User * Refactor FormPolicy and TemplatePolicy to centralize write operation logic - Introduced a private method `canPerformWriteOperation` in both FormPolicy and TemplatePolicy to encapsulate the logic for determining if a user can perform write operations on the respective models. - Updated the `update`, `delete`, `restore`, and `forceDelete` methods in FormPolicy to use the new method for improved readability and maintainability. - Simplified the `update` and `delete` methods in TemplatePolicy to leverage the centralized write operation logic. This refactoring enhances code clarity and reduces duplication across policy classes. * Refactor user and workspace permissions handling - Updated FormController to authorize form creation based on workspace context. - Removed the `is_readonly` attribute from UserResource and integrated it into WorkspaceResource for better encapsulation. - Refactored User model to eliminate the `getIsReadonlyAttribute` method, shifting readonly logic to the Workspace model. - Adjusted FormPolicy and TemplatePolicy to utilize workspace readonly checks for user permissions. - Updated various frontend components to reference workspace readonly status instead of user readonly status, enhancing clarity and consistency in permission handling. These changes improve the management of user permissions in relation to workspaces, ensuring a more robust and maintainable authorization system. * Fix isReadonlyUser * fix pint --------- Co-authored-by: Julien Nahum <julien@nahum.net>
2024-12-30 14:35:23 +01:00
public function isReadonlyUser(?User $user)
{
return $user ? $this->users()
->wherePivot('user_id', $user->id)
->wherePivot('role', User::ROLE_READONLY)
->exists() : false;
}
2022-09-20 21:59:52 +02:00
}