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>
447
DEPLOYMENT-GUIDE.md
Normal 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*
|
||||||
14
Dockerfile
@@ -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"]
|
||||||
|
|||||||
@@ -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"]
|
||||||
|
|||||||
BIN
Gemini_Generated_Image_go8drzgo8drzgo8d.png
Executable file
|
After Width: | Height: | Size: 6.3 MiB |
@@ -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
@@ -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."
|
||||||
@@ -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}"
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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
|
After Width: | Height: | Size: 6.3 MiB |
BIN
screenshots/check.png
Normal file
|
After Width: | Height: | Size: 254 MiB |
BIN
screenshots/dashboard.png
Normal file
|
After Width: | Height: | Size: 254 MiB |
BIN
screenshots/homepage.png
Normal file
|
After Width: | Height: | Size: 7.9 MiB |
BIN
screenshots/login.png
Normal file
|
After Width: | Height: | Size: 254 MiB |
BIN
screenshots/pricing.png
Normal file
|
After Width: | Height: | Size: 7.9 MiB |
BIN
screenshots/register.png
Normal file
|
After Width: | Height: | Size: 254 MiB |
@@ -1,4 +1,4 @@
|
|||||||
namespace TrueCV.Application.DTOs;
|
namespace RealCV.Application.DTOs;
|
||||||
|
|
||||||
public sealed record CVCheckDto
|
public sealed record CVCheckDto
|
||||||
{
|
{
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
namespace TrueCV.Application.DTOs;
|
namespace RealCV.Application.DTOs;
|
||||||
|
|
||||||
public sealed record CompanySearchResult
|
public sealed record CompanySearchResult
|
||||||
{
|
{
|
||||||
@@ -1,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
|
||||||
{
|
{
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
namespace TrueCV.Application.Data;
|
namespace RealCV.Application.Data;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Known diploma mills and fake educational institutions.
|
/// Known diploma mills and fake educational institutions.
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
namespace TrueCV.Application.Data;
|
namespace RealCV.Application.Data;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// List of recognised UK higher education institutions.
|
/// List of recognised UK higher education institutions.
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
namespace TrueCV.Application.Helpers;
|
namespace RealCV.Application.Helpers;
|
||||||
|
|
||||||
public static class DateHelpers
|
public static class DateHelpers
|
||||||
{
|
{
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
using System.Text.Json;
|
using System.Text.Json;
|
||||||
|
|
||||||
namespace TrueCV.Application.Helpers;
|
namespace RealCV.Application.Helpers;
|
||||||
|
|
||||||
public static class JsonDefaults
|
public static class JsonDefaults
|
||||||
{
|
{
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
namespace TrueCV.Application.Helpers;
|
namespace RealCV.Application.Helpers;
|
||||||
|
|
||||||
public static class ScoreThresholds
|
public static class ScoreThresholds
|
||||||
{
|
{
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
namespace TrueCV.Application.Interfaces;
|
namespace RealCV.Application.Interfaces;
|
||||||
|
|
||||||
public interface IAuditService
|
public interface IAuditService
|
||||||
{
|
{
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
using TrueCV.Application.DTOs;
|
using RealCV.Application.DTOs;
|
||||||
using TrueCV.Application.Models;
|
using RealCV.Application.Models;
|
||||||
|
|
||||||
namespace TrueCV.Application.Interfaces;
|
namespace RealCV.Application.Interfaces;
|
||||||
|
|
||||||
public interface ICVCheckService
|
public interface ICVCheckService
|
||||||
{
|
{
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
using TrueCV.Application.Models;
|
using RealCV.Application.Models;
|
||||||
|
|
||||||
namespace TrueCV.Application.Interfaces;
|
namespace RealCV.Application.Interfaces;
|
||||||
|
|
||||||
public interface ICVParserService
|
public interface ICVParserService
|
||||||
{
|
{
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
using TrueCV.Application.Models;
|
using RealCV.Application.Models;
|
||||||
|
|
||||||
namespace TrueCV.Application.Interfaces;
|
namespace RealCV.Application.Interfaces;
|
||||||
|
|
||||||
public interface ICompanyNameMatcherService
|
public interface ICompanyNameMatcherService
|
||||||
{
|
{
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
using TrueCV.Application.DTOs;
|
using RealCV.Application.DTOs;
|
||||||
using TrueCV.Application.Models;
|
using RealCV.Application.Models;
|
||||||
|
|
||||||
namespace TrueCV.Application.Interfaces;
|
namespace RealCV.Application.Interfaces;
|
||||||
|
|
||||||
public interface ICompanyVerifierService
|
public interface ICompanyVerifierService
|
||||||
{
|
{
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
using TrueCV.Application.Models;
|
using RealCV.Application.Models;
|
||||||
|
|
||||||
namespace TrueCV.Application.Interfaces;
|
namespace RealCV.Application.Interfaces;
|
||||||
|
|
||||||
public interface IEducationVerifierService
|
public interface IEducationVerifierService
|
||||||
{
|
{
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
namespace TrueCV.Application.Interfaces;
|
namespace RealCV.Application.Interfaces;
|
||||||
|
|
||||||
public interface IFileStorageService
|
public interface IFileStorageService
|
||||||
{
|
{
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
using TrueCV.Domain.Enums;
|
using RealCV.Domain.Enums;
|
||||||
|
|
||||||
namespace TrueCV.Application.Interfaces;
|
namespace RealCV.Application.Interfaces;
|
||||||
|
|
||||||
public interface IStripeService
|
public interface IStripeService
|
||||||
{
|
{
|
||||||
@@ -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
|
||||||
{
|
{
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
using TrueCV.Application.Models;
|
using RealCV.Application.Models;
|
||||||
|
|
||||||
namespace TrueCV.Application.Interfaces;
|
namespace RealCV.Application.Interfaces;
|
||||||
|
|
||||||
public interface ITimelineAnalyserService
|
public interface ITimelineAnalyserService
|
||||||
{
|
{
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
namespace TrueCV.Application.Interfaces;
|
namespace RealCV.Application.Interfaces;
|
||||||
|
|
||||||
public interface IUserContextService
|
public interface IUserContextService
|
||||||
{
|
{
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
namespace TrueCV.Application.Models;
|
namespace RealCV.Application.Models;
|
||||||
|
|
||||||
public sealed record CVData
|
public sealed record CVData
|
||||||
{
|
{
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
namespace TrueCV.Application.Models;
|
namespace RealCV.Application.Models;
|
||||||
|
|
||||||
public sealed record CompanyVerificationResult
|
public sealed record CompanyVerificationResult
|
||||||
{
|
{
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
namespace TrueCV.Application.Models;
|
namespace RealCV.Application.Models;
|
||||||
|
|
||||||
public sealed record EducationEntry
|
public sealed record EducationEntry
|
||||||
{
|
{
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
namespace TrueCV.Application.Models;
|
namespace RealCV.Application.Models;
|
||||||
|
|
||||||
public sealed record EducationVerificationResult
|
public sealed record EducationVerificationResult
|
||||||
{
|
{
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
namespace TrueCV.Application.Models;
|
namespace RealCV.Application.Models;
|
||||||
|
|
||||||
public sealed record EmploymentEntry
|
public sealed record EmploymentEntry
|
||||||
{
|
{
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
namespace TrueCV.Application.Models;
|
namespace RealCV.Application.Models;
|
||||||
|
|
||||||
public sealed record FlagResult
|
public sealed record FlagResult
|
||||||
{
|
{
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
namespace TrueCV.Application.Models;
|
namespace RealCV.Application.Models;
|
||||||
|
|
||||||
public record SemanticMatchResult
|
public record SemanticMatchResult
|
||||||
{
|
{
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
namespace TrueCV.Application.Models;
|
namespace RealCV.Application.Models;
|
||||||
|
|
||||||
public sealed record TimelineAnalysisResult
|
public sealed record TimelineAnalysisResult
|
||||||
{
|
{
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
namespace TrueCV.Application.Models;
|
namespace RealCV.Application.Models;
|
||||||
|
|
||||||
public sealed record TimelineGap
|
public sealed record TimelineGap
|
||||||
{
|
{
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
namespace TrueCV.Application.Models;
|
namespace RealCV.Application.Models;
|
||||||
|
|
||||||
public sealed record TimelineOverlap
|
public sealed record TimelineOverlap
|
||||||
{
|
{
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
namespace TrueCV.Application.Models;
|
namespace RealCV.Application.Models;
|
||||||
|
|
||||||
public sealed record VeracityReport
|
public sealed record VeracityReport
|
||||||
{
|
{
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ProjectReference Include="..\TrueCV.Domain\TrueCV.Domain.csproj" />
|
<ProjectReference Include="..\RealCV.Domain\RealCV.Domain.csproj" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
using TrueCV.Domain.Enums;
|
using RealCV.Domain.Enums;
|
||||||
|
|
||||||
namespace TrueCV.Domain.Constants;
|
namespace RealCV.Domain.Constants;
|
||||||
|
|
||||||
public static class PlanLimits
|
public static class PlanLimits
|
||||||
{
|
{
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
using System.ComponentModel.DataAnnotations;
|
using System.ComponentModel.DataAnnotations;
|
||||||
|
|
||||||
namespace TrueCV.Domain.Entities;
|
namespace RealCV.Domain.Entities;
|
||||||
|
|
||||||
public class AuditLog
|
public class AuditLog
|
||||||
{
|
{
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
using System.ComponentModel.DataAnnotations;
|
using System.ComponentModel.DataAnnotations;
|
||||||
using TrueCV.Domain.Enums;
|
using RealCV.Domain.Enums;
|
||||||
|
|
||||||
namespace TrueCV.Domain.Entities;
|
namespace RealCV.Domain.Entities;
|
||||||
|
|
||||||
public class CVCheck
|
public class CVCheck
|
||||||
{
|
{
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
using System.ComponentModel.DataAnnotations;
|
using System.ComponentModel.DataAnnotations;
|
||||||
using System.ComponentModel.DataAnnotations.Schema;
|
using System.ComponentModel.DataAnnotations.Schema;
|
||||||
using TrueCV.Domain.Enums;
|
using RealCV.Domain.Enums;
|
||||||
|
|
||||||
namespace TrueCV.Domain.Entities;
|
namespace RealCV.Domain.Entities;
|
||||||
|
|
||||||
public class CVFlag
|
public class CVFlag
|
||||||
{
|
{
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
using System.ComponentModel.DataAnnotations;
|
using System.ComponentModel.DataAnnotations;
|
||||||
|
|
||||||
namespace TrueCV.Domain.Entities;
|
namespace RealCV.Domain.Entities;
|
||||||
|
|
||||||
public class CompanyCache
|
public class CompanyCache
|
||||||
{
|
{
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
namespace TrueCV.Domain.Enums;
|
namespace RealCV.Domain.Enums;
|
||||||
|
|
||||||
public enum CheckStatus
|
public enum CheckStatus
|
||||||
{
|
{
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
namespace TrueCV.Domain.Enums;
|
namespace RealCV.Domain.Enums;
|
||||||
|
|
||||||
public enum FlagCategory
|
public enum FlagCategory
|
||||||
{
|
{
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
namespace TrueCV.Domain.Enums;
|
namespace RealCV.Domain.Enums;
|
||||||
|
|
||||||
public enum FlagSeverity
|
public enum FlagSeverity
|
||||||
{
|
{
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
namespace TrueCV.Domain.Enums;
|
namespace RealCV.Domain.Enums;
|
||||||
|
|
||||||
public enum UserPlan
|
public enum UserPlan
|
||||||
{
|
{
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
namespace TrueCV.Domain.Exceptions;
|
namespace RealCV.Domain.Exceptions;
|
||||||
|
|
||||||
public class QuotaExceededException : Exception
|
public class QuotaExceededException : Exception
|
||||||
{
|
{
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
namespace TrueCV.Infrastructure.Configuration;
|
namespace RealCV.Infrastructure.Configuration;
|
||||||
|
|
||||||
public sealed class AnthropicSettings
|
public sealed class AnthropicSettings
|
||||||
{
|
{
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
namespace TrueCV.Infrastructure.Configuration;
|
namespace RealCV.Infrastructure.Configuration;
|
||||||
|
|
||||||
public sealed class AzureBlobSettings
|
public sealed class AzureBlobSettings
|
||||||
{
|
{
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
namespace TrueCV.Infrastructure.Configuration;
|
namespace RealCV.Infrastructure.Configuration;
|
||||||
|
|
||||||
public sealed class CompaniesHouseSettings
|
public sealed class CompaniesHouseSettings
|
||||||
{
|
{
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
namespace TrueCV.Infrastructure.Configuration;
|
namespace RealCV.Infrastructure.Configuration;
|
||||||
|
|
||||||
public sealed class LocalStorageSettings
|
public sealed class LocalStorageSettings
|
||||||
{
|
{
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
namespace TrueCV.Infrastructure.Configuration;
|
namespace RealCV.Infrastructure.Configuration;
|
||||||
|
|
||||||
public class StripeSettings
|
public class StripeSettings
|
||||||
{
|
{
|
||||||
@@ -1,10 +1,10 @@
|
|||||||
using Microsoft.AspNetCore.Identity;
|
using Microsoft.AspNetCore.Identity;
|
||||||
using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
|
using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
using TrueCV.Domain.Entities;
|
using RealCV.Domain.Entities;
|
||||||
using TrueCV.Infrastructure.Identity;
|
using RealCV.Infrastructure.Identity;
|
||||||
|
|
||||||
namespace TrueCV.Infrastructure.Data;
|
namespace RealCV.Infrastructure.Data;
|
||||||
|
|
||||||
public class ApplicationDbContext : IdentityDbContext<ApplicationUser, IdentityRole<Guid>, Guid>
|
public class ApplicationDbContext : IdentityDbContext<ApplicationUser, IdentityRole<Guid>, Guid>
|
||||||
{
|
{
|
||||||
@@ -5,11 +5,11 @@ using Microsoft.EntityFrameworkCore.Infrastructure;
|
|||||||
using Microsoft.EntityFrameworkCore.Metadata;
|
using Microsoft.EntityFrameworkCore.Metadata;
|
||||||
using Microsoft.EntityFrameworkCore.Migrations;
|
using Microsoft.EntityFrameworkCore.Migrations;
|
||||||
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
|
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
|
||||||
using TrueCV.Infrastructure.Data;
|
using RealCV.Infrastructure.Data;
|
||||||
|
|
||||||
#nullable disable
|
#nullable disable
|
||||||
|
|
||||||
namespace TrueCV.Infrastructure.Data.Migrations
|
namespace RealCV.Infrastructure.Data.Migrations
|
||||||
{
|
{
|
||||||
[DbContext(typeof(ApplicationDbContext))]
|
[DbContext(typeof(ApplicationDbContext))]
|
||||||
[Migration("20260118182916_InitialCreate")]
|
[Migration("20260118182916_InitialCreate")]
|
||||||
@@ -156,7 +156,7 @@ namespace TrueCV.Infrastructure.Data.Migrations
|
|||||||
b.ToTable("AspNetUserTokens", (string)null);
|
b.ToTable("AspNetUserTokens", (string)null);
|
||||||
});
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("TrueCV.Domain.Entities.CVCheck", b =>
|
modelBuilder.Entity("RealCV.Domain.Entities.CVCheck", b =>
|
||||||
{
|
{
|
||||||
b.Property<Guid>("Id")
|
b.Property<Guid>("Id")
|
||||||
.ValueGeneratedOnAdd()
|
.ValueGeneratedOnAdd()
|
||||||
@@ -211,7 +211,7 @@ namespace TrueCV.Infrastructure.Data.Migrations
|
|||||||
b.ToTable("CVChecks");
|
b.ToTable("CVChecks");
|
||||||
});
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("TrueCV.Domain.Entities.CVFlag", b =>
|
modelBuilder.Entity("RealCV.Domain.Entities.CVFlag", b =>
|
||||||
{
|
{
|
||||||
b.Property<Guid>("Id")
|
b.Property<Guid>("Id")
|
||||||
.ValueGeneratedOnAdd()
|
.ValueGeneratedOnAdd()
|
||||||
@@ -251,7 +251,7 @@ namespace TrueCV.Infrastructure.Data.Migrations
|
|||||||
b.ToTable("CVFlags");
|
b.ToTable("CVFlags");
|
||||||
});
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("TrueCV.Domain.Entities.CompanyCache", b =>
|
modelBuilder.Entity("RealCV.Domain.Entities.CompanyCache", b =>
|
||||||
{
|
{
|
||||||
b.Property<string>("CompanyNumber")
|
b.Property<string>("CompanyNumber")
|
||||||
.HasMaxLength(32)
|
.HasMaxLength(32)
|
||||||
@@ -281,7 +281,7 @@ namespace TrueCV.Infrastructure.Data.Migrations
|
|||||||
b.ToTable("CompanyCache");
|
b.ToTable("CompanyCache");
|
||||||
});
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("TrueCV.Domain.Entities.User", b =>
|
modelBuilder.Entity("RealCV.Domain.Entities.User", b =>
|
||||||
{
|
{
|
||||||
b.Property<Guid>("Id")
|
b.Property<Guid>("Id")
|
||||||
.ValueGeneratedOnAdd()
|
.ValueGeneratedOnAdd()
|
||||||
@@ -307,7 +307,7 @@ namespace TrueCV.Infrastructure.Data.Migrations
|
|||||||
b.ToTable("User");
|
b.ToTable("User");
|
||||||
});
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("TrueCV.Infrastructure.Identity.ApplicationUser", b =>
|
modelBuilder.Entity("RealCV.Infrastructure.Identity.ApplicationUser", b =>
|
||||||
{
|
{
|
||||||
b.Property<Guid>("Id")
|
b.Property<Guid>("Id")
|
||||||
.ValueGeneratedOnAdd()
|
.ValueGeneratedOnAdd()
|
||||||
@@ -396,7 +396,7 @@ namespace TrueCV.Infrastructure.Data.Migrations
|
|||||||
|
|
||||||
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim<System.Guid>", b =>
|
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim<System.Guid>", b =>
|
||||||
{
|
{
|
||||||
b.HasOne("TrueCV.Infrastructure.Identity.ApplicationUser", null)
|
b.HasOne("RealCV.Infrastructure.Identity.ApplicationUser", null)
|
||||||
.WithMany()
|
.WithMany()
|
||||||
.HasForeignKey("UserId")
|
.HasForeignKey("UserId")
|
||||||
.OnDelete(DeleteBehavior.Cascade)
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
@@ -405,7 +405,7 @@ namespace TrueCV.Infrastructure.Data.Migrations
|
|||||||
|
|
||||||
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin<System.Guid>", b =>
|
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin<System.Guid>", b =>
|
||||||
{
|
{
|
||||||
b.HasOne("TrueCV.Infrastructure.Identity.ApplicationUser", null)
|
b.HasOne("RealCV.Infrastructure.Identity.ApplicationUser", null)
|
||||||
.WithMany()
|
.WithMany()
|
||||||
.HasForeignKey("UserId")
|
.HasForeignKey("UserId")
|
||||||
.OnDelete(DeleteBehavior.Cascade)
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
@@ -420,7 +420,7 @@ namespace TrueCV.Infrastructure.Data.Migrations
|
|||||||
.OnDelete(DeleteBehavior.Cascade)
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
.IsRequired();
|
.IsRequired();
|
||||||
|
|
||||||
b.HasOne("TrueCV.Infrastructure.Identity.ApplicationUser", null)
|
b.HasOne("RealCV.Infrastructure.Identity.ApplicationUser", null)
|
||||||
.WithMany()
|
.WithMany()
|
||||||
.HasForeignKey("UserId")
|
.HasForeignKey("UserId")
|
||||||
.OnDelete(DeleteBehavior.Cascade)
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
@@ -429,29 +429,29 @@ namespace TrueCV.Infrastructure.Data.Migrations
|
|||||||
|
|
||||||
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken<System.Guid>", b =>
|
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken<System.Guid>", b =>
|
||||||
{
|
{
|
||||||
b.HasOne("TrueCV.Infrastructure.Identity.ApplicationUser", null)
|
b.HasOne("RealCV.Infrastructure.Identity.ApplicationUser", null)
|
||||||
.WithMany()
|
.WithMany()
|
||||||
.HasForeignKey("UserId")
|
.HasForeignKey("UserId")
|
||||||
.OnDelete(DeleteBehavior.Cascade)
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
.IsRequired();
|
.IsRequired();
|
||||||
});
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("TrueCV.Domain.Entities.CVCheck", b =>
|
modelBuilder.Entity("RealCV.Domain.Entities.CVCheck", b =>
|
||||||
{
|
{
|
||||||
b.HasOne("TrueCV.Infrastructure.Identity.ApplicationUser", null)
|
b.HasOne("RealCV.Infrastructure.Identity.ApplicationUser", null)
|
||||||
.WithMany("CVChecks")
|
.WithMany("CVChecks")
|
||||||
.HasForeignKey("UserId")
|
.HasForeignKey("UserId")
|
||||||
.OnDelete(DeleteBehavior.Cascade)
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
.IsRequired();
|
.IsRequired();
|
||||||
|
|
||||||
b.HasOne("TrueCV.Domain.Entities.User", null)
|
b.HasOne("RealCV.Domain.Entities.User", null)
|
||||||
.WithMany("CVChecks")
|
.WithMany("CVChecks")
|
||||||
.HasForeignKey("UserId1");
|
.HasForeignKey("UserId1");
|
||||||
});
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("TrueCV.Domain.Entities.CVFlag", b =>
|
modelBuilder.Entity("RealCV.Domain.Entities.CVFlag", b =>
|
||||||
{
|
{
|
||||||
b.HasOne("TrueCV.Domain.Entities.CVCheck", "CVCheck")
|
b.HasOne("RealCV.Domain.Entities.CVCheck", "CVCheck")
|
||||||
.WithMany("Flags")
|
.WithMany("Flags")
|
||||||
.HasForeignKey("CVCheckId")
|
.HasForeignKey("CVCheckId")
|
||||||
.OnDelete(DeleteBehavior.Cascade)
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
@@ -460,17 +460,17 @@ namespace TrueCV.Infrastructure.Data.Migrations
|
|||||||
b.Navigation("CVCheck");
|
b.Navigation("CVCheck");
|
||||||
});
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("TrueCV.Domain.Entities.CVCheck", b =>
|
modelBuilder.Entity("RealCV.Domain.Entities.CVCheck", b =>
|
||||||
{
|
{
|
||||||
b.Navigation("Flags");
|
b.Navigation("Flags");
|
||||||
});
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("TrueCV.Domain.Entities.User", b =>
|
modelBuilder.Entity("RealCV.Domain.Entities.User", b =>
|
||||||
{
|
{
|
||||||
b.Navigation("CVChecks");
|
b.Navigation("CVChecks");
|
||||||
});
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("TrueCV.Infrastructure.Identity.ApplicationUser", b =>
|
modelBuilder.Entity("RealCV.Infrastructure.Identity.ApplicationUser", b =>
|
||||||
{
|
{
|
||||||
b.Navigation("CVChecks");
|
b.Navigation("CVChecks");
|
||||||
});
|
});
|
||||||
@@ -3,7 +3,7 @@ using Microsoft.EntityFrameworkCore.Migrations;
|
|||||||
|
|
||||||
#nullable disable
|
#nullable disable
|
||||||
|
|
||||||
namespace TrueCV.Infrastructure.Data.Migrations
|
namespace RealCV.Infrastructure.Data.Migrations
|
||||||
{
|
{
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public partial class InitialCreate : Migration
|
public partial class InitialCreate : Migration
|
||||||
@@ -5,11 +5,11 @@ using Microsoft.EntityFrameworkCore.Infrastructure;
|
|||||||
using Microsoft.EntityFrameworkCore.Metadata;
|
using Microsoft.EntityFrameworkCore.Metadata;
|
||||||
using Microsoft.EntityFrameworkCore.Migrations;
|
using Microsoft.EntityFrameworkCore.Migrations;
|
||||||
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
|
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
|
||||||
using TrueCV.Infrastructure.Data;
|
using RealCV.Infrastructure.Data;
|
||||||
|
|
||||||
#nullable disable
|
#nullable disable
|
||||||
|
|
||||||
namespace TrueCV.Infrastructure.Data.Migrations
|
namespace RealCV.Infrastructure.Data.Migrations
|
||||||
{
|
{
|
||||||
[DbContext(typeof(ApplicationDbContext))]
|
[DbContext(typeof(ApplicationDbContext))]
|
||||||
[Migration("20260120191035_AddProcessingStageToCV")]
|
[Migration("20260120191035_AddProcessingStageToCV")]
|
||||||
@@ -156,7 +156,7 @@ namespace TrueCV.Infrastructure.Data.Migrations
|
|||||||
b.ToTable("AspNetUserTokens", (string)null);
|
b.ToTable("AspNetUserTokens", (string)null);
|
||||||
});
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("TrueCV.Domain.Entities.CVCheck", b =>
|
modelBuilder.Entity("RealCV.Domain.Entities.CVCheck", b =>
|
||||||
{
|
{
|
||||||
b.Property<Guid>("Id")
|
b.Property<Guid>("Id")
|
||||||
.ValueGeneratedOnAdd()
|
.ValueGeneratedOnAdd()
|
||||||
@@ -210,7 +210,7 @@ namespace TrueCV.Infrastructure.Data.Migrations
|
|||||||
b.ToTable("CVChecks");
|
b.ToTable("CVChecks");
|
||||||
});
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("TrueCV.Domain.Entities.CVFlag", b =>
|
modelBuilder.Entity("RealCV.Domain.Entities.CVFlag", b =>
|
||||||
{
|
{
|
||||||
b.Property<Guid>("Id")
|
b.Property<Guid>("Id")
|
||||||
.ValueGeneratedOnAdd()
|
.ValueGeneratedOnAdd()
|
||||||
@@ -250,7 +250,7 @@ namespace TrueCV.Infrastructure.Data.Migrations
|
|||||||
b.ToTable("CVFlags");
|
b.ToTable("CVFlags");
|
||||||
});
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("TrueCV.Domain.Entities.CompanyCache", b =>
|
modelBuilder.Entity("RealCV.Domain.Entities.CompanyCache", b =>
|
||||||
{
|
{
|
||||||
b.Property<string>("CompanyNumber")
|
b.Property<string>("CompanyNumber")
|
||||||
.HasMaxLength(32)
|
.HasMaxLength(32)
|
||||||
@@ -292,7 +292,7 @@ namespace TrueCV.Infrastructure.Data.Migrations
|
|||||||
b.ToTable("CompanyCache");
|
b.ToTable("CompanyCache");
|
||||||
});
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("TrueCV.Infrastructure.Identity.ApplicationUser", b =>
|
modelBuilder.Entity("RealCV.Infrastructure.Identity.ApplicationUser", b =>
|
||||||
{
|
{
|
||||||
b.Property<Guid>("Id")
|
b.Property<Guid>("Id")
|
||||||
.ValueGeneratedOnAdd()
|
.ValueGeneratedOnAdd()
|
||||||
@@ -381,7 +381,7 @@ namespace TrueCV.Infrastructure.Data.Migrations
|
|||||||
|
|
||||||
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim<System.Guid>", b =>
|
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim<System.Guid>", b =>
|
||||||
{
|
{
|
||||||
b.HasOne("TrueCV.Infrastructure.Identity.ApplicationUser", null)
|
b.HasOne("RealCV.Infrastructure.Identity.ApplicationUser", null)
|
||||||
.WithMany()
|
.WithMany()
|
||||||
.HasForeignKey("UserId")
|
.HasForeignKey("UserId")
|
||||||
.OnDelete(DeleteBehavior.Cascade)
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
@@ -390,7 +390,7 @@ namespace TrueCV.Infrastructure.Data.Migrations
|
|||||||
|
|
||||||
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin<System.Guid>", b =>
|
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin<System.Guid>", b =>
|
||||||
{
|
{
|
||||||
b.HasOne("TrueCV.Infrastructure.Identity.ApplicationUser", null)
|
b.HasOne("RealCV.Infrastructure.Identity.ApplicationUser", null)
|
||||||
.WithMany()
|
.WithMany()
|
||||||
.HasForeignKey("UserId")
|
.HasForeignKey("UserId")
|
||||||
.OnDelete(DeleteBehavior.Cascade)
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
@@ -405,7 +405,7 @@ namespace TrueCV.Infrastructure.Data.Migrations
|
|||||||
.OnDelete(DeleteBehavior.Cascade)
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
.IsRequired();
|
.IsRequired();
|
||||||
|
|
||||||
b.HasOne("TrueCV.Infrastructure.Identity.ApplicationUser", null)
|
b.HasOne("RealCV.Infrastructure.Identity.ApplicationUser", null)
|
||||||
.WithMany()
|
.WithMany()
|
||||||
.HasForeignKey("UserId")
|
.HasForeignKey("UserId")
|
||||||
.OnDelete(DeleteBehavior.Cascade)
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
@@ -414,25 +414,25 @@ namespace TrueCV.Infrastructure.Data.Migrations
|
|||||||
|
|
||||||
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken<System.Guid>", b =>
|
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken<System.Guid>", b =>
|
||||||
{
|
{
|
||||||
b.HasOne("TrueCV.Infrastructure.Identity.ApplicationUser", null)
|
b.HasOne("RealCV.Infrastructure.Identity.ApplicationUser", null)
|
||||||
.WithMany()
|
.WithMany()
|
||||||
.HasForeignKey("UserId")
|
.HasForeignKey("UserId")
|
||||||
.OnDelete(DeleteBehavior.Cascade)
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
.IsRequired();
|
.IsRequired();
|
||||||
});
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("TrueCV.Domain.Entities.CVCheck", b =>
|
modelBuilder.Entity("RealCV.Domain.Entities.CVCheck", b =>
|
||||||
{
|
{
|
||||||
b.HasOne("TrueCV.Infrastructure.Identity.ApplicationUser", null)
|
b.HasOne("RealCV.Infrastructure.Identity.ApplicationUser", null)
|
||||||
.WithMany("CVChecks")
|
.WithMany("CVChecks")
|
||||||
.HasForeignKey("UserId")
|
.HasForeignKey("UserId")
|
||||||
.OnDelete(DeleteBehavior.Cascade)
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
.IsRequired();
|
.IsRequired();
|
||||||
});
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("TrueCV.Domain.Entities.CVFlag", b =>
|
modelBuilder.Entity("RealCV.Domain.Entities.CVFlag", b =>
|
||||||
{
|
{
|
||||||
b.HasOne("TrueCV.Domain.Entities.CVCheck", "CVCheck")
|
b.HasOne("RealCV.Domain.Entities.CVCheck", "CVCheck")
|
||||||
.WithMany("Flags")
|
.WithMany("Flags")
|
||||||
.HasForeignKey("CVCheckId")
|
.HasForeignKey("CVCheckId")
|
||||||
.OnDelete(DeleteBehavior.Cascade)
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
@@ -441,12 +441,12 @@ namespace TrueCV.Infrastructure.Data.Migrations
|
|||||||
b.Navigation("CVCheck");
|
b.Navigation("CVCheck");
|
||||||
});
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("TrueCV.Domain.Entities.CVCheck", b =>
|
modelBuilder.Entity("RealCV.Domain.Entities.CVCheck", b =>
|
||||||
{
|
{
|
||||||
b.Navigation("Flags");
|
b.Navigation("Flags");
|
||||||
});
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("TrueCV.Infrastructure.Identity.ApplicationUser", b =>
|
modelBuilder.Entity("RealCV.Infrastructure.Identity.ApplicationUser", b =>
|
||||||
{
|
{
|
||||||
b.Navigation("CVChecks");
|
b.Navigation("CVChecks");
|
||||||
});
|
});
|
||||||
@@ -3,7 +3,7 @@ using Microsoft.EntityFrameworkCore.Migrations;
|
|||||||
|
|
||||||
#nullable disable
|
#nullable disable
|
||||||
|
|
||||||
namespace TrueCV.Infrastructure.Data.Migrations
|
namespace RealCV.Infrastructure.Data.Migrations
|
||||||
{
|
{
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public partial class AddProcessingStageToCV : Migration
|
public partial class AddProcessingStageToCV : Migration
|
||||||
@@ -5,11 +5,11 @@ using Microsoft.EntityFrameworkCore.Infrastructure;
|
|||||||
using Microsoft.EntityFrameworkCore.Metadata;
|
using Microsoft.EntityFrameworkCore.Metadata;
|
||||||
using Microsoft.EntityFrameworkCore.Migrations;
|
using Microsoft.EntityFrameworkCore.Migrations;
|
||||||
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
|
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
|
||||||
using TrueCV.Infrastructure.Data;
|
using RealCV.Infrastructure.Data;
|
||||||
|
|
||||||
#nullable disable
|
#nullable disable
|
||||||
|
|
||||||
namespace TrueCV.Infrastructure.Data.Migrations
|
namespace RealCV.Infrastructure.Data.Migrations
|
||||||
{
|
{
|
||||||
[DbContext(typeof(ApplicationDbContext))]
|
[DbContext(typeof(ApplicationDbContext))]
|
||||||
[Migration("20260120194532_AddAuditLogTable")]
|
[Migration("20260120194532_AddAuditLogTable")]
|
||||||
@@ -156,7 +156,7 @@ namespace TrueCV.Infrastructure.Data.Migrations
|
|||||||
b.ToTable("AspNetUserTokens", (string)null);
|
b.ToTable("AspNetUserTokens", (string)null);
|
||||||
});
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("TrueCV.Domain.Entities.AuditLog", b =>
|
modelBuilder.Entity("RealCV.Domain.Entities.AuditLog", b =>
|
||||||
{
|
{
|
||||||
b.Property<Guid>("Id")
|
b.Property<Guid>("Id")
|
||||||
.ValueGeneratedOnAdd()
|
.ValueGeneratedOnAdd()
|
||||||
@@ -202,7 +202,7 @@ namespace TrueCV.Infrastructure.Data.Migrations
|
|||||||
b.ToTable("AuditLogs");
|
b.ToTable("AuditLogs");
|
||||||
});
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("TrueCV.Domain.Entities.CVCheck", b =>
|
modelBuilder.Entity("RealCV.Domain.Entities.CVCheck", b =>
|
||||||
{
|
{
|
||||||
b.Property<Guid>("Id")
|
b.Property<Guid>("Id")
|
||||||
.ValueGeneratedOnAdd()
|
.ValueGeneratedOnAdd()
|
||||||
@@ -256,7 +256,7 @@ namespace TrueCV.Infrastructure.Data.Migrations
|
|||||||
b.ToTable("CVChecks");
|
b.ToTable("CVChecks");
|
||||||
});
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("TrueCV.Domain.Entities.CVFlag", b =>
|
modelBuilder.Entity("RealCV.Domain.Entities.CVFlag", b =>
|
||||||
{
|
{
|
||||||
b.Property<Guid>("Id")
|
b.Property<Guid>("Id")
|
||||||
.ValueGeneratedOnAdd()
|
.ValueGeneratedOnAdd()
|
||||||
@@ -296,7 +296,7 @@ namespace TrueCV.Infrastructure.Data.Migrations
|
|||||||
b.ToTable("CVFlags");
|
b.ToTable("CVFlags");
|
||||||
});
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("TrueCV.Domain.Entities.CompanyCache", b =>
|
modelBuilder.Entity("RealCV.Domain.Entities.CompanyCache", b =>
|
||||||
{
|
{
|
||||||
b.Property<string>("CompanyNumber")
|
b.Property<string>("CompanyNumber")
|
||||||
.HasMaxLength(32)
|
.HasMaxLength(32)
|
||||||
@@ -338,7 +338,7 @@ namespace TrueCV.Infrastructure.Data.Migrations
|
|||||||
b.ToTable("CompanyCache");
|
b.ToTable("CompanyCache");
|
||||||
});
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("TrueCV.Infrastructure.Identity.ApplicationUser", b =>
|
modelBuilder.Entity("RealCV.Infrastructure.Identity.ApplicationUser", b =>
|
||||||
{
|
{
|
||||||
b.Property<Guid>("Id")
|
b.Property<Guid>("Id")
|
||||||
.ValueGeneratedOnAdd()
|
.ValueGeneratedOnAdd()
|
||||||
@@ -427,7 +427,7 @@ namespace TrueCV.Infrastructure.Data.Migrations
|
|||||||
|
|
||||||
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim<System.Guid>", b =>
|
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim<System.Guid>", b =>
|
||||||
{
|
{
|
||||||
b.HasOne("TrueCV.Infrastructure.Identity.ApplicationUser", null)
|
b.HasOne("RealCV.Infrastructure.Identity.ApplicationUser", null)
|
||||||
.WithMany()
|
.WithMany()
|
||||||
.HasForeignKey("UserId")
|
.HasForeignKey("UserId")
|
||||||
.OnDelete(DeleteBehavior.Cascade)
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
@@ -436,7 +436,7 @@ namespace TrueCV.Infrastructure.Data.Migrations
|
|||||||
|
|
||||||
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin<System.Guid>", b =>
|
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin<System.Guid>", b =>
|
||||||
{
|
{
|
||||||
b.HasOne("TrueCV.Infrastructure.Identity.ApplicationUser", null)
|
b.HasOne("RealCV.Infrastructure.Identity.ApplicationUser", null)
|
||||||
.WithMany()
|
.WithMany()
|
||||||
.HasForeignKey("UserId")
|
.HasForeignKey("UserId")
|
||||||
.OnDelete(DeleteBehavior.Cascade)
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
@@ -451,7 +451,7 @@ namespace TrueCV.Infrastructure.Data.Migrations
|
|||||||
.OnDelete(DeleteBehavior.Cascade)
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
.IsRequired();
|
.IsRequired();
|
||||||
|
|
||||||
b.HasOne("TrueCV.Infrastructure.Identity.ApplicationUser", null)
|
b.HasOne("RealCV.Infrastructure.Identity.ApplicationUser", null)
|
||||||
.WithMany()
|
.WithMany()
|
||||||
.HasForeignKey("UserId")
|
.HasForeignKey("UserId")
|
||||||
.OnDelete(DeleteBehavior.Cascade)
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
@@ -460,25 +460,25 @@ namespace TrueCV.Infrastructure.Data.Migrations
|
|||||||
|
|
||||||
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken<System.Guid>", b =>
|
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken<System.Guid>", b =>
|
||||||
{
|
{
|
||||||
b.HasOne("TrueCV.Infrastructure.Identity.ApplicationUser", null)
|
b.HasOne("RealCV.Infrastructure.Identity.ApplicationUser", null)
|
||||||
.WithMany()
|
.WithMany()
|
||||||
.HasForeignKey("UserId")
|
.HasForeignKey("UserId")
|
||||||
.OnDelete(DeleteBehavior.Cascade)
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
.IsRequired();
|
.IsRequired();
|
||||||
});
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("TrueCV.Domain.Entities.CVCheck", b =>
|
modelBuilder.Entity("RealCV.Domain.Entities.CVCheck", b =>
|
||||||
{
|
{
|
||||||
b.HasOne("TrueCV.Infrastructure.Identity.ApplicationUser", null)
|
b.HasOne("RealCV.Infrastructure.Identity.ApplicationUser", null)
|
||||||
.WithMany("CVChecks")
|
.WithMany("CVChecks")
|
||||||
.HasForeignKey("UserId")
|
.HasForeignKey("UserId")
|
||||||
.OnDelete(DeleteBehavior.Cascade)
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
.IsRequired();
|
.IsRequired();
|
||||||
});
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("TrueCV.Domain.Entities.CVFlag", b =>
|
modelBuilder.Entity("RealCV.Domain.Entities.CVFlag", b =>
|
||||||
{
|
{
|
||||||
b.HasOne("TrueCV.Domain.Entities.CVCheck", "CVCheck")
|
b.HasOne("RealCV.Domain.Entities.CVCheck", "CVCheck")
|
||||||
.WithMany("Flags")
|
.WithMany("Flags")
|
||||||
.HasForeignKey("CVCheckId")
|
.HasForeignKey("CVCheckId")
|
||||||
.OnDelete(DeleteBehavior.Cascade)
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
@@ -487,12 +487,12 @@ namespace TrueCV.Infrastructure.Data.Migrations
|
|||||||
b.Navigation("CVCheck");
|
b.Navigation("CVCheck");
|
||||||
});
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("TrueCV.Domain.Entities.CVCheck", b =>
|
modelBuilder.Entity("RealCV.Domain.Entities.CVCheck", b =>
|
||||||
{
|
{
|
||||||
b.Navigation("Flags");
|
b.Navigation("Flags");
|
||||||
});
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("TrueCV.Infrastructure.Identity.ApplicationUser", b =>
|
modelBuilder.Entity("RealCV.Infrastructure.Identity.ApplicationUser", b =>
|
||||||
{
|
{
|
||||||
b.Navigation("CVChecks");
|
b.Navigation("CVChecks");
|
||||||
});
|
});
|
||||||
@@ -3,7 +3,7 @@ using Microsoft.EntityFrameworkCore.Migrations;
|
|||||||
|
|
||||||
#nullable disable
|
#nullable disable
|
||||||
|
|
||||||
namespace TrueCV.Infrastructure.Data.Migrations
|
namespace RealCV.Infrastructure.Data.Migrations
|
||||||
{
|
{
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public partial class AddAuditLogTable : Migration
|
public partial class AddAuditLogTable : Migration
|
||||||
@@ -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");
|
||||||
});
|
});
|
||||||
@@ -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
|
||||||
@@ -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");
|
||||||
});
|
});
|
||||||
@@ -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
|
||||||
{
|
{
|
||||||
@@ -6,10 +6,10 @@ using System.Text.Json;
|
|||||||
using System.Text.Json.Serialization;
|
using System.Text.Json.Serialization;
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
using Microsoft.Extensions.Options;
|
using Microsoft.Extensions.Options;
|
||||||
using TrueCV.Application.DTOs;
|
using RealCV.Application.DTOs;
|
||||||
using TrueCV.Infrastructure.Configuration;
|
using RealCV.Infrastructure.Configuration;
|
||||||
|
|
||||||
namespace TrueCV.Infrastructure.ExternalApis;
|
namespace RealCV.Infrastructure.ExternalApis;
|
||||||
|
|
||||||
public sealed class CompaniesHouseClient
|
public sealed class CompaniesHouseClient
|
||||||
{
|
{
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
namespace TrueCV.Infrastructure.Helpers;
|
namespace RealCV.Infrastructure.Helpers;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Helper methods for processing AI/LLM JSON responses.
|
/// Helper methods for processing AI/LLM JSON responses.
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
using Microsoft.AspNetCore.Identity;
|
using Microsoft.AspNetCore.Identity;
|
||||||
using TrueCV.Domain.Entities;
|
using RealCV.Domain.Entities;
|
||||||
using TrueCV.Domain.Enums;
|
using RealCV.Domain.Enums;
|
||||||
|
|
||||||
namespace TrueCV.Infrastructure.Identity;
|
namespace RealCV.Infrastructure.Identity;
|
||||||
|
|
||||||
public class ApplicationUser : IdentityUser<Guid>
|
public class ApplicationUser : IdentityUser<Guid>
|
||||||
{
|
{
|
||||||
@@ -1,14 +1,14 @@
|
|||||||
using System.Text.Json;
|
using System.Text.Json;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
using TrueCV.Application.Helpers;
|
using RealCV.Application.Helpers;
|
||||||
using TrueCV.Application.Interfaces;
|
using RealCV.Application.Interfaces;
|
||||||
using TrueCV.Application.Models;
|
using RealCV.Application.Models;
|
||||||
using TrueCV.Domain.Entities;
|
using RealCV.Domain.Entities;
|
||||||
using TrueCV.Domain.Enums;
|
using RealCV.Domain.Enums;
|
||||||
using TrueCV.Infrastructure.Data;
|
using RealCV.Infrastructure.Data;
|
||||||
|
|
||||||
namespace TrueCV.Infrastructure.Jobs;
|
namespace RealCV.Infrastructure.Jobs;
|
||||||
|
|
||||||
public sealed class ProcessCVCheckJob
|
public sealed class ProcessCVCheckJob
|
||||||
{
|
{
|
||||||
@@ -1,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.
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ProjectReference Include="..\TrueCV.Application\TrueCV.Application.csproj" />
|
<ProjectReference Include="..\RealCV.Application\RealCV.Application.csproj" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
@@ -3,13 +3,13 @@ using Anthropic.SDK;
|
|||||||
using Anthropic.SDK.Messaging;
|
using Anthropic.SDK.Messaging;
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
using Microsoft.Extensions.Options;
|
using Microsoft.Extensions.Options;
|
||||||
using TrueCV.Application.Helpers;
|
using RealCV.Application.Helpers;
|
||||||
using TrueCV.Application.Interfaces;
|
using RealCV.Application.Interfaces;
|
||||||
using TrueCV.Application.Models;
|
using RealCV.Application.Models;
|
||||||
using TrueCV.Infrastructure.Configuration;
|
using RealCV.Infrastructure.Configuration;
|
||||||
using TrueCV.Infrastructure.Helpers;
|
using RealCV.Infrastructure.Helpers;
|
||||||
|
|
||||||
namespace TrueCV.Infrastructure.Services;
|
namespace RealCV.Infrastructure.Services;
|
||||||
|
|
||||||
public sealed class AICompanyNameMatcherService : ICompanyNameMatcherService
|
public sealed class AICompanyNameMatcherService : ICompanyNameMatcherService
|
||||||
{
|
{
|
||||||
@@ -1,9 +1,9 @@
|
|||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
using TrueCV.Application.Interfaces;
|
using RealCV.Application.Interfaces;
|
||||||
using TrueCV.Domain.Entities;
|
using RealCV.Domain.Entities;
|
||||||
using TrueCV.Infrastructure.Data;
|
using RealCV.Infrastructure.Data;
|
||||||
|
|
||||||
namespace TrueCV.Infrastructure.Services;
|
namespace RealCV.Infrastructure.Services;
|
||||||
|
|
||||||
public sealed class AuditService : IAuditService
|
public sealed class AuditService : IAuditService
|
||||||
{
|
{
|
||||||
@@ -2,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
|
||||||
{
|
{
|
||||||
@@ -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
|
||||||
{
|
{
|
||||||
@@ -2,15 +2,15 @@ using System.Text.Json;
|
|||||||
using FuzzySharp;
|
using FuzzySharp;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
using TrueCV.Application.DTOs;
|
using RealCV.Application.DTOs;
|
||||||
using TrueCV.Application.Helpers;
|
using RealCV.Application.Helpers;
|
||||||
using TrueCV.Application.Interfaces;
|
using RealCV.Application.Interfaces;
|
||||||
using TrueCV.Application.Models;
|
using RealCV.Application.Models;
|
||||||
using TrueCV.Domain.Entities;
|
using RealCV.Domain.Entities;
|
||||||
using TrueCV.Infrastructure.Data;
|
using RealCV.Infrastructure.Data;
|
||||||
using TrueCV.Infrastructure.ExternalApis;
|
using RealCV.Infrastructure.ExternalApis;
|
||||||
|
|
||||||
namespace TrueCV.Infrastructure.Services;
|
namespace RealCV.Infrastructure.Services;
|
||||||
|
|
||||||
public sealed class CompanyVerifierService : ICompanyVerifierService
|
public sealed class CompanyVerifierService : ICompanyVerifierService
|
||||||
{
|
{
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
using TrueCV.Application.Data;
|
using RealCV.Application.Data;
|
||||||
using TrueCV.Application.Interfaces;
|
using RealCV.Application.Interfaces;
|
||||||
using TrueCV.Application.Models;
|
using RealCV.Application.Models;
|
||||||
|
|
||||||
namespace TrueCV.Infrastructure.Services;
|
namespace RealCV.Infrastructure.Services;
|
||||||
|
|
||||||
public sealed class EducationVerifierService : IEducationVerifierService
|
public sealed class EducationVerifierService : IEducationVerifierService
|
||||||
{
|
{
|
||||||
@@ -2,10 +2,10 @@ using Azure.Storage.Blobs;
|
|||||||
using Azure.Storage.Blobs.Models;
|
using Azure.Storage.Blobs.Models;
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
using Microsoft.Extensions.Options;
|
using Microsoft.Extensions.Options;
|
||||||
using TrueCV.Application.Interfaces;
|
using RealCV.Application.Interfaces;
|
||||||
using TrueCV.Infrastructure.Configuration;
|
using RealCV.Infrastructure.Configuration;
|
||||||
|
|
||||||
namespace TrueCV.Infrastructure.Services;
|
namespace RealCV.Infrastructure.Services;
|
||||||
|
|
||||||
public sealed class FileStorageService : IFileStorageService
|
public sealed class FileStorageService : IFileStorageService
|
||||||
{
|
{
|
||||||
@@ -1,9 +1,9 @@
|
|||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
using Microsoft.Extensions.Options;
|
using Microsoft.Extensions.Options;
|
||||||
using TrueCV.Application.Interfaces;
|
using RealCV.Application.Interfaces;
|
||||||
using TrueCV.Infrastructure.Configuration;
|
using RealCV.Infrastructure.Configuration;
|
||||||
|
|
||||||
namespace TrueCV.Infrastructure.Services;
|
namespace RealCV.Infrastructure.Services;
|
||||||
|
|
||||||
public sealed class LocalFileStorageService : IFileStorageService
|
public sealed class LocalFileStorageService : IFileStorageService
|
||||||
{
|
{
|
||||||
@@ -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
|
||||||
{
|
{
|
||||||
@@ -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
|
||||||
{
|
{
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
using TrueCV.Application.Interfaces;
|
using RealCV.Application.Interfaces;
|
||||||
using TrueCV.Application.Models;
|
using RealCV.Application.Models;
|
||||||
|
|
||||||
namespace TrueCV.Infrastructure.Services;
|
namespace RealCV.Infrastructure.Services;
|
||||||
|
|
||||||
public sealed class TimelineAnalyserService : ITimelineAnalyserService
|
public sealed class TimelineAnalyserService : ITimelineAnalyserService
|
||||||
{
|
{
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
using System.Security.Claims;
|
using System.Security.Claims;
|
||||||
using Microsoft.AspNetCore.Components.Authorization;
|
using Microsoft.AspNetCore.Components.Authorization;
|
||||||
using TrueCV.Application.Interfaces;
|
using RealCV.Application.Interfaces;
|
||||||
|
|
||||||
namespace TrueCV.Infrastructure.Services;
|
namespace RealCV.Infrastructure.Services;
|
||||||
|
|
||||||
public sealed class UserContextService : IUserContextService
|
public sealed class UserContextService : IUserContextService
|
||||||
{
|
{
|
||||||
@@ -7,7 +7,7 @@
|
|||||||
<base href="/" />
|
<base href="/" />
|
||||||
<link rel="stylesheet" href="bootstrap/bootstrap.min.css" />
|
<link rel="stylesheet" href="bootstrap/bootstrap.min.css" />
|
||||||
<link rel="stylesheet" href="app.css" />
|
<link rel="stylesheet" href="app.css" />
|
||||||
<link rel="stylesheet" href="TrueCV.Web.styles.css" />
|
<link rel="stylesheet" href="RealCV.Web.styles.css" />
|
||||||
<link rel="icon" type="image/png" href="favicon.png" />
|
<link rel="icon" type="image/png" href="favicon.png" />
|
||||||
<HeadOutlet @rendermode="InteractiveServer" />
|
<HeadOutlet @rendermode="InteractiveServer" />
|
||||||
</head>
|
</head>
|
||||||
@@ -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">© @DateTime.Now.Year TrueCV. All rights reserved.</p>
|
<p class="mb-0">© @DateTime.Now.Year RealCV. All rights reserved.</p>
|
||||||
</div>
|
</div>
|
||||||
</footer>
|
</footer>
|
||||||
</div>
|
</div>
|
||||||
@@ -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>
|
||||||
@@ -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>
|
||||||
@@ -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>
|
||||||
@@ -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">
|
||||||
@@ -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;
|
||||||