176 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			176 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| 
 | |
| namespace App\Utilities;
 | |
| 
 | |
| use App\Traits\SiteApi;
 | |
| use Cache;
 | |
| use Date;
 | |
| use GrahamCampbell\Markdown\Facades\Markdown;
 | |
| use Illuminate\Support\Arr;
 | |
| 
 | |
| class Versions
 | |
| {
 | |
|     use SiteApi;
 | |
| 
 | |
|     public static function changelog()
 | |
|     {
 | |
|         $output = '';
 | |
| 
 | |
|         $url = 'https://api.github.com/repos/akaunting/akaunting/releases';
 | |
| 
 | |
|         $http = new \GuzzleHttp\Client(['verify' => false]);
 | |
| 
 | |
|         $json = $http->get($url, ['timeout' => 30])->getBody()->getContents();
 | |
| 
 | |
|         if (empty($json)) {
 | |
|             return $output;
 | |
|         }
 | |
| 
 | |
|         $releases = json_decode($json);
 | |
| 
 | |
|         foreach ($releases as $release) {
 | |
|             if (version_compare($release->tag_name, version('short'), '<=')) {
 | |
|                 continue;
 | |
|             }
 | |
| 
 | |
|             if ($release->prerelease == true) {
 | |
|                 continue;
 | |
|             }
 | |
| 
 | |
|             if (empty($release->body)) {
 | |
|                 continue;
 | |
|             }
 | |
| 
 | |
|             $output .= '<h2><span class="badge badge-pill badge-success">' . $release->tag_name . '</span></h2>';
 | |
| 
 | |
|             $output .= Markdown::convertToHtml($release->body);
 | |
| 
 | |
|             $output .= '<hr>';
 | |
|         }
 | |
| 
 | |
|         return $output;
 | |
|     }
 | |
| 
 | |
|     public static function latest($alias)
 | |
|     {
 | |
|         $versions = static::all($alias);
 | |
| 
 | |
|         if (empty($versions[$alias]) || empty($versions[$alias]->data)) {
 | |
|             return false;
 | |
|         }
 | |
| 
 | |
|         return $versions[$alias]->data->latest;
 | |
|     }
 | |
| 
 | |
|     public static function all($modules = null)
 | |
|     {
 | |
|         // Get data from cache
 | |
|         $versions = Cache::get('versions');
 | |
| 
 | |
|         if (!empty($versions)) {
 | |
|             return $versions;
 | |
|         }
 | |
| 
 | |
|         $info = Info::all();
 | |
| 
 | |
|         $versions = [];
 | |
| 
 | |
|         // Check core first
 | |
|         $url = 'core/version/' . $info['akaunting'] . '/' . $info['php'] . '/' . $info['mysql'] . '/' . $info['companies'];
 | |
| 
 | |
|         $versions['core'] = static::getLatestVersion($url, $info['akaunting']);
 | |
| 
 | |
|         $modules = Arr::wrap($modules);
 | |
| 
 | |
|         // Then modules
 | |
|         foreach ($modules as $module) {
 | |
|             if (is_string($module)) {
 | |
|                 $module = module($module);
 | |
|             }
 | |
| 
 | |
|             if (!$module instanceof \Akaunting\Module\Module) {
 | |
|                 continue;
 | |
|             }
 | |
| 
 | |
|             $alias = $module->get('alias');
 | |
|             $version = $module->get('version');
 | |
| 
 | |
|             $url = 'apps/' . $alias . '/version/' . $version . '/' . $info['akaunting'];
 | |
| 
 | |
|             $versions[$alias] = static::getLatestVersion($url, $version);
 | |
|         }
 | |
| 
 | |
|         Cache::put('versions', $versions, Date::now()->addHour(6));
 | |
| 
 | |
|         return $versions;
 | |
|     }
 | |
| 
 | |
|     public static function getLatestVersion($url, $latest)
 | |
|     {
 | |
|         if (!$data = static::getResponseData('GET', $url, ['timeout' => 10])) {
 | |
|             return $latest;
 | |
|         }
 | |
| 
 | |
|         if (!is_object($data)) {
 | |
|             return $latest;
 | |
|         }
 | |
| 
 | |
|         return $data->latest;
 | |
|     }
 | |
| 
 | |
|     public static function getUpdates()
 | |
|     {
 | |
|         // Get data from cache
 | |
|         $updates = Cache::get('updates');
 | |
| 
 | |
|         if (!empty($updates)) {
 | |
|             return $updates;
 | |
|         }
 | |
| 
 | |
|         $updates = [];
 | |
| 
 | |
|         $modules = module()->all();
 | |
| 
 | |
|         $versions = static::all($modules);
 | |
| 
 | |
|         foreach ($versions as $alias => $latest_version) {
 | |
|             if ($alias == 'core') {
 | |
|                 $installed_version = version('short');
 | |
|             } else {
 | |
|                 $module = module($alias);
 | |
| 
 | |
|                 if (!$module instanceof \Akaunting\Module\Module) {
 | |
|                     continue;
 | |
|                 }
 | |
| 
 | |
|                 $installed_version = $module->get('version');
 | |
|             }
 | |
| 
 | |
|             if (version_compare($installed_version, $latest_version, '>=')) {
 | |
|                 continue;
 | |
|             }
 | |
| 
 | |
|             $updates[$alias] = $latest_version;
 | |
|         }
 | |
| 
 | |
|         Cache::put('updates', $updates, Date::now()->addHour(6));
 | |
| 
 | |
|         return $updates;
 | |
|     }
 | |
| 
 | |
|     public static function shouldUpdate($listener_version, $old_version, $new_version): bool
 | |
|     {
 | |
|         // Don't update if "listener" is same or lower than "old" version
 | |
|         if (version_compare($listener_version, $old_version, '<=')) {
 | |
|             return false;
 | |
|         }
 | |
| 
 | |
|         // Don't update if "listener" is higher than "new" version
 | |
|         if (version_compare($listener_version, $new_version, '>')) {
 | |
|             return false;
 | |
|         }
 | |
| 
 | |
|         return true;
 | |
|     }
 | |
| }
 |