feature: saved exports view/edit/trigger
This commit is contained in:
@@ -1,10 +1,9 @@
|
||||
using Disco.Models.UI.Config.Export;
|
||||
using Disco.Services.Authorization;
|
||||
using Disco.Services.Exporting;
|
||||
using Disco.Services.Interop.ActiveDirectory;
|
||||
using Disco.Services.Logging;
|
||||
using Disco.Services.Plugins.Features.UIExtension;
|
||||
using Disco.Services.Web;
|
||||
using Disco.Web.Areas.API.Models.Shared;
|
||||
using Disco.Web.Areas.Config.Models.Export;
|
||||
using Disco.Web.Extensions;
|
||||
using System;
|
||||
@@ -13,10 +12,49 @@ using System.Web.Mvc;
|
||||
|
||||
namespace Disco.Web.Areas.Config.Controllers
|
||||
{
|
||||
[DiscoAuthorize(Claims.Config.ManageSavedExports)]
|
||||
[DiscoAuthorize]
|
||||
public partial class ExportController : AuthorizedDatabaseController
|
||||
{
|
||||
[HttpGet]
|
||||
[DiscoAuthorize(Claims.Config.ManageSavedExports)]
|
||||
public virtual ActionResult Index()
|
||||
{
|
||||
var exports = SavedExports.GetSavedExports(Database);
|
||||
var exportUserIds = exports.Select(e => e.CreatedBy).Distinct().ToList();
|
||||
var users = Database.Users.Where(u => exportUserIds.Contains(u.UserId)).ToDictionary(u => u.UserId, StringComparer.OrdinalIgnoreCase);
|
||||
|
||||
var m = new IndexModel
|
||||
{
|
||||
SavedExports = exports,
|
||||
ExportTypeNames = SavedExports.GetSavedExportTypeNames(),
|
||||
CreatedUsers = users
|
||||
};
|
||||
|
||||
// UI Extensions
|
||||
UIExtensions.ExecuteExtensions<ConfigExportIndexModel>(ControllerContext, m);
|
||||
|
||||
return View(m);
|
||||
}
|
||||
|
||||
[HttpGet]
|
||||
[DiscoAuthorize(Claims.Config.ManageSavedExports)]
|
||||
public virtual ActionResult Show(Guid id, bool? saved = null, bool? exported = null)
|
||||
{
|
||||
var export = SavedExports.GetSavedExport(Database, id, out var exportTypeName);
|
||||
|
||||
if (export == null)
|
||||
return HttpNotFound();
|
||||
|
||||
var m = ShowModel.FromSavedExport(export, exportTypeName, saved ?? false, exported ?? false);
|
||||
|
||||
// UI Extensions
|
||||
UIExtensions.ExecuteExtensions<ConfigExportShowModel>(ControllerContext, m);
|
||||
|
||||
return View(m);
|
||||
}
|
||||
|
||||
[HttpGet]
|
||||
[DiscoAuthorize(Claims.Config.ManageSavedExports)]
|
||||
public virtual ActionResult Create(Guid id)
|
||||
{
|
||||
var export = SavedExports.GetSavedExport(Database, id, out var exportTypeName);
|
||||
@@ -24,7 +62,7 @@ namespace Disco.Web.Areas.Config.Controllers
|
||||
if (export == null)
|
||||
return HttpNotFound();
|
||||
|
||||
var m = CreateModel.FromSavedExport(export, exportTypeName);
|
||||
var m = EditModel.FromNewSavedExport(export, exportTypeName);
|
||||
|
||||
// UI Extensions
|
||||
UIExtensions.ExecuteExtensions<ConfigExportCreateModel>(ControllerContext, m);
|
||||
@@ -32,32 +70,7 @@ namespace Disco.Web.Areas.Config.Controllers
|
||||
return View(m);
|
||||
}
|
||||
|
||||
[HttpPost]
|
||||
public virtual ActionResult Create(CreateModel model)
|
||||
{
|
||||
if (model.OnDemandPrincipals != null)
|
||||
{
|
||||
model.OnDemandSubjects = model.OnDemandPrincipals
|
||||
.Where(p => !string.IsNullOrWhiteSpace(p))
|
||||
.Distinct(StringComparer.OrdinalIgnoreCase)
|
||||
.Select(p => ActiveDirectory.RetrieveADObject(p, true))
|
||||
.Where(ad => ad is ADUserAccount || ad is ADGroup)
|
||||
.Select(ad => SubjectDescriptorModel.FromActiveDirectoryObject(ad))
|
||||
.ToList();
|
||||
}
|
||||
|
||||
if (ModelState.IsValid)
|
||||
{
|
||||
SavedExports.UpdateSavedExport(Database, model.ToSavedExport());
|
||||
}
|
||||
|
||||
// UI Extensions
|
||||
UIExtensions.ExecuteExtensions<ConfigExportCreateModel>(ControllerContext, model);
|
||||
|
||||
return View(model);
|
||||
}
|
||||
|
||||
[DiscoAuthorize]
|
||||
[HttpGet]
|
||||
public virtual ActionResult Run(Guid id)
|
||||
{
|
||||
var export = SavedExports.GetSavedExport(Database, id, out _);
|
||||
@@ -72,7 +85,23 @@ namespace Disco.Web.Areas.Config.Controllers
|
||||
|
||||
var fileStream = exportResult.Result;
|
||||
|
||||
SystemLog.LogInformation($"Ran '{export.Name}' [{export.Name}] for {Authorization.User.UserId}");
|
||||
|
||||
return this.File(fileStream.GetBuffer(), 0, (int)fileStream.Length, exportResult.MimeType, exportResult.Filename);
|
||||
}
|
||||
|
||||
[HttpGet]
|
||||
[DiscoAuthorize(Claims.Config.ManageSavedExports)]
|
||||
public virtual ActionResult RunScheduled(Guid id)
|
||||
{
|
||||
var export = SavedExports.GetSavedExport(Database, id, out _);
|
||||
|
||||
if (export == null)
|
||||
return HttpNotFound();
|
||||
|
||||
SavedExports.EvaluateSavedExportSchedule(Database, export);
|
||||
|
||||
return RedirectToAction(MVC.Config.Export.Show(export.Id, exported: true));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user