public async Task <IActionResult> Post([FromBody] VolunteerTaskViewModel task) { var volunteerTask = await ToModel(task, _mediator); if (volunteerTask == null) { return(BadRequest("Should have found a matching event Id")); } var hasPermissions = _determineIfATaskIsEditable.For(User, volunteerTask, _userManager); if (!hasPermissions) { return(Unauthorized()); } if (await TaskExists(task.Id)) { return(BadRequest()); } await _mediator.SendAsync(new AddVolunteerTaskCommand { VolunteerTask = volunteerTask }); //http://stackoverflow.com/questions/1860645/create-request-with-post-which-response-codes-200-or-201-and-content return(Created("", volunteerTask)); }
public async Task <IActionResult> Put(int id, [FromBody] VolunteerTaskViewModel value) { var volunteerTask = await GetTaskBy(id); if (volunteerTask == null) { return(BadRequest()); } var hasPermissions = _determineIfATaskIsEditable.For(User, volunteerTask, _userManager); if (!hasPermissions) { return(Unauthorized()); } // Changing all the potential properties that the VM could have modified. volunteerTask.Name = value.Name; volunteerTask.Description = value.Description; volunteerTask.StartDateTime = value.StartDateTime.UtcDateTime; volunteerTask.EndDateTime = value.EndDateTime.UtcDateTime; await _mediator.SendAsync(new UpdateVolunteerTaskCommand { VolunteerTask = volunteerTask }); //http://stackoverflow.com/questions/2342579/http-status-code-for-update-and-delete return(NoContent()); }
public async Task PostSendsTaskByTaskIdQueryWithCorrectTaskId() { var model = new VolunteerTaskViewModel { EventId = 1, Id = 1 }; var mediator = new Mock <IMediator>(); mediator.Setup(x => x.SendAsync(It.IsAny <EventByEventIdQuery>())).ReturnsAsync(new Event()); mediator.Setup(x => x.SendAsync(It.IsAny <VolunteerTaskByVolunteerTaskIdQuery>())).ReturnsAsync(new VolunteerTask()); var provider = new Mock <IDetermineIfATaskIsEditable>(); provider.Setup(x => x.For(It.IsAny <ClaimsPrincipal>(), It.IsAny <VolunteerTask>(), null)).Returns(true); var sut = new TaskApiController(mediator.Object, provider.Object, null); await sut.Post(model); mediator.Verify(x => x.SendAsync(It.Is <VolunteerTaskByVolunteerTaskIdQuery>(y => y.VolunteerTaskId == model.Id))); }
public async Task PutSendsUpdateTaskCommandWithCorrectAllReadyTask() { var volunteerTask = new VolunteerTask(); var model = new VolunteerTaskViewModel { Name = "name", Description = "description", StartDateTime = DateTime.UtcNow, EndDateTime = DateTime.UtcNow }; var mediator = new Mock <IMediator>(); mediator.Setup(x => x.SendAsync(It.IsAny <VolunteerTaskByVolunteerTaskIdQuery>())).ReturnsAsync(volunteerTask); var determineIfATaskIsEditable = new Mock <IDetermineIfATaskIsEditable>(); determineIfATaskIsEditable.Setup(x => x.For(It.IsAny <ClaimsPrincipal>(), It.IsAny <VolunteerTask>(), null)).Returns(true); var sut = new TaskApiController(mediator.Object, determineIfATaskIsEditable.Object, null); await sut.Put(It.IsAny <int>(), model); mediator.Verify(x => x.SendAsync(It.Is <UpdateVolunteerTaskCommand>(y => y.VolunteerTask == volunteerTask)), Times.Once); }
public async Task PostReturnsHttpStatusCodeResultOf201() { var model = new VolunteerTaskViewModel { EventId = 1, Id = 0 }; var mediator = new Mock <IMediator>(); mediator.Setup(x => x.SendAsync(It.IsAny <EventByEventIdQuery>())).ReturnsAsync(new Event()); var provider = new Mock <IDetermineIfATaskIsEditable>(); provider.Setup(x => x.For(It.IsAny <ClaimsPrincipal>(), It.IsAny <VolunteerTask>(), null)).Returns(true); var sut = new TaskApiController(mediator.Object, provider.Object, null); var result = await sut.Post(model) as CreatedResult; Assert.IsType <CreatedResult>(result); Assert.Equal(201, result.StatusCode); }
public async Task PutReturnsHttpStatusCodeResultOf204() { var volunteerTask = new VolunteerTask(); var model = new VolunteerTaskViewModel { Name = "name", Description = "description", StartDateTime = DateTime.UtcNow, EndDateTime = DateTime.UtcNow }; var mediator = new Mock <IMediator>(); mediator.Setup(x => x.SendAsync(It.IsAny <VolunteerTaskByVolunteerTaskIdQuery>())).ReturnsAsync(volunteerTask); var determineIfATaskIsEditable = new Mock <IDetermineIfATaskIsEditable>(); determineIfATaskIsEditable.Setup(x => x.For(It.IsAny <ClaimsPrincipal>(), It.IsAny <VolunteerTask>(), null)).Returns(true); var sut = new TaskApiController(mediator.Object, determineIfATaskIsEditable.Object, null); var result = await sut.Put(It.IsAny <int>(), model) as NoContentResult; Assert.IsType <NoContentResult>(result); Assert.Equal(204, result.StatusCode); }
public async Task PostSendsAddTaskCommandAsyncWithCorrectData() { var model = new VolunteerTaskViewModel { EventId = 1, Id = 1 }; var volunteerTask = new VolunteerTask(); var mediator = new Mock <IMediator>(); mediator.Setup(x => x.SendAsync(It.IsAny <EventByEventIdQuery>())).ReturnsAsync(new Event()); mediator.SetupSequence(x => x.SendAsync(It.IsAny <VolunteerTaskByVolunteerTaskIdQuery>())) .ReturnsAsync(volunteerTask).ReturnsAsync(null); var determineIfATaskIsEditable = new Mock <IDetermineIfATaskIsEditable>(); determineIfATaskIsEditable.Setup(x => x.For(It.IsAny <ClaimsPrincipal>(), It.IsAny <VolunteerTask>(), null)).Returns(true); var sut = new TaskApiController(mediator.Object, determineIfATaskIsEditable.Object, null); await sut.Post(model); mediator.Verify(x => x.SendAsync(It.Is <AddVolunteerTaskCommand>(y => y.VolunteerTask == volunteerTask)), Times.Once); }
private async Task <VolunteerTask> ToModel(VolunteerTaskViewModel taskViewModel, IMediator mediator) { var @event = await mediator.SendAsync(new EventByEventIdQuery { EventId = taskViewModel.EventId }); if (@event == null) { return(null); } var newTask = true; VolunteerTask volunteerTask; if (taskViewModel.Id == 0) { volunteerTask = new VolunteerTask(); } else { volunteerTask = await mediator.SendAsync(new VolunteerTaskByVolunteerTaskIdQuery { VolunteerTaskId = taskViewModel.Id }); newTask = false; } volunteerTask.Id = taskViewModel.Id; volunteerTask.Description = taskViewModel.Description; volunteerTask.Event = @event; volunteerTask.EndDateTime = taskViewModel.EndDateTime.UtcDateTime; volunteerTask.StartDateTime = taskViewModel.StartDateTime.UtcDateTime; volunteerTask.Name = taskViewModel.Name; volunteerTask.RequiredSkills = volunteerTask.RequiredSkills ?? new List <VolunteerTaskSkill>(); taskViewModel.RequiredSkills = taskViewModel.RequiredSkills ?? new List <int>(); ////Remove old skills //dbtask.RequiredSkills.RemoveAll(ts => !taskViewModel.RequiredSkills.Any(s => ts.SkillId == s)); ////Add new skills //dbtask.RequiredSkills.AddRange(taskViewModel.RequiredSkills // .Where(rs => !dbtask.RequiredSkills.Any(ts => ts.SkillId == rs)) // .Select(rs => new TaskSkill() { SkillId = rs, TaskId = taskViewModel.Id })); // Workaround: POST is bringing in empty AssignedVolunteers. Clean this up. Discussing w/ Kiran Challa. // Workaround: the if statement is superflous, and should go away once we have the proper fix referenced above. if (taskViewModel.AssignedVolunteers != null) { var bogusAssignedVolunteers = (from assignedVolunteer in taskViewModel.AssignedVolunteers where string.IsNullOrEmpty(assignedVolunteer.UserId) select assignedVolunteer).ToList(); foreach (var bogus in bogusAssignedVolunteers) { taskViewModel.AssignedVolunteers.Remove(bogus); } } // end workaround if (taskViewModel.AssignedVolunteers != null && taskViewModel.AssignedVolunteers.Count > 0) { var assignedVolunteers = taskViewModel.AssignedVolunteers.ToList(); var volunteerTaskUsersList = await assignedVolunteers.ToVolunteerTaskSignups(volunteerTask, _mediator); // We may be updating an existing task if (newTask || volunteerTask.AssignedVolunteers.Count == 0) { volunteerTask.AssignedVolunteers = volunteerTaskUsersList; } else { // Can probably rewrite this more efficiently. foreach (var volunteerTaskUsers in volunteerTaskUsersList) { if (!(from entry in volunteerTask.AssignedVolunteers where entry.User.Id == volunteerTaskUsers.User.Id select entry).Any()) { volunteerTask.AssignedVolunteers.Add(volunteerTaskUsers); } } } } return(volunteerTask); }
public void ConstructEventViewModel_WithTheCorrectData() { var campaign = new Campaign { Id = 1, Name = "Campaignname", TimeZoneId = "CampaignTimeZoneId" }; var location = new AllReady.ViewModels.Shared.LocationViewModel { City = "Amsterdam" }; var skills = new List <SkillViewModel> { new SkillViewModel { Name = "F sharp" } }; var userSkills = new List <SkillViewModel> { new SkillViewModel { Name = "Medic", Description = "first aid helper", HierarchicalName = "med01", Id = 1 } }; var signup = new AllReady.ViewModels.Shared.VolunteerTaskSignupViewModel { Name = "task1", VolunteerTaskId = 1 }; var @event = new Event { Campaign = campaign, TimeZoneId = "EventTimeZoneId" }; var sut = new EventViewModel(@event); var volunteerTask = new VolunteerTaskViewModel { CampaignName = sut.CampaignName, CampaignId = sut.CampaignId, EventName = sut.Title, Name = "volunteerTasks" }; var volunteerTasks = new List <VolunteerTaskViewModel> { volunteerTask }; sut.Description = "Testing the allReady from htbox"; sut.EndDateTime = DateTimeOffset.Now.AddDays(3650); sut.EventType = EventType.Rally; sut.HasPrivacyPolicy = false; sut.Headline = "the Already test campaing"; sut.Id = 1; sut.ImageUrl = "http://www.htbox.org/"; sut.IsAllowWaitList = false; sut.IsClosed = false; sut.IsLimitVolunteers = true; sut.Location = location; sut.OrganizationId = 1; sut.OrganizationName = "TestOrg"; sut.RequiredSkills = skills; sut.SignupModel = signup; sut.StartDateTime = DateTimeOffset.Now.AddDays(365); sut.Tasks = volunteerTasks; sut.TimeZoneId = "US Mountain Standard Time"; sut.Title = "Test Event"; sut.UserId = "99"; sut.UserSkills = userSkills; sut.UserTasks = volunteerTasks; Assert.Equal(sut.CampaignId, campaign.Id); Assert.Equal(sut.CampaignName, campaign.Name); Assert.Equal(sut.Location, location); Assert.Equal(sut.UserSkills, userSkills); Assert.Equal(sut.UserTasks, volunteerTasks); Assert.Equal(sut.SignupModel, signup); Assert.Equal(sut.RequiredSkills, skills); }