Skip to content

Instantly share code, notes, and snippets.

@benjaminvanrenterghem
Created September 16, 2022 17:32
Show Gist options
  • Save benjaminvanrenterghem/9fbc275b9ed3f99c94429517b833700f to your computer and use it in GitHub Desktop.
Save benjaminvanrenterghem/9fbc275b9ed3f99c94429517b833700f to your computer and use it in GitHub Desktop.
CQRS update commando
// #1 De Request, definieert als doel het bekomen van een Response<StageProfileResponseDTO> bij afhandeling
public class UpdateStageProfileCommand : IRequest<Response<StageProfileResponseDTO>> {
public StageProfileRequestDTO ProfileRequestDTO { get; set; }
public ParsedJwtToken ParsedJwtToken { get; set; }
}
// #2 De Request Handler, maakt gebruik van bovenstaande Request en definieert hetzelfde doel
public class UpdateStageProfileCommandHandler : IRequestHandler<UpdateStageProfileCommand, Response<StageProfileResponseDTO>> {
// #3 Om met de databank te interageren wordt gebruik gemaakt van generieke repositories
private readonly IGenericReadRepository<User> _userReadRepository;
private readonly IGenericReadRepository<StageProfile> _profileReadRepository;
private readonly IGenericWriteRepository<StageProfile> _profileWriteRepository;
private readonly IMapper _mapper;
// #4 Door middel van geregistreerde ASP.NET IServiceCollection services worden de generieke repositories dependency injected
public UpdateStageProfileCommandHandler(IGenericReadRepository<User> userReadRepository, IGenericReadRepository<StageProfile> profileReadRepository, IGenericWriteRepository<StageProfile> profileWriteRepository, IMapper mapper) {
_userReadRepository = userReadRepository;
_profileReadRepository = profileReadRepository;
_profileWriteRepository = profileWriteRepository;
_mapper = mapper;
}
// #5 We handelen het ontvangen verzoek af
public async Task<Response<StageProfileResponseDTO>> Handle(UpdateStageProfileCommand request, CancellationToken cancellationToken) {
var req = request.ProfileRequestDTO;
var jwt = request.ParsedJwtToken;
StageProfile? existingProfile = _profileReadRepository.GetAllWithLazyLoading(p => p.Id == (req.Id ?? -1)).FirstOrDefault();
if (existingProfile == null) {
return new Response<StageProfileResponseDTO>().AddError("StageProfile could not be found");
}
if (!jwt.ClearanceLevels.Contains(ClearanceLevel.Management)) {
if (existingProfile.OwnerId != jwt.UserId) {
return new Response<StageProfileResponseDTO>().AddError("Unpriviliged: you are not the owner of this profile");
}
} else {
var aspiringOwner = _userReadRepository.GetById(req.OwnerUserId);
if(aspiringOwner == null) {
return new Response<StageProfileResponseDTO>().AddError("Newly appointed owner does not exist");
}
}
// #6 Door middel van Automapper wordt een Entity omgezet naar een Response DTO
StageProfile updatedProfile = _mapper.Map<StageProfile>(req);
_profileWriteRepository.Update(existingProfile, updatedProfile);
_profileWriteRepository.Save();
// #7 We retourneren een Response<StageProfileResponseDTO>
return new Response<StageProfileResponseDTO>(
_mapper.Map<StageProfileResponseDTO>(
existingProfile
)
);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment