Skip to content

Commit

Permalink
.Net 6.0, Installer, Extended exporting, Utility functions
Browse files Browse the repository at this point in the history
  • Loading branch information
Steffen Nörtershäuser committed Nov 20, 2021
1 parent f5a9522 commit c80d001
Show file tree
Hide file tree
Showing 542 changed files with 30,995 additions and 9,142 deletions.
5 changes: 5 additions & 0 deletions Config/ConfigurationData.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,11 @@ public class ConfigurationData
/// </summary>
public EmailConfig Email { get; set; }

/// <summary>
/// Logging config
/// </summary>
public LogConfig Logging { get; set; }

/// <summary>
/// Legal Notice Configuration
/// </summary>
Expand Down
13 changes: 13 additions & 0 deletions Config/LogConfig.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
namespace GoNorth.Config
{
/// <summary>
/// Log config
/// </summary>
public class LogConfig
{
/// <summary>
/// Log Level
/// </summary>
public LogLevel LogLevel { get; set; }
}
}
13 changes: 13 additions & 0 deletions Config/LogLevel.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
namespace GoNorth.Config
{
/// <summary>
/// Log level
/// </summary>
public class LogLevel
{
/// <summary>
/// Default log level
/// </summary>
public string Default { get; set; }
}
}
5 changes: 5 additions & 0 deletions Config/MiscConfig.cs
Original file line number Diff line number Diff line change
Expand Up @@ -64,5 +64,10 @@ public class MiscConfig
/// True if auto saving must be disabled
/// </summary>
public bool? DisableAutoSaving { get; set; }

/// <summary>
/// True if all fields can have script settings
/// </summary>
public bool? AllowScriptSettingsForAllFieldTypes { get; set; }
}
}
3 changes: 2 additions & 1 deletion Controllers/AikaController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -58,8 +58,9 @@ public IActionResult Detail()
[HttpGet]
public IActionResult Quest()
{
SharedAikaViewModel viewModel = new SharedAikaViewModel();
QuestViewModel viewModel = new QuestViewModel();
viewModel.DisableAutoSaving = _config.DisableAutoSaving.HasValue ? _config.DisableAutoSaving.Value : false;
viewModel.AllowScriptSettingsForAllFieldTypes = _config.AllowScriptSettingsForAllFieldTypes.HasValue ? _config.AllowScriptSettingsForAllFieldTypes.Value : false;
return View(viewModel);
}

Expand Down
64 changes: 64 additions & 0 deletions Controllers/Api/AikaApiController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,12 @@
using GoNorth.Data.Evne;
using GoNorth.Services.ReferenceAnalyzer;
using GoNorth.Data.StateMachines;
using GoNorth.Services.Export;
using System.Text.Json;
using System.Text.Encodings.Web;
using GoNorth.Services.Export.Placeholder;
using GoNorth.Services.User;
using System.Text;

