feat(cv-search-job): replace MyAiDbContext+ITemplateService with IEmailTemplateService
- Add ProjectReference to email-api-data; remove myai-data reference
- Program.cs: register EmailApiDbContext (no migrate), IEmailTemplateRepository
(scoped), IEmailTemplateService (singleton); remove MyAiDbContext +
ITemplateService registrations and their migration call
- CvSearchEmailSender: inject IEmailTemplateService; replace
_config["Contact:ToEmail"] with GetOperatorCopy("email.search-results.subject")
for operator copy logic; remove IConfiguration injection
- docker-compose: remove Contact__ToEmail from cv-search-job service block;
add Database__* env vars to email-api service (needed for EmailApiDbContext)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -1,29 +1,25 @@
|
||||
using CvMatcher.Models.Responses;
|
||||
using CvSearch.Data.Entities;
|
||||
using EmailApi.Data.Services;
|
||||
using EmailApi.Models.Clients;
|
||||
using EmailApi.Models.Requests;
|
||||
using Microsoft.Extensions.Configuration;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using MyAi.Data.Services;
|
||||
|
||||
namespace CvSearchJob.Services;
|
||||
|
||||
public sealed class CvSearchEmailSender
|
||||
{
|
||||
private readonly IEmailApiClient _emailApi;
|
||||
private readonly ITemplateService _templates;
|
||||
private readonly IConfiguration _config;
|
||||
private readonly IEmailTemplateService _emailTemplates;
|
||||
private readonly ILogger<CvSearchEmailSender> _logger;
|
||||
|
||||
public CvSearchEmailSender(
|
||||
IEmailApiClient emailApi,
|
||||
ITemplateService templates,
|
||||
IConfiguration config,
|
||||
IEmailTemplateService emailTemplates,
|
||||
ILogger<CvSearchEmailSender> logger)
|
||||
{
|
||||
_emailApi = emailApi;
|
||||
_templates = templates;
|
||||
_config = config;
|
||||
_emailTemplates = emailTemplates;
|
||||
_logger = logger;
|
||||
}
|
||||
|
||||
@@ -34,18 +30,18 @@ public sealed class CvSearchEmailSender
|
||||
string language,
|
||||
CancellationToken ct)
|
||||
{
|
||||
var contactToEmail = _config["Contact:ToEmail"];
|
||||
var operatorCopy = _emailTemplates.GetOperatorCopy("email.search-results.subject", language);
|
||||
|
||||
var recipients = new List<string>();
|
||||
if (!string.IsNullOrWhiteSpace(toEmail)) recipients.Add(toEmail);
|
||||
if (!string.IsNullOrWhiteSpace(contactToEmail) &&
|
||||
!recipients.Any(r => string.Equals(r, contactToEmail, StringComparison.OrdinalIgnoreCase)))
|
||||
recipients.Add(contactToEmail);
|
||||
if (!string.IsNullOrWhiteSpace(operatorCopy) &&
|
||||
!recipients.Any(r => string.Equals(r, operatorCopy, StringComparison.OrdinalIgnoreCase)))
|
||||
recipients.Add(operatorCopy);
|
||||
|
||||
if (recipients.Count == 0) return;
|
||||
|
||||
var htmlBody = BuildBody(results, language);
|
||||
var subject = _templates.Render("email.search-results.subject", language,
|
||||
var subject = _emailTemplates.Render("email.search-results.subject", language,
|
||||
("count", results.Count.ToString()));
|
||||
|
||||
try
|
||||
@@ -71,7 +67,7 @@ public sealed class CvSearchEmailSender
|
||||
private string BuildBody(IReadOnlyList<JobSearchResultEntity> results, string language)
|
||||
{
|
||||
if (results.Count == 0)
|
||||
return _templates.Get("email.search-results.empty", language);
|
||||
return _emailTemplates.Get("email.search-results.empty", language);
|
||||
|
||||
var items = new System.Text.StringBuilder();
|
||||
for (int i = 0; i < results.Count; i++)
|
||||
@@ -91,7 +87,7 @@ public sealed class CvSearchEmailSender
|
||||
""");
|
||||
}
|
||||
|
||||
return _templates.Render("email.search-results.body", language,
|
||||
return _emailTemplates.Render("email.search-results.body", language,
|
||||
("count", results.Count.ToString()),
|
||||
("items", items.ToString()));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user