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 async Task <string> PushNotiToUser(AppUser entity, PushNotiModel model) { var result = await NotiHelper.Notify(entity.Id, new Notification { Body = model.Body, ImageUrl = string.IsNullOrWhiteSpace(model.ImageUrl) ? null : model.ImageUrl, Title = model.Title, }, model.Data); return(result); }
public async Task <IActionResult> UpdateBooking(int id, UpdateBookingModel model) { var entity = _service.Bookings.Id(id).FirstOrDefault(); if (entity == null) { return(NotFound(AppResult.NotFound())); } var member = _memberService.Members.Id(UserId).FirstOrDefault(); var validationData = _service.ValidateUpdateBooking(User, member, entity, model); if (!validationData.IsValid) { return(BadRequest(AppResult.FailValidation(data: validationData))); } var fromStatus = entity.Status; AppEvent ev; using (var trans = context.Database.BeginTransaction()) { _service.UpdateBooking(model, entity); var history = _service.CreateHistoryForUpdateBooking(entity, member); //log event ev = _sysService.GetEventForBookingProcessing(history); _sysService.CreateAppEvent(ev); //end log event context.SaveChanges(); trans.Commit(); } //notify using members var notiData = new Dictionary <string, string> { { "event", ev.Type }, { "id", entity.Id.ToString() } }; var updatePerson = fromStatus == BookingStatusValues.PROCESSING ? "department manager" : "location manager"; var usingMemberIds = entity.UsingMemberIds.Split('\n'); var notiMemberIds = usingMemberIds.Where(o => o != UserId).ToList(); await NotiHelper.Notify(notiMemberIds, new Notification { Title = $"Booking {entity.Code} has been updated by your {updatePerson}", Body = $"{UserEmail} has just updated your booking of room {entity.RoomCode}. Press for more detail" }, data : notiData); return(NoContent()); }
public async Task <IActionResult> ChangeApproveStatusOfBooking(int id, ChangeApprovalStatusOfBookingModel model) { var entity = _service.Bookings.Id(id).FirstOrDefault(); if (entity == null) { return(NotFound(AppResult.NotFound())); } var member = _memberService.Members.Id(UserId).FirstOrDefault(); var validationData = _service.ValidateChangeApprovalStausOfBooking(User, member, entity, model); if (!validationData.IsValid) { return(BadRequest(AppResult.FailValidation(data: validationData))); } var fromStatus = entity.Status; AppEvent ev; using (var trans = context.Database.BeginTransaction()) { _service.ChangeApprovalStatusOfBooking(model, entity); var history = _service.CreateHistoryForChangeApprovalStatusOfBooking( entity, fromStatus, model.IsApproved, member); //log event ev = _sysService.GetEventForBookingProcessing(history); _sysService.CreateAppEvent(ev); //end log event context.SaveChanges(); trans.Commit(); } //notify using members, managers (if any) var notiData = new Dictionary <string, string> { { "event", ev.Type }, { "id", entity.Id.ToString() } }; var approvePerson = fromStatus == BookingStatusValues.PROCESSING ? "department manager" : "location manager"; var action = model.IsApproved ? "approved" : "denied"; var usingMemberIds = entity.UsingMemberIds.Split('\n'); var notiMemberIds = usingMemberIds.Where(o => o != UserId).ToList(); var notiMembers = NotiHelper.Notify(notiMemberIds, new Notification { Title = $"Booking {entity.Code} has been {action} by your {approvePerson}", Body = $"{UserEmail} has just {action} your booking. Press for more detail" }, data: notiData); if (entity.Status == BookingStatusValues.VALID && model.IsApproved) { var managerIds = _memberService.QueryManagersOfArea(entity.Room.BuildingAreaCode) .Select(o => o.UserId).ToList(); if (managerIds.Count > 0) { await NotiHelper.Notify(managerIds, new Notification { Title = $"There's a new booking request", Body = $"{UserEmail} has just {action} a booking of room {entity.RoomCode}. Press for more detail" }, data : notiData); } } await notiMembers; return(NoContent()); }
public async Task <IActionResult> CancelBooking(int id, CancelBookingModel model) { var entity = _service.Bookings.Id(id).FirstOrDefault(); if (entity == null) { return(NotFound(AppResult.NotFound())); } var validationData = _service.ValidateCancelBooking(User, entity, model); if (!validationData.IsValid) { return(BadRequest(AppResult.FailValidation(data: validationData))); } var fromStatus = entity.Status; AppEvent ev; using (var trans = context.Database.BeginTransaction()) { _service.CancelBooking(model, entity); var history = _service.CreateHistoryForCancelBooking(entity, fromStatus, entity.BookMember); //log event ev = _sysService.GetEventForBookingProcessing(history); _sysService.CreateAppEvent(ev); //end log event context.SaveChanges(); trans.Commit(); } //notify using members, managers (if any) var notiData = new Dictionary <string, string> { { "event", ev.Type }, { "id", entity.Id.ToString() } }; var notiMemberIds = entity.UsingMemberIds.Split('\n') .Where(o => o != UserId).ToList(); var notiMembers = notiMemberIds.Any() ? NotiHelper.Notify(notiMemberIds, new Notification { Title = $"Your booking {entity.Code} has been aborted", Body = $"{UserEmail} has just aborted booking {entity.Code}. Press for more detail" }, data: notiData) : Task.CompletedTask; var managerNoti = new Notification { Title = $"A booking managed by you has been aborted", Body = $"{UserEmail} has just aborted booking {entity.Code}. Press for more detail" }; if (entity.Status == BookingStatusValues.VALID) { var managerIds = _memberService.QueryManagersOfMember(entity.BookMemberId) .Select(o => o.UserId).ToList(); if (managerIds.Count > 0) { await NotiHelper.Notify(managerIds, managerNoti, data : notiData); } } else if (entity.Status == BookingStatusValues.APPROVED) { var managerIds = _memberService.QueryManagersOfArea(entity.Room.BuildingAreaCode) .Select(o => o.UserId).ToList(); if (managerIds.Count > 0) { await NotiHelper.Notify(managerIds, managerNoti, data : notiData); } } await notiMembers; return(NoContent()); }
public async Task <IActionResult> Create(CreateBookingModel model) { var memberQuery = _memberService.Members; var member = _memberService.Members.Id(UserId).FirstOrDefault(); var validationData = _service.ValidateCreateBooking(User, member, model); if (!validationData.IsValid) { return(BadRequest(AppResult.FailValidation(data: validationData))); } var usingMemberIds = validationData.GetTempData <List <string> >("using_member_ids"); var bookedRoom = validationData.GetTempData <Room>("booked_room"); AppEvent ev; Booking entity; using (var trans = context.Database.BeginTransaction()) { entity = _service.CreateBooking(member, bookedRoom, model, usingMemberIds); var history = _service.CreateHistoryForCreateBooking(entity, member); _roomService.ChangeRoomHangingStatus(bookedRoom, false, UserId); //log event ev = _sysService.GetEventForBookingProcessing(history); _sysService.CreateAppEvent(ev); //end log event context.SaveChanges(); trans.Commit(); } //notify using members, managers (if any) var notiData = new Dictionary <string, string> { { "event", ev.Type }, { "id", entity.Id.ToString() } }; var notiMemberIds = usingMemberIds.Where(o => o != UserId).ToList(); var notiMembers = notiMemberIds.Any() ? NotiHelper.Notify(notiMemberIds, new Notification { Title = $"You have a new booking", Body = $"{UserEmail} has just created a booking of room {entity.RoomCode} for you. Press for more detail" }, data: notiData) : Task.CompletedTask; var managerNoti = new Notification { Title = $"There's a new booking request", Body = $"{UserEmail} has just created a booking of room {entity.RoomCode}. Press for more detail" }; if (entity.Status == BookingStatusValues.PROCESSING) { var managerIds = _memberService.QueryManagersOfMember(member.UserId) .Select(o => o.UserId).ToList(); if (managerIds.Count > 0) { await NotiHelper.Notify(managerIds, managerNoti, data : notiData); } } else if (entity.Status == BookingStatusValues.VALID) { var managerIds = _memberService.QueryManagersOfArea(bookedRoom.BuildingAreaCode) .Select(o => o.UserId).ToList(); if (managerIds.Count > 0) { await NotiHelper.Notify(managerIds, managerNoti, data : notiData); } } await notiMembers; return(Created($"/{ApiEndpoint.BOOKING_API}/{entity.Id}", AppResult.Success(data: entity.Id))); }