public void Delete(Guid id)
        {
            if (!User.IsInRole("cdb.trainingeditors"))
            {
                ThrowAuthError();
            }

            List <string> files = new List <string>();

            var item     = GetObjectOrNotFound(() => db.TrainingAward.FirstOrDefault(f => f.Id == id));
            var memberId = item.Member.Id;

            db.TrainingAward.Remove(item);
            db.SaveChanges();
            Data.TrainingRecordCalculator calculator = new Data.TrainingRecordCalculator(db);
            calculator.Calculate(memberId);
            db.SaveChanges();
        }
        public TrainingRecord Post([FromBody] TrainingRecord view)
        {
            //TODO - Move validation errors to API way of doing things
            log.DebugFormat("POST {0} {1} {2}", Request.RequestUri, User.Identity.Name, JsonConvert.SerializeObject(view));
            if (!User.IsInRole("cdb.trainingeditors"))
            {
                ThrowAuthError();
            }
            //     if (!Permissions.IsAdmin && !Permissions.IsSelf(view.MemberId) && !Permissions.IsMembershipForPerson(view.MemberId)) return GetAjaxLoginError<MemberContactView>(null);
            //List<SubmitError> errors = new List<SubmitError>();

            //if (view.Member.Id == Guid.Empty)
            //{
            //    ThrowSubmitErrors(new [] { new SubmitError { Error = Strings.API_Required, Property = "Member" } });
            //}

            Data.TrainingAward model;
            model = (from a in db.TrainingAward.Include("Member").Include("Course") where a.Id == view.ReferenceId select a).FirstOrDefault();

            if (model == null)
            {
                model        = new Data.TrainingAward();
                model.Member = db.Members.Where(f => f.Id == view.Member.Id).FirstOrDefault();
                //if (model.Member == null)
                //{
                //    errors.Add(new SubmitError { Property = "Member", Error = Strings.API_NotFound });
                //    ThrowSubmitErrors(errors);
                //}
                db.TrainingAward.Add(model);
            }

            //try
            //{
            model.UploadsPending = (view.PendingUploads > 0);

            DateTime completed;

            if (string.IsNullOrWhiteSpace(view.Completed))
            {
                //                    errors.Add(new SubmitError { Property = "Completed", Error = Strings.API_Required });
            }
            else if (!DateTime.TryParse(view.Completed, out completed))
            {
                //                    errors.Add(new SubmitError { Error = Strings.API_InvalidDate, Property = "Completed" });
            }
            else
            {
                model.Completed = completed;
            }

            if (model.metadata != view.Comments)
            {
                model.metadata = view.Comments;
            }

            if (model.Member.Id != view.Member.Id)
            {
                throw new InvalidOperationException("Don't know how to change member yet");
            }

            if (view.Course.Id == null)
            {
                //                  errors.Add(new SubmitError { Error = Strings.API_Required, Id = new[] { view.ReferenceId }, Property = "Course" });
            }
            else if (model.Course == null || model.Course.Id != view.Course.Id)
            {
                model.Course = (from c in db.TrainingCourses where c.Id == view.Course.Id select c).First();
            }

            switch (view.ExpirySrc)
            {
            case "default":
                model.Expiry = model.Course.ValidMonths.HasValue ? model.Completed.AddMonths(model.Course.ValidMonths.Value) : (DateTime?)null;
                break;

            case "custom":
                if (!string.IsNullOrWhiteSpace(view.Expires))
                {
                    model.Expiry = DateTime.Parse(view.Expires);
                }
                else
                {
                    //                        errors.Add(new SubmitError { Error = Strings.API_TrainingRecord_CustomExpiryRequired, Property = "Expiry", Id = new[] { view.ReferenceId } });
                }
                break;

            case "never":
                model.Expiry = null;
                break;
            }

            // Documentation required.
            if (!model.UploadsPending && string.IsNullOrWhiteSpace(model.metadata))
            {
                //              errors.Add(new SubmitError { Error = Strings.API_TrainingRecord_DocumentationRequired, Property = BaseApiController.ModelRootNodeName });
            }

            // Prevent duplicate records
            if (db.TrainingAward.Where(f => f.Id != model.Id && f.Completed == model.Completed && f.Course.Id == model.Course.Id && f.Member.Id == model.Member.Id).Count() > 0)
            {
                //            ThrowSubmitErrors(new [] { new SubmitError { Error = Strings.API_TrainingRecord_Duplicate, Id = new[] { model.Id }, Property = BaseApiController.ModelRootNodeName }});
            }

            //if (errors.Count == 0)
            //{
            db.SaveChanges();
            Data.TrainingRecordCalculator calculator = new Data.TrainingRecordCalculator(db);
            calculator.Calculate(model.Member.Id);
            db.SaveChanges();
            //}

            view.ReferenceId  = model.Id;
            view.Course.Title = model.Course.DisplayName;
            //}
            //catch (RuleViolationsException ex)
            //{
            //  foreach (RuleViolation v in ex.Errors)
            //  {
            //    errors.Add(new SubmitError { Error = v.ErrorMessage, Property = v.PropertyName, Id = new[] { v.EntityKey } });
            //  }
            //  // throw new InvalidOperationException("TODO: report errors");
            //}

            //if (errors.Count > 0)
            //{
            //  ThrowSubmitErrors(errors);
            //}

            return(view);
        }