Skip to content

Commit

Permalink
first attempt adding new entity "Messages", but tests still failing
Browse files Browse the repository at this point in the history
  • Loading branch information
wolfgangroese committed Jun 19, 2023
1 parent 5d48698 commit c5dadf5
Show file tree
Hide file tree
Showing 13 changed files with 579 additions and 0 deletions.
86 changes: 86 additions & 0 deletions Orso.Arpa.Api/Controllers/MessagesController.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Orso.Arpa.Application.Interfaces;
using Orso.Arpa.Domain.Roles;
using Orso.Arpa.Application.MessageApplication;

namespace Orso.Arpa.Api.Controllers
{
public class MessagesController : BaseController
{
private readonly IMessageService _messageService;

public MessagesController(IMessageService messageService)
{
_messageService = messageService;
}

// Gets a message by id
[Authorize(Roles = RoleNames.Performer)]
[HttpGet("{id}")]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(typeof(ValidationProblemDetails), StatusCodes.Status404NotFound)]
public async Task<ActionResult<MessageDto>> GetById([FromRoute] Guid id)
{
return await _messageService.GetByIdAsync(id);
}

// Get all messages
[Authorize(Roles = RoleNames.Performer)]
[HttpGet]
[ProducesResponseType(StatusCodes.Status200OK)]
public async Task<ActionResult<IEnumerable<MessageDto>>> Get()
{
return Ok(await _messageService.GetAsync());
}

// Creates a new message
[Authorize(Roles = RoleNames.Staff)]
[HttpPost]
[ProducesResponseType(StatusCodes.Status201Created)]
[ProducesResponseType(typeof(ValidationProblemDetails), StatusCodes.Status404NotFound)]
[ProducesResponseType(typeof(ValidationProblemDetails), StatusCodes.Status422UnprocessableEntity)]
public async Task<ActionResult<MessageDto>> Post([FromBody] MessageCreateDto createDto)
{
MessageDto createdDto = await _messageService.CreateAsync(createDto);

return CreatedAtAction(nameof(GetById), new{ id = createdDto.Id }, createdDto);
}

// Modifies existing message
[Authorize(Roles = RoleNames.Staff)]
[HttpPut("{id}")]
[ProducesResponseType(StatusCodes.Status204NoContent)]
[ProducesResponseType(typeof(ValidationProblemDetails), StatusCodes.Status404NotFound)]
[ProducesResponseType(typeof(ValidationProblemDetails),
StatusCodes.Status422UnprocessableEntity)]
public async Task<IActionResult> Put(MessageModifyDto modifyDto)
{
await _messageService.ModifyAsync(modifyDto);

return NoContent();

}

//Deletes existing message by id
[Authorize(Roles = RoleNames.Staff)]
[HttpDelete("{id}")]
[ProducesResponseType(StatusCodes.Status204NoContent)]
[ProducesResponseType(typeof(ValidationProblemDetails), StatusCodes.Status404NotFound)]
[ProducesResponseType(typeof(ValidationProblemDetails),
StatusCodes.Status422UnprocessableEntity)]
public async Task<ActionResult> Delete([FromRoute] Guid id)
{
await _messageService.DeleteAsync(id);

return NoContent();
}

}

}

16 changes: 16 additions & 0 deletions Orso.Arpa.Application/Interfaces/IMessageService.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Orso.Arpa.Application.MessageApplication;

namespace Orso.Arpa.Application.Interfaces
{
public interface IMessageService
{
Task<MessageDto> CreateAsync(MessageCreateDto createDto);
Task<MessageDto> GetByIdAsync(Guid id);
Task<IEnumerable<MessageDto>> GetAsync();
Task ModifyAsync(MessageModifyDto modifyDto);
Task DeleteAsync(Guid id);
}
}
53 changes: 53 additions & 0 deletions Orso.Arpa.Application/MessageApplication/MessageCreateDto.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
using System;
using AutoMapper;
using FluentValidation;
using Orso.Arpa.Application.Extensions;
using Orso.Arpa.Application.General;
using static Orso.Arpa.Domain.Logic.Messages.Create;

namespace Orso.Arpa.Application.MessageApplication
{

public class MessageCreateDto : IdFromRouteDto<MessageCreateBodyDto>
{
}

public class MessageCreateBodyDto
{
public string MessageText { get; set; }
public string Url { get; set; }
public bool Show { get; set; }
}

public class MessageCreateDtoMappingProfile : Profile
{
public MessageCreateDtoMappingProfile()
{
CreateMap<MessageCreateDto, Command>()
.ForMember(dest => dest.MessageText, opt => opt.MapFrom(src => src.Body.MessageText))
.ForMember(dest => dest.Url, opt => opt.MapFrom(src => src.Body.Url))
.ForMember(dest => dest.Show, opt => opt.MapFrom(src => src.Body.Show));
}
}

public class
MessageCreateDtoValidator : IdFromRouteDtoValidator<MessageCreateDto, MessageCreateBodyDto>
{
public MessageCreateDtoValidator()
{
RuleFor(d => d.Body)
.SetValidator(new MessageCreateBodyDtoValidator());
}
}

public class MessageCreateBodyDtoValidator : AbstractValidator<MessageCreateBodyDto>
{
public MessageCreateBodyDtoValidator()
{
RuleFor(c => c.MessageText)
.Cascade(CascadeMode.Stop)
.NotEmpty()
.RestrictedFreeText(500);
}
}
}
22 changes: 22 additions & 0 deletions Orso.Arpa.Application/MessageApplication/MessageDto.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
using AutoMapper;
using Orso.Arpa.Application.General;
using Orso.Arpa.Domain.Entities;

