using Oqtane.Models; using System.Threading.Tasks; using System.Net.Http; using Oqtane.Documentation; using Oqtane.Shared; using Microsoft.AspNetCore.Components; using System; using System.Net; using System.Linq; namespace Oqtane.Services { /// /// Service to manage (install master database / upgrade version / etc.) the installation /// public interface IInstallationService { /// /// Returns a status/message object with the current installation state /// /// Task IsInstalled(); /// /// Starts the installation process /// /// connectionString, database type, alias etc. /// internal status/message object Task Install(InstallConfig config); /// /// Starts the upgrade process /// /// indicates if files should be backed up during upgrade /// internal status/message object Task Upgrade(bool backup); /// /// Restarts the installation /// /// internal status/message object Task RestartAsync(); } [PrivateApi("Don't show in the documentation, as everything should use the Interface")] public class InstallationService : ServiceBase, IInstallationService { private readonly NavigationManager _navigationManager; private readonly SiteState _siteState; private readonly HttpClient _http; public InstallationService(HttpClient http, SiteState siteState, NavigationManager navigationManager) : base(http, siteState) { _navigationManager = navigationManager; _siteState = siteState; _http = http; } private string ApiUrl => (_siteState.Alias == null) ? CreateApiUrl("Installation", null, ControllerRoutes.ApiRoute) // tenant agnostic needed for initial installation : CreateApiUrl("Installation", _siteState.Alias); public async Task IsInstalled() { var path = ""; if (_http.DefaultRequestHeaders.UserAgent.ToString().Contains(Constants.MauiUserAgent)) { path = _http.DefaultRequestHeaders.GetValues(Constants.MauiAliasPath).First(); } else { path = new Uri(_navigationManager.Uri).LocalPath.Substring(1); } return await GetJsonAsync($"{ApiUrl}/installed/?path={WebUtility.UrlEncode(path)}"); } public async Task Install(InstallConfig config) { return await PostJsonAsync(ApiUrl, config); } public async Task Upgrade(bool backup) { return await GetJsonAsync($"{ApiUrl}/upgrade/?backup={backup}"); } public async Task RestartAsync() { await PostAsync($"{ApiUrl}/restart"); } } }