public async Task <IActionResult> PutSecurityCheck(int id, SecurityCheckUpdate update)
        {
            if (id != update.check.Id)
            {
                return(BadRequest());
            }
            if (!SecurityCheckExists(id))
            {
                return(NotFound());
            }
            if (!_context.SecurityChecks.Any(c => c.Id == id && c.Status == DeviceStatus.Submitted))
            {
                return(BadRequest("Expected security check status to be submitted."));
            }

            var device = await _context.Devices.FindAsync(update.check.DeviceId);

            if (device == null)
            {
                return(NotFound());
            }
            if (device.UserName != User.GetUserName())
            {
                return(Forbid());
            }

            DateTime now = DateTime.Now;

            foreach (var q in update.check.Questions)
            {
                _context.CreateOrUpdate(q);
            }
            update.check.Status = DeviceStatus.Submitted;
            update.check.StatusEffectiveDate   = now;
            _context.Entry(update.check).State = EntityState.Modified;

            if (device.Status != update.check.Status ||
                device.OS_Type != update.device.OS_Type ||
                device.OS_Version != update.device.OS_Version)
            {
                _context.DeviceHistories.Add(new DeviceHistory(device));
                device.DateEdit            = now;
                device.UserEditId          = User.GetUserName();
                device.Status              = update.check.Status;
                device.StatusEffectiveDate = now;
                device.OS_Type             = update.device.OS_Type;
                device.OS_Version          = update.device.OS_Version;
                _context.UpdateProperties(device, d => d.DateEdit, d => d.UserEditId,
                                          d => d.Status, d => d.StatusEffectiveDate, d => d.OS_Type, d => d.OS_Version);
            }

            await _context.SaveChangesAsync();

            return(NoContent());
        }
        public async Task <ActionResult <SecurityCheck> > PostSecurityCheck(SecurityCheckUpdate update)
        {
            var device = await _context.Devices.FindAsync(update.check.DeviceId);

            if (device == null)
            {
                return(NotFound());
            }

            string userName = User.GetUserName();

            if (device.UserName != userName)
            {
                return(Forbid());
            }

            await _context.Database.CreateExecutionStrategy().ExecuteAsync(async() => {
                var trans = _context.Database.BeginTransaction();

                DateTime now = DateTime.Now;
                update.check.SubmissionDate      = now;
                update.check.Status              = DeviceStatus.Submitted;
                update.check.StatusEffectiveDate = now;
                update.check.UserName            = userName;
                _context.SecurityChecks.Add(update.check);

                if (device.Status != update.check.Status ||
                    device.OS_Type != update.device.OS_Type ||
                    device.OS_Version != update.device.OS_Version)
                {
                    _context.DeviceHistories.Add(new DeviceHistory(device));
                    device.DateEdit            = now;
                    device.UserEditId          = User.GetUserName();
                    device.Status              = update.check.Status;
                    device.StatusEffectiveDate = now;
                    device.OS_Type             = update.device.OS_Type;
                    device.OS_Version          = update.device.OS_Version;
                    _context.UpdateProperties(device, d => d.DateEdit, d => d.UserEditId,
                                              d => d.Status, d => d.StatusEffectiveDate, d => d.OS_Type, d => d.OS_Version);
                }

                await _context.SaveChangesAsync();
                await trans.CommitAsync();
            });

            return(CreatedAtAction("GetSecurityCheck", new { id = update.check.Id }, update.check));
        }