Skip to content

Commit b5bbb3a

Browse files
committed
Address CodeRabbit review feedback (round 2)
1 parent 73eb3a4 commit b5bbb3a

8 files changed

Lines changed: 45 additions & 13 deletions

File tree

examples/PdfEngineOperations/Program.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,25 +26,25 @@
2626

2727
// Flatten
2828
Console.WriteLine("Flattening PDF...");
29-
var flattenResult = await sharpClient.ExecutePdfEngineAsync(
29+
using var flattenResult = await sharpClient.ExecutePdfEngineAsync(
3030
PdfEngineBuilders.Flatten().WithPdfs(a => a.AddItem("test.pdf", pdfBytes)));
3131
await SaveStream(flattenResult, destinationDirectory, "Flattened.pdf");
3232

3333
// Rotate 90 degrees
3434
Console.WriteLine("Rotating PDF 90 degrees...");
35-
var rotateResult = await sharpClient.ExecutePdfEngineAsync(
35+
using var rotateResult = await sharpClient.ExecutePdfEngineAsync(
3636
PdfEngineBuilders.Rotate(90).WithPdfs(a => a.AddItem("test.pdf", pdfBytes)));
3737
await SaveStream(rotateResult, destinationDirectory, "Rotated.pdf");
3838

3939
// Encrypt
4040
Console.WriteLine("Encrypting PDF...");
41-
var encryptResult = await sharpClient.ExecutePdfEngineAsync(
41+
using var encryptResult = await sharpClient.ExecutePdfEngineAsync(
4242
PdfEngineBuilders.Encrypt("reader123", "admin456").WithPdfs(a => a.AddItem("test.pdf", pdfBytes)));
4343
await SaveStream(encryptResult, destinationDirectory, "Encrypted.pdf");
4444

4545
// Write metadata
4646
Console.WriteLine("Writing metadata...");
47-
var writeResult = await sharpClient.ExecutePdfEngineAsync(
47+
using var writeResult = await sharpClient.ExecutePdfEngineAsync(
4848
PdfEngineBuilders.WriteMetadata(new Dictionary<string, object>
4949
{
5050
{ "Author", "GotenbergSharpApiClient" },
@@ -71,7 +71,7 @@ static async Task<byte[]> GenerateTestPdf(GotenbergSharpClient client)
7171
<form><input type='text' name='field1' value='Form field (will be flattened)'/></form>
7272
</body></html>"));
7373

74-
var stream = await client.HtmlToPdfAsync(builder);
74+
using var stream = await client.HtmlToPdfAsync(builder);
7575
using var ms = new MemoryStream();
7676
await stream.CopyToAsync(ms);
7777
return ms.ToArray();

src/Gotenberg.Sharp.Api.Client/Domain/Builders/PdfEngineBuilder.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ public static PdfEngineBuilder<SplitPdfRequest> Split(SplitMode mode, string spa
100100
var request = new SplitPdfRequest
101101
{
102102
Mode = mode,
103-
Span = span ?? throw new ArgumentNullException(nameof(span)),
103+
Span = !string.IsNullOrWhiteSpace(span) ? span : throw new ArgumentException("Span must not be null or whitespace.", nameof(span)),
104104
Unify = unify
105105
};
106106
return new PdfEngineBuilder<SplitPdfRequest>(request);

src/Gotenberg.Sharp.Api.Client/Domain/Requests/EncryptPdfRequest.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public sealed class EncryptPdfRequest : PdfEngineRequest
1616
protected override void Validate()
1717
{
1818
if (string.IsNullOrWhiteSpace(this.UserPassword))
19-
throw new InvalidOperationException("User password is required for encryption.");
19+
throw new ArgumentException("User password is required for encryption.");
2020

2121
base.Validate();
2222
}

src/Gotenberg.Sharp.Api.Client/Domain/Requests/FlattenPdfRequest.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@
55

66
namespace Gotenberg.Sharp.API.Client.Domain.Requests;
77

8+
/// <summary>
9+
/// Flattens PDF form fields into static content.
10+
/// </summary>
811
public sealed class FlattenPdfRequest : PdfEngineRequest
912
{
1013
protected override string ApiPath => Constants.Gotenberg.PdfEngines.ApiPaths.Flatten;

src/Gotenberg.Sharp.Api.Client/Domain/Requests/WriteMetadataRequest.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ protected override void Validate()
2727
protected override IEnumerable<HttpContent> ToHttpContent()
2828
{
2929
var metadataContent = new StringContent(this.Metadata!.ToString());
30-
metadataContent.Headers.ContentType = new MediaTypeHeaderValue(Constants.HttpContent.MediaTypes.TextHtml);
30+
metadataContent.Headers.ContentType = new MediaTypeHeaderValue(Constants.HttpContent.MediaTypes.ApplicationJson);
3131
metadataContent.Headers.ContentDisposition =
3232
new ContentDispositionHeaderValue(Constants.HttpContent.Disposition.Types.FormData)
3333
{

src/Gotenberg.Sharp.Api.Client/Domain/ValueObjects/PageRanges.cs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,33 @@ public static PageRanges Create(string ranges)
5151
$"Invalid page range format: '{ranges}'. Expected format: '1-3,5,8-10'.",
5252
nameof(ranges));
5353

54+
// Semantic validation: verify page numbers are >= 1 and range start <= end
55+
foreach (var segment in trimmed.Split(','))
56+
{
57+
var parts = segment.Trim().Split('-');
58+
if (parts.Length == 1)
59+
{
60+
var page = int.Parse(parts[0].Trim());
61+
if (page < 1)
62+
throw new ArgumentException(
63+
$"Page number must be >= 1, but got {page} in '{ranges}'.",
64+
nameof(ranges));
65+
}
66+
else if (parts.Length == 2)
67+
{
68+
var start = int.Parse(parts[0].Trim());
69+
var end = int.Parse(parts[1].Trim());
70+
if (start < 1 || end < 1)
71+
throw new ArgumentException(
72+
$"Page numbers must be >= 1, but got range '{start}-{end}' in '{ranges}'.",
73+
nameof(ranges));
74+
if (start > end)
75+
throw new ArgumentException(
76+
$"Range start must be <= end, but got '{start}-{end}' in '{ranges}'.",
77+
nameof(ranges));
78+
}
79+
}
80+
5481
return new PageRanges(trimmed);
5582
}
5683

src/Gotenberg.Sharp.Api.Client/Infrastructure/Constants.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ public static class MediaTypes
3232
public const string TextHtml = "text/html";
3333

3434
public const string ApplicationPdf = "application/pdf";
35+
36+
public const string ApplicationJson = "application/json";
3537
}
3638

3739
public static class MultipartData

test/GotenbergSharpClient.Tests/PdfEngineOperationsTests.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ public async Task FlattenPdf_Succeeds()
123123
var builder = PdfEngineBuilders.Flatten()
124124
.WithPdfs(a => a.AddItem("test.pdf", pdfBytes));
125125

126-
var result = await client.ExecutePdfEngineAsync(builder);
126+
using var result = await client.ExecutePdfEngineAsync(builder);
127127

128128
result.Should().NotBeNull();
129129
result.Length.Should().BeGreaterThan(0);
@@ -139,7 +139,7 @@ public async Task RotatePdf_Succeeds()
139139
var builder = PdfEngineBuilders.Rotate(90)
140140
.WithPdfs(a => a.AddItem("test.pdf", pdfBytes));
141141

142-
var result = await client.ExecutePdfEngineAsync(builder);
142+
using var result = await client.ExecutePdfEngineAsync(builder);
143143

144144
result.Should().NotBeNull();
145145
result.Length.Should().BeGreaterThan(0);
@@ -155,7 +155,7 @@ public async Task EncryptPdf_Succeeds()
155155
var builder = PdfEngineBuilders.Encrypt("user123", "owner456")
156156
.WithPdfs(a => a.AddItem("test.pdf", pdfBytes));
157157

158-
var result = await client.ExecutePdfEngineAsync(builder);
158+
using var result = await client.ExecutePdfEngineAsync(builder);
159159

160160
result.Should().NotBeNull();
161161
result.Length.Should().BeGreaterThan(0);
@@ -175,7 +175,7 @@ public async Task WriteMetadata_Succeeds()
175175
})
176176
.WithPdfs(a => a.AddItem("test.pdf", pdfBytes));
177177

178-
var result = await client.ExecutePdfEngineAsync(builder);
178+
using var result = await client.ExecutePdfEngineAsync(builder);
179179

180180
result.Should().NotBeNull();
181181
result.Length.Should().BeGreaterThan(0);
@@ -220,7 +220,7 @@ private static async Task<byte[]> GenerateTestPdf(Gotenberg.Sharp.API.Client.Got
220220
var builder = new HtmlRequestBuilder()
221221
.AddDocument(doc => doc.SetBody("<html><body><h1>Test PDF</h1></body></html>"));
222222

223-
var stream = await client.HtmlToPdfAsync(builder);
223+
using var stream = await client.HtmlToPdfAsync(builder);
224224

225225
using var ms = new MemoryStream();
226226
await stream.CopyToAsync(ms);

0 commit comments

Comments
 (0)