public ValidationData ValidateGetRooms( RoomQueryFilter filter, RoomQuerySort sort, RoomQueryProjection projection, RoomQueryPaging paging, RoomQueryOptions options) { var validationData = new ValidationData(); if (filter.empty) { if (filter.date == null || filter.from_time == null || filter.to_time == null || filter.num_of_people == null || filter.room_type == null) { validationData.Fail(mess: "Invalid input data", AppResultCode.FailValidation); } if (filter.from_time >= filter.to_time) { validationData.Fail(mess: "Time range is not valid", AppResultCode.FailValidation); } if (validationData.IsValid) { DateTime currentTime = DateTime.UtcNow; var bookedTime = filter.date?.AddMinutes(filter.from_time.Value.TotalMinutes); if (currentTime >= bookedTime) { validationData.Fail(mess: "Booked time must be greater than current", AppResultCode.FailValidation); } } } return(validationData); }
public ValidationData ValidateGetRoomDetail( Room entity, bool hanging, RoomQueryOptions options) { var validationData = new ValidationData(); var now = DateTime.UtcNow; if (entity.HangingEndTime > now && hanging) { validationData.Fail(mess: "Room is being booked. Please come back later", AppResultCode.AccessDenied); } return(validationData); }
public List <IDictionary <string, object> > GetRoomDynamic( IEnumerable <Room> rows, RoomQueryProjection projection, RoomQueryOptions options) { var list = new List <IDictionary <string, object> >(); foreach (var o in rows) { var obj = GetRoomDynamic(o, projection, options); list.Add(obj); } return(list); }
public async Task <IActionResult> Get([FromQuery][QueryObject] RoomQueryFilter filter, [FromQuery] RoomQuerySort sort, [FromQuery] RoomQueryProjection projection, [FromQuery] RoomQueryPaging paging, [FromQuery] RoomQueryOptions options) { var validationData = _service.ValidateGetRooms( filter, sort, projection, paging, options); if (!validationData.IsValid) { return(BadRequest(AppResult.FailValidation(data: validationData))); } var result = await _service.QueryRoomDynamic(UserId, projection, validationData.TempData, filter, sort, paging, options); if (options.single_only && result == null) { return(NotFound(AppResult.NotFound())); } return(Ok(AppResult.Success(data: result))); }
public IActionResult GetDetail(string code, [FromQuery] RoomQueryProjection projection, [FromQuery] RoomQueryOptions options, bool hanging = false) { var checkerValid = projection.GetFieldsArr().Contains(RoomQueryProjection.CHECKER_VALID); projection = new RoomQueryProjection { fields = RoomQueryProjection.DETAIL }; var entity = _service.Rooms.Code(code).FirstOrDefault(); if (entity == null) { return(NotFound(AppResult.NotFound())); } var validationData = _service.ValidateGetRoomDetail(entity, hanging, options); if (!validationData.IsValid) { return(BadRequest(AppResult.FailValidation(data: validationData))); } if (hanging) { _service.ReleaseHangingRoomByHangingUserId(UserId); _service.ChangeRoomHangingStatus(entity, true, UserId); context.SaveChanges(); } var obj = _service.GetRoomDynamic(entity, projection, options); if (checkerValid) { var isRoomChecker = User.IsInRole(RoleName.ROOM_CHECKER); var valid = _memberService.AreaMembers.OfArea(entity.BuildingAreaCode).Select(o => o.MemberId) .Contains(UserId) && isRoomChecker; obj["checker_valid"] = valid; } return(Ok(AppResult.Success(data: obj))); }
public async Task <QueryResult <IDictionary <string, object> > > QueryRoomDynamic( string userId, RoomQueryProjection projection, IDictionary <string, object> tempData = null, RoomQueryFilter filter = null, RoomQuerySort sort = null, RoomQueryPaging paging = null, RoomQueryOptions options = null) { var query = Rooms.AsNoTracking(); if (filter != null) { query = await query.FilterAsync(filter, userId, tempData, context.Booking); } int?totalCount = null; Task <int> countTask = null; var countQuery = query; query = query.Project(projection); if (options != null && !options.single_only) { #region List query if (sort != null) { query = query.Sort(sort); } if (paging != null && (!options.load_all || !RoomQueryOptions.IsLoadAllAllowed)) { query = query.SelectPage(paging.page, paging.limit); } #endregion #region Count query if (options.count_total) { countTask = countQuery.CountAsync(); } #endregion } if (options != null && options.count_total) { totalCount = await countTask; } var queryResult = await query.ToListAsync(); if (options != null && options.single_only) { var single = queryResult.FirstOrDefault(); if (single == null) { return(null); } var singleResult = GetRoomDynamic(single, projection, options); return(new QueryResult <IDictionary <string, object> >() { SingleResult = singleResult }); } var results = GetRoomDynamic(queryResult, projection, options); return(new QueryResult <IDictionary <string, object> >() { Results = results, TotalCount = totalCount }); }
public IDictionary <string, object> GetRoomDynamic( Room row, RoomQueryProjection projection, RoomQueryOptions options) { var obj = new Dictionary <string, object>(); foreach (var f in projection.GetFieldsArr()) { switch (f) { case RoomQueryProjection.INFO: { var entity = row; obj["archived"] = entity.Archived; obj["area_size"] = entity.AreaSize; obj["is_available"] = entity.IsAvailable; obj["area_code"] = entity.BuildingAreaCode; obj["block_code"] = entity.BuildingBlockCode; obj["level_code"] = entity.BuildingLevelCode; obj["active_from_time"] = entity.ActiveFromTime.ToString("hh\\:mm"); obj["active_to_time"] = entity.ActiveToTime.ToString("hh\\:mm"); obj["code"] = entity.Code; obj["department_code"] = entity.DepartmentCode; obj["description"] = entity.Description; if (entity.HangingEndTime > DateTime.UtcNow) { var time = entity.HangingStartTime.Value .ToTimeZone(options.time_zone, options.culture, Settings.Instance.SupportedLangs[0]); var timeStr = time.ToString(options.date_format, options.culture, Settings.Instance.SupportedLangs[0]); obj["hanging_start"] = new { display = timeStr, iso = $"{time.ToUtc():s}Z" }; time = entity.HangingEndTime.Value .ToTimeZone(options.time_zone, options.culture, Settings.Instance.SupportedLangs[0]); timeStr = time.ToString(options.date_format, options.culture, Settings.Instance.SupportedLangs[0]); obj["hanging_end"] = new { display = timeStr, iso = $"{time.ToUtc():s}Z" }; } obj["name"] = entity.Name; obj["people_capacity"] = entity.PeopleCapacity; obj["room_type_code"] = entity.RoomTypeCode; obj["note"] = entity.Note; } break; case RoomQueryProjection.SELECT: { var entity = row; obj["code"] = entity.Code; obj["name"] = entity.Name; } break; case RoomQueryProjection.AREA: { var entity = row.BuildingArea; if (entity != null) { obj["area"] = new { code = entity.Code, name = entity.Name } } ; } break; case RoomQueryProjection.BLOCK: { var entity = row.BuildingLevel?.BuildingBlock; if (entity != null) { obj["block"] = new { code = entity.Code, name = entity.Name } } ; } break; case RoomQueryProjection.DEPARTMENT: { var entity = row.Department; if (entity != null) { obj["department"] = new { code = entity.Code, name = entity.Name } } ; } break; case RoomQueryProjection.LEVEL: { var entity = row.BuildingLevel; if (entity != null) { obj["level"] = new { code = entity.Code, name = entity.Name } } ; } break; case RoomQueryProjection.ROOM_TYPE: { var entity = row.RoomType; obj["room_type"] = new { code = entity.Code, name = entity.Name }; } break; case RoomQueryProjection.RESOURCES: { var entities = row.RoomResource.Select(o => new { id = o.Id, name = o.Name, code = o.Code, is_available = o.IsAvailable, }).ToList(); obj["resources"] = entities; } break; } } return(obj); }