using System; using System.Collections.Generic; using System.Linq; using System.Security; using ASC.Api.Collections; using ASC.Api.Core; using ASC.Common; using ASC.Common.Logging; using ASC.Core; using ASC.Core.Billing; using ASC.Core.Common.Contracts; using ASC.Core.Tenants; using ASC.Core.Users; using ASC.Data.Backup; using ASC.MessagingSystem; using ASC.Security.Cryptography; using ASC.Web.Api.Routing; using ASC.Web.Core; using ASC.Web.Core.Utility; using ASC.Web.Studio.Core.Notify; using ASC.Web.Studio.Utility; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Options; namespace ASC.Web.Api.Controllers { [DefaultRoute] [ApiController] public class PortalController : ControllerBase { public BackupAjaxHandler BackupHandler { get; } public Tenant Tenant { get { return ApiContext.Tenant; } } public ApiContext ApiContext { get; } public UserManager UserManager { get; } public TenantManager TenantManager { get; } public PaymentManager PaymentManager { get; } public CommonLinkUtility CommonLinkUtility { get; } public UrlShortener UrlShortener { get; } public AuthContext AuthContext { get; } public WebItemSecurity WebItemSecurity { get; } public ILog Log { get; } public PortalController( IOptionsMonitor options, ApiContext apiContext, UserManager userManager, TenantManager tenantManager, PaymentManager paymentManager, CommonLinkUtility commonLinkUtility, UrlShortener urlShortener, AuthContext authContext, WebItemSecurity webItemSecurity ) { Log = options.CurrentValue; ApiContext = apiContext; UserManager = userManager; TenantManager = tenantManager; PaymentManager = paymentManager; CommonLinkUtility = commonLinkUtility; UrlShortener = urlShortener; AuthContext = authContext; WebItemSecurity = webItemSecurity; } [Read("")] public Tenant Get() { return Tenant; } [Read("users/{userID}")] public UserInfo GetUser(Guid userID) { return UserManager.GetUsers(userID); } [Read("users/invite/{employeeType}")] public string GeInviteLink(EmployeeType employeeType) { if (!WebItemSecurity.IsProductAdministrator(WebItemManager.PeopleProductID, AuthContext.CurrentAccount.ID)) { throw new SecurityException("Method not available"); } return CommonLinkUtility.GetConfirmationUrl(string.Empty, ConfirmType.LinkInvite, (int)employeeType) + $"&emplType={employeeType:d}"; } [Update("getshortenlink")] public string GetShortenLink(string link) { try { return UrlShortener.Instance.GetShortenLink(link); } catch (Exception ex) { Log.Error("getshortenlink", ex); return link; } } [Read("usedspace")] public double GetUsedSpace() { return Math.Round( TenantManager.FindTenantQuotaRows(new TenantQuotaRowQuery(Tenant.TenantId)) .Where(q => !string.IsNullOrEmpty(q.Tag) && new Guid(q.Tag) != Guid.Empty) .Sum(q => q.Counter) / 1024f / 1024f / 1024f, 2); } [Read("userscount")] public long GetUsersCount() { return UserManager.GetUserNames(EmployeeStatus.Active).Count(); } [Read("tariff")] public Tariff GetTariff() { return PaymentManager.GetTariff(Tenant.TenantId); } [Read("quota")] public TenantQuota GetQuota() { return TenantManager.GetTenantQuota(Tenant.TenantId); } [Read("quota/right")] public TenantQuota GetRightQuota() { var usedSpace = GetUsedSpace(); var needUsersCount = GetUsersCount(); return TenantManager.GetTenantQuotas().OrderBy(r => r.Price) .FirstOrDefault(quota => quota.ActiveUsers > needUsersCount && quota.MaxTotalSize > usedSpace && !quota.Year); } [Read("path")] public string GetFullAbsolutePath(string virtualPath) { return CommonLinkUtility.GetFullAbsolutePath(virtualPath); } /// /// Returns the backup schedule of the current portal /// /// Backup /// Backup Schedule [Read("getbackupschedule")] public BackupAjaxHandler.Schedule GetBackupSchedule() { return BackupHandler.GetSchedule(); } /// /// Create the backup schedule of the current portal /// /// Storage type /// Storage parameters /// Max of the backup's stored copies /// Cron parameters /// Include mail in the backup /// Backup [Create("createbackupschedule")] public void CreateBackupSchedule(BackupStorageType storageType, [FromQuery] Dictionary storageParams, int backupsStored, [FromBody] BackupAjaxHandler.CronParams cronParams, bool backupMail) { BackupHandler.CreateSchedule(storageType, storageParams, backupsStored, cronParams, backupMail); } /// /// Delete the backup schedule of the current portal /// /// Backup [Delete("deletebackupschedule")] public void DeleteBackupSchedule() { BackupHandler.DeleteSchedule(); } /// /// Start a backup of the current portal /// /// Storage Type /// Storage Params /// Include mail in the backup /// Backup /// Backup Progress [Create("startbackup")] public BackupProgress StartBackup(BackupStorageType storageType, Dictionary storageParams, bool backupMail) { return BackupHandler.StartBackup(storageType, storageParams, backupMail); } /// /// Returns the progress of the started backup /// /// Backup /// Backup Progress [Read("getbackupprogress")] public BackupProgress GetBackupProgress() { return BackupHandler.GetBackupProgress(); } /// /// Returns the backup history of the started backup /// /// Backup /// Backup History [Read("getbackuphistory")] public List GetBackupHistory() { return BackupHandler.GetBackupHistory(); } /// /// Delete the backup with the specified id /// /// Backup [Delete("deletebackup/{id}")] public void DeleteBackup(Guid id) { BackupHandler.DeleteBackup(id); } /// /// Delete all backups of the current portal /// /// Backup /// Backup History [Delete("deletebackuphistory")] public void DeleteBackupHistory() { BackupHandler.DeleteAllBackups(); } /// /// Start a data restore of the current portal /// /// Backup Id /// Storage Type /// Storage Params /// Notify about backup to users /// Backup /// Restore Progress [Create("startrestore")] public BackupProgress StartBackupRestore(string backupId, BackupStorageType storageType, IEnumerable> storageParams, bool notify) { return BackupHandler.StartRestore(backupId, storageType, storageParams.ToDictionary(r => r.Key, r => r.Value), notify); } /// /// Returns the progress of the started restore /// /// Backup /// Restore Progress [Read("getrestoreprogress", true)] //NOTE: this method doesn't check payment!!! public BackupProgress GetRestoreProgress() { return BackupHandler.GetRestoreProgress(); } ///false [Read("backuptmp")] public string GetTempPath(string alias) { return BackupHandler.GetTmpFolder(); } } public static class PortalControllerExtension { public static DIHelper AddPortalController(this DIHelper services) { return services .AddUrlShortener() .AddMessageServiceService() .AddStudioNotifyServiceService() .AddApiContextService() .AddUserManagerService() .AddAuthContextService() .AddAuthContextService() .AddTenantManagerService() .AddEmailValidationKeyProviderService() .AddPaymentManagerService() .AddCommonLinkUtilityService() .AddAuthContextService() .AddWebItemSecurity() .AddBackupAjaxHandler(); } } }