public async Task<IActionResult> Post([FromBody]Group userInputGroup) { // requestor is a group administration and can create groups if (!(await _securityHelper.IsGroupAdmin())) return new HttpStatusCodeResult(403); // Forbidden; //TODO: group parameter validation // get current user var currentUser = await _securityHelper.GetOrCreateCurrentUser(); // build the resource group object var group = new ScampResourceGroup() { Id = Guid.NewGuid().ToString(), Name = userInputGroup.Name, Description = userInputGroup.Description, Budget = new ScampGroupBudget() { OwnerId = currentUser.Id, OwnerName = currentUser.Name, unitsBudgeted = userInputGroup.Budget.unitsBudgeted, DefaultUserAllocation = userInputGroup.Budget.defaultUserBudget, EndDate = userInputGroup.Budget.expiryDate } }; await _groupRepository.CreateGroup(group); // after we know the user docs have completed successfully, add the volatile storage records Task[] tasks = new Task[2]; // collection to hold the parallel tasks // create group volatile storage entries var newGrpBudget = new GroupBudgetState(group.Id) { UnitsBudgetted = userInputGroup.Budget.unitsBudgeted, UnitsAllocated = userInputGroup.Budget.defaultUserBudget, UnitsUsed = 0 }; tasks[0] = _volatileStorageController.AddGroupBudgetState(newGrpBudget); // create volatile storage budget entry for user/group var newUsrBudget = new UserBudgetState(currentUser.Id, group.Id) { UnitsBudgetted = group.Budget.DefaultUserAllocation, UnitsUsed = 0 }; tasks[1] = _volatileStorageController.AddUserBudgetState(newUsrBudget); // wait for both operations to complete Task.WaitAll(tasks); return new ObjectResult(Map(group)) { StatusCode = 200 }; }
private Group Map(ScampResourceGroup docDbGroup) { return new Group { Id = docDbGroup.Id, Name = docDbGroup.Name, Description = docDbGroup.Description, Templates = new List<GroupTemplateSummary>(), // TODO map these when the repo supports them Users = docDbGroup.Members?.Select(MapToSummary).ToList(), Budget = Map(docDbGroup.Budget) }; }