- Add CloudronStack/output/CloudronPackages-Artifacts/tirreno/ directory and its contents - Includes package manifest, Dockerfile, source code, documentation, and build artifacts - Add tirreno-1761840148.tar.gz as a build artifact - Add tirreno-cloudron-package-1761841304.tar.gz as the Cloudron package - Include all necessary files for the tirreno Cloudron package This adds the complete tirreno Cloudron package artifacts to the repository.
		
			
				
	
	
		
			125 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			125 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
 | 
						|
/**
 | 
						|
 * Tirreno ~ Open source user analytics
 | 
						|
 * Copyright (c) Tirreno Technologies Sàrl (https://www.tirreno.com)
 | 
						|
 *
 | 
						|
 * Licensed under GNU Affero General Public License version 3 of the or any later version.
 | 
						|
 * For full copyright and license information, please see the LICENSE
 | 
						|
 * Redistributions of files must retain the above copyright notice.
 | 
						|
 *
 | 
						|
 * @copyright     Copyright (c) Tirreno Technologies Sàrl (https://www.tirreno.com)
 | 
						|
 * @license       https://opensource.org/licenses/AGPL-3.0 AGPL License
 | 
						|
 * @link          https://www.tirreno.com Tirreno(tm)
 | 
						|
 */
 | 
						|
 | 
						|
namespace Models;
 | 
						|
 | 
						|
class Updates extends \Models\BaseSql {
 | 
						|
    protected $DB_TABLE_NAME = 'dshb_updates';
 | 
						|
 | 
						|
    protected $db;
 | 
						|
 | 
						|
    public function __construct($f3) {
 | 
						|
        $this->f3 = $f3;
 | 
						|
        $db = $this->getDbConnection(\Utils\Variables::getDB());
 | 
						|
        $this->f3->set('API_DATABASE', $db);
 | 
						|
        $this->db = $db;
 | 
						|
        \DB\SQL\Mapper::__construct($db, $this->DB_TABLE_NAME, $this->DB_TABLE_FIELDS, $this->DB_TABLE_TTL);
 | 
						|
        $this->db = $db;
 | 
						|
        $this->createIfNotExists();
 | 
						|
    }
 | 
						|
 | 
						|
    private function getDbConnection(string $url): ?\DB\SQL {
 | 
						|
        $urlComponents = parse_url($url);
 | 
						|
 | 
						|
        $host = $urlComponents['host'];
 | 
						|
        $port = $urlComponents['port'];
 | 
						|
        $user = $urlComponents['user'];
 | 
						|
        $pass = $urlComponents['pass'];
 | 
						|
        $db = ltrim($urlComponents['path'], '/');
 | 
						|
 | 
						|
        $dsn = sprintf('pgsql:host=%s;port=%s;dbname=%s', $host, $port, $db);
 | 
						|
        $options = [
 | 
						|
            \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION,
 | 
						|
        ];
 | 
						|
        try {
 | 
						|
            return new \DB\SQL($dsn, $user, $pass, $options);
 | 
						|
        } catch (\Exception $e) {
 | 
						|
            throw new \Exception('Failed to establish database connection: ' . $e->getMessage());
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    public function checkDb(string $service, array $updatesList) {
 | 
						|
        try {
 | 
						|
            $this->db->begin();
 | 
						|
            foreach ($updatesList as $migration) {
 | 
						|
                if (!$migration::isApplied($this)) {
 | 
						|
                    $migration::apply($this->db);
 | 
						|
                    $this->add($migration::$version, $service);
 | 
						|
                }
 | 
						|
            }
 | 
						|
            $this->db->commit();
 | 
						|
        } catch (\Exception $e) {
 | 
						|
            $this->db->rollback();
 | 
						|
            error_log($e->getMessage());
 | 
						|
            throw $e;
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    public function isApplied(string $version, string $name): bool {
 | 
						|
        $params = [
 | 
						|
            ':version'  => $version,
 | 
						|
            ':service'  => $name,
 | 
						|
        ];
 | 
						|
 | 
						|
        $query = 'SELECT 1 FROM dshb_updates WHERE version = :version and service = :service LIMIT 1';
 | 
						|
 | 
						|
        $results = $this->execQuery($query, $params);
 | 
						|
 | 
						|
        return (bool) count($results);
 | 
						|
    }
 | 
						|
 | 
						|
    public function add(string $version, string $name): void {
 | 
						|
        $params = [
 | 
						|
            ':version'  => $version,
 | 
						|
            ':service'  => $name,
 | 
						|
        ];
 | 
						|
 | 
						|
        $query = 'INSERT INTO dshb_updates (service, version) VALUES (:service, :version)';
 | 
						|
 | 
						|
        $this->execQuery($query, $params);
 | 
						|
    }
 | 
						|
 | 
						|
    private function createIfNotExists(): void {
 | 
						|
        $query = 'SELECT 1 FROM information_schema.tables WHERE table_name = \'dshb_updates\'';
 | 
						|
 | 
						|
        if (count($this->execQuery($query, null))) {
 | 
						|
            return;
 | 
						|
        }
 | 
						|
 | 
						|
        $queries = [
 | 
						|
            ('CREATE SEQUENCE IF NOT EXISTS dshb_updates_id_seq
 | 
						|
                AS BIGINT
 | 
						|
                START WITH 1
 | 
						|
                INCREMENT BY 1
 | 
						|
                NO MINVALUE
 | 
						|
                NO MAXVALUE
 | 
						|
                CACHE 1'),
 | 
						|
            ('CREATE TABLE IF NOT EXISTS dshb_updates (
 | 
						|
                id bigint NOT NULL DEFAULT nextval(\'dshb_updates_id_seq\'::regclass),
 | 
						|
                service varchar(30),
 | 
						|
                version varchar(30),
 | 
						|
                created timestamp without time zone DEFAULT now() NOT NULL
 | 
						|
            )'),
 | 
						|
            'ALTER SEQUENCE dshb_updates_id_seq OWNED BY dshb_updates.id',
 | 
						|
            'ALTER TABLE ONLY dshb_updates ADD CONSTRAINT dshb_updates_service_version_key UNIQUE (service, version)',
 | 
						|
            'ALTER TABLE ONLY dshb_updates ADD CONSTRAINT dshb_updates_id_pkey PRIMARY KEY (id)',
 | 
						|
        ];
 | 
						|
 | 
						|
        foreach ($queries as $query) {
 | 
						|
            $this->execQuery($query, null);
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 |