117 lines
3.8 KiB
PHP
117 lines
3.8 KiB
PHP
|
<?php
|
||
|
|
||
|
namespace App\Console\Commands;
|
||
|
|
||
|
use App\Models\Forms\FormStatistic;
|
||
|
use Illuminate\Console\Command;
|
||
|
use App\Models\Forms\FormView;
|
||
|
use App\Models\Forms\FormSubmission;
|
||
|
use Illuminate\Support\Facades\DB;
|
||
|
|
||
|
class CleanDatabase extends Command
|
||
|
{
|
||
|
/**
|
||
|
* The name and signature of the console command.
|
||
|
*
|
||
|
* @var string
|
||
|
*/
|
||
|
protected $signature = 'forms:database-cleanup';
|
||
|
|
||
|
/**
|
||
|
* The console command description.
|
||
|
*
|
||
|
* @var string
|
||
|
*/
|
||
|
protected $description = 'Database Cleanup';
|
||
|
|
||
|
/**
|
||
|
* Execute the console command.
|
||
|
*
|
||
|
* @return int
|
||
|
*/
|
||
|
public function handle()
|
||
|
{
|
||
|
$this->cleanFormStatistics();
|
||
|
|
||
|
$this->line('Database Cleanup Success.');
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Manage FormViews & FormSubmissions records
|
||
|
*/
|
||
|
private function cleanFormStatistics()
|
||
|
{
|
||
|
$this->line('Aggregating form views...');
|
||
|
$now = now();
|
||
|
$finalData = [];
|
||
|
|
||
|
// Form Views
|
||
|
FormView::select('form_id', DB::raw('DATE(created_at) as date'), DB::raw('count(*) as views'))
|
||
|
->where('created_at', '<', $now)
|
||
|
->orderBy('date')
|
||
|
->groupBy('form_id', 'date')
|
||
|
->get()->each(function ($row) use (&$finalData) {
|
||
|
$finalData[$row->form_id."-".$row->date] = [
|
||
|
'form_id' => $row->form_id,
|
||
|
'date' => $row->date,
|
||
|
'data' => [
|
||
|
'views' => $row->views,
|
||
|
'submissions' => 0
|
||
|
]
|
||
|
];
|
||
|
});
|
||
|
|
||
|
// Form Submissions
|
||
|
$this->line('Aggregating form submissions...');
|
||
|
FormSubmission::select('form_id', DB::raw('DATE(created_at) as date'), DB::raw('count(*) as submissions'))
|
||
|
->whereDate('created_at', '<=', now()->startOfDay())
|
||
|
->orderBy('date')
|
||
|
->groupBy('form_id', 'date')
|
||
|
->get()->each(function ($row) use (&$finalData) {
|
||
|
$key = $row->form_id."-".$row->date;
|
||
|
if (isset($finalData[$key])) {
|
||
|
$finalData[$key]['data']['submissions'] = $row->submissions;
|
||
|
} else {
|
||
|
$finalData[$key] = [
|
||
|
'form_id' => $row->form_id,
|
||
|
'date' => $row->date,
|
||
|
'data' => [
|
||
|
'views' => 0,
|
||
|
'submissions' => $row->submissions
|
||
|
]
|
||
|
];
|
||
|
}
|
||
|
|
||
|
});
|
||
|
|
||
|
if ($finalData) {
|
||
|
$this->line('Storing aggregated data...');
|
||
|
$created = 0;
|
||
|
$updated = 0;
|
||
|
// Insert into Form Statistic
|
||
|
foreach ($finalData as $row) {
|
||
|
$found = FormStatistic::where([['form_id', $row['form_id']], ['date', $row['date']]])->first();
|
||
|
if ($found !== null) { // If found update
|
||
|
$newData = $found->data;
|
||
|
$newData['views'] = $newData['views'] + $row['data']['views'];
|
||
|
$newData['submissions'] = $newData['submissions'] + $row['data']['submissions'];
|
||
|
$found->update(['data' => $newData]);
|
||
|
$updated++;
|
||
|
} else { // Otherwise create new
|
||
|
FormStatistic::create($row);
|
||
|
$created++;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
$this->line($created.' form statistics records created.');
|
||
|
$this->line($updated.' form statistics records updated.');
|
||
|
|
||
|
// Delete Form Views those are migrated
|
||
|
$formViewRemovedCount = FormView::where('created_at', '<', $now)->delete();
|
||
|
$this->line($formViewRemovedCount.' form views records deleted.');
|
||
|
} else {
|
||
|
$this->line('No aggregate to store.');
|
||
|
}
|
||
|
}
|
||
|
}
|