public IActionResult GetDetail(int id, [FromQuery] BookingQueryProjection projection, [FromQuery] BookingQueryOptions options) { var getManagerType = projection.GetFieldsArr().Contains(BookingQueryProjection.MANAGER_TYPE); projection = new BookingQueryProjection { fields = BookingQueryProjection.DETAIL }; var entity = _service.GetBookingDetail(id, projection); if (entity == null) { return(NotFound(AppResult.NotFound())); } var validationData = _service.ValidateGetBookingDetail(entity, User, options); if (!validationData.IsValid) { return(BadRequest(AppResult.FailValidation(data: validationData))); } var obj = _service.GetBookingDynamic(entity, projection, options); if (getManagerType) { obj["manager_type"] = validationData.TempData["manager_type"]; } return(Ok(AppResult.Success(data: obj))); }
public ValidationData ValidateGetOwnerBookings( ClaimsPrincipal principal, DateTime date, BookingQueryProjection projection, BookingQueryOptions options) { var validationData = new ValidationData(); return(validationData); }
public async Task <QueryResult <object> > QueryCalendarDynamic( ClaimsPrincipal principal, Member member, BookingQueryProjection projection, DateTime date, IDictionary <string, object> tempData = null, BookingQueryOptions options = null) { var query = Bookings .BookedDate(date) .RelatedToMember(member.UserId) .Project(projection).ToList(); int? totalCount = null; var emailInfo = member.Email.GetEmailInfo(); List <Booking> fapBookings = new List <Booking>(); try { var defaultTimeZone = date.ToDefaultTimeZone(); if (emailInfo.Item2) { fapBookings = await Global.FapClient .GetFAPStudentBookings(emailInfo.Item3, defaultTimeZone); } else { fapBookings = await Global.FapClient .GetFAPTeacherBookings(emailInfo.Item3, defaultTimeZone); } } catch (Exception e) { _logger.Error(e); } query.AddRange(fapBookings); query = query.AsQueryable().SortOldestBookedDateFirst().ToList(); if (options != null) { if (options.count_total) { totalCount = query.Count; } } var results = GetBookingDynamic(query, projection, options); return(new QueryResult <object>() { Results = results, TotalCount = totalCount }); }
public static IQueryable <Booking> Project(this IQueryable <Booking> query, BookingQueryProjection model) { bool room = false, member = false, services = false; foreach (var f in model.GetFieldsArr()) { switch (f) { case BookingQueryProjection.ROOM: room = true; break; case BookingQueryProjection.MEMBER: member = true; break; case BookingQueryProjection.SERVICES: services = true; break; } } query = query.Select(o => new Booking { Archived = o.Archived, BookedDate = o.BookedDate, //BookingHistory = o.BookingHistory, BookMemberId = o.BookMemberId, Code = o.Code, FromTime = o.FromTime, Id = o.Id, Note = o.Note, NumOfPeople = o.NumOfPeople, Room = room ? o.Room : null, Status = o.Status, UsingMemberIds = o.UsingMemberIds, RoomCode = o.RoomCode, SentDate = o.SentDate, ToTime = o.ToTime, Feedback = o.Feedback, ManagerMessage = o.ManagerMessage, AttachedService = services ? o.AttachedService.AsQueryable() .Select(s => new AttachedService { Id = s.Id, BookingService = new BookingService { Code = s.BookingService.Code, Name = s.BookingService.Name } }).ToList() : null, BookMember = member ? o.BookMember : null, }); return(query); }
public ValidationData ValidateGetRoomBookings( ClaimsPrincipal principal, BookingQueryFilter filter, BookingQuerySort sort, BookingQueryProjection projection, BookingQueryPaging paging, BookingQueryOptions options) { var validationData = new ValidationData(); if (filter.to_date != null && filter.from_date != null && filter.to_date.Value.Subtract(filter.from_date.Value).TotalDays > 31) { validationData.Fail(mess: "Only 1 month range is allowed", code: AppResultCode.FailValidation); } return(validationData); }
public IEnumerable <object> GetBookingDynamic( IEnumerable <Booking> rows, BookingQueryProjection projection, BookingQueryOptions options) { var list = new List <IDictionary <string, object> >(); foreach (var o in rows) { var obj = GetBookingDynamic(o, projection, options); list.Add(obj); } if (options.group_by == BookingQueryOptions.GROUP_BY_DATE) { return(list.GroupBy(o => o["group_by_date_key"]).ToList()); } return(list); }
public async Task <IActionResult> GetCalendar( [FromQuery][DefaultDateTimeModelBinder] DateTime date, [FromQuery] BookingQueryProjection projection, [FromQuery] BookingQueryOptions options) { var validationData = _service.ValidateGetOwnerBookings( User, date, projection, options); if (!validationData.IsValid) { return(BadRequest(AppResult.FailValidation(data: validationData))); } var member = _memberService.Members.Id(UserId).FirstOrDefault(); var result = await _service.QueryCalendarDynamic(User, member, projection, date, validationData.TempData, options); return(Ok(AppResult.Success(data: result))); }
public async Task <IActionResult> GetRoomBookings([FromQuery][QueryObject] BookingQueryFilter filter, [FromQuery] BookingQuerySort sort, [FromQuery] BookingQueryProjection projection, [FromQuery] BookingQueryPaging paging, [FromQuery] BookingQueryOptions options) { var validationData = _service.ValidateGetRoomBookings( User, filter, sort, projection, paging, options); if (!validationData.IsValid) { return(BadRequest(AppResult.FailValidation(data: validationData))); } var result = await _service.QueryBookingDynamic( User, member : null, relationship : null, projection, validationData.TempData, filter, sort, paging, options); if (options.single_only && result == null) { return(NotFound(AppResult.NotFound())); } return(Ok(AppResult.Success(data: result))); }
public async Task <IActionResult> GetManagedRequests([FromQuery][QueryObject] BookingQueryFilter filter, [FromQuery] BookingQuerySort sort, [FromQuery] BookingQueryProjection projection, [FromQuery] BookingQueryPaging paging, [FromQuery] BookingQueryOptions options) { var validationData = _service.ValidateGetBookings( User, BookingPrincipalRelationship.Manager, filter, sort, projection, paging, options); if (!validationData.IsValid) { return(BadRequest(AppResult.FailValidation(data: validationData))); } var member = _memberService.Members.Id(UserId).FirstOrDefault(); var result = await _service.QueryBookingDynamic( User, member, BookingPrincipalRelationship.Manager, projection, validationData.TempData, filter, sort, paging, options); if (options.single_only && result == null) { return(NotFound(AppResult.NotFound())); } return(Ok(AppResult.Success(data: result))); }
public async Task <QueryResult <object> > QueryBookingDynamic( ClaimsPrincipal principal, Member member, BookingPrincipalRelationship?relationship, BookingQueryProjection projection, IDictionary <string, object> tempData = null, BookingQueryFilter filter = null, BookingQuerySort sort = null, BookingQueryPaging paging = null, BookingQueryOptions options = null) { var query = Bookings.AsNoTracking(); //---- multi-tenants ------ if (principal != null) { var memberId = principal.Identity.Name; switch (relationship) { case BookingPrincipalRelationship.Owner: query = query.RelatedToMember(memberId); break; case BookingPrincipalRelationship.Manager: query = QueryBookingsManagedByManager(member); break; } } //------------------------- if (filter != null) { query = query.Filter(filter, tempData); } 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 || !BookingQueryOptions.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 = GetBookingDynamic(single, projection, options); return(new QueryResult <object>() { SingleResult = singleResult }); } var results = GetBookingDynamic(queryResult, projection, options); return(new QueryResult <object>() { Results = results, TotalCount = totalCount }); }
public IDictionary <string, object> GetBookingDynamic( Booking row, BookingQueryProjection projection, BookingQueryOptions options) { var obj = new Dictionary <string, object>(); foreach (var f in projection.GetFieldsArr()) { switch (f) { case BookingQueryProjection.INFO: { var entity = row; obj["id"] = entity.Id; obj["code"] = entity.Code; var sentDate = entity.SentDate .ToTimeZone(options.time_zone, options.culture, Settings.Instance.SupportedLangs[0]); var timeStr = sentDate.ToString(dateFormat: AppDateTimeFormat.DEFAULT_FORMAT_FOR_CONVERT); obj["group_by_date_key"] = sentDate.ToString(dateFormat: AppDateTimeFormat.DEFAULT_DATE_FORMAT); obj["sent_date"] = new { display = timeStr, iso = $"{sentDate.ToUtc():s}Z" }; var bookedDate = entity.BookedDate .ToTimeZone(options.time_zone, options.culture, Settings.Instance.SupportedLangs[0]); timeStr = bookedDate.ToString(options.date_format, options.culture, Settings.Instance.SupportedLangs[0]); obj["booked_date"] = new { display = timeStr, iso = $"{bookedDate.ToUtc():s}Z" }; obj["from_time"] = entity.FromTime.ToString("hh\\:mm"); obj["to_time"] = entity.ToTime.ToString("hh\\:mm"); var startTime = bookedDate.Add(entity.FromTime); timeStr = startTime.ToString(dateFormat: AppDateTimeFormat.DEFAULT_FORMAT_FOR_CONVERT); obj["start_time"] = new { display = timeStr, iso = $"{startTime.ToUtc():s}Z" }; var finishTime = bookedDate.Add(entity.ToTime); timeStr = finishTime.ToString(dateFormat: AppDateTimeFormat.DEFAULT_FORMAT_FOR_CONVERT); obj["finish_time"] = new { display = timeStr, iso = $"{finishTime.ToUtc():s}Z" }; obj["type"] = entity.Id != 0 ? BookingTypeValues.BOOKING : BookingTypeValues.SCHEDULE; obj["status"] = entity.Status; obj["archived"] = entity.Archived; obj["book_member_id"] = entity.BookMemberId; obj["note"] = entity.Note; obj["num_of_people"] = entity.NumOfPeople; obj["manager_message"] = entity.ManagerMessage; obj["feedback"] = entity.Feedback; } break; case BookingQueryProjection.SELECT: { var entity = row; obj["id"] = entity.Code; obj["code"] = entity.Code; } break; case BookingQueryProjection.ROOM: { var entity = row.Room; if (entity != null) { obj["room"] = new { code = entity.Code, name = entity.Name } } ; } break; case BookingQueryProjection.SERVICES: { var entities = row.AttachedService? .Select(o => new { id = o.Id, code = o.BookingService.Code, name = o.BookingService.Name }).ToList(); obj["attached_services"] = entities; } break; case BookingQueryProjection.MEMBER: { var entity = row.BookMember; if (entity != null) { obj["book_member"] = new { user_id = entity.UserId, email = entity.Email, code = entity.Code } } ; } break; case BookingQueryProjection.USING_EMAILS: { if (row.UsingMemberIds != null) { var ids = row.UsingMemberIds.Split('\n'); var usingEmails = _memberService.Members.Ids(ids) .Select(o => o.Email).ToList(); obj["using_emails"] = usingEmails; } } break; } } return(obj); }
public Booking GetBookingDetail(int id, BookingQueryProjection projection) { var entity = Bookings.Id(id).Project(projection).FirstOrDefault(); return(entity); }