refactor: Rename TrueCV to RealCV throughout codebase

- Renamed all directories (TrueCV.* -> RealCV.*)
- Renamed all project files (.csproj)
- Renamed solution file (TrueCV.sln -> RealCV.sln)
- Updated all namespaces in C# and Razor files
- Updated project references
- Updated CSS variable names

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-01-22 20:47:55 +00:00
parent 6f384f8d09
commit 92a3b60878
107 changed files with 693 additions and 554 deletions

View File

@@ -5,17 +5,17 @@ VisualStudioVersion = 17.0.31903.59
MinimumVisualStudioVersion = 10.0.40219.1 MinimumVisualStudioVersion = 10.0.40219.1
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{F25C3740-9240-46DF-BC34-985BC577216B}" Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{F25C3740-9240-46DF-BC34-985BC577216B}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TrueCV.Domain", "src\TrueCV.Domain\TrueCV.Domain.csproj", "{41AC48AF-09BC-48D1-9CA4-1B05D3B693F0}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RealCV.Domain", "src\RealCV.Domain\RealCV.Domain.csproj", "{41AC48AF-09BC-48D1-9CA4-1B05D3B693F0}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TrueCV.Application", "src\TrueCV.Application\TrueCV.Application.csproj", "{A8A1BA81-3B2F-4F95-BB15-ACA40DF2A70E}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RealCV.Application", "src\RealCV.Application\RealCV.Application.csproj", "{A8A1BA81-3B2F-4F95-BB15-ACA40DF2A70E}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TrueCV.Infrastructure", "src\TrueCV.Infrastructure\TrueCV.Infrastructure.csproj", "{03DB607C-9592-4930-8C89-3E257A319278}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RealCV.Infrastructure", "src\RealCV.Infrastructure\RealCV.Infrastructure.csproj", "{03DB607C-9592-4930-8C89-3E257A319278}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TrueCV.Web", "src\TrueCV.Web\TrueCV.Web.csproj", "{D69F57DB-3092-48AF-81BB-868E3749C638}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RealCV.Web", "src\RealCV.Web\RealCV.Web.csproj", "{D69F57DB-3092-48AF-81BB-868E3749C638}"
EndProject EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{80890010-EDA6-418B-AD6C-5A9D875594C4}" Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{80890010-EDA6-418B-AD6C-5A9D875594C4}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TrueCV.Tests", "tests\TrueCV.Tests\TrueCV.Tests.csproj", "{4450D4F1-4EB9-445E-904B-1C57701493D8}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RealCV.Tests", "tests\RealCV.Tests\RealCV.Tests.csproj", "{4450D4F1-4EB9-445E-904B-1C57701493D8}"
EndProject EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution

BIN
screenshots/homepage.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

BIN
screenshots/login.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 449 KiB

BIN
screenshots/pricing.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 144 KiB

BIN
screenshots/privacy.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 289 KiB

BIN
screenshots/register.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 468 KiB

View File

