public async Task <IHttpActionResult> EditLearnRequest(int id, EDCLearnRequestEditBindingModel model) { if (!CheckInputEditLearnRequest(model)) { var msg = "There is something wrong with input."; var modelError = EDCExceptionFactory.GenerateHttpError(msg, EDCWebServiceErrorType.Error, true); var response = Request.CreateErrorResponse(HttpStatusCode.BadRequest, modelError); throw new HttpResponseException(response); } var learnRequest = await db.LearnRequests.Include(p => p.RegisteredStudents) .Where(p => p.ID == id).SingleOrDefaultAsync(); if (learnRequest == null) { var msg = "Can't find the learn request."; var modelError = EDCExceptionFactory.GenerateHttpError(msg, EDCWebServiceErrorType.Error, true); var response = Request.CreateErrorResponse(HttpStatusCode.NotFound, modelError); throw new HttpResponseException(response); } //see if the request new time and date is already existed var times = TimeConversionUtils.GetStartAndEndTime(model.Time); var startTime = times[0]; var endTime = times[1]; var newRequest = await db.LearnRequests.Include(p => p.RegisteredStudents).Where(p => p.Date == model.Date && p.StartTime == startTime && p.EndTime == endTime).SingleOrDefaultAsync(); if (newRequest != null) { var already = newRequest.RegisteredStudents.Where(p => p.StudentName == User.Identity.Name).SingleOrDefault(); if (already != null) { var msg = "Your requested new date and time are already existed."; var modelError = EDCExceptionFactory.GenerateHttpError(msg, EDCWebServiceErrorType.Warning, true); var response = Request.CreateErrorResponse(HttpStatusCode.BadRequest, modelError); throw new HttpResponseException(response); } } //need to remove the student from the current request var student = await db.Students.FindAsync(User.Identity.Name); learnRequest.RegisteredStudents.Remove(student); if (newRequest == null) { newRequest = new EDCLearnRequest { Date = model.Date, StartTime = times[0], EndTime = times[1], RegisteredStudents = new List <EDCStudent>() }; newRequest.RegisteredStudents.Add(student); string teacherName = "*****@*****.**"; db.AssignTeacherToLearnRequest(newRequest, teacherName); db.LearnRequests.Add(newRequest); //db.RunCommand(sql, new SqlParameter("@Id",id)); try { // await db.SaveChangesToDbAsync(); db.SaveChangesToDb(); } catch (DbUpdateConcurrencyException ex) { var entry = ex.Entries.Single(); var values = entry.CurrentValues; } } else { newRequest.RegisteredStudents.Add(student); db.SetEntityModified <EDCLearnRequest>(newRequest); // db.RunCommand(sql, new SqlParameter("@Id", id)); try { // await db.SaveChangesToDbAsync(); db.SaveChangesToDb(); } catch (DbUpdateConcurrencyException ex) { var entry = ex.Entries.Single(); var values = entry.CurrentValues; } } return(StatusCode(HttpStatusCode.NoContent)); }
public async Task <IHttpActionResult> PostLearnRequest(string name, EDCLearnRequestBindingModel model) { if (!CheckInputLearnRequest(model)) { var msg = "There is something wrong with the input."; var modelError = EDCExceptionFactory.GenerateHttpError(msg, EDCWebServiceErrorType.Error, true); var response = Request.CreateErrorResponse(HttpStatusCode.BadRequest, modelError); throw new HttpResponseException(response); } // var name = User.Identity.Name; var student = await db.Students.Where(p => p.StudentName == name).SingleOrDefaultAsync(); var learnRequestObjs = new List <EDCLearnRequest>(); foreach (var l in model.LearnRequests) { var date = l.Date; string shortDate; TimeConversionUtils.GetDate(date, out shortDate); var dateFromDb = db.LearnRequests.Where(p => p.Date == shortDate).Include(p => p.RegisteredStudents); if (dateFromDb.Count() > 0) { foreach (var t in l.Times) { string[] times = TimeConversionUtils.GetStartAndEndTime(t); bool needBuildNew = true; EDCLearnRequest existed = null; foreach (var temp in dateFromDb) { if (times[0] == temp.StartTime && times[1] == temp.EndTime) { existed = temp; needBuildNew = false; break; } } if (needBuildNew) { var obj = await GenerateLearnRequest(date, times[0], times[1], name); if (obj != null) { learnRequestObjs.Add(obj); } } else { if (existed != null) { existed.RegisteredStudents.Add(student); } } } } else { foreach (var t in l.Times) { string[] timesTemp = TimeConversionUtils.GetStartAndEndTime(t); var obj = await GenerateLearnRequest(date, timesTemp[0], timesTemp[1], name); if (obj != null) { learnRequestObjs.Add(obj); } } } } if (learnRequestObjs.Count > 0) { string teacherName = "*****@*****.**"; var tasks = new List <Task>(); foreach (var l in learnRequestObjs) { db.AssignTeacherToLearnRequest(l, teacherName); } foreach (var l in learnRequestObjs) { db.LearnRequests.Add(l); } } try { await db.SaveChangesToDbAsync(); } catch (Exception) { var msg = "There are some internal errors happened."; var modelError = EDCExceptionFactory.GenerateHttpError(msg, EDCWebServiceErrorType.Error, true); var response = Request.CreateErrorResponse(HttpStatusCode.InternalServerError, modelError); throw new HttpResponseException(response); } return(Ok()); }