Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature/more detailed errors #161

Merged
merged 14 commits into from
Nov 27, 2021
10 changes: 5 additions & 5 deletions .github/workflows/api_ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -52,13 +52,13 @@ jobs:
dotnet DeUrgenta.Domains.Migrator.dll
env:
# Connection strings
ConnectionStrings__DbConnectionString: Server=localhost;Port=5432;Database=de-urgenta-test-db;User Id=git-ci;Password=git-ci-pass;
ConnectionStrings__IdentityDbConnectionString: Server=localhost;Port=5432;Database=de-urgenta-test-db;User Id=git-ci;Password=git-ci-pass;
ConnectionStrings__I18nDbConnectionString: Server=localhost;Port=5432;Database=de-urgenta-test-db;User Id=git-ci;Password=git-ci-pass;
ConnectionStrings__JobsConnectionString: Server=localhost;Port=5432;Database=de-urgenta-test-db;User Id=git-ci;Password=git-ci-pass;
ConnectionStrings__DbConnectionString: Server=localhost;Port=5432;Database=de-urgenta-test-db;User Id=git-ci;Password=git-ci-pass;Include Error Detail=true;
ConnectionStrings__IdentityDbConnectionString: Server=localhost;Port=5432;Database=de-urgenta-test-db;User Id=git-ci;Password=git-ci-pass;Include Error Detail=true;
ConnectionStrings__I18nDbConnectionString: Server=localhost;Port=5432;Database=de-urgenta-test-db;User Id=git-ci;Password=git-ci-pass;Include Error Detail=true;
ConnectionStrings__JobsConnectionString: Server=localhost;Port=5432;Database=de-urgenta-test-db;User Id=git-ci;Password=git-ci-pass;Include Error Detail=true;

- name: Run unit & integration tests
run: dotnet test --no-build --verbosity normal /p:CollectCoverage=true /p:CoverletOutputFormat=opencover DeUrgenta.sln
env:
# Connection string
ConnectionStrings__TestingDbConnectionString: Server=localhost;Port=5432;Database=de-urgenta-test-db;User Id=git-ci;Password=git-ci-pass;
ConnectionStrings__TestingDbConnectionString: Server=localhost;Port=5432;Database=de-urgenta-test-db;User Id=git-ci;Password=git-ci-pass;Include Error Detail=true;
12 changes: 6 additions & 6 deletions .github/workflows/jobs_ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -52,15 +52,15 @@ jobs:
dotnet DeUrgenta.Domains.Migrator.dll
env:
# Connection strings
ConnectionStrings__DbConnectionString: Server=localhost;Port=5432;Database=de-urgenta-test-db;User Id=git-ci;Password=git-ci-pass;
ConnectionStrings__IdentityDbConnectionString: Server=localhost;Port=5432;Database=de-urgenta-test-db;User Id=git-ci;Password=git-ci-pass;
ConnectionStrings__I18nDbConnectionString: Server=localhost;Port=5432;Database=de-urgenta-test-db;User Id=git-ci;Password=git-ci-pass;
ConnectionStrings__JobsConnectionString: Server=localhost;Port=5432;Database=de-urgenta-test-db;User Id=git-ci;Password=git-ci-pass;
ConnectionStrings__DbConnectionString: Server=localhost;Port=5432;Database=de-urgenta-test-db;User Id=git-ci;Password=git-ci-pass;Include Error Detail=true;
ConnectionStrings__IdentityDbConnectionString: Server=localhost;Port=5432;Database=de-urgenta-test-db;User Id=git-ci;Password=git-ci-pass;Include Error Detail=true;
ConnectionStrings__I18nDbConnectionString: Server=localhost;Port=5432;Database=de-urgenta-test-db;User Id=git-ci;Password=git-ci-pass;Include Error Detail=true;
ConnectionStrings__JobsConnectionString: Server=localhost;Port=5432;Database=de-urgenta-test-db;User Id=git-ci;Password=git-ci-pass;Include Error Detail=true;

- name: Run unit & integration tests
run: dotnet test --no-build --verbosity normal /p:CollectCoverage=true /p:CoverletOutputFormat=opencover DeUrgenta.RecurringJobs.sln
env:
# Connection string
ConnectionStrings__TestingDbConnectionString: Server=localhost;Port=5432;Database=de-urgenta-test-db;User Id=git-ci;Password=git-ci-pass;
ConnectionStrings__JobsTestingDbConnectionString: Server=localhost;Port=5432;Database=de-urgenta-test-db;User Id=git-ci;Password=git-ci-pass;
ConnectionStrings__TestingDbConnectionString: Server=localhost;Port=5432;Database=de-urgenta-test-db;User Id=git-ci;Password=git-ci-pass;Include Error Detail=true;
ConnectionStrings__JobsTestingDbConnectionString: Server=localhost;Port=5432;Database=de-urgenta-test-db;User Id=git-ci;Password=git-ci-pass;Include Error Detail=true;

