Skip to content

Commit be60c38

Browse files
committed
Add caching to event data
1 parent ba4a38a commit be60c38

4 files changed

Lines changed: 69 additions & 55 deletions

File tree

PocketDDD.BlazorClient/PocketDDD.BlazorClient/Services/FakePocketDDDApiService.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ public void SetUserAuthToken(string token)
2525
return
2626
new EventDataResponseDTO
2727
{
28+
Id = 1,
2829
Version = 1,
2930
TimeSlots = new[]
3031
{
Lines changed: 63 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -1,63 +1,78 @@
11
using Microsoft.EntityFrameworkCore;
2+
using Microsoft.Extensions.Caching.Memory;
3+
using Microsoft.Extensions.Logging;
24
using PocketDDD.Server.DB;
3-
using PocketDDD.Server.Model.DTOs;
4-
using System;
5-
using System.Collections.Generic;
6-
using System.Linq;
7-
using System.Text;
8-
using System.Threading.Tasks;
95
using PocketDDD.Shared.API.RequestDTOs;
106
using PocketDDD.Shared.API.ResponseDTOs;
117

128
namespace PocketDDD.Server.Services;
13-
public class EventDataService
9+
10+
public class EventDataService(PocketDDDContext dbContext, IMemoryCache memoryCache, ILogger<EventDataService> logger)
1411
{
15-
private readonly PocketDDDContext dbContext;
12+
private const string FetchLatestEventDataCacheKey = nameof(FetchLatestEventData);
13+
private const string FetchCurrentEventDetailIdCacheKey = nameof(FetchCurrentEventDetailId);
1614

17-
public EventDataService(PocketDDDContext dbContext)
15+
public async Task<int> FetchCurrentEventDetailId()
1816
{
19-
this.dbContext = dbContext;
17+
if (memoryCache.TryGetValue<int?>(FetchCurrentEventDetailIdCacheKey, out var cachedEventDetailId))
18+
return cachedEventDetailId!.Value;
19+
20+
cachedEventDetailId = await dbContext.EventDetail.MaxAsync(e => e.Id);
21+
memoryCache.Set(FetchCurrentEventDetailIdCacheKey, cachedEventDetailId, TimeSpan.FromMinutes(10));
22+
23+
return cachedEventDetailId.Value;
2024
}
2125

22-
public async Task<EventDataResponseDTO?> FetchLatestEventData(EventDataUpdateRequestDTO requestDTO)
26+
public async Task<EventDataResponseDTO?> FetchLatestEventData(EventDataUpdateRequestDTO requestDto)
2327
{
24-
var eventDetails = await dbContext.EventDetail
25-
.Include(x => x.TimeSlots)
26-
.Include(x => x.Tracks)
27-
.Include(x => x.Sessions)
28-
.SingleAsync(x => x.Id == 1);
29-
30-
if (requestDTO.Version == eventDetails!.Version)
28+
if (memoryCache.TryGetValue<EventDataResponseDTO?>(FetchLatestEventDataCacheKey, out var latestEventData))
29+
{
30+
logger.LogDebug("Retrieved latest event data from the cache {eventData}", latestEventData);
31+
}
32+
else
33+
{
34+
logger.LogDebug("No event data in the cache, retrieving from the db");
35+
latestEventData = await dbContext.EventDetail
36+
.AsNoTracking()
37+
.AsSingleQuery()
38+
.OrderBy(e => e.Id)
39+
.Select(eventDetails => new EventDataResponseDTO
40+
{
41+
Id = eventDetails.Id,
42+
Version = eventDetails.Version,
43+
TimeSlots = eventDetails.TimeSlots.Select(ts => new TimeSlotDTO
44+
{
45+
Id = ts.Id,
46+
Info = ts.Info,
47+
From = ts.From,
48+
To = ts.To
49+
}).ToList(),
50+
Tracks = eventDetails.Tracks.Select(t => new TrackDTO
51+
{
52+
Id = t.Id,
53+
Name = t.Name,
54+
RoomName = t.RoomName
55+
}).ToList(),
56+
Sessions = eventDetails.Sessions.Select(s => new SessionDTO
57+
{
58+
Id = s.Id,
59+
Title = s.Title,
60+
ShortDescription = s.ShortDescription,
61+
FullDescription = s.FullDescription,
62+
Speaker = s.Speaker,
63+
TimeSlotId = s.TimeSlot.Id,
64+
TrackId = s.Track.Id
65+
}).ToList()
66+
})
67+
.LastAsync();
68+
69+
memoryCache.Set(FetchLatestEventDataCacheKey, latestEventData, TimeSpan.FromMinutes(0.5));
70+
logger.LogDebug("Updated the latest event data in the cache {eventData}", latestEventData);
71+
}
72+
73+
if (requestDto.Version >= latestEventData!.Version)
3174
return null;
3275

33-
var dtoResponse = new EventDataResponseDTO
34-
{
35-
Version = eventDetails.Version,
36-
TimeSlots = eventDetails.TimeSlots.Select(ts => new TimeSlotDTO
37-
{
38-
Id = ts.Id,
39-
Info = ts.Info,
40-
From = ts.From,
41-
To = ts.To
42-
}).ToList(),
43-
Tracks = eventDetails.Tracks.Select(t => new TrackDTO
44-
{
45-
Id = t.Id,
46-
Name = t.Name,
47-
RoomName = t.RoomName
48-
}).ToList(),
49-
Sessions = eventDetails.Sessions.Select(s => new SessionDTO
50-
{
51-
Id = s.Id,
52-
Title = s.Title,
53-
ShortDescription = s.ShortDescription,
54-
FullDescription = s.FullDescription,
55-
Speaker = s.Speaker,
56-
TimeSlotId = s.TimeSlot.Id,
57-
TrackId = s.Track.Id
58-
}).ToList()
59-
};
60-
61-
return dtoResponse;
76+
return latestEventData;
6277
}
63-
}
78+
}

PocketDDD.Server/PocketDDD.Server.WebAPI/Program.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@
2929
options => options.UseSqlServer("name=ConnectionStrings:PocketDDDContext")
3030
);
3131

32+
builder.Services.AddMemoryCache();
33+
3234
builder.Services.AddScoped<RegistrationService>();
3335
builder.Services.AddScoped<UserService>();
3436
builder.Services.AddScoped<FeedbackService>();

PocketDDD.Shared/API/ResponseDTOs/EventDataResponseDTO.cs

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,8 @@
1-
using System;
2-
using System.Collections.Generic;
3-
using System.Linq;
4-
using System.Text;
5-
using System.Threading.Tasks;
1+
namespace PocketDDD.Shared.API.ResponseDTOs;
62

7-
namespace PocketDDD.Shared.API.ResponseDTOs;
83
public record EventDataResponseDTO
94
{
5+
public int Id { get; init; }
106
public int Version { get; set; }
117
public IEnumerable<TimeSlotDTO> TimeSlots { get; set; } = Enumerable.Empty<TimeSlotDTO>();
128
public IEnumerable<TrackDTO> Tracks { get; set; } = Enumerable.Empty<TrackDTO>();
@@ -37,4 +33,4 @@ public class SessionDTO
3733
public string Speaker { get; set; } = "";
3834
public int TrackId { get; set; }
3935
public int TimeSlotId { get; set; }
40-
}
36+
}

0 commit comments

Comments
 (0)