namespace Orso.Arpa.Application.MessageApplication
{
public class MessageDto : BaseEntityDto
{
public string MessageText { get; set; }
public string Url { get; set; }
public bool Show { get; set; }
}

public class MessageDtoMappingProfile : Profile
{
public MessageDtoMappingProfile()
{
CreateMap<Message, MessageDto>()
.IncludeBase<BaseEntity, BaseEntityDto>();
}
}
}
63 changes: 63 additions & 0 deletions Orso.Arpa.Application/MessageApplication/MessageModifyDto.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
using System;
using AutoMapper;
using FluentValidation;
using Microsoft.AspNetCore.Mvc;
using Orso.Arpa.Application.Extensions;
using Orso.Arpa.Application.General;
using static Orso.Arpa.Domain.Logic.Messages.Modify;

namespace Orso.Arpa.Application.MessageApplication
{
public class MessageModifyDto : IdFromRouteDto<MessageModifyBodyDto>
{
[FromRoute]
public Guid MessageId { get; set; }
}

public class MessageModifyBodyDto
{
public string MessageText { get; set; }
public string Url { get; set; }
public bool Show { get; set; }
}

public class MessageModifyDtoMappingProfile : Profile
{
public MessageModifyDtoMappingProfile()
{
CreateMap<MessageModifyDto, Command>()
.ForMember(dest => dest.MessageText,
opt => opt.MapFrom(src => src.Body.MessageText))
.ForMember(dest => dest.Url, opt => opt.MapFrom(src => src.Body.Url))
.ForMember(dest => dest.Show, opt => opt.MapFrom(src => src.Body.Show))
.ForMember(dest => dest.Id, opt => opt.MapFrom(src => src.MessageId));
}
}
public class MessageModifyDtoValidator : IdFromRouteDtoValidator<MessageModifyDto, MessageModifyBodyDto>
{
public MessageModifyDtoValidator()
{
RuleFor(d => d.Body)
.SetValidator(new MessageModifyBodyDtoValidator());

RuleFor(dto => dto.MessageId)
.NotEmpty();
}
}

public class MessageModifyBodyDtoValidator : AbstractValidator<MessageModifyBodyDto>
{
public MessageModifyBodyDtoValidator()
{
RuleFor(c => c.MessageText)
.Cascade(CascadeMode.Stop)
.NotEmpty()
.RestrictedFreeText(500);

RuleFor(c => c.Url)
.Cascade(CascadeMode.Stop)
.NotEmpty()
.ValidUri();
}
}
}
27 changes: 27 additions & 0 deletions Orso.Arpa.Domain/Entities/Message.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
using System;
using Orso.Arpa.Domain.Logic.Messages;

namespace Orso.Arpa.Domain.Entities
{
public class Message : BaseEntity
{
public Message(Guid? id, Create.Command command) : base(id)
{
MessageText = command.MessageText;
Url = command.Url;
Show = command.Show;
}
protected Message() {}

public void Update(Modify.Command command)
{
MessageText = command.MessageText;
Url = command.Url;
Show = command.Show;
}

public string MessageText { get; private set; }
public string Url { get; private set; }
public bool Show { get; private set; }
}
}
31 changes: 31 additions & 0 deletions Orso.Arpa.Domain/Logic/Messages/Modify.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
using System;
using FluentValidation;
using Orso.Arpa.Domain.Entities;
using Orso.Arpa.Domain.Interfaces;
using static Orso.Arpa.Domain.GenericHandlers.Modify;

namespace Orso.Arpa.Domain.Logic.Messages
{
public static class Modify
{
public class Command : IModifyCommand<Message>
{
public Guid Id { get; set; }
public string MessageText { get; set; }
public string Url { get; set; }
public bool Show { get; set; }
}

public class Validator : AbstractValidator<Command>
{
public Validator(IArpaContext arpaContext)
{
RuleFor(c => c.Id)
.MustAsync(async (id, cancellation) => await arpaContext.EntityExistsAsync<Message>(message => message.Id == id, cancellation))
.WithMessage("Message could not be found")
.WithErrorCode("404");
}
}
}
}

20 changes: 20 additions & 0 deletions Orso.Arpa.Domain/Logic/Messages/create.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
using System;
using FluentValidation;
using Orso.Arpa.Domain.Entities;
using Orso.Arpa.Domain.Extensions;
using Orso.Arpa.Domain.Interfaces;
using static Orso.Arpa.Domain.GenericHandlers.Create;

namespace Orso.Arpa.Domain.Logic.Messages
{
public static class Create
{
public class Command : ICreateCommand<Message>
{
public string MessageText { get; set; }
public string Url { get; set; }
public bool Show { get; set; }

}
}
}
Loading

0 comments on commit c5dadf5

Please sign in to comment.