/// <summary> /// /// </summary> /// <remarks>Returns History for a particular SchoolBus</remarks> /// <param name="id">id of SchoolBus to fetch SchoolBusHistory for</param> /// <response code="200">OK</response> public virtual IActionResult SchoolbusesIdHistoryGetAsync(int id, int?offset, int?limit) { bool exists = _context.SchoolBuss.Any(a => a.Id == id); if (exists) { SchoolBus schoolBus = _context.SchoolBuss .Include(x => x.History) .First(a => a.Id == id); List <History> data = schoolBus.History.OrderByDescending(y => y.LastUpdateTimestamp).ToList(); if (offset == null) { offset = 0; } if (limit == null) { limit = data.Count() - offset; } List <HistoryViewModel> result = new List <HistoryViewModel>(); for (int i = (int)offset; i < data.Count() && i < offset + limit; i++) { result.Add(data[i].ToViewModel(id)); } return(new ObjectResult(result)); } else { // record not found return(new StatusCodeResult(404)); } }
/// <summary> /// /// </summary> /// <remarks>Add a History record to the SchoolBus</remarks> /// <param name="id">id of SchoolBus to fetch History for</param> /// <param name="item"></param> /// <response code="201">History created</response> public virtual IActionResult SchoolbusesIdHistoryPostAsync(int id, History item) { HistoryViewModel result = new HistoryViewModel(); bool exists = _context.SchoolBuss.Any(a => a.Id == id); if (exists) { SchoolBus schoolBus = _context.SchoolBuss .Include(x => x.History) .First(a => a.Id == id); if (schoolBus.History == null) { schoolBus.History = new List <History>(); } // force add item.Id = 0; schoolBus.History.Add(item); _context.SchoolBuss.Update(schoolBus); _context.SaveChanges(); } result.HistoryText = item.HistoryText; result.Id = item.Id; result.LastUpdateTimestamp = item.LastUpdateTimestamp; result.LastUpdateUserid = item.LastUpdateUserid; result.AffectedEntityId = id; return(new ObjectResult(result)); }
/// <summary> /// /// </summary> /// <remarks>Returns CCWData for a particular Schoolbus</remarks> /// <param name="id">id of SchoolBus to fetch CCWData for</param> /// <response code="200">OK</response> public virtual IActionResult SchoolbusesIdCcwdataGetAsync(int id) { // validate the bus id bool exists = _context.SchoolBuss.Any(a => a.Id == id); if (exists) { SchoolBus schoolbus = _context.SchoolBuss.Where(a => a.Id == id).First(); string regi = schoolbus.ICBCRegistrationNumber; // get CCW data for this bus. // could be none. // validate the bus id bool ccw_exists = _context.CCWDatas.Any(a => a.ICBCRegistrationNumber == regi); if (ccw_exists) { var result = _context.CCWDatas.Where(a => a.ICBCRegistrationNumber == regi).First(); return(new ObjectResult(result)); } else { // record not found CCWData[] nodata = new CCWData[0]; return(new ObjectResult(nodata)); } } else { // record not found return(new StatusCodeResult(404)); } }
/// <summary> /// Basic file receiver for .NET Core /// </summary> /// <param name="id">Schoolbus Id</param> /// <param name="files">Files to add to attachments</param> /// <returns></returns> public IActionResult SchoolbusesIdAttachmentsPostAsync(int id, IList <IFormFile> files) { // validate the bus id bool exists = _context.SchoolBuss.Any(a => a.Id == id); if (exists) { SchoolBus schoolbus = _context.SchoolBuss .Include(x => x.Attachments) .Include(x => x.HomeTerminalCity) .Include(x => x.SchoolDistrict) .Include(x => x.SchoolBusOwner.PrimaryContact) .Include(x => x.District.Region) .Include(x => x.Inspector) .Include(x => x.CCWData) .First(a => a.Id == id); AddFilesToAttachments(schoolbus.Attachments, files); _context.SchoolBuss.Update(schoolbus); _context.SaveChanges(); List <AttachmentViewModel> result = MappingExtensions.GetAttachmentListAsViewModel(schoolbus.Attachments); return(new ObjectResult(result)); } else { // record not found return(new StatusCodeResult(404)); } }
/// <summary> /// /// </summary> /// <param name="item"></param> /// <response code="201">Inspection created</response> public virtual IActionResult InspectionsPostAsync(Inspection item) { if (item != null) { if (item.Inspector != null) { int user_id = item.Inspector.Id; bool user_exists = _context.Users.Any(a => a.Id == user_id); if (user_exists) { User user = _context.Users.First(a => a.Id == user_id); item.Inspector = user; } else { item.Inspector = null; } } // adjust the schoolbus if (item.SchoolBus != null) { int schoolbus_id = item.SchoolBus.Id; bool schoolbus_exists = _context.SchoolBuss.Any(a => a.Id == schoolbus_id); if (schoolbus_exists) { SchoolBus schoolbus = _context.SchoolBuss.First(a => a.Id == schoolbus_id); item.SchoolBus = schoolbus; } else { item.SchoolBus = null; } } var exists = _context.Inspections.Any(a => a.Id == item.Id); if (exists) { _context.Inspections.Update(item); // Save the changes _context.SaveChanges(); return(new ObjectResult(item)); } else { // Inspection has a special field, createdDate which is set to now. item.CreatedDate = DateTime.UtcNow; _context.Inspections.Add(item); } _context.SaveChanges(); return(new ObjectResult(item)); } else { // no data return(new StatusCodeResult(400)); } }
/// <summary> /// Creates a new school bus /// </summary> /// <remarks>The Location response-header field is used to redirect the recipient to a location other than the Request-URI for completion of the request or identification of a new resource. For 201 (Created) responses, the Location is that of the new resource which was created by the request. The field value consists of a single absolute URI. </remarks> /// <param name="item"></param> /// <response code="201">SchoolBus created</response> public virtual IActionResult AddBusAsync(SchoolBus item) { // adjust school bus owner if (item.SchoolBusOwner != null) { int school_bus_owner_id = item.SchoolBusOwner.Id; bool school_bus_owner_exists = _context.SchoolBusOwners.Any(a => a.Id == school_bus_owner_id); if (school_bus_owner_exists) { SchoolBusOwner school_bus_owner = _context.SchoolBusOwners.First(a => a.Id == school_bus_owner_id); item.SchoolBusOwner = school_bus_owner; } } // adjust service area. if (item.ServiceArea != null) { int service_area_id = item.ServiceArea.Id; bool service_area_exists = _context.ServiceAreas.Any(a => a.Id == service_area_id); if (service_area_exists) { ServiceArea service_area = _context.ServiceAreas.First(a => a.Id == service_area_id); item.ServiceArea = service_area; } } // adjust school district if (item.SchoolBusDistrict != null) { int schoolbus_district_id = item.SchoolBusDistrict.Id; bool schoolbus_district_exists = _context.SchoolDistricts.Any(a => a.Id == schoolbus_district_id); if (schoolbus_district_exists) { SchoolDistrict school_district = _context.SchoolDistricts.First(a => a.Id == schoolbus_district_id); item.SchoolBusDistrict = school_district; } } // adjust home city if (item.HomeTerminalCity != null) { int city_id = item.HomeTerminalCity.Id; bool city_exists = _context.Cities.Any(a => a.Id == city_id); if (city_exists) { City city = _context.Cities.First(a => a.Id == city_id); item.HomeTerminalCity = city; } } _context.SchoolBuss.Add(item); _context.SaveChanges(); return(new ObjectResult(item)); }
/// <summary> /// /// </summary> /// <param name="body"></param> /// <response code="201">Inspections created</response> public virtual IActionResult InspectionsBulkPostAsync(Inspection[] items) { if (items == null) { return(new BadRequestResult()); } foreach (Inspection item in items) { // adjust the user if (item.Inspector != null) { int user_id = item.Inspector.Id; bool user_exists = _context.Users.Any(a => a.Id == user_id); if (user_exists) { User user = _context.Users.First(a => a.Id == user_id); item.Inspector = user; } else { item.Inspector = null; } } // adjust the schoolbus if (item.SchoolBus != null) { int schoolbus_id = item.SchoolBus.Id; bool schoolbus_exists = _context.SchoolBuss.Any(a => a.Id == schoolbus_id); if (schoolbus_exists) { SchoolBus schoolbus = _context.SchoolBuss.First(a => a.Id == schoolbus_id); item.SchoolBus = schoolbus; } else { item.SchoolBus = null; } } bool exists = _context.Inspections.Any(a => a.Id == item.Id); if (exists) { _context.Inspections.Update(item); } else { // Inspection has a special field, createdDate which is set to now. item.CreatedDate = DateTime.UtcNow; _context.Inspections.Add(item); } } // Save the changes _context.SaveChanges(); return(new NoContentResult()); }
/// <summary> /// /// </summary> /// <param name="id">id of Inspection to fetch</param> /// <response code="200">OK</response> /// <response code="404">Inspection not found</response> public virtual IActionResult InspectionsIdPutAsync(int id, Inspection item) { // adjust the user if (item.Inspector != null) { int user_id = item.Inspector.Id; bool user_exists = _context.Users.Any(a => a.Id == user_id); if (user_exists) { User user = _context.Users.First(a => a.Id == user_id); item.Inspector = user; } else { item.Inspector = null; } } // adjust the schoolbus if (item.SchoolBus != null) { int schoolbus_id = item.SchoolBus.Id; bool schoolbus_exists = _context.SchoolBuss.Any(a => a.Id == schoolbus_id); if (schoolbus_exists) { SchoolBus schoolbus = _context.SchoolBuss.First(a => a.Id == schoolbus_id); item.SchoolBus = schoolbus; } else { item.SchoolBus = null; } } var exists = _context.Inspections.Any(a => a.Id == id); if (exists && id == item.Id) { _context.Inspections.Update(item); // Save the changes _context.SaveChanges(); return(new ObjectResult(item)); } else { // record not found return(new StatusCodeResult(404)); } }
/// <summary> /// Utility function used by the owner view service /// </summary> /// <param name="schoolBusOwnerId">Owner for which to lookup inspections</param> /// <returns>Date of next inspection, or null if there is none</returns> private DateTime?GetNextInspectionDate(int schoolBusOwnerId) { DateTime?result = null; // next inspection is drawn from the schoolbus table bool exists = _context.SchoolBuss.Any(x => x.SchoolBusOwner.Id == schoolBusOwnerId && x.NextInspectionDate != null && x.Status.ToLower() == "active"); if (exists) { SchoolBus schoolbus = _context.SchoolBuss.Where(x => x.SchoolBusOwner.Id == schoolBusOwnerId && x.NextInspectionDate != null && x.Status.ToLower() == "active") .OrderByDescending(x => x.NextInspectionDate) .First(); result = schoolbus.NextInspectionDate; } return(result); }
/// <summary> /// /// </summary> /// <param name="id">id of Inspection to delete</param> /// <param name="isAdmin">is current user has permission of ADMIN</param> /// /// <response code="200">OK</response> /// <response code="404">Inspection not found</response> public virtual IActionResult InspectionsIdDeletePostAsync(int id, bool isAdmin) { var exists = _context.Inspections.Any(a => a.Id == id); if (exists) { var item = _context.Inspections.Include(x => x.SchoolBus).First(a => a.Id == id); // Delete Inspection has special behavior. // By design, an Inspector is only able to delete an Inspection 24 hours after it has been entered. // Also, the related Schoolbus will be updated with the value of the PreviousNextInspectionDate and PreviousNextInspectionType fields. // first check to see if we are allowed to delete. if (item.CreatedDate > DateTime.UtcNow.AddDays(-1) || isAdmin) { // update the Schoolbus record. if (item.SchoolBus != null) { int schoolbusId = item.SchoolBus.Id; bool schoolbus_exists = _context.SchoolBuss.Any(x => x.Id == schoolbusId); if (schoolbus_exists) { SchoolBus schoolbus = _context.SchoolBuss.First(x => x.Id == schoolbusId); schoolbus.NextInspectionDate = item.PreviousNextInspectionDate; schoolbus.NextInspectionTypeCode = item.PreviousNextInspectionTypeCode; _context.Update(schoolbus); } } _context.Inspections.Remove(item); // Save the changes _context.SaveChanges(); return(new ObjectResult(item)); } else { // forbidden return(new StatusCodeResult(403)); } } else { // record not found return(new StatusCodeResult(404)); } }
/// <summary> /// Updates a single school bus object /// </summary> /// <remarks></remarks> /// <param name="id">Id of SchoolBus to fetch</param> /// <response code="200">OK</response> /// <response code="404">Not Found</response> public virtual IActionResult SchoolbusesIdPutAsync(int id, SchoolBus body) { var exists = _context.SchoolBuss.Any(a => a.Id == id); if (exists && id == body.Id) { _context.SchoolBuss.Update(body); // Save the changes _context.SaveChanges(); return(new ObjectResult(body)); } else { // record not found return(new StatusCodeResult(404)); } }
/// <summary> /// /// </summary> /// <remarks>Returns notes for a particular SchoolBus.</remarks> /// <param name="id">id of SchoolBus to fetch notes for</param> /// <response code="200">OK</response> /// <response code="404">SchoolBus not found</response> public virtual IActionResult SchoolbusesIdNotesGetAsync(int id) { bool exists = _context.SchoolBuss.Any(a => a.Id == id); if (exists) { SchoolBus schoolBus = _context.SchoolBuss .Include(x => x.Notes) .First(a => a.Id == id); var result = schoolBus.Notes; return(new ObjectResult(result)); } else { // record not found return(new StatusCodeResult(404)); } }
/// <summary> /// /// </summary> /// <remarks>Returns attachments for a particular SchoolBus</remarks> /// <param name="id">id of SchoolBus to fetch attachments for</param> /// <response code="200">OK</response> /// <response code="404">SchoolBus not found</response> public virtual IActionResult SchoolbusesIdAttachmentsGetAsync(int id) { bool exists = _context.SchoolBuss.Any(a => a.Id == id); if (exists) { SchoolBus schoolBus = _context.SchoolBuss .Include(x => x.Attachments) .First(a => a.Id == id); var result = MappingExtensions.GetAttachmentListAsViewModel(schoolBus.Attachments); return(new ObjectResult(result)); } else { // record not found return(new StatusCodeResult(404)); } }
/// <summary> /// Updates a single school bus object /// </summary> /// <remarks></remarks> /// <param name="id">Id of SchoolBus to fetch</param> /// <response code="200">OK</response> /// <response code="404">Not Found</response> public virtual IActionResult SchoolbusesIdPutAsync(int id, SchoolBus item) { // adjust school bus owner AdjustSchoolBus(item); bool exists = _context.SchoolBuss.Any(a => a.Id == id); if (exists && id == item.Id) { _context.SchoolBuss.Update(item); // Save the changes _context.SaveChanges(); return(new ObjectResult(item)); } else { // record not found return(new StatusCodeResult(404)); } }
/// <summary> /// /// </summary> /// <param name="item"></param> /// <response code="201">SchoolBus created</response> public virtual IActionResult SchoolbusesPostAsync(SchoolBus item) { // adjust school bus owner AdjustSchoolBus(item); bool exists = _context.SchoolBuss.Any(a => a.Id == item.Id); if (exists) { _context.SchoolBuss.Update(item); // Save the changes } else { // record not found _context.SchoolBuss.Add(item); } _context.SaveChanges(); return(new ObjectResult(item)); }
/// <summary> /// /// </summary> /// <param name="id">id of Inspection to delete</param> /// <response code="200">OK</response> /// <response code="404">Inspection not found</response> public virtual IActionResult InspectionsIdDeletePostAsync(int id) { // Delete Inspection has special behavior. // By design, an Inspector is only able to delete an Inspection 24 hours after it has been entered. // Admin user still can delete it any time. // Also, the related Schoolbus will be updated with the value of the PreviousNextInspectionDate and PreviousNextInspectionType fields. if (!_context.Inspections.Any(a => a.Id == id)) { return(new StatusCodeResult(404)); } var item = _context.Inspections.Include(x => x.SchoolBus).First(a => a.Id == id); if (item.CreatedDate <= DateTime.UtcNow.AddDays(-1) && !User.IsSystemAdmin()) { return(new StatusCodeResult(403)); } // update the Schoolbus record. if (item.SchoolBus != null) { int schoolbusId = item.SchoolBus.Id; bool schoolbus_exists = _context.SchoolBuss.Any(x => x.Id == schoolbusId); if (schoolbus_exists) { SchoolBus schoolbus = _context.SchoolBuss.First(x => x.Id == schoolbusId); schoolbus.NextInspectionDate = item.PreviousNextInspectionDate; schoolbus.NextInspectionTypeCode = item.PreviousNextInspectionTypeCode; _context.Update(schoolbus); } } _context.Inspections.Remove(item); // Save the changes _context.SaveChanges(); return(new ObjectResult(item)); }
/// <summary> /// Integration test for GetAllBuses /// </summary> public async void TestBusSearch() { //setup test // create a district var request = new HttpRequestMessage(HttpMethod.Post, "/api/districts"); District district = new District(); string jsonString = district.ToJson(); request.Content = new StringContent(jsonString, Encoding.UTF8, "application/json"); var response = await _client.SendAsync(request); response.EnsureSuccessStatusCode(); // parse as JSON. jsonString = await response.Content.ReadAsStringAsync(); district = JsonConvert.DeserializeObject <District>(jsonString); var district_id = district.Id; // create a schoolbus owner. request = new HttpRequestMessage(HttpMethod.Post, "/api/schoolbusowners"); SchoolBusOwner schoolBusOwner = new SchoolBusOwner(); jsonString = schoolBusOwner.ToJson(); request.Content = new StringContent(jsonString, Encoding.UTF8, "application/json"); response = await _client.SendAsync(request); response.EnsureSuccessStatusCode(); // parse as JSON. jsonString = await response.Content.ReadAsStringAsync(); schoolBusOwner = JsonConvert.DeserializeObject <SchoolBusOwner>(jsonString); var schoolBusOwner_id = schoolBusOwner.Id; // create a bus request = new HttpRequestMessage(HttpMethod.Post, "/api/schoolbuses"); // create a new schoolbus. SchoolBus schoolbus = new SchoolBus(); schoolbus.Status = "Active"; schoolbus.District = district; schoolbus.SchoolBusOwner = schoolBusOwner; schoolbus.VehicleIdentificationNumber = "1234"; schoolbus.LicencePlateNumber = "12345"; DateTime nextInspection = DateTime.UtcNow; schoolbus.NextInspectionDate = nextInspection; jsonString = schoolbus.ToJson(); request.Content = new StringContent(jsonString, Encoding.UTF8, "application/json"); response = await _client.SendAsync(request); response.EnsureSuccessStatusCode(); // parse as JSON. jsonString = await response.Content.ReadAsStringAsync(); schoolbus = JsonConvert.DeserializeObject <SchoolBus>(jsonString); // get the id var id = schoolbus.Id; // make a change. string testStatus = "1"; schoolbus.Status = "Active"; // now do an update. request = new HttpRequestMessage(HttpMethod.Put, "/api/schoolbuses/" + id); request.Content = new StringContent(schoolbus.ToJson(), Encoding.UTF8, "application/json"); response = await _client.SendAsync(request); response.EnsureSuccessStatusCode(); // do a get. request = new HttpRequestMessage(HttpMethod.Get, "/api/schoolbuses/" + id); response = await _client.SendAsync(request); response.EnsureSuccessStatusCode(); // parse as JSON. jsonString = await response.Content.ReadAsStringAsync(); schoolbus = JsonConvert.DeserializeObject <SchoolBus>(jsonString); // test the search var parametersToAdd = new System.Collections.Generic.Dictionary <string, string> { { "district", "[" + district_id + "]" } }; SchoolBus[] searchresults = await SearchHelper(parametersToAdd); Assert.NotNull(searchresults); Assert.NotEqual(searchresults.Length, 0); bool found = false; foreach (SchoolBus item in searchresults) { if (item.Id == id) { found = true; } } Assert.Equal(found, true); parametersToAdd = new System.Collections.Generic.Dictionary <string, string> { { "owner", "" + schoolBusOwner_id } }; searchresults = await SearchHelper(parametersToAdd); Assert.NotNull(searchresults); Assert.NotEqual(searchresults.Length, 0); found = false; foreach (SchoolBus item in searchresults) { if (item.Id == id) { found = true; } } Assert.Equal(found, true); parametersToAdd = new System.Collections.Generic.Dictionary <string, string> { { "vin", "1234" } }; searchresults = await SearchHelper(parametersToAdd); Assert.NotNull(searchresults); Assert.NotEqual(searchresults.Length, 0); found = false; foreach (SchoolBus item in searchresults) { if (item.Id == id) { found = true; } } Assert.Equal(found, true); parametersToAdd = new System.Collections.Generic.Dictionary <string, string> { { "plate", "12345" } }; searchresults = await SearchHelper(parametersToAdd); Assert.NotNull(searchresults); Assert.NotEqual(searchresults.Length, 0); found = false; foreach (SchoolBus item in searchresults) { if (item.Id == id) { found = true; } } Assert.Equal(found, true); // now test the owner view. request = new HttpRequestMessage(HttpMethod.Get, "/api/schoolbusowners/" + schoolBusOwner_id + "/view"); response = await _client.SendAsync(request); response.EnsureSuccessStatusCode(); // parse as JSON. jsonString = await response.Content.ReadAsStringAsync(); SchoolBusOwnerViewModel model = JsonConvert.DeserializeObject <SchoolBusOwnerViewModel>(jsonString); // should be one bus. Assert.Equal(model.NumberOfBuses, 1); Assert.Equal(model.NextInspectionDate.Value.Hour, nextInspection.Hour); Assert.Equal(model.NextInspectionDate.Value.Minute, nextInspection.Minute); Assert.Equal(model.NextInspectionDate.Value.Second, nextInspection.Second); // teardown request = new HttpRequestMessage(HttpMethod.Post, "/api/schoolbuses/" + id + "/delete"); response = await _client.SendAsync(request); response.EnsureSuccessStatusCode(); // should get a 404 if we try a get now. request = new HttpRequestMessage(HttpMethod.Get, "/api/schoolbuses/" + id); response = await _client.SendAsync(request); Assert.Equal(response.StatusCode, HttpStatusCode.NotFound); // cleanup service area. request = new HttpRequestMessage(HttpMethod.Post, "/api/districts/" + district_id + "/delete"); response = await _client.SendAsync(request); response.EnsureSuccessStatusCode(); // should get a 404 if we try a get now. request = new HttpRequestMessage(HttpMethod.Get, "/api/districts/" + district_id); response = await _client.SendAsync(request); Assert.Equal(response.StatusCode, HttpStatusCode.NotFound); // cleanup schoolbus owner request = new HttpRequestMessage(HttpMethod.Post, "/api/schoolbusowners/" + schoolBusOwner_id + "/delete"); response = await _client.SendAsync(request); response.EnsureSuccessStatusCode(); // should get a 404 if we try a get now. request = new HttpRequestMessage(HttpMethod.Get, "/api/schoolbusowners/" + schoolBusOwner_id); response = await _client.SendAsync(request); Assert.Equal(response.StatusCode, HttpStatusCode.NotFound); }
/// <summary> /// Adjust a SchoolBus item to ensure child object data is in place correctly /// </summary> /// <param name="item"></param> private void AdjustSchoolBus(SchoolBus item) { if (item != null) { if (item.SchoolBusOwner != null) { int school_bus_owner_id = item.SchoolBusOwner.Id; bool school_bus_owner_exists = _context.SchoolBusOwners.Any(a => a.Id == school_bus_owner_id); if (school_bus_owner_exists) { SchoolBusOwner school_bus_owner = _context.SchoolBusOwners.First(a => a.Id == school_bus_owner_id); item.SchoolBusOwner = school_bus_owner; } else // invalid data { item.SchoolBusOwner = null; } } // adjust District. if (item.District != null) { int district_id = item.District.Id; var district_exists = _context.ServiceAreas.Any(a => a.Id == district_id); if (district_exists) { District district = _context.Districts.First(a => a.Id == district_id); item.District = district; } else { item.District = null; } } // adjust school district if (item.SchoolDistrict != null) { int schoolDistrict_id = item.SchoolDistrict.Id; bool schoolDistrict_exists = _context.SchoolDistricts.Any(a => a.Id == schoolDistrict_id); if (schoolDistrict_exists) { SchoolDistrict school_district = _context.SchoolDistricts.First(a => a.Id == schoolDistrict_id); item.SchoolDistrict = school_district; } else // invalid data { item.SchoolDistrict = null; } } // adjust home city if (item.HomeTerminalCity != null) { int city_id = item.HomeTerminalCity.Id; bool city_exists = _context.Cities.Any(a => a.Id == city_id); if (city_exists) { City city = _context.Cities.First(a => a.Id == city_id); item.HomeTerminalCity = city; } else // invalid data { item.HomeTerminalCity = null; } } // adjust inspector if (item.Inspector != null) { int inspector_id = item.Inspector.Id; bool inspector_exists = _context.Users.Any(a => a.Id == inspector_id); if (inspector_exists) { User inspector = _context.Users.First(a => a.Id == inspector_id); item.Inspector = inspector; } else // invalid data { item.Inspector = null; } } // adjust CCWData if (item.CCWData != null) { int ccwdata_id = item.CCWData.Id; bool ccwdata_exists = _context.CCWDatas.Any(a => a.Id == ccwdata_id); if (ccwdata_exists) { CCWData ccwdata = _context.CCWDatas.First(a => a.Id == ccwdata_id); item.CCWData = ccwdata; } else // invalid data { item.CCWData = null; } } } }
/// <summary> /// Returns a PDF Permit /// </summary> /// <param name="id"></param> /// <returns></returns> public virtual IActionResult SchoolbusesIdPdfpermitGetAsync(int id) { FileContentResult result = null; bool exists = _context.SchoolBuss.Any(a => a.Id == id); if (exists) { SchoolBus schoolBus = _context.SchoolBuss .Include(x => x.CCWData) .Include(x => x.SchoolBusOwner.PrimaryContact) .Include(x => x.SchoolDistrict) .First(a => a.Id == id); // construct the view model. PermitViewModel permitViewModel = new PermitViewModel(); // only do the ICBC fields if the CCW data is available. if (schoolBus.CCWData != null) { permitViewModel.IcbcMake = schoolBus.CCWData.ICBCMake; permitViewModel.IcbcModelYear = schoolBus.CCWData.ICBCModelYear; permitViewModel.IcbcRegistrationNumber = schoolBus.CCWData.ICBCRegistrationNumber; permitViewModel.VehicleIdentificationNumber = schoolBus.CCWData.ICBCVehicleIdentificationNumber; } permitViewModel.PermitIssueDate = null; if (schoolBus.PermitIssueDate != null) { // Since the PDF template is raw HTML and won't convert a date object, we must adjust the time zone here. TimeZoneInfo tzi = null; try { // try the IANA timzeone first. tzi = TimeZoneInfo.FindSystemTimeZoneById("America / Vancouver"); } catch (Exception e) { tzi = null; } if (tzi == null) { try { tzi = TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time"); } catch (Exception e) { tzi = null; } } DateTime dto = DateTime.UtcNow; if (tzi != null) { dto = TimeZoneInfo.ConvertTime((DateTime)schoolBus.PermitIssueDate, tzi); } else { dto = (DateTime)schoolBus.PermitIssueDate; } permitViewModel.PermitIssueDate = dto.ToString("yyyy-MM-dd"); } permitViewModel.PermitNumber = schoolBus.PermitNumber; permitViewModel.RestrictionsText = schoolBus.RestrictionsText; if (schoolBus.SchoolBusOwner != null && schoolBus.SchoolBusOwner.PrimaryContact != null) { permitViewModel.SchoolBusOwnerAddressLine1 = schoolBus.SchoolBusOwner.PrimaryContact.Address1; permitViewModel.SchoolBusOwnerAddressLine2 = schoolBus.SchoolBusOwner.PrimaryContact.Address2; permitViewModel.SchoolBusOwnerName = schoolBus.SchoolBusOwner.Name; } permitViewModel.SchoolBusSeatingCapacity = schoolBus.SchoolBusSeatingCapacity; if (schoolBus.SchoolDistrict != null) { permitViewModel.SchoolDistrictshortName = schoolBus.SchoolDistrict.ShortName; } string payload = JsonConvert.SerializeObject(permitViewModel); // pass the request on to the PDF Micro Service string pdfHost = Configuration["PDF_SERVICE_NAME"]; string targetUrl = pdfHost + "/api/PDF/GetPDF"; // call the microservice try { HttpClient client = new HttpClient(); var request = new HttpRequestMessage(HttpMethod.Post, targetUrl); request.Content = new StringContent(payload, Encoding.UTF8, "application/json"); request.Headers.Clear(); // transfer over the request headers. foreach (var item in Request.Headers) { string key = item.Key; string value = item.Value; request.Headers.Add(key, value); } Task <HttpResponseMessage> responseTask = client.SendAsync(request); responseTask.Wait(); HttpResponseMessage response = responseTask.Result; if (response.StatusCode == HttpStatusCode.OK) // success { var bytetask = response.Content.ReadAsByteArrayAsync(); bytetask.Wait(); result = new FileContentResult(bytetask.Result, "application/pdf"); result.FileDownloadName = "Permit-" + schoolBus.PermitNumber + ".pdf"; } } catch (Exception e) { result = null; } // check that the result has a value if (result != null) { return(result); } else { return(new StatusCodeResult(400)); // problem occured } } else { // record not found return(new StatusCodeResult(404)); } }
/// <summary> /// Integration test for GetAllBuses /// </summary> public async void TestBusSearch() { //setup test // create a service area. var request = new HttpRequestMessage(HttpMethod.Post, "/api/serviceareas"); ServiceArea servicearea = new ServiceArea(); string jsonString = servicearea.ToJson(); request.Content = new StringContent(jsonString, Encoding.UTF8, "application/json"); var response = await _client.SendAsync(request); response.EnsureSuccessStatusCode(); // parse as JSON. jsonString = await response.Content.ReadAsStringAsync(); servicearea = JsonConvert.DeserializeObject <ServiceArea>(jsonString); var servicearea_id = servicearea.Id; // create a schoolbus owner. request = new HttpRequestMessage(HttpMethod.Post, "/api/schoolbusowners"); SchoolBusOwner schoolBusOwner = new SchoolBusOwner(); jsonString = schoolBusOwner.ToJson(); request.Content = new StringContent(jsonString, Encoding.UTF8, "application/json"); response = await _client.SendAsync(request); response.EnsureSuccessStatusCode(); // parse as JSON. jsonString = await response.Content.ReadAsStringAsync(); schoolBusOwner = JsonConvert.DeserializeObject <SchoolBusOwner>(jsonString); var schoolBusOwner_id = schoolBusOwner.Id; // create a bus request = new HttpRequestMessage(HttpMethod.Post, "/api/schoolbuses"); // create a new schoolbus. SchoolBus schoolbus = new SchoolBus(); schoolbus.Status = "Active"; schoolbus.ServiceArea = servicearea; schoolbus.SchoolBusOwner = schoolBusOwner; schoolbus.VIN = "1234"; schoolbus.Plate = "12345"; jsonString = schoolbus.ToJson(); request.Content = new StringContent(jsonString, Encoding.UTF8, "application/json"); response = await _client.SendAsync(request); response.EnsureSuccessStatusCode(); // parse as JSON. jsonString = await response.Content.ReadAsStringAsync(); schoolbus = JsonConvert.DeserializeObject <SchoolBus>(jsonString); // get the id var id = schoolbus.Id; // make a change. string testStatus = "1"; schoolbus.Status = "Active"; // now do an update. request = new HttpRequestMessage(HttpMethod.Put, "/api/schoolbuses/" + id); request.Content = new StringContent(schoolbus.ToJson(), Encoding.UTF8, "application/json"); response = await _client.SendAsync(request); response.EnsureSuccessStatusCode(); // do a get. request = new HttpRequestMessage(HttpMethod.Get, "/api/schoolbuses/" + id); response = await _client.SendAsync(request); response.EnsureSuccessStatusCode(); // parse as JSON. jsonString = await response.Content.ReadAsStringAsync(); schoolbus = JsonConvert.DeserializeObject <SchoolBus>(jsonString); // test the search var parametersToAdd = new System.Collections.Generic.Dictionary <string, string> { { "servicearea", "[" + servicearea_id + "]" } }; SchoolBus[] searchresults = await SearchHelper(parametersToAdd); Assert.NotNull(searchresults); Assert.NotEqual(searchresults.Length, 0); bool found = false; foreach (SchoolBus item in searchresults) { if (item.Id == id) { found = true; } } Assert.Equal(found, true); parametersToAdd = new System.Collections.Generic.Dictionary <string, string> { { "owner", "" + schoolBusOwner_id } }; searchresults = await SearchHelper(parametersToAdd); Assert.NotNull(searchresults); Assert.NotEqual(searchresults.Length, 0); found = false; foreach (SchoolBus item in searchresults) { if (item.Id == id) { found = true; } } Assert.Equal(found, true); parametersToAdd = new System.Collections.Generic.Dictionary <string, string> { { "vin", "1234" } }; searchresults = await SearchHelper(parametersToAdd); Assert.NotNull(searchresults); Assert.NotEqual(searchresults.Length, 0); found = false; foreach (SchoolBus item in searchresults) { if (item.Id == id) { found = true; } } Assert.Equal(found, true); parametersToAdd = new System.Collections.Generic.Dictionary <string, string> { { "plate", "12345" } }; searchresults = await SearchHelper(parametersToAdd); Assert.NotNull(searchresults); Assert.NotEqual(searchresults.Length, 0); found = false; foreach (SchoolBus item in searchresults) { if (item.Id == id) { found = true; } } Assert.Equal(found, true); // teardown request = new HttpRequestMessage(HttpMethod.Post, "/api/schoolbuses/" + id + "/delete"); response = await _client.SendAsync(request); response.EnsureSuccessStatusCode(); // should get a 404 if we try a get now. request = new HttpRequestMessage(HttpMethod.Get, "/api/schoolbuses/" + id); response = await _client.SendAsync(request); Assert.Equal(response.StatusCode, HttpStatusCode.NotFound); // cleanup service area. request = new HttpRequestMessage(HttpMethod.Post, "/api/serviceareas/" + servicearea_id + "/delete"); response = await _client.SendAsync(request); response.EnsureSuccessStatusCode(); // should get a 404 if we try a get now. request = new HttpRequestMessage(HttpMethod.Get, "/api/serviceareas/" + servicearea_id); response = await _client.SendAsync(request); Assert.Equal(response.StatusCode, HttpStatusCode.NotFound); // cleanup schoolbus owner request = new HttpRequestMessage(HttpMethod.Post, "/api/schoolbusowners/" + schoolBusOwner_id + "/delete"); response = await _client.SendAsync(request); response.EnsureSuccessStatusCode(); // should get a 404 if we try a get now. request = new HttpRequestMessage(HttpMethod.Get, "/api/schoolbusowners/" + schoolBusOwner_id); response = await _client.SendAsync(request); Assert.Equal(response.StatusCode, HttpStatusCode.NotFound); }
/// <summary> /// Hangfire job to refresh existing data. /// </summary> /// <param name="connectionString"></param> /// <param name="Configuration"></param> public static void UpdateCCWJob(string connectionString, string cCW_userId, string cCW_guid, string cCW_directory, string ccwHost) { // sanity check if (connectionString != null && cCW_userId != null && cCW_guid != null && cCW_directory != null && ccwHost != null) { // make a database connection and see if there are any records that need to be updated. DbContextOptionsBuilder <DbAppContext> options = new DbContextOptionsBuilder <DbAppContext>(); options.UseNpgsql(connectionString); DbAppContext context = new DbAppContext(null, options.Options); // first get a few metrics. we only want to update a max of 1% the database per day. int databaseTotal = context.CCWDatas.Count(); int dailyTotal = context.CCWDatas .Where(x => x.LastUpdateTimestamp < DateTime.UtcNow.AddDays(-1)) .Select(x => x) .Count(); if (databaseTotal > 0 && dailyTotal < databaseTotal / 100) { // make a database connection and see if there are any records that are missing the CCW link. var data = context.CCWDatas .OrderBy(x => x.LastUpdateTimestamp) .FirstOrDefault(x => x.LastUpdateTimestamp < DateTime.UtcNow.AddDays(-1)); if (data != null) { // get the data for the request from the result of the database query. string regi = data.ICBCRegistrationNumber; string vin = data.ICBCVehicleIdentificationNumber; // plate is excluded from the batch update because it can be shared. string plate = null; // Fetch the record. CCWData cCWData = FetchCCW(regi, vin, plate, cCW_userId, cCW_guid, cCW_directory, ccwHost); if (cCWData == null) // fetch did not work, but we don't want it to fire again, so update the timestamp. { // ensure that the record is touched in the database data.LastUpdateTimestamp = DateTime.UtcNow; //update records in SchoolBus table bool exists = context.SchoolBuss.Any(x => x.CCWDataId == cCWData.Id); if (exists) { SchoolBus bus = context.SchoolBuss.First(a => a.CCWDataId == cCWData.Id); if (cCWData.ICBCRegistrationNumber != null && bus.ICBCRegistrationNumber != null && !cCWData.ICBCRegistrationNumber.Equals(bus.ICBCRegistrationNumber)) { bus.ICBCRegistrationNumber = cCWData.ICBCRegistrationNumber; } if (cCWData.ICBCVehicleIdentificationNumber != null && bus.VehicleIdentificationNumber != null && !cCWData.ICBCVehicleIdentificationNumber.Equals(bus.VehicleIdentificationNumber)) { bus.VehicleIdentificationNumber = cCWData.ICBCVehicleIdentificationNumber; } if (cCWData.ICBCLicencePlateNumber != null && bus.LicencePlateNumber != null && !cCWData.ICBCLicencePlateNumber.Equals(bus.LicencePlateNumber)) { bus.LicencePlateNumber = cCWData.ICBCLicencePlateNumber; } context.SchoolBuss.Update(bus); } context.CCWDatas.Update(data); context.SaveChanges(); } } } } }
public virtual IActionResult AddBus([FromBody] SchoolBus item) { return(this._service.AddBusAsync(item)); }
public virtual IActionResult SchoolbusesPost([FromBody] SchoolBus item) { return(this._service.SchoolbusesPostAsync(item)); }
public virtual IActionResult SchoolbusesIdPut([FromRoute] int id, [FromBody] SchoolBus item) { return(this._service.SchoolbusesIdPutAsync(id, item)); }
/// <summary> /// Integration test for FindBusById /// </summary> public async void TestSchoolBuses() { // create a district. var request = new HttpRequestMessage(HttpMethod.Post, "/api/districts"); District district = new District(); string jsonString = district.ToJson(); request.Content = new StringContent(jsonString, Encoding.UTF8, "application/json"); var response = await _client.SendAsync(request); response.EnsureSuccessStatusCode(); // parse as JSON. jsonString = await response.Content.ReadAsStringAsync(); district = JsonConvert.DeserializeObject <District>(jsonString); var district_id = district.Id; // create a schoolbus owner. request = new HttpRequestMessage(HttpMethod.Post, "/api/schoolbusowners"); SchoolBusOwner schoolBusOwner = new SchoolBusOwner(); jsonString = schoolBusOwner.ToJson(); request.Content = new StringContent(jsonString, Encoding.UTF8, "application/json"); response = await _client.SendAsync(request); response.EnsureSuccessStatusCode(); // parse as JSON. jsonString = await response.Content.ReadAsStringAsync(); schoolBusOwner = JsonConvert.DeserializeObject <SchoolBusOwner>(jsonString); var schoolBusOwner_id = schoolBusOwner.Id; // create a bus request = new HttpRequestMessage(HttpMethod.Post, "/api/schoolbuses"); // create a new schoolbus. SchoolBus schoolbus = new SchoolBus(); schoolbus.Status = "0"; schoolbus.District = district; schoolbus.SchoolBusOwner = schoolBusOwner; jsonString = schoolbus.ToJson(); request.Content = new StringContent(jsonString, Encoding.UTF8, "application/json"); response = await _client.SendAsync(request); response.EnsureSuccessStatusCode(); // parse as JSON. jsonString = await response.Content.ReadAsStringAsync(); schoolbus = JsonConvert.DeserializeObject <SchoolBus>(jsonString); // get the id var id = schoolbus.Id; // make a change. string testStatus = "1"; schoolbus.Status = testStatus; // now do an update. request = new HttpRequestMessage(HttpMethod.Put, "/api/schoolbuses/" + id); request.Content = new StringContent(schoolbus.ToJson(), Encoding.UTF8, "application/json"); response = await _client.SendAsync(request); response.EnsureSuccessStatusCode(); // do a get. request = new HttpRequestMessage(HttpMethod.Get, "/api/schoolbuses/" + id); response = await _client.SendAsync(request); response.EnsureSuccessStatusCode(); // parse as JSON. jsonString = await response.Content.ReadAsStringAsync(); schoolbus = JsonConvert.DeserializeObject <SchoolBus>(jsonString); // compare the change, should match. Assert.Equal(schoolbus.Status, testStatus); //test attachments request = new HttpRequestMessage(HttpMethod.Get, "/api/schoolbuses/" + id + "/attachments"); response = await _client.SendAsync(request); response.EnsureSuccessStatusCode(); //test attachments request = new HttpRequestMessage(HttpMethod.Get, "/api/schoolbuses/" + id + "/ccwdata"); response = await _client.SendAsync(request); response.EnsureSuccessStatusCode(); //test history request = new HttpRequestMessage(HttpMethod.Get, "/api/schoolbuses/" + id + "/history"); response = await _client.SendAsync(request); response.EnsureSuccessStatusCode(); //test notes request = new HttpRequestMessage(HttpMethod.Get, "/api/schoolbuses/" + id + "/notes"); response = await _client.SendAsync(request); response.EnsureSuccessStatusCode(); //test inspections request = new HttpRequestMessage(HttpMethod.Get, "/api/schoolbuses/" + id + "/inspections"); response = await _client.SendAsync(request); response.EnsureSuccessStatusCode(); // do a delete. request = new HttpRequestMessage(HttpMethod.Post, "/api/schoolbuses/" + id + "/delete"); response = await _client.SendAsync(request); response.EnsureSuccessStatusCode(); // should get a 404 if we try a get now. request = new HttpRequestMessage(HttpMethod.Get, "/api/schoolbuses/" + id); response = await _client.SendAsync(request); Assert.Equal(response.StatusCode, HttpStatusCode.NotFound); // cleanup service area. request = new HttpRequestMessage(HttpMethod.Post, "/api/districts/" + district_id + "/delete"); response = await _client.SendAsync(request); response.EnsureSuccessStatusCode(); // should get a 404 if we try a get now. request = new HttpRequestMessage(HttpMethod.Get, "/api/districts/" + district_id); response = await _client.SendAsync(request); Assert.Equal(response.StatusCode, HttpStatusCode.NotFound); // cleanup schoolbus owner request = new HttpRequestMessage(HttpMethod.Post, "/api/schoolbusowners/" + schoolBusOwner_id + "/delete"); response = await _client.SendAsync(request); response.EnsureSuccessStatusCode(); // should get a 404 if we try a get now. request = new HttpRequestMessage(HttpMethod.Get, "/api/schoolbusowners/" + schoolBusOwner_id); response = await _client.SendAsync(request); Assert.Equal(response.StatusCode, HttpStatusCode.NotFound); }
/// <summary> /// Setup the test. /// </summary> public SchoolBusModelTests() { instance = new SchoolBus(); }
/// <summary> /// Returns a PDF Permit /// </summary> /// <param name="id"></param> /// <returns></returns> public virtual IActionResult SchoolbusesIdPdfpermitGetAsync(int id) { FileContentResult result = null; bool exists = _context.SchoolBuss.Any(a => a.Id == id); if (exists) { SchoolBus schoolBus = _context.SchoolBuss .Include(x => x.CCWData) .Include(x => x.SchoolBusOwner.PrimaryContact) .Include(x => x.SchoolDistrict) .First(a => a.Id == id); // construct the view model. PermitViewModel permitViewModel = new PermitViewModel(); // only do the ICBC fields if the CCW data is available. if (schoolBus.CCWData != null) { permitViewModel.IcbcMake = schoolBus.CCWData.ICBCMake; permitViewModel.IcbcModelYear = schoolBus.CCWData.ICBCModelYear; permitViewModel.IcbcRegistrationNumber = schoolBus.CCWData.ICBCRegistrationNumber; permitViewModel.VehicleIdentificationNumber = schoolBus.CCWData.ICBCVehicleIdentificationNumber; permitViewModel.SchoolBusOwnerAddressLine1 = schoolBus.CCWData.ICBCRegOwnerAddr1; // line 2 is a combination of the various fields that may contain data. List <string> strings = new List <string>(); if (!string.IsNullOrWhiteSpace(schoolBus.CCWData.ICBCRegOwnerAddr2)) { strings.Add(schoolBus.CCWData.ICBCRegOwnerAddr2); } if (!string.IsNullOrWhiteSpace(schoolBus.CCWData.ICBCRegOwnerCity)) { strings.Add(schoolBus.CCWData.ICBCRegOwnerCity); } if (!string.IsNullOrWhiteSpace(schoolBus.CCWData.ICBCRegOwnerProv)) { strings.Add(schoolBus.CCWData.ICBCRegOwnerProv); } if (!string.IsNullOrWhiteSpace(schoolBus.CCWData.ICBCRegOwnerPostalCode)) { strings.Add(schoolBus.CCWData.ICBCRegOwnerPostalCode); } if (strings.Count > 0) { permitViewModel.SchoolBusOwnerAddressLine2 = String.Join(", ", strings); } permitViewModel.SchoolBusOwnerPostalCode = schoolBus.CCWData.ICBCRegOwnerPostalCode; permitViewModel.SchoolBusOwnerProvince = schoolBus.CCWData.ICBCRegOwnerProv; permitViewModel.SchoolBusOwnerCity = schoolBus.CCWData.ICBCRegOwnerCity; permitViewModel.SchoolBusOwnerName = schoolBus.CCWData.ICBCRegOwnerName; } permitViewModel.PermitIssueDate = schoolBus.PermitIssueDate == null ? null : ConvertUtcToPacificTime((DateTime)schoolBus.PermitIssueDate).ToString("yyyy-MM-dd"); permitViewModel.PermitNumber = schoolBus.PermitNumber; permitViewModel.RestrictionsText = schoolBus.RestrictionsText; permitViewModel.SchoolBusMobilityAidCapacity = schoolBus.MobilityAidCapacity.ToString(); permitViewModel.UnitNumber = schoolBus.UnitNumber; permitViewModel.PermitClassCode = schoolBus.PermitClassCode; permitViewModel.BodyTypeCode = schoolBus.BodyTypeCode; permitViewModel.SchoolBusSeatingCapacity = schoolBus.SchoolBusSeatingCapacity; if (schoolBus.SchoolDistrict != null) { permitViewModel.SchoolDistrictshortName = schoolBus.SchoolDistrict.ShortName; } string payload = JsonConvert.SerializeObject(permitViewModel); // pass the request on to the PDF Micro Service string pdfHost = Configuration["PDF_SERVICE_NAME"]; string targetUrl = pdfHost + "/api/PDF/GetPDF"; // call the microservice HttpClient client = new HttpClient(); try { var request = new HttpRequestMessage(HttpMethod.Post, targetUrl); request.Content = new StringContent(payload, Encoding.UTF8, "application/json"); request.Headers.Clear(); // transfer over the request headers. foreach (var item in Request.Headers) { string key = item.Key; string value = item.Value; request.Headers.Add(key, value); } Task <HttpResponseMessage> responseTask = client.SendAsync(request); responseTask.Wait(); HttpResponseMessage response = responseTask.Result; if (response.StatusCode == HttpStatusCode.OK) // success { var bytetask = response.Content.ReadAsByteArrayAsync(); bytetask.Wait(); result = new FileContentResult(bytetask.Result, "application/pdf"); result.FileDownloadName = "Permit-" + schoolBus.PermitNumber + ".pdf"; } } catch (Exception e) { result = null; Console.WriteLine(e.ToString()); } finally { if (client != null) { try { client.Dispose(); } catch (Exception e) { Console.WriteLine(e.ToString()); } } } // check that the result has a value if (result != null) { return(result); } else { return(new StatusCodeResult(503)); } } else { // record not found return(new StatusCodeResult(404)); } }