Skip to content

Commit 2563c63

Browse files
Add the Send email for symbol apis. (#6415)
Add support for symbols in ICoreMessageService.
1 parent ab486a0 commit 2563c63

3 files changed

Lines changed: 449 additions & 0 deletions

File tree

src/NuGetGallery.Core/Services/CoreMessageService.cs

Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,46 @@ [change your email notification settings]({emailSettingsUrl}).
7272
}
7373
}
7474

75+
public async Task SendSymbolPackageAddedNoticeAsync(SymbolPackage symbolPackage, string packageUrl, string packageSupportUrl, string emailSettingsUrl, IEnumerable<string> warningMessages = null)
76+
{
77+
bool hasWarnings = warningMessages != null && warningMessages.Any();
78+
79+
string subject;
80+
var warningMessagesPlaceholder = string.Empty;
81+
if (hasWarnings)
82+
{
83+
subject = $"[{CoreConfiguration.GalleryOwner.DisplayName}] Symbol package published with warnings - {symbolPackage.Id} {symbolPackage.Version}";
84+
warningMessagesPlaceholder = Environment.NewLine + string.Join(Environment.NewLine, warningMessages);
85+
}
86+
else
87+
{
88+
subject = $"[{CoreConfiguration.GalleryOwner.DisplayName}] Symbol package published - {symbolPackage.Id} {symbolPackage.Version}";
89+
}
90+
91+
string body = $@"The symbol package [{symbolPackage.Id} {symbolPackage.Version}]({packageUrl}) was recently published on {CoreConfiguration.GalleryOwner.DisplayName} by {symbolPackage.Package.User.Username}. If this was not intended, please [contact support]({packageSupportUrl}).
92+
{warningMessagesPlaceholder}
93+
94+
-----------------------------------------------
95+
<em style=""font-size: 0.8em;"">
96+
To stop receiving emails as an owner of this package, sign in to the {CoreConfiguration.GalleryOwner.DisplayName} and
97+
[change your email notification settings]({emailSettingsUrl}).
98+
</em>";
99+
100+
using (var mailMessage = new MailMessage())
101+
{
102+
mailMessage.Subject = subject;
103+
mailMessage.Body = body;
104+
mailMessage.From = CoreConfiguration.GalleryNoReplyAddress;
105+
106+
AddOwnersSubscribedToPackagePushedNotification(symbolPackage.Package.PackageRegistration, mailMessage);
107+
108+
if (mailMessage.To.Any())
109+
{
110+
await SendMessageAsync(mailMessage);
111+
}
112+
}
113+
}
114+
75115
public async Task SendPackageAddedWithWarningsNoticeAsync(Package package, string packageUrl, string packageSupportUrl, IEnumerable<string> warningMessages)
76116
{
77117
var subject = $"[{CoreConfiguration.GalleryOwner.DisplayName}] Package pushed with warnings - {package.PackageRegistration.Id} {package.Version}";
@@ -142,6 +182,52 @@ public async Task SendPackageValidationFailedNoticeAsync(Package package, Packag
142182
}
143183
}
144184

