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>
@@ -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
|
After Width: | Height: | Size: 1.3 MiB |
BIN
screenshots/login.png
Normal file
|
After Width: | Height: | Size: 449 KiB |
BIN
screenshots/pricing.png
Normal file
|
After Width: | Height: | Size: 144 KiB |
BIN
screenshots/privacy.png
Normal file
|
After Width: | Height: | Size: 289 KiB |
BIN
screenshots/register.png
Normal file
|
After Width: | Height: | Size: 468 KiB |
@@ -1,4 +1,4 @@
|
|||||||
namespace TrueCV.Application.DTOs;
|
namespace RealCV.Application.DTOs;
|
||||||
|
|
||||||
public sealed record CVCheckDto
|
public sealed record CVCheckDto
|
||||||
{
|
{
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
namespace TrueCV.Application.DTOs;
|
namespace RealCV.Application.DTOs;
|
||||||
|
|
||||||
public sealed record CompanySearchResult
|
public sealed record CompanySearchResult
|
||||||
{
|
{
|
||||||
@@ -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.
|
||||||
@@ -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.
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
namespace TrueCV.Application.Helpers;
|
namespace RealCV.Application.Helpers;
|
||||||
|
|
||||||
public static class DateHelpers
|
public static class DateHelpers
|
||||||
{
|
{
|
||||||
@@ -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
|
||||||
{
|
{
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
namespace TrueCV.Application.Helpers;
|
namespace RealCV.Application.Helpers;
|
||||||
|
|
||||||
public static class ScoreThresholds
|
public static class ScoreThresholds
|
||||||
{
|
{
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
namespace TrueCV.Application.Interfaces;
|
namespace RealCV.Application.Interfaces;
|
||||||
|
|
||||||
public interface IAuditService
|
public interface IAuditService
|
||||||
{
|
{
|
||||||
@@ -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
|
||||||
{
|
{
|
||||||
@@ -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
|
||||||
{
|
{
|
||||||
@@ -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
|
||||||
{
|
{
|
||||||
@@ -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
|
||||||
{
|
{
|
||||||
@@ -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
|
||||||
{
|
{
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
namespace TrueCV.Application.Interfaces;
|
namespace RealCV.Application.Interfaces;
|
||||||
|
|
||||||
public interface IFileStorageService
|
public interface IFileStorageService
|
||||||
{
|
{
|
||||||
@@ -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
|
||||||
{
|
{
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
namespace TrueCV.Application.Interfaces;
|
namespace RealCV.Application.Interfaces;
|
||||||
|
|
||||||
public interface IUserContextService
|
public interface IUserContextService
|
||||||
{
|
{
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
namespace TrueCV.Application.Models;
|
namespace RealCV.Application.Models;
|
||||||
|
|
||||||
public sealed record CVData
|
public sealed record CVData
|
||||||
{
|
{
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
namespace TrueCV.Application.Models;
|
namespace RealCV.Application.Models;
|
||||||
|
|
||||||
public sealed record CompanyVerificationResult
|
public sealed record CompanyVerificationResult
|
||||||
{
|
{
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
namespace TrueCV.Application.Models;
|
namespace RealCV.Application.Models;
|
||||||
|
|
||||||
public sealed record EducationEntry
|
public sealed record EducationEntry
|
||||||
{
|
{
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
namespace TrueCV.Application.Models;
|
namespace RealCV.Application.Models;
|
||||||
|
|
||||||
public sealed record EducationVerificationResult
|
public sealed record EducationVerificationResult
|
||||||
{
|
{
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
namespace TrueCV.Application.Models;
|
namespace RealCV.Application.Models;
|
||||||
|
|
||||||
public sealed record EmploymentEntry
|
public sealed record EmploymentEntry
|
||||||
{
|
{
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
namespace TrueCV.Application.Models;
|
namespace RealCV.Application.Models;
|
||||||
|
|
||||||
public sealed record FlagResult
|
public sealed record FlagResult
|
||||||
{
|
{
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
namespace TrueCV.Application.Models;
|
namespace RealCV.Application.Models;
|
||||||
|
|
||||||
public record SemanticMatchResult
|
public record SemanticMatchResult
|
||||||
{
|
{
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
namespace TrueCV.Application.Models;
|
namespace RealCV.Application.Models;
|
||||||
|
|
||||||
public sealed record TimelineAnalysisResult
|
public sealed record TimelineAnalysisResult
|
||||||
{
|
{
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
namespace TrueCV.Application.Models;
|
namespace RealCV.Application.Models;
|
||||||
|
|
||||||
public sealed record TimelineGap
|
public sealed record TimelineGap
|
||||||
{
|
{
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
namespace TrueCV.Application.Models;
|
namespace RealCV.Application.Models;
|
||||||
|
|
||||||
public sealed record TimelineOverlap
|
public sealed record TimelineOverlap
|
||||||
{
|
{
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
namespace TrueCV.Application.Models;
|
namespace RealCV.Application.Models;
|
||||||
|
|
||||||
public sealed record VeracityReport
|
public sealed record VeracityReport
|
||||||
{
|
{
|
||||||
@@ -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>
|
||||||
@@ -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
|
||||||
{
|
{
|
||||||
@@ -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
|
||||||
{
|
{
|
||||||
@@ -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
|
||||||
{
|
{
|
||||||
@@ -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
|
||||||
{
|
{
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
namespace TrueCV.Domain.Enums;
|
namespace RealCV.Domain.Enums;
|
||||||
|
|
||||||
public enum CheckStatus
|
public enum CheckStatus
|
||||||
{
|
{
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
namespace TrueCV.Domain.Enums;
|
namespace RealCV.Domain.Enums;
|
||||||
|
|
||||||
public enum FlagCategory
|
public enum FlagCategory
|
||||||
{
|
{
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
namespace TrueCV.Domain.Enums;
|
namespace RealCV.Domain.Enums;
|
||||||
|
|
||||||
public enum FlagSeverity
|
public enum FlagSeverity
|
||||||
{
|
{
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
namespace TrueCV.Domain.Enums;
|
namespace RealCV.Domain.Enums;
|
||||||
|
|
||||||
public enum UserPlan
|
public enum UserPlan
|
||||||
{
|
{
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
namespace TrueCV.Infrastructure.Configuration;
|
namespace RealCV.Infrastructure.Configuration;
|
||||||
|
|
||||||
public sealed class AnthropicSettings
|
public sealed class AnthropicSettings
|
||||||
{
|
{
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
namespace TrueCV.Infrastructure.Configuration;
|
namespace RealCV.Infrastructure.Configuration;
|
||||||
|
|
||||||
public sealed class AzureBlobSettings
|
public sealed class AzureBlobSettings
|
||||||
{
|
{
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
namespace TrueCV.Infrastructure.Configuration;
|
namespace RealCV.Infrastructure.Configuration;
|
||||||
|
|
||||||
public sealed class CompaniesHouseSettings
|
public sealed class CompaniesHouseSettings
|
||||||
{
|
{
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
namespace TrueCV.Infrastructure.Configuration;
|
namespace RealCV.Infrastructure.Configuration;
|
||||||
|
|
||||||
public sealed class LocalStorageSettings
|
public sealed class LocalStorageSettings
|
||||||
{
|
{
|
||||||
@@ -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>
|
||||||
{
|
{
|
||||||
@@ -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");
|
||||||
});
|
});
|
||||||
@@ -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
|
||||||
@@ -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");
|
||||||
});
|
});
|
||||||
@@ -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
|
||||||
@@ -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");
|
||||||
});
|
});
|
||||||
@@ -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
|
||||||
@@ -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");
|
||||||
});
|
});
|
||||||
@@ -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
|
||||||
{
|
{
|
||||||
@@ -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
|
||||||
{
|
{
|
||||||
@@ -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.
|
||||||
@@ -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>
|
||||||
{
|
{
|
||||||
@@ -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
|
||||||
{
|
{
|
||||||
@@ -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>
|
||||||
@@ -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
|
||||||
{
|
{
|
||||||
@@ -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
|
||||||
{
|
{
|
||||||
@@ -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
|
||||||
{
|
{
|
||||||
@@ -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
|
||||||
{
|
{
|
||||||
@@ -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
|
||||||
{
|
{
|
||||||
@@ -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
|
||||||
{
|
{
|
||||||
@@ -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
|
||||||
{
|
{
|
||||||
@@ -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
|
||||||
{
|
{
|
||||||
@@ -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
|
||||||
{
|
{
|
||||||
@@ -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
|
||||||
{
|
{
|
||||||
@@ -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>
|
||||||
@@ -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">© @DateTime.Now.Year TrueCV. All rights reserved.</p>
|
<p class="mb-0">© @DateTime.Now.Year RealCV. All rights reserved.</p>
|
||||||
</div>
|
</div>
|
||||||
</footer>
|
</footer>
|
||||||
</div>
|
</div>
|
||||||
@@ -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>
|
||||||
@@ -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>
|
||||||
@@ -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"
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -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");
|
||||||
@@ -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>
|
||||||
|
|
||||||
@@ -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)
|
||||||
@@ -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
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
using Hangfire.Dashboard;
|
using Hangfire.Dashboard;
|
||||||
|
|
||||||
namespace TrueCV.Web;
|
namespace RealCV.Web;
|
||||||
|
|
||||||
public class HangfireAuthorizationFilter : IDashboardAuthorizationFilter
|
public class HangfireAuthorizationFilter : IDashboardAuthorizationFilter
|
||||||
{
|
{
|
||||||
@@ -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);
|
||||||
|
|
||||||
@@ -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>
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
{
|
{
|
||||||
@@ -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);
|
||||||
10
src/RealCV.Web/appsettings.Production.json
Normal 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"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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",
|
||||||
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 89 KiB After Width: | Height: | Size: 89 KiB |