Skip to content

Commit 4bf79ae

Browse files
committed
Merge branch 'master' into stories/ecer-5023
2 parents 4d86d15 + 6224a11 commit 4bf79ae

File tree

128 files changed

+6099
-4945
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

128 files changed

+6099
-4945
lines changed

.github/workflows/build-template.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ jobs:
8080
# https://github.com/aquasecurity/trivy-action
8181
- name: Run Trivy vulnerability scanner in repo mode
8282
if: github.event_name == 'pull_request'
83-
uses: aquasecurity/trivy-action@0.31.0
83+
uses: aquasecurity/trivy-action@0.32.0
8484
with:
8585
scan-type: "fs"
8686
ignore-unfixed: true
@@ -98,7 +98,7 @@ jobs:
9898
# https://github.com/aquasecurity/trivy-action
9999
- name: Run Trivy Scan on the created container
100100
if: github.event_name != 'pull_request'
101-
uses: aquasecurity/trivy-action@0.31.0
101+
uses: aquasecurity/trivy-action@0.32.0
102102
with:
103103
image-ref: ${{ fromJSON(steps.meta.outputs.json).tags[0] }}
104104
format: "sarif"

.github/workflows/regression-test.yml

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
name: regression
22
on:
33
workflow_dispatch:
4-
# Uncomment out when we want to run this daily
5-
# schedule:
6-
# - cron: '0 3 * * *' # Runs at 3am UTC
4+
schedule:
5+
- cron: "0 3 * * 6" # Runs at 3am UTC every Saturday
76

87
jobs:
98
regression:

src/ECER.Clients.RegistryPortal/ECER.Clients.RegistryPortal.Server/Applications/ApplicationMapper.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@ public ApplicationMapper()
103103
.ForMember(d => d.RenewalExplanationOther, opts => opts.MapFrom(s => s.RenewalExplanationOther))
104104
.ForMember(d => d.SignedDate, opts => opts.MapFrom(s => s.SignedDate))
105105
.ForMember(d => d.CharacterReferences, opts => opts.MapFrom(s => s.CharacterReferences))
106+
.ForMember(d => d.FromCertificate, opts => opts.MapFrom(s => s.FromCertificate))
106107
;
107108
CreateMap<Managers.Registry.Contract.Applications.CertificateInformation, CertificateInformation>().ReverseMap();
108109
CreateMap<Managers.Registry.Contract.Applications.Application, Application>();
@@ -126,6 +127,7 @@ public ApplicationMapper()
126127
.ForMember(d => d.AddMoreCharacterReference, opts => opts.MapFrom(s => s.AddMoreCharacterReference))
127128
.ForMember(d => d.AddMoreWorkExperienceReference, opts => opts.MapFrom(s => s.AddMoreWorkExperienceReference))
128129
.ForMember(d => d.AddMoreProfessionalDevelopment, opts => opts.MapFrom(s => s.AddMoreProfessionalDevelopment))
130+
.ForMember(d => d.FromCertificate, opts => opts.MapFrom(s => s.FromCertificate))
129131
.ForMember(d => d.ApplicationType, opts => opts.MapFrom(s => s.ApplicationType));
130132

131133
CreateMap<Managers.Registry.Contract.Applications.CharacterReference, CharacterReferenceStatus>()

src/ECER.Clients.RegistryPortal/ECER.Clients.RegistryPortal.Server/Applications/ApplicationsEndpoints.cs

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,39 @@
1-
using AutoMapper;
1+
using System.ComponentModel;
2+
using System.ComponentModel.DataAnnotations;
3+
using AutoMapper;
24
using ECER.Infrastructure.Common;
35
using ECER.Managers.Registry.Contract.Applications;
46
using ECER.Utilities.Hosting;
57
using ECER.Utilities.Security;
68
using MediatR;
79
using Microsoft.AspNetCore.Http.HttpResults;
810
using Microsoft.AspNetCore.Mvc;
9-
using System.ComponentModel;
10-
using System.ComponentModel.DataAnnotations;
1111

1212
namespace ECER.Clients.RegistryPortal.Server.Applications;
1313

