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); }