PHP 7.4.33
Preview: ScheduleEmailRepository.php Size: 10.79 KB
/var/www/multi-event-cfp.bitkit.dk/httpdocs/app/Repositories/ScheduleEmailRepository.php
<?php

namespace App\Repositories;

use App\Models\ScheduleEmail;
use Illuminate\Support\Facades\Validator;
use Illuminate\Http\Request;
use App\Support\Query;
use Illuminate\Support\Facades\DB;
use App\Models\File;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Facades\Artisan;
use Illuminate\Support\Facades\Storage;


use Log;

class ScheduleEmailRepository extends Repository
{
    public function __construct($event = null)
    {
        $this->for($event);
    }


    public function model(): ?ScheduleEmail
    {
        return new ScheduleEmail;
    }

    public function query($as = null)
    {
        $model = $this->model();
        return $model->newQuery();
    }

    public function saveEmail($request, $event)
    {
        $data = $request->get('data');
        // data 
        $data = json_decode($data, true);
        // validation
        $validator = Validator::make($data, [
            'recipients' => ['required'],
            'subject' => ['string', 'max:255'],
            'body' => ['string', 'nullable'],
            'attachment' => ['array', 'nullable'],
        ]);
        if ($validator->fails()) {
            validationErrorResponse($validator->errors());
        }
        else {
            $data['filter']['recipients'] = $data['recipients'];
            $data['filter']['interval'] = [
                "interval" => @$data['interval'],
                "interval_day" => (isset($data['interval_day'])) ? $data['interval_day'] : "",
                "interval_month_number" => (isset($data['interval_month_number'])) ? $data['interval_month_number'] : "",
                "interval_day_number" => (isset($data['interval_day_number'])) ? $data['interval_day_number'] : "",
                "interval_time" => @$data['interval_time'],
            ];
            $emailData = [
                'email_status' => 0,
                'email_type' => $data['email_type'],
                'filter' => json_encode($data['filter']),
                'subject' => isset($data['subject']) ? $data['subject'] : '',
                'submission_status' => $data['submission_status'],
                'body' => isset($data['body']) ? $data['body'] : '',
                'send_date' => Null,
            ];

            $emailId = $data['email_id'];
            $emailType = (isset($data['schedule_type'])) ? $data['schedule_type'] : "new";

            if ($emailId && $data['submission_status'] != 1 && $emailType != "Instant") {
                $emailData['submission_status'] = $data['submission_status'];
                // unset($emailData['email_status']);
                $email = ScheduleEmail::find($emailId);
                $email = $email->fill($emailData);
                $email->save();
                $attachmentData = $this->handleEmailFiles($request, $email, $data);
                $email->attachments = $attachmentData;
                $email->save();
                return response([
                    'status' => true,
                    'message' => "Mail updated Successfully",
                    'email' => $email
                ]);
            }
            else if ($emailId && $emailType == "Draft") {
                $emailData['submission_status'] = $data['submission_status'];
                // unset($emailData['email_status']);
                $email = ScheduleEmail::find($emailId);
                $email = $email->fill($emailData);
                $email->save();
                $attachmentData = $this->handleEmailFiles($request, $email, $data);
                $email->attachments = $attachmentData;
                $email->save();

                if ($data['submission_status'] == 1) {
                    Artisan::call('schedule:email ' . $email->id);
                }
                return response([
                    'status' => true,
                    'message' => "Mail updated Successfully",
                    'email' => $email
                ]);
            }
            else {
                $email = new ScheduleEmail([
                    'event_id' => $event->id,
                ]);

                $email = $email->fill($emailData);
                $email->save();
                $attachmentData = $this->handleEmailFiles($request, $email, $data);
                $email->attachments = $attachmentData;
                $email->save();
                if ($data['submission_status'] == 1) {
                    Artisan::call('schedule:email ' . $email->id);
                }
                return response([
                    'status' => true,
                    'message' => "Mail Created Successfully",
                    'email' => $email
                ]);
            }
        }
    }
    public function handleEmailFiles(Request $request, ScheduleEmail $email, $data)
    {

        $attachmentData = $data['attachments'];
        //handling uploaded files
        if ($request->hasFile('attachments')) {
            $files = $request->file('attachments');
            $fileContents = [];
            foreach ($files as $file) {
                $fileObj = $email->saveFile(
                    $file,
                    null,
                    "{$email->id}/files/",
                    "schedule_email.file",
                    null,
                    true
                );
                $fileContents[] = $fileObj->getFileObject();
            }

            $attachmentData = array_values(array_filter(array_merge($data['attachments'], $fileContents)));
        }

        //handling removed files
        $removedFiles = $data['removed_files'];

        if (isset($removedFiles)) {
            $fileIds = $removedFiles;
            foreach ($fileIds as $fileId) {

                $this->deleteFile($fileId);
            }
        }

        return $attachmentData;
    }

    public function scope($arguments, $callback = null)
    {
        //get query builder
        $query = $this->query()
            ->select($this->selectColumns());

        //applying different scopes based on the arguments
        $this->applyScope($query, $arguments);

        //resolve if there is any callback functions available
        return $this->resolve($query, $arguments, $callback);
    }


    public function applyScope(Builder $query, $arguments): Builder
    {
        $this->applyEventScope($query, $arguments);

        $this->applyOrder($query, $arguments);

        $this->applySearch($query, $arguments);

        return $query;
    }

    public function applyEventScope(Builder $query, $arguments): Builder
    {
        if ($arguments->event) {

            $query->where('schedule_emails.event_id', '=', $arguments->event->id);
        }

        return $query;
    }


