-
Notifications
You must be signed in to change notification settings - Fork 52
Expand file tree
/
Copy pathProjectsController.cs
More file actions
80 lines (63 loc) · 2.69 KB
/
ProjectsController.cs
File metadata and controls
80 lines (63 loc) · 2.69 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Caching.Distributed;
using ProgramProject.GenerationService.Generator;
using ProgramProject.GenerationService.Models;
using System.Text.Json;
namespace ProgramProject.GenerationService.Controllers;
[Route("api/[controller]")]
[ApiController]
public class ProjectsController : ControllerBase
{
private readonly IDistributedCache _cache;
private readonly ProgramProjectFaker _faker;
private readonly ILogger<ProjectsController> _logger;
public ProjectsController(
IDistributedCache cache,
ProgramProjectFaker faker,
ILogger<ProjectsController> logger)
{
_cache = cache;
_faker = faker;
_logger = logger;
}
[HttpGet]
public async Task<ActionResult<ProgramProjectModel>> GetProjects(
[FromQuery] int? id,
[FromQuery] int count = 5)
{
// Если передан id - возвращаем ОДИН объект
if (id.HasValue)
{
var cacheKey = $"project:{id.Value}";
_logger.LogInformation("Запрос проекта с ID {ProjectId} через query. Проверка кэша...", id);
var cachedBytes = await _cache.GetAsync(cacheKey);
if (cachedBytes != null)
{
var cachedProject = JsonSerializer.Deserialize<ProgramProjectModel>(cachedBytes);
_logger.LogInformation("Проект с ID {ProjectId} найден в кэше", id);
return Ok(cachedProject);
}
_logger.LogInformation("Проект с ID {ProjectId} не найден в кэше. Генерируем новый", id);
var newProject = _faker.Generate();
newProject.Id = id.Value;
var options = new DistributedCacheEntryOptions()
.SetAbsoluteExpiration(TimeSpan.FromMinutes(5));
var serializedProject = JsonSerializer.SerializeToUtf8Bytes(newProject);
await _cache.SetAsync(cacheKey, serializedProject, options);
_logger.LogInformation("Проект с ID {ProjectId} сгенерирован и сохранён в кэш", id);
return Ok(newProject);
}
// Если id не передан - возвращаем список проектов
if (count < 1 || count > 20)
{
return BadRequest("Количество проектов должно быть от 1 до 20");
}
var projects = _faker.Generate(count);
return Ok(projects);
}
[HttpGet("{id}")]
public async Task<ActionResult<ProgramProjectModel>> GetProject(int id)
{
return await GetProjects(id);
}
}