("Value")
+ .IsRequired()
+ .HasColumnType("nvarchar(max)");
+
+ b.HasKey("Key", "Language");
+
+ b.ToTable("Templates", "myAi");
+ });
+#pragma warning restore 612, 618
+ }
+ }
+}
diff --git a/Apis/myai-data/Migrations/20260527120000_UpdateEmailTemplatesToHtml.cs b/Apis/myai-data/Migrations/20260527120000_UpdateEmailTemplatesToHtml.cs
new file mode 100644
index 0000000..8568a2d
--- /dev/null
+++ b/Apis/myai-data/Migrations/20260527120000_UpdateEmailTemplatesToHtml.cs
@@ -0,0 +1,143 @@
+using Microsoft.EntityFrameworkCore.Migrations;
+
+#nullable disable
+
+namespace MyAi.Data.Migrations
+{
+ ///
+ public partial class UpdateEmailTemplatesToHtml : Migration
+ {
+ ///
+ protected override void Up(MigrationBuilder migrationBuilder)
+ {
+ void Update(string key, string lang, string value)
+ => migrationBuilder.UpdateData("Templates", ["Key", "Language"], [key, lang],
+ ["Value"], [value], "myAi");
+
+ // email.match.body — en
+ Update("email.match.body", "en",
+ "CV Match Report
" +
+ "" +
+ "" +
+ "| CV ID | " +
+ "{{cvDocumentId}} | " +
+ "
" +
+ "" +
+ "| Job | " +
+ "{{jobLabel}} | " +
+ "
" +
+ "" +
+ "| URL | " +
+ "{{jobUrl}} | " +
+ "
" +
+ "" +
+ "| Score | " +
+ "{{score}}% | " +
+ "
" +
+ "
" +
+ "Summary
" +
+ "{{summary}}
" +
+ "Strengths
{{strengths}}" +
+ "Gaps
{{gaps}}" +
+ "Recommendations
{{recommendations}}");
+
+ // email.match.body — ro
+ Update("email.match.body", "ro",
+ "Raport Potrivire CV
" +
+ "" +
+ "" +
+ "| ID Document CV | " +
+ "{{cvDocumentId}} | " +
+ "
" +
+ "" +
+ "| Job | " +
+ "{{jobLabel}} | " +
+ "
" +
+ "" +
+ "| URL | " +
+ "{{jobUrl}} | " +
+ "
" +
+ "" +
+ "| Scor | " +
+ "{{score}}% | " +
+ "
" +
+ "
" +
+ "Rezumat
" +
+ "{{summary}}
" +
+ "Puncte forte
{{strengths}}" +
+ "Lipsuri
{{gaps}}" +
+ "Recomandări
{{recommendations}}");
+
+ // email.match.job-search-footer — en
+ Update("email.match.job-search-footer", "en",
+ "" +
+ "
" +
+ "Want to find matching jobs automatically? " +
+ "Start a job search →
" +
+ "Link valid for {{expiryDays}} days." +
+ "
" +
+ "
");
+
+ // email.match.job-search-footer — ro
+ Update("email.match.job-search-footer", "ro",
+ "");
+
+ // email.search-results.body — en
+ Update("email.search-results.body", "en",
+ "Job Search Results
" +
+ "Found {{count}} matching job(s):
" +
+ "{{items}}");
+
+ // email.search-results.body — ro
+ Update("email.search-results.body", "ro",
+ "Rezultate Căutare Joburi
" +
+ "Am găsit {{count}} job(uri) potrivite:
" +
+ "{{items}}");
+
+ // email.search-results.empty — en
+ Update("email.search-results.empty", "en",
+ "" +
+ "
No matching jobs found
" +
+ "
Your job search completed but no matching jobs were found. Try again later or adjust your CV.
" +
+ "
");
+
+ // email.search-results.empty — ro
+ Update("email.search-results.empty", "ro",
+ "" +
+ "
Niciun job potrivit găsit
" +
+ "
Căutarea s-a finalizat dar nu au fost găsite joburi potrivite. Încearcă mai târziu sau ajustează CV-ul.
" +
+ "
");
+ }
+
+ ///
+ protected override void Down(MigrationBuilder migrationBuilder)
+ {
+ void Update(string key, string lang, string value)
+ => migrationBuilder.UpdateData("Templates", ["Key", "Language"], [key, lang],
+ ["Value"], [value], "myAi");
+
+ Update("email.match.body", "en",
+ "CV Matcher result\n\nCV Document ID: {{cvDocumentId}}\nJob: {{jobLabel}}\nJob URL: {{jobUrl}}\nScore: {{score}}%\n\nSummary:\n{{summary}}\n\nStrengths:\n{{strengths}}\n\nGaps:\n{{gaps}}\n\nRecommendations:\n{{recommendations}}");
+ Update("email.match.body", "ro",
+ "Rezultat potrivire CV\n\nID document CV: {{cvDocumentId}}\nJob: {{jobLabel}}\nURL job: {{jobUrl}}\nScor: {{score}}%\n\nRezumat:\n{{summary}}\n\nPuncte forte:\n{{strengths}}\n\nLipsuri:\n{{gaps}}\n\nRecomandări:\n{{recommendations}}");
+ Update("email.match.job-search-footer", "en",
+ "\n\n---\nWant to find more jobs matching your CV?\nClick: {{jobSearchLink}}\n(link valid for {{expiryDays}} days)");
+ Update("email.match.job-search-footer", "ro",
+ "\n\n---\nVrei sa gasesti mai multe joburi potrivite CV-ului tau?\nClick: {{jobSearchLink}}\n(link valabil {{expiryDays}} zile)");
+ Update("email.search-results.body", "en",
+ "MyAi.ro found {{count}} jobs matching your CV:\n\n{{items}}");
+ Update("email.search-results.body", "ro",
+ "MyAi.ro a gasit {{count}} joburi potrivite CV-ului tau:\n\n{{items}}");
+ Update("email.search-results.empty", "en",
+ "MyAi.ro found no jobs matching your CV. Try again later or update your CV.");
+ Update("email.search-results.empty", "ro",
+ "MyAi.ro nu a gasit joburi care sa corespunda CV-ului tau. Incercati mai tarziu sau ajustati CV-ul.");
+ }
+ }
+}