forked from wkallhof/Simple301
-
Notifications
You must be signed in to change notification settings - Fork 7
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #31 from ninameghan/feature/issue-2-import-export
Feature/issue 2 import export
- Loading branch information
Showing
37 changed files
with
1,157 additions
and
917 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
namespace SimpleRedirects.Core.Enums; | ||
|
||
public enum DataRecordProvider | ||
{ | ||
Csv, | ||
Excel | ||
} |
30 changes: 30 additions & 0 deletions
30
source/SimpleRedirects.Core/Extensions/FormFileExtensions.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
using Microsoft.AspNetCore.Http; | ||
using SimpleRedirects.Core.Enums; | ||
|
||
namespace SimpleRedirects.Core.Extensions; | ||
|
||
internal static class FormFileExtensions | ||
{ | ||
/// <summary> | ||
/// Attempts to read a file's extension and translate this to a DataRecordProvider to be able to determine the correct service to use to handle the import file | ||
/// </summary> | ||
/// <param name="file">The file which will be used to determine the data record provider</param> | ||
/// <param name="dataRecordProvider"></param> | ||
/// <returns>True and a DataRecordProvider as out var when filetype can be matched to one, false and null when the file's type cannot be mapped to a DataRecordProvider</returns> | ||
internal static bool CanGetDataRecordProviderFromFile(this IFormFile file, out DataRecordProvider dataRecordProvider) | ||
{ | ||
var fileType = System.IO.Path.GetExtension(file?.FileName); | ||
switch (fileType) | ||
{ | ||
case ".csv": | ||
dataRecordProvider = DataRecordProvider.Csv; | ||
return true; | ||
case ".xlsx": | ||
dataRecordProvider = DataRecordProvider.Excel; | ||
return true; | ||
default: | ||
dataRecordProvider = DataRecordProvider.Csv; | ||
return false; | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,17 +1,10 @@ | ||
using Newtonsoft.Json; | ||
using Newtonsoft.Json.Serialization; | ||
|
||
namespace SimpleRedirects.Core.Models | ||
{ | ||
public class AddRedirectResponse | ||
public class AddRedirectResponse : BaseResponse | ||
{ | ||
[JsonProperty("newRedirect")] | ||
public Redirect NewRedirect { get; set; } | ||
|
||
[JsonProperty("success")] | ||
public bool Success { get; set; } | ||
|
||
[JsonProperty("message")] | ||
public string Message { get; set; } | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
using Newtonsoft.Json; | ||
|
||
namespace SimpleRedirects.Core.Models; | ||
|
||
public abstract class BaseResponse | ||
{ | ||
[JsonProperty("success")] | ||
public bool Success { get; set; } | ||
|
||
[JsonProperty("message")] | ||
public string Message { get; set; } | ||
} |
23 changes: 23 additions & 0 deletions
23
source/SimpleRedirects.Core/Models/DataRecordCollectionFile.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,23 @@ | ||
using System; | ||
using System.Globalization; | ||
using Microsoft.AspNetCore.Mvc; | ||
using SimpleRedirects.Core.Enums; | ||
|
||
namespace SimpleRedirects.Core.Models; | ||
|
||
public class DataRecordCollectionFile | ||
{ | ||
public DataRecordProvider DataRecordProvider { get; set; } | ||
public byte[] File { get; set; } | ||
public string ContentType => DataRecordProvider == DataRecordProvider.Csv ? "text/csv" : "application/vnd.ms-excel"; | ||
public string FileExtension => DataRecordProvider == DataRecordProvider.Csv ? ".csv" : ".xlsx"; | ||
public string FileName => $"SimpleRedirects-{DataRecordProvider}-Export-{DateTimeOffset.Now.ToString("dd-M-yyyy", CultureInfo.InvariantCulture)}{FileExtension}"; | ||
|
||
public DataRecordCollectionFile(DataRecordProvider dataRecordProvider, byte[] file) | ||
{ | ||
DataRecordProvider = dataRecordProvider; | ||
File = file; | ||
} | ||
|
||
public FileContentResult AsFileContentResult() => new(File, ContentType) { FileDownloadName = FileName }; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
45 changes: 45 additions & 0 deletions
45
source/SimpleRedirects.Core/Models/ImportRedirectsResponse.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,45 @@ | ||
using System; | ||
using System.Linq; | ||
using Newtonsoft.Json; | ||
|
||
namespace SimpleRedirects.Core.Models; | ||
|
||
public class ImportRedirectsResponse : BaseResponse | ||
{ | ||
[JsonProperty("addedRedirects")] | ||
public int AddedRedirects { get; set; } | ||
|
||
[JsonProperty("updatedRedirects")] | ||
public int UpdatedRedirects { get; set; } | ||
|
||
[JsonProperty("existingRedirects")] | ||
public int ExistingRedirects { get; set; } | ||
|
||
[JsonProperty("errorRedirects")] | ||
public Redirect[] ErrorRedirects { get; set; } | ||
|
||
public static ImportRedirectsResponse FromImport(int addedRedirects, int updatedRedirects, int existingRedirects, Redirect[] errorRedirects) | ||
=> new ImportRedirectsResponse | ||
{ | ||
Success = !errorRedirects.Any(), | ||
Message = $"Redirect import completed {(!errorRedirects.Any() ? "without errors" : $"with {errorRedirects.Length} error{FormatSingularOrPlural(errorRedirects.Length)}")},{(existingRedirects > 0 ? $" ignored {existingRedirects} redirect{FormatSingularOrPlural(existingRedirects)} because they already existed," : string.Empty)} added {addedRedirects} redirect{FormatSingularOrPlural(addedRedirects)}{(updatedRedirects > 0 ? $" and updated {updatedRedirects} redirect{FormatSingularOrPlural(updatedRedirects)}" : string.Empty)}.", | ||
AddedRedirects = addedRedirects, | ||
UpdatedRedirects = updatedRedirects, | ||
ExistingRedirects = existingRedirects, | ||
ErrorRedirects = errorRedirects | ||
}; | ||
|
||
public static ImportRedirectsResponse EmptyImportRecordResponse(string message = "No valid redirects could be processed.") | ||
=> new ImportRedirectsResponse | ||
{ | ||
Success = false, | ||
Message = message, | ||
AddedRedirects = 0, | ||
UpdatedRedirects = 0, | ||
ExistingRedirects = 0, | ||
ErrorRedirects = Array.Empty<Redirect>() | ||
}; | ||
|
||
private static string FormatSingularOrPlural(int length) | ||
=> length == 1 ? string.Empty : "s"; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
using System.Globalization; | ||
using CsvHelper.Configuration; | ||
|
||
namespace SimpleRedirects.Core.Models; | ||
|
||
public sealed class RedirectMap : ClassMap<Redirect> | ||
{ | ||
public RedirectMap() | ||
{ | ||
AutoMap(CultureInfo.InvariantCulture); | ||
Map(m => m.Id).Ignore(); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.