public async Task <IActionResult> UpdateAsync(int id, [FromBody] InquiryDto input)
    {
        // Map.
        var inquiry = _mapper.Map <InquiryFull>(input);

        inquiry.Id = id;

        InquiryFull inquiry_existing = await _inquiryRepository.GetByIdAsync(id);

        if (inquiry_existing.Attribution.Creator == input.Reviewer)
        {
            throw new AuthorizationException();
        }

        // Act.
        await _inquiryRepository.UpdateAsync(inquiry);

        // FUTURE: Does this make sense?
        // Only when this item was rejected can we move into
        // a pending state after update.
        if (inquiry.State.AuditStatus == AuditStatus.Rejected)
        {
            // Transition.
            inquiry.State.TransitionToPending();

            // Act.
            await _inquiryRepository.SetAuditStatusAsync(inquiry.Id, inquiry);
        }

        // Return.
        return(NoContent());
    }
Exemple #2
0
    public async Task <IActionResult> CreateAsync(int inquiryId, [FromBody] InquirySampleDto input, [FromServices] IGeocoderTranslation geocoderTranslation)
    {
        Address address = await geocoderTranslation.GetAddressIdAsync(input.Address);

        // Map.
        var inquirySample = _mapper.Map <InquirySample>(input);

        inquirySample.Address = address.Id;
        inquirySample.Inquiry = inquiryId;

        // Act.
        // FUTURE: Too much logic
        InquiryFull inquiry = await _inquiryRepository.GetByIdAsync(inquirySample.Inquiry);

        if (!inquiry.State.AllowWrite)
        {
            throw new EntityReadOnlyException();
        }

        inquirySample = await _inquirySampleRepository.AddGetAsync(inquirySample);

        inquiry.State.TransitionToPending();
        await _inquiryRepository.SetAuditStatusAsync(inquiry.Id, inquiry);

        // Map.
        var output = _mapper.Map <InquirySampleDto>(inquirySample);

        // Return.
        return(Ok(output));
    }
    public async Task <IActionResult> ResetAsync(int id)
    {
        // Act.
        InquiryFull inquiry = await _inquiryRepository.GetByIdAsync(id);

        // Transition.
        inquiry.State.TransitionToPending();

        // Act.
        await _inquiryRepository.SetAuditStatusAsync(inquiry.Id, inquiry);

        // Return.
        return(NoContent());
    }
    public async Task <IActionResult> SetStatusRejectedAsync(int id, StatusChangeDto input)
    {
        // Act.
        InquiryFull inquiry = await _inquiryRepository.GetByIdAsync(id);

        Organization organization = await _organizationRepository.GetByIdAsync(_appContext.TenantId);

        User reviewer = await _userRepository.GetByIdAsync(inquiry.Attribution.Reviewer.Value);

        User creator = await _userRepository.GetByIdAsync(inquiry.Attribution.Creator);

        // Transition.
        inquiry.State.TransitionToRejected();

        // Act.
        await _inquiryRepository.SetAuditStatusAsync(inquiry.Id, inquiry);

        string subject = $"FunderMaps - Rapportage afgekeurd";

        object header = new
        {
            Title     = subject,
            Preheader = "Rapportage is afgekeurd."
        };

        string footer = "Dit bericht wordt verstuurd wanneer een rapportage is afgekeurd.";

        await _notifyService.NotifyAsync(new()
        {
            Recipients = new List <string> {
                creator.Email
            },
            Subject  = subject,
            Template = "InquiryRejected",
            Items    = new Dictionary <string, object>
            {
                { "header", header },
                { "footer", footer },
                { "reviewer", reviewer.ToString() },
                { "organization", organization.ToString() },
                { "inquiry", inquiry },
                { "message", input.Message },
                { "redirect_link", $"{Request.Scheme}://{Request.Host}/inquiry/{inquiry.Id}" },
            },
        });

        // Return.
        return(NoContent());
    }
    public async Task <IActionResult> SetStatusApprovedAsync(int id)
    {
        // Act.
        InquiryFull inquiry = await _inquiryRepository.GetByIdAsync(id);

        Organization organization = await _organizationRepository.GetByIdAsync(_appContext.TenantId);

        User reviewer = await _userRepository.GetByIdAsync(inquiry.Attribution.Reviewer.Value);

        User creator = await _userRepository.GetByIdAsync(inquiry.Attribution.Creator);

        // Transition.
        inquiry.State.TransitionToDone();

        // Act.
        await _inquiryRepository.SetAuditStatusAsync(inquiry.Id, inquiry);

        string subject = $"FunderMaps - Rapportage goedgekeurd";

        object header = new
        {
            Title     = subject,
            Preheader = "Rapportage is goedgekeurd."
        };

        string footer = "Dit bericht wordt verstuurd wanneer een rapportage is goedgekeurd.";

        await _notifyService.NotifyAsync(new()
        {
            Recipients = new List <string> {
                creator.Email
            },
            Subject  = "FunderMaps - Rapportage goedgekeurd",
            Template = "InquiryApproved",
            Items    = new Dictionary <string, object>
            {
                { "header", header },
                { "footer", footer },
                { "reviewer", reviewer.ToString() },
                { "organization", organization.ToString() },
                { "inquiry", inquiry },
            },
        });

        // Return.
        return(NoContent());
    }
    public async Task <IActionResult> GetDocumentAccessLinkAsync(int id)
    {
        // Act.
        InquiryFull inquiry = await _inquiryRepository.GetByIdAsync(id);

        Uri link = await _blobStorageService.GetAccessLinkAsync(
            containerName : Core.Constants.InquiryStorageFolderName,
            fileName : inquiry.DocumentFile,
            hoursValid : 1);

        // Map.
        BlobAccessLinkDto result = new()
        {
            AccessLink = link
        };

        // Return.
        return(Ok(result));
    }
Exemple #7
0
    public async Task <IActionResult> DeleteAsync(int id)
    {
        // Act.
        InquirySample inquirySample = await _inquirySampleRepository.GetByIdAsync(id);

        InquiryFull inquiry = await _inquiryRepository.GetByIdAsync(inquirySample.Inquiry);

        if (!inquiry.State.AllowWrite)
        {
            throw new EntityReadOnlyException();
        }

        await _inquirySampleRepository.DeleteAsync(id);

        // FUTURE: Should only select inquiry
        if (await _inquirySampleRepository.CountAsync() == 0)
        {
            inquiry.State.TransitionToTodo();
            await _inquiryRepository.SetAuditStatusAsync(inquiry.Id, inquiry);
        }

        // Return.
        return(NoContent());
    }
Exemple #8
0
    public async Task <IActionResult> UpdateAsync(int inquiryId, int id, [FromBody] InquirySampleDto input)
    {
        // Map.
        var inquirySample = _mapper.Map <InquirySample>(input);

        inquirySample.Id      = id;
        inquirySample.Inquiry = inquiryId;

        // Act.
        InquiryFull inquiry = await _inquiryRepository.GetByIdAsync(inquirySample.Inquiry);

        if (!inquiry.State.AllowWrite)
        {
            throw new EntityReadOnlyException();
        }

        await _inquirySampleRepository.UpdateAsync(inquirySample);

        inquiry.State.TransitionToPending();
        await _inquiryRepository.SetAuditStatusAsync(inquiry.Id, inquiry);

        // Return.
        return(NoContent());
    }