Skip to content
Merged

Dev #2513

Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
93 commits
Select commit Hold shift + click to select a range
9080c29
AB#33053 fix AI cooldown wait state
jacobwillsmith May 15, 2026
235e031
AB#33047 collapse dismissed AI analysis sections
jacobwillsmith May 15, 2026
113cd56
AB#33047 collapse dismissed AI analysis sections
jacobwillsmith May 15, 2026
ee139ad
AB#31228 - Added today date to email template.
hasanpour May 15, 2026
a3661fd
AB#32619 update datagrid editor to open modal with fields in table order
AndreGAot May 15, 2026
acc8db9
Using newline safe pattern for the span
hasanpour May 15, 2026
db34d3e
Merge pull request #2474 from bcgov/feature/AB#31228-Add-Today-Date-V…
JamesPasta May 15, 2026
4bb323e
Merge pull request #2472 from bcgov/bugfix/AB#33053-ai-cooldown-wait-…
jacobwillsmith May 15, 2026
81b2c63
Merge pull request #2473 from bcgov/bugfix/AB#33047-collapse-dismisse…
jacobwillsmith May 15, 2026
bcd44bc
Merge pull request #2475 from bcgov/bugfix/AB#32619-datagrid-edit-fie…
JamesPasta May 15, 2026
e92a491
AB#31883 improve timezone offset
AndreGAot May 15, 2026
069bdbe
AB#27996: Refactor CreatePaymentRequests to Create Reusable Service C…
aurelio-aot May 15, 2026
2d29595
AB#31883 copilot feedback
AndreGAot May 15, 2026
c9badb7
AB#31883 more copilot suggestions
AndreGAot May 15, 2026
e65494c
Potential fix for pull request finding 'CodeQL / Cookie 'Secure' attr…
AndreGAot May 15, 2026
45c2ece
Merge pull request #2477 from bcgov/bugfix/AB#31883-comment-timestamp
AndreGAot May 15, 2026
c911592
AB#27996: Create Historical Payments - Initial Draft
aurelio-aot May 16, 2026
c2ec744
AB#27996: Fix bug and address sonarqube issues
aurelio-aot May 19, 2026
66f9d01
AB#27996: Fix failing unit tests
aurelio-aot May 19, 2026
d6553de
AB#27996: Fix button alignment
aurelio-aot May 20, 2026
5832c69
AB#27996: Move Warning Inside Historical payment dialog box. Add Site…
aurelio-aot May 20, 2026
1d56015
AB#27996: Fix Invoice and Amounts validation
aurelio-aot May 20, 2026
9767a8c
AB#27996: AccountCoding is not required for Historical Payments
aurelio-aot May 20, 2026
39d4a1f
AB#32881 submissions and description
AndreGAot May 21, 2026
e186d32
AB#33055 fix AI generate cooldown wait state
jacobwillsmith May 15, 2026
64f3f4b
AB#33055 sync AI generate button state
jacobwillsmith May 20, 2026
45e6f4b
AB#31474: Fix lastUpdatedinCAS=infinity in both Supplier and Site
aurelio-aot May 21, 2026
5b5caba
AB#27996: Add Note for missing Site in Historical Payments
aurelio-aot May 21, 2026
7eeaae4
AB#32881 layout improvements
AndreGAot May 22, 2026
ce48de5
AB#32881 reduce cognitive complexity
AndreGAot May 22, 2026
fc558ba
AB#32218 convert to as single query explicit for app attachments
AndreGAot May 22, 2026
29dbfff
feature/AB#32203-FixMappingArchive
JamesPasta May 22, 2026
465ad27
Merge pull request #2482 from bcgov/feature/AB#32203-FixArchive
JamesPasta May 22, 2026
67cc58a
Merge pull request #2478 from bcgov/feature/AB#27996-Add-Historical-P…
JamesPasta May 22, 2026
5d14237
Merge pull request #2480 from bcgov/bugfix/AB#31474-Infinity-In-LastU…
JamesPasta May 22, 2026
ef2c95b
Merge pull request #2481 from bcgov/bugfix/AB#32218-intermittent-fail…
JamesPasta May 22, 2026
8ad818d
Merge pull request #2479 from bcgov/bugfix/AB#33055-ai-generate-butto…
JamesPasta May 22, 2026
a61d79f
AB#32611: Additional Columns In Audit History
aurelio-aot May 22, 2026
21c5323
Merge pull request #2483 from bcgov/feature/AB#32611-Audit-History-En…
JamesPasta May 22, 2026
6bc921c
feature/AB#33117-FixScribian
JamesPasta May 22, 2026
3c5b8bd
Merge pull request #2484 from bcgov/feature/AB#33117-FixScribian7.1.0
JamesPasta May 22, 2026
d70b683
AB#32881 update version handling duplicate keys
AndreGAot May 25, 2026
2f6ec38
AB#33124: Bugfix: Note in Historical Payments is treated as error
aurelio-aot May 25, 2026
aa73292
Merge pull request #2489 from bcgov/bugfix/AB#33124-HistoricalPayment…
JamesPasta May 25, 2026
889970a
AB#29743: Select All Intakes in Dashboard By Default
aurelio-aot May 25, 2026
75f4191
AB#32881 sonarQ cleanup
AndreGAot May 25, 2026
de77a56
AB#32881 copilot suggestions
AndreGAot May 25, 2026
495b1c6
feature/AB#32841-AddQRandPaymentDescription
JamesPasta May 25, 2026
ec90ef5
AB#32881 fix incorrect function name call
AndreGAot May 25, 2026
ec0a9f5
Merge pull request #2492 from bcgov/feature/AB#32841-CASPaymentQualit…
JamesPasta May 25, 2026
2baa5e3
Merge pull request #2491 from bcgov/feature/AB#29743-Dashboard-Select…
JamesPasta May 25, 2026
973b8f7
AB#32881 warning banner updates
AndreGAot May 26, 2026
92ce7af
AB#32881 update documentation
AndreGAot May 26, 2026
9a3e9e4
AB#32881 copilot feedback fixes
AndreGAot May 26, 2026
9c04bb0
AB#30755: Change Applicant Status to Inactive/Active
aurelio-aot May 26, 2026
2f15dc0
AB#32881 sonarQ cleanup
AndreGAot May 26, 2026
9098487
feature/AB#32841-AddQRandPaymentDescription-Fixes
JamesPasta May 26, 2026
99e2102
feature/AB#32841-AddQRandPaymentDescription-Fixes
JamesPasta May 26, 2026
7087b7e
Merge pull request #2495 from bcgov/feature/AB#32841-CASPaymentQualit…
JamesPasta May 26, 2026
658d870
Merge pull request #2494 from bcgov/feature/AB#30755-Applicant-Status…
JamesPasta May 26, 2026
c34fa85
Merge pull request #2490 from bcgov/feature/AB#32881-reporting-consol…
JamesPasta May 26, 2026
6b00f88
feature/AB#32841-AddQRandPaymentDescription-Fixes remove logging on r…
JamesPasta May 27, 2026
418d9b9
Merge pull request #2497 from bcgov/feature/AB#32841-CASPaymentQualit…
JamesPasta May 27, 2026
dcd8156
feature/AB#32841-AddQRandPaymentDescription-Fixes remove logging on r…
JamesPasta May 27, 2026
6b6ffc9
Merge pull request #2499 from bcgov/feature/AB#32841-CASPaymentQualit…
JamesPasta May 27, 2026
16fc446
feature/AB#32841-AddQRandPaymentDescription-Fixes remove logging on r…
JamesPasta May 27, 2026
3074420
Merge pull request #2501 from bcgov/feature/AB#32841-CASPaymentQualit…
JamesPasta May 27, 2026
f841476
AB#32696: Applicant Profile - Payments Tab
aurelio-aot May 27, 2026
4319403
[AB#32785] Fix tag menu slider overflow and height issues
plavoie-BC May 28, 2026
f8a8802
[AB#32785] Refactor tag menu slider styles for consistency
plavoie-BC May 28, 2026
6dc7f8e
[AB#32785] Consolidate tag table selectors
plavoie-BC May 28, 2026
025a1de
Merge pull request #2503 from bcgov/bugfix/AB#32785-tag-menu-slider
JamesPasta May 28, 2026
1b88e93
AB#32218 split out attachments query
AndreGAot May 28, 2026
e7eeb74
Merge pull request #2504 from bcgov/bugfix/AB#32218-err-incomplete-chunk
AndreGAot May 28, 2026
ed4b260
[AB#32773] Rename PaymentTagsInput for namespace conflict
plavoie-BC May 28, 2026
480b2a1
AB#33235 Replace GH_API_TOKEN → GITHUB_TOKEN
DarylTodosichuk May 28, 2026
68e2673
AB#33235 Switch sonarsource-scan.yml java-version distribution to tem…
DarylTodosichuk May 28, 2026
440b52b
Merge pull request #2505 from bcgov/feature/AB#33235-Replace-GH_API_T…
DarylTodosichuk May 28, 2026
d53c020
[AB#32773] Tag Input SonarQube fixes
plavoie-BC May 28, 2026
e8a5613
initial commit
May 28, 2026
14fe289
[AB#32773] Refactor event listeners to use arrow functions
plavoie-BC May 28, 2026
2bee953
AB#33254 Fix chefs smoke test to validate pre-auth DOM only
May 28, 2026
c768f2a
AB#32696: Fix bug on export button
aurelio-aot May 29, 2026
86a855e
AB#32696: Fix sonarqube issues
aurelio-aot May 29, 2026
c10cfd3
[AB#32773] Update modal save button based on permissions
plavoie-BC May 29, 2026
3d627aa
Merge branch 'dev' into bugfix/AB#32773-tag-modal-permission
plavoie-BC May 29, 2026
4ee7948
AB#33235 Apply token GH_API_TOKEN at PushVariables job level
DarylTodosichuk May 29, 2026
f5d89a9
Merge pull request #2509 from bcgov/feature/AB#33235-Replace-GH_API_T…
DarylTodosichuk May 29, 2026
7aec920
Merge pull request #2507 from bcgov/feature/AB#33254_fix_chefs_dev
DarylTodosichuk May 29, 2026
2f0e663
Merge pull request #2508 from bcgov/feature/AB#32696-ApplicantProfile…
JamesPasta May 29, 2026
74bbde8
Merge pull request #2506 from bcgov/bugfix/AB#32773-tag-modal-permission
JamesPasta May 29, 2026
f91b744
bugfix/AB#33258-Refactor Payment Requests table rendering and update …
JamesPasta May 29, 2026
1250c14
Merge pull request #2511 from bcgov/bugfix/AB#33258-FixExportCSVPayments
JamesPasta May 29, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion .github/workflows/manual-trigger.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ on:
type: string
env:
TARGET_ENV: ${{ inputs.name }}
GH_TOKEN: ${{secrets.GH_API_TOKEN}}
GH_TOKEN: ${{secrets.GITHUB_TOKEN}}
OC_CLUSTER: ${{ vars.OPENSHIFT_CLUSTER }}
OC_REGISTRY: ${{ vars.OPENSHIFT_REGISTRY }}
OC_AUTH_TOKEN: ${{ secrets.OPENSHIFT_TOKEN }}
Expand Down Expand Up @@ -89,6 +89,8 @@ jobs:
permissions:
actions: write
contents: read
env:
GH_TOKEN: ${{ secrets.GH_API_TOKEN }}
steps:
- name: Checkout repository
uses: actions/checkout@v6
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/sonarsource-scan.yml
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ jobs:
uses: actions/setup-java@v5
with:
java-version: 17
distribution: 'zulu'
distribution: 'temurin'

- uses: actions/checkout@v6
with:
Expand Down
23 changes: 16 additions & 7 deletions applications/Unity.AutoUI/cypress/e2e/library/chefs.cy.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,17 @@
describe('Chefs Login and Logout', () => {
describe("Chefs Login and Logout", () => {
it("Verify that Chefs is online.", () => {
cy.getChefsDetail("chefsBaseURL").then((baseURL) => {
cy.visit(baseURL);

it('Verify that Chefs is online.', () => {
cy.chefsLogin();
cy.contains("My Forms").should('exist').click();
cy.chefsLogout();
})
})
cy.contains("button, a, [role='button']", /log\s*in|login/i)
.should("exist")
.click({ force: true });

cy.location("pathname").should("include", "/app/login");
cy.contains("button, a, [role='button']", /IDIR/i).should("exist");
cy.contains("button, a, [role='button']", /BC Services Card/i).should(
"exist",
);
});
});
});
214 changes: 122 additions & 92 deletions applications/Unity.AutoUI/cypress/support/commands.ts
Original file line number Diff line number Diff line change
Expand Up @@ -143,15 +143,39 @@ Cypress.Commands.add("getChefsDetail", (key: string) => {
Cypress.Commands.add("chefsLogin", () => {
cy.getChefsDetail("chefsBaseURL").then((baseURL) => {
cy.visit(baseURL); // Visit the URL fetched from chefs.json
cy.get("#app > div > main > header > header > div > div.d-print-none")
.should("exist")
.click(); // click the login button
cy.get("body").then(($body) => {
// Prefer resilient text-based selectors over brittle full DOM paths.
if ($body.find("button:contains('LOGIN'), a:contains('LOGIN')").length) {
cy.contains("button, a", /^LOGIN$/i)
.first()
.click({ force: true });
} else if (
$body.find(
"#app > div > main > header > header > div > div.d-print-none",
).length
) {
cy.get("#app > div > main > header > header > div > div.d-print-none")
.should("exist")
.click({ force: true });
}
});
cy.wait(1000);
cy.get(
"#app > div > main > div.v-container.v-locale--is-ltr.text-center.main > div > div:nth-child(2) > div > button",
)
.should("exist")
.click(); // click the idir buttton
cy.get("body").then(($body) => {
// Some pages show an IDIR choice button before the credential form.
if ($body.find("button:contains('IDIR'), a:contains('IDIR')").length) {
cy.contains("button, a", /IDIR/i).first().click({ force: true });
} else if (
$body.find(
"#app > div > main > div.v-container.v-locale--is-ltr.text-center.main > div > div:nth-child(2) > div > button",
).length
) {
cy.get(
"#app > div > main > div.v-container.v-locale--is-ltr.text-center.main > div > div:nth-child(2) > div > button",
)
.should("exist")
.click({ force: true });
}
});
cy.wait(1000);
cy.get("body").then(($body) => {
// Check if you're already logged in.
Expand Down Expand Up @@ -246,11 +270,14 @@ function fetchGrantApplications(): Cypress.Chainable<GrantApplication[]> {
.then((response) => {
if (response.status !== 200) {
throw new Error(
`API request failed with status ${response.status}: ${JSON.stringify(response.body)}`
`API request failed with status ${response.status}: ${JSON.stringify(response.body)}`,
);
}
const data = response.body as GrantApplicationResponse;
Cypress.log({ name: "fetch", message: `📋 Fetched ${data.items?.length || 0} applications` });
Cypress.log({
name: "fetch",
message: `📋 Fetched ${data.items?.length || 0} applications`,
});
return data.items || [];
});
});
Expand All @@ -262,89 +289,92 @@ Cypress.Commands.add(
return fetchGrantApplications().then((allApplications) => {
let applications = allApplications;

Cypress.log({ name: "fetch", message: `📋 Fetched ${applications.length} applications from API` });

// Filter by category if specified (e.g., 'Data Seeder')
if (options.categoryFilter) {
applications = applications.filter((app) =>
app.category === options.categoryFilter
);
Cypress.log({
name: "filter",
message: `📋 Filtered to ${applications.length} applications with category: ${options.categoryFilter}`,
});
}

// Filter by status if specified (e.g., 'Submitted', 'Under Assessment', 'Approved')
if (options.statusFilter && options.statusFilter.length > 0) {
applications = applications.filter((app) =>
options.statusFilter!.includes(app.status)
);
Cypress.log({
name: "filter",
message: `📋 Filtered to ${applications.length} applications with status: ${options.statusFilter.join(", ")}`,
});
}

// Filter by max age if specified
if (options.maxAge) {
const cutoffDate = new Date();
cutoffDate.setDate(cutoffDate.getDate() - options.maxAge);
applications = applications.filter((app) => {
const submissionDate = new Date(app.submissionDate);
return submissionDate >= cutoffDate;
});
Cypress.log({
name: "filter",
message: `📋 Filtered to ${applications.length} applications within ${options.maxAge} days`,
});
}

if (applications.length === 0) {
throw new Error(
"No applications found matching the specified criteria"
);
}

// Sort applications (default: by submissionDate descending for latest first)
const sortBy = options.sortBy || 'submissionDate';
const sortOrder = options.sortOrder || 'desc';
applications.sort((a, b) => {
let aVal: number | string;
let bVal: number | string;

if (sortBy === 'submissionDate') {
aVal = new Date(a.submissionDate).getTime();
bVal = new Date(b.submissionDate).getTime();
} else {
aVal = a[sortBy] as number;
bVal = b[sortBy] as number;
}

if (sortOrder === 'desc') {
return bVal > aVal ? 1 : bVal < aVal ? -1 : 0;
} else {
return aVal > bVal ? 1 : aVal < bVal ? -1 : 0;
}
});

// Get the submission at the specified index (default: 0 = first/latest)
const index = options.index || 0;
if (index >= applications.length) {
throw new Error(
`Index ${index} out of range. Only ${applications.length} applications available.`
);
}

const selectedApp = applications[index];
Cypress.log({
name: "selected",
message: `✅ Selected submission: ${selectedApp.referenceNo} (Status: ${selectedApp.status}, Category: ${selectedApp.category})`,
});

return selectedApp.referenceNo;
Cypress.log({
name: "fetch",
message: `📋 Fetched ${applications.length} applications from API`,
});

// Filter by category if specified (e.g., 'Data Seeder')
if (options.categoryFilter) {
applications = applications.filter(
(app) => app.category === options.categoryFilter,
);
Cypress.log({
name: "filter",
message: `📋 Filtered to ${applications.length} applications with category: ${options.categoryFilter}`,
});
}

// Filter by status if specified (e.g., 'Submitted', 'Under Assessment', 'Approved')
if (options.statusFilter && options.statusFilter.length > 0) {
applications = applications.filter((app) =>
options.statusFilter!.includes(app.status),
);
Cypress.log({
name: "filter",
message: `📋 Filtered to ${applications.length} applications with status: ${options.statusFilter.join(", ")}`,
});
}

// Filter by max age if specified
if (options.maxAge) {
const cutoffDate = new Date();
cutoffDate.setDate(cutoffDate.getDate() - options.maxAge);
applications = applications.filter((app) => {
const submissionDate = new Date(app.submissionDate);
return submissionDate >= cutoffDate;
});
}
Cypress.log({
name: "filter",
message: `📋 Filtered to ${applications.length} applications within ${options.maxAge} days`,
});
}

if (applications.length === 0) {
throw new Error(
"No applications found matching the specified criteria",
);
}

// Sort applications (default: by submissionDate descending for latest first)
const sortBy = options.sortBy || "submissionDate";
const sortOrder = options.sortOrder || "desc";
applications.sort((a, b) => {
let aVal: number | string;
let bVal: number | string;

if (sortBy === "submissionDate") {
aVal = new Date(a.submissionDate).getTime();
bVal = new Date(b.submissionDate).getTime();
} else {
aVal = a[sortBy] as number;
bVal = b[sortBy] as number;
}

if (sortOrder === "desc") {
return bVal > aVal ? 1 : bVal < aVal ? -1 : 0;
} else {
return aVal > bVal ? 1 : aVal < bVal ? -1 : 0;
}
});

// Get the submission at the specified index (default: 0 = first/latest)
const index = options.index || 0;
if (index >= applications.length) {
throw new Error(
`Index ${index} out of range. Only ${applications.length} applications available.`,
);
}

const selectedApp = applications[index];
Cypress.log({
name: "selected",
message: `✅ Selected submission: ${selectedApp.referenceNo} (Status: ${selectedApp.status}, Category: ${selectedApp.category})`,
});

return selectedApp.referenceNo;
});
},
);

/**
Expand Down
6 changes: 6 additions & 0 deletions applications/Unity.GrantManager/common.props
Original file line number Diff line number Diff line change
Expand Up @@ -16,4 +16,10 @@
<Content Remove="$(UserProfile)\.nuget\packages\*\*\contentFiles\any\*\*.abppkg*.json" />
</ItemGroup>

<ItemGroup>
<!-- Add direct reference to the patched Scriban to ensure all projects importing common.props
use the safe version (pins transitive consumers that do not specify a version). -->
<PackageReference Include="Scriban" Version="7.2.0" />
</ItemGroup>

</Project>
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,5 @@ namespace Unity.GrantManager.Attachments;

public interface IAttachmentSummaryAppService : IApplicationService
{
Task<AttachmentSummaryResultDto> GenerateAttachmentSummaryAsync(Guid attachmentId, string? promptVersion = null);
Task<List<AttachmentSummaryResultDto>> GenerateAttachmentSummariesAsync(List<Guid> attachmentIds, string? promptVersion = null);
Task<List<AttachmentSummaryResultDto>> GenerateAttachmentSummariesForPipelineAsync(List<Guid> attachmentIds, string? promptVersion = null);
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
using System;
using System.Collections.Generic;
using System.Threading.Tasks;

namespace Unity.AI.Automation;

public interface IApplicationAIGenerationQueue
{
Task QueueAttachmentSummaryAsync(Guid applicationId, Guid? tenantId, string? promptVersion = null);
Task QueueAttachmentSummaryAsync(Guid applicationId, Guid? tenantId, string? promptVersion = null, List<Guid>? attachmentIds = null);
Task QueueApplicationAnalysisAsync(Guid applicationId, Guid? tenantId, string? promptVersion = null);
Task QueueApplicationScoringAsync(Guid applicationId, Guid? tenantId, string? promptVersion = null);
Task QueueAllAIStagesAsync(Guid applicationId, Guid? tenantId, string? promptVersion = null);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,5 @@ namespace Unity.AI.RateLimit;
public class AIRateLimitStateDto
{
public int RetryAfterSeconds { get; set; }
public bool IsGenerating { get; set; }
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
using System.Threading.Tasks;

namespace Unity.AI.RateLimit;

public interface IAIGenerationActivityProvider
{
Task<bool> HasActiveGenerationAsync();
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,8 @@ public interface IAIRateLimiter
Task StampAsync(Guid? userId);

/// <summary>
/// Returns the remaining cooldown for the current user. RetryAfterSeconds is 0 when
/// the user can generate immediately.
/// Returns the current user's shared AI generation state. RetryAfterSeconds is 0 when
/// the user can generate immediately, unless a generation is still active.
/// </summary>
Task<AIRateLimitStateDto> GetStateAsync();
}
Original file line number Diff line number Diff line change
Expand Up @@ -97,13 +97,30 @@ private async Task<string> GenerateOrFallbackAsync(
}
}

public async Task<List<string>> GenerateForApplicationAsync(Guid applicationId, string? promptVersion = null, CancellationToken cancellationToken = default)
public async Task<List<string>> GenerateForApplicationAsync(
Guid applicationId,
string? promptVersion = null,
IReadOnlyCollection<Guid>? attachmentIds = null,
CancellationToken cancellationToken = default)
{
var attachmentIds = (await applicationChefsFileAttachmentRepository.GetListAsync(a => a.ApplicationId == applicationId))
var applicationAttachmentIds = (await applicationChefsFileAttachmentRepository.GetListAsync(a => a.ApplicationId == applicationId))
.Select(a => a.Id)
.ToList();

return await GenerateAndSaveAsync(attachmentIds, promptVersion, cancellationToken);
if (attachmentIds is not { Count: > 0 })
{
return await GenerateAndSaveAsync(applicationAttachmentIds, promptVersion, cancellationToken);
}

var applicationAttachmentIdSet = applicationAttachmentIds.ToHashSet();
var selectedIds = attachmentIds.Distinct().ToList();

if (selectedIds.Any(id => !applicationAttachmentIdSet.Contains(id)))
{
throw new InvalidOperationException("One or more selected attachments do not belong to the application.");
}

return await GenerateAndSaveAsync(selectedIds, promptVersion, cancellationToken);
}

private async Task<ChefsFileAttachmentStream> OpenAttachmentStreamAsync(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,5 @@ public interface IAttachmentSummaryService
{
Task<string> GenerateAndSaveAsync(Guid attachmentId, string? promptVersion = null, CancellationToken cancellationToken = default);
Task<List<string>> GenerateAndSaveAsync(IEnumerable<Guid> attachmentIds, string? promptVersion = null, CancellationToken cancellationToken = default);
Task<List<string>> GenerateForApplicationAsync(Guid applicationId, string? promptVersion = null, CancellationToken cancellationToken = default);
Task<List<string>> GenerateForApplicationAsync(Guid applicationId, string? promptVersion = null, IReadOnlyCollection<Guid>? attachmentIds = null, CancellationToken cancellationToken = default);
}
Loading
Loading