public async Task<ActionResult> Outcomes(LineItemModel model, string submit) { switch (submit) { case "Delete LineItem": var deleteLineItemResponse = await OutcomesClient.DeleteLineItem( model.LineItemServiceUrl, model.ConsumerKey, model.ConsumerSecret); model.HttpRequest = deleteLineItemResponse.HttpRequest; model.HttpResponse = deleteLineItemResponse.HttpResponse; switch (deleteLineItemResponse.StatusCode) { case HttpStatusCode.OK: model.LineItem = null; ModelState.Clear(); ViewBag.Message = "200 LineItem deleted"; break; case HttpStatusCode.Unauthorized: ViewBag.Message = "401 Not authorized"; break; case HttpStatusCode.NotFound: ViewBag.Message = "404 Not found"; break; case HttpStatusCode.InternalServerError: ViewBag.Message = "500 Internal server error"; break; default: ViewBag.Message = Convert.ToInt32(deleteLineItemResponse.StatusCode) + " " + deleteLineItemResponse.StatusCode; break; } break; case "Get LineItem": var getLineItemResponse = await OutcomesClient.GetLineItem( model.LineItemServiceUrl, model.ConsumerKey, model.ConsumerSecret); model.HttpRequest = getLineItemResponse.HttpRequest; model.HttpResponse = getLineItemResponse.HttpResponse; switch (getLineItemResponse.StatusCode) { case HttpStatusCode.OK: model.LineItem = getLineItemResponse.Outcome; ModelState.Clear(); ViewBag.Message = "200 LineItem received"; break; case HttpStatusCode.Unauthorized: ViewBag.Message = "401 Not authorized"; break; case HttpStatusCode.NotFound: ViewBag.Message = "404 Not found"; break; case HttpStatusCode.InternalServerError: ViewBag.Message = "500 Internal server error"; break; default: ViewBag.Message = Convert.ToInt32(getLineItemResponse.StatusCode) + " " + getLineItemResponse.StatusCode; break; } break; case "Get LineItems": var getLineItemsResponse = await OutcomesClient.GetLineItemPage( model.LineItemsServiceUrl, model.ConsumerKey, model.ConsumerSecret); model.HttpRequest = getLineItemsResponse.HttpRequest; model.HttpResponse = getLineItemsResponse.HttpResponse; switch (getLineItemsResponse.StatusCode) { case HttpStatusCode.OK: ViewBag.Message = "200 LineItems received"; break; case HttpStatusCode.Unauthorized: ViewBag.Message = "401 Not authorized"; break; case HttpStatusCode.NotFound: ViewBag.Message = "404 Not found"; break; case HttpStatusCode.InternalServerError: ViewBag.Message = "500 Internal server error"; break; default: ViewBag.Message = Convert.ToInt32(getLineItemsResponse.StatusCode) + " " + getLineItemsResponse.StatusCode; break; } break; case "Post LineItem": var postLineItem = new LineItem { ReportingMethod = "res:totalScore", LineItemOf = new Context { ContextId = model.ContextId}, AssignedActivity = new Activity { ActivityId = model.LineItem.AssignedActivity.ActivityId}, ScoreContraints = new NumericLimits { NormalMaximum = 100, ExtraCreditMaximum = 10, TotalMaximum = 110} }; var postLineItemResponse = await OutcomesClient.PostLineItem( postLineItem, model.LineItemsServiceUrl, model.ConsumerKey, model.ConsumerSecret); model.HttpRequest = postLineItemResponse.HttpRequest; model.HttpResponse = postLineItemResponse.HttpResponse; switch (postLineItemResponse.StatusCode) { case HttpStatusCode.Created: model.LineItem = postLineItemResponse.Outcome; ModelState.Clear(); ViewBag.Message = "201 LineItem added"; break; case HttpStatusCode.BadRequest: ViewBag.Message = "400 Bad Request"; break; case HttpStatusCode.Unauthorized: ViewBag.Message = "401 Not authorized"; break; case HttpStatusCode.InternalServerError: ViewBag.Message = "500 Internal server error"; break; default: ViewBag.Message = Convert.ToInt32(postLineItemResponse.StatusCode) + " " + postLineItemResponse.StatusCode; break; } break; case "Put LineItem": var putLineItem = new LineItem { Id = model.LineItem.Id, ReportingMethod = "res:totalScore", LineItemOf = new Context { ContextId = model.ContextId }, AssignedActivity = new Activity { ActivityId = model.LineItem.AssignedActivity.ActivityId }, ScoreContraints = new NumericLimits { NormalMaximum = 100, ExtraCreditMaximum = 10, TotalMaximum = 110 }, Results = model.LineItem.Results }; var putLineItemResponse = await OutcomesClient.PutLineItem( putLineItem, model.LineItemsServiceUrl, model.ConsumerKey, model.ConsumerSecret); model.HttpRequest = putLineItemResponse.HttpRequest; model.HttpResponse = putLineItemResponse.HttpResponse; switch (putLineItemResponse.StatusCode) { case HttpStatusCode.OK: ViewBag.Message = "200 LineItem updated"; break; case HttpStatusCode.Unauthorized: ViewBag.Message = "401 Not authorized"; break; case HttpStatusCode.NotFound: ViewBag.Message = "404 Not found"; break; case HttpStatusCode.InternalServerError: ViewBag.Message = "500 Internal server error"; break; default: ViewBag.Message = Convert.ToInt32(putLineItemResponse.StatusCode) + " " + putLineItemResponse.StatusCode; break; } break; } return View(model); }
// LTI Outcomes reverse the relationship between Tool Consumers and Tool Providers. The Tool // Provider becomes a consumer of the Outcomes service hosted by the Tool Consumer. In this // sample, the Tool Provider and tell the Tool Consumer to save, read, and delete scores. #region Outcomes V2 (scores) /// <summary> /// Display the Outcomes V2 settings and provide buttons to exercise the three actions. /// </summary> public ActionResult Outcomes(string lineItemServiceUrl, string lineItemsServiceUrl, string contextId, string consumerKey, string consumerSecret) { var model = new LineItemModel { LineItemServiceUrl = lineItemServiceUrl, LineItemsServiceUrl = lineItemsServiceUrl, ConsumerKey = consumerKey, ConsumerSecret = consumerSecret, ContextId = contextId }; return View(model); }