Rename project to RealCV with new logo and font updates

- Rename all TrueCV references to RealCV across the codebase
- Add new transparent RealCV logo
- Switch from JetBrains Mono to Inter font for better number clarity
- Update solution, project files, and namespaces

🤖 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-21 15:07:20 +00:00
parent 28d7d41b25
commit 998e9a8ab8
134 changed files with 1182 additions and 702 deletions

447
DEPLOYMENT-GUIDE.md Normal file
View File

@@ -0,0 +1,447 @@
# TrueCV Production Deployment Guide
A low-budget guide to launching TrueCV as a professional, secure offering.
---
## Budget Summary
| Component | Monthly Cost | Notes |
|-----------|-------------|-------|
| Azure App Service (B1) | ~£10 | 1.75GB RAM, custom domain, SSL |
| Azure SQL (Basic) | ~£4 | 2GB, 5 DTUs - upgrade as needed |
| Azure Blob Storage | ~£1 | Pay per GB stored |
| Domain name | ~£10/year | .com or .co.uk |
| **Total** | **~£15-20/month** | Scales with usage |
Alternative: A single £5-10/month VPS (Hetzner, DigitalOcean) can run everything if you're comfortable with Linux administration.
---
## Phase 1: Pre-Launch Checklist
### 1.1 Stripe Setup (Required for Payments)
1. Create a Stripe account at [stripe.com](https://stripe.com)
2. Complete business verification (required for live payments)
3. Create two Products in Stripe Dashboard:
- **Professional**: £49/month recurring
- **Enterprise**: £199/month recurring
4. Copy the Price IDs (start with `price_`) to your config
5. Configure the Customer Portal:
- Dashboard → Settings → Billing → Customer Portal
- Enable: Update payment methods, Cancel subscriptions, View invoices
6. Set up webhook endpoint (after deployment):
- Dashboard → Developers → Webhooks → Add endpoint
- URL: `https://yourdomain.com/api/stripe/webhook`
- Events: `checkout.session.completed`, `customer.subscription.updated`, `customer.subscription.deleted`, `invoice.payment_failed`
7. Copy the webhook signing secret to your config
### 1.2 External API Keys
| Service | Purpose | How to Get |
|---------|---------|-----------|
| Companies House | Company verification | [developer.company-information.service.gov.uk](https://developer.company-information.service.gov.uk) - Free |
| Anthropic (Claude) | CV parsing & analysis | [console.anthropic.com](https://console.anthropic.com) - Pay per use |
### 1.3 Domain & Email
1. Register a domain (Cloudflare, Namecheap, or similar)
2. Set up a professional email:
- Budget option: Zoho Mail free tier (5 users)
- Better option: Google Workspace (£5/user/month)
3. Configure SPF, DKIM, DMARC records for email deliverability
---
## Phase 2: Infrastructure Setup
### Option A: Azure (Recommended for .NET)
#### App Service + Azure SQL
```bash
# Install Azure CLI, then:
az login
# Create resource group
az group create --name truecv-prod --location uksouth
# Create App Service plan (B1 = ~£10/month)
az appservice plan create \
--name truecv-plan \
--resource-group truecv-prod \
--sku B1 \
--is-linux
# Create web app
az webapp create \
--name truecv-app \
--resource-group truecv-prod \
--plan truecv-plan \
--runtime "DOTNETCORE:8.0"
# Create SQL Server
az sql server create \
--name truecv-sql \
--resource-group truecv-prod \
--location uksouth \
--admin-user truecvadmin \
--admin-password <STRONG_PASSWORD>
# Create database (Basic = ~£4/month)
az sql db create \
--name truecv-db \
--server truecv-sql \
--resource-group truecv-prod \
--service-objective Basic
# Create storage account for CV files
az storage account create \
--name truecvstorage \
--resource-group truecv-prod \
--location uksouth \
--sku Standard_LRS
```
#### Environment Variables (App Service Configuration)
Set these in Azure Portal → App Service → Configuration → Application settings:
```
ConnectionStrings__DefaultConnection=Server=truecv-sql.database.windows.net;Database=truecv-db;User Id=truecvadmin;Password=<PASSWORD>;Encrypt=True;
ConnectionStrings__HangfireConnection=<SAME_AS_ABOVE>
Stripe__SecretKey=sk_live_xxx
Stripe__PublishableKey=pk_live_xxx
Stripe__WebhookSecret=whsec_xxx
Stripe__PriceIds__Professional=price_xxx
Stripe__PriceIds__Enterprise=price_xxx
Anthropic__ApiKey=sk-ant-xxx
CompaniesHouse__ApiKey=xxx
AzureBlob__ConnectionString=<FROM_STORAGE_ACCOUNT>
AzureBlob__ContainerName=cvfiles
```
### Option B: VPS (Budget Alternative)
A £5-10/month VPS from Hetzner, DigitalOcean, or Vultr can run everything:
1. Ubuntu 22.04 LTS
2. Install Docker and Docker Compose
3. Use the existing `docker-compose.yml` with modifications:
```yaml
# docker-compose.prod.yml
version: '3.8'
services:
web:
build: .
ports:
- "5000:8080"
environment:
- ASPNETCORE_ENVIRONMENT=Production
- ConnectionStrings__DefaultConnection=Server=db;Database=TrueCV;User Id=sa;Password=${DB_PASSWORD};TrustServerCertificate=True
depends_on:
- db
restart: always
db:
image: mcr.microsoft.com/mssql/server:2022-latest
environment:
- ACCEPT_EULA=Y
- SA_PASSWORD=${DB_PASSWORD}
volumes:
- sqldata:/var/opt/mssql
restart: always
caddy: # Reverse proxy with automatic HTTPS
image: caddy:2
ports:
- "80:80"
- "443:443"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile
- caddy_data:/data
restart: always
volumes:
sqldata:
caddy_data:
```
```
# Caddyfile
yourdomain.com {
reverse_proxy web:5000
}
```
---
## Phase 3: Security Hardening
### 3.1 Application Security (Critical)
#### Secrets Management
- **Never** commit secrets to git
- Use Azure Key Vault or environment variables
- Rotate API keys quarterly
#### HTTPS Enforcement
Already configured in `Program.cs`:
```csharp
app.UseHsts();
app.UseHttpsRedirection();
```
#### Content Security Policy
Add to `Program.cs`:
```csharp
app.Use(async (context, next) =>
{
context.Response.Headers.Append("X-Content-Type-Options", "nosniff");
context.Response.Headers.Append("X-Frame-Options", "DENY");
context.Response.Headers.Append("X-XSS-Protection", "1; mode=block");
context.Response.Headers.Append("Referrer-Policy", "strict-origin-when-cross-origin");
context.Response.Headers.Append("Permissions-Policy", "camera=(), microphone=(), geolocation=()");
await next();
});
```
#### Rate Limiting
Add to `Program.cs`:
```csharp
builder.Services.AddRateLimiter(options =>
{
options.GlobalLimiter = PartitionedRateLimiter.Create<HttpContext, string>(context =>
RateLimitPartition.GetFixedWindowLimiter(
partitionKey: context.User.Identity?.Name ?? context.Request.Headers.Host.ToString(),
factory: _ => new FixedWindowRateLimiterOptions
{
AutoReplenishment = true,
PermitLimit = 100,
Window = TimeSpan.FromMinutes(1)
}));
});
// In middleware pipeline
app.UseRateLimiter();
```
### 3.2 Database Security
1. **Use strong passwords** (20+ characters, random)
2. **Enable Azure SQL firewall** - allow only App Service IP
3. **Enable Transparent Data Encryption** (on by default in Azure)
4. **Regular backups** - Azure does this automatically (7-day retention on Basic tier)
### 3.3 File Storage Security
CV files contain sensitive data:
1. **Private container** - never allow public blob access
2. **SAS tokens** - generate time-limited URLs for downloads
3. **Encryption at rest** - enabled by default in Azure Storage
4. **Consider encryption at application level** for extra protection
### 3.4 Authentication Security
Already using ASP.NET Identity with good defaults. Verify these settings:
```csharp
// In Program.cs - identity configuration
builder.Services.Configure<IdentityOptions>(options =>
{
options.Password.RequiredLength = 12;
options.Password.RequireDigit = true;
options.Password.RequireLowercase = true;
options.Password.RequireUppercase = true;
options.Password.RequireNonAlphanumeric = true;
options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(15);
options.Lockout.MaxFailedAccessAttempts = 5;
});
```
### 3.5 Stripe Webhook Security
Already implemented - verify signature on every webhook:
```csharp
// In StripeService.cs - this is critical
stripeEvent = EventUtility.ConstructEvent(json, signature, _settings.WebhookSecret);
```
---
## Phase 4: Compliance & Legal
### 4.1 GDPR Compliance (Required for UK/EU)
1. **Privacy Policy** - create and link in footer
- What data you collect (CVs, email, payment info)
- How long you retain it
- User rights (access, deletion, portability)
- Third parties (Stripe, Anthropic, Companies House)
2. **Cookie Consent** - add banner for analytics cookies
3. **Data Retention Policy**:
- CVs: Delete after 30 days or on user request
- Accounts: Retain while active, delete 90 days after closure
- Payment data: Stripe handles this (PCI compliant)
4. **Right to Deletion** - implement account deletion feature
5. **Data Processing Agreement** - required if you have business customers
### 4.2 Terms of Service
Cover:
- Service description and limitations
- Acceptable use policy
- Payment terms and refund policy
- Liability limitations
- Dispute resolution
### 4.3 PCI Compliance
Stripe Checkout handles card data - you never touch it. This puts you in **PCI SAQ-A** (simplest level):
- Use only Stripe Checkout or Elements
- Serve pages over HTTPS
- Don't store card numbers
---
## Phase 5: Monitoring & Operations
### 5.1 Application Monitoring
#### Free Option: Application Insights (Azure)
```csharp
// In Program.cs
builder.Services.AddApplicationInsightsTelemetry();
```
#### Budget Option: Seq + Serilog
```csharp
// Already using Serilog - add Seq sink
Log.Logger = new LoggerConfiguration()
.WriteTo.Seq("http://localhost:5341") // Self-hosted Seq
.CreateLogger();
```
### 5.2 Uptime Monitoring
Free options:
- [UptimeRobot](https://uptimerobot.com) - 50 free monitors
- [Freshping](https://freshping.io) - 50 free monitors
Set up alerts for:
- Homepage availability
- API health endpoint
- Webhook endpoint
### 5.3 Error Tracking
Add a health check endpoint:
```csharp
// In Program.cs
app.MapGet("/health", () => Results.Ok(new { status = "healthy", timestamp = DateTime.UtcNow }));
```
### 5.4 Backup Strategy
| Component | Backup Method | Frequency |
|-----------|--------------|-----------|
| Database | Azure automated backups | Continuous (7-day retention) |
| CV files | Azure Blob redundancy (LRS) | Automatic |
| Config | Git repository | On change |
For VPS: Set up daily database dumps to offsite storage.
---
## Phase 6: Launch Checklist
### Pre-Launch (1 week before)
- [ ] All environment variables configured
- [ ] Database migrations applied
- [ ] Stripe products created and tested
- [ ] Webhook endpoint configured and tested
- [ ] SSL certificate active
- [ ] Privacy Policy and Terms published
- [ ] Test complete user journey (signup → payment → CV check)
- [ ] Test subscription cancellation flow
- [ ] Error pages customised (404, 500)
### Launch Day
- [ ] Switch Stripe to live mode (change API keys)
- [ ] Verify webhook is receiving live events
- [ ] Monitor error logs closely
- [ ] Test a real payment (refund yourself)
### Post-Launch (First Week)
- [ ] Monitor for errors daily
- [ ] Check Stripe dashboard for failed payments
- [ ] Respond to support queries within 24 hours
- [ ] Gather user feedback
---
## Phase 7: Scaling (When Needed)
Start small and scale based on actual usage:
| Trigger | Action | Cost Impact |
|---------|--------|-------------|
| Response time > 2s | Upgrade App Service to B2/B3 | +£10-30/month |
| Database DTU > 80% | Upgrade to Standard S0 | +£15/month |
| Storage > 5GB | Already pay-per-use | Minimal |
| > 1000 users | Add Redis for caching | +£15/month |
---
## Quick Reference: Configuration Files
### appsettings.Production.json
```json
{
"Logging": {
"LogLevel": {
"Default": "Warning",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "yourdomain.com;www.yourdomain.com"
}
```
Sensitive values should be in environment variables, not this file.
---
## Support & Resources
- [Azure App Service Docs](https://learn.microsoft.com/en-us/azure/app-service/)
- [Stripe Documentation](https://stripe.com/docs)
- [ASP.NET Core Security](https://learn.microsoft.com/en-us/aspnet/core/security/)
- [OWASP Top 10](https://owasp.org/www-project-top-ten/)
---
## Estimated Time to Launch
| Phase | Effort |
|-------|--------|
| Stripe setup | 1-2 hours |
| Infrastructure | 2-4 hours |
| Security hardening | 2-3 hours |
| Legal pages | 2-4 hours (use templates) |
| Testing | 2-4 hours |
| **Total** | **1-2 days** |
---
*Document version: 1.0 | Last updated: January 2026*

View File

@@ -3,11 +3,11 @@ FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
WORKDIR /src WORKDIR /src
# Copy solution and project files first for better layer caching # Copy solution and project files first for better layer caching
COPY TrueCV.sln ./ COPY RealCV.sln ./
COPY src/TrueCV.Domain/TrueCV.Domain.csproj src/TrueCV.Domain/ COPY src/RealCV.Domain/RealCV.Domain.csproj src/RealCV.Domain/
COPY src/TrueCV.Application/TrueCV.Application.csproj src/TrueCV.Application/ COPY src/RealCV.Application/RealCV.Application.csproj src/RealCV.Application/
COPY src/TrueCV.Infrastructure/TrueCV.Infrastructure.csproj src/TrueCV.Infrastructure/ COPY src/RealCV.Infrastructure/RealCV.Infrastructure.csproj src/RealCV.Infrastructure/
COPY src/TrueCV.Web/TrueCV.Web.csproj src/TrueCV.Web/ COPY src/RealCV.Web/RealCV.Web.csproj src/RealCV.Web/
# Restore dependencies # Restore dependencies
RUN dotnet restore RUN dotnet restore
@@ -16,7 +16,7 @@ RUN dotnet restore
COPY src/ src/ COPY src/ src/
# Build and publish # Build and publish
WORKDIR /src/src/TrueCV.Web WORKDIR /src/src/RealCV.Web
RUN dotnet publish -c Release -o /app/publish --no-restore RUN dotnet publish -c Release -o /app/publish --no-restore
# Runtime stage # Runtime stage
@@ -51,4 +51,4 @@ HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \
CMD curl -f http://localhost:8080/health || exit 1 CMD curl -f http://localhost:8080/health || exit 1
# Start the app # Start the app
ENTRYPOINT ["dotnet", "TrueCV.Web.dll"] ENTRYPOINT ["dotnet", "RealCV.Web.dll"]

View File

@@ -7,11 +7,11 @@ RUN dotnet tool install --global dotnet-ef
ENV PATH="$PATH:/root/.dotnet/tools" ENV PATH="$PATH:/root/.dotnet/tools"
# Copy solution and project files # Copy solution and project files
COPY TrueCV.sln ./ COPY RealCV.sln ./
COPY src/TrueCV.Domain/TrueCV.Domain.csproj src/TrueCV.Domain/ COPY src/RealCV.Domain/RealCV.Domain.csproj src/RealCV.Domain/
COPY src/TrueCV.Application/TrueCV.Application.csproj src/TrueCV.Application/ COPY src/RealCV.Application/RealCV.Application.csproj src/RealCV.Application/
COPY src/TrueCV.Infrastructure/TrueCV.Infrastructure.csproj src/TrueCV.Infrastructure/ COPY src/RealCV.Infrastructure/RealCV.Infrastructure.csproj src/RealCV.Infrastructure/
COPY src/TrueCV.Web/TrueCV.Web.csproj src/TrueCV.Web/ COPY src/RealCV.Web/RealCV.Web.csproj src/RealCV.Web/
# Restore dependencies # Restore dependencies
RUN dotnet restore RUN dotnet restore
@@ -20,7 +20,7 @@ RUN dotnet restore
COPY src/ src/ COPY src/ src/
# Build the project # Build the project
RUN dotnet build src/TrueCV.Web/TrueCV.Web.csproj -c Release RUN dotnet build src/RealCV.Web/RealCV.Web.csproj -c Release
# Run migrations on startup # Run migrations on startup
ENTRYPOINT ["dotnet", "ef", "database", "update", "--project", "src/TrueCV.Infrastructure", "--startup-project", "src/TrueCV.Web", "--no-build", "-c", "Release"] ENTRYPOINT ["dotnet", "ef", "database", "update", "--project", "src/RealCV.Infrastructure", "--startup-project", "src/RealCV.Web", "--no-build", "-c", "Release"]

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 MiB

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

31
deploy-local.sh Executable file
View File

@@ -0,0 +1,31 @@
#!/bin/bash
# Deploy RealCV from local git repo to website
set -e
cd /git/RealCV
echo "Building application..."
dotnet publish src/RealCV.Web -c Release -o ./publish --nologo
echo "Stopping service..."
sudo systemctl stop realcv
echo "Backing up config..."
cp /var/www/realcv/appsettings.Production.json /tmp/appsettings.Production.json 2>/dev/null || true
echo "Deploying files..."
sudo rm -rf /var/www/realcv/*
sudo cp -r ./publish/* /var/www/realcv/
echo "Restoring config..."
sudo cp /tmp/appsettings.Production.json /var/www/realcv/ 2>/dev/null || true
echo "Setting permissions..."
sudo chown -R www-data:www-data /var/www/realcv
echo "Starting service..."
sudo systemctl start realcv
echo "Done! Checking status..."
sleep 2
sudo systemctl is-active realcv && echo "Service is running."

View File

@@ -1,5 +1,5 @@
#!/bin/bash #!/bin/bash
# TrueCV Deployment Script # RealCV Deployment Script
# Run this from your development machine to deploy to a Linux server # Run this from your development machine to deploy to a Linux server
set -e set -e
@@ -7,8 +7,8 @@ set -e
# Configuration - UPDATE THESE VALUES # Configuration - UPDATE THESE VALUES
SERVER_USER="deploy" SERVER_USER="deploy"
SERVER_HOST="your-server.com" SERVER_HOST="your-server.com"
SERVER_PATH="/var/www/truecv" SERVER_PATH="/var/www/realcv"
DOMAIN="truecv.yourdomain.com" DOMAIN="realcv.yourdomain.com"
# Colors for output # Colors for output
RED='\033[0;31m' RED='\033[0;31m'
@@ -16,7 +16,7 @@ GREEN='\033[0;32m'
YELLOW='\033[1;33m' YELLOW='\033[1;33m'
NC='\033[0m' # No Color NC='\033[0m' # No Color
echo -e "${GREEN}=== TrueCV Deployment Script ===${NC}" echo -e "${GREEN}=== RealCV Deployment Script ===${NC}"
# Check if configuration is set # Check if configuration is set
if [[ "$SERVER_HOST" == "your-server.com" ]]; then if [[ "$SERVER_HOST" == "your-server.com" ]]; then
@@ -27,15 +27,15 @@ fi
# Step 1: Build and publish # Step 1: Build and publish
echo -e "${YELLOW}Step 1: Publishing application...${NC}" echo -e "${YELLOW}Step 1: Publishing application...${NC}"
cd "$(dirname "$0")/.." cd "$(dirname "$0")/.."
dotnet publish src/TrueCV.Web -c Release -o ./publish --nologo dotnet publish src/RealCV.Web -c Release -o ./publish --nologo
# Step 2: Create deployment package # Step 2: Create deployment package
echo -e "${YELLOW}Step 2: Creating deployment package...${NC}" echo -e "${YELLOW}Step 2: Creating deployment package...${NC}"
tar -czf deploy/truecv-release.tar.gz -C publish . tar -czf deploy/realcv-release.tar.gz -C publish .
# Step 3: Transfer to server # Step 3: Transfer to server
echo -e "${YELLOW}Step 3: Transferring to server...${NC}" echo -e "${YELLOW}Step 3: Transferring to server...${NC}"
scp deploy/truecv-release.tar.gz ${SERVER_USER}@${SERVER_HOST}:/tmp/ scp deploy/realcv-release.tar.gz ${SERVER_USER}@${SERVER_HOST}:/tmp/
# Step 4: Deploy on server # Step 4: Deploy on server
echo -e "${YELLOW}Step 4: Deploying on server...${NC}" echo -e "${YELLOW}Step 4: Deploying on server...${NC}"
@@ -43,23 +43,23 @@ ssh ${SERVER_USER}@${SERVER_HOST} << 'ENDSSH'
set -e set -e
# Stop the service if running # Stop the service if running
sudo systemctl stop truecv 2>/dev/null || true sudo systemctl stop realcv 2>/dev/null || true
# Backup current deployment # Backup current deployment
if [ -d "/var/www/truecv" ]; then if [ -d "/var/www/realcv" ]; then
sudo mv /var/www/truecv /var/www/truecv.backup.$(date +%Y%m%d_%H%M%S) sudo mv /var/www/realcv /var/www/realcv.backup.$(date +%Y%m%d_%H%M%S)
fi fi
# Create directory and extract # Create directory and extract
sudo mkdir -p /var/www/truecv sudo mkdir -p /var/www/realcv
sudo tar -xzf /tmp/truecv-release.tar.gz -C /var/www/truecv sudo tar -xzf /tmp/realcv-release.tar.gz -C /var/www/realcv
sudo chown -R www-data:www-data /var/www/truecv sudo chown -R www-data:www-data /var/www/realcv
# Start the service # Start the service
sudo systemctl start truecv sudo systemctl start realcv
# Clean up # Clean up
rm /tmp/truecv-release.tar.gz rm /tmp/realcv-release.tar.gz
echo "Deployment complete on server" echo "Deployment complete on server"
ENDSSH ENDSSH
@@ -67,14 +67,14 @@ ENDSSH
# Step 5: Verify deployment # Step 5: Verify deployment
echo -e "${YELLOW}Step 5: Verifying deployment...${NC}" echo -e "${YELLOW}Step 5: Verifying deployment...${NC}"
sleep 3 sleep 3
if ssh ${SERVER_USER}@${SERVER_HOST} "sudo systemctl is-active truecv" | grep -q "active"; then if ssh ${SERVER_USER}@${SERVER_HOST} "sudo systemctl is-active realcv" | grep -q "active"; then
echo -e "${GREEN}=== Deployment successful! ===${NC}" echo -e "${GREEN}=== Deployment successful! ===${NC}"
echo -e "Site should be available at: https://${DOMAIN}" echo -e "Site should be available at: https://${DOMAIN}"
else else
echo -e "${RED}Warning: Service may not be running. Check with: sudo systemctl status truecv${NC}" echo -e "${RED}Warning: Service may not be running. Check with: sudo systemctl status realcv${NC}"
fi fi
# Cleanup local files # Cleanup local files
rm -f deploy/truecv-release.tar.gz rm -f deploy/realcv-release.tar.gz
echo -e "${GREEN}Done!${NC}" echo -e "${GREEN}Done!${NC}"

View File

@@ -1,11 +1,11 @@
#!/bin/bash #!/bin/bash
# TrueCV Server Setup Script # RealCV Server Setup Script
# Run this ONCE on a fresh Linux server (Ubuntu 22.04/24.04) # Run this ONCE on a fresh Linux server (Ubuntu 22.04/24.04)
set -e set -e
# Configuration - UPDATE THESE VALUES # Configuration - UPDATE THESE VALUES
DOMAIN="truecv.yourdomain.com" DOMAIN="realcv.yourdomain.com"
DB_PASSWORD="YourStrong!Password123" DB_PASSWORD="YourStrong!Password123"
ADMIN_EMAIL="admin@yourdomain.com" ADMIN_EMAIL="admin@yourdomain.com"
@@ -15,7 +15,7 @@ GREEN='\033[0;32m'
YELLOW='\033[1;33m' YELLOW='\033[1;33m'
NC='\033[0m' NC='\033[0m'
echo -e "${GREEN}=== TrueCV Server Setup ===${NC}" echo -e "${GREEN}=== RealCV Server Setup ===${NC}"
# Check if running as root # Check if running as root
if [[ $EUID -ne 0 ]]; then if [[ $EUID -ne 0 ]]; then
@@ -52,54 +52,54 @@ echo -e "${YELLOW}Step 5: Setting up SQL Server...${NC}"
docker run -e 'ACCEPT_EULA=Y' \ docker run -e 'ACCEPT_EULA=Y' \
-e "SA_PASSWORD=${DB_PASSWORD}" \ -e "SA_PASSWORD=${DB_PASSWORD}" \
-p 127.0.0.1:1433:1433 \ -p 127.0.0.1:1433:1433 \
--name truecv-sql \ --name realcv-sql \
--restart unless-stopped \ --restart unless-stopped \
-v truecv-sqldata:/var/opt/mssql \ -v realcv-sqldata:/var/opt/mssql \
-d mcr.microsoft.com/mssql/server:2022-latest -d mcr.microsoft.com/mssql/server:2022-latest
echo "Waiting for SQL Server to start..." echo "Waiting for SQL Server to start..."
sleep 30 sleep 30
# Create the database # Create the database
docker exec truecv-sql /opt/mssql-tools18/bin/sqlcmd \ docker exec realcv-sql /opt/mssql-tools18/bin/sqlcmd \
-S localhost -U SA -P "${DB_PASSWORD}" -C \ -S localhost -U SA -P "${DB_PASSWORD}" -C \
-Q "CREATE DATABASE TrueCV" -Q "CREATE DATABASE RealCV"
# Step 6: Create application directory # Step 6: Create application directory
echo -e "${YELLOW}Step 6: Creating application directory...${NC}" echo -e "${YELLOW}Step 6: Creating application directory...${NC}"
mkdir -p /var/www/truecv mkdir -p /var/www/realcv
chown -R www-data:www-data /var/www/truecv chown -R www-data:www-data /var/www/realcv
# Step 7: Create systemd service # Step 7: Create systemd service
echo -e "${YELLOW}Step 7: Creating systemd service...${NC}" echo -e "${YELLOW}Step 7: Creating systemd service...${NC}"
cat > /etc/systemd/system/truecv.service << EOF cat > /etc/systemd/system/realcv.service << EOF
[Unit] [Unit]
Description=TrueCV Web Application Description=RealCV Web Application
After=network.target docker.service After=network.target docker.service
Requires=docker.service Requires=docker.service
[Service] [Service]
WorkingDirectory=/var/www/truecv WorkingDirectory=/var/www/realcv
ExecStart=/usr/bin/dotnet /var/www/truecv/TrueCV.Web.dll ExecStart=/usr/bin/dotnet /var/www/realcv/RealCV.Web.dll
Restart=always Restart=always
RestartSec=10 RestartSec=10
KillSignal=SIGINT KillSignal=SIGINT
SyslogIdentifier=truecv SyslogIdentifier=realcv
User=www-data User=www-data
Environment=ASPNETCORE_ENVIRONMENT=Production Environment=ASPNETCORE_ENVIRONMENT=Production
Environment=ASPNETCORE_URLS=http://localhost:5000 Environment=ASPNETCORE_URLS=http://localhost:5000
Environment=ConnectionStrings__DefaultConnection=Server=127.0.0.1;Database=TrueCV;User Id=SA;Password=${DB_PASSWORD};TrustServerCertificate=True Environment=ConnectionStrings__DefaultConnection=Server=127.0.0.1;Database=RealCV;User Id=SA;Password=${DB_PASSWORD};TrustServerCertificate=True
[Install] [Install]
WantedBy=multi-user.target WantedBy=multi-user.target
EOF EOF
systemctl daemon-reload systemctl daemon-reload
systemctl enable truecv systemctl enable realcv
# Step 8: Configure Nginx # Step 8: Configure Nginx
echo -e "${YELLOW}Step 8: Configuring Nginx...${NC}" echo -e "${YELLOW}Step 8: Configuring Nginx...${NC}"
cat > /etc/nginx/sites-available/truecv << EOF cat > /etc/nginx/sites-available/realcv << EOF
server { server {
listen 80; listen 80;
server_name ${DOMAIN}; server_name ${DOMAIN};
@@ -122,7 +122,7 @@ server {
} }
EOF EOF
ln -sf /etc/nginx/sites-available/truecv /etc/nginx/sites-enabled/ ln -sf /etc/nginx/sites-available/realcv /etc/nginx/sites-enabled/
rm -f /etc/nginx/sites-enabled/default rm -f /etc/nginx/sites-enabled/default
nginx -t nginx -t
systemctl reload nginx systemctl reload nginx
@@ -151,9 +151,9 @@ echo "2. Deploy the application using deploy.sh from your dev machine"
echo "3. Run SSL setup: certbot --nginx -d ${DOMAIN}" echo "3. Run SSL setup: certbot --nginx -d ${DOMAIN}"
echo "" echo ""
echo "Useful commands:" echo "Useful commands:"
echo " sudo systemctl status truecv - Check app status" echo " sudo systemctl status realcv - Check app status"
echo " sudo journalctl -u truecv -f - View app logs" echo " sudo journalctl -u realcv -f - View app logs"
echo " docker logs truecv-sql - View SQL Server logs" echo " docker logs realcv-sql - View SQL Server logs"
echo "" echo ""
echo -e "${YELLOW}Database connection string:${NC}" echo -e "${YELLOW}Database connection string:${NC}"
echo " Server=127.0.0.1;Database=TrueCV;User Id=SA;Password=${DB_PASSWORD};TrustServerCertificate=True" echo " Server=127.0.0.1;Database=RealCV;User Id=SA;Password=${DB_PASSWORD};TrustServerCertificate=True"

View File

@@ -1,18 +1,18 @@
version: '3.8' version: '3.8'
services: services:
# TrueCV Web Application # RealCV Web Application
truecv-web: realcv-web:
build: build:
context: . context: .
dockerfile: Dockerfile dockerfile: Dockerfile
container_name: truecv-web container_name: realcv-web
ports: ports:
- "5000:8080" - "5000:8080"
environment: environment:
- ASPNETCORE_ENVIRONMENT=Development - ASPNETCORE_ENVIRONMENT=Development
- ConnectionStrings__DefaultConnection=Server=sqlserver;Database=TrueCV;User Id=sa;Password=TrueCV_P@ssw0rd!;TrustServerCertificate=True; - ConnectionStrings__DefaultConnection=Server=sqlserver;Database=RealCV;User Id=sa;Password=RealCV_P@ssw0rd!;TrustServerCertificate=True;
- ConnectionStrings__HangfireConnection=Server=sqlserver;Database=TrueCV_Hangfire;User Id=sa;Password=TrueCV_P@ssw0rd!;TrustServerCertificate=True; - ConnectionStrings__HangfireConnection=Server=sqlserver;Database=RealCV_Hangfire;User Id=sa;Password=RealCV_P@ssw0rd!;TrustServerCertificate=True;
- AzureBlob__ConnectionString=DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=http://azurite:10000/devstoreaccount1; - AzureBlob__ConnectionString=DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=http://azurite:10000/devstoreaccount1;
- AzureBlob__ContainerName=cv-uploads - AzureBlob__ContainerName=cv-uploads
- CompaniesHouse__BaseUrl=https://api.company-information.service.gov.uk - CompaniesHouse__BaseUrl=https://api.company-information.service.gov.uk
@@ -24,25 +24,25 @@ services:
azurite: azurite:
condition: service_started condition: service_started
networks: networks:
- truecv-network - realcv-network
restart: unless-stopped restart: unless-stopped
# SQL Server Database # SQL Server Database
sqlserver: sqlserver:
image: mcr.microsoft.com/mssql/server:2022-latest image: mcr.microsoft.com/mssql/server:2022-latest
container_name: truecv-sqlserver container_name: realcv-sqlserver
ports: ports:
- "1433:1433" - "1433:1433"
environment: environment:
- ACCEPT_EULA=Y - ACCEPT_EULA=Y
- MSSQL_SA_PASSWORD=TrueCV_P@ssw0rd! - MSSQL_SA_PASSWORD=RealCV_P@ssw0rd!
- MSSQL_PID=Developer - MSSQL_PID=Developer
volumes: volumes:
- sqlserver-data:/var/opt/mssql - sqlserver-data:/var/opt/mssql
networks: networks:
- truecv-network - realcv-network
healthcheck: healthcheck:
test: /opt/mssql-tools18/bin/sqlcmd -S localhost -U sa -P "TrueCV_P@ssw0rd!" -C -Q "SELECT 1" || exit 1 test: /opt/mssql-tools18/bin/sqlcmd -S localhost -U sa -P "RealCV_P@ssw0rd!" -C -Q "SELECT 1" || exit 1
interval: 10s interval: 10s
timeout: 5s timeout: 5s
retries: 10 retries: 10
@@ -52,7 +52,7 @@ services:
# Azure Storage Emulator (Azurite) # Azure Storage Emulator (Azurite)
azurite: azurite:
image: mcr.microsoft.com/azure-storage/azurite:latest image: mcr.microsoft.com/azure-storage/azurite:latest
container_name: truecv-azurite container_name: realcv-azurite
ports: ports:
- "10000:10000" # Blob service - "10000:10000" # Blob service
- "10001:10001" # Queue service - "10001:10001" # Queue service
@@ -61,7 +61,7 @@ services:
- azurite-data:/data - azurite-data:/data
command: "azurite --blobHost 0.0.0.0 --queueHost 0.0.0.0 --tableHost 0.0.0.0 --location /data --debug /data/debug.log" command: "azurite --blobHost 0.0.0.0 --queueHost 0.0.0.0 --tableHost 0.0.0.0 --location /data --debug /data/debug.log"
networks: networks:
- truecv-network - realcv-network
restart: unless-stopped restart: unless-stopped
# Database initialization (runs migrations) # Database initialization (runs migrations)
@@ -69,18 +69,18 @@ services:
build: build:
context: . context: .
dockerfile: Dockerfile.migrations dockerfile: Dockerfile.migrations
container_name: truecv-db-init container_name: realcv-db-init
environment: environment:
- ConnectionStrings__DefaultConnection=Server=sqlserver;Database=TrueCV;User Id=sa;Password=TrueCV_P@ssw0rd!;TrustServerCertificate=True; - ConnectionStrings__DefaultConnection=Server=sqlserver;Database=RealCV;User Id=sa;Password=RealCV_P@ssw0rd!;TrustServerCertificate=True;
depends_on: depends_on:
sqlserver: sqlserver:
condition: service_healthy condition: service_healthy
networks: networks:
- truecv-network - realcv-network
restart: "no" restart: "no"
networks: networks:
truecv-network: realcv-network:
driver: bridge driver: bridge
volumes: volumes:

BIN
realcv.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 MiB

BIN
screenshots/check.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 254 MiB

BIN
screenshots/dashboard.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 254 MiB

BIN
screenshots/homepage.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.9 MiB

BIN
screenshots/login.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 254 MiB

BIN
screenshots/pricing.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.9 MiB

BIN
screenshots/register.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 254 MiB

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,6 +1,6 @@
using TrueCV.Domain.Enums; using RealCV.Domain.Enums;
namespace TrueCV.Application.DTOs; namespace RealCV.Application.DTOs;
public class SubscriptionInfoDto public class SubscriptionInfoDto
{ {

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.Domain.Enums; using RealCV.Domain.Enums;
namespace TrueCV.Application.Interfaces; namespace RealCV.Application.Interfaces;
public interface IStripeService public interface IStripeService
{ {

View File

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

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 TrueCV.Domain.Enums; using RealCV.Domain.Enums;
namespace TrueCV.Domain.Constants; namespace RealCV.Domain.Constants;
public static class PlanLimits public static class PlanLimits
{ {

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.Domain.Exceptions; namespace RealCV.Domain.Exceptions;
public class QuotaExceededException : Exception public class QuotaExceededException : Exception
{ {

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,4 +1,4 @@
namespace TrueCV.Infrastructure.Configuration; namespace RealCV.Infrastructure.Configuration;
public class StripeSettings public class StripeSettings
{ {

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

@@ -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("20260121115517_AddStripeSubscriptionFields")] [Migration("20260121115517_AddStripeSubscriptionFields")]
@@ -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()
@@ -444,7 +444,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)
@@ -453,7 +453,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)
@@ -468,7 +468,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)
@@ -477,25 +477,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)
@@ -504,12 +504,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 AddStripeSubscriptionFields : Migration public partial class AddStripeSubscriptionFields : 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()
@@ -441,7 +441,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)
@@ -450,7 +450,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)
@@ -465,7 +465,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)
@@ -474,25 +474,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)
@@ -501,12 +501,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

@@ -6,14 +6,14 @@ using Microsoft.Extensions.DependencyInjection;
using Polly; using Polly;
using Polly.Extensions.Http; using Polly.Extensions.Http;
using Stripe; using Stripe;
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,9 +1,9 @@
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using TrueCV.Domain.Enums; using RealCV.Domain.Enums;
using TrueCV.Infrastructure.Data; using RealCV.Infrastructure.Data;
namespace TrueCV.Infrastructure.Jobs; namespace RealCV.Infrastructure.Jobs;
/// <summary> /// <summary>
/// Hangfire job that resets monthly CV check usage for users whose billing period has ended. /// Hangfire job that resets monthly CV check usage for users whose billing period has ended.

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,17 +2,17 @@ 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.Domain.Exceptions; using RealCV.Domain.Exceptions;
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

@@ -6,14 +6,14 @@ 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
{ {

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

@@ -3,12 +3,12 @@ using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
using Stripe; using Stripe;
using Stripe.Checkout; using Stripe.Checkout;
using TrueCV.Application.Interfaces; using RealCV.Application.Interfaces;
using TrueCV.Domain.Enums; using RealCV.Domain.Enums;
using TrueCV.Infrastructure.Configuration; using RealCV.Infrastructure.Configuration;
using TrueCV.Infrastructure.Data; using RealCV.Infrastructure.Data;
namespace TrueCV.Infrastructure.Services; namespace RealCV.Infrastructure.Services;
public sealed class StripeService : IStripeService public sealed class StripeService : IStripeService
{ {

View File

@@ -1,12 +1,12 @@
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.Interfaces; using RealCV.Application.Interfaces;
using TrueCV.Domain.Constants; using RealCV.Domain.Constants;
using TrueCV.Domain.Enums; using RealCV.Domain.Enums;
using TrueCV.Infrastructure.Data; using RealCV.Infrastructure.Data;
namespace TrueCV.Infrastructure.Services; namespace RealCV.Infrastructure.Services;
public sealed class SubscriptionService : ISubscriptionService public sealed class SubscriptionService : ISubscriptionService
{ {

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

@@ -1,10 +1,10 @@
@inherits LayoutComponentBase @inherits LayoutComponentBase
<div class="d-flex flex-column min-vh-100"> <div class="d-flex flex-column min-vh-100">
<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(--realcv-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_Transparent.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">
@@ -77,9 +77,9 @@
@Body @Body
</main> </main>
<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(--realcv-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

@@ -6,7 +6,7 @@
@inject AuthenticationStateProvider AuthenticationStateProvider @inject AuthenticationStateProvider AuthenticationStateProvider
@inject NavigationManager NavigationManager @inject NavigationManager NavigationManager
<PageTitle>Billing - TrueCV</PageTitle> <PageTitle>Billing - RealCV</PageTitle>
<div class="container py-5"> <div class="container py-5">
<div class="row justify-content-center"> <div class="row justify-content-center">
@@ -49,20 +49,20 @@
<div class="row g-4"> <div class="row g-4">
<div class="col-md-6"> <div class="col-md-6">
<div class="p-3 rounded" style="background: var(--truecv-bg-muted);"> <div class="p-3 rounded" style="background: var(--realcv-bg-muted);">
<div class="small text-muted mb-1">Price</div> <div class="small text-muted mb-1">Price</div>
<div class="fw-bold fs-4">@_subscription.DisplayPrice</div> <div class="fw-bold fs-4">@_subscription.DisplayPrice</div>
</div> </div>
</div> </div>
<div class="col-md-6"> <div class="col-md-6">
<div class="p-3 rounded" style="background: var(--truecv-bg-muted);"> <div class="p-3 rounded" style="background: var(--realcv-bg-muted);">
<div class="small text-muted mb-1">Status</div> <div class="small text-muted mb-1">Status</div>
<div class="fw-bold fs-4"> <div class="fw-bold fs-4">
@if (_subscription.HasActiveSubscription) @if (_subscription.HasActiveSubscription)
{ {
<span class="text-success">Active</span> <span class="text-success">Active</span>
} }
else if (_subscription.Plan == TrueCV.Domain.Enums.UserPlan.Free) else if (_subscription.Plan == RealCV.Domain.Enums.UserPlan.Free)
{ {
<span class="text-muted">Free Tier</span> <span class="text-muted">Free Tier</span>
} }
@@ -84,7 +84,7 @@
<div class="d-flex gap-2 mt-4"> <div class="d-flex gap-2 mt-4">
<a href="/pricing" class="btn btn-primary"> <a href="/pricing" class="btn btn-primary">
@if (_subscription.Plan == TrueCV.Domain.Enums.UserPlan.Free) @if (_subscription.Plan == RealCV.Domain.Enums.UserPlan.Free)
{ {
<span>Upgrade Plan</span> <span>Upgrade Plan</span>
} }
@@ -144,7 +144,7 @@
</small> </small>
</div> </div>
} }
else if (_subscription.ChecksRemaining <= 3 && _subscription.Plan != TrueCV.Domain.Enums.UserPlan.Free) else if (_subscription.ChecksRemaining <= 3 && _subscription.Plan != RealCV.Domain.Enums.UserPlan.Free)
{ {
<div class="alert alert-info mt-3 mb-0 py-2"> <div class="alert alert-info mt-3 mb-0 py-2">
<small> <small>

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_Transparent.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_Transparent.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

@@ -3,7 +3,7 @@
@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
@@ -11,7 +11,7 @@
@inject NavigationManager NavigationManager @inject NavigationManager NavigationManager
@inject ILogger<Settings> Logger @inject ILogger<Settings> Logger
<PageTitle>Account Settings - TrueCV</PageTitle> <PageTitle>Account Settings - RealCV</PageTitle>
<div class="container py-5"> <div class="container py-5">
<div class="row justify-content-center"> <div class="row justify-content-center">

View File

@@ -8,7 +8,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">
@@ -225,21 +225,21 @@
<style> <style>
.upload-area { .upload-area {
border: 2px dashed var(--truecv-gray-300); border: 2px dashed var(--realcv-gray-300);
border-radius: 16px; border-radius: 16px;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
background: linear-gradient(180deg, var(--truecv-bg-surface) 0%, var(--truecv-bg-muted) 100%); background: linear-gradient(180deg, var(--realcv-bg-surface) 0%, var(--realcv-bg-muted) 100%);
} }
.upload-area:hover { .upload-area:hover {
border-color: var(--truecv-primary); border-color: var(--realcv-primary);
background: linear-gradient(180deg, #e8f1fa 0%, #d4e4f4 100%); background: linear-gradient(180deg, #e8f1fa 0%, #d4e4f4 100%);
transform: translateY(-2px); transform: translateY(-2px);
box-shadow: 0 10px 25px -5px rgba(59, 111, 212, 0.1); box-shadow: 0 10px 25px -5px rgba(59, 111, 212, 0.1);
} }
.upload-area.dragging { .upload-area.dragging {
border-color: var(--truecv-primary); border-color: var(--realcv-primary);
background: linear-gradient(180deg, #d4e4f4 0%, #c5d9ef 100%); background: linear-gradient(180deg, #d4e4f4 0%, #c5d9ef 100%);
border-style: solid; border-style: solid;
transform: scale(1.02); transform: scale(1.02);
@@ -248,7 +248,7 @@
.upload-icon { .upload-icon {
width: 80px; width: 80px;
height: 80px; height: 80px;
background: linear-gradient(135deg, var(--truecv-primary) 0%, var(--truecv-primary-dark) 100%); background: linear-gradient(135deg, var(--realcv-primary) 0%, var(--realcv-primary-dark) 100%);
border-radius: 20px; border-radius: 20px;
display: flex; display: flex;
align-items: center; align-items: center;
@@ -271,16 +271,16 @@
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: space-between; justify-content: space-between;
border: 1px solid var(--truecv-gray-200); border: 1px solid var(--realcv-gray-200);
border-radius: 12px; border-radius: 12px;
padding: 1rem; padding: 1rem;
margin-bottom: 0.75rem; margin-bottom: 0.75rem;
background: var(--truecv-bg-surface); background: var(--realcv-bg-surface);
transition: all 0.2s ease; transition: all 0.2s ease;
} }
.file-list-item:hover { .file-list-item:hover {
border-color: var(--truecv-primary); border-color: var(--realcv-primary);
box-shadow: 0 4px 12px rgba(59, 111, 212, 0.08); box-shadow: 0 4px 12px rgba(59, 111, 212, 0.08);
} }
@@ -300,7 +300,7 @@
.file-type-icon.docx { .file-type-icon.docx {
background: linear-gradient(135deg, #e3ecf7 0%, #d4e4f4 100%); background: linear-gradient(135deg, #e3ecf7 0%, #d4e4f4 100%);
color: var(--truecv-primary); color: var(--realcv-primary);
} }
.security-info { .security-info {
@@ -312,14 +312,14 @@
align-items: center; align-items: center;
gap: 0.5rem; gap: 0.5rem;
padding: 0.625rem 1rem; padding: 0.625rem 1rem;
background: var(--truecv-bg-muted); background: var(--realcv-bg-muted);
border-radius: var(--truecv-radius); border-radius: var(--realcv-radius);
font-size: 0.875rem; font-size: 0.875rem;
color: var(--truecv-gray-600); color: var(--realcv-gray-600);
} }
.security-badge svg { .security-badge svg {
color: var(--truecv-verified); color: var(--realcv-verified);
} }
@@media (max-width: 576px) { @@media (max-width: 576px) {
@@ -526,7 +526,7 @@
await CVCheckService.CreateCheckAsync(userId, memoryStream, file.Name); await CVCheckService.CreateCheckAsync(userId, memoryStream, file.Name);
} }
catch (TrueCV.Domain.Exceptions.QuotaExceededException) catch (RealCV.Domain.Exceptions.QuotaExceededException)
{ {
_quotaExceeded = true; _quotaExceeded = true;
_errorMessage = null; _errorMessage = null;

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