Назад к задачам
Дом.рфПолучайте помощь с лайвкодингом в реальном времени с Sobes Copilot
Junior — Senior
11
Ревью кода и улучшение структуры сервиса организации
Компании, где спрашивали:
Условие задачи
Необходимо провести ревью кода и выполнить рефакторинг представленного сервиса, улучшив читаемость, устранив лишние обращения к базе и исправив логические недочёты. Приведённый класс реализует методы получения и установки логотипа организации, а также расчёта суммарных расходов по проектам.
public class OrganizationService
{
private readonly IStorageService _storage;
private readonly IAlertService _alert;
private readonly IProjectApi _projectApi;
private readonly ApplicationDbContext _db;
public OrganizationService(
IStorageService storage,
IAlertService alert,
IProjectApi projectApi,
ApplicationDbContext db)
{
_storage = storage;
_alert = alert;
_projectApi = projectApi;
_db = db;
}
public byte[] GetOrganizationLogo(Guid organizationId)
{
var orgList = _db.Organizations.ToList();
var org = orgList.First(entity => entity.Id == organizationId);
var logoId = org.LogoId;
var memoryStream = new MemoryStream();
Stream image = _storage.GetByObjectId(logoId);
image.CopyTo(memoryStream);
return memoryStream.ToArray();
}
public void SetOrganizationLogo(Guid organizationId, Stream logo)
{
var logoId = _storage.UploadLogo(logo);
var orgList = _db.Organizations.ToList();
var org = orgList.First(entity => entity.Id == organizationId);
org.LogoId = logoId;
_db.SaveChangesAsync(default);
_alert.NotifyLogoChanged(org.Id);
}
public async Task<long> Calculate(Guid organizationId, DateTime? start, DateTime? finished, CancellationToken ct)
{
var orgList = _db.Organizations.ToList();
var org = orgList.First(entity => entity.Id == organizationId);
var projects = await _projectApi.GetProjectsAsync(org.Id, default);
var result = 0L;
foreach (var project in projects)
{
if (project.CompleteDate > start || project.CompleteDate < finished)
{
result += project.Cost;
}
}
return result;
}
}