185+
public async Task SendSymbolPackageValidationFailedNoticeAsync(SymbolPackage symbolPackage, PackageValidationSet validationSet, string packageUrl, string packageSupportUrl, string announcementsUrl, string twitterUrl)
186+
{
187+
var validationIssues = validationSet.GetValidationIssues();
188+
189+
var subject = $"[{CoreConfiguration.GalleryOwner.DisplayName}] Symbol package validation failed - {symbolPackage.Id} {symbolPackage.Version}";
190+
var bodyBuilder = new StringBuilder();
191+
bodyBuilder.Append($@"The symbol package [{symbolPackage.Id} {symbolPackage.Version}]({packageUrl}) failed validation because of the following reason(s):
192+
");
193+
194+
foreach (var validationIssue in validationIssues)
195+
{
196+
bodyBuilder.Append($@"
197+
- {ParseValidationIssue(validationIssue, announcementsUrl, twitterUrl)}");
198+
}
199+
200+
bodyBuilder.Append($@"
201+
202+
Your symbol package was not published on {CoreConfiguration.GalleryOwner.DisplayName} and is not available for consumption.
203+
204+
");
205+
206+
if (validationIssues.Any(i => i.IssueCode == ValidationIssueCode.Unknown))
207+
{
208+
bodyBuilder.Append($"Please [contact support]({packageSupportUrl}) to help.");
209+
}
210+
else
211+
{
212+
var issuePluralString = validationIssues.Count() > 1 ? "all the issues" : "the issue";
213+
bodyBuilder.Append($"You can reupload your symbol package once you've fixed {issuePluralString} with it.");
214+
}
215+
216+
using (var mailMessage = new MailMessage())
217+
{
218+
mailMessage.Subject = subject;
219+
mailMessage.Body = bodyBuilder.ToString();
220+
mailMessage.From = CoreConfiguration.GalleryNoReplyAddress;
221+
222+
AddAllOwnersToMailMessage(symbolPackage.Package.PackageRegistration, mailMessage);
223+
224+
if (mailMessage.To.Any())
225+
{
226+
await SendMessageAsync(mailMessage);
227+
}
228+
}
229+
}
230+
145231
private static string ParseValidationIssue(ValidationIssue validationIssue, string announcementsUrl, string twitterUrl)
146232
{
147233
switch (validationIssue.IssueCode)
@@ -168,6 +254,10 @@ private static string ParseValidationIssue(ValidationIssue validationIssue, stri
168254
case ValidationIssueCode.PackageIsSignedWithUnauthorizedCertificate:
169255
var certIssue = (UnauthorizedCertificateFailure)validationIssue;
170256
return $"The package was signed, but the signing certificate {(certIssue != null ? $"(SHA-1 thumbprint {certIssue.Sha1Thumbprint})" : "")} is not associated with your account. You must register this certificate to publish signed packages. [Read more...](https://aka.ms/nuget-signed-ref)";
257+
case ValidationIssueCode.SymbolErrorCode_ChecksumDoesNotMatch:
258+
return "The checksum does not match for the dll(s) and corresponding pdb(s).";
259+
case ValidationIssueCode.SymbolErrorCode_MatchingPortablePDBNotFound:
260+
return "The uploaded symbols package contains pdb(s) for a corresponding dll(s) not found in the nuget package.";
171261
default:
172262
return "There was an unknown failure when validating your package.";
173263
}
@@ -210,6 +300,42 @@ public async Task SendValidationTakingTooLongNoticeAsync(Package package, string
210300
}
211301
}
212302

303+
public async Task SendValidationTakingTooLongNoticeAsync(SymbolPackage symbolPackage, string packageUrl)
304+
{
305+
string subject = "[{0}] Symbol package validation taking longer than expected - {1} {2}";
306+
string body = "It is taking longer than expected for your symbol package [{1} {2}]({3}) to get published.\n\n" +
307+
"We are looking into it and there is no action on you at this time. We’ll send you an email notification when your symbol package has been published.\n\n" +
308+
"Thank you for your patience.";
309+
310+
body = string.Format(
311+
CultureInfo.CurrentCulture,
312+
body,
313+
CoreConfiguration.GalleryOwner.DisplayName,
314+
symbolPackage.Id,
315+
symbolPackage.Version,
316+
packageUrl);
317+
318+
subject = string.Format(
319+
CultureInfo.CurrentCulture,
320+
subject,
321+
CoreConfiguration.GalleryOwner.DisplayName,
322+
symbolPackage.Id,
323+
symbolPackage.Version);
324+
325+
using (var mailMessage = new MailMessage())
326+
{
327+
mailMessage.Subject = subject;
328+
mailMessage.Body = body;
329+
mailMessage.From = CoreConfiguration.GalleryNoReplyAddress;
330+
331+
AddOwnersSubscribedToPackagePushedNotification(symbolPackage.Package.PackageRegistration, mailMessage);
332+
333+
if (mailMessage.To.Any())
334+
{
335+
await SendMessageAsync(mailMessage);
336+
}
337+
}
338+
}
213339

214340
protected static void AddAllOwnersToMailMessage(PackageRegistration packageRegistration, MailMessage mailMessage)
215341
{

src/NuGetGallery.Core/Services/ICoreMessageService.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,5 +13,8 @@ public interface ICoreMessageService
1313
Task SendPackageAddedWithWarningsNoticeAsync(Package package, string packageUrl, string packageSupportUrl, IEnumerable<string> warningMessages);
1414
Task SendPackageValidationFailedNoticeAsync(Package package, PackageValidationSet validationSet, string packageUrl, string packageSupportUrl, string announcementsUrl, string twitterUrl);
1515
Task SendValidationTakingTooLongNoticeAsync(Package package, string packageUrl);
16+
Task SendValidationTakingTooLongNoticeAsync(SymbolPackage symbolPackage, string packageUrl);
17+
Task SendSymbolPackageAddedNoticeAsync(SymbolPackage symbolPackage, string packageUrl, string packageSupportUrl, string emailSettingsUrl, IEnumerable<string> warningMessages = null);
18+
Task SendSymbolPackageValidationFailedNoticeAsync(SymbolPackage symbolPackage, PackageValidationSet validationSet, string packageUrl, string packageSupportUrl, string announcementsUrl, string twitterUrl);
1619
}
1720
}

0 commit comments

Comments
 (0)