1<?php 2 3/** 4 * webtrees: online genealogy 5 * Copyright (C) 2022 webtrees development team 6 * This program is free software: you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License as published by 8 * the Free Software Foundation, either version 3 of the License, or 9 * (at your option) any later version. 10 * This program is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 * GNU General Public License for more details. 14 * You should have received a copy of the GNU General Public License 15 * along with this program. If not, see <https://www.gnu.org/licenses/>. 16 */ 17 18declare(strict_types=1); 19 20namespace Fisharebest\Webtrees\Services; 21 22use Fisharebest\Webtrees\Registry; 23use Illuminate\Database\Capsule\Manager as DB; 24use Illuminate\Database\Query\Builder; 25use Illuminate\Database\Query\Expression; 26 27use function addcslashes; 28 29/** 30 * Manage site logs 31 */ 32class SiteLogsService 33{ 34 /** 35 * Generate a query for filtering the changes log. 36 * 37 * @param array<string> $params 38 * 39 * @return Builder 40 */ 41 public function logsQuery(array $params): Builder 42 { 43 $tree = $params['tree']; 44 $from = $params['from']; 45 $to = $params['to']; 46 $type = $params['type']; 47 $text = $params['text']; 48 $ip = $params['ip']; 49 $username = $params['username']; 50 51 $query = DB::table('log') 52 ->leftJoin('user', 'user.user_id', '=', 'log.user_id') 53 ->leftJoin('gedcom', 'gedcom.gedcom_id', '=', 'log.gedcom_id') 54 ->select(['log.*', new Expression("COALESCE(user_name, '<none>') AS user_name"), new Expression("COALESCE(gedcom_name, '<none>') AS gedcom_name")]); 55 56 if ($from !== '') { 57 $query->where('log_time', '>=', Registry::timestampFactory()->fromString($from, 'Y-m-d')->toDateString()); 58 } 59 60 if ($to !== '') { 61 // before end of the day 62 $query->where('log_time', '<', Registry::timestampFactory()->fromString($to, 'Y-m-d')->addDays(1)->toDateString()); 63 } 64 65 if ($type !== '') { 66 $query->where('log_type', '=', $type); 67 } 68 69 if ($text !== '') { 70 $query->where('log_message', 'LIKE', '%' . addcslashes($text, '\\%_') . '%'); 71 } 72 73 if ($ip !== '') { 74 $query->where('ip_address', 'LIKE', addcslashes($ip, '\\%_') . '%'); 75 } 76 77 if ($username !== '') { 78 $query->where('user_name', '=', $username); 79 } 80 81 if ($tree !== '') { 82 $query->where('gedcom_name', '=', $tree); 83 } 84 85 return $query; 86 } 87} 88