// 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-2 (scores) /// <summary> /// Display the Outcomes V2 settings and provide buttons to exercise the three actions. /// </summary> public ActionResult Outcomes2(string lineItemServiceUrl, string lineItemsServiceUrl, string resultServiceUrl, string resultsServiceUrl, string contextId, string consumerKey, string consumerSecret) { var model = new Outcomes2Model { LineItemServiceUrl = lineItemServiceUrl, LineItemsServiceUrl = lineItemsServiceUrl, ResultServiceUrl = resultServiceUrl, ResultsServiceUrl = resultsServiceUrl, ConsumerKey = consumerKey, ConsumerSecret = consumerSecret, ContextId = contextId }; return(View(model)); }
public async Task <ActionResult> Outcomes2(Outcomes2Model model, string submit) { switch (submit) { case "Delete LineItem (Delete)": 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 (Read)": 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 LineItemResults (Read)": var getLineItemResultsResponse = await OutcomesClient.GetLineItemWithResults( model.LineItemServiceUrl, model.ConsumerKey, model.ConsumerSecret); model.HttpRequest = getLineItemResultsResponse.HttpRequest; model.HttpResponse = getLineItemResultsResponse.HttpResponse; switch (getLineItemResultsResponse.StatusCode) { case HttpStatusCode.OK: model.LineItem = getLineItemResultsResponse.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(getLineItemResultsResponse.StatusCode) + " " + getLineItemResultsResponse.StatusCode; break; } break; case "Get LineItems (Read)": var getLineItemsResponse = await OutcomesClient.GetLineItems( model.LineItemsServiceUrl, model.ConsumerKey, model.ConsumerSecret, activityId : model.LineItem.AssignedActivity.ActivityId); 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 (Create)": var postLineItem = new LineItem { ReportingMethod = "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 (Update)": var putLineItem = new LineItem { Id = model.LineItem.Id, ReportingMethod = "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; case "Delete Result (Delete)": var deleteResultResponse = await OutcomesClient.DeleteResult( model.ResultServiceUrl, model.ConsumerKey, model.ConsumerSecret); model.HttpRequest = deleteResultResponse.HttpRequest; model.HttpResponse = deleteResultResponse.HttpResponse; switch (deleteResultResponse.StatusCode) { case HttpStatusCode.OK: model.LineItem = null; ModelState.Clear(); ViewBag.Message = "200 Result 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(deleteResultResponse.StatusCode) + " " + deleteResultResponse.StatusCode; break; } break; case "Get Result (Read)": var getResultResponse = await OutcomesClient.GetResult( model.ResultServiceUrl, model.ConsumerKey, model.ConsumerSecret); model.HttpRequest = getResultResponse.HttpRequest; model.HttpResponse = getResultResponse.HttpResponse; switch (getResultResponse.StatusCode) { case HttpStatusCode.OK: model.Result = getResultResponse.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(getResultResponse.StatusCode) + " " + getResultResponse.StatusCode; break; } break; case "Get Results (Read)": var getResultsResponse = await OutcomesClient.GetResults( model.ResultsServiceUrl, model.ConsumerKey, model.ConsumerSecret); model.HttpRequest = getResultsResponse.HttpRequest; model.HttpResponse = getResultsResponse.HttpResponse; switch (getResultsResponse.StatusCode) { case HttpStatusCode.OK: ViewBag.Message = "200 Results 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(getResultsResponse.StatusCode) + " " + getResultsResponse.StatusCode; break; } break; case "Post Result (Create)": var postResult = new LisResult { Comment = "Good job!", ResultAgent = new LisPerson { UserId = "12345" }, ResultOf = new Uri(model.LineItemServiceUrl), ResultScore = "0.75", ResultScoreConstraints = new NumericLimits { TotalMaximum = 1 }, ResultStatus = ResultStatus.Completed, TotalScore = (decimal?)0.75 }; var postResultResponse = await OutcomesClient.PostResult( postResult, model.ResultServiceUrl, model.ConsumerKey, model.ConsumerSecret); model.HttpRequest = postResultResponse.HttpRequest; model.HttpResponse = postResultResponse.HttpResponse; switch (postResultResponse.StatusCode) { case HttpStatusCode.Created: //model.LineItem = postResult.Outcome; ModelState.Clear(); ViewBag.Message = "201 Result 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(postResultResponse.StatusCode) + " " + postResultResponse.StatusCode; break; } break; case "Put Result (Update)": var putResult = new LisResult { Comment = "Good job!", ResultAgent = new LisPerson { UserId = "12345" }, ResultOf = new Uri(model.LineItemServiceUrl), ResultScore = "0.75", ResultScoreConstraints = new NumericLimits { TotalMaximum = 1 }, ResultStatus = ResultStatus.Final, // Change the status to Final TotalScore = (decimal?)0.75 }; var putResultResponse = await OutcomesClient.PutResult( putResult, model.ResultServiceUrl, model.ConsumerKey, model.ConsumerSecret); model.HttpRequest = putResultResponse.HttpRequest; model.HttpResponse = putResultResponse.HttpResponse; switch (putResultResponse.StatusCode) { case HttpStatusCode.OK: ViewBag.Message = "200 Result 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(putResultResponse.StatusCode) + " " + putResultResponse.StatusCode; break; } break; } return(View(model)); }