public async Task <IActionResult> CheckRoomStatus(string code,
                                                          CheckRoomStatusModel model)
        {
            var entity = _service.Rooms.Code(code).FirstOrDefault();

            if (entity == null)
            {
                return(NotFound(AppResult.NotFound()));
            }
            var validationData = _service.ValidateCheckRoomStatus(User, entity, model);

            if (!validationData.IsValid)
            {
                return(BadRequest(AppResult.FailValidation(data: validationData)));
            }
            AppEvent ev;

            using (var trans = context.Database.BeginTransaction())
            {
                var oldNote   = entity.Note;
                var oldStatus = entity.IsAvailable;
                _service.CheckRoomStatus(model, entity);
                //log event
                ev = _sysService.GetEventForRoomProcessing(
                    $"{UserEmail} has changed the status of room {entity.Code}",
                    "Room_CheckStatus", UserId, new
                {
                    old_note   = oldNote,
                    old_status = oldStatus,
                    new_note   = entity.Note,
                    new_status = entity.IsAvailable
                });
                _sysService.CreateAppEvent(ev);
                //end log event
                trans.Commit();
                context.SaveChanges();
            }
            //notify managers
            var notiData = new Dictionary <string, string>
            {
                { "event", ev.Type },
                { "id", entity.Code.ToString() }
            };
            var managerIds = _memberService.QueryManagersOfDepartment(entity.DepartmentCode)
                             .Union(_memberService.QueryManagersOfArea(entity.BuildingAreaCode))
                             .Select(o => o.UserId).ToList();

            if (managerIds.Count > 0)
            {
                await NotiHelper.Notify(managerIds, new Notification
                {
                    Title = $"Status of room {entity.Code} has been changed",
                    Body  = $"{UserEmail} has changed the status of room {entity.Code}. Pressed for more detail"
                }, data : notiData);
            }
            return(NoContent());
        }
        public Room CheckRoomStatus(CheckRoomStatusModel model, Room entity)
        {
            model.CopyTo(entity);
            var map = entity.RoomResource.ToDictionary(o => o.Id);

            foreach (var o in model.CheckResources)
            {
                map[o.Id].IsAvailable = o.IsAvailable;
            }
            return(entity);
        }
        public ValidationData ValidateCheckRoomStatus(
            ClaimsPrincipal principal,
            Room entity, CheckRoomStatusModel model)
        {
            var validationData    = new ValidationData();
            var userId            = principal.Identity.Name;
            var roomValidCheckers = _memberService.AreaMembers.OfArea(entity.BuildingAreaCode)
                                    .Select(o => o.MemberId).ToList();

            if (!roomValidCheckers.Contains(userId))
            {
                validationData.Fail(code: AppResultCode.AccessDenied);
            }
            return(validationData);
        }