    public function applyOrder(Builder $query, Query $arguments): Builder
    {
        $emailColumns = [
            'subject' => 'schedule_emails.subject',
            'email_type' => 'schedule_emails.email_type',
            'email_status' => 'schedule_emails.email_status',
            'send_date' => 'schedule_emails.send_date',
            'submission_status' => 'schedule_emails.submission_status'
        ];

        $sorts = json_decode($arguments->sort, true) ?? [];
        foreach ($sorts as $sort => $method) {
            if (array_key_exists($sort, $emailColumns)) {
                $query->orderBy($sort, $method);
            }
        }

        return $query;
    }


    public function applySearch(Builder $query, $arguments): Builder
    {
        if ($arguments->search) {
            $emailColumns = [
                'title' => 'schedule_emails.subject',
                'type' => 'schedule_emails.email_type',
                'email_status' => 'schedule_emails.email_status',
                'submission_status' => 'schedule_emails.submission_status',

            ];
            $search = strtolower($arguments->search);
            $query->where(function ($query) use ($search, $emailColumns) {
                foreach ($emailColumns as $key => $emailColumn) {
                    if ($key == 'email_status') {
                        $query->orWhere(DB::raw("CASE 
                        WHEN schedule_emails.email_status = 0 THEN 'pending' 
                        WHEN schedule_emails.email_status = 1 THEN 'success' 
                        WHEN schedule_emails.email_status = 2 THEN 'Failed' 
                        ELSE  'Failed (No valid data)' END"), 'like', "%{$search}%");
                    }
                    else if ($key == 'submission_status') {
                        $query->orWhere(DB::raw("CASE 
                        WHEN schedule_emails.submission_status = 0 THEN 'schedule'
                        WHEN schedule_emails.submission_status = 2 THEN 'draft'  
                        ELSE  'instant' END"), 'like', "%{$search}%");
                    }
                    else {
                        $query->orWhere(DB::raw("lower($emailColumn)"), 'like', "%{$search}%");
                    }
                }
            });
        }

        return $query;
    }
    public function selectColumns(): array
    {
        return [
            "schedule_emails.id",
            "schedule_emails.event_id",
            DB::raw("CASE 
                WHEN schedule_emails.email_status = 0 THEN 'Pending' 
                WHEN schedule_emails.email_status = 1 THEN 'Success' 
                WHEN schedule_emails.email_status = 2 THEN 'Failed' 
                ELSE  'Failed (No valid data)' END as email_status"),
            DB::raw("CASE 
                WHEN schedule_emails.submission_status = 0 THEN 'Schedule' 
                WHEN schedule_emails.submission_status = 2 THEN 'Draft' 
                ELSE  'Instant' END as schedule_type"),
            "schedule_emails.email_type",
            "schedule_emails.filter",
            "schedule_emails.subject",
            "schedule_emails.body",
            "schedule_emails.attachments",
            "schedule_emails.send_date"
        ];
    }


    public function listing($request, $paginate)
    {
        //building arguments
        $arguments = $this->arguments($request);

        //building query
        $query = $this->scope($arguments);

        return ($paginate && $arguments->paging != 'All') ? $query->paginate($arguments->paging, ['*'], 'page', $arguments->page) : $query->get();
    }
    public function fetchSingleEmail($id, $role = null, $request)
    {
        // event
        $event = $request->get('event');

        $email = ScheduleEmail::select($this->selectColumns())->find($id);

        if (!$email)
            return null;
        return $email;
    }

    public function delete(ScheduleEmail $email)
    {
        // delete if there is any attachments
        if (isset($email->attachments)) {
            foreach ($email->attachments as $attachment) {

                $this->deleteFile($attachment['file_id']);
            }
        }

        //delete directory
        Storage::deleteDirectory('private/media/schedule_emails/' . $email->id);
        $email->delete();
    }

}

Directory Contents

Dirs: 0 × Files: 17
Name Size Perms Modified Actions
75.27 KB lrw-rw-r-- 2026-04-30 09:24:04
Edit Download
1.21 KB lrw-rw-r-- 2025-04-21 06:11:52
Edit Download
65 B lrw-r--r-- 2024-02-09 12:37:30
Edit Download
8.53 KB lrw-rw-r-- 2025-03-03 05:39:26
Edit Download
4.14 KB lrw-rw-r-- 2025-10-28 05:24:52
Edit Download
8.53 KB lrw-rw-r-- 2025-10-28 05:24:35
Edit Download
37.58 KB lrw-rw-r-- 2026-04-07 05:00:51
Edit Download
8.71 KB lrw-r--r-- 2024-02-09 12:37:30
Edit Download
59.48 KB lrwxrwxr-x 2026-04-30 09:24:03
Edit Download
4.78 KB lrw-r--r-- 2024-02-09 12:37:30
Edit Download
10.79 KB lrw-rw-r-- 2025-04-21 06:11:52
Edit Download
11.37 KB lrw-rw-r-- 2024-07-24 04:42:48
Edit Download
72.51 KB lrw-rw-r-- 2026-04-22 04:31:21
Edit Download
11.43 KB lrw-rw-r-- 2024-09-20 05:02:14
Edit Download
6.57 KB lrw-rw-r-- 2026-03-31 07:16:20
Edit Download
4.26 KB lrw-r--r-- 2024-02-09 12:37:30
Edit Download
128.96 KB lrw-rw-r-- 2026-05-07 09:06:13
Edit Download
If ZipArchive is unavailable, a .tar will be created (no compression).