aboutsummaryrefslogtreecommitdiff
path: root/BartService.cs
diff options
context:
space:
mode:
authorJake Mannens <jake@asger.xyz>2024-10-24 13:04:02 +1100
committerJake Mannens <jake@asger.xyz>2024-11-01 16:23:35 +1100
commit4e6257c9a68922199c4709076f156f1a3fef51eb (patch)
tree09c48fc5c4a57932ccd8b24c03bb7a3a306a3a54 /BartService.cs
parent2d36ac8d5b71c55ec397fd3beae81edf825be6ff (diff)
Introduce basic error handling in FetchDayAsync()
Diffstat (limited to 'BartService.cs')
-rw-r--r--BartService.cs111
1 files changed, 70 insertions, 41 deletions
diff --git a/BartService.cs b/BartService.cs
index f453423..3238e09 100644
--- a/BartService.cs
+++ b/BartService.cs
@@ -83,7 +83,7 @@ namespace PagerParser.Bart {
private ILogger logger;
private IServiceProvider serviceProvider;
- private string? loginToken;
+ private string loginToken;
private HttpClient httpClient;
@@ -97,13 +97,15 @@ namespace PagerParser.Bart {
this.serviceProvider = serviceProvider;
}
- public async Task FetchAsync(DateTime fetchUntil) {
+ public async Task FetchDayAsync(DateOnly day) {
using var scope = serviceProvider.CreateScope();
using var db = scope.ServiceProvider.GetRequiredService<PagerContext>();
+ logger.LogDebug($"Fetching BART availability status for {day}");
+
// Prepare API request
var request = new BartAvailabilityRequest() {
- RelatedDay = DateTime.Now.ToString("yyyy-MM-dd"),
+ RelatedDay = day.ToString("yyyy-MM-dd"),
LoginToken = loginToken,
PermissionLevel = 2,
UserQualFilterIds = [],
@@ -113,15 +115,27 @@ namespace PagerParser.Bart {
};
// Fetch the data
- var response = await httpClient.PostAsJsonAsync(
+ HttpResponseMessage response;
+ try {
+ response = await httpClient.PostAsJsonAsync(
AvailabilityEndpointUrl,
request,
new JsonSerializerOptions() {
PropertyNamingPolicy = null
});
+ } catch(Exception e) {
+ logger.LogError(e, "Error fetching availability status from BART");
+ return;
+ }
- var responseData = await response.Content
- .ReadFromJsonAsync<BartAvailabilityResponse>();
+ BartAvailabilityResponse responseData;
+ try {
+ responseData = (await response.Content
+ .ReadFromJsonAsync<BartAvailabilityResponse>())!;
+ } catch(Exception e) {
+ logger.LogError(e, "Error parsing BART JSON response");
+ return;
+ }
// Parse out a list of users from the response
var users = responseData.GetUserAvailabilityListResult.List
@@ -136,62 +150,77 @@ namespace PagerParser.Bart {
.ToArray();
// Add new users to the DB and update the names of existing ones
- foreach(var user in users) {
- if(existingUsers.Contains(user.BartMemberId))
- db.Update(user);
- else
- db.Add(user);
+ try {
+ foreach(var user in users) {
+ if(existingUsers.Contains(user.BartMemberId))
+ db.Update(user);
+ else
+ db.Add(user);
+ }
+ await db.SaveChangesAsync();
+ } catch(Exception e) {
+ logger.LogError(e, "Error saving BART members to the DB");
+ return;
}
- await db.SaveChangesAsync();
-
LinkedList<BartAvailabilityRecord> availabilityRecords = new();
foreach(var entry in responseData.GetUserAvailabilityListResult.List) {
- for(int hour = 0; hour < 24; hour++) {
- var timestamp = new DateTime(
- DateOnly.FromDateTime(entry.RelatedDay),
- new TimeOnly(hour, 0),
- DateTimeKind.Local);
+ try {
+ for(int hour = 0; hour < 24; hour++) {
+ var timestamp = new DateTime(
+ DateOnly.FromDateTime(entry.RelatedDay),
+ new TimeOnly(hour, 0),
+ DateTimeKind.Local);
- var status = (BartStatus) entry.GetType()
- .GetProperty($"Block{hour + 1}")!
- .GetValue(entry)!;
+ var status = (BartStatus) entry.GetType()
+ .GetProperty($"Block{hour + 1}")!
+ .GetValue(entry)!;
- var record = new BartAvailabilityRecord() {
- Timestamp = timestamp.ToUniversalTime(),
- Member = users.First(u => u.BartMemberId == entry.UserId),
- Status = status,
- IsDefault = entry.AvailabilityId < 0,
- ModifiedOn = entry.ModifiedOn,
- ModifiedBy = users.FirstOrDefault(u => u.MemberName == entry.ModifiedBy),
- CreatedBy = users.FirstOrDefault(u => u.MemberName == entry.CreatedBy)
- };
+ var record = new BartAvailabilityRecord() {
+ Timestamp = timestamp.ToUniversalTime(),
+ Member = users.First(u => u.BartMemberId == entry.UserId),
+ Status = status,
+ IsDefault = entry.AvailabilityId < 0,
+ ModifiedOn = entry.ModifiedOn,
+ ModifiedBy = users.FirstOrDefault(u => u.MemberName == entry.ModifiedBy),
+ CreatedBy = users.FirstOrDefault(u => u.MemberName == entry.CreatedBy)
+ };
- // Optionally set the create/modify time if one is present in the fetched record
- if(entry.ModifiedOn is not null)
- record.ModifiedOn =
- DateTime.SpecifyKind((DateTime) entry.ModifiedOn, DateTimeKind.Utc);
- if(entry.CreatedOn is not null)
- record.CreatedOn =
- DateTime.SpecifyKind((DateTime) entry.CreatedOn, DateTimeKind.Utc);
+ // Optionally set the create/modify time if
+ // one is present in the fetched record
+ if(entry.ModifiedOn is not null)
+ record.ModifiedOn =
+ DateTime.SpecifyKind((DateTime) entry.ModifiedOn, DateTimeKind.Utc);
+ if(entry.CreatedOn is not null)
+ record.CreatedOn =
+ DateTime.SpecifyKind((DateTime) entry.CreatedOn, DateTimeKind.Utc);
- availabilityRecords.AddLast(record);
+ availabilityRecords.AddLast(record);
+ }
+ } catch(Exception e) {
+ logger.LogError(e, "Unknown error occurred whilst parsing availability entries");
+ return;
}
}
var toAdd = availabilityRecords
.ExceptBy(db.BartAvailabilityRecords.Select(e => e.Hashcode), e => e.Hashcode);
- await db.BartAvailabilityRecords.AddRangeAsync(toAdd);
- await db.SaveChangesAsync();
+ try {
+ await db.BartAvailabilityRecords.AddRangeAsync(toAdd);
+ await db.SaveChangesAsync();
+ } catch(Exception e) {
+ logger.LogError(e, "Error committing availability entries to the DB");
+ return;
+ }
}
public async Task StartAsync(CancellationToken cancellationToken) {
logger.LogInformation("BART service starting...");
loginToken = config.GetValue<string>("PagerParser:Bart:Token");
httpClient = new();
- await FetchAsync(DateTime.Now);
+ await FetchDayAsync(DateOnly.FromDateTime(DateTime.Now));
}
public Task StopAsync(CancellationToken cancellationToken) {