Skip to content
Open
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
4 changes: 2 additions & 2 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
"ext-json": "*",
"aws/aws-sdk-php-laravel": "^3.9",
"doctrine/dbal": "^4.0",
"illuminate/support": "^10.0|^11.0",
"illuminate/support": "^10.0|^11.0|^12.0",
"kriswallsmith/buzz": "^1.2",
"mailgun/mailgun-php": "^4.2",
"mailjet/mailjet-apiv3-php": "^1.6",
Expand All @@ -21,7 +21,7 @@
"wildbit/postmark-php": "^6.0"
},
"require-dev": {
"orchestra/testbench": "^9.0",
"orchestra/testbench": "^9.0|^10.0",
"phpunit/phpunit": "^11.0",
"roave/security-advisories": "dev-master"
},
Expand Down
4 changes: 3 additions & 1 deletion config/config.php
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
<?php

return [
// ...
'database' => [
'connection' => env('SP_DB_CONNECTION', env('DB_CONNECTION', 'mysql')),
]
];
2 changes: 1 addition & 1 deletion database/migrations/2020_10_16_092234_prefix_tables.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
use Illuminate\Database\Migrations\Migration;
use Illuminate\Support\Facades\Schema;

class PrefixTables extends Migration
class PrefixTables extends \Sendportal\Base\SendPortalMigration
{
/**
* Run the migrations.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class RenameSegmentsToTags extends Migration
class RenameSegmentsToTags extends \Sendportal\Base\SendPortalMigration
{
/**
* Run the migrations.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
use Illuminate\Support\Facades\DB;
use Sendportal\Base\Models\EmailServiceType;

class AddSmtpEmailServiceType extends Migration
class AddSmtpEmailServiceType extends \Sendportal\Base\SendPortalMigration
{
/**
* Run the migrations.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
use Illuminate\Support\Facades\DB;
use Sendportal\Base\Models\EmailServiceType;

class AddPostalEmailServiceType extends Migration
class AddPostalEmailServiceType extends \Sendportal\Base\SendPortalMigration
{
/**
* Run the migrations.
Expand Down
7 changes: 6 additions & 1 deletion resources/views/layouts/partials/sidebar.blade.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
<i class="fa-fw fas fa-envelope mr-2"></i><span>{{ __('Campaigns') }}</span>
</a>
</li>
@if (\Sendportal\Base\Facades\Helper::isPro())
@if (\Sendportal\Base\Facades\Helper::isPro() && Route::has('sendportal.automations.index'))
<li class="nav-item {{ request()->is('*automations*') ? 'active' : '' }}">
<a class="nav-link" href="{{ route('sendportal.automations.index') }}">
<i class="fa-fw fas fa-sync-alt mr-2"></i><span>{{ __('Automations') }}</span>
Expand All @@ -27,6 +27,11 @@
<i class="fa-fw fas fa-user mr-2"></i><span>{{ __('Subscribers') }}</span>
</a>
</li>
<li class="nav-item {{ request()->is('*tags*') ? 'active' : '' }}">
<a class="nav-link" href="{{ route('sendportal.tags.index') }}">
<i class="fa-fw fas fa-tag mr-2"></i><span>{{ __('Tags') }}</span>
</a>
</li>
<li class="nav-item {{ request()->is('*messages*') ? 'active' : '' }}">
<a class="nav-link" href="{{ route('sendportal.messages.index') }}">
<i class="fa-fw fas fa-paper-plane mr-2"></i><span>{{ __('Messages') }}</span>
Expand Down
3 changes: 1 addition & 2 deletions src/Http/Controllers/Controller.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,8 @@
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
use Illuminate\Foundation\Bus\DispatchesJobs;
use Illuminate\Foundation\Validation\ValidatesRequests;
use Illuminate\Routing\Controller as BaseController;

class Controller extends BaseController
class Controller
{
use AuthorizesRequests;
use DispatchesJobs;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@ public function index(): View
{
$emailServices = $this->emailServices->all(Sendportal::currentWorkspaceId());

$emailServices->load('type');

return view('sendportal::email_services.index', compact('emailServices'));
}

Expand Down
2 changes: 1 addition & 1 deletion src/Http/Controllers/Subscribers/SubscribersController.php
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ public function create(): View
*/
public function store(SubscriberRequest $request): RedirectResponse
{
$data = $request->all();
$data = $request->validated();
$data['unsubscribed_at'] = $request->has('subscribed') ? null : now();
$data['unsubscribe_event_id'] = $request->has('subscribed') ? null : UnsubscribeEventType::MANUAL_BY_ADMIN;

Expand Down
4 changes: 2 additions & 2 deletions src/Http/Controllers/Tags/TagsController.php
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ public function create(): View
*/
public function store(TagStoreRequest $request): RedirectResponse
{
$this->tagRepository->store(Sendportal::currentWorkspaceId(), $request->all());
$this->tagRepository->store(Sendportal::currentWorkspaceId(), $request->validated());

return redirect()->route('sendportal.tags.index');
}
Expand All @@ -63,7 +63,7 @@ public function edit(int $id): View
*/
public function update(int $id, TagUpdateRequest $request): RedirectResponse
{
$this->tagRepository->update(Sendportal::currentWorkspaceId(), $id, $request->all());
$this->tagRepository->update(Sendportal::currentWorkspaceId(), $id, $request->validated());

return redirect()->route('sendportal.tags.index');
}
Expand Down
6 changes: 4 additions & 2 deletions src/Http/Requests/CampaignStoreRequest.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@

use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rule;
use Sendportal\Base\Models\EmailService;
use Sendportal\Base\Models\Template;

class CampaignStoreRequest extends FormRequest
{
Expand Down Expand Up @@ -40,11 +42,11 @@ protected function getRules(): array
'email_service_id' => [
'required',
'integer',
'exists:sendportal_email_services,id',
Rule::exists(EmailService::class, 'id')
],
'template_id' => [
'nullable',
'exists:sendportal_templates,id',
Rule::exists(Template::class, 'id')
],
'content' => [
Rule::requiredIf($this->template_id === null),
Expand Down
3 changes: 2 additions & 1 deletion src/Http/Requests/SubscriberRequest.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rule;
use Sendportal\Base\Facades\Sendportal;
use Sendportal\Base\Models\Subscriber;

/**
* @property-read string $subscriber
Expand All @@ -19,7 +20,7 @@ public function rules(): array
'required',
'email',
'max:255',
Rule::unique('sendportal_subscribers', 'email')
Rule::unique(Subscriber::class, 'email')
->ignore($this->subscriber, 'id')
->where(static function (Builder $query) {
$query->where('workspace_id', Sendportal::currentWorkspaceId());
Expand Down
3 changes: 2 additions & 1 deletion src/Http/Requests/TagStoreRequest.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rule;
use Sendportal\Base\Facades\Sendportal;
use Sendportal\Base\Models\Tag;

class TagStoreRequest extends FormRequest
{
Expand All @@ -16,7 +17,7 @@ public function rules(): array
'name' => [
'required',
'max:255',
Rule::unique('sendportal_tags')
Rule::unique(Tag::class)
->where('workspace_id', Sendportal::currentWorkspaceId()),
],
];
Expand Down
3 changes: 2 additions & 1 deletion src/Http/Requests/TagUpdateRequest.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rule;
use Sendportal\Base\Facades\Sendportal;
use Sendportal\Base\Models\Tag;

class TagUpdateRequest extends FormRequest
{
Expand All @@ -16,7 +17,7 @@ public function rules(): array
'name' => [
'required',
'max:255',
Rule::unique('sendportal_tags')
Rule::unique(Tag::class)
->where('workspace_id', Sendportal::currentWorkspaceId())
->ignore($this->tag),
],
Expand Down
3 changes: 2 additions & 1 deletion src/Http/Requests/TemplateStoreRequest.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rule;
use Sendportal\Base\Facades\Sendportal;
use Sendportal\Base\Models\Template;

class TemplateStoreRequest extends FormRequest
{
Expand All @@ -19,7 +20,7 @@ public function rules(): array
'name' => [
'required',
'max:255',
Rule::unique('sendportal_templates')
Rule::unique(Template::class)
->where('workspace_id', Sendportal::currentWorkspaceId()),
],
'content' => 'required',
Expand Down
3 changes: 2 additions & 1 deletion src/Http/Requests/TemplateUpdateRequest.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rule;
use Sendportal\Base\Facades\Sendportal;
use Sendportal\Base\Models\Template;

class TemplateUpdateRequest extends FormRequest
{
Expand All @@ -19,7 +20,7 @@ public function rules(): array
'name' => [
'required',
'max:255',
Rule::unique('sendportal_templates')
Rule::unique(Template::class)
->where('workspace_id', Sendportal::currentWorkspaceId())
->ignore($this->template),
],
Expand Down
5 changes: 5 additions & 0 deletions src/Models/BaseModel.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,11 @@

class BaseModel extends Model
{
public function getConnectionName()
{
return config('sendportal.database.connection');
}

/**
* Store which fields are boolean in the model
*
Expand Down
19 changes: 5 additions & 14 deletions src/Models/EmailService.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

use Carbon\Carbon;
use Database\Factories\EmailServiceFactory;
use Illuminate\Database\Eloquent\Casts\Attribute;
use Illuminate\Database\Eloquent\Collection as EloquentCollection;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
Expand Down Expand Up @@ -74,14 +75,6 @@ public function campaigns(): HasMany
return $this->hasMany(Campaign::class, 'email_service_id');
}

/**
* Automations using this email service.
*/
public function automations(): HasMany
{
return $this->hasMany(Automation::class, 'email_service_id');
}

public function setSettingsAttribute(array $data): void
{
$this->attributes['settings'] = encrypt(json_encode($data));
Expand All @@ -92,12 +85,10 @@ public function getSettingsAttribute(string $value): array
return json_decode(decrypt($value), true);
}

public function getInUseAttribute(): bool
public function inUse(): Attribute
{
if (Helper::isPro()) {
return (bool)$this->campaigns()->count() + $this->automations()->count();
}

return (bool)$this->campaigns()->count();
return Attribute::get(
fn() => $this->campaigns()->exists()
)->shouldCache();
}
}
7 changes: 5 additions & 2 deletions src/Models/Template.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

use Carbon\Carbon;
use Database\Factories\TemplateFactory;
use Illuminate\Database\Eloquent\Casts\Attribute;
use Illuminate\Database\Eloquent\Collection as EloquentCollection;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Relations\HasMany;
Expand Down Expand Up @@ -47,8 +48,10 @@ public function campaigns(): HasMany
return $this->hasMany(Campaign::class);
}

public function isInUse(): bool
public function isInUse(): Attribute
{
return $this->campaigns()->count() > 0;
return Attribute::get(
fn()=> $this->campaigns()->count() > 0
)->shouldCache();
}
}
7 changes: 7 additions & 0 deletions src/Repositories/BaseTenantRepository.php
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,13 @@ abstract class BaseTenantRepository implements BaseTenantInterface
*/
private $orderDirection = 'asc';

protected string $connectionName;

public function __construct()
{
$this->connectionName = config('sendportal.database.connection');
}

/**
* Return all records
*
Expand Down
3 changes: 2 additions & 1 deletion src/Repositories/Campaigns/BaseCampaignTenantRepository.php
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,8 @@ public function completedCampaigns(int $workspaceId, array $relations = []): Elo
*/
public function getCounts(Collection $campaignIds, int $workspaceId): array
{
$counts = DB::table('sendportal_campaigns')
$counts = DB::connection($this->connectionName)
->table('sendportal_campaigns')
->leftJoin('sendportal_messages', function ($join) use ($campaignIds, $workspaceId) {
$join->on('sendportal_messages.source_id', '=', 'sendportal_campaigns.id')
->where('sendportal_messages.source_type', Campaign::class)
Expand Down
3 changes: 2 additions & 1 deletion src/Repositories/EmailServiceTenantRepository.php
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,8 @@ class EmailServiceTenantRepository extends BaseTenantRepository
*/
public function getEmailServiceTypes()
{
return EmailServiceType::orderBy('name')->get();
return EmailServiceType::orderBy('name')
->get();
}

/**
Expand Down
3 changes: 2 additions & 1 deletion src/Repositories/Messages/BaseMessageTenantRepository.php
Original file line number Diff line number Diff line change
Expand Up @@ -129,7 +129,8 @@ public function unsubscribes(int $workspaceId, string $sourceType, int $sourceId
*/
public function getFirstOpenedAt(int $workspaceId, string $sourceType, int $sourceId)
{
return DB::table('sendportal_messages')
return DB::connection($this->connectionName)
->table('sendportal_messages')
->select(DB::raw('MIN(opened_at) as first'))
->where('workspace_id', $workspaceId)
->where('source_type', $sourceType)
Expand Down
3 changes: 2 additions & 1 deletion src/Repositories/Messages/MySqlMessageTenantRepository.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,8 @@ class MySqlMessageTenantRepository extends BaseMessageTenantRepository
*/
public function countUniqueOpensPerPeriod(int $workspaceId, string $sourceType, int $sourceId, int $intervalInSeconds): Collection
{
return DB::table('sendportal_messages')
return DB::connection($this->connectionName)
->table('sendportal_messages')
->selectRaw('COUNT(*) as open_count, MIN(opened_at) as opened_at, FROM_UNIXTIME(MIN(UNIX_TIMESTAMP(opened_at) DIV ' . $intervalInSeconds . ') * ' . $intervalInSeconds . ') as period_start')
->where('workspace_id', $workspaceId)
->where('source_type', $sourceType)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,8 @@ class PostgresMessageTenantRepository extends BaseMessageTenantRepository
*/
public function countUniqueOpensPerPeriod(int $workspaceId, string $sourceType, int $sourceId, int $intervalInSeconds): Collection
{
return DB::table('sendportal_messages')
return DB::connection($this->connectionName)
->table('sendportal_messages')
->selectRaw("COUNT(*) as open_count, MIN(opened_at) as opened_at, to_char(to_timestamp(floor(extract('epoch' from opened_at) / {$intervalInSeconds}) * {$intervalInSeconds}),'YYYY-MM-DD HH24:MI:SS') as period_start")
->where('workspace_id', $workspaceId)
->where('source_type', $sourceType)
Expand Down
Loading