namespace GoNorth.Controllers.Api
{
Expand Down Expand Up @@ -301,6 +307,7 @@ private async Task<AikaChapterDetail> CreateNewChapterDetail(string projectId, s
/// <returns>Chapter Overview</returns>
[ProducesResponseType(typeof(AikaChapterOverview), StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
[ProducesResponseType(StatusCodes.Status500InternalServerError)]
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> SaveChapterOverview([FromBody]AikaChapterOverview overview)
Expand Down Expand Up @@ -793,6 +800,7 @@ private void CopyValidChapterDetailProperties(AikaChapterDetail targetDetail, Ai
/// <param name="chapterDetail">Chapter Detail</param>
/// <returns>Created chapter detail</returns>
[ProducesResponseType(typeof(AikaChapterDetail), StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status500InternalServerError)]
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> CreateChapterDetail([FromBody]AikaChapterDetail chapterDetail)
Expand Down Expand Up @@ -830,6 +838,7 @@ public async Task<IActionResult> CreateChapterDetail([FromBody]AikaChapterDetail
/// <returns>Updated chapter detail</returns>
[ProducesResponseType(typeof(AikaChapterDetail), StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
[ProducesResponseType(StatusCodes.Status500InternalServerError)]
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> UpdateChapterDetail(string id, [FromBody]AikaChapterDetail chapterDetail)
Expand Down Expand Up @@ -1235,5 +1244,60 @@ public async Task<IActionResult> DeleteQuest(string id)
return Ok(id);
}


/// <summary>
/// Exports a quest to JSON
/// </summary>
/// <param name="id">Quest id</param>
/// <returns>Export Result</returns>
[Authorize(Roles = RoleNames.Aika)]
[Authorize(Roles = RoleNames.ExportObjects)]
[ProducesResponseType(typeof(ExportObjectResult), StatusCodes.Status200OK)]
[HttpGet]
public async Task<IActionResult> ExportQuest(string id)
{
ExportObjectResult exportResult = await RunQuestExport(id);

return Ok(exportResult);
}

/// <summary>
/// Downloads an export of a quest
/// </summary>
/// <param name="id">Quest id</param>
/// <returns>Export Result</returns>
[Authorize(Roles = RoleNames.Aika)]
[Authorize(Roles = RoleNames.ExportObjects)]
[ProducesResponseType(typeof(ExportObjectResult), StatusCodes.Status200OK)]
[HttpGet]
public async Task<IActionResult> DownloadExportQuest(string id)
{
ExportObjectResult exportResult = await RunQuestExport(id);

return File(Encoding.UTF8.GetBytes(exportResult.Code), "text/plain", exportResult.ObjectFilename + "." + exportResult.FileExtension);
}

/// <summary>
/// Runs a quest export
/// </summary>
/// <param name="id">Quest Id</param>
/// <returns>Export result</returns>
private async Task<ExportObjectResult> RunQuestExport(string id)
{
AikaQuest quest = await _questDbAccess.GetQuestById(id);

JsonSerializerOptions options = new JsonSerializerOptions
{
WriteIndented = true,
Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping
};

ExportObjectResult exportResult = new ExportObjectResult();
exportResult.Code = JsonSerializer.Serialize(quest, options);
exportResult.Errors = new List<ExportPlaceholderError>();
exportResult.ObjectFilename = StringUtility.CleanInvalidFilenameChars(quest.Name);
exportResult.FileExtension = "json";
return exportResult;
}
}
}
6 changes: 2 additions & 4 deletions Controllers/Api/ExportApiController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
using System.Globalization;
using GoNorth.Services.Project;
using GoNorth.Data.StateMachines;
using GoNorth.Services.User;

namespace GoNorth.Controllers.Api
{
Expand Down Expand Up @@ -1624,10 +1625,7 @@ private async Task<ExportObjectResult> RunExportObject(string exportFormat, stri

// Run Export
ExportObjectResult result = await exporter.ExportObject(template.Template, objectData);
result.ObjectFilename = ((FlexFieldObject)objectData.ExportData[ExportConstants.ExportDataObject]).Name;
string regexSearch = Regex.Escape(new string(Path.GetInvalidFileNameChars()));
Regex illegalCharRegex = new Regex(string.Format("[{0}]", regexSearch));
result.ObjectFilename = illegalCharRegex.Replace(result.ObjectFilename, string.Empty);
result.ObjectFilename = StringUtility.CleanInvalidFilenameChars(((FlexFieldObject)objectData.ExportData[ExportConstants.ExportDataObject]).Name);
return result;
}

Expand Down
96 changes: 95 additions & 1 deletion Controllers/Api/KartaApiController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,14 @@
using GoNorth.Data.Exporting;
using GoNorth.Services.Export.ExportSnippets;
using GoNorth.Data.StateMachines;
using System.Text.Json;
using GoNorth.Services.Export;
using System.Text.Encodings.Web;
using GoNorth.Services.Export.Placeholder;
using GoNorth.Services.User;
using System.Text;
using Microsoft.AspNetCore.Hosting;
using System.IO;

namespace GoNorth.Controllers.Api
{
Expand Down Expand Up @@ -185,6 +193,11 @@ public class NamedMarkerQueryResult
/// </summary>
private readonly UserManager<GoNorthUser> _userManager;

/// <summary>
/// Host Environment
/// </summary>
private readonly IWebHostEnvironment _hostEnvironment;

/// <summary>
/// Logger
/// </summary>
Expand Down Expand Up @@ -213,12 +226,13 @@ public class NamedMarkerQueryResult
/// <param name="exportSnippetRelatedObjectNameResolver">Service that will resolve export snippet related object names</param>
/// <param name="timelineService">Timeline Service</param>
/// <param name="userManager">User Manager</param>
/// <param name="hostEnvironment">Host Environment</param>
/// <param name="logger">Logger</param>
/// <param name="localizerFactory">Localizer Factory</param>
public KartaApiController(IKartaMapDbAccess mapDbAccess, IKartaMarkerImplementationSnapshotDbAccess markerImplementationSnapshotDbAccess, IKortistoNpcDbAccess kortistoNpcDbAccess, IKortistoNpcTemplateDbAccess npcTemplateDbAccess,
ITaleDbAccess taleDbAccess, IAikaQuestDbAccess questDbAccess, IEvneSkillDbAccess skillDbAccess, IObjectExportSnippetDbAccess objectExportSnippetDbAccess, IStateMachineDbAccess stateMachineDbAccess,
IUserProjectAccess userProjectAccess, IKartaImageAccess mapImageAccess, IKartaImageProcessor imageProcessor, IExportSnippetRelatedObjectNameResolver exportSnippetRelatedObjectNameResolver,
ITimelineService timelineService, UserManager<GoNorthUser> userManager, ILogger<KartaApiController> logger, IStringLocalizerFactory localizerFactory)
ITimelineService timelineService, UserManager<GoNorthUser> userManager, IWebHostEnvironment hostEnvironment, ILogger<KartaApiController> logger, IStringLocalizerFactory localizerFactory)
{
_mapDbAccess = mapDbAccess;
_markerImplementationSnapshotDbAccess = markerImplementationSnapshotDbAccess;
Expand All @@ -235,6 +249,7 @@ public class NamedMarkerQueryResult
_exportSnippetRelatedObjectNameResolver = exportSnippetRelatedObjectNameResolver;
_timelineService = timelineService;
_userManager = userManager;
_hostEnvironment = hostEnvironment;
_logger = logger;
_localizer = localizerFactory.Create(typeof(KartaApiController));
}
Expand Down Expand Up @@ -389,6 +404,7 @@ public IActionResult MapImage(string mapId, int z, int x, int y, int maxZoom, in
/// <returns>Created map</returns>
[ProducesResponseType(typeof(string), StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
[ProducesResponseType(StatusCodes.Status500InternalServerError)]
[HttpPost]
[ValidateAntiForgeryToken]
[Authorize(Roles = RoleNames.KartaMapManager)]
Expand Down Expand Up @@ -453,6 +469,7 @@ public async Task<IActionResult> CreateMap(string name)
/// <returns>Result</returns>
[ProducesResponseType(typeof(string), StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
[ProducesResponseType(StatusCodes.Status500InternalServerError)]
[ValidateAntiForgeryToken]
[HttpPost]
public async Task<IActionResult> UpdateMap(string id, string name)
Expand Down Expand Up @@ -911,6 +928,7 @@ public IActionResult GetNewMapMarkerId()
CopyBaseMarkerAttributes(existingMarker, markerRequest.NoteMarker);
existingMarker.Name = markerRequest.NoteMarker.Name;
existingMarker.Description = markerRequest.NoteMarker.Description;
existingMarker.Color = markerRequest.NoteMarker.Color;
existingMarker.IsImplemented = false;
}
else
Expand Down Expand Up @@ -1147,5 +1165,81 @@ public async Task<IActionResult> GetMarker(string mapId, string markerId)
return Ok(marker);
}

/// <summary>
/// Exports a map by id
/// </summary>
/// <param name="id">Map Id</param>
/// <returns>Export result</returns>
[Authorize(Roles = RoleNames.Karta)]
[Authorize(Roles = RoleNames.ExportObjects)]
[ProducesResponseType(typeof(ExportObjectResult), StatusCodes.Status200OK)]
[HttpGet]
public async Task<IActionResult> ExportMap(string id)
{
ExportObjectResult exportResult = await RunMapExport(id);

return Ok(exportResult);
}

/// <summary>
/// Downloads the export result of a map by id
/// </summary>
/// <param name="id">Map Id</param>
/// <returns>Export result</returns>
[Authorize(Roles = RoleNames.Karta)]
[Authorize(Roles = RoleNames.ExportObjects)]
[ProducesResponseType(typeof(ExportObjectResult), StatusCodes.Status200OK)]
[HttpGet]
public async Task<IActionResult> DownloadExportMap(string id)
{
ExportObjectResult exportResult = await RunMapExport(id);

return File(Encoding.UTF8.GetBytes(exportResult.Code), "text/plain", exportResult.ObjectFilename + "." + exportResult.FileExtension);
}

/// <summary>
/// Runs a map export
/// </summary>
/// <param name="id">Map Id</param>
/// <returns>Export result</returns>
private async Task<ExportObjectResult> RunMapExport(string id)
{
KartaMap map = await _mapDbAccess.GetMapById(id);

JsonSerializerOptions options = new JsonSerializerOptions
{
WriteIndented = true,
Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping
};

ExportObjectResult exportResult = new ExportObjectResult();
exportResult.Code = JsonSerializer.Serialize(map, options);
exportResult.Errors = new List<ExportPlaceholderError>();
exportResult.ObjectFilename = StringUtility.CleanInvalidFilenameChars(map.Name);
exportResult.FileExtension = "json";
return exportResult;
}

/// <summary>
/// Returns the colored image for a note marker
/// </summary>
/// <param name="color">Color to use</param>
/// <returns>Colored image</returns>
[ProducesResponseType(typeof(string), StatusCodes.Status200OK)]
[HttpGet]
public async Task<IActionResult> GetNoteMapImage(string color)
{
if(string.IsNullOrEmpty(color))
{
color = "#a9a9a9";
}

string imagePath = Path.Combine(_hostEnvironment.WebRootPath, "img", "karta", "noteMarker.svg");
string imageContent = await System.IO.File.ReadAllTextAsync(imagePath);

imageContent = imageContent.Replace("{{fillColor}}", color);

return File(Encoding.UTF8.GetBytes(imageContent), "image/svg+xml");
}
}
}
6 changes: 6 additions & 0 deletions Controllers/Api/KirjaApiController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -589,6 +589,7 @@ public async Task<IActionResult> GetPagesBySkill(string skillId)
/// <returns>Id</returns>
[ProducesResponseType(typeof(KirjaPage), StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
[ProducesResponseType(StatusCodes.Status500InternalServerError)]
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> CreatePage([FromBody]PageRequest page)
Expand Down Expand Up @@ -946,6 +947,7 @@ public async Task<IActionResult> DeletePage(string id)
/// <returns>Image Name</returns>
[ProducesResponseType(typeof(string), StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
[ProducesResponseType(StatusCodes.Status500InternalServerError)]
[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult ImageUpload()
Expand Down Expand Up @@ -984,6 +986,7 @@ public IActionResult ImageUpload()
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
[ProducesResponseType(StatusCodes.Status500InternalServerError)]
[HttpGet]
public IActionResult KirjaImage(string imageFile)
{
Expand Down Expand Up @@ -1035,6 +1038,7 @@ private async Task DeleteUnusedImages(string pageId, List<string> imagesToDelete
[ProducesResponseType(typeof(KirjaPageAttachment), StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
[ProducesResponseType(StatusCodes.Status500InternalServerError)]
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> UploadPageAttachment(string id)
Expand Down Expand Up @@ -1168,6 +1172,7 @@ public async Task<IActionResult> KirjaAttachment(string pageId, string attachmen
[ProducesResponseType(typeof(string), StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
[ProducesResponseType(StatusCodes.Status500InternalServerError)]
[HttpDelete]
[ValidateAntiForgeryToken]
public async Task<IActionResult> DeleteAttachment(string pageId, string attachmentFile)
Expand Down Expand Up @@ -1297,6 +1302,7 @@ public async Task<IActionResult> ValidateVersionReferences(string versionId)
[ProducesResponseType(typeof(string), StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
[ProducesResponseType(StatusCodes.Status500InternalServerError)]
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> StartReview([FromBody]StartReviewRequest request)
Expand Down
1 change: 1 addition & 0 deletions Controllers/Api/PersonalDataApiController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1037,6 +1037,7 @@ private async Task FillLockEntries(PersonalDataResponse response, GoNorthUser cu
/// </summary>
/// <returns>Result</returns>
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status500InternalServerError)]
[ValidateAntiForgeryToken]
[HttpPost]
public async Task<IActionResult> DeleteUserData()
Expand Down

0 comments on commit c80d001

Please sign in to comment.