public string SaveMedical(MemberMedical data)
        {
            if (data == null || data.Member == null || data.Member.Id == Guid.Empty)
            {
                ThrowSubmitErrors(new[] { new Web.Model.SubmitError {
                                              Error = "No user specified"
                                          } });
            }

            if (!(Permissions.IsAdmin || Permissions.IsMembershipForPerson(data.Member.Id) || Permissions.IsSelf(data.Member.Id)))
            {
                ThrowAuthError();
            }


            Model.Member        member  = db.Members.Include("MedicalInfo", "EmergencyContacts").Single(f => f.Id == data.Member.Id);
            Model.MemberMedical medical = member.MedicalInfo;
            if (medical == null)
            {
                medical            = new Model.MemberMedical();
                member.MedicalInfo = medical;
            }

            medical.EncryptedAllergies   = string.IsNullOrWhiteSpace(data.Allergies) ? null : EncryptionService.Protect(EncryptionService.MEMBER_SENSITIVE, data.Allergies);
            medical.EncryptedMedications = string.IsNullOrWhiteSpace(data.Medications) ? null : EncryptionService.Protect(EncryptionService.MEMBER_SENSITIVE, data.Medications);
            medical.EncryptedDisclosures = string.IsNullOrWhiteSpace(data.Disclosure) ? null : EncryptionService.Protect(EncryptionService.MEMBER_SENSITIVE, data.Disclosure);

            var existingContacts = db.Members.Where(f => f.Id == data.Member.Id).SelectMany(f => f.EmergencyContacts).ToDictionary(f => f.Id, f => f);

            List <EmergencyContact> desiredContacts = new List <EmergencyContact>(data.Contacts);

            foreach (var contact in desiredContacts)
            {
                var cData = new Model.EmergencyContactData
                {
                    Name     = contact.Name,
                    Relation = contact.Relation,
                    Type     = contact.Type,
                    Number   = contact.Number
                };

                Model.MemberEmergencyContact memberContact;
                if (existingContacts.TryGetValue(contact.Id, out memberContact))
                {
                    existingContacts.Remove(contact.Id);
                }

                if (string.IsNullOrWhiteSpace(contact.Name))
                {
                    // If there's no name, delete it.
                    if (memberContact != null)
                    {
                        member.EmergencyContacts.Remove(memberContact);
                    }
                    continue;
                }

                if (string.IsNullOrWhiteSpace(contact.Number))
                {
                    return(string.Format("{0}'s number is blank", contact.Name));
                }

                if (memberContact == null)
                {
                    memberContact = new Model.MemberEmergencyContact();
                    member.EmergencyContacts.Add(memberContact);
                }

                memberContact.EncryptedData = EncryptionService.Protect(EncryptionService.MEMBER_SENSITIVE, JsonConvert.SerializeObject(cData));
            }

            foreach (var leftover in existingContacts.Values)
            {
                member.EmergencyContacts.Remove(leftover);
            }
            db.SaveChanges();

            return("OK");
        }
        public string SaveMedical(MemberMedical data)
        {
            if (data == null || data.Member == null || data.Member.Id == Guid.Empty)
            ThrowSubmitErrors(new[] { new Web.Model.SubmitError { Error = "No user specified" } });

              if (!(Permissions.IsAdmin || Permissions.IsMembershipForPerson(data.Member.Id) || Permissions.IsSelf(data.Member.Id)))
            ThrowAuthError();

              Model.Member member = db.Members.Include("MedicalInfo", "EmergencyContacts").Single(f => f.Id == data.Member.Id);
              Model.MemberMedical medical = member.MedicalInfo;
              if (medical == null)
              {
            medical = new Model.MemberMedical();
            member.MedicalInfo = medical;
              }

              medical.EncryptedAllergies = string.IsNullOrWhiteSpace(data.Allergies) ? null : EncryptionService.Protect(EncryptionService.MEMBER_SENSITIVE, data.Allergies);
              medical.EncryptedMedications = string.IsNullOrWhiteSpace(data.Medications) ? null : EncryptionService.Protect(EncryptionService.MEMBER_SENSITIVE, data.Medications);
              medical.EncryptedDisclosures = string.IsNullOrWhiteSpace(data.Disclosure) ? null : EncryptionService.Protect(EncryptionService.MEMBER_SENSITIVE, data.Disclosure);

              var existingContacts = db.Members.Where(f => f.Id == data.Member.Id).SelectMany(f => f.EmergencyContacts).ToDictionary(f => f.Id, f => f);

              List<EmergencyContact> desiredContacts = new List<EmergencyContact>(data.Contacts);
              foreach (var contact in desiredContacts)
              {
            var cData = new Model.EmergencyContactData
            {
              Name = contact.Name,
              Relation = contact.Relation,
              Type = contact.Type,
              Number = contact.Number
            };

            Model.MemberEmergencyContact memberContact;
            if (existingContacts.TryGetValue(contact.Id, out memberContact))
            {
              existingContacts.Remove(contact.Id);
            }

            if (string.IsNullOrWhiteSpace(contact.Name))
            {
              // If there's no name, delete it.
              if (memberContact != null)
              {
            member.EmergencyContacts.Remove(memberContact);
              }
              continue;
            }

            if (string.IsNullOrWhiteSpace(contact.Number))
              return string.Format("{0}'s number is blank", contact.Name);

            if (memberContact == null)
            {
              memberContact = new Model.MemberEmergencyContact();
              member.EmergencyContacts.Add(memberContact);
            }

            memberContact.EncryptedData = EncryptionService.Protect(EncryptionService.MEMBER_SENSITIVE, JsonConvert.SerializeObject(cData));
              }

              foreach (var leftover in existingContacts.Values)
              {
            member.EmergencyContacts.Remove(leftover);
              }
              db.SaveChanges();

              return "OK";
        }