public async Task CreateDraftTemplate_FailsIfUserWithoutPermissionsToCreateTemplates()
        {
            ITemplateBuilderApiClient apiClient = Substitute.For <ITemplateBuilderApiClient>();
            TemplateCreateModel       model     = new TemplateCreateModel
            {
                Description     = "Test Description",
                FundingStreamId = "TEST",
                FundingPeriodId = "TEST"
            };
            string templateId = Guid.NewGuid().ToString();

            apiClient
            .CreateDraftTemplate(Arg.Any <TemplateCreateCommand>())
            .Returns(new ValidatedApiResponse <string>(HttpStatusCode.Created, templateId));
            var authHelper = Substitute.For <IAuthorizationHelper>();

            authHelper.GetUserFundingStreamPermissions(Arg.Any <ClaimsPrincipal>(), Arg.Is(model.FundingStreamId))
            .Returns(new FundingStreamPermission {
                CanCreateTemplates = false, FundingStreamId = model.FundingStreamId
            });
            TemplateBuildController controller = new TemplateBuildController(apiClient, authHelper, Substitute.For <ILogger>());

            IActionResult result = await controller.CreateDraftTemplate(model);

            result
            .Should()
            .BeAssignableTo <ForbidResult>();

            apiClient.Received(0);
        }
        public async Task Add(TemplateCreateModel model)
        {
            var table     = tableClient.GetTableReference(TableName);
            var container = blobClient.GetContainerReference(options.Container);

            await Task.WhenAll(table.CreateIfNotExistsAsync(), container.CreateIfNotExistsAsync());

            var template = new Template(model.Name, model.Language);

            var entity = await table.ExecuteAsync(
                TableOperation.Retrieve(template.PartitionKey, template.RowKey));

            if (entity.Result != null)
            {
                throw new ArgumentException($"A template {template.PartitionKey}:{template.RowKey} already exists.");
            }


            var blob = container.GetBlockBlobReference($"{template.PartitionKey}/{template.RowKey}/{template.RowKey}.cshtml");

            await blob.UploadFromStreamAsync(model.Template.OpenReadStream());

            template.Url = blob.Uri.ToString();

            await table.ExecuteAsync(TableOperation.Insert(template));
        }
        public async Task CreateDraftTemplate_ReturnsCorrectResult()
        {
            ITemplateBuilderApiClient apiClient = Substitute.For <ITemplateBuilderApiClient>();
            TemplateCreateModel       model     = new TemplateCreateModel
            {
                Description     = "Test Description",
                FundingStreamId = "TEST",
                FundingPeriodId = "TEST"
            };
            string templateId = Guid.NewGuid().ToString();

            apiClient
            .CreateDraftTemplate(Arg.Any <TemplateCreateCommand>())
            .Returns(new ValidatedApiResponse <string>(HttpStatusCode.Created, templateId));
            var authHelper = Substitute.For <IAuthorizationHelper>();

            authHelper.GetUserFundingStreamPermissions(Arg.Any <ClaimsPrincipal>(), Arg.Is(model.FundingStreamId))
            .Returns(new FundingStreamPermission {
                CanCreateTemplates = true, FundingStreamId = model.FundingStreamId
            });
            TemplateBuildController controller = new TemplateBuildController(apiClient, authHelper, Substitute.For <ILogger>());

            IActionResult result = await controller.CreateDraftTemplate(model);

            result
            .Should()
            .BeAssignableTo <CreatedResult>();

            string resultId = (result as CreatedResult)?.Value as string;

            resultId
            .Should()
            .Be(templateId);

            string resultLocation = (result as CreatedResult)?.Location;

            resultLocation
            .Should()
            .Be($"api/templates/build/{templateId}");
        }
示例#4
0
        public async Task <IActionResult> CreateDraftTemplate([FromBody] TemplateCreateModel createModel)
        {
            Guard.ArgumentNotNull(createModel, nameof(createModel));

            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            FundingStreamPermission permissions = await _authorizationHelper.GetUserFundingStreamPermissions(User, createModel.FundingStreamId);

            if (!permissions.CanCreateTemplates)
            {
                _logger.Error($"User [{User?.Identity?.Name}] has insufficient permissions to create a {createModel.FundingStreamId} template");
                return(Forbid(new AuthenticationProperties()));
            }

            ValidatedApiResponse <string> result = await _client.CreateDraftTemplate(new TemplateCreateCommand
            {
                Description     = createModel.Description,
                FundingStreamId = createModel.FundingStreamId,
                FundingPeriodId = createModel.FundingPeriodId,
                SchemaVersion   = "1.1"
            });

            switch (result.StatusCode)
            {
            case HttpStatusCode.Created:
                return(Created($"api/templates/build/{result.Content}", result.Content));

            case HttpStatusCode.BadRequest:
                return(BadRequest(result.ModelState));

            default:
                return(StatusCode((int)result.StatusCode));
            }
        }
 public Task Add(TemplateCreateModel model)
 {
     return(templatesRepository.Add(model));
 }
示例#6
0
        public async Task <IActionResult> Create(TemplateCreateModel model)
        {
            await templatesService.Add(model);

            return(Created("", null));
        }