Skip to content

Commit

Permalink
add response types for portal-controller
Browse files Browse the repository at this point in the history
  • Loading branch information
Jossilainen committed Jul 12, 2024
1 parent 1f2a1b1 commit 892d638
Show file tree
Hide file tree
Showing 4 changed files with 90 additions and 24 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ public async Task<Unit> Handle(AddContextAppToPortalCommand command, Cancellatio

if (fusionContext == null)
{
throw new InvalidActionException($"Cannot add app '{command.AppKey} to '{command.PortalId}'. Missing context parameter.");
throw new InvalidOperationException($"Cannot add app '{command.AppKey} to '{command.PortalId}'. Missing context parameter.");
}

var onboardedContext = await _readWriteContext.Set<OnboardedContext>()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ public async Task<Unit> Handle(AddContextTypeToPortalCommand command, Cancellati

if (contextType == null)
{
throw new InvalidActionException($"context-type: {command.Type} is not supported");
throw new InvalidOperationException($"context-type: {command.Type} is not supported");
}

portalWithAllContextTypes.AddContextType(contextType);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using Equinor.ProjectExecutionPortal.Application.Helpers;
using Equinor.ProjectExecutionPortal.Application.Services.ContextTypeService;
using Equinor.ProjectExecutionPortal.Domain.Common.Exceptions;
using Equinor.ProjectExecutionPortal.Domain.Entities;
using Equinor.ProjectExecutionPortal.Infrastructure;
using MediatR;
Expand Down Expand Up @@ -43,7 +44,7 @@ public async Task<Guid> Handle(CreatePortalCommand command, CancellationToken ca
var slug = SlugHelper.Sluggify(command.Name);

var portal = new Portal(slug, command.Name, command.ShortName, command.SubText, command.Description, command.Order, command.Icon);

portal.AddContextTypes(await _contextTypeService.GetContextTypesByContextTypeKey(command.ContextTypes, cancellationToken));

await _readWriteContext.Set<Portal>().AddAsync(portal, cancellationToken);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using Equinor.ProjectExecutionPortal.Application.Queries.Portals.GetPortal;
using System.Net.Mime;
using Equinor.ProjectExecutionPortal.Application.Queries.Portals.GetPortal;
using Equinor.ProjectExecutionPortal.Application.Queries.Portals.GetPortalApps;
using Equinor.ProjectExecutionPortal.Application.Queries.Portals.GetPortals;
using Equinor.ProjectExecutionPortal.Domain.Common.Exceptions;
Expand Down Expand Up @@ -26,6 +27,8 @@ public async Task<ActionResult<IList<ApiPortal>>> Portals()
}

[HttpGet("{portalId:guid}")]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(typeof(void), StatusCodes.Status404NotFound)]
public async Task<ActionResult<ApiPortal>> Portal([FromRoute] Guid portalId)
{
var portalWithAppsDto = await Mediator.Send(new GetPortalQuery(portalId));
Expand All @@ -40,6 +43,12 @@ public async Task<ActionResult<ApiPortal>> Portal([FromRoute] Guid portalId)

[HttpPost("")]
[Authorize(Policy = Policies.ProjectPortal.Admin)]
[Consumes(MediaTypeNames.Application.Json)]
[Produces(MediaTypeNames.Application.Json)]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(typeof(void), StatusCodes.Status401Unauthorized)]
[ProducesResponseType(typeof(void), StatusCodes.Status404NotFound)]
[ProducesResponseType(typeof(void), StatusCodes.Status400BadRequest)]
public async Task<ActionResult<Guid>> CreatePortal([FromBody] ApiCreatePortalRequest request)
{
try
Expand All @@ -64,6 +73,12 @@ public async Task<ActionResult<Guid>> CreatePortal([FromBody] ApiCreatePortalReq

[HttpPut("{portalId:guid}")]
[Authorize(Policy = Policies.ProjectPortal.Admin)]
[Consumes(MediaTypeNames.Application.Json)]
[Produces(MediaTypeNames.Application.Json)]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(typeof(void), StatusCodes.Status401Unauthorized)]
[ProducesResponseType(typeof(void), StatusCodes.Status404NotFound)]
[ProducesResponseType(typeof(void), StatusCodes.Status400BadRequest)]
public async Task<ActionResult<Guid>> UpdatePortal([FromRoute] Guid portalId, [FromBody] ApiUpdatePortalRequest request)
{
try
Expand All @@ -84,6 +99,12 @@ public async Task<ActionResult<Guid>> UpdatePortal([FromRoute] Guid portalId, [F

[HttpPut("{portalId:guid}/setAsDefault")]
[Authorize(Policy = Policies.ProjectPortal.Admin)]
[Consumes(MediaTypeNames.Application.Json)]
[Produces(MediaTypeNames.Application.Json)]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(typeof(void), StatusCodes.Status401Unauthorized)]
[ProducesResponseType(typeof(void), StatusCodes.Status404NotFound)]
[ProducesResponseType(typeof(void), StatusCodes.Status400BadRequest)]
public async Task<ActionResult<Guid>> SetPortalAsDefault([FromRoute] Guid portalId)
{
var request = new ApiSetPortalAsDefaultRequest();
Expand All @@ -107,6 +128,8 @@ public async Task<ActionResult<Guid>> SetPortalAsDefault([FromRoute] Guid portal
// Apps

[HttpGet("{portalId:guid}/apps")]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(typeof(void), StatusCodes.Status404NotFound)]
public async Task<ActionResult<List<ApiPortalApp>>> PortalApps([FromRoute] Guid portalId)
{
//TODO: improve error handling
Expand All @@ -125,6 +148,8 @@ public async Task<ActionResult<List<ApiPortalApp>>> PortalApps([FromRoute] Guid
}

[HttpGet("{portalId:guid}/contexts/{contextId:guid}/apps")]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(typeof(void), StatusCodes.Status404NotFound)]
public async Task<ActionResult<List<ApiPortalApp>>> PortalApps([FromRoute] Guid portalId, [FromRoute] Guid contextId)
{
//TODO: improve error handling
Expand All @@ -140,6 +165,13 @@ public async Task<ActionResult<List<ApiPortalApp>>> PortalApps([FromRoute] Guid

[HttpPost("{portalId:guid}/apps")]
[Authorize(Policy = Policies.ProjectPortal.Admin)]
[Consumes(MediaTypeNames.Application.Json)]
[Produces(MediaTypeNames.Application.Json)]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(typeof(void), StatusCodes.Status401Unauthorized)]
[ProducesResponseType(typeof(void), StatusCodes.Status404NotFound)]
[ProducesResponseType(typeof(void), StatusCodes.Status409Conflict)]
[ProducesResponseType(typeof(void), StatusCodes.Status400BadRequest)]
public async Task<ActionResult<Guid>> AddPortalApp([FromRoute] Guid portalId, [FromBody] ApiAddGlobalAppToPortalRequest request)
{
try
Expand All @@ -152,7 +184,7 @@ public async Task<ActionResult<Guid>> AddPortalApp([FromRoute] Guid portalId, [F
}
catch (InvalidActionException ex)
{
return FusionApiError.InvalidOperation("500", ex.Message);
return FusionApiError.ResourceExists(request.AppKey, ex.Message, ex);
}
catch (Exception)
{
Expand All @@ -164,31 +196,45 @@ public async Task<ActionResult<Guid>> AddPortalApp([FromRoute] Guid portalId, [F

[HttpPost("{portalId:guid}/contexts/{contextId}/apps")]
[Authorize(Policy = Policies.ProjectPortal.Admin)]
[Consumes(MediaTypeNames.Application.Json)]
[Produces(MediaTypeNames.Application.Json)]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(typeof(void), StatusCodes.Status401Unauthorized)]
[ProducesResponseType(typeof(void), StatusCodes.Status404NotFound)]
[ProducesResponseType(typeof(void), StatusCodes.Status409Conflict)]
[ProducesResponseType(typeof(void), StatusCodes.Status400BadRequest)]
public async Task<ActionResult<Guid>> AddPortalApp([FromRoute] Guid portalId, Guid contextId, [FromBody] ApiAddContextAppToPortalRequest request)
{

try
{
await Mediator.Send(request.ToCommand(portalId, contextId));
}
catch (NotFoundException ex)
{
return FusionApiError.NotFound(portalId, ex.Message);
}
catch (InvalidActionException ex)
{
return FusionApiError.InvalidOperation("500", ex.Message);
}
catch (Exception)
{
try
{
await Mediator.Send(request.ToCommand(portalId, contextId));
}
catch (NotFoundException ex)
{
return FusionApiError.NotFound(portalId, ex.Message);
}
catch (InvalidOperationException ex)
{
return FusionApiError.InvalidOperation("400", ex.Message);
}
catch (InvalidActionException ex)
{
return FusionApiError.ResourceExists(request.AppKey, ex.Message, ex);
}
catch (Exception)
{
return FusionApiError.InvalidOperation("500", "An error occurred while adding portal app");
}
}

return Ok();
return Ok();
}

[HttpDelete("{portalId:guid}/apps/{appKey}")]
[Authorize(Policy = Policies.ProjectPortal.Admin)]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(typeof(void), StatusCodes.Status401Unauthorized)]
[ProducesResponseType(typeof(void), StatusCodes.Status404NotFound)]
[ProducesResponseType(typeof(void), StatusCodes.Status400BadRequest)]
public async Task<ActionResult> RemovePortalApp([FromRoute] Guid portalId, [FromRoute] string appKey)
{
// TODO: Removing global should come with a warning. E.g highlight affected contexts
Expand All @@ -212,6 +258,10 @@ public async Task<ActionResult> RemovePortalApp([FromRoute] Guid portalId, [From

[HttpDelete("{portalId:guid}/contexts/{contextId:guid}/apps/{appKey}")]
[Authorize(Policy = Policies.ProjectPortal.Admin)]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(typeof(void), StatusCodes.Status401Unauthorized)]
[ProducesResponseType(typeof(void), StatusCodes.Status404NotFound)]
[ProducesResponseType(typeof(void), StatusCodes.Status400BadRequest)]
public async Task<ActionResult> RemovePortalApp([FromRoute] Guid portalId, Guid contextId, [FromRoute] string appKey)
{
// TODO: Removing global should come with a warning. E.g highlight affected contexts
Expand All @@ -236,6 +286,13 @@ public async Task<ActionResult> RemovePortalApp([FromRoute] Guid portalId, Guid
//ContextTypes
[HttpPost("{portalId:guid}/context-type")]
[Authorize(Policy = Policies.ProjectPortal.Admin)]
[Consumes(MediaTypeNames.Application.Json)]
[Produces(MediaTypeNames.Application.Json)]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(typeof(void), StatusCodes.Status401Unauthorized)]
[ProducesResponseType(typeof(void), StatusCodes.Status404NotFound)]
[ProducesResponseType(typeof(void), StatusCodes.Status409Conflict)]
[ProducesResponseType(typeof(void), StatusCodes.Status400BadRequest)]
public async Task<ActionResult<Guid>> AddContextType([FromRoute] Guid portalId, [FromBody] ApiAddContextTypeToPortalRequest request)
{
try
Expand All @@ -248,7 +305,11 @@ public async Task<ActionResult<Guid>> AddContextType([FromRoute] Guid portalId,
}
catch (InvalidActionException ex)
{
return FusionApiError.InvalidOperation("500", ex.Message);
return FusionApiError.ResourceExists(request.Type, ex.Message, ex);
}
catch (InvalidOperationException ex)
{
return FusionApiError.InvalidOperation("400", ex.Message);
}
catch (Exception)
{
Expand All @@ -260,6 +321,10 @@ public async Task<ActionResult<Guid>> AddContextType([FromRoute] Guid portalId,

[HttpDelete("{portalId:guid}/context-type/{contextType}")]
[Authorize(Policy = Policies.ProjectPortal.Admin)]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(typeof(void), StatusCodes.Status401Unauthorized)]
[ProducesResponseType(typeof(void), StatusCodes.Status404NotFound)]
[ProducesResponseType(typeof(void), StatusCodes.Status400BadRequest)]
public async Task<ActionResult> RemoveContextType([FromRoute] Guid portalId, [FromRoute] string contextType)
{
var request = new ApiRemovePortalContextType();
Expand All @@ -273,7 +338,7 @@ public async Task<ActionResult> RemoveContextType([FromRoute] Guid portalId, [Fr
}
catch (InvalidActionException ex)
{
return FusionApiError.InvalidOperation("500", ex.Message);
return FusionApiError.InvalidOperation("400", ex.Message);
}
catch (Exception)
{
Expand Down

0 comments on commit 892d638

Please sign in to comment.