Fixed CSV rate upload to use the company name provided in the upload form instead of reading it from the CSV file's companyName column. This prevents "unknown" or incorrect company names from being used.
## Changes
**Domain Layer**
- Updated `CsvRateLoaderPort` interface to accept optional `companyNameOverride` parameter
- Modified `CsvRateSearchService.loadAllRates()` to pass company name from config when loading rates
**Infrastructure Layer**
- Updated `CsvRateLoaderAdapter.loadRatesFromCsv()` to accept `companyNameOverride` parameter
- Modified `mapToCsvRate()` to use override company name if provided, otherwise fallback to CSV column value
- Added logging to show which company name is being used (from override or CSV)
**Application Layer**
- Updated CSV upload controller to pass `dto.companyName` to the loader
## Impact
- When uploading a CSV file through the admin interface, the company name from the form is now correctly used
- Existing CSV files with "unknown" in the companyName column will now show the correct company name from the database configuration
- Backward compatible: if no override is provided, the CSV column value is still used
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Added comprehensive CSV rates management interface to the frontend dashboard with full CRUD operations.
## Backend Changes
- Added `GET /api/v1/admin/csv-rates/files` endpoint to list all uploaded CSV files with metadata
- Added `DELETE /api/v1/admin/csv-rates/files/:filename` endpoint to delete CSV files and their configurations
- Both endpoints provide frontend-compatible responses with file info (filename, size, rowCount, uploadedAt)
- File deletion includes both filesystem cleanup and database configuration removal
## Frontend Changes
- Added "CSV Rates" navigation item to dashboard sidebar (ADMIN only)
- Moved CSV rates page from `/app/admin/csv-rates` to `/app/dashboard/admin/csv-rates` for proper dashboard integration
- Updated CsvUpload component to include required `companyEmail` field
- Component now properly validates and sends all required fields (companyName, companyEmail, file)
- Enhanced form validation with email input type
## Features
- ✅ Upload CSV rate files with company name and email
- ✅ List all uploaded CSV files with metadata (filename, size, row count, upload date)
- ✅ Delete CSV files with confirmation dialog
- ✅ Real-time file validation (format, size limit 10MB)
- ✅ Auto-refresh after successful operations
- ✅ ADMIN role-based access control
- ✅ Integrated into dashboard navigation
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Added two notification jobs that send Discord webhooks:
- notify-success: Sends a green embed when pipeline succeeds
- notify-failure: Sends a red embed when pipeline fails
Notifications include:
- Repository and branch information
- Commit SHA with clickable link
- Docker image names (backend & frontend)
- Link to workflow run for debugging
Requires DISCORD_WEBHOOK_URL secret to be configured in repository settings.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
The .dockerignore was excluding package-lock.json, causing npm ci to fail
with "The npm ci command can only install with an existing package-lock.json".
Commented out the package-lock.json line in .dockerignore to allow it to be
copied into the Docker build context.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
GitHub Actions cache (type=gha) is not available in Gitea, causing timeout errors.
Replaced with registry-based cache which works with any container registry.
Changes:
- Backend: cache-from/to type=registry,ref=backend:buildcache
- Frontend: cache-from/to type=registry,ref=frontend:buildcache
- Removed debug step that's no longer needed
This allows Docker layer caching while maintaining Gitea compatibility.
Images are successfully being pushed to rg.fr-par.scw.cloud/weworkstudio
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Fixed invalid Docker tag format errors:
- Removed :preprod suffix from base image names in metadata action
- docker/metadata-action already adds branch-based tags automatically
- Unified registry to rg.fr-par.scw.cloud/weworkstudio for both backend and frontend
- This fixes "invalid reference format" error
Before: backend:preprod:preprod (invalid - duplicate tags)
After: backend:preprod (valid)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Set explicit "builder": "tsc" in nest-cli.json
- Simplified tsconfig.build.json to only extend base config
- Updated build script back to `nest build && tsc-alias`
This ensures NestJS uses the TypeScript compiler that properly respects path mappings in tsconfig.json.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Changed build script from `nest build` to `tsc -p tsconfig.build.json`
- This ensures TypeScript path aliases (@domain/*, @application/*, @infrastructure/*) are properly resolved during compilation
- tsc-alias then converts the resolved paths to relative imports in the output
- Reverted tsconfig.json to original baseUrl: "./" configuration
- Added explicit path aliases to tsconfig.build.json for clarity
Root cause: NestJS's `nest build` command doesn't fully support TypeScript path aliases out of the box. Using `tsc` directly ensures proper path resolution.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Changed baseUrl from "./" to "./src" and updated paths to be relative
to src directory. This allows TypeScript to correctly resolve imports
using @domain/*, @application/*, and @infrastructure/* aliases during
compilation.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Fixed the deploy-preprod.yml workflow to match the actual project structure.
## Problem
The workflow was configured for a monorepo structure (apps/backend/, apps/frontend/)
but the project is actually a single backend repository with all code at the root.
This caused the CI/CD pipeline to fail as it couldn't find files in apps/backend/.
## Changes Made
### Backend Job (backend-build-test)
- Removed `working-directory: ./apps/backend` directive
- Changed `cache-dependency-path` from `apps/backend/package-lock.json` to `package-lock.json`
- Changed artifact upload path from `apps/backend/dist` to `dist`
### Docker Build (backend-docker)
- Changed Dockerfile path from `./apps/backend/Dockerfile` to `./Dockerfile`
### Frontend Jobs Removed
- Deleted `frontend-build-test` job (no frontend in this repo)
- Deleted `frontend-docker` job
- Removed frontend deployment steps from `deploy-preprod` job
- Removed frontend health checks and smoke tests
- Updated deployment notifications to only show backend
### Dependencies
- Updated `deploy-preprod` job to only depend on `backend-docker`
- Removed all references to `frontend-build-test` and `frontend-docker`
## Verification
✅ Local build successful: `npm run build`
✅ All 102 unit tests passing: `npm test`
✅ ESLint validation passes: `npm run lint`
✅ dist/ directory created (3.7MB)
✅ Workflow file validates without errors
This fix ensures the CI/CD pipeline will work correctly with the actual project structure.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Fixed the backend build failure that was causing 95 TypeScript compilation errors.
## Problem
TypeScript compiler could not resolve path aliases (@domain/*, @application/*,
@infrastructure/*) during the build process, resulting in "Cannot find module" errors.
## Root Cause
The tsconfig.json had `baseUrl: "."` instead of `baseUrl: "./"`, which caused
module resolution to fail when NestJS performed the build.
## Solution
Changed `baseUrl` from `"."` to `"./"` in apps/backend/tsconfig.json to ensure
TypeScript properly resolves the path aliases relative to the project root.
## Verification
- ✅ Build completes without errors
- ✅ All 102 unit tests passing
- ✅ ESLint validation passes
- ✅ tsc-alias correctly converts path aliases to relative imports in dist/
This fix unblocks the CI/CD pipeline for preprod deployment.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Replace all ../../domain/ imports with @domain/ across 67 files
- Configure NestJS to use tsconfig.build.json with rootDir
- Add tsc-alias to resolve path aliases after build
- This fixes 'Cannot find module' TypeScript compilation errors
Fixed files:
- 30 files in application layer
- 37 files in infrastructure layer
- Replace all ../../domain/ imports with @domain/ across 67 files
- Configure NestJS to use tsconfig.build.json with rootDir
- Add tsc-alias to resolve path aliases after build
- This fixes 'Cannot find module' TypeScript compilation errors
Fixed files:
- 30 files in application layer
- 37 files in infrastructure layer
Replace all @domain/ports/out/* imports with relative paths to fix TypeScript
compilation errors in CI/CD environment.
The issue was that TypeScript compiler (tsc) used by nest build doesn't
resolve path aliases by default. While tsconfig-paths works at runtime and
in development, it doesn't help during compilation.
Changes:
- Convert @domain/ports/out/* to relative paths (../../domain/ports/out/, etc.)
- Remove tsc-alias dependency (no longer needed)
- Revert build script to "nest build" only
This ensures the build works consistently in both local and CI/CD environments.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Add tsc-alias to resolve @domain/*, @application/*, and @infrastructure/*
path aliases to relative paths in the compiled JavaScript output.
This fixes the 95 TypeScript "Cannot find module" errors in CI/CD that
occurred because nest build (tsc) doesn't resolve path aliases by default.
Changes:
- Install tsc-alias as dev dependency
- Update build script to run tsc-alias after nest build
- Remove temporary fix-imports.js script
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>