2 changes: 2 additions & 0 deletions Src/DeUrgenta.Admin.Api/BootstrappingExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,11 @@ public static IServiceCollection AddAdminApiServices(this IServiceCollection ser
services.AddTransient<IValidateRequest<DeleteBlogPost>, DeleteBlogPostValidator>();
services.AddTransient<IValidateRequest<UpdateBlogPost>, UpdateBlogPostValidator>();
services.AddTransient<IValidateRequest<GetBlogPosts>, GetBlogPostsValidator>();
services.AddTransient<IValidateRequest<AddOrUpdateContent>, AddOrUpdateContentValidator>();

services.AddTransient<IValidator<BlogPostRequest>, BlogPostRequestValidator>();
services.AddTransient<IValidator<EventRequest>, EventRequestValidator>();
services.AddTransient<IValidator<AddOrUpdateContentModel>, AddOrUpdateContentModelValidator>();

return services;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
using System.Threading;
using System.Threading.Tasks;
using CSharpFunctionalExtensions;
using DeUrgenta.Admin.Api.Commands;
using DeUrgenta.Common.Validation;
using DeUrgenta.I18n.Service.Models;
using DeUrgenta.I18n.Service.Providers;
using MediatR;

namespace DeUrgenta.Admin.Api.CommandHandlers
{
public class AddOrUpdateContentHandler : IRequestHandler<AddOrUpdateContent, Result<StringResourceModel, ValidationResult>>
{
private readonly IAmContentProvider _contentProvider;
private readonly IValidateRequest<AddOrUpdateContent> _validator;

public AddOrUpdateContentHandler(IAmContentProvider contentProvider, IValidateRequest<AddOrUpdateContent> validator)
{
_contentProvider = contentProvider;
_validator = validator;
}

public async Task<Result<StringResourceModel, ValidationResult>> Handle(AddOrUpdateContent request, CancellationToken cancellationToken)
{
var validationResult = await _validator.IsValidAsync(request);
if (validationResult.IsFailure)
{
return validationResult;
}

var updatedContent = await _contentProvider.AddOrUpdateContentValue(request.Culture,
request.Key, request.Value);

return updatedContent;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ public CreateEventHandler(IValidateRequest<CreateEvent> validator, DeUrgentaCont
{
Title = request.Event.Title,
Author = request.Event.Author,
City = request.Event.City,
Locality = request.Event.Locality,
ContentBody = request.Event.ContentBody,
EventType = eventType,
OccursOn = request.Event.OccursOn,
Expand All @@ -55,7 +55,7 @@ public CreateEventHandler(IValidateRequest<CreateEvent> validator, DeUrgentaCont
Title = @event.Title,
Address = @event.Address,
Author = @event.Author,
City = @event.City,
City = @event.Locality,
IsArchived = @event.IsArchived,
ContentBody = @event.ContentBody,
EventType = eventType.Name,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ public UpdateEventHandler(IValidateRequest<UpdateEvent> validator, DeUrgentaCont

@event.Address = request.Event.Address;
@event.Author = request.Event.Author;
@event.City = request.Event.City;
@event.Locality = request.Event.Locality;
@event.ContentBody = request.Event.ContentBody;
@event.EventType = eventType;
@event.OccursOn = request.Event.OccursOn;
Expand All @@ -52,7 +52,7 @@ public UpdateEventHandler(IValidateRequest<UpdateEvent> validator, DeUrgentaCont
Title = @event.Title,
Address = @event.Address,
Author = @event.Author,
City = @event.City,
City = @event.Locality,
ContentBody = @event.ContentBody,
EventType = eventType.Name,
OccursOn = @event.OccursOn,
Expand Down
21 changes: 21 additions & 0 deletions Src/DeUrgenta.Admin.Api/Commands/AddOrUpdateContent.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
using CSharpFunctionalExtensions;
using DeUrgenta.Common.Validation;
using DeUrgenta.I18n.Service.Models;
using MediatR;

namespace DeUrgenta.Admin.Api.Commands
{
public class AddOrUpdateContent : IRequest<Result<StringResourceModel, ValidationResult>>
{
public string Culture { get; }
public string Key { get; }
public string Value { get; }

public AddOrUpdateContent(string culture, string key, string value)
{
Culture = culture;
Key = key;
Value = value;
}
}
}
14 changes: 8 additions & 6 deletions Src/DeUrgenta.Admin.Api/Controller/AdminBlogController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
using DeUrgenta.Admin.Api.Models;
using DeUrgenta.Admin.Api.Queries;
using DeUrgenta.Admin.Api.Swagger.Blog;
using DeUrgenta.Common.Extensions;
using DeUrgenta.Common.Mappers;
using DeUrgenta.Common.Models.Pagination;
using DeUrgenta.Common.Swagger;
using MediatR;
Expand All @@ -24,10 +24,12 @@ namespace DeUrgenta.Admin.Api.Controller
public class AdminBlogController : ControllerBase
{
private readonly IMediator _mediator;
private readonly IResultMapper _mapper;

public AdminBlogController(IMediator mediator)
public AdminBlogController(IMediator mediator, IResultMapper mapper)
{
_mediator = mediator;
_mapper = mapper;
}

/// <summary>
Expand All @@ -45,7 +47,7 @@ public AdminBlogController(IMediator mediator)
var query = new GetBlogPosts(pagination);
var result = await _mediator.Send(query);

return result.ToActionResult();
return await _mapper.MapToActionResult(result);
}

/// <summary>
Expand All @@ -65,7 +67,7 @@ public async Task<ActionResult<BlogPostModel>> CreateNewBlogPostAsync([FromBody]
var command = new CreateBlogPost(blogPost);
var result = await _mediator.Send(command);

return result.ToActionResult();
return await _mapper.MapToActionResult(result);
}

/// <summary>
Expand All @@ -86,7 +88,7 @@ public async Task<ActionResult<BlogPostModel>> CreateNewBlogPostAsync([FromBody]
var command = new UpdateBlogPost(blogPostId, blogPost);
var result = await _mediator.Send(command);

return result.ToActionResult();
return await _mapper.MapToActionResult(result);
}

/// <summary>
Expand All @@ -104,7 +106,7 @@ public async Task<IActionResult> DeleteBlogPostAsync([FromRoute] Guid blogPostId
var command = new DeleteBlogPost(blogPostId);
var result = await _mediator.Send(command);

return result.ToActionResult();
return await _mapper.MapToActionResult(result);
}
}
}
14 changes: 8 additions & 6 deletions Src/DeUrgenta.Admin.Api/Controller/AdminEventsController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
using DeUrgenta.Admin.Api.Models;
using DeUrgenta.Admin.Api.Queries;
using DeUrgenta.Admin.Api.Swagger.Events;
using DeUrgenta.Common.Extensions;
using DeUrgenta.Common.Mappers;
using DeUrgenta.Common.Models.Events;
using DeUrgenta.Common.Models.Pagination;
using DeUrgenta.Common.Swagger;
Expand All @@ -25,10 +25,12 @@ namespace DeUrgenta.Admin.Api.Controller
public class AdminEventsController : ControllerBase
{
private readonly IMediator _mediator;
private readonly IResultMapper _mapper;

public AdminEventsController(IMediator mediator)
public AdminEventsController(IMediator mediator, IResultMapper mapper)
{
_mediator = mediator;
_mapper = mapper;
}

/// <summary>
Expand All @@ -46,7 +48,7 @@ public async Task<ActionResult<PagedResult<EventResponseModel>>> GetEventsAsync(
var query = new GetEvents(pagination);
var result = await _mediator.Send(query);

return result.ToActionResult();
return await _mapper.MapToActionResult(result);
}

/// <summary>
Expand All @@ -67,7 +69,7 @@ public async Task<ActionResult<EventResponseModel>> CreateNewEventAsync([FromBod
var command = new CreateEvent(eventModel);
var result = await _mediator.Send(command);

return result.ToActionResult();
return await _mapper.MapToActionResult(result);
}

/// <summary>
Expand All @@ -89,7 +91,7 @@ public async Task<ActionResult<EventResponseModel>> UpdateEventAsync([FromRoute]
var command = new UpdateEvent(eventId, eventModel);
var result = await _mediator.Send(command);

return result.ToActionResult();
return await _mapper.MapToActionResult(result);
}

/// <summary>
Expand All @@ -109,7 +111,7 @@ public async Task<IActionResult> DeleteEventAsync([FromRoute] Guid eventId)
var command = new DeleteEvent(eventId);
var result = await _mediator.Send(command);

return result.ToActionResult();
return await _mapper.MapToActionResult(result);
}
}
}
32 changes: 17 additions & 15 deletions Src/DeUrgenta.Admin.Api/Controller/AdminLocalizationController.cs
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
using System.Threading.Tasks;
using DeUrgenta.Admin.Api.Commands;
using DeUrgenta.Admin.Api.Models;
using DeUrgenta.Admin.Api.Swagger.AdminLocalization;
using DeUrgenta.Common.Mappers;
using DeUrgenta.Common.Swagger;
using DeUrgenta.I18n.Service.Models;
using DeUrgenta.I18n.Service.Providers;
using MediatR;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
Expand All @@ -19,15 +22,19 @@ namespace DeUrgenta.Admin.Api.Controller
[Route("admin/content")]
public class AdminLocalizationController : ControllerBase
{
private readonly IamI18nProvider _i18NProvider;
private readonly IamI18nProvider _i18nProvider;
private readonly IMediator _mediator;
private readonly IResultMapper _mapper;

public AdminLocalizationController(IamI18nProvider i18NProvider)
public AdminLocalizationController(IamI18nProvider i18NProvider, IMediator mediator, IResultMapper mapper)
{
_i18NProvider = i18NProvider;
_i18nProvider = i18NProvider;
_mediator = mediator;
_mapper = mapper;
}

/// <summary>
/// Get available content for specifc key
/// Get available content for specific key
/// </summary>
[SwaggerResponse(StatusCodes.Status200OK, "Available Content for key", typeof(StringResourceModel))]
[SwaggerResponse(StatusCodes.Status400BadRequest, "A business rule was violated", typeof(ProblemDetails))]
Expand All @@ -40,7 +47,7 @@ public AdminLocalizationController(IamI18nProvider i18NProvider)
[HttpGet]
public async Task<IActionResult> GetString(string key)
{
var text = await _i18NProvider.Localize(key);
var text = await _i18nProvider.Localize(key);
return Ok(new StringResourceModel { Key = key, Value = text });
}

Expand All @@ -51,21 +58,16 @@ public async Task<IActionResult> GetString(string key)
[SwaggerResponse(StatusCodes.Status400BadRequest, "A business rule was violated", typeof(ProblemDetails))]
[SwaggerResponse(StatusCodes.Status500InternalServerError, "Something bad happened", typeof(ProblemDetails))]

[SwaggerResponseExample(StatusCodes.Status200OK,
typeof(AddOrUpdateContentResponseExample))]
[SwaggerRequestExample(typeof(AddOrUpdateContentModel),
typeof(AddOrUpdateContentRequestExample))]
[SwaggerResponseExample(StatusCodes.Status200OK, typeof(AddOrUpdateContentResponseExample))]
[SwaggerRequestExample(typeof(AddOrUpdateContentModel), typeof(AddOrUpdateContentRequestExample))]
[SwaggerResponseExample(StatusCodes.Status400BadRequest, typeof(BusinessRuleViolationResponseExample))]
[SwaggerResponseExample(StatusCodes.Status500InternalServerError, typeof(ApplicationErrorResponseExample))]
[HttpPost]
public async Task<ActionResult<StringResourceModel>> AddOrUpdateContent(AddOrUpdateContentModel contentModel)
public async Task<ActionResult<StringResourceModel>> AddOrUpdateContent(AddOrUpdateContentModel model)
{
var updatedContent = await _i18NProvider.AddOrUpdateContentValue(contentModel.Culture,
contentModel.Key, contentModel.Value);

if (updatedContent == null) return BadRequest("Specified culture does not exist");
var result = await _mediator.Send(new AddOrUpdateContent(model.Culture, model.Key, model.Value));

return Ok(updatedContent);
return await _mapper.MapToActionResult(result);
}
}
}
2 changes: 1 addition & 1 deletion Src/DeUrgenta.Admin.Api/Models/EventRequest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ public sealed record EventRequest

public string Author { get; init; }

public string City { get; init; }
public string Locality { get; init; }

public int EventTypeId { get; init; }

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ public GetEventsHandler(IValidateRequest<GetEvents> validator, DeUrgentaContext
OccursOn = x.OccursOn,
OrganizedBy = x.OrganizedBy,
PublishedOn = x.PublishedOn,
City = x.City,
City = x.Locality,
EventType = x.EventType.Name,
IsArchived = x.IsArchived
})
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,3 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using DeUrgenta.Admin.Api.Models;
using Swashbuckle.AspNetCore.Filters;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,3 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using DeUrgenta.I18n.Service.Models;
using Swashbuckle.AspNetCore.Filters;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,3 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using DeUrgenta.I18n.Service.Models;
using Swashbuckle.AspNetCore.Filters;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ public EventRequest GetExamples()
Title = "Curs relativ prim ajutor",
OccursOn = DateTime.Today.AddDays(30),
OrganizedBy = "Crucea rosie",
City = "Suceava",
Locality = "Suceava",
EventTypeId = 1,
Address = "some address",
IsArchived = false
Expand Down
Loading