Skip to content

Commit 73f30fb

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

4 files changed

Lines changed: 69 additions & 54 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 & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1,63 +1,79 @@
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(5));
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+
var currentEventDetailId = await FetchCurrentEventDetailId();
29+
30+
if (memoryCache.TryGetValue<EventDataResponseDTO?>(FetchLatestEventDataCacheKey, out var latestEventData))
31+
{
32+
logger.LogDebug("Retrieved latest event data from the cache {eventData}", latestEventData);
33+
}
34+
else
35+
{
36+
logger.LogDebug("No event data in the cache, retrieving from the db");
37+
latestEventData = await dbContext.EventDetail
38+
.AsNoTracking()
39+
.AsSingleQuery()
40+
.Select(eventDetails => new EventDataResponseDTO
41+
{
42+
Id = eventDetails.Id,
43+
Version = eventDetails.Version,
44+
TimeSlots = eventDetails.TimeSlots.Select(ts => new TimeSlotDTO
45+
{
46+
Id = ts.Id,
47+
Info = ts.Info,
48+
From = ts.From,
49+
To = ts.To
50+
}).ToList(),
51+
Tracks = eventDetails.Tracks.Select(t => new TrackDTO
52+
{
53+
Id = t.Id,
54+
Name = t.Name,
55+
RoomName = t.RoomName
56+
}).ToList(),
57+
Sessions = eventDetails.Sessions.Select(s => new SessionDTO
58+
{
59+
Id = s.Id,
60+
Title = s.Title,
61+
ShortDescription = s.ShortDescription,
62+
FullDescription = s.FullDescription,
63+
Speaker = s.Speaker,
64+
TimeSlotId = s.TimeSlot.Id,
65+
TrackId = s.Track.Id
66+
}).ToList()
67+
})
68+
.SingleAsync(e => e.Id == currentEventDetailId);
69+
70+
memoryCache.Set(FetchLatestEventDataCacheKey, latestEventData, TimeSpan.FromMinutes(5));
71+
logger.LogDebug("Updated the latest event data in the cache {eventData}", latestEventData);
72+
}
73+
74+
if (requestDto.Version >= latestEventData!.Version)
3175
return null;
3276

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;
77+
return latestEventData;
6278
}
6379
}

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)