1414
public class ApplicationsEndpoints : IRegisterEndpoints
1515
{
1616
public void Register(IEndpointRouteBuilder endpointRouteBuilder)
1717
{
18-
endpointRouteBuilder.MapPut("/api/draftapplications/{id?}", async Task<Results<Ok<DraftApplicationResponse>, BadRequest<string>,NotFound>> (string? id, SaveDraftApplicationRequest request, HttpContext ctx, CancellationToken ct, IMediator messageBus, IMapper mapper) =>
18+
endpointRouteBuilder.MapPut("/api/draftapplications/{id?}", async Task<Results<Ok<DraftApplicationResponse>, BadRequest<string>, NotFound>> (string? id, SaveDraftApplicationRequest request, HttpContext ctx, CancellationToken ct, IMediator messageBus, IMapper mapper) =>
1919
{
2020
bool IdIsNotGuid = !Guid.TryParse(id, out _); if (IdIsNotGuid && id != null) { id = null; }
2121
bool ApplicationIdIsNotGuid = !Guid.TryParse(request.DraftApplication.Id, out _); if (ApplicationIdIsNotGuid && request.DraftApplication.Id != null) { request.DraftApplication.Id = null; }
2222

2323
if (request.DraftApplication.Id != id) return TypedResults.BadRequest("resource id and payload id do not match");
2424
var userContext = ctx.User.GetUserContext();
2525
var draftApplication = mapper.Map<Managers.Registry.Contract.Applications.Application>(request.DraftApplication, opts => opts.Items.Add("registrantId", userContext!.UserId))!;
26-
27-
if(id != null)
26+
27+
if (id != null)
2828
{
2929
var query = new ApplicationsQuery
3030
{
3131
ById = id,
3232
ByApplicantId = userContext!.UserId,
33-
ByStatus = [Managers.Registry.Contract.Applications.ApplicationStatus.Draft ]
33+
ByStatus = [Managers.Registry.Contract.Applications.ApplicationStatus.Draft]
3434
};
3535
var results = await messageBus.Send(query, ct);
36-
if(!results.Items.Any()) return TypedResults.NotFound();
36+
if (!results.Items.Any()) return TypedResults.NotFound();
3737
}
3838

3939
var application = await messageBus.Send(new SaveDraftApplicationCommand(draftApplication), ct);
@@ -365,6 +365,7 @@ public record DraftApplication
365365
public IEnumerable<CharacterReference> CharacterReferences { get; set; } = Array.Empty<CharacterReference>();
366366
public IEnumerable<ProfessionalDevelopment> ProfessionalDevelopments { get; set; } = Array.Empty<ProfessionalDevelopment>();
367367
public string? Stage { get; set; }
368+
public string? FromCertificate { get; set; }
368369
public ApplicationTypes ApplicationType { get; set; }
369370
public EducationOrigin? EducationOrigin { get; set; }
370371
public EducationRecognition? EducationRecognition { get; set; }
@@ -374,7 +375,6 @@ public record DraftApplication
374375
public DateTime? CreatedOn { get; set; }
375376
public ApplicationOrigin? Origin { get; set; }
376377
public CertificateInformation? LabourMobilityCertificateInformation { get; set; }
377-
378378
}
379379

380380
public record Application
@@ -396,9 +396,9 @@ public record Application
396396
public OneYearRenewalexplanations? OneYearRenewalExplanationChoice { get; set; }
397397
public FiveYearRenewalExplanations? FiveYearRenewalExplanationChoice { get; set; }
398398
public string? RenewalExplanationOther { get; set; }
399+
public string? FromCertificate { get; set; }
399400
public ApplicationOrigin? Origin { get; set; }
400401
public CertificateInformation? LabourMobilityCertificateInformation { get; set; }
401-
402402
}
403403
public record ProfessionalDevelopment([Required] string CourseName, [Required] string OrganizationName, [Required] DateTime StartDate, [Required] DateTime EndDate, [Required] double NumberOfHours)
404404
{
@@ -518,7 +518,7 @@ public enum ApplicationTypes
518518
{
519519
New,
520520
Renewal,
521-
LaborMobility,
521+
LabourMobility,
522522
}
523523

524524
public enum EducationOrigin
@@ -551,6 +551,7 @@ public record SubmittedApplicationStatus(string Id, DateTime SubmittedOn, Applic
551551
public bool? AddMoreCharacterReference { get; set; }
552552
public bool? AddMoreWorkExperienceReference { get; set; }
553553
public bool? AddMoreProfessionalDevelopment { get; set; }
554+
public string? FromCertificate { get; set; }
554555
public ApplicationTypes? ApplicationType { get; set; }
555556
}
556557
public record FileInfo(string Id)
@@ -591,7 +592,7 @@ public record CharacterReferenceStatus(string Id, CharacterReferenceStage Status
591592
public bool? WillProvideReference { get; set; }
592593
}
593594

594-
public record ProfessionalDevelopmentStatus(string Id, string CourseName, int NumberOfHours)
595+
public record ProfessionalDevelopmentStatus(string Id, string CourseName, double NumberOfHours)
595596
{
596597
public ProfessionalDevelopmentStatusCode? Status { get; set; }
597598
}
@@ -676,6 +677,7 @@ public enum ProgramConfirmationOptions
676677
UploadNow,
677678
RegistryAlreadyHas
678679
}
680+
679681
public enum TranscriptStatusOptions
680682
{
681683
RegistryHasTranscript,

src/ECER.Clients.RegistryPortal/ECER.Clients.RegistryPortal.Server/Certifications/CertificationsEndpoints.cs

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
using AutoMapper;
2-
using ECER.Clients.RegistryPortal.Server.Applications;
32
using ECER.Managers.Registry.Contract.Certifications;
43
using ECER.Utilities.Hosting;
54
using ECER.Utilities.Security;
@@ -13,10 +12,27 @@ public class CertificationsEndpoints : IRegisterEndpoints
1312
{
1413
public void Register(IEndpointRouteBuilder endpointRouteBuilder)
1514
{
16-
endpointRouteBuilder.MapGet("/api/certifications/{id?}", async (string? id, HttpContext httpContext, IMediator messageBus, IMapper mapper, CancellationToken ct) =>
15+
endpointRouteBuilder.MapGet("/api/certifications/{id?}", async Task<Results<Ok<IEnumerable<Certification>>, BadRequest<ProblemDetails>>> (string? id, HttpContext httpContext, IMediator messageBus, IMapper mapper, CancellationToken ct) =>
1716
{
1817
var userId = httpContext.User.GetUserContext()?.UserId;
19-
bool IdIsNotGuid = !Guid.TryParse(id, out _); if (IdIsNotGuid) { id = null; }
18+
if (string.IsNullOrEmpty(id))
19+
{
20+
id = null;
21+
}
22+
else
23+
{
24+
bool IdIsNotGuid = !Guid.TryParse(id, out _);
25+
if (IdIsNotGuid)
26+
{
27+
var problemDetails = new ProblemDetails
28+
{
29+
Status = StatusCodes.Status400BadRequest,
30+
Detail = "Invalid certificate Id",
31+
Extensions = { ["errors"] = "Invalid certificate Id" }
32+
};
33+
return TypedResults.BadRequest(problemDetails);
34+
}
35+
}
2036

2137
var query = new UserCertificationQuery
2238
{

src/ECER.Clients.RegistryPortal/ECER.Clients.RegistryPortal.Server/ConfigurationEndpoints.cs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,15 @@ public void Register(IEndpointRouteBuilder endpointRouteBuilder)
2828
.WithOpenApi("Handles province queries", string.Empty, "province_get")
2929
.CacheOutput(p => p.Expire(TimeSpan.FromMinutes(5)));
3030

31+
32+
endpointRouteBuilder.MapGet("/api/defaultContents", async (HttpContext ctx, IMediator messageBus, IMapper mapper, CancellationToken ct) =>
33+
{
34+
var results = await messageBus.Send(new DefaultContentsQuery(), ct);
35+
return TypedResults.Ok(mapper.Map<IEnumerable<DefaultContent>>(results.Items));
36+
})
37+
.WithOpenApi("Handles default contents", string.Empty, "defaultContent_get")
38+
.CacheOutput(p => p.Expire(TimeSpan.FromMinutes(5)));
39+
3140
endpointRouteBuilder.MapGet("/api/countrylist", async (HttpContext ctx, IMediator messageBus, IMapper mapper, CancellationToken ct) =>
3241
{
3342
var results = await messageBus.Send(new CountriesQuery(), ct);
@@ -134,3 +143,9 @@ public record ComparisonRecord()
134143
public OutOfProvinceCertificationType? TransferringCertificate { get; set; }
135144
public IEnumerable<CertificationComparison> Options { get; set; } = Array.Empty<CertificationComparison>();
136145
}
146+
public record DefaultContent
147+
{
148+
public string? Name { get; set; }
149+
public string? SingleText { get; set; }
150+
public string? MultiText { get; set; }
151+
}

src/ECER.Clients.RegistryPortal/ECER.Clients.RegistryPortal.Server/ConfigurationMapper.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,5 +14,6 @@ public ConfigurationMapper()
1414
CreateMap<Managers.Admin.Contract.Metadatas.OutOfProvinceCertificationType, OutOfProvinceCertificationType>().ReverseMap();
1515
CreateMap<Managers.Admin.Contract.Metadatas.CertificationComparison, CertificationComparison>().ReverseMap();
1616
CreateMap<Managers.Admin.Contract.Metadatas.ComparisonRecord, ComparisonRecord>().ReverseMap();
17+
CreateMap<Managers.Admin.Contract.Metadatas.DefaultContent, DefaultContent>().ReverseMap();
1718
}
1819
}

src/ECER.Clients.RegistryPortal/ECER.Clients.RegistryPortal.Server/References/ReferencesEndpoints.cs

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
using AutoMapper;
1+
using System.ComponentModel.DataAnnotations;
2+
using AutoMapper;
23
using ECER.Clients.RegistryPortal.Server.Applications;
34
using ECER.Utilities.Hosting;
45
using MediatR;
56
using Microsoft.AspNetCore.Http.HttpResults;
67
using Microsoft.AspNetCore.Mvc;
7-
using System.ComponentModel.DataAnnotations;
88

99
namespace ECER.Clients.RegistryPortal.Server.References;
1010

@@ -224,14 +224,13 @@ public enum LikertScale
224224
No
225225
}
226226

227+
#pragma warning disable CA1707
228+
227229
public enum ChildcareAgeRanges
228230
{
229-
From0to12Months,
230-
From12to24Months,
231-
From25to30Months,
232-
From31to36Months,
233-
Grade1,
234-
Preschool,
231+
_036months,
232+
_35years,
233+
_68years,
235234
}
236235

237236
public enum ReferenceKnownTime

src/ECER.Clients.RegistryPortal/ecer.clients.registryportal.client/.storybook/main.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import type { StorybookConfig } from "@storybook/vue3-vite";
22

33
const config: StorybookConfig = {
44
stories: ["../src/**/*.mdx", "../src/**/*.stories.@(js|jsx|mjs|ts|tsx)"],
5-
addons: ["@storybook/addon-essentials", "@chromatic-com/storybook", "@storybook/experimental-addon-test"],
5+
addons: ["@chromatic-com/storybook", "@storybook/addon-vitest", "@storybook/addon-docs"],
66
framework: {
77
name: "@storybook/vue3-vite",
88
options: {},

src/ECER.Clients.RegistryPortal/ecer.clients.registryportal.client/.storybook/preview.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// .storybook/preview.ts
22

3-
import type { Preview } from "@storybook/vue3";
4-
import { setup } from "@storybook/vue3"; // ✅ Use the setup function from Storybook
3+
import type { Preview } from "@storybook/vue3-vite";
4+
import { setup } from "@storybook/vue3-vite"; // ✅ Use the setup function from Storybook
55
import { createVuetify } from "vuetify";
66
import "vuetify/styles"; // Import Vuetify base styles
77
import "@mdi/font/css/materialdesignicons.css"; // Optional: MDI icons

0 commit comments

Comments
 (0)