@@ -1,4 +1,4 @@
namespace TrueCV.Application.DTOs; namespace RealCV.Application.DTOs;
public sealed record CVCheckDto public sealed record CVCheckDto
{ {

View File

@@ -1,4 +1,4 @@
namespace TrueCV.Application.DTOs; namespace RealCV.Application.DTOs;
public sealed record CompanySearchResult public sealed record CompanySearchResult
{ {

View File

@@ -1,4 +1,4 @@
namespace TrueCV.Application.Data; namespace RealCV.Application.Data;
/// <summary> /// <summary>
/// Known diploma mills and fake educational institutions. /// Known diploma mills and fake educational institutions.

View File

@@ -1,4 +1,4 @@
namespace TrueCV.Application.Data; namespace RealCV.Application.Data;
/// <summary> /// <summary>
/// List of recognised UK higher education institutions. /// List of recognised UK higher education institutions.

View File

@@ -1,4 +1,4 @@
namespace TrueCV.Application.Helpers; namespace RealCV.Application.Helpers;
public static class DateHelpers public static class DateHelpers
{ {

View File

@@ -1,6 +1,6 @@
using System.Text.Json; using System.Text.Json;
namespace TrueCV.Application.Helpers; namespace RealCV.Application.Helpers;
public static class JsonDefaults public static class JsonDefaults
{ {

View File

@@ -1,4 +1,4 @@
namespace TrueCV.Application.Helpers; namespace RealCV.Application.Helpers;
public static class ScoreThresholds public static class ScoreThresholds
{ {

View File

@@ -1,4 +1,4 @@
namespace TrueCV.Application.Interfaces; namespace RealCV.Application.Interfaces;
public interface IAuditService public interface IAuditService
{ {

View File

@@ -1,7 +1,7 @@
using TrueCV.Application.DTOs; using RealCV.Application.DTOs;
using TrueCV.Application.Models; using RealCV.Application.Models;
namespace TrueCV.Application.Interfaces; namespace RealCV.Application.Interfaces;
public interface ICVCheckService public interface ICVCheckService
{ {

View File

@@ -1,6 +1,6 @@
using TrueCV.Application.Models; using RealCV.Application.Models;
namespace TrueCV.Application.Interfaces; namespace RealCV.Application.Interfaces;
public interface ICVParserService public interface ICVParserService
{ {

View File

@@ -1,6 +1,6 @@
using TrueCV.Application.Models; using RealCV.Application.Models;
namespace TrueCV.Application.Interfaces; namespace RealCV.Application.Interfaces;
public interface ICompanyNameMatcherService public interface ICompanyNameMatcherService
{ {

View File

@@ -1,7 +1,7 @@
using TrueCV.Application.DTOs; using RealCV.Application.DTOs;
using TrueCV.Application.Models; using RealCV.Application.Models;
namespace TrueCV.Application.Interfaces; namespace RealCV.Application.Interfaces;
public interface ICompanyVerifierService public interface ICompanyVerifierService
{ {

View File

@@ -1,6 +1,6 @@
using TrueCV.Application.Models; using RealCV.Application.Models;
namespace TrueCV.Application.Interfaces; namespace RealCV.Application.Interfaces;
public interface IEducationVerifierService public interface IEducationVerifierService
{ {

View File

@@ -1,4 +1,4 @@
namespace TrueCV.Application.Interfaces; namespace RealCV.Application.Interfaces;
public interface IFileStorageService public interface IFileStorageService
{ {

View File

@@ -1,6 +1,6 @@
using TrueCV.Application.Models; using RealCV.Application.Models;
namespace TrueCV.Application.Interfaces; namespace RealCV.Application.Interfaces;
public interface ITimelineAnalyserService public interface ITimelineAnalyserService
{ {

View File

@@ -1,4 +1,4 @@
namespace TrueCV.Application.Interfaces; namespace RealCV.Application.Interfaces;
public interface IUserContextService public interface IUserContextService
{ {

View File

@@ -1,4 +1,4 @@
namespace TrueCV.Application.Models; namespace RealCV.Application.Models;
public sealed record CVData public sealed record CVData
{ {

View File

@@ -1,4 +1,4 @@
namespace TrueCV.Application.Models; namespace RealCV.Application.Models;
public sealed record CompanyVerificationResult public sealed record CompanyVerificationResult
{ {

View File

@@ -1,4 +1,4 @@
namespace TrueCV.Application.Models; namespace RealCV.Application.Models;
public sealed record EducationEntry public sealed record EducationEntry
{ {

View File

@@ -1,4 +1,4 @@
namespace TrueCV.Application.Models; namespace RealCV.Application.Models;
public sealed record EducationVerificationResult public sealed record EducationVerificationResult
{ {

View File

@@ -1,4 +1,4 @@
namespace TrueCV.Application.Models; namespace RealCV.Application.Models;
public sealed record EmploymentEntry public sealed record EmploymentEntry
{ {

View File

@@ -1,4 +1,4 @@
namespace TrueCV.Application.Models; namespace RealCV.Application.Models;
public sealed record FlagResult public sealed record FlagResult
{ {

View File

@@ -1,4 +1,4 @@
namespace TrueCV.Application.Models; namespace RealCV.Application.Models;
public record SemanticMatchResult public record SemanticMatchResult
{ {

View File

@@ -1,4 +1,4 @@
namespace TrueCV.Application.Models; namespace RealCV.Application.Models;
public sealed record TimelineAnalysisResult public sealed record TimelineAnalysisResult
{ {

View File

@@ -1,4 +1,4 @@
namespace TrueCV.Application.Models; namespace RealCV.Application.Models;
public sealed record TimelineGap public sealed record TimelineGap
{ {

View File

@@ -1,4 +1,4 @@
namespace TrueCV.Application.Models; namespace RealCV.Application.Models;
public sealed record TimelineOverlap public sealed record TimelineOverlap
{ {

View File

@@ -1,4 +1,4 @@
namespace TrueCV.Application.Models; namespace RealCV.Application.Models;
public sealed record VeracityReport public sealed record VeracityReport
{ {

View File

@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\TrueCV.Domain\TrueCV.Domain.csproj" /> <ProjectReference Include="..\RealCV.Domain\RealCV.Domain.csproj" />
</ItemGroup> </ItemGroup>
<PropertyGroup> <PropertyGroup>

View File

@@ -1,6 +1,6 @@
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
namespace TrueCV.Domain.Entities; namespace RealCV.Domain.Entities;
public class AuditLog public class AuditLog
{ {

View File

@@ -1,7 +1,7 @@
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using TrueCV.Domain.Enums; using RealCV.Domain.Enums;
namespace TrueCV.Domain.Entities; namespace RealCV.Domain.Entities;
public class CVCheck public class CVCheck
{ {

View File

@@ -1,8 +1,8 @@
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema; using System.ComponentModel.DataAnnotations.Schema;
using TrueCV.Domain.Enums; using RealCV.Domain.Enums;
namespace TrueCV.Domain.Entities; namespace RealCV.Domain.Entities;
public class CVFlag public class CVFlag
{ {

View File

@@ -1,6 +1,6 @@
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
namespace TrueCV.Domain.Entities; namespace RealCV.Domain.Entities;
public class CompanyCache public class CompanyCache
{ {

View File

@@ -1,4 +1,4 @@
namespace TrueCV.Domain.Enums; namespace RealCV.Domain.Enums;
public enum CheckStatus public enum CheckStatus
{ {

View File

@@ -1,4 +1,4 @@
namespace TrueCV.Domain.Enums; namespace RealCV.Domain.Enums;
public enum FlagCategory public enum FlagCategory
{ {

View File

@@ -1,4 +1,4 @@
namespace TrueCV.Domain.Enums; namespace RealCV.Domain.Enums;
public enum FlagSeverity public enum FlagSeverity
{ {

View File

@@ -1,4 +1,4 @@
namespace TrueCV.Domain.Enums; namespace RealCV.Domain.Enums;
public enum UserPlan public enum UserPlan
{ {

View File

@@ -1,4 +1,4 @@
namespace TrueCV.Infrastructure.Configuration; namespace RealCV.Infrastructure.Configuration;
public sealed class AnthropicSettings public sealed class AnthropicSettings
{ {

View File

@@ -1,4 +1,4 @@
namespace TrueCV.Infrastructure.Configuration; namespace RealCV.Infrastructure.Configuration;
public sealed class AzureBlobSettings public sealed class AzureBlobSettings
{ {

View File

@@ -1,4 +1,4 @@
namespace TrueCV.Infrastructure.Configuration; namespace RealCV.Infrastructure.Configuration;
public sealed class CompaniesHouseSettings public sealed class CompaniesHouseSettings
{ {

View File

@@ -1,4 +1,4 @@
namespace TrueCV.Infrastructure.Configuration; namespace RealCV.Infrastructure.Configuration;
public sealed class LocalStorageSettings public sealed class LocalStorageSettings
{ {

View File

@@ -1,10 +1,10 @@
using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Identity.EntityFrameworkCore; using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using TrueCV.Domain.Entities; using RealCV.Domain.Entities;
using TrueCV.Infrastructure.Identity; using RealCV.Infrastructure.Identity;
namespace TrueCV.Infrastructure.Data; namespace RealCV.Infrastructure.Data;
public class ApplicationDbContext : IdentityDbContext<ApplicationUser, IdentityRole<Guid>, Guid> public class ApplicationDbContext : IdentityDbContext<ApplicationUser, IdentityRole<Guid>, Guid>
{ {

View File

@@ -5,11 +5,11 @@ using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Metadata; using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion; using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using TrueCV.Infrastructure.Data; using RealCV.Infrastructure.Data;
#nullable disable #nullable disable
namespace TrueCV.Infrastructure.Data.Migrations namespace RealCV.Infrastructure.Data.Migrations
{ {
[DbContext(typeof(ApplicationDbContext))] [DbContext(typeof(ApplicationDbContext))]
[Migration("20260118182916_InitialCreate")] [Migration("20260118182916_InitialCreate")]
@@ -156,7 +156,7 @@ namespace TrueCV.Infrastructure.Data.Migrations
b.ToTable("AspNetUserTokens", (string)null); b.ToTable("AspNetUserTokens", (string)null);
}); });
modelBuilder.Entity("TrueCV.Domain.Entities.CVCheck", b => modelBuilder.Entity("RealCV.Domain.Entities.CVCheck", b =>
{ {
b.Property<Guid>("Id") b.Property<Guid>("Id")
.ValueGeneratedOnAdd() .ValueGeneratedOnAdd()
@@ -211,7 +211,7 @@ namespace TrueCV.Infrastructure.Data.Migrations
b.ToTable("CVChecks"); b.ToTable("CVChecks");
}); });
modelBuilder.Entity("TrueCV.Domain.Entities.CVFlag", b => modelBuilder.Entity("RealCV.Domain.Entities.CVFlag", b =>
{ {
b.Property<Guid>("Id") b.Property<Guid>("Id")
.ValueGeneratedOnAdd() .ValueGeneratedOnAdd()
@@ -251,7 +251,7 @@ namespace TrueCV.Infrastructure.Data.Migrations
b.ToTable("CVFlags"); b.ToTable("CVFlags");
}); });
modelBuilder.Entity("TrueCV.Domain.Entities.CompanyCache", b => modelBuilder.Entity("RealCV.Domain.Entities.CompanyCache", b =>
{ {
b.Property<string>("CompanyNumber") b.Property<string>("CompanyNumber")
.HasMaxLength(32) .HasMaxLength(32)
@@ -281,7 +281,7 @@ namespace TrueCV.Infrastructure.Data.Migrations
b.ToTable("CompanyCache"); b.ToTable("CompanyCache");
}); });
modelBuilder.Entity("TrueCV.Domain.Entities.User", b => modelBuilder.Entity("RealCV.Domain.Entities.User", b =>
{ {
b.Property<Guid>("Id") b.Property<Guid>("Id")
.ValueGeneratedOnAdd() .ValueGeneratedOnAdd()
@@ -307,7 +307,7 @@ namespace TrueCV.Infrastructure.Data.Migrations
b.ToTable("User"); b.ToTable("User");
}); });
modelBuilder.Entity("TrueCV.Infrastructure.Identity.ApplicationUser", b => modelBuilder.Entity("RealCV.Infrastructure.Identity.ApplicationUser", b =>
{ {
b.Property<Guid>("Id") b.Property<Guid>("Id")
.ValueGeneratedOnAdd() .ValueGeneratedOnAdd()
@@ -396,7 +396,7 @@ namespace TrueCV.Infrastructure.Data.Migrations
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim<System.Guid>", b => modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim<System.Guid>", b =>
{ {
b.HasOne("TrueCV.Infrastructure.Identity.ApplicationUser", null) b.HasOne("RealCV.Infrastructure.Identity.ApplicationUser", null)
.WithMany() .WithMany()
.HasForeignKey("UserId") .HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade) .OnDelete(DeleteBehavior.Cascade)
@@ -405,7 +405,7 @@ namespace TrueCV.Infrastructure.Data.Migrations
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin<System.Guid>", b => modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin<System.Guid>", b =>
{ {
b.HasOne("TrueCV.Infrastructure.Identity.ApplicationUser", null) b.HasOne("RealCV.Infrastructure.Identity.ApplicationUser", null)
.WithMany() .WithMany()
.HasForeignKey("UserId") .HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade) .OnDelete(DeleteBehavior.Cascade)
@@ -420,7 +420,7 @@ namespace TrueCV.Infrastructure.Data.Migrations
.OnDelete(DeleteBehavior.Cascade) .OnDelete(DeleteBehavior.Cascade)
.IsRequired(); .IsRequired();
b.HasOne("TrueCV.Infrastructure.Identity.ApplicationUser", null) b.HasOne("RealCV.Infrastructure.Identity.ApplicationUser", null)
.WithMany() .WithMany()
.HasForeignKey("UserId") .HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade) .OnDelete(DeleteBehavior.Cascade)
@@ -429,29 +429,29 @@ namespace TrueCV.Infrastructure.Data.Migrations
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken<System.Guid>", b => modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken<System.Guid>", b =>
{ {
b.HasOne("TrueCV.Infrastructure.Identity.ApplicationUser", null) b.HasOne("RealCV.Infrastructure.Identity.ApplicationUser", null)
.WithMany() .WithMany()
.HasForeignKey("UserId") .HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade) .OnDelete(DeleteBehavior.Cascade)
.IsRequired(); .IsRequired();
}); });
modelBuilder.Entity("TrueCV.Domain.Entities.CVCheck", b => modelBuilder.Entity("RealCV.Domain.Entities.CVCheck", b =>
{ {
b.HasOne("TrueCV.Infrastructure.Identity.ApplicationUser", null) b.HasOne("RealCV.Infrastructure.Identity.ApplicationUser", null)
.WithMany("CVChecks") .WithMany("CVChecks")
.HasForeignKey("UserId") .HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade) .OnDelete(DeleteBehavior.Cascade)
.IsRequired(); .IsRequired();
b.HasOne("TrueCV.Domain.Entities.User", null) b.HasOne("RealCV.Domain.Entities.User", null)
.WithMany("CVChecks") .WithMany("CVChecks")
.HasForeignKey("UserId1"); .HasForeignKey("UserId1");
}); });
modelBuilder.Entity("TrueCV.Domain.Entities.CVFlag", b => modelBuilder.Entity("RealCV.Domain.Entities.CVFlag", b =>
{ {
b.HasOne("TrueCV.Domain.Entities.CVCheck", "CVCheck") b.HasOne("RealCV.Domain.Entities.CVCheck", "CVCheck")
.WithMany("Flags") .WithMany("Flags")
.HasForeignKey("CVCheckId") .HasForeignKey("CVCheckId")
.OnDelete(DeleteBehavior.Cascade) .OnDelete(DeleteBehavior.Cascade)
@@ -460,17 +460,17 @@ namespace TrueCV.Infrastructure.Data.Migrations
b.Navigation("CVCheck"); b.Navigation("CVCheck");
}); });
modelBuilder.Entity("TrueCV.Domain.Entities.CVCheck", b => modelBuilder.Entity("RealCV.Domain.Entities.CVCheck", b =>
{ {
b.Navigation("Flags"); b.Navigation("Flags");
}); });
modelBuilder.Entity("TrueCV.Domain.Entities.User", b => modelBuilder.Entity("RealCV.Domain.Entities.User", b =>
{ {
b.Navigation("CVChecks"); b.Navigation("CVChecks");
}); });
modelBuilder.Entity("TrueCV.Infrastructure.Identity.ApplicationUser", b => modelBuilder.Entity("RealCV.Infrastructure.Identity.ApplicationUser", b =>
{ {
b.Navigation("CVChecks"); b.Navigation("CVChecks");
}); });

View File

@@ -3,7 +3,7 @@ using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable #nullable disable
namespace TrueCV.Infrastructure.Data.Migrations namespace RealCV.Infrastructure.Data.Migrations
{ {
/// <inheritdoc /> /// <inheritdoc />
public partial class InitialCreate : Migration public partial class InitialCreate : Migration

View File

@@ -5,11 +5,11 @@ using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Metadata; using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion; using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using TrueCV.Infrastructure.Data; using RealCV.Infrastructure.Data;
#nullable disable #nullable disable
namespace TrueCV.Infrastructure.Data.Migrations namespace RealCV.Infrastructure.Data.Migrations
{ {
[DbContext(typeof(ApplicationDbContext))] [DbContext(typeof(ApplicationDbContext))]
[Migration("20260120191035_AddProcessingStageToCV")] [Migration("20260120191035_AddProcessingStageToCV")]
@@ -156,7 +156,7 @@ namespace TrueCV.Infrastructure.Data.Migrations
b.ToTable("AspNetUserTokens", (string)null); b.ToTable("AspNetUserTokens", (string)null);
}); });
modelBuilder.Entity("TrueCV.Domain.Entities.CVCheck", b => modelBuilder.Entity("RealCV.Domain.Entities.CVCheck", b =>
{ {
b.Property<Guid>("Id") b.Property<Guid>("Id")
.ValueGeneratedOnAdd() .ValueGeneratedOnAdd()
@@ -210,7 +210,7 @@ namespace TrueCV.Infrastructure.Data.Migrations
b.ToTable("CVChecks"); b.ToTable("CVChecks");
}); });
modelBuilder.Entity("TrueCV.Domain.Entities.CVFlag", b => modelBuilder.Entity("RealCV.Domain.Entities.CVFlag", b =>
{ {
b.Property<Guid>("Id") b.Property<Guid>("Id")
.ValueGeneratedOnAdd() .ValueGeneratedOnAdd()
@@ -250,7 +250,7 @@ namespace TrueCV.Infrastructure.Data.Migrations
b.ToTable("CVFlags"); b.ToTable("CVFlags");
}); });
modelBuilder.Entity("TrueCV.Domain.Entities.CompanyCache", b => modelBuilder.Entity("RealCV.Domain.Entities.CompanyCache", b =>
{ {
b.Property<string>("CompanyNumber") b.Property<string>("CompanyNumber")
.HasMaxLength(32) .HasMaxLength(32)
@@ -292,7 +292,7 @@ namespace TrueCV.Infrastructure.Data.Migrations
b.ToTable("CompanyCache"); b.ToTable("CompanyCache");
}); });
modelBuilder.Entity("TrueCV.Infrastructure.Identity.ApplicationUser", b => modelBuilder.Entity("RealCV.Infrastructure.Identity.ApplicationUser", b =>
{ {
b.Property<Guid>("Id") b.Property<Guid>("Id")
.ValueGeneratedOnAdd() .ValueGeneratedOnAdd()
@@ -381,7 +381,7 @@ namespace TrueCV.Infrastructure.Data.Migrations
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim<System.Guid>", b => modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim<System.Guid>", b =>
{ {
b.HasOne("TrueCV.Infrastructure.Identity.ApplicationUser", null) b.HasOne("RealCV.Infrastructure.Identity.ApplicationUser", null)
.WithMany() .WithMany()
.HasForeignKey("UserId") .HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade) .OnDelete(DeleteBehavior.Cascade)
@@ -390,7 +390,7 @@ namespace TrueCV.Infrastructure.Data.Migrations
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin<System.Guid>", b => modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin<System.Guid>", b =>
{ {
b.HasOne("TrueCV.Infrastructure.Identity.ApplicationUser", null) b.HasOne("RealCV.Infrastructure.Identity.ApplicationUser", null)
.WithMany() .WithMany()
.HasForeignKey("UserId") .HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade) .OnDelete(DeleteBehavior.Cascade)
@@ -405,7 +405,7 @@ namespace TrueCV.Infrastructure.Data.Migrations
.OnDelete(DeleteBehavior.Cascade) .OnDelete(DeleteBehavior.Cascade)
.IsRequired(); .IsRequired();
b.HasOne("TrueCV.Infrastructure.Identity.ApplicationUser", null) b.HasOne("RealCV.Infrastructure.Identity.ApplicationUser", null)
.WithMany() .WithMany()
.HasForeignKey("UserId") .HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade) .OnDelete(DeleteBehavior.Cascade)
@@ -414,25 +414,25 @@ namespace TrueCV.Infrastructure.Data.Migrations
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken<System.Guid>", b => modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken<System.Guid>", b =>
{ {
b.HasOne("TrueCV.Infrastructure.Identity.ApplicationUser", null) b.HasOne("RealCV.Infrastructure.Identity.ApplicationUser", null)
.WithMany() .WithMany()
.HasForeignKey("UserId") .HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade) .OnDelete(DeleteBehavior.Cascade)
.IsRequired(); .IsRequired();
}); });
modelBuilder.Entity("TrueCV.Domain.Entities.CVCheck", b => modelBuilder.Entity("RealCV.Domain.Entities.CVCheck", b =>
{ {
b.HasOne("TrueCV.Infrastructure.Identity.ApplicationUser", null) b.HasOne("RealCV.Infrastructure.Identity.ApplicationUser", null)
.WithMany("CVChecks") .WithMany("CVChecks")
.HasForeignKey("UserId") .HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade) .OnDelete(DeleteBehavior.Cascade)
.IsRequired(); .IsRequired();
}); });
modelBuilder.Entity("TrueCV.Domain.Entities.CVFlag", b => modelBuilder.Entity("RealCV.Domain.Entities.CVFlag", b =>
{ {
b.HasOne("TrueCV.Domain.Entities.CVCheck", "CVCheck") b.HasOne("RealCV.Domain.Entities.CVCheck", "CVCheck")
.WithMany("Flags") .WithMany("Flags")
.HasForeignKey("CVCheckId") .HasForeignKey("CVCheckId")
.OnDelete(DeleteBehavior.Cascade) .OnDelete(DeleteBehavior.Cascade)
@@ -441,12 +441,12 @@ namespace TrueCV.Infrastructure.Data.Migrations
b.Navigation("CVCheck"); b.Navigation("CVCheck");
}); });
modelBuilder.Entity("TrueCV.Domain.Entities.CVCheck", b => modelBuilder.Entity("RealCV.Domain.Entities.CVCheck", b =>
{ {
b.Navigation("Flags"); b.Navigation("Flags");
}); });
modelBuilder.Entity("TrueCV.Infrastructure.Identity.ApplicationUser", b => modelBuilder.Entity("RealCV.Infrastructure.Identity.ApplicationUser", b =>
{ {
b.Navigation("CVChecks"); b.Navigation("CVChecks");
}); });

View File

@@ -3,7 +3,7 @@ using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable #nullable disable
namespace TrueCV.Infrastructure.Data.Migrations namespace RealCV.Infrastructure.Data.Migrations
{ {
/// <inheritdoc /> /// <inheritdoc />
public partial class AddProcessingStageToCV : Migration public partial class AddProcessingStageToCV : Migration

View File

@@ -5,11 +5,11 @@ using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Metadata; using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion; using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using TrueCV.Infrastructure.Data; using RealCV.Infrastructure.Data;
#nullable disable #nullable disable
namespace TrueCV.Infrastructure.Data.Migrations namespace RealCV.Infrastructure.Data.Migrations
{ {
[DbContext(typeof(ApplicationDbContext))] [DbContext(typeof(ApplicationDbContext))]
[Migration("20260120194532_AddAuditLogTable")] [Migration("20260120194532_AddAuditLogTable")]
@@ -156,7 +156,7 @@ namespace TrueCV.Infrastructure.Data.Migrations
b.ToTable("AspNetUserTokens", (string)null); b.ToTable("AspNetUserTokens", (string)null);
}); });
modelBuilder.Entity("TrueCV.Domain.Entities.AuditLog", b => modelBuilder.Entity("RealCV.Domain.Entities.AuditLog", b =>
{ {
b.Property<Guid>("Id") b.Property<Guid>("Id")
.ValueGeneratedOnAdd() .ValueGeneratedOnAdd()
@@ -202,7 +202,7 @@ namespace TrueCV.Infrastructure.Data.Migrations
b.ToTable("AuditLogs"); b.ToTable("AuditLogs");
}); });
modelBuilder.Entity("TrueCV.Domain.Entities.CVCheck", b => modelBuilder.Entity("RealCV.Domain.Entities.CVCheck", b =>
{ {
b.Property<Guid>("Id") b.Property<Guid>("Id")
.ValueGeneratedOnAdd() .ValueGeneratedOnAdd()
@@ -256,7 +256,7 @@ namespace TrueCV.Infrastructure.Data.Migrations
b.ToTable("CVChecks"); b.ToTable("CVChecks");
}); });
modelBuilder.Entity("TrueCV.Domain.Entities.CVFlag", b => modelBuilder.Entity("RealCV.Domain.Entities.CVFlag", b =>
{ {
b.Property<Guid>("Id") b.Property<Guid>("Id")
.ValueGeneratedOnAdd() .ValueGeneratedOnAdd()
@@ -296,7 +296,7 @@ namespace TrueCV.Infrastructure.Data.Migrations
b.ToTable("CVFlags"); b.ToTable("CVFlags");
}); });
modelBuilder.Entity("TrueCV.Domain.Entities.CompanyCache", b => modelBuilder.Entity("RealCV.Domain.Entities.CompanyCache", b =>
{ {
b.Property<string>("CompanyNumber") b.Property<string>("CompanyNumber")
.HasMaxLength(32) .HasMaxLength(32)
@@ -338,7 +338,7 @@ namespace TrueCV.Infrastructure.Data.Migrations
b.ToTable("CompanyCache"); b.ToTable("CompanyCache");
}); });
modelBuilder.Entity("TrueCV.Infrastructure.Identity.ApplicationUser", b => modelBuilder.Entity("RealCV.Infrastructure.Identity.ApplicationUser", b =>
{ {
b.Property<Guid>("Id") b.Property<Guid>("Id")
.ValueGeneratedOnAdd() .ValueGeneratedOnAdd()
@@ -427,7 +427,7 @@ namespace TrueCV.Infrastructure.Data.Migrations
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim<System.Guid>", b => modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim<System.Guid>", b =>
{ {
b.HasOne("TrueCV.Infrastructure.Identity.ApplicationUser", null) b.HasOne("RealCV.Infrastructure.Identity.ApplicationUser", null)
.WithMany() .WithMany()
.HasForeignKey("UserId") .HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade) .OnDelete(DeleteBehavior.Cascade)
@@ -436,7 +436,7 @@ namespace TrueCV.Infrastructure.Data.Migrations
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin<System.Guid>", b => modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin<System.Guid>", b =>
{ {
b.HasOne("TrueCV.Infrastructure.Identity.ApplicationUser", null) b.HasOne("RealCV.Infrastructure.Identity.ApplicationUser", null)
.WithMany() .WithMany()
.HasForeignKey("UserId") .HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade) .OnDelete(DeleteBehavior.Cascade)
@@ -451,7 +451,7 @@ namespace TrueCV.Infrastructure.Data.Migrations
.OnDelete(DeleteBehavior.Cascade) .OnDelete(DeleteBehavior.Cascade)
.IsRequired(); .IsRequired();
b.HasOne("TrueCV.Infrastructure.Identity.ApplicationUser", null) b.HasOne("RealCV.Infrastructure.Identity.ApplicationUser", null)
.WithMany() .WithMany()
.HasForeignKey("UserId") .HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade) .OnDelete(DeleteBehavior.Cascade)
@@ -460,25 +460,25 @@ namespace TrueCV.Infrastructure.Data.Migrations
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken<System.Guid>", b => modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken<System.Guid>", b =>
{ {
b.HasOne("TrueCV.Infrastructure.Identity.ApplicationUser", null) b.HasOne("RealCV.Infrastructure.Identity.ApplicationUser", null)
.WithMany() .WithMany()
.HasForeignKey("UserId") .HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade) .OnDelete(DeleteBehavior.Cascade)
.IsRequired(); .IsRequired();
}); });
modelBuilder.Entity("TrueCV.Domain.Entities.CVCheck", b => modelBuilder.Entity("RealCV.Domain.Entities.CVCheck", b =>
{ {
b.HasOne("TrueCV.Infrastructure.Identity.ApplicationUser", null) b.HasOne("RealCV.Infrastructure.Identity.ApplicationUser", null)
.WithMany("CVChecks") .WithMany("CVChecks")
.HasForeignKey("UserId") .HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade) .OnDelete(DeleteBehavior.Cascade)
.IsRequired(); .IsRequired();
}); });
modelBuilder.Entity("TrueCV.Domain.Entities.CVFlag", b => modelBuilder.Entity("RealCV.Domain.Entities.CVFlag", b =>
{ {
b.HasOne("TrueCV.Domain.Entities.CVCheck", "CVCheck") b.HasOne("RealCV.Domain.Entities.CVCheck", "CVCheck")
.WithMany("Flags") .WithMany("Flags")
.HasForeignKey("CVCheckId") .HasForeignKey("CVCheckId")
.OnDelete(DeleteBehavior.Cascade) .OnDelete(DeleteBehavior.Cascade)
@@ -487,12 +487,12 @@ namespace TrueCV.Infrastructure.Data.Migrations
b.Navigation("CVCheck"); b.Navigation("CVCheck");
}); });
modelBuilder.Entity("TrueCV.Domain.Entities.CVCheck", b => modelBuilder.Entity("RealCV.Domain.Entities.CVCheck", b =>
{ {
b.Navigation("Flags"); b.Navigation("Flags");
}); });
modelBuilder.Entity("TrueCV.Infrastructure.Identity.ApplicationUser", b => modelBuilder.Entity("RealCV.Infrastructure.Identity.ApplicationUser", b =>
{ {
b.Navigation("CVChecks"); b.Navigation("CVChecks");
}); });

View File

@@ -3,7 +3,7 @@ using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable #nullable disable
namespace TrueCV.Infrastructure.Data.Migrations namespace RealCV.Infrastructure.Data.Migrations
{ {
/// <inheritdoc /> /// <inheritdoc />
public partial class AddAuditLogTable : Migration public partial class AddAuditLogTable : Migration

View File

@@ -4,11 +4,11 @@ using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Metadata; using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion; using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using TrueCV.Infrastructure.Data; using RealCV.Infrastructure.Data;
#nullable disable #nullable disable
namespace TrueCV.Infrastructure.Data.Migrations namespace RealCV.Infrastructure.Data.Migrations
{ {
[DbContext(typeof(ApplicationDbContext))] [DbContext(typeof(ApplicationDbContext))]
partial class ApplicationDbContextModelSnapshot : ModelSnapshot partial class ApplicationDbContextModelSnapshot : ModelSnapshot
@@ -153,7 +153,7 @@ namespace TrueCV.Infrastructure.Data.Migrations
b.ToTable("AspNetUserTokens", (string)null); b.ToTable("AspNetUserTokens", (string)null);
}); });
modelBuilder.Entity("TrueCV.Domain.Entities.AuditLog", b => modelBuilder.Entity("RealCV.Domain.Entities.AuditLog", b =>
{ {
b.Property<Guid>("Id") b.Property<Guid>("Id")
.ValueGeneratedOnAdd() .ValueGeneratedOnAdd()
@@ -199,7 +199,7 @@ namespace TrueCV.Infrastructure.Data.Migrations
b.ToTable("AuditLogs"); b.ToTable("AuditLogs");
}); });
modelBuilder.Entity("TrueCV.Domain.Entities.CVCheck", b => modelBuilder.Entity("RealCV.Domain.Entities.CVCheck", b =>
{ {
b.Property<Guid>("Id") b.Property<Guid>("Id")
.ValueGeneratedOnAdd() .ValueGeneratedOnAdd()
@@ -253,7 +253,7 @@ namespace TrueCV.Infrastructure.Data.Migrations
b.ToTable("CVChecks"); b.ToTable("CVChecks");
}); });
modelBuilder.Entity("TrueCV.Domain.Entities.CVFlag", b => modelBuilder.Entity("RealCV.Domain.Entities.CVFlag", b =>
{ {
b.Property<Guid>("Id") b.Property<Guid>("Id")
.ValueGeneratedOnAdd() .ValueGeneratedOnAdd()
@@ -293,7 +293,7 @@ namespace TrueCV.Infrastructure.Data.Migrations
b.ToTable("CVFlags"); b.ToTable("CVFlags");
}); });
modelBuilder.Entity("TrueCV.Domain.Entities.CompanyCache", b => modelBuilder.Entity("RealCV.Domain.Entities.CompanyCache", b =>
{ {
b.Property<string>("CompanyNumber") b.Property<string>("CompanyNumber")
.HasMaxLength(32) .HasMaxLength(32)
@@ -335,7 +335,7 @@ namespace TrueCV.Infrastructure.Data.Migrations
b.ToTable("CompanyCache"); b.ToTable("CompanyCache");
}); });
modelBuilder.Entity("TrueCV.Infrastructure.Identity.ApplicationUser", b => modelBuilder.Entity("RealCV.Infrastructure.Identity.ApplicationUser", b =>
{ {
b.Property<Guid>("Id") b.Property<Guid>("Id")
.ValueGeneratedOnAdd() .ValueGeneratedOnAdd()
@@ -424,7 +424,7 @@ namespace TrueCV.Infrastructure.Data.Migrations
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim<System.Guid>", b => modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim<System.Guid>", b =>
{ {
b.HasOne("TrueCV.Infrastructure.Identity.ApplicationUser", null) b.HasOne("RealCV.Infrastructure.Identity.ApplicationUser", null)
.WithMany() .WithMany()
.HasForeignKey("UserId") .HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade) .OnDelete(DeleteBehavior.Cascade)
@@ -433,7 +433,7 @@ namespace TrueCV.Infrastructure.Data.Migrations
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin<System.Guid>", b => modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin<System.Guid>", b =>
{ {
b.HasOne("TrueCV.Infrastructure.Identity.ApplicationUser", null) b.HasOne("RealCV.Infrastructure.Identity.ApplicationUser", null)
.WithMany() .WithMany()
.HasForeignKey("UserId") .HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade) .OnDelete(DeleteBehavior.Cascade)
@@ -448,7 +448,7 @@ namespace TrueCV.Infrastructure.Data.Migrations
.OnDelete(DeleteBehavior.Cascade) .OnDelete(DeleteBehavior.Cascade)
.IsRequired(); .IsRequired();
b.HasOne("TrueCV.Infrastructure.Identity.ApplicationUser", null) b.HasOne("RealCV.Infrastructure.Identity.ApplicationUser", null)
.WithMany() .WithMany()
.HasForeignKey("UserId") .HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade) .OnDelete(DeleteBehavior.Cascade)
@@ -457,25 +457,25 @@ namespace TrueCV.Infrastructure.Data.Migrations
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken<System.Guid>", b => modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken<System.Guid>", b =>
{ {
b.HasOne("TrueCV.Infrastructure.Identity.ApplicationUser", null) b.HasOne("RealCV.Infrastructure.Identity.ApplicationUser", null)
.WithMany() .WithMany()
.HasForeignKey("UserId") .HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade) .OnDelete(DeleteBehavior.Cascade)
.IsRequired(); .IsRequired();
}); });
modelBuilder.Entity("TrueCV.Domain.Entities.CVCheck", b => modelBuilder.Entity("RealCV.Domain.Entities.CVCheck", b =>
{ {
b.HasOne("TrueCV.Infrastructure.Identity.ApplicationUser", null) b.HasOne("RealCV.Infrastructure.Identity.ApplicationUser", null)
.WithMany("CVChecks") .WithMany("CVChecks")
.HasForeignKey("UserId") .HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade) .OnDelete(DeleteBehavior.Cascade)
.IsRequired(); .IsRequired();
}); });
modelBuilder.Entity("TrueCV.Domain.Entities.CVFlag", b => modelBuilder.Entity("RealCV.Domain.Entities.CVFlag", b =>
{ {
b.HasOne("TrueCV.Domain.Entities.CVCheck", "CVCheck") b.HasOne("RealCV.Domain.Entities.CVCheck", "CVCheck")
.WithMany("Flags") .WithMany("Flags")
.HasForeignKey("CVCheckId") .HasForeignKey("CVCheckId")
.OnDelete(DeleteBehavior.Cascade) .OnDelete(DeleteBehavior.Cascade)
@@ -484,12 +484,12 @@ namespace TrueCV.Infrastructure.Data.Migrations
b.Navigation("CVCheck"); b.Navigation("CVCheck");
}); });
modelBuilder.Entity("TrueCV.Domain.Entities.CVCheck", b => modelBuilder.Entity("RealCV.Domain.Entities.CVCheck", b =>
{ {
b.Navigation("Flags"); b.Navigation("Flags");
}); });
modelBuilder.Entity("TrueCV.Infrastructure.Identity.ApplicationUser", b => modelBuilder.Entity("RealCV.Infrastructure.Identity.ApplicationUser", b =>
{ {
b.Navigation("CVChecks"); b.Navigation("CVChecks");
}); });

View File

@@ -5,14 +5,14 @@ using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Polly; using Polly;
using Polly.Extensions.Http; using Polly.Extensions.Http;
using TrueCV.Application.Interfaces; using RealCV.Application.Interfaces;
using TrueCV.Infrastructure.Configuration; using RealCV.Infrastructure.Configuration;
using TrueCV.Infrastructure.Data; using RealCV.Infrastructure.Data;
using TrueCV.Infrastructure.ExternalApis; using RealCV.Infrastructure.ExternalApis;
using TrueCV.Infrastructure.Jobs; using RealCV.Infrastructure.Jobs;
using TrueCV.Infrastructure.Services; using RealCV.Infrastructure.Services;
namespace TrueCV.Infrastructure; namespace RealCV.Infrastructure;
public static class DependencyInjection public static class DependencyInjection
{ {

View File

@@ -6,10 +6,10 @@ using System.Text.Json;
using System.Text.Json.Serialization; using System.Text.Json.Serialization;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
using TrueCV.Application.DTOs; using RealCV.Application.DTOs;
using TrueCV.Infrastructure.Configuration; using RealCV.Infrastructure.Configuration;
namespace TrueCV.Infrastructure.ExternalApis; namespace RealCV.Infrastructure.ExternalApis;
public sealed class CompaniesHouseClient public sealed class CompaniesHouseClient
{ {

View File

@@ -1,4 +1,4 @@
namespace TrueCV.Infrastructure.Helpers; namespace RealCV.Infrastructure.Helpers;
/// <summary> /// <summary>
/// Helper methods for processing AI/LLM JSON responses. /// Helper methods for processing AI/LLM JSON responses.

View File

@@ -1,8 +1,8 @@
using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Identity;
using TrueCV.Domain.Entities; using RealCV.Domain.Entities;
using TrueCV.Domain.Enums; using RealCV.Domain.Enums;
namespace TrueCV.Infrastructure.Identity; namespace RealCV.Infrastructure.Identity;
public class ApplicationUser : IdentityUser<Guid> public class ApplicationUser : IdentityUser<Guid>
{ {

View File

@@ -1,14 +1,14 @@
using System.Text.Json; using System.Text.Json;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using TrueCV.Application.Helpers; using RealCV.Application.Helpers;
using TrueCV.Application.Interfaces; using RealCV.Application.Interfaces;
using TrueCV.Application.Models; using RealCV.Application.Models;
using TrueCV.Domain.Entities; using RealCV.Domain.Entities;
using TrueCV.Domain.Enums; using RealCV.Domain.Enums;
using TrueCV.Infrastructure.Data; using RealCV.Infrastructure.Data;
namespace TrueCV.Infrastructure.Jobs; namespace RealCV.Infrastructure.Jobs;
public sealed class ProcessCVCheckJob public sealed class ProcessCVCheckJob
{ {

View File

@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\TrueCV.Application\TrueCV.Application.csproj" /> <ProjectReference Include="..\RealCV.Application\RealCV.Application.csproj" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

View File

@@ -3,13 +3,13 @@ using Anthropic.SDK;
using Anthropic.SDK.Messaging; using Anthropic.SDK.Messaging;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
using TrueCV.Application.Helpers; using RealCV.Application.Helpers;
using TrueCV.Application.Interfaces; using RealCV.Application.Interfaces;
using TrueCV.Application.Models; using RealCV.Application.Models;
using TrueCV.Infrastructure.Configuration; using RealCV.Infrastructure.Configuration;
using TrueCV.Infrastructure.Helpers; using RealCV.Infrastructure.Helpers;
namespace TrueCV.Infrastructure.Services; namespace RealCV.Infrastructure.Services;
public sealed class AICompanyNameMatcherService : ICompanyNameMatcherService public sealed class AICompanyNameMatcherService : ICompanyNameMatcherService
{ {

View File

@@ -1,9 +1,9 @@
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using TrueCV.Application.Interfaces; using RealCV.Application.Interfaces;
using TrueCV.Domain.Entities; using RealCV.Domain.Entities;
using TrueCV.Infrastructure.Data; using RealCV.Infrastructure.Data;
namespace TrueCV.Infrastructure.Services; namespace RealCV.Infrastructure.Services;
public sealed class AuditService : IAuditService public sealed class AuditService : IAuditService
{ {

View File

@@ -2,16 +2,16 @@ using System.Text.Json;
using Hangfire; using Hangfire;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using TrueCV.Application.DTOs; using RealCV.Application.DTOs;
using TrueCV.Application.Helpers; using RealCV.Application.Helpers;
using TrueCV.Application.Interfaces; using RealCV.Application.Interfaces;
using TrueCV.Application.Models; using RealCV.Application.Models;
using TrueCV.Domain.Entities; using RealCV.Domain.Entities;
using TrueCV.Domain.Enums; using RealCV.Domain.Enums;
using TrueCV.Infrastructure.Data; using RealCV.Infrastructure.Data;
using TrueCV.Infrastructure.Jobs; using RealCV.Infrastructure.Jobs;
namespace TrueCV.Infrastructure.Services; namespace RealCV.Infrastructure.Services;
public sealed class CVCheckService : ICVCheckService public sealed class CVCheckService : ICVCheckService
{ {

View File

@@ -1,19 +1,20 @@
using System.Text; using System.Text;
using System.Text.Json; using System.Text.Json;
using System.Text.Json.Serialization;
using Anthropic.SDK; using Anthropic.SDK;
using Anthropic.SDK.Messaging; using Anthropic.SDK.Messaging;
using DocumentFormat.OpenXml.Packaging; using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Wordprocessing; using DocumentFormat.OpenXml.Wordprocessing;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
using TrueCV.Application.Helpers; using RealCV.Application.Helpers;
using TrueCV.Application.Interfaces; using RealCV.Application.Interfaces;
using TrueCV.Application.Models; using RealCV.Application.Models;
using TrueCV.Infrastructure.Configuration; using RealCV.Infrastructure.Configuration;
using TrueCV.Infrastructure.Helpers; using RealCV.Infrastructure.Helpers;
using UglyToad.PdfPig; using UglyToad.PdfPig;
namespace TrueCV.Infrastructure.Services; namespace RealCV.Infrastructure.Services;
public sealed class CVParserService : ICVParserService public sealed class CVParserService : ICVParserService
{ {
@@ -83,6 +84,20 @@ public sealed class CVParserService : ICVParserService
_logger.LogDebug("Parsing CV file: {FileName}", fileName); _logger.LogDebug("Parsing CV file: {FileName}", fileName);
var extension = Path.GetExtension(fileName).ToLowerInvariant();
// Handle JSON files directly (debug/test format)
if (extension == ".json")
{
var cvData = await ParseJsonFileAsync(fileStream, cancellationToken);
_logger.LogInformation(
"Successfully loaded JSON CV for {FullName} with {EmploymentCount} employment entries and {EducationCount} education entries",
cvData.FullName,
cvData.Employment.Count,
cvData.Education.Count);
return cvData;
}
var text = await ExtractTextAsync(fileStream, fileName, cancellationToken); var text = await ExtractTextAsync(fileStream, fileName, cancellationToken);
if (string.IsNullOrWhiteSpace(text)) if (string.IsNullOrWhiteSpace(text))
@@ -93,15 +108,15 @@ public sealed class CVParserService : ICVParserService
_logger.LogDebug("Extracted {CharCount} characters from {FileName}", text.Length, fileName); _logger.LogDebug("Extracted {CharCount} characters from {FileName}", text.Length, fileName);
var cvData = await ParseWithClaudeAsync(text, cancellationToken); var cvDataFromAI = await ParseWithClaudeAsync(text, cancellationToken);
_logger.LogInformation( _logger.LogInformation(
"Successfully parsed CV for {FullName} with {EmploymentCount} employment entries and {EducationCount} education entries", "Successfully parsed CV for {FullName} with {EmploymentCount} employment entries and {EducationCount} education entries",
cvData.FullName, cvDataFromAI.FullName,
cvData.Employment.Count, cvDataFromAI.Employment.Count,
cvData.Education.Count); cvDataFromAI.Education.Count);
return cvData; return cvDataFromAI;
} }
private async Task<string> ExtractTextAsync(Stream fileStream, string fileName, CancellationToken cancellationToken) private async Task<string> ExtractTextAsync(Stream fileStream, string fileName, CancellationToken cancellationToken)
@@ -116,6 +131,60 @@ public sealed class CVParserService : ICVParserService
}; };
} }
private async Task<CVData> ParseJsonFileAsync(Stream fileStream, CancellationToken cancellationToken)
{
var testCv = await JsonSerializer.DeserializeAsync<TestCVData>(fileStream, TestJsonOptions, cancellationToken)
?? throw new InvalidOperationException("Failed to deserialize JSON CV file");
return new CVData
{
FullName = testCv.Personal?.Name ?? "Unknown",
Email = testCv.Personal?.Email,
Phone = testCv.Personal?.Phone,
Employment = testCv.Employment?.Select(e => new EmploymentEntry
{
CompanyName = e.Company ?? "Unknown",
JobTitle = e.JobTitle ?? "Unknown",
Location = e.Location,
StartDate = ParseTestDate(e.StartDate),
EndDate = ParseTestDate(e.EndDate),
IsCurrent = e.EndDate == null,
Description = e.Description
}).ToList() ?? [],
Education = testCv.Education?.Select(e => new EducationEntry
{
Institution = e.Institution ?? "Unknown",
Qualification = e.Qualification,
Subject = e.Subject,
StartDate = ParseTestDate(e.StartDate),
EndDate = ParseTestDate(e.EndDate)
}).ToList() ?? [],
Skills = testCv.Skills ?? []
};
}
private static DateOnly? ParseTestDate(string? dateStr)
{
if (string.IsNullOrEmpty(dateStr)) return null;
// Try parsing YYYY-MM format
if (dateStr.Length == 7 && dateStr[4] == '-')
{
if (int.TryParse(dateStr[..4], out var year) && int.TryParse(dateStr[5..], out var month))
{
return new DateOnly(year, month, 1);
}
}
// Try standard parsing
if (DateOnly.TryParse(dateStr, out var date))
{
return date;
}
return null;
}
private async Task<string> ExtractTextFromPdfAsync(Stream fileStream, CancellationToken cancellationToken) private async Task<string> ExtractTextFromPdfAsync(Stream fileStream, CancellationToken cancellationToken)
{ {
// Copy stream to memory for PdfPig (requires seekable stream) // Copy stream to memory for PdfPig (requires seekable stream)
@@ -244,6 +313,57 @@ public sealed class CVParserService : ICVParserService
}; };
} }
// JSON options for test/debug CV format (snake_case)
private static readonly JsonSerializerOptions TestJsonOptions = new()
{
PropertyNameCaseInsensitive = true,
PropertyNamingPolicy = JsonNamingPolicy.SnakeCaseLower,
Converters = { new JsonStringEnumConverter() }
};
// DTOs for test JSON format (snake_case with nested personal object)
private sealed record TestCVData
{
public string? CvId { get; init; }
public string? Category { get; init; }
public List<string>? ExpectedFlags { get; init; }
public TestPersonalData? Personal { get; init; }
public string? Profile { get; init; }
public List<TestEmploymentEntry>? Employment { get; init; }
public List<TestEducationEntry>? Education { get; init; }
public List<string>? Skills { get; init; }
}
private sealed record TestPersonalData
{
public string? Name { get; init; }
public string? Email { get; init; }
public string? Phone { get; init; }
public string? Address { get; init; }
public string? LinkedIn { get; init; }
}
private sealed record TestEmploymentEntry
{
public string? Company { get; init; }
public string? JobTitle { get; init; }
public string? StartDate { get; init; }
public string? EndDate { get; init; }
public string? Location { get; init; }
public string? Description { get; init; }
public List<string>? Achievements { get; init; }
}
private sealed record TestEducationEntry
{
public string? Institution { get; init; }
public string? Qualification { get; init; }
public string? Subject { get; init; }
public string? Classification { get; init; }
public string? StartDate { get; init; }
public string? EndDate { get; init; }
}
// Internal DTOs for Claude response parsing // Internal DTOs for Claude response parsing
private sealed record ClaudeCVResponse private sealed record ClaudeCVResponse
{ {

View File

@@ -2,15 +2,15 @@ using System.Text.Json;
using FuzzySharp; using FuzzySharp;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using TrueCV.Application.DTOs; using RealCV.Application.DTOs;
using TrueCV.Application.Helpers; using RealCV.Application.Helpers;
using TrueCV.Application.Interfaces; using RealCV.Application.Interfaces;
using TrueCV.Application.Models; using RealCV.Application.Models;
using TrueCV.Domain.Entities; using RealCV.Domain.Entities;
using TrueCV.Infrastructure.Data; using RealCV.Infrastructure.Data;
using TrueCV.Infrastructure.ExternalApis; using RealCV.Infrastructure.ExternalApis;
namespace TrueCV.Infrastructure.Services; namespace RealCV.Infrastructure.Services;
public sealed class CompanyVerifierService : ICompanyVerifierService public sealed class CompanyVerifierService : ICompanyVerifierService
{ {

View File

@@ -1,8 +1,8 @@
using TrueCV.Application.Data; using RealCV.Application.Data;
using TrueCV.Application.Interfaces; using RealCV.Application.Interfaces;
using TrueCV.Application.Models; using RealCV.Application.Models;
namespace TrueCV.Infrastructure.Services; namespace RealCV.Infrastructure.Services;
public sealed class EducationVerifierService : IEducationVerifierService public sealed class EducationVerifierService : IEducationVerifierService
{ {

View File

@@ -2,10 +2,10 @@ using Azure.Storage.Blobs;
using Azure.Storage.Blobs.Models; using Azure.Storage.Blobs.Models;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
using TrueCV.Application.Interfaces; using RealCV.Application.Interfaces;
using TrueCV.Infrastructure.Configuration; using RealCV.Infrastructure.Configuration;
namespace TrueCV.Infrastructure.Services; namespace RealCV.Infrastructure.Services;
public sealed class FileStorageService : IFileStorageService public sealed class FileStorageService : IFileStorageService
{ {

View File

@@ -1,9 +1,9 @@
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
using TrueCV.Application.Interfaces; using RealCV.Application.Interfaces;
using TrueCV.Infrastructure.Configuration; using RealCV.Infrastructure.Configuration;
namespace TrueCV.Infrastructure.Services; namespace RealCV.Infrastructure.Services;
public sealed class LocalFileStorageService : IFileStorageService public sealed class LocalFileStorageService : IFileStorageService
{ {

View File

@@ -1,8 +1,8 @@
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using TrueCV.Application.Interfaces; using RealCV.Application.Interfaces;
using TrueCV.Application.Models; using RealCV.Application.Models;
namespace TrueCV.Infrastructure.Services; namespace RealCV.Infrastructure.Services;
public sealed class TimelineAnalyserService : ITimelineAnalyserService public sealed class TimelineAnalyserService : ITimelineAnalyserService
{ {

View File

@@ -1,8 +1,8 @@
using System.Security.Claims; using System.Security.Claims;
using Microsoft.AspNetCore.Components.Authorization; using Microsoft.AspNetCore.Components.Authorization;
using TrueCV.Application.Interfaces; using RealCV.Application.Interfaces;
namespace TrueCV.Infrastructure.Services; namespace RealCV.Infrastructure.Services;
public sealed class UserContextService : IUserContextService public sealed class UserContextService : IUserContextService
{ {

View File

@@ -7,7 +7,7 @@
<base href="/" /> <base href="/" />
<link rel="stylesheet" href="bootstrap/bootstrap.min.css" /> <link rel="stylesheet" href="bootstrap/bootstrap.min.css" />
<link rel="stylesheet" href="app.css" /> <link rel="stylesheet" href="app.css" />
<link rel="stylesheet" href="TrueCV.Web.styles.css" /> <link rel="stylesheet" href="RealCV.Web.styles.css" />
<link rel="icon" type="image/png" href="favicon.png" /> <link rel="icon" type="image/png" href="favicon.png" />
<HeadOutlet @rendermode="InteractiveServer" /> <HeadOutlet @rendermode="InteractiveServer" />
</head> </head>

View File

@@ -4,7 +4,7 @@
<nav class="navbar navbar-expand-lg navbar-light shadow-sm" style="background-color: var(--truecv-bg-surface);"> <nav class="navbar navbar-expand-lg navbar-light shadow-sm" style="background-color: var(--truecv-bg-surface);">
<div class="container"> <div class="container">
<a class="navbar-brand fw-bold" href="/"> <a class="navbar-brand fw-bold" href="/">
<img src="images/TrueCV_Logo.png" alt="TrueCV" style="height: 95px;" /> <img src="images/RealCV_Logo.png" alt="RealCV" style="height: 95px;" />
</a> </a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation"> <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
@@ -79,7 +79,7 @@
<footer class="text-light py-4 mt-auto" style="background-color: var(--truecv-footer-bg);"> <footer class="text-light py-4 mt-auto" style="background-color: var(--truecv-footer-bg);">
<div class="container text-center"> <div class="container text-center">
<p class="mb-0">&copy; @DateTime.Now.Year TrueCV. All rights reserved.</p> <p class="mb-0">&copy; @DateTime.Now.Year RealCV. All rights reserved.</p>
</div> </div>
</footer> </footer>
</div> </div>

View File

@@ -1,14 +1,14 @@
@page "/account/login" @page "/account/login"
@using TrueCV.Web.Components.Layout @using RealCV.Web.Components.Layout
@layout MainLayout @layout MainLayout
@using Microsoft.AspNetCore.Identity @using Microsoft.AspNetCore.Identity
@using TrueCV.Infrastructure.Identity @using RealCV.Infrastructure.Identity
@inject SignInManager<ApplicationUser> SignInManager @inject SignInManager<ApplicationUser> SignInManager
@inject NavigationManager NavigationManager @inject NavigationManager NavigationManager
<PageTitle>Login - TrueCV</PageTitle> <PageTitle>Login - RealCV</PageTitle>
<div class="auth-container"> <div class="auth-container">
<!-- Left side - Form --> <!-- Left side - Form -->
@@ -16,7 +16,7 @@
<div class="auth-form-wrapper"> <div class="auth-form-wrapper">
<div class="text-center mb-4"> <div class="text-center mb-4">
<a href="/"> <a href="/">
<img src="images/TrueCV_Logo.png" alt="TrueCV" class="auth-logo" /> <img src="images/RealCV_Logo.png" alt="RealCV" class="auth-logo" />
</a> </a>
</div> </div>
@@ -80,7 +80,7 @@
</form> </form>
<div class="auth-divider"> <div class="auth-divider">
<span>New to TrueCV?</span> <span>New to RealCV?</span>
</div> </div>
<div class="text-center"> <div class="text-center">
@@ -123,7 +123,7 @@
<div class="auth-testimonial"> <div class="auth-testimonial">
<blockquote> <blockquote>
"TrueCV has transformed our hiring process. We catch discrepancies we would have missed before." "RealCV has transformed our hiring process. We catch discrepancies we would have missed before."
</blockquote> </blockquote>
<cite>- HR Director, Tech Company</cite> <cite>- HR Director, Tech Company</cite>
</div> </div>

View File

@@ -1,16 +1,16 @@
@page "/account/register" @page "/account/register"
@using TrueCV.Web.Components.Layout @using RealCV.Web.Components.Layout
@layout MainLayout @layout MainLayout
@rendermode InteractiveServer @rendermode InteractiveServer
@using Microsoft.AspNetCore.Identity @using Microsoft.AspNetCore.Identity
@using TrueCV.Infrastructure.Identity @using RealCV.Infrastructure.Identity
@inject UserManager<ApplicationUser> UserManager @inject UserManager<ApplicationUser> UserManager
@inject SignInManager<ApplicationUser> SignInManager @inject SignInManager<ApplicationUser> SignInManager
@inject NavigationManager NavigationManager @inject NavigationManager NavigationManager
<PageTitle>Register - TrueCV</PageTitle> <PageTitle>Register - RealCV</PageTitle>
<div class="auth-container"> <div class="auth-container">
<!-- Left side - Form --> <!-- Left side - Form -->
@@ -18,7 +18,7 @@
<div class="auth-form-wrapper"> <div class="auth-form-wrapper">
<div class="text-center mb-4"> <div class="text-center mb-4">
<a href="/"> <a href="/">
<img src="images/TrueCV_Logo.png" alt="TrueCV" class="auth-logo" /> <img src="images/RealCV_Logo.png" alt="RealCV" class="auth-logo" />
</a> </a>
</div> </div>
@@ -157,7 +157,7 @@
<div class="auth-testimonial"> <div class="auth-testimonial">
<blockquote> <blockquote>
"We reduced bad hires by 40% in the first quarter using TrueCV." "We reduced bad hires by 40% in the first quarter using RealCV."
</blockquote> </blockquote>
<cite>- Recruitment Manager, Financial Services</cite> <cite>- Recruitment Manager, Financial Services</cite>
</div> </div>

View File

@@ -7,7 +7,7 @@
@inject AuthenticationStateProvider AuthenticationStateProvider @inject AuthenticationStateProvider AuthenticationStateProvider
@inject ILogger<Check> Logger @inject ILogger<Check> Logger
<PageTitle>Upload CVs - TrueCV</PageTitle> <PageTitle>Upload CVs - RealCV</PageTitle>
<div class="container py-5"> <div class="container py-5">
<div class="row justify-content-center"> <div class="row justify-content-center">
@@ -66,7 +66,7 @@
@ondrop:preventDefault> @ondrop:preventDefault>
<InputFile OnChange="HandleFileSelected" <InputFile OnChange="HandleFileSelected"
accept=".pdf,.docx" accept=".pdf,.docx,.json"
multiple multiple
class="d-none" class="d-none"
id="fileInput" /> id="fileInput" />
@@ -112,19 +112,10 @@
{ {
<div class="file-list-item"> <div class="file-list-item">
<div class="d-flex align-items-center"> <div class="d-flex align-items-center">
<div class="file-type-icon me-3 @(file.Name.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase) ? "pdf" : "docx")"> <div class="file-type-icon me-3 @GetFileTypeClass(file.Name)">
@if (file.Name.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase)) <svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" fill="currentColor" viewBox="0 0 16 16">
{ <path d="M14 14V4.5L9.5 0H4a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h8a2 2 0 0 0 2-2zM9.5 3A1.5 1.5 0 0 0 11 4.5h2V14a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1V2a1 1 0 0 1 1-1h5.5v2z"/>
<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" fill="currentColor" viewBox="0 0 16 16"> </svg>
<path d="M14 14V4.5L9.5 0H4a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h8a2 2 0 0 0 2-2zM9.5 3A1.5 1.5 0 0 0 11 4.5h2V14a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1V2a1 1 0 0 1 1-1h5.5v2z"/>
</svg>
}
else
{
<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" fill="currentColor" viewBox="0 0 16 16">
<path d="M14 14V4.5L9.5 0H4a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h8a2 2 0 0 0 2-2zM9.5 3A1.5 1.5 0 0 0 11 4.5h2V14a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1V2a1 1 0 0 1 1-1h5.5v2z"/>
</svg>
}
</div> </div>
<div class="flex-grow-1"> <div class="flex-grow-1">
<p class="mb-0 fw-medium">@file.Name</p> <p class="mb-0 fw-medium">@file.Name</p>
@@ -264,6 +255,11 @@
color: var(--truecv-primary); color: var(--truecv-primary);
} }
.file-type-icon.json {
background: linear-gradient(135deg, #fef9c3 0%, #fef08a 100%);
color: #ca8a04;
}
.security-info { .security-info {
padding: 1rem 0; padding: 1rem 0;
} }
@@ -515,6 +511,7 @@
{ {
".pdf" => header.AsSpan().StartsWith(PdfMagicBytes), ".pdf" => header.AsSpan().StartsWith(PdfMagicBytes),
".docx" => header.AsSpan().StartsWith(DocxMagicBytes), ".docx" => header.AsSpan().StartsWith(DocxMagicBytes),
".json" => header[0] == '{' || header[0] == '[',
_ => false _ => false
}; };
} }
@@ -522,7 +519,7 @@
private bool IsValidFileType(string fileName) private bool IsValidFileType(string fileName)
{ {
var extension = Path.GetExtension(fileName).ToLowerInvariant(); var extension = Path.GetExtension(fileName).ToLowerInvariant();
return extension is ".pdf" or ".docx"; return extension is ".pdf" or ".docx" or ".json";
} }
private static string FormatFileSize(long bytes) private static string FormatFileSize(long bytes)
@@ -539,4 +536,16 @@
return $"{size:0.##} {sizes[order]}"; return $"{size:0.##} {sizes[order]}";
} }
private static string GetFileTypeClass(string fileName)
{
var ext = Path.GetExtension(fileName).ToLowerInvariant();
return ext switch
{
".pdf" => "pdf",
".docx" => "docx",
".json" => "json",
_ => "docx"
};
}
} }

View File

@@ -8,10 +8,10 @@
@inject AuthenticationStateProvider AuthenticationStateProvider @inject AuthenticationStateProvider AuthenticationStateProvider
@inject ILogger<Dashboard> Logger @inject ILogger<Dashboard> Logger
@inject IJSRuntime JSRuntime @inject IJSRuntime JSRuntime
@inject TrueCV.Web.Services.IPdfReportService PdfReportService @inject RealCV.Web.Services.IPdfReportService PdfReportService
@inject IAuditService AuditService @inject IAuditService AuditService
<PageTitle>Dashboard - TrueCV</PageTitle> <PageTitle>Dashboard - RealCV</PageTitle>
<div class="container py-5"> <div class="container py-5">
<div class="d-flex justify-content-between align-items-center mb-4"> <div class="d-flex justify-content-between align-items-center mb-4">
@@ -633,7 +633,7 @@
try try
{ {
var reportDataList = new List<TrueCV.Web.Services.PdfReportData>(); var reportDataList = new List<RealCV.Web.Services.PdfReportData>();
foreach (var check in _checks) foreach (var check in _checks)
{ {
if (check.Status != "Completed") continue; if (check.Status != "Completed") continue;
@@ -657,7 +657,7 @@
else if (f.Severity == "Warning") warningFlags++; else if (f.Severity == "Warning") warningFlags++;
} }
reportDataList.Add(new TrueCV.Web.Services.PdfReportData reportDataList.Add(new RealCV.Web.Services.PdfReportData
{ {
CandidateName = Path.GetFileNameWithoutExtension(check.OriginalFileName) ?? "Unknown", CandidateName = Path.GetFileNameWithoutExtension(check.OriginalFileName) ?? "Unknown",
UploadDate = check.CreatedAt, UploadDate = check.CreatedAt,
@@ -674,7 +674,7 @@
var pdfBytes = PdfReportService.GenerateReport(reportDataList); var pdfBytes = PdfReportService.GenerateReport(reportDataList);
var base64 = Convert.ToBase64String(pdfBytes); var base64 = Convert.ToBase64String(pdfBytes);
var fileName = "TrueCV_Report_" + DateTime.Now.ToString("yyyyMMdd_HHmmss") + ".pdf"; var fileName = "RealCV_Report_" + DateTime.Now.ToString("yyyyMMdd_HHmmss") + ".pdf";
await JSRuntime.InvokeVoidAsync("downloadFile", fileName, base64, "application/pdf"); await JSRuntime.InvokeVoidAsync("downloadFile", fileName, base64, "application/pdf");
await AuditService.LogAsync(_userId, AuditActions.ReportExported, null, null, $"Exported {reportDataList.Count} reports to PDF"); await AuditService.LogAsync(_userId, AuditActions.ReportExported, null, null, $"Exported {reportDataList.Count} reports to PDF");

View File

@@ -1,6 +1,6 @@
@page "/" @page "/"
<PageTitle>TrueCV - Verify CVs with Confidence</PageTitle> <PageTitle>RealCV - Verify CVs with Confidence</PageTitle>
<!-- Hero Section with Gradient --> <!-- Hero Section with Gradient -->
<section class="hero-section text-white py-5"> <section class="hero-section text-white py-5">
@@ -12,7 +12,7 @@
<span style="color: #60A5FA; text-shadow: 0 2px 8px rgba(0,0,0,0.4);">Confidence</span> <span style="color: #60A5FA; text-shadow: 0 2px 8px rgba(0,0,0,0.4);">Confidence</span>
</h1> </h1>
<p class="lead mb-3 opacity-90" style="font-size: 1.25rem; line-height: 1.7;"> <p class="lead mb-3 opacity-90" style="font-size: 1.25rem; line-height: 1.7;">
TrueCV uses AI-powered analysis and official company records to verify employment history, RealCV uses AI-powered analysis and official company records to verify employment history,
detect timeline inconsistencies, and flag potential issues in candidate CVs. detect timeline inconsistencies, and flag potential issues in candidate CVs.
</p> </p>
<p class="mb-4 d-inline-flex align-items-center px-3 py-2 rounded-pill" style="font-size: 0.85rem; background: rgba(255,255,255,0.15); border: 1px solid rgba(255,255,255,0.25);"> <p class="mb-4 d-inline-flex align-items-center px-3 py-2 rounded-pill" style="font-size: 0.85rem; background: rgba(255,255,255,0.15); border: 1px solid rgba(255,255,255,0.25);">
@@ -66,7 +66,7 @@
<section id="features" class="py-5" style="background-color: var(--truecv-bg-page);"> <section id="features" class="py-5" style="background-color: var(--truecv-bg-page);">
<div class="container"> <div class="container">
<div class="text-center mb-5"> <div class="text-center mb-5">
<h2 class="fw-bold mb-3" style="font-size: 2.25rem;">How TrueCV Works</h2> <h2 class="fw-bold mb-3" style="font-size: 2.25rem;">How RealCV Works</h2>
<p class="text-muted" style="font-size: 1.125rem;">Comprehensive CV verification in three key areas</p> <p class="text-muted" style="font-size: 1.125rem;">Comprehensive CV verification in three key areas</p>
</div> </div>

View File

@@ -11,7 +11,7 @@
@inject IAuditService AuditService @inject IAuditService AuditService
@inject IPdfReportService PdfReportService @inject IPdfReportService PdfReportService
<PageTitle>Verification Report - TrueCV</PageTitle> <PageTitle>Verification Report - RealCV</PageTitle>
<div class="container py-5"> <div class="container py-5">
@if (_isLoading) @if (_isLoading)
@@ -153,7 +153,7 @@
<span class="score-max">/100</span> <span class="score-max">/100</span>
</div> </div>
</div> </div>
<div class="mt-2 text-white truecv-score-label">TrueCV Score</div> <div class="mt-2 text-white truecv-score-label">RealCV Score</div>
</div> </div>
<div class="col-md-8"> <div class="col-md-8">
<div class="row g-4 text-center text-md-start"> <div class="row g-4 text-center text-md-start">
@@ -920,7 +920,7 @@
var candidateName = Path.GetFileNameWithoutExtension(_check.OriginalFileName); var candidateName = Path.GetFileNameWithoutExtension(_check.OriginalFileName);
var pdfBytes = PdfReportService.GenerateSingleReport(candidateName, _report); var pdfBytes = PdfReportService.GenerateSingleReport(candidateName, _report);
var fileName = $"TrueCV_Report_{candidateName}_{DateTime.Now:yyyyMMdd}.pdf"; var fileName = $"RealCV_Report_{candidateName}_{DateTime.Now:yyyyMMdd}.pdf";
await DownloadFileAsync(fileName, pdfBytes, "application/pdf"); await DownloadFileAsync(fileName, pdfBytes, "application/pdf");
} }
catch (Exception ex) catch (Exception ex)

View File

@@ -11,11 +11,11 @@
@using Microsoft.AspNetCore.Components.Web.Virtualization @using Microsoft.AspNetCore.Components.Web.Virtualization
@using Microsoft.Extensions.Logging @using Microsoft.Extensions.Logging
@using Microsoft.JSInterop @using Microsoft.JSInterop
@using TrueCV.Web @using RealCV.Web
@using TrueCV.Web.Components @using RealCV.Web.Components
@using TrueCV.Web.Components.Shared @using RealCV.Web.Components.Shared
@using TrueCV.Web.Services @using RealCV.Web.Services
@using TrueCV.Application.Interfaces @using RealCV.Application.Interfaces
@using TrueCV.Application.DTOs @using RealCV.Application.DTOs
@using TrueCV.Application.Models @using RealCV.Application.Models
@using TrueCV.Domain.Enums @using RealCV.Domain.Enums

View File

@@ -1,6 +1,6 @@
using Hangfire.Dashboard; using Hangfire.Dashboard;
namespace TrueCV.Web; namespace RealCV.Web;
public class HangfireAuthorizationFilter : IDashboardAuthorizationFilter public class HangfireAuthorizationFilter : IDashboardAuthorizationFilter
{ {

View File

@@ -5,12 +5,12 @@ using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.RateLimiting; using Microsoft.AspNetCore.RateLimiting;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Serilog; using Serilog;
using TrueCV.Infrastructure; using RealCV.Infrastructure;
using TrueCV.Infrastructure.Data; using RealCV.Infrastructure.Data;
using TrueCV.Infrastructure.Identity; using RealCV.Infrastructure.Identity;
using TrueCV.Web; using RealCV.Web;
using TrueCV.Web.Components; using RealCV.Web.Components;
using TrueCV.Web.Services; using RealCV.Web.Services;
// Configure Serilog // Configure Serilog
Log.Logger = new LoggerConfiguration() Log.Logger = new LoggerConfiguration()
@@ -19,7 +19,7 @@ Log.Logger = new LoggerConfiguration()
try try
{ {
Log.Information("Starting TrueCV web application"); Log.Information("Starting RealCV web application");
var builder = WebApplication.CreateBuilder(args); var builder = WebApplication.CreateBuilder(args);

View File

@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk.Web"> <Project Sdk="Microsoft.NET.Sdk.Web">
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\TrueCV.Infrastructure\TrueCV.Infrastructure.csproj" /> <ProjectReference Include="..\RealCV.Infrastructure\RealCV.Infrastructure.csproj" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

View File

@@ -4,7 +4,7 @@ using Microsoft.AspNetCore.Components.Server;
using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Identity;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
namespace TrueCV.Web; namespace RealCV.Web;
public class RevalidatingIdentityAuthenticationStateProvider<TUser> public class RevalidatingIdentityAuthenticationStateProvider<TUser>
: RevalidatingServerAuthenticationStateProvider where TUser : class : RevalidatingServerAuthenticationStateProvider where TUser : class

View File

@@ -1,6 +1,6 @@
using TrueCV.Application.Models; using RealCV.Application.Models;
namespace TrueCV.Web.Services; namespace RealCV.Web.Services;
public interface IPdfReportService public interface IPdfReportService
{ {

View File

@@ -1,10 +1,10 @@
using QuestPDF.Fluent; using QuestPDF.Fluent;
using QuestPDF.Helpers; using QuestPDF.Helpers;
using QuestPDF.Infrastructure; using QuestPDF.Infrastructure;
using TrueCV.Application.Helpers; using RealCV.Application.Helpers;
using TrueCV.Application.Models; using RealCV.Application.Models;
namespace TrueCV.Web.Services; namespace RealCV.Web.Services;
public class PdfReportService : IPdfReportService public class PdfReportService : IPdfReportService
{ {
@@ -43,7 +43,7 @@ public class PdfReportService : IPdfReportService
{ {
row.RelativeItem().Column(col => row.RelativeItem().Column(col =>
{ {
col.Item().Text("TrueCV").Bold().FontSize(24).FontColor(Colors.Blue.Darken2); col.Item().Text("RealCV").Bold().FontSize(24).FontColor(Colors.Blue.Darken2);
col.Item().Text("CV Verification Report").FontSize(14).FontColor(Colors.Grey.Darken1); col.Item().Text("CV Verification Report").FontSize(14).FontColor(Colors.Grey.Darken1);
}); });
row.ConstantItem(100).AlignRight().Column(col => row.ConstantItem(100).AlignRight().Column(col =>
@@ -62,7 +62,7 @@ public class PdfReportService : IPdfReportService
row.ConstantItem(120).Border(2).BorderColor(scoreColor).Padding(10).AlignCenter().Column(col => row.ConstantItem(120).Border(2).BorderColor(scoreColor).Padding(10).AlignCenter().Column(col =>
{ {
col.Item().AlignCenter().Text(report.OverallScore.ToString()).Bold().FontSize(28).FontColor(scoreColor); col.Item().AlignCenter().Text(report.OverallScore.ToString()).Bold().FontSize(28).FontColor(scoreColor);
col.Item().AlignCenter().Text("TrueCV Score").FontSize(10).FontColor(scoreColor); col.Item().AlignCenter().Text("RealCV Score").FontSize(10).FontColor(scoreColor);
}); });
}); });
@@ -239,7 +239,7 @@ public class PdfReportService : IPdfReportService
{ {
row.RelativeItem().Column(col => row.RelativeItem().Column(col =>
{ {
col.Item().Text("TrueCV").Bold().FontSize(24).FontColor(Colors.Blue.Darken2); col.Item().Text("RealCV").Bold().FontSize(24).FontColor(Colors.Blue.Darken2);
col.Item().Text("CV Verification Report Summary").FontSize(14).FontColor(Colors.Grey.Darken1); col.Item().Text("CV Verification Report Summary").FontSize(14).FontColor(Colors.Grey.Darken1);
}); });
row.ConstantItem(100).AlignRight().Text(DateTime.Now.ToString("dd MMM yyyy")).FontSize(10).FontColor(Colors.Grey.Medium); row.ConstantItem(100).AlignRight().Text(DateTime.Now.ToString("dd MMM yyyy")).FontSize(10).FontColor(Colors.Grey.Medium);
@@ -306,7 +306,7 @@ public class PdfReportService : IPdfReportService
column.Item().LineHorizontal(1).LineColor(Colors.Grey.Lighten2); column.Item().LineHorizontal(1).LineColor(Colors.Grey.Lighten2);
column.Item().PaddingTop(10).Row(row => column.Item().PaddingTop(10).Row(row =>
{ {
row.RelativeItem().Text("Generated by TrueCV - CV Verification Platform").FontSize(8).FontColor(Colors.Grey.Medium); row.RelativeItem().Text("Generated by RealCV - CV Verification Platform").FontSize(8).FontColor(Colors.Grey.Medium);
row.RelativeItem().AlignRight().Text(x => row.RelativeItem().AlignRight().Text(x =>
{ {
x.Span("Page ").FontSize(8).FontColor(Colors.Grey.Medium); x.Span("Page ").FontSize(8).FontColor(Colors.Grey.Medium);

View File

@@ -0,0 +1,10 @@
{
"ConnectionStrings": {
"DefaultConnection": "Server=127.0.0.1;Database=RealCV;User Id=SA;Password=TrueCV_Sql2024!;TrustServerCertificate=True;",
"HangfireConnection": "Server=127.0.0.1;Database=RealCV_Hangfire;User Id=SA;Password=TrueCV_Sql2024!;TrustServerCertificate=True;"
},
"UseLocalStorage": true,
"LocalStorage": {
"StoragePath": "/var/www/realcv/uploads"
}
}

View File

@@ -1,7 +1,7 @@
{ {
"ConnectionStrings": { "ConnectionStrings": {
"DefaultConnection": "Server=.;Database=TrueCV;Trusted_Connection=True;TrustServerCertificate=True;", "DefaultConnection": "Server=.;Database=RealCV;Trusted_Connection=True;TrustServerCertificate=True;",
"HangfireConnection": "Server=.;Database=TrueCV_Hangfire;Trusted_Connection=True;TrustServerCertificate=True;" "HangfireConnection": "Server=.;Database=RealCV_Hangfire;Trusted_Connection=True;TrustServerCertificate=True;"
}, },
"CompaniesHouse": { "CompaniesHouse": {
"BaseUrl": "https://api.company-information.service.gov.uk", "BaseUrl": "https://api.company-information.service.gov.uk",

View File

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

Before

Width:  |  Height:  |  Size: 89 KiB

After

Width:  |  Height:  |  Size: 89 KiB

Some files were not shown because too many files have changed in this diff Show More