configure-delete-window (#66)
Let users configure the amount of time that a tick can be deleted Reviewed-on: https://gitea.subcultureofone.org/greg/tkr/pulls/66 Co-authored-by: Greg Sarjeant <greg@subcultureofone.org> Co-committed-by: Greg Sarjeant <greg@subcultureofone.org>
This commit is contained in:
		
							parent
							
								
									86abf587f6
								
							
						
					
					
						commit
						801bbebf4f
					
				| @ -0,0 +1,2 @@ | |||||||
|  | ALTER TABLE settings | ||||||
|  | ADD COLUMN tick_delete_hours INTEGER NULL; | ||||||
| @ -42,6 +42,12 @@ if (!$prerequisites->validateApplication()) { | |||||||
| // Get the working database connection from prerequisites
 | // Get the working database connection from prerequisites
 | ||||||
| $db = $prerequisites->getDatabase(); | $db = $prerequisites->getDatabase(); | ||||||
| 
 | 
 | ||||||
|  | // Apply any pending database migrations
 | ||||||
|  | if (!$prerequisites->applyMigrations($db)){ | ||||||
|  |     $prerequisites->generateWebSummary(); | ||||||
|  |     exit; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // Check if setup is complete (user exists and URL is configured)
 | // Check if setup is complete (user exists and URL is configured)
 | ||||||
| if (!(preg_match('/tkr-setup$/', $path))) { | if (!(preg_match('/tkr-setup$/', $path))) { | ||||||
|     try { |     try { | ||||||
|  | |||||||
| @ -91,6 +91,7 @@ class AdminController extends Controller { | |||||||
|         $itemsPerPage        = (int) ($postData['items_per_page'] ?? 25); |         $itemsPerPage        = (int) ($postData['items_per_page'] ?? 25); | ||||||
|         $strictAccessibility = isset($postData['strict_accessibility']); |         $strictAccessibility = isset($postData['strict_accessibility']); | ||||||
|         $logLevel            = (int) ($postData['log_level'] ?? 0); |         $logLevel            = (int) ($postData['log_level'] ?? 0); | ||||||
|  |         $tickDeleteHours     = (int) ($postData['tick_delete_hours'] ?? 1); | ||||||
| 
 | 
 | ||||||
|         // Password
 |         // Password
 | ||||||
|         $password        = $postData['password'] ?? ''; |         $password        = $postData['password'] ?? ''; | ||||||
| @ -152,6 +153,7 @@ class AdminController extends Controller { | |||||||
|                 $app['settings']->itemsPerPage = $itemsPerPage; |                 $app['settings']->itemsPerPage = $itemsPerPage; | ||||||
|                 $app['settings']->strictAccessibility = $strictAccessibility; |                 $app['settings']->strictAccessibility = $strictAccessibility; | ||||||
|                 $app['settings']->logLevel = $logLevel; |                 $app['settings']->logLevel = $logLevel; | ||||||
|  |                 $app['settings']->tickDeleteHours = $tickDeleteHours; | ||||||
| 
 | 
 | ||||||
|                 // Save site settings and reload config from database
 |                 // Save site settings and reload config from database
 | ||||||
|                 $app['settings'] = $app['settings']->save(); |                 $app['settings'] = $app['settings']->save(); | ||||||
|  | |||||||
| @ -442,7 +442,7 @@ class Prerequisites { | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     private function applyMigrations($db) { |     public function applyMigrations($db) { | ||||||
|         try { |         try { | ||||||
|             $migrator = new Migrator($db); |             $migrator = new Migrator($db); | ||||||
|             $migrator->migrate(); |             $migrator->migrate(); | ||||||
|  | |||||||
| @ -12,8 +12,7 @@ class SettingsModel { | |||||||
|     public ?int $cssId = null; |     public ?int $cssId = null; | ||||||
|     public bool $strictAccessibility = true; |     public bool $strictAccessibility = true; | ||||||
|     public ?int $logLevel = null; |     public ?int $logLevel = null; | ||||||
|     // not currently configurable
 |     public ?int $tickDeleteHours = null; | ||||||
|     public int $tickDeleteHours = 1; |  | ||||||
| 
 | 
 | ||||||
|     public function __construct(private PDO $db) {} |     public function __construct(private PDO $db) {} | ||||||
| 
 | 
 | ||||||
| @ -28,7 +27,8 @@ class SettingsModel { | |||||||
|                                    items_per_page, |                                    items_per_page, | ||||||
|                                    css_id, |                                    css_id, | ||||||
|                                    strict_accessibility, |                                    strict_accessibility, | ||||||
|                                    log_level |                                    log_level, | ||||||
|  |                                    tick_delete_hours | ||||||
|                             FROM settings WHERE id=1");
 |                             FROM settings WHERE id=1");
 | ||||||
| 
 | 
 | ||||||
|         $row = $stmt->fetch(PDO::FETCH_ASSOC); |         $row = $stmt->fetch(PDO::FETCH_ASSOC); | ||||||
| @ -41,7 +41,8 @@ class SettingsModel { | |||||||
|             $c->itemsPerPage = (int) $row['items_per_page']; |             $c->itemsPerPage = (int) $row['items_per_page']; | ||||||
|             $c->cssId = (int) $row['css_id']; |             $c->cssId = (int) $row['css_id']; | ||||||
|             $c->strictAccessibility = (bool) $row['strict_accessibility']; |             $c->strictAccessibility = (bool) $row['strict_accessibility']; | ||||||
|             $c->logLevel = $row['log_level']; |             $c->logLevel = (int) ($row['log_level'] ?? 2); | ||||||
|  |             $c->tickDeleteHours = (int) ($row['tick_delete_hours'] ?? 1); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         return $c; |         return $c; | ||||||
| @ -51,6 +52,7 @@ class SettingsModel { | |||||||
|         $settingsCount = (int) $this->db->query("SELECT COUNT(*) FROM settings")->fetchColumn(); |         $settingsCount = (int) $this->db->query("SELECT COUNT(*) FROM settings")->fetchColumn(); | ||||||
| 
 | 
 | ||||||
|         if ($settingsCount === 0){ |         if ($settingsCount === 0){ | ||||||
|  |             Log::debug('Initializing settings'); | ||||||
|             $stmt = $this->db->prepare("INSERT INTO settings (
 |             $stmt = $this->db->prepare("INSERT INTO settings (
 | ||||||
|                 id, |                 id, | ||||||
|                 site_title, |                 site_title, | ||||||
| @ -60,10 +62,12 @@ class SettingsModel { | |||||||
|                 items_per_page, |                 items_per_page, | ||||||
|                 css_id, |                 css_id, | ||||||
|                 strict_accessibility, |                 strict_accessibility, | ||||||
|                 log_level |                 log_level, | ||||||
|  |                 tick_delete_hours | ||||||
|                 ) |                 ) | ||||||
|                 VALUES (1, ?, ?, ?, ?, ?, ?, ?, ?)");
 |                 VALUES (1, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
 | ||||||
|         } else { |         } else { | ||||||
|  |             Log::debug('Updating settings'); | ||||||
|             $stmt = $this->db->prepare("UPDATE settings SET
 |             $stmt = $this->db->prepare("UPDATE settings SET
 | ||||||
|                 site_title=?, |                 site_title=?, | ||||||
|                 site_description=?, |                 site_description=?, | ||||||
| @ -72,10 +76,21 @@ class SettingsModel { | |||||||
|                 items_per_page=?, |                 items_per_page=?, | ||||||
|                 css_id=?, |                 css_id=?, | ||||||
|                 strict_accessibility=?, |                 strict_accessibility=?, | ||||||
|                 log_level=? |                 log_level=?, | ||||||
|  |                 tick_delete_hours=? | ||||||
|                 WHERE id=1");
 |                 WHERE id=1");
 | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|  |         Log::debug("Site title: " . $this->siteTitle); | ||||||
|  |         Log::debug("Site description: " . $this->siteDescription); | ||||||
|  |         Log::debug("Base URL: " . $this->baseUrl); | ||||||
|  |         Log::debug("Base path: " . $this->basePath); | ||||||
|  |         Log::debug("Items per page: " . $this->itemsPerPage); | ||||||
|  |         Log::debug("CSS ID: " . $this->cssId); | ||||||
|  |         Log::debug("Strict accessibility: " . $this->strictAccessibility); | ||||||
|  |         Log::debug("Log level: " . $this->logLevel); | ||||||
|  |         Log::debug("Tick delete window: " . $this->tickDeleteHours); | ||||||
|  | 
 | ||||||
|         $stmt->execute([$this->siteTitle, |         $stmt->execute([$this->siteTitle, | ||||||
|                         $this->siteDescription, |                         $this->siteDescription, | ||||||
|                         $this->baseUrl, |                         $this->baseUrl, | ||||||
| @ -83,7 +98,8 @@ class SettingsModel { | |||||||
|                         $this->itemsPerPage, |                         $this->itemsPerPage, | ||||||
|                         $this->cssId, |                         $this->cssId, | ||||||
|                         $this->strictAccessibility, |                         $this->strictAccessibility, | ||||||
|                         $this->logLevel |                         $this->logLevel, | ||||||
|  |                         $this->tickDeleteHours | ||||||
|                     ]); |                     ]); | ||||||
| 
 | 
 | ||||||
|         return $this->get(); |         return $this->get(); | ||||||
|  | |||||||
| @ -61,13 +61,18 @@ | |||||||
|                             name="items_per_page" |                             name="items_per_page" | ||||||
|                             value="<?= $settings->itemsPerPage ?>" min="1" max="50" |                             value="<?= $settings->itemsPerPage ?>" min="1" max="50" | ||||||
|                             required> |                             required> | ||||||
|  |                         <label for="tick_delete_hours">Tick delete window (hours)</label> | ||||||
|  |                         <input type="number" | ||||||
|  |                             id="tick_delete_hours" | ||||||
|  |                             name="tick_delete_hours" | ||||||
|  |                             value="<?= ($settings->tickDeleteHours ?? 1) ?>" min="1"> | ||||||
|                         <label for="strict_accessibility">Strict accessibility</label> |                         <label for="strict_accessibility">Strict accessibility</label> | ||||||
|                         <input type="checkbox" |                         <input type="checkbox" | ||||||
|                                id="strict_accessibility" |                                id="strict_accessibility" | ||||||
|                                name="strict_accessibility" |                                name="strict_accessibility" | ||||||
|                                value="1" |                                value="1" | ||||||
|                                <?php if ($settings->strictAccessibility): ?> checked <?php endif; ?>>
 |                                <?php if ($settings->strictAccessibility): ?> checked <?php endif; ?>>
 | ||||||
|                         <label for="strict_accessibility">Log Level</label> |                         <label for="log_level">Log Level</label> | ||||||
|                         <select id="log_level" name="log_level"> |                         <select id="log_level" name="log_level"> | ||||||
|                             <option value="1" <?= ($settings->logLevel ?? 2) == 1 ? 'selected' : '' ?>>DEBUG</option>
 |                             <option value="1" <?= ($settings->logLevel ?? 2) == 1 ? 'selected' : '' ?>>DEBUG</option>
 | ||||||
|                             <option value="2" <?= ($settings->logLevel ?? 2) == 2 ? 'selected' : '' ?>>INFO</option>
 |                             <option value="2" <?= ($settings->logLevel ?? 2) == 2 ? 'selected' : '' ?>>INFO</option>
 | ||||||
|  | |||||||
| @ -22,6 +22,7 @@ class AdminControllerTest extends TestCase | |||||||
|         $this->settings->baseUrl = 'https://example.com'; |         $this->settings->baseUrl = 'https://example.com'; | ||||||
|         $this->settings->basePath = '/tkr'; |         $this->settings->basePath = '/tkr'; | ||||||
|         $this->settings->itemsPerPage = 10; |         $this->settings->itemsPerPage = 10; | ||||||
|  |         $this->settings->tickDeleteHours = 2; | ||||||
| 
 | 
 | ||||||
|         $this->user = new UserModel($this->mockPdo); |         $this->user = new UserModel($this->mockPdo); | ||||||
|         $this->user->username = 'testuser'; |         $this->user->username = 'testuser'; | ||||||
| @ -119,7 +120,8 @@ class AdminControllerTest extends TestCase | |||||||
|                 'items_per_page' => 15, |                 'items_per_page' => 15, | ||||||
|                 'css_id' => null, |                 'css_id' => null, | ||||||
|                 'strict_accessibility' => true, |                 'strict_accessibility' => true, | ||||||
|                 'log_level' => 2 |                 'log_level' => 2, | ||||||
|  |                 'tick_delete_hours' => 3 | ||||||
|             ], |             ], | ||||||
|             [ |             [ | ||||||
|                 'username' => 'newuser', |                 'username' => 'newuser', | ||||||
| @ -153,7 +155,8 @@ class AdminControllerTest extends TestCase | |||||||
|             'base_path' => '/updated', |             'base_path' => '/updated', | ||||||
|             'items_per_page' => 15, |             'items_per_page' => 15, | ||||||
|             'strict_accessibility' => 'on', |             'strict_accessibility' => 'on', | ||||||
|             'log_level' => 2 |             'log_level' => 2, | ||||||
|  |             'tick_delete_hours' => 3 | ||||||
|         ]; |         ]; | ||||||
| 
 | 
 | ||||||
|         $result = $controller->saveSettings($postData, false); |         $result = $controller->saveSettings($postData, false); | ||||||
| @ -177,7 +180,8 @@ class AdminControllerTest extends TestCase | |||||||
|                 'items_per_page' => 10, |                 'items_per_page' => 10, | ||||||
|                 'css_id' => null, |                 'css_id' => null, | ||||||
|                 'strict_accessibility' => true, |                 'strict_accessibility' => true, | ||||||
|                 'log_level' => 2 |                 'log_level' => 2, | ||||||
|  |                 'tick_delete_hours' => 3 | ||||||
|             ], |             ], | ||||||
|             [ |             [ | ||||||
|                 'username' => 'testuser', |                 'username' => 'testuser', | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user