diff --git a/.config/dotnet-tools.json b/.config/dotnet-tools.json index 50bf6c3d..a4713c52 100644 --- a/.config/dotnet-tools.json +++ b/.config/dotnet-tools.json @@ -3,10 +3,10 @@ "isRoot": true, "tools": { "csharpier": { - "version": "0.25.0", + "version": "0.27.3", "commands": [ "dotnet-csharpier" ] } } -} +} \ No newline at end of file diff --git a/.github/workflows/dotnetcore.yml b/.github/workflows/dotnetcore.yml index 1663ff41..56250d8e 100644 --- a/.github/workflows/dotnetcore.yml +++ b/.github/workflows/dotnetcore.yml @@ -11,5 +11,5 @@ jobs: - uses: actions/checkout@v4 - uses: actions/setup-dotnet@v4 with: - dotnet-version: 7.0.400 - - run: dotnet run -p build/build.csproj + dotnet-version: 8.0.201 + - run: dotnet run --project build/build.csproj diff --git a/Conduit.sln b/Conduit.sln index 2e7e2bb0..db504655 100644 --- a/Conduit.sln +++ b/Conduit.sln @@ -18,6 +18,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "config", "config", "{E0DF0C Directory.Packages.props = Directory.Packages.props Directory.Build.props = Directory.Build.props global.json = global.json + .editorconfig = .editorconfig EndProjectSection EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "build", "build", "{79EC8D73-8DAD-430E-93CE-C1F29DBC33FA}" diff --git a/Directory.Build.props b/Directory.Build.props index e5455b29..180ab7ff 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -1,6 +1,6 @@ - net7.0 + net8.0 enable Recommended true diff --git a/Directory.Packages.props b/Directory.Packages.props index e7cbbb24..e8ab07ba 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -1,22 +1,21 @@ - - - + + - - - - - - - - + + + + + + + + - - + + - - + + diff --git a/Dockerfile b/Dockerfile index 8ee9801a..1a800e93 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,9 +1,9 @@ #See https://aka.ms/customizecontainer to learn how to customize your debug container and how Visual Studio uses this Dockerfile to build your images for faster debugging. -FROM mcr.microsoft.com/dotnet/runtime:7.0 AS base +FROM mcr.microsoft.com/dotnet/runtime:8.0 AS base WORKDIR /app -FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build +FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build WORKDIR /src COPY ["build/build.csproj", "build/"] RUN dotnet restore "build/build.csproj" diff --git a/build/Program.cs b/build/Program.cs index c4d4a6a9..fdb54a19 100644 --- a/build/Program.cs +++ b/build/Program.cs @@ -16,10 +16,7 @@ ForEach("publish", "**/bin", "**/obj"), dir => { - IEnumerable GetDirectories(string d) - { - return Glob.Directories(".", d); - } + IEnumerable GetDirectories(string d) => Glob.Directories(".", d); void RemoveDirectory(string d) { @@ -53,10 +50,7 @@ void RemoveDirectory(string d) DependsOn(Build), () => { - IEnumerable GetFiles(string d) - { - return Glob.Files(".", d); - } + IEnumerable GetFiles(string d) => Glob.Files(".", d); foreach (var file in GetFiles("tests/**/*.csproj")) { @@ -73,7 +67,7 @@ IEnumerable GetFiles(string d) { Run( "dotnet", - $"publish {project} -c Release -f net7.0 -o ./publish --no-restore --no-build --verbosity=normal" + $"publish {project} -c Release -f net8.0 -o ./publish --no-restore --no-build --verbosity=normal" ); } ); diff --git a/build/packages.lock.json b/build/packages.lock.json index f4de76ba..8a8fa2c0 100644 --- a/build/packages.lock.json +++ b/build/packages.lock.json @@ -1,12 +1,12 @@ { "version": 2, "dependencies": { - "net7.0": { + "net8.0": { "Bullseye": { "type": "Direct", - "requested": "[4.2.1, )", - "resolved": "4.2.1", - "contentHash": "LQ/YuE1TSxCPfn5qGwf7RpS4jGhXEES1ylsHUNbPKdyJqbh+3VRLcxhS2aUHM9wOKaLR7uISuaiHBYc5Idfatw==" + "requested": "[5.0.0, )", + "resolved": "5.0.0", + "contentHash": "bqyt+m17ym+5aN45C5oZRAjuLDt8jKiCm/ys1XfymIXSkrTFwvI/QsbY3ucPSHDz7SF7uON7B57kXFv5H2k1ew==" }, "Glob": { "type": "Direct", @@ -16,9 +16,9 @@ }, "SimpleExec": { "type": "Direct", - "requested": "[11.0.0, )", - "resolved": "11.0.0", - "contentHash": "4r/YxcXlD9yk0XGdU07gUFey6ZiWu7LxG76l9d9xTDfObOcLvug1Xa9loQYuqs2nEviyTgicD1Svragh2qzlOA==" + "requested": "[12.0.0, )", + "resolved": "12.0.0", + "contentHash": "ptxlWtxC8vM6Y6e3h9ZTxBBkOWnWrm/Sa1HT+2i1xcXY3Hx2hmKDZP5RShPf8Xr9D+ivlrXNy57ktzyH8kyt+Q==" } } } diff --git a/global.json b/global.json index be8a2868..78f4b48c 100644 --- a/global.json +++ b/global.json @@ -1,6 +1,6 @@ { "sdk": { - "version": "7.0.306", + "version": "8.0.201", "rollForward": "latestFeature" } } diff --git a/src/Conduit/Conduit.csproj b/src/Conduit/Conduit.csproj index 47acb2f8..3f69debc 100644 --- a/src/Conduit/Conduit.csproj +++ b/src/Conduit/Conduit.csproj @@ -1,7 +1,6 @@ - diff --git a/src/Conduit/Domain/Article.cs b/src/Conduit/Domain/Article.cs index 6edd920d..b5404e67 100644 --- a/src/Conduit/Domain/Article.cs +++ b/src/Conduit/Domain/Article.cs @@ -9,7 +9,7 @@ namespace Conduit.Domain; public class Article { [JsonIgnore] - public int ArticleId { get; set; } + public int ArticleId { get; init; } public string? Slug { get; set; } @@ -19,12 +19,12 @@ public class Article public string? Body { get; set; } - public Person? Author { get; set; } + public Person? Author { get; init; } - public List Comments { get; set; } = new(); + public List Comments { get; init; } = new(); [NotMapped] - public bool Favorited => ArticleFavorites?.Any() ?? false; + public bool Favorited => ArticleFavorites.Count != 0; [NotMapped] public int FavoritesCount => ArticleFavorites?.Count ?? 0; @@ -34,12 +34,12 @@ public class Article ArticleTags.Where(x => x.TagId is not null).Select(x => x.TagId!).ToList(); [JsonIgnore] - public List ArticleTags { get; set; } = new(); + public List ArticleTags { get; init; } = new(); [JsonIgnore] - public List ArticleFavorites { get; set; } = new(); + public List ArticleFavorites { get; init; } = new(); - public DateTime CreatedAt { get; set; } + public DateTime CreatedAt { get; init; } public DateTime UpdatedAt { get; set; } -} \ No newline at end of file +} diff --git a/src/Conduit/Domain/ArticleFavorite.cs b/src/Conduit/Domain/ArticleFavorite.cs index 56bd7b42..992d21ad 100644 --- a/src/Conduit/Domain/ArticleFavorite.cs +++ b/src/Conduit/Domain/ArticleFavorite.cs @@ -2,9 +2,9 @@ namespace Conduit.Domain; public class ArticleFavorite { - public int ArticleId { get; set; } - public Article? Article { get; set; } + public int ArticleId { get; init; } + public Article? Article { get; init; } - public int PersonId { get; set; } - public Person? Person { get; set; } -} \ No newline at end of file + public int PersonId { get; init; } + public Person? Person { get; init; } +} diff --git a/src/Conduit/Domain/ArticleTag.cs b/src/Conduit/Domain/ArticleTag.cs index ad8499cf..0d34e477 100644 --- a/src/Conduit/Domain/ArticleTag.cs +++ b/src/Conduit/Domain/ArticleTag.cs @@ -2,9 +2,9 @@ namespace Conduit.Domain; public class ArticleTag { - public int ArticleId { get; set; } - public Article? Article { get; set; } + public int ArticleId { get; init; } + public Article? Article { get; init; } - public string? TagId { get; set; } - public Tag? Tag { get; set; } -} \ No newline at end of file + public string? TagId { get; init; } + public Tag? Tag { get; init; } +} diff --git a/src/Conduit/Domain/Comment.cs b/src/Conduit/Domain/Comment.cs index 5da37ba3..7a1710e7 100644 --- a/src/Conduit/Domain/Comment.cs +++ b/src/Conduit/Domain/Comment.cs @@ -6,22 +6,22 @@ namespace Conduit.Domain; public class Comment { [JsonPropertyName("id")] - public int CommentId { get; set; } + public int CommentId { get; init; } - public string? Body { get; set; } + public string? Body { get; init; } - public Person? Author { get; set; } + public Person? Author { get; init; } [JsonIgnore] - public int AuthorId { get; set; } + public int AuthorId { get; init; } [JsonIgnore] - public Article? Article { get; set; } + public Article? Article { get; init; } [JsonIgnore] - public int ArticleId { get; set; } + public int ArticleId { get; init; } - public DateTime CreatedAt { get; set; } + public DateTime CreatedAt { get; init; } - public DateTime UpdatedAt { get; set; } -} \ No newline at end of file + public DateTime UpdatedAt { get; init; } +} diff --git a/src/Conduit/Domain/FollowedPeople.cs b/src/Conduit/Domain/FollowedPeople.cs index 13c60f6e..bab1d764 100644 --- a/src/Conduit/Domain/FollowedPeople.cs +++ b/src/Conduit/Domain/FollowedPeople.cs @@ -2,9 +2,9 @@ namespace Conduit.Domain; public class FollowedPeople { - public int ObserverId { get; set; } - public Person? Observer { get; set; } + public int ObserverId { get; init; } + public Person? Observer { get; init; } - public int TargetId { get; set; } - public Person? Target { get; set; } -} \ No newline at end of file + public int TargetId { get; init; } + public Person? Target { get; init; } +} diff --git a/src/Conduit/Domain/Person.cs b/src/Conduit/Domain/Person.cs index 9a5cb376..7e9a468b 100644 --- a/src/Conduit/Domain/Person.cs +++ b/src/Conduit/Domain/Person.cs @@ -7,7 +7,7 @@ namespace Conduit.Domain; public class Person { [JsonIgnore] - public int PersonId { get; set; } + public int PersonId { get; init; } public string? Username { get; set; } @@ -18,17 +18,17 @@ public class Person public string? Image { get; set; } [JsonIgnore] - public List ArticleFavorites { get; set; } = new(); + public List ArticleFavorites { get; init; } = new(); [JsonIgnore] - public List Following { get; set; } = new(); + public List Following { get; init; } = new(); [JsonIgnore] - public List Followers { get; set; } = new(); + public List Followers { get; init; } = new(); [JsonIgnore] - public byte[] Hash { get; set; } = Array.Empty(); + public byte[] Hash { get; set; } = []; [JsonIgnore] - public byte[] Salt { get; set; } = Array.Empty(); -} \ No newline at end of file + public byte[] Salt { get; set; } = []; +} diff --git a/src/Conduit/Domain/Tag.cs b/src/Conduit/Domain/Tag.cs index 753b8a2f..ea78ed30 100644 --- a/src/Conduit/Domain/Tag.cs +++ b/src/Conduit/Domain/Tag.cs @@ -4,7 +4,7 @@ namespace Conduit.Domain; public class Tag { - public string? TagId { get; set; } + public string? TagId { get; init; } - public List ArticleTags { get; set; } = new(); -} \ No newline at end of file + public List ArticleTags { get; init; } = new(); +} diff --git a/src/Conduit/Features/Articles/ArticleEnvelope.cs b/src/Conduit/Features/Articles/ArticleEnvelope.cs index bbb86f5c..95394233 100644 --- a/src/Conduit/Features/Articles/ArticleEnvelope.cs +++ b/src/Conduit/Features/Articles/ArticleEnvelope.cs @@ -2,4 +2,4 @@ namespace Conduit.Features.Articles; -public record ArticleEnvelope(Article Article); \ No newline at end of file +public record ArticleEnvelope(Article Article); diff --git a/src/Conduit/Features/Articles/ArticlesController.cs b/src/Conduit/Features/Articles/ArticlesController.cs index 9aeda171..9b458e4d 100644 --- a/src/Conduit/Features/Articles/ArticlesController.cs +++ b/src/Conduit/Features/Articles/ArticlesController.cs @@ -8,15 +8,8 @@ namespace Conduit.Features.Articles; [Route("articles")] -public class ArticlesController : Controller +public class ArticlesController(IMediator mediator) : Controller { - private readonly IMediator _mediator; - - public ArticlesController(IMediator mediator) - { - _mediator = mediator; - } - [HttpGet] public Task Get( [FromQuery] string tag, @@ -25,13 +18,7 @@ public Task Get( [FromQuery] int? limit, [FromQuery] int? offset, CancellationToken cancellationToken - ) - { - return _mediator.Send( - new List.Query(tag, author, favorited, limit, offset), - cancellationToken - ); - } + ) => mediator.Send(new List.Query(tag, author, favorited, limit, offset), cancellationToken); [HttpGet("feed")] public Task GetFeed( @@ -41,28 +28,22 @@ public Task GetFeed( [FromQuery] int? limit, [FromQuery] int? offset, CancellationToken cancellationToken - ) - { - return _mediator.Send( - new List.Query(tag, author, favorited, limit, offset) { IsFeed = true } + ) => + mediator.Send( + new List.Query(tag, author, favorited, limit, offset) { IsFeed = true }, + cancellationToken ); - } [HttpGet("{slug}")] - public Task Get(string slug, CancellationToken cancellationToken) - { - return _mediator.Send(new Details.Query(slug), cancellationToken); - } + public Task Get(string slug, CancellationToken cancellationToken) => + mediator.Send(new Details.Query(slug), cancellationToken); [HttpPost] [Authorize(AuthenticationSchemes = JwtIssuerOptions.Schemes)] public Task Create( [FromBody] Create.Command command, CancellationToken cancellationToken - ) - { - return _mediator.Send(command, cancellationToken); - } + ) => mediator.Send(command, cancellationToken); [HttpPut("{slug}")] [Authorize(AuthenticationSchemes = JwtIssuerOptions.Schemes)] @@ -70,15 +51,10 @@ public Task Edit( string slug, [FromBody] Edit.Model model, CancellationToken cancellationToken - ) - { - return _mediator.Send(new Edit.Command(model, slug), cancellationToken); - } + ) => mediator.Send(new Edit.Command(model, slug), cancellationToken); [HttpDelete("{slug}")] [Authorize(AuthenticationSchemes = JwtIssuerOptions.Schemes)] - public Task Delete(string slug, CancellationToken cancellationToken) - { - return _mediator.Send(new Delete.Command(slug), cancellationToken); - } -} \ No newline at end of file + public Task Delete(string slug, CancellationToken cancellationToken) => + mediator.Send(new Delete.Command(slug), cancellationToken); +} diff --git a/src/Conduit/Features/Articles/ArticlesEnvelope.cs b/src/Conduit/Features/Articles/ArticlesEnvelope.cs index b7dde6fb..347ce78c 100644 --- a/src/Conduit/Features/Articles/ArticlesEnvelope.cs +++ b/src/Conduit/Features/Articles/ArticlesEnvelope.cs @@ -8,4 +8,4 @@ public class ArticlesEnvelope public List
Articles { get; set; } = new(); public int ArticlesCount { get; set; } -} \ No newline at end of file +} diff --git a/src/Conduit/Features/Articles/Create.cs b/src/Conduit/Features/Articles/Create.cs index 3a7a55f8..5d66d49b 100644 --- a/src/Conduit/Features/Articles/Create.cs +++ b/src/Conduit/Features/Articles/Create.cs @@ -15,13 +15,13 @@ public class Create { public class ArticleData { - public string? Title { get; set; } + public string? Title { get; init; } - public string? Description { get; set; } + public string? Description { get; init; } - public string? Body { get; set; } + public string? Body { get; init; } - public string[]? TagList { get; set; } + public string[]? TagList { get; init; } } public class ArticleDataValidator : AbstractValidator @@ -38,42 +38,32 @@ public record Command(ArticleData Article) : IRequest; public class CommandValidator : AbstractValidator { - public CommandValidator() - { + public CommandValidator() => RuleFor(x => x.Article).NotNull().SetValidator(new ArticleDataValidator()); - } } - public class Handler : IRequestHandler + public class Handler(ConduitContext context, ICurrentUserAccessor currentUserAccessor) + : IRequestHandler { - private readonly ConduitContext _context; - private readonly ICurrentUserAccessor _currentUserAccessor; - - public Handler(ConduitContext context, ICurrentUserAccessor currentUserAccessor) - { - _context = context; - _currentUserAccessor = currentUserAccessor; - } - public async Task Handle( Command message, CancellationToken cancellationToken ) { - var author = await _context.Persons.FirstAsync( - x => x.Username == _currentUserAccessor.GetCurrentUsername(), + var author = await context.Persons.FirstAsync( + x => x.Username == currentUserAccessor.GetCurrentUsername(), cancellationToken ); var tags = new List(); foreach (var tag in (message.Article.TagList ?? Enumerable.Empty())) { - var t = await _context.Tags.FindAsync(tag); + var t = await context.Tags.FindAsync(tag); if (t == null) { t = new Tag() { TagId = tag }; - await _context.Tags.AddAsync(t, cancellationToken); + await context.Tags.AddAsync(t, cancellationToken); //save immediately for reuse - await _context.SaveChangesAsync(cancellationToken); + await context.SaveChangesAsync(cancellationToken); } tags.Add(t); } @@ -88,16 +78,16 @@ CancellationToken cancellationToken Title = message.Article.Title, Slug = message.Article.Title.GenerateSlug() }; - await _context.Articles.AddAsync(article, cancellationToken); + await context.Articles.AddAsync(article, cancellationToken); - await _context.ArticleTags.AddRangeAsync( + await context.ArticleTags.AddRangeAsync( tags.Select(x => new ArticleTag() { Article = article, Tag = x }), cancellationToken ); - await _context.SaveChangesAsync(cancellationToken); + await context.SaveChangesAsync(cancellationToken); return new ArticleEnvelope(article); } } -} \ No newline at end of file +} diff --git a/src/Conduit/Features/Articles/Delete.cs b/src/Conduit/Features/Articles/Delete.cs index 4779caad..09366dc7 100644 --- a/src/Conduit/Features/Articles/Delete.cs +++ b/src/Conduit/Features/Articles/Delete.cs @@ -18,16 +18,12 @@ public class CommandValidator : AbstractValidator public CommandValidator() => RuleFor(x => x.Slug).NotNull().NotEmpty(); } - public class QueryHandler : IRequestHandler + public class QueryHandler(ConduitContext context) : IRequestHandler { - private readonly ConduitContext _context; - - public QueryHandler(ConduitContext context) => _context = context; - public async Task Handle(Command message, CancellationToken cancellationToken) { var article = - await _context.Articles.FirstOrDefaultAsync( + await context.Articles.FirstOrDefaultAsync( x => x.Slug == message.Slug, cancellationToken ) @@ -36,9 +32,9 @@ await _context.Articles.FirstOrDefaultAsync( new { Article = Constants.NOT_FOUND } ); - _context.Articles.Remove(article); - await _context.SaveChangesAsync(cancellationToken); + context.Articles.Remove(article); + await context.SaveChangesAsync(cancellationToken); await Task.FromResult(Unit.Value); } } -} \ No newline at end of file +} diff --git a/src/Conduit/Features/Articles/Details.cs b/src/Conduit/Features/Articles/Details.cs index a6fee96f..05a77473 100644 --- a/src/Conduit/Features/Articles/Details.cs +++ b/src/Conduit/Features/Articles/Details.cs @@ -18,19 +18,15 @@ public class QueryValidator : AbstractValidator public QueryValidator() => RuleFor(x => x.Slug).NotNull().NotEmpty(); } - public class QueryHandler : IRequestHandler + public class QueryHandler(ConduitContext context) : IRequestHandler { - private readonly ConduitContext _context; - - public QueryHandler(ConduitContext context) => _context = context; - public async Task Handle( Query message, CancellationToken cancellationToken ) { - var article = await _context.Articles - .GetAllData() + var article = await context + .Articles.GetAllData() .FirstOrDefaultAsync(x => x.Slug == message.Slug, cancellationToken); if (article == null) @@ -43,4 +39,4 @@ CancellationToken cancellationToken return new ArticleEnvelope(article); } } -} \ No newline at end of file +} diff --git a/src/Conduit/Features/Articles/Edit.cs b/src/Conduit/Features/Articles/Edit.cs index f6cfca32..25b16786 100644 --- a/src/Conduit/Features/Articles/Edit.cs +++ b/src/Conduit/Features/Articles/Edit.cs @@ -15,16 +15,7 @@ namespace Conduit.Features.Articles; public class Edit { - public class ArticleData - { - public string? Title { get; set; } - - public string? Description { get; set; } - - public string? Body { get; set; } - - public string[]? TagList { get; set; } - } + public record ArticleData(string? Title, string? Description, string? Body, string[]? TagList); public record Command(Model Model, string Slug) : IRequest; @@ -32,28 +23,18 @@ public record Model(ArticleData Article); public class CommandValidator : AbstractValidator { - public CommandValidator() - { - RuleFor(x => x.Model.Article).NotNull(); - } + public CommandValidator() => RuleFor(x => x.Model.Article).NotNull(); } - public class Handler : IRequestHandler + public class Handler(ConduitContext context) : IRequestHandler { - private readonly ConduitContext _context; - - public Handler(ConduitContext context) - { - _context = context; - } - public async Task Handle( Command message, CancellationToken cancellationToken ) { - var article = await _context.Articles - .Include(x => x.ArticleTags) // include also the article tags since they also need to be updated + var article = await context + .Articles.Include(x => x.ArticleTags) // include also the article tags since they also need to be updated .Where(x => x.Slug == message.Slug) .FirstOrDefaultAsync(cancellationToken); @@ -77,36 +58,32 @@ CancellationToken cancellationToken var articleTagsToDelete = GetArticleTagsToDelete(article, articleTagList); if ( - _context.ChangeTracker.Entries().First(x => x.Entity == article).State - == EntityState.Modified - || articleTagsToCreate.Any() - || articleTagsToDelete.Any() + context.ChangeTracker.Entries().First(x => x.Entity == article).State + == EntityState.Modified + || articleTagsToCreate.Count != 0 + || articleTagsToDelete.Count != 0 ) { article.UpdatedAt = DateTime.UtcNow; } // ensure context is tracking any tags that are about to be created so that it won't attempt to insert a duplicate - _context.Tags.AttachRange( + context.Tags.AttachRange( articleTagsToCreate.Where(x => x.Tag is not null).Select(a => a.Tag!).ToArray() ); // add the new article tags - await _context.ArticleTags.AddRangeAsync(articleTagsToCreate, cancellationToken); + await context.ArticleTags.AddRangeAsync(articleTagsToCreate, cancellationToken); // delete the tags that do not exist anymore - _context.ArticleTags.RemoveRange(articleTagsToDelete); - - await _context.SaveChangesAsync(cancellationToken); - - article = - await _context.Articles - .GetAllData() - .Where(x => x.Slug == article.Slug) - .FirstOrDefaultAsync( - x => x.ArticleId == article.ArticleId, - cancellationToken - ); + context.ArticleTags.RemoveRange(articleTagsToDelete); + + await context.SaveChangesAsync(cancellationToken); + + article = await context + .Articles.GetAllData() + .Where(x => x.Slug == article.Slug) + .FirstOrDefaultAsync(x => x.ArticleId == article.ArticleId, cancellationToken); if (article is null) { throw new RestException( diff --git a/src/Conduit/Features/Articles/List.cs b/src/Conduit/Features/Articles/List.cs index 7ef61ded..d0ed2e8b 100644 --- a/src/Conduit/Features/Articles/List.cs +++ b/src/Conduit/Features/Articles/List.cs @@ -21,30 +21,22 @@ public record Query( bool IsFeed = false ) : IRequest; - public class QueryHandler : IRequestHandler + public class QueryHandler(ConduitContext context, ICurrentUserAccessor currentUserAccessor) + : IRequestHandler { - private readonly ConduitContext _context; - private readonly ICurrentUserAccessor _currentUserAccessor; - - public QueryHandler(ConduitContext context, ICurrentUserAccessor currentUserAccessor) - { - _context = context; - _currentUserAccessor = currentUserAccessor; - } - public async Task Handle( Query message, CancellationToken cancellationToken ) { - var queryable = _context.Articles.GetAllData(); + var queryable = context.Articles.GetAllData(); - if (message.IsFeed && _currentUserAccessor.GetCurrentUsername() != null) + if (message.IsFeed && currentUserAccessor.GetCurrentUsername() != null) { - var currentUser = await _context.Persons - .Include(x => x.Following) + var currentUser = await context + .Persons.Include(x => x.Following) .FirstOrDefaultAsync( - x => x.Username == _currentUserAccessor.GetCurrentUsername(), + x => x.Username == currentUserAccessor.GetCurrentUsername(), cancellationToken ); @@ -55,24 +47,21 @@ CancellationToken cancellationToken new { User = Constants.NOT_FOUND } ); } - queryable = queryable.Where( - x => - currentUser.Following - .Select(y => y.TargetId) - .Contains(x.Author!.PersonId) + queryable = queryable.Where(x => + currentUser.Following.Select(y => y.TargetId).Contains(x.Author!.PersonId) ); } if (!string.IsNullOrWhiteSpace(message.Tag)) { - var tag = await _context.ArticleTags.FirstOrDefaultAsync( + var tag = await context.ArticleTags.FirstOrDefaultAsync( x => x.TagId == message.Tag, cancellationToken ); if (tag != null) { - queryable = queryable.Where( - x => x.ArticleTags.Select(y => y.TagId).Contains(tag.TagId) + queryable = queryable.Where(x => + x.ArticleTags.Select(y => y.TagId).Contains(tag.TagId) ); } else @@ -83,7 +72,7 @@ CancellationToken cancellationToken if (!string.IsNullOrWhiteSpace(message.Author)) { - var author = await _context.Persons.FirstOrDefaultAsync( + var author = await context.Persons.FirstOrDefaultAsync( x => x.Username == message.Author, cancellationToken ); @@ -99,14 +88,14 @@ CancellationToken cancellationToken if (!string.IsNullOrWhiteSpace(message.FavoritedUsername)) { - var author = await _context.Persons.FirstOrDefaultAsync( + var author = await context.Persons.FirstOrDefaultAsync( x => x.Username == message.FavoritedUsername, cancellationToken ); if (author != null) { - queryable = queryable.Where( - x => x.ArticleFavorites.Any(y => y.PersonId == author.PersonId) + queryable = queryable.Where(x => + x.ArticleFavorites.Any(y => y.PersonId == author.PersonId) ); } else diff --git a/src/Conduit/Features/Comments/CommentEnvelope.cs b/src/Conduit/Features/Comments/CommentEnvelope.cs index 9b784580..23662e4d 100644 --- a/src/Conduit/Features/Comments/CommentEnvelope.cs +++ b/src/Conduit/Features/Comments/CommentEnvelope.cs @@ -2,4 +2,4 @@ namespace Conduit.Features.Comments; -public record CommentEnvelope(Comment Comment); \ No newline at end of file +public record CommentEnvelope(Comment Comment); diff --git a/src/Conduit/Features/Comments/CommentsController.cs b/src/Conduit/Features/Comments/CommentsController.cs index 920615f4..c45e91a2 100644 --- a/src/Conduit/Features/Comments/CommentsController.cs +++ b/src/Conduit/Features/Comments/CommentsController.cs @@ -8,36 +8,22 @@ namespace Conduit.Features.Comments; [Route("articles")] -public class CommentsController : Controller +public class CommentsController(IMediator mediator) : Controller { - private readonly IMediator _mediator; - - public CommentsController(IMediator mediator) - { - _mediator = mediator; - } - [HttpPost("{slug}/comments")] [Authorize(AuthenticationSchemes = JwtIssuerOptions.Schemes)] public Task Create( string slug, [FromBody] Create.Model model, CancellationToken cancellationToken - ) - { - return _mediator.Send(new Create.Command(model, slug), cancellationToken); - } + ) => mediator.Send(new Create.Command(model, slug), cancellationToken); [HttpGet("{slug}/comments")] - public Task Get(string slug, CancellationToken cancellationToken) - { - return _mediator.Send(new List.Query(slug), cancellationToken); - } + public Task Get(string slug, CancellationToken cancellationToken) => + mediator.Send(new List.Query(slug), cancellationToken); [HttpDelete("{slug}/comments/{id}")] [Authorize(AuthenticationSchemes = JwtIssuerOptions.Schemes)] - public Task Delete(string slug, int id, CancellationToken cancellationToken) - { - return _mediator.Send(new Delete.Command(slug, id), cancellationToken); - } -} \ No newline at end of file + public Task Delete(string slug, int id, CancellationToken cancellationToken) => + mediator.Send(new Delete.Command(slug, id), cancellationToken); +} diff --git a/src/Conduit/Features/Comments/CommentsEnvelope.cs b/src/Conduit/Features/Comments/CommentsEnvelope.cs index 869987ec..5bb1d657 100644 --- a/src/Conduit/Features/Comments/CommentsEnvelope.cs +++ b/src/Conduit/Features/Comments/CommentsEnvelope.cs @@ -3,4 +3,4 @@ namespace Conduit.Features.Comments; -public record CommentsEnvelope(List Comments); \ No newline at end of file +public record CommentsEnvelope(List Comments); diff --git a/src/Conduit/Features/Comments/Create.cs b/src/Conduit/Features/Comments/Create.cs index f1c3d369..b32d90bd 100644 --- a/src/Conduit/Features/Comments/Create.cs +++ b/src/Conduit/Features/Comments/Create.cs @@ -21,30 +21,19 @@ public record Model(CommentData Comment) : IRequest; public class CommandValidator : AbstractValidator { - public CommandValidator() - { - RuleFor(x => x.Model.Comment.Body).NotEmpty(); - } + public CommandValidator() => RuleFor(x => x.Model.Comment.Body).NotEmpty(); } - public class Handler : IRequestHandler + public class Handler(ConduitContext context, ICurrentUserAccessor currentUserAccessor) + : IRequestHandler { - private readonly ConduitContext _context; - private readonly ICurrentUserAccessor _currentUserAccessor; - - public Handler(ConduitContext context, ICurrentUserAccessor currentUserAccessor) - { - _context = context; - _currentUserAccessor = currentUserAccessor; - } - public async Task Handle( Command message, CancellationToken cancellationToken ) { - var article = await _context.Articles - .Include(x => x.Comments) + var article = await context + .Articles.Include(x => x.Comments) .FirstOrDefaultAsync(x => x.Slug == message.Slug, cancellationToken); if (article == null) @@ -55,8 +44,8 @@ CancellationToken cancellationToken ); } - var author = await _context.Persons.FirstAsync( - x => x.Username == _currentUserAccessor.GetCurrentUsername(), + var author = await context.Persons.FirstAsync( + x => x.Username == currentUserAccessor.GetCurrentUsername(), cancellationToken ); @@ -67,13 +56,13 @@ CancellationToken cancellationToken CreatedAt = DateTime.UtcNow, UpdatedAt = DateTime.UtcNow }; - await _context.Comments.AddAsync(comment, cancellationToken); + await context.Comments.AddAsync(comment, cancellationToken); article.Comments.Add(comment); - await _context.SaveChangesAsync(cancellationToken); + await context.SaveChangesAsync(cancellationToken); return new CommentEnvelope(comment); } } -} \ No newline at end of file +} diff --git a/src/Conduit/Features/Comments/Delete.cs b/src/Conduit/Features/Comments/Delete.cs index 5c59154b..08b0144a 100644 --- a/src/Conduit/Features/Comments/Delete.cs +++ b/src/Conduit/Features/Comments/Delete.cs @@ -19,17 +19,13 @@ public class CommandValidator : AbstractValidator public CommandValidator() => RuleFor(x => x.Slug).NotNull().NotEmpty(); } - public class QueryHandler : IRequestHandler + public class QueryHandler(ConduitContext context) : IRequestHandler { - private readonly ConduitContext _context; - - public QueryHandler(ConduitContext context) => _context = context; - public async Task Handle(Command message, CancellationToken cancellationToken) { var article = - await _context.Articles - .Include(x => x.Comments) + await context + .Articles.Include(x => x.Comments) .FirstOrDefaultAsync(x => x.Slug == message.Slug, cancellationToken) ?? throw new RestException( HttpStatusCode.NotFound, @@ -43,9 +39,9 @@ await _context.Articles new { Comment = Constants.NOT_FOUND } ); - _context.Comments.Remove(comment); - await _context.SaveChangesAsync(cancellationToken); + context.Comments.Remove(comment); + await context.SaveChangesAsync(cancellationToken); await Task.FromResult(Unit.Value); } } -} \ No newline at end of file +} diff --git a/src/Conduit/Features/Comments/List.cs b/src/Conduit/Features/Comments/List.cs index 8b02e972..ffd70e13 100644 --- a/src/Conduit/Features/Comments/List.cs +++ b/src/Conduit/Features/Comments/List.cs @@ -12,22 +12,15 @@ public class List { public record Query(string Slug) : IRequest; - public class QueryHandler : IRequestHandler + public class QueryHandler(ConduitContext context) : IRequestHandler { - private readonly ConduitContext _context; - - public QueryHandler(ConduitContext context) - { - _context = context; - } - public async Task Handle( Query message, CancellationToken cancellationToken ) { - var article = await _context.Articles - .Include(x => x.Comments) + var article = await context + .Articles.Include(x => x.Comments) .ThenInclude(x => x.Author) .FirstOrDefaultAsync(x => x.Slug == message.Slug, cancellationToken); @@ -42,4 +35,4 @@ CancellationToken cancellationToken return new CommentsEnvelope(article.Comments); } } -} \ No newline at end of file +} diff --git a/src/Conduit/Features/Favorites/Add.cs b/src/Conduit/Features/Favorites/Add.cs index 95d08745..e8ddae04 100644 --- a/src/Conduit/Features/Favorites/Add.cs +++ b/src/Conduit/Features/Favorites/Add.cs @@ -17,29 +17,18 @@ public record Command(string Slug) : IRequest; public class CommandValidator : AbstractValidator { - public CommandValidator() - { - DefaultValidatorExtensions.NotNull(RuleFor(x => x.Slug)).NotEmpty(); - } + public CommandValidator() => RuleFor(x => x.Slug).NotNull().NotEmpty(); } - public class QueryHandler : IRequestHandler + public class QueryHandler(ConduitContext context, ICurrentUserAccessor currentUserAccessor) + : IRequestHandler { - private readonly ConduitContext _context; - private readonly ICurrentUserAccessor _currentUserAccessor; - - public QueryHandler(ConduitContext context, ICurrentUserAccessor currentUserAccessor) - { - _context = context; - _currentUserAccessor = currentUserAccessor; - } - public async Task Handle( Command message, CancellationToken cancellationToken ) { - var article = await _context.Articles.FirstOrDefaultAsync( + var article = await context.Articles.FirstOrDefaultAsync( x => x.Slug == message.Slug, cancellationToken ); @@ -52,8 +41,8 @@ CancellationToken cancellationToken ); } - var person = await _context.Persons.FirstOrDefaultAsync( - x => x.Username == _currentUserAccessor.GetCurrentUsername(), + var person = await context.Persons.FirstOrDefaultAsync( + x => x.Username == currentUserAccessor.GetCurrentUsername(), cancellationToken ); @@ -65,7 +54,7 @@ CancellationToken cancellationToken ); } - var favorite = await _context.ArticleFavorites.FirstOrDefaultAsync( + var favorite = await context.ArticleFavorites.FirstOrDefaultAsync( x => x.ArticleId == article.ArticleId && x.PersonId == person.PersonId, cancellationToken ); @@ -79,19 +68,13 @@ CancellationToken cancellationToken Person = person, PersonId = person.PersonId }; - await _context.ArticleFavorites.AddAsync(favorite, cancellationToken); - await _context.SaveChangesAsync(cancellationToken); + await context.ArticleFavorites.AddAsync(favorite, cancellationToken); + await context.SaveChangesAsync(cancellationToken); } - - - article = - await _context.Articles - .GetAllData() - .FirstOrDefaultAsync( - x => x.ArticleId == article.ArticleId, - cancellationToken - ); + article = await context + .Articles.GetAllData() + .FirstOrDefaultAsync(x => x.ArticleId == article.ArticleId, cancellationToken); if (article is null) { throw new RestException( diff --git a/src/Conduit/Features/Favorites/Delete.cs b/src/Conduit/Features/Favorites/Delete.cs index 9839b4bd..5a25c787 100644 --- a/src/Conduit/Features/Favorites/Delete.cs +++ b/src/Conduit/Features/Favorites/Delete.cs @@ -16,30 +16,19 @@ public record Command(string Slug) : IRequest; public class CommandValidator : AbstractValidator { - public CommandValidator() - { - DefaultValidatorExtensions.NotNull(RuleFor(x => x.Slug)).NotEmpty(); - } + public CommandValidator() => RuleFor(x => x.Slug).NotNull().NotEmpty(); } - public class QueryHandler : IRequestHandler + public class QueryHandler(ConduitContext context, ICurrentUserAccessor currentUserAccessor) + : IRequestHandler { - private readonly ConduitContext _context; - private readonly ICurrentUserAccessor _currentUserAccessor; - - public QueryHandler(ConduitContext context, ICurrentUserAccessor currentUserAccessor) - { - _context = context; - _currentUserAccessor = currentUserAccessor; - } - public async Task Handle( Command message, CancellationToken cancellationToken ) { var article = - await _context.Articles.FirstOrDefaultAsync( + await context.Articles.FirstOrDefaultAsync( x => x.Slug == message.Slug, cancellationToken ) @@ -48,8 +37,8 @@ await _context.Articles.FirstOrDefaultAsync( new { Article = Constants.NOT_FOUND } ); - var person = await _context.Persons.FirstOrDefaultAsync( - x => x.Username == _currentUserAccessor.GetCurrentUsername(), + var person = await context.Persons.FirstOrDefaultAsync( + x => x.Username == currentUserAccessor.GetCurrentUsername(), cancellationToken ); if (person is null) @@ -60,24 +49,20 @@ await _context.Articles.FirstOrDefaultAsync( ); } - var favorite = await _context.ArticleFavorites.FirstOrDefaultAsync( + var favorite = await context.ArticleFavorites.FirstOrDefaultAsync( x => x.ArticleId == article.ArticleId && x.PersonId == person.PersonId, cancellationToken ); if (favorite != null) { - _context.ArticleFavorites.Remove(favorite); - await _context.SaveChangesAsync(cancellationToken); + context.ArticleFavorites.Remove(favorite); + await context.SaveChangesAsync(cancellationToken); } - article = - await _context.Articles - .GetAllData() - .FirstOrDefaultAsync( - x => x.ArticleId == article.ArticleId, - cancellationToken - ); + article = await context + .Articles.GetAllData() + .FirstOrDefaultAsync(x => x.ArticleId == article.ArticleId, cancellationToken); if (article is null) { throw new RestException( diff --git a/src/Conduit/Features/Favorites/FavoritesController.cs b/src/Conduit/Features/Favorites/FavoritesController.cs index 3a70b054..eac28723 100644 --- a/src/Conduit/Features/Favorites/FavoritesController.cs +++ b/src/Conduit/Features/Favorites/FavoritesController.cs @@ -9,29 +9,15 @@ namespace Conduit.Features.Favorites; [Route("articles")] -public class FavoritesController : Controller +public class FavoritesController(IMediator mediator) : Controller { - private readonly IMediator _mediator; - - public FavoritesController(IMediator mediator) - { - _mediator = mediator; - } - [HttpPost("{slug}/favorite")] [Authorize(AuthenticationSchemes = JwtIssuerOptions.Schemes)] - public Task FavoriteAdd(string slug, CancellationToken cancellationToken) - { - return _mediator.Send(new Add.Command(slug), cancellationToken); - } + public Task FavoriteAdd(string slug, CancellationToken cancellationToken) => + mediator.Send(new Add.Command(slug), cancellationToken); [HttpDelete("{slug}/favorite")] [Authorize(AuthenticationSchemes = JwtIssuerOptions.Schemes)] - public Task FavoriteDelete( - string slug, - CancellationToken cancellationToken - ) - { - return _mediator.Send(new Delete.Command(slug), cancellationToken); - } -} \ No newline at end of file + public Task FavoriteDelete(string slug, CancellationToken cancellationToken) => + mediator.Send(new Delete.Command(slug), cancellationToken); +} diff --git a/src/Conduit/Features/Followers/Add.cs b/src/Conduit/Features/Followers/Add.cs index 0d07bd59..cb07dfa8 100644 --- a/src/Conduit/Features/Followers/Add.cs +++ b/src/Conduit/Features/Followers/Add.cs @@ -17,35 +17,21 @@ public record Command(string Username) : IRequest; public class CommandValidator : AbstractValidator { - public CommandValidator() - { - DefaultValidatorExtensions.NotNull(RuleFor(x => x.Username)).NotEmpty(); - } + public CommandValidator() => RuleFor(x => x.Username).NotNull().NotEmpty(); } - public class QueryHandler : IRequestHandler + public class QueryHandler( + ConduitContext context, + ICurrentUserAccessor currentUserAccessor, + IProfileReader profileReader + ) : IRequestHandler { - private readonly ConduitContext _context; - private readonly ICurrentUserAccessor _currentUserAccessor; - private readonly IProfileReader _profileReader; - - public QueryHandler( - ConduitContext context, - ICurrentUserAccessor currentUserAccessor, - IProfileReader profileReader - ) - { - _context = context; - _currentUserAccessor = currentUserAccessor; - _profileReader = profileReader; - } - public async Task Handle( Command message, CancellationToken cancellationToken ) { - var target = await _context.Persons.FirstOrDefaultAsync( + var target = await context.Persons.FirstOrDefaultAsync( x => x.Username == message.Username, cancellationToken ); @@ -58,8 +44,8 @@ CancellationToken cancellationToken ); } - var observer = await _context.Persons.FirstOrDefaultAsync( - x => x.Username == _currentUserAccessor.GetCurrentUsername(), + var observer = await context.Persons.FirstOrDefaultAsync( + x => x.Username == currentUserAccessor.GetCurrentUsername(), cancellationToken ); @@ -71,7 +57,7 @@ CancellationToken cancellationToken ); } - var followedPeople = await _context.FollowedPeople.FirstOrDefaultAsync( + var followedPeople = await context.FollowedPeople.FirstOrDefaultAsync( x => x.ObserverId == observer.PersonId && x.TargetId == target.PersonId, cancellationToken ); @@ -85,11 +71,11 @@ CancellationToken cancellationToken Target = target, TargetId = target.PersonId }; - await _context.FollowedPeople.AddAsync(followedPeople, cancellationToken); - await _context.SaveChangesAsync(cancellationToken); + await context.FollowedPeople.AddAsync(followedPeople, cancellationToken); + await context.SaveChangesAsync(cancellationToken); } - return await _profileReader.ReadProfile(message.Username, cancellationToken); + return await profileReader.ReadProfile(message.Username, cancellationToken); } } } diff --git a/src/Conduit/Features/Followers/Delete.cs b/src/Conduit/Features/Followers/Delete.cs index 7ef62e5c..f9fd7ee6 100644 --- a/src/Conduit/Features/Followers/Delete.cs +++ b/src/Conduit/Features/Followers/Delete.cs @@ -16,35 +16,21 @@ public record Command(string Username) : IRequest; public class CommandValidator : AbstractValidator { - public CommandValidator() - { - DefaultValidatorExtensions.NotNull(RuleFor(x => x.Username)).NotEmpty(); - } + public CommandValidator() => RuleFor(x => x.Username).NotNull().NotEmpty(); } - public class QueryHandler : IRequestHandler + public class QueryHandler( + ConduitContext context, + ICurrentUserAccessor currentUserAccessor, + IProfileReader profileReader + ) : IRequestHandler { - private readonly ConduitContext _context; - private readonly ICurrentUserAccessor _currentUserAccessor; - private readonly IProfileReader _profileReader; - - public QueryHandler( - ConduitContext context, - ICurrentUserAccessor currentUserAccessor, - IProfileReader profileReader - ) - { - _context = context; - _currentUserAccessor = currentUserAccessor; - _profileReader = profileReader; - } - public async Task Handle( Command message, CancellationToken cancellationToken ) { - var target = await _context.Persons.FirstOrDefaultAsync( + var target = await context.Persons.FirstOrDefaultAsync( x => x.Username == message.Username, cancellationToken ); @@ -57,8 +43,8 @@ CancellationToken cancellationToken ); } - var observer = await _context.Persons.FirstOrDefaultAsync( - x => x.Username == _currentUserAccessor.GetCurrentUsername(), + var observer = await context.Persons.FirstOrDefaultAsync( + x => x.Username == currentUserAccessor.GetCurrentUsername(), cancellationToken ); @@ -70,18 +56,18 @@ CancellationToken cancellationToken ); } - var followedPeople = await _context.FollowedPeople.FirstOrDefaultAsync( + var followedPeople = await context.FollowedPeople.FirstOrDefaultAsync( x => x.ObserverId == observer.PersonId && x.TargetId == target.PersonId, cancellationToken ); if (followedPeople != null) { - _context.FollowedPeople.Remove(followedPeople); - await _context.SaveChangesAsync(cancellationToken); + context.FollowedPeople.Remove(followedPeople); + await context.SaveChangesAsync(cancellationToken); } - return await _profileReader.ReadProfile(message.Username, cancellationToken); + return await profileReader.ReadProfile(message.Username, cancellationToken); } } } diff --git a/src/Conduit/Features/Followers/FollowersController.cs b/src/Conduit/Features/Followers/FollowersController.cs index e011de98..a0fca6ec 100644 --- a/src/Conduit/Features/Followers/FollowersController.cs +++ b/src/Conduit/Features/Followers/FollowersController.cs @@ -9,26 +9,15 @@ namespace Conduit.Features.Followers; [Route("profiles")] -public class FollowersController : Controller +public class FollowersController(IMediator mediator) : Controller { - private readonly IMediator _mediator; - - public FollowersController(IMediator mediator) - { - _mediator = mediator; - } - [HttpPost("{username}/follow")] [Authorize(AuthenticationSchemes = JwtIssuerOptions.Schemes)] - public Task Follow(string username, CancellationToken cancellationToken) - { - return _mediator.Send(new Add.Command(username), cancellationToken); - } + public Task Follow(string username, CancellationToken cancellationToken) => + mediator.Send(new Add.Command(username), cancellationToken); [HttpDelete("{username}/follow")] [Authorize(AuthenticationSchemes = JwtIssuerOptions.Schemes)] - public Task Unfollow(string username, CancellationToken cancellationToken) - { - return _mediator.Send(new Delete.Command(username), cancellationToken); - } -} \ No newline at end of file + public Task Unfollow(string username, CancellationToken cancellationToken) => + mediator.Send(new Delete.Command(username), cancellationToken); +} diff --git a/src/Conduit/Features/Profiles/Details.cs b/src/Conduit/Features/Profiles/Details.cs index 511ddfe4..4f76e0e0 100644 --- a/src/Conduit/Features/Profiles/Details.cs +++ b/src/Conduit/Features/Profiles/Details.cs @@ -11,24 +11,13 @@ public record Query(string Username) : IRequest; public class QueryValidator : AbstractValidator { - public QueryValidator() - { - RuleFor(x => x.Username).NotEmpty(); - } + public QueryValidator() => RuleFor(x => x.Username).NotEmpty(); } - public class QueryHandler : IRequestHandler + public class QueryHandler(IProfileReader profileReader) + : IRequestHandler { - private readonly IProfileReader _profileReader; - - public QueryHandler(IProfileReader profileReader) - { - _profileReader = profileReader; - } - - public Task Handle(Query message, CancellationToken cancellationToken) - { - return _profileReader.ReadProfile(message.Username, cancellationToken); - } + public Task Handle(Query message, CancellationToken cancellationToken) => + profileReader.ReadProfile(message.Username, cancellationToken); } -} \ No newline at end of file +} diff --git a/src/Conduit/Features/Profiles/IProfileReader.cs b/src/Conduit/Features/Profiles/IProfileReader.cs index 87eb7ae5..0c2c4468 100644 --- a/src/Conduit/Features/Profiles/IProfileReader.cs +++ b/src/Conduit/Features/Profiles/IProfileReader.cs @@ -6,4 +6,4 @@ namespace Conduit.Features.Profiles; public interface IProfileReader { Task ReadProfile(string username, CancellationToken cancellationToken); -} \ No newline at end of file +} diff --git a/src/Conduit/Features/Profiles/MappingProfile.cs b/src/Conduit/Features/Profiles/MappingProfile.cs index 7733f03f..4c7e2d16 100644 --- a/src/Conduit/Features/Profiles/MappingProfile.cs +++ b/src/Conduit/Features/Profiles/MappingProfile.cs @@ -4,8 +4,5 @@ namespace Conduit.Features.Profiles; public class MappingProfile : AutoMapper.Profile { - public MappingProfile() - { - CreateMap(MemberList.None); - } -} \ No newline at end of file + public MappingProfile() => CreateMap(MemberList.None); +} diff --git a/src/Conduit/Features/Profiles/Profile.cs b/src/Conduit/Features/Profiles/Profile.cs index c76eacc9..091f3aec 100644 --- a/src/Conduit/Features/Profiles/Profile.cs +++ b/src/Conduit/Features/Profiles/Profile.cs @@ -4,12 +4,12 @@ namespace Conduit.Features.Profiles; public class Profile { - public string? Username { get; set; } + public string? Username { get; init; } - public string? Bio { get; set; } + public string? Bio { get; init; } - public string? Image { get; set; } + public string? Image { get; init; } [JsonPropertyName("following")] public bool IsFollowed { get; set; } -} \ No newline at end of file +} diff --git a/src/Conduit/Features/Profiles/ProfileEnvelope.cs b/src/Conduit/Features/Profiles/ProfileEnvelope.cs index ce1c42b7..e483b315 100644 --- a/src/Conduit/Features/Profiles/ProfileEnvelope.cs +++ b/src/Conduit/Features/Profiles/ProfileEnvelope.cs @@ -1,3 +1,3 @@ namespace Conduit.Features.Profiles; -public record ProfileEnvelope(Profile Profile); \ No newline at end of file +public record ProfileEnvelope(Profile Profile); diff --git a/src/Conduit/Features/Profiles/ProfileReader.cs b/src/Conduit/Features/Profiles/ProfileReader.cs index 613d542b..cce9a952 100644 --- a/src/Conduit/Features/Profiles/ProfileReader.cs +++ b/src/Conduit/Features/Profiles/ProfileReader.cs @@ -9,54 +9,37 @@ namespace Conduit.Features.Profiles; -public class ProfileReader : IProfileReader +public class ProfileReader( + ConduitContext context, + ICurrentUserAccessor currentUserAccessor, + IMapper mapper +) : IProfileReader { - private readonly ConduitContext _context; - private readonly ICurrentUserAccessor _currentUserAccessor; - private readonly IMapper _mapper; - - public ProfileReader( - ConduitContext context, - ICurrentUserAccessor currentUserAccessor, - IMapper mapper - ) - { - _context = context; - _currentUserAccessor = currentUserAccessor; - _mapper = mapper; - } - public async Task ReadProfile( string username, CancellationToken cancellationToken ) { - var currentUserName = _currentUserAccessor.GetCurrentUsername(); + var currentUserName = currentUserAccessor.GetCurrentUsername(); - var person = await _context.Persons - .AsNoTracking() + var person = await context + .Persons.AsNoTracking() .FirstOrDefaultAsync(x => x.Username == username, cancellationToken); if (person is null) { - throw new RestException( - HttpStatusCode.NotFound, - new { User = Constants.NOT_FOUND } - ); + throw new RestException(HttpStatusCode.NotFound, new { User = Constants.NOT_FOUND }); } if (person == null) { - throw new RestException( - HttpStatusCode.NotFound, - new { User = Constants.NOT_FOUND } - ); + throw new RestException(HttpStatusCode.NotFound, new { User = Constants.NOT_FOUND }); } - var profile = _mapper.Map(person); + var profile = mapper.Map(person); if (currentUserName != null) { - var currentPerson = await _context.Persons - .Include(x => x.Following) + var currentPerson = await context + .Persons.Include(x => x.Following) .Include(x => x.Followers) .FirstOrDefaultAsync(x => x.Username == currentUserName, cancellationToken); diff --git a/src/Conduit/Features/Profiles/ProfilesController.cs b/src/Conduit/Features/Profiles/ProfilesController.cs index 4dc16597..d3af98fc 100644 --- a/src/Conduit/Features/Profiles/ProfilesController.cs +++ b/src/Conduit/Features/Profiles/ProfilesController.cs @@ -6,18 +6,9 @@ namespace Conduit.Features.Profiles; [Route("profiles")] -public class ProfilesController : Controller +public class ProfilesController(IMediator mediator) : Controller { - private readonly IMediator _mediator; - - public ProfilesController(IMediator mediator) - { - _mediator = mediator; - } - [HttpGet("{username}")] - public Task Get(string username, CancellationToken cancellationToken) - { - return _mediator.Send(new Details.Query(username), cancellationToken); - } -} \ No newline at end of file + public Task Get(string username, CancellationToken cancellationToken) => + mediator.Send(new Details.Query(username), cancellationToken); +} diff --git a/src/Conduit/Features/Tags/List.cs b/src/Conduit/Features/Tags/List.cs index c10eb79e..cd4d6be3 100644 --- a/src/Conduit/Features/Tags/List.cs +++ b/src/Conduit/Features/Tags/List.cs @@ -12,22 +12,12 @@ public class List { public record Query : IRequest; - public class QueryHandler : IRequestHandler + public class QueryHandler(ConduitContext context) : IRequestHandler { - private readonly ConduitContext _context; - - public QueryHandler(ConduitContext context) - { - _context = context; - } - - public async Task Handle( - Query message, - CancellationToken cancellationToken - ) + public async Task Handle(Query message, CancellationToken cancellationToken) { - var tags = await _context.Tags - .OrderBy(x => x.TagId) + var tags = await context + .Tags.OrderBy(x => x.TagId) .AsNoTracking() .ToListAsync(cancellationToken); return new TagsEnvelope() @@ -36,4 +26,4 @@ CancellationToken cancellationToken }; } } -} \ No newline at end of file +} diff --git a/src/Conduit/Features/Tags/TagsController.cs b/src/Conduit/Features/Tags/TagsController.cs index 5ec11a48..c063bea4 100644 --- a/src/Conduit/Features/Tags/TagsController.cs +++ b/src/Conduit/Features/Tags/TagsController.cs @@ -6,18 +6,9 @@ namespace Conduit.Features.Tags; [Route("tags")] -public class TagsController : Controller +public class TagsController(IMediator mediator) : Controller { - private readonly IMediator _mediator; - - public TagsController(IMediator mediator) - { - _mediator = mediator; - } - [HttpGet] - public Task Get(CancellationToken cancellationToken) - { - return _mediator.Send(new List.Query(), cancellationToken); - } -} \ No newline at end of file + public Task Get(CancellationToken cancellationToken) => + mediator.Send(new List.Query(), cancellationToken); +} diff --git a/src/Conduit/Features/Tags/TagsEnvelope.cs b/src/Conduit/Features/Tags/TagsEnvelope.cs index 1f4da691..aca8dfbd 100644 --- a/src/Conduit/Features/Tags/TagsEnvelope.cs +++ b/src/Conduit/Features/Tags/TagsEnvelope.cs @@ -5,4 +5,4 @@ namespace Conduit.Features.Tags; public class TagsEnvelope { public List Tags { get; set; } = new(); -} \ No newline at end of file +} diff --git a/src/Conduit/Features/Users/Create.cs b/src/Conduit/Features/Users/Create.cs index a44b14b4..f63ebb7b 100644 --- a/src/Conduit/Features/Users/Create.cs +++ b/src/Conduit/Features/Users/Create.cs @@ -16,14 +16,7 @@ namespace Conduit.Features.Users; public class Create { - public class UserData - { - public string? Username { get; set; } - - public string? Email { get; set; } - - public string? Password { get; set; } - } + public record UserData(string? Username, string? Email, string? Password); public record Command(UserData User) : IRequest; @@ -37,34 +30,18 @@ public CommandValidator() } } - public class Handler : IRequestHandler + public class Handler( + ConduitContext context, + IPasswordHasher passwordHasher, + IJwtTokenGenerator jwtTokenGenerator, + IMapper mapper + ) : IRequestHandler { - private readonly ConduitContext _context; - private readonly IPasswordHasher _passwordHasher; - private readonly IJwtTokenGenerator _jwtTokenGenerator; - private readonly IMapper _mapper; - - public Handler( - ConduitContext context, - IPasswordHasher passwordHasher, - IJwtTokenGenerator jwtTokenGenerator, - IMapper mapper - ) - { - _context = context; - _passwordHasher = passwordHasher; - _jwtTokenGenerator = jwtTokenGenerator; - _mapper = mapper; - } - - public async Task Handle( - Command message, - CancellationToken cancellationToken - ) + public async Task Handle(Command message, CancellationToken cancellationToken) { if ( - await _context.Persons - .Where(x => x.Username == message.User.Username) + await context + .Persons.Where(x => x.Username == message.User.Username) .AnyAsync(cancellationToken) ) { @@ -75,8 +52,8 @@ await _context.Persons } if ( - await _context.Persons - .Where(x => x.Email == message.User.Email) + await context + .Persons.Where(x => x.Email == message.User.Email) .AnyAsync(cancellationToken) ) { @@ -91,21 +68,21 @@ await _context.Persons { Username = message.User.Username, Email = message.User.Email, - Hash = await _passwordHasher.Hash( + Hash = await passwordHasher.Hash( message.User.Password ?? throw new InvalidOperationException(), salt ), Salt = salt }; - await _context.Persons.AddAsync(person, cancellationToken); - await _context.SaveChangesAsync(cancellationToken); + await context.Persons.AddAsync(person, cancellationToken); + await context.SaveChangesAsync(cancellationToken); - var user = _mapper.Map(person); - user.Token = _jwtTokenGenerator.CreateToken( + var user = mapper.Map(person); + user.Token = jwtTokenGenerator.CreateToken( person.Username ?? throw new InvalidOperationException() ); return new UserEnvelope(user); } } -} \ No newline at end of file +} diff --git a/src/Conduit/Features/Users/Details.cs b/src/Conduit/Features/Users/Details.cs index 997c5f4c..9fe133c8 100644 --- a/src/Conduit/Features/Users/Details.cs +++ b/src/Conduit/Features/Users/Details.cs @@ -18,36 +18,19 @@ public record Query(string Username) : IRequest; public class QueryValidator : AbstractValidator { - public QueryValidator() - { - RuleFor(x => x.Username).NotNull().NotEmpty(); - } + public QueryValidator() => RuleFor(x => x.Username).NotNull().NotEmpty(); } - public class QueryHandler : IRequestHandler + public class QueryHandler( + ConduitContext context, + IJwtTokenGenerator jwtTokenGenerator, + IMapper mapper + ) : IRequestHandler { - private readonly ConduitContext _context; - private readonly IJwtTokenGenerator _jwtTokenGenerator; - private readonly IMapper _mapper; - - public QueryHandler( - ConduitContext context, - IJwtTokenGenerator jwtTokenGenerator, - IMapper mapper - ) - { - _context = context; - _jwtTokenGenerator = jwtTokenGenerator; - _mapper = mapper; - } - - public async Task Handle( - Query message, - CancellationToken cancellationToken - ) + public async Task Handle(Query message, CancellationToken cancellationToken) { - var person = await _context.Persons - .AsNoTracking() + var person = await context + .Persons.AsNoTracking() .FirstOrDefaultAsync(x => x.Username == message.Username, cancellationToken); if (person == null) @@ -58,11 +41,11 @@ CancellationToken cancellationToken ); } - var user = _mapper.Map(person); - user.Token = _jwtTokenGenerator.CreateToken( + var user = mapper.Map(person); + user.Token = jwtTokenGenerator.CreateToken( person.Username ?? throw new InvalidOperationException() ); return new UserEnvelope(user); } } -} \ No newline at end of file +} diff --git a/src/Conduit/Features/Users/Edit.cs b/src/Conduit/Features/Users/Edit.cs index e7fb845b..45a661e3 100644 --- a/src/Conduit/Features/Users/Edit.cs +++ b/src/Conduit/Features/Users/Edit.cs @@ -32,40 +32,21 @@ public record Command(UserData User) : IRequest; public class CommandValidator : AbstractValidator { - public CommandValidator() - { - RuleFor(x => x.User).NotNull(); - } + public CommandValidator() => RuleFor(x => x.User).NotNull(); } - public class Handler : IRequestHandler + public class Handler( + ConduitContext context, + IPasswordHasher passwordHasher, + ICurrentUserAccessor currentUserAccessor, + IMapper mapper + ) : IRequestHandler { - private readonly ConduitContext _context; - private readonly IPasswordHasher _passwordHasher; - private readonly ICurrentUserAccessor _currentUserAccessor; - private readonly IMapper _mapper; - - public Handler( - ConduitContext context, - IPasswordHasher passwordHasher, - ICurrentUserAccessor currentUserAccessor, - IMapper mapper - ) - { - _context = context; - _passwordHasher = passwordHasher; - _currentUserAccessor = currentUserAccessor; - _mapper = mapper; - } - - public async Task Handle( - Command message, - CancellationToken cancellationToken - ) + public async Task Handle(Command message, CancellationToken cancellationToken) { - var currentUsername = _currentUserAccessor.GetCurrentUsername(); - var person = await _context.Persons - .Where(x => x.Username == currentUsername) + var currentUsername = currentUserAccessor.GetCurrentUsername(); + var person = await context + .Persons.Where(x => x.Username == currentUsername) .FirstOrDefaultAsync(cancellationToken); if (person is null) { @@ -83,13 +64,13 @@ CancellationToken cancellationToken if (!string.IsNullOrWhiteSpace(message.User.Password)) { var salt = Guid.NewGuid().ToByteArray(); - person.Hash = await _passwordHasher.Hash(message.User.Password, salt); + person.Hash = await passwordHasher.Hash(message.User.Password, salt); person.Salt = salt; } - await _context.SaveChangesAsync(cancellationToken); + await context.SaveChangesAsync(cancellationToken); - return new UserEnvelope(_mapper.Map(person)); + return new UserEnvelope(mapper.Map(person)); } } } diff --git a/src/Conduit/Features/Users/Login.cs b/src/Conduit/Features/Users/Login.cs index 3d80e9de..db28a97c 100644 --- a/src/Conduit/Features/Users/Login.cs +++ b/src/Conduit/Features/Users/Login.cs @@ -17,9 +17,9 @@ public class Login { public class UserData { - public string? Email { get; set; } + public string? Email { get; init; } - public string? Password { get; set; } + public string? Password { get; init; } } public record Command(UserData User) : IRequest; @@ -34,33 +34,17 @@ public CommandValidator() } } - public class Handler : IRequestHandler + public class Handler( + ConduitContext context, + IPasswordHasher passwordHasher, + IJwtTokenGenerator jwtTokenGenerator, + IMapper mapper + ) : IRequestHandler { - private readonly ConduitContext _context; - private readonly IPasswordHasher _passwordHasher; - private readonly IJwtTokenGenerator _jwtTokenGenerator; - private readonly IMapper _mapper; - - public Handler( - ConduitContext context, - IPasswordHasher passwordHasher, - IJwtTokenGenerator jwtTokenGenerator, - IMapper mapper - ) - { - _context = context; - _passwordHasher = passwordHasher; - _jwtTokenGenerator = jwtTokenGenerator; - _mapper = mapper; - } - - public async Task Handle( - Command message, - CancellationToken cancellationToken - ) + public async Task Handle(Command message, CancellationToken cancellationToken) { - var person = await _context.Persons - .Where(x => x.Email == message.User.Email) + var person = await context + .Persons.Where(x => x.Email == message.User.Email) .SingleOrDefaultAsync(cancellationToken); if (person == null) { @@ -72,7 +56,7 @@ CancellationToken cancellationToken if ( !person.Hash.SequenceEqual( - await _passwordHasher.Hash( + await passwordHasher.Hash( message.User.Password ?? throw new InvalidOperationException(), person.Salt ) @@ -85,11 +69,11 @@ await _passwordHasher.Hash( ); } - var user = _mapper.Map(person); - user.Token = _jwtTokenGenerator.CreateToken( + var user = mapper.Map(person); + user.Token = jwtTokenGenerator.CreateToken( person.Username ?? throw new InvalidOperationException() ); return new UserEnvelope(user); } } -} \ No newline at end of file +} diff --git a/src/Conduit/Features/Users/MappingProfile.cs b/src/Conduit/Features/Users/MappingProfile.cs index eeef93d0..3f289e42 100644 --- a/src/Conduit/Features/Users/MappingProfile.cs +++ b/src/Conduit/Features/Users/MappingProfile.cs @@ -4,8 +4,5 @@ namespace Conduit.Features.Users; public class MappingProfile : Profile { - public MappingProfile() - { - CreateMap(MemberList.None); - } -} \ No newline at end of file + public MappingProfile() => CreateMap(MemberList.None); +} diff --git a/src/Conduit/Features/Users/User.cs b/src/Conduit/Features/Users/User.cs index 6df19bd4..e8b7b72e 100644 --- a/src/Conduit/Features/Users/User.cs +++ b/src/Conduit/Features/Users/User.cs @@ -2,15 +2,15 @@ namespace Conduit.Features.Users; public class User { - public string? Username { get; set; } + public string? Username { get; init; } - public string? Email { get; set; } + public string? Email { get; init; } - public string? Bio { get; set; } + public string? Bio { get; init; } - public string? Image { get; set; } + public string? Image { get; init; } public string? Token { get; set; } } -public record UserEnvelope(User User); \ No newline at end of file +public record UserEnvelope(User User); diff --git a/src/Conduit/Features/Users/UserController.cs b/src/Conduit/Features/Users/UserController.cs index ec6999dc..65674fcd 100644 --- a/src/Conduit/Features/Users/UserController.cs +++ b/src/Conduit/Features/Users/UserController.cs @@ -10,32 +10,18 @@ namespace Conduit.Features.Users; [Route("user")] [Authorize(AuthenticationSchemes = JwtIssuerOptions.Schemes)] -public class UserController +public class UserController(IMediator mediator, ICurrentUserAccessor currentUserAccessor) { - private readonly IMediator _mediator; - private readonly ICurrentUserAccessor _currentUserAccessor; - - public UserController(IMediator mediator, ICurrentUserAccessor currentUserAccessor) - { - _mediator = mediator; - _currentUserAccessor = currentUserAccessor; - } - [HttpGet] - public Task GetCurrent(CancellationToken cancellationToken) - { - return _mediator.Send( - new Details.Query(_currentUserAccessor.GetCurrentUsername() ?? ""), + public Task GetCurrent(CancellationToken cancellationToken) => + mediator.Send( + new Details.Query(currentUserAccessor.GetCurrentUsername() ?? ""), cancellationToken ); - } [HttpPut] public Task UpdateUser( [FromBody] Edit.Command command, CancellationToken cancellationToken - ) - { - return _mediator.Send(command, cancellationToken); - } -} \ No newline at end of file + ) => mediator.Send(command, cancellationToken); +} diff --git a/src/Conduit/Features/Users/UsersController.cs b/src/Conduit/Features/Users/UsersController.cs index 8e78c0f3..e7a10d8c 100644 --- a/src/Conduit/Features/Users/UsersController.cs +++ b/src/Conduit/Features/Users/UsersController.cs @@ -6,21 +6,17 @@ namespace Conduit.Features.Users; [Route("users")] -public class UsersController +public class UsersController(IMediator mediator) { - private readonly IMediator _mediator; - - public UsersController(IMediator mediator) => _mediator = mediator; - [HttpPost] public Task Create( [FromBody] Create.Command command, CancellationToken cancellationToken - ) => _mediator.Send(command, cancellationToken); + ) => mediator.Send(command, cancellationToken); [HttpPost("login")] public Task Login( [FromBody] Login.Command command, CancellationToken cancellationToken - ) => _mediator.Send(command, cancellationToken); -} \ No newline at end of file + ) => mediator.Send(command, cancellationToken); +} diff --git a/src/Conduit/Infrastructure/ConduitContext.cs b/src/Conduit/Infrastructure/ConduitContext.cs index 0e14f06b..77cea5de 100644 --- a/src/Conduit/Infrastructure/ConduitContext.cs +++ b/src/Conduit/Infrastructure/ConduitContext.cs @@ -5,20 +5,17 @@ namespace Conduit.Infrastructure; -public class ConduitContext : DbContext +public class ConduitContext(DbContextOptions options) : DbContext(options) { private IDbContextTransaction? _currentTransaction; - public ConduitContext(DbContextOptions options) - : base(options) { } - - public DbSet
Articles { get; set; } = null!; - public DbSet Comments { get; set; } = null!; - public DbSet Persons { get; set; } = null!; - public DbSet Tags { get; set; } = null!; - public DbSet ArticleTags { get; set; } = null!; - public DbSet ArticleFavorites { get; set; } = null!; - public DbSet FollowedPeople { get; set; } = null!; + public DbSet
Articles { get; init; } = null!; + public DbSet Comments { get; init; } = null!; + public DbSet Persons { get; init; } = null!; + public DbSet Tags { get; init; } = null!; + public DbSet ArticleTags { get; init; } = null!; + public DbSet ArticleFavorites { get; init; } = null!; + public DbSet FollowedPeople { get; init; } = null!; protected override void OnModelCreating(ModelBuilder modelBuilder) { @@ -27,10 +24,10 @@ protected override void OnModelCreating(ModelBuilder modelBuilder) b.HasKey(t => new { t.ArticleId, t.TagId }); b.HasOne(pt => pt.Article) - .WithMany(p => p!.ArticleTags) + .WithMany(p => p.ArticleTags) .HasForeignKey(pt => pt.ArticleId); - b.HasOne(pt => pt.Tag).WithMany(t => t!.ArticleTags).HasForeignKey(pt => pt.TagId); + b.HasOne(pt => pt.Tag).WithMany(t => t.ArticleTags).HasForeignKey(pt => pt.TagId); }); modelBuilder.Entity(b => @@ -38,11 +35,11 @@ protected override void OnModelCreating(ModelBuilder modelBuilder) b.HasKey(t => new { t.ArticleId, t.PersonId }); b.HasOne(pt => pt.Article) - .WithMany(p => p!.ArticleFavorites) + .WithMany(p => p.ArticleFavorites) .HasForeignKey(pt => pt.ArticleId); b.HasOne(pt => pt.Person) - .WithMany(t => t!.ArticleFavorites) + .WithMany(t => t.ArticleFavorites) .HasForeignKey(pt => pt.PersonId); }); @@ -57,7 +54,7 @@ protected override void OnModelCreating(ModelBuilder modelBuilder) // Message = Introducing FOREIGN KEY constraint 'FK_FollowedPeople_Persons_TargetId' on table 'FollowedPeople' may cause cycles or multiple cascade paths.Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints. // Could not create constraint or index. See previous errors. b.HasOne(pt => pt.Observer) - .WithMany(p => p!.Followers) + .WithMany(p => p.Followers) .HasForeignKey(pt => pt.ObserverId) .OnDelete(DeleteBehavior.Restrict); @@ -68,7 +65,7 @@ protected override void OnModelCreating(ModelBuilder modelBuilder) // Message = Introducing FOREIGN KEY constraint 'FK_FollowingPeople_Persons_TargetId' on table 'FollowedPeople' may cause cycles or multiple cascade paths.Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints. // Could not create constraint or index. See previous errors. b.HasOne(pt => pt.Target) - .WithMany(t => t!.Following) + .WithMany(t => t.Following) .HasForeignKey(pt => pt.TargetId) .OnDelete(DeleteBehavior.Restrict); }); @@ -125,4 +122,4 @@ public void RollbackTransaction() } } #endregion -} \ No newline at end of file +} diff --git a/src/Conduit/Infrastructure/CurrentUserAccessor.cs b/src/Conduit/Infrastructure/CurrentUserAccessor.cs index e198fd9f..a413c61c 100644 --- a/src/Conduit/Infrastructure/CurrentUserAccessor.cs +++ b/src/Conduit/Infrastructure/CurrentUserAccessor.cs @@ -4,19 +4,10 @@ namespace Conduit.Infrastructure; -public class CurrentUserAccessor : ICurrentUserAccessor +public class CurrentUserAccessor(IHttpContextAccessor httpContextAccessor) : ICurrentUserAccessor { - private readonly IHttpContextAccessor _httpContextAccessor; - - public CurrentUserAccessor(IHttpContextAccessor httpContextAccessor) - { - _httpContextAccessor = httpContextAccessor; - } - - public string? GetCurrentUsername() - { - return _httpContextAccessor.HttpContext - ?.User?.Claims?.FirstOrDefault(x => x.Type == ClaimTypes.NameIdentifier) + public string? GetCurrentUsername() => + httpContextAccessor + .HttpContext?.User.Claims.FirstOrDefault(x => x.Type == ClaimTypes.NameIdentifier) ?.Value; - } -} \ No newline at end of file +} diff --git a/src/Conduit/Infrastructure/DBContextTransactionPipelineBehavior.cs b/src/Conduit/Infrastructure/DBContextTransactionPipelineBehavior.cs index 63ff1f60..7b44f3a8 100644 --- a/src/Conduit/Infrastructure/DBContextTransactionPipelineBehavior.cs +++ b/src/Conduit/Infrastructure/DBContextTransactionPipelineBehavior.cs @@ -10,36 +10,32 @@ namespace Conduit.Infrastructure; /// /// /// -public class DBContextTransactionPipelineBehavior +public class DBContextTransactionPipelineBehavior(ConduitContext context) : IPipelineBehavior where TRequest : notnull { - private readonly ConduitContext _context; - - public DBContextTransactionPipelineBehavior(ConduitContext context) => _context = context; - public async Task Handle( TRequest request, RequestHandlerDelegate next, CancellationToken cancellationToken ) { - TResponse? result = default; + TResponse? result; try { - _context.BeginTransaction(); + context.BeginTransaction(); result = await next(); - _context.CommitTransaction(); + context.CommitTransaction(); } catch (Exception) { - _context.RollbackTransaction(); + context.RollbackTransaction(); throw; } return result; } -} \ No newline at end of file +} diff --git a/src/Conduit/Infrastructure/Errors/Constants.cs b/src/Conduit/Infrastructure/Errors/Constants.cs index d5bda2bf..697b360b 100644 --- a/src/Conduit/Infrastructure/Errors/Constants.cs +++ b/src/Conduit/Infrastructure/Errors/Constants.cs @@ -5,4 +5,4 @@ public static class Constants public const string NOT_FOUND = "not found"; public const string IN_USE = "in use"; public const string InternalServerError = nameof(InternalServerError); -} \ No newline at end of file +} diff --git a/src/Conduit/Infrastructure/Errors/ErrorHandlingMiddleware.cs b/src/Conduit/Infrastructure/Errors/ErrorHandlingMiddleware.cs index fcd19956..625112cf 100644 --- a/src/Conduit/Infrastructure/Errors/ErrorHandlingMiddleware.cs +++ b/src/Conduit/Infrastructure/Errors/ErrorHandlingMiddleware.cs @@ -8,11 +8,12 @@ namespace Conduit.Infrastructure.Errors; -public class ErrorHandlingMiddleware +public class ErrorHandlingMiddleware( + RequestDelegate next, + IStringLocalizer localizer, + ILogger logger +) { - private readonly RequestDelegate _next; - private readonly ILogger _logger; - private readonly IStringLocalizer _localizer; private static readonly Action LOGGER_MESSAGE = LoggerMessage.Define( LogLevel.Error, @@ -20,26 +21,15 @@ public class ErrorHandlingMiddleware formatString: "{Message}" ); - public ErrorHandlingMiddleware( - RequestDelegate next, - IStringLocalizer localizer, - ILogger logger - ) - { - _next = next; - _logger = logger; - _localizer = localizer; - } - public async Task Invoke(HttpContext context) { try { - await _next(context); + await next(context); } catch (Exception ex) { - await HandleExceptionAsync(context, ex, _logger, _localizer); + await HandleExceptionAsync(context, ex, logger, localizer); } } @@ -50,25 +40,23 @@ private static async Task HandleExceptionAsync( IStringLocalizer localizer ) { - string? result = null; + string? result; switch (exception) { case RestException re: context.Response.StatusCode = (int)re.Code; result = JsonSerializer.Serialize(new { errors = re.Errors }); break; - case Exception e: + default: context.Response.StatusCode = (int)HttpStatusCode.InternalServerError; - LOGGER_MESSAGE(logger, "Unhandled Exception", e); + LOGGER_MESSAGE(logger, "Unhandled Exception", exception); result = JsonSerializer.Serialize( new { errors = localizer[Constants.InternalServerError].Value } ); break; - default: - break; } context.Response.ContentType = "application/json"; - await context.Response.WriteAsync(result ?? "{}"); + await context.Response.WriteAsync(result); } -} \ No newline at end of file +} diff --git a/src/Conduit/Infrastructure/Errors/RestException.cs b/src/Conduit/Infrastructure/Errors/RestException.cs index d61a61a8..2e6aed96 100644 --- a/src/Conduit/Infrastructure/Errors/RestException.cs +++ b/src/Conduit/Infrastructure/Errors/RestException.cs @@ -3,15 +3,9 @@ namespace Conduit.Infrastructure.Errors; -public class RestException : Exception +public class RestException(HttpStatusCode code, object? errors = null) : Exception { - public RestException(HttpStatusCode code, object? errors = null) - { - Code = code; - Errors = errors; - } + public object? Errors { get; } = errors; - public object? Errors { get; set; } - - public HttpStatusCode Code { get; } -} \ No newline at end of file + public HttpStatusCode Code { get; } = code; +} diff --git a/src/Conduit/Infrastructure/GroupByApiRootConvention.cs b/src/Conduit/Infrastructure/GroupByApiRootConvention.cs index 338c2a76..440c3397 100644 --- a/src/Conduit/Infrastructure/GroupByApiRootConvention.cs +++ b/src/Conduit/Infrastructure/GroupByApiRootConvention.cs @@ -8,12 +8,10 @@ public class GroupByApiRootConvention : IControllerModelConvention { public void Apply(ControllerModel controller) { - var controllerNamespace = controller.Attributes - .OfType() - .FirstOrDefault(); + var controllerNamespace = controller.Attributes.OfType().FirstOrDefault(); var apiVersion = controllerNamespace?.Template?.Split('/').First().ToLowerInvariant() ?? "default"; controller.ApiExplorer.GroupName = apiVersion; } -} \ No newline at end of file +} diff --git a/src/Conduit/Infrastructure/ICurrentUserAccessor.cs b/src/Conduit/Infrastructure/ICurrentUserAccessor.cs index 10c5d002..9fcb3991 100644 --- a/src/Conduit/Infrastructure/ICurrentUserAccessor.cs +++ b/src/Conduit/Infrastructure/ICurrentUserAccessor.cs @@ -3,4 +3,4 @@ namespace Conduit.Infrastructure; public interface ICurrentUserAccessor { string? GetCurrentUsername(); -} \ No newline at end of file +} diff --git a/src/Conduit/Infrastructure/Security/IJwtTokenGenerator.cs b/src/Conduit/Infrastructure/Security/IJwtTokenGenerator.cs index 55a2b139..a032d208 100644 --- a/src/Conduit/Infrastructure/Security/IJwtTokenGenerator.cs +++ b/src/Conduit/Infrastructure/Security/IJwtTokenGenerator.cs @@ -3,4 +3,4 @@ namespace Conduit.Infrastructure.Security; public interface IJwtTokenGenerator { string CreateToken(string username); -} \ No newline at end of file +} diff --git a/src/Conduit/Infrastructure/Security/IPasswordHasher.cs b/src/Conduit/Infrastructure/Security/IPasswordHasher.cs index 5ebef64d..12620039 100644 --- a/src/Conduit/Infrastructure/Security/IPasswordHasher.cs +++ b/src/Conduit/Infrastructure/Security/IPasswordHasher.cs @@ -6,4 +6,4 @@ namespace Conduit.Infrastructure.Security; public interface IPasswordHasher : IDisposable { Task Hash(string password, byte[] salt); -} \ No newline at end of file +} diff --git a/src/Conduit/Infrastructure/Security/JwtIssuerOptions.cs b/src/Conduit/Infrastructure/Security/JwtIssuerOptions.cs index 8ef6ea6c..0010c724 100644 --- a/src/Conduit/Infrastructure/Security/JwtIssuerOptions.cs +++ b/src/Conduit/Infrastructure/Security/JwtIssuerOptions.cs @@ -100,4 +100,4 @@ public class JwtIssuerOptions /// The signing key to use when generating tokens. /// public SigningCredentials? SigningCredentials { get; set; } -} \ No newline at end of file +} diff --git a/src/Conduit/Infrastructure/Security/JwtTokenGenerator.cs b/src/Conduit/Infrastructure/Security/JwtTokenGenerator.cs index b5cee5af..e2041f1c 100644 --- a/src/Conduit/Infrastructure/Security/JwtTokenGenerator.cs +++ b/src/Conduit/Infrastructure/Security/JwtTokenGenerator.cs @@ -5,14 +5,9 @@ namespace Conduit.Infrastructure.Security; -public class JwtTokenGenerator : IJwtTokenGenerator +public class JwtTokenGenerator(IOptions jwtOptions) : IJwtTokenGenerator { - private readonly JwtIssuerOptions _jwtOptions; - - public JwtTokenGenerator(IOptions jwtOptions) - { - _jwtOptions = jwtOptions.Value; - } + private readonly JwtIssuerOptions _jwtOptions = jwtOptions.Value; public string CreateToken(string username) { @@ -38,4 +33,4 @@ public string CreateToken(string username) var encodedJwt = new JwtSecurityTokenHandler().WriteToken(jwt); return encodedJwt; } -} \ No newline at end of file +} diff --git a/src/Conduit/Infrastructure/Security/PasswordHasher.cs b/src/Conduit/Infrastructure/Security/PasswordHasher.cs index 43a5bade..563d88e9 100644 --- a/src/Conduit/Infrastructure/Security/PasswordHasher.cs +++ b/src/Conduit/Infrastructure/Security/PasswordHasher.cs @@ -22,4 +22,4 @@ public Task Hash(string password, byte[] salt) } public void Dispose() => x.Dispose(); -} \ No newline at end of file +} diff --git a/src/Conduit/Infrastructure/Slug.cs b/src/Conduit/Infrastructure/Slug.cs index 1d291dd6..a707bf45 100644 --- a/src/Conduit/Infrastructure/Slug.cs +++ b/src/Conduit/Infrastructure/Slug.cs @@ -30,4 +30,4 @@ public static partial class Slug [GeneratedRegex("\\s")] private static partial Regex TrimRegex(); -} \ No newline at end of file +} diff --git a/src/Conduit/Infrastructure/ValidationPipelineBehavior.cs b/src/Conduit/Infrastructure/ValidationPipelineBehavior.cs index f10058e0..59eaf52d 100644 --- a/src/Conduit/Infrastructure/ValidationPipelineBehavior.cs +++ b/src/Conduit/Infrastructure/ValidationPipelineBehavior.cs @@ -7,14 +7,12 @@ namespace Conduit.Infrastructure; -public class ValidationPipelineBehavior - : IPipelineBehavior +public class ValidationPipelineBehavior( + IEnumerable> validators +) : IPipelineBehavior where TRequest : notnull { - private readonly List> _validators; - - public ValidationPipelineBehavior(IEnumerable> validators) => - _validators = validators.ToList(); + private readonly List> _validators = validators.ToList(); public async Task Handle( TRequest request, @@ -36,4 +34,4 @@ CancellationToken cancellationToken return await next(); } -} \ No newline at end of file +} diff --git a/src/Conduit/Program.cs b/src/Conduit/Program.cs index 0e9fe37e..878242da 100644 --- a/src/Conduit/Program.cs +++ b/src/Conduit/Program.cs @@ -1,21 +1,21 @@ +using System; +using System.Collections.Generic; +using System.Reflection; using Conduit; using Conduit.Features.Profiles; -using Conduit.Infrastructure.Security; using Conduit.Infrastructure; +using Conduit.Infrastructure.Errors; +using Conduit.Infrastructure.Security; +using FluentValidation; +using FluentValidation.AspNetCore; using MediatR; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Http; +using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; -using System.Reflection; -using Microsoft.EntityFrameworkCore; -using System; -using Microsoft.OpenApi.Models; -using System.Collections.Generic; -using FluentValidation.AspNetCore; -using FluentValidation; -using Conduit.Infrastructure.Errors; using Microsoft.Extensions.Logging; +using Microsoft.OpenApi.Models; // read database configuration (database provider + database connection) from environment variables //Environment.GetEnvironmentVariable(DEFAULT_DATABASE_PROVIDER) @@ -25,8 +25,8 @@ var builder = WebApplication.CreateBuilder(args); -builder.Services.AddMediatR( - cfg => cfg.RegisterServicesFromAssembly(Assembly.GetExecutingAssembly()) +builder.Services.AddMediatR(cfg => + cfg.RegisterServicesFromAssembly(Assembly.GetExecutingAssembly()) ); builder.Services.AddTransient(typeof(IPipelineBehavior<,>), typeof(ValidationPipelineBehavior<,>)); builder.Services.AddScoped( @@ -99,28 +99,28 @@ x.SwaggerDoc("v1", new OpenApiInfo { Title = "RealWorld API", Version = "v1" }); x.CustomSchemaIds(y => y.FullName); x.DocInclusionPredicate((version, apiDescription) => true); - x.TagActionsBy( - y => new List() { y.GroupName ?? throw new InvalidOperationException() } - ); + x.TagActionsBy(y => new List() + { + y.GroupName ?? throw new InvalidOperationException() + }); x.CustomSchemaIds(s => s.FullName?.Replace("+", ".")); }); builder.Services.AddCors(); -builder.Services - .AddMvc(opt => +builder + .Services.AddMvc(opt => { opt.Conventions.Add(new GroupByApiRootConvention()); opt.Filters.Add(typeof(ValidatorActionFilter)); opt.EnableEndpointRouting = false; }) - .AddJsonOptions( - opt => - opt.JsonSerializerOptions.DefaultIgnoreCondition = System - .Text - .Json - .Serialization - .JsonIgnoreCondition - .WhenWritingNull + .AddJsonOptions(opt => + opt.JsonSerializerOptions.DefaultIgnoreCondition = System + .Text + .Json + .Serialization + .JsonIgnoreCondition + .WhenWritingNull ); builder.Services.AddFluentValidationAutoValidation(); @@ -156,8 +156,8 @@ using (var scope = app.Services.CreateScope()) { - var dbContext = scope.ServiceProvider - .GetRequiredService() + var dbContext = scope + .ServiceProvider.GetRequiredService() .Database.EnsureCreated(); // use context } diff --git a/src/Conduit/Startup.cs b/src/Conduit/Startup.cs index e17b0571..24ce0f4f 100644 --- a/src/Conduit/Startup.cs +++ b/src/Conduit/Startup.cs @@ -32,13 +32,10 @@ public class Startup // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940 public void ConfigureServices(IServiceCollection services) { - services.AddMediatR( - cfg => cfg.RegisterServicesFromAssembly(Assembly.GetExecutingAssembly()) - ); - services.AddTransient( - typeof(IPipelineBehavior<,>), - typeof(ValidationPipelineBehavior<,>) + services.AddMediatR(cfg => + cfg.RegisterServicesFromAssembly(Assembly.GetExecutingAssembly()) ); + services.AddTransient(typeof(IPipelineBehavior<,>), typeof(ValidationPipelineBehavior<,>)); services.AddScoped( typeof(IPipelineBehavior<,>), typeof(DBContextTransactionPipelineBehavior<,>) @@ -57,18 +54,18 @@ public void ConfigureServices(IServiceCollection services) { if ( databaseProvider - .ToLowerInvariant() - .Trim() - .Equals("sqlite", StringComparison.Ordinal) + .ToLowerInvariant() + .Trim() + .Equals("sqlite", StringComparison.Ordinal) ) { options.UseSqlite(connectionString); } else if ( databaseProvider - .ToLowerInvariant() - .Trim() - .Equals("sqlserver", StringComparison.Ordinal) + .ToLowerInvariant() + .Trim() + .Equals("sqlserver", StringComparison.Ordinal) ) { // only works in windows container @@ -120,9 +117,10 @@ public void ConfigureServices(IServiceCollection services) x.SwaggerDoc("v1", new OpenApiInfo { Title = "RealWorld API", Version = "v1" }); x.CustomSchemaIds(y => y.FullName); x.DocInclusionPredicate((version, apiDescription) => true); - x.TagActionsBy( - y => new List() { y.GroupName ?? throw new InvalidOperationException() } - ); + x.TagActionsBy(y => new List() + { + y.GroupName ?? throw new InvalidOperationException() + }); }); services.AddCors(); @@ -133,14 +131,13 @@ public void ConfigureServices(IServiceCollection services) opt.Filters.Add(typeof(ValidatorActionFilter)); opt.EnableEndpointRouting = false; }) - .AddJsonOptions( - opt => - opt.JsonSerializerOptions.DefaultIgnoreCondition = System - .Text - .Json - .Serialization - .JsonIgnoreCondition - .WhenWritingNull + .AddJsonOptions(opt => + opt.JsonSerializerOptions.DefaultIgnoreCondition = System + .Text + .Json + .Serialization + .JsonIgnoreCondition + .WhenWritingNull ); services.AddFluentValidationAutoValidation(); @@ -174,10 +171,8 @@ public void Configure(IApplicationBuilder app, ILoggerFactory loggerFactory) app.UseSwagger(c => c.RouteTemplate = "swagger/{documentName}/swagger.json"); // Enable middleware to serve swagger-ui assets(HTML, JS, CSS etc.) - app.UseSwaggerUI( - x => x.SwaggerEndpoint("/swagger/v1/swagger.json", "RealWorld API V1") - ); + app.UseSwaggerUI(x => x.SwaggerEndpoint("/swagger/v1/swagger.json", "RealWorld API V1")); app.ApplicationServices.GetRequiredService().Database.EnsureCreated(); } -} \ No newline at end of file +} diff --git a/src/Conduit/StartupExtensions.cs b/src/Conduit/StartupExtensions.cs index 74197fa9..c74a391b 100644 --- a/src/Conduit/StartupExtensions.cs +++ b/src/Conduit/StartupExtensions.cs @@ -20,10 +20,7 @@ public static void AddJwt(this IServiceCollection services) var signingKey = new SymmetricSecurityKey( Encoding.ASCII.GetBytes("somethinglongerforthisdumbalgorithmisrequired") ); - var signingCredentials = new SigningCredentials( - signingKey, - SecurityAlgorithms.HmacSha256 - ); + var signingCredentials = new SigningCredentials(signingKey, SecurityAlgorithms.HmacSha256); var issuer = "issuer"; var audience = "audience"; @@ -60,11 +57,8 @@ public static void AddJwt(this IServiceCollection services) { OnMessageReceived = (context) => { - var token = context.HttpContext.Request.Headers["Authorization"].ToString(); - if ( - token is not null - && token.StartsWith("Token ", StringComparison.OrdinalIgnoreCase) - ) + var token = context.HttpContext.Request.Headers.Authorization.ToString(); + if (token.StartsWith("Token ", StringComparison.OrdinalIgnoreCase)) { context.Token = token["Token ".Length..].Trim(); } @@ -78,8 +72,8 @@ token is not null public static void AddSerilogLogging(this ILoggerFactory loggerFactory) { // Attach the sink to the logger configuration - var log = new LoggerConfiguration().MinimumLevel - .Verbose() + var log = new LoggerConfiguration() + .MinimumLevel.Verbose() .Enrich.FromLogContext() //just for local debug .WriteTo.Console( diff --git a/src/Conduit/packages.lock.json b/src/Conduit/packages.lock.json index daa84d94..8e1c9d27 100644 --- a/src/Conduit/packages.lock.json +++ b/src/Conduit/packages.lock.json @@ -1,23 +1,13 @@ { "version": 2, "dependencies": { - "net7.0": { + "net8.0": { "AutoMapper": { "type": "Direct", - "requested": "[12.0.1, )", - "resolved": "12.0.1", - "contentHash": "hvV62vl6Hp/WfQ24yzo3Co9+OPl8wH8hApwVtgWpiAynVJkUcs7xvehnSftawL8Pe8FrPffBRM3hwzLQqWDNjA==", + "requested": "[13.0.1, )", + "resolved": "13.0.1", + "contentHash": "/Fx1SbJ16qS7dU4i604Sle+U9VLX+WSNVJggk6MupKVkYvvBm4XqYaeFuf67diHefHKHs50uQIS2YEDFhPCakQ==", "dependencies": { - "Microsoft.CSharp": "4.7.0" - } - }, - "AutoMapper.Extensions.Microsoft.DependencyInjection": { - "type": "Direct", - "requested": "[12.0.1, )", - "resolved": "12.0.1", - "contentHash": "+g/K+Vpe3gGMKGzjslMOdqNlkikScDjWfVvmWTayrDHaG/n2pPmFBMa+jKX1r/h6BDGFdkyRjAuhFE3ykW+r1g==", - "dependencies": { - "AutoMapper": "[12.0.1]", "Microsoft.Extensions.Options": "6.0.0" } }, @@ -33,75 +23,75 @@ }, "MediatR": { "type": "Direct", - "requested": "[12.1.1, )", - "resolved": "12.1.1", - "contentHash": "1AbwzzeS6gn4NdcO6A9LfKS5TXXgAiUQM3J18dREHa7O7TrdCXJ5dNFeRBpzPZY7UWl5Kby+n9pWrPJe3SDiMA==", + "requested": "[12.2.0, )", + "resolved": "12.2.0", + "contentHash": "8TUFrHapKi6D74PhnSNEguRsH91HNGyP3R4ZQdgDorJgl9Wac5Prh0vA33QfrniAaS6L2xNNhc6vxzg+5AIbwA==", "dependencies": { "MediatR.Contracts": "[2.0.1, 3.0.0)", - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0" + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" } }, "Microsoft.AspNetCore.Authentication.JwtBearer": { "type": "Direct", - "requested": "[7.0.10, )", - "resolved": "7.0.10", - "contentHash": "8/GWtq034kzrDapCHYbAnnJXIYAJzFcJoXP5OtlbjIWBQBLxEbstRv3N4DJAvlcGUXxy0DmmNVDiSlFAY8HpWw==", + "requested": "[8.0.2, )", + "resolved": "8.0.2", + "contentHash": "7qJkk5k5jabATZZrMIQgpUB9yjDNAAApSqw+8d0FEyK1AJ4j+wv1qOMl2byUr837xbK+MjehtPnQ32yZ5Gtzlw==", "dependencies": { - "Microsoft.IdentityModel.Protocols.OpenIdConnect": "6.15.1" + "Microsoft.IdentityModel.Protocols.OpenIdConnect": "7.1.2" } }, "Microsoft.EntityFrameworkCore.InMemory": { "type": "Direct", - "requested": "[7.0.10, )", - "resolved": "7.0.10", - "contentHash": "WeUjWx80ZVQVXkHuEIO4kOCKUHo6C4RdB1bJZLSngLWqwrQrMTCZE90IGBz0330GXmXKbL4LyJO/rXO/w7cRNA==", + "requested": "[8.0.2, )", + "resolved": "8.0.2", + "contentHash": "vPpioRk+6BwQf/apqBQQ2gLL/6FMOj25L6d2lli08FmRh2W9QrnShyKhzsDAydWcH6Po69gQXgHbBQFAafmo3A==", "dependencies": { - "Microsoft.EntityFrameworkCore": "7.0.10" + "Microsoft.EntityFrameworkCore": "8.0.2" } }, "Microsoft.EntityFrameworkCore.Sqlite": { "type": "Direct", - "requested": "[7.0.10, )", - "resolved": "7.0.10", - "contentHash": "gGOZWOvpRDC2bQAUNwpYzjYRTFbSJKNK60KOnvrstvvKKeM/4dVo7i0dxIvZaHpUuIRnlDybBrSK253/BBsfhg==", + "requested": "[8.0.2, )", + "resolved": "8.0.2", + "contentHash": "tnpTylrGLYUKZ+Jw8Y5PmROYhIvqA51EqYRdHgUDCFsVbs3AKsw3SY1reaZk/tBfWHtC7nWR+IN2MwYrdtkgTQ==", "dependencies": { - "Microsoft.EntityFrameworkCore.Sqlite.Core": "7.0.10", - "SQLitePCLRaw.bundle_e_sqlite3": "2.1.4" + "Microsoft.EntityFrameworkCore.Sqlite.Core": "8.0.2", + "SQLitePCLRaw.bundle_e_sqlite3": "2.1.6" } }, "Microsoft.EntityFrameworkCore.SqlServer": { "type": "Direct", - "requested": "[7.0.10, )", - "resolved": "7.0.10", - "contentHash": "qRMzze1QbKa2vhlhjTxwjhJUMCI4qVDFWQCRq9Pdgf9mC+xLz0ZT/4ALEa0oZRicGzPZAqIIhKrHNAjgD4GsAQ==", + "requested": "[8.0.2, )", + "resolved": "8.0.2", + "contentHash": "tAS5mYr/mwCXZVC5dyJlzdKHK0MLU0TAxNcc30xi7XLju8DE3S0Y206Yfi/MyuzLjulQRq9n2vjieeCxOnQfkg==", "dependencies": { - "Microsoft.Data.SqlClient": "5.0.2", - "Microsoft.EntityFrameworkCore.Relational": "7.0.10" + "Microsoft.Data.SqlClient": "5.1.4", + "Microsoft.EntityFrameworkCore.Relational": "8.0.2" } }, "Serilog": { "type": "Direct", - "requested": "[3.0.1, )", - "resolved": "3.0.1", - "contentHash": "E4UmOQ++eNJax1laE+lws7E3zbhKgHsGJbO7ra0yE5smUh+5FfUPIKKBxM3MO1tK4sgpQke6/pLReDxIc/ggNw==" + "requested": "[3.1.1, )", + "resolved": "3.1.1", + "contentHash": "P6G4/4Kt9bT635bhuwdXlJ2SCqqn2nhh4gqFqQueCOr9bK/e7W9ll/IoX1Ter948cV2Z/5+5v8pAfJYUISY03A==" }, "Serilog.Extensions.Logging": { "type": "Direct", - "requested": "[7.0.0, )", - "resolved": "7.0.0", - "contentHash": "9faU0zNQqU7I6soVhLUMYaGNpgWv6cKlKb2S5AnS8gXxzW/em5Ladm/6FMrWTnX41cdbdGPOWNAo6adi4WaJ6A==", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "YEAMWu1UnWgf1c1KP85l1SgXGfiVo0Rz6x08pCiPOIBt2Qe18tcZLvdBUuV5o1QHvrs8FAry9wTIhgBRtjIlEg==", "dependencies": { - "Microsoft.Extensions.Logging": "7.0.0", - "Serilog": "2.12.0" + "Microsoft.Extensions.Logging": "8.0.0", + "Serilog": "3.1.1" } }, "Serilog.Sinks.Console": { "type": "Direct", - "requested": "[4.1.0, )", - "resolved": "4.1.0", - "contentHash": "K6N5q+5fetjnJPvCmkWOpJ/V8IEIoMIB1s86OzBrbxwTyHxdx3pmz4H+8+O/Dc/ftUX12DM1aynx/dDowkwzqg==", + "requested": "[5.0.1, )", + "resolved": "5.0.1", + "contentHash": "6Jt8jl9y2ey8VV7nVEUAyjjyxjAQuvd5+qj4XYAT9CwcsvR70HHULGBeD+K2WCALFXf7CFsNQT4lON6qXcu2AA==", "dependencies": { - "Serilog": "2.10.0" + "Serilog": "3.1.1" } }, "Swashbuckle.AspNetCore": { @@ -118,11 +108,11 @@ }, "Azure.Core": { "type": "Transitive", - "resolved": "1.24.0", - "contentHash": "+/qI1j2oU1S4/nvxb2k/wDsol00iGf1AyJX5g3epV7eOpQEP/2xcgh/cxgKMeFgn3U2fmgSiBnQZdkV+l5y0Uw==", + "resolved": "1.35.0", + "contentHash": "hENcx03Jyuqv05F4RBEPbxz29UrM3Nbhnr6Wl6NQpoU9BCIbL3XLentrxDCTrH54NLS11Exxi/o8MYgT/cnKFA==", "dependencies": { "Microsoft.Bcl.AsyncInterfaces": "1.1.1", - "System.Diagnostics.DiagnosticSource": "4.6.0", + "System.Diagnostics.DiagnosticSource": "6.0.1", "System.Memory.Data": "1.0.2", "System.Numerics.Vectors": "4.5.0", "System.Text.Encodings.Web": "4.7.2", @@ -132,12 +122,12 @@ }, "Azure.Identity": { "type": "Transitive", - "resolved": "1.6.0", - "contentHash": "EycyMsb6rD2PK9P0SyibFfEhvWWttdrYhyPF4f41uzdB/44yQlV+2Wehxyg489Rj6gbPvSPgbKq0xsHJBhipZA==", + "resolved": "1.10.3", + "contentHash": "l1Xm2MWOF2Mzcwuarlw8kWQXLZk3UeB55aQXVyjj23aBfDwOZ3gu5GP2kJ6KlmZeZv2TCzw7x4L3V36iNr3gww==", "dependencies": { - "Azure.Core": "1.24.0", - "Microsoft.Identity.Client": "4.39.0", - "Microsoft.Identity.Client.Extensions.Msal": "2.19.3", + "Azure.Core": "1.35.0", + "Microsoft.Identity.Client": "4.56.0", + "Microsoft.Identity.Client.Extensions.Msal": "4.56.0", "System.Memory": "4.5.4", "System.Security.Cryptography.ProtectedData": "4.7.0", "System.Text.Json": "4.7.2", @@ -168,87 +158,77 @@ "resolved": "1.1.1", "contentHash": "yuvf07qFWFqtK3P/MRkEKLhn5r2UbSpVueRziSqj0yJQIKFwG1pq9mOayK3zE5qZCTs0CbrwL9M6R8VwqyGy2w==" }, - "Microsoft.CSharp": { - "type": "Transitive", - "resolved": "4.7.0", - "contentHash": "pTj+D3uJWyN3My70i2Hqo+OXixq3Os2D1nJ2x92FFo6sk8fYS1m1WLNTs0Dc1uPaViH0YvEEwvzddQ7y4rhXmA==" - }, "Microsoft.Data.SqlClient": { "type": "Transitive", - "resolved": "5.0.2", - "contentHash": "mxcYU9I5TLzUegLVXiTtOE89RXN3GafL1Y+ExIbXvivvQtxplI4wxOgsiZGO4TZC18OJqui7mLVmiYpdFFImRQ==", + "resolved": "5.1.4", + "contentHash": "RSGSodusrPSVPKBLETRTH51G0yUQS28rD1hi2svTKS1GOsvUWxUpE8hgnKnUFC9RNjzfQmfUp+T0lJHFtlT3HQ==", "dependencies": { - "Azure.Identity": "1.6.0", - "Microsoft.Data.SqlClient.SNI.runtime": "5.0.1", - "Microsoft.Identity.Client": "4.45.0", - "Microsoft.IdentityModel.JsonWebTokens": "6.21.0", - "Microsoft.IdentityModel.Protocols.OpenIdConnect": "6.21.0", + "Azure.Identity": "1.10.3", + "Microsoft.Data.SqlClient.SNI.runtime": "5.1.1", + "Microsoft.Identity.Client": "4.56.0", + "Microsoft.IdentityModel.JsonWebTokens": "6.24.0", + "Microsoft.IdentityModel.Protocols.OpenIdConnect": "6.24.0", "Microsoft.SqlServer.Server": "1.0.0", - "Microsoft.Win32.Registry": "5.0.0", - "System.Buffers": "4.5.1", - "System.Configuration.ConfigurationManager": "5.0.0", - "System.Diagnostics.DiagnosticSource": "5.0.0", - "System.IO": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime.Caching": "5.0.0", + "System.Configuration.ConfigurationManager": "6.0.1", + "System.Diagnostics.DiagnosticSource": "6.0.1", + "System.Runtime.Caching": "6.0.0", "System.Security.Cryptography.Cng": "5.0.0", "System.Security.Principal.Windows": "5.0.0", - "System.Text.Encoding.CodePages": "5.0.0", - "System.Text.Encodings.Web": "4.7.2" + "System.Text.Encoding.CodePages": "6.0.0", + "System.Text.Encodings.Web": "6.0.0" } }, "Microsoft.Data.SqlClient.SNI.runtime": { "type": "Transitive", - "resolved": "5.0.1", - "contentHash": "y0X5MxiNdbITJYoafJ2ruaX6hqO0twpCGR/ipiDOe85JKLU8WL4TuAQfDe5qtt3bND5Je26HnrarLSAMMnVTNg==" + "resolved": "5.1.1", + "contentHash": "wNGM5ZTQCa2blc9ikXQouybGiyMd6IHPVJvAlBEPtr6JepZEOYeDxGyprYvFVeOxlCXs7avridZQ0nYkHzQWCQ==" }, "Microsoft.Data.Sqlite.Core": { "type": "Transitive", - "resolved": "7.0.10", - "contentHash": "SA6LOen490YTforjaNfVDClYpwiG3LmHJM8objq6KwIIFP0fq9Eulhbu6zBl6AduMefQqUA3pllrFFVQpwPoqw==", + "resolved": "8.0.2", + "contentHash": "C7VelOBNUrVlatmOoJ9P+vc/gegduv7d2uB5oy7bFxfgZBfaGr+eREW+QuppXwi3MHp0WBxxWjqkK5gD7ymDQA==", "dependencies": { - "SQLitePCLRaw.core": "2.1.4" + "SQLitePCLRaw.core": "2.1.6" } }, "Microsoft.EntityFrameworkCore": { "type": "Transitive", - "resolved": "7.0.10", - "contentHash": "24NbXJqJ/x8u88/agqeb1pLdAF9+9StDLA36+P/3g5xsJPOaB2GxXn7epR8dWpZTgHsNZ7cvBMxBgfFmF+xZlg==", + "resolved": "8.0.2", + "contentHash": "6QlvBx4rdawW3AkkCsGVV+8qRLk34aknV5JD40s1hbVR18vKmT2KDl2DW83nHcPX7f4oebQ3BD1UMNCI/gkE0g==", "dependencies": { - "Microsoft.EntityFrameworkCore.Abstractions": "7.0.10", - "Microsoft.EntityFrameworkCore.Analyzers": "7.0.10", - "Microsoft.Extensions.Caching.Memory": "7.0.0", - "Microsoft.Extensions.DependencyInjection": "7.0.0", - "Microsoft.Extensions.Logging": "7.0.0" + "Microsoft.EntityFrameworkCore.Abstractions": "8.0.2", + "Microsoft.EntityFrameworkCore.Analyzers": "8.0.2", + "Microsoft.Extensions.Caching.Memory": "8.0.0", + "Microsoft.Extensions.Logging": "8.0.0" } }, "Microsoft.EntityFrameworkCore.Abstractions": { "type": "Transitive", - "resolved": "7.0.10", - "contentHash": "Z/lDWmGLiT9uNQrp6UXTKZxofSmAKQCiKOz98FDscTbfAGgBXE3DTTqRsPMc8HFIVVSNANSiFRz3JyLg07HN9Q==" + "resolved": "8.0.2", + "contentHash": "DjDKp++BTKFZmX+xLTow7grQTY+pImKfhGW68Zf8myiL3zyJ3b8RZbnLsWGNCqKQIF6hJIz/zA/zmERobFwV0A==" }, "Microsoft.EntityFrameworkCore.Analyzers": { "type": "Transitive", - "resolved": "7.0.10", - "contentHash": "+8NVNpyJTzW6nNh/7RGfldf+mbeboVcn+X1tD8kMBCEJswuy3RqM/qecEEfOfTcWLliZExPMaHwOwtHO6RMpdA==" + "resolved": "8.0.2", + "contentHash": "LI7awhc0fiAKvcUemsqxXUWqzAH9ywTSyM1rpC1un4p5SE1bhr5nRLvyRVbKRzKakmnNNY3to8NPDnoySEkxVw==" }, "Microsoft.EntityFrameworkCore.Relational": { "type": "Transitive", - "resolved": "7.0.10", - "contentHash": "PO2QB2Du+pW210UHmepYR12bk+ZOZJCiNkA7zEAxWs+vzvrRAMsUPlDlfgX2LXE7NBsnb0uvZp7a1/qqKf3fRQ==", + "resolved": "8.0.2", + "contentHash": "NoGfcq2OPw0z8XAPf74YFwGlTKjedWdsIEJqq4SvKcPjcu+B+/XDDNrDRxTvILfz4Ug8POSF49s1jz1JvUqTAg==", "dependencies": { - "Microsoft.EntityFrameworkCore": "7.0.10", - "Microsoft.Extensions.Configuration.Abstractions": "7.0.0" + "Microsoft.EntityFrameworkCore": "8.0.2", + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0" } }, "Microsoft.EntityFrameworkCore.Sqlite.Core": { "type": "Transitive", - "resolved": "7.0.10", - "contentHash": "9ujvh/RXXyXmSsh0yY3zI7S+E+ILzndLVsDkigXGkDPVrDqp7/ynqElj0Xb/e4qWHbg/ogoRe5rvUs0jzfl+xg==", + "resolved": "8.0.2", + "contentHash": "cUOohC2oMaHG8rAvF1bvg5U5Hmeio8nTvCJghyPSnnKtWPu6U/Ozw4jcdJn1UjeYe7X0udP8ax/IB6wb9BOLWw==", "dependencies": { - "Microsoft.Data.Sqlite.Core": "7.0.10", - "Microsoft.EntityFrameworkCore.Relational": "7.0.10", - "Microsoft.Extensions.DependencyModel": "7.0.0" + "Microsoft.Data.Sqlite.Core": "8.0.2", + "Microsoft.EntityFrameworkCore.Relational": "8.0.2", + "Microsoft.Extensions.DependencyModel": "8.0.0" } }, "Microsoft.Extensions.ApiDescription.Server": { @@ -258,160 +238,151 @@ }, "Microsoft.Extensions.Caching.Abstractions": { "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "IeimUd0TNbhB4ded3AbgBLQv2SnsiVugDyGV1MvspQFVlA07nDC7Zul7kcwH5jWN3JiTcp/ySE83AIJo8yfKjg==", + "resolved": "8.0.0", + "contentHash": "3KuSxeHoNYdxVYfg2IRZCThcrlJ1XJqIXkAWikCsbm5C/bCjv7G0WoKDyuR98Q+T607QT2Zl5GsbGRkENcV2yQ==", "dependencies": { - "Microsoft.Extensions.Primitives": "7.0.0" + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.Caching.Memory": { "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "xpidBs2KCE2gw1JrD0quHE72kvCaI3xFql5/Peb2GRtUuZX+dYPoK/NTdVMiM67Svym0M0Df9A3xyU0FbMQhHw==", + "resolved": "8.0.0", + "contentHash": "7pqivmrZDzo1ADPkRwjy+8jtRKWRCPag9qPI+p7sgu7Q4QreWhcvbiWXsbhP+yY8XSiDvZpu2/LWdBv7PnmOpQ==", "dependencies": { - "Microsoft.Extensions.Caching.Abstractions": "7.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0", - "Microsoft.Extensions.Logging.Abstractions": "7.0.0", - "Microsoft.Extensions.Options": "7.0.0", - "Microsoft.Extensions.Primitives": "7.0.0" + "Microsoft.Extensions.Caching.Abstractions": "8.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Logging.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.Configuration.Abstractions": { "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "f34u2eaqIjNO9YLHBz8rozVZ+TcFiFs0F3r7nUJd7FRkVSxk8u4OpoK226mi49MwexHOR2ibP9MFvRUaLilcQQ==", + "resolved": "8.0.0", + "contentHash": "3lE/iLSutpgX1CC0NOW70FJoGARRHbyKmG7dc0klnUZ9Dd9hS6N/POPWhKhMLCEuNN5nXEY5agmlFtH562vqhQ==", "dependencies": { - "Microsoft.Extensions.Primitives": "7.0.0" + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.DependencyInjection": { "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "elNeOmkeX3eDVG6pYVeV82p29hr+UKDaBhrZyWvWLw/EVZSYEkZlQdkp0V39k/Xehs2Qa0mvoCvkVj3eQxNQ1Q==", + "resolved": "8.0.0", + "contentHash": "V8S3bsm50ig6JSyrbcJJ8bW2b9QLGouz+G1miK3UTaOWmMtFwNNNzUf4AleyDWUmTrWMLNnFSLEQtxmxgNQnNQ==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0" + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" } }, "Microsoft.Extensions.DependencyInjection.Abstractions": { "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "h3j/QfmFN4S0w4C2A6X7arXij/M/OVw3uQHSOFxnND4DyAzO1F9eMX7Eti7lU/OkSthEE0WzRsfT/Dmx86jzCw==" + "resolved": "8.0.0", + "contentHash": "cjWrLkJXK0rs4zofsK4bSdg+jhDLTaxrkXu4gS6Y7MAlCvRyNNgwY/lJi5RDlQOnSZweHqoyvgvbdvQsRIW+hg==" }, "Microsoft.Extensions.DependencyModel": { "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "oONNYd71J3LzkWc4fUHl3SvMfiQMYUCo/mDHDEu76hYYxdhdrPYv6fvGv9nnKVyhE9P0h20AU8RZB5OOWQcAXg==", + "resolved": "8.0.0", + "contentHash": "NSmDw3K0ozNDgShSIpsZcbFIzBX4w28nDag+TfaQujkXGazBm+lid5onlWoCBy4VsLxqnnKjEBbGSJVWJMf43g==", "dependencies": { - "System.Text.Encodings.Web": "7.0.0", - "System.Text.Json": "7.0.0" + "System.Text.Encodings.Web": "8.0.0", + "System.Text.Json": "8.0.0" } }, "Microsoft.Extensions.Logging": { "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "Nw2muoNrOG5U5qa2ZekXwudUn2BJcD41e65zwmDHb1fQegTX66UokLWZkJRpqSSHXDOWZ5V0iqhbxOEky91atA==", + "resolved": "8.0.0", + "contentHash": "tvRkov9tAJ3xP51LCv3FJ2zINmv1P8Hi8lhhtcKGqM+ImiTCC84uOPEI4z8Cdq2C3o9e+Aa0Gw0rmrsJD77W+w==", "dependencies": { - "Microsoft.Extensions.DependencyInjection": "7.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0", - "Microsoft.Extensions.Logging.Abstractions": "7.0.0", - "Microsoft.Extensions.Options": "7.0.0" + "Microsoft.Extensions.DependencyInjection": "8.0.0", + "Microsoft.Extensions.Logging.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0" } }, "Microsoft.Extensions.Logging.Abstractions": { "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "kmn78+LPVMOWeITUjIlfxUPDsI0R6G0RkeAMBmQxAJ7vBJn4q2dTva7pWi65ceN5vPGjJ9q/Uae2WKgvfktJAw==" + "resolved": "8.0.0", + "contentHash": "arDBqTgFCyS0EvRV7O3MZturChstm50OJ0y9bDJvAcmEPJm0FFpFyjU/JLYyStNGGey081DvnQYlncNX5SJJGA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" + } }, "Microsoft.Extensions.Options": { "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "lP1yBnTTU42cKpMozuafbvNtQ7QcBjr/CcK3bYOGEMH55Fjt+iecXjT6chR7vbgCMqy3PG3aNQSZgo/EuY/9qQ==", + "resolved": "8.0.0", + "contentHash": "JOVOfqpnqlVLUzINQ2fox8evY2SKLYJ3BV8QDe/Jyp21u1T7r45x/R/5QdteURMR5r01GxeJSBBUOCOyaNXA3g==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0", - "Microsoft.Extensions.Primitives": "7.0.0" + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.Primitives": { "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "um1KU5kxcRp3CNuI8o/GrZtD4AIOXDk+RLsytjZ9QPok3ttLUelLKpilVPuaFT3TFjOhSibUAso0odbOaCDj3Q==" + "resolved": "8.0.0", + "contentHash": "bXJEZrW9ny8vjMF1JV253WeLhpEVzFo1lyaZu1vQ4ZxWUlVvknZ/+ftFgVheLubb4eZPSwwxBeqS1JkCOjxd8g==" }, "Microsoft.Identity.Client": { "type": "Transitive", - "resolved": "4.45.0", - "contentHash": "ircobISCLWbtE5eEoLKU+ldfZ8O41vg4lcy38KRj/znH17jvBiAl8oxcyNp89CsuqE3onxIpn21Ca7riyDDrRw==", + "resolved": "4.56.0", + "contentHash": "rr4zbidvHy9r4NvOAs5hdd964Ao2A0pAeFBJKR95u1CJAVzbd1p6tPTXUZ+5ld0cfThiVSGvz6UHwY6JjraTpA==", "dependencies": { - "Microsoft.IdentityModel.Abstractions": "6.18.0" + "Microsoft.IdentityModel.Abstractions": "6.22.0" } }, "Microsoft.Identity.Client.Extensions.Msal": { "type": "Transitive", - "resolved": "2.19.3", - "contentHash": "zVVZjn8aW7W79rC1crioDgdOwaFTQorsSO6RgVlDDjc7MvbEGz071wSNrjVhzR0CdQn6Sefx7Abf1o7vasmrLg==", + "resolved": "4.56.0", + "contentHash": "H12YAzEGK55vZ+QpxUzozhW8ZZtgPDuWvgA0JbdIR9UhMUplj29JhIgE2imuH8W2Nw9D8JKygR1uxRFtpSNcrg==", "dependencies": { - "Microsoft.Identity.Client": "4.38.0", + "Microsoft.Identity.Client": "4.56.0", + "System.IO.FileSystem.AccessControl": "5.0.0", "System.Security.Cryptography.ProtectedData": "4.5.0" } }, "Microsoft.IdentityModel.Abstractions": { "type": "Transitive", - "resolved": "6.21.0", - "contentHash": "XeE6LQtD719Qs2IG7HDi1TSw9LIkDbJ33xFiOBoHbApVw/8GpIBCbW+t7RwOjErUDyXZvjhZliwRkkLb8Z1uzg==" + "resolved": "7.1.2", + "contentHash": "33eTIA2uO/L9utJjZWbKsMSVsQf7F8vtd6q5mQX7ZJzNvCpci5fleD6AeANGlbbb7WX7XKxq9+Dkb5e3GNDrmQ==" }, "Microsoft.IdentityModel.JsonWebTokens": { "type": "Transitive", - "resolved": "6.21.0", - "contentHash": "d3h1/BaMeylKTkdP6XwRCxuOoDJZ44V9xaXr6gl5QxmpnZGdoK3bySo3OQN8ehRLJHShb94ElLUvoXyglQtgAw==", + "resolved": "7.1.2", + "contentHash": "cloLGeZolXbCJhJBc5OC05uhrdhdPL6MWHuVUnkkUvPDeK7HkwThBaLZ1XjBQVk9YhxXE2OvHXnKi0PLleXxDg==", "dependencies": { - "Microsoft.IdentityModel.Tokens": "6.21.0" + "Microsoft.IdentityModel.Tokens": "7.1.2" } }, "Microsoft.IdentityModel.Logging": { "type": "Transitive", - "resolved": "6.21.0", - "contentHash": "tuEhHIQwvBEhMf8I50hy8FHmRSUkffDFP5EdLsSDV4qRcl2wvOPkQxYqEzWkh+ytW6sbdJGEXElGhmhDfAxAKg==", + "resolved": "7.1.2", + "contentHash": "YCxBt2EeJP8fcXk9desChkWI+0vFqFLvBwrz5hBMsoh0KJE6BC66DnzkdzkJNqMltLromc52dkdT206jJ38cTw==", "dependencies": { - "Microsoft.IdentityModel.Abstractions": "6.21.0" + "Microsoft.IdentityModel.Abstractions": "7.1.2" } }, "Microsoft.IdentityModel.Protocols": { "type": "Transitive", - "resolved": "6.21.0", - "contentHash": "0FqY5cTLQKtHrClzHEI+QxJl8OBT2vUiEQQB7UKk832JDiJJmetzYZ3AdSrPjN/3l3nkhByeWzXnhrX0JbifKg==", + "resolved": "7.1.2", + "contentHash": "SydLwMRFx6EHPWJ+N6+MVaoArN1Htt92b935O3RUWPY1yUF63zEjvd3lBu79eWdZUwedP8TN2I5V9T3nackvIQ==", "dependencies": { - "Microsoft.IdentityModel.Logging": "6.21.0", - "Microsoft.IdentityModel.Tokens": "6.21.0" + "Microsoft.IdentityModel.Logging": "7.1.2", + "Microsoft.IdentityModel.Tokens": "7.1.2" } }, "Microsoft.IdentityModel.Protocols.OpenIdConnect": { "type": "Transitive", - "resolved": "6.21.0", - "contentHash": "vtSKL7n6EnAsLyxmiviusm6LKrblT2ndnNqN6rvVq6iIHAnPCK9E2DkDx6h1Jrpy1cvbp40r0cnTg23nhEAGTA==", + "resolved": "7.1.2", + "contentHash": "6lHQoLXhnMQ42mGrfDkzbIOR3rzKM1W1tgTeMPLgLCqwwGw0d96xFi/UiX/fYsu7d6cD5MJiL3+4HuI8VU+sVQ==", "dependencies": { - "Microsoft.IdentityModel.Protocols": "6.21.0", - "System.IdentityModel.Tokens.Jwt": "6.21.0" + "Microsoft.IdentityModel.Protocols": "7.1.2", + "System.IdentityModel.Tokens.Jwt": "7.1.2" } }, "Microsoft.IdentityModel.Tokens": { "type": "Transitive", - "resolved": "6.21.0", - "contentHash": "AAEHZvZyb597a+QJSmtxH3n2P1nIJGpZ4Q89GTenknRx6T6zyfzf592yW/jA5e8EHN4tNMjjXHQaYWEq5+L05w==", + "resolved": "7.1.2", + "contentHash": "oICJMqr3aNEDZOwnH5SK49bR6Z4aX0zEAnOLuhloumOSuqnNq+GWBdQyrgILnlcT5xj09xKCP/7Y7gJYB+ls/g==", "dependencies": { - "Microsoft.CSharp": "4.5.0", - "Microsoft.IdentityModel.Logging": "6.21.0", - "System.Security.Cryptography.Cng": "4.5.0" + "Microsoft.IdentityModel.Logging": "7.1.2" } }, - "Microsoft.NETCore.Platforms": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "VyPlqzH2wavqquTcYpkIIAQ6WdenuKoFN0BdYBbCWsclXacSOHNQn66Gt4z5NBqEYW0FAPm5rlvki9ZiCij5xQ==" - }, - "Microsoft.NETCore.Targets": { - "type": "Transitive", - "resolved": "1.1.0", - "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==" - }, "Microsoft.OpenApi": { "type": "Transitive", "resolved": "1.2.3", @@ -422,51 +393,39 @@ "resolved": "1.0.0", "contentHash": "N4KeF3cpcm1PUHym1RmakkzfkEv3GRMyofVv40uXsQhCQeglr2OHNcUk2WOG51AKpGO8ynGpo9M/kFXSzghwug==" }, - "Microsoft.Win32.Registry": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==", - "dependencies": { - "System.Security.AccessControl": "5.0.0", - "System.Security.Principal.Windows": "5.0.0" - } - }, "Microsoft.Win32.SystemEvents": { "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "Bh6blKG8VAKvXiLe2L+sEsn62nc1Ij34MrNxepD2OCrS5cpCwQa9MeLyhVQPQ/R4Wlzwuy6wMK8hLb11QPDRsQ==", - "dependencies": { - "Microsoft.NETCore.Platforms": "5.0.0" - } + "resolved": "6.0.0", + "contentHash": "hqTM5628jSsQiv+HGpiq3WKBl2c8v1KZfby2J6Pr7pEPlK9waPdgEO6b8A/+/xn/yZ9ulv8HuqK71ONy2tg67A==" }, "SQLitePCLRaw.bundle_e_sqlite3": { "type": "Transitive", - "resolved": "2.1.4", - "contentHash": "EWI1olKDjFEBMJu0+3wuxwziIAdWDVMYLhuZ3Qs84rrz+DHwD00RzWPZCa+bLnHCf3oJwuFZIRsHT5p236QXww==", + "resolved": "2.1.6", + "contentHash": "BmAf6XWt4TqtowmiWe4/5rRot6GerAeklmOPfviOvwLoF5WwgxcJHAxZtySuyW9r9w+HLILnm8VfJFLCUJYW8A==", "dependencies": { - "SQLitePCLRaw.lib.e_sqlite3": "2.1.4", - "SQLitePCLRaw.provider.e_sqlite3": "2.1.4" + "SQLitePCLRaw.lib.e_sqlite3": "2.1.6", + "SQLitePCLRaw.provider.e_sqlite3": "2.1.6" } }, "SQLitePCLRaw.core": { "type": "Transitive", - "resolved": "2.1.4", - "contentHash": "inBjvSHo9UDKneGNzfUfDjK08JzlcIhn1+SP5Y3m6cgXpCxXKCJDy6Mka7LpgSV+UZmKSnC8rTwB0SQ0xKu5pA==", + "resolved": "2.1.6", + "contentHash": "wO6v9GeMx9CUngAet8hbO7xdm+M42p1XeJq47ogyRoYSvNSp0NGLI+MgC0bhrMk9C17MTVFlLiN6ylyExLCc5w==", "dependencies": { "System.Memory": "4.5.3" } }, "SQLitePCLRaw.lib.e_sqlite3": { "type": "Transitive", - "resolved": "2.1.4", - "contentHash": "2C9Q9eX7CPLveJA0rIhf9RXAvu+7nWZu1A2MdG6SD/NOu26TakGgL1nsbc0JAspGijFOo3HoN79xrx8a368fBg==" + "resolved": "2.1.6", + "contentHash": "2ObJJLkIUIxRpOUlZNGuD4rICpBnrBR5anjyfUFQep4hMOIeqW+XGQYzrNmHSVz5xSWZ3klSbh7sFR6UyDj68Q==" }, "SQLitePCLRaw.provider.e_sqlite3": { "type": "Transitive", - "resolved": "2.1.4", - "contentHash": "CSlb5dUp1FMIkez9Iv5EXzpeq7rHryVNqwJMWnpq87j9zWZexaEMdisDktMsnnrzKM6ahNrsTkjqNodTBPBxtQ==", + "resolved": "2.1.6", + "contentHash": "PQ2Oq3yepLY4P7ll145P3xtx2bX8xF4PzaKPRpw9jZlKvfe4LE/saAV82inND9usn1XRpmxXk7Lal3MTI+6CNg==", "dependencies": { - "SQLitePCLRaw.core": "2.1.4" + "SQLitePCLRaw.core": "2.1.6" } }, "Swashbuckle.AspNetCore.Swagger": { @@ -490,31 +449,29 @@ "resolved": "6.5.0", "contentHash": "OvbvxX+wL8skxTBttcBsVxdh73Fag4xwqEU2edh4JMn7Ws/xJHnY/JB1e9RoCb6XpDxUF3hD9A0Z1lEUx40Pfw==" }, - "System.Buffers": { - "type": "Transitive", - "resolved": "4.5.1", - "contentHash": "Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==" - }, "System.Configuration.ConfigurationManager": { "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "aM7cbfEfVNlEEOj3DsZP+2g9NRwbkyiAv2isQEzw7pnkDg9ekCU2m1cdJLM02Uq691OaCS91tooaxcEn8d0q5w==", + "resolved": "6.0.1", + "contentHash": "jXw9MlUu/kRfEU0WyTptAVueupqIeE3/rl0EZDMlf8pcvJnitQ8HeVEp69rZdaStXwTV72boi/Bhw8lOeO+U2w==", "dependencies": { - "System.Security.Cryptography.ProtectedData": "5.0.0", - "System.Security.Permissions": "5.0.0" + "System.Security.Cryptography.ProtectedData": "6.0.0", + "System.Security.Permissions": "6.0.0" } }, "System.Diagnostics.DiagnosticSource": { "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "tCQTzPsGZh/A9LhhA6zrqCRV4hOHsK90/G7q3Khxmn6tnB1PuNU0cRaKANP2AWcF9bn0zsuOoZOSrHuJk6oNBA==" + "resolved": "6.0.1", + "contentHash": "KiLYDu2k2J82Q9BJpWiuQqCkFjRBWVq4jDzKKWawVi9KWzyD0XG3cmfX0vqTQlL14Wi9EufJrbL0+KCLTbqWiQ==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } }, "System.Drawing.Common": { "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "SztFwAnpfKC8+sEKXAFxCBWhKQaEd97EiOL7oZJZP56zbqnLpmxACWA8aGseaUExciuEAUuR9dY8f7HkTRAdnw==", + "resolved": "6.0.0", + "contentHash": "NfuoKUiP2nUWwKZN6twGqXioIe1zVD0RIj2t976A+czLHr2nY454RwwXs6JU9Htc6mwqL6Dn/nEL3dpVf2jOhg==", "dependencies": { - "Microsoft.Win32.SystemEvents": "5.0.0" + "Microsoft.Win32.SystemEvents": "6.0.0" } }, "System.Formats.Asn1": { @@ -522,35 +479,22 @@ "resolved": "5.0.0", "contentHash": "MTvUIktmemNB+El0Fgw9egyqT9AYSIk6DTJeoDSpc3GIHxHCMo8COqkWT1mptX5tZ1SlQ6HJZ0OsSvMth1c12w==" }, - "System.Globalization": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, "System.IdentityModel.Tokens.Jwt": { "type": "Transitive", - "resolved": "6.21.0", - "contentHash": "JRD8AuypBE+2zYxT3dMJomQVsPYsCqlyZhWel3J1d5nzQokSRyTueF+Q4ID3Jcu6zSZKuzOdJ1MLTkbQsDqcvQ==", + "resolved": "7.1.2", + "contentHash": "Thhbe1peAmtSBFaV/ohtykXiZSOkx59Da44hvtWfIMFofDA3M3LaVyjstACf2rKGn4dEDR2cUpRAZ0Xs/zB+7Q==", "dependencies": { - "Microsoft.IdentityModel.JsonWebTokens": "6.21.0", - "Microsoft.IdentityModel.Tokens": "6.21.0" + "Microsoft.IdentityModel.JsonWebTokens": "7.1.2", + "Microsoft.IdentityModel.Tokens": "7.1.2" } }, - "System.IO": { + "System.IO.FileSystem.AccessControl": { "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", + "resolved": "5.0.0", + "contentHash": "SxHB3nuNrpptVk+vZ/F+7OHEpoHUIKKMl02bUmYHQr1r+glbZQxs7pRtsf4ENO29TVm2TH3AEeep2fJcy92oYw==", "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0", - "System.Text.Encoding": "4.3.0", - "System.Threading.Tasks": "4.3.0" + "System.Security.AccessControl": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" } }, "System.Memory": { @@ -572,65 +516,23 @@ "resolved": "4.5.0", "contentHash": "QQTlPTl06J/iiDbJCiepZ4H//BVraReU4O4EoRw1U02H5TLUIT7xn3GnDp9AXPSlJUDyFs4uWjWafNX6WrAojQ==" }, - "System.Reflection": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.IO": "4.3.0", - "System.Reflection.Primitives": "4.3.0", - "System.Runtime": "4.3.0" - } - }, - "System.Reflection.Primitives": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, - "System.Resources.ResourceManager": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Globalization": "4.3.0", - "System.Reflection": "4.3.0", - "System.Runtime": "4.3.0" - } - }, - "System.Runtime": { + "System.Runtime.Caching": { "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", + "resolved": "6.0.0", + "contentHash": "E0e03kUp5X2k+UAoVl6efmI7uU7JRBWi5EIdlQ7cr0NpBGjHG4fWII35PgsBY9T4fJQ8E4QPsL0rKksU9gcL5A==", "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0" + "System.Configuration.ConfigurationManager": "6.0.0" } }, - "System.Runtime.Caching": { + "System.Runtime.CompilerServices.Unsafe": { "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "30D6MkO8WF9jVGWZIP0hmCN8l9BTY4LCsAzLIe4xFSXzs+AjDotR7DpSmj27pFskDURzUvqYYY0ikModgBTxWw==", - "dependencies": { - "System.Configuration.ConfigurationManager": "5.0.0" - } + "resolved": "6.0.0", + "contentHash": "/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==" }, "System.Security.AccessControl": { "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "dagJ1mHZO3Ani8GH0PHpPEe/oYO+rVdbQjvjJkBRNQkX4t0r1iaeGn8+/ybkSLEan3/slM0t59SVdHzuHf2jmw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "5.0.0", - "System.Security.Principal.Windows": "5.0.0" - } + "resolved": "6.0.0", + "contentHash": "AUADIc0LIEQe7MzC+I0cl0rAT8RrTAKFHl53yHjEUzNVIaUlhFY11vc2ebiVJzVBuOzun6F7FBA+8KAbGTTedQ==" }, "System.Security.Cryptography.Cng": { "type": "Transitive", @@ -642,16 +544,16 @@ }, "System.Security.Cryptography.ProtectedData": { "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "HGxMSAFAPLNoxBvSfW08vHde0F9uh7BjASwu6JF9JnXuEPhCY3YUqURn0+bQV/4UWeaqymmrHWV+Aw9riQCtCA==" + "resolved": "6.0.0", + "contentHash": "rp1gMNEZpvx9vP0JW0oHLxlf8oSiQgtno77Y4PLUBjSiDYoD77Y8uXHr1Ea5XG4/pIKhqAdxZ8v8OTUtqo9PeQ==" }, "System.Security.Permissions": { "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "uE8juAhEkp7KDBCdjDIE3H9R1HJuEHqeqX8nLX9gmYKWwsqk3T5qZlPx8qle5DPKimC/Fy3AFTdV7HamgCh9qQ==", + "resolved": "6.0.0", + "contentHash": "T/uuc7AklkDoxmcJ7LGkyX1CcSviZuLCa4jg3PekfJ7SU0niF0IVTXwUiNVP9DSpzou2PpxJ+eNY2IfDM90ZCg==", "dependencies": { - "System.Security.AccessControl": "5.0.0", - "System.Windows.Extensions": "5.0.0" + "System.Security.AccessControl": "6.0.0", + "System.Windows.Extensions": "6.0.0" } }, "System.Security.Principal.Windows": { @@ -659,45 +561,25 @@ "resolved": "5.0.0", "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" }, - "System.Text.Encoding": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, "System.Text.Encoding.CodePages": { "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "NyscU59xX6Uo91qvhOs2Ccho3AR2TnZPomo1Z0K6YpyztBPM/A5VbkzOO19sy3A3i1TtEnTxA7bCe3Us+r5MWg==", + "resolved": "6.0.0", + "contentHash": "ZFCILZuOvtKPauZ/j/swhvw68ZRi9ATCfvGbk1QfydmcXBkIWecWKn/250UH7rahZ5OoDBaiAudJtPvLwzw85A==", "dependencies": { - "Microsoft.NETCore.Platforms": "5.0.0" + "System.Runtime.CompilerServices.Unsafe": "6.0.0" } }, "System.Text.Encodings.Web": { "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "OP6umVGxc0Z0MvZQBVigj4/U31Pw72ITihDWP9WiWDm+q5aoe0GaJivsfYGq53o6dxH7DcXWiCTl7+0o2CGdmg==" + "resolved": "8.0.0", + "contentHash": "yev/k9GHAEGx2Rg3/tU6MQh4HGBXJs70y7j1LaM1i/ER9po+6nnQ6RRqTJn1E7Xu0fbIFK80Nh5EoODxrbxwBQ==" }, "System.Text.Json": { "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "DaGSsVqKsn/ia6RG8frjwmJonfos0srquhw09TlT8KRw5I43E+4gs+/bZj4K0vShJ5H9imCuXupb4RmS+dBy3w==", + "resolved": "8.0.0", + "contentHash": "OdrZO2WjkiEG6ajEFRABTRCi/wuXQPxeV6g8xvUJqdxMvvuCCEk86zPla8UiIQJz3durtUEbNyY/3lIhS0yZvQ==", "dependencies": { - "System.Text.Encodings.Web": "7.0.0" - } - }, - "System.Threading.Tasks": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" + "System.Text.Encodings.Web": "8.0.0" } }, "System.Threading.Tasks.Extensions": { @@ -707,10 +589,10 @@ }, "System.Windows.Extensions": { "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "c1ho9WU9ZxMZawML+ssPKZfdnrg/OjR3pe0m9v8230z3acqphwvPJqzAkH54xRYm5ntZHGG1EPP3sux9H3qSPg==", + "resolved": "6.0.0", + "contentHash": "IXoJOXIqc39AIe+CIR7koBtRGMiCt/LPM3lI+PELtDIy9XdyeSrwXFdWV9dzJ2Awl0paLWUaknLxFQ5HpHZUog==", "dependencies": { - "System.Drawing.Common": "5.0.0" + "System.Drawing.Common": "6.0.0" } } } diff --git a/tests/Conduit.IntegrationTests/Features/Articles/ArticleHelpers.cs b/tests/Conduit.IntegrationTests/Features/Articles/ArticleHelpers.cs index ab7c5149..52c90e92 100644 --- a/tests/Conduit.IntegrationTests/Features/Articles/ArticleHelpers.cs +++ b/tests/Conduit.IntegrationTests/Features/Articles/ArticleHelpers.cs @@ -37,16 +37,12 @@ Create.Command command new System.Threading.CancellationToken() ); - var dbArticle = await fixture.ExecuteDbContextAsync( - db => - db.Articles - .Where(a => a.ArticleId == created.Article.ArticleId) - .SingleOrDefaultAsync() + var dbArticle = await fixture.ExecuteDbContextAsync(db => + db.Articles.Where(a => a.ArticleId == created.Article.ArticleId).SingleOrDefaultAsync() ); if (dbArticle is null) { - throw new RestException(HttpStatusCode.NotFound, new {Article = Constants.NOT_FOUND}); - + throw new RestException(HttpStatusCode.NotFound, new { Article = Constants.NOT_FOUND }); } return dbArticle; diff --git a/tests/Conduit.IntegrationTests/Features/Articles/CreateTests.cs b/tests/Conduit.IntegrationTests/Features/Articles/CreateTests.cs index ed266d4f..9c8c175d 100644 --- a/tests/Conduit.IntegrationTests/Features/Articles/CreateTests.cs +++ b/tests/Conduit.IntegrationTests/Features/Articles/CreateTests.cs @@ -16,7 +16,7 @@ public async Task Expect_Create_Article() Title = "Test article dsergiu77", Description = "Description of the test article", Body = "Body of the test article", - TagList = new string[] { "tag1", "tag2" } + TagList = ["tag1", "tag2"] } ); diff --git a/tests/Conduit.IntegrationTests/Features/Articles/DeleteTests.cs b/tests/Conduit.IntegrationTests/Features/Articles/DeleteTests.cs index a88d7f67..97c6a5fc 100644 --- a/tests/Conduit.IntegrationTests/Features/Articles/DeleteTests.cs +++ b/tests/Conduit.IntegrationTests/Features/Articles/DeleteTests.cs @@ -33,8 +33,8 @@ public async Task Expect_Delete_Article() var articleDeleteHandler = new Delete.QueryHandler(dbContext); await articleDeleteHandler.Handle(deleteCmd, new System.Threading.CancellationToken()); - var dbArticle = await ExecuteDbContextAsync( - db => db.Articles.Where(d => d.Slug == deleteCmd.Slug).SingleOrDefaultAsync() + var dbArticle = await ExecuteDbContextAsync(db => + db.Articles.Where(d => d.Slug == deleteCmd.Slug).SingleOrDefaultAsync() ); Assert.Null(dbArticle); @@ -49,28 +49,26 @@ public async Task Expect_Delete_Article_With_Tags() Title = "Test article dsergiu77", Description = "Description of the test article", Body = "Body of the test article", - TagList = new string[] { "tag1", "tag2" } + TagList = ["tag1", "tag2"] } ); var article = await ArticleHelpers.CreateArticle(this, createCmd); - var dbArticleWithTags = await ExecuteDbContextAsync( - db => - db.Articles - .Include(a => a.ArticleTags) - .Where(d => d.Slug == article.Slug) - .SingleOrDefaultAsync() + var dbArticleWithTags = await ExecuteDbContextAsync(db => + db.Articles.Include(a => a.ArticleTags) + .Where(d => d.Slug == article.Slug) + .SingleOrDefaultAsync() ); - var deleteCmd = new Delete.Command(article.Slug?? throw new InvalidOperationException()); + var deleteCmd = new Delete.Command(article.Slug ?? throw new InvalidOperationException()); var dbContext = GetDbContext(); var articleDeleteHandler = new Delete.QueryHandler(dbContext); await articleDeleteHandler.Handle(deleteCmd, new System.Threading.CancellationToken()); - var dbArticle = await ExecuteDbContextAsync( - db => db.Articles.Where(d => d.Slug == deleteCmd.Slug).SingleOrDefaultAsync() + var dbArticle = await ExecuteDbContextAsync(db => + db.Articles.Where(d => d.Slug == deleteCmd.Slug).SingleOrDefaultAsync() ); Assert.Null(dbArticle); } @@ -88,13 +86,12 @@ public async Task Expect_Delete_Article_With_Comments() ); var article = await ArticleHelpers.CreateArticle(this, createArticleCmd); - var dbArticle = await ExecuteDbContextAsync( - db => - db.Articles - .Include(a => a.ArticleTags) + var dbArticle = + await ExecuteDbContextAsync(db => + db.Articles.Include(a => a.ArticleTags) .Where(d => d.Slug == article.Slug) .SingleOrDefaultAsync() - ) ?? throw new InvalidOperationException(); + ) ?? throw new InvalidOperationException(); var articleId = dbArticle.ArticleId; var slug = dbArticle.Slug; @@ -102,7 +99,7 @@ public async Task Expect_Delete_Article_With_Comments() // create article comment var createCommentCmd = new Conduit.Features.Comments.Create.Command( new(new Conduit.Features.Comments.Create.CommentData("article comment")), - slug?? throw new InvalidOperationException() + slug ?? throw new InvalidOperationException() ); var comment = await CommentHelpers.CreateComment( @@ -119,8 +116,8 @@ public async Task Expect_Delete_Article_With_Comments() var articleDeleteHandler = new Delete.QueryHandler(dbContext); await articleDeleteHandler.Handle(deleteCmd, new System.Threading.CancellationToken()); - var deleted = await ExecuteDbContextAsync( - db => db.Articles.Where(d => d.Slug == deleteCmd.Slug).SingleOrDefaultAsync() + var deleted = await ExecuteDbContextAsync(db => + db.Articles.Where(d => d.Slug == deleteCmd.Slug).SingleOrDefaultAsync() ); Assert.Null(deleted); } diff --git a/tests/Conduit.IntegrationTests/Features/Articles/EditTests.cs b/tests/Conduit.IntegrationTests/Features/Articles/EditTests.cs index 018850c6..1ac62b68 100644 --- a/tests/Conduit.IntegrationTests/Features/Articles/EditTests.cs +++ b/tests/Conduit.IntegrationTests/Features/Articles/EditTests.cs @@ -17,7 +17,7 @@ public async Task Expect_Edit_Article() Title = "Test article dsergiu77", Description = "Description of the test article", Body = "Body of the test article", - TagList = new string[] { "tag1", "tag2" } + TagList = ["tag1", "tag2"] } ); @@ -25,17 +25,15 @@ public async Task Expect_Edit_Article() var command = new Edit.Command( new( - new Edit.ArticleData() - { - Title = "Updated " + createdArticle.Title, - Description = "Updated" + createdArticle.Description, - Body = "Updated" + createdArticle.Body, - } + new Edit.ArticleData( + "Updated " + createdArticle.Title, + "Updated " + createdArticle.Description, + "Updated " + createdArticle.Body, + [createdArticle.TagList[1], "tag3"] + ) ), createdArticle.Slug ?? throw new InvalidOperationException() ); - // remove the first tag and add a new tag - command.Model.Article.TagList = new string[] { createdArticle.TagList[1], "tag3" }; var dbContext = GetDbContext(); @@ -47,9 +45,9 @@ public async Task Expect_Edit_Article() Assert.NotNull(edited); Assert.Equal(edited.Article.Title, command.Model.Article.Title); - Assert.Equal(edited.Article.TagList.Count(), command.Model.Article.TagList.Count()); + Assert.Equal(edited.Article.TagList.Count, command.Model.Article.TagList?.Count() ?? 0); // use assert Contains because we do not know the order in which the tags are saved/retrieved - Assert.Contains(edited.Article.TagList[0], command.Model.Article.TagList); - Assert.Contains(edited.Article.TagList[1], command.Model.Article.TagList); + Assert.Contains(edited.Article.TagList[0], command.Model.Article.TagList ?? []); + Assert.Contains(edited.Article.TagList[1], command.Model.Article.TagList ?? []); } } diff --git a/tests/Conduit.IntegrationTests/Features/Comments/CommentHelpers.cs b/tests/Conduit.IntegrationTests/Features/Comments/CommentHelpers.cs index 4b2fd8ec..5364a88f 100644 --- a/tests/Conduit.IntegrationTests/Features/Comments/CommentHelpers.cs +++ b/tests/Conduit.IntegrationTests/Features/Comments/CommentHelpers.cs @@ -46,28 +46,26 @@ string userName new System.Threading.CancellationToken() ); - var dbArticleWithComments = await fixture.ExecuteDbContextAsync( - db => - db.Articles - .Include(a => a.Comments) - .Include(a => a.Author) - .Where(a => a.Slug == command.Slug) - .SingleOrDefaultAsync() + var dbArticleWithComments = await fixture.ExecuteDbContextAsync(db => + db.Articles.Include(a => a.Comments) + .Include(a => a.Author) + .Where(a => a.Slug == command.Slug) + .SingleOrDefaultAsync() ); if (dbArticleWithComments is null) { - throw new RestException(HttpStatusCode.NotFound, new {Article = Constants.NOT_FOUND}); + throw new RestException(HttpStatusCode.NotFound, new { Article = Constants.NOT_FOUND }); } var dbComment = dbArticleWithComments.Comments.FirstOrDefault(c => - c.ArticleId == dbArticleWithComments.ArticleId - && c.Author == dbArticleWithComments.Author -); + c.ArticleId == dbArticleWithComments.ArticleId + && c.Author == dbArticleWithComments.Author + ); if (dbComment is null) { - throw new RestException(HttpStatusCode.NotFound, new {Article = Constants.NOT_FOUND}); + throw new RestException(HttpStatusCode.NotFound, new { Article = Constants.NOT_FOUND }); } return dbComment; diff --git a/tests/Conduit.IntegrationTests/Features/Users/CreateTests.cs b/tests/Conduit.IntegrationTests/Features/Users/CreateTests.cs index bd3b0c90..d7a574e3 100644 --- a/tests/Conduit.IntegrationTests/Features/Users/CreateTests.cs +++ b/tests/Conduit.IntegrationTests/Features/Users/CreateTests.cs @@ -12,22 +12,15 @@ public class CreateTests : SliceFixture [Fact] public async Task Expect_Create_User() { - var command = new Create.Command( - new Create.UserData() - { - Email = "email", - Password = "password", - Username = "username" - } - ); + var command = new Create.Command(new Create.UserData("username", "email", "password")); await SendAsync(command); - var created = await ExecuteDbContextAsync( - db => db.Persons.Where(d => d.Email == command.User.Email).SingleOrDefaultAsync() + var created = await ExecuteDbContextAsync(db => + db.Persons.Where(d => d.Email == command.User.Email).SingleOrDefaultAsync() ); Assert.NotNull(created); Assert.Equal(created.Hash, await new PasswordHasher().Hash("password", created.Salt)); } -} \ No newline at end of file +} diff --git a/tests/Conduit.IntegrationTests/Features/Users/LoginTests.cs b/tests/Conduit.IntegrationTests/Features/Users/LoginTests.cs index 2783ed70..d0925448 100644 --- a/tests/Conduit.IntegrationTests/Features/Users/LoginTests.cs +++ b/tests/Conduit.IntegrationTests/Features/Users/LoginTests.cs @@ -33,4 +33,4 @@ public async Task Expect_Login() Assert.Equal("username", user.User.Username); Assert.NotNull(user.User.Token); } -} \ No newline at end of file +} diff --git a/tests/Conduit.IntegrationTests/Features/Users/UserHelpers.cs b/tests/Conduit.IntegrationTests/Features/Users/UserHelpers.cs index 5529a2fa..edf10383 100644 --- a/tests/Conduit.IntegrationTests/Features/Users/UserHelpers.cs +++ b/tests/Conduit.IntegrationTests/Features/Users/UserHelpers.cs @@ -14,16 +14,9 @@ public static class UserHelpers /// public static async Task CreateDefaultUser(SliceFixture fixture) { - var command = new Create.Command( - new Create.UserData() - { - Email = "email", - Password = "password", - Username = DefaultUserName - } - ); + var command = new Create.Command(new Create.UserData(DefaultUserName, "email", "password")); var commandResult = await fixture.SendAsync(command); return commandResult.User; } -} \ No newline at end of file +} diff --git a/tests/Conduit.IntegrationTests/StubCurrentUserAccessor.cs b/tests/Conduit.IntegrationTests/StubCurrentUserAccessor.cs index 6cb2ef1c..03108dc5 100644 --- a/tests/Conduit.IntegrationTests/StubCurrentUserAccessor.cs +++ b/tests/Conduit.IntegrationTests/StubCurrentUserAccessor.cs @@ -2,15 +2,7 @@ namespace Conduit.IntegrationTests; -public class StubCurrentUserAccessor : ICurrentUserAccessor +public class StubCurrentUserAccessor(string userName) : ICurrentUserAccessor { - private readonly string _currentUserName; - - /// - /// stub the ICurrentUserAccessor with a given userName to be used in tests - /// - /// - public StubCurrentUserAccessor(string userName) => _currentUserName = userName; - - public string GetCurrentUsername() => _currentUserName; -} \ No newline at end of file + public string GetCurrentUsername() => userName; +} diff --git a/tests/Conduit.IntegrationTests/packages.lock.json b/tests/Conduit.IntegrationTests/packages.lock.json index a2956a28..6a34bce7 100644 --- a/tests/Conduit.IntegrationTests/packages.lock.json +++ b/tests/Conduit.IntegrationTests/packages.lock.json @@ -1,41 +1,41 @@ { "version": 2, "dependencies": { - "net7.0": { + "net8.0": { "Microsoft.NET.Test.Sdk": { "type": "Direct", - "requested": "[17.7.2, )", - "resolved": "17.7.2", - "contentHash": "WOSF/GUYcnrLGkdvCbXDRig2rShtBwfQc5l7IxQE6PZI3CeXAqF1SpyzwlGA5vw+MdEAXs3niy+ZkGBBWna6tw==", + "requested": "[17.9.0, )", + "resolved": "17.9.0", + "contentHash": "7GUNAUbJYn644jzwLm5BD3a2p9C1dmP8Hr6fDPDxgItQk9hBs1Svdxzz07KQ/UphMSmgza9AbijBJGmw5D658A==", "dependencies": { - "Microsoft.CodeCoverage": "17.7.2", - "Microsoft.TestPlatform.TestHost": "17.7.2" + "Microsoft.CodeCoverage": "17.9.0", + "Microsoft.TestPlatform.TestHost": "17.9.0" } }, "xunit": { "type": "Direct", - "requested": "[2.5.0, )", - "resolved": "2.5.0", - "contentHash": "f2V5wuAdoaq0mRTt9UBmPbVex9HcwFYn+y7WaKUz5Xpakcrv7lhtQWBJUWNY4N3Z+o+atDBLyAALM1QWx04C6Q==", + "requested": "[2.7.0, )", + "resolved": "2.7.0", + "contentHash": "KcCI5zxh8zbUfQTeErc4oT7YokViVND2V0p4vDJ2VD4lhF9V5qCYMMDNixme7FdwYy3SwPHF+2xC2Dq4Z9GSlA==", "dependencies": { - "xunit.analyzers": "1.2.0", - "xunit.assert": "2.5.0", - "xunit.core": "[2.5.0]" + "xunit.analyzers": "1.11.0", + "xunit.assert": "2.7.0", + "xunit.core": "[2.7.0]" } }, "xunit.runner.visualstudio": { "type": "Direct", - "requested": "[2.5.0, )", - "resolved": "2.5.0", - "contentHash": "+Gp9vuC2431yPyKB15YrOTxCuEAErBQUTIs6CquumX1F073UaPHGW0VE/XVJLMh9W4sXdz3TBkcHdFWZrRn2Hw==" + "requested": "[2.5.7, )", + "resolved": "2.5.7", + "contentHash": "31Rl7dBJriX0DNwZfDp8gqFOPsiM0c9kqpcH/HvNi9vDp+K7Ydf42H7mVIvYT918Ywzn1ymLg1c4DDC6iU754w==" }, "Azure.Core": { "type": "Transitive", - "resolved": "1.24.0", - "contentHash": "+/qI1j2oU1S4/nvxb2k/wDsol00iGf1AyJX5g3epV7eOpQEP/2xcgh/cxgKMeFgn3U2fmgSiBnQZdkV+l5y0Uw==", + "resolved": "1.35.0", + "contentHash": "hENcx03Jyuqv05F4RBEPbxz29UrM3Nbhnr6Wl6NQpoU9BCIbL3XLentrxDCTrH54NLS11Exxi/o8MYgT/cnKFA==", "dependencies": { "Microsoft.Bcl.AsyncInterfaces": "1.1.1", - "System.Diagnostics.DiagnosticSource": "4.6.0", + "System.Diagnostics.DiagnosticSource": "6.0.1", "System.Memory.Data": "1.0.2", "System.Numerics.Vectors": "4.5.0", "System.Text.Encodings.Web": "4.7.2", @@ -45,12 +45,12 @@ }, "Azure.Identity": { "type": "Transitive", - "resolved": "1.6.0", - "contentHash": "EycyMsb6rD2PK9P0SyibFfEhvWWttdrYhyPF4f41uzdB/44yQlV+2Wehxyg489Rj6gbPvSPgbKq0xsHJBhipZA==", + "resolved": "1.10.3", + "contentHash": "l1Xm2MWOF2Mzcwuarlw8kWQXLZk3UeB55aQXVyjj23aBfDwOZ3gu5GP2kJ6KlmZeZv2TCzw7x4L3V36iNr3gww==", "dependencies": { - "Azure.Core": "1.24.0", - "Microsoft.Identity.Client": "4.39.0", - "Microsoft.Identity.Client.Extensions.Msal": "2.19.3", + "Azure.Core": "1.35.0", + "Microsoft.Identity.Client": "4.56.0", + "Microsoft.Identity.Client.Extensions.Msal": "4.56.0", "System.Memory": "4.5.4", "System.Security.Cryptography.ProtectedData": "4.7.0", "System.Text.Json": "4.7.2", @@ -83,90 +83,80 @@ }, "Microsoft.CodeCoverage": { "type": "Transitive", - "resolved": "17.7.2", - "contentHash": "ntbkwIqwszkfCRjxVZOyEQiHauiYsY9NtYjw9ASsoxDSiG8YtV6AGcOAwrAk3TZv2UOq4MrpX+3MYEeMHSb03w==" - }, - "Microsoft.CSharp": { - "type": "Transitive", - "resolved": "4.7.0", - "contentHash": "pTj+D3uJWyN3My70i2Hqo+OXixq3Os2D1nJ2x92FFo6sk8fYS1m1WLNTs0Dc1uPaViH0YvEEwvzddQ7y4rhXmA==" + "resolved": "17.9.0", + "contentHash": "RGD37ZSrratfScYXm7M0HjvxMxZyWZL4jm+XgMZbkIY1UPgjUpbNA/t+WTGj/rC/0Hm9A3IrH3ywbKZkOCnoZA==" }, "Microsoft.Data.SqlClient": { "type": "Transitive", - "resolved": "5.0.2", - "contentHash": "mxcYU9I5TLzUegLVXiTtOE89RXN3GafL1Y+ExIbXvivvQtxplI4wxOgsiZGO4TZC18OJqui7mLVmiYpdFFImRQ==", + "resolved": "5.1.4", + "contentHash": "RSGSodusrPSVPKBLETRTH51G0yUQS28rD1hi2svTKS1GOsvUWxUpE8hgnKnUFC9RNjzfQmfUp+T0lJHFtlT3HQ==", "dependencies": { - "Azure.Identity": "1.6.0", - "Microsoft.Data.SqlClient.SNI.runtime": "5.0.1", - "Microsoft.Identity.Client": "4.45.0", - "Microsoft.IdentityModel.JsonWebTokens": "6.21.0", - "Microsoft.IdentityModel.Protocols.OpenIdConnect": "6.21.0", + "Azure.Identity": "1.10.3", + "Microsoft.Data.SqlClient.SNI.runtime": "5.1.1", + "Microsoft.Identity.Client": "4.56.0", + "Microsoft.IdentityModel.JsonWebTokens": "6.24.0", + "Microsoft.IdentityModel.Protocols.OpenIdConnect": "6.24.0", "Microsoft.SqlServer.Server": "1.0.0", - "Microsoft.Win32.Registry": "5.0.0", - "System.Buffers": "4.5.1", - "System.Configuration.ConfigurationManager": "5.0.0", - "System.Diagnostics.DiagnosticSource": "5.0.0", - "System.IO": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime.Caching": "5.0.0", + "System.Configuration.ConfigurationManager": "6.0.1", + "System.Diagnostics.DiagnosticSource": "6.0.1", + "System.Runtime.Caching": "6.0.0", "System.Security.Cryptography.Cng": "5.0.0", "System.Security.Principal.Windows": "5.0.0", - "System.Text.Encoding.CodePages": "5.0.0", - "System.Text.Encodings.Web": "4.7.2" + "System.Text.Encoding.CodePages": "6.0.0", + "System.Text.Encodings.Web": "6.0.0" } }, "Microsoft.Data.SqlClient.SNI.runtime": { "type": "Transitive", - "resolved": "5.0.1", - "contentHash": "y0X5MxiNdbITJYoafJ2ruaX6hqO0twpCGR/ipiDOe85JKLU8WL4TuAQfDe5qtt3bND5Je26HnrarLSAMMnVTNg==" + "resolved": "5.1.1", + "contentHash": "wNGM5ZTQCa2blc9ikXQouybGiyMd6IHPVJvAlBEPtr6JepZEOYeDxGyprYvFVeOxlCXs7avridZQ0nYkHzQWCQ==" }, "Microsoft.Data.Sqlite.Core": { "type": "Transitive", - "resolved": "7.0.10", - "contentHash": "SA6LOen490YTforjaNfVDClYpwiG3LmHJM8objq6KwIIFP0fq9Eulhbu6zBl6AduMefQqUA3pllrFFVQpwPoqw==", + "resolved": "8.0.2", + "contentHash": "C7VelOBNUrVlatmOoJ9P+vc/gegduv7d2uB5oy7bFxfgZBfaGr+eREW+QuppXwi3MHp0WBxxWjqkK5gD7ymDQA==", "dependencies": { - "SQLitePCLRaw.core": "2.1.4" + "SQLitePCLRaw.core": "2.1.6" } }, "Microsoft.EntityFrameworkCore": { "type": "Transitive", - "resolved": "7.0.10", - "contentHash": "24NbXJqJ/x8u88/agqeb1pLdAF9+9StDLA36+P/3g5xsJPOaB2GxXn7epR8dWpZTgHsNZ7cvBMxBgfFmF+xZlg==", + "resolved": "8.0.2", + "contentHash": "6QlvBx4rdawW3AkkCsGVV+8qRLk34aknV5JD40s1hbVR18vKmT2KDl2DW83nHcPX7f4oebQ3BD1UMNCI/gkE0g==", "dependencies": { - "Microsoft.EntityFrameworkCore.Abstractions": "7.0.10", - "Microsoft.EntityFrameworkCore.Analyzers": "7.0.10", - "Microsoft.Extensions.Caching.Memory": "7.0.0", - "Microsoft.Extensions.DependencyInjection": "7.0.0", - "Microsoft.Extensions.Logging": "7.0.0" + "Microsoft.EntityFrameworkCore.Abstractions": "8.0.2", + "Microsoft.EntityFrameworkCore.Analyzers": "8.0.2", + "Microsoft.Extensions.Caching.Memory": "8.0.0", + "Microsoft.Extensions.Logging": "8.0.0" } }, "Microsoft.EntityFrameworkCore.Abstractions": { "type": "Transitive", - "resolved": "7.0.10", - "contentHash": "Z/lDWmGLiT9uNQrp6UXTKZxofSmAKQCiKOz98FDscTbfAGgBXE3DTTqRsPMc8HFIVVSNANSiFRz3JyLg07HN9Q==" + "resolved": "8.0.2", + "contentHash": "DjDKp++BTKFZmX+xLTow7grQTY+pImKfhGW68Zf8myiL3zyJ3b8RZbnLsWGNCqKQIF6hJIz/zA/zmERobFwV0A==" }, "Microsoft.EntityFrameworkCore.Analyzers": { "type": "Transitive", - "resolved": "7.0.10", - "contentHash": "+8NVNpyJTzW6nNh/7RGfldf+mbeboVcn+X1tD8kMBCEJswuy3RqM/qecEEfOfTcWLliZExPMaHwOwtHO6RMpdA==" + "resolved": "8.0.2", + "contentHash": "LI7awhc0fiAKvcUemsqxXUWqzAH9ywTSyM1rpC1un4p5SE1bhr5nRLvyRVbKRzKakmnNNY3to8NPDnoySEkxVw==" }, "Microsoft.EntityFrameworkCore.Relational": { "type": "Transitive", - "resolved": "7.0.10", - "contentHash": "PO2QB2Du+pW210UHmepYR12bk+ZOZJCiNkA7zEAxWs+vzvrRAMsUPlDlfgX2LXE7NBsnb0uvZp7a1/qqKf3fRQ==", + "resolved": "8.0.2", + "contentHash": "NoGfcq2OPw0z8XAPf74YFwGlTKjedWdsIEJqq4SvKcPjcu+B+/XDDNrDRxTvILfz4Ug8POSF49s1jz1JvUqTAg==", "dependencies": { - "Microsoft.EntityFrameworkCore": "7.0.10", - "Microsoft.Extensions.Configuration.Abstractions": "7.0.0" + "Microsoft.EntityFrameworkCore": "8.0.2", + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0" } }, "Microsoft.EntityFrameworkCore.Sqlite.Core": { "type": "Transitive", - "resolved": "7.0.10", - "contentHash": "9ujvh/RXXyXmSsh0yY3zI7S+E+ILzndLVsDkigXGkDPVrDqp7/ynqElj0Xb/e4qWHbg/ogoRe5rvUs0jzfl+xg==", + "resolved": "8.0.2", + "contentHash": "cUOohC2oMaHG8rAvF1bvg5U5Hmeio8nTvCJghyPSnnKtWPu6U/Ozw4jcdJn1UjeYe7X0udP8ax/IB6wb9BOLWw==", "dependencies": { - "Microsoft.Data.Sqlite.Core": "7.0.10", - "Microsoft.EntityFrameworkCore.Relational": "7.0.10", - "Microsoft.Extensions.DependencyModel": "7.0.0" + "Microsoft.Data.Sqlite.Core": "8.0.2", + "Microsoft.EntityFrameworkCore.Relational": "8.0.2", + "Microsoft.Extensions.DependencyModel": "8.0.0" } }, "Microsoft.Extensions.ApiDescription.Server": { @@ -176,160 +166,151 @@ }, "Microsoft.Extensions.Caching.Abstractions": { "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "IeimUd0TNbhB4ded3AbgBLQv2SnsiVugDyGV1MvspQFVlA07nDC7Zul7kcwH5jWN3JiTcp/ySE83AIJo8yfKjg==", + "resolved": "8.0.0", + "contentHash": "3KuSxeHoNYdxVYfg2IRZCThcrlJ1XJqIXkAWikCsbm5C/bCjv7G0WoKDyuR98Q+T607QT2Zl5GsbGRkENcV2yQ==", "dependencies": { - "Microsoft.Extensions.Primitives": "7.0.0" + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.Caching.Memory": { "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "xpidBs2KCE2gw1JrD0quHE72kvCaI3xFql5/Peb2GRtUuZX+dYPoK/NTdVMiM67Svym0M0Df9A3xyU0FbMQhHw==", + "resolved": "8.0.0", + "contentHash": "7pqivmrZDzo1ADPkRwjy+8jtRKWRCPag9qPI+p7sgu7Q4QreWhcvbiWXsbhP+yY8XSiDvZpu2/LWdBv7PnmOpQ==", "dependencies": { - "Microsoft.Extensions.Caching.Abstractions": "7.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0", - "Microsoft.Extensions.Logging.Abstractions": "7.0.0", - "Microsoft.Extensions.Options": "7.0.0", - "Microsoft.Extensions.Primitives": "7.0.0" + "Microsoft.Extensions.Caching.Abstractions": "8.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Logging.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.Configuration.Abstractions": { "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "f34u2eaqIjNO9YLHBz8rozVZ+TcFiFs0F3r7nUJd7FRkVSxk8u4OpoK226mi49MwexHOR2ibP9MFvRUaLilcQQ==", + "resolved": "8.0.0", + "contentHash": "3lE/iLSutpgX1CC0NOW70FJoGARRHbyKmG7dc0klnUZ9Dd9hS6N/POPWhKhMLCEuNN5nXEY5agmlFtH562vqhQ==", "dependencies": { - "Microsoft.Extensions.Primitives": "7.0.0" + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.DependencyInjection": { "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "elNeOmkeX3eDVG6pYVeV82p29hr+UKDaBhrZyWvWLw/EVZSYEkZlQdkp0V39k/Xehs2Qa0mvoCvkVj3eQxNQ1Q==", + "resolved": "8.0.0", + "contentHash": "V8S3bsm50ig6JSyrbcJJ8bW2b9QLGouz+G1miK3UTaOWmMtFwNNNzUf4AleyDWUmTrWMLNnFSLEQtxmxgNQnNQ==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0" + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" } }, "Microsoft.Extensions.DependencyInjection.Abstractions": { "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "h3j/QfmFN4S0w4C2A6X7arXij/M/OVw3uQHSOFxnND4DyAzO1F9eMX7Eti7lU/OkSthEE0WzRsfT/Dmx86jzCw==" + "resolved": "8.0.0", + "contentHash": "cjWrLkJXK0rs4zofsK4bSdg+jhDLTaxrkXu4gS6Y7MAlCvRyNNgwY/lJi5RDlQOnSZweHqoyvgvbdvQsRIW+hg==" }, "Microsoft.Extensions.DependencyModel": { "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "oONNYd71J3LzkWc4fUHl3SvMfiQMYUCo/mDHDEu76hYYxdhdrPYv6fvGv9nnKVyhE9P0h20AU8RZB5OOWQcAXg==", + "resolved": "8.0.0", + "contentHash": "NSmDw3K0ozNDgShSIpsZcbFIzBX4w28nDag+TfaQujkXGazBm+lid5onlWoCBy4VsLxqnnKjEBbGSJVWJMf43g==", "dependencies": { - "System.Text.Encodings.Web": "7.0.0", - "System.Text.Json": "7.0.0" + "System.Text.Encodings.Web": "8.0.0", + "System.Text.Json": "8.0.0" } }, "Microsoft.Extensions.Logging": { "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "Nw2muoNrOG5U5qa2ZekXwudUn2BJcD41e65zwmDHb1fQegTX66UokLWZkJRpqSSHXDOWZ5V0iqhbxOEky91atA==", + "resolved": "8.0.0", + "contentHash": "tvRkov9tAJ3xP51LCv3FJ2zINmv1P8Hi8lhhtcKGqM+ImiTCC84uOPEI4z8Cdq2C3o9e+Aa0Gw0rmrsJD77W+w==", "dependencies": { - "Microsoft.Extensions.DependencyInjection": "7.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0", - "Microsoft.Extensions.Logging.Abstractions": "7.0.0", - "Microsoft.Extensions.Options": "7.0.0" + "Microsoft.Extensions.DependencyInjection": "8.0.0", + "Microsoft.Extensions.Logging.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0" } }, "Microsoft.Extensions.Logging.Abstractions": { "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "kmn78+LPVMOWeITUjIlfxUPDsI0R6G0RkeAMBmQxAJ7vBJn4q2dTva7pWi65ceN5vPGjJ9q/Uae2WKgvfktJAw==" + "resolved": "8.0.0", + "contentHash": "arDBqTgFCyS0EvRV7O3MZturChstm50OJ0y9bDJvAcmEPJm0FFpFyjU/JLYyStNGGey081DvnQYlncNX5SJJGA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" + } }, "Microsoft.Extensions.Options": { "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "lP1yBnTTU42cKpMozuafbvNtQ7QcBjr/CcK3bYOGEMH55Fjt+iecXjT6chR7vbgCMqy3PG3aNQSZgo/EuY/9qQ==", + "resolved": "8.0.0", + "contentHash": "JOVOfqpnqlVLUzINQ2fox8evY2SKLYJ3BV8QDe/Jyp21u1T7r45x/R/5QdteURMR5r01GxeJSBBUOCOyaNXA3g==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0", - "Microsoft.Extensions.Primitives": "7.0.0" + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" } }, "Microsoft.Extensions.Primitives": { "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "um1KU5kxcRp3CNuI8o/GrZtD4AIOXDk+RLsytjZ9QPok3ttLUelLKpilVPuaFT3TFjOhSibUAso0odbOaCDj3Q==" + "resolved": "8.0.0", + "contentHash": "bXJEZrW9ny8vjMF1JV253WeLhpEVzFo1lyaZu1vQ4ZxWUlVvknZ/+ftFgVheLubb4eZPSwwxBeqS1JkCOjxd8g==" }, "Microsoft.Identity.Client": { "type": "Transitive", - "resolved": "4.45.0", - "contentHash": "ircobISCLWbtE5eEoLKU+ldfZ8O41vg4lcy38KRj/znH17jvBiAl8oxcyNp89CsuqE3onxIpn21Ca7riyDDrRw==", + "resolved": "4.56.0", + "contentHash": "rr4zbidvHy9r4NvOAs5hdd964Ao2A0pAeFBJKR95u1CJAVzbd1p6tPTXUZ+5ld0cfThiVSGvz6UHwY6JjraTpA==", "dependencies": { - "Microsoft.IdentityModel.Abstractions": "6.18.0" + "Microsoft.IdentityModel.Abstractions": "6.22.0" } }, "Microsoft.Identity.Client.Extensions.Msal": { "type": "Transitive", - "resolved": "2.19.3", - "contentHash": "zVVZjn8aW7W79rC1crioDgdOwaFTQorsSO6RgVlDDjc7MvbEGz071wSNrjVhzR0CdQn6Sefx7Abf1o7vasmrLg==", + "resolved": "4.56.0", + "contentHash": "H12YAzEGK55vZ+QpxUzozhW8ZZtgPDuWvgA0JbdIR9UhMUplj29JhIgE2imuH8W2Nw9D8JKygR1uxRFtpSNcrg==", "dependencies": { - "Microsoft.Identity.Client": "4.38.0", + "Microsoft.Identity.Client": "4.56.0", + "System.IO.FileSystem.AccessControl": "5.0.0", "System.Security.Cryptography.ProtectedData": "4.5.0" } }, "Microsoft.IdentityModel.Abstractions": { "type": "Transitive", - "resolved": "6.21.0", - "contentHash": "XeE6LQtD719Qs2IG7HDi1TSw9LIkDbJ33xFiOBoHbApVw/8GpIBCbW+t7RwOjErUDyXZvjhZliwRkkLb8Z1uzg==" + "resolved": "7.1.2", + "contentHash": "33eTIA2uO/L9utJjZWbKsMSVsQf7F8vtd6q5mQX7ZJzNvCpci5fleD6AeANGlbbb7WX7XKxq9+Dkb5e3GNDrmQ==" }, "Microsoft.IdentityModel.JsonWebTokens": { "type": "Transitive", - "resolved": "6.21.0", - "contentHash": "d3h1/BaMeylKTkdP6XwRCxuOoDJZ44V9xaXr6gl5QxmpnZGdoK3bySo3OQN8ehRLJHShb94ElLUvoXyglQtgAw==", + "resolved": "7.1.2", + "contentHash": "cloLGeZolXbCJhJBc5OC05uhrdhdPL6MWHuVUnkkUvPDeK7HkwThBaLZ1XjBQVk9YhxXE2OvHXnKi0PLleXxDg==", "dependencies": { - "Microsoft.IdentityModel.Tokens": "6.21.0" + "Microsoft.IdentityModel.Tokens": "7.1.2" } }, "Microsoft.IdentityModel.Logging": { "type": "Transitive", - "resolved": "6.21.0", - "contentHash": "tuEhHIQwvBEhMf8I50hy8FHmRSUkffDFP5EdLsSDV4qRcl2wvOPkQxYqEzWkh+ytW6sbdJGEXElGhmhDfAxAKg==", + "resolved": "7.1.2", + "contentHash": "YCxBt2EeJP8fcXk9desChkWI+0vFqFLvBwrz5hBMsoh0KJE6BC66DnzkdzkJNqMltLromc52dkdT206jJ38cTw==", "dependencies": { - "Microsoft.IdentityModel.Abstractions": "6.21.0" + "Microsoft.IdentityModel.Abstractions": "7.1.2" } }, "Microsoft.IdentityModel.Protocols": { "type": "Transitive", - "resolved": "6.21.0", - "contentHash": "0FqY5cTLQKtHrClzHEI+QxJl8OBT2vUiEQQB7UKk832JDiJJmetzYZ3AdSrPjN/3l3nkhByeWzXnhrX0JbifKg==", + "resolved": "7.1.2", + "contentHash": "SydLwMRFx6EHPWJ+N6+MVaoArN1Htt92b935O3RUWPY1yUF63zEjvd3lBu79eWdZUwedP8TN2I5V9T3nackvIQ==", "dependencies": { - "Microsoft.IdentityModel.Logging": "6.21.0", - "Microsoft.IdentityModel.Tokens": "6.21.0" + "Microsoft.IdentityModel.Logging": "7.1.2", + "Microsoft.IdentityModel.Tokens": "7.1.2" } }, "Microsoft.IdentityModel.Protocols.OpenIdConnect": { "type": "Transitive", - "resolved": "6.21.0", - "contentHash": "vtSKL7n6EnAsLyxmiviusm6LKrblT2ndnNqN6rvVq6iIHAnPCK9E2DkDx6h1Jrpy1cvbp40r0cnTg23nhEAGTA==", + "resolved": "7.1.2", + "contentHash": "6lHQoLXhnMQ42mGrfDkzbIOR3rzKM1W1tgTeMPLgLCqwwGw0d96xFi/UiX/fYsu7d6cD5MJiL3+4HuI8VU+sVQ==", "dependencies": { - "Microsoft.IdentityModel.Protocols": "6.21.0", - "System.IdentityModel.Tokens.Jwt": "6.21.0" + "Microsoft.IdentityModel.Protocols": "7.1.2", + "System.IdentityModel.Tokens.Jwt": "7.1.2" } }, "Microsoft.IdentityModel.Tokens": { "type": "Transitive", - "resolved": "6.21.0", - "contentHash": "AAEHZvZyb597a+QJSmtxH3n2P1nIJGpZ4Q89GTenknRx6T6zyfzf592yW/jA5e8EHN4tNMjjXHQaYWEq5+L05w==", + "resolved": "7.1.2", + "contentHash": "oICJMqr3aNEDZOwnH5SK49bR6Z4aX0zEAnOLuhloumOSuqnNq+GWBdQyrgILnlcT5xj09xKCP/7Y7gJYB+ls/g==", "dependencies": { - "Microsoft.CSharp": "4.5.0", - "Microsoft.IdentityModel.Logging": "6.21.0", - "System.Security.Cryptography.Cng": "4.5.0" + "Microsoft.IdentityModel.Logging": "7.1.2" } }, - "Microsoft.NETCore.Platforms": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "VyPlqzH2wavqquTcYpkIIAQ6WdenuKoFN0BdYBbCWsclXacSOHNQn66Gt4z5NBqEYW0FAPm5rlvki9ZiCij5xQ==" - }, - "Microsoft.NETCore.Targets": { - "type": "Transitive", - "resolved": "1.1.0", - "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==" - }, "Microsoft.OpenApi": { "type": "Transitive", "resolved": "1.2.3", @@ -342,245 +323,59 @@ }, "Microsoft.TestPlatform.ObjectModel": { "type": "Transitive", - "resolved": "17.7.2", - "contentHash": "aHzQWgDMVBnk39HhQVmn06w+YxzF1h2V5/M4WgrNQAn7q97GR4Si3vLRTDlmJo9nK/Nknce+H4tXx4gqOKyLeg==", + "resolved": "17.9.0", + "contentHash": "1ilw/8vgmjLyKU+2SKXKXaOqpYFJCQfGqGz+x0cosl981VzjrY74Sv6qAJv+neZMZ9ZMxF3ArN6kotaQ4uvEBw==", "dependencies": { - "NuGet.Frameworks": "6.5.0", "System.Reflection.Metadata": "1.6.0" } }, "Microsoft.TestPlatform.TestHost": { "type": "Transitive", - "resolved": "17.7.2", - "contentHash": "pv9yVD7IKPLJV28zYjLsWFiM3j506I2ye+6NquG8vsbm/gR7lgyig8IgY6Vo57VMvGaAKwtUECzcj+C5tH271Q==", + "resolved": "17.9.0", + "contentHash": "Spmg7Wx49Ya3SxBjyeAR+nQpjMTKZwTwpZ7KyeOTIqI/WHNPnBU4HUvl5kuHPQAwGWqMy4FGZja1HvEwvoaDiA==", "dependencies": { - "Microsoft.TestPlatform.ObjectModel": "17.7.2", + "Microsoft.TestPlatform.ObjectModel": "17.9.0", "Newtonsoft.Json": "13.0.1" } }, - "Microsoft.Win32.Primitives": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, - "Microsoft.Win32.Registry": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==", - "dependencies": { - "System.Security.AccessControl": "5.0.0", - "System.Security.Principal.Windows": "5.0.0" - } - }, "Microsoft.Win32.SystemEvents": { "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "Bh6blKG8VAKvXiLe2L+sEsn62nc1Ij34MrNxepD2OCrS5cpCwQa9MeLyhVQPQ/R4Wlzwuy6wMK8hLb11QPDRsQ==", - "dependencies": { - "Microsoft.NETCore.Platforms": "5.0.0" - } - }, - "NETStandard.Library": { - "type": "Transitive", - "resolved": "1.6.1", - "contentHash": "WcSp3+vP+yHNgS8EV5J7pZ9IRpeDuARBPN28by8zqff1wJQXm26PVU8L3/fYLBJVU7BtDyqNVWq2KlCVvSSR4A==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.Win32.Primitives": "4.3.0", - "System.AppContext": "4.3.0", - "System.Collections": "4.3.0", - "System.Collections.Concurrent": "4.3.0", - "System.Console": "4.3.0", - "System.Diagnostics.Debug": "4.3.0", - "System.Diagnostics.Tools": "4.3.0", - "System.Diagnostics.Tracing": "4.3.0", - "System.Globalization": "4.3.0", - "System.Globalization.Calendars": "4.3.0", - "System.IO": "4.3.0", - "System.IO.Compression": "4.3.0", - "System.IO.Compression.ZipFile": "4.3.0", - "System.IO.FileSystem": "4.3.0", - "System.IO.FileSystem.Primitives": "4.3.0", - "System.Linq": "4.3.0", - "System.Linq.Expressions": "4.3.0", - "System.Net.Http": "4.3.0", - "System.Net.Primitives": "4.3.0", - "System.Net.Sockets": "4.3.0", - "System.ObjectModel": "4.3.0", - "System.Reflection": "4.3.0", - "System.Reflection.Extensions": "4.3.0", - "System.Reflection.Primitives": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Runtime.Handles": "4.3.0", - "System.Runtime.InteropServices": "4.3.0", - "System.Runtime.InteropServices.RuntimeInformation": "4.3.0", - "System.Runtime.Numerics": "4.3.0", - "System.Security.Cryptography.Algorithms": "4.3.0", - "System.Security.Cryptography.Encoding": "4.3.0", - "System.Security.Cryptography.Primitives": "4.3.0", - "System.Security.Cryptography.X509Certificates": "4.3.0", - "System.Text.Encoding": "4.3.0", - "System.Text.Encoding.Extensions": "4.3.0", - "System.Text.RegularExpressions": "4.3.0", - "System.Threading": "4.3.0", - "System.Threading.Tasks": "4.3.0", - "System.Threading.Timer": "4.3.0", - "System.Xml.ReaderWriter": "4.3.0", - "System.Xml.XDocument": "4.3.0" - } + "resolved": "6.0.0", + "contentHash": "hqTM5628jSsQiv+HGpiq3WKBl2c8v1KZfby2J6Pr7pEPlK9waPdgEO6b8A/+/xn/yZ9ulv8HuqK71ONy2tg67A==" }, "Newtonsoft.Json": { "type": "Transitive", "resolved": "13.0.1", "contentHash": "ppPFpBcvxdsfUonNcvITKqLl3bqxWbDCZIzDWHzjpdAHRFfZe0Dw9HmA0+za13IdyrgJwpkDTDA9fHaxOrt20A==" }, - "NuGet.Frameworks": { - "type": "Transitive", - "resolved": "6.5.0", - "contentHash": "QWINE2x3MbTODsWT1Gh71GaGb5icBz4chS8VYvTgsBnsi8esgN6wtHhydd7fvToWECYGq7T4cgBBDiKD/363fg==" - }, - "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "HdSSp5MnJSsg08KMfZThpuLPJpPwE5hBXvHwoKWosyHHfe8Mh5WKT0ylEOf6yNzX6Ngjxe4Whkafh5q7Ymac4Q==" - }, - "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "+yH1a49wJMy8Zt4yx5RhJrxO/DBDByAiCzNwiETI+1S4mPdCu0OY4djdciC7Vssk0l22wQaDLrXxXkp+3+7bVA==" - }, - "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "c3YNH1GQJbfIPJeCnr4avseugSqPrxwIqzthYyZDN6EuOyNOzq+y2KSUfRcXauya1sF4foESTgwM5e1A8arAKw==" - }, - "runtime.native.System": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "c/qWt2LieNZIj1jGnVNsE2Kl23Ya2aSTBuXMD6V7k9KWr6l16Tqdwq+hJScEpWER9753NWC8h96PaVNY5Ld7Jw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0" - } - }, - "runtime.native.System.IO.Compression": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "INBPonS5QPEgn7naufQFXJEp3zX6L4bwHgJ/ZH78aBTpeNfQMtf7C6VrAFhlq2xxWBveIOWyFzQjJ8XzHMhdOQ==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0" - } - }, - "runtime.native.System.Net.Http": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "ZVuZJqnnegJhd2k/PtAbbIcZ3aZeITq3sj06oKfMBSfphW3HDmk/t4ObvbOk/JA/swGR0LNqMksAh/f7gpTROg==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0" - } - }, - "runtime.native.System.Security.Cryptography.Apple": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "DloMk88juo0OuOWr56QG7MNchmafTLYWvABy36izkrLI5VledI0rq28KGs1i9wbpeT9NPQrx/wTf8U2vazqQ3Q==", - "dependencies": { - "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": "4.3.0" - } - }, - "runtime.native.System.Security.Cryptography.OpenSsl": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "NS1U+700m4KFRHR5o4vo9DSlTmlCKu/u7dtE5sUHVIPB+xpXxYQvgBgA6wEIeCz6Yfn0Z52/72WYsToCEPJnrw==", - "dependencies": { - "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", - "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", - "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", - "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", - "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", - "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", - "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", - "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", - "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", - "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" - } - }, - "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "b3pthNgxxFcD+Pc0WSEoC0+md3MyhRS6aCEeenvNE3Fdw1HyJ18ZhRFVJJzIeR/O/jpxPboB805Ho0T3Ul7w8A==" - }, - "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "KeLz4HClKf+nFS7p/6Fi/CqyLXh81FpiGzcmuS8DGi9lUqSnZ6Es23/gv2O+1XVGfrbNmviF7CckBpavkBoIFQ==" - }, - "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "kVXCuMTrTlxq4XOOMAysuNwsXWpYeboGddNGpIgNSZmv1b6r/s/DPk0fYMB7Q5Qo4bY68o48jt4T4y5BVecbCQ==" - }, - "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "X7IdhILzr4ROXd8mI1BUCQMSHSQwelUlBjF1JyTKCjXaOGn2fB4EKBxQbCK2VjO3WaWIdlXZL3W6TiIVnrhX4g==" - }, - "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "nyFNiCk/r+VOiIqreLix8yN+q3Wga9+SE8BCgkf+2BwEKiNx6DyvFjCgkfV743/grxv8jHJ8gUK4XEQw7yzRYg==" - }, - "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "ytoewC6wGorL7KoCAvRfsgoJPJbNq+64k2SqW6JcOAebWsFUvCCYgfzQMrnpvPiEl4OrblUlhF2ji+Q1+SVLrQ==" - }, - "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "I8bKw2I8k58Wx7fMKQJn2R8lamboCAiHfHeV/pS65ScKWMMI0+wJkLYlEKvgW1D/XvSl/221clBoR2q9QNNM7A==" - }, - "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "VB5cn/7OzUfzdnC8tqAIMQciVLiq2epm2NrAm1E9OjNRyG4lVhfR61SMcLizejzQP8R8Uf/0l5qOIbUEi+RdEg==" - }, "SQLitePCLRaw.bundle_e_sqlite3": { "type": "Transitive", - "resolved": "2.1.4", - "contentHash": "EWI1olKDjFEBMJu0+3wuxwziIAdWDVMYLhuZ3Qs84rrz+DHwD00RzWPZCa+bLnHCf3oJwuFZIRsHT5p236QXww==", + "resolved": "2.1.6", + "contentHash": "BmAf6XWt4TqtowmiWe4/5rRot6GerAeklmOPfviOvwLoF5WwgxcJHAxZtySuyW9r9w+HLILnm8VfJFLCUJYW8A==", "dependencies": { - "SQLitePCLRaw.lib.e_sqlite3": "2.1.4", - "SQLitePCLRaw.provider.e_sqlite3": "2.1.4" + "SQLitePCLRaw.lib.e_sqlite3": "2.1.6", + "SQLitePCLRaw.provider.e_sqlite3": "2.1.6" } }, "SQLitePCLRaw.core": { "type": "Transitive", - "resolved": "2.1.4", - "contentHash": "inBjvSHo9UDKneGNzfUfDjK08JzlcIhn1+SP5Y3m6cgXpCxXKCJDy6Mka7LpgSV+UZmKSnC8rTwB0SQ0xKu5pA==", + "resolved": "2.1.6", + "contentHash": "wO6v9GeMx9CUngAet8hbO7xdm+M42p1XeJq47ogyRoYSvNSp0NGLI+MgC0bhrMk9C17MTVFlLiN6ylyExLCc5w==", "dependencies": { "System.Memory": "4.5.3" } }, "SQLitePCLRaw.lib.e_sqlite3": { "type": "Transitive", - "resolved": "2.1.4", - "contentHash": "2C9Q9eX7CPLveJA0rIhf9RXAvu+7nWZu1A2MdG6SD/NOu26TakGgL1nsbc0JAspGijFOo3HoN79xrx8a368fBg==" + "resolved": "2.1.6", + "contentHash": "2ObJJLkIUIxRpOUlZNGuD4rICpBnrBR5anjyfUFQep4hMOIeqW+XGQYzrNmHSVz5xSWZ3klSbh7sFR6UyDj68Q==" }, "SQLitePCLRaw.provider.e_sqlite3": { "type": "Transitive", - "resolved": "2.1.4", - "contentHash": "CSlb5dUp1FMIkez9Iv5EXzpeq7rHryVNqwJMWnpq87j9zWZexaEMdisDktMsnnrzKM6ahNrsTkjqNodTBPBxtQ==", + "resolved": "2.1.6", + "contentHash": "PQ2Oq3yepLY4P7ll145P3xtx2bX8xF4PzaKPRpw9jZlKvfe4LE/saAV82inND9usn1XRpmxXk7Lal3MTI+6CNg==", "dependencies": { - "SQLitePCLRaw.core": "2.1.4" + "SQLitePCLRaw.core": "2.1.6" } }, "Swashbuckle.AspNetCore.Swagger": { @@ -604,108 +399,29 @@ "resolved": "6.5.0", "contentHash": "OvbvxX+wL8skxTBttcBsVxdh73Fag4xwqEU2edh4JMn7Ws/xJHnY/JB1e9RoCb6XpDxUF3hD9A0Z1lEUx40Pfw==" }, - "System.AppContext": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "fKC+rmaLfeIzUhagxY17Q9siv/sPrjjKcfNg1Ic8IlQkZLipo8ljcaZQu4VtI4Jqbzjc2VTjzGLF6WmsRXAEgA==", - "dependencies": { - "System.Runtime": "4.3.0" - } - }, - "System.Buffers": { - "type": "Transitive", - "resolved": "4.5.1", - "contentHash": "Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==" - }, - "System.Collections": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, - "System.Collections.Concurrent": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "ztl69Xp0Y/UXCL+3v3tEU+lIy+bvjKNUmopn1wep/a291pVPK7dxBd6T7WnlQqRog+d1a/hSsgRsmFnIBKTPLQ==", - "dependencies": { - "System.Collections": "4.3.0", - "System.Diagnostics.Debug": "4.3.0", - "System.Diagnostics.Tracing": "4.3.0", - "System.Globalization": "4.3.0", - "System.Reflection": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Threading": "4.3.0", - "System.Threading.Tasks": "4.3.0" - } - }, "System.Configuration.ConfigurationManager": { "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "aM7cbfEfVNlEEOj3DsZP+2g9NRwbkyiAv2isQEzw7pnkDg9ekCU2m1cdJLM02Uq691OaCS91tooaxcEn8d0q5w==", - "dependencies": { - "System.Security.Cryptography.ProtectedData": "5.0.0", - "System.Security.Permissions": "5.0.0" - } - }, - "System.Console": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "DHDrIxiqk1h03m6khKWV2X8p/uvN79rgSqpilL6uzpmSfxfU5ng8VcPtW4qsDsQDHiTv6IPV9TmD5M/vElPNLg==", + "resolved": "6.0.1", + "contentHash": "jXw9MlUu/kRfEU0WyTptAVueupqIeE3/rl0EZDMlf8pcvJnitQ8HeVEp69rZdaStXwTV72boi/Bhw8lOeO+U2w==", "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.IO": "4.3.0", - "System.Runtime": "4.3.0", - "System.Text.Encoding": "4.3.0" - } - }, - "System.Diagnostics.Debug": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" + "System.Security.Cryptography.ProtectedData": "6.0.0", + "System.Security.Permissions": "6.0.0" } }, "System.Diagnostics.DiagnosticSource": { "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "tCQTzPsGZh/A9LhhA6zrqCRV4hOHsK90/G7q3Khxmn6tnB1PuNU0cRaKANP2AWcF9bn0zsuOoZOSrHuJk6oNBA==" - }, - "System.Diagnostics.Tools": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "UUvkJfSYJMM6x527dJg2VyWPSRqIVB0Z7dbjHst1zmwTXz5CcXSYJFWRpuigfbO1Lf7yfZiIaEUesfnl/g5EyA==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, - "System.Diagnostics.Tracing": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==", + "resolved": "6.0.1", + "contentHash": "KiLYDu2k2J82Q9BJpWiuQqCkFjRBWVq4jDzKKWawVi9KWzyD0XG3cmfX0vqTQlL14Wi9EufJrbL0+KCLTbqWiQ==", "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" + "System.Runtime.CompilerServices.Unsafe": "6.0.0" } }, "System.Drawing.Common": { "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "SztFwAnpfKC8+sEKXAFxCBWhKQaEd97EiOL7oZJZP56zbqnLpmxACWA8aGseaUExciuEAUuR9dY8f7HkTRAdnw==", + "resolved": "6.0.0", + "contentHash": "NfuoKUiP2nUWwKZN6twGqXioIe1zVD0RIj2t976A+czLHr2nY454RwwXs6JU9Htc6mwqL6Dn/nEL3dpVf2jOhg==", "dependencies": { - "Microsoft.Win32.SystemEvents": "5.0.0" + "Microsoft.Win32.SystemEvents": "6.0.0" } }, "System.Formats.Asn1": { @@ -713,156 +429,22 @@ "resolved": "5.0.0", "contentHash": "MTvUIktmemNB+El0Fgw9egyqT9AYSIk6DTJeoDSpc3GIHxHCMo8COqkWT1mptX5tZ1SlQ6HJZ0OsSvMth1c12w==" }, - "System.Globalization": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, - "System.Globalization.Calendars": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "GUlBtdOWT4LTV3I+9/PJW+56AnnChTaOqqTLFtdmype/L500M2LIyXgmtd9X2P2VOkmJd5c67H5SaC2QcL1bFA==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Globalization": "4.3.0", - "System.Runtime": "4.3.0" - } - }, - "System.Globalization.Extensions": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "FhKmdR6MPG+pxow6wGtNAWdZh7noIOpdD5TwQ3CprzgIE1bBBoim0vbR1+AWsWjQmU7zXHgQo4TWSP6lCeiWcQ==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "System.Globalization": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Runtime.InteropServices": "4.3.0" - } - }, "System.IdentityModel.Tokens.Jwt": { "type": "Transitive", - "resolved": "6.21.0", - "contentHash": "JRD8AuypBE+2zYxT3dMJomQVsPYsCqlyZhWel3J1d5nzQokSRyTueF+Q4ID3Jcu6zSZKuzOdJ1MLTkbQsDqcvQ==", - "dependencies": { - "Microsoft.IdentityModel.JsonWebTokens": "6.21.0", - "Microsoft.IdentityModel.Tokens": "6.21.0" - } - }, - "System.IO": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0", - "System.Text.Encoding": "4.3.0", - "System.Threading.Tasks": "4.3.0" - } - }, - "System.IO.Compression": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "YHndyoiV90iu4iKG115ibkhrG+S3jBm8Ap9OwoUAzO5oPDAWcr0SFwQFm0HjM8WkEZWo0zvLTyLmbvTkW1bXgg==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "System.Buffers": "4.3.0", - "System.Collections": "4.3.0", - "System.Diagnostics.Debug": "4.3.0", - "System.IO": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Runtime.Handles": "4.3.0", - "System.Runtime.InteropServices": "4.3.0", - "System.Text.Encoding": "4.3.0", - "System.Threading": "4.3.0", - "System.Threading.Tasks": "4.3.0", - "runtime.native.System": "4.3.0", - "runtime.native.System.IO.Compression": "4.3.0" - } - }, - "System.IO.Compression.ZipFile": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "G4HwjEsgIwy3JFBduZ9quBkAu+eUwjIdJleuNSgmUojbH6O3mlvEIme+GHx/cLlTAPcrnnL7GqvB9pTlWRfhOg==", - "dependencies": { - "System.Buffers": "4.3.0", - "System.IO": "4.3.0", - "System.IO.Compression": "4.3.0", - "System.IO.FileSystem": "4.3.0", - "System.IO.FileSystem.Primitives": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Text.Encoding": "4.3.0" - } - }, - "System.IO.FileSystem": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.IO": "4.3.0", - "System.IO.FileSystem.Primitives": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Handles": "4.3.0", - "System.Text.Encoding": "4.3.0", - "System.Threading.Tasks": "4.3.0" - } - }, - "System.IO.FileSystem.Primitives": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "6QOb2XFLch7bEc4lIcJH49nJN2HV+OC3fHDgsLVsBVBk3Y4hFAnOBGzJ2lUu7CyDDFo9IBWkSsnbkT6IBwwiMw==", + "resolved": "7.1.2", + "contentHash": "Thhbe1peAmtSBFaV/ohtykXiZSOkx59Da44hvtWfIMFofDA3M3LaVyjstACf2rKGn4dEDR2cUpRAZ0Xs/zB+7Q==", "dependencies": { - "System.Runtime": "4.3.0" + "Microsoft.IdentityModel.JsonWebTokens": "7.1.2", + "Microsoft.IdentityModel.Tokens": "7.1.2" } }, - "System.Linq": { + "System.IO.FileSystem.AccessControl": { "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "5DbqIUpsDp0dFftytzuMmc0oeMdQwjcP/EWxsksIz/w1TcFRkZ3yKKz0PqiYFMmEwPSWw+qNVqD7PJ889JzHbw==", - "dependencies": { - "System.Collections": "4.3.0", - "System.Diagnostics.Debug": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0" - } - }, - "System.Linq.Expressions": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "PGKkrd2khG4CnlyJwxwwaWWiSiWFNBGlgXvJpeO0xCXrZ89ODrQ6tjEWS/kOqZ8GwEOUATtKtzp1eRgmYNfclg==", + "resolved": "5.0.0", + "contentHash": "SxHB3nuNrpptVk+vZ/F+7OHEpoHUIKKMl02bUmYHQr1r+glbZQxs7pRtsf4ENO29TVm2TH3AEeep2fJcy92oYw==", "dependencies": { - "System.Collections": "4.3.0", - "System.Diagnostics.Debug": "4.3.0", - "System.Globalization": "4.3.0", - "System.IO": "4.3.0", - "System.Linq": "4.3.0", - "System.ObjectModel": "4.3.0", - "System.Reflection": "4.3.0", - "System.Reflection.Emit": "4.3.0", - "System.Reflection.Emit.ILGeneration": "4.3.0", - "System.Reflection.Emit.Lightweight": "4.3.0", - "System.Reflection.Extensions": "4.3.0", - "System.Reflection.Primitives": "4.3.0", - "System.Reflection.TypeExtensions": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Threading": "4.3.0" + "System.Security.AccessControl": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" } }, "System.Memory": { @@ -879,276 +461,33 @@ "System.Text.Json": "4.6.0" } }, - "System.Net.Http": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "sYg+FtILtRQuYWSIAuNOELwVuVsxVyJGWQyOnlAzhV4xvhyFnON1bAzYYC+jjRW8JREM45R0R5Dgi8MTC5sEwA==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "System.Collections": "4.3.0", - "System.Diagnostics.Debug": "4.3.0", - "System.Diagnostics.DiagnosticSource": "4.3.0", - "System.Diagnostics.Tracing": "4.3.0", - "System.Globalization": "4.3.0", - "System.Globalization.Extensions": "4.3.0", - "System.IO": "4.3.0", - "System.IO.FileSystem": "4.3.0", - "System.Net.Primitives": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Runtime.Handles": "4.3.0", - "System.Runtime.InteropServices": "4.3.0", - "System.Security.Cryptography.Algorithms": "4.3.0", - "System.Security.Cryptography.Encoding": "4.3.0", - "System.Security.Cryptography.OpenSsl": "4.3.0", - "System.Security.Cryptography.Primitives": "4.3.0", - "System.Security.Cryptography.X509Certificates": "4.3.0", - "System.Text.Encoding": "4.3.0", - "System.Threading": "4.3.0", - "System.Threading.Tasks": "4.3.0", - "runtime.native.System": "4.3.0", - "runtime.native.System.Net.Http": "4.3.0", - "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" - } - }, - "System.Net.Primitives": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0", - "System.Runtime.Handles": "4.3.0" - } - }, - "System.Net.Sockets": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.IO": "4.3.0", - "System.Net.Primitives": "4.3.0", - "System.Runtime": "4.3.0", - "System.Threading.Tasks": "4.3.0" - } - }, "System.Numerics.Vectors": { "type": "Transitive", "resolved": "4.5.0", "contentHash": "QQTlPTl06J/iiDbJCiepZ4H//BVraReU4O4EoRw1U02H5TLUIT7xn3GnDp9AXPSlJUDyFs4uWjWafNX6WrAojQ==" }, - "System.ObjectModel": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "bdX+80eKv9bN6K4N+d77OankKHGn6CH711a6fcOpMQu2Fckp/Ft4L/kW9WznHpyR0NRAvJutzOMHNNlBGvxQzQ==", - "dependencies": { - "System.Collections": "4.3.0", - "System.Diagnostics.Debug": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Threading": "4.3.0" - } - }, - "System.Reflection": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.IO": "4.3.0", - "System.Reflection.Primitives": "4.3.0", - "System.Runtime": "4.3.0" - } - }, - "System.Reflection.Emit": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "228FG0jLcIwTVJyz8CLFKueVqQK36ANazUManGaJHkO0icjiIypKW7YLWLIWahyIkdh5M7mV2dJepllLyA1SKg==", - "dependencies": { - "System.IO": "4.3.0", - "System.Reflection": "4.3.0", - "System.Reflection.Emit.ILGeneration": "4.3.0", - "System.Reflection.Primitives": "4.3.0", - "System.Runtime": "4.3.0" - } - }, - "System.Reflection.Emit.ILGeneration": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "59tBslAk9733NXLrUJrwNZEzbMAcu8k344OYo+wfSVygcgZ9lgBdGIzH/nrg3LYhXceynyvTc8t5/GD4Ri0/ng==", - "dependencies": { - "System.Reflection": "4.3.0", - "System.Reflection.Primitives": "4.3.0", - "System.Runtime": "4.3.0" - } - }, - "System.Reflection.Emit.Lightweight": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "oadVHGSMsTmZsAF864QYN1t1QzZjIcuKU3l2S9cZOwDdDueNTrqq1yRj7koFfIGEnKpt6NjpL3rOzRhs4ryOgA==", - "dependencies": { - "System.Reflection": "4.3.0", - "System.Reflection.Emit.ILGeneration": "4.3.0", - "System.Reflection.Primitives": "4.3.0", - "System.Runtime": "4.3.0" - } - }, - "System.Reflection.Extensions": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "rJkrJD3kBI5B712aRu4DpSIiHRtr6QlfZSQsb0hYHrDCZORXCFjQfoipo2LaMUHoT9i1B7j7MnfaEKWDFmFQNQ==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Reflection": "4.3.0", - "System.Runtime": "4.3.0" - } - }, "System.Reflection.Metadata": { "type": "Transitive", "resolved": "1.6.0", "contentHash": "COC1aiAJjCoA5GBF+QKL2uLqEBew4JsCkQmoHKbN3TlOZKa2fKLz5CpiRQKDz0RsAOEGsVKqOD5bomsXq/4STQ==" }, - "System.Reflection.Primitives": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, - "System.Reflection.TypeExtensions": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "7u6ulLcZbyxB5Gq0nMkQttcdBTx57ibzw+4IOXEfR+sXYQoHvjW5LTLyNr8O22UIMrqYbchJQJnos4eooYzYJA==", - "dependencies": { - "System.Reflection": "4.3.0", - "System.Runtime": "4.3.0" - } - }, - "System.Resources.ResourceManager": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Globalization": "4.3.0", - "System.Reflection": "4.3.0", - "System.Runtime": "4.3.0" - } - }, - "System.Runtime": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0" - } - }, "System.Runtime.Caching": { "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "30D6MkO8WF9jVGWZIP0hmCN8l9BTY4LCsAzLIe4xFSXzs+AjDotR7DpSmj27pFskDURzUvqYYY0ikModgBTxWw==", - "dependencies": { - "System.Configuration.ConfigurationManager": "5.0.0" - } - }, - "System.Runtime.Extensions": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, - "System.Runtime.Handles": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, - "System.Runtime.InteropServices": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", + "resolved": "6.0.0", + "contentHash": "E0e03kUp5X2k+UAoVl6efmI7uU7JRBWi5EIdlQ7cr0NpBGjHG4fWII35PgsBY9T4fJQ8E4QPsL0rKksU9gcL5A==", "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Reflection": "4.3.0", - "System.Reflection.Primitives": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Handles": "4.3.0" + "System.Configuration.ConfigurationManager": "6.0.0" } }, - "System.Runtime.InteropServices.RuntimeInformation": { + "System.Runtime.CompilerServices.Unsafe": { "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "cbz4YJMqRDR7oLeMRbdYv7mYzc++17lNhScCX0goO2XpGWdvAt60CGN+FHdePUEHCe/Jy9jUlvNAiNdM+7jsOw==", - "dependencies": { - "System.Reflection": "4.3.0", - "System.Reflection.Extensions": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.InteropServices": "4.3.0", - "System.Threading": "4.3.0", - "runtime.native.System": "4.3.0" - } - }, - "System.Runtime.Numerics": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "yMH+MfdzHjy17l2KESnPiF2dwq7T+xLnSJar7slyimAkUh/gTrS9/UQOtv7xarskJ2/XDSNvfLGOBQPjL7PaHQ==", - "dependencies": { - "System.Globalization": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0" - } + "resolved": "6.0.0", + "contentHash": "/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==" }, "System.Security.AccessControl": { "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "dagJ1mHZO3Ani8GH0PHpPEe/oYO+rVdbQjvjJkBRNQkX4t0r1iaeGn8+/ybkSLEan3/slM0t59SVdHzuHf2jmw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "5.0.0", - "System.Security.Principal.Windows": "5.0.0" - } - }, - "System.Security.Cryptography.Algorithms": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "W1kd2Y8mYSCgc3ULTAZ0hOP2dSdG5YauTb1089T0/kRcN2MpSAW1izOFROrJgxSlMn3ArsgHXagigyi+ibhevg==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "System.Collections": "4.3.0", - "System.IO": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Runtime.Handles": "4.3.0", - "System.Runtime.InteropServices": "4.3.0", - "System.Runtime.Numerics": "4.3.0", - "System.Security.Cryptography.Encoding": "4.3.0", - "System.Security.Cryptography.Primitives": "4.3.0", - "System.Text.Encoding": "4.3.0", - "runtime.native.System.Security.Cryptography.Apple": "4.3.0", - "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" - } + "resolved": "6.0.0", + "contentHash": "AUADIc0LIEQe7MzC+I0cl0rAT8RrTAKFHl53yHjEUzNVIaUlhFY11vc2ebiVJzVBuOzun6F7FBA+8KAbGTTedQ==" }, "System.Security.Cryptography.Cng": { "type": "Transitive", @@ -1158,123 +497,18 @@ "System.Formats.Asn1": "5.0.0" } }, - "System.Security.Cryptography.Csp": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "X4s/FCkEUnRGnwR3aSfVIkldBmtURMhmexALNTwpjklzxWU7yjMk7GHLKOZTNkgnWnE0q7+BCf9N2LVRWxewaA==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "System.IO": "4.3.0", - "System.Reflection": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Runtime.Handles": "4.3.0", - "System.Runtime.InteropServices": "4.3.0", - "System.Security.Cryptography.Algorithms": "4.3.0", - "System.Security.Cryptography.Encoding": "4.3.0", - "System.Security.Cryptography.Primitives": "4.3.0", - "System.Text.Encoding": "4.3.0", - "System.Threading": "4.3.0" - } - }, - "System.Security.Cryptography.Encoding": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "1DEWjZZly9ae9C79vFwqaO5kaOlI5q+3/55ohmq/7dpDyDfc8lYe7YVxJUZ5MF/NtbkRjwFRo14yM4OEo9EmDw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "System.Collections": "4.3.0", - "System.Collections.Concurrent": "4.3.0", - "System.Linq": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Runtime.Handles": "4.3.0", - "System.Runtime.InteropServices": "4.3.0", - "System.Security.Cryptography.Primitives": "4.3.0", - "System.Text.Encoding": "4.3.0", - "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" - } - }, - "System.Security.Cryptography.OpenSsl": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "h4CEgOgv5PKVF/HwaHzJRiVboL2THYCou97zpmhjghx5frc7fIvlkY1jL+lnIQyChrJDMNEXS6r7byGif8Cy4w==", - "dependencies": { - "System.Collections": "4.3.0", - "System.IO": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Runtime.Handles": "4.3.0", - "System.Runtime.InteropServices": "4.3.0", - "System.Runtime.Numerics": "4.3.0", - "System.Security.Cryptography.Algorithms": "4.3.0", - "System.Security.Cryptography.Encoding": "4.3.0", - "System.Security.Cryptography.Primitives": "4.3.0", - "System.Text.Encoding": "4.3.0", - "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" - } - }, - "System.Security.Cryptography.Primitives": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "7bDIyVFNL/xKeFHjhobUAQqSpJq9YTOpbEs6mR233Et01STBMXNAc/V+BM6dwYGc95gVh/Zf+iVXWzj3mE8DWg==", - "dependencies": { - "System.Diagnostics.Debug": "4.3.0", - "System.Globalization": "4.3.0", - "System.IO": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Threading": "4.3.0", - "System.Threading.Tasks": "4.3.0" - } - }, "System.Security.Cryptography.ProtectedData": { "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "HGxMSAFAPLNoxBvSfW08vHde0F9uh7BjASwu6JF9JnXuEPhCY3YUqURn0+bQV/4UWeaqymmrHWV+Aw9riQCtCA==" - }, - "System.Security.Cryptography.X509Certificates": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "t2Tmu6Y2NtJ2um0RtcuhP7ZdNNxXEgUm2JeoA/0NvlMjAhKCnM1NX07TDl3244mVp3QU6LPEhT3HTtH1uF7IYw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "System.Collections": "4.3.0", - "System.Diagnostics.Debug": "4.3.0", - "System.Globalization": "4.3.0", - "System.Globalization.Calendars": "4.3.0", - "System.IO": "4.3.0", - "System.IO.FileSystem": "4.3.0", - "System.IO.FileSystem.Primitives": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Runtime.Handles": "4.3.0", - "System.Runtime.InteropServices": "4.3.0", - "System.Runtime.Numerics": "4.3.0", - "System.Security.Cryptography.Algorithms": "4.3.0", - "System.Security.Cryptography.Cng": "4.3.0", - "System.Security.Cryptography.Csp": "4.3.0", - "System.Security.Cryptography.Encoding": "4.3.0", - "System.Security.Cryptography.OpenSsl": "4.3.0", - "System.Security.Cryptography.Primitives": "4.3.0", - "System.Text.Encoding": "4.3.0", - "System.Threading": "4.3.0", - "runtime.native.System": "4.3.0", - "runtime.native.System.Net.Http": "4.3.0", - "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" - } + "resolved": "6.0.0", + "contentHash": "rp1gMNEZpvx9vP0JW0oHLxlf8oSiQgtno77Y4PLUBjSiDYoD77Y8uXHr1Ea5XG4/pIKhqAdxZ8v8OTUtqo9PeQ==" }, "System.Security.Permissions": { "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "uE8juAhEkp7KDBCdjDIE3H9R1HJuEHqeqX8nLX9gmYKWwsqk3T5qZlPx8qle5DPKimC/Fy3AFTdV7HamgCh9qQ==", + "resolved": "6.0.0", + "contentHash": "T/uuc7AklkDoxmcJ7LGkyX1CcSviZuLCa4jg3PekfJ7SU0niF0IVTXwUiNVP9DSpzou2PpxJ+eNY2IfDM90ZCg==", "dependencies": { - "System.Security.AccessControl": "5.0.0", - "System.Windows.Extensions": "5.0.0" + "System.Security.AccessControl": "6.0.0", + "System.Windows.Extensions": "6.0.0" } }, "System.Security.Principal.Windows": { @@ -1282,73 +516,25 @@ "resolved": "5.0.0", "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" }, - "System.Text.Encoding": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, "System.Text.Encoding.CodePages": { "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "NyscU59xX6Uo91qvhOs2Ccho3AR2TnZPomo1Z0K6YpyztBPM/A5VbkzOO19sy3A3i1TtEnTxA7bCe3Us+r5MWg==", - "dependencies": { - "Microsoft.NETCore.Platforms": "5.0.0" - } - }, - "System.Text.Encoding.Extensions": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "YVMK0Bt/A43RmwizJoZ22ei2nmrhobgeiYwFzC4YAN+nue8RF6djXDMog0UCn+brerQoYVyaS+ghy9P/MUVcmw==", + "resolved": "6.0.0", + "contentHash": "ZFCILZuOvtKPauZ/j/swhvw68ZRi9ATCfvGbk1QfydmcXBkIWecWKn/250UH7rahZ5OoDBaiAudJtPvLwzw85A==", "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0", - "System.Text.Encoding": "4.3.0" + "System.Runtime.CompilerServices.Unsafe": "6.0.0" } }, "System.Text.Encodings.Web": { "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "OP6umVGxc0Z0MvZQBVigj4/U31Pw72ITihDWP9WiWDm+q5aoe0GaJivsfYGq53o6dxH7DcXWiCTl7+0o2CGdmg==" + "resolved": "8.0.0", + "contentHash": "yev/k9GHAEGx2Rg3/tU6MQh4HGBXJs70y7j1LaM1i/ER9po+6nnQ6RRqTJn1E7Xu0fbIFK80Nh5EoODxrbxwBQ==" }, "System.Text.Json": { "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "DaGSsVqKsn/ia6RG8frjwmJonfos0srquhw09TlT8KRw5I43E+4gs+/bZj4K0vShJ5H9imCuXupb4RmS+dBy3w==", - "dependencies": { - "System.Text.Encodings.Web": "7.0.0" - } - }, - "System.Text.RegularExpressions": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "RpT2DA+L660cBt1FssIE9CAGpLFdFPuheB7pLpKpn6ZXNby7jDERe8Ua/Ne2xGiwLVG2JOqziiaVCGDon5sKFA==", - "dependencies": { - "System.Runtime": "4.3.0" - } - }, - "System.Threading": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==", + "resolved": "8.0.0", + "contentHash": "OdrZO2WjkiEG6ajEFRABTRCi/wuXQPxeV6g8xvUJqdxMvvuCCEk86zPla8UiIQJz3durtUEbNyY/3lIhS0yZvQ==", "dependencies": { - "System.Runtime": "4.3.0", - "System.Threading.Tasks": "4.3.0" - } - }, - "System.Threading.Tasks": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" + "System.Text.Encodings.Web": "8.0.0" } }, "System.Threading.Tasks.Extensions": { @@ -1356,63 +542,12 @@ "resolved": "4.5.4", "contentHash": "zteT+G8xuGu6mS+mzDzYXbzS7rd3K6Fjb9RiZlYlJPam2/hU7JCBZBVEcywNuR+oZ1ncTvc/cq0faRr3P01OVg==" }, - "System.Threading.Timer": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "Z6YfyYTCg7lOZjJzBjONJTFKGN9/NIYKSxhU5GRd+DTwHSZyvWp1xuI5aR+dLg+ayyC5Xv57KiY4oJ0tMO89fQ==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, "System.Windows.Extensions": { "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "c1ho9WU9ZxMZawML+ssPKZfdnrg/OjR3pe0m9v8230z3acqphwvPJqzAkH54xRYm5ntZHGG1EPP3sux9H3qSPg==", - "dependencies": { - "System.Drawing.Common": "5.0.0" - } - }, - "System.Xml.ReaderWriter": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "GrprA+Z0RUXaR4N7/eW71j1rgMnEnEVlgii49GZyAjTH7uliMnrOU3HNFBr6fEDBCJCIdlVNq9hHbaDR621XBA==", - "dependencies": { - "System.Collections": "4.3.0", - "System.Diagnostics.Debug": "4.3.0", - "System.Globalization": "4.3.0", - "System.IO": "4.3.0", - "System.IO.FileSystem": "4.3.0", - "System.IO.FileSystem.Primitives": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Runtime.InteropServices": "4.3.0", - "System.Text.Encoding": "4.3.0", - "System.Text.Encoding.Extensions": "4.3.0", - "System.Text.RegularExpressions": "4.3.0", - "System.Threading.Tasks": "4.3.0", - "System.Threading.Tasks.Extensions": "4.3.0" - } - }, - "System.Xml.XDocument": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "5zJ0XDxAIg8iy+t4aMnQAu0MqVbqyvfoUVl1yDV61xdo3Vth45oA2FoY4pPkxYAH5f8ixpmTqXeEIya95x0aCQ==", + "resolved": "6.0.0", + "contentHash": "IXoJOXIqc39AIe+CIR7koBtRGMiCt/LPM3lI+PELtDIy9XdyeSrwXFdWV9dzJ2Awl0paLWUaknLxFQ5HpHZUog==", "dependencies": { - "System.Collections": "4.3.0", - "System.Diagnostics.Debug": "4.3.0", - "System.Diagnostics.Tools": "4.3.0", - "System.Globalization": "4.3.0", - "System.IO": "4.3.0", - "System.Reflection": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Text.Encoding": "4.3.0", - "System.Threading": "4.3.0", - "System.Xml.ReaderWriter": "4.3.0" + "System.Drawing.Common": "6.0.0" } }, "xunit.abstractions": { @@ -1422,77 +557,61 @@ }, "xunit.analyzers": { "type": "Transitive", - "resolved": "1.2.0", - "contentHash": "d3dehV/DASLRlR8stWQmbPPjfYC2tct50Evav+OlsJMkfFqkhYvzO1k0s81lk0px8O0knZU/FqC8SqbXOtn+hw==" + "resolved": "1.11.0", + "contentHash": "SCv+Ihxv+fCqotGeM8sVwLhw8nzAJ2aFRN5lcoKn9QtGdbVJ79JqDc+4u8/Ddnp2udxtmv+xYFWkHNlb/sk01w==" }, "xunit.assert": { "type": "Transitive", - "resolved": "2.5.0", - "contentHash": "wN84pKX5jzfpgJ0bB6arrCA/oelBeYLCpnQ9Wj5xGEVPydKzVSDY5tEatFLHE/rO0+0RC+I4H5igGE118jRh1w==", - "dependencies": { - "NETStandard.Library": "1.6.1" - } + "resolved": "2.7.0", + "contentHash": "CCTs3bUhmIS4tDwK6Cn/IiabG3RhYzdf65eIkO7u9/grKoN9MrN780LzVED3E8v+vwmmj7b5TW3/GFuZHPAzWA==" }, "xunit.core": { "type": "Transitive", - "resolved": "2.5.0", - "contentHash": "dnV0Mn2s1C0y2m33AylQyMkEyhBQsL4R0302kwSGiEGuY3JwzEmhTa9pnghyMRPliYSs4fXfkEAP+5bKXryGFg==", + "resolved": "2.7.0", + "contentHash": "98tzqYAbtc/p/2Ba455XTNbD12Qoo8kPehjC4oDT46CAsLli5JOCU9hFF2MV3HHWMw/Y3yFUV2Vcukplbs6kuA==", "dependencies": { - "xunit.extensibility.core": "[2.5.0]", - "xunit.extensibility.execution": "[2.5.0]" + "xunit.extensibility.core": "[2.7.0]", + "xunit.extensibility.execution": "[2.7.0]" } }, "xunit.extensibility.core": { "type": "Transitive", - "resolved": "2.5.0", - "contentHash": "xRm6NIV3i7I+LkjsAJ91Xz2fxJm/oMEi2CYq1G5HlGTgcK1Zo2wNbLO6nKX1VG5FZzXibSdoLwr/MofVvh3mFA==", + "resolved": "2.7.0", + "contentHash": "JLnx4PI0vn1Xr1Ust6ydrp2t/ktm2dyGPAVoDJV5gQuvBMSbd2K7WGzODa2ttiz030CeQ8nbsXl05+cvf7QNyA==", "dependencies": { - "NETStandard.Library": "1.6.1", "xunit.abstractions": "2.0.3" } }, "xunit.extensibility.execution": { "type": "Transitive", - "resolved": "2.5.0", - "contentHash": "7+v2Bvp+1ew1iMGQVb1glICi8jcNdHbRUX6Ru0dmJBViGdjiS7kyqcX2VxleQhFbKNi+WF0an7/TeTXD283RlQ==", + "resolved": "2.7.0", + "contentHash": "bjY+crT1jOyxKagFjCMdEVzoenO2v66ru8+CK/0UaXvyG4U9Q3UTieJkbQXbi7/1yZIK1sGh01l5/jh2CwLJtQ==", "dependencies": { - "NETStandard.Library": "1.6.1", - "xunit.extensibility.core": "[2.5.0]" + "xunit.extensibility.core": "[2.7.0]" } }, "conduit": { "type": "Project", "dependencies": { - "AutoMapper": "[12.0.1, )", - "AutoMapper.Extensions.Microsoft.DependencyInjection": "[12.0.1, )", + "AutoMapper": "[13.0.1, )", "FluentValidation.AspNetCore": "[11.3.0, )", - "MediatR": "[12.1.1, )", - "Microsoft.AspNetCore.Authentication.JwtBearer": "[7.0.10, )", - "Microsoft.EntityFrameworkCore.InMemory": "[7.0.10, )", - "Microsoft.EntityFrameworkCore.SqlServer": "[7.0.10, )", - "Microsoft.EntityFrameworkCore.Sqlite": "[7.0.10, )", - "Serilog": "[3.0.1, )", - "Serilog.Extensions.Logging": "[7.0.0, )", - "Serilog.Sinks.Console": "[4.1.0, )", + "MediatR": "[12.2.0, )", + "Microsoft.AspNetCore.Authentication.JwtBearer": "[8.0.2, )", + "Microsoft.EntityFrameworkCore.InMemory": "[8.0.2, )", + "Microsoft.EntityFrameworkCore.SqlServer": "[8.0.2, )", + "Microsoft.EntityFrameworkCore.Sqlite": "[8.0.2, )", + "Serilog": "[3.1.1, )", + "Serilog.Extensions.Logging": "[8.0.0, )", + "Serilog.Sinks.Console": "[5.0.1, )", "Swashbuckle.AspNetCore": "[6.5.0, )" } }, "AutoMapper": { "type": "CentralTransitive", - "requested": "[12.0.1, )", - "resolved": "12.0.1", - "contentHash": "hvV62vl6Hp/WfQ24yzo3Co9+OPl8wH8hApwVtgWpiAynVJkUcs7xvehnSftawL8Pe8FrPffBRM3hwzLQqWDNjA==", - "dependencies": { - "Microsoft.CSharp": "4.7.0" - } - }, - "AutoMapper.Extensions.Microsoft.DependencyInjection": { - "type": "CentralTransitive", - "requested": "[12.0.1, )", - "resolved": "12.0.1", - "contentHash": "+g/K+Vpe3gGMKGzjslMOdqNlkikScDjWfVvmWTayrDHaG/n2pPmFBMa+jKX1r/h6BDGFdkyRjAuhFE3ykW+r1g==", + "requested": "[13.0.1, )", + "resolved": "13.0.1", + "contentHash": "/Fx1SbJ16qS7dU4i604Sle+U9VLX+WSNVJggk6MupKVkYvvBm4XqYaeFuf67diHefHKHs50uQIS2YEDFhPCakQ==", "dependencies": { - "AutoMapper": "[12.0.1]", "Microsoft.Extensions.Options": "6.0.0" } }, @@ -1508,75 +627,75 @@ }, "MediatR": { "type": "CentralTransitive", - "requested": "[12.1.1, )", - "resolved": "12.1.1", - "contentHash": "1AbwzzeS6gn4NdcO6A9LfKS5TXXgAiUQM3J18dREHa7O7TrdCXJ5dNFeRBpzPZY7UWl5Kby+n9pWrPJe3SDiMA==", + "requested": "[12.2.0, )", + "resolved": "12.2.0", + "contentHash": "8TUFrHapKi6D74PhnSNEguRsH91HNGyP3R4ZQdgDorJgl9Wac5Prh0vA33QfrniAaS6L2xNNhc6vxzg+5AIbwA==", "dependencies": { "MediatR.Contracts": "[2.0.1, 3.0.0)", - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0" + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" } }, "Microsoft.AspNetCore.Authentication.JwtBearer": { "type": "CentralTransitive", - "requested": "[7.0.10, )", - "resolved": "7.0.10", - "contentHash": "8/GWtq034kzrDapCHYbAnnJXIYAJzFcJoXP5OtlbjIWBQBLxEbstRv3N4DJAvlcGUXxy0DmmNVDiSlFAY8HpWw==", + "requested": "[8.0.2, )", + "resolved": "8.0.2", + "contentHash": "7qJkk5k5jabATZZrMIQgpUB9yjDNAAApSqw+8d0FEyK1AJ4j+wv1qOMl2byUr837xbK+MjehtPnQ32yZ5Gtzlw==", "dependencies": { - "Microsoft.IdentityModel.Protocols.OpenIdConnect": "6.15.1" + "Microsoft.IdentityModel.Protocols.OpenIdConnect": "7.1.2" } }, "Microsoft.EntityFrameworkCore.InMemory": { "type": "CentralTransitive", - "requested": "[7.0.10, )", - "resolved": "7.0.10", - "contentHash": "WeUjWx80ZVQVXkHuEIO4kOCKUHo6C4RdB1bJZLSngLWqwrQrMTCZE90IGBz0330GXmXKbL4LyJO/rXO/w7cRNA==", + "requested": "[8.0.2, )", + "resolved": "8.0.2", + "contentHash": "vPpioRk+6BwQf/apqBQQ2gLL/6FMOj25L6d2lli08FmRh2W9QrnShyKhzsDAydWcH6Po69gQXgHbBQFAafmo3A==", "dependencies": { - "Microsoft.EntityFrameworkCore": "7.0.10" + "Microsoft.EntityFrameworkCore": "8.0.2" } }, "Microsoft.EntityFrameworkCore.Sqlite": { "type": "CentralTransitive", - "requested": "[7.0.10, )", - "resolved": "7.0.10", - "contentHash": "gGOZWOvpRDC2bQAUNwpYzjYRTFbSJKNK60KOnvrstvvKKeM/4dVo7i0dxIvZaHpUuIRnlDybBrSK253/BBsfhg==", + "requested": "[8.0.2, )", + "resolved": "8.0.2", + "contentHash": "tnpTylrGLYUKZ+Jw8Y5PmROYhIvqA51EqYRdHgUDCFsVbs3AKsw3SY1reaZk/tBfWHtC7nWR+IN2MwYrdtkgTQ==", "dependencies": { - "Microsoft.EntityFrameworkCore.Sqlite.Core": "7.0.10", - "SQLitePCLRaw.bundle_e_sqlite3": "2.1.4" + "Microsoft.EntityFrameworkCore.Sqlite.Core": "8.0.2", + "SQLitePCLRaw.bundle_e_sqlite3": "2.1.6" } }, "Microsoft.EntityFrameworkCore.SqlServer": { "type": "CentralTransitive", - "requested": "[7.0.10, )", - "resolved": "7.0.10", - "contentHash": "qRMzze1QbKa2vhlhjTxwjhJUMCI4qVDFWQCRq9Pdgf9mC+xLz0ZT/4ALEa0oZRicGzPZAqIIhKrHNAjgD4GsAQ==", + "requested": "[8.0.2, )", + "resolved": "8.0.2", + "contentHash": "tAS5mYr/mwCXZVC5dyJlzdKHK0MLU0TAxNcc30xi7XLju8DE3S0Y206Yfi/MyuzLjulQRq9n2vjieeCxOnQfkg==", "dependencies": { - "Microsoft.Data.SqlClient": "5.0.2", - "Microsoft.EntityFrameworkCore.Relational": "7.0.10" + "Microsoft.Data.SqlClient": "5.1.4", + "Microsoft.EntityFrameworkCore.Relational": "8.0.2" } }, "Serilog": { "type": "CentralTransitive", - "requested": "[3.0.1, )", - "resolved": "3.0.1", - "contentHash": "E4UmOQ++eNJax1laE+lws7E3zbhKgHsGJbO7ra0yE5smUh+5FfUPIKKBxM3MO1tK4sgpQke6/pLReDxIc/ggNw==" + "requested": "[3.1.1, )", + "resolved": "3.1.1", + "contentHash": "P6G4/4Kt9bT635bhuwdXlJ2SCqqn2nhh4gqFqQueCOr9bK/e7W9ll/IoX1Ter948cV2Z/5+5v8pAfJYUISY03A==" }, "Serilog.Extensions.Logging": { "type": "CentralTransitive", - "requested": "[7.0.0, )", - "resolved": "7.0.0", - "contentHash": "9faU0zNQqU7I6soVhLUMYaGNpgWv6cKlKb2S5AnS8gXxzW/em5Ladm/6FMrWTnX41cdbdGPOWNAo6adi4WaJ6A==", + "requested": "[8.0.0, )", + "resolved": "8.0.0", + "contentHash": "YEAMWu1UnWgf1c1KP85l1SgXGfiVo0Rz6x08pCiPOIBt2Qe18tcZLvdBUuV5o1QHvrs8FAry9wTIhgBRtjIlEg==", "dependencies": { - "Microsoft.Extensions.Logging": "7.0.0", - "Serilog": "2.12.0" + "Microsoft.Extensions.Logging": "8.0.0", + "Serilog": "3.1.1" } }, "Serilog.Sinks.Console": { "type": "CentralTransitive", - "requested": "[4.1.0, )", - "resolved": "4.1.0", - "contentHash": "K6N5q+5fetjnJPvCmkWOpJ/V8IEIoMIB1s86OzBrbxwTyHxdx3pmz4H+8+O/Dc/ftUX12DM1aynx/dDowkwzqg==", + "requested": "[5.0.1, )", + "resolved": "5.0.1", + "contentHash": "6Jt8jl9y2ey8VV7nVEUAyjjyxjAQuvd5+qj4XYAT9CwcsvR70HHULGBeD+K2WCALFXf7CFsNQT4lON6qXcu2AA==", "dependencies": { - "Serilog": "2.10.0" + "Serilog": "3.1.1" } }, "Swashbuckle.AspNetCore": {