Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • bad1/assignment2
1 result
Show changes
Commits on Source (4)
......@@ -24,5 +24,15 @@ namespace assignment2.Controllers
return Ok(result);
}
[HttpGet("{id}", Name = "ProviderGet")]
public async Task<IActionResult> Get(int id)
{
var result = await providerService.GetProvider(id);
if (result == null)
{
return NotFound();
}
return Ok(result);
}
}
}
\ No newline at end of file
......@@ -2,8 +2,11 @@ using assignment1.Interfaces;
using assignment1.Services;
using DotNetEnv;
using assignment2.Services;
using ZiggyCreatures.Caching.Fusion;
using Microsoft.Extensions.Caching.Memory;
using Serilog;
using Microsoft.Extensions.Options;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
......@@ -16,6 +19,12 @@ builder.Services.AddTransient<ISharedExperienceService, SharedExperienceService>
builder.Services.AddTransient<IGuestService, GuestService>();
Env.Load();
builder.Services.AddDbContext<ExperienceDBContext>();
builder.Services.AddFusionCache().WithDefaultEntryOptions(new FusionCacheEntryOptions
{
Duration = TimeSpan.FromMinutes(2),
Priority = CacheItemPriority.Low
});
// Adds logger using appsettings.json for configuration
builder.Services.AddSerilog(options => options.ReadFrom.Configuration(builder.Configuration));
......@@ -61,4 +70,5 @@ app.UseMiddleware<LoggerMiddleware>();
// Conditionally handle HTTPS redirection based on environment
app.UseAuthorization();
app.MapControllers();
Console.WriteLine("Starting the application on http://localhost:5095");
app.Run();
......@@ -2,14 +2,17 @@ namespace assignment2.Services;
using assignment2.Models;
using Microsoft.EntityFrameworkCore;
using ZiggyCreatures.Caching.Fusion;
public class ProviderService : IProviderService
{
private readonly ExperienceDBContext context;
private readonly IFusionCache cache;
public ProviderService(ExperienceDBContext context)
public ProviderService(ExperienceDBContext context, IFusionCache cache)
{
this.context = context;
this.cache = cache;
}
public async Task<IEnumerable<ProviderView>> GetProviders()
......@@ -25,9 +28,18 @@ public class ProviderService : IProviderService
.ToListAsync();
}
public async Task<Provider> GetProvider(int id)
public async Task<Provider?> GetProvider(int id)
{
return await context.Providers.FirstOrDefaultAsync(p => p.ProviderId == id);
}
string cacheKey = $"provider:{id}";
return await cache.GetOrSetAsync<Provider?>(
cacheKey,
_ =>
{
Thread.Sleep(2000);
return context.Providers.FirstOrDefaultAsync(p => p.ProviderId == id);
},
TimeSpan.FromSeconds(30)
);
}
}
......@@ -17,11 +17,8 @@
"cappedMaxDocuments": "1000"
}
}
// Add other sinks here if desired...
],
"Enrich": [
"FromLogContext"
]
"Enrich": ["FromLogContext"]
},
"AllowedHosts": "*"
}
......@@ -23,6 +23,7 @@
<PackageReference Include="Serilog.Settings.Configuration" Version="9.0.0" />
<PackageReference Include="Serilog.Sinks.MongoDB" Version="7.0.0" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="7.2.0" />
<PackageReference Include="ZiggyCreatures.FusionCache" Version="2.1.0" />
</ItemGroup>
</Project>