diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md deleted file mode 100644 index 00bc2ce..0000000 --- a/.github/CONTRIBUTING.md +++ /dev/null @@ -1,125 +0,0 @@ -# Contributing to StellarAid API - -Thank you for your interest in contributing! Please follow these guidelines to ensure a smooth contribution process. - -## Prerequisites - -Before submitting a pull request, ensure you have: - -- Node.js 20+ installed -- npm installed - -## Development Workflow - -### 1. Install Dependencies - -```bash -npm ci -``` - -### 2. Before Making Any Changes - -Run the following commands to ensure your environment is working: - -```bash -# Check for linting errors -npm run lint - -# Build the project -npm run build - -# Run tests -npm test -``` - -### 3. Making Changes - -1. Create a new branch for your feature/fix: - ```bash - git checkout -b feature/your-feature-name - ``` - -2. Make your changes - -3. **ALWAYS** run the following before committing: - ```bash - npm run lint # Fix any linting errors - npm run build # Ensure project builds successfully - npm test # Ensure all tests pass - ``` - -### 4. Adding New Tests - -If you add new test files (`.spec.ts` or `.test.ts`), they **MUST** pass in CI: - -```bash -# Run specific test file -npm test -- your-new-file.spec.ts - -# Run all tests -npm test -``` - -## CI/CD Requirements - -All pull requests must pass these automated checks: - -| Check | Description | Required | -|-------|-------------|----------| -| **Lint** | ESLint checks for code quality | ✅ Yes | -| **Build** | TypeScript compilation | ✅ Yes | -| **Tests** | All Jest tests must pass | ✅ Yes | - -If any check fails, the PR cannot be merged. - -## Pull Request Process - -1. Update your local branch with the latest changes from `main`: - ```bash - git pull origin main - ``` - -2. Resolve any merge conflicts - -3. Run the full check suite one more time: - ```bash - npm run lint && npm run build && npm test - ``` - -4. Push your branch and create a Pull Request - -5. Fill out the PR template completely - -6. Wait for all CI checks to pass - -7. Request review from maintainers - -## Common Issues - -### Lint Errors - -If you see ESLint errors, try auto-fixing them: - -```bash -npm run lint -``` - -### Build Errors - -Ensure TypeScript compiles without errors: - -```bash -npm run build -``` - -### Test Failures - -Run tests with coverage to see what's failing: - -```bash -npm run test:cov -``` - -## Questions? - -If you have questions, please open an issue for discussion before submitting a PR. diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md deleted file mode 100644 index 0d93ef9..0000000 --- a/.github/pull_request_template.md +++ /dev/null @@ -1,37 +0,0 @@ -## Description - - - -## Type of Change - - - -- [ ] Bug fix (non-breaking change which fixes an issue) -- [ ] New feature (non-breaking change which adds functionality) -- [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected) -- [ ] Test addition/improvement - -## Checklist - - - -- [ ] I have run `npm run build` successfully with no errors -- [ ] I have run `npm test` and all tests pass -- [ ] If I added new test files, they all pass -- [ ] My code follows the project's style guidelines -- [ ] I have performed a self-review of my code - -## CI/CD Requirements - -The following checks will run automatically on this PR: - -1. ✅ **Build Check** - Ensures the project builds successfully -2. ✅ **Test Check** - Ensures all tests pass (including any new test files) - -## Screenshots (if applicable) - - - -## Closes - - diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index cc3c64d..da271e1 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -8,58 +8,23 @@ on: jobs: build: - name: Build Check runs-on: ubuntu-latest + steps: - - name: Checkout code - uses: actions/checkout@v4 + - uses: actions/checkout@v4 - - name: Setup Node.js - uses: actions/setup-node@v4 - with: - node-version: '20' - cache: 'npm' + - name: Use Node.js + uses: actions/setup-node@v4 + with: + node-version: '20' + cache: 'npm' + cache-dependency-path: apps/backend/package-lock.json - - name: Install dependencies - run: npm ci + - name: Install dependencies + run: npm ci - - name: Build project - run: npm run build + - name: Build + run: npm run build - test: - name: Test Check - runs-on: ubuntu-latest - needs: build - - steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Setup Node.js - uses: actions/setup-node@v4 - with: - node-version: '20' - cache: 'npm' - - - name: Install dependencies - run: npm ci - - - name: Run tests - run: npm test - - - name: Check for new test files - if: github.event_name == 'pull_request' - run: | - echo "Checking for new test files in PR..." - git fetch origin ${{ github.base_ref }} --depth=1 - NEW_TEST_FILES=$(git diff --name-only --diff-filter=A origin/${{ github.base_ref }} | grep -E '\.(spec|test)\.(ts|js)$' || true) - if [ -n "$NEW_TEST_FILES" ]; then - echo "New test files detected:" - echo "$NEW_TEST_FILES" - echo "" - echo "Running tests to ensure new test files pass..." - npm test -- --findRelatedTests $NEW_TEST_FILES --passWithNoTests - else - echo "No new test files added in this PR." - fi + diff --git a/coverage/clover.xml b/coverage/clover.xml deleted file mode 100644 index 4d2ab73..0000000 --- a/coverage/clover.xml +++ /dev/null @@ -1,1750 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/coverage/coverage-final.json b/coverage/coverage-final.json deleted file mode 100644 index 4911fd1..0000000 --- a/coverage/coverage-final.json +++ /dev/null @@ -1,78 +0,0 @@ -{"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\app.controller.ts": {"path":"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\app.controller.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":49}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":43}},"2":{"start":{"line":5,"column":7},"end":{"line":12,"column":null}},"3":{"start":{"line":6,"column":31},"end":{"line":6,"column":43}},"4":{"start":{"line":10,"column":4},"end":{"line":10,"column":38}},"5":{"start":{"line":5,"column":13},"end":{"line":5,"column":26}},"6":{"start":{"line":9,"column":2},"end":{"line":11,"column":null}},"7":{"start":{"line":5,"column":13},"end":{"line":12,"column":null}}},"fnMap":{"0":{"name":"(anonymous_2)","decl":{"start":{"line":6,"column":2},"end":{"line":6,"column":31}},"loc":{"start":{"line":6,"column":53},"end":{"line":6,"column":57}}},"1":{"name":"(anonymous_3)","decl":{"start":{"line":9,"column":2},"end":{"line":9,"column":10}},"loc":{"start":{"line":9,"column":10},"end":{"line":11,"column":3}}}},"branchMap":{"0":{"loc":{"start":{"line":6,"column":43},"end":{"line":6,"column":56}},"type":"cond-expr","locations":[{"start":{"line":6,"column":53},"end":{"line":6,"column":56}},{"start":{"line":6,"column":53},"end":{"line":6,"column":56}}]},"1":{"loc":{"start":{"line":6,"column":43},"end":{"line":6,"column":53}},"type":"binary-expr","locations":[{"start":{"line":6,"column":43},"end":{"line":6,"column":56}},{"start":{"line":6,"column":43},"end":{"line":6,"column":53}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0},"f":{"0":0,"1":0},"b":{"0":[0,0],"1":[0,0]}} -,"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\app.module.ts": {"path":"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\app.module.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":40}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":49}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":43}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":46}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":60}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":48}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":51}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":46}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":54}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":60}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":48}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":63}},"12":{"start":{"line":33,"column":7},"end":{"line":33,"column":null}},"13":{"start":{"line":33,"column":13},"end":{"line":33,"column":22}},"14":{"start":{"line":33,"column":13},"end":{"line":33,"column":null}}},"fnMap":{},"branchMap":{},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0},"f":{},"b":{}} -,"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\app.service.ts": {"path":"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\app.service.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":44}},"1":{"start":{"line":4,"column":7},"end":{"line":8,"column":null}},"2":{"start":{"line":6,"column":4},"end":{"line":6,"column":26}},"3":{"start":{"line":4,"column":13},"end":{"line":4,"column":23}},"4":{"start":{"line":4,"column":13},"end":{"line":8,"column":null}}},"fnMap":{"0":{"name":"(anonymous_1)","decl":{"start":{"line":5,"column":2},"end":{"line":5,"column":10}},"loc":{"start":{"line":5,"column":10},"end":{"line":7,"column":3}}}},"branchMap":{},"s":{"0":0,"1":0,"2":0,"3":0,"4":0},"f":{"0":0},"b":{}} -,"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\main.ts": {"path":"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\main.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":43}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":41}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":48}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":56}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":65}},"5":{"start":{"line":8,"column":2},"end":{"line":86,"column":3}},"6":{"start":{"line":9,"column":16},"end":{"line":9,"column":51}},"7":{"start":{"line":11,"column":4},"end":{"line":20,"column":6}},"8":{"start":{"line":23,"column":19},"end":{"line":23,"column":41}},"9":{"start":{"line":27,"column":6},"end":{"line":28,"column":43}},"10":{"start":{"line":29,"column":4},"end":{"line":67,"column":5}},"11":{"start":{"line":30,"column":21},"end":{"line":50,"column":16}},"12":{"start":{"line":52,"column":23},"end":{"line":52,"column":64}},"13":{"start":{"line":53,"column":6},"end":{"line":58,"column":9}},"14":{"start":{"line":61,"column":6},"end":{"line":63,"column":9}},"15":{"start":{"line":62,"column":8},"end":{"line":62,"column":27}},"16":{"start":{"line":65,"column":6},"end":{"line":65,"column":53}},"17":{"start":{"line":66,"column":6},"end":{"line":66,"column":60}},"18":{"start":{"line":69,"column":4},"end":{"line":69,"column":47}},"19":{"start":{"line":71,"column":4},"end":{"line":73,"column":6}},"20":{"start":{"line":76,"column":4},"end":{"line":84,"column":5}},"21":{"start":{"line":77,"column":21},"end":{"line":77,"column":56}},"22":{"start":{"line":78,"column":24},"end":{"line":78,"column":49}},"23":{"start":{"line":79,"column":6},"end":{"line":79,"column":68}},"24":{"start":{"line":83,"column":6},"end":{"line":83,"column":66}},"25":{"start":{"line":85,"column":4},"end":{"line":85,"column":20}},"26":{"start":{"line":88,"column":0},"end":{"line":88,"column":12}}},"fnMap":{"0":{"name":"bootstrap","decl":{"start":{"line":7,"column":15},"end":{"line":7,"column":24}},"loc":{"start":{"line":7,"column":24},"end":{"line":87,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":61,"column":28},"end":{"line":61,"column":29}},"loc":{"start":{"line":61,"column":41},"end":{"line":63,"column":7}}}},"branchMap":{"0":{"loc":{"start":{"line":27,"column":6},"end":{"line":28,"column":43}},"type":"binary-expr","locations":[{"start":{"line":27,"column":6},"end":{"line":27,"column":43}},{"start":{"line":28,"column":6},"end":{"line":28,"column":43}}]},"1":{"loc":{"start":{"line":29,"column":4},"end":{"line":67,"column":5}},"type":"if","locations":[{"start":{"line":29,"column":4},"end":{"line":67,"column":5}},{"start":{},"end":{}}]},"2":{"loc":{"start":{"line":69,"column":21},"end":{"line":69,"column":45}},"type":"binary-expr","locations":[{"start":{"line":69,"column":21},"end":{"line":69,"column":37}},{"start":{"line":69,"column":41},"end":{"line":69,"column":45}}]},"3":{"loc":{"start":{"line":72,"column":50},"end":{"line":72,"column":74}},"type":"binary-expr","locations":[{"start":{"line":72,"column":50},"end":{"line":72,"column":66}},{"start":{"line":72,"column":70},"end":{"line":72,"column":74}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0},"f":{"0":0,"1":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0]}} -,"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\auth\\auth.controller.ts": {"path":"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\auth\\auth.controller.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":11,"column":0},"end":{"line":11,"column":45}},"2":{"start":{"line":12,"column":0},"end":{"line":12,"column":null}},"3":{"start":{"line":23,"column":0},"end":{"line":23,"column":49}},"4":{"start":{"line":24,"column":0},"end":{"line":24,"column":43}},"5":{"start":{"line":25,"column":0},"end":{"line":25,"column":56}},"6":{"start":{"line":26,"column":0},"end":{"line":26,"column":70}},"7":{"start":{"line":27,"column":0},"end":{"line":27,"column":58}},"8":{"start":{"line":28,"column":0},"end":{"line":28,"column":58}},"9":{"start":{"line":29,"column":0},"end":{"line":29,"column":55}},"10":{"start":{"line":34,"column":7},"end":{"line":131,"column":null}},"11":{"start":{"line":35,"column":31},"end":{"line":35,"column":44}},"12":{"start":{"line":48,"column":4},"end":{"line":48,"column":50}},"13":{"start":{"line":65,"column":4},"end":{"line":65,"column":49}},"14":{"start":{"line":80,"column":4},"end":{"line":80,"column":20}},"15":{"start":{"line":96,"column":4},"end":{"line":96,"column":56}},"16":{"start":{"line":112,"column":4},"end":{"line":112,"column":70}},"17":{"start":{"line":129,"column":4},"end":{"line":129,"column":58}},"18":{"start":{"line":34,"column":13},"end":{"line":34,"column":27}},"19":{"start":{"line":47,"column":8},"end":{"line":49,"column":null}},"20":{"start":{"line":61,"column":8},"end":{"line":66,"column":null}},"21":{"start":{"line":79,"column":8},"end":{"line":81,"column":null}},"22":{"start":{"line":93,"column":8},"end":{"line":97,"column":null}},"23":{"start":{"line":109,"column":8},"end":{"line":113,"column":null}},"24":{"start":{"line":126,"column":8},"end":{"line":130,"column":null}},"25":{"start":{"line":34,"column":13},"end":{"line":131,"column":null}}},"fnMap":{"0":{"name":"(anonymous_4)","decl":{"start":{"line":35,"column":2},"end":{"line":35,"column":31}},"loc":{"start":{"line":35,"column":55},"end":{"line":35,"column":59}}},"1":{"name":"(anonymous_5)","decl":{"start":{"line":47,"column":8},"end":{"line":47,"column":16}},"loc":{"start":{"line":47,"column":49},"end":{"line":49,"column":3}}},"2":{"name":"(anonymous_6)","decl":{"start":{"line":61,"column":8},"end":{"line":61,"column":13}},"loc":{"start":{"line":63,"column":18},"end":{"line":66,"column":3}}},"3":{"name":"(anonymous_7)","decl":{"start":{"line":79,"column":8},"end":{"line":79,"column":18}},"loc":{"start":{"line":79,"column":33},"end":{"line":81,"column":3}}},"4":{"name":"(anonymous_8)","decl":{"start":{"line":93,"column":8},"end":{"line":93,"column":19}},"loc":{"start":{"line":94,"column":42},"end":{"line":97,"column":3}}},"5":{"name":"(anonymous_9)","decl":{"start":{"line":109,"column":8},"end":{"line":109,"column":26}},"loc":{"start":{"line":110,"column":56},"end":{"line":113,"column":3}}},"6":{"name":"(anonymous_10)","decl":{"start":{"line":126,"column":8},"end":{"line":126,"column":20}},"loc":{"start":{"line":127,"column":44},"end":{"line":130,"column":3}}}},"branchMap":{"0":{"loc":{"start":{"line":47,"column":38},"end":{"line":47,"column":52}},"type":"cond-expr","locations":[{"start":{"line":47,"column":49},"end":{"line":47,"column":52}},{"start":{"line":47,"column":49},"end":{"line":47,"column":52}}]},"1":{"loc":{"start":{"line":47,"column":38},"end":{"line":47,"column":49}},"type":"binary-expr","locations":[{"start":{"line":47,"column":38},"end":{"line":47,"column":52}},{"start":{"line":47,"column":38},"end":{"line":47,"column":49}}]},"2":{"loc":{"start":{"line":47,"column":52},"end":{"line":47,"column":null}},"type":"cond-expr","locations":[{"start":{"line":47,"column":59},"end":{"line":47,"column":null}},{"start":{"line":47,"column":59},"end":{"line":47,"column":null}}]},"3":{"loc":{"start":{"line":47,"column":52},"end":{"line":47,"column":59}},"type":"binary-expr","locations":[{"start":{"line":47,"column":52},"end":{"line":47,"column":null}},{"start":{"line":47,"column":52},"end":{"line":47,"column":59}}]},"4":{"loc":{"start":{"line":62,"column":22},"end":{"line":62,"column":null}},"type":"cond-expr","locations":[{"start":{"line":62,"column":30},"end":{"line":62,"column":null}},{"start":{"line":62,"column":30},"end":{"line":62,"column":null}}]},"5":{"loc":{"start":{"line":62,"column":22},"end":{"line":62,"column":30}},"type":"binary-expr","locations":[{"start":{"line":62,"column":22},"end":{"line":62,"column":null}},{"start":{"line":62,"column":22},"end":{"line":62,"column":30}}]},"6":{"loc":{"start":{"line":64,"column":5},"end":{"line":64,"column":null}},"type":"cond-expr","locations":[{"start":{"line":64,"column":12},"end":{"line":64,"column":null}},{"start":{"line":64,"column":12},"end":{"line":64,"column":null}}]},"7":{"loc":{"start":{"line":64,"column":5},"end":{"line":64,"column":12}},"type":"binary-expr","locations":[{"start":{"line":64,"column":5},"end":{"line":64,"column":null}},{"start":{"line":64,"column":5},"end":{"line":64,"column":12}}]},"8":{"loc":{"start":{"line":94,"column":28},"end":{"line":94,"column":null}},"type":"cond-expr","locations":[{"start":{"line":94,"column":42},"end":{"line":94,"column":null}},{"start":{"line":94,"column":42},"end":{"line":94,"column":null}}]},"9":{"loc":{"start":{"line":94,"column":28},"end":{"line":94,"column":42}},"type":"binary-expr","locations":[{"start":{"line":94,"column":28},"end":{"line":94,"column":null}},{"start":{"line":94,"column":28},"end":{"line":94,"column":42}}]},"10":{"loc":{"start":{"line":95,"column":5},"end":{"line":95,"column":null}},"type":"cond-expr","locations":[{"start":{"line":95,"column":12},"end":{"line":95,"column":null}},{"start":{"line":95,"column":12},"end":{"line":95,"column":null}}]},"11":{"loc":{"start":{"line":95,"column":5},"end":{"line":95,"column":12}},"type":"binary-expr","locations":[{"start":{"line":95,"column":5},"end":{"line":95,"column":null}},{"start":{"line":95,"column":5},"end":{"line":95,"column":12}}]},"12":{"loc":{"start":{"line":110,"column":35},"end":{"line":110,"column":null}},"type":"cond-expr","locations":[{"start":{"line":110,"column":56},"end":{"line":110,"column":null}},{"start":{"line":110,"column":56},"end":{"line":110,"column":null}}]},"13":{"loc":{"start":{"line":110,"column":35},"end":{"line":110,"column":56}},"type":"binary-expr","locations":[{"start":{"line":110,"column":35},"end":{"line":110,"column":null}},{"start":{"line":110,"column":35},"end":{"line":110,"column":56}}]},"14":{"loc":{"start":{"line":111,"column":5},"end":{"line":111,"column":null}},"type":"cond-expr","locations":[{"start":{"line":111,"column":12},"end":{"line":111,"column":null}},{"start":{"line":111,"column":12},"end":{"line":111,"column":null}}]},"15":{"loc":{"start":{"line":111,"column":5},"end":{"line":111,"column":12}},"type":"binary-expr","locations":[{"start":{"line":111,"column":5},"end":{"line":111,"column":null}},{"start":{"line":111,"column":5},"end":{"line":111,"column":12}}]},"16":{"loc":{"start":{"line":127,"column":29},"end":{"line":127,"column":null}},"type":"cond-expr","locations":[{"start":{"line":127,"column":44},"end":{"line":127,"column":null}},{"start":{"line":127,"column":44},"end":{"line":127,"column":null}}]},"17":{"loc":{"start":{"line":127,"column":29},"end":{"line":127,"column":44}},"type":"binary-expr","locations":[{"start":{"line":127,"column":29},"end":{"line":127,"column":null}},{"start":{"line":127,"column":29},"end":{"line":127,"column":44}}]},"18":{"loc":{"start":{"line":128,"column":5},"end":{"line":128,"column":null}},"type":"cond-expr","locations":[{"start":{"line":128,"column":12},"end":{"line":128,"column":null}},{"start":{"line":128,"column":12},"end":{"line":128,"column":null}}]},"19":{"loc":{"start":{"line":128,"column":5},"end":{"line":128,"column":12}},"type":"binary-expr","locations":[{"start":{"line":128,"column":5},"end":{"line":128,"column":null}},{"start":{"line":128,"column":5},"end":{"line":128,"column":12}}]},"20":{"loc":{"start":{"line":35,"column":44},"end":{"line":35,"column":58}},"type":"cond-expr","locations":[{"start":{"line":35,"column":55},"end":{"line":35,"column":58}},{"start":{"line":35,"column":55},"end":{"line":35,"column":58}}]},"21":{"loc":{"start":{"line":35,"column":44},"end":{"line":35,"column":55}},"type":"binary-expr","locations":[{"start":{"line":35,"column":44},"end":{"line":35,"column":58}},{"start":{"line":35,"column":44},"end":{"line":35,"column":55}}]}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":13,"12":2,"13":2,"14":2,"15":2,"16":2,"17":3,"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1},"f":{"0":13,"1":2,"2":2,"3":2,"4":2,"5":2,"6":3},"b":{"0":[1,0],"1":[1,1],"2":[1,0],"3":[1,1],"4":[1,0],"5":[1,1],"6":[1,0],"7":[1,1],"8":[1,0],"9":[1,1],"10":[1,0],"11":[1,1],"12":[1,0],"13":[1,1],"14":[1,0],"15":[1,1],"16":[1,0],"17":[1,1],"18":[1,0],"19":[1,1],"20":[1,0],"21":[1,1]}} -,"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\auth\\auth.module.ts": {"path":"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\auth\\auth.module.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":7,"column":0},"end":{"line":7,"column":51}},"2":{"start":{"line":8,"column":0},"end":{"line":8,"column":50}},"3":{"start":{"line":9,"column":0},"end":{"line":9,"column":40}},"4":{"start":{"line":10,"column":0},"end":{"line":10,"column":61}},"5":{"start":{"line":11,"column":0},"end":{"line":11,"column":41}},"6":{"start":{"line":12,"column":0},"end":{"line":12,"column":48}},"7":{"start":{"line":13,"column":0},"end":{"line":13,"column":53}},"8":{"start":{"line":15,"column":0},"end":{"line":15,"column":56}},"9":{"start":{"line":16,"column":0},"end":{"line":16,"column":93}},"10":{"start":{"line":17,"column":0},"end":{"line":17,"column":63}},"11":{"start":{"line":18,"column":0},"end":{"line":18,"column":55}},"12":{"start":{"line":43,"column":7},"end":{"line":49,"column":null}},"13":{"start":{"line":45,"column":4},"end":{"line":47,"column":59}},"14":{"start":{"line":43,"column":13},"end":{"line":43,"column":23}},"15":{"start":{"line":43,"column":13},"end":{"line":49,"column":null}},"16":{"start":{"line":27,"column":46},"end":{"line":32,"column":8}}},"fnMap":{"0":{"name":"(anonymous_1)","decl":{"start":{"line":44,"column":2},"end":{"line":44,"column":11}},"loc":{"start":{"line":44,"column":40},"end":{"line":48,"column":3}}},"1":{"name":"(anonymous_2)","decl":{"start":{"line":27,"column":18},"end":{"line":27,"column":19}},"loc":{"start":{"line":27,"column":46},"end":{"line":32,"column":8}}}},"branchMap":{},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0},"f":{"0":0,"1":0},"b":{}} -,"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\auth\\dto\\auth-response.dto.ts": {"path":"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\auth\\dto\\auth-response.dto.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":46}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":59}},"2":{"start":{"line":4,"column":0},"end":{"line":4,"column":13}},"3":{"start":{"line":10,"column":2},"end":{"line":10,"column":null}},"4":{"start":{"line":17,"column":2},"end":{"line":17,"column":null}},"5":{"start":{"line":23,"column":2},"end":{"line":23,"column":null}},"6":{"start":{"line":29,"column":2},"end":{"line":29,"column":null}},"7":{"start":{"line":35,"column":2},"end":{"line":35,"column":null}},"8":{"start":{"line":42,"column":2},"end":{"line":42,"column":null}},"9":{"start":{"line":48,"column":2},"end":{"line":48,"column":null}},"10":{"start":{"line":51,"column":0},"end":{"line":51,"column":13}},"11":{"start":{"line":56,"column":2},"end":{"line":56,"column":null}},"12":{"start":{"line":62,"column":2},"end":{"line":62,"column":null}},"13":{"start":{"line":68,"column":2},"end":{"line":68,"column":null}}},"fnMap":{},"branchMap":{"0":{"loc":{"start":{"line":42,"column":8},"end":{"line":42,"column":17}},"type":"cond-expr","locations":[{"start":{"line":42,"column":16},"end":{"line":42,"column":17}},{"start":{"line":42,"column":16},"end":{"line":42,"column":17}}]},"1":{"loc":{"start":{"line":42,"column":8},"end":{"line":42,"column":16}},"type":"binary-expr","locations":[{"start":{"line":42,"column":8},"end":{"line":42,"column":17}},{"start":{"line":42,"column":8},"end":{"line":42,"column":16}}]}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1},"f":{},"b":{"0":[0,1],"1":[1,1]}} -,"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\auth\\dto\\login.dto.ts": {"path":"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\auth\\dto\\login.dto.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":64}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":46}},"2":{"start":{"line":4,"column":0},"end":{"line":4,"column":13}},"3":{"start":{"line":12,"column":2},"end":{"line":12,"column":null}},"4":{"start":{"line":21,"column":2},"end":{"line":21,"column":null}}},"fnMap":{},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1,"4":1},"f":{},"b":{}} -,"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\auth\\dto\\refresh-token.dto.ts": {"path":"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\auth\\dto\\refresh-token.dto.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":55}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":46}},"2":{"start":{"line":4,"column":0},"end":{"line":4,"column":13}},"3":{"start":{"line":11,"column":2},"end":{"line":11,"column":null}}},"fnMap":{},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1},"f":{},"b":{}} -,"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\auth\\dto\\register.dto.ts": {"path":"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\auth\\dto\\register.dto.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":10,"column":0},"end":{"line":10,"column":67}},"2":{"start":{"line":11,"column":0},"end":{"line":11,"column":59}},"3":{"start":{"line":13,"column":0},"end":{"line":13,"column":13}},"4":{"start":{"line":21,"column":2},"end":{"line":21,"column":null}},"5":{"start":{"line":39,"column":2},"end":{"line":39,"column":null}},"6":{"start":{"line":48,"column":2},"end":{"line":48,"column":null}},"7":{"start":{"line":57,"column":2},"end":{"line":57,"column":null}},"8":{"start":{"line":66,"column":2},"end":{"line":66,"column":null}},"9":{"start":{"line":75,"column":2},"end":{"line":75,"column":null}}},"fnMap":{},"branchMap":{"0":{"loc":{"start":{"line":75,"column":9},"end":{"line":75,"column":18}},"type":"cond-expr","locations":[{"start":{"line":75,"column":17},"end":{"line":75,"column":18}},{"start":{"line":75,"column":17},"end":{"line":75,"column":18}}]},"1":{"loc":{"start":{"line":75,"column":9},"end":{"line":75,"column":17}},"type":"binary-expr","locations":[{"start":{"line":75,"column":9},"end":{"line":75,"column":18}},{"start":{"line":75,"column":9},"end":{"line":75,"column":17}}]}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1},"f":{},"b":{"0":[0,1],"1":[1,1]}} -,"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\auth\\dto\\resend-verification.dto.ts": {"path":"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\auth\\dto\\resend-verification.dto.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":54}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":46}},"2":{"start":{"line":4,"column":0},"end":{"line":4,"column":13}},"3":{"start":{"line":12,"column":2},"end":{"line":12,"column":null}}},"fnMap":{},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1},"f":{},"b":{}} -,"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\auth\\dto\\verify-email.dto.ts": {"path":"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\auth\\dto\\verify-email.dto.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":55}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":46}},"2":{"start":{"line":4,"column":0},"end":{"line":4,"column":13}},"3":{"start":{"line":11,"column":2},"end":{"line":11,"column":null}}},"fnMap":{},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1},"f":{},"b":{}} -,"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\auth\\providers\\auth.service.ts": {"path":"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\auth\\providers\\auth.service.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":11,"column":0},"end":{"line":11,"column":41}},"2":{"start":{"line":12,"column":0},"end":{"line":12,"column":51}},"3":{"start":{"line":13,"column":0},"end":{"line":13,"column":37}},"4":{"start":{"line":14,"column":0},"end":{"line":14,"column":33}},"5":{"start":{"line":15,"column":0},"end":{"line":15,"column":33}},"6":{"start":{"line":16,"column":0},"end":{"line":16,"column":47}},"7":{"start":{"line":17,"column":0},"end":{"line":17,"column":54}},"8":{"start":{"line":21,"column":0},"end":{"line":21,"column":59}},"9":{"start":{"line":27,"column":0},"end":{"line":27,"column":61}},"10":{"start":{"line":32,"column":24},"end":{"line":495,"column":null}},"11":{"start":{"line":33,"column":28},"end":{"line":33,"column":56}},"12":{"start":{"line":37,"column":12},"end":{"line":37,"column":28}},"13":{"start":{"line":38,"column":12},"end":{"line":38,"column":24}},"14":{"start":{"line":39,"column":12},"end":{"line":39,"column":27}},"15":{"start":{"line":47,"column":17},"end":{"line":47,"column":77}},"16":{"start":{"line":48,"column":4},"end":{"line":50,"column":5}},"17":{"start":{"line":49,"column":6},"end":{"line":49,"column":52}},"18":{"start":{"line":52,"column":27},"end":{"line":54,"column":null}},"19":{"start":{"line":56,"column":4},"end":{"line":58,"column":5}},"20":{"start":{"line":57,"column":6},"end":{"line":57,"column":71}},"21":{"start":{"line":61,"column":23},"end":{"line":61,"column":25}},"22":{"start":{"line":62,"column":19},"end":{"line":62,"column":71}},"23":{"start":{"line":65,"column":4},"end":{"line":65,"column":27}},"24":{"start":{"line":66,"column":4},"end":{"line":66,"column":33}},"25":{"start":{"line":67,"column":4},"end":{"line":67,"column":41}},"26":{"start":{"line":70,"column":4},"end":{"line":85,"column":5}},"27":{"start":{"line":71,"column":6},"end":{"line":80,"column":7}},"28":{"start":{"line":76,"column":8},"end":{"line":79,"column":10}},"29":{"start":{"line":84,"column":6},"end":{"line":84,"column":64}},"30":{"start":{"line":87,"column":4},"end":{"line":87,"column":56}},"31":{"start":{"line":92,"column":25},"end":{"line":94,"column":6}},"32":{"start":{"line":96,"column":4},"end":{"line":98,"column":5}},"33":{"start":{"line":97,"column":6},"end":{"line":97,"column":73}},"34":{"start":{"line":100,"column":23},"end":{"line":100,"column":25}},"35":{"start":{"line":101,"column":27},"end":{"line":101,"column":78}},"36":{"start":{"line":103,"column":17},"end":{"line":108,"column":6}},"37":{"start":{"line":110,"column":4},"end":{"line":110,"column":41}},"38":{"start":{"line":114,"column":4},"end":{"line":114,"column":67}},"39":{"start":{"line":116,"column":4},"end":{"line":116,"column":37}},"40":{"start":{"line":124,"column":17},"end":{"line":126,"column":6}},"41":{"start":{"line":128,"column":4},"end":{"line":130,"column":5}},"42":{"start":{"line":129,"column":6},"end":{"line":129,"column":61}},"43":{"start":{"line":132,"column":28},"end":{"line":134,"column":null}},"44":{"start":{"line":136,"column":4},"end":{"line":138,"column":5}},"45":{"start":{"line":137,"column":6},"end":{"line":137,"column":61}},"46":{"start":{"line":142,"column":4},"end":{"line":142,"column":66}},"47":{"start":{"line":144,"column":4},"end":{"line":144,"column":37}},"48":{"start":{"line":149,"column":32},"end":{"line":154,"column":6}},"49":{"start":{"line":156,"column":40},"end":{"line":165,"column":6}},"50":{"start":{"line":168,"column":23},"end":{"line":168,"column":25}},"51":{"start":{"line":169,"column":4},"end":{"line":169,"column":72}},"52":{"start":{"line":170,"column":4},"end":{"line":170,"column":41}},"53":{"start":{"line":172,"column":4},"end":{"line":184,"column":6}},"54":{"start":{"line":189,"column":17},"end":{"line":191,"column":6}},"55":{"start":{"line":192,"column":4},"end":{"line":194,"column":5}},"56":{"start":{"line":193,"column":6},"end":{"line":193,"column":40}},"57":{"start":{"line":195,"column":4},"end":{"line":195,"column":16}},"58":{"start":{"line":203,"column":17},"end":{"line":205,"column":6}},"59":{"start":{"line":207,"column":4},"end":{"line":209,"column":5}},"60":{"start":{"line":208,"column":6},"end":{"line":208,"column":77}},"61":{"start":{"line":211,"column":4},"end":{"line":216,"column":5}},"62":{"start":{"line":215,"column":6},"end":{"line":215,"column":70}},"63":{"start":{"line":218,"column":4},"end":{"line":218,"column":32}},"64":{"start":{"line":219,"column":4},"end":{"line":219,"column":39}},"65":{"start":{"line":220,"column":4},"end":{"line":220,"column":45}},"66":{"start":{"line":221,"column":4},"end":{"line":221,"column":41}},"67":{"start":{"line":223,"column":4},"end":{"line":223,"column":54}},"68":{"start":{"line":230,"column":17},"end":{"line":232,"column":6}},"69":{"start":{"line":234,"column":4},"end":{"line":236,"column":5}},"70":{"start":{"line":235,"column":6},"end":{"line":235,"column":52}},"71":{"start":{"line":238,"column":4},"end":{"line":240,"column":5}},"72":{"start":{"line":239,"column":6},"end":{"line":239,"column":65}},"73":{"start":{"line":243,"column":4},"end":{"line":243,"column":52}},"74":{"start":{"line":248,"column":17},"end":{"line":248,"column":72}},"75":{"start":{"line":251,"column":4},"end":{"line":256,"column":5}},"76":{"start":{"line":252,"column":6},"end":{"line":255,"column":8}},"77":{"start":{"line":258,"column":21},"end":{"line":258,"column":59}},"78":{"start":{"line":259,"column":22},"end":{"line":259,"column":60}},"79":{"start":{"line":260,"column":23},"end":{"line":260,"column":25}},"80":{"start":{"line":261,"column":26},"end":{"line":261,"column":66}},"81":{"start":{"line":263,"column":4},"end":{"line":263,"column":47}},"82":{"start":{"line":264,"column":4},"end":{"line":264,"column":48}},"83":{"start":{"line":265,"column":4},"end":{"line":265,"column":74}},"84":{"start":{"line":266,"column":4},"end":{"line":266,"column":41}},"85":{"start":{"line":268,"column":18},"end":{"line":268,"column":44}},"86":{"start":{"line":270,"column":4},"end":{"line":285,"column":5}},"87":{"start":{"line":271,"column":6},"end":{"line":280,"column":7}},"88":{"start":{"line":275,"column":8},"end":{"line":279,"column":10}},"89":{"start":{"line":284,"column":6},"end":{"line":284,"column":63}},"90":{"start":{"line":287,"column":4},"end":{"line":290,"column":6}},"91":{"start":{"line":298,"column":18},"end":{"line":298,"column":34}},"92":{"start":{"line":299,"column":4},"end":{"line":301,"column":5}},"93":{"start":{"line":300,"column":6},"end":{"line":300,"column":53}},"94":{"start":{"line":303,"column":34},"end":{"line":303,"column":39}},"95":{"start":{"line":304,"column":17},"end":{"line":306,"column":6}},"96":{"start":{"line":307,"column":4},"end":{"line":313,"column":5}},"97":{"start":{"line":312,"column":6},"end":{"line":312,"column":64}},"98":{"start":{"line":315,"column":4},"end":{"line":317,"column":5}},"99":{"start":{"line":316,"column":6},"end":{"line":316,"column":64}},"100":{"start":{"line":319,"column":20},"end":{"line":321,"column":null}},"101":{"start":{"line":323,"column":4},"end":{"line":325,"column":5}},"102":{"start":{"line":324,"column":6},"end":{"line":324,"column":64}},"103":{"start":{"line":328,"column":23},"end":{"line":328,"column":25}},"104":{"start":{"line":329,"column":19},"end":{"line":329,"column":61}},"105":{"start":{"line":330,"column":4},"end":{"line":330,"column":27}},"106":{"start":{"line":331,"column":4},"end":{"line":331,"column":43}},"107":{"start":{"line":332,"column":4},"end":{"line":332,"column":39}},"108":{"start":{"line":333,"column":4},"end":{"line":333,"column":41}},"109":{"start":{"line":335,"column":4},"end":{"line":335,"column":33}},"110":{"start":{"line":336,"column":4},"end":{"line":336,"column":41}},"111":{"start":{"line":338,"column":4},"end":{"line":353,"column":5}},"112":{"start":{"line":340,"column":6},"end":{"line":350,"column":7}},"113":{"start":{"line":346,"column":8},"end":{"line":349,"column":10}},"114":{"start":{"line":352,"column":6},"end":{"line":352,"column":65}},"115":{"start":{"line":355,"column":4},"end":{"line":355,"column":54}},"116":{"start":{"line":363,"column":17},"end":{"line":363,"column":77}},"117":{"start":{"line":364,"column":4},"end":{"line":366,"column":5}},"118":{"start":{"line":365,"column":6},"end":{"line":365,"column":52}},"119":{"start":{"line":368,"column":4},"end":{"line":368,"column":39}},"120":{"start":{"line":369,"column":4},"end":{"line":369,"column":48}},"121":{"start":{"line":370,"column":4},"end":{"line":370,"column":37}},"122":{"start":{"line":371,"column":4},"end":{"line":371,"column":35}},"123":{"start":{"line":372,"column":4},"end":{"line":372,"column":41}},"124":{"start":{"line":374,"column":4},"end":{"line":388,"column":5}},"125":{"start":{"line":376,"column":6},"end":{"line":385,"column":7}},"126":{"start":{"line":381,"column":8},"end":{"line":384,"column":10}},"127":{"start":{"line":387,"column":6},"end":{"line":387,"column":62}},"128":{"start":{"line":390,"column":4},"end":{"line":390,"column":61}},"129":{"start":{"line":398,"column":17},"end":{"line":398,"column":77}},"130":{"start":{"line":399,"column":4},"end":{"line":401,"column":5}},"131":{"start":{"line":400,"column":6},"end":{"line":400,"column":52}},"132":{"start":{"line":403,"column":22},"end":{"line":403,"column":36}},"133":{"start":{"line":404,"column":4},"end":{"line":404,"column":38}},"134":{"start":{"line":406,"column":4},"end":{"line":411,"column":5}},"135":{"start":{"line":407,"column":6},"end":{"line":407,"column":38}},"136":{"start":{"line":408,"column":6},"end":{"line":408,"column":37}},"137":{"start":{"line":409,"column":11},"end":{"line":411,"column":5}},"138":{"start":{"line":410,"column":6},"end":{"line":410,"column":76}},"139":{"start":{"line":413,"column":4},"end":{"line":413,"column":41}},"140":{"start":{"line":415,"column":4},"end":{"line":432,"column":5}},"141":{"start":{"line":417,"column":6},"end":{"line":429,"column":7}},"142":{"start":{"line":423,"column":8},"end":{"line":428,"column":10}},"143":{"start":{"line":431,"column":6},"end":{"line":431,"column":66}},"144":{"start":{"line":434,"column":4},"end":{"line":434,"column":68}},"145":{"start":{"line":441,"column":4},"end":{"line":493,"column":5}},"146":{"start":{"line":443,"column":22},"end":{"line":445,"column":8}},"147":{"start":{"line":448,"column":19},"end":{"line":450,"column":8}},"148":{"start":{"line":451,"column":6},"end":{"line":453,"column":7}},"149":{"start":{"line":452,"column":8},"end":{"line":452,"column":65}},"150":{"start":{"line":456,"column":6},"end":{"line":461,"column":7}},"151":{"start":{"line":457,"column":8},"end":{"line":459,"column":10}},"152":{"start":{"line":460,"column":8},"end":{"line":460,"column":65}},"153":{"start":{"line":463,"column":27},"end":{"line":465,"column":null}},"154":{"start":{"line":467,"column":6},"end":{"line":475,"column":7}},"155":{"start":{"line":469,"column":8},"end":{"line":471,"column":10}},"156":{"start":{"line":472,"column":8},"end":{"line":472,"column":37}},"157":{"start":{"line":473,"column":8},"end":{"line":473,"column":45}},"158":{"start":{"line":474,"column":8},"end":{"line":474,"column":65}},"159":{"start":{"line":478,"column":24},"end":{"line":478,"column":55}},"160":{"start":{"line":482,"column":6},"end":{"line":482,"column":74}},"161":{"start":{"line":484,"column":6},"end":{"line":484,"column":23}},"162":{"start":{"line":486,"column":6},"end":{"line":491,"column":7}},"163":{"start":{"line":490,"column":8},"end":{"line":490,"column":76}},"164":{"start":{"line":492,"column":6},"end":{"line":492,"column":18}},"165":{"start":{"line":32,"column":13},"end":{"line":32,"column":24}},"166":{"start":{"line":32,"column":13},"end":{"line":495,"column":null}}},"fnMap":{"0":{"name":"(anonymous_13)","decl":{"start":{"line":35,"column":2},"end":{"line":35,"column":null}},"loc":{"start":{"line":39,"column":40},"end":{"line":40,"column":6}}},"1":{"name":"(anonymous_14)","decl":{"start":{"line":43,"column":9},"end":{"line":43,"column":14}},"loc":{"start":{"line":45,"column":32},"end":{"line":88,"column":3}}},"2":{"name":"(anonymous_15)","decl":{"start":{"line":91,"column":9},"end":{"line":91,"column":14}},"loc":{"start":{"line":91,"column":48},"end":{"line":117,"column":3}}},"3":{"name":"(anonymous_16)","decl":{"start":{"line":120,"column":9},"end":{"line":120,"column":14}},"loc":{"start":{"line":122,"column":17},"end":{"line":145,"column":3}}},"4":{"name":"(anonymous_17)","decl":{"start":{"line":148,"column":9},"end":{"line":148,"column":14}},"loc":{"start":{"line":148,"column":40},"end":{"line":185,"column":3}}},"5":{"name":"(anonymous_18)","decl":{"start":{"line":188,"column":9},"end":{"line":188,"column":14}},"loc":{"start":{"line":188,"column":47},"end":{"line":196,"column":3}}},"6":{"name":"(anonymous_19)","decl":{"start":{"line":199,"column":9},"end":{"line":199,"column":14}},"loc":{"start":{"line":200,"column":34},"end":{"line":224,"column":3}}},"7":{"name":"(anonymous_20)","decl":{"start":{"line":227,"column":9},"end":{"line":227,"column":14}},"loc":{"start":{"line":228,"column":48},"end":{"line":244,"column":3}}},"8":{"name":"(anonymous_21)","decl":{"start":{"line":247,"column":9},"end":{"line":247,"column":14}},"loc":{"start":{"line":247,"column":43},"end":{"line":291,"column":3}}},"9":{"name":"(anonymous_22)","decl":{"start":{"line":294,"column":9},"end":{"line":294,"column":14}},"loc":{"start":{"line":296,"column":23},"end":{"line":356,"column":3}}},"10":{"name":"(anonymous_23)","decl":{"start":{"line":359,"column":9},"end":{"line":359,"column":14}},"loc":{"start":{"line":361,"column":27},"end":{"line":391,"column":3}}},"11":{"name":"(anonymous_24)","decl":{"start":{"line":394,"column":9},"end":{"line":394,"column":14}},"loc":{"start":{"line":396,"column":27},"end":{"line":435,"column":3}}},"12":{"name":"(anonymous_25)","decl":{"start":{"line":438,"column":9},"end":{"line":438,"column":14}},"loc":{"start":{"line":439,"column":36},"end":{"line":494,"column":3}}}},"branchMap":{"0":{"loc":{"start":{"line":48,"column":4},"end":{"line":50,"column":5}},"type":"if","locations":[{"start":{"line":48,"column":4},"end":{"line":50,"column":5}},{"start":{},"end":{}}]},"1":{"loc":{"start":{"line":56,"column":4},"end":{"line":58,"column":5}},"type":"if","locations":[{"start":{"line":56,"column":4},"end":{"line":58,"column":5}},{"start":{},"end":{}}]},"2":{"loc":{"start":{"line":71,"column":6},"end":{"line":80,"column":7}},"type":"if","locations":[{"start":{"line":71,"column":6},"end":{"line":80,"column":7}},{"start":{},"end":{}}]},"3":{"loc":{"start":{"line":72,"column":9},"end":{"line":74,"column":20}},"type":"binary-expr","locations":[{"start":{"line":72,"column":9},"end":{"line":72,"column":34}},{"start":{"line":73,"column":8},"end":{"line":74,"column":20}}]},"4":{"loc":{"start":{"line":96,"column":4},"end":{"line":98,"column":5}},"type":"if","locations":[{"start":{"line":96,"column":4},"end":{"line":98,"column":5}},{"start":{},"end":{}}]},"5":{"loc":{"start":{"line":128,"column":4},"end":{"line":130,"column":5}},"type":"if","locations":[{"start":{"line":128,"column":4},"end":{"line":130,"column":5}},{"start":{},"end":{}}]},"6":{"loc":{"start":{"line":136,"column":4},"end":{"line":138,"column":5}},"type":"if","locations":[{"start":{"line":136,"column":4},"end":{"line":138,"column":5}},{"start":{},"end":{}}]},"7":{"loc":{"start":{"line":153,"column":21},"end":{"line":153,"column":52}},"type":"binary-expr","locations":[{"start":{"line":153,"column":21},"end":{"line":153,"column":39}},{"start":{"line":153,"column":43},"end":{"line":153,"column":52}}]},"8":{"loc":{"start":{"line":181,"column":23},"end":{"line":181,"column":47}},"type":"binary-expr","locations":[{"start":{"line":181,"column":23},"end":{"line":181,"column":41}},{"start":{"line":181,"column":45},"end":{"line":181,"column":47}}]},"9":{"loc":{"start":{"line":192,"column":4},"end":{"line":194,"column":5}},"type":"if","locations":[{"start":{"line":192,"column":4},"end":{"line":194,"column":5}},{"start":{},"end":{}}]},"10":{"loc":{"start":{"line":207,"column":4},"end":{"line":209,"column":5}},"type":"if","locations":[{"start":{"line":207,"column":4},"end":{"line":209,"column":5}},{"start":{},"end":{}}]},"11":{"loc":{"start":{"line":211,"column":4},"end":{"line":216,"column":5}},"type":"if","locations":[{"start":{"line":211,"column":4},"end":{"line":216,"column":5}},{"start":{},"end":{}}]},"12":{"loc":{"start":{"line":212,"column":6},"end":{"line":213,"column":52}},"type":"binary-expr","locations":[{"start":{"line":212,"column":6},"end":{"line":212,"column":39}},{"start":{"line":213,"column":6},"end":{"line":213,"column":52}}]},"13":{"loc":{"start":{"line":234,"column":4},"end":{"line":236,"column":5}},"type":"if","locations":[{"start":{"line":234,"column":4},"end":{"line":236,"column":5}},{"start":{},"end":{}}]},"14":{"loc":{"start":{"line":238,"column":4},"end":{"line":240,"column":5}},"type":"if","locations":[{"start":{"line":238,"column":4},"end":{"line":240,"column":5}},{"start":{},"end":{}}]},"15":{"loc":{"start":{"line":251,"column":4},"end":{"line":256,"column":5}},"type":"if","locations":[{"start":{"line":251,"column":4},"end":{"line":256,"column":5}},{"start":{},"end":{}}]},"16":{"loc":{"start":{"line":271,"column":6},"end":{"line":280,"column":7}},"type":"if","locations":[{"start":{"line":271,"column":6},"end":{"line":280,"column":7}},{"start":{},"end":{}}]},"17":{"loc":{"start":{"line":272,"column":9},"end":{"line":273,"column":79}},"type":"binary-expr","locations":[{"start":{"line":272,"column":9},"end":{"line":272,"column":34}},{"start":{"line":273,"column":8},"end":{"line":273,"column":79}}]},"18":{"loc":{"start":{"line":299,"column":4},"end":{"line":301,"column":5}},"type":"if","locations":[{"start":{"line":299,"column":4},"end":{"line":301,"column":5}},{"start":{},"end":{}}]},"19":{"loc":{"start":{"line":307,"column":4},"end":{"line":313,"column":5}},"type":"if","locations":[{"start":{"line":307,"column":4},"end":{"line":313,"column":5}},{"start":{},"end":{}}]},"20":{"loc":{"start":{"line":308,"column":6},"end":{"line":310,"column":36}},"type":"binary-expr","locations":[{"start":{"line":308,"column":6},"end":{"line":308,"column":11}},{"start":{"line":309,"column":6},"end":{"line":309,"column":34}},{"start":{"line":310,"column":6},"end":{"line":310,"column":36}}]},"21":{"loc":{"start":{"line":315,"column":4},"end":{"line":317,"column":5}},"type":"if","locations":[{"start":{"line":315,"column":4},"end":{"line":317,"column":5}},{"start":{},"end":{}}]},"22":{"loc":{"start":{"line":323,"column":4},"end":{"line":325,"column":5}},"type":"if","locations":[{"start":{"line":323,"column":4},"end":{"line":325,"column":5}},{"start":{},"end":{}}]},"23":{"loc":{"start":{"line":340,"column":6},"end":{"line":350,"column":7}},"type":"if","locations":[{"start":{"line":340,"column":6},"end":{"line":350,"column":7}},{"start":{},"end":{}}]},"24":{"loc":{"start":{"line":341,"column":9},"end":{"line":343,"column":20}},"type":"binary-expr","locations":[{"start":{"line":341,"column":9},"end":{"line":341,"column":34}},{"start":{"line":342,"column":8},"end":{"line":343,"column":20}}]},"25":{"loc":{"start":{"line":364,"column":4},"end":{"line":366,"column":5}},"type":"if","locations":[{"start":{"line":364,"column":4},"end":{"line":366,"column":5}},{"start":{},"end":{}}]},"26":{"loc":{"start":{"line":376,"column":6},"end":{"line":385,"column":7}},"type":"if","locations":[{"start":{"line":376,"column":6},"end":{"line":385,"column":7}},{"start":{},"end":{}}]},"27":{"loc":{"start":{"line":377,"column":9},"end":{"line":378,"column":78}},"type":"binary-expr","locations":[{"start":{"line":377,"column":9},"end":{"line":377,"column":34}},{"start":{"line":378,"column":8},"end":{"line":378,"column":78}}]},"28":{"loc":{"start":{"line":399,"column":4},"end":{"line":401,"column":5}},"type":"if","locations":[{"start":{"line":399,"column":4},"end":{"line":401,"column":5}},{"start":{},"end":{}}]},"29":{"loc":{"start":{"line":406,"column":4},"end":{"line":411,"column":5}},"type":"if","locations":[{"start":{"line":406,"column":4},"end":{"line":411,"column":5}},{"start":{"line":409,"column":11},"end":{"line":411,"column":5}}]},"30":{"loc":{"start":{"line":409,"column":11},"end":{"line":411,"column":5}},"type":"if","locations":[{"start":{"line":409,"column":11},"end":{"line":411,"column":5}},{"start":{},"end":{}}]},"31":{"loc":{"start":{"line":410,"column":32},"end":{"line":410,"column":75}},"type":"binary-expr","locations":[{"start":{"line":410,"column":32},"end":{"line":410,"column":57}},{"start":{"line":410,"column":61},"end":{"line":410,"column":75}}]},"32":{"loc":{"start":{"line":417,"column":6},"end":{"line":429,"column":7}},"type":"if","locations":[{"start":{"line":417,"column":6},"end":{"line":429,"column":7}},{"start":{},"end":{}}]},"33":{"loc":{"start":{"line":418,"column":9},"end":{"line":420,"column":20}},"type":"binary-expr","locations":[{"start":{"line":418,"column":9},"end":{"line":418,"column":34}},{"start":{"line":419,"column":8},"end":{"line":420,"column":20}}]},"34":{"loc":{"start":{"line":427,"column":10},"end":{"line":427,"column":48}},"type":"binary-expr","locations":[{"start":{"line":427,"column":10},"end":{"line":427,"column":35}},{"start":{"line":427,"column":39},"end":{"line":427,"column":48}}]},"35":{"loc":{"start":{"line":451,"column":6},"end":{"line":453,"column":7}},"type":"if","locations":[{"start":{"line":451,"column":6},"end":{"line":453,"column":7}},{"start":{},"end":{}}]},"36":{"loc":{"start":{"line":456,"column":6},"end":{"line":461,"column":7}},"type":"if","locations":[{"start":{"line":456,"column":6},"end":{"line":461,"column":7}},{"start":{},"end":{}}]},"37":{"loc":{"start":{"line":467,"column":6},"end":{"line":475,"column":7}},"type":"if","locations":[{"start":{"line":467,"column":6},"end":{"line":475,"column":7}},{"start":{},"end":{}}]},"38":{"loc":{"start":{"line":486,"column":6},"end":{"line":491,"column":7}},"type":"if","locations":[{"start":{"line":486,"column":6},"end":{"line":491,"column":7}},{"start":{},"end":{}}]},"39":{"loc":{"start":{"line":487,"column":8},"end":{"line":488,"column":42}},"type":"binary-expr","locations":[{"start":{"line":487,"column":8},"end":{"line":487,"column":42}},{"start":{"line":488,"column":8},"end":{"line":488,"column":42}}]},"40":{"loc":{"start":{"line":37,"column":28},"end":{"line":37,"column":44}},"type":"cond-expr","locations":[{"start":{"line":37,"column":38},"end":{"line":37,"column":44}},{"start":{"line":37,"column":38},"end":{"line":37,"column":44}}]},"41":{"loc":{"start":{"line":37,"column":28},"end":{"line":37,"column":38}},"type":"binary-expr","locations":[{"start":{"line":37,"column":28},"end":{"line":37,"column":44}},{"start":{"line":37,"column":28},"end":{"line":37,"column":38}}]},"42":{"loc":{"start":{"line":37,"column":38},"end":{"line":38,"column":null}},"type":"cond-expr","locations":[{"start":{"line":38,"column":34},"end":{"line":38,"column":null}},{"start":{"line":38,"column":34},"end":{"line":38,"column":null}}]},"43":{"loc":{"start":{"line":37,"column":38},"end":{"line":38,"column":34}},"type":"binary-expr","locations":[{"start":{"line":37,"column":38},"end":{"line":38,"column":null}},{"start":{"line":38,"column":24},"end":{"line":38,"column":34}}]},"44":{"loc":{"start":{"line":38,"column":34},"end":{"line":39,"column":null}},"type":"cond-expr","locations":[{"start":{"line":39,"column":40},"end":{"line":39,"column":null}},{"start":{"line":39,"column":40},"end":{"line":39,"column":null}}]},"45":{"loc":{"start":{"line":38,"column":34},"end":{"line":39,"column":40}},"type":"binary-expr","locations":[{"start":{"line":38,"column":34},"end":{"line":39,"column":null}},{"start":{"line":39,"column":27},"end":{"line":39,"column":40}}]}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":0,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":1,"166":1},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,0],"7":[0,0],"8":[0,0],"9":[0,0],"10":[0,0],"11":[0,0],"12":[0,0],"13":[0,0],"14":[0,0],"15":[0,0],"16":[0,0],"17":[0,0],"18":[0,0],"19":[0,0],"20":[0,0,0],"21":[0,0],"22":[0,0],"23":[0,0],"24":[0,0],"25":[0,0],"26":[0,0],"27":[0,0],"28":[0,0],"29":[0,0],"30":[0,0],"31":[0,0],"32":[0,0],"33":[0,0],"34":[0,0],"35":[0,0],"36":[0,0],"37":[0,0],"38":[0,0],"39":[0,0],"40":[1,0],"41":[1,1],"42":[1,0],"43":[1,1],"44":[1,0],"45":[1,1]}} -,"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\auth\\strategies\\jwt.strategy.ts": {"path":"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\auth\\strategies\\jwt.strategy.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":52}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":52}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":67}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":47}},"4":{"start":{"line":7,"column":13},"end":{"line":7,"column":34}},"5":{"start":{"line":10,"column":7},"end":{"line":25,"column":null}},"6":{"start":{"line":12,"column":4},"end":{"line":16,"column":7}},"7":{"start":{"line":11,"column":22},"end":{"line":11,"column":37}},"8":{"start":{"line":20,"column":4},"end":{"line":22,"column":5}},"9":{"start":{"line":21,"column":6},"end":{"line":21,"column":40}},"10":{"start":{"line":23,"column":4},"end":{"line":23,"column":19}},"11":{"start":{"line":10,"column":13},"end":{"line":10,"column":24}},"12":{"start":{"line":10,"column":13},"end":{"line":25,"column":null}}},"fnMap":{"0":{"name":"(anonymous_2)","decl":{"start":{"line":11,"column":2},"end":{"line":11,"column":22}},"loc":{"start":{"line":11,"column":50},"end":{"line":17,"column":3}}},"1":{"name":"(anonymous_3)","decl":{"start":{"line":19,"column":2},"end":{"line":19,"column":7}},"loc":{"start":{"line":19,"column":36},"end":{"line":24,"column":3}}}},"branchMap":{"0":{"loc":{"start":{"line":20,"column":4},"end":{"line":22,"column":5}},"type":"if","locations":[{"start":{"line":20,"column":4},"end":{"line":22,"column":5}},{"start":{},"end":{}}]},"1":{"loc":{"start":{"line":11,"column":37},"end":{"line":11,"column":null}},"type":"cond-expr","locations":[{"start":{"line":11,"column":50},"end":{"line":11,"column":null}},{"start":{"line":11,"column":50},"end":{"line":11,"column":null}}]},"2":{"loc":{"start":{"line":11,"column":37},"end":{"line":11,"column":50}},"type":"binary-expr","locations":[{"start":{"line":11,"column":37},"end":{"line":11,"column":null}},{"start":{"line":11,"column":37},"end":{"line":11,"column":50}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0},"f":{"0":0,"1":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0]}} -,"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\common\\decorators\\current-user.decorator.ts": {"path":"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\common\\decorators\\current-user.decorator.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":72}},"1":{"start":{"line":5,"column":13},"end":{"line":13,"column":2}},"2":{"start":{"line":7,"column":20},"end":{"line":9,"column":51}},"3":{"start":{"line":10,"column":17},"end":{"line":10,"column":29}},"4":{"start":{"line":11,"column":4},"end":{"line":11,"column":40}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":6,"column":2},"end":{"line":6,"column":3}},"loc":{"start":{"line":6,"column":65},"end":{"line":12,"column":3}}}},"branchMap":{"0":{"loc":{"start":{"line":11,"column":11},"end":{"line":11,"column":39}},"type":"cond-expr","locations":[{"start":{"line":11,"column":19},"end":{"line":11,"column":32}},{"start":{"line":11,"column":35},"end":{"line":11,"column":39}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0},"f":{"0":0},"b":{"0":[0,0]}} -,"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\common\\decorators\\public.decorator.ts": {"path":"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\common\\decorators\\public.decorator.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":45}},"1":{"start":{"line":3,"column":13},"end":{"line":3,"column":40}},"2":{"start":{"line":4,"column":22},"end":{"line":4,"column":60}},"3":{"start":{"line":4,"column":28},"end":{"line":4,"column":60}},"4":{"start":{"line":4,"column":13},"end":{"line":4,"column":22}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":4,"column":22},"end":{"line":4,"column":25}},"loc":{"start":{"line":4,"column":28},"end":{"line":4,"column":60}}}},"branchMap":{},"s":{"0":0,"1":0,"2":0,"3":0,"4":0},"f":{"0":0},"b":{}} -,"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\common\\decorators\\roles.decorator.ts": {"path":"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\common\\decorators\\roles.decorator.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":45}},"1":{"start":{"line":4,"column":13},"end":{"line":4,"column":33}},"2":{"start":{"line":5,"column":21},"end":{"line":5,"column":76}},"3":{"start":{"line":5,"column":47},"end":{"line":5,"column":76}},"4":{"start":{"line":5,"column":13},"end":{"line":5,"column":21}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":5,"column":21},"end":{"line":5,"column":22}},"loc":{"start":{"line":5,"column":47},"end":{"line":5,"column":76}}}},"branchMap":{},"s":{"0":0,"1":0,"2":0,"3":0,"4":0},"f":{"0":0},"b":{}} -,"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\common\\enums\\kyc-status.enum.ts": {"path":"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\common\\enums\\kyc-status.enum.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":2},"end":{"line":2,"column":null}},"2":{"start":{"line":3,"column":2},"end":{"line":3,"column":null}},"3":{"start":{"line":4,"column":2},"end":{"line":4,"column":null}},"4":{"start":{"line":5,"column":2},"end":{"line":5,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":1,"column":0},"end":{"line":1,"column":12}},"loc":{"start":{"line":1,"column":21},"end":{"line":6,"column":1}}}},"branchMap":{"0":{"loc":{"start":{"line":1,"column":12},"end":{"line":1,"column":null}},"type":"binary-expr","locations":[{"start":{"line":1,"column":12},"end":{"line":1,"column":21}},{"start":{"line":1,"column":21},"end":{"line":1,"column":null}}]}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1},"f":{"0":1},"b":{"0":[1,1]}} -,"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\common\\enums\\project-category.enum.ts": {"path":"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\common\\enums\\project-category.enum.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":2},"end":{"line":2,"column":null}},"2":{"start":{"line":3,"column":2},"end":{"line":3,"column":null}},"3":{"start":{"line":4,"column":2},"end":{"line":4,"column":null}},"4":{"start":{"line":5,"column":2},"end":{"line":5,"column":null}},"5":{"start":{"line":6,"column":2},"end":{"line":6,"column":null}},"6":{"start":{"line":7,"column":2},"end":{"line":7,"column":null}},"7":{"start":{"line":8,"column":2},"end":{"line":8,"column":null}},"8":{"start":{"line":9,"column":2},"end":{"line":9,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":1,"column":0},"end":{"line":1,"column":12}},"loc":{"start":{"line":1,"column":27},"end":{"line":10,"column":1}}}},"branchMap":{"0":{"loc":{"start":{"line":1,"column":12},"end":{"line":1,"column":null}},"type":"binary-expr","locations":[{"start":{"line":1,"column":12},"end":{"line":1,"column":27}},{"start":{"line":1,"column":27},"end":{"line":1,"column":null}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0},"f":{"0":0},"b":{"0":[0,0]}} -,"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\common\\enums\\project-status.enum.ts": {"path":"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\common\\enums\\project-status.enum.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":2},"end":{"line":2,"column":null}},"2":{"start":{"line":3,"column":2},"end":{"line":3,"column":null}},"3":{"start":{"line":4,"column":2},"end":{"line":4,"column":null}},"4":{"start":{"line":5,"column":2},"end":{"line":5,"column":null}},"5":{"start":{"line":6,"column":2},"end":{"line":6,"column":null}},"6":{"start":{"line":7,"column":2},"end":{"line":7,"column":null}},"7":{"start":{"line":8,"column":2},"end":{"line":8,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":1,"column":0},"end":{"line":1,"column":12}},"loc":{"start":{"line":1,"column":25},"end":{"line":9,"column":1}}}},"branchMap":{"0":{"loc":{"start":{"line":1,"column":12},"end":{"line":1,"column":null}},"type":"binary-expr","locations":[{"start":{"line":1,"column":12},"end":{"line":1,"column":25}},{"start":{"line":1,"column":25},"end":{"line":1,"column":null}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0},"f":{"0":0},"b":{"0":[0,0]}} -,"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\common\\enums\\projects-sortBy.enum.ts": {"path":"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\common\\enums\\projects-sortBy.enum.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":2},"end":{"line":2,"column":null}},"2":{"start":{"line":3,"column":2},"end":{"line":3,"column":null}},"3":{"start":{"line":4,"column":2},"end":{"line":4,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":1,"column":0},"end":{"line":1,"column":12}},"loc":{"start":{"line":1,"column":25},"end":{"line":5,"column":1}}}},"branchMap":{"0":{"loc":{"start":{"line":1,"column":12},"end":{"line":1,"column":null}},"type":"binary-expr","locations":[{"start":{"line":1,"column":12},"end":{"line":1,"column":25}},{"start":{"line":1,"column":25},"end":{"line":1,"column":null}}]}},"s":{"0":0,"1":0,"2":0,"3":0},"f":{"0":0},"b":{"0":[0,0]}} -,"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\common\\enums\\user-role.enum.ts": {"path":"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\common\\enums\\user-role.enum.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":2,"column":2},"end":{"line":2,"column":null}},"2":{"start":{"line":3,"column":2},"end":{"line":3,"column":null}},"3":{"start":{"line":4,"column":2},"end":{"line":4,"column":null}},"4":{"start":{"line":5,"column":2},"end":{"line":5,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":1,"column":0},"end":{"line":1,"column":12}},"loc":{"start":{"line":1,"column":20},"end":{"line":6,"column":1}}}},"branchMap":{"0":{"loc":{"start":{"line":1,"column":12},"end":{"line":1,"column":null}},"type":"binary-expr","locations":[{"start":{"line":1,"column":12},"end":{"line":1,"column":20}},{"start":{"line":1,"column":20},"end":{"line":1,"column":null}}]}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1},"f":{"0":1},"b":{"0":[1,1]}} -,"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\common\\filters\\http-exeption.filter.ts": {"path":"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\common\\filters\\http-exeption.filter.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":10,"column":0},"end":{"line":10,"column":60}},"2":{"start":{"line":13,"column":7},"end":{"line":57,"column":null}},"3":{"start":{"line":14,"column":54},"end":{"line":14,"column":63}},"4":{"start":{"line":16,"column":16},"end":{"line":16,"column":35}},"5":{"start":{"line":17,"column":21},"end":{"line":17,"column":48}},"6":{"start":{"line":18,"column":20},"end":{"line":18,"column":45}},"7":{"start":{"line":20,"column":19},"end":{"line":20,"column":40}},"8":{"start":{"line":21,"column":30},"end":{"line":21,"column":53}},"9":{"start":{"line":23,"column":18},"end":{"line":23,"column":34}},"10":{"start":{"line":24,"column":17},"end":{"line":24,"column":21}},"11":{"start":{"line":26,"column":4},"end":{"line":37,"column":5}},"12":{"start":{"line":27,"column":6},"end":{"line":27,"column":34}},"13":{"start":{"line":28,"column":11},"end":{"line":37,"column":5}},"14":{"start":{"line":29,"column":23},"end":{"line":29,"column":40}},"15":{"start":{"line":30,"column":6},"end":{"line":30,"column":39}},"16":{"start":{"line":31,"column":6},"end":{"line":36,"column":15}},"17":{"start":{"line":32,"column":44},"end":{"line":35,"column":12}},"18":{"start":{"line":40,"column":4},"end":{"line":46,"column":5}},"19":{"start":{"line":41,"column":21},"end":{"line":41,"column":52}},"20":{"start":{"line":42,"column":6},"end":{"line":45,"column":9}},"21":{"start":{"line":48,"column":4},"end":{"line":55,"column":7}},"22":{"start":{"line":13,"column":13},"end":{"line":13,"column":32}},"23":{"start":{"line":13,"column":13},"end":{"line":57,"column":null}}},"fnMap":{"0":{"name":"(anonymous_4)","decl":{"start":{"line":14,"column":2},"end":{"line":14,"column":15}},"loc":{"start":{"line":14,"column":76},"end":{"line":14,"column":80}}},"1":{"name":"(anonymous_5)","decl":{"start":{"line":15,"column":2},"end":{"line":15,"column":7}},"loc":{"start":{"line":15,"column":53},"end":{"line":56,"column":3}}},"2":{"name":"(anonymous_6)","decl":{"start":{"line":32,"column":26},"end":{"line":32,"column":27}},"loc":{"start":{"line":32,"column":44},"end":{"line":35,"column":12}}}},"branchMap":{"0":{"loc":{"start":{"line":26,"column":4},"end":{"line":37,"column":5}},"type":"if","locations":[{"start":{"line":26,"column":4},"end":{"line":37,"column":5}},{"start":{"line":28,"column":11},"end":{"line":37,"column":5}}]},"1":{"loc":{"start":{"line":28,"column":11},"end":{"line":37,"column":5}},"type":"if","locations":[{"start":{"line":28,"column":11},"end":{"line":37,"column":5}},{"start":{},"end":{}}]},"2":{"loc":{"start":{"line":30,"column":16},"end":{"line":30,"column":38}},"type":"binary-expr","locations":[{"start":{"line":30,"column":16},"end":{"line":30,"column":27}},{"start":{"line":30,"column":31},"end":{"line":30,"column":38}}]},"3":{"loc":{"start":{"line":31,"column":15},"end":{"line":36,"column":14}},"type":"cond-expr","locations":[{"start":{"line":32,"column":10},"end":{"line":35,"column":13}},{"start":{"line":36,"column":10},"end":{"line":36,"column":14}}]},"4":{"loc":{"start":{"line":40,"column":4},"end":{"line":46,"column":5}},"type":"if","locations":[{"start":{"line":40,"column":4},"end":{"line":46,"column":5}},{"start":{},"end":{}}]},"5":{"loc":{"start":{"line":41,"column":21},"end":{"line":41,"column":52}},"type":"binary-expr","locations":[{"start":{"line":41,"column":21},"end":{"line":41,"column":44}},{"start":{"line":41,"column":48},"end":{"line":41,"column":52}}]},"6":{"loc":{"start":{"line":14,"column":63},"end":{"line":14,"column":79}},"type":"cond-expr","locations":[{"start":{"line":14,"column":76},"end":{"line":14,"column":79}},{"start":{"line":14,"column":76},"end":{"line":14,"column":79}}]},"7":{"loc":{"start":{"line":14,"column":63},"end":{"line":14,"column":76}},"type":"binary-expr","locations":[{"start":{"line":14,"column":63},"end":{"line":14,"column":79}},{"start":{"line":14,"column":63},"end":{"line":14,"column":76}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0},"f":{"0":0,"1":0,"2":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,0],"7":[0,0]}} -,"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\common\\guards\\file-upload.guard.ts": {"path":"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\common\\guards\\file-upload.guard.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":83}},"1":{"start":{"line":4,"column":7},"end":{"line":31,"column":null}},"2":{"start":{"line":6,"column":20},"end":{"line":6,"column":55}},"3":{"start":{"line":7,"column":17},"end":{"line":7,"column":29}},"4":{"start":{"line":9,"column":4},"end":{"line":11,"column":5}},"5":{"start":{"line":10,"column":6},"end":{"line":10,"column":56}},"6":{"start":{"line":14,"column":29},"end":{"line":14,"column":70}},"7":{"start":{"line":15,"column":4},"end":{"line":19,"column":5}},"8":{"start":{"line":16,"column":6},"end":{"line":18,"column":8}},"9":{"start":{"line":22,"column":20},"end":{"line":22,"column":35}},"10":{"start":{"line":23,"column":4},"end":{"line":27,"column":5}},"11":{"start":{"line":24,"column":6},"end":{"line":26,"column":8}},"12":{"start":{"line":29,"column":4},"end":{"line":29,"column":16}},"13":{"start":{"line":4,"column":13},"end":{"line":4,"column":28}},"14":{"start":{"line":4,"column":13},"end":{"line":31,"column":null}}},"fnMap":{"0":{"name":"(anonymous_1)","decl":{"start":{"line":5,"column":2},"end":{"line":5,"column":13}},"loc":{"start":{"line":5,"column":39},"end":{"line":30,"column":3}}}},"branchMap":{"0":{"loc":{"start":{"line":9,"column":4},"end":{"line":11,"column":5}},"type":"if","locations":[{"start":{"line":9,"column":4},"end":{"line":11,"column":5}},{"start":{},"end":{}}]},"1":{"loc":{"start":{"line":15,"column":4},"end":{"line":19,"column":5}},"type":"if","locations":[{"start":{"line":15,"column":4},"end":{"line":19,"column":5}},{"start":{},"end":{}}]},"2":{"loc":{"start":{"line":23,"column":4},"end":{"line":27,"column":5}},"type":"if","locations":[{"start":{"line":23,"column":4},"end":{"line":27,"column":5}},{"start":{},"end":{}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0},"f":{"0":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0]}} -,"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\common\\guards\\jwt-auth.guard.ts": {"path":"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\common\\guards\\jwt-auth.guard.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":62}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":41}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":45}},"3":{"start":{"line":5,"column":0},"end":{"line":5,"column":63}},"4":{"start":{"line":6,"column":0},"end":{"line":6,"column":66}},"5":{"start":{"line":9,"column":7},"end":{"line":24,"column":null}},"6":{"start":{"line":11,"column":4},"end":{"line":11,"column":12}},"7":{"start":{"line":10,"column":31},"end":{"line":10,"column":42}},"8":{"start":{"line":17,"column":21},"end":{"line":20,"column":6}},"9":{"start":{"line":21,"column":4},"end":{"line":21,"column":30}},"10":{"start":{"line":21,"column":18},"end":{"line":21,"column":30}},"11":{"start":{"line":22,"column":4},"end":{"line":22,"column":38}},"12":{"start":{"line":9,"column":13},"end":{"line":9,"column":25}},"13":{"start":{"line":9,"column":13},"end":{"line":24,"column":null}}},"fnMap":{"0":{"name":"(anonymous_2)","decl":{"start":{"line":10,"column":2},"end":{"line":10,"column":31}},"loc":{"start":{"line":10,"column":51},"end":{"line":12,"column":3}}},"1":{"name":"(anonymous_3)","decl":{"start":{"line":14,"column":2},"end":{"line":14,"column":13}},"loc":{"start":{"line":15,"column":29},"end":{"line":23,"column":3}}}},"branchMap":{"0":{"loc":{"start":{"line":21,"column":4},"end":{"line":21,"column":30}},"type":"if","locations":[{"start":{"line":21,"column":4},"end":{"line":21,"column":30}},{"start":{},"end":{}}]},"1":{"loc":{"start":{"line":10,"column":42},"end":{"line":10,"column":null}},"type":"cond-expr","locations":[{"start":{"line":10,"column":51},"end":{"line":10,"column":null}},{"start":{"line":10,"column":51},"end":{"line":10,"column":null}}]},"2":{"loc":{"start":{"line":10,"column":42},"end":{"line":10,"column":51}},"type":"binary-expr","locations":[{"start":{"line":10,"column":42},"end":{"line":10,"column":null}},{"start":{"line":10,"column":42},"end":{"line":10,"column":51}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0},"f":{"0":0,"1":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0]}} -,"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\common\\guards\\roles.guard.ts": {"path":"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\common\\guards\\roles.guard.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":75}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":41}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":58}},"3":{"start":{"line":7,"column":7},"end":{"line":27,"column":null}},"4":{"start":{"line":8,"column":22},"end":{"line":8,"column":33}},"5":{"start":{"line":11,"column":26},"end":{"line":13,"column":null}},"6":{"start":{"line":16,"column":4},"end":{"line":18,"column":5}},"7":{"start":{"line":17,"column":6},"end":{"line":17,"column":18}},"8":{"start":{"line":20,"column":21},"end":{"line":20,"column":56}},"9":{"start":{"line":21,"column":4},"end":{"line":23,"column":5}},"10":{"start":{"line":22,"column":6},"end":{"line":22,"column":19}},"11":{"start":{"line":25,"column":4},"end":{"line":25,"column":60}},"12":{"start":{"line":25,"column":40},"end":{"line":25,"column":58}},"13":{"start":{"line":7,"column":13},"end":{"line":7,"column":23}},"14":{"start":{"line":7,"column":13},"end":{"line":27,"column":null}}},"fnMap":{"0":{"name":"(anonymous_2)","decl":{"start":{"line":8,"column":2},"end":{"line":8,"column":22}},"loc":{"start":{"line":8,"column":42},"end":{"line":8,"column":46}}},"1":{"name":"(anonymous_3)","decl":{"start":{"line":10,"column":2},"end":{"line":10,"column":13}},"loc":{"start":{"line":10,"column":39},"end":{"line":26,"column":3}}},"2":{"name":"(anonymous_4)","decl":{"start":{"line":25,"column":30},"end":{"line":25,"column":31}},"loc":{"start":{"line":25,"column":40},"end":{"line":25,"column":58}}}},"branchMap":{"0":{"loc":{"start":{"line":16,"column":4},"end":{"line":18,"column":5}},"type":"if","locations":[{"start":{"line":16,"column":4},"end":{"line":18,"column":5}},{"start":{},"end":{}}]},"1":{"loc":{"start":{"line":21,"column":4},"end":{"line":23,"column":5}},"type":"if","locations":[{"start":{"line":21,"column":4},"end":{"line":23,"column":5}},{"start":{},"end":{}}]},"2":{"loc":{"start":{"line":8,"column":33},"end":{"line":8,"column":45}},"type":"cond-expr","locations":[{"start":{"line":8,"column":42},"end":{"line":8,"column":45}},{"start":{"line":8,"column":42},"end":{"line":8,"column":45}}]},"3":{"loc":{"start":{"line":8,"column":33},"end":{"line":8,"column":42}},"type":"binary-expr","locations":[{"start":{"line":8,"column":33},"end":{"line":8,"column":45}},{"start":{"line":8,"column":33},"end":{"line":8,"column":42}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0},"f":{"0":0,"1":0,"2":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0]}} -,"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\common\\interceptors\\logging.interceptor.ts": {"path":"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\common\\interceptors\\logging.interceptor.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":8,"column":0},"end":{"line":8,"column":39}},"2":{"start":{"line":11,"column":7},"end":{"line":30,"column":null}},"3":{"start":{"line":12,"column":19},"end":{"line":12,"column":37}},"4":{"start":{"line":15,"column":20},"end":{"line":15,"column":55}},"5":{"start":{"line":16,"column":36},"end":{"line":16,"column":43}},"6":{"start":{"line":17,"column":16},"end":{"line":17,"column":26}},"7":{"start":{"line":19,"column":4},"end":{"line":28,"column":6}},"8":{"start":{"line":21,"column":25},"end":{"line":21,"column":61}},"9":{"start":{"line":22,"column":31},"end":{"line":22,"column":39}},"10":{"start":{"line":24,"column":8},"end":{"line":26,"column":10}},"11":{"start":{"line":11,"column":13},"end":{"line":11,"column":31}},"12":{"start":{"line":11,"column":13},"end":{"line":30,"column":null}}},"fnMap":{"0":{"name":"(anonymous_1)","decl":{"start":{"line":14,"column":2},"end":{"line":14,"column":11}},"loc":{"start":{"line":14,"column":56},"end":{"line":29,"column":3}}},"1":{"name":"(anonymous_2)","decl":{"start":{"line":20,"column":10},"end":{"line":20,"column":13}},"loc":{"start":{"line":20,"column":15},"end":{"line":27,"column":7}}}},"branchMap":{},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0},"f":{"0":0,"1":0},"b":{}} -,"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\common\\middleware\\token-validation.middleware.ts": {"path":"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\common\\middleware\\token-validation.middleware.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":9,"column":7},"end":{"line":30,"column":null}},"2":{"start":{"line":11,"column":23},"end":{"line":11,"column":51}},"3":{"start":{"line":13,"column":4},"end":{"line":13,"column":35}},"4":{"start":{"line":13,"column":21},"end":{"line":13,"column":35}},"5":{"start":{"line":15,"column":4},"end":{"line":19,"column":5}},"6":{"start":{"line":16,"column":6},"end":{"line":18,"column":8}},"7":{"start":{"line":21,"column":18},"end":{"line":21,"column":48}},"8":{"start":{"line":22,"column":4},"end":{"line":26,"column":5}},"9":{"start":{"line":23,"column":6},"end":{"line":25,"column":8}},"10":{"start":{"line":28,"column":4},"end":{"line":28,"column":11}},"11":{"start":{"line":9,"column":13},"end":{"line":9,"column":38}},"12":{"start":{"line":9,"column":13},"end":{"line":30,"column":null}}},"fnMap":{"0":{"name":"(anonymous_1)","decl":{"start":{"line":10,"column":2},"end":{"line":10,"column":5}},"loc":{"start":{"line":10,"column":54},"end":{"line":29,"column":3}}}},"branchMap":{"0":{"loc":{"start":{"line":13,"column":4},"end":{"line":13,"column":35}},"type":"if","locations":[{"start":{"line":13,"column":4},"end":{"line":13,"column":35}},{"start":{},"end":{}}]},"1":{"loc":{"start":{"line":15,"column":4},"end":{"line":19,"column":5}},"type":"if","locations":[{"start":{"line":15,"column":4},"end":{"line":19,"column":5}},{"start":{},"end":{}}]},"2":{"loc":{"start":{"line":22,"column":4},"end":{"line":26,"column":5}},"type":"if","locations":[{"start":{"line":22,"column":4},"end":{"line":26,"column":5}},{"start":{},"end":{}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0},"f":{"0":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0]}} -,"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\common\\services\\file-upload.service.ts": {"path":"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\common\\services\\file-upload.service.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":52}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":85}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":61}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":47}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":36}},"5":{"start":{"line":9,"column":30},"end":{"line":78,"column":null}},"6":{"start":{"line":10,"column":28},"end":{"line":10,"column":62}},"7":{"start":{"line":13,"column":22},"end":{"line":13,"column":37}},"8":{"start":{"line":14,"column":4},"end":{"line":20,"column":7}},"9":{"start":{"line":24,"column":26},"end":{"line":24,"column":60}},"10":{"start":{"line":25,"column":21},"end":{"line":25,"column":55}},"11":{"start":{"line":26,"column":16},"end":{"line":26,"column":58}},"12":{"start":{"line":28,"column":4},"end":{"line":46,"column":5}},"13":{"start":{"line":29,"column":6},"end":{"line":37,"column":8}},"14":{"start":{"line":39,"column":24},"end":{"line":39,"column":176}},"15":{"start":{"line":41,"column":6},"end":{"line":41,"column":65}},"16":{"start":{"line":42,"column":6},"end":{"line":42,"column":23}},"17":{"start":{"line":44,"column":6},"end":{"line":44,"column":67}},"18":{"start":{"line":45,"column":6},"end":{"line":45,"column":18}},"19":{"start":{"line":50,"column":4},"end":{"line":65,"column":5}},"20":{"start":{"line":51,"column":18},"end":{"line":51,"column":35}},"21":{"start":{"line":52,"column":18},"end":{"line":52,"column":43}},"22":{"start":{"line":54,"column":6},"end":{"line":59,"column":8}},"23":{"start":{"line":61,"column":6},"end":{"line":61,"column":59}},"24":{"start":{"line":63,"column":6},"end":{"line":63,"column":67}},"25":{"start":{"line":64,"column":6},"end":{"line":64,"column":18}},"26":{"start":{"line":69,"column":4},"end":{"line":76,"column":6}},"27":{"start":{"line":9,"column":13},"end":{"line":9,"column":30}},"28":{"start":{"line":9,"column":13},"end":{"line":78,"column":null}}},"fnMap":{"0":{"name":"(anonymous_2)","decl":{"start":{"line":13,"column":2},"end":{"line":13,"column":22}},"loc":{"start":{"line":13,"column":50},"end":{"line":21,"column":3}}},"1":{"name":"(anonymous_3)","decl":{"start":{"line":23,"column":2},"end":{"line":23,"column":7}},"loc":{"start":{"line":23,"column":63},"end":{"line":47,"column":3}}},"2":{"name":"(anonymous_4)","decl":{"start":{"line":49,"column":2},"end":{"line":49,"column":7}},"loc":{"start":{"line":49,"column":35},"end":{"line":66,"column":3}}},"3":{"name":"(anonymous_5)","decl":{"start":{"line":68,"column":2},"end":{"line":68,"column":22}},"loc":{"start":{"line":68,"column":60},"end":{"line":77,"column":3}}}},"branchMap":{"0":{"loc":{"start":{"line":68,"column":36},"end":{"line":68,"column":60}},"type":"default-arg","locations":[{"start":{"line":68,"column":56},"end":{"line":68,"column":60}}]},"1":{"loc":{"start":{"line":13,"column":37},"end":{"line":13,"column":null}},"type":"cond-expr","locations":[{"start":{"line":13,"column":50},"end":{"line":13,"column":null}},{"start":{"line":13,"column":50},"end":{"line":13,"column":null}}]},"2":{"loc":{"start":{"line":13,"column":37},"end":{"line":13,"column":50}},"type":"binary-expr","locations":[{"start":{"line":13,"column":37},"end":{"line":13,"column":null}},{"start":{"line":13,"column":37},"end":{"line":13,"column":50}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0},"f":{"0":0,"1":0,"2":0,"3":0},"b":{"0":[0],"1":[0,0],"2":[0,0]}} -,"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\database\\app-config.service.ts": {"path":"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\database\\app-config.service.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":44}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":47}},"2":{"start":{"line":6,"column":7},"end":{"line":34,"column":null}},"3":{"start":{"line":7,"column":31},"end":{"line":7,"column":46}},"4":{"start":{"line":10,"column":4},"end":{"line":10,"column":68}},"5":{"start":{"line":14,"column":4},"end":{"line":14,"column":75}},"6":{"start":{"line":18,"column":4},"end":{"line":18,"column":73}},"7":{"start":{"line":22,"column":4},"end":{"line":22,"column":76}},"8":{"start":{"line":26,"column":4},"end":{"line":26,"column":70}},"9":{"start":{"line":30,"column":4},"end":{"line":32,"column":8}},"10":{"start":{"line":6,"column":13},"end":{"line":6,"column":29}},"11":{"start":{"line":6,"column":13},"end":{"line":34,"column":null}}},"fnMap":{"0":{"name":"(anonymous_2)","decl":{"start":{"line":7,"column":2},"end":{"line":7,"column":31}},"loc":{"start":{"line":7,"column":70},"end":{"line":7,"column":74}}},"1":{"name":"(anonymous_3)","decl":{"start":{"line":9,"column":2},"end":{"line":9,"column":6}},"loc":{"start":{"line":9,"column":10},"end":{"line":11,"column":3}}},"2":{"name":"(anonymous_4)","decl":{"start":{"line":13,"column":2},"end":{"line":13,"column":6}},"loc":{"start":{"line":13,"column":17},"end":{"line":15,"column":3}}},"3":{"name":"(anonymous_5)","decl":{"start":{"line":17,"column":2},"end":{"line":17,"column":6}},"loc":{"start":{"line":17,"column":15},"end":{"line":19,"column":3}}},"4":{"name":"(anonymous_6)","decl":{"start":{"line":21,"column":2},"end":{"line":21,"column":6}},"loc":{"start":{"line":21,"column":18},"end":{"line":23,"column":3}}},"5":{"name":"(anonymous_7)","decl":{"start":{"line":25,"column":2},"end":{"line":25,"column":6}},"loc":{"start":{"line":25,"column":20},"end":{"line":27,"column":3}}},"6":{"name":"(anonymous_8)","decl":{"start":{"line":29,"column":2},"end":{"line":29,"column":6}},"loc":{"start":{"line":29,"column":23},"end":{"line":33,"column":3}}}},"branchMap":{"0":{"loc":{"start":{"line":7,"column":46},"end":{"line":7,"column":70}},"type":"cond-expr","locations":[{"start":{"line":7,"column":59},"end":{"line":7,"column":70}},{"start":{"line":7,"column":59},"end":{"line":7,"column":70}}]},"1":{"loc":{"start":{"line":7,"column":46},"end":{"line":7,"column":59}},"type":"binary-expr","locations":[{"start":{"line":7,"column":46},"end":{"line":7,"column":70}},{"start":{"line":7,"column":46},"end":{"line":7,"column":59}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0},"b":{"0":[0,0],"1":[0,0]}} -,"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\database\\config.ts": {"path":"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\database\\config.ts","statementMap":{"0":{"start":{"line":3,"column":0},"end":{"line":27,"column":3}},"1":{"start":{"line":3,"column":33},"end":{"line":27,"column":2}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":3,"column":15},"end":{"line":3,"column":29}},"loc":{"start":{"line":3,"column":33},"end":{"line":27,"column":2}}}},"branchMap":{"0":{"loc":{"start":{"line":4,"column":17},"end":{"line":4,"column":43}},"type":"binary-expr","locations":[{"start":{"line":4,"column":17},"end":{"line":4,"column":33}},{"start":{"line":4,"column":37},"end":{"line":4,"column":43}}]},"1":{"loc":{"start":{"line":7,"column":20},"end":{"line":7,"column":70}},"type":"binary-expr","locations":[{"start":{"line":7,"column":20},"end":{"line":7,"column":50}},{"start":{"line":7,"column":54},"end":{"line":7,"column":70}}]},"2":{"loc":{"start":{"line":8,"column":16},"end":{"line":8,"column":50}},"type":"binary-expr","locations":[{"start":{"line":8,"column":16},"end":{"line":8,"column":42}},{"start":{"line":8,"column":46},"end":{"line":8,"column":50}}]},"3":{"loc":{"start":{"line":10,"column":5},"end":{"line":10,"column":70}},"type":"binary-expr","locations":[{"start":{"line":10,"column":5},"end":{"line":10,"column":57}},{"start":{"line":10,"column":61},"end":{"line":10,"column":70}}]},"4":{"loc":{"start":{"line":12,"column":4},"end":{"line":12,"column":76}},"type":"binary-expr","locations":[{"start":{"line":12,"column":4},"end":{"line":12,"column":35}},{"start":{"line":12,"column":39},"end":{"line":12,"column":76}}]},"5":{"loc":{"start":{"line":14,"column":12},"end":{"line":16,"column":15}},"type":"cond-expr","locations":[{"start":{"line":15,"column":6},"end":{"line":15,"column":41}},{"start":{"line":16,"column":6},"end":{"line":16,"column":15}}]},"6":{"loc":{"start":{"line":25,"column":4},"end":{"line":26,"column":41}},"type":"binary-expr","locations":[{"start":{"line":25,"column":4},"end":{"line":25,"column":41}},{"start":{"line":26,"column":4},"end":{"line":26,"column":41}}]}},"s":{"0":0,"1":0},"f":{"0":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,0]}} -,"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\database\\data-source.ts": {"path":"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\database\\data-source.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":37}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":33}},"2":{"start":{"line":4,"column":0},"end":{"line":4,"column":16}},"3":{"start":{"line":6,"column":0},"end":{"line":17,"column":3}}},"fnMap":{},"branchMap":{"0":{"loc":{"start":{"line":9,"column":17},"end":{"line":9,"column":46}},"type":"binary-expr","locations":[{"start":{"line":9,"column":17},"end":{"line":9,"column":36}},{"start":{"line":9,"column":40},"end":{"line":9,"column":46}}]}},"s":{"0":0,"1":0,"2":0,"3":0},"f":{},"b":{"0":[0,0]}} -,"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\database\\database.module.ts": {"path":"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\database\\database.module.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":48}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":48}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":61}},"3":{"start":{"line":23,"column":7},"end":{"line":23,"column":null}},"4":{"start":{"line":23,"column":13},"end":{"line":23,"column":27}},"5":{"start":{"line":23,"column":13},"end":{"line":23,"column":null}},"6":{"start":{"line":10,"column":59},"end":{"line":19,"column":8}}},"fnMap":{"0":{"name":"(anonymous_1)","decl":{"start":{"line":10,"column":18},"end":{"line":10,"column":23}},"loc":{"start":{"line":10,"column":59},"end":{"line":19,"column":8}}}},"branchMap":{},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0},"f":{"0":0},"b":{}} -,"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\database\\env.validation.ts": {"path":"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\database\\env.validation.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":27}},"1":{"start":{"line":3,"column":13},"end":{"line":20,"column":3}}},"fnMap":{},"branchMap":{},"s":{"0":0,"1":0},"f":{},"b":{}} -,"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\database\\migrations\\1711382400000-CreateDonationsTable.ts": {"path":"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\database\\migrations\\1711382400000-CreateDonationsTable.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":94}},"1":{"start":{"line":5,"column":4},"end":{"line":55,"column":6}},"2":{"start":{"line":58,"column":4},"end":{"line":64,"column":6}},"3":{"start":{"line":66,"column":4},"end":{"line":72,"column":6}},"4":{"start":{"line":75,"column":4},"end":{"line":84,"column":6}},"5":{"start":{"line":86,"column":4},"end":{"line":95,"column":6}},"6":{"start":{"line":99,"column":18},"end":{"line":99,"column":57}},"7":{"start":{"line":101,"column":4},"end":{"line":123,"column":5}},"8":{"start":{"line":103,"column":32},"end":{"line":103,"column":96}},"9":{"start":{"line":103,"column":61},"end":{"line":103,"column":95}},"10":{"start":{"line":104,"column":6},"end":{"line":106,"column":7}},"11":{"start":{"line":105,"column":8},"end":{"line":105,"column":73}},"12":{"start":{"line":108,"column":30},"end":{"line":108,"column":92}},"13":{"start":{"line":108,"column":59},"end":{"line":108,"column":91}},"14":{"start":{"line":109,"column":6},"end":{"line":111,"column":7}},"15":{"start":{"line":110,"column":8},"end":{"line":110,"column":71}},"16":{"start":{"line":114,"column":29},"end":{"line":114,"column":95}},"17":{"start":{"line":114,"column":55},"end":{"line":114,"column":94}},"18":{"start":{"line":115,"column":6},"end":{"line":117,"column":7}},"19":{"start":{"line":116,"column":8},"end":{"line":116,"column":65}},"20":{"start":{"line":119,"column":35},"end":{"line":119,"column":107}},"21":{"start":{"line":119,"column":61},"end":{"line":119,"column":106}},"22":{"start":{"line":120,"column":6},"end":{"line":122,"column":7}},"23":{"start":{"line":121,"column":8},"end":{"line":121,"column":71}},"24":{"start":{"line":125,"column":4},"end":{"line":125,"column":45}},"25":{"start":{"line":3,"column":0},"end":{"line":3,"column":13}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":4,"column":9},"end":{"line":4,"column":14}},"loc":{"start":{"line":4,"column":42},"end":{"line":96,"column":3}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":98,"column":9},"end":{"line":98,"column":14}},"loc":{"start":{"line":98,"column":44},"end":{"line":126,"column":3}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":103,"column":55},"end":{"line":103,"column":57}},"loc":{"start":{"line":103,"column":61},"end":{"line":103,"column":95}}},"3":{"name":"(anonymous_3)","decl":{"start":{"line":108,"column":53},"end":{"line":108,"column":55}},"loc":{"start":{"line":108,"column":59},"end":{"line":108,"column":91}}},"4":{"name":"(anonymous_4)","decl":{"start":{"line":114,"column":48},"end":{"line":114,"column":51}},"loc":{"start":{"line":114,"column":55},"end":{"line":114,"column":94}}},"5":{"name":"(anonymous_5)","decl":{"start":{"line":119,"column":54},"end":{"line":119,"column":57}},"loc":{"start":{"line":119,"column":61},"end":{"line":119,"column":106}}}},"branchMap":{"0":{"loc":{"start":{"line":101,"column":4},"end":{"line":123,"column":5}},"type":"if","locations":[{"start":{"line":101,"column":4},"end":{"line":123,"column":5}},{"start":{},"end":{}}]},"1":{"loc":{"start":{"line":104,"column":6},"end":{"line":106,"column":7}},"type":"if","locations":[{"start":{"line":104,"column":6},"end":{"line":106,"column":7}},{"start":{},"end":{}}]},"2":{"loc":{"start":{"line":109,"column":6},"end":{"line":111,"column":7}},"type":"if","locations":[{"start":{"line":109,"column":6},"end":{"line":111,"column":7}},{"start":{},"end":{}}]},"3":{"loc":{"start":{"line":115,"column":6},"end":{"line":117,"column":7}},"type":"if","locations":[{"start":{"line":115,"column":6},"end":{"line":117,"column":7}},{"start":{},"end":{}}]},"4":{"loc":{"start":{"line":120,"column":6},"end":{"line":122,"column":7}},"type":"if","locations":[{"start":{"line":120,"column":6},"end":{"line":122,"column":7}},{"start":{},"end":{}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0]}} -,"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\donations\\donations.controller.ts": {"path":"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\donations\\donations.controller.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":12,"column":0},"end":{"line":12,"column":94}},"2":{"start":{"line":13,"column":0},"end":{"line":13,"column":65}},"3":{"start":{"line":14,"column":0},"end":{"line":14,"column":62}},"4":{"start":{"line":15,"column":0},"end":{"line":15,"column":62}},"5":{"start":{"line":16,"column":0},"end":{"line":16,"column":66}},"6":{"start":{"line":20,"column":7},"end":{"line":121,"column":null}},"7":{"start":{"line":21,"column":31},"end":{"line":21,"column":49}},"8":{"start":{"line":30,"column":4},"end":{"line":30,"column":59}},"9":{"start":{"line":42,"column":4},"end":{"line":42,"column":54}},"10":{"start":{"line":50,"column":4},"end":{"line":50,"column":45}},"11":{"start":{"line":63,"column":4},"end":{"line":63,"column":71}},"12":{"start":{"line":76,"column":4},"end":{"line":76,"column":67}},"13":{"start":{"line":84,"column":4},"end":{"line":84,"column":61}},"14":{"start":{"line":96,"column":4},"end":{"line":96,"column":63}},"15":{"start":{"line":105,"column":4},"end":{"line":105,"column":44}},"16":{"start":{"line":112,"column":4},"end":{"line":112,"column":72}},"17":{"start":{"line":119,"column":4},"end":{"line":119,"column":71}},"18":{"start":{"line":20,"column":13},"end":{"line":20,"column":32}},"19":{"start":{"line":29,"column":2},"end":{"line":31,"column":null}},"20":{"start":{"line":38,"column":2},"end":{"line":43,"column":null}},"21":{"start":{"line":49,"column":2},"end":{"line":51,"column":null}},"22":{"start":{"line":58,"column":2},"end":{"line":64,"column":null}},"23":{"start":{"line":71,"column":2},"end":{"line":77,"column":null}},"24":{"start":{"line":83,"column":2},"end":{"line":85,"column":null}},"25":{"start":{"line":92,"column":2},"end":{"line":97,"column":null}},"26":{"start":{"line":104,"column":2},"end":{"line":106,"column":null}},"27":{"start":{"line":111,"column":2},"end":{"line":113,"column":null}},"28":{"start":{"line":118,"column":2},"end":{"line":120,"column":null}},"29":{"start":{"line":20,"column":13},"end":{"line":121,"column":null}}},"fnMap":{"0":{"name":"(anonymous_4)","decl":{"start":{"line":21,"column":2},"end":{"line":21,"column":31}},"loc":{"start":{"line":21,"column":65},"end":{"line":21,"column":69}}},"1":{"name":"(anonymous_5)","decl":{"start":{"line":29,"column":2},"end":{"line":29,"column":8}},"loc":{"start":{"line":29,"column":53},"end":{"line":31,"column":3}}},"2":{"name":"(anonymous_6)","decl":{"start":{"line":38,"column":2},"end":{"line":38,"column":9}},"loc":{"start":{"line":40,"column":77},"end":{"line":43,"column":3}}},"3":{"name":"(anonymous_7)","decl":{"start":{"line":49,"column":2},"end":{"line":49,"column":9}},"loc":{"start":{"line":49,"column":48},"end":{"line":51,"column":3}}},"4":{"name":"(anonymous_8)","decl":{"start":{"line":58,"column":2},"end":{"line":58,"column":15}},"loc":{"start":{"line":61,"column":38},"end":{"line":64,"column":3}}},"5":{"name":"(anonymous_9)","decl":{"start":{"line":71,"column":2},"end":{"line":71,"column":13}},"loc":{"start":{"line":74,"column":38},"end":{"line":77,"column":3}}},"6":{"name":"(anonymous_10)","decl":{"start":{"line":83,"column":2},"end":{"line":83,"column":23}},"loc":{"start":{"line":83,"column":51},"end":{"line":85,"column":3}}},"7":{"name":"(anonymous_11)","decl":{"start":{"line":92,"column":2},"end":{"line":92,"column":8}},"loc":{"start":{"line":94,"column":48},"end":{"line":97,"column":3}}},"8":{"name":"(anonymous_12)","decl":{"start":{"line":104,"column":2},"end":{"line":104,"column":8}},"loc":{"start":{"line":104,"column":47},"end":{"line":106,"column":3}}},"9":{"name":"(anonymous_13)","decl":{"start":{"line":111,"column":2},"end":{"line":111,"column":20}},"loc":{"start":{"line":111,"column":73},"end":{"line":113,"column":3}}},"10":{"name":"(anonymous_14)","decl":{"start":{"line":118,"column":2},"end":{"line":118,"column":20}},"loc":{"start":{"line":118,"column":73},"end":{"line":120,"column":3}}}},"branchMap":{"0":{"loc":{"start":{"line":39,"column":58},"end":{"line":39,"column":74}},"type":"default-arg","locations":[{"start":{"line":39,"column":73},"end":{"line":39,"column":74}}]},"1":{"loc":{"start":{"line":40,"column":59},"end":{"line":40,"column":77}},"type":"default-arg","locations":[{"start":{"line":40,"column":75},"end":{"line":40,"column":77}}]},"2":{"loc":{"start":{"line":60,"column":19},"end":{"line":60,"column":35}},"type":"default-arg","locations":[{"start":{"line":60,"column":34},"end":{"line":60,"column":35}}]},"3":{"loc":{"start":{"line":61,"column":20},"end":{"line":61,"column":38}},"type":"default-arg","locations":[{"start":{"line":61,"column":36},"end":{"line":61,"column":38}}]},"4":{"loc":{"start":{"line":73,"column":19},"end":{"line":73,"column":35}},"type":"default-arg","locations":[{"start":{"line":73,"column":34},"end":{"line":73,"column":35}}]},"5":{"loc":{"start":{"line":74,"column":20},"end":{"line":74,"column":38}},"type":"default-arg","locations":[{"start":{"line":74,"column":36},"end":{"line":74,"column":38}}]},"6":{"loc":{"start":{"line":29,"column":36},"end":{"line":29,"column":null}},"type":"cond-expr","locations":[{"start":{"line":29,"column":53},"end":{"line":29,"column":null}},{"start":{"line":29,"column":53},"end":{"line":29,"column":null}}]},"7":{"loc":{"start":{"line":29,"column":36},"end":{"line":29,"column":53}},"type":"binary-expr","locations":[{"start":{"line":29,"column":36},"end":{"line":29,"column":null}},{"start":{"line":29,"column":36},"end":{"line":29,"column":53}}]},"8":{"loc":{"start":{"line":94,"column":31},"end":{"line":94,"column":null}},"type":"cond-expr","locations":[{"start":{"line":94,"column":48},"end":{"line":94,"column":null}},{"start":{"line":94,"column":48},"end":{"line":94,"column":null}}]},"9":{"loc":{"start":{"line":94,"column":31},"end":{"line":94,"column":48}},"type":"binary-expr","locations":[{"start":{"line":94,"column":31},"end":{"line":94,"column":null}},{"start":{"line":94,"column":31},"end":{"line":94,"column":48}}]},"10":{"loc":{"start":{"line":21,"column":49},"end":{"line":21,"column":68}},"type":"cond-expr","locations":[{"start":{"line":21,"column":65},"end":{"line":21,"column":68}},{"start":{"line":21,"column":65},"end":{"line":21,"column":68}}]},"11":{"loc":{"start":{"line":21,"column":49},"end":{"line":21,"column":65}},"type":"binary-expr","locations":[{"start":{"line":21,"column":49},"end":{"line":21,"column":68}},{"start":{"line":21,"column":49},"end":{"line":21,"column":65}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0},"b":{"0":[0],"1":[0],"2":[0],"3":[0],"4":[0],"5":[0],"6":[0,0],"7":[0,0],"8":[0,0],"9":[0,0],"10":[0,0],"11":[0,0]}} -,"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\donations\\donations.module.ts": {"path":"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\donations\\donations.module.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":40}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":48}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":61}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":65}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":54}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":62}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":53}},"7":{"start":{"line":17,"column":7},"end":{"line":17,"column":null}},"8":{"start":{"line":17,"column":13},"end":{"line":17,"column":28}},"9":{"start":{"line":17,"column":13},"end":{"line":17,"column":null}}},"fnMap":{},"branchMap":{},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0},"f":{},"b":{}} -,"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\donations\\dto\\create-donation.dto.ts": {"path":"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\donations\\dto\\create-donation.dto.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":82}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":46}},"2":{"start":{"line":28,"column":26},"end":{"line":28,"column":31}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":13}},"4":{"start":{"line":8,"column":2},"end":{"line":8,"column":null}},"5":{"start":{"line":14,"column":2},"end":{"line":14,"column":null}},"6":{"start":{"line":19,"column":2},"end":{"line":19,"column":null}},"7":{"start":{"line":24,"column":2},"end":{"line":24,"column":null}},"8":{"start":{"line":28,"column":2},"end":{"line":28,"column":null}}},"fnMap":{},"branchMap":{},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0},"f":{},"b":{}} -,"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\donations\\dto\\donation-response.dto.ts": {"path":"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\donations\\dto\\donation-response.dto.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":46}},"1":{"start":{"line":30,"column":4},"end":{"line":39,"column":6}},"2":{"start":{"line":4,"column":0},"end":{"line":4,"column":13}},"3":{"start":{"line":6,"column":2},"end":{"line":6,"column":null}},"4":{"start":{"line":9,"column":2},"end":{"line":9,"column":null}},"5":{"start":{"line":12,"column":2},"end":{"line":12,"column":null}},"6":{"start":{"line":15,"column":2},"end":{"line":15,"column":null}},"7":{"start":{"line":18,"column":2},"end":{"line":18,"column":null}},"8":{"start":{"line":21,"column":2},"end":{"line":21,"column":null}},"9":{"start":{"line":24,"column":2},"end":{"line":24,"column":null}},"10":{"start":{"line":27,"column":2},"end":{"line":27,"column":null}}},"fnMap":{"0":{"name":"(anonymous_2)","decl":{"start":{"line":29,"column":2},"end":{"line":29,"column":8}},"loc":{"start":{"line":29,"column":38},"end":{"line":40,"column":3}}}},"branchMap":{"0":{"loc":{"start":{"line":27,"column":13},"end":{"line":27,"column":18}},"type":"cond-expr","locations":[{"start":{"line":27,"column":17},"end":{"line":27,"column":18}},{"start":{"line":27,"column":17},"end":{"line":27,"column":18}}]},"1":{"loc":{"start":{"line":27,"column":13},"end":{"line":27,"column":17}},"type":"binary-expr","locations":[{"start":{"line":27,"column":13},"end":{"line":27,"column":18}},{"start":{"line":27,"column":13},"end":{"line":27,"column":17}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0},"f":{"0":0},"b":{"0":[0,0],"1":[0,0]}} -,"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\donations\\dto\\update-donation.dto.ts": {"path":"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\donations\\dto\\update-donation.dto.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":46}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":58}},"2":{"start":{"line":4,"column":0},"end":{"line":4,"column":13}}},"fnMap":{},"branchMap":{},"s":{"0":0,"1":0,"2":0},"f":{},"b":{}} -,"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\donations\\entities\\donation.entity.ts": {"path":"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\donations\\entities\\donation.entity.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":11,"column":0},"end":{"line":11,"column":56}},"2":{"start":{"line":12,"column":0},"end":{"line":12,"column":65}},"3":{"start":{"line":18,"column":7},"end":{"line":52,"column":null}},"4":{"start":{"line":18,"column":13},"end":{"line":18,"column":21}},"5":{"start":{"line":20,"column":2},"end":{"line":20,"column":null}},"6":{"start":{"line":23,"column":2},"end":{"line":23,"column":null}},"7":{"start":{"line":29,"column":2},"end":{"line":29,"column":null}},"8":{"start":{"line":25,"column":19},"end":{"line":25,"column":26}},"9":{"start":{"line":25,"column":41},"end":{"line":25,"column":58}},"10":{"start":{"line":32,"column":2},"end":{"line":32,"column":null}},"11":{"start":{"line":36,"column":2},"end":{"line":36,"column":null}},"12":{"start":{"line":34,"column":19},"end":{"line":34,"column":23}},"13":{"start":{"line":39,"column":2},"end":{"line":39,"column":null}},"14":{"start":{"line":42,"column":2},"end":{"line":42,"column":null}},"15":{"start":{"line":45,"column":2},"end":{"line":45,"column":null}},"16":{"start":{"line":48,"column":2},"end":{"line":48,"column":null}},"17":{"start":{"line":51,"column":2},"end":{"line":51,"column":null}},"18":{"start":{"line":18,"column":13},"end":{"line":52,"column":null}}},"fnMap":{"0":{"name":"(anonymous_2)","decl":{"start":{"line":25,"column":13},"end":{"line":25,"column":16}},"loc":{"start":{"line":25,"column":19},"end":{"line":25,"column":26}}},"1":{"name":"(anonymous_3)","decl":{"start":{"line":25,"column":28},"end":{"line":25,"column":29}},"loc":{"start":{"line":25,"column":41},"end":{"line":25,"column":58}}},"2":{"name":"(anonymous_4)","decl":{"start":{"line":34,"column":13},"end":{"line":34,"column":16}},"loc":{"start":{"line":34,"column":19},"end":{"line":34,"column":23}}}},"branchMap":{"0":{"loc":{"start":{"line":29,"column":11},"end":{"line":29,"column":19}},"type":"cond-expr","locations":[{"start":{"line":29,"column":18},"end":{"line":29,"column":19}},{"start":{"line":29,"column":18},"end":{"line":29,"column":19}}]},"1":{"loc":{"start":{"line":29,"column":11},"end":{"line":29,"column":18}},"type":"binary-expr","locations":[{"start":{"line":29,"column":11},"end":{"line":29,"column":19}},{"start":{"line":29,"column":11},"end":{"line":29,"column":18}}]},"2":{"loc":{"start":{"line":51,"column":13},"end":{"line":51,"column":18}},"type":"cond-expr","locations":[{"start":{"line":51,"column":17},"end":{"line":51,"column":18}},{"start":{"line":51,"column":17},"end":{"line":51,"column":18}}]},"3":{"loc":{"start":{"line":51,"column":13},"end":{"line":51,"column":17}},"type":"binary-expr","locations":[{"start":{"line":51,"column":13},"end":{"line":51,"column":18}},{"start":{"line":51,"column":13},"end":{"line":51,"column":17}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0},"f":{"0":0,"1":0,"2":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0]}} -,"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\donations\\providers\\donations.service.ts": {"path":"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\donations\\providers\\donations.service.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":103}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":51}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":37}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":55}},"4":{"start":{"line":7,"column":0},"end":{"line":7,"column":67}},"5":{"start":{"line":10,"column":7},"end":{"line":138,"column":null}},"6":{"start":{"line":13,"column":12},"end":{"line":13,"column":33}},"7":{"start":{"line":17,"column":4},"end":{"line":29,"column":5}},"8":{"start":{"line":18,"column":23},"end":{"line":20,"column":8}},"9":{"start":{"line":22,"column":28},"end":{"line":22,"column":73}},"10":{"start":{"line":23,"column":6},"end":{"line":23,"column":59}},"11":{"start":{"line":25,"column":6},"end":{"line":27,"column":7}},"12":{"start":{"line":26,"column":8},"end":{"line":26,"column":92}},"13":{"start":{"line":28,"column":6},"end":{"line":28,"column":65}},"14":{"start":{"line":33,"column":26},"end":{"line":38,"column":6}},"15":{"start":{"line":40,"column":4},"end":{"line":43,"column":6}},"16":{"start":{"line":41,"column":35},"end":{"line":41,"column":75}},"17":{"start":{"line":47,"column":21},"end":{"line":50,"column":6}},"18":{"start":{"line":52,"column":4},"end":{"line":54,"column":5}},"19":{"start":{"line":53,"column":6},"end":{"line":53,"column":70}},"20":{"start":{"line":56,"column":4},"end":{"line":56,"column":52}},"21":{"start":{"line":60,"column":26},"end":{"line":66,"column":6}},"22":{"start":{"line":68,"column":4},"end":{"line":71,"column":6}},"23":{"start":{"line":69,"column":35},"end":{"line":69,"column":75}},"24":{"start":{"line":75,"column":26},"end":{"line":81,"column":6}},"25":{"start":{"line":83,"column":4},"end":{"line":86,"column":6}},"26":{"start":{"line":84,"column":35},"end":{"line":84,"column":75}},"27":{"start":{"line":90,"column":21},"end":{"line":93,"column":6}},"28":{"start":{"line":95,"column":4},"end":{"line":97,"column":5}},"29":{"start":{"line":96,"column":6},"end":{"line":96,"column":97}},"30":{"start":{"line":99,"column":4},"end":{"line":99,"column":52}},"31":{"start":{"line":103,"column":21},"end":{"line":103,"column":43}},"32":{"start":{"line":105,"column":4},"end":{"line":105,"column":47}},"33":{"start":{"line":107,"column":4},"end":{"line":115,"column":5}},"34":{"start":{"line":108,"column":30},"end":{"line":108,"column":75}},"35":{"start":{"line":109,"column":6},"end":{"line":109,"column":61}},"36":{"start":{"line":111,"column":6},"end":{"line":113,"column":7}},"37":{"start":{"line":112,"column":8},"end":{"line":112,"column":92}},"38":{"start":{"line":114,"column":6},"end":{"line":114,"column":65}},"39":{"start":{"line":119,"column":21},"end":{"line":119,"column":43}},"40":{"start":{"line":120,"column":4},"end":{"line":120,"column":55}},"41":{"start":{"line":124,"column":19},"end":{"line":128,"column":18}},"42":{"start":{"line":130,"column":4},"end":{"line":130,"column":41}},"43":{"start":{"line":134,"column":4},"end":{"line":136,"column":7}},"44":{"start":{"line":10,"column":13},"end":{"line":10,"column":29}},"45":{"start":{"line":10,"column":13},"end":{"line":138,"column":null}}},"fnMap":{"0":{"name":"(anonymous_4)","decl":{"start":{"line":11,"column":2},"end":{"line":11,"column":null}},"loc":{"start":{"line":13,"column":53},"end":{"line":14,"column":6}}},"1":{"name":"(anonymous_5)","decl":{"start":{"line":16,"column":2},"end":{"line":16,"column":7}},"loc":{"start":{"line":16,"column":51},"end":{"line":30,"column":3}}},"2":{"name":"(anonymous_6)","decl":{"start":{"line":32,"column":2},"end":{"line":32,"column":7}},"loc":{"start":{"line":32,"column":52},"end":{"line":44,"column":3}}},"3":{"name":"(anonymous_7)","decl":{"start":{"line":41,"column":21},"end":{"line":41,"column":22}},"loc":{"start":{"line":41,"column":35},"end":{"line":41,"column":75}}},"4":{"name":"(anonymous_8)","decl":{"start":{"line":46,"column":2},"end":{"line":46,"column":7}},"loc":{"start":{"line":46,"column":26},"end":{"line":57,"column":3}}},"5":{"name":"(anonymous_9)","decl":{"start":{"line":59,"column":2},"end":{"line":59,"column":7}},"loc":{"start":{"line":59,"column":77},"end":{"line":72,"column":3}}},"6":{"name":"(anonymous_10)","decl":{"start":{"line":69,"column":21},"end":{"line":69,"column":22}},"loc":{"start":{"line":69,"column":35},"end":{"line":69,"column":75}}},"7":{"name":"(anonymous_11)","decl":{"start":{"line":74,"column":2},"end":{"line":74,"column":7}},"loc":{"start":{"line":74,"column":73},"end":{"line":87,"column":3}}},"8":{"name":"(anonymous_12)","decl":{"start":{"line":84,"column":21},"end":{"line":84,"column":22}},"loc":{"start":{"line":84,"column":35},"end":{"line":84,"column":75}}},"9":{"name":"(anonymous_13)","decl":{"start":{"line":89,"column":2},"end":{"line":89,"column":7}},"loc":{"start":{"line":89,"column":53},"end":{"line":100,"column":3}}},"10":{"name":"(anonymous_14)","decl":{"start":{"line":102,"column":2},"end":{"line":102,"column":7}},"loc":{"start":{"line":102,"column":63},"end":{"line":116,"column":3}}},"11":{"name":"(anonymous_15)","decl":{"start":{"line":118,"column":2},"end":{"line":118,"column":7}},"loc":{"start":{"line":118,"column":25},"end":{"line":121,"column":3}}},"12":{"name":"(anonymous_16)","decl":{"start":{"line":123,"column":2},"end":{"line":123,"column":7}},"loc":{"start":{"line":123,"column":53},"end":{"line":131,"column":3}}},"13":{"name":"(anonymous_17)","decl":{"start":{"line":133,"column":2},"end":{"line":133,"column":7}},"loc":{"start":{"line":133,"column":52},"end":{"line":137,"column":3}}}},"branchMap":{"0":{"loc":{"start":{"line":25,"column":6},"end":{"line":27,"column":7}},"type":"if","locations":[{"start":{"line":25,"column":6},"end":{"line":27,"column":7}},{"start":{},"end":{}}]},"1":{"loc":{"start":{"line":32,"column":16},"end":{"line":32,"column":32}},"type":"default-arg","locations":[{"start":{"line":32,"column":31},"end":{"line":32,"column":32}}]},"2":{"loc":{"start":{"line":32,"column":34},"end":{"line":32,"column":52}},"type":"default-arg","locations":[{"start":{"line":32,"column":50},"end":{"line":32,"column":52}}]},"3":{"loc":{"start":{"line":52,"column":4},"end":{"line":54,"column":5}},"type":"if","locations":[{"start":{"line":52,"column":4},"end":{"line":54,"column":5}},{"start":{},"end":{}}]},"4":{"loc":{"start":{"line":59,"column":41},"end":{"line":59,"column":57}},"type":"default-arg","locations":[{"start":{"line":59,"column":56},"end":{"line":59,"column":57}}]},"5":{"loc":{"start":{"line":59,"column":59},"end":{"line":59,"column":77}},"type":"default-arg","locations":[{"start":{"line":59,"column":75},"end":{"line":59,"column":77}}]},"6":{"loc":{"start":{"line":74,"column":37},"end":{"line":74,"column":53}},"type":"default-arg","locations":[{"start":{"line":74,"column":52},"end":{"line":74,"column":53}}]},"7":{"loc":{"start":{"line":74,"column":55},"end":{"line":74,"column":73}},"type":"default-arg","locations":[{"start":{"line":74,"column":71},"end":{"line":74,"column":73}}]},"8":{"loc":{"start":{"line":95,"column":4},"end":{"line":97,"column":5}},"type":"if","locations":[{"start":{"line":95,"column":4},"end":{"line":97,"column":5}},{"start":{},"end":{}}]},"9":{"loc":{"start":{"line":111,"column":6},"end":{"line":113,"column":7}},"type":"if","locations":[{"start":{"line":111,"column":6},"end":{"line":113,"column":7}},{"start":{},"end":{}}]},"10":{"loc":{"start":{"line":130,"column":11},"end":{"line":130,"column":40}},"type":"binary-expr","locations":[{"start":{"line":130,"column":11},"end":{"line":130,"column":35}},{"start":{"line":130,"column":39},"end":{"line":130,"column":40}}]},"11":{"loc":{"start":{"line":13,"column":33},"end":{"line":13,"column":53}},"type":"cond-expr","locations":[{"start":{"line":13,"column":43},"end":{"line":13,"column":53}},{"start":{"line":13,"column":43},"end":{"line":13,"column":53}}]},"12":{"loc":{"start":{"line":13,"column":33},"end":{"line":13,"column":43}},"type":"binary-expr","locations":[{"start":{"line":13,"column":33},"end":{"line":13,"column":53}},{"start":{"line":13,"column":33},"end":{"line":13,"column":43}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0},"b":{"0":[0,0],"1":[0],"2":[0],"3":[0,0],"4":[0],"5":[0],"6":[0],"7":[0],"8":[0,0],"9":[0,0],"10":[0,0],"11":[0,0],"12":[0,0]}} -,"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\logger\\logger.middleware.ts": {"path":"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\logger\\logger.middleware.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":60}},"1":{"start":{"line":3,"column":0},"end":{"line":3,"column":49}},"2":{"start":{"line":6,"column":7},"end":{"line":30,"column":null}},"3":{"start":{"line":7,"column":31},"end":{"line":7,"column":39}},"4":{"start":{"line":10,"column":36},"end":{"line":10,"column":39}},"5":{"start":{"line":11,"column":18},"end":{"line":11,"column":28}},"6":{"start":{"line":13,"column":4},"end":{"line":26,"column":7}},"7":{"start":{"line":14,"column":29},"end":{"line":14,"column":32}},"8":{"start":{"line":15,"column":23},"end":{"line":15,"column":41}},"9":{"start":{"line":16,"column":6},"end":{"line":25,"column":8}},"10":{"start":{"line":28,"column":4},"end":{"line":28,"column":11}},"11":{"start":{"line":6,"column":13},"end":{"line":6,"column":29}},"12":{"start":{"line":6,"column":13},"end":{"line":30,"column":null}}},"fnMap":{"0":{"name":"(anonymous_2)","decl":{"start":{"line":7,"column":2},"end":{"line":7,"column":31}},"loc":{"start":{"line":7,"column":52},"end":{"line":7,"column":56}}},"1":{"name":"(anonymous_3)","decl":{"start":{"line":9,"column":2},"end":{"line":9,"column":5}},"loc":{"start":{"line":9,"column":53},"end":{"line":29,"column":3}}},"2":{"name":"(anonymous_4)","decl":{"start":{"line":13,"column":21},"end":{"line":13,"column":24}},"loc":{"start":{"line":13,"column":26},"end":{"line":26,"column":5}}}},"branchMap":{"0":{"loc":{"start":{"line":7,"column":39},"end":{"line":7,"column":55}},"type":"cond-expr","locations":[{"start":{"line":7,"column":52},"end":{"line":7,"column":55}},{"start":{"line":7,"column":52},"end":{"line":7,"column":55}}]},"1":{"loc":{"start":{"line":7,"column":39},"end":{"line":7,"column":52}},"type":"binary-expr","locations":[{"start":{"line":7,"column":39},"end":{"line":7,"column":55}},{"start":{"line":7,"column":39},"end":{"line":7,"column":52}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0},"f":{"0":0,"1":0,"2":0},"b":{"0":[0,0],"1":[0,0]}} -,"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\logger\\logger.module.ts": {"path":"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\logger\\logger.module.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":7,"column":0},"end":{"line":7,"column":49}},"2":{"start":{"line":8,"column":0},"end":{"line":8,"column":55}},"3":{"start":{"line":14,"column":7},"end":{"line":20,"column":null}},"4":{"start":{"line":16,"column":4},"end":{"line":18,"column":59}},"5":{"start":{"line":14,"column":13},"end":{"line":14,"column":25}},"6":{"start":{"line":14,"column":13},"end":{"line":20,"column":null}}},"fnMap":{"0":{"name":"(anonymous_1)","decl":{"start":{"line":15,"column":2},"end":{"line":15,"column":11}},"loc":{"start":{"line":15,"column":40},"end":{"line":19,"column":3}}}},"branchMap":{},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0},"f":{"0":0},"b":{}} -,"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\logger\\logger.service.ts": {"path":"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\logger\\logger.service.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":61}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":24}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":75}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":28}},"4":{"start":{"line":7,"column":7},"end":{"line":84,"column":null}},"5":{"start":{"line":13,"column":16},"end":{"line":13,"column":53}},"6":{"start":{"line":15,"column":6},"end":{"line":15,"column":72}},"7":{"start":{"line":16,"column":4},"end":{"line":16,"column":41}},"8":{"start":{"line":18,"column":20},"end":{"line":18,"column":70}},"9":{"start":{"line":19,"column":4},"end":{"line":19,"column":70}},"10":{"start":{"line":19,"column":30},"end":{"line":19,"column":70}},"11":{"start":{"line":21,"column":21},"end":{"line":21,"column":65}},"12":{"start":{"line":22,"column":4},"end":{"line":22,"column":62}},"13":{"start":{"line":24,"column":40},"end":{"line":27,"column":6}},"14":{"start":{"line":31,"column":4},"end":{"line":31,"column":52}},"15":{"start":{"line":35,"column":14},"end":{"line":35,"column":24}},"16":{"start":{"line":36,"column":4},"end":{"line":36,"column":40}},"17":{"start":{"line":40,"column":18},"end":{"line":40,"column":35}},"18":{"start":{"line":41,"column":4},"end":{"line":53,"column":5}},"19":{"start":{"line":42,"column":6},"end":{"line":42,"column":31}},"20":{"start":{"line":43,"column":6},"end":{"line":47,"column":7}},"21":{"start":{"line":44,"column":8},"end":{"line":44,"column":26}},"22":{"start":{"line":48,"column":22},"end":{"line":48,"column":72}},"23":{"start":{"line":49,"column":23},"end":{"line":49,"column":67}},"24":{"start":{"line":50,"column":6},"end":{"line":50,"column":64}},"25":{"start":{"line":51,"column":19},"end":{"line":51,"column":69}},"26":{"start":{"line":52,"column":6},"end":{"line":52,"column":51}},"27":{"start":{"line":57,"column":4},"end":{"line":57,"column":26}},"28":{"start":{"line":58,"column":4},"end":{"line":58,"column":43}},"29":{"start":{"line":62,"column":4},"end":{"line":62,"column":26}},"30":{"start":{"line":63,"column":4},"end":{"line":64,"column":49}},"31":{"start":{"line":63,"column":15},"end":{"line":63,"column":62}},"32":{"start":{"line":64,"column":9},"end":{"line":64,"column":49}},"33":{"start":{"line":68,"column":4},"end":{"line":68,"column":26}},"34":{"start":{"line":69,"column":4},"end":{"line":69,"column":43}},"35":{"start":{"line":73,"column":4},"end":{"line":73,"column":26}},"36":{"start":{"line":74,"column":4},"end":{"line":74,"column":44}},"37":{"start":{"line":78,"column":4},"end":{"line":82,"column":5}},"38":{"start":{"line":79,"column":6},"end":{"line":79,"column":24}},"39":{"start":{"line":7,"column":13},"end":{"line":7,"column":26}},"40":{"start":{"line":7,"column":13},"end":{"line":84,"column":null}}},"fnMap":{"0":{"name":"(anonymous_3)","decl":{"start":{"line":12,"column":2},"end":{"line":12,"column":null}},"loc":{"start":{"line":12,"column":2},"end":{"line":32,"column":3}}},"1":{"name":"(anonymous_4)","decl":{"start":{"line":34,"column":10},"end":{"line":34,"column":20}},"loc":{"start":{"line":34,"column":20},"end":{"line":37,"column":3}}},"2":{"name":"(anonymous_5)","decl":{"start":{"line":39,"column":10},"end":{"line":39,"column":24}},"loc":{"start":{"line":39,"column":24},"end":{"line":54,"column":3}}},"3":{"name":"(anonymous_6)","decl":{"start":{"line":56,"column":2},"end":{"line":56,"column":5}},"loc":{"start":{"line":56,"column":49},"end":{"line":59,"column":3}}},"4":{"name":"(anonymous_7)","decl":{"start":{"line":61,"column":2},"end":{"line":61,"column":7}},"loc":{"start":{"line":61,"column":67},"end":{"line":65,"column":3}}},"5":{"name":"(anonymous_8)","decl":{"start":{"line":67,"column":2},"end":{"line":67,"column":6}},"loc":{"start":{"line":67,"column":50},"end":{"line":70,"column":3}}},"6":{"name":"(anonymous_9)","decl":{"start":{"line":72,"column":2},"end":{"line":72,"column":7}},"loc":{"start":{"line":72,"column":51},"end":{"line":75,"column":3}}},"7":{"name":"(anonymous_10)","decl":{"start":{"line":77,"column":2},"end":{"line":77,"column":17}},"loc":{"start":{"line":77,"column":17},"end":{"line":83,"column":3}}}},"branchMap":{"0":{"loc":{"start":{"line":13,"column":16},"end":{"line":13,"column":53}},"type":"binary-expr","locations":[{"start":{"line":13,"column":16},"end":{"line":13,"column":36}},{"start":{"line":13,"column":40},"end":{"line":13,"column":53}}]},"1":{"loc":{"start":{"line":15,"column":6},"end":{"line":15,"column":72}},"type":"binary-expr","locations":[{"start":{"line":15,"column":6},"end":{"line":15,"column":27}},{"start":{"line":15,"column":32},"end":{"line":15,"column":71}}]},"2":{"loc":{"start":{"line":15,"column":32},"end":{"line":15,"column":71}},"type":"cond-expr","locations":[{"start":{"line":15,"column":55},"end":{"line":15,"column":61}},{"start":{"line":15,"column":64},"end":{"line":15,"column":71}}]},"3":{"loc":{"start":{"line":18,"column":20},"end":{"line":18,"column":70}},"type":"binary-expr","locations":[{"start":{"line":18,"column":20},"end":{"line":18,"column":39}},{"start":{"line":18,"column":43},"end":{"line":18,"column":70}}]},"4":{"loc":{"start":{"line":19,"column":4},"end":{"line":19,"column":70}},"type":"if","locations":[{"start":{"line":19,"column":4},"end":{"line":19,"column":70}},{"start":{},"end":{}}]},"5":{"loc":{"start":{"line":41,"column":4},"end":{"line":53,"column":5}},"type":"if","locations":[{"start":{"line":41,"column":4},"end":{"line":53,"column":5}},{"start":{},"end":{}}]},"6":{"loc":{"start":{"line":48,"column":22},"end":{"line":48,"column":72}},"type":"binary-expr","locations":[{"start":{"line":48,"column":22},"end":{"line":48,"column":41}},{"start":{"line":48,"column":45},"end":{"line":48,"column":72}}]},"7":{"loc":{"start":{"line":63,"column":4},"end":{"line":64,"column":49}},"type":"if","locations":[{"start":{"line":63,"column":4},"end":{"line":64,"column":49}},{"start":{"line":64,"column":9},"end":{"line":64,"column":49}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,0],"7":[0,0]}} -,"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\mail\\mail.module.ts": {"path":"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\mail\\mail.module.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":40}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":46}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":45}},"3":{"start":{"line":10,"column":7},"end":{"line":10,"column":null}},"4":{"start":{"line":10,"column":13},"end":{"line":10,"column":23}},"5":{"start":{"line":10,"column":13},"end":{"line":10,"column":null}}},"fnMap":{},"branchMap":{},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0},"f":{},"b":{}} -,"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\mail\\mail.service.ts": {"path":"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\mail\\mail.service.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":52}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":47}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":25}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":29}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":27}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":41}},"6":{"start":{"line":21,"column":24},"end":{"line":145,"column":null}},"7":{"start":{"line":22,"column":28},"end":{"line":22,"column":56}},"8":{"start":{"line":23,"column":35},"end":{"line":23,"column":68}},"9":{"start":{"line":25,"column":22},"end":{"line":25,"column":37}},"10":{"start":{"line":28,"column":4},"end":{"line":63,"column":5}},"11":{"start":{"line":29,"column":27},"end":{"line":29,"column":71}},"12":{"start":{"line":30,"column":23},"end":{"line":30,"column":61}},"13":{"start":{"line":32,"column":27},"end":{"line":39,"column":8}},"14":{"start":{"line":41,"column":19},"end":{"line":41,"column":59}},"15":{"start":{"line":43,"column":26},"end":{"line":51,"column":8}},"16":{"start":{"line":53,"column":6},"end":{"line":53,"column":39}},"17":{"start":{"line":54,"column":6},"end":{"line":56,"column":8}},"18":{"start":{"line":58,"column":6},"end":{"line":61,"column":8}},"19":{"start":{"line":62,"column":6},"end":{"line":62,"column":18}},"20":{"start":{"line":67,"column":4},"end":{"line":107,"column":5}},"21":{"start":{"line":68,"column":27},"end":{"line":68,"column":69}},"22":{"start":{"line":69,"column":23},"end":{"line":69,"column":61}},"23":{"start":{"line":71,"column":24},"end":{"line":71,"column":52}},"24":{"start":{"line":72,"column":27},"end":{"line":83,"column":8}},"25":{"start":{"line":85,"column":19},"end":{"line":85,"column":59}},"26":{"start":{"line":87,"column":26},"end":{"line":95,"column":8}},"27":{"start":{"line":97,"column":6},"end":{"line":97,"column":39}},"28":{"start":{"line":98,"column":6},"end":{"line":100,"column":8}},"29":{"start":{"line":102,"column":6},"end":{"line":105,"column":8}},"30":{"start":{"line":106,"column":6},"end":{"line":106,"column":18}},"31":{"start":{"line":111,"column":4},"end":{"line":134,"column":5}},"32":{"start":{"line":113,"column":26},"end":{"line":121,"column":8}},"33":{"start":{"line":123,"column":6},"end":{"line":127,"column":9}},"34":{"start":{"line":129,"column":6},"end":{"line":129,"column":46}},"35":{"start":{"line":130,"column":6},"end":{"line":130,"column":51}},"36":{"start":{"line":132,"column":6},"end":{"line":132,"column":64}},"37":{"start":{"line":133,"column":6},"end":{"line":133,"column":18}},"38":{"start":{"line":138,"column":4},"end":{"line":138,"column":33}},"39":{"start":{"line":138,"column":16},"end":{"line":138,"column":33}},"40":{"start":{"line":139,"column":31},"end":{"line":139,"column":47}},"41":{"start":{"line":140,"column":4},"end":{"line":142,"column":5}},"42":{"start":{"line":141,"column":6},"end":{"line":141,"column":41}},"43":{"start":{"line":143,"column":4},"end":{"line":143,"column":50}},"44":{"start":{"line":21,"column":13},"end":{"line":21,"column":24}},"45":{"start":{"line":21,"column":13},"end":{"line":145,"column":null}}},"fnMap":{"0":{"name":"(anonymous_11)","decl":{"start":{"line":25,"column":2},"end":{"line":25,"column":22}},"loc":{"start":{"line":25,"column":50},"end":{"line":25,"column":54}}},"1":{"name":"(anonymous_12)","decl":{"start":{"line":27,"column":2},"end":{"line":27,"column":7}},"loc":{"start":{"line":27,"column":35},"end":{"line":64,"column":3}}},"2":{"name":"(anonymous_13)","decl":{"start":{"line":66,"column":2},"end":{"line":66,"column":7}},"loc":{"start":{"line":66,"column":59},"end":{"line":108,"column":3}}},"3":{"name":"(anonymous_14)","decl":{"start":{"line":110,"column":10},"end":{"line":110,"column":15}},"loc":{"start":{"line":110,"column":41},"end":{"line":135,"column":3}}},"4":{"name":"(anonymous_15)","decl":{"start":{"line":137,"column":10},"end":{"line":137,"column":19}},"loc":{"start":{"line":137,"column":33},"end":{"line":144,"column":3}}}},"branchMap":{"0":{"loc":{"start":{"line":71,"column":24},"end":{"line":71,"column":52}},"type":"binary-expr","locations":[{"start":{"line":71,"column":24},"end":{"line":71,"column":38}},{"start":{"line":71,"column":42},"end":{"line":71,"column":52}}]},"1":{"loc":{"start":{"line":138,"column":4},"end":{"line":138,"column":33}},"type":"if","locations":[{"start":{"line":138,"column":4},"end":{"line":138,"column":33}},{"start":{},"end":{}}]},"2":{"loc":{"start":{"line":140,"column":4},"end":{"line":142,"column":5}},"type":"if","locations":[{"start":{"line":140,"column":4},"end":{"line":142,"column":5}},{"start":{},"end":{}}]},"3":{"loc":{"start":{"line":25,"column":37},"end":{"line":25,"column":53}},"type":"cond-expr","locations":[{"start":{"line":25,"column":50},"end":{"line":25,"column":53}},{"start":{"line":25,"column":50},"end":{"line":25,"column":53}}]},"4":{"loc":{"start":{"line":25,"column":37},"end":{"line":25,"column":50}},"type":"binary-expr","locations":[{"start":{"line":25,"column":37},"end":{"line":25,"column":53}},{"start":{"line":25,"column":37},"end":{"line":25,"column":50}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0},"f":{"0":0,"1":0,"2":0,"3":0,"4":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0]}} -,"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\projects\\projects.controller.ts": {"path":"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\projects\\projects.controller.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":17,"column":0},"end":{"line":17,"column":null}},"2":{"start":{"line":30,"column":0},"end":{"line":30,"column":60}},"3":{"start":{"line":31,"column":0},"end":{"line":31,"column":67}},"4":{"start":{"line":32,"column":0},"end":{"line":32,"column":60}},"5":{"start":{"line":33,"column":0},"end":{"line":33,"column":73}},"6":{"start":{"line":34,"column":0},"end":{"line":34,"column":62}},"7":{"start":{"line":35,"column":0},"end":{"line":35,"column":62}},"8":{"start":{"line":37,"column":0},"end":{"line":37,"column":63}},"9":{"start":{"line":38,"column":0},"end":{"line":38,"column":63}},"10":{"start":{"line":39,"column":0},"end":{"line":39,"column":58}},"11":{"start":{"line":40,"column":0},"end":{"line":40,"column":61}},"12":{"start":{"line":41,"column":0},"end":{"line":41,"column":59}},"13":{"start":{"line":42,"column":0},"end":{"line":42,"column":63}},"14":{"start":{"line":43,"column":0},"end":{"line":43,"column":69}},"15":{"start":{"line":44,"column":0},"end":{"line":44,"column":58}},"16":{"start":{"line":45,"column":0},"end":{"line":45,"column":64}},"17":{"start":{"line":50,"column":7},"end":{"line":294,"column":null}},"18":{"start":{"line":52,"column":21},"end":{"line":52,"column":38}},"19":{"start":{"line":53,"column":21},"end":{"line":53,"column":41}},"20":{"start":{"line":54,"column":21},"end":{"line":54,"column":36}},"21":{"start":{"line":55,"column":21},"end":{"line":55,"column":39}},"22":{"start":{"line":66,"column":28},"end":{"line":66,"column":69}},"23":{"start":{"line":67,"column":4},"end":{"line":72,"column":6}},"24":{"start":{"line":83,"column":4},"end":{"line":83,"column":50}},"25":{"start":{"line":100,"column":19},"end":{"line":100,"column":31}},"26":{"start":{"line":101,"column":20},"end":{"line":101,"column":79}},"27":{"start":{"line":102,"column":4},"end":{"line":102,"column":19}},"28":{"start":{"line":119,"column":19},"end":{"line":119,"column":31}},"29":{"start":{"line":120,"column":21},"end":{"line":120,"column":34}},"30":{"start":{"line":121,"column":20},"end":{"line":125,"column":null}},"31":{"start":{"line":127,"column":4},"end":{"line":127,"column":19}},"32":{"start":{"line":144,"column":19},"end":{"line":144,"column":31}},"33":{"start":{"line":145,"column":21},"end":{"line":145,"column":34}},"34":{"start":{"line":146,"column":20},"end":{"line":150,"column":null}},"35":{"start":{"line":152,"column":4},"end":{"line":152,"column":19}},"36":{"start":{"line":169,"column":19},"end":{"line":169,"column":31}},"37":{"start":{"line":170,"column":21},"end":{"line":170,"column":34}},"38":{"start":{"line":171,"column":20},"end":{"line":175,"column":null}},"39":{"start":{"line":177,"column":4},"end":{"line":177,"column":19}},"40":{"start":{"line":196,"column":19},"end":{"line":196,"column":31}},"41":{"start":{"line":197,"column":21},"end":{"line":197,"column":34}},"42":{"start":{"line":198,"column":19},"end":{"line":198,"column":90}},"43":{"start":{"line":199,"column":4},"end":{"line":199,"column":22}},"44":{"start":{"line":210,"column":19},"end":{"line":210,"column":69}},"45":{"start":{"line":211,"column":4},"end":{"line":211,"column":22}},"46":{"start":{"line":228,"column":19},"end":{"line":228,"column":31}},"47":{"start":{"line":229,"column":21},"end":{"line":229,"column":34}},"48":{"start":{"line":230,"column":4},"end":{"line":230,"column":73}},"49":{"start":{"line":231,"column":4},"end":{"line":231,"column":53}},"50":{"start":{"line":241,"column":19},"end":{"line":241,"column":69}},"51":{"start":{"line":242,"column":4},"end":{"line":248,"column":6}},"52":{"start":{"line":260,"column":4},"end":{"line":260,"column":57}},"53":{"start":{"line":277,"column":19},"end":{"line":277,"column":31}},"54":{"start":{"line":278,"column":21},"end":{"line":278,"column":34}},"55":{"start":{"line":279,"column":4},"end":{"line":279,"column":88}},"56":{"start":{"line":291,"column":19},"end":{"line":291,"column":31}},"57":{"start":{"line":292,"column":4},"end":{"line":292,"column":74}},"58":{"start":{"line":50,"column":13},"end":{"line":50,"column":31}},"59":{"start":{"line":65,"column":8},"end":{"line":73,"column":null}},"60":{"start":{"line":82,"column":8},"end":{"line":84,"column":null}},"61":{"start":{"line":99,"column":8},"end":{"line":103,"column":null}},"62":{"start":{"line":114,"column":8},"end":{"line":128,"column":null}},"63":{"start":{"line":139,"column":8},"end":{"line":153,"column":null}},"64":{"start":{"line":164,"column":8},"end":{"line":178,"column":null}},"65":{"start":{"line":191,"column":8},"end":{"line":200,"column":null}},"66":{"start":{"line":209,"column":8},"end":{"line":212,"column":null}},"67":{"start":{"line":223,"column":8},"end":{"line":232,"column":null}},"68":{"start":{"line":240,"column":8},"end":{"line":249,"column":null}},"69":{"start":{"line":259,"column":8},"end":{"line":261,"column":null}},"70":{"start":{"line":272,"column":8},"end":{"line":280,"column":null}},"71":{"start":{"line":290,"column":8},"end":{"line":293,"column":null}},"72":{"start":{"line":50,"column":13},"end":{"line":294,"column":null}}},"fnMap":{"0":{"name":"(anonymous_4)","decl":{"start":{"line":51,"column":2},"end":{"line":51,"column":null}},"loc":{"start":{"line":55,"column":55},"end":{"line":56,"column":6}}},"1":{"name":"(anonymous_5)","decl":{"start":{"line":65,"column":8},"end":{"line":65,"column":15}},"loc":{"start":{"line":65,"column":51},"end":{"line":73,"column":3}}},"2":{"name":"(anonymous_6)","decl":{"start":{"line":82,"column":8},"end":{"line":82,"column":15}},"loc":{"start":{"line":82,"column":39},"end":{"line":84,"column":3}}},"3":{"name":"(anonymous_7)","decl":{"start":{"line":99,"column":8},"end":{"line":99,"column":14}},"loc":{"start":{"line":99,"column":73},"end":{"line":103,"column":3}}},"4":{"name":"(anonymous_8)","decl":{"start":{"line":114,"column":8},"end":{"line":114,"column":20}},"loc":{"start":{"line":117,"column":18},"end":{"line":128,"column":3}}},"5":{"name":"(anonymous_9)","decl":{"start":{"line":139,"column":8},"end":{"line":139,"column":21}},"loc":{"start":{"line":142,"column":18},"end":{"line":153,"column":3}}},"6":{"name":"(anonymous_10)","decl":{"start":{"line":164,"column":8},"end":{"line":164,"column":23}},"loc":{"start":{"line":167,"column":18},"end":{"line":178,"column":3}}},"7":{"name":"(anonymous_11)","decl":{"start":{"line":191,"column":8},"end":{"line":191,"column":20}},"loc":{"start":{"line":194,"column":18},"end":{"line":200,"column":3}}},"8":{"name":"(anonymous_12)","decl":{"start":{"line":209,"column":8},"end":{"line":209,"column":24}},"loc":{"start":{"line":209,"column":48},"end":{"line":212,"column":3}}},"9":{"name":"(anonymous_13)","decl":{"start":{"line":223,"column":8},"end":{"line":223,"column":19}},"loc":{"start":{"line":226,"column":18},"end":{"line":232,"column":3}}},"10":{"name":"(anonymous_14)","decl":{"start":{"line":240,"column":8},"end":{"line":240,"column":22}},"loc":{"start":{"line":240,"column":60},"end":{"line":249,"column":3}}},"11":{"name":"(anonymous_15)","decl":{"start":{"line":259,"column":8},"end":{"line":259,"column":26}},"loc":{"start":{"line":259,"column":26},"end":{"line":261,"column":3}}},"12":{"name":"(anonymous_16)","decl":{"start":{"line":272,"column":8},"end":{"line":272,"column":27}},"loc":{"start":{"line":275,"column":18},"end":{"line":280,"column":3}}},"13":{"name":"(anonymous_17)","decl":{"start":{"line":290,"column":8},"end":{"line":290,"column":27}},"loc":{"start":{"line":290,"column":77},"end":{"line":293,"column":3}}}},"branchMap":{"0":{"loc":{"start":{"line":70,"column":13},"end":{"line":70,"column":30}},"type":"binary-expr","locations":[{"start":{"line":70,"column":13},"end":{"line":70,"column":24}},{"start":{"line":70,"column":28},"end":{"line":70,"column":30}}]},"1":{"loc":{"start":{"line":71,"column":14},"end":{"line":71,"column":31}},"type":"binary-expr","locations":[{"start":{"line":71,"column":14},"end":{"line":71,"column":26}},{"start":{"line":71,"column":30},"end":{"line":71,"column":31}}]},"2":{"loc":{"start":{"line":245,"column":13},"end":{"line":245,"column":34}},"type":"binary-expr","locations":[{"start":{"line":245,"column":13},"end":{"line":245,"column":28}},{"start":{"line":245,"column":32},"end":{"line":245,"column":34}}]},"3":{"loc":{"start":{"line":246,"column":14},"end":{"line":246,"column":35}},"type":"binary-expr","locations":[{"start":{"line":246,"column":14},"end":{"line":246,"column":30}},{"start":{"line":246,"column":34},"end":{"line":246,"column":35}}]},"4":{"loc":{"start":{"line":247,"column":19},"end":{"line":247,"column":43}},"type":"binary-expr","locations":[{"start":{"line":247,"column":19},"end":{"line":247,"column":37}},{"start":{"line":247,"column":41},"end":{"line":247,"column":43}}]},"5":{"loc":{"start":{"line":65,"column":32},"end":{"line":65,"column":null}},"type":"cond-expr","locations":[{"start":{"line":65,"column":51},"end":{"line":65,"column":null}},{"start":{"line":65,"column":51},"end":{"line":65,"column":null}}]},"6":{"loc":{"start":{"line":65,"column":32},"end":{"line":65,"column":51}},"type":"binary-expr","locations":[{"start":{"line":65,"column":32},"end":{"line":65,"column":null}},{"start":{"line":65,"column":32},"end":{"line":65,"column":51}}]},"7":{"loc":{"start":{"line":99,"column":41},"end":{"line":99,"column":60}},"type":"cond-expr","locations":[{"start":{"line":99,"column":57},"end":{"line":99,"column":60}},{"start":{"line":99,"column":57},"end":{"line":99,"column":60}}]},"8":{"loc":{"start":{"line":99,"column":41},"end":{"line":99,"column":57}},"type":"binary-expr","locations":[{"start":{"line":99,"column":41},"end":{"line":99,"column":60}},{"start":{"line":99,"column":41},"end":{"line":99,"column":57}}]},"9":{"loc":{"start":{"line":116,"column":29},"end":{"line":116,"column":null}},"type":"cond-expr","locations":[{"start":{"line":116,"column":51},"end":{"line":116,"column":null}},{"start":{"line":116,"column":51},"end":{"line":116,"column":null}}]},"10":{"loc":{"start":{"line":116,"column":29},"end":{"line":116,"column":51}},"type":"binary-expr","locations":[{"start":{"line":116,"column":29},"end":{"line":116,"column":null}},{"start":{"line":116,"column":29},"end":{"line":116,"column":51}}]},"11":{"loc":{"start":{"line":141,"column":29},"end":{"line":141,"column":null}},"type":"cond-expr","locations":[{"start":{"line":141,"column":51},"end":{"line":141,"column":null}},{"start":{"line":141,"column":51},"end":{"line":141,"column":null}}]},"12":{"loc":{"start":{"line":141,"column":29},"end":{"line":141,"column":51}},"type":"binary-expr","locations":[{"start":{"line":141,"column":29},"end":{"line":141,"column":null}},{"start":{"line":141,"column":29},"end":{"line":141,"column":51}}]},"13":{"loc":{"start":{"line":166,"column":29},"end":{"line":166,"column":null}},"type":"cond-expr","locations":[{"start":{"line":166,"column":51},"end":{"line":166,"column":null}},{"start":{"line":166,"column":51},"end":{"line":166,"column":null}}]},"14":{"loc":{"start":{"line":166,"column":29},"end":{"line":166,"column":51}},"type":"binary-expr","locations":[{"start":{"line":166,"column":29},"end":{"line":166,"column":null}},{"start":{"line":166,"column":29},"end":{"line":166,"column":51}}]},"15":{"loc":{"start":{"line":240,"column":43},"end":{"line":240,"column":null}},"type":"cond-expr","locations":[{"start":{"line":240,"column":60},"end":{"line":240,"column":null}},{"start":{"line":240,"column":60},"end":{"line":240,"column":null}}]},"16":{"loc":{"start":{"line":240,"column":43},"end":{"line":240,"column":60}},"type":"binary-expr","locations":[{"start":{"line":240,"column":43},"end":{"line":240,"column":null}},{"start":{"line":240,"column":43},"end":{"line":240,"column":60}}]},"17":{"loc":{"start":{"line":274,"column":20},"end":{"line":274,"column":null}},"type":"cond-expr","locations":[{"start":{"line":274,"column":37},"end":{"line":274,"column":null}},{"start":{"line":274,"column":37},"end":{"line":274,"column":null}}]},"18":{"loc":{"start":{"line":274,"column":20},"end":{"line":274,"column":37}},"type":"binary-expr","locations":[{"start":{"line":274,"column":20},"end":{"line":274,"column":null}},{"start":{"line":274,"column":20},"end":{"line":274,"column":37}}]},"19":{"loc":{"start":{"line":290,"column":44},"end":{"line":290,"column":64}},"type":"cond-expr","locations":[{"start":{"line":290,"column":61},"end":{"line":290,"column":64}},{"start":{"line":290,"column":61},"end":{"line":290,"column":64}}]},"20":{"loc":{"start":{"line":290,"column":44},"end":{"line":290,"column":61}},"type":"binary-expr","locations":[{"start":{"line":290,"column":44},"end":{"line":290,"column":64}},{"start":{"line":290,"column":44},"end":{"line":290,"column":61}}]},"21":{"loc":{"start":{"line":52,"column":38},"end":{"line":52,"column":null}},"type":"cond-expr","locations":[{"start":{"line":52,"column":53},"end":{"line":52,"column":null}},{"start":{"line":52,"column":53},"end":{"line":52,"column":null}}]},"22":{"loc":{"start":{"line":52,"column":38},"end":{"line":52,"column":53}},"type":"binary-expr","locations":[{"start":{"line":52,"column":38},"end":{"line":52,"column":null}},{"start":{"line":52,"column":38},"end":{"line":52,"column":53}}]},"23":{"loc":{"start":{"line":52,"column":53},"end":{"line":53,"column":null}},"type":"cond-expr","locations":[{"start":{"line":53,"column":59},"end":{"line":53,"column":null}},{"start":{"line":53,"column":59},"end":{"line":53,"column":null}}]},"24":{"loc":{"start":{"line":52,"column":53},"end":{"line":53,"column":59}},"type":"binary-expr","locations":[{"start":{"line":52,"column":53},"end":{"line":53,"column":null}},{"start":{"line":53,"column":41},"end":{"line":53,"column":59}}]},"25":{"loc":{"start":{"line":53,"column":59},"end":{"line":54,"column":null}},"type":"cond-expr","locations":[{"start":{"line":54,"column":49},"end":{"line":54,"column":null}},{"start":{"line":54,"column":49},"end":{"line":54,"column":null}}]},"26":{"loc":{"start":{"line":53,"column":59},"end":{"line":54,"column":49}},"type":"binary-expr","locations":[{"start":{"line":53,"column":59},"end":{"line":54,"column":null}},{"start":{"line":54,"column":36},"end":{"line":54,"column":49}}]},"27":{"loc":{"start":{"line":54,"column":49},"end":{"line":55,"column":null}},"type":"cond-expr","locations":[{"start":{"line":55,"column":55},"end":{"line":55,"column":null}},{"start":{"line":55,"column":55},"end":{"line":55,"column":null}}]},"28":{"loc":{"start":{"line":54,"column":49},"end":{"line":55,"column":55}},"type":"binary-expr","locations":[{"start":{"line":54,"column":49},"end":{"line":55,"column":null}},{"start":{"line":55,"column":39},"end":{"line":55,"column":55}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,0],"7":[0,0],"8":[0,0],"9":[0,0],"10":[0,0],"11":[0,0],"12":[0,0],"13":[0,0],"14":[0,0],"15":[0,0],"16":[0,0],"17":[0,0],"18":[0,0],"19":[0,0],"20":[0,0],"21":[0,0],"22":[0,0],"23":[0,0],"24":[0,0],"25":[0,0],"26":[0,0],"27":[0,0],"28":[0,0]}} -,"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\projects\\projects.module.ts": {"path":"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\projects\\projects.module.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":40}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":48}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":56}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":52}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":65}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":67}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":63}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":53}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":59}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":63}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":69}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":75}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":58}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":64}},"14":{"start":{"line":41,"column":7},"end":{"line":41,"column":null}},"15":{"start":{"line":41,"column":13},"end":{"line":41,"column":27}},"16":{"start":{"line":41,"column":13},"end":{"line":41,"column":null}}},"fnMap":{},"branchMap":{},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0},"f":{},"b":{}} -,"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\projects\\dto\\analytics-query.dto.ts": {"path":"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\projects\\dto\\analytics-query.dto.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":69}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":52}},"2":{"start":{"line":4,"column":0},"end":{"line":4,"column":13}},"3":{"start":{"line":8,"column":2},"end":{"line":8,"column":null}},"4":{"start":{"line":7,"column":28},"end":{"line":7,"column":98}},"5":{"start":{"line":13,"column":2},"end":{"line":13,"column":null}},"6":{"start":{"line":12,"column":28},"end":{"line":12,"column":61}},"7":{"start":{"line":18,"column":2},"end":{"line":18,"column":null}},"8":{"start":{"line":17,"column":28},"end":{"line":17,"column":44}},"9":{"start":{"line":22,"column":2},"end":{"line":22,"column":null}}},"fnMap":{"0":{"name":"(anonymous_2)","decl":{"start":{"line":7,"column":13},"end":{"line":7,"column":14}},"loc":{"start":{"line":7,"column":28},"end":{"line":7,"column":98}}},"1":{"name":"(anonymous_3)","decl":{"start":{"line":12,"column":13},"end":{"line":12,"column":14}},"loc":{"start":{"line":12,"column":28},"end":{"line":12,"column":61}}},"2":{"name":"(anonymous_4)","decl":{"start":{"line":17,"column":13},"end":{"line":17,"column":14}},"loc":{"start":{"line":17,"column":28},"end":{"line":17,"column":44}}}},"branchMap":{"0":{"loc":{"start":{"line":7,"column":28},"end":{"line":7,"column":98}},"type":"binary-expr","locations":[{"start":{"line":7,"column":28},"end":{"line":7,"column":33}},{"start":{"line":7,"column":37},"end":{"line":7,"column":98}}]},"1":{"loc":{"start":{"line":12,"column":28},"end":{"line":12,"column":61}},"type":"binary-expr","locations":[{"start":{"line":12,"column":28},"end":{"line":12,"column":33}},{"start":{"line":12,"column":37},"end":{"line":12,"column":61}}]},"2":{"loc":{"start":{"line":17,"column":28},"end":{"line":17,"column":44}},"type":"binary-expr","locations":[{"start":{"line":17,"column":28},"end":{"line":17,"column":33}},{"start":{"line":17,"column":37},"end":{"line":17,"column":44}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0},"f":{"0":0,"1":0,"2":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0]}} -,"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\projects\\dto\\create-project.dto.ts": {"path":"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\projects\\dto\\create-project.dto.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":10,"column":0},"end":{"line":10,"column":41}},"2":{"start":{"line":11,"column":0},"end":{"line":11,"column":67}},"3":{"start":{"line":12,"column":0},"end":{"line":12,"column":73}},"4":{"start":{"line":14,"column":0},"end":{"line":14,"column":13}},"5":{"start":{"line":21,"column":2},"end":{"line":21,"column":null}},"6":{"start":{"line":30,"column":2},"end":{"line":30,"column":null}},"7":{"start":{"line":38,"column":2},"end":{"line":38,"column":null}},"8":{"start":{"line":49,"column":2},"end":{"line":49,"column":null}},"9":{"start":{"line":46,"column":14},"end":{"line":46,"column":20}},"10":{"start":{"line":57,"column":2},"end":{"line":57,"column":null}},"11":{"start":{"line":56,"column":14},"end":{"line":56,"column":18}},"12":{"start":{"line":67,"column":2},"end":{"line":67,"column":null}}},"fnMap":{"0":{"name":"(anonymous_2)","decl":{"start":{"line":46,"column":8},"end":{"line":46,"column":11}},"loc":{"start":{"line":46,"column":14},"end":{"line":46,"column":20}}},"1":{"name":"(anonymous_3)","decl":{"start":{"line":56,"column":8},"end":{"line":56,"column":11}},"loc":{"start":{"line":56,"column":14},"end":{"line":56,"column":18}}}},"branchMap":{"0":{"loc":{"start":{"line":57,"column":12},"end":{"line":57,"column":17}},"type":"cond-expr","locations":[{"start":{"line":57,"column":16},"end":{"line":57,"column":17}},{"start":{"line":57,"column":16},"end":{"line":57,"column":17}}]},"1":{"loc":{"start":{"line":57,"column":12},"end":{"line":57,"column":16}},"type":"binary-expr","locations":[{"start":{"line":57,"column":12},"end":{"line":57,"column":17}},{"start":{"line":57,"column":12},"end":{"line":57,"column":16}}]},"2":{"loc":{"start":{"line":67,"column":13},"end":{"line":67,"column":29}},"type":"cond-expr","locations":[{"start":{"line":67,"column":28},"end":{"line":67,"column":29}},{"start":{"line":67,"column":28},"end":{"line":67,"column":29}}]},"3":{"loc":{"start":{"line":67,"column":13},"end":{"line":67,"column":28}},"type":"binary-expr","locations":[{"start":{"line":67,"column":13},"end":{"line":67,"column":29}},{"start":{"line":67,"column":13},"end":{"line":67,"column":28}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0},"f":{"0":0,"1":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0]}} -,"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\projects\\dto\\get-projects-query.dto.ts": {"path":"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\projects\\dto\\get-projects-query.dto.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":80}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":41}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":54}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":73}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":69}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":70}},"6":{"start":{"line":43,"column":27},"end":{"line":43,"column":47}},"7":{"start":{"line":57,"column":19},"end":{"line":57,"column":21}},"8":{"start":{"line":69,"column":20},"end":{"line":69,"column":21}},"9":{"start":{"line":8,"column":0},"end":{"line":8,"column":13}},"10":{"start":{"line":16,"column":2},"end":{"line":16,"column":null}},"11":{"start":{"line":25,"column":2},"end":{"line":25,"column":null}},"12":{"start":{"line":33,"column":2},"end":{"line":33,"column":null}},"13":{"start":{"line":43,"column":2},"end":{"line":43,"column":null}},"14":{"start":{"line":57,"column":2},"end":{"line":57,"column":null}},"15":{"start":{"line":53,"column":14},"end":{"line":53,"column":20}},"16":{"start":{"line":69,"column":2},"end":{"line":69,"column":null}},"17":{"start":{"line":66,"column":14},"end":{"line":66,"column":20}}},"fnMap":{"0":{"name":"(anonymous_2)","decl":{"start":{"line":53,"column":8},"end":{"line":53,"column":11}},"loc":{"start":{"line":53,"column":14},"end":{"line":53,"column":20}}},"1":{"name":"(anonymous_3)","decl":{"start":{"line":66,"column":8},"end":{"line":66,"column":11}},"loc":{"start":{"line":66,"column":14},"end":{"line":66,"column":20}}}},"branchMap":{"0":{"loc":{"start":{"line":16,"column":13},"end":{"line":16,"column":29}},"type":"cond-expr","locations":[{"start":{"line":16,"column":28},"end":{"line":16,"column":29}},{"start":{"line":16,"column":28},"end":{"line":16,"column":29}}]},"1":{"loc":{"start":{"line":16,"column":13},"end":{"line":16,"column":28}},"type":"binary-expr","locations":[{"start":{"line":16,"column":13},"end":{"line":16,"column":29}},{"start":{"line":16,"column":13},"end":{"line":16,"column":28}}]},"2":{"loc":{"start":{"line":25,"column":11},"end":{"line":25,"column":25}},"type":"cond-expr","locations":[{"start":{"line":25,"column":24},"end":{"line":25,"column":25}},{"start":{"line":25,"column":24},"end":{"line":25,"column":25}}]},"3":{"loc":{"start":{"line":25,"column":11},"end":{"line":25,"column":24}},"type":"binary-expr","locations":[{"start":{"line":25,"column":11},"end":{"line":25,"column":25}},{"start":{"line":25,"column":11},"end":{"line":25,"column":24}}]},"4":{"loc":{"start":{"line":43,"column":11},"end":{"line":43,"column":27}},"type":"cond-expr","locations":[{"start":{"line":43,"column":24},"end":{"line":43,"column":27}},{"start":{"line":43,"column":24},"end":{"line":43,"column":27}}]},"5":{"loc":{"start":{"line":43,"column":11},"end":{"line":43,"column":24}},"type":"binary-expr","locations":[{"start":{"line":43,"column":11},"end":{"line":43,"column":27}},{"start":{"line":43,"column":11},"end":{"line":43,"column":24}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0},"f":{"0":0,"1":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0]}} -,"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\projects\\dto\\search-projects.dto.ts": {"path":"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\projects\\dto\\search-projects.dto.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":72}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":73}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":69}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":70}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":52}},"5":{"start":{"line":37,"column":19},"end":{"line":37,"column":21}},"6":{"start":{"line":41,"column":20},"end":{"line":41,"column":21}},"7":{"start":{"line":7,"column":0},"end":{"line":7,"column":13}},"8":{"start":{"line":11,"column":2},"end":{"line":11,"column":null}},"9":{"start":{"line":10,"column":28},"end":{"line":10,"column":41}},"10":{"start":{"line":15,"column":2},"end":{"line":15,"column":null}},"11":{"start":{"line":19,"column":2},"end":{"line":19,"column":null}},"12":{"start":{"line":24,"column":2},"end":{"line":24,"column":null}},"13":{"start":{"line":29,"column":2},"end":{"line":29,"column":null}},"14":{"start":{"line":33,"column":2},"end":{"line":33,"column":null}},"15":{"start":{"line":37,"column":2},"end":{"line":37,"column":null}},"16":{"start":{"line":35,"column":14},"end":{"line":35,"column":20}},"17":{"start":{"line":41,"column":2},"end":{"line":41,"column":null}},"18":{"start":{"line":39,"column":14},"end":{"line":39,"column":20}},"19":{"start":{"line":45,"column":2},"end":{"line":45,"column":null}},"20":{"start":{"line":49,"column":2},"end":{"line":49,"column":null}},"21":{"start":{"line":53,"column":2},"end":{"line":53,"column":null}},"22":{"start":{"line":57,"column":2},"end":{"line":57,"column":null}}},"fnMap":{"0":{"name":"(anonymous_2)","decl":{"start":{"line":10,"column":13},"end":{"line":10,"column":14}},"loc":{"start":{"line":10,"column":28},"end":{"line":10,"column":41}}},"1":{"name":"(anonymous_3)","decl":{"start":{"line":35,"column":8},"end":{"line":35,"column":11}},"loc":{"start":{"line":35,"column":14},"end":{"line":35,"column":20}}},"2":{"name":"(anonymous_4)","decl":{"start":{"line":39,"column":8},"end":{"line":39,"column":11}},"loc":{"start":{"line":39,"column":14},"end":{"line":39,"column":20}}}},"branchMap":{"0":{"loc":{"start":{"line":15,"column":13},"end":{"line":15,"column":29}},"type":"cond-expr","locations":[{"start":{"line":15,"column":28},"end":{"line":15,"column":29}},{"start":{"line":15,"column":28},"end":{"line":15,"column":29}}]},"1":{"loc":{"start":{"line":15,"column":13},"end":{"line":15,"column":28}},"type":"binary-expr","locations":[{"start":{"line":15,"column":13},"end":{"line":15,"column":29}},{"start":{"line":15,"column":13},"end":{"line":15,"column":28}}]},"2":{"loc":{"start":{"line":19,"column":11},"end":{"line":19,"column":25}},"type":"cond-expr","locations":[{"start":{"line":19,"column":24},"end":{"line":19,"column":25}},{"start":{"line":19,"column":24},"end":{"line":19,"column":25}}]},"3":{"loc":{"start":{"line":19,"column":11},"end":{"line":19,"column":24}},"type":"binary-expr","locations":[{"start":{"line":19,"column":11},"end":{"line":19,"column":25}},{"start":{"line":19,"column":11},"end":{"line":19,"column":24}}]},"4":{"loc":{"start":{"line":33,"column":11},"end":{"line":33,"column":25}},"type":"cond-expr","locations":[{"start":{"line":33,"column":24},"end":{"line":33,"column":25}},{"start":{"line":33,"column":24},"end":{"line":33,"column":25}}]},"5":{"loc":{"start":{"line":33,"column":11},"end":{"line":33,"column":24}},"type":"binary-expr","locations":[{"start":{"line":33,"column":11},"end":{"line":33,"column":25}},{"start":{"line":33,"column":11},"end":{"line":33,"column":24}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0},"f":{"0":0,"1":0,"2":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0]}} -,"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\projects\\dto\\update-project-status.dto.ts": {"path":"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\projects\\dto\\update-project-status.dto.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":61}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":69}},"2":{"start":{"line":4,"column":0},"end":{"line":4,"column":13}},"3":{"start":{"line":8,"column":2},"end":{"line":8,"column":null}},"4":{"start":{"line":12,"column":2},"end":{"line":12,"column":null}}},"fnMap":{},"branchMap":{"0":{"loc":{"start":{"line":8,"column":10},"end":{"line":8,"column":24}},"type":"cond-expr","locations":[{"start":{"line":8,"column":23},"end":{"line":8,"column":24}},{"start":{"line":8,"column":23},"end":{"line":8,"column":24}}]},"1":{"loc":{"start":{"line":8,"column":10},"end":{"line":8,"column":23}},"type":"binary-expr","locations":[{"start":{"line":8,"column":10},"end":{"line":8,"column":24}},{"start":{"line":8,"column":10},"end":{"line":8,"column":23}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0},"f":{},"b":{"0":[0,0],"1":[0,0]}} -,"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\projects\\dto\\upload-image.dto.ts": {"path":"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\projects\\dto\\upload-image.dto.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":75}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":46}},"2":{"start":{"line":4,"column":0},"end":{"line":4,"column":13}},"3":{"start":{"line":6,"column":2},"end":{"line":6,"column":null}},"4":{"start":{"line":9,"column":0},"end":{"line":9,"column":13}},"5":{"start":{"line":12,"column":2},"end":{"line":12,"column":null}},"6":{"start":{"line":16,"column":2},"end":{"line":16,"column":null}},"7":{"start":{"line":19,"column":2},"end":{"line":19,"column":null}},"8":{"start":{"line":18,"column":28},"end":{"line":18,"column":43}},"9":{"start":{"line":22,"column":0},"end":{"line":22,"column":13}},"10":{"start":{"line":24,"column":2},"end":{"line":24,"column":null}}},"fnMap":{"0":{"name":"(anonymous_2)","decl":{"start":{"line":18,"column":13},"end":{"line":18,"column":14}},"loc":{"start":{"line":18,"column":28},"end":{"line":18,"column":43}}}},"branchMap":{},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0},"f":{"0":0},"b":{}} -,"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\projects\\entities\\project-history.entity.ts": {"path":"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\projects\\entities\\project-history.entity.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":9,"column":0},"end":{"line":9,"column":56}},"2":{"start":{"line":10,"column":0},"end":{"line":10,"column":43}},"3":{"start":{"line":11,"column":0},"end":{"line":11,"column":69}},"4":{"start":{"line":14,"column":7},"end":{"line":43,"column":null}},"5":{"start":{"line":14,"column":13},"end":{"line":14,"column":27}},"6":{"start":{"line":16,"column":2},"end":{"line":16,"column":null}},"7":{"start":{"line":19,"column":2},"end":{"line":19,"column":null}},"8":{"start":{"line":22,"column":2},"end":{"line":22,"column":null}},"9":{"start":{"line":25,"column":2},"end":{"line":25,"column":null}},"10":{"start":{"line":28,"column":2},"end":{"line":28,"column":null}},"11":{"start":{"line":32,"column":2},"end":{"line":32,"column":null}},"12":{"start":{"line":30,"column":19},"end":{"line":30,"column":26}},"13":{"start":{"line":35,"column":2},"end":{"line":35,"column":null}},"14":{"start":{"line":39,"column":2},"end":{"line":39,"column":null}},"15":{"start":{"line":37,"column":19},"end":{"line":37,"column":23}},"16":{"start":{"line":42,"column":2},"end":{"line":42,"column":null}},"17":{"start":{"line":14,"column":13},"end":{"line":43,"column":null}}},"fnMap":{"0":{"name":"(anonymous_2)","decl":{"start":{"line":30,"column":13},"end":{"line":30,"column":16}},"loc":{"start":{"line":30,"column":19},"end":{"line":30,"column":26}}},"1":{"name":"(anonymous_3)","decl":{"start":{"line":37,"column":13},"end":{"line":37,"column":16}},"loc":{"start":{"line":37,"column":19},"end":{"line":37,"column":23}}}},"branchMap":{"0":{"loc":{"start":{"line":19,"column":18},"end":{"line":19,"column":32}},"type":"cond-expr","locations":[{"start":{"line":19,"column":31},"end":{"line":19,"column":32}},{"start":{"line":19,"column":31},"end":{"line":19,"column":32}}]},"1":{"loc":{"start":{"line":19,"column":18},"end":{"line":19,"column":31}},"type":"binary-expr","locations":[{"start":{"line":19,"column":18},"end":{"line":19,"column":32}},{"start":{"line":19,"column":18},"end":{"line":19,"column":31}}]},"2":{"loc":{"start":{"line":22,"column":13},"end":{"line":22,"column":27}},"type":"cond-expr","locations":[{"start":{"line":22,"column":26},"end":{"line":22,"column":27}},{"start":{"line":22,"column":26},"end":{"line":22,"column":27}}]},"3":{"loc":{"start":{"line":22,"column":13},"end":{"line":22,"column":26}},"type":"binary-expr","locations":[{"start":{"line":22,"column":13},"end":{"line":22,"column":27}},{"start":{"line":22,"column":13},"end":{"line":22,"column":26}}]},"4":{"loc":{"start":{"line":32,"column":11},"end":{"line":32,"column":19}},"type":"cond-expr","locations":[{"start":{"line":32,"column":18},"end":{"line":32,"column":19}},{"start":{"line":32,"column":18},"end":{"line":32,"column":19}}]},"5":{"loc":{"start":{"line":32,"column":11},"end":{"line":32,"column":18}},"type":"binary-expr","locations":[{"start":{"line":32,"column":11},"end":{"line":32,"column":19}},{"start":{"line":32,"column":11},"end":{"line":32,"column":18}}]},"6":{"loc":{"start":{"line":39,"column":17},"end":{"line":39,"column":22}},"type":"cond-expr","locations":[{"start":{"line":39,"column":21},"end":{"line":39,"column":22}},{"start":{"line":39,"column":21},"end":{"line":39,"column":22}}]},"7":{"loc":{"start":{"line":39,"column":17},"end":{"line":39,"column":21}},"type":"binary-expr","locations":[{"start":{"line":39,"column":17},"end":{"line":39,"column":22}},{"start":{"line":39,"column":17},"end":{"line":39,"column":21}}]},"8":{"loc":{"start":{"line":42,"column":13},"end":{"line":42,"column":18}},"type":"cond-expr","locations":[{"start":{"line":42,"column":17},"end":{"line":42,"column":18}},{"start":{"line":42,"column":17},"end":{"line":42,"column":18}}]},"9":{"loc":{"start":{"line":42,"column":13},"end":{"line":42,"column":17}},"type":"binary-expr","locations":[{"start":{"line":42,"column":13},"end":{"line":42,"column":18}},{"start":{"line":42,"column":13},"end":{"line":42,"column":17}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0},"f":{"0":0,"1":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,0],"7":[0,0],"8":[0,0],"9":[0,0]}} -,"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\projects\\entities\\project-image.entity.ts": {"path":"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\projects\\entities\\project-image.entity.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":9,"column":0},"end":{"line":9,"column":43}},"2":{"start":{"line":12,"column":7},"end":{"line":40,"column":null}},"3":{"start":{"line":12,"column":13},"end":{"line":12,"column":25}},"4":{"start":{"line":14,"column":2},"end":{"line":14,"column":null}},"5":{"start":{"line":17,"column":2},"end":{"line":17,"column":null}},"6":{"start":{"line":20,"column":2},"end":{"line":20,"column":null}},"7":{"start":{"line":23,"column":2},"end":{"line":23,"column":null}},"8":{"start":{"line":26,"column":2},"end":{"line":26,"column":null}},"9":{"start":{"line":29,"column":2},"end":{"line":29,"column":null}},"10":{"start":{"line":32,"column":2},"end":{"line":32,"column":null}},"11":{"start":{"line":36,"column":2},"end":{"line":36,"column":null}},"12":{"start":{"line":34,"column":19},"end":{"line":34,"column":26}},"13":{"start":{"line":39,"column":2},"end":{"line":39,"column":null}},"14":{"start":{"line":12,"column":13},"end":{"line":40,"column":null}}},"fnMap":{"0":{"name":"(anonymous_2)","decl":{"start":{"line":34,"column":13},"end":{"line":34,"column":16}},"loc":{"start":{"line":34,"column":19},"end":{"line":34,"column":26}}}},"branchMap":{"0":{"loc":{"start":{"line":36,"column":11},"end":{"line":36,"column":19}},"type":"cond-expr","locations":[{"start":{"line":36,"column":18},"end":{"line":36,"column":19}},{"start":{"line":36,"column":18},"end":{"line":36,"column":19}}]},"1":{"loc":{"start":{"line":36,"column":11},"end":{"line":36,"column":18}},"type":"binary-expr","locations":[{"start":{"line":36,"column":11},"end":{"line":36,"column":19}},{"start":{"line":36,"column":11},"end":{"line":36,"column":18}}]},"2":{"loc":{"start":{"line":39,"column":13},"end":{"line":39,"column":18}},"type":"cond-expr","locations":[{"start":{"line":39,"column":17},"end":{"line":39,"column":18}},{"start":{"line":39,"column":17},"end":{"line":39,"column":18}}]},"3":{"loc":{"start":{"line":39,"column":13},"end":{"line":39,"column":17}},"type":"binary-expr","locations":[{"start":{"line":39,"column":13},"end":{"line":39,"column":18}},{"start":{"line":39,"column":13},"end":{"line":39,"column":17}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0},"f":{"0":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0]}} -,"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\projects\\entities\\project.entity.ts": {"path":"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\projects\\entities\\project.entity.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":12,"column":0},"end":{"line":12,"column":56}},"2":{"start":{"line":13,"column":0},"end":{"line":13,"column":68}},"3":{"start":{"line":14,"column":0},"end":{"line":14,"column":54}},"4":{"start":{"line":15,"column":0},"end":{"line":15,"column":58}},"5":{"start":{"line":16,"column":0},"end":{"line":16,"column":73}},"6":{"start":{"line":17,"column":0},"end":{"line":17,"column":69}},"7":{"start":{"line":24,"column":7},"end":{"line":91,"column":null}},"8":{"start":{"line":24,"column":13},"end":{"line":24,"column":20}},"9":{"start":{"line":26,"column":2},"end":{"line":26,"column":null}},"10":{"start":{"line":29,"column":2},"end":{"line":29,"column":null}},"11":{"start":{"line":32,"column":2},"end":{"line":32,"column":null}},"12":{"start":{"line":35,"column":2},"end":{"line":35,"column":null}},"13":{"start":{"line":42,"column":2},"end":{"line":42,"column":null}},"14":{"start":{"line":49,"column":2},"end":{"line":49,"column":null}},"15":{"start":{"line":52,"column":2},"end":{"line":52,"column":null}},"16":{"start":{"line":55,"column":2},"end":{"line":55,"column":null}},"17":{"start":{"line":58,"column":2},"end":{"line":58,"column":null}},"18":{"start":{"line":61,"column":2},"end":{"line":61,"column":null}},"19":{"start":{"line":64,"column":2},"end":{"line":64,"column":null}},"20":{"start":{"line":67,"column":2},"end":{"line":67,"column":null}},"21":{"start":{"line":71,"column":2},"end":{"line":71,"column":null}},"22":{"start":{"line":75,"column":2},"end":{"line":75,"column":null}},"23":{"start":{"line":73,"column":19},"end":{"line":73,"column":23}},"24":{"start":{"line":78,"column":2},"end":{"line":78,"column":null}},"25":{"start":{"line":77,"column":19},"end":{"line":77,"column":31}},"26":{"start":{"line":77,"column":44},"end":{"line":77,"column":57}},"27":{"start":{"line":81,"column":2},"end":{"line":81,"column":null}},"28":{"start":{"line":80,"column":19},"end":{"line":80,"column":27}},"29":{"start":{"line":80,"column":43},"end":{"line":80,"column":59}},"30":{"start":{"line":84,"column":2},"end":{"line":84,"column":null}},"31":{"start":{"line":83,"column":19},"end":{"line":83,"column":33}},"32":{"start":{"line":83,"column":48},"end":{"line":83,"column":63}},"33":{"start":{"line":87,"column":2},"end":{"line":87,"column":null}},"34":{"start":{"line":90,"column":2},"end":{"line":90,"column":null}},"35":{"start":{"line":24,"column":13},"end":{"line":91,"column":null}}},"fnMap":{"0":{"name":"(anonymous_2)","decl":{"start":{"line":73,"column":13},"end":{"line":73,"column":16}},"loc":{"start":{"line":73,"column":19},"end":{"line":73,"column":23}}},"1":{"name":"(anonymous_3)","decl":{"start":{"line":77,"column":13},"end":{"line":77,"column":16}},"loc":{"start":{"line":77,"column":19},"end":{"line":77,"column":31}}},"2":{"name":"(anonymous_4)","decl":{"start":{"line":77,"column":33},"end":{"line":77,"column":34}},"loc":{"start":{"line":77,"column":44},"end":{"line":77,"column":57}}},"3":{"name":"(anonymous_5)","decl":{"start":{"line":80,"column":13},"end":{"line":80,"column":16}},"loc":{"start":{"line":80,"column":19},"end":{"line":80,"column":27}}},"4":{"name":"(anonymous_6)","decl":{"start":{"line":80,"column":29},"end":{"line":80,"column":30}},"loc":{"start":{"line":80,"column":43},"end":{"line":80,"column":59}}},"5":{"name":"(anonymous_7)","decl":{"start":{"line":83,"column":13},"end":{"line":83,"column":16}},"loc":{"start":{"line":83,"column":19},"end":{"line":83,"column":33}}},"6":{"name":"(anonymous_8)","decl":{"start":{"line":83,"column":35},"end":{"line":83,"column":36}},"loc":{"start":{"line":83,"column":48},"end":{"line":83,"column":63}}}},"branchMap":{"0":{"loc":{"start":{"line":42,"column":12},"end":{"line":42,"column":28}},"type":"cond-expr","locations":[{"start":{"line":42,"column":27},"end":{"line":42,"column":28}},{"start":{"line":42,"column":27},"end":{"line":42,"column":28}}]},"1":{"loc":{"start":{"line":42,"column":12},"end":{"line":42,"column":27}},"type":"binary-expr","locations":[{"start":{"line":42,"column":12},"end":{"line":42,"column":28}},{"start":{"line":42,"column":12},"end":{"line":42,"column":27}}]},"2":{"loc":{"start":{"line":49,"column":10},"end":{"line":49,"column":24}},"type":"cond-expr","locations":[{"start":{"line":49,"column":23},"end":{"line":49,"column":24}},{"start":{"line":49,"column":23},"end":{"line":49,"column":24}}]},"3":{"loc":{"start":{"line":49,"column":10},"end":{"line":49,"column":23}},"type":"binary-expr","locations":[{"start":{"line":49,"column":10},"end":{"line":49,"column":24}},{"start":{"line":49,"column":10},"end":{"line":49,"column":23}}]},"4":{"loc":{"start":{"line":75,"column":11},"end":{"line":75,"column":16}},"type":"cond-expr","locations":[{"start":{"line":75,"column":15},"end":{"line":75,"column":16}},{"start":{"line":75,"column":15},"end":{"line":75,"column":16}}]},"5":{"loc":{"start":{"line":75,"column":11},"end":{"line":75,"column":15}},"type":"binary-expr","locations":[{"start":{"line":75,"column":11},"end":{"line":75,"column":16}},{"start":{"line":75,"column":11},"end":{"line":75,"column":15}}]},"6":{"loc":{"start":{"line":87,"column":13},"end":{"line":87,"column":18}},"type":"cond-expr","locations":[{"start":{"line":87,"column":17},"end":{"line":87,"column":18}},{"start":{"line":87,"column":17},"end":{"line":87,"column":18}}]},"7":{"loc":{"start":{"line":87,"column":13},"end":{"line":87,"column":17}},"type":"binary-expr","locations":[{"start":{"line":87,"column":13},"end":{"line":87,"column":18}},{"start":{"line":87,"column":13},"end":{"line":87,"column":17}}]},"8":{"loc":{"start":{"line":90,"column":13},"end":{"line":90,"column":18}},"type":"cond-expr","locations":[{"start":{"line":90,"column":17},"end":{"line":90,"column":18}},{"start":{"line":90,"column":17},"end":{"line":90,"column":18}}]},"9":{"loc":{"start":{"line":90,"column":13},"end":{"line":90,"column":17}},"type":"binary-expr","locations":[{"start":{"line":90,"column":13},"end":{"line":90,"column":18}},{"start":{"line":90,"column":13},"end":{"line":90,"column":17}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,0],"7":[0,0],"8":[0,0],"9":[0,0]}} -,"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\projects\\providers\\projects.service.ts": {"path":"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\projects\\providers\\projects.service.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":7,"column":0},"end":{"line":7,"column":51}},"2":{"start":{"line":8,"column":0},"end":{"line":8,"column":57}},"3":{"start":{"line":9,"column":0},"end":{"line":9,"column":69}},"4":{"start":{"line":10,"column":0},"end":{"line":10,"column":70}},"5":{"start":{"line":11,"column":0},"end":{"line":11,"column":53}},"6":{"start":{"line":12,"column":0},"end":{"line":12,"column":68}},"7":{"start":{"line":13,"column":0},"end":{"line":13,"column":68}},"8":{"start":{"line":19,"column":7},"end":{"line":328,"column":null}},"9":{"start":{"line":22,"column":21},"end":{"line":22,"column":40}},"10":{"start":{"line":24,"column":21},"end":{"line":24,"column":41}},"11":{"start":{"line":26,"column":21},"end":{"line":26,"column":47}},"12":{"start":{"line":41,"column":8},"end":{"line":41,"column":24}},"13":{"start":{"line":44,"column":25},"end":{"line":44,"column":43}},"14":{"start":{"line":45,"column":4},"end":{"line":47,"column":5}},"15":{"start":{"line":46,"column":6},"end":{"line":46,"column":69}},"16":{"start":{"line":48,"column":4},"end":{"line":50,"column":5}},"17":{"start":{"line":49,"column":6},"end":{"line":49,"column":70}},"18":{"start":{"line":52,"column":20},"end":{"line":64,"column":6}},"19":{"start":{"line":66,"column":4},"end":{"line":66,"column":48}},"20":{"start":{"line":80,"column":8},"end":{"line":80,"column":13}},"21":{"start":{"line":82,"column":44},"end":{"line":102,"column":8}},"22":{"start":{"line":105,"column":4},"end":{"line":111,"column":5}},"23":{"start":{"line":106,"column":6},"end":{"line":106,"column":55}},"24":{"start":{"line":108,"column":6},"end":{"line":110,"column":9}},"25":{"start":{"line":113,"column":4},"end":{"line":115,"column":5}},"26":{"start":{"line":114,"column":6},"end":{"line":114,"column":64}},"27":{"start":{"line":117,"column":4},"end":{"line":122,"column":5}},"28":{"start":{"line":118,"column":6},"end":{"line":121,"column":8}},"29":{"start":{"line":124,"column":4},"end":{"line":135,"column":5}},"30":{"start":{"line":126,"column":8},"end":{"line":126,"column":50}},"31":{"start":{"line":127,"column":8},"end":{"line":127,"column":14}},"32":{"start":{"line":129,"column":8},"end":{"line":129,"column":46}},"33":{"start":{"line":130,"column":8},"end":{"line":130,"column":14}},"34":{"start":{"line":133,"column":8},"end":{"line":133,"column":48}},"35":{"start":{"line":134,"column":8},"end":{"line":134,"column":14}},"36":{"start":{"line":137,"column":18},"end":{"line":137,"column":37}},"37":{"start":{"line":139,"column":17},"end":{"line":139,"column":60}},"38":{"start":{"line":141,"column":4},"end":{"line":141,"column":27}},"39":{"start":{"line":146,"column":20},"end":{"line":153,"column":15}},"40":{"start":{"line":155,"column":4},"end":{"line":157,"column":5}},"41":{"start":{"line":156,"column":6},"end":{"line":156,"column":55}},"42":{"start":{"line":159,"column":29},"end":{"line":165,"column":null}},"43":{"start":{"line":171,"column":28},"end":{"line":177,"column":16}},"44":{"start":{"line":179,"column":23},"end":{"line":179,"column":54}},"45":{"start":{"line":180,"column":24},"end":{"line":180,"column":56}},"46":{"start":{"line":182,"column":6},"end":{"line":182,"column":74}},"47":{"start":{"line":184,"column":4},"end":{"line":227,"column":6}},"48":{"start":{"line":211,"column":58},"end":{"line":226,"column":8}},"49":{"start":{"line":235,"column":69},"end":{"line":243,"column":6}},"50":{"start":{"line":245,"column":4},"end":{"line":245,"column":73}},"51":{"start":{"line":255,"column":20},"end":{"line":258,"column":6}},"52":{"start":{"line":260,"column":4},"end":{"line":262,"column":5}},"53":{"start":{"line":261,"column":6},"end":{"line":261,"column":55}},"54":{"start":{"line":265,"column":22},"end":{"line":265,"column":50}},"55":{"start":{"line":266,"column":20},"end":{"line":266,"column":40}},"56":{"start":{"line":268,"column":4},"end":{"line":270,"column":5}},"57":{"start":{"line":269,"column":6},"end":{"line":269,"column":86}},"58":{"start":{"line":272,"column":42},"end":{"line":272,"column":57}},"59":{"start":{"line":275,"column":4},"end":{"line":279,"column":5}},"60":{"start":{"line":276,"column":6},"end":{"line":278,"column":8}},"61":{"start":{"line":281,"column":27},"end":{"line":281,"column":41}},"62":{"start":{"line":284,"column":4},"end":{"line":284,"column":31}},"63":{"start":{"line":285,"column":4},"end":{"line":285,"column":47}},"64":{"start":{"line":288,"column":4},"end":{"line":294,"column":7}},"65":{"start":{"line":296,"column":4},"end":{"line":296,"column":19}},"66":{"start":{"line":301,"column":28},"end":{"line":307,"column":16}},"67":{"start":{"line":309,"column":4},"end":{"line":321,"column":5}},"68":{"start":{"line":310,"column":6},"end":{"line":310,"column":47}},"69":{"start":{"line":311,"column":6},"end":{"line":311,"column":49}},"70":{"start":{"line":314,"column":6},"end":{"line":320,"column":9}},"71":{"start":{"line":326,"column":4},"end":{"line":326,"column":51}},"72":{"start":{"line":19,"column":13},"end":{"line":19,"column":28}},"73":{"start":{"line":19,"column":13},"end":{"line":328,"column":null}}},"fnMap":{"0":{"name":"(anonymous_4)","decl":{"start":{"line":20,"column":2},"end":{"line":20,"column":null}},"loc":{"start":{"line":26,"column":73},"end":{"line":27,"column":6}}},"1":{"name":"(anonymous_5)","decl":{"start":{"line":30,"column":9},"end":{"line":30,"column":14}},"loc":{"start":{"line":32,"column":21},"end":{"line":67,"column":3}}},"2":{"name":"(anonymous_6)","decl":{"start":{"line":70,"column":9},"end":{"line":70,"column":14}},"loc":{"start":{"line":71,"column":30},"end":{"line":142,"column":3}}},"3":{"name":"(anonymous_7)","decl":{"start":{"line":145,"column":9},"end":{"line":145,"column":14}},"loc":{"start":{"line":145,"column":39},"end":{"line":228,"column":3}}},"4":{"name":"(anonymous_8)","decl":{"start":{"line":211,"column":43},"end":{"line":211,"column":44}},"loc":{"start":{"line":211,"column":58},"end":{"line":226,"column":8}}},"5":{"name":"(anonymous_9)","decl":{"start":{"line":231,"column":10},"end":{"line":231,"column":34}},"loc":{"start":{"line":233,"column":28},"end":{"line":246,"column":3}}},"6":{"name":"(anonymous_10)","decl":{"start":{"line":249,"column":9},"end":{"line":249,"column":14}},"loc":{"start":{"line":253,"column":20},"end":{"line":297,"column":3}}},"7":{"name":"(anonymous_11)","decl":{"start":{"line":300,"column":9},"end":{"line":300,"column":14}},"loc":{"start":{"line":300,"column":42},"end":{"line":322,"column":3}}},"8":{"name":"(anonymous_12)","decl":{"start":{"line":325,"column":9},"end":{"line":325,"column":27}},"loc":{"start":{"line":325,"column":44},"end":{"line":327,"column":3}}}},"branchMap":{"0":{"loc":{"start":{"line":45,"column":4},"end":{"line":47,"column":5}},"type":"if","locations":[{"start":{"line":45,"column":4},"end":{"line":47,"column":5}},{"start":{},"end":{}}]},"1":{"loc":{"start":{"line":48,"column":4},"end":{"line":50,"column":5}},"type":"if","locations":[{"start":{"line":48,"column":4},"end":{"line":50,"column":5}},{"start":{},"end":{}}]},"2":{"loc":{"start":{"line":63,"column":10},"end":{"line":63,"column":34}},"type":"binary-expr","locations":[{"start":{"line":63,"column":10},"end":{"line":63,"column":18}},{"start":{"line":63,"column":22},"end":{"line":63,"column":34}}]},"3":{"loc":{"start":{"line":77,"column":6},"end":{"line":77,"column":35}},"type":"default-arg","locations":[{"start":{"line":77,"column":15},"end":{"line":77,"column":35}}]},"4":{"loc":{"start":{"line":78,"column":6},"end":{"line":78,"column":16}},"type":"default-arg","locations":[{"start":{"line":78,"column":14},"end":{"line":78,"column":16}}]},"5":{"loc":{"start":{"line":79,"column":6},"end":{"line":79,"column":16}},"type":"default-arg","locations":[{"start":{"line":79,"column":15},"end":{"line":79,"column":16}}]},"6":{"loc":{"start":{"line":105,"column":4},"end":{"line":111,"column":5}},"type":"if","locations":[{"start":{"line":105,"column":4},"end":{"line":111,"column":5}},{"start":{"line":107,"column":11},"end":{"line":111,"column":5}}]},"7":{"loc":{"start":{"line":113,"column":4},"end":{"line":115,"column":5}},"type":"if","locations":[{"start":{"line":113,"column":4},"end":{"line":115,"column":5}},{"start":{},"end":{}}]},"8":{"loc":{"start":{"line":117,"column":4},"end":{"line":122,"column":5}},"type":"if","locations":[{"start":{"line":117,"column":4},"end":{"line":122,"column":5}},{"start":{},"end":{}}]},"9":{"loc":{"start":{"line":124,"column":4},"end":{"line":135,"column":5}},"type":"switch","locations":[{"start":{"line":125,"column":6},"end":{"line":127,"column":14}},{"start":{"line":128,"column":6},"end":{"line":130,"column":14}},{"start":{"line":131,"column":6},"end":{"line":131,"column":32}},{"start":{"line":132,"column":6},"end":{"line":134,"column":14}}]},"10":{"loc":{"start":{"line":155,"column":4},"end":{"line":157,"column":5}},"type":"if","locations":[{"start":{"line":155,"column":4},"end":{"line":157,"column":5}},{"start":{},"end":{}}]},"11":{"loc":{"start":{"line":179,"column":23},"end":{"line":179,"column":54}},"type":"binary-expr","locations":[{"start":{"line":179,"column":23},"end":{"line":179,"column":49}},{"start":{"line":179,"column":53},"end":{"line":179,"column":54}}]},"12":{"loc":{"start":{"line":180,"column":24},"end":{"line":180,"column":56}},"type":"binary-expr","locations":[{"start":{"line":180,"column":24},"end":{"line":180,"column":51}},{"start":{"line":180,"column":55},"end":{"line":180,"column":56}}]},"13":{"loc":{"start":{"line":182,"column":6},"end":{"line":182,"column":74}},"type":"cond-expr","locations":[{"start":{"line":182,"column":23},"end":{"line":182,"column":70}},{"start":{"line":182,"column":73},"end":{"line":182,"column":74}}]},"14":{"loc":{"start":{"line":206,"column":31},"end":{"line":206,"column":68}},"type":"binary-expr","locations":[{"start":{"line":206,"column":31},"end":{"line":206,"column":63}},{"start":{"line":206,"column":67},"end":{"line":206,"column":68}}]},"15":{"loc":{"start":{"line":207,"column":28},"end":{"line":207,"column":62}},"type":"binary-expr","locations":[{"start":{"line":207,"column":28},"end":{"line":207,"column":57}},{"start":{"line":207,"column":61},"end":{"line":207,"column":62}}]},"16":{"loc":{"start":{"line":208,"column":29},"end":{"line":208,"column":64}},"type":"binary-expr","locations":[{"start":{"line":208,"column":29},"end":{"line":208,"column":59}},{"start":{"line":208,"column":63},"end":{"line":208,"column":64}}]},"17":{"loc":{"start":{"line":218,"column":10},"end":{"line":225,"column":null}},"type":"cond-expr","locations":[{"start":{"line":219,"column":14},"end":{"line":219,"column":18}},{"start":{"line":220,"column":14},"end":{"line":225,"column":null}}]},"18":{"loc":{"start":{"line":218,"column":10},"end":{"line":218,"column":49}},"type":"binary-expr","locations":[{"start":{"line":218,"column":10},"end":{"line":218,"column":30}},{"start":{"line":218,"column":34},"end":{"line":218,"column":49}}]},"19":{"loc":{"start":{"line":245,"column":11},"end":{"line":245,"column":72}},"type":"binary-expr","locations":[{"start":{"line":245,"column":11},"end":{"line":245,"column":63}},{"start":{"line":245,"column":67},"end":{"line":245,"column":72}}]},"20":{"loc":{"start":{"line":260,"column":4},"end":{"line":262,"column":5}},"type":"if","locations":[{"start":{"line":260,"column":4},"end":{"line":262,"column":5}},{"start":{},"end":{}}]},"21":{"loc":{"start":{"line":268,"column":4},"end":{"line":270,"column":5}},"type":"if","locations":[{"start":{"line":268,"column":4},"end":{"line":270,"column":5}},{"start":{},"end":{}}]},"22":{"loc":{"start":{"line":268,"column":8},"end":{"line":268,"column":30}},"type":"binary-expr","locations":[{"start":{"line":268,"column":8},"end":{"line":268,"column":18}},{"start":{"line":268,"column":22},"end":{"line":268,"column":30}}]},"23":{"loc":{"start":{"line":275,"column":4},"end":{"line":279,"column":5}},"type":"if","locations":[{"start":{"line":275,"column":4},"end":{"line":279,"column":5}},{"start":{},"end":{}}]},"24":{"loc":{"start":{"line":291,"column":14},"end":{"line":291,"column":28}},"type":"binary-expr","locations":[{"start":{"line":291,"column":14},"end":{"line":291,"column":20}},{"start":{"line":291,"column":24},"end":{"line":291,"column":28}}]},"25":{"loc":{"start":{"line":22,"column":40},"end":{"line":22,"column":59}},"type":"cond-expr","locations":[{"start":{"line":22,"column":50},"end":{"line":22,"column":59}},{"start":{"line":22,"column":50},"end":{"line":22,"column":59}}]},"26":{"loc":{"start":{"line":22,"column":40},"end":{"line":22,"column":50}},"type":"binary-expr","locations":[{"start":{"line":22,"column":40},"end":{"line":22,"column":59}},{"start":{"line":22,"column":40},"end":{"line":22,"column":50}}]},"27":{"loc":{"start":{"line":22,"column":50},"end":{"line":24,"column":61}},"type":"cond-expr","locations":[{"start":{"line":24,"column":51},"end":{"line":24,"column":61}},{"start":{"line":24,"column":51},"end":{"line":24,"column":61}}]},"28":{"loc":{"start":{"line":22,"column":50},"end":{"line":24,"column":51}},"type":"binary-expr","locations":[{"start":{"line":22,"column":50},"end":{"line":24,"column":61}},{"start":{"line":24,"column":41},"end":{"line":24,"column":51}}]},"29":{"loc":{"start":{"line":24,"column":51},"end":{"line":26,"column":73}},"type":"cond-expr","locations":[{"start":{"line":26,"column":57},"end":{"line":26,"column":73}},{"start":{"line":26,"column":57},"end":{"line":26,"column":73}}]},"30":{"loc":{"start":{"line":24,"column":51},"end":{"line":26,"column":57}},"type":"binary-expr","locations":[{"start":{"line":24,"column":51},"end":{"line":26,"column":73}},{"start":{"line":26,"column":47},"end":{"line":26,"column":57}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0],"4":[0],"5":[0],"6":[0,0],"7":[0,0],"8":[0,0],"9":[0,0,0,0],"10":[0,0],"11":[0,0],"12":[0,0],"13":[0,0],"14":[0,0],"15":[0,0],"16":[0,0],"17":[0,0],"18":[0,0],"19":[0,0],"20":[0,0],"21":[0,0],"22":[0,0],"23":[0,0],"24":[0,0],"25":[0,0],"26":[0,0],"27":[0,0],"28":[0,0],"29":[0,0],"30":[0,0]}} -,"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\projects\\services\\analytics.service.ts": {"path":"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\projects\\services\\analytics.service.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":91}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":51}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":57}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":53}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":68}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":56}},"6":{"start":{"line":10,"column":29},"end":{"line":368,"column":null}},"7":{"start":{"line":11,"column":28},"end":{"line":11,"column":61}},"8":{"start":{"line":15,"column":21},"end":{"line":15,"column":40}},"9":{"start":{"line":17,"column":21},"end":{"line":17,"column":41}},"10":{"start":{"line":19,"column":21},"end":{"line":19,"column":37}},"11":{"start":{"line":28,"column":20},"end":{"line":31,"column":6}},"12":{"start":{"line":33,"column":4},"end":{"line":35,"column":5}},"13":{"start":{"line":34,"column":6},"end":{"line":34,"column":55}},"14":{"start":{"line":38,"column":22},"end":{"line":38,"column":50}},"15":{"start":{"line":39,"column":20},"end":{"line":39,"column":40}},"16":{"start":{"line":41,"column":4},"end":{"line":43,"column":5}},"17":{"start":{"line":42,"column":6},"end":{"line":42,"column":89}},"18":{"start":{"line":45,"column":76},"end":{"line":45,"column":81}},"19":{"start":{"line":48,"column":18},"end":{"line":48,"column":99}},"20":{"start":{"line":49,"column":16},"end":{"line":49,"column":56}},"21":{"start":{"line":52,"column":23},"end":{"line":52,"column":70}},"22":{"start":{"line":55,"column":27},"end":{"line":55,"column":101}},"23":{"start":{"line":58,"column":22},"end":{"line":58,"column":79}},"24":{"start":{"line":61,"column":28},"end":{"line":61,"column":93}},"25":{"start":{"line":63,"column":4},"end":{"line":82,"column":6}},"26":{"start":{"line":86,"column":18},"end":{"line":99,"column":null}},"27":{"start":{"line":108,"column":4},"end":{"line":115,"column":6}},"28":{"start":{"line":126,"column":4},"end":{"line":137,"column":5}},"29":{"start":{"line":128,"column":8},"end":{"line":128,"column":85}},"30":{"start":{"line":129,"column":8},"end":{"line":129,"column":14}},"31":{"start":{"line":131,"column":8},"end":{"line":131,"column":86}},"32":{"start":{"line":132,"column":8},"end":{"line":132,"column":14}},"33":{"start":{"line":135,"column":8},"end":{"line":135,"column":84}},"34":{"start":{"line":136,"column":8},"end":{"line":136,"column":14}},"35":{"start":{"line":139,"column":19},"end":{"line":153,"column":null}},"36":{"start":{"line":160,"column":4},"end":{"line":165,"column":8}},"37":{"start":{"line":160,"column":32},"end":{"line":165,"column":6}},"38":{"start":{"line":169,"column":18},"end":{"line":187,"column":16}},"39":{"start":{"line":189,"column":19},"end":{"line":189,"column":null}},"40":{"start":{"line":200,"column":4},"end":{"line":208,"column":8}},"41":{"start":{"line":200,"column":32},"end":{"line":208,"column":6}},"42":{"start":{"line":220,"column":4},"end":{"line":234,"column":5}},"43":{"start":{"line":222,"column":8},"end":{"line":222,"column":53}},"44":{"start":{"line":223,"column":8},"end":{"line":223,"column":25}},"45":{"start":{"line":224,"column":8},"end":{"line":224,"column":14}},"46":{"start":{"line":226,"column":8},"end":{"line":226,"column":54}},"47":{"start":{"line":227,"column":8},"end":{"line":227,"column":26}},"48":{"start":{"line":228,"column":8},"end":{"line":228,"column":14}},"49":{"start":{"line":231,"column":8},"end":{"line":231,"column":52}},"50":{"start":{"line":232,"column":8},"end":{"line":232,"column":25}},"51":{"start":{"line":233,"column":8},"end":{"line":233,"column":14}},"52":{"start":{"line":236,"column":21},"end":{"line":248,"column":null}},"53":{"start":{"line":261,"column":9},"end":{"line":261,"column":11}},"54":{"start":{"line":263,"column":4},"end":{"line":279,"column":5}},"55":{"start":{"line":263,"column":17},"end":{"line":263,"column":18}},"56":{"start":{"line":264,"column":22},"end":{"line":264,"column":33}},"57":{"start":{"line":265,"column":23},"end":{"line":265,"column":38}},"58":{"start":{"line":267,"column":23},"end":{"line":267,"column":24}},"59":{"start":{"line":268,"column":6},"end":{"line":270,"column":7}},"60":{"start":{"line":269,"column":8},"end":{"line":269,"column":121}},"61":{"start":{"line":272,"column":6},"end":{"line":278,"column":9}},"62":{"start":{"line":281,"column":4},"end":{"line":281,"column":24}},"63":{"start":{"line":285,"column":58},"end":{"line":285,"column":63}},"64":{"start":{"line":287,"column":18},"end":{"line":287,"column":99}},"65":{"start":{"line":288,"column":16},"end":{"line":288,"column":56}},"66":{"start":{"line":291,"column":21},"end":{"line":294,"column":6}},"67":{"start":{"line":296,"column":23},"end":{"line":296,"column":46}},"68":{"start":{"line":296,"column":41},"end":{"line":296,"column":45}},"69":{"start":{"line":299,"column":25},"end":{"line":310,"column":null}},"70":{"start":{"line":318,"column":31},"end":{"line":349,"column":null}},"71":{"start":{"line":320,"column":22},"end":{"line":330,"column":null}},"72":{"start":{"line":336,"column":8},"end":{"line":348,"column":10}},"73":{"start":{"line":352,"column":4},"end":{"line":366,"column":6}},"74":{"start":{"line":365,"column":60},"end":{"line":365,"column":91}},"75":{"start":{"line":10,"column":13},"end":{"line":10,"column":29}},"76":{"start":{"line":10,"column":13},"end":{"line":368,"column":null}}},"fnMap":{"0":{"name":"(anonymous_4)","decl":{"start":{"line":13,"column":2},"end":{"line":13,"column":null}},"loc":{"start":{"line":19,"column":53},"end":{"line":20,"column":6}}},"1":{"name":"(anonymous_5)","decl":{"start":{"line":22,"column":2},"end":{"line":22,"column":7}},"loc":{"start":{"line":26,"column":28},"end":{"line":83,"column":3}}},"2":{"name":"(anonymous_6)","decl":{"start":{"line":85,"column":10},"end":{"line":85,"column":15}},"loc":{"start":{"line":85,"column":79},"end":{"line":116,"column":3}}},"3":{"name":"(anonymous_7)","decl":{"start":{"line":118,"column":10},"end":{"line":118,"column":15}},"loc":{"start":{"line":123,"column":20},"end":{"line":166,"column":3}}},"4":{"name":"(anonymous_8)","decl":{"start":{"line":160,"column":22},"end":{"line":160,"column":27}},"loc":{"start":{"line":160,"column":32},"end":{"line":165,"column":6}}},"5":{"name":"(anonymous_9)","decl":{"start":{"line":168,"column":10},"end":{"line":168,"column":15}},"loc":{"start":{"line":168,"column":98},"end":{"line":209,"column":3}}},"6":{"name":"(anonymous_10)","decl":{"start":{"line":200,"column":22},"end":{"line":200,"column":27}},"loc":{"start":{"line":200,"column":32},"end":{"line":208,"column":6}}},"7":{"name":"(anonymous_11)","decl":{"start":{"line":211,"column":10},"end":{"line":211,"column":15}},"loc":{"start":{"line":215,"column":23},"end":{"line":282,"column":3}}},"8":{"name":"(anonymous_12)","decl":{"start":{"line":284,"column":2},"end":{"line":284,"column":7}},"loc":{"start":{"line":284,"column":68},"end":{"line":367,"column":3}}},"9":{"name":"(anonymous_13)","decl":{"start":{"line":296,"column":36},"end":{"line":296,"column":37}},"loc":{"start":{"line":296,"column":41},"end":{"line":296,"column":45}}},"10":{"name":"(anonymous_14)","decl":{"start":{"line":319,"column":19},"end":{"line":319,"column":24}},"loc":{"start":{"line":319,"column":37},"end":{"line":349,"column":7}}},"11":{"name":"(anonymous_15)","decl":{"start":{"line":365,"column":50},"end":{"line":365,"column":51}},"loc":{"start":{"line":365,"column":60},"end":{"line":365,"column":91}}}},"branchMap":{"0":{"loc":{"start":{"line":33,"column":4},"end":{"line":35,"column":5}},"type":"if","locations":[{"start":{"line":33,"column":4},"end":{"line":35,"column":5}},{"start":{},"end":{}}]},"1":{"loc":{"start":{"line":41,"column":4},"end":{"line":43,"column":5}},"type":"if","locations":[{"start":{"line":41,"column":4},"end":{"line":43,"column":5}},{"start":{},"end":{}}]},"2":{"loc":{"start":{"line":41,"column":8},"end":{"line":41,"column":30}},"type":"binary-expr","locations":[{"start":{"line":41,"column":8},"end":{"line":41,"column":18}},{"start":{"line":41,"column":22},"end":{"line":41,"column":30}}]},"3":{"loc":{"start":{"line":45,"column":32},"end":{"line":45,"column":53}},"type":"default-arg","locations":[{"start":{"line":45,"column":46},"end":{"line":45,"column":53}}]},"4":{"loc":{"start":{"line":45,"column":55},"end":{"line":45,"column":71}},"type":"default-arg","locations":[{"start":{"line":45,"column":66},"end":{"line":45,"column":71}}]},"5":{"loc":{"start":{"line":48,"column":18},"end":{"line":48,"column":99}},"type":"cond-expr","locations":[{"start":{"line":48,"column":30},"end":{"line":48,"column":49}},{"start":{"line":48,"column":52},"end":{"line":48,"column":99}}]},"6":{"loc":{"start":{"line":49,"column":16},"end":{"line":49,"column":56}},"type":"cond-expr","locations":[{"start":{"line":49,"column":26},"end":{"line":49,"column":43}},{"start":{"line":49,"column":46},"end":{"line":49,"column":56}}]},"7":{"loc":{"start":{"line":109,"column":29},"end":{"line":109,"column":55}},"type":"binary-expr","locations":[{"start":{"line":109,"column":29},"end":{"line":109,"column":50}},{"start":{"line":109,"column":54},"end":{"line":109,"column":55}}]},"8":{"loc":{"start":{"line":110,"column":26},"end":{"line":110,"column":49}},"type":"binary-expr","locations":[{"start":{"line":110,"column":26},"end":{"line":110,"column":44}},{"start":{"line":110,"column":48},"end":{"line":110,"column":49}}]},"9":{"loc":{"start":{"line":111,"column":27},"end":{"line":111,"column":51}},"type":"binary-expr","locations":[{"start":{"line":111,"column":27},"end":{"line":111,"column":46}},{"start":{"line":111,"column":50},"end":{"line":111,"column":51}}]},"10":{"loc":{"start":{"line":112,"column":30},"end":{"line":112,"column":57}},"type":"binary-expr","locations":[{"start":{"line":112,"column":30},"end":{"line":112,"column":52}},{"start":{"line":112,"column":56},"end":{"line":112,"column":57}}]},"11":{"loc":{"start":{"line":113,"column":26},"end":{"line":113,"column":49}},"type":"binary-expr","locations":[{"start":{"line":113,"column":26},"end":{"line":113,"column":44}},{"start":{"line":113,"column":48},"end":{"line":113,"column":49}}]},"12":{"loc":{"start":{"line":114,"column":26},"end":{"line":114,"column":49}},"type":"binary-expr","locations":[{"start":{"line":114,"column":26},"end":{"line":114,"column":44}},{"start":{"line":114,"column":48},"end":{"line":114,"column":49}}]},"13":{"loc":{"start":{"line":126,"column":4},"end":{"line":137,"column":5}},"type":"switch","locations":[{"start":{"line":127,"column":6},"end":{"line":129,"column":14}},{"start":{"line":130,"column":6},"end":{"line":132,"column":14}},{"start":{"line":133,"column":6},"end":{"line":133,"column":19}},{"start":{"line":134,"column":6},"end":{"line":136,"column":14}}]},"14":{"loc":{"start":{"line":201,"column":10},"end":{"line":201,"column":42}},"type":"cond-expr","locations":[{"start":{"line":201,"column":22},"end":{"line":201,"column":35}},{"start":{"line":201,"column":38},"end":{"line":201,"column":42}}]},"15":{"loc":{"start":{"line":202,"column":17},"end":{"line":202,"column":51}},"type":"cond-expr","locations":[{"start":{"line":202,"column":29},"end":{"line":202,"column":44}},{"start":{"line":202,"column":47},"end":{"line":202,"column":51}}]},"16":{"loc":{"start":{"line":203,"column":16},"end":{"line":203,"column":49}},"type":"cond-expr","locations":[{"start":{"line":203,"column":28},"end":{"line":203,"column":42}},{"start":{"line":203,"column":45},"end":{"line":203,"column":49}}]},"17":{"loc":{"start":{"line":204,"column":17},"end":{"line":204,"column":51}},"type":"cond-expr","locations":[{"start":{"line":204,"column":29},"end":{"line":204,"column":44}},{"start":{"line":204,"column":47},"end":{"line":204,"column":51}}]},"18":{"loc":{"start":{"line":220,"column":4},"end":{"line":234,"column":5}},"type":"switch","locations":[{"start":{"line":221,"column":6},"end":{"line":224,"column":14}},{"start":{"line":225,"column":6},"end":{"line":228,"column":14}},{"start":{"line":229,"column":6},"end":{"line":229,"column":19}},{"start":{"line":230,"column":6},"end":{"line":233,"column":14}}]},"19":{"loc":{"start":{"line":268,"column":6},"end":{"line":270,"column":7}},"type":"if","locations":[{"start":{"line":268,"column":6},"end":{"line":270,"column":7}},{"start":{},"end":{}}]},"20":{"loc":{"start":{"line":268,"column":10},"end":{"line":268,"column":54}},"type":"binary-expr","locations":[{"start":{"line":268,"column":10},"end":{"line":268,"column":18}},{"start":{"line":268,"column":22},"end":{"line":268,"column":54}}]},"21":{"loc":{"start":{"line":277,"column":28},"end":{"line":277,"column":127}},"type":"cond-expr","locations":[{"start":{"line":277,"column":64},"end":{"line":277,"column":123}},{"start":{"line":277,"column":126},"end":{"line":277,"column":127}}]},"22":{"loc":{"start":{"line":285,"column":32},"end":{"line":285,"column":53}},"type":"default-arg","locations":[{"start":{"line":285,"column":46},"end":{"line":285,"column":53}}]},"23":{"loc":{"start":{"line":287,"column":18},"end":{"line":287,"column":99}},"type":"cond-expr","locations":[{"start":{"line":287,"column":30},"end":{"line":287,"column":49}},{"start":{"line":287,"column":52},"end":{"line":287,"column":99}}]},"24":{"loc":{"start":{"line":288,"column":16},"end":{"line":288,"column":56}},"type":"cond-expr","locations":[{"start":{"line":288,"column":26},"end":{"line":288,"column":43}},{"start":{"line":288,"column":46},"end":{"line":288,"column":56}}]},"25":{"loc":{"start":{"line":342,"column":31},"end":{"line":342,"column":54}},"type":"binary-expr","locations":[{"start":{"line":342,"column":31},"end":{"line":342,"column":49}},{"start":{"line":342,"column":53},"end":{"line":342,"column":54}}]},"26":{"loc":{"start":{"line":343,"column":34},"end":{"line":343,"column":59}},"type":"binary-expr","locations":[{"start":{"line":343,"column":34},"end":{"line":343,"column":54}},{"start":{"line":343,"column":58},"end":{"line":343,"column":59}}]},"27":{"loc":{"start":{"line":344,"column":37},"end":{"line":344,"column":61}},"type":"binary-expr","locations":[{"start":{"line":344,"column":37},"end":{"line":344,"column":56}},{"start":{"line":344,"column":60},"end":{"line":344,"column":61}}]},"28":{"loc":{"start":{"line":359,"column":31},"end":{"line":359,"column":64}},"type":"binary-expr","locations":[{"start":{"line":359,"column":31},"end":{"line":359,"column":59}},{"start":{"line":359,"column":63},"end":{"line":359,"column":64}}]},"29":{"loc":{"start":{"line":360,"column":28},"end":{"line":360,"column":58}},"type":"binary-expr","locations":[{"start":{"line":360,"column":28},"end":{"line":360,"column":53}},{"start":{"line":360,"column":57},"end":{"line":360,"column":58}}]},"30":{"loc":{"start":{"line":361,"column":29},"end":{"line":361,"column":60}},"type":"binary-expr","locations":[{"start":{"line":361,"column":29},"end":{"line":361,"column":55}},{"start":{"line":361,"column":59},"end":{"line":361,"column":60}}]},"31":{"loc":{"start":{"line":362,"column":31},"end":{"line":362,"column":64}},"type":"binary-expr","locations":[{"start":{"line":362,"column":31},"end":{"line":362,"column":59}},{"start":{"line":362,"column":63},"end":{"line":362,"column":64}}]},"32":{"loc":{"start":{"line":15,"column":40},"end":{"line":15,"column":59}},"type":"cond-expr","locations":[{"start":{"line":15,"column":50},"end":{"line":15,"column":59}},{"start":{"line":15,"column":50},"end":{"line":15,"column":59}}]},"33":{"loc":{"start":{"line":15,"column":40},"end":{"line":15,"column":50}},"type":"binary-expr","locations":[{"start":{"line":15,"column":40},"end":{"line":15,"column":59}},{"start":{"line":15,"column":40},"end":{"line":15,"column":50}}]},"34":{"loc":{"start":{"line":15,"column":50},"end":{"line":17,"column":61}},"type":"cond-expr","locations":[{"start":{"line":17,"column":51},"end":{"line":17,"column":61}},{"start":{"line":17,"column":51},"end":{"line":17,"column":61}}]},"35":{"loc":{"start":{"line":15,"column":50},"end":{"line":17,"column":51}},"type":"binary-expr","locations":[{"start":{"line":15,"column":50},"end":{"line":17,"column":61}},{"start":{"line":17,"column":41},"end":{"line":17,"column":51}}]},"36":{"loc":{"start":{"line":17,"column":51},"end":{"line":19,"column":53}},"type":"cond-expr","locations":[{"start":{"line":19,"column":47},"end":{"line":19,"column":53}},{"start":{"line":19,"column":47},"end":{"line":19,"column":53}}]},"37":{"loc":{"start":{"line":17,"column":51},"end":{"line":19,"column":47}},"type":"binary-expr","locations":[{"start":{"line":17,"column":51},"end":{"line":19,"column":53}},{"start":{"line":19,"column":37},"end":{"line":19,"column":47}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0],"4":[0],"5":[0,0],"6":[0,0],"7":[0,0],"8":[0,0],"9":[0,0],"10":[0,0],"11":[0,0],"12":[0,0],"13":[0,0,0,0],"14":[0,0],"15":[0,0],"16":[0,0],"17":[0,0],"18":[0,0,0,0],"19":[0,0],"20":[0,0],"21":[0,0],"22":[0],"23":[0,0],"24":[0,0],"25":[0,0],"26":[0,0],"27":[0,0],"28":[0,0],"29":[0,0],"30":[0,0],"31":[0,0],"32":[0,0],"33":[0,0],"34":[0,0],"35":[0,0],"36":[0,0],"37":[0,0]}} -,"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\projects\\services\\image-upload.service.ts": {"path":"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\projects\\services\\image-upload.service.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":104}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":51}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":37}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":53}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":64}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":78}},"6":{"start":{"line":9,"column":7},"end":{"line":97,"column":null}},"7":{"start":{"line":12,"column":21},"end":{"line":12,"column":40}},"8":{"start":{"line":14,"column":21},"end":{"line":14,"column":45}},"9":{"start":{"line":15,"column":21},"end":{"line":15,"column":40}},"10":{"start":{"line":24,"column":20},"end":{"line":27,"column":6}},"11":{"start":{"line":29,"column":4},"end":{"line":31,"column":5}},"12":{"start":{"line":30,"column":6},"end":{"line":30,"column":55}},"13":{"start":{"line":34,"column":22},"end":{"line":34,"column":50}},"14":{"start":{"line":35,"column":20},"end":{"line":35,"column":40}},"15":{"start":{"line":37,"column":4},"end":{"line":39,"column":5}},"16":{"start":{"line":38,"column":6},"end":{"line":38,"column":78}},"17":{"start":{"line":41,"column":43},"end":{"line":41,"column":45}},"18":{"start":{"line":43,"column":4},"end":{"line":57,"column":5}},"19":{"start":{"line":43,"column":17},"end":{"line":43,"column":18}},"20":{"start":{"line":44,"column":19},"end":{"line":44,"column":27}},"21":{"start":{"line":45,"column":23},"end":{"line":45,"column":79}},"22":{"start":{"line":47,"column":27},"end":{"line":54,"column":8}},"23":{"start":{"line":56,"column":6},"end":{"line":56,"column":80}},"24":{"start":{"line":59,"column":4},"end":{"line":59,"column":26}},"25":{"start":{"line":67,"column":18},"end":{"line":70,"column":6}},"26":{"start":{"line":72,"column":4},"end":{"line":74,"column":5}},"27":{"start":{"line":73,"column":6},"end":{"line":73,"column":53}},"28":{"start":{"line":77,"column":22},"end":{"line":77,"column":56}},"29":{"start":{"line":78,"column":20},"end":{"line":78,"column":40}},"30":{"start":{"line":80,"column":4},"end":{"line":82,"column":5}},"31":{"start":{"line":81,"column":6},"end":{"line":81,"column":78}},"32":{"start":{"line":85,"column":4},"end":{"line":85,"column":55}},"33":{"start":{"line":88,"column":4},"end":{"line":88,"column":52}},"34":{"start":{"line":92,"column":4},"end":{"line":95,"column":7}},"35":{"start":{"line":9,"column":13},"end":{"line":9,"column":31}},"36":{"start":{"line":9,"column":13},"end":{"line":97,"column":null}}},"fnMap":{"0":{"name":"(anonymous_4)","decl":{"start":{"line":10,"column":2},"end":{"line":10,"column":null}},"loc":{"start":{"line":15,"column":57},"end":{"line":16,"column":6}}},"1":{"name":"(anonymous_5)","decl":{"start":{"line":18,"column":2},"end":{"line":18,"column":7}},"loc":{"start":{"line":22,"column":20},"end":{"line":60,"column":3}}},"2":{"name":"(anonymous_6)","decl":{"start":{"line":62,"column":2},"end":{"line":62,"column":7}},"loc":{"start":{"line":65,"column":20},"end":{"line":89,"column":3}}},"3":{"name":"(anonymous_7)","decl":{"start":{"line":91,"column":2},"end":{"line":91,"column":7}},"loc":{"start":{"line":91,"column":42},"end":{"line":96,"column":3}}}},"branchMap":{"0":{"loc":{"start":{"line":29,"column":4},"end":{"line":31,"column":5}},"type":"if","locations":[{"start":{"line":29,"column":4},"end":{"line":31,"column":5}},{"start":{},"end":{}}]},"1":{"loc":{"start":{"line":37,"column":4},"end":{"line":39,"column":5}},"type":"if","locations":[{"start":{"line":37,"column":4},"end":{"line":39,"column":5}},{"start":{},"end":{}}]},"2":{"loc":{"start":{"line":37,"column":8},"end":{"line":37,"column":30}},"type":"binary-expr","locations":[{"start":{"line":37,"column":8},"end":{"line":37,"column":18}},{"start":{"line":37,"column":22},"end":{"line":37,"column":30}}]},"3":{"loc":{"start":{"line":72,"column":4},"end":{"line":74,"column":5}},"type":"if","locations":[{"start":{"line":72,"column":4},"end":{"line":74,"column":5}},{"start":{},"end":{}}]},"4":{"loc":{"start":{"line":80,"column":4},"end":{"line":82,"column":5}},"type":"if","locations":[{"start":{"line":80,"column":4},"end":{"line":82,"column":5}},{"start":{},"end":{}}]},"5":{"loc":{"start":{"line":80,"column":8},"end":{"line":80,"column":30}},"type":"binary-expr","locations":[{"start":{"line":80,"column":8},"end":{"line":80,"column":18}},{"start":{"line":80,"column":22},"end":{"line":80,"column":30}}]},"6":{"loc":{"start":{"line":12,"column":40},"end":{"line":12,"column":59}},"type":"cond-expr","locations":[{"start":{"line":12,"column":50},"end":{"line":12,"column":59}},{"start":{"line":12,"column":50},"end":{"line":12,"column":59}}]},"7":{"loc":{"start":{"line":12,"column":40},"end":{"line":12,"column":50}},"type":"binary-expr","locations":[{"start":{"line":12,"column":40},"end":{"line":12,"column":59}},{"start":{"line":12,"column":40},"end":{"line":12,"column":50}}]},"8":{"loc":{"start":{"line":12,"column":50},"end":{"line":14,"column":69}},"type":"cond-expr","locations":[{"start":{"line":14,"column":55},"end":{"line":14,"column":69}},{"start":{"line":14,"column":55},"end":{"line":14,"column":69}}]},"9":{"loc":{"start":{"line":12,"column":50},"end":{"line":14,"column":55}},"type":"binary-expr","locations":[{"start":{"line":12,"column":50},"end":{"line":14,"column":69}},{"start":{"line":14,"column":45},"end":{"line":14,"column":55}}]},"10":{"loc":{"start":{"line":14,"column":55},"end":{"line":15,"column":null}},"type":"cond-expr","locations":[{"start":{"line":15,"column":57},"end":{"line":15,"column":null}},{"start":{"line":15,"column":57},"end":{"line":15,"column":null}}]},"11":{"loc":{"start":{"line":14,"column":55},"end":{"line":15,"column":57}},"type":"binary-expr","locations":[{"start":{"line":14,"column":55},"end":{"line":15,"column":null}},{"start":{"line":15,"column":40},"end":{"line":15,"column":57}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0},"f":{"0":0,"1":0,"2":0,"3":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,0],"7":[0,0],"8":[0,0],"9":[0,0],"10":[0,0],"11":[0,0]}} -,"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\projects\\services\\search.service.ts": {"path":"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\projects\\services\\search.service.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":52}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":51}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":57}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":53}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":73}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":69}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":70}},"7":{"start":{"line":11,"column":26},"end":{"line":260,"column":null}},"8":{"start":{"line":12,"column":28},"end":{"line":12,"column":58}},"9":{"start":{"line":16,"column":21},"end":{"line":16,"column":40}},"10":{"start":{"line":37,"column":8},"end":{"line":37,"column":17}},"11":{"start":{"line":39,"column":44},"end":{"line":59,"column":8}},"12":{"start":{"line":62,"column":38},"end":{"line":62,"column":40}},"13":{"start":{"line":63,"column":44},"end":{"line":63,"column":46}},"14":{"start":{"line":66,"column":4},"end":{"line":75,"column":5}},"15":{"start":{"line":67,"column":6},"end":{"line":67,"column":63}},"16":{"start":{"line":68,"column":6},"end":{"line":68,"column":37}},"17":{"start":{"line":69,"column":11},"end":{"line":75,"column":5}},"18":{"start":{"line":70,"column":6},"end":{"line":70,"column":55}},"19":{"start":{"line":71,"column":6},"end":{"line":71,"column":33}},"20":{"start":{"line":73,"column":6},"end":{"line":73,"column":70}},"21":{"start":{"line":74,"column":6},"end":{"line":74,"column":82}},"22":{"start":{"line":78,"column":4},"end":{"line":84,"column":5}},"23":{"start":{"line":79,"column":6},"end":{"line":79,"column":67}},"24":{"start":{"line":80,"column":6},"end":{"line":80,"column":41}},"25":{"start":{"line":81,"column":11},"end":{"line":84,"column":5}},"26":{"start":{"line":82,"column":6},"end":{"line":82,"column":59}},"27":{"start":{"line":83,"column":6},"end":{"line":83,"column":37}},"28":{"start":{"line":87,"column":4},"end":{"line":90,"column":5}},"29":{"start":{"line":88,"column":6},"end":{"line":88,"column":61}},"30":{"start":{"line":89,"column":6},"end":{"line":89,"column":47}},"31":{"start":{"line":91,"column":4},"end":{"line":94,"column":5}},"32":{"start":{"line":92,"column":6},"end":{"line":92,"column":61}},"33":{"start":{"line":93,"column":6},"end":{"line":93,"column":47}},"34":{"start":{"line":97,"column":4},"end":{"line":100,"column":5}},"35":{"start":{"line":98,"column":6},"end":{"line":98,"column":64}},"36":{"start":{"line":99,"column":6},"end":{"line":99,"column":51}},"37":{"start":{"line":101,"column":4},"end":{"line":104,"column":5}},"38":{"start":{"line":102,"column":6},"end":{"line":102,"column":64}},"39":{"start":{"line":103,"column":6},"end":{"line":103,"column":51}},"40":{"start":{"line":107,"column":4},"end":{"line":135,"column":5}},"41":{"start":{"line":108,"column":25},"end":{"line":108,"column":38}},"42":{"start":{"line":111,"column":6},"end":{"line":113,"column":8}},"43":{"start":{"line":114,"column":6},"end":{"line":114,"column":58}},"44":{"start":{"line":117,"column":6},"end":{"line":130,"column":8}},"45":{"start":{"line":132,"column":6},"end":{"line":132,"column":60}},"46":{"start":{"line":133,"column":6},"end":{"line":133,"column":61}},"47":{"start":{"line":134,"column":6},"end":{"line":134,"column":60}},"48":{"start":{"line":138,"column":4},"end":{"line":140,"column":5}},"49":{"start":{"line":139,"column":6},"end":{"line":139,"column":58}},"50":{"start":{"line":143,"column":4},"end":{"line":159,"column":5}},"51":{"start":{"line":144,"column":6},"end":{"line":145,"column":49}},"52":{"start":{"line":147,"column":6},"end":{"line":158,"column":7}},"53":{"start":{"line":149,"column":10},"end":{"line":149,"column":52}},"54":{"start":{"line":150,"column":10},"end":{"line":150,"column":16}},"55":{"start":{"line":152,"column":10},"end":{"line":152,"column":48}},"56":{"start":{"line":153,"column":10},"end":{"line":153,"column":16}},"57":{"start":{"line":156,"column":10},"end":{"line":156,"column":50}},"58":{"start":{"line":157,"column":10},"end":{"line":157,"column":16}},"59":{"start":{"line":161,"column":18},"end":{"line":161,"column":37}},"60":{"start":{"line":162,"column":17},"end":{"line":162,"column":60}},"61":{"start":{"line":165,"column":32},"end":{"line":165,"column":34}},"62":{"start":{"line":166,"column":4},"end":{"line":168,"column":5}},"63":{"start":{"line":167,"column":6},"end":{"line":167,"column":72}},"64":{"start":{"line":170,"column":4},"end":{"line":170,"column":40}},"65":{"start":{"line":174,"column":34},"end":{"line":174,"column":36}},"66":{"start":{"line":177,"column":26},"end":{"line":191,"column":19}},"67":{"start":{"line":193,"column":4},"end":{"line":193,"column":63}},"68":{"start":{"line":193,"column":50},"end":{"line":193,"column":60}},"69":{"start":{"line":196,"column":23},"end":{"line":196,"column":53}},"70":{"start":{"line":197,"column":31},"end":{"line":198,"column":null}},"71":{"start":{"line":198,"column":6},"end":{"line":198,"column":58}},"72":{"start":{"line":200,"column":4},"end":{"line":200,"column":44}},"73":{"start":{"line":202,"column":4},"end":{"line":202,"column":35}},"74":{"start":{"line":212,"column":18},"end":{"line":223,"column":19}},"75":{"start":{"line":225,"column":26},"end":{"line":230,"column":17}},"76":{"start":{"line":232,"column":57},"end":{"line":232,"column":59}},"77":{"start":{"line":233,"column":55},"end":{"line":233,"column":57}},"78":{"start":{"line":234,"column":20},"end":{"line":234,"column":21}},"79":{"start":{"line":235,"column":22},"end":{"line":235,"column":23}},"80":{"start":{"line":236,"column":16},"end":{"line":236,"column":17}},"81":{"start":{"line":238,"column":4},"end":{"line":250,"column":7}},"82":{"start":{"line":239,"column":23},"end":{"line":239,"column":36}},"83":{"start":{"line":240,"column":21},"end":{"line":240,"column":32}},"84":{"start":{"line":242,"column":6},"end":{"line":242,"column":81}},"85":{"start":{"line":243,"column":6},"end":{"line":243,"column":73}},"86":{"start":{"line":245,"column":6},"end":{"line":249,"column":7}},"87":{"start":{"line":246,"column":8},"end":{"line":246,"column":46}},"88":{"start":{"line":247,"column":8},"end":{"line":247,"column":50}},"89":{"start":{"line":248,"column":8},"end":{"line":248,"column":16}},"90":{"start":{"line":252,"column":4},"end":{"line":258,"column":6}},"91":{"start":{"line":11,"column":13},"end":{"line":11,"column":26}},"92":{"start":{"line":11,"column":13},"end":{"line":260,"column":null}}},"fnMap":{"0":{"name":"(anonymous_4)","decl":{"start":{"line":14,"column":2},"end":{"line":14,"column":null}},"loc":{"start":{"line":16,"column":59},"end":{"line":17,"column":6}}},"1":{"name":"(anonymous_5)","decl":{"start":{"line":19,"column":2},"end":{"line":19,"column":7}},"loc":{"start":{"line":19,"column":51},"end":{"line":171,"column":3}}},"2":{"name":"(anonymous_6)","decl":{"start":{"line":173,"column":10},"end":{"line":173,"column":15}},"loc":{"start":{"line":173,"column":60},"end":{"line":203,"column":3}}},"3":{"name":"(anonymous_7)","decl":{"start":{"line":193,"column":42},"end":{"line":193,"column":46}},"loc":{"start":{"line":193,"column":50},"end":{"line":193,"column":60}}},"4":{"name":"(anonymous_8)","decl":{"start":{"line":197,"column":49},"end":{"line":197,"column":52}},"loc":{"start":{"line":198,"column":6},"end":{"line":198,"column":58}}},"5":{"name":"(anonymous_9)","decl":{"start":{"line":205,"column":2},"end":{"line":205,"column":7}},"loc":{"start":{"line":205,"column":26},"end":{"line":259,"column":3}}},"6":{"name":"(anonymous_10)","decl":{"start":{"line":238,"column":18},"end":{"line":238,"column":22}},"loc":{"start":{"line":238,"column":25},"end":{"line":250,"column":5}}}},"branchMap":{"0":{"loc":{"start":{"line":30,"column":6},"end":{"line":30,"column":35}},"type":"default-arg","locations":[{"start":{"line":30,"column":15},"end":{"line":30,"column":35}}]},"1":{"loc":{"start":{"line":31,"column":6},"end":{"line":31,"column":16}},"type":"default-arg","locations":[{"start":{"line":31,"column":14},"end":{"line":31,"column":16}}]},"2":{"loc":{"start":{"line":32,"column":6},"end":{"line":32,"column":16}},"type":"default-arg","locations":[{"start":{"line":32,"column":15},"end":{"line":32,"column":16}}]},"3":{"loc":{"start":{"line":66,"column":4},"end":{"line":75,"column":5}},"type":"if","locations":[{"start":{"line":66,"column":4},"end":{"line":75,"column":5}},{"start":{"line":69,"column":11},"end":{"line":75,"column":5}}]},"4":{"loc":{"start":{"line":66,"column":8},"end":{"line":66,"column":39}},"type":"binary-expr","locations":[{"start":{"line":66,"column":8},"end":{"line":66,"column":16}},{"start":{"line":66,"column":20},"end":{"line":66,"column":39}}]},"5":{"loc":{"start":{"line":69,"column":11},"end":{"line":75,"column":5}},"type":"if","locations":[{"start":{"line":69,"column":11},"end":{"line":75,"column":5}},{"start":{"line":72,"column":11},"end":{"line":75,"column":5}}]},"6":{"loc":{"start":{"line":78,"column":4},"end":{"line":84,"column":5}},"type":"if","locations":[{"start":{"line":78,"column":4},"end":{"line":84,"column":5}},{"start":{"line":81,"column":11},"end":{"line":84,"column":5}}]},"7":{"loc":{"start":{"line":78,"column":8},"end":{"line":78,"column":43}},"type":"binary-expr","locations":[{"start":{"line":78,"column":8},"end":{"line":78,"column":18}},{"start":{"line":78,"column":22},"end":{"line":78,"column":43}}]},"8":{"loc":{"start":{"line":81,"column":11},"end":{"line":84,"column":5}},"type":"if","locations":[{"start":{"line":81,"column":11},"end":{"line":84,"column":5}},{"start":{},"end":{}}]},"9":{"loc":{"start":{"line":87,"column":4},"end":{"line":90,"column":5}},"type":"if","locations":[{"start":{"line":87,"column":4},"end":{"line":90,"column":5}},{"start":{},"end":{}}]},"10":{"loc":{"start":{"line":91,"column":4},"end":{"line":94,"column":5}},"type":"if","locations":[{"start":{"line":91,"column":4},"end":{"line":94,"column":5}},{"start":{},"end":{}}]},"11":{"loc":{"start":{"line":97,"column":4},"end":{"line":100,"column":5}},"type":"if","locations":[{"start":{"line":97,"column":4},"end":{"line":100,"column":5}},{"start":{},"end":{}}]},"12":{"loc":{"start":{"line":101,"column":4},"end":{"line":104,"column":5}},"type":"if","locations":[{"start":{"line":101,"column":4},"end":{"line":104,"column":5}},{"start":{},"end":{}}]},"13":{"loc":{"start":{"line":107,"column":4},"end":{"line":135,"column":5}},"type":"if","locations":[{"start":{"line":107,"column":4},"end":{"line":135,"column":5}},{"start":{},"end":{}}]},"14":{"loc":{"start":{"line":107,"column":8},"end":{"line":107,"column":31}},"type":"binary-expr","locations":[{"start":{"line":107,"column":8},"end":{"line":107,"column":14}},{"start":{"line":107,"column":18},"end":{"line":107,"column":31}}]},"15":{"loc":{"start":{"line":138,"column":4},"end":{"line":140,"column":5}},"type":"if","locations":[{"start":{"line":138,"column":4},"end":{"line":140,"column":5}},{"start":{},"end":{}}]},"16":{"loc":{"start":{"line":143,"column":4},"end":{"line":159,"column":5}},"type":"if","locations":[{"start":{"line":143,"column":4},"end":{"line":159,"column":5}},{"start":{"line":146,"column":11},"end":{"line":159,"column":5}}]},"17":{"loc":{"start":{"line":143,"column":8},"end":{"line":143,"column":31}},"type":"binary-expr","locations":[{"start":{"line":143,"column":8},"end":{"line":143,"column":14}},{"start":{"line":143,"column":18},"end":{"line":143,"column":31}}]},"18":{"loc":{"start":{"line":147,"column":6},"end":{"line":158,"column":7}},"type":"switch","locations":[{"start":{"line":148,"column":8},"end":{"line":150,"column":16}},{"start":{"line":151,"column":8},"end":{"line":153,"column":16}},{"start":{"line":154,"column":8},"end":{"line":154,"column":34}},{"start":{"line":155,"column":8},"end":{"line":157,"column":16}}]},"19":{"loc":{"start":{"line":166,"column":4},"end":{"line":168,"column":5}},"type":"if","locations":[{"start":{"line":166,"column":4},"end":{"line":168,"column":5}},{"start":{},"end":{}}]},"20":{"loc":{"start":{"line":166,"column":8},"end":{"line":166,"column":31}},"type":"binary-expr","locations":[{"start":{"line":166,"column":8},"end":{"line":166,"column":14}},{"start":{"line":166,"column":18},"end":{"line":166,"column":31}}]},"21":{"loc":{"start":{"line":242,"column":40},"end":{"line":242,"column":75}},"type":"binary-expr","locations":[{"start":{"line":242,"column":40},"end":{"line":242,"column":70}},{"start":{"line":242,"column":74},"end":{"line":242,"column":75}}]},"22":{"loc":{"start":{"line":243,"column":36},"end":{"line":243,"column":67}},"type":"binary-expr","locations":[{"start":{"line":243,"column":36},"end":{"line":243,"column":62}},{"start":{"line":243,"column":66},"end":{"line":243,"column":67}}]},"23":{"loc":{"start":{"line":245,"column":6},"end":{"line":249,"column":7}},"type":"if","locations":[{"start":{"line":245,"column":6},"end":{"line":249,"column":7}},{"start":{},"end":{}}]},"24":{"loc":{"start":{"line":256,"column":19},"end":{"line":256,"column":52}},"type":"cond-expr","locations":[{"start":{"line":256,"column":31},"end":{"line":256,"column":48}},{"start":{"line":256,"column":51},"end":{"line":256,"column":52}}]},"25":{"loc":{"start":{"line":257,"column":21},"end":{"line":257,"column":56}},"type":"cond-expr","locations":[{"start":{"line":257,"column":33},"end":{"line":257,"column":52}},{"start":{"line":257,"column":55},"end":{"line":257,"column":56}}]},"26":{"loc":{"start":{"line":16,"column":40},"end":{"line":16,"column":59}},"type":"cond-expr","locations":[{"start":{"line":16,"column":50},"end":{"line":16,"column":59}},{"start":{"line":16,"column":50},"end":{"line":16,"column":59}}]},"27":{"loc":{"start":{"line":16,"column":40},"end":{"line":16,"column":50}},"type":"binary-expr","locations":[{"start":{"line":16,"column":40},"end":{"line":16,"column":59}},{"start":{"line":16,"column":40},"end":{"line":16,"column":50}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0},"b":{"0":[0],"1":[0],"2":[0],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,0],"7":[0,0],"8":[0,0],"9":[0,0],"10":[0,0],"11":[0,0],"12":[0,0],"13":[0,0],"14":[0,0],"15":[0,0],"16":[0,0],"17":[0,0],"18":[0,0,0,0],"19":[0,0],"20":[0,0],"21":[0,0],"22":[0,0],"23":[0,0],"24":[0,0],"25":[0,0],"26":[0,0],"27":[0,0]}} -,"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\types\\multer.d.ts": {"path":"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\types\\multer.d.ts","statementMap":{},"fnMap":{},"branchMap":{},"s":{},"f":{},"b":{}} -,"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\users\\admin-users.controller.ts": {"path":"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\users\\admin-users.controller.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":13,"column":0},"end":{"line":13,"column":null}},"2":{"start":{"line":20,"column":0},"end":{"line":20,"column":61}},"3":{"start":{"line":21,"column":0},"end":{"line":21,"column":58}},"4":{"start":{"line":22,"column":0},"end":{"line":22,"column":72}},"5":{"start":{"line":23,"column":0},"end":{"line":23,"column":63}},"6":{"start":{"line":24,"column":0},"end":{"line":24,"column":59}},"7":{"start":{"line":25,"column":0},"end":{"line":25,"column":57}},"8":{"start":{"line":32,"column":7},"end":{"line":80,"column":null}},"9":{"start":{"line":33,"column":31},"end":{"line":33,"column":45}},"10":{"start":{"line":42,"column":28},"end":{"line":42,"column":74}},"11":{"start":{"line":43,"column":4},"end":{"line":48,"column":6}},"12":{"start":{"line":58,"column":4},"end":{"line":58,"column":53}},"13":{"start":{"line":68,"column":4},"end":{"line":68,"column":58}},"14":{"start":{"line":78,"column":4},"end":{"line":78,"column":48}},"15":{"start":{"line":32,"column":13},"end":{"line":32,"column":33}},"16":{"start":{"line":41,"column":8},"end":{"line":49,"column":null}},"17":{"start":{"line":57,"column":8},"end":{"line":59,"column":null}},"18":{"start":{"line":67,"column":8},"end":{"line":69,"column":null}},"19":{"start":{"line":77,"column":8},"end":{"line":79,"column":null}},"20":{"start":{"line":32,"column":13},"end":{"line":80,"column":null}}},"fnMap":{"0":{"name":"(anonymous_4)","decl":{"start":{"line":33,"column":2},"end":{"line":33,"column":31}},"loc":{"start":{"line":33,"column":57},"end":{"line":33,"column":61}}},"1":{"name":"(anonymous_5)","decl":{"start":{"line":41,"column":8},"end":{"line":41,"column":15}},"loc":{"start":{"line":41,"column":53},"end":{"line":49,"column":3}}},"2":{"name":"(anonymous_6)","decl":{"start":{"line":57,"column":8},"end":{"line":57,"column":15}},"loc":{"start":{"line":57,"column":39},"end":{"line":59,"column":3}}},"3":{"name":"(anonymous_7)","decl":{"start":{"line":67,"column":8},"end":{"line":67,"column":18}},"loc":{"start":{"line":67,"column":74},"end":{"line":69,"column":3}}},"4":{"name":"(anonymous_8)","decl":{"start":{"line":77,"column":8},"end":{"line":77,"column":18}},"loc":{"start":{"line":77,"column":42},"end":{"line":79,"column":3}}}},"branchMap":{"0":{"loc":{"start":{"line":46,"column":13},"end":{"line":46,"column":30}},"type":"binary-expr","locations":[{"start":{"line":46,"column":13},"end":{"line":46,"column":24}},{"start":{"line":46,"column":28},"end":{"line":46,"column":30}}]},"1":{"loc":{"start":{"line":47,"column":14},"end":{"line":47,"column":31}},"type":"binary-expr","locations":[{"start":{"line":47,"column":14},"end":{"line":47,"column":26}},{"start":{"line":47,"column":30},"end":{"line":47,"column":31}}]},"2":{"loc":{"start":{"line":41,"column":32},"end":{"line":41,"column":null}},"type":"cond-expr","locations":[{"start":{"line":41,"column":53},"end":{"line":41,"column":null}},{"start":{"line":41,"column":53},"end":{"line":41,"column":null}}]},"3":{"loc":{"start":{"line":41,"column":32},"end":{"line":41,"column":53}},"type":"binary-expr","locations":[{"start":{"line":41,"column":32},"end":{"line":41,"column":null}},{"start":{"line":41,"column":32},"end":{"line":41,"column":53}}]},"4":{"loc":{"start":{"line":67,"column":57},"end":{"line":67,"column":null}},"type":"cond-expr","locations":[{"start":{"line":67,"column":74},"end":{"line":67,"column":null}},{"start":{"line":67,"column":74},"end":{"line":67,"column":null}}]},"5":{"loc":{"start":{"line":67,"column":57},"end":{"line":67,"column":74}},"type":"binary-expr","locations":[{"start":{"line":67,"column":57},"end":{"line":67,"column":null}},{"start":{"line":67,"column":57},"end":{"line":67,"column":74}}]},"6":{"loc":{"start":{"line":33,"column":45},"end":{"line":33,"column":60}},"type":"cond-expr","locations":[{"start":{"line":33,"column":57},"end":{"line":33,"column":60}},{"start":{"line":33,"column":57},"end":{"line":33,"column":60}}]},"7":{"loc":{"start":{"line":33,"column":45},"end":{"line":33,"column":57}},"type":"binary-expr","locations":[{"start":{"line":33,"column":45},"end":{"line":33,"column":60}},{"start":{"line":33,"column":45},"end":{"line":33,"column":57}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0},"f":{"0":0,"1":0,"2":0,"3":0,"4":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,0],"7":[0,0]}} -,"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\users\\users.controller.ts": {"path":"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\users\\users.controller.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":14,"column":0},"end":{"line":14,"column":45}},"2":{"start":{"line":15,"column":0},"end":{"line":15,"column":null}},"3":{"start":{"line":22,"column":0},"end":{"line":22,"column":62}},"4":{"start":{"line":23,"column":0},"end":{"line":23,"column":62}},"5":{"start":{"line":24,"column":0},"end":{"line":24,"column":60}},"6":{"start":{"line":25,"column":0},"end":{"line":25,"column":52}},"7":{"start":{"line":26,"column":0},"end":{"line":26,"column":52}},"8":{"start":{"line":27,"column":0},"end":{"line":27,"column":54}},"9":{"start":{"line":28,"column":0},"end":{"line":28,"column":63}},"10":{"start":{"line":30,"column":0},"end":{"line":30,"column":75}},"11":{"start":{"line":31,"column":0},"end":{"line":31,"column":59}},"12":{"start":{"line":32,"column":0},"end":{"line":32,"column":62}},"13":{"start":{"line":33,"column":0},"end":{"line":33,"column":57}},"14":{"start":{"line":37,"column":7},"end":{"line":136,"column":null}},"15":{"start":{"line":39,"column":21},"end":{"line":39,"column":34}},"16":{"start":{"line":40,"column":21},"end":{"line":40,"column":35}},"17":{"start":{"line":50,"column":4},"end":{"line":50,"column":50}},"18":{"start":{"line":64,"column":4},"end":{"line":64,"column":68}},"19":{"start":{"line":79,"column":17},"end":{"line":79,"column":25}},"20":{"start":{"line":80,"column":4},"end":{"line":80,"column":71}},"21":{"start":{"line":90,"column":4},"end":{"line":90,"column":60}},"22":{"start":{"line":100,"column":4},"end":{"line":100,"column":80}},"23":{"start":{"line":111,"column":17},"end":{"line":111,"column":25}},"24":{"start":{"line":112,"column":4},"end":{"line":112,"column":61}},"25":{"start":{"line":131,"column":4},"end":{"line":133,"column":5}},"26":{"start":{"line":132,"column":6},"end":{"line":132,"column":60}},"27":{"start":{"line":134,"column":4},"end":{"line":134,"column":66}},"28":{"start":{"line":37,"column":13},"end":{"line":37,"column":28}},"29":{"start":{"line":49,"column":8},"end":{"line":51,"column":null}},"30":{"start":{"line":60,"column":8},"end":{"line":65,"column":null}},"31":{"start":{"line":75,"column":8},"end":{"line":81,"column":null}},"32":{"start":{"line":89,"column":8},"end":{"line":91,"column":null}},"33":{"start":{"line":99,"column":8},"end":{"line":101,"column":null}},"34":{"start":{"line":110,"column":8},"end":{"line":113,"column":null}},"35":{"start":{"line":125,"column":8},"end":{"line":135,"column":null}},"36":{"start":{"line":37,"column":13},"end":{"line":136,"column":null}}},"fnMap":{"0":{"name":"(anonymous_4)","decl":{"start":{"line":38,"column":2},"end":{"line":38,"column":null}},"loc":{"start":{"line":40,"column":47},"end":{"line":41,"column":6}}},"1":{"name":"(anonymous_5)","decl":{"start":{"line":49,"column":8},"end":{"line":49,"column":18}},"loc":{"start":{"line":49,"column":50},"end":{"line":51,"column":3}}},"2":{"name":"(anonymous_6)","decl":{"start":{"line":60,"column":8},"end":{"line":60,"column":21}},"loc":{"start":{"line":62,"column":40},"end":{"line":65,"column":3}}},"3":{"name":"(anonymous_7)","decl":{"start":{"line":75,"column":8},"end":{"line":75,"column":22}},"loc":{"start":{"line":77,"column":48},"end":{"line":81,"column":3}}},"4":{"name":"(anonymous_8)","decl":{"start":{"line":89,"column":8},"end":{"line":89,"column":22}},"loc":{"start":{"line":89,"column":59},"end":{"line":91,"column":3}}},"5":{"name":"(anonymous_9)","decl":{"start":{"line":99,"column":8},"end":{"line":99,"column":21}},"loc":{"start":{"line":99,"column":56},"end":{"line":101,"column":3}}},"6":{"name":"(anonymous_10)","decl":{"start":{"line":110,"column":8},"end":{"line":110,"column":17}},"loc":{"start":{"line":110,"column":68},"end":{"line":113,"column":3}}},"7":{"name":"(anonymous_11)","decl":{"start":{"line":125,"column":8},"end":{"line":125,"column":23}},"loc":{"start":{"line":128,"column":38},"end":{"line":135,"column":3}}}},"branchMap":{"0":{"loc":{"start":{"line":131,"column":4},"end":{"line":133,"column":5}},"type":"if","locations":[{"start":{"line":131,"column":4},"end":{"line":133,"column":5}},{"start":{},"end":{}}]},"1":{"loc":{"start":{"line":62,"column":27},"end":{"line":62,"column":null}},"type":"cond-expr","locations":[{"start":{"line":62,"column":40},"end":{"line":62,"column":null}},{"start":{"line":62,"column":40},"end":{"line":62,"column":null}}]},"2":{"loc":{"start":{"line":62,"column":27},"end":{"line":62,"column":40}},"type":"binary-expr","locations":[{"start":{"line":62,"column":27},"end":{"line":62,"column":null}},{"start":{"line":62,"column":27},"end":{"line":62,"column":40}}]},"3":{"loc":{"start":{"line":77,"column":31},"end":{"line":77,"column":null}},"type":"cond-expr","locations":[{"start":{"line":77,"column":48},"end":{"line":77,"column":null}},{"start":{"line":77,"column":48},"end":{"line":77,"column":null}}]},"4":{"loc":{"start":{"line":77,"column":31},"end":{"line":77,"column":48}},"type":"binary-expr","locations":[{"start":{"line":77,"column":31},"end":{"line":77,"column":null}},{"start":{"line":77,"column":31},"end":{"line":77,"column":48}}]},"5":{"loc":{"start":{"line":89,"column":42},"end":{"line":89,"column":null}},"type":"cond-expr","locations":[{"start":{"line":89,"column":59},"end":{"line":89,"column":null}},{"start":{"line":89,"column":59},"end":{"line":89,"column":null}}]},"6":{"loc":{"start":{"line":89,"column":42},"end":{"line":89,"column":59}},"type":"binary-expr","locations":[{"start":{"line":89,"column":42},"end":{"line":89,"column":null}},{"start":{"line":89,"column":42},"end":{"line":89,"column":59}}]},"7":{"loc":{"start":{"line":99,"column":40},"end":{"line":99,"column":null}},"type":"cond-expr","locations":[{"start":{"line":99,"column":56},"end":{"line":99,"column":null}},{"start":{"line":99,"column":56},"end":{"line":99,"column":null}}]},"8":{"loc":{"start":{"line":99,"column":40},"end":{"line":99,"column":56}},"type":"binary-expr","locations":[{"start":{"line":99,"column":40},"end":{"line":99,"column":null}},{"start":{"line":99,"column":40},"end":{"line":99,"column":56}}]},"9":{"loc":{"start":{"line":110,"column":56},"end":{"line":110,"column":null}},"type":"cond-expr","locations":[{"start":{"line":110,"column":68},"end":{"line":110,"column":null}},{"start":{"line":110,"column":68},"end":{"line":110,"column":null}}]},"10":{"loc":{"start":{"line":110,"column":56},"end":{"line":110,"column":68}},"type":"binary-expr","locations":[{"start":{"line":110,"column":56},"end":{"line":110,"column":null}},{"start":{"line":110,"column":56},"end":{"line":110,"column":68}}]},"11":{"loc":{"start":{"line":128,"column":26},"end":{"line":128,"column":null}},"type":"cond-expr","locations":[{"start":{"line":128,"column":38},"end":{"line":128,"column":null}},{"start":{"line":128,"column":38},"end":{"line":128,"column":null}}]},"12":{"loc":{"start":{"line":128,"column":26},"end":{"line":128,"column":38}},"type":"binary-expr","locations":[{"start":{"line":128,"column":26},"end":{"line":128,"column":null}},{"start":{"line":128,"column":26},"end":{"line":128,"column":38}}]},"13":{"loc":{"start":{"line":39,"column":34},"end":{"line":39,"column":null}},"type":"cond-expr","locations":[{"start":{"line":39,"column":45},"end":{"line":39,"column":null}},{"start":{"line":39,"column":45},"end":{"line":39,"column":null}}]},"14":{"loc":{"start":{"line":39,"column":34},"end":{"line":39,"column":45}},"type":"binary-expr","locations":[{"start":{"line":39,"column":34},"end":{"line":39,"column":null}},{"start":{"line":39,"column":34},"end":{"line":39,"column":45}}]},"15":{"loc":{"start":{"line":39,"column":45},"end":{"line":40,"column":null}},"type":"cond-expr","locations":[{"start":{"line":40,"column":47},"end":{"line":40,"column":null}},{"start":{"line":40,"column":47},"end":{"line":40,"column":null}}]},"16":{"loc":{"start":{"line":39,"column":45},"end":{"line":40,"column":47}},"type":"binary-expr","locations":[{"start":{"line":39,"column":45},"end":{"line":40,"column":null}},{"start":{"line":40,"column":35},"end":{"line":40,"column":47}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,0],"7":[0,0],"8":[0,0],"9":[0,0],"10":[0,0],"11":[0,0],"12":[0,0],"13":[0,0],"14":[0,0],"15":[0,0],"16":[0,0]}} -,"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\users\\users.module.ts": {"path":"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\users\\users.module.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":40}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":48}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":53}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":49}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":46}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":64}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":58}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":57}},"8":{"start":{"line":16,"column":7},"end":{"line":16,"column":null}},"9":{"start":{"line":16,"column":13},"end":{"line":16,"column":24}},"10":{"start":{"line":16,"column":13},"end":{"line":16,"column":null}}},"fnMap":{},"branchMap":{},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0},"f":{},"b":{}} -,"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\users\\dto\\admin-get-users-query.dto.ts": {"path":"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\users\\dto\\admin-get-users-query.dto.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":41}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":79}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":54}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":59}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":61}},"5":{"start":{"line":48,"column":19},"end":{"line":48,"column":21}},"6":{"start":{"line":60,"column":20},"end":{"line":60,"column":21}},"7":{"start":{"line":7,"column":0},"end":{"line":7,"column":13}},"8":{"start":{"line":15,"column":2},"end":{"line":15,"column":null}},"9":{"start":{"line":25,"column":2},"end":{"line":25,"column":null}},"10":{"start":{"line":34,"column":2},"end":{"line":34,"column":null}},"11":{"start":{"line":48,"column":2},"end":{"line":48,"column":null}},"12":{"start":{"line":44,"column":14},"end":{"line":44,"column":20}},"13":{"start":{"line":60,"column":2},"end":{"line":60,"column":null}},"14":{"start":{"line":57,"column":14},"end":{"line":57,"column":20}}},"fnMap":{"0":{"name":"(anonymous_2)","decl":{"start":{"line":44,"column":8},"end":{"line":44,"column":11}},"loc":{"start":{"line":44,"column":14},"end":{"line":44,"column":20}}},"1":{"name":"(anonymous_3)","decl":{"start":{"line":57,"column":8},"end":{"line":57,"column":11}},"loc":{"start":{"line":57,"column":14},"end":{"line":57,"column":20}}}},"branchMap":{"0":{"loc":{"start":{"line":15,"column":9},"end":{"line":15,"column":18}},"type":"cond-expr","locations":[{"start":{"line":15,"column":17},"end":{"line":15,"column":18}},{"start":{"line":15,"column":17},"end":{"line":15,"column":18}}]},"1":{"loc":{"start":{"line":15,"column":9},"end":{"line":15,"column":17}},"type":"binary-expr","locations":[{"start":{"line":15,"column":9},"end":{"line":15,"column":18}},{"start":{"line":15,"column":9},"end":{"line":15,"column":17}}]},"2":{"loc":{"start":{"line":25,"column":15},"end":{"line":25,"column":25}},"type":"cond-expr","locations":[{"start":{"line":25,"column":24},"end":{"line":25,"column":25}},{"start":{"line":25,"column":24},"end":{"line":25,"column":25}}]},"3":{"loc":{"start":{"line":25,"column":15},"end":{"line":25,"column":24}},"type":"binary-expr","locations":[{"start":{"line":25,"column":15},"end":{"line":25,"column":25}},{"start":{"line":25,"column":15},"end":{"line":25,"column":24}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0},"f":{"0":0,"1":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0]}} -,"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\users\\dto\\change-password.dto.ts": {"path":"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\users\\dto\\change-password.dto.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":75}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":46}},"2":{"start":{"line":4,"column":0},"end":{"line":4,"column":13}},"3":{"start":{"line":11,"column":2},"end":{"line":11,"column":null}},"4":{"start":{"line":29,"column":2},"end":{"line":29,"column":null}}},"fnMap":{},"branchMap":{},"s":{"0":0,"1":0,"2":0,"3":0,"4":0},"f":{},"b":{}} -,"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\users\\dto\\forgot-password.dto.ts": {"path":"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\users\\dto\\forgot-password.dto.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":54}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":46}},"2":{"start":{"line":4,"column":0},"end":{"line":4,"column":13}},"3":{"start":{"line":12,"column":2},"end":{"line":12,"column":null}}},"fnMap":{},"branchMap":{},"s":{"0":0,"1":0,"2":0,"3":0},"f":{},"b":{}} -,"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\users\\dto\\profile-response.dto.ts": {"path":"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\users\\dto\\profile-response.dto.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":46}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":61}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":59}},"3":{"start":{"line":5,"column":0},"end":{"line":5,"column":13}},"4":{"start":{"line":10,"column":2},"end":{"line":10,"column":null}},"5":{"start":{"line":16,"column":2},"end":{"line":16,"column":null}},"6":{"start":{"line":19,"column":2},"end":{"line":19,"column":null}},"7":{"start":{"line":22,"column":2},"end":{"line":22,"column":null}},"8":{"start":{"line":29,"column":2},"end":{"line":29,"column":null}},"9":{"start":{"line":36,"column":2},"end":{"line":36,"column":null}},"10":{"start":{"line":43,"column":2},"end":{"line":43,"column":null}},"11":{"start":{"line":50,"column":2},"end":{"line":50,"column":null}},"12":{"start":{"line":57,"column":2},"end":{"line":57,"column":null}},"13":{"start":{"line":60,"column":2},"end":{"line":60,"column":null}},"14":{"start":{"line":67,"column":2},"end":{"line":67,"column":null}},"15":{"start":{"line":74,"column":2},"end":{"line":74,"column":null}},"16":{"start":{"line":81,"column":2},"end":{"line":81,"column":null}},"17":{"start":{"line":87,"column":2},"end":{"line":87,"column":null}},"18":{"start":{"line":90,"column":2},"end":{"line":90,"column":null}},"19":{"start":{"line":98,"column":2},"end":{"line":98,"column":null}}},"fnMap":{},"branchMap":{"0":{"loc":{"start":{"line":29,"column":8},"end":{"line":29,"column":17}},"type":"cond-expr","locations":[{"start":{"line":29,"column":16},"end":{"line":29,"column":17}},{"start":{"line":29,"column":16},"end":{"line":29,"column":17}}]},"1":{"loc":{"start":{"line":29,"column":8},"end":{"line":29,"column":16}},"type":"binary-expr","locations":[{"start":{"line":29,"column":8},"end":{"line":29,"column":17}},{"start":{"line":29,"column":8},"end":{"line":29,"column":16}}]},"2":{"loc":{"start":{"line":67,"column":13},"end":{"line":67,"column":23}},"type":"cond-expr","locations":[{"start":{"line":67,"column":22},"end":{"line":67,"column":23}},{"start":{"line":67,"column":22},"end":{"line":67,"column":23}}]},"3":{"loc":{"start":{"line":67,"column":13},"end":{"line":67,"column":22}},"type":"binary-expr","locations":[{"start":{"line":67,"column":13},"end":{"line":67,"column":23}},{"start":{"line":67,"column":13},"end":{"line":67,"column":22}}]},"4":{"loc":{"start":{"line":87,"column":13},"end":{"line":87,"column":18}},"type":"cond-expr","locations":[{"start":{"line":87,"column":17},"end":{"line":87,"column":18}},{"start":{"line":87,"column":17},"end":{"line":87,"column":18}}]},"5":{"loc":{"start":{"line":87,"column":13},"end":{"line":87,"column":17}},"type":"binary-expr","locations":[{"start":{"line":87,"column":13},"end":{"line":87,"column":18}},{"start":{"line":87,"column":13},"end":{"line":87,"column":17}}]},"6":{"loc":{"start":{"line":90,"column":13},"end":{"line":90,"column":18}},"type":"cond-expr","locations":[{"start":{"line":90,"column":17},"end":{"line":90,"column":18}},{"start":{"line":90,"column":17},"end":{"line":90,"column":18}}]},"7":{"loc":{"start":{"line":90,"column":13},"end":{"line":90,"column":17}},"type":"binary-expr","locations":[{"start":{"line":90,"column":13},"end":{"line":90,"column":18}},{"start":{"line":90,"column":13},"end":{"line":90,"column":17}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0},"f":{},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,0],"7":[0,0]}} -,"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\users\\dto\\reset-password.dto.ts": {"path":"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\users\\dto\\reset-password.dto.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":75}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":46}},"2":{"start":{"line":4,"column":0},"end":{"line":4,"column":13}},"3":{"start":{"line":11,"column":2},"end":{"line":11,"column":null}},"4":{"start":{"line":23,"column":2},"end":{"line":23,"column":null}}},"fnMap":{},"branchMap":{},"s":{"0":0,"1":0,"2":0,"3":0,"4":0},"f":{},"b":{}} -,"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\users\\dto\\submit-kyc.dto.ts": {"path":"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\users\\dto\\submit-kyc.dto.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":55}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":46}},"2":{"start":{"line":4,"column":0},"end":{"line":4,"column":13}},"3":{"start":{"line":12,"column":2},"end":{"line":12,"column":null}}},"fnMap":{},"branchMap":{},"s":{"0":0,"1":0,"2":0,"3":0},"f":{},"b":{}} -,"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\users\\dto\\update-kyc.dto.ts": {"path":"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\users\\dto\\update-kyc.dto.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":75}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":67}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":61}},"3":{"start":{"line":5,"column":0},"end":{"line":5,"column":13}},"4":{"start":{"line":13,"column":2},"end":{"line":13,"column":null}},"5":{"start":{"line":21,"column":2},"end":{"line":21,"column":null}}},"fnMap":{},"branchMap":{"0":{"loc":{"start":{"line":13,"column":10},"end":{"line":13,"column":20}},"type":"cond-expr","locations":[{"start":{"line":13,"column":19},"end":{"line":13,"column":20}},{"start":{"line":13,"column":19},"end":{"line":13,"column":20}}]},"1":{"loc":{"start":{"line":13,"column":10},"end":{"line":13,"column":19}},"type":"binary-expr","locations":[{"start":{"line":13,"column":10},"end":{"line":13,"column":20}},{"start":{"line":13,"column":10},"end":{"line":13,"column":19}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0},"f":{},"b":{"0":[0,0],"1":[0,0]}} -,"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\users\\dto\\update-user-role.dto.ts": {"path":"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\users\\dto\\update-user-role.dto.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":46}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":41}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":59}},"3":{"start":{"line":5,"column":0},"end":{"line":5,"column":13}},"4":{"start":{"line":12,"column":2},"end":{"line":12,"column":null}}},"fnMap":{},"branchMap":{"0":{"loc":{"start":{"line":12,"column":8},"end":{"line":12,"column":17}},"type":"cond-expr","locations":[{"start":{"line":12,"column":16},"end":{"line":12,"column":17}},{"start":{"line":12,"column":16},"end":{"line":12,"column":17}}]},"1":{"loc":{"start":{"line":12,"column":8},"end":{"line":12,"column":16}},"type":"binary-expr","locations":[{"start":{"line":12,"column":8},"end":{"line":12,"column":17}},{"start":{"line":12,"column":8},"end":{"line":12,"column":16}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0},"f":{},"b":{"0":[0,0],"1":[0,0]}} -,"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\users\\dto\\update-user.dto.ts": {"path":"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\users\\dto\\update-user.dto.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":8,"column":0},"end":{"line":8,"column":54}},"2":{"start":{"line":10,"column":0},"end":{"line":10,"column":13}},"3":{"start":{"line":19,"column":2},"end":{"line":19,"column":null}},"4":{"start":{"line":29,"column":2},"end":{"line":29,"column":null}},"5":{"start":{"line":39,"column":2},"end":{"line":39,"column":null}},"6":{"start":{"line":49,"column":2},"end":{"line":49,"column":null}},"7":{"start":{"line":58,"column":2},"end":{"line":58,"column":null}},"8":{"start":{"line":70,"column":2},"end":{"line":70,"column":null}}},"fnMap":{},"branchMap":{},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0},"f":{},"b":{}} -,"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\users\\entities\\user.entity.ts": {"path":"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\users\\entities\\user.entity.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":61}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":59}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":null}},"3":{"start":{"line":16,"column":7},"end":{"line":99,"column":null}},"4":{"start":{"line":16,"column":13},"end":{"line":16,"column":17}},"5":{"start":{"line":18,"column":2},"end":{"line":18,"column":null}},"6":{"start":{"line":21,"column":2},"end":{"line":21,"column":null}},"7":{"start":{"line":24,"column":2},"end":{"line":24,"column":null}},"8":{"start":{"line":27,"column":2},"end":{"line":27,"column":null}},"9":{"start":{"line":30,"column":2},"end":{"line":30,"column":null}},"10":{"start":{"line":33,"column":2},"end":{"line":33,"column":null}},"11":{"start":{"line":36,"column":2},"end":{"line":36,"column":null}},"12":{"start":{"line":39,"column":2},"end":{"line":39,"column":null}},"13":{"start":{"line":42,"column":2},"end":{"line":42,"column":null}},"14":{"start":{"line":49,"column":2},"end":{"line":49,"column":null}},"15":{"start":{"line":52,"column":2},"end":{"line":52,"column":null}},"16":{"start":{"line":55,"column":2},"end":{"line":55,"column":null}},"17":{"start":{"line":58,"column":2},"end":{"line":58,"column":null}},"18":{"start":{"line":61,"column":2},"end":{"line":61,"column":null}},"19":{"start":{"line":64,"column":2},"end":{"line":64,"column":null}},"20":{"start":{"line":67,"column":2},"end":{"line":67,"column":null}},"21":{"start":{"line":70,"column":2},"end":{"line":70,"column":null}},"22":{"start":{"line":77,"column":2},"end":{"line":77,"column":null}},"23":{"start":{"line":80,"column":2},"end":{"line":80,"column":null}},"24":{"start":{"line":83,"column":2},"end":{"line":83,"column":null}},"25":{"start":{"line":86,"column":2},"end":{"line":86,"column":null}},"26":{"start":{"line":89,"column":2},"end":{"line":89,"column":null}},"27":{"start":{"line":92,"column":2},"end":{"line":92,"column":null}},"28":{"start":{"line":95,"column":2},"end":{"line":95,"column":null}},"29":{"start":{"line":98,"column":2},"end":{"line":98,"column":null}},"30":{"start":{"line":16,"column":13},"end":{"line":99,"column":null}}},"fnMap":{},"branchMap":{"0":{"loc":{"start":{"line":49,"column":8},"end":{"line":49,"column":17}},"type":"cond-expr","locations":[{"start":{"line":49,"column":16},"end":{"line":49,"column":17}},{"start":{"line":49,"column":16},"end":{"line":49,"column":17}}]},"1":{"loc":{"start":{"line":49,"column":8},"end":{"line":49,"column":16}},"type":"binary-expr","locations":[{"start":{"line":49,"column":8},"end":{"line":49,"column":17}},{"start":{"line":49,"column":8},"end":{"line":49,"column":16}}]},"2":{"loc":{"start":{"line":77,"column":13},"end":{"line":77,"column":23}},"type":"cond-expr","locations":[{"start":{"line":77,"column":22},"end":{"line":77,"column":23}},{"start":{"line":77,"column":22},"end":{"line":77,"column":23}}]},"3":{"loc":{"start":{"line":77,"column":13},"end":{"line":77,"column":22}},"type":"binary-expr","locations":[{"start":{"line":77,"column":13},"end":{"line":77,"column":23}},{"start":{"line":77,"column":13},"end":{"line":77,"column":22}}]},"4":{"loc":{"start":{"line":92,"column":13},"end":{"line":92,"column":18}},"type":"cond-expr","locations":[{"start":{"line":92,"column":17},"end":{"line":92,"column":18}},{"start":{"line":92,"column":17},"end":{"line":92,"column":18}}]},"5":{"loc":{"start":{"line":92,"column":13},"end":{"line":92,"column":17}},"type":"binary-expr","locations":[{"start":{"line":92,"column":13},"end":{"line":92,"column":18}},{"start":{"line":92,"column":13},"end":{"line":92,"column":17}}]},"6":{"loc":{"start":{"line":95,"column":13},"end":{"line":95,"column":18}},"type":"cond-expr","locations":[{"start":{"line":95,"column":17},"end":{"line":95,"column":18}},{"start":{"line":95,"column":17},"end":{"line":95,"column":18}}]},"7":{"loc":{"start":{"line":95,"column":13},"end":{"line":95,"column":17}},"type":"binary-expr","locations":[{"start":{"line":95,"column":13},"end":{"line":95,"column":18}},{"start":{"line":95,"column":13},"end":{"line":95,"column":17}}]}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1},"f":{},"b":{"0":[0,1],"1":[1,1],"2":[0,1],"3":[1,1],"4":[1,0],"5":[1,1],"6":[1,0],"7":[1,1]}} -,"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\users\\providers\\users.service.ts": {"path":"C:\\Users\\k-aliyu\\Documents\\GitHub\\stellarAid-api\\src\\users\\providers\\users.service.ts","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":null}},"1":{"start":{"line":6,"column":0},"end":{"line":6,"column":51}},"2":{"start":{"line":7,"column":0},"end":{"line":7,"column":37}},"3":{"start":{"line":8,"column":0},"end":{"line":8,"column":47}},"4":{"start":{"line":11,"column":0},"end":{"line":11,"column":61}},"5":{"start":{"line":16,"column":7},"end":{"line":193,"column":null}},"6":{"start":{"line":19,"column":21},"end":{"line":19,"column":37}},"7":{"start":{"line":23,"column":4},"end":{"line":40,"column":6}},"8":{"start":{"line":45,"column":17},"end":{"line":45,"column":69}},"9":{"start":{"line":46,"column":4},"end":{"line":48,"column":5}},"10":{"start":{"line":47,"column":6},"end":{"line":47,"column":52}},"11":{"start":{"line":49,"column":4},"end":{"line":49,"column":16}},"12":{"start":{"line":54,"column":4},"end":{"line":54,"column":61}},"13":{"start":{"line":62,"column":17},"end":{"line":62,"column":44}},"14":{"start":{"line":63,"column":4},"end":{"line":63,"column":39}},"15":{"start":{"line":64,"column":4},"end":{"line":64,"column":42}},"16":{"start":{"line":72,"column":17},"end":{"line":72,"column":44}},"17":{"start":{"line":74,"column":4},"end":{"line":74,"column":68}},"18":{"start":{"line":74,"column":37},"end":{"line":74,"column":68}},"19":{"start":{"line":75,"column":4},"end":{"line":75,"column":65}},"20":{"start":{"line":75,"column":36},"end":{"line":75,"column":65}},"21":{"start":{"line":76,"column":4},"end":{"line":76,"column":62}},"22":{"start":{"line":76,"column":35},"end":{"line":76,"column":62}},"23":{"start":{"line":77,"column":4},"end":{"line":77,"column":50}},"24":{"start":{"line":77,"column":31},"end":{"line":77,"column":50}},"25":{"start":{"line":78,"column":4},"end":{"line":78,"column":68}},"26":{"start":{"line":78,"column":37},"end":{"line":78,"column":68}},"27":{"start":{"line":79,"column":4},"end":{"line":79,"column":80}},"28":{"start":{"line":79,"column":41},"end":{"line":79,"column":80}},"29":{"start":{"line":81,"column":4},"end":{"line":90,"column":5}},"30":{"start":{"line":82,"column":6},"end":{"line":82,"column":43}},"31":{"start":{"line":84,"column":6},"end":{"line":88,"column":7}},"32":{"start":{"line":85,"column":8},"end":{"line":87,"column":10}},"33":{"start":{"line":89,"column":6},"end":{"line":89,"column":16}},"34":{"start":{"line":92,"column":4},"end":{"line":92,"column":35}},"35":{"start":{"line":97,"column":17},"end":{"line":97,"column":44}},"36":{"start":{"line":101,"column":29},"end":{"line":108,"column":6}},"37":{"start":{"line":109,"column":22},"end":{"line":109,"column":61}},"38":{"start":{"line":110,"column":40},"end":{"line":111,"column":null}},"39":{"start":{"line":114,"column":4},"end":{"line":131,"column":6}},"40":{"start":{"line":136,"column":15},"end":{"line":138,"column":38}},"41":{"start":{"line":140,"column":4},"end":{"line":142,"column":5}},"42":{"start":{"line":141,"column":6},"end":{"line":141,"column":61}},"43":{"start":{"line":144,"column":4},"end":{"line":148,"column":5}},"44":{"start":{"line":145,"column":6},"end":{"line":147,"column":9}},"45":{"start":{"line":150,"column":4},"end":{"line":159,"column":5}},"46":{"start":{"line":151,"column":23},"end":{"line":151,"column":51}},"47":{"start":{"line":152,"column":22},"end":{"line":152,"column":40}},"48":{"start":{"line":153,"column":6},"end":{"line":153,"column":45}},"49":{"start":{"line":155,"column":6},"end":{"line":158,"column":9}},"50":{"start":{"line":161,"column":4},"end":{"line":163,"column":31}},"51":{"start":{"line":165,"column":27},"end":{"line":165,"column":53}},"52":{"start":{"line":167,"column":4},"end":{"line":170,"column":6}},"53":{"start":{"line":168,"column":32},"end":{"line":168,"column":62}},"54":{"start":{"line":175,"column":17},"end":{"line":175,"column":40}},"55":{"start":{"line":176,"column":4},"end":{"line":176,"column":42}},"56":{"start":{"line":181,"column":17},"end":{"line":181,"column":40}},"57":{"start":{"line":182,"column":4},"end":{"line":182,"column":21}},"58":{"start":{"line":183,"column":24},"end":{"line":183,"column":60}},"59":{"start":{"line":184,"column":4},"end":{"line":184,"column":49}},"60":{"start":{"line":189,"column":17},"end":{"line":189,"column":40}},"61":{"start":{"line":190,"column":4},"end":{"line":190,"column":50}},"62":{"start":{"line":191,"column":4},"end":{"line":191,"column":52}},"63":{"start":{"line":16,"column":13},"end":{"line":16,"column":25}},"64":{"start":{"line":16,"column":13},"end":{"line":193,"column":null}}},"fnMap":{"0":{"name":"(anonymous_4)","decl":{"start":{"line":17,"column":2},"end":{"line":17,"column":null}},"loc":{"start":{"line":19,"column":53},"end":{"line":20,"column":6}}},"1":{"name":"(anonymous_5)","decl":{"start":{"line":22,"column":10},"end":{"line":22,"column":29}},"loc":{"start":{"line":22,"column":40},"end":{"line":41,"column":3}}},"2":{"name":"(anonymous_6)","decl":{"start":{"line":44,"column":9},"end":{"line":44,"column":14}},"loc":{"start":{"line":44,"column":34},"end":{"line":50,"column":3}}},"3":{"name":"(anonymous_7)","decl":{"start":{"line":53,"column":9},"end":{"line":53,"column":14}},"loc":{"start":{"line":53,"column":40},"end":{"line":55,"column":3}}},"4":{"name":"(anonymous_8)","decl":{"start":{"line":58,"column":9},"end":{"line":58,"column":14}},"loc":{"start":{"line":60,"column":25},"end":{"line":65,"column":3}}},"5":{"name":"(anonymous_9)","decl":{"start":{"line":68,"column":9},"end":{"line":68,"column":14}},"loc":{"start":{"line":70,"column":22},"end":{"line":93,"column":3}}},"6":{"name":"(anonymous_10)","decl":{"start":{"line":96,"column":9},"end":{"line":96,"column":14}},"loc":{"start":{"line":96,"column":40},"end":{"line":132,"column":3}}},"7":{"name":"(anonymous_11)","decl":{"start":{"line":135,"column":9},"end":{"line":135,"column":14}},"loc":{"start":{"line":135,"column":59},"end":{"line":171,"column":3}}},"8":{"name":"(anonymous_12)","decl":{"start":{"line":168,"column":22},"end":{"line":168,"column":23}},"loc":{"start":{"line":168,"column":32},"end":{"line":168,"column":62}}},"9":{"name":"(anonymous_13)","decl":{"start":{"line":174,"column":9},"end":{"line":174,"column":14}},"loc":{"start":{"line":174,"column":45},"end":{"line":177,"column":3}}},"10":{"name":"(anonymous_14)","decl":{"start":{"line":180,"column":9},"end":{"line":180,"column":14}},"loc":{"start":{"line":180,"column":56},"end":{"line":185,"column":3}}},"11":{"name":"(anonymous_15)","decl":{"start":{"line":188,"column":9},"end":{"line":188,"column":14}},"loc":{"start":{"line":188,"column":40},"end":{"line":192,"column":3}}}},"branchMap":{"0":{"loc":{"start":{"line":46,"column":4},"end":{"line":48,"column":5}},"type":"if","locations":[{"start":{"line":46,"column":4},"end":{"line":48,"column":5}},{"start":{},"end":{}}]},"1":{"loc":{"start":{"line":74,"column":4},"end":{"line":74,"column":68}},"type":"if","locations":[{"start":{"line":74,"column":4},"end":{"line":74,"column":68}},{"start":{},"end":{}}]},"2":{"loc":{"start":{"line":75,"column":4},"end":{"line":75,"column":65}},"type":"if","locations":[{"start":{"line":75,"column":4},"end":{"line":75,"column":65}},{"start":{},"end":{}}]},"3":{"loc":{"start":{"line":76,"column":4},"end":{"line":76,"column":62}},"type":"if","locations":[{"start":{"line":76,"column":4},"end":{"line":76,"column":62}},{"start":{},"end":{}}]},"4":{"loc":{"start":{"line":77,"column":4},"end":{"line":77,"column":50}},"type":"if","locations":[{"start":{"line":77,"column":4},"end":{"line":77,"column":50}},{"start":{},"end":{}}]},"5":{"loc":{"start":{"line":78,"column":4},"end":{"line":78,"column":68}},"type":"if","locations":[{"start":{"line":78,"column":4},"end":{"line":78,"column":68}},{"start":{},"end":{}}]},"6":{"loc":{"start":{"line":79,"column":4},"end":{"line":79,"column":80}},"type":"if","locations":[{"start":{"line":79,"column":4},"end":{"line":79,"column":80}},{"start":{},"end":{}}]},"7":{"loc":{"start":{"line":84,"column":6},"end":{"line":88,"column":7}},"type":"if","locations":[{"start":{"line":84,"column":6},"end":{"line":88,"column":7}},{"start":{},"end":{}}]},"8":{"loc":{"start":{"line":140,"column":4},"end":{"line":142,"column":5}},"type":"if","locations":[{"start":{"line":140,"column":4},"end":{"line":142,"column":5}},{"start":{},"end":{}}]},"9":{"loc":{"start":{"line":144,"column":4},"end":{"line":148,"column":5}},"type":"if","locations":[{"start":{"line":144,"column":4},"end":{"line":148,"column":5}},{"start":{},"end":{}}]},"10":{"loc":{"start":{"line":150,"column":4},"end":{"line":159,"column":5}},"type":"if","locations":[{"start":{"line":150,"column":4},"end":{"line":159,"column":5}},{"start":{},"end":{}}]},"11":{"loc":{"start":{"line":162,"column":12},"end":{"line":162,"column":29}},"type":"binary-expr","locations":[{"start":{"line":162,"column":12},"end":{"line":162,"column":24}},{"start":{"line":162,"column":28},"end":{"line":162,"column":29}}]},"12":{"loc":{"start":{"line":163,"column":12},"end":{"line":163,"column":29}},"type":"binary-expr","locations":[{"start":{"line":163,"column":12},"end":{"line":163,"column":23}},{"start":{"line":163,"column":27},"end":{"line":163,"column":29}}]},"13":{"loc":{"start":{"line":19,"column":37},"end":{"line":19,"column":53}},"type":"cond-expr","locations":[{"start":{"line":19,"column":47},"end":{"line":19,"column":53}},{"start":{"line":19,"column":47},"end":{"line":19,"column":53}}]},"14":{"loc":{"start":{"line":19,"column":37},"end":{"line":19,"column":47}},"type":"binary-expr","locations":[{"start":{"line":19,"column":37},"end":{"line":19,"column":53}},{"start":{"line":19,"column":37},"end":{"line":19,"column":47}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,0],"7":[0,0],"8":[0,0],"9":[0,0],"10":[0,0],"11":[0,0],"12":[0,0],"13":[0,0],"14":[0,0]}} -} diff --git a/coverage/lcov-report/base.css b/coverage/lcov-report/base.css deleted file mode 100644 index f418035..0000000 --- a/coverage/lcov-report/base.css +++ /dev/null @@ -1,224 +0,0 @@ -body, html { - margin:0; padding: 0; - height: 100%; -} -body { - font-family: Helvetica Neue, Helvetica, Arial; - font-size: 14px; - color:#333; -} -.small { font-size: 12px; } -*, *:after, *:before { - -webkit-box-sizing:border-box; - -moz-box-sizing:border-box; - box-sizing:border-box; - } -h1 { font-size: 20px; margin: 0;} -h2 { font-size: 14px; } -pre { - font: 12px/1.4 Consolas, "Liberation Mono", Menlo, Courier, monospace; - margin: 0; - padding: 0; - -moz-tab-size: 2; - -o-tab-size: 2; - tab-size: 2; -} -a { color:#0074D9; text-decoration:none; } -a:hover { text-decoration:underline; } -.strong { font-weight: bold; } -.space-top1 { padding: 10px 0 0 0; } -.pad2y { padding: 20px 0; } -.pad1y { padding: 10px 0; } -.pad2x { padding: 0 20px; } -.pad2 { padding: 20px; } -.pad1 { padding: 10px; } -.space-left2 { padding-left:55px; } -.space-right2 { padding-right:20px; } -.center { text-align:center; } -.clearfix { display:block; } -.clearfix:after { - content:''; - display:block; - height:0; - clear:both; - visibility:hidden; - } -.fl { float: left; } -@media only screen and (max-width:640px) { - .col3 { width:100%; max-width:100%; } - .hide-mobile { display:none!important; } -} - -.quiet { - color: #7f7f7f; - color: rgba(0,0,0,0.5); -} -.quiet a { opacity: 0.7; } - -.fraction { - font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; - font-size: 10px; - color: #555; - background: #E8E8E8; - padding: 4px 5px; - border-radius: 3px; - vertical-align: middle; -} - -div.path a:link, div.path a:visited { color: #333; } -table.coverage { - border-collapse: collapse; - margin: 10px 0 0 0; - padding: 0; -} - -table.coverage td { - margin: 0; - padding: 0; - vertical-align: top; -} -table.coverage td.line-count { - text-align: right; - padding: 0 5px 0 20px; -} -table.coverage td.line-coverage { - text-align: right; - padding-right: 10px; - min-width:20px; -} - -table.coverage td span.cline-any { - display: inline-block; - padding: 0 5px; - width: 100%; -} -.missing-if-branch { - display: inline-block; - margin-right: 5px; - border-radius: 3px; - position: relative; - padding: 0 4px; - background: #333; - color: yellow; -} - -.skip-if-branch { - display: none; - margin-right: 10px; - position: relative; - padding: 0 4px; - background: #ccc; - color: white; -} -.missing-if-branch .typ, .skip-if-branch .typ { - color: inherit !important; -} -.coverage-summary { - border-collapse: collapse; - width: 100%; -} -.coverage-summary tr { border-bottom: 1px solid #bbb; } -.keyline-all { border: 1px solid #ddd; } -.coverage-summary td, .coverage-summary th { padding: 10px; } -.coverage-summary tbody { border: 1px solid #bbb; } -.coverage-summary td { border-right: 1px solid #bbb; } -.coverage-summary td:last-child { border-right: none; } -.coverage-summary th { - text-align: left; - font-weight: normal; - white-space: nowrap; -} -.coverage-summary th.file { border-right: none !important; } -.coverage-summary th.pct { } -.coverage-summary th.pic, -.coverage-summary th.abs, -.coverage-summary td.pct, -.coverage-summary td.abs { text-align: right; } -.coverage-summary td.file { white-space: nowrap; } -.coverage-summary td.pic { min-width: 120px !important; } -.coverage-summary tfoot td { } - -.coverage-summary .sorter { - height: 10px; - width: 7px; - display: inline-block; - margin-left: 0.5em; - background: url(sort-arrow-sprite.png) no-repeat scroll 0 0 transparent; -} -.coverage-summary .sorted .sorter { - background-position: 0 -20px; -} -.coverage-summary .sorted-desc .sorter { - background-position: 0 -10px; -} -.status-line { height: 10px; } -/* yellow */ -.cbranch-no { background: yellow !important; color: #111; } -/* dark red */ -.red.solid, .status-line.low, .low .cover-fill { background:#C21F39 } -.low .chart { border:1px solid #C21F39 } -.highlighted, -.highlighted .cstat-no, .highlighted .fstat-no, .highlighted .cbranch-no{ - background: #C21F39 !important; -} -/* medium red */ -.cstat-no, .fstat-no, .cbranch-no, .cbranch-no { background:#F6C6CE } -/* light red */ -.low, .cline-no { background:#FCE1E5 } -/* light green */ -.high, .cline-yes { background:rgb(230,245,208) } -/* medium green */ -.cstat-yes { background:rgb(161,215,106) } -/* dark green */ -.status-line.high, .high .cover-fill { background:rgb(77,146,33) } -.high .chart { border:1px solid rgb(77,146,33) } -/* dark yellow (gold) */ -.status-line.medium, .medium .cover-fill { background: #f9cd0b; } -.medium .chart { border:1px solid #f9cd0b; } -/* light yellow */ -.medium { background: #fff4c2; } - -.cstat-skip { background: #ddd; color: #111; } -.fstat-skip { background: #ddd; color: #111 !important; } -.cbranch-skip { background: #ddd !important; color: #111; } - -span.cline-neutral { background: #eaeaea; } - -.coverage-summary td.empty { - opacity: .5; - padding-top: 4px; - padding-bottom: 4px; - line-height: 1; - color: #888; -} - -.cover-fill, .cover-empty { - display:inline-block; - height: 12px; -} -.chart { - line-height: 0; -} -.cover-empty { - background: white; -} -.cover-full { - border-right: none !important; -} -pre.prettyprint { - border: none !important; - padding: 0 !important; - margin: 0 !important; -} -.com { color: #999 !important; } -.ignore-none { color: #999; font-weight: normal; } - -.wrapper { - min-height: 100%; - height: auto !important; - height: 100%; - margin: 0 auto -48px; -} -.footer, .push { - height: 48px; -} diff --git a/coverage/lcov-report/block-navigation.js b/coverage/lcov-report/block-navigation.js deleted file mode 100644 index 530d1ed..0000000 --- a/coverage/lcov-report/block-navigation.js +++ /dev/null @@ -1,87 +0,0 @@ -/* eslint-disable */ -var jumpToCode = (function init() { - // Classes of code we would like to highlight in the file view - var missingCoverageClasses = ['.cbranch-no', '.cstat-no', '.fstat-no']; - - // Elements to highlight in the file listing view - var fileListingElements = ['td.pct.low']; - - // We don't want to select elements that are direct descendants of another match - var notSelector = ':not(' + missingCoverageClasses.join('):not(') + ') > '; // becomes `:not(a):not(b) > ` - - // Selector that finds elements on the page to which we can jump - var selector = - fileListingElements.join(', ') + - ', ' + - notSelector + - missingCoverageClasses.join(', ' + notSelector); // becomes `:not(a):not(b) > a, :not(a):not(b) > b` - - // The NodeList of matching elements - var missingCoverageElements = document.querySelectorAll(selector); - - var currentIndex; - - function toggleClass(index) { - missingCoverageElements - .item(currentIndex) - .classList.remove('highlighted'); - missingCoverageElements.item(index).classList.add('highlighted'); - } - - function makeCurrent(index) { - toggleClass(index); - currentIndex = index; - missingCoverageElements.item(index).scrollIntoView({ - behavior: 'smooth', - block: 'center', - inline: 'center' - }); - } - - function goToPrevious() { - var nextIndex = 0; - if (typeof currentIndex !== 'number' || currentIndex === 0) { - nextIndex = missingCoverageElements.length - 1; - } else if (missingCoverageElements.length > 1) { - nextIndex = currentIndex - 1; - } - - makeCurrent(nextIndex); - } - - function goToNext() { - var nextIndex = 0; - - if ( - typeof currentIndex === 'number' && - currentIndex < missingCoverageElements.length - 1 - ) { - nextIndex = currentIndex + 1; - } - - makeCurrent(nextIndex); - } - - return function jump(event) { - if ( - document.getElementById('fileSearch') === document.activeElement && - document.activeElement != null - ) { - // if we're currently focused on the search input, we don't want to navigate - return; - } - - switch (event.which) { - case 78: // n - case 74: // j - goToNext(); - break; - case 66: // b - case 75: // k - case 80: // p - goToPrevious(); - break; - } - }; -})(); -window.addEventListener('keydown', jumpToCode); diff --git a/coverage/lcov-report/favicon.png b/coverage/lcov-report/favicon.png deleted file mode 100644 index c1525b8..0000000 Binary files a/coverage/lcov-report/favicon.png and /dev/null differ diff --git a/coverage/lcov-report/index.html b/coverage/lcov-report/index.html deleted file mode 100644 index ca287a4..0000000 --- a/coverage/lcov-report/index.html +++ /dev/null @@ -1,551 +0,0 @@ - - - - - - Code coverage report for All files - - - - - - - - - -
-
-

All files

-
- -
- 7.85% - Statements - 121/1540 -
- - -
- 7.75% - Branches - 64/825 -
- - -
- 4.32% - Functions - 9/208 -
- - -
- 8.08% - Lines - 115/1423 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
src -
-
0%0/550%0/120%0/50%0/49
src/auth -
-
60.46%26/4375%33/4477.77%7/961.53%24/39
src/auth/dto -
-
100%41/4175%6/8100%0/0100%41/41
src/auth/providers -
-
7.78%13/1679.67%9/930%0/136.66%11/165
src/auth/strategies -
-
0%0/130%0/60%0/20%0/11
src/common/decorators -
-
0%0/150%0/20%0/30%0/11
src/common/enums -
-
32.25%10/3140%4/1040%2/532.25%10/31
src/common/filters -
-
0%0/240%0/160%0/30%0/22
src/common/guards -
-
0%0/440%0/200%0/60%0/36
src/common/interceptors -
-
0%0/13100%0/00%0/20%0/11
src/common/middleware -
-
0%0/130%0/60%0/10%0/10
src/common/services -
-
0%0/290%0/50%0/40%0/27
src/database -
-
0%0/270%0/200%0/90%0/22
src/database/migrations -
-
0%0/260%0/100%0/60%0/22
src/donations -
-
0%0/400%0/180%0/110%0/36
src/donations/dto -
-
0%0/230%0/40%0/10%0/22
src/donations/entities -
-
0%0/190%0/80%0/30%0/16
src/donations/providers -
-
0%0/460%0/200%0/140%0/44
src/logger -
-
0%0/610%0/200%0/120%0/53
src/mail -
-
0%0/520%0/100%0/50%0/47
src/projects -
-
0%0/900%0/580%0/140%0/86
src/projects/dto -
-
0%0/800%0/420%0/110%0/75
src/projects/entities -
-
0%0/690%0/480%0/100%0/60
src/projects/providers -
-
0%0/740%0/610%0/90%0/72
src/projects/services -
-
0%0/2070%0/1560%0/230%0/195
src/types -
-
0%0/00%0/00%0/00%0/0
src/users -
-
0%0/690%0/500%0/130%0/63
src/users/dto -
-
0%0/730%0/320%0/20%0/71
src/users/entities -
-
100%31/3175%12/16100%0/0100%29/29
src/users/providers -
-
0%0/650%0/300%0/120%0/57
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/prettify.css b/coverage/lcov-report/prettify.css deleted file mode 100644 index b317a7c..0000000 --- a/coverage/lcov-report/prettify.css +++ /dev/null @@ -1 +0,0 @@ -.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee} diff --git a/coverage/lcov-report/prettify.js b/coverage/lcov-report/prettify.js deleted file mode 100644 index b322523..0000000 --- a/coverage/lcov-report/prettify.js +++ /dev/null @@ -1,2 +0,0 @@ -/* eslint-disable */ -window.PR_SHOULD_USE_CONTINUATION=true;(function(){var h=["break,continue,do,else,for,if,return,while"];var u=[h,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"];var p=[u,"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"];var l=[p,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"];var x=[p,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"];var R=[x,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"];var r="all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes";var w=[p,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"];var s="caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END";var I=[h,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"];var f=[h,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"];var H=[h,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"];var A=[l,R,w,s+I,f,H];var e=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/;var C="str";var z="kwd";var j="com";var O="typ";var G="lit";var L="pun";var F="pln";var m="tag";var E="dec";var J="src";var P="atn";var n="atv";var N="nocode";var M="(?:^^\\.?|[+-]|\\!|\\!=|\\!==|\\#|\\%|\\%=|&|&&|&&=|&=|\\(|\\*|\\*=|\\+=|\\,|\\-=|\\->|\\/|\\/=|:|::|\\;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\@|\\[|\\^|\\^=|\\^\\^|\\^\\^=|\\{|\\||\\|=|\\|\\||\\|\\|=|\\~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*";function k(Z){var ad=0;var S=false;var ac=false;for(var V=0,U=Z.length;V122)){if(!(al<65||ag>90)){af.push([Math.max(65,ag)|32,Math.min(al,90)|32])}if(!(al<97||ag>122)){af.push([Math.max(97,ag)&~32,Math.min(al,122)&~32])}}}}af.sort(function(av,au){return(av[0]-au[0])||(au[1]-av[1])});var ai=[];var ap=[NaN,NaN];for(var ar=0;arat[0]){if(at[1]+1>at[0]){an.push("-")}an.push(T(at[1]))}}an.push("]");return an.join("")}function W(al){var aj=al.source.match(new RegExp("(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)","g"));var ah=aj.length;var an=[];for(var ak=0,am=0;ak=2&&ai==="["){aj[ak]=X(ag)}else{if(ai!=="\\"){aj[ak]=ag.replace(/[a-zA-Z]/g,function(ao){var ap=ao.charCodeAt(0);return"["+String.fromCharCode(ap&~32,ap|32)+"]"})}}}}return aj.join("")}var aa=[];for(var V=0,U=Z.length;V=0;){S[ac.charAt(ae)]=Y}}var af=Y[1];var aa=""+af;if(!ag.hasOwnProperty(aa)){ah.push(af);ag[aa]=null}}ah.push(/[\0-\uffff]/);V=k(ah)})();var X=T.length;var W=function(ah){var Z=ah.sourceCode,Y=ah.basePos;var ad=[Y,F];var af=0;var an=Z.match(V)||[];var aj={};for(var ae=0,aq=an.length;ae=5&&"lang-"===ap.substring(0,5);if(am&&!(ai&&typeof ai[1]==="string")){am=false;ap=J}if(!am){aj[ag]=ap}}var ab=af;af+=ag.length;if(!am){ad.push(Y+ab,ap)}else{var al=ai[1];var ak=ag.indexOf(al);var ac=ak+al.length;if(ai[2]){ac=ag.length-ai[2].length;ak=ac-al.length}var ar=ap.substring(5);B(Y+ab,ag.substring(0,ak),W,ad);B(Y+ab+ak,al,q(ar,al),ad);B(Y+ab+ac,ag.substring(ac),W,ad)}}ah.decorations=ad};return W}function i(T){var W=[],S=[];if(T.tripleQuotedStrings){W.push([C,/^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,null,"'\""])}else{if(T.multiLineStrings){W.push([C,/^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,null,"'\"`"])}else{W.push([C,/^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,null,"\"'"])}}if(T.verbatimStrings){S.push([C,/^@\"(?:[^\"]|\"\")*(?:\"|$)/,null])}var Y=T.hashComments;if(Y){if(T.cStyleComments){if(Y>1){W.push([j,/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,null,"#"])}else{W.push([j,/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/,null,"#"])}S.push([C,/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,null])}else{W.push([j,/^#[^\r\n]*/,null,"#"])}}if(T.cStyleComments){S.push([j,/^\/\/[^\r\n]*/,null]);S.push([j,/^\/\*[\s\S]*?(?:\*\/|$)/,null])}if(T.regexLiterals){var X=("/(?=[^/*])(?:[^/\\x5B\\x5C]|\\x5C[\\s\\S]|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+/");S.push(["lang-regex",new RegExp("^"+M+"("+X+")")])}var V=T.types;if(V){S.push([O,V])}var U=(""+T.keywords).replace(/^ | $/g,"");if(U.length){S.push([z,new RegExp("^(?:"+U.replace(/[\s,]+/g,"|")+")\\b"),null])}W.push([F,/^\s+/,null," \r\n\t\xA0"]);S.push([G,/^@[a-z_$][a-z_$@0-9]*/i,null],[O,/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/,null],[F,/^[a-z_$][a-z_$@0-9]*/i,null],[G,new RegExp("^(?:0x[a-f0-9]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+\\-]?\\d+)?)[a-z]*","i"),null,"0123456789"],[F,/^\\[\s\S]?/,null],[L,/^.[^\s\w\.$@\'\"\`\/\#\\]*/,null]);return g(W,S)}var K=i({keywords:A,hashComments:true,cStyleComments:true,multiLineStrings:true,regexLiterals:true});function Q(V,ag){var U=/(?:^|\s)nocode(?:\s|$)/;var ab=/\r\n?|\n/;var ac=V.ownerDocument;var S;if(V.currentStyle){S=V.currentStyle.whiteSpace}else{if(window.getComputedStyle){S=ac.defaultView.getComputedStyle(V,null).getPropertyValue("white-space")}}var Z=S&&"pre"===S.substring(0,3);var af=ac.createElement("LI");while(V.firstChild){af.appendChild(V.firstChild)}var W=[af];function ae(al){switch(al.nodeType){case 1:if(U.test(al.className)){break}if("BR"===al.nodeName){ad(al);if(al.parentNode){al.parentNode.removeChild(al)}}else{for(var an=al.firstChild;an;an=an.nextSibling){ae(an)}}break;case 3:case 4:if(Z){var am=al.nodeValue;var aj=am.match(ab);if(aj){var ai=am.substring(0,aj.index);al.nodeValue=ai;var ah=am.substring(aj.index+aj[0].length);if(ah){var ak=al.parentNode;ak.insertBefore(ac.createTextNode(ah),al.nextSibling)}ad(al);if(!ai){al.parentNode.removeChild(al)}}}break}}function ad(ak){while(!ak.nextSibling){ak=ak.parentNode;if(!ak){return}}function ai(al,ar){var aq=ar?al.cloneNode(false):al;var ao=al.parentNode;if(ao){var ap=ai(ao,1);var an=al.nextSibling;ap.appendChild(aq);for(var am=an;am;am=an){an=am.nextSibling;ap.appendChild(am)}}return aq}var ah=ai(ak.nextSibling,0);for(var aj;(aj=ah.parentNode)&&aj.nodeType===1;){ah=aj}W.push(ah)}for(var Y=0;Y=S){ah+=2}if(V>=ap){Z+=2}}}var t={};function c(U,V){for(var S=V.length;--S>=0;){var T=V[S];if(!t.hasOwnProperty(T)){t[T]=U}else{if(window.console){console.warn("cannot override language handler %s",T)}}}}function q(T,S){if(!(T&&t.hasOwnProperty(T))){T=/^\s*]*(?:>|$)/],[j,/^<\!--[\s\S]*?(?:-\->|$)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],[L,/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);c(g([[F,/^[\s]+/,null," \t\r\n"],[n,/^(?:\"[^\"]*\"?|\'[^\']*\'?)/,null,"\"'"]],[[m,/^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],[P,/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],[L,/^[=<>\/]+/],["lang-js",/^on\w+\s*=\s*\"([^\"]+)\"/i],["lang-js",/^on\w+\s*=\s*\'([^\']+)\'/i],["lang-js",/^on\w+\s*=\s*([^\"\'>\s]+)/i],["lang-css",/^style\s*=\s*\"([^\"]+)\"/i],["lang-css",/^style\s*=\s*\'([^\']+)\'/i],["lang-css",/^style\s*=\s*([^\"\'>\s]+)/i]]),["in.tag"]);c(g([],[[n,/^[\s\S]+/]]),["uq.val"]);c(i({keywords:l,hashComments:true,cStyleComments:true,types:e}),["c","cc","cpp","cxx","cyc","m"]);c(i({keywords:"null,true,false"}),["json"]);c(i({keywords:R,hashComments:true,cStyleComments:true,verbatimStrings:true,types:e}),["cs"]);c(i({keywords:x,cStyleComments:true}),["java"]);c(i({keywords:H,hashComments:true,multiLineStrings:true}),["bsh","csh","sh"]);c(i({keywords:I,hashComments:true,multiLineStrings:true,tripleQuotedStrings:true}),["cv","py"]);c(i({keywords:s,hashComments:true,multiLineStrings:true,regexLiterals:true}),["perl","pl","pm"]);c(i({keywords:f,hashComments:true,multiLineStrings:true,regexLiterals:true}),["rb"]);c(i({keywords:w,cStyleComments:true,regexLiterals:true}),["js"]);c(i({keywords:r,hashComments:3,cStyleComments:true,multilineStrings:true,tripleQuotedStrings:true,regexLiterals:true}),["coffee"]);c(g([],[[C,/^[\s\S]+/]]),["regex"]);function d(V){var U=V.langExtension;try{var S=a(V.sourceNode);var T=S.sourceCode;V.sourceCode=T;V.spans=S.spans;V.basePos=0;q(U,T)(V);D(V)}catch(W){if("console" in window){console.log(W&&W.stack?W.stack:W)}}}function y(W,V,U){var S=document.createElement("PRE");S.innerHTML=W;if(U){Q(S,U)}var T={langExtension:V,numberLines:U,sourceNode:S};d(T);return S.innerHTML}function b(ad){function Y(af){return document.getElementsByTagName(af)}var ac=[Y("pre"),Y("code"),Y("xmp")];var T=[];for(var aa=0;aa=0){var ah=ai.match(ab);var am;if(!ah&&(am=o(aj))&&"CODE"===am.tagName){ah=am.className.match(ab)}if(ah){ah=ah[1]}var al=false;for(var ak=aj.parentNode;ak;ak=ak.parentNode){if((ak.tagName==="pre"||ak.tagName==="code"||ak.tagName==="xmp")&&ak.className&&ak.className.indexOf("prettyprint")>=0){al=true;break}}if(!al){var af=aj.className.match(/\blinenums\b(?::(\d+))?/);af=af?af[1]&&af[1].length?+af[1]:true:false;if(af){Q(aj,af)}S={langExtension:ah,sourceNode:aj,numberLines:af};d(S)}}}if(X]*(?:>|$)/],[PR.PR_COMMENT,/^<\!--[\s\S]*?(?:-\->|$)/],[PR.PR_PUNCTUATION,/^(?:<[%?]|[%?]>)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-handlebars",/^]*type\s*=\s*['"]?text\/x-handlebars-template['"]?\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i],[PR.PR_DECLARATION,/^{{[#^>/]?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{&?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{{>?\s*[\w.][^}]*}}}/],[PR.PR_COMMENT,/^{{![^}]*}}/]]),["handlebars","hbs"]);PR.registerLangHandler(PR.createSimpleLexer([[PR.PR_PLAIN,/^[ \t\r\n\f]+/,null," \t\r\n\f"]],[[PR.PR_STRING,/^\"(?:[^\n\r\f\\\"]|\\(?:\r\n?|\n|\f)|\\[\s\S])*\"/,null],[PR.PR_STRING,/^\'(?:[^\n\r\f\\\']|\\(?:\r\n?|\n|\f)|\\[\s\S])*\'/,null],["lang-css-str",/^url\(([^\)\"\']*)\)/i],[PR.PR_KEYWORD,/^(?:url|rgb|\!important|@import|@page|@media|@charset|inherit)(?=[^\-\w]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|(?:\\[0-9a-f]+ ?))(?:[_a-z0-9\-]|\\(?:\\[0-9a-f]+ ?))*)\s*:/i],[PR.PR_COMMENT,/^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//],[PR.PR_COMMENT,/^(?:)/],[PR.PR_LITERAL,/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],[PR.PR_LITERAL,/^#(?:[0-9a-f]{3}){1,2}/i],[PR.PR_PLAIN,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i],[PR.PR_PUNCTUATION,/^[^\s\w\'\"]+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_KEYWORD,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_STRING,/^[^\)\"\']+/]]),["css-str"]); diff --git a/coverage/lcov-report/sort-arrow-sprite.png b/coverage/lcov-report/sort-arrow-sprite.png deleted file mode 100644 index 6ed6831..0000000 Binary files a/coverage/lcov-report/sort-arrow-sprite.png and /dev/null differ diff --git a/coverage/lcov-report/sorter.js b/coverage/lcov-report/sorter.js deleted file mode 100644 index 4ed70ae..0000000 --- a/coverage/lcov-report/sorter.js +++ /dev/null @@ -1,210 +0,0 @@ -/* eslint-disable */ -var addSorting = (function() { - 'use strict'; - var cols, - currentSort = { - index: 0, - desc: false - }; - - // returns the summary table element - function getTable() { - return document.querySelector('.coverage-summary'); - } - // returns the thead element of the summary table - function getTableHeader() { - return getTable().querySelector('thead tr'); - } - // returns the tbody element of the summary table - function getTableBody() { - return getTable().querySelector('tbody'); - } - // returns the th element for nth column - function getNthColumn(n) { - return getTableHeader().querySelectorAll('th')[n]; - } - - function onFilterInput() { - const searchValue = document.getElementById('fileSearch').value; - const rows = document.getElementsByTagName('tbody')[0].children; - - // Try to create a RegExp from the searchValue. If it fails (invalid regex), - // it will be treated as a plain text search - let searchRegex; - try { - searchRegex = new RegExp(searchValue, 'i'); // 'i' for case-insensitive - } catch (error) { - searchRegex = null; - } - - for (let i = 0; i < rows.length; i++) { - const row = rows[i]; - let isMatch = false; - - if (searchRegex) { - // If a valid regex was created, use it for matching - isMatch = searchRegex.test(row.textContent); - } else { - // Otherwise, fall back to the original plain text search - isMatch = row.textContent - .toLowerCase() - .includes(searchValue.toLowerCase()); - } - - row.style.display = isMatch ? '' : 'none'; - } - } - - // loads the search box - function addSearchBox() { - var template = document.getElementById('filterTemplate'); - var templateClone = template.content.cloneNode(true); - templateClone.getElementById('fileSearch').oninput = onFilterInput; - template.parentElement.appendChild(templateClone); - } - - // loads all columns - function loadColumns() { - var colNodes = getTableHeader().querySelectorAll('th'), - colNode, - cols = [], - col, - i; - - for (i = 0; i < colNodes.length; i += 1) { - colNode = colNodes[i]; - col = { - key: colNode.getAttribute('data-col'), - sortable: !colNode.getAttribute('data-nosort'), - type: colNode.getAttribute('data-type') || 'string' - }; - cols.push(col); - if (col.sortable) { - col.defaultDescSort = col.type === 'number'; - colNode.innerHTML = - colNode.innerHTML + ''; - } - } - return cols; - } - // attaches a data attribute to every tr element with an object - // of data values keyed by column name - function loadRowData(tableRow) { - var tableCols = tableRow.querySelectorAll('td'), - colNode, - col, - data = {}, - i, - val; - for (i = 0; i < tableCols.length; i += 1) { - colNode = tableCols[i]; - col = cols[i]; - val = colNode.getAttribute('data-value'); - if (col.type === 'number') { - val = Number(val); - } - data[col.key] = val; - } - return data; - } - // loads all row data - function loadData() { - var rows = getTableBody().querySelectorAll('tr'), - i; - - for (i = 0; i < rows.length; i += 1) { - rows[i].data = loadRowData(rows[i]); - } - } - // sorts the table using the data for the ith column - function sortByIndex(index, desc) { - var key = cols[index].key, - sorter = function(a, b) { - a = a.data[key]; - b = b.data[key]; - return a < b ? -1 : a > b ? 1 : 0; - }, - finalSorter = sorter, - tableBody = document.querySelector('.coverage-summary tbody'), - rowNodes = tableBody.querySelectorAll('tr'), - rows = [], - i; - - if (desc) { - finalSorter = function(a, b) { - return -1 * sorter(a, b); - }; - } - - for (i = 0; i < rowNodes.length; i += 1) { - rows.push(rowNodes[i]); - tableBody.removeChild(rowNodes[i]); - } - - rows.sort(finalSorter); - - for (i = 0; i < rows.length; i += 1) { - tableBody.appendChild(rows[i]); - } - } - // removes sort indicators for current column being sorted - function removeSortIndicators() { - var col = getNthColumn(currentSort.index), - cls = col.className; - - cls = cls.replace(/ sorted$/, '').replace(/ sorted-desc$/, ''); - col.className = cls; - } - // adds sort indicators for current column being sorted - function addSortIndicators() { - getNthColumn(currentSort.index).className += currentSort.desc - ? ' sorted-desc' - : ' sorted'; - } - // adds event listeners for all sorter widgets - function enableUI() { - var i, - el, - ithSorter = function ithSorter(i) { - var col = cols[i]; - - return function() { - var desc = col.defaultDescSort; - - if (currentSort.index === i) { - desc = !currentSort.desc; - } - sortByIndex(i, desc); - removeSortIndicators(); - currentSort.index = i; - currentSort.desc = desc; - addSortIndicators(); - }; - }; - for (i = 0; i < cols.length; i += 1) { - if (cols[i].sortable) { - // add the click event handler on the th so users - // dont have to click on those tiny arrows - el = getNthColumn(i).querySelector('.sorter').parentElement; - if (el.addEventListener) { - el.addEventListener('click', ithSorter(i)); - } else { - el.attachEvent('onclick', ithSorter(i)); - } - } - } - } - // adds sorting functionality to the UI - return function() { - if (!getTable()) { - return; - } - cols = loadColumns(); - loadData(); - addSearchBox(); - addSortIndicators(); - enableUI(); - }; -})(); - -window.addEventListener('load', addSorting); diff --git a/coverage/lcov-report/src/app.controller.ts.html b/coverage/lcov-report/src/app.controller.ts.html deleted file mode 100644 index 2b95272..0000000 --- a/coverage/lcov-report/src/app.controller.ts.html +++ /dev/null @@ -1,121 +0,0 @@ - - - - - - Code coverage report for src/app.controller.ts - - - - - - - - - -
-
-

All files / src app.controller.ts

-
- -
- 0% - Statements - 0/8 -
- - -
- 0% - Branches - 0/4 -
- - -
- 0% - Functions - 0/2 -
- - -
- 0% - Lines - 0/6 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13  -  -  -  -  -  -  -  -  -  -  -  - 
import { Controller, Get } from '@nestjs/common';
-import { AppService } from './app.service';
- 
-@Controller()
-export class AppController {
-  constructor(private readonly appService: AppService) {}
- 
-  @Get()
-  getHello(): string {
-    return this.appService.getHello();
-  }
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/app.module.ts.html b/coverage/lcov-report/src/app.module.ts.html deleted file mode 100644 index 02c8bc2..0000000 --- a/coverage/lcov-report/src/app.module.ts.html +++ /dev/null @@ -1,184 +0,0 @@ - - - - - - Code coverage report for src/app.module.ts - - - - - - - - - -
-
-

All files / src app.module.ts

-
- -
- 0% - Statements - 0/15 -
- - -
- 100% - Branches - 0/0 -
- - -
- 100% - Functions - 0/0 -
- - -
- 0% - Lines - 0/13 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { Module } from '@nestjs/common';
-import { AppController } from './app.controller';
-import { AppService } from './app.service';
-import { ConfigModule } from '@nestjs/config';
-import { DatabaseModule } from './database/database.module';
-import { AuthModule } from './auth/auth.module';
-import { UsersModule } from './users/users.module';
-import configuration from './database/config';
-import { LoggerModule } from './logger/logger.module';
-import { ProjectsModule } from './projects/projects.module';
-import { MailModule } from './mail/mail.module';
-import { DonationsModule } from './donations/donations.module';
- 
-@Module({
-  imports: [
-    ConfigModule.forRoot({
-      isGlobal: true,
-      envFilePath: '.env',
-      load: [configuration],
-    }),
-    DatabaseModule,
-    LoggerModule,
-    AuthModule,
-    MailModule,
-    // Users module provides user-facing endpoints such as change-password
-    UsersModule,
-    ProjectsModule,
-    DonationsModule,
-  ],
-  controllers: [AppController],
-  providers: [AppService],
-})
-export class AppModule {}
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/app.service.ts.html b/coverage/lcov-report/src/app.service.ts.html deleted file mode 100644 index cb9dfec..0000000 --- a/coverage/lcov-report/src/app.service.ts.html +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - Code coverage report for src/app.service.ts - - - - - - - - - -
-
-

All files / src app.service.ts

-
- -
- 0% - Statements - 0/5 -
- - -
- 100% - Branches - 0/0 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/3 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9  -  -  -  -  -  -  -  - 
import { Injectable } from '@nestjs/common';
- 
-@Injectable()
-export class AppService {
-  getHello(): string {
-    return 'Hello World!';
-  }
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/auth/auth.controller.ts.html b/coverage/lcov-report/src/auth/auth.controller.ts.html deleted file mode 100644 index 9a9699e..0000000 --- a/coverage/lcov-report/src/auth/auth.controller.ts.html +++ /dev/null @@ -1,478 +0,0 @@ - - - - - - Code coverage report for src/auth/auth.controller.ts - - - - - - - - - -
-
-

All files / src/auth auth.controller.ts

-
- -
- 100% - Statements - 26/26 -
- - -
- 75% - Branches - 33/44 -
- - -
- 100% - Functions - 7/7 -
- - -
- 100% - Lines - 24/24 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -1321x -  -  -  -  -  -  -  -  -  -1x -1x -  -  -  -  -  -  -  -  -  -  -1x -1x -1x -1x -1x -1x -1x -  -  -  -  -1x -13x -  -  -  -  -  -  -  -  -  -  -  -1x -2x -  -  -  -  -  -  -  -  -  -  -  -  -1x -  -  -  -2x -  -  -  -  -  -  -  -  -  -  -  -  -  -1x -2x -  -  -  -  -  -  -  -  -  -  -  -  -1x -  -  -2x -  -  -  -  -  -  -  -  -  -  -  -  -1x -  -  -2x -  -  -  -  -  -  -  -  -  -  -  -  -  -1x -  -  -3x -  -  - 
import {
-  Controller,
-  Post,
-  Body,
-  UseGuards,
-  Request,
-  Get,
-  HttpCode,
-  HttpStatus,
-} from '@nestjs/common';
-import { AuthGuard } from '@nestjs/passport';
-import {
-  ApiTags,
-  ApiOperation,
-  ApiResponse,
-  ApiBearerAuth,
-  ApiOkResponse,
-  ApiCreatedResponse,
-  ApiBadRequestResponse,
-  ApiUnauthorizedResponse,
-  ApiNotFoundResponse,
-} from '@nestjs/swagger';
-import { RegisterDto } from './dto/register.dto';
-import { LoginDto } from './dto/login.dto';
-import { VerifyEmailDto } from './dto/verify-email.dto';
-import { ResendVerificationDto } from './dto/resend-verification.dto';
-import { RefreshTokenDto } from './dto/refresh-token.dto';
-import { AuthResponseDto } from './dto/auth-response.dto';
-import { AuthService } from './providers/auth.service';
- 
-@ApiTags('auth')
-@ApiBearerAuth()
-@Controller('auth')
-export class AuthController {
-  constructor(private readonly authService: AuthService) {}
- 
-  //_____________________Endpoint to register a new user
-  @Post('register')
-  @ApiOperation({ summary: 'Register a new user' })
-  @ApiCreatedResponse({
-    description: 'User registered successfully',
-    type: AuthResponseDto,
-  })
-  @ApiBadRequestResponse({
-    description: 'Invalid input or user already exists',
-  })
-  async register(@Body() registerDto: RegisterDto): Promise<AuthResponseDto> {
-    return this.authService.register(registerDto);
-  }
- 
-  //_________________________ Endpoint to login with email and password
-  @Post('login')
-  @ApiOperation({ summary: 'Login with email and password' })
-  @ApiOkResponse({
-    description: 'Login successful',
-    type: AuthResponseDto,
-  })
-  @ApiUnauthorizedResponse({
-    description: 'Invalid credentials',
-  })
-  async login(
-    @Body() loginDto: LoginDto,
-    @Request() req,
-  ): Promise<AuthResponseDto> {
-    return this.authService.login(loginDto, req);
-  }
- 
-  //_________________________ Endpoint to get current user profile (JWT required)
-  @Get('profile')
-  @UseGuards(AuthGuard('jwt'))
-  @ApiOperation({ summary: 'Get current user profile (JWT required)' })
-  @ApiOkResponse({
-    description: 'Profile retrieved successfully',
-    type: Object,
-  })
-  @ApiUnauthorizedResponse({
-    description: 'Unauthorized',
-  })
-  async getProfile(@Request() req) {
-    return req.user;
-  }
- 
-  //_________________________ Endpoint to verify email with token
-  @Post('verify-email')
-  @HttpCode(HttpStatus.OK)
-  @ApiOperation({ summary: 'Verify email with token' })
-  @ApiOkResponse({
-    description: 'Email verified successfully',
-  })
-  @ApiBadRequestResponse({
-    description: 'Invalid or expired token',
-  })
-  async verifyEmail(
-    @Body() verifyEmailDto: VerifyEmailDto,
-  ): Promise<{ message: string }> {
-    return this.authService.verifyEmail(verifyEmailDto);
-  }
- 
-  //_________________________ Endpoint to resend email verification
-  @Post('resend-verification')
-  @HttpCode(HttpStatus.OK)
-  @ApiOperation({ summary: 'Resend email verification' })
-  @ApiOkResponse({
-    description: 'Verification email sent',
-  })
-  @ApiNotFoundResponse({
-    description: 'User not found',
-  })
-  async resendVerification(
-    @Body() resendVerificationDto: ResendVerificationDto,
-  ): Promise<{ message: string }> {
-    return this.authService.resendVerification(resendVerificationDto);
-  }
- 
-  //_________________________ Endpoint to refresh access token using refresh token (token rotation)
-  @Post('refresh')
-  @HttpCode(HttpStatus.OK)
-  @ApiOperation({ summary: 'Refresh access token' })
-  @ApiOkResponse({
-    description: 'Token refreshed successfully',
-    type: AuthResponseDto,
-  })
-  @ApiUnauthorizedResponse({
-    description: 'Invalid refresh token',
-  })
-  async refreshToken(
-    @Body() refreshTokenDto: RefreshTokenDto,
-  ): Promise<AuthResponseDto> {
-    return this.authService.refreshToken(refreshTokenDto);
-  }
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/auth/auth.module.ts.html b/coverage/lcov-report/src/auth/auth.module.ts.html deleted file mode 100644 index 6e1ec27..0000000 --- a/coverage/lcov-report/src/auth/auth.module.ts.html +++ /dev/null @@ -1,232 +0,0 @@ - - - - - - Code coverage report for src/auth/auth.module.ts - - - - - - - - - -
-
-

All files / src/auth auth.module.ts

-
- -
- 0% - Statements - 0/17 -
- - -
- 100% - Branches - 0/0 -
- - -
- 0% - Functions - 0/2 -
- - -
- 0% - Lines - 0/15 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import {
-  MiddlewareConsumer,
-  Module,
-  NestModule,
-  RequestMethod,
-} from '@nestjs/common';
-import { AuthController } from './auth.controller';
-import { PassportModule } from '@nestjs/passport';
-import { JwtModule } from '@nestjs/jwt';
-import { ConfigModule, ConfigService } from '@nestjs/config';
-import { APP_GUARD } from '@nestjs/core';
-import { TypeOrmModule } from '@nestjs/typeorm';
-import { User } from '../users/entities/user.entity';
- 
-import { JwtStrategy } from './strategies/jwt.strategy';
-import { TokenValidationMiddleware } from '../common/middleware/token-validation.middleware';
-import { JwtAuthGuard } from '../common/guards/jwt-auth.guard';
-import { AuthService } from './providers/auth.service';
- 
-@Module({
-  imports: [
-    PassportModule,
-    TypeOrmModule.forFeature([User]),
-    JwtModule.registerAsync({
-      imports: [ConfigModule],
-      inject: [ConfigService],
-      useFactory: (config: ConfigService) => ({
-        secret: config.getOrThrow<string>('jwtSecret'),
-        signOptions: {
-          expiresIn: '15m',
-        },
-      }),
-    }),
-  ],
-  controllers: [AuthController],
-  providers: [
-    JwtStrategy,
-    AuthService,
-    { provide: APP_GUARD, useClass: JwtAuthGuard },
-  ],
-  exports: [JwtModule, AuthService],
-})
-export class AuthModule implements NestModule {
-  configure(consumer: MiddlewareConsumer) {
-    consumer
-      .apply(TokenValidationMiddleware)
-      .forRoutes({ path: '*', method: RequestMethod.ALL });
-  }
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/auth/auth.service.ts.html b/coverage/lcov-report/src/auth/auth.service.ts.html deleted file mode 100644 index 3aed065..0000000 --- a/coverage/lcov-report/src/auth/auth.service.ts.html +++ /dev/null @@ -1,1531 +0,0 @@ - - - - - - Code coverage report for src/auth/auth.service.ts - - - - - - - - - -
-
-

All files / src/auth auth.service.ts

-
- -
- 0% - Statements - 0/165 -
- - -
- 0% - Branches - 0/93 -
- - -
- 0% - Functions - 0/13 -
- - -
- 0% - Lines - 0/163 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174 -175 -176 -177 -178 -179 -180 -181 -182 -183 -184 -185 -186 -187 -188 -189 -190 -191 -192 -193 -194 -195 -196 -197 -198 -199 -200 -201 -202 -203 -204 -205 -206 -207 -208 -209 -210 -211 -212 -213 -214 -215 -216 -217 -218 -219 -220 -221 -222 -223 -224 -225 -226 -227 -228 -229 -230 -231 -232 -233 -234 -235 -236 -237 -238 -239 -240 -241 -242 -243 -244 -245 -246 -247 -248 -249 -250 -251 -252 -253 -254 -255 -256 -257 -258 -259 -260 -261 -262 -263 -264 -265 -266 -267 -268 -269 -270 -271 -272 -273 -274 -275 -276 -277 -278 -279 -280 -281 -282 -283 -284 -285 -286 -287 -288 -289 -290 -291 -292 -293 -294 -295 -296 -297 -298 -299 -300 -301 -302 -303 -304 -305 -306 -307 -308 -309 -310 -311 -312 -313 -314 -315 -316 -317 -318 -319 -320 -321 -322 -323 -324 -325 -326 -327 -328 -329 -330 -331 -332 -333 -334 -335 -336 -337 -338 -339 -340 -341 -342 -343 -344 -345 -346 -347 -348 -349 -350 -351 -352 -353 -354 -355 -356 -357 -358 -359 -360 -361 -362 -363 -364 -365 -366 -367 -368 -369 -370 -371 -372 -373 -374 -375 -376 -377 -378 -379 -380 -381 -382 -383 -384 -385 -386 -387 -388 -389 -390 -391 -392 -393 -394 -395 -396 -397 -398 -399 -400 -401 -402 -403 -404 -405 -406 -407 -408 -409 -410 -411 -412 -413 -414 -415 -416 -417 -418 -419 -420 -421 -422 -423 -424 -425 -426 -427 -428 -429 -430 -431 -432 -433 -434 -435 -436 -437 -438 -439 -440 -441 -442 -443 -444 -445 -446 -447 -448 -449 -450 -451 -452 -453 -454 -455 -456 -457 -458 -459 -460 -461 -462 -463 -464 -465 -466 -467 -468 -469 -470 -471 -472 -473 -474 -475 -476 -477 -478 -479 -480 -481 -482 -483  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import {
-  Injectable,
-  UnauthorizedException,
-  ConflictException,
-  BadRequestException,
-  NotFoundException,
-  Inject,
-  Optional,
-  Logger,
-} from '@nestjs/common';
-import { JwtService } from '@nestjs/jwt';
-import { InjectRepository } from '@nestjs/typeorm';
-import { Repository } from 'typeorm';
-import * as bcrypt from 'bcrypt';
-import * as crypto from 'crypto';
-import { ConfigService } from '@nestjs/config';
-import { RegisterDto } from './dtos/register.dto';
-import { LoginDto } from './dtos/login.dto';
-import { VerifyEmailDto } from './dtos/verify-email.dto';
-import { ResendVerificationDto } from './dtos/resend-verification.dto';
-import { RefreshTokenDto } from './dtos/refresh-token.dto';
-import { AuthResponse, JwtPayload } from './interfaces/auth.interface';
-import { User, UserRole, KYCStatus } from '../users/entities/user.entity';
-import { ChangePasswordDto } from '../users/dtos/change-password.dto';
-import { SubmitKYCDto } from '../users/dtos/submit-kyc.dto';
-import { UpdateKYCDto } from '../users/dtos/update-kyc.dto';
- 
-@Injectable()
-export class AuthService {
-  private readonly logger = new Logger(AuthService.name);
- 
-  constructor(
-    @InjectRepository(User)
-    private userRepository: Repository<User>,
-    private jwtService: JwtService,
-    private configService: ConfigService,
-  ) {}
- 
-  // Change password for a given user id
-  async changePassword(
-    userId: string,
-    changeDto: ChangePasswordDto,
-  ): Promise<{ message: string }> {
-    const user = await this.userRepository.findOne({ where: { id: userId } });
-    if (!user) {
-      throw new NotFoundException('User not found');
-    }
- 
-    const isCurrentValid = await bcrypt.compare(
-      changeDto.currentPassword,
-      user.password,
-    );
-    if (!isCurrentValid) {
-      throw new UnauthorizedException('Current password is incorrect');
-    }
- 
-    // Hash new password
-    const saltRounds = 10;
-    const hashed = await bcrypt.hash(changeDto.newPassword, saltRounds);
- 
-    // Update password and invalidate refresh tokens (clear refreshTokenHash)
-    user.password = hashed;
-    user.refreshTokenHash = null;
-    await this.userRepository.save(user);
- 
-    // Try to send confirmation email if an email service is registered (optional)
-    try {
-      // If an injected email service exposes a `sendPasswordChangedEmail` method, call it.
-      // We inject under token 'EMAIL_SERVICE' elsewhere in the app if available.
-      // @ts-ignore
-      if (
-        (this as any).emailService &&
-        typeof (this as any).emailService.sendPasswordChangedEmail ===
-          'function'
-      ) {
-        // @ts-ignore
-        await (this as any).emailService.sendPasswordChangedEmail(
-          user.email,
-          user.firstName,
-        );
-      }
-    } catch (err) {
-      // Do not fail the password change if email sending fails
- 
-      console.warn('Failed to send password change email', err);
-    }
- 
-    return { message: 'Password changed successfully' };
-  }
- 
-  async register(registerDto: RegisterDto): Promise<AuthResponse> {
-    const existingUser = await this.userRepository.findOne({
-      where: { email: registerDto.email },
-    });
- 
-    if (existingUser) {
-      throw new ConflictException('User with this email already exists');
-    }
- 
-    const saltRounds = 10;
-    const hashedPassword = await bcrypt.hash(registerDto.password, saltRounds);
- 
-    const user = this.userRepository.create({
-      ...registerDto,
-      password: hashedPassword,
-      role: UserRole.USER,
-      isEmailVerified: false,
-    });
- 
-    await this.userRepository.save(user);
- 
-    // Note: Email integration temporarily disabled for server startup
-    // TODO: Re-enable email service after resolving dependency injection
-    this.logger.log(`User registered successfully: ${user.email}`);
- 
-    return this.generateTokens(user);
-  }
- 
-  async login(loginDto: LoginDto, request?: any): Promise<AuthResponse> {
-    const user = await this.userRepository.findOne({
-      where: { email: loginDto.email },
-    });
- 
-    if (!user) {
-      throw new UnauthorizedException('Invalid credentials');
-    }
- 
-    const isPasswordValid = await bcrypt.compare(
-      loginDto.password,
-      user.password,
-    );
-    if (!isPasswordValid) {
-      throw new UnauthorizedException('Invalid credentials');
-    }
- 
-    // Note: Email integration temporarily disabled for server startup
-    // TODO: Re-enable email service after resolving dependency injection
-    this.logger.log(`User logged in successfully: ${user.email}`);
- 
-    return this.generateTokens(user);
-  }
- 
-  async generateTokens(user: User): Promise<AuthResponse> {
-    const payload: JwtPayload = {
-      sub: user.id,
-      email: user.email,
-      role: user.role,
-      walletAddress: user.walletAddress ?? undefined,
-    };
- 
-    const [accessToken, refreshToken] = await Promise.all([
-      this.jwtService.signAsync(payload, {
-        secret: this.configService.getOrThrow<string>('jwtSecret'),
-        expiresIn: '15m',
-      }),
-      this.jwtService.signAsync(payload, {
-        secret: this.configService.getOrThrow<string>('jwtRefreshSecret'),
-        expiresIn: '7d',
-      }),
-    ]);
- 
-    // Store refresh token hash
-    const saltRounds = 10;
-    user.refreshTokenHash = await bcrypt.hash(refreshToken, saltRounds);
-    await this.userRepository.save(user);
- 
-    return {
-      accessToken,
-      refreshToken,
-      user: {
-        id: user.id,
-        email: user.email,
-        firstName: user.firstName,
-        lastName: user.lastName,
-        role: user.role,
-        walletAddress: user.walletAddress || '',
-        isEmailVerified: user.isEmailVerified,
-      },
-    };
-  }
- 
-  async validateUser(payload: JwtPayload): Promise<User> {
-    const user = await this.userRepository.findOne({
-      where: { id: payload.sub },
-    });
-    if (!user) {
-      throw new UnauthorizedException();
-    }
-    return user;
-  }
- 
-  async verifyEmail(
-    verifyEmailDto: VerifyEmailDto,
-  ): Promise<{ message: string }> {
-    // Basic implementation for now to fix controller errors
-    const user = await this.userRepository.findOne({
-      where: { emailVerificationToken: verifyEmailDto.token },
-    });
- 
-    if (!user) {
-      throw new BadRequestException('Invalid or expired verification token');
-    }
- 
-    if (
-      user.emailVerificationTokenExpiry &&
-      user.emailVerificationTokenExpiry < new Date()
-    ) {
-      throw new BadRequestException('Verification token has expired');
-    }
- 
-    user.isEmailVerified = true;
-    user.emailVerificationToken = null;
-    user.emailVerificationTokenExpiry = null;
-    await this.userRepository.save(user);
- 
-    return { message: 'Email verified successfully' };
-  }
- 
-  async resendVerification(
-    resendVerificationDto: ResendVerificationDto,
-  ): Promise<{ message: string }> {
-    const user = await this.userRepository.findOne({
-      where: { email: resendVerificationDto.email },
-    });
- 
-    if (!user) {
-      throw new NotFoundException('User not found');
-    }
- 
-    if (user.isEmailVerified) {
-      throw new BadRequestException('Email is already verified');
-    }
- 
-    // Logic to update token and send email would go here
-    return { message: 'Verification email resent' };
-  }
- 
-  async forgotPassword(email: string): Promise<{ message: string }> {
-    const user = await this.userRepository.findOne({ where: { email } });
- 
-    // Always return success for security reasons
-    if (!user) {
-      return {
-        message:
-          'If an account with that email exists, a reset link has been sent',
-      };
-    }
- 
-    const selector = crypto.randomBytes(16).toString('hex');
-    const validator = crypto.randomBytes(32).toString('hex');
-    const saltRounds = 10;
-    const validatorHash = await bcrypt.hash(validator, saltRounds);
- 
-    user.resetPasswordTokenSelector = selector;
-    user.resetPasswordTokenHash = validatorHash;
-    user.resetPasswordTokenExpiry = new Date(Date.now() + 60 * 60 * 1000); // 1 hour
-    await this.userRepository.save(user);
- 
-    const token = `${selector}.${validator}`;
- 
-    try {
-      // @ts-ignore
-      if (
-        (this as any).emailService &&
-        typeof (this as any).emailService.sendPasswordResetEmail === 'function'
-      ) {
-        // @ts-ignore
-        await (this as any).emailService.sendPasswordResetEmail(
-          user.email,
-          token,
-          user.firstName,
-        );
-      }
-    } catch (err) {
-      // do not reveal email failures
- 
-      console.warn('Failed to send password reset email', err);
-    }
- 
-    return {
-      message:
-        'If an account with that email exists, a reset link has been sent',
-    };
-  }
- 
-  async resetPassword(
-    token: string,
-    newPassword: string,
-  ): Promise<{ message: string }> {
-    const parts = token.split('.');
-    if (parts.length !== 2) {
-      throw new BadRequestException('Invalid token');
-    }
- 
-    const [selector, validator] = parts;
-    const user = await this.userRepository.findOne({
-      where: { resetPasswordTokenSelector: selector },
-    });
-    if (
-      !user ||
-      !user.resetPasswordTokenHash ||
-      !user.resetPasswordTokenExpiry
-    ) {
-      throw new BadRequestException('Invalid or expired token');
-    }
- 
-    if (user.resetPasswordTokenExpiry < new Date()) {
-      throw new BadRequestException('Invalid or expired token');
-    }
- 
-    const isValid = await bcrypt.compare(
-      validator,
-      user.resetPasswordTokenHash,
-    );
-    if (!isValid) {
-      throw new BadRequestException('Invalid or expired token');
-    }
- 
-    // Hash new password and clear reset token fields
-    const saltRounds = 10;
-    const hashed = await bcrypt.hash(newPassword, saltRounds);
-    user.password = hashed;
-    user.resetPasswordTokenSelector = null;
-    user.resetPasswordTokenHash = null;
-    user.resetPasswordTokenExpiry = null;
-    // Invalidate refresh tokens/sessions
-    user.refreshTokenHash = null;
-    await this.userRepository.save(user);
- 
-    try {
-      // @ts-ignore
-      if (
-        (this as any).emailService &&
-        typeof (this as any).emailService.sendPasswordChangedEmail ===
-          'function'
-      ) {
-        // @ts-ignore
-        await (this as any).emailService.sendPasswordChangedEmail(
-          user.email,
-          user.firstName,
-        );
-      }
-    } catch (err) {
-      console.warn('Failed to send password changed email', err);
-    }
- 
-    return { message: 'Password reset successfully' };
-  }
- 
-  async submitKYC(
-    userId: string,
-    submitDto: SubmitKYCDto,
-  ): Promise<{ message: string }> {
-    const user = await this.userRepository.findOne({ where: { id: userId } });
-    if (!user) {
-      throw new NotFoundException('User not found');
-    }
- 
-    user.kycStatus = KYCStatus.PENDING;
-    user.kycDocumentUrl = submitDto.documentUrl;
-    user.kycSubmittedAt = new Date();
-    user.kycRejectionReason = null;
-    await this.userRepository.save(user);
- 
-    try {
-      // @ts-ignore
-      if (
-        (this as any).emailService &&
-        typeof (this as any).emailService.sendKYCSubmittedEmail === 'function'
-      ) {
-        // @ts-ignore
-        await (this as any).emailService.sendKYCSubmittedEmail(
-          user.email,
-          user.firstName,
-        );
-      }
-    } catch (err) {
-      console.warn('Failed to send KYC submitted email', err);
-    }
- 
-    return { message: 'KYC documents submitted for review' };
-  }
- 
-  async updateKYCStatus(
-    userId: string,
-    updateDto: UpdateKYCDto,
-  ): Promise<{ message: string }> {
-    const user = await this.userRepository.findOne({ where: { id: userId } });
-    if (!user) {
-      throw new NotFoundException('User not found');
-    }
- 
-    const oldStatus = user.kycStatus;
-    user.kycStatus = updateDto.status;
- 
-    if (updateDto.status === KYCStatus.APPROVED) {
-      user.kycVerifiedAt = new Date();
-      user.kycRejectionReason = null;
-    } else if (updateDto.status === KYCStatus.REJECTED) {
-      user.kycRejectionReason = updateDto.rejectionReason || 'KYC rejected';
-    }
- 
-    await this.userRepository.save(user);
- 
-    try {
-      // @ts-ignore
-      if (
-        (this as any).emailService &&
-        typeof (this as any).emailService.sendKYCStatusChangeEmail ===
-          'function'
-      ) {
-        // @ts-ignore
-        await (this as any).emailService.sendKYCStatusChangeEmail(
-          user.email,
-          user.firstName,
-          updateDto.status,
-          updateDto.rejectionReason || undefined,
-        );
-      }
-    } catch (err) {
-      console.warn('Failed to send KYC status change email', err);
-    }
- 
-    return { message: `KYC status updated to ${updateDto.status}` };
-  }
- 
-  async refreshToken(refreshTokenDto: RefreshTokenDto): Promise<AuthResponse> {
-    try {
-      // Verify the refresh token
-      const payload = this.jwtService.verify(refreshTokenDto.refreshToken, {
-        secret: this.configService.getOrThrow<string>('jwtRefreshSecret'),
-      });
- 
-      // Find the user
-      const user = await this.userRepository.findOne({
-        where: { id: payload.sub },
-      });
-      if (!user) {
-        throw new UnauthorizedException('Invalid refresh token');
-      }
- 
-      // Check if the refresh token hash matches (token rotation)
-      if (!user.refreshTokenHash) {
-        this.logger.warn(
-          `User ${user.id} attempted to use refresh token but no hash stored`,
-        );
-        throw new UnauthorizedException('Invalid refresh token');
-      }
- 
-      const isTokenValid = await bcrypt.compare(
-        refreshTokenDto.refreshToken,
-        user.refreshTokenHash,
-      );
-      if (!isTokenValid) {
-        // Possible token reuse attack - invalidate all tokens for this user
-        this.logger.warn(
-          `Possible token reuse attack detected for user ${user.id}`,
-        );
-        user.refreshTokenHash = null;
-        await this.userRepository.save(user);
-        throw new UnauthorizedException('Invalid refresh token');
-      }
- 
-      // Generate new tokens (token rotation)
-      const newTokens = await this.generateTokens(user);
- 
-      // Invalidate the old refresh token by clearing the hash
-      // The new token hash is already set in generateTokens
-      this.logger.debug(`Token rotated successfully for user ${user.id}`);
- 
-      return newTokens;
-    } catch (error) {
-      if (
-        error.name === 'JsonWebTokenError' ||
-        error.name === 'TokenExpiredError'
-      ) {
-        throw new UnauthorizedException('Invalid or expired refresh token');
-      }
-      throw error;
-    }
-  }
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/auth/decorators/current-user.decorator.ts.html b/coverage/lcov-report/src/auth/decorators/current-user.decorator.ts.html deleted file mode 100644 index 49fde47..0000000 --- a/coverage/lcov-report/src/auth/decorators/current-user.decorator.ts.html +++ /dev/null @@ -1,157 +0,0 @@ - - - - - - Code coverage report for src/auth/decorators/current-user.decorator.ts - - - - - - - - - -
-
-

All files / src/auth/decorators current-user.decorator.ts

-
- -
- 0% - Statements - 0/5 -
- - -
- 0% - Branches - 0/2 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/5 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { createParamDecorator, ExecutionContext } from '@nestjs/common';
-import type { Request } from 'express';
-import type { JwtPayload } from '../interfaces/auth.interface';
- 
-/**
- * Extracts the authenticated user payload from the request.
- * Returns the full JwtPayload or a specific field.
- *
- * @example
- * @Get('profile')
- * getProfile(@CurrentUser() user: JwtPayload) { ... }
- *
- * @Get('id')
- * getId(@CurrentUser('sub') id: string) { ... }
- */
-export const CurrentUser = createParamDecorator(
-  (field: keyof JwtPayload | undefined, ctx: ExecutionContext) => {
-    const request = ctx
-      .switchToHttp()
-      .getRequest<Request & { user: JwtPayload }>();
-    const user = request.user;
-    return field ? user?.[field] : user;
-  },
-);
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/auth/decorators/index.html b/coverage/lcov-report/src/auth/decorators/index.html deleted file mode 100644 index a964a31..0000000 --- a/coverage/lcov-report/src/auth/decorators/index.html +++ /dev/null @@ -1,131 +0,0 @@ - - - - - - Code coverage report for src/auth/decorators - - - - - - - - - -
-
-

All files src/auth/decorators

-
- -
- 50% - Statements - 5/10 -
- - -
- 0% - Branches - 0/2 -
- - -
- 50% - Functions - 1/2 -
- - -
- 37.5% - Lines - 3/8 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
current-user.decorator.ts -
-
0%0/50%0/20%0/10%0/5
public.decorator.ts -
-
100%5/5100%0/0100%1/1100%3/3
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/auth/decorators/public.decorator.ts.html b/coverage/lcov-report/src/auth/decorators/public.decorator.ts.html deleted file mode 100644 index 565c9b8..0000000 --- a/coverage/lcov-report/src/auth/decorators/public.decorator.ts.html +++ /dev/null @@ -1,124 +0,0 @@ - - - - - - Code coverage report for src/auth/decorators/public.decorator.ts - - - - - - - - - -
-
-

All files / src/auth/decorators public.decorator.ts

-
- -
- 100% - Statements - 5/5 -
- - -
- 100% - Branches - 0/0 -
- - -
- 100% - Functions - 1/1 -
- - -
- 100% - Lines - 3/3 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -141x -  -1x -  -  -  -  -  -  -  -  -  -1x - 
import { SetMetadata } from '@nestjs/common';
- 
-export const IS_PUBLIC_KEY = 'isPublic';
- 
-/**
- * Marks a route or controller as publicly accessible — no JWT required.
- *
- * @example
- * @Public()
- * @Post('login')
- * login() { ... }
- */
-export const Public = () => SetMetadata(IS_PUBLIC_KEY, true);
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/auth/dto/auth-response.dto.ts.html b/coverage/lcov-report/src/auth/dto/auth-response.dto.ts.html deleted file mode 100644 index 4b1e1be..0000000 --- a/coverage/lcov-report/src/auth/dto/auth-response.dto.ts.html +++ /dev/null @@ -1,292 +0,0 @@ - - - - - - Code coverage report for src/auth/dto/auth-response.dto.ts - - - - - - - - - -
-
-

All files / src/auth/dto auth-response.dto.ts

-
- -
- 100% - Statements - 14/14 -
- - -
- 75% - Branches - 3/4 -
- - -
- 100% - Functions - 0/0 -
- - -
- 100% - Lines - 14/14 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -701x -1x -  -1x -  -  -  -  -  -1x -  -  -  -  -  -  -1x -  -  -  -  -  -1x -  -  -  -  -  -1x -  -  -  -  -  -1x -  -  -  -  -  -  -1x -  -  -  -  -  -1x -  -  -1x -  -  -  -  -1x -  -  -  -  -  -1x -  -  -  -  -  -1x -  - 
import { ApiProperty } from '@nestjs/swagger';
-import { UserRole } from 'src/common/enums/user-role.enum';
- 
-export class UserDto {
-  @ApiProperty({
-    description: 'Unique identifier for the user',
-    example: '123e4567-e89b-12d3-a456-426614174000',
-    format: 'uuid',
-  })
-  id: string;
- 
-  @ApiProperty({
-    description: 'User email address',
-    example: 'user@example.com',
-    format: 'email',
-  })
-  email: string;
- 
-  @ApiProperty({
-    description: 'User first name',
-    example: 'John',
-  })
-  firstName: string;
- 
-  @ApiProperty({
-    description: 'User last name',
-    example: 'Doe',
-  })
-  lastName: string;
- 
-  @ApiProperty({
-    description: 'User wallet address',
-    example: 'GAA2M7F4E3C4D4E5F6G7H8I9J0K1L2M3N4O5P6Q7R8S9T0U1V2W3X4Y5Z6',
-  })
-  walletAddress: string;
- 
-  @ApiProperty({
-    description: 'User role',
-    enum: UserRole,
-    example: UserRole.DONOR,
-  })
-  role: UserRole;
- 
-  @ApiProperty({
-    description: 'Whether the user has verified their email',
-    example: true,
-  })
-  isEmailVerified: boolean;
-}
- 
-export class AuthResponseDto {
-  @ApiProperty({
-    description: 'JWT access token',
-    example: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...',
-  })
-  accessToken: string;
- 
-  @ApiProperty({
-    description: 'JWT refresh token',
-    example: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...refresh...',
-  })
-  refreshToken: string;
- 
-  @ApiProperty({
-    description: 'User information',
-    type: UserDto,
-  })
-  user: UserDto;
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/auth/dto/index.html b/coverage/lcov-report/src/auth/dto/index.html deleted file mode 100644 index 9fff236..0000000 --- a/coverage/lcov-report/src/auth/dto/index.html +++ /dev/null @@ -1,191 +0,0 @@ - - - - - - Code coverage report for src/auth/dto - - - - - - - - - -
-
-

All files src/auth/dto

-
- -
- 100% - Statements - 41/41 -
- - -
- 75% - Branches - 6/8 -
- - -
- 100% - Functions - 0/0 -
- - -
- 100% - Lines - 41/41 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
auth-response.dto.ts -
-
100%14/1475%3/4100%0/0100%14/14
login.dto.ts -
-
100%5/5100%0/0100%0/0100%5/5
refresh-token.dto.ts -
-
100%4/4100%0/0100%0/0100%4/4
register.dto.ts -
-
100%10/1075%3/4100%0/0100%10/10
resend-verification.dto.ts -
-
100%4/4100%0/0100%0/0100%4/4
verify-email.dto.ts -
-
100%4/4100%0/0100%0/0100%4/4
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/auth/dto/login.dto.ts.html b/coverage/lcov-report/src/auth/dto/login.dto.ts.html deleted file mode 100644 index 4dde780..0000000 --- a/coverage/lcov-report/src/auth/dto/login.dto.ts.html +++ /dev/null @@ -1,151 +0,0 @@ - - - - - - Code coverage report for src/auth/dto/login.dto.ts - - - - - - - - - -
-
-

All files / src/auth/dto login.dto.ts

-
- -
- 100% - Statements - 5/5 -
- - -
- 100% - Branches - 0/0 -
- - -
- 100% - Functions - 0/0 -
- - -
- 100% - Lines - 5/5 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -231x -1x -  -1x -  -  -  -  -  -  -  -1x -  -  -  -  -  -  -  -  -1x -  - 
import { IsEmail, IsNotEmpty, IsString } from 'class-validator';
-import { ApiProperty } from '@nestjs/swagger';
- 
-export class LoginDto {
-  @ApiProperty({
-    description: 'User email address',
-    example: 'user@example.com',
-    format: 'email',
-  })
-  @IsEmail()
-  @IsNotEmpty()
-  email: string;
- 
-  @ApiProperty({
-    description: 'User password',
-    example: 'SecurePass123!',
-    minLength: 8,
-  })
-  @IsString()
-  @IsNotEmpty()
-  password: string;
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/auth/dto/refresh-token.dto.ts.html b/coverage/lcov-report/src/auth/dto/refresh-token.dto.ts.html deleted file mode 100644 index 8f478a8..0000000 --- a/coverage/lcov-report/src/auth/dto/refresh-token.dto.ts.html +++ /dev/null @@ -1,121 +0,0 @@ - - - - - - Code coverage report for src/auth/dto/refresh-token.dto.ts - - - - - - - - - -
-
-

All files / src/auth/dto refresh-token.dto.ts

-
- -
- 100% - Statements - 4/4 -
- - -
- 100% - Branches - 0/0 -
- - -
- 100% - Functions - 0/0 -
- - -
- 100% - Lines - 4/4 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -131x -1x -  -1x -  -  -  -  -  -  -1x -  - 
import { IsNotEmpty, IsString } from 'class-validator';
-import { ApiProperty } from '@nestjs/swagger';
- 
-export class RefreshTokenDto {
-  @ApiProperty({
-    description: 'Refresh token for obtaining new access token',
-    example: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...',
-  })
-  @IsString()
-  @IsNotEmpty()
-  refreshToken: string;
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/auth/dto/register.dto.ts.html b/coverage/lcov-report/src/auth/dto/register.dto.ts.html deleted file mode 100644 index 9b6058d..0000000 --- a/coverage/lcov-report/src/auth/dto/register.dto.ts.html +++ /dev/null @@ -1,313 +0,0 @@ - - - - - - Code coverage report for src/auth/dto/register.dto.ts - - - - - - - - - -
-
-

All files / src/auth/dto register.dto.ts

-
- -
- 100% - Statements - 10/10 -
- - -
- 75% - Branches - 3/4 -
- - -
- 100% - Functions - 0/0 -
- - -
- 100% - Lines - 10/10 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -771x -  -  -  -  -  -  -  -  -1x -1x -  -1x -  -  -  -  -  -  -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1x -  -  -  -  -  -  -  -  -1x -  -  -  -  -  -  -  -  -1x -  -  -  -  -  -  -  -  -1x -  -  -  -  -  -  -  -  -1x -  - 
import {
-  IsEmail,
-  IsNotEmpty,
-  IsString,
-  MinLength,
-  IsEnum,
-  IsOptional,
-  Matches,
-} from 'class-validator';
-import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
-import { UserRole } from 'src/common/enums/user-role.enum';
- 
-export class RegisterDto {
-  @ApiProperty({
-    description: 'User email address',
-    example: 'user@example.com',
-    format: 'email',
-  })
-  @IsEmail()
-  @IsNotEmpty()
-  email: string;
- 
-  @ApiProperty({
-    description:
-      'User password (min 8 chars, must contain uppercase, lowercase, number, and special char)',
-    example: 'SecurePass123!',
-    minLength: 8,
-  })
-  @IsString()
-  @IsNotEmpty()
-  @MinLength(8, { message: 'Password must be at least 8 characters long' })
-  @Matches(
-    /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]+$/,
-    {
-      message:
-        'Password must contain at least one uppercase letter, one lowercase letter, one number, and one special character',
-    },
-  )
-  password: string;
- 
-  @ApiProperty({
-    description: 'User first name',
-    example: 'John',
-    maxLength: 50,
-  })
-  @IsString()
-  @IsNotEmpty()
-  firstName: string;
- 
-  @ApiProperty({
-    description: 'User last name',
-    example: 'Doe',
-    maxLength: 50,
-  })
-  @IsString()
-  @IsNotEmpty()
-  lastName: string;
- 
-  @ApiProperty({
-    description: 'Stellar wallet public key (G...)',
-    example: 'GAA2M7F4E3C4D4E5F6G7H8I9J0K1L2M3N4O5P6Q7R8S9T0U1V2W3X4Y5Z6',
-    pattern: '^G[A-Z2-7]{55}$',
-  })
-  @IsString()
-  @IsNotEmpty()
-  walletAddress: string;
- 
-  @ApiPropertyOptional({
-    description: 'User role (defaults to USER)',
-    enum: UserRole,
-    example: UserRole.DONOR,
-  })
-  @IsOptional()
-  @IsEnum(UserRole, { message: 'Role must be either donor or creator' })
-  role?: UserRole;
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/auth/dto/resend-verification.dto.ts.html b/coverage/lcov-report/src/auth/dto/resend-verification.dto.ts.html deleted file mode 100644 index 2f114c6..0000000 --- a/coverage/lcov-report/src/auth/dto/resend-verification.dto.ts.html +++ /dev/null @@ -1,124 +0,0 @@ - - - - - - Code coverage report for src/auth/dto/resend-verification.dto.ts - - - - - - - - - -
-
-

All files / src/auth/dto resend-verification.dto.ts

-
- -
- 100% - Statements - 4/4 -
- - -
- 100% - Branches - 0/0 -
- - -
- 100% - Functions - 0/0 -
- - -
- 100% - Lines - 4/4 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -141x -1x -  -1x -  -  -  -  -  -  -  -1x -  - 
import { IsEmail, IsNotEmpty } from 'class-validator';
-import { ApiProperty } from '@nestjs/swagger';
- 
-export class ResendVerificationDto {
-  @ApiProperty({
-    description: 'User email address to resend verification to',
-    example: 'user@example.com',
-    format: 'email',
-  })
-  @IsEmail()
-  @IsNotEmpty()
-  email: string;
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/auth/dto/verify-email.dto.ts.html b/coverage/lcov-report/src/auth/dto/verify-email.dto.ts.html deleted file mode 100644 index 7baf851..0000000 --- a/coverage/lcov-report/src/auth/dto/verify-email.dto.ts.html +++ /dev/null @@ -1,121 +0,0 @@ - - - - - - Code coverage report for src/auth/dto/verify-email.dto.ts - - - - - - - - - -
-
-

All files / src/auth/dto verify-email.dto.ts

-
- -
- 100% - Statements - 4/4 -
- - -
- 100% - Branches - 0/0 -
- - -
- 100% - Functions - 0/0 -
- - -
- 100% - Lines - 4/4 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -131x -1x -  -1x -  -  -  -  -  -  -1x -  - 
import { IsNotEmpty, IsString } from 'class-validator';
-import { ApiProperty } from '@nestjs/swagger';
- 
-export class VerifyEmailDto {
-  @ApiProperty({
-    description: 'Email verification token sent to user email',
-    example: 'abc123def456',
-  })
-  @IsString()
-  @IsNotEmpty()
-  token: string;
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/auth/dtos/index.html b/coverage/lcov-report/src/auth/dtos/index.html deleted file mode 100644 index 4cf3342..0000000 --- a/coverage/lcov-report/src/auth/dtos/index.html +++ /dev/null @@ -1,176 +0,0 @@ - - - - - - Code coverage report for src/auth/dtos - - - - - - - - - -
-
-

All files src/auth/dtos

-
- -
- 0% - Statements - 0/27 -
- - -
- 0% - Branches - 0/4 -
- - -
- 100% - Functions - 0/0 -
- - -
- 0% - Lines - 0/27 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
login.dto.ts -
-
0%0/5100%0/0100%0/00%0/5
refresh-token.dto.ts -
-
0%0/4100%0/0100%0/00%0/4
register.dto.ts -
-
0%0/100%0/4100%0/00%0/10
resend-verification.dto.ts -
-
0%0/4100%0/0100%0/00%0/4
verify-email.dto.ts -
-
0%0/4100%0/0100%0/00%0/4
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/auth/dtos/login.dto.ts.html b/coverage/lcov-report/src/auth/dtos/login.dto.ts.html deleted file mode 100644 index baa2670..0000000 --- a/coverage/lcov-report/src/auth/dtos/login.dto.ts.html +++ /dev/null @@ -1,151 +0,0 @@ - - - - - - Code coverage report for src/auth/dtos/login.dto.ts - - - - - - - - - -
-
-

All files / src/auth/dtos login.dto.ts

-
- -
- 0% - Statements - 0/5 -
- - -
- 100% - Branches - 0/0 -
- - -
- 100% - Functions - 0/0 -
- - -
- 0% - Lines - 0/5 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { IsEmail, IsNotEmpty, IsString } from 'class-validator';
-import { ApiProperty } from '@nestjs/swagger';
- 
-export class LoginDto {
-  @ApiProperty({
-    description: 'User email address',
-    example: 'user@example.com',
-    format: 'email',
-  })
-  @IsEmail()
-  @IsNotEmpty()
-  email: string;
- 
-  @ApiProperty({
-    description: 'User password',
-    example: 'SecurePass123!',
-    minLength: 8,
-  })
-  @IsString()
-  @IsNotEmpty()
-  password: string;
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/auth/dtos/refresh-token.dto.ts.html b/coverage/lcov-report/src/auth/dtos/refresh-token.dto.ts.html deleted file mode 100644 index 4cfa6ab..0000000 --- a/coverage/lcov-report/src/auth/dtos/refresh-token.dto.ts.html +++ /dev/null @@ -1,121 +0,0 @@ - - - - - - Code coverage report for src/auth/dtos/refresh-token.dto.ts - - - - - - - - - -
-
-

All files / src/auth/dtos refresh-token.dto.ts

-
- -
- 0% - Statements - 0/4 -
- - -
- 100% - Branches - 0/0 -
- - -
- 100% - Functions - 0/0 -
- - -
- 0% - Lines - 0/4 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13  -  -  -  -  -  -  -  -  -  -  -  - 
import { IsNotEmpty, IsString } from 'class-validator';
-import { ApiProperty } from '@nestjs/swagger';
- 
-export class RefreshTokenDto {
-  @ApiProperty({
-    description: 'Refresh token for obtaining new access token',
-    example: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...',
-  })
-  @IsString()
-  @IsNotEmpty()
-  refreshToken: string;
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/auth/dtos/register.dto.ts.html b/coverage/lcov-report/src/auth/dtos/register.dto.ts.html deleted file mode 100644 index b8401df..0000000 --- a/coverage/lcov-report/src/auth/dtos/register.dto.ts.html +++ /dev/null @@ -1,313 +0,0 @@ - - - - - - Code coverage report for src/auth/dtos/register.dto.ts - - - - - - - - - -
-
-

All files / src/auth/dtos register.dto.ts

-
- -
- 0% - Statements - 0/10 -
- - -
- 0% - Branches - 0/4 -
- - -
- 100% - Functions - 0/0 -
- - -
- 0% - Lines - 0/10 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import {
-  IsEmail,
-  IsNotEmpty,
-  IsString,
-  MinLength,
-  IsEnum,
-  IsOptional,
-  Matches,
-} from 'class-validator';
-import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
-import { UserRole } from '../../users/entities/user.entity';
- 
-export class RegisterDto {
-  @ApiProperty({
-    description: 'User email address',
-    example: 'user@example.com',
-    format: 'email',
-  })
-  @IsEmail()
-  @IsNotEmpty()
-  email: string;
- 
-  @ApiProperty({
-    description:
-      'User password (min 8 chars, must contain uppercase, lowercase, number, and special char)',
-    example: 'SecurePass123!',
-    minLength: 8,
-  })
-  @IsString()
-  @IsNotEmpty()
-  @MinLength(8, { message: 'Password must be at least 8 characters long' })
-  @Matches(
-    /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]+$/,
-    {
-      message:
-        'Password must contain at least one uppercase letter, one lowercase letter, one number, and one special character',
-    },
-  )
-  password: string;
- 
-  @ApiProperty({
-    description: 'User first name',
-    example: 'John',
-    maxLength: 50,
-  })
-  @IsString()
-  @IsNotEmpty()
-  firstName: string;
- 
-  @ApiProperty({
-    description: 'User last name',
-    example: 'Doe',
-    maxLength: 50,
-  })
-  @IsString()
-  @IsNotEmpty()
-  lastName: string;
- 
-  @ApiProperty({
-    description: 'Stellar wallet public key (G...)',
-    example: 'GAA2M7F4E3C4D4E5F6G7H8I9J0K1L2M3N4O5P6Q7R8S9T0U1V2W3X4Y5Z6',
-    pattern: '^G[A-Z2-7]{55}$',
-  })
-  @IsString()
-  @IsNotEmpty()
-  walletAddress: string;
- 
-  @ApiPropertyOptional({
-    description: 'User role (defaults to USER)',
-    enum: UserRole,
-    example: UserRole.DONOR,
-  })
-  @IsOptional()
-  @IsEnum(UserRole, { message: 'Role must be either donor or creator' })
-  role?: UserRole;
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/auth/dtos/resend-verification.dto.ts.html b/coverage/lcov-report/src/auth/dtos/resend-verification.dto.ts.html deleted file mode 100644 index 2e84699..0000000 --- a/coverage/lcov-report/src/auth/dtos/resend-verification.dto.ts.html +++ /dev/null @@ -1,124 +0,0 @@ - - - - - - Code coverage report for src/auth/dtos/resend-verification.dto.ts - - - - - - - - - -
-
-

All files / src/auth/dtos resend-verification.dto.ts

-
- -
- 0% - Statements - 0/4 -
- - -
- 100% - Branches - 0/0 -
- - -
- 100% - Functions - 0/0 -
- - -
- 0% - Lines - 0/4 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { IsEmail, IsNotEmpty } from 'class-validator';
-import { ApiProperty } from '@nestjs/swagger';
- 
-export class ResendVerificationDto {
-  @ApiProperty({
-    description: 'User email address to resend verification to',
-    example: 'user@example.com',
-    format: 'email',
-  })
-  @IsEmail()
-  @IsNotEmpty()
-  email: string;
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/auth/dtos/verify-email.dto.ts.html b/coverage/lcov-report/src/auth/dtos/verify-email.dto.ts.html deleted file mode 100644 index 6957927..0000000 --- a/coverage/lcov-report/src/auth/dtos/verify-email.dto.ts.html +++ /dev/null @@ -1,121 +0,0 @@ - - - - - - Code coverage report for src/auth/dtos/verify-email.dto.ts - - - - - - - - - -
-
-

All files / src/auth/dtos verify-email.dto.ts

-
- -
- 0% - Statements - 0/4 -
- - -
- 100% - Branches - 0/0 -
- - -
- 100% - Functions - 0/0 -
- - -
- 0% - Lines - 0/4 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13  -  -  -  -  -  -  -  -  -  -  -  - 
import { IsNotEmpty, IsString } from 'class-validator';
-import { ApiProperty } from '@nestjs/swagger';
- 
-export class VerifyEmailDto {
-  @ApiProperty({
-    description: 'Email verification token sent to user email',
-    example: 'abc123def456',
-  })
-  @IsString()
-  @IsNotEmpty()
-  token: string;
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/auth/guard/index.html b/coverage/lcov-report/src/auth/guard/index.html deleted file mode 100644 index 4c70431..0000000 --- a/coverage/lcov-report/src/auth/guard/index.html +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - Code coverage report for src/auth/guard - - - - - - - - - -
-
-

All files src/auth/guard

-
- -
- 0% - Statements - 0/14 -
- - -
- 0% - Branches - 0/6 -
- - -
- 0% - Functions - 0/2 -
- - -
- 0% - Lines - 0/11 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
jwt-auth.guard.ts -
-
0%0/140%0/60%0/20%0/11
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/auth/guard/jwt-auth.guard.ts.html b/coverage/lcov-report/src/auth/guard/jwt-auth.guard.ts.html deleted file mode 100644 index c638092..0000000 --- a/coverage/lcov-report/src/auth/guard/jwt-auth.guard.ts.html +++ /dev/null @@ -1,157 +0,0 @@ - - - - - - Code coverage report for src/auth/guard/jwt-auth.guard.ts - - - - - - - - - -
-
-

All files / src/auth/guard jwt-auth.guard.ts

-
- -
- 0% - Statements - 0/14 -
- - -
- 0% - Branches - 0/6 -
- - -
- 0% - Functions - 0/2 -
- - -
- 0% - Lines - 0/11 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { ExecutionContext, Injectable } from '@nestjs/common';
-import { Reflector } from '@nestjs/core';
-import { AuthGuard } from '@nestjs/passport';
-import type { Observable } from 'rxjs';
-import { IS_PUBLIC_KEY } from '../decorators/public.decorator';
-import { JWT_STRATEGY } from '../strategies/jwt.strategy';
- 
-@Injectable()
-export class JwtAuthGuard extends AuthGuard(JWT_STRATEGY) {
-  constructor(private readonly reflector: Reflector) {
-    super();
-  }
- 
-  canActivate(
-    context: ExecutionContext,
-  ): boolean | Promise<boolean> | Observable<boolean> {
-    const isPublic = this.reflector.getAllAndOverride<boolean>(IS_PUBLIC_KEY, [
-      context.getHandler(),
-      context.getClass(),
-    ]);
-    if (isPublic) return true;
-    return super.canActivate(context);
-  }
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/auth/index.html b/coverage/lcov-report/src/auth/index.html deleted file mode 100644 index c7907e4..0000000 --- a/coverage/lcov-report/src/auth/index.html +++ /dev/null @@ -1,131 +0,0 @@ - - - - - - Code coverage report for src/auth - - - - - - - - - -
-
-

All files src/auth

-
- -
- 60.46% - Statements - 26/43 -
- - -
- 75% - Branches - 33/44 -
- - -
- 77.77% - Functions - 7/9 -
- - -
- 61.53% - Lines - 24/39 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
auth.controller.ts -
-
100%26/2675%33/44100%7/7100%24/24
auth.module.ts -
-
0%0/17100%0/00%0/20%0/15
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/auth/middleware/index.html b/coverage/lcov-report/src/auth/middleware/index.html deleted file mode 100644 index fd1bed4..0000000 --- a/coverage/lcov-report/src/auth/middleware/index.html +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - Code coverage report for src/auth/middleware - - - - - - - - - -
-
-

All files src/auth/middleware

-
- -
- 0% - Statements - 0/13 -
- - -
- 0% - Branches - 0/6 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/10 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
token-validation.middleware.ts -
-
0%0/130%0/60%0/10%0/10
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/auth/middleware/token-validation.middleware.ts.html b/coverage/lcov-report/src/auth/middleware/token-validation.middleware.ts.html deleted file mode 100644 index db4aaed..0000000 --- a/coverage/lcov-report/src/auth/middleware/token-validation.middleware.ts.html +++ /dev/null @@ -1,187 +0,0 @@ - - - - - - Code coverage report for src/auth/middleware/token-validation.middleware.ts - - - - - - - - - -
-
-

All files / src/auth/middleware token-validation.middleware.ts

-
- -
- 0% - Statements - 0/13 -
- - -
- 0% - Branches - 0/6 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/10 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import {
-  Injectable,
-  NestMiddleware,
-  UnauthorizedException,
-} from '@nestjs/common';
-import type { Request, Response, NextFunction } from 'express';
- 
-/**
- * Rejects structurally malformed Bearer tokens before they reach the guard.
- * Signature and expiry validation remain with JwtStrategy via passport-jwt.
- */
-@Injectable()
-export class TokenValidationMiddleware implements NestMiddleware {
-  use(req: Request, _res: Response, next: NextFunction): void {
-    const authHeader = req.headers['authorization'];
- 
-    if (!authHeader) return next(); // no token — guard decides (@Public or 401)
- 
-    if (!authHeader.startsWith('Bearer ')) {
-      throw new UnauthorizedException(
-        'Authorization header must use Bearer scheme.',
-      );
-    }
- 
-    const parts = authHeader.slice(7).split('.');
-    if (parts.length !== 3) {
-      throw new UnauthorizedException(
-        'Malformed JWT: must have three segments.',
-      );
-    }
- 
-    next();
-  }
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/auth/providers/auth.service.ts.html b/coverage/lcov-report/src/auth/providers/auth.service.ts.html deleted file mode 100644 index d30a3e5..0000000 --- a/coverage/lcov-report/src/auth/providers/auth.service.ts.html +++ /dev/null @@ -1,1570 +0,0 @@ - - - - - - Code coverage report for src/auth/providers/auth.service.ts - - - - - - - - - -
-
-

All files / src/auth/providers auth.service.ts

-
- -
- 7.78% - Statements - 13/167 -
- - -
- 9.67% - Branches - 9/93 -
- - -
- 0% - Functions - 0/13 -
- - -
- 6.66% - Lines - 11/165 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174 -175 -176 -177 -178 -179 -180 -181 -182 -183 -184 -185 -186 -187 -188 -189 -190 -191 -192 -193 -194 -195 -196 -197 -198 -199 -200 -201 -202 -203 -204 -205 -206 -207 -208 -209 -210 -211 -212 -213 -214 -215 -216 -217 -218 -219 -220 -221 -222 -223 -224 -225 -226 -227 -228 -229 -230 -231 -232 -233 -234 -235 -236 -237 -238 -239 -240 -241 -242 -243 -244 -245 -246 -247 -248 -249 -250 -251 -252 -253 -254 -255 -256 -257 -258 -259 -260 -261 -262 -263 -264 -265 -266 -267 -268 -269 -270 -271 -272 -273 -274 -275 -276 -277 -278 -279 -280 -281 -282 -283 -284 -285 -286 -287 -288 -289 -290 -291 -292 -293 -294 -295 -296 -297 -298 -299 -300 -301 -302 -303 -304 -305 -306 -307 -308 -309 -310 -311 -312 -313 -314 -315 -316 -317 -318 -319 -320 -321 -322 -323 -324 -325 -326 -327 -328 -329 -330 -331 -332 -333 -334 -335 -336 -337 -338 -339 -340 -341 -342 -343 -344 -345 -346 -347 -348 -349 -350 -351 -352 -353 -354 -355 -356 -357 -358 -359 -360 -361 -362 -363 -364 -365 -366 -367 -368 -369 -370 -371 -372 -373 -374 -375 -376 -377 -378 -379 -380 -381 -382 -383 -384 -385 -386 -387 -388 -389 -390 -391 -392 -393 -394 -395 -396 -397 -398 -399 -400 -401 -402 -403 -404 -405 -406 -407 -408 -409 -410 -411 -412 -413 -414 -415 -416 -417 -418 -419 -420 -421 -422 -423 -424 -425 -426 -427 -428 -429 -430 -431 -432 -433 -434 -435 -436 -437 -438 -439 -440 -441 -442 -443 -444 -445 -446 -447 -448 -449 -450 -451 -452 -453 -454 -455 -456 -457 -458 -459 -460 -461 -462 -463 -464 -465 -466 -467 -468 -469 -470 -471 -472 -473 -474 -475 -476 -477 -478 -479 -480 -481 -482 -483 -484 -485 -486 -487 -488 -489 -490 -491 -492 -493 -494 -495 -4961x -  -  -  -  -  -  -  -  -  -1x -1x -1x -1x -1x -1x -1x -  -  -  -1x -  -  -  -  -  -1x -  -  -  -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import {
-  Injectable,
-  UnauthorizedException,
-  ConflictException,
-  BadRequestException,
-  NotFoundException,
-  Inject,
-  Optional,
-  Logger,
-} from '@nestjs/common';
-import { JwtService } from '@nestjs/jwt';
-import { InjectRepository } from '@nestjs/typeorm';
-import { Repository } from 'typeorm';
-import * as bcrypt from 'bcrypt';
-import * as crypto from 'crypto';
-import { ConfigService } from '@nestjs/config';
-import { User } from 'src/users/entities/user.entity';
-import { ChangePasswordDto } from 'src/users/dto/change-password.dto';
-import { RegisterDto } from '../dto/register.dto';
-import { AuthResponseDto } from '../dto/auth-response.dto';
-import { UserRole } from 'src/common/enums/user-role.enum';
-import { LoginDto } from '../dto/login.dto';
-import { JwtPayload } from 'src/common/interfaces/auth.interface';
-import { VerifyEmailDto } from '../dto/verify-email.dto';
-import { ResendVerificationDto } from '../dto/resend-verification.dto';
-import { SubmitKYCDto } from 'src/users/dto/submit-kyc.dto';
-import { KYCStatus } from 'src/common/enums/kyc-status.enum';
-import { UpdateKYCDto } from 'src/users/dto/update-kyc.dto';
-import { RefreshTokenDto } from '../dto/refresh-token.dto';
- 
-@Injectable()
-export class AuthService {
-  private readonly logger = new Logger(AuthService.name);
- 
-  constructor(
-    @InjectRepository(User)
-    private userRepository: Repository<User>,
-    private jwtService: JwtService,
-    private configService: ConfigService,
-  ) {}
- 
-  // Change password for a given user id
-  public async changePassword(
-    userId: string,
-    changeDto: ChangePasswordDto,
-  ): Promise<{ message: string }> {
-    const user = await this.userRepository.findOne({ where: { id: userId } });
-    if (!user) {
-      throw new NotFoundException('User not found');
-    }
- 
-    const isCurrentValid = await bcrypt.compare(
-      changeDto.currentPassword,
-      user.password,
-    );
-    if (!isCurrentValid) {
-      throw new UnauthorizedException('Current password is incorrect');
-    }
- 
-    // Hash new password
-    const saltRounds = 10;
-    const hashed = await bcrypt.hash(changeDto.newPassword, saltRounds);
- 
-    // Update password and invalidate refresh tokens (clear refreshTokenHash)
-    user.password = hashed;
-    user.refreshTokenHash = null;
-    await this.userRepository.save(user);
- 
-    // Try to send confirmation email if an email service is registered (optional)
-    try {
-      if (
-        (this as any).emailService &&
-        typeof (this as any).emailService.sendPasswordChangedEmail ===
-          'function'
-      ) {
-        await (this as any).emailService.sendPasswordChangedEmail(
-          user.email,
-          user.firstName,
-        );
-      }
-    } catch (err) {
-      // Do not fail the password change if email sending fails
- 
-      console.warn('Failed to send password change email', err);
-    }
- 
-    return { message: 'Password changed successfully' };
-  }
- 
-  // Register a new user
-  public async register(registerDto: RegisterDto): Promise<AuthResponseDto> {
-    const existingUser = await this.userRepository.findOne({
-      where: { email: registerDto.email },
-    });
- 
-    if (existingUser) {
-      throw new ConflictException('User with this email already exists');
-    }
- 
-    const saltRounds = 10;
-    const hashedPassword = await bcrypt.hash(registerDto.password, saltRounds);
- 
-    const user = this.userRepository.create({
-      ...registerDto,
-      password: hashedPassword,
-      role: UserRole.USER,
-      isEmailVerified: false,
-    });
- 
-    await this.userRepository.save(user);
- 
-    // Note: Email integration temporarily disabled for server startup
-    // TODO: Re-enable email service after resolving dependency injection
-    this.logger.log(`User registered successfully: ${user.email}`);
- 
-    return this.generateTokens(user);
-  }
- 
-  // Login user and return JWT tokens
-  public async login(
-    loginDto: LoginDto,
-    request?: any,
-  ): Promise<AuthResponseDto> {
-    const user = await this.userRepository.findOne({
-      where: { email: loginDto.email },
-    });
- 
-    if (!user) {
-      throw new UnauthorizedException('Invalid credentials');
-    }
- 
-    const isPasswordValid = await bcrypt.compare(
-      loginDto.password,
-      user.password,
-    );
-    if (!isPasswordValid) {
-      throw new UnauthorizedException('Invalid credentials');
-    }
- 
-    // Note: Email integration temporarily disabled for server startup
-    // TODO: Re-enable email service after resolving dependency injection
-    this.logger.log(`User logged in successfully: ${user.email}`);
- 
-    return this.generateTokens(user);
-  }
- 
-  // Generate access and refresh tokens for a user
-  public async generateTokens(user: User): Promise<AuthResponseDto> {
-    const payload: JwtPayload = {
-      sub: user.id,
-      email: user.email,
-      role: user.role,
-      walletAddress: user.walletAddress ?? undefined,
-    };
- 
-    const [accessToken, refreshToken] = await Promise.all([
-      this.jwtService.signAsync(payload, {
-        secret: this.configService.getOrThrow<string>('jwtSecret'),
-        expiresIn: '15m',
-      }),
-      this.jwtService.signAsync(payload, {
-        secret: this.configService.getOrThrow<string>('jwtRefreshSecret'),
-        expiresIn: '7d',
-      }),
-    ]);
- 
-    // Store refresh token hash
-    const saltRounds = 10;
-    user.refreshTokenHash = await bcrypt.hash(refreshToken, saltRounds);
-    await this.userRepository.save(user);
- 
-    return {
-      accessToken,
-      refreshToken,
-      user: {
-        id: user.id,
-        email: user.email,
-        firstName: user.firstName,
-        lastName: user.lastName,
-        role: user.role,
-        walletAddress: user.walletAddress || '',
-        isEmailVerified: user.isEmailVerified,
-      },
-    };
-  }
- 
-  // Validate user from JWT payload (used by JwtStrategy)
-  public async validateUser(payload: JwtPayload): Promise<User> {
-    const user = await this.userRepository.findOne({
-      where: { id: payload.sub },
-    });
-    if (!user) {
-      throw new UnauthorizedException();
-    }
-    return user;
-  }
- 
-  // Verify email with token
-  public async verifyEmail(
-    verifyEmailDto: VerifyEmailDto,
-  ): Promise<{ message: string }> {
-    // Basic implementation for now to fix controller errors
-    const user = await this.userRepository.findOne({
-      where: { emailVerificationToken: verifyEmailDto.token },
-    });
- 
-    if (!user) {
-      throw new BadRequestException('Invalid or expired verification token');
-    }
- 
-    if (
-      user.emailVerificationTokenExpiry &&
-      user.emailVerificationTokenExpiry < new Date()
-    ) {
-      throw new BadRequestException('Verification token has expired');
-    }
- 
-    user.isEmailVerified = true;
-    user.emailVerificationToken = null;
-    user.emailVerificationTokenExpiry = null;
-    await this.userRepository.save(user);
- 
-    return { message: 'Email verified successfully' };
-  }
- 
-  // Resend email verification
-  public async resendVerification(
-    resendVerificationDto: ResendVerificationDto,
-  ): Promise<{ message: string }> {
-    const user = await this.userRepository.findOne({
-      where: { email: resendVerificationDto.email },
-    });
- 
-    if (!user) {
-      throw new NotFoundException('User not found');
-    }
- 
-    if (user.isEmailVerified) {
-      throw new BadRequestException('Email is already verified');
-    }
- 
-    // Logic to update token and send email would go here
-    return { message: 'Verification email resent' };
-  }
- 
-  // Forgot password - send reset email with token
-  public async forgotPassword(email: string): Promise<{ message: string }> {
-    const user = await this.userRepository.findOne({ where: { email } });
- 
-    // Always return success for security reasons
-    if (!user) {
-      return {
-        message:
-          'If an account with that email exists, a reset link has been sent',
-      };
-    }
- 
-    const selector = crypto.randomBytes(16).toString('hex');
-    const validator = crypto.randomBytes(32).toString('hex');
-    const saltRounds = 10;
-    const validatorHash = await bcrypt.hash(validator, saltRounds);
- 
-    user.resetPasswordTokenSelector = selector;
-    user.resetPasswordTokenHash = validatorHash;
-    user.resetPasswordTokenExpiry = new Date(Date.now() + 60 * 60 * 1000); // 1 hour
-    await this.userRepository.save(user);
- 
-    const token = `${selector}.${validator}`;
- 
-    try {
-      if (
-        (this as any).emailService &&
-        typeof (this as any).emailService.sendPasswordResetEmail === 'function'
-      ) {
-        await (this as any).emailService.sendPasswordResetEmail(
-          user.email,
-          token,
-          user.firstName,
-        );
-      }
-    } catch (err) {
-      // do not reveal email failures
- 
-      console.warn('Failed to send password reset email', err);
-    }
- 
-    return {
-      message:
-        'If an account with that email exists, a reset link has been sent',
-    };
-  }
- 
-  // Reset password using token
-  public async resetPassword(
-    token: string,
-    newPassword: string,
-  ): Promise<{ message: string }> {
-    const parts = token.split('.');
-    if (parts.length !== 2) {
-      throw new BadRequestException('Invalid token');
-    }
- 
-    const [selector, validator] = parts;
-    const user = await this.userRepository.findOne({
-      where: { resetPasswordTokenSelector: selector },
-    });
-    if (
-      !user ||
-      !user.resetPasswordTokenHash ||
-      !user.resetPasswordTokenExpiry
-    ) {
-      throw new BadRequestException('Invalid or expired token');
-    }
- 
-    if (user.resetPasswordTokenExpiry < new Date()) {
-      throw new BadRequestException('Invalid or expired token');
-    }
- 
-    const isValid = await bcrypt.compare(
-      validator,
-      user.resetPasswordTokenHash,
-    );
-    if (!isValid) {
-      throw new BadRequestException('Invalid or expired token');
-    }
- 
-    // Hash new password and clear reset token fields
-    const saltRounds = 10;
-    const hashed = await bcrypt.hash(newPassword, saltRounds);
-    user.password = hashed;
-    user.resetPasswordTokenSelector = null;
-    user.resetPasswordTokenHash = null;
-    user.resetPasswordTokenExpiry = null;
-    // Invalidate refresh tokens/sessions
-    user.refreshTokenHash = null;
-    await this.userRepository.save(user);
- 
-    try {
-      // @ts-ignore
-      if (
-        (this as any).emailService &&
-        typeof (this as any).emailService.sendPasswordChangedEmail ===
-          'function'
-      ) {
-        // @ts-ignore
-        await (this as any).emailService.sendPasswordChangedEmail(
-          user.email,
-          user.firstName,
-        );
-      }
-    } catch (err) {
-      console.warn('Failed to send password changed email', err);
-    }
- 
-    return { message: 'Password reset successfully' };
-  }
- 
-  // Submit KYC documents for verification
-  public async submitKYC(
-    userId: string,
-    submitDto: SubmitKYCDto,
-  ): Promise<{ message: string }> {
-    const user = await this.userRepository.findOne({ where: { id: userId } });
-    if (!user) {
-      throw new NotFoundException('User not found');
-    }
- 
-    user.kycStatus = KYCStatus.PENDING;
-    user.kycDocumentUrl = submitDto.documentUrl;
-    user.kycSubmittedAt = new Date();
-    user.kycRejectionReason = null;
-    await this.userRepository.save(user);
- 
-    try {
-      // @ts-ignore
-      if (
-        (this as any).emailService &&
-        typeof (this as any).emailService.sendKYCSubmittedEmail === 'function'
-      ) {
-        // @ts-ignore
-        await (this as any).emailService.sendKYCSubmittedEmail(
-          user.email,
-          user.firstName,
-        );
-      }
-    } catch (err) {
-      console.warn('Failed to send KYC submitted email', err);
-    }
- 
-    return { message: 'KYC documents submitted for review' };
-  }
- 
-  // Admin endpoint to update KYC status
-  public async updateKYCStatus(
-    userId: string,
-    updateDto: UpdateKYCDto,
-  ): Promise<{ message: string }> {
-    const user = await this.userRepository.findOne({ where: { id: userId } });
-    if (!user) {
-      throw new NotFoundException('User not found');
-    }
- 
-    const oldStatus = user.kycStatus;
-    user.kycStatus = updateDto.status;
- 
-    if (updateDto.status === KYCStatus.APPROVED) {
-      user.kycVerifiedAt = new Date();
-      user.kycRejectionReason = null;
-    } else if (updateDto.status === KYCStatus.REJECTED) {
-      user.kycRejectionReason = updateDto.rejectionReason || 'KYC rejected';
-    }
- 
-    await this.userRepository.save(user);
- 
-    try {
-      // @ts-ignore
-      if (
-        (this as any).emailService &&
-        typeof (this as any).emailService.sendKYCStatusChangeEmail ===
-          'function'
-      ) {
-        // @ts-ignore
-        await (this as any).emailService.sendKYCStatusChangeEmail(
-          user.email,
-          user.firstName,
-          updateDto.status,
-          updateDto.rejectionReason || undefined,
-        );
-      }
-    } catch (err) {
-      console.warn('Failed to send KYC status change email', err);
-    }
- 
-    return { message: `KYC status updated to ${updateDto.status}` };
-  }
- 
-  // Refresh access token using refresh token (token rotation)
-  public async refreshToken(
-    refreshTokenDto: RefreshTokenDto,
-  ): Promise<AuthResponseDto> {
-    try {
-      // Verify the refresh token
-      const payload = this.jwtService.verify(refreshTokenDto.refreshToken, {
-        secret: this.configService.getOrThrow<string>('jwtRefreshSecret'),
-      });
- 
-      // Find the user
-      const user = await this.userRepository.findOne({
-        where: { id: payload.sub },
-      });
-      if (!user) {
-        throw new UnauthorizedException('Invalid refresh token');
-      }
- 
-      // Check if the refresh token hash matches (token rotation)
-      if (!user.refreshTokenHash) {
-        this.logger.warn(
-          `User ${user.id} attempted to use refresh token but no hash stored`,
-        );
-        throw new UnauthorizedException('Invalid refresh token');
-      }
- 
-      const isTokenValid = await bcrypt.compare(
-        refreshTokenDto.refreshToken,
-        user.refreshTokenHash,
-      );
-      if (!isTokenValid) {
-        // Possible token reuse attack - invalidate all tokens for this user
-        this.logger.warn(
-          `Possible token reuse attack detected for user ${user.id}`,
-        );
-        user.refreshTokenHash = null;
-        await this.userRepository.save(user);
-        throw new UnauthorizedException('Invalid refresh token');
-      }
- 
-      // Generate new tokens (token rotation)
-      const newTokens = await this.generateTokens(user);
- 
-      // Invalidate the old refresh token by clearing the hash
-      // The new token hash is already set in generateTokens
-      this.logger.debug(`Token rotated successfully for user ${user.id}`);
- 
-      return newTokens;
-    } catch (error) {
-      if (
-        error.name === 'JsonWebTokenError' ||
-        error.name === 'TokenExpiredError'
-      ) {
-        throw new UnauthorizedException('Invalid or expired refresh token');
-      }
-      throw error;
-    }
-  }
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/auth/providers/index.html b/coverage/lcov-report/src/auth/providers/index.html deleted file mode 100644 index 2cbc936..0000000 --- a/coverage/lcov-report/src/auth/providers/index.html +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - Code coverage report for src/auth/providers - - - - - - - - - -
-
-

All files src/auth/providers

-
- -
- 7.78% - Statements - 13/167 -
- - -
- 9.67% - Branches - 9/93 -
- - -
- 0% - Functions - 0/13 -
- - -
- 6.66% - Lines - 11/165 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
auth.service.ts -
-
7.78%13/1679.67%9/930%0/136.66%11/165
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/auth/strategies/index.html b/coverage/lcov-report/src/auth/strategies/index.html deleted file mode 100644 index 18bbcf8..0000000 --- a/coverage/lcov-report/src/auth/strategies/index.html +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - Code coverage report for src/auth/strategies - - - - - - - - - -
-
-

All files src/auth/strategies

-
- -
- 0% - Statements - 0/13 -
- - -
- 0% - Branches - 0/6 -
- - -
- 0% - Functions - 0/2 -
- - -
- 0% - Lines - 0/11 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
jwt.strategy.ts -
-
0%0/130%0/60%0/20%0/11
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/auth/strategies/jwt.strategy.ts.html b/coverage/lcov-report/src/auth/strategies/jwt.strategy.ts.html deleted file mode 100644 index 4b42ffd..0000000 --- a/coverage/lcov-report/src/auth/strategies/jwt.strategy.ts.html +++ /dev/null @@ -1,160 +0,0 @@ - - - - - - Code coverage report for src/auth/strategies/jwt.strategy.ts - - - - - - - - - -
-
-

All files / src/auth/strategies jwt.strategy.ts

-
- -
- 0% - Statements - 0/13 -
- - -
- 0% - Branches - 0/6 -
- - -
- 0% - Functions - 0/2 -
- - -
- 0% - Lines - 0/11 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { ExtractJwt, Strategy } from 'passport-jwt';
-import { PassportStrategy } from '@nestjs/passport';
-import { Injectable, UnauthorizedException } from '@nestjs/common';
-import { ConfigService } from '@nestjs/config';
-import { JwtPayload } from '../../common/interfaces/auth.interface';
- 
-export const JWT_STRATEGY = 'jwt';
- 
-@Injectable()
-export class JwtStrategy extends PassportStrategy(Strategy, JWT_STRATEGY) {
-  constructor(private configService: ConfigService) {
-    super({
-      jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
-      ignoreExpiration: false, // expired tokens → 401 before validate() is called
-      secretOrKey: configService.getOrThrow<string>('jwtSecret'),
-    });
-  }
- 
-  async validate(payload: JwtPayload): Promise<JwtPayload> {
-    if (!payload.sub) {
-      throw new UnauthorizedException();
-    }
-    return payload; // attached to req.user
-  }
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/common/decorators/current-user.decorator.ts.html b/coverage/lcov-report/src/common/decorators/current-user.decorator.ts.html deleted file mode 100644 index ec0d4d2..0000000 --- a/coverage/lcov-report/src/common/decorators/current-user.decorator.ts.html +++ /dev/null @@ -1,124 +0,0 @@ - - - - - - Code coverage report for src/common/decorators/current-user.decorator.ts - - - - - - - - - -
-
-

All files / src/common/decorators current-user.decorator.ts

-
- -
- 0% - Statements - 0/5 -
- - -
- 0% - Branches - 0/2 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/5 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { createParamDecorator, ExecutionContext } from '@nestjs/common';
-import type { Request } from 'express';
-import type { JwtPayload } from '../interfaces/auth.interface';
- 
-export const CurrentUser = createParamDecorator(
-  (field: keyof JwtPayload | undefined, ctx: ExecutionContext) => {
-    const request = ctx
-      .switchToHttp()
-      .getRequest<Request & { user: JwtPayload }>();
-    const user = request.user;
-    return field ? user?.[field] : user;
-  },
-);
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/common/decorators/index.html b/coverage/lcov-report/src/common/decorators/index.html deleted file mode 100644 index 0436414..0000000 --- a/coverage/lcov-report/src/common/decorators/index.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - Code coverage report for src/common/decorators - - - - - - - - - -
-
-

All files src/common/decorators

-
- -
- 0% - Statements - 0/15 -
- - -
- 0% - Branches - 0/2 -
- - -
- 0% - Functions - 0/3 -
- - -
- 0% - Lines - 0/11 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
current-user.decorator.ts -
-
0%0/50%0/20%0/10%0/5
public.decorator.ts -
-
0%0/5100%0/00%0/10%0/3
roles.decorator.ts -
-
0%0/5100%0/00%0/10%0/3
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/common/decorators/public.decorator.ts.html b/coverage/lcov-report/src/common/decorators/public.decorator.ts.html deleted file mode 100644 index 64f7997..0000000 --- a/coverage/lcov-report/src/common/decorators/public.decorator.ts.html +++ /dev/null @@ -1,97 +0,0 @@ - - - - - - Code coverage report for src/common/decorators/public.decorator.ts - - - - - - - - - -
-
-

All files / src/common/decorators public.decorator.ts

-
- -
- 0% - Statements - 0/5 -
- - -
- 100% - Branches - 0/0 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/3 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5  -  -  -  - 
import { SetMetadata } from '@nestjs/common';
- 
-export const IS_PUBLIC_KEY = 'isPublic';
-export const Public = () => SetMetadata(IS_PUBLIC_KEY, true);
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/common/decorators/roles.decorator.ts.html b/coverage/lcov-report/src/common/decorators/roles.decorator.ts.html deleted file mode 100644 index 6a40460..0000000 --- a/coverage/lcov-report/src/common/decorators/roles.decorator.ts.html +++ /dev/null @@ -1,100 +0,0 @@ - - - - - - Code coverage report for src/common/decorators/roles.decorator.ts - - - - - - - - - -
-
-

All files / src/common/decorators roles.decorator.ts

-
- -
- 0% - Statements - 0/5 -
- - -
- 100% - Branches - 0/0 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/3 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6  -  -  -  -  - 
import { SetMetadata } from '@nestjs/common';
-import { UserRole } from '../enums/user-role.enum';
- 
-export const ROLES_KEY = 'roles';
-export const Roles = (...roles: UserRole[]) => SetMetadata(ROLES_KEY, roles);
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/common/enums/index.html b/coverage/lcov-report/src/common/enums/index.html deleted file mode 100644 index f976704..0000000 --- a/coverage/lcov-report/src/common/enums/index.html +++ /dev/null @@ -1,176 +0,0 @@ - - - - - - Code coverage report for src/common/enums - - - - - - - - - -
-
-

All files src/common/enums

-
- -
- 32.25% - Statements - 10/31 -
- - -
- 40% - Branches - 4/10 -
- - -
- 40% - Functions - 2/5 -
- - -
- 32.25% - Lines - 10/31 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
kyc-status.enum.ts -
-
100%5/5100%2/2100%1/1100%5/5
project-category.enum.ts -
-
0%0/90%0/20%0/10%0/9
project-status.enum.ts -
-
0%0/80%0/20%0/10%0/8
projects-sortBy.enum.ts -
-
0%0/40%0/20%0/10%0/4
user-role.enum.ts -
-
100%5/5100%2/2100%1/1100%5/5
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/common/enums/kyc-status.enum.ts.html b/coverage/lcov-report/src/common/enums/kyc-status.enum.ts.html deleted file mode 100644 index 71c7010..0000000 --- a/coverage/lcov-report/src/common/enums/kyc-status.enum.ts.html +++ /dev/null @@ -1,103 +0,0 @@ - - - - - - Code coverage report for src/common/enums/kyc-status.enum.ts - - - - - - - - - -
-
-

All files / src/common/enums kyc-status.enum.ts

-
- -
- 100% - Statements - 5/5 -
- - -
- 100% - Branches - 2/2 -
- - -
- 100% - Functions - 1/1 -
- - -
- 100% - Lines - 5/5 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -71x -1x -1x -1x -1x -  - 
export enum KYCStatus {
-  NONE = 'none',
-  PENDING = 'pending',
-  APPROVED = 'approved',
-  REJECTED = 'rejected',
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/common/enums/project-category.enum.ts.html b/coverage/lcov-report/src/common/enums/project-category.enum.ts.html deleted file mode 100644 index 66880d1..0000000 --- a/coverage/lcov-report/src/common/enums/project-category.enum.ts.html +++ /dev/null @@ -1,115 +0,0 @@ - - - - - - Code coverage report for src/common/enums/project-category.enum.ts - - - - - - - - - -
-
-

All files / src/common/enums project-category.enum.ts

-
- -
- 0% - Statements - 0/9 -
- - -
- 0% - Branches - 0/2 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/9 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11  -  -  -  -  -  -  -  -  -  - 
export enum ProjectCategory {
-  HEALTH = 'health',
-  EDUCATION = 'education',
-  DISASTER_RELIEF = 'disaster_relief',
-  ENVIRONMENT = 'environment',
-  COMMUNITY = 'community',
-  TECHNOLOGY = 'technology',
-  ARTS = 'arts',
-  OTHER = 'other',
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/common/enums/project-status.enum.ts.html b/coverage/lcov-report/src/common/enums/project-status.enum.ts.html deleted file mode 100644 index 2c5e4c4..0000000 --- a/coverage/lcov-report/src/common/enums/project-status.enum.ts.html +++ /dev/null @@ -1,112 +0,0 @@ - - - - - - Code coverage report for src/common/enums/project-status.enum.ts - - - - - - - - - -
-
-

All files / src/common/enums project-status.enum.ts

-
- -
- 0% - Statements - 0/8 -
- - -
- 0% - Branches - 0/2 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/8 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10  -  -  -  -  -  -  -  -  - 
export enum ProjectStatus {
-  DRAFT = 'draft',
-  PENDING = 'pending',
-  APPROVED = 'approved',
-  ACTIVE = 'active',
-  PAUSED = 'paused',
-  COMPLETED = 'completed',
-  REJECTED = 'rejected',
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/common/enums/projects-sortBy.enum.ts.html b/coverage/lcov-report/src/common/enums/projects-sortBy.enum.ts.html deleted file mode 100644 index 9680679..0000000 --- a/coverage/lcov-report/src/common/enums/projects-sortBy.enum.ts.html +++ /dev/null @@ -1,100 +0,0 @@ - - - - - - Code coverage report for src/common/enums/projects-sortBy.enum.ts - - - - - - - - - -
-
-

All files / src/common/enums projects-sortBy.enum.ts

-
- -
- 0% - Statements - 0/4 -
- - -
- 0% - Branches - 0/2 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/4 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6  -  -  -  -  - 
export enum ProjectSortBy {
-  NEWEST = 'newest',
-  MOST_FUNDED = 'most_funded',
-  ENDING_SOON = 'ending_soon',
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/common/enums/user-role.enum.ts.html b/coverage/lcov-report/src/common/enums/user-role.enum.ts.html deleted file mode 100644 index 15e3166..0000000 --- a/coverage/lcov-report/src/common/enums/user-role.enum.ts.html +++ /dev/null @@ -1,103 +0,0 @@ - - - - - - Code coverage report for src/common/enums/user-role.enum.ts - - - - - - - - - -
-
-

All files / src/common/enums user-role.enum.ts

-
- -
- 100% - Statements - 5/5 -
- - -
- 100% - Branches - 2/2 -
- - -
- 100% - Functions - 1/1 -
- - -
- 100% - Lines - 5/5 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -71x -1x -1x -1x -1x -  - 
export enum UserRole {
-  USER = 'user',
-  ADMIN = 'admin',
-  CREATOR = 'creator',
-  DONOR = 'donor',
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/common/filters/http-exeption.filter.ts.html b/coverage/lcov-report/src/common/filters/http-exeption.filter.ts.html deleted file mode 100644 index 12613ab..0000000 --- a/coverage/lcov-report/src/common/filters/http-exeption.filter.ts.html +++ /dev/null @@ -1,256 +0,0 @@ - - - - - - Code coverage report for src/common/filters/http-exeption.filter.ts - - - - - - - - - -
-
-

All files / src/common/filters http-exeption.filter.ts

-
- -
- 0% - Statements - 0/24 -
- - -
- 0% - Branches - 0/16 -
- - -
- 0% - Functions - 0/3 -
- - -
- 0% - Lines - 0/22 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import {
-  ExceptionFilter,
-  Catch,
-  ArgumentsHost,
-  HttpException,
-  HttpStatus,
-  Inject,
-} from '@nestjs/common';
-import { Request, Response } from 'express';
-import { LoggerService } from '../../logger/logger.service';
- 
-@Catch(HttpException)
-export class HttpExceptionFilter implements ExceptionFilter {
-  constructor(@Inject(LoggerService) private readonly logger?: LoggerService) {}
-  catch(exception: HttpException, host: ArgumentsHost) {
-    const ctx = host.switchToHttp();
-    const response = ctx.getResponse<Response>();
-    const request = ctx.getRequest<Request>();
- 
-    const status = exception.getStatus();
-    const exceptionResponse = exception.getResponse();
- 
-    let message = 'Error occurred';
-    let errors = null;
- 
-    if (typeof exceptionResponse === 'string') {
-      message = exceptionResponse;
-    } else if (typeof exceptionResponse === 'object') {
-      const res: any = exceptionResponse;
-      message = res.message || message;
-      errors = Array.isArray(res.message)
-        ? res.message.map((msg: string) => ({
-            field: msg.split(' ')[0],
-            message: msg,
-          }))
-        : null;
-    }
- 
-    // Log the exception with stack trace in non-production
-    if (this.logger) {
-      const trace = (exception as any).stack || null;
-      this.logger.error(`${status} - ${message} - ${request.url}`, trace, {
-        path: request.url,
-        method: request.method,
-      });
-    }
- 
-    response.status(status).json({
-      success: false,
-      statusCode: status,
-      message,
-      errors,
-      timestamp: new Date().toISOString(),
-      path: request.url,
-    });
-  }
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/common/filters/index.html b/coverage/lcov-report/src/common/filters/index.html deleted file mode 100644 index f2c3436..0000000 --- a/coverage/lcov-report/src/common/filters/index.html +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - Code coverage report for src/common/filters - - - - - - - - - -
-
-

All files src/common/filters

-
- -
- 0% - Statements - 0/24 -
- - -
- 0% - Branches - 0/16 -
- - -
- 0% - Functions - 0/3 -
- - -
- 0% - Lines - 0/22 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
http-exeption.filter.ts -
-
0%0/240%0/160%0/30%0/22
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/common/guards/file-upload.guard.ts.html b/coverage/lcov-report/src/common/guards/file-upload.guard.ts.html deleted file mode 100644 index c87a871..0000000 --- a/coverage/lcov-report/src/common/guards/file-upload.guard.ts.html +++ /dev/null @@ -1,178 +0,0 @@ - - - - - - Code coverage report for src/common/guards/file-upload.guard.ts - - - - - - - - - -
-
-

All files / src/common/guards file-upload.guard.ts

-
- -
- 0% - Statements - 0/15 -
- - -
- 0% - Branches - 0/6 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/13 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { Injectable, ExecutionContext, BadRequestException } from '@nestjs/common';
- 
-@Injectable()
-export class FileUploadGuard {
-  canActivate(context: ExecutionContext): boolean {
-    const request = context.switchToHttp().getRequest();
-    const file = request.file;
- 
-    if (!file) {
-      throw new BadRequestException('No file uploaded');
-    }
- 
-    // Check file type
-    const allowedMimeTypes = ['image/jpeg', 'image/png', 'image/webp'];
-    if (!allowedMimeTypes.includes(file.mimetype)) {
-      throw new BadRequestException(
-        `Invalid file type. Allowed types: ${allowedMimeTypes.join(', ')}`,
-      );
-    }
- 
-    // Check file size (5MB max)
-    const maxSize = 5 * 1024 * 1024; // 5MB in bytes
-    if (file.size > maxSize) {
-      throw new BadRequestException(
-        `File too large. Maximum size is ${maxSize / (1024 * 1024)}MB`,
-      );
-    }
- 
-    return true;
-  }
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/common/guards/index.html b/coverage/lcov-report/src/common/guards/index.html deleted file mode 100644 index 825851e..0000000 --- a/coverage/lcov-report/src/common/guards/index.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - Code coverage report for src/common/guards - - - - - - - - - -
-
-

All files src/common/guards

-
- -
- 0% - Statements - 0/44 -
- - -
- 0% - Branches - 0/20 -
- - -
- 0% - Functions - 0/6 -
- - -
- 0% - Lines - 0/36 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
file-upload.guard.ts -
-
0%0/150%0/60%0/10%0/13
jwt-auth.guard.ts -
-
0%0/140%0/60%0/20%0/11
roles.guard.ts -
-
0%0/150%0/80%0/30%0/12
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/common/guards/jwt-auth.guard.ts.html b/coverage/lcov-report/src/common/guards/jwt-auth.guard.ts.html deleted file mode 100644 index 22aeb69..0000000 --- a/coverage/lcov-report/src/common/guards/jwt-auth.guard.ts.html +++ /dev/null @@ -1,157 +0,0 @@ - - - - - - Code coverage report for src/common/guards/jwt-auth.guard.ts - - - - - - - - - -
-
-

All files / src/common/guards jwt-auth.guard.ts

-
- -
- 0% - Statements - 0/14 -
- - -
- 0% - Branches - 0/6 -
- - -
- 0% - Functions - 0/2 -
- - -
- 0% - Lines - 0/11 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { ExecutionContext, Injectable } from '@nestjs/common';
-import { Reflector } from '@nestjs/core';
-import { AuthGuard } from '@nestjs/passport';
-import type { Observable } from 'rxjs';
-import { IS_PUBLIC_KEY } from '../decorators/public.decorator';
-import { JWT_STRATEGY } from '../../auth/strategies/jwt.strategy';
- 
-@Injectable()
-export class JwtAuthGuard extends AuthGuard(JWT_STRATEGY) {
-  constructor(private readonly reflector: Reflector) {
-    super();
-  }
- 
-  canActivate(
-    context: ExecutionContext,
-  ): boolean | Promise<boolean> | Observable<boolean> {
-    const isPublic = this.reflector.getAllAndOverride<boolean>(IS_PUBLIC_KEY, [
-      context.getHandler(),
-      context.getClass(),
-    ]);
-    if (isPublic) return true;
-    return super.canActivate(context);
-  }
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/common/guards/roles.guard.ts.html b/coverage/lcov-report/src/common/guards/roles.guard.ts.html deleted file mode 100644 index e30a529..0000000 --- a/coverage/lcov-report/src/common/guards/roles.guard.ts.html +++ /dev/null @@ -1,166 +0,0 @@ - - - - - - Code coverage report for src/common/guards/roles.guard.ts - - - - - - - - - -
-
-

All files / src/common/guards roles.guard.ts

-
- -
- 0% - Statements - 0/15 -
- - -
- 0% - Branches - 0/8 -
- - -
- 0% - Functions - 0/3 -
- - -
- 0% - Lines - 0/12 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { Injectable, CanActivate, ExecutionContext } from '@nestjs/common';
-import { Reflector } from '@nestjs/core';
-import { ROLES_KEY } from '../decorators/roles.decorator';
-import { UserRole } from '../enums/user-role.enum';
- 
-@Injectable()
-export class RolesGuard implements CanActivate {
-  constructor(private reflector: Reflector) {}
- 
-  canActivate(context: ExecutionContext): boolean {
-    const requiredRoles = this.reflector.getAllAndOverride<UserRole[]>(
-      ROLES_KEY,
-      [context.getHandler(), context.getClass()],
-    );
- 
-    if (!requiredRoles) {
-      return true;
-    }
- 
-    const { user } = context.switchToHttp().getRequest();
-    if (!user) {
-      return false;
-    }
- 
-    return requiredRoles.some((role) => user.role === role);
-  }
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/common/http-exeption.filter.ts.html b/coverage/lcov-report/src/common/http-exeption.filter.ts.html deleted file mode 100644 index e0ef0b6..0000000 --- a/coverage/lcov-report/src/common/http-exeption.filter.ts.html +++ /dev/null @@ -1,256 +0,0 @@ - - - - - - Code coverage report for src/common/http-exeption.filter.ts - - - - - - - - - -
-
-

All files / src/common http-exeption.filter.ts

-
- -
- 0% - Statements - 0/24 -
- - -
- 0% - Branches - 0/16 -
- - -
- 0% - Functions - 0/3 -
- - -
- 0% - Lines - 0/22 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import {
-  ExceptionFilter,
-  Catch,
-  ArgumentsHost,
-  HttpException,
-  HttpStatus,
-  Inject,
-} from '@nestjs/common';
-import { Request, Response } from 'express';
-import { LoggerService } from '../logger/logger.service';
- 
-@Catch(HttpException)
-export class HttpExceptionFilter implements ExceptionFilter {
-  constructor(@Inject(LoggerService) private readonly logger?: LoggerService) {}
-  catch(exception: HttpException, host: ArgumentsHost) {
-    const ctx = host.switchToHttp();
-    const response = ctx.getResponse<Response>();
-    const request = ctx.getRequest<Request>();
- 
-    const status = exception.getStatus();
-    const exceptionResponse = exception.getResponse();
- 
-    let message = 'Error occurred';
-    let errors = null;
- 
-    if (typeof exceptionResponse === 'string') {
-      message = exceptionResponse;
-    } else if (typeof exceptionResponse === 'object') {
-      const res: any = exceptionResponse;
-      message = res.message || message;
-      errors = Array.isArray(res.message)
-        ? res.message.map((msg: string) => ({
-            field: msg.split(' ')[0],
-            message: msg,
-          }))
-        : null;
-    }
- 
-    // Log the exception with stack trace in non-production
-    if (this.logger) {
-      const trace = (exception as any).stack || null;
-      this.logger.error(`${status} - ${message} - ${request.url}`, trace, {
-        path: request.url,
-        method: request.method,
-      });
-    }
- 
-    response.status(status).json({
-      success: false,
-      statusCode: status,
-      message,
-      errors,
-      timestamp: new Date().toISOString(),
-      path: request.url,
-    });
-  }
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/common/index.html b/coverage/lcov-report/src/common/index.html deleted file mode 100644 index afea076..0000000 --- a/coverage/lcov-report/src/common/index.html +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - Code coverage report for src/common - - - - - - - - - -
-
-

All files src/common

-
- -
- 0% - Statements - 0/24 -
- - -
- 0% - Branches - 0/16 -
- - -
- 0% - Functions - 0/3 -
- - -
- 0% - Lines - 0/22 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
http-exeption.filter.ts -
-
0%0/240%0/160%0/30%0/22
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/common/interceptors/index.html b/coverage/lcov-report/src/common/interceptors/index.html deleted file mode 100644 index d605c14..0000000 --- a/coverage/lcov-report/src/common/interceptors/index.html +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - Code coverage report for src/common/interceptors - - - - - - - - - -
-
-

All files src/common/interceptors

-
- -
- 0% - Statements - 0/13 -
- - -
- 100% - Branches - 0/0 -
- - -
- 0% - Functions - 0/2 -
- - -
- 0% - Lines - 0/11 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
logging.interceptor.ts -
-
0%0/13100%0/00%0/20%0/11
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/common/interceptors/logging.interceptor.ts.html b/coverage/lcov-report/src/common/interceptors/logging.interceptor.ts.html deleted file mode 100644 index ece5ce6..0000000 --- a/coverage/lcov-report/src/common/interceptors/logging.interceptor.ts.html +++ /dev/null @@ -1,175 +0,0 @@ - - - - - - Code coverage report for src/common/interceptors/logging.interceptor.ts - - - - - - - - - -
-
-

All files / src/common/interceptors logging.interceptor.ts

-
- -
- 0% - Statements - 0/13 -
- - -
- 100% - Branches - 0/0 -
- - -
- 0% - Functions - 0/2 -
- - -
- 0% - Lines - 0/11 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import {
-  Injectable,
-  NestInterceptor,
-  ExecutionContext,
-  CallHandler,
-  Logger,
-} from '@nestjs/common';
-import { Observable, tap } from 'rxjs';
- 
-@Injectable()
-export class LoggingInterceptor implements NestInterceptor {
-  private logger = new Logger('HTTP');
- 
-  intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
-    const request = context.switchToHttp().getRequest();
-    const { method, originalUrl } = request;
-    const now = Date.now();
- 
-    return next.handle().pipe(
-      tap(() => {
-        const response = context.switchToHttp().getResponse();
-        const { statusCode } = response;
- 
-        this.logger.log(
-          `${method} ${originalUrl} ${statusCode} - ${Date.now() - now}ms`,
-        );
-      }),
-    );
-  }
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/common/middleware/index.html b/coverage/lcov-report/src/common/middleware/index.html deleted file mode 100644 index f61da07..0000000 --- a/coverage/lcov-report/src/common/middleware/index.html +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - Code coverage report for src/common/middleware - - - - - - - - - -
-
-

All files src/common/middleware

-
- -
- 0% - Statements - 0/13 -
- - -
- 0% - Branches - 0/6 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/10 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
token-validation.middleware.ts -
-
0%0/130%0/60%0/10%0/10
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/common/middleware/token-validation.middleware.ts.html b/coverage/lcov-report/src/common/middleware/token-validation.middleware.ts.html deleted file mode 100644 index bb63bd5..0000000 --- a/coverage/lcov-report/src/common/middleware/token-validation.middleware.ts.html +++ /dev/null @@ -1,175 +0,0 @@ - - - - - - Code coverage report for src/common/middleware/token-validation.middleware.ts - - - - - - - - - -
-
-

All files / src/common/middleware token-validation.middleware.ts

-
- -
- 0% - Statements - 0/13 -
- - -
- 0% - Branches - 0/6 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/10 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import {
-  Injectable,
-  NestMiddleware,
-  UnauthorizedException,
-} from '@nestjs/common';
-import type { Request, Response, NextFunction } from 'express';
- 
-@Injectable()
-export class TokenValidationMiddleware implements NestMiddleware {
-  use(req: Request, _res: Response, next: NextFunction): void {
-    const authHeader = req.headers['authorization'];
- 
-    if (!authHeader) return next(); // no token — guard decides (@Public or 401)
- 
-    if (!authHeader.startsWith('Bearer ')) {
-      throw new UnauthorizedException(
-        'Authorization header must use Bearer scheme.',
-      );
-    }
- 
-    const parts = authHeader.slice(7).split('.');
-    if (parts.length !== 3) {
-      throw new UnauthorizedException(
-        'Malformed JWT: must have three segments.',
-      );
-    }
- 
-    next();
-  }
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/common/services/file-upload.service.ts.html b/coverage/lcov-report/src/common/services/file-upload.service.ts.html deleted file mode 100644 index 5a9d9b6..0000000 --- a/coverage/lcov-report/src/common/services/file-upload.service.ts.html +++ /dev/null @@ -1,319 +0,0 @@ - - - - - - Code coverage report for src/common/services/file-upload.service.ts - - - - - - - - - -
-
-

All files / src/common/services file-upload.service.ts

-
- -
- 0% - Statements - 0/29 -
- - -
- 0% - Branches - 0/5 -
- - -
- 0% - Functions - 0/4 -
- - -
- 0% - Lines - 0/27 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { Injectable, Logger } from '@nestjs/common';
-import { S3Client, PutObjectCommand, DeleteObjectCommand } from '@aws-sdk/client-s3';
-import { getSignedUrl } from '@aws-sdk/s3-request-presigner';
-import { ConfigService } from '@nestjs/config';
-import { randomUUID } from 'crypto';
-import { File } from 'buffer';
- 
-@Injectable()
-export class FileUploadService {
-  private readonly logger = new Logger(FileUploadService.name);
-  private readonly s3Client: S3Client;
- 
-  constructor(private configService: ConfigService) {
-    this.s3Client = new S3Client({
-      region: this.configService.get<string>('AWS_REGION', 'us-east-1'),
-      credentials: {
-        accessKeyId: this.configService.getOrThrow<string>('AWS_ACCESS_KEY_ID'),
-        secretAccessKey: this.configService.getOrThrow<string>('AWS_SECRET_ACCESS_KEY'),
-      },
-    });
-  }
- 
-  async uploadFile(file: Express.Multer.File, projectId: string): Promise<string> {
-    const fileExtension = file.originalname.split('.').pop();
-    const fileName = `${randomUUID()}.${fileExtension}`;
-    const key = `projects/${projectId}/images/${fileName}`;
- 
-    try {
-      await this.s3Client.send(
-        new PutObjectCommand({
-          Bucket: this.configService.getOrThrow<string>('AWS_S3_BUCKET'),
-          Key: key,
-          Body: file.buffer,
-          ContentType: file.mimetype,
-          ACL: 'public-read',
-        }),
-      );
- 
-      const publicUrl = `https://${this.configService.getOrThrow<string>('AWS_S3_BUCKET')}.s3.${this.configService.get<string>('AWS_REGION', 'us-east-1')}.amazonaws.com/${key}`;
-      
-      this.logger.log(`File uploaded successfully: ${fileName}`);
-      return publicUrl;
-    } catch (error) {
-      this.logger.error(`Failed to upload file: ${error.message}`);
-      throw error;
-    }
-  }
- 
-  async deleteFile(imageUrl: string): Promise<void> {
-    try {
-      const url = new URL(imageUrl);
-      const key = url.pathname.substring(1); // Remove leading '/'
- 
-      await this.s3Client.send(
-        new DeleteObjectCommand({
-          Bucket: this.configService.getOrThrow<string>('AWS_S3_BUCKET'),
-          Key: key,
-        }),
-      );
- 
-      this.logger.log(`File deleted successfully: ${key}`);
-    } catch (error) {
-      this.logger.error(`Failed to delete file: ${error.message}`);
-      throw error;
-    }
-  }
- 
-  generatePresignedUrl(key: string, expiresIn: number = 3600): Promise<string> {
-    return getSignedUrl(
-      this.s3Client,
-      new PutObjectCommand({
-        Bucket: this.configService.getOrThrow<string>('AWS_S3_BUCKET'),
-        Key: key,
-      }),
-      { expiresIn },
-    );
-  }
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/common/services/index.html b/coverage/lcov-report/src/common/services/index.html deleted file mode 100644 index cf25e10..0000000 --- a/coverage/lcov-report/src/common/services/index.html +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - Code coverage report for src/common/services - - - - - - - - - -
-
-

All files src/common/services

-
- -
- 0% - Statements - 0/29 -
- - -
- 0% - Branches - 0/5 -
- - -
- 0% - Functions - 0/4 -
- - -
- 0% - Lines - 0/27 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
file-upload.service.ts -
-
0%0/290%0/50%0/40%0/27
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/database/app-config.service.ts.html b/coverage/lcov-report/src/database/app-config.service.ts.html deleted file mode 100644 index 4b7cf67..0000000 --- a/coverage/lcov-report/src/database/app-config.service.ts.html +++ /dev/null @@ -1,187 +0,0 @@ - - - - - - Code coverage report for src/database/app-config.service.ts - - - - - - - - - -
-
-

All files / src/database app-config.service.ts

-
- -
- 0% - Statements - 0/12 -
- - -
- 0% - Branches - 0/4 -
- - -
- 0% - Functions - 0/7 -
- - -
- 0% - Lines - 0/10 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { Injectable } from '@nestjs/common';
-import { ConfigService } from '@nestjs/config';
-import { AppConfig } from './type';
- 
-@Injectable()
-export class AppConfigService {
-  constructor(private readonly configService: ConfigService<AppConfig>) {}
- 
-  get port(): number {
-    return this.configService.get<number>('port', { infer: true })!;
-  }
- 
-  get databaseUrl(): string {
-    return this.configService.get<string>('databaseUrl', { infer: true })!;
-  }
- 
-  get jwtSecret(): string {
-    return this.configService.get<string>('jwtSecret', { infer: true })!;
-  }
- 
-  get jwtExpiresIn(): string {
-    return this.configService.get<string>('jwtExpiresIn', { infer: true })!;
-  }
- 
-  get stellarNetwork(): 'TESTNET' | 'PUBLIC' {
-    return this.configService.get('stellarNetwork', { infer: true })!;
-  }
- 
-  get stellarHorizonUrl(): string {
-    return this.configService.get<string>('stellarHorizonUrl', {
-      infer: true,
-    })!;
-  }
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/database/config.ts.html b/coverage/lcov-report/src/database/config.ts.html deleted file mode 100644 index d90dcc1..0000000 --- a/coverage/lcov-report/src/database/config.ts.html +++ /dev/null @@ -1,166 +0,0 @@ - - - - - - Code coverage report for src/database/config.ts - - - - - - - - - -
-
-

All files / src/database config.ts

-
- -
- 0% - Statements - 0/2 -
- - -
- 0% - Branches - 0/14 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/1 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { AppConfig } from './type';
- 
-export default (): AppConfig => ({
-  port: parseInt(process.env.PORT ?? '3000', 10),
-  databaseUrl: process.env.DATABASE_URL!,
-  jwtSecret: process.env.JWT_SECRET!,
-  jwtRefreshSecret: process.env.JWT_REFRESH_SECRET || 'refresh-secret',
-  jwtExpiresIn: process.env.JWT_EXPIRES_IN ?? '1d',
-  stellarNetwork:
-    (process.env.STELLAR_NETWORK as 'TESTNET' | 'PUBLIC') || 'TESTNET',
-  stellarHorizonUrl:
-    process.env.STELLAR_HORIZON_URL || 'https://horizon-testnet.stellar.org',
-  mailHost: process.env.MAIL_HOST,
-  mailPort: process.env.MAIL_PORT
-    ? parseInt(process.env.MAIL_PORT, 10)
-    : undefined,
-  mailSecure: process.env.MAIL_SECURE === 'true',
-  mailUser: process.env.MAIL_USER,
-  mailPass: process.env.MAIL_PASS,
-  mailFrom: process.env.MAIL_FROM,
-  mailSubjectPrefix: process.env.MAIL_SUBJECT_PREFIX,
-  appName: process.env.APP_NAME,
-  frontendUrl: process.env.FRONTEND_URL,
-  enableSwagger:
-    process.env.ENABLE_SWAGGER === 'true' ||
-    process.env.NODE_ENV !== 'production',
-});
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/database/data-source.ts.html b/coverage/lcov-report/src/database/data-source.ts.html deleted file mode 100644 index 35190f3..0000000 --- a/coverage/lcov-report/src/database/data-source.ts.html +++ /dev/null @@ -1,136 +0,0 @@ - - - - - - Code coverage report for src/database/data-source.ts - - - - - - - - - -
-
-

All files / src/database data-source.ts

-
- -
- 0% - Statements - 0/4 -
- - -
- 0% - Branches - 0/2 -
- - -
- 100% - Functions - 0/0 -
- - -
- 0% - Lines - 0/4 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { DataSource } from 'typeorm';
-import * as dotenv from 'dotenv';
- 
-dotenv.config();
- 
-export default new DataSource({
-  type: 'postgres',
-  host: process.env.DB_HOST,
-  port: parseInt(process.env.DB_PORT || '5432', 10),
-  username: process.env.DB_USERNAME,
-  password: process.env.DB_PASSWORD,
-  database: process.env.DB_NAME,
-  entities: ['dist/**/*.entity{.ts,.js}'],
-  migrations: ['src/database/migrations/*.ts'],
-  synchronize: false,
-  logging: true,
-});
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/database/database.module.ts.html b/coverage/lcov-report/src/database/database.module.ts.html deleted file mode 100644 index 5e806b7..0000000 --- a/coverage/lcov-report/src/database/database.module.ts.html +++ /dev/null @@ -1,154 +0,0 @@ - - - - - - Code coverage report for src/database/database.module.ts - - - - - - - - - -
-
-

All files / src/database database.module.ts

-
- -
- 0% - Statements - 0/7 -
- - -
- 100% - Branches - 0/0 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/5 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { Module, Logger } from '@nestjs/common';
-import { TypeOrmModule } from '@nestjs/typeorm';
-import { ConfigModule, ConfigService } from '@nestjs/config';
- 
-@Module({
-  imports: [
-    TypeOrmModule.forRootAsync({
-      imports: [ConfigModule],
-      inject: [ConfigService],
-      useFactory: async (configService: ConfigService) => ({
-        type: 'postgres',
-        host: configService.getOrThrow<string>('DB_HOST'),
-        port: parseInt(configService.getOrThrow<string>('DB_PORT'), 10),
-        username: configService.getOrThrow<string>('DB_USERNAME'),
-        password: configService.getOrThrow<string>('DB_PASSWORD'),
-        database: configService.getOrThrow<string>('DB_NAME'),
-        autoLoadEntities: true,
-        synchronize: true,
-      }),
-    }),
-  ],
-})
-export class DatabaseModule {}
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/database/env.validation.ts.html b/coverage/lcov-report/src/database/env.validation.ts.html deleted file mode 100644 index 46a99ca..0000000 --- a/coverage/lcov-report/src/database/env.validation.ts.html +++ /dev/null @@ -1,145 +0,0 @@ - - - - - - Code coverage report for src/database/env.validation.ts - - - - - - - - - -
-
-

All files / src/database env.validation.ts

-
- -
- 0% - Statements - 0/2 -
- - -
- 100% - Branches - 0/0 -
- - -
- 100% - Functions - 0/0 -
- - -
- 0% - Lines - 0/2 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import * as Joi from 'joi';
- 
-export const validationSchema = Joi.object({
-  PORT: Joi.number().default(3000),
- 
-  DATABASE_URL: Joi.string().uri().required(),
- 
-  JWT_SECRET: Joi.string().min(10).required(),
-  JWT_EXPIRES_IN: Joi.string().default('1d'),
- 
-  STELLAR_NETWORK: Joi.string().valid('TESTNET', 'PUBLIC').required(),
- 
-  STELLAR_HORIZON_URL: Joi.string().uri().required(),
- 
-  NODE_ENV: Joi.string()
-    .valid('development', 'production', 'test')
-    .default('development'),
- 
-  ENABLE_SWAGGER: Joi.boolean().default(false),
-});
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/database/index.html b/coverage/lcov-report/src/database/index.html deleted file mode 100644 index 911178f..0000000 --- a/coverage/lcov-report/src/database/index.html +++ /dev/null @@ -1,176 +0,0 @@ - - - - - - Code coverage report for src/database - - - - - - - - - -
-
-

All files src/database

-
- -
- 0% - Statements - 0/27 -
- - -
- 0% - Branches - 0/20 -
- - -
- 0% - Functions - 0/9 -
- - -
- 0% - Lines - 0/22 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
app-config.service.ts -
-
0%0/120%0/40%0/70%0/10
config.ts -
-
0%0/20%0/140%0/10%0/1
data-source.ts -
-
0%0/40%0/2100%0/00%0/4
database.module.ts -
-
0%0/7100%0/00%0/10%0/5
env.validation.ts -
-
0%0/2100%0/0100%0/00%0/2
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/database/migrations/1711382400000-CreateDonationsTable.ts.html b/coverage/lcov-report/src/database/migrations/1711382400000-CreateDonationsTable.ts.html deleted file mode 100644 index 58869a3..0000000 --- a/coverage/lcov-report/src/database/migrations/1711382400000-CreateDonationsTable.ts.html +++ /dev/null @@ -1,466 +0,0 @@ - - - - - - Code coverage report for src/database/migrations/1711382400000-CreateDonationsTable.ts - - - - - - - - - -
-
-

All files / src/database/migrations 1711382400000-CreateDonationsTable.ts

-
- -
- 0% - Statements - 0/26 -
- - -
- 0% - Branches - 0/10 -
- - -
- 0% - Functions - 0/6 -
- - -
- 0% - Lines - 0/22 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { MigrationInterface, QueryRunner, Table, TableForeignKey, TableIndex } from 'typeorm';
- 
-export class CreateDonationsTable1711382400000 implements MigrationInterface {
-  public async up(queryRunner: QueryRunner): Promise<void> {
-    await queryRunner.createTable(
-      new Table({
-        name: 'donations',
-        columns: [
-          {
-            name: 'id',
-            type: 'uuid',
-            isPrimary: true,
-            generationStrategy: 'uuid',
-            default: 'uuid_generate_v4()',
-          },
-          {
-            name: 'projectId',
-            type: 'uuid',
-          },
-          {
-            name: 'donorId',
-            type: 'uuid',
-            isNullable: true,
-          },
-          {
-            name: 'amount',
-            type: 'decimal',
-            precision: 18,
-            scale: 7,
-          },
-          {
-            name: 'assetType',
-            type: 'varchar',
-            default: "'XLM'",
-          },
-          {
-            name: 'transactionHash',
-            type: 'varchar',
-            isNullable: true,
-            isUnique: true,
-          },
-          {
-            name: 'isAnonymous',
-            type: 'boolean',
-            default: false,
-          },
-          {
-            name: 'createdAt',
-            type: 'timestamp',
-            default: 'CURRENT_TIMESTAMP',
-          },
-        ],
-      }),
-      true,
-    );
- 
-    // Create indexes
-    await queryRunner.createIndex(
-      'donations',
-      new TableIndex({
-        name: 'IDX_donations_project_id',
-        columnNames: ['projectId'],
-      }),
-    );
- 
-    await queryRunner.createIndex(
-      'donations',
-      new TableIndex({
-        name: 'IDX_donations_transaction_hash',
-        columnNames: ['transactionHash'],
-      }),
-    );
- 
-    // Create foreign keys
-    await queryRunner.createForeignKey(
-      'donations',
-      new TableForeignKey({
-        name: 'FK_donations_project',
-        columnNames: ['projectId'],
-        referencedTableName: 'projects',
-        referencedColumnNames: ['id'],
-        onDelete: 'CASCADE',
-      }),
-    );
- 
-    await queryRunner.createForeignKey(
-      'donations',
-      new TableForeignKey({
-        name: 'FK_donations_donor',
-        columnNames: ['donorId'],
-        referencedTableName: 'users',
-        referencedColumnNames: ['id'],
-        onDelete: 'SET NULL',
-      }),
-    );
-  }
- 
-  public async down(queryRunner: QueryRunner): Promise<void> {
-    const table = await queryRunner.getTable('donations');
-    
-    if (table) {
-      // Drop foreign keys
-      const projectForeignKey = table.foreignKeys.find(fk => fk.name === 'FK_donations_project');
-      if (projectForeignKey) {
-        await queryRunner.dropForeignKey('donations', projectForeignKey);
-      }
- 
-      const donorForeignKey = table.foreignKeys.find(fk => fk.name === 'FK_donations_donor');
-      if (donorForeignKey) {
-        await queryRunner.dropForeignKey('donations', donorForeignKey);
-      }
- 
-      // Drop indexes
-      const projectIdIndex = table.indices.find(idx => idx.name === 'IDX_donations_project_id');
-      if (projectIdIndex) {
-        await queryRunner.dropIndex('donations', projectIdIndex);
-      }
- 
-      const transactionHashIndex = table.indices.find(idx => idx.name === 'IDX_donations_transaction_hash');
-      if (transactionHashIndex) {
-        await queryRunner.dropIndex('donations', transactionHashIndex);
-      }
-    }
- 
-    await queryRunner.dropTable('donations');
-  }
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/database/migrations/index.html b/coverage/lcov-report/src/database/migrations/index.html deleted file mode 100644 index 3abca64..0000000 --- a/coverage/lcov-report/src/database/migrations/index.html +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - Code coverage report for src/database/migrations - - - - - - - - - -
-
-

All files src/database/migrations

-
- -
- 0% - Statements - 0/26 -
- - -
- 0% - Branches - 0/10 -
- - -
- 0% - Functions - 0/6 -
- - -
- 0% - Lines - 0/22 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
1711382400000-CreateDonationsTable.ts -
-
0%0/260%0/100%0/60%0/22
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/donations/donations.controller.ts.html b/coverage/lcov-report/src/donations/donations.controller.ts.html deleted file mode 100644 index 81a286e..0000000 --- a/coverage/lcov-report/src/donations/donations.controller.ts.html +++ /dev/null @@ -1,448 +0,0 @@ - - - - - - Code coverage report for src/donations/donations.controller.ts - - - - - - - - - -
-
-

All files / src/donations donations.controller.ts

-
- -
- 0% - Statements - 0/30 -
- - -
- 0% - Branches - 0/18 -
- - -
- 0% - Functions - 0/11 -
- - -
- 0% - Lines - 0/28 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import {
-  Controller,
-  Get,
-  Post,
-  Body,
-  Patch,
-  Param,
-  Delete,
-  Query,
-  ParseUUIDPipe,
-} from '@nestjs/common';
-import { ApiTags, ApiOperation, ApiResponse, ApiBearerAuth, ApiQuery } from '@nestjs/swagger';
-import { DonationsService } from './providers/donations.service';
-import { CreateDonationDto } from './dto/create-donation.dto';
-import { UpdateDonationDto } from './dto/update-donation.dto';
-import { DonationResponseDto } from './dto/donation-response.dto';
- 
-@ApiTags('Donations')
-@Controller('donations')
-export class DonationsController {
-  constructor(private readonly donationsService: DonationsService) {}
- 
-  @Post()
-  @ApiBearerAuth()
-  @ApiOperation({ summary: 'Create a new donation' })
-  @ApiResponse({ status: 201, type: DonationResponseDto })
-  @ApiResponse({ status: 400, description: 'Bad request - Invalid data' })
-  @ApiResponse({ status: 409, description: 'Conflict - Transaction hash already exists' })
-  create(@Body() createDonationDto: CreateDonationDto) {
-    return this.donationsService.create(createDonationDto);
-  }
- 
-  @Get()
-  @ApiOperation({ summary: 'Get all donations with pagination' })
-  @ApiResponse({ status: 200, description: 'List of donations' })
-  @ApiQuery({ name: 'page', required: false, type: Number, example: 1 })
-  @ApiQuery({ name: 'limit', required: false, type: Number, example: 10 })
-  findAll(
-    @Query('page', new ParseUUIDPipe({ optional: true })) page: number = 1,
-    @Query('limit', new ParseUUIDPipe({ optional: true })) limit: number = 10,
-  ) {
-    return this.donationsService.findAll(page, limit);
-  }
- 
-  @Get(':id')
-  @ApiOperation({ summary: 'Get donation by ID' })
-  @ApiResponse({ status: 200, type: DonationResponseDto })
-  @ApiResponse({ status: 404, description: 'Donation not found' })
-  findOne(@Param('id', ParseUUIDPipe) id: string) {
-    return this.donationsService.findOne(id);
-  }
- 
-  @Get('project/:projectId')
-  @ApiOperation({ summary: 'Get donations for a specific project' })
-  @ApiResponse({ status: 200, description: 'List of project donations' })
-  @ApiQuery({ name: 'page', required: false, type: Number, example: 1 })
-  @ApiQuery({ name: 'limit', required: false, type: Number, example: 10 })
-  findByProject(
-    @Param('projectId', ParseUUIDPipe) projectId: string,
-    @Query('page') page: number = 1,
-    @Query('limit') limit: number = 10,
-  ) {
-    return this.donationsService.findByProject(projectId, page, limit);
-  }
- 
-  @Get('donor/:donorId')
-  @ApiOperation({ summary: 'Get donations by a specific donor' })
-  @ApiResponse({ status: 200, description: 'List of donor donations' })
-  @ApiQuery({ name: 'page', required: false, type: Number, example: 1 })
-  @ApiQuery({ name: 'limit', required: false, type: Number, example: 10 })
-  findByDonor(
-    @Param('donorId', ParseUUIDPipe) donorId: string,
-    @Query('page') page: number = 1,
-    @Query('limit') limit: number = 10,
-  ) {
-    return this.donationsService.findByDonor(donorId, page, limit);
-  }
- 
-  @Get('transaction/:hash')
-  @ApiOperation({ summary: 'Get donation by transaction hash' })
-  @ApiResponse({ status: 200, type: DonationResponseDto })
-  @ApiResponse({ status: 404, description: 'Donation not found' })
-  findByTransactionHash(@Param('hash') hash: string) {
-    return this.donationsService.findByTransactionHash(hash);
-  }
- 
-  @Patch(':id')
-  @ApiBearerAuth()
-  @ApiOperation({ summary: 'Update a donation' })
-  @ApiResponse({ status: 200, type: DonationResponseDto })
-  @ApiResponse({ status: 404, description: 'Donation not found' })
-  update(
-    @Param('id', ParseUUIDPipe) id: string,
-    @Body() updateDonationDto: UpdateDonationDto,
-  ) {
-    return this.donationsService.update(id, updateDonationDto);
-  }
- 
-  @Delete(':id')
-  @ApiBearerAuth()
-  @ApiOperation({ summary: 'Delete a donation' })
-  @ApiResponse({ status: 200, description: 'Donation deleted successfully' })
-  @ApiResponse({ status: 404, description: 'Donation not found' })
-  remove(@Param('id', ParseUUIDPipe) id: string) {
-    return this.donationsService.remove(id);
-  }
- 
-  @Get('analytics/project/:projectId/total')
-  @ApiOperation({ summary: 'Get total donations amount for a project' })
-  @ApiResponse({ status: 200, description: 'Total donations amount' })
-  getTotalForProject(@Param('projectId', ParseUUIDPipe) projectId: string) {
-    return this.donationsService.getTotalDonationsForProject(projectId);
-  }
- 
-  @Get('analytics/project/:projectId/count')
-  @ApiOperation({ summary: 'Get donation count for a project' })
-  @ApiResponse({ status: 200, description: 'Donation count' })
-  getCountForProject(@Param('projectId', ParseUUIDPipe) projectId: string) {
-    return this.donationsService.getDonationCountForProject(projectId);
-  }
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/donations/donations.module.ts.html b/coverage/lcov-report/src/donations/donations.module.ts.html deleted file mode 100644 index a877cc6..0000000 --- a/coverage/lcov-report/src/donations/donations.module.ts.html +++ /dev/null @@ -1,136 +0,0 @@ - - - - - - Code coverage report for src/donations/donations.module.ts - - - - - - - - - -
-
-

All files / src/donations donations.module.ts

-
- -
- 0% - Statements - 0/10 -
- - -
- 100% - Branches - 0/0 -
- - -
- 100% - Functions - 0/0 -
- - -
- 0% - Lines - 0/8 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { Module } from '@nestjs/common';
-import { TypeOrmModule } from '@nestjs/typeorm';
-import { DonationsController } from './donations.controller';
-import { DonationsService } from './providers/donations.service';
-import { Donation } from './entities/donation.entity';
-import { Project } from '../projects/entities/project.entity';
-import { User } from '../users/entities/user.entity';
- 
-@Module({
-  imports: [
-    TypeOrmModule.forFeature([Donation, Project, User]),
-  ],
-  controllers: [DonationsController],
-  providers: [DonationsService],
-  exports: [DonationsService, TypeOrmModule],
-})
-export class DonationsModule {}
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/donations/dto/create-donation.dto.ts.html b/coverage/lcov-report/src/donations/dto/create-donation.dto.ts.html deleted file mode 100644 index bba7d5c..0000000 --- a/coverage/lcov-report/src/donations/dto/create-donation.dto.ts.html +++ /dev/null @@ -1,172 +0,0 @@ - - - - - - Code coverage report for src/donations/dto/create-donation.dto.ts - - - - - - - - - -
-
-

All files / src/donations/dto create-donation.dto.ts

-
- -
- 0% - Statements - 0/9 -
- - -
- 100% - Branches - 0/0 -
- - -
- 100% - Functions - 0/0 -
- - -
- 0% - Lines - 0/8 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { IsNotEmpty, IsNumber, IsString, IsOptional, Min } from 'class-validator';
-import { ApiProperty } from '@nestjs/swagger';
- 
-export class CreateDonationDto {
-  @ApiProperty({ example: 'project-uuid', description: 'Project ID to donate to' })
-  @IsNotEmpty()
-  @IsString()
-  projectId: string;
- 
-  @ApiProperty({ example: 100, description: 'Donation amount' })
-  @IsNotEmpty()
-  @IsNumber()
-  @Min(0.0000001)
-  amount: number;
- 
-  @ApiProperty({ example: 'XLM', description: 'Asset type for donation', default: 'XLM' })
-  @IsOptional()
-  @IsString()
-  assetType?: string;
- 
-  @ApiProperty({ example: 'transaction-hash-xyz', description: 'Blockchain transaction hash' })
-  @IsNotEmpty()
-  @IsString()
-  transactionHash: string;
- 
-  @ApiProperty({ example: false, description: 'Whether donation is anonymous', default: false })
-  @IsOptional()
-  isAnonymous?: boolean = false;
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/donations/dto/donation-response.dto.ts.html b/coverage/lcov-report/src/donations/dto/donation-response.dto.ts.html deleted file mode 100644 index ed8c459..0000000 --- a/coverage/lcov-report/src/donations/dto/donation-response.dto.ts.html +++ /dev/null @@ -1,208 +0,0 @@ - - - - - - Code coverage report for src/donations/dto/donation-response.dto.ts - - - - - - - - - -
-
-

All files / src/donations/dto donation-response.dto.ts

-
- -
- 0% - Statements - 0/11 -
- - -
- 0% - Branches - 0/4 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/11 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { ApiProperty } from '@nestjs/swagger';
-import { Donation } from '../entities/donation.entity';
- 
-export class DonationResponseDto {
-  @ApiProperty({ example: 'donation-uuid', description: 'Donation ID' })
-  id: string;
- 
-  @ApiProperty({ example: 'project-uuid', description: 'Project ID' })
-  projectId: string;
- 
-  @ApiProperty({ example: 'donor-uuid', nullable: true, description: 'Donor ID' })
-  donorId: string | null;
- 
-  @ApiProperty({ example: 100, description: 'Donation amount' })
-  amount: number;
- 
-  @ApiProperty({ example: 'XLM', description: 'Asset type' })
-  assetType: string;
- 
-  @ApiProperty({ example: 'transaction-hash-xyz', nullable: true, description: 'Transaction hash' })
-  transactionHash: string | null;
- 
-  @ApiProperty({ example: false, description: 'Whether donation is anonymous' })
-  isAnonymous: boolean;
- 
-  @ApiProperty({ example: '2024-01-01T00:00:00Z', description: 'Creation timestamp' })
-  createdAt: Date;
- 
-  static fromEntity(donation: Donation): DonationResponseDto {
-    return {
-      id: donation.id,
-      projectId: donation.projectId,
-      donorId: donation.donorId,
-      amount: donation.amount,
-      assetType: donation.assetType,
-      transactionHash: donation.transactionHash,
-      isAnonymous: donation.isAnonymous,
-      createdAt: donation.createdAt,
-    };
-  }
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/donations/dto/index.html b/coverage/lcov-report/src/donations/dto/index.html deleted file mode 100644 index 219b6c1..0000000 --- a/coverage/lcov-report/src/donations/dto/index.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - Code coverage report for src/donations/dto - - - - - - - - - -
-
-

All files src/donations/dto

-
- -
- 0% - Statements - 0/23 -
- - -
- 0% - Branches - 0/4 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/22 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
create-donation.dto.ts -
-
0%0/9100%0/0100%0/00%0/8
donation-response.dto.ts -
-
0%0/110%0/40%0/10%0/11
update-donation.dto.ts -
-
0%0/3100%0/0100%0/00%0/3
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/donations/dto/update-donation.dto.ts.html b/coverage/lcov-report/src/donations/dto/update-donation.dto.ts.html deleted file mode 100644 index cd2aa6a..0000000 --- a/coverage/lcov-report/src/donations/dto/update-donation.dto.ts.html +++ /dev/null @@ -1,97 +0,0 @@ - - - - - - Code coverage report for src/donations/dto/update-donation.dto.ts - - - - - - - - - -
-
-

All files / src/donations/dto update-donation.dto.ts

-
- -
- 0% - Statements - 0/3 -
- - -
- 100% - Branches - 0/0 -
- - -
- 100% - Functions - 0/0 -
- - -
- 0% - Lines - 0/3 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5  -  -  -  - 
import { PartialType } from '@nestjs/swagger';
-import { CreateDonationDto } from './create-donation.dto';
- 
-export class UpdateDonationDto extends PartialType(CreateDonationDto) {}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/donations/entities/donation.entity.ts.html b/coverage/lcov-report/src/donations/entities/donation.entity.ts.html deleted file mode 100644 index 98badf2..0000000 --- a/coverage/lcov-report/src/donations/entities/donation.entity.ts.html +++ /dev/null @@ -1,241 +0,0 @@ - - - - - - Code coverage report for src/donations/entities/donation.entity.ts - - - - - - - - - -
-
-

All files / src/donations/entities donation.entity.ts

-
- -
- 0% - Statements - 0/19 -
- - -
- 0% - Branches - 0/8 -
- - -
- 0% - Functions - 0/3 -
- - -
- 0% - Lines - 0/16 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import {
-  Entity,
-  PrimaryGeneratedColumn,
-  Column,
-  CreateDateColumn,
-  ManyToOne,
-  JoinColumn,
-  Index,
-  Unique,
-} from 'typeorm';
-import { User } from '../../users/entities/user.entity';
-import { Project } from '../../projects/entities/project.entity';
- 
-@Entity('donations')
-@Index('IDX_donations_project_id', ['projectId'])
-@Index('IDX_donations_transaction_hash', ['transactionHash'])
-@Unique('UQ_donations_transaction_hash', ['transactionHash'])
-export class Donation {
-  @PrimaryGeneratedColumn('uuid')
-  id: string;
- 
-  @Column()
-  projectId: string;
- 
-  @ManyToOne(() => Project, (project) => project.donations, {
-    onDelete: 'CASCADE',
-  })
-  @JoinColumn({ name: 'projectId' })
-  project: Project;
- 
-  @Column({ nullable: true })
-  donorId: string | null;
- 
-  @ManyToOne(() => User, { nullable: true, eager: false, onDelete: 'SET NULL' })
-  @JoinColumn({ name: 'donorId' })
-  donor: User | null;
- 
-  @Column({ type: 'decimal', precision: 18, scale: 7 })
-  amount: number;
- 
-  @Column({ default: 'XLM' })
-  assetType: string;
- 
-  @Column({ nullable: true, unique: true })
-  transactionHash: string | null;
- 
-  @Column({ default: false })
-  isAnonymous: boolean;
- 
-  @CreateDateColumn()
-  createdAt: Date;
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/donations/entities/index.html b/coverage/lcov-report/src/donations/entities/index.html deleted file mode 100644 index 265d96d..0000000 --- a/coverage/lcov-report/src/donations/entities/index.html +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - Code coverage report for src/donations/entities - - - - - - - - - -
-
-

All files src/donations/entities

-
- -
- 0% - Statements - 0/19 -
- - -
- 0% - Branches - 0/8 -
- - -
- 0% - Functions - 0/3 -
- - -
- 0% - Lines - 0/16 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
donation.entity.ts -
-
0%0/190%0/80%0/30%0/16
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/donations/index.html b/coverage/lcov-report/src/donations/index.html deleted file mode 100644 index 568bca8..0000000 --- a/coverage/lcov-report/src/donations/index.html +++ /dev/null @@ -1,131 +0,0 @@ - - - - - - Code coverage report for src/donations - - - - - - - - - -
-
-

All files src/donations

-
- -
- 0% - Statements - 0/40 -
- - -
- 0% - Branches - 0/18 -
- - -
- 0% - Functions - 0/11 -
- - -
- 0% - Lines - 0/36 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
donations.controller.ts -
-
0%0/300%0/180%0/110%0/28
donations.module.ts -
-
0%0/10100%0/0100%0/00%0/8
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/donations/providers/donations.service.ts.html b/coverage/lcov-report/src/donations/providers/donations.service.ts.html deleted file mode 100644 index 656784b..0000000 --- a/coverage/lcov-report/src/donations/providers/donations.service.ts.html +++ /dev/null @@ -1,499 +0,0 @@ - - - - - - Code coverage report for src/donations/providers/donations.service.ts - - - - - - - - - -
-
-

All files / src/donations/providers donations.service.ts

-
- -
- 0% - Statements - 0/46 -
- - -
- 0% - Branches - 0/20 -
- - -
- 0% - Functions - 0/14 -
- - -
- 0% - Lines - 0/44 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { Injectable, NotFoundException, ConflictException, BadRequestException } from '@nestjs/common';
-import { InjectRepository } from '@nestjs/typeorm';
-import { Repository } from 'typeorm';
-import { Donation } from '../entities/donation.entity';
-import { CreateDonationDto } from '../dto/create-donation.dto';
-import { UpdateDonationDto } from '../dto/update-donation.dto';
-import { DonationResponseDto } from '../dto/donation-response.dto';
- 
-@Injectable()
-export class DonationsService {
-  constructor(
-    @InjectRepository(Donation)
-    private donationsRepository: Repository<Donation>,
-  ) {}
- 
-  async create(createDonationDto: CreateDonationDto): Promise<DonationResponseDto> {
-    try {
-      const donation = this.donationsRepository.create({
-        ...createDonationDto,
-      });
- 
-      const savedDonation = await this.donationsRepository.save(donation);
-      return DonationResponseDto.fromEntity(savedDonation);
-    } catch (error) {
-      if (error.code === '23505') { // PostgreSQL unique violation
-        throw new ConflictException('A donation with this transaction hash already exists');
-      }
-      throw new BadRequestException('Failed to create donation');
-    }
-  }
- 
-  async findAll(page: number = 1, limit: number = 10): Promise<{ data: DonationResponseDto[]; total: number }> {
-    const [data, total] = await this.donationsRepository.findAndCount({
-      relations: ['project', 'donor'],
-      order: { createdAt: 'DESC' },
-      skip: (page - 1) * limit,
-      take: limit,
-    });
- 
-    return {
-      data: data.map((donation) => DonationResponseDto.fromEntity(donation)),
-      total,
-    };
-  }
- 
-  async findOne(id: string): Promise<DonationResponseDto> {
-    const donation = await this.donationsRepository.findOne({
-      where: { id },
-      relations: ['project', 'donor'],
-    });
- 
-    if (!donation) {
-      throw new NotFoundException(`Donation with ID ${id} not found`);
-    }
- 
-    return DonationResponseDto.fromEntity(donation);
-  }
- 
-  async findByProject(projectId: string, page: number = 1, limit: number = 10): Promise<{ data: DonationResponseDto[]; total: number }> {
-    const [data, total] = await this.donationsRepository.findAndCount({
-      where: { projectId },
-      relations: ['donor'],
-      order: { createdAt: 'DESC' },
-      skip: (page - 1) * limit,
-      take: limit,
-    });
- 
-    return {
-      data: data.map((donation) => DonationResponseDto.fromEntity(donation)),
-      total,
-    };
-  }
- 
-  async findByDonor(donorId: string, page: number = 1, limit: number = 10): Promise<{ data: DonationResponseDto[]; total: number }> {
-    const [data, total] = await this.donationsRepository.findAndCount({
-      where: { donorId },
-      relations: ['project'],
-      order: { createdAt: 'DESC' },
-      skip: (page - 1) * limit,
-      take: limit,
-    });
- 
-    return {
-      data: data.map((donation) => DonationResponseDto.fromEntity(donation)),
-      total,
-    };
-  }
- 
-  async findByTransactionHash(transactionHash: string): Promise<DonationResponseDto> {
-    const donation = await this.donationsRepository.findOne({
-      where: { transactionHash },
-      relations: ['project', 'donor'],
-    });
- 
-    if (!donation) {
-      throw new NotFoundException(`Donation with transaction hash ${transactionHash} not found`);
-    }
- 
-    return DonationResponseDto.fromEntity(donation);
-  }
- 
-  async update(id: string, updateDonationDto: UpdateDonationDto): Promise<DonationResponseDto> {
-    const donation = await this.findOne(id);
-    
-    Object.assign(donation, updateDonationDto);
-    
-    try {
-      const updatedDonation = await this.donationsRepository.save(donation);
-      return DonationResponseDto.fromEntity(updatedDonation);
-    } catch (error) {
-      if (error.code === '23505') {
-        throw new ConflictException('A donation with this transaction hash already exists');
-      }
-      throw new BadRequestException('Failed to update donation');
-    }
-  }
- 
-  async remove(id: string): Promise<void> {
-    const donation = await this.findOne(id);
-    await this.donationsRepository.delete(donation.id);
-  }
- 
-  async getTotalDonationsForProject(projectId: string): Promise<number> {
-    const result = await this.donationsRepository
-      .createQueryBuilder('donation')
-      .select('SUM(donation.amount)', 'total')
-      .where('donation.projectId = :projectId', { projectId })
-      .getRawOne();
- 
-    return parseFloat(result.total) || 0;
-  }
- 
-  async getDonationCountForProject(projectId: string): Promise<number> {
-    return await this.donationsRepository.count({
-      where: { projectId },
-    });
-  }
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/donations/providers/index.html b/coverage/lcov-report/src/donations/providers/index.html deleted file mode 100644 index a840573..0000000 --- a/coverage/lcov-report/src/donations/providers/index.html +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - Code coverage report for src/donations/providers - - - - - - - - - -
-
-

All files src/donations/providers

-
- -
- 0% - Statements - 0/46 -
- - -
- 0% - Branches - 0/20 -
- - -
- 0% - Functions - 0/14 -
- - -
- 0% - Lines - 0/44 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
donations.service.ts -
-
0%0/460%0/200%0/140%0/44
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/index.html b/coverage/lcov-report/src/index.html deleted file mode 100644 index dddb2e6..0000000 --- a/coverage/lcov-report/src/index.html +++ /dev/null @@ -1,161 +0,0 @@ - - - - - - Code coverage report for src - - - - - - - - - -
-
-

All files src

-
- -
- 0% - Statements - 0/55 -
- - -
- 0% - Branches - 0/12 -
- - -
- 0% - Functions - 0/5 -
- - -
- 0% - Lines - 0/49 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
app.controller.ts -
-
0%0/80%0/40%0/20%0/6
app.module.ts -
-
0%0/15100%0/0100%0/00%0/13
app.service.ts -
-
0%0/5100%0/00%0/10%0/3
main.ts -
-
0%0/270%0/80%0/20%0/27
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/logger/index.html b/coverage/lcov-report/src/logger/index.html deleted file mode 100644 index 9db6d9e..0000000 --- a/coverage/lcov-report/src/logger/index.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - Code coverage report for src/logger - - - - - - - - - -
-
-

All files src/logger

-
- -
- 0% - Statements - 0/61 -
- - -
- 0% - Branches - 0/20 -
- - -
- 0% - Functions - 0/12 -
- - -
- 0% - Lines - 0/53 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
logger.middleware.ts -
-
0%0/130%0/40%0/30%0/11
logger.module.ts -
-
0%0/7100%0/00%0/10%0/5
logger.service.ts -
-
0%0/410%0/160%0/80%0/37
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/logger/logger.middleware.ts.html b/coverage/lcov-report/src/logger/logger.middleware.ts.html deleted file mode 100644 index 7217bec..0000000 --- a/coverage/lcov-report/src/logger/logger.middleware.ts.html +++ /dev/null @@ -1,175 +0,0 @@ - - - - - - Code coverage report for src/logger/logger.middleware.ts - - - - - - - - - -
-
-

All files / src/logger logger.middleware.ts

-
- -
- 0% - Statements - 0/13 -
- - -
- 0% - Branches - 0/4 -
- - -
- 0% - Functions - 0/3 -
- - -
- 0% - Lines - 0/11 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { Injectable, NestMiddleware } from '@nestjs/common';
-import { Request, Response, NextFunction } from 'express';
-import { LoggerService } from './logger.service';
- 
-@Injectable()
-export class LoggerMiddleware implements NestMiddleware {
-  constructor(private readonly logger: LoggerService) {}
- 
-  use(req: Request, res: Response, next: NextFunction) {
-    const { method, originalUrl } = req;
-    const start = Date.now();
- 
-    res.on('finish', () => {
-      const { statusCode } = res;
-      const duration = Date.now() - start;
-      this.logger.log(
-        `${method} ${originalUrl} ${statusCode} - ${duration}ms`,
-        {
-          method,
-          originalUrl,
-          statusCode,
-          duration,
-          ip: req.ip,
-        },
-      );
-    });
- 
-    next();
-  }
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/logger/logger.module.ts.html b/coverage/lcov-report/src/logger/logger.module.ts.html deleted file mode 100644 index fa7c0ed..0000000 --- a/coverage/lcov-report/src/logger/logger.module.ts.html +++ /dev/null @@ -1,145 +0,0 @@ - - - - - - Code coverage report for src/logger/logger.module.ts - - - - - - - - - -
-
-

All files / src/logger logger.module.ts

-
- -
- 0% - Statements - 0/7 -
- - -
- 100% - Branches - 0/0 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/5 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import {
-  Module,
-  NestModule,
-  MiddlewareConsumer,
-  RequestMethod,
-} from '@nestjs/common';
-import { LoggerService } from './logger.service';
-import { LoggerMiddleware } from './logger.middleware';
- 
-@Module({
-  providers: [LoggerService],
-  exports: [LoggerService],
-})
-export class LoggerModule implements NestModule {
-  configure(consumer: MiddlewareConsumer) {
-    consumer
-      .apply(LoggerMiddleware)
-      .forRoutes({ path: '*', method: RequestMethod.ALL });
-  }
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/logger/logger.service.ts.html b/coverage/lcov-report/src/logger/logger.service.ts.html deleted file mode 100644 index 1beb371..0000000 --- a/coverage/lcov-report/src/logger/logger.service.ts.html +++ /dev/null @@ -1,337 +0,0 @@ - - - - - - Code coverage report for src/logger/logger.service.ts - - - - - - - - - -
-
-

All files / src/logger logger.service.ts

-
- -
- 0% - Statements - 0/41 -
- - -
- 0% - Branches - 0/16 -
- - -
- 0% - Functions - 0/8 -
- - -
- 0% - Lines - 0/37 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { Injectable, OnModuleDestroy } from '@nestjs/common';
-import pino from 'pino';
-import { createWriteStream, WriteStream, existsSync, mkdirSync } from 'fs';
-import { join } from 'path';
- 
-@Injectable()
-export class LoggerService implements OnModuleDestroy {
-  private logger: pino.Logger;
-  private stream: WriteStream;
-  private currentDate: string;
- 
-  constructor() {
-    const env = process.env.NODE_ENV || 'development';
-    const level =
-      process.env.LOG_LEVEL || (env === 'production' ? 'info' : 'debug');
-    this.currentDate = this.getDateStr();
- 
-    const logsDir = process.env.LOG_DIR || join(process.cwd(), 'logs');
-    if (!existsSync(logsDir)) mkdirSync(logsDir, { recursive: true });
- 
-    const filePath = join(logsDir, `app-${this.currentDate}.log`);
-    this.stream = createWriteStream(filePath, { flags: 'a' });
- 
-    const options: pino.LoggerOptions = {
-      level,
-      timestamp: pino.stdTimeFunctions.isoTime,
-    };
- 
-    // In production we emit JSON to the file; in development we still write JSON to file
-    // and rely on external tooling (or stdout) for pretty output.
-    this.logger = pino(options, this.stream as any);
-  }
- 
-  private getDateStr(): string {
-    const d = new Date();
-    return d.toISOString().slice(0, 10);
-  }
- 
-  private rotateIfNeeded() {
-    const today = this.getDateStr();
-    if (today !== this.currentDate) {
-      this.currentDate = today;
-      try {
-        this.stream.end();
-      } catch (e) {
-        // ignore
-      }
-      const logsDir = process.env.LOG_DIR || join(process.cwd(), 'logs');
-      const filePath = join(logsDir, `app-${this.currentDate}.log`);
-      this.stream = createWriteStream(filePath, { flags: 'a' });
-      const opts = { level: this.logger.level } as pino.LoggerOptions;
-      this.logger = pino(opts, this.stream as any);
-    }
-  }
- 
-  log(message: string, meta?: Record<string, any>) {
-    this.rotateIfNeeded();
-    this.logger.info({ ...meta }, message);
-  }
- 
-  error(message: string, trace?: string, meta?: Record<string, any>) {
-    this.rotateIfNeeded();
-    if (trace) this.logger.error({ trace, ...meta }, message);
-    else this.logger.error({ ...meta }, message);
-  }
- 
-  warn(message: string, meta?: Record<string, any>) {
-    this.rotateIfNeeded();
-    this.logger.warn({ ...meta }, message);
-  }
- 
-  debug(message: string, meta?: Record<string, any>) {
-    this.rotateIfNeeded();
-    this.logger.debug({ ...meta }, message);
-  }
- 
-  onModuleDestroy() {
-    try {
-      this.stream.end();
-    } catch (e) {
-      // ignore
-    }
-  }
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/mail/index.html b/coverage/lcov-report/src/mail/index.html deleted file mode 100644 index dd93c3d..0000000 --- a/coverage/lcov-report/src/mail/index.html +++ /dev/null @@ -1,131 +0,0 @@ - - - - - - Code coverage report for src/mail - - - - - - - - - -
-
-

All files src/mail

-
- -
- 0% - Statements - 0/52 -
- - -
- 0% - Branches - 0/10 -
- - -
- 0% - Functions - 0/5 -
- - -
- 0% - Lines - 0/47 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
mail.module.ts -
-
0%0/6100%0/0100%0/00%0/4
mail.service.ts -
-
0%0/460%0/100%0/50%0/43
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/mail/mail.module.ts.html b/coverage/lcov-report/src/mail/mail.module.ts.html deleted file mode 100644 index 6546a18..0000000 --- a/coverage/lcov-report/src/mail/mail.module.ts.html +++ /dev/null @@ -1,115 +0,0 @@ - - - - - - Code coverage report for src/mail/mail.module.ts - - - - - - - - - -
-
-

All files / src/mail mail.module.ts

-
- -
- 0% - Statements - 0/6 -
- - -
- 100% - Branches - 0/0 -
- - -
- 100% - Functions - 0/0 -
- - -
- 0% - Lines - 0/4 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11  -  -  -  -  -  -  -  -  -  - 
import { Module } from '@nestjs/common';
-import { ConfigModule } from '@nestjs/config';
-import { MailService } from './mail.service';
- 
-@Module({
-  imports: [ConfigModule],
-  providers: [MailService],
-  exports: [MailService],
-})
-export class MailModule {}
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/mail/mail.service.ts.html b/coverage/lcov-report/src/mail/mail.service.ts.html deleted file mode 100644 index dd3cb2a..0000000 --- a/coverage/lcov-report/src/mail/mail.service.ts.html +++ /dev/null @@ -1,520 +0,0 @@ - - - - - - Code coverage report for src/mail/mail.service.ts - - - - - - - - - -
-
-

All files / src/mail mail.service.ts

-
- -
- 0% - Statements - 0/46 -
- - -
- 0% - Branches - 0/10 -
- - -
- 0% - Functions - 0/5 -
- - -
- 0% - Lines - 0/43 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { Injectable, Logger } from '@nestjs/common';
-import { ConfigService } from '@nestjs/config';
-import * as fs from 'fs';
-import * as path from 'path';
-import * as ejs from 'ejs';
-import * as nodemailer from 'nodemailer';
- 
-interface User {
-  email: string;
-  firstName?: string;
-  username?: string;
-}
- 
-interface LoginMetadata {
-  ip?: string;
-  device?: string;
-  time?: Date;
-}
- 
-@Injectable()
-export class MailService {
-  private readonly logger = new Logger(MailService.name);
-  private readonly templatesPath = path.join(__dirname, 'templates');
- 
-  constructor(private configService: ConfigService) {}
- 
-  async sendWelcomeEmail(user: User): Promise<void> {
-    try {
-      const templatePath = path.join(this.templatesPath, 'welcome.ejs');
-      const template = fs.readFileSync(templatePath, 'utf-8');
- 
-      const templateData = {
-        firstName: user.firstName,
-        username: user.username,
-        appName: this.configService.get<string>('APP_NAME', 'StellarAid'),
-        currentDate: new Date().toLocaleDateString(),
-        currentYear: new Date().getFullYear(),
-        loginUrl: `${this.configService.get<string>('FRONTEND_URL', 'http://localhost:3000')}/login`,
-      };
- 
-      const html = await ejs.render(template, templateData);
- 
-      const mailOptions = {
-        from: this.configService.get<string>(
-          'MAIL_FROM',
-          'noreply@stellaraid.com',
-        ),
-        to: user.email,
-        subject: `${this.configService.get<string>('MAIL_SUBJECT_PREFIX', '[StellarAid]')} Welcome to ${templateData.appName}!`,
-        html,
-      };
- 
-      await this.sendMail(mailOptions);
-      this.logger.log(
-        `Welcome email sent successfully to: ${this.maskEmail(user.email)}`,
-      );
-    } catch (error) {
-      this.logger.error(
-        `Failed to send welcome email to ${this.maskEmail(user.email)}:`,
-        error.message,
-      );
-      throw error;
-    }
-  }
- 
-  async sendLoginEmail(user: User, metadata?: LoginMetadata): Promise<void> {
-    try {
-      const templatePath = path.join(this.templatesPath, 'login.ejs');
-      const template = fs.readFileSync(templatePath, 'utf-8');
- 
-      const loginTime = metadata?.time || new Date();
-      const templateData = {
-        firstName: user.firstName,
-        username: user.username,
-        appName: this.configService.get<string>('APP_NAME', 'StellarAid'),
-        currentDate: new Date().toLocaleDateString(),
-        currentYear: new Date().getFullYear(),
-        loginDate: loginTime.toLocaleDateString(),
-        loginTime: loginTime.toLocaleTimeString(),
-        ipAddress: metadata?.ip,
-        deviceInfo: metadata?.device,
-        changePasswordUrl: `${this.configService.get<string>('FRONTEND_URL', 'http://localhost:3000')}/change-password`,
-      };
- 
-      const html = await ejs.render(template, templateData);
- 
-      const mailOptions = {
-        from: this.configService.get<string>(
-          'MAIL_FROM',
-          'noreply@stellaraid.com',
-        ),
-        to: user.email,
-        subject: `${this.configService.get<string>('MAIL_SUBJECT_PREFIX', '[StellarAid]')} New Login Notification`,
-        html,
-      };
- 
-      await this.sendMail(mailOptions);
-      this.logger.log(
-        `Login notification email sent successfully to: ${this.maskEmail(user.email)}`,
-      );
-    } catch (error) {
-      this.logger.error(
-        `Failed to send login email to ${this.maskEmail(user.email)}:`,
-        error.message,
-      );
-      throw error;
-    }
-  }
- 
-  private async sendMail(mailOptions: any): Promise<void> {
-    try {
-      // Create transporter using environment configuration
-      const transporter = nodemailer.createTransport({
-        host: this.configService.get<string>('MAIL_HOST', 'smtp.gmail.com'),
-        port: this.configService.get<number>('MAIL_PORT', 587),
-        secure: this.configService.get<boolean>('MAIL_SECURE', false),
-        auth: {
-          user: this.configService.get<string>('MAIL_USER'),
-          pass: this.configService.get<string>('MAIL_PASS'),
-        },
-      });
- 
-      this.logger.debug('Sending email with options:', {
-        from: mailOptions.from,
-        to: this.maskEmail(mailOptions.to),
-        subject: mailOptions.subject,
-      });
- 
-      await transporter.sendMail(mailOptions);
-      this.logger.debug('Email sent successfully');
-    } catch (error) {
-      this.logger.error('Failed to send email:', error.message);
-      throw error;
-    }
-  }
- 
-  private maskEmail(email: string): string {
-    if (!email) return 'unknown';
-    const [username, domain] = email.split('@');
-    if (username.length <= 2) {
-      return `${username[0]}*@${domain}`;
-    }
-    return `${username.slice(0, 2)}***@${domain}`;
-  }
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/main.ts.html b/coverage/lcov-report/src/main.ts.html deleted file mode 100644 index 86ec521..0000000 --- a/coverage/lcov-report/src/main.ts.html +++ /dev/null @@ -1,349 +0,0 @@ - - - - - - Code coverage report for src/main.ts - - - - - - - - - -
-
-

All files / src main.ts

-
- -
- 0% - Statements - 0/27 -
- - -
- 0% - Branches - 0/8 -
- - -
- 0% - Functions - 0/2 -
- - -
- 0% - Lines - 0/27 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { NestFactory } from '@nestjs/core';
-import { AppModule } from './app.module';
-import { ValidationPipe } from '@nestjs/common';
-import { LoggerService } from './logger/logger.service';
-import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger';
- 
-async function bootstrap() {
-  try {
-    const app = await NestFactory.create(AppModule);
- 
-    app.useGlobalPipes(
-      new ValidationPipe({
-        whitelist: true, // strip unknown properties
-        forbidNonWhitelisted: true,
-        transform: true, // auto-transform types
-        transformOptions: {
-          enableImplicitConversion: true,
-        },
-      }),
-    );
- 
-    // Use our LoggerService for bootstrap logs
-    const logger = app.get(LoggerService);
- 
-    // Swagger setup - enabled by default in non-production, configurable via env
-    const enableSwagger =
-      process.env.ENABLE_SWAGGER === 'true' ||
-      process.env.NODE_ENV !== 'production';
-    if (enableSwagger) {
-      const config = new DocumentBuilder()
-        .setTitle('StellarAid API')
-        .setDescription(
-          'StellarAid Backend API - Blockchain-enabled crowdfunding platform on Stellar network',
-        )
-        .setVersion('1.0.0')
-        .addBearerAuth(
-          {
-            type: 'http',
-            scheme: 'bearer',
-            bearerFormat: 'JWT',
-            name: 'JWT',
-            description: 'Enter JWT token',
-            in: 'header',
-          },
-          'JWT-auth',
-        )
-        .addTag('Auth', 'Authentication endpoints')
-        .addTag('Users', 'User management endpoints')
-        .addTag('Projects', 'Project management endpoints')
-        .build();
- 
-      const document = SwaggerModule.createDocument(app, config);
-      SwaggerModule.setup('docs', app, document, {
-        swaggerOptions: {
-          persistAuthorization: true,
-        },
-        customSiteTitle: 'StellarAid API Docs',
-      });
- 
-      // Expose OpenAPI JSON at /docs-json
-      app.use('/docs-json', (req, res) => {
-        res.json(document);
-      });
- 
-      logger.log('📚 Swagger UI available at /docs');
-      logger.log('📄 OpenAPI JSON available at /docs-json');
-    }
- 
-    await app.listen(process.env.PORT || 3000);
- 
-    logger.log(
-      `🚀 Server is running on http://localhost:${process.env.PORT || 3000}`,
-    );
-  } catch (error) {
-    // If logger is not available yet, fall back to console
-    try {
-      const tmpApp = await NestFactory.create(AppModule);
-      const tmpLogger = tmpApp.get(LoggerService);
-      tmpLogger.error('❌ Application failed to start', error.stack);
-    } catch (e) {
-      // fallback
- 
-      console.error('❌ Application failed to start', error.stack);
-    }
-    process.exit(1);
-  }
-}
-bootstrap();
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/modules/mail/index.html b/coverage/lcov-report/src/modules/mail/index.html deleted file mode 100644 index 00215a4..0000000 --- a/coverage/lcov-report/src/modules/mail/index.html +++ /dev/null @@ -1,131 +0,0 @@ - - - - - - Code coverage report for src/modules/mail - - - - - - - - - -
-
-

All files src/modules/mail

-
- -
- 0% - Statements - 0/52 -
- - -
- 0% - Branches - 0/10 -
- - -
- 0% - Functions - 0/5 -
- - -
- 0% - Lines - 0/47 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
mail.module.ts -
-
0%0/6100%0/0100%0/00%0/4
mail.service.ts -
-
0%0/460%0/100%0/50%0/43
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/modules/mail/mail.module.ts.html b/coverage/lcov-report/src/modules/mail/mail.module.ts.html deleted file mode 100644 index cca5546..0000000 --- a/coverage/lcov-report/src/modules/mail/mail.module.ts.html +++ /dev/null @@ -1,115 +0,0 @@ - - - - - - Code coverage report for src/modules/mail/mail.module.ts - - - - - - - - - -
-
-

All files / src/modules/mail mail.module.ts

-
- -
- 0% - Statements - 0/6 -
- - -
- 100% - Branches - 0/0 -
- - -
- 100% - Functions - 0/0 -
- - -
- 0% - Lines - 0/4 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11  -  -  -  -  -  -  -  -  -  - 
import { Module } from '@nestjs/common';
-import { ConfigModule } from '@nestjs/config';
-import { MailService } from './mail.service';
- 
-@Module({
-  imports: [ConfigModule],
-  providers: [MailService],
-  exports: [MailService],
-})
-export class MailModule {}
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/modules/mail/mail.service.ts.html b/coverage/lcov-report/src/modules/mail/mail.service.ts.html deleted file mode 100644 index 80336d2..0000000 --- a/coverage/lcov-report/src/modules/mail/mail.service.ts.html +++ /dev/null @@ -1,520 +0,0 @@ - - - - - - Code coverage report for src/modules/mail/mail.service.ts - - - - - - - - - -
-
-

All files / src/modules/mail mail.service.ts

-
- -
- 0% - Statements - 0/46 -
- - -
- 0% - Branches - 0/10 -
- - -
- 0% - Functions - 0/5 -
- - -
- 0% - Lines - 0/43 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { Injectable, Logger } from '@nestjs/common';
-import { ConfigService } from '@nestjs/config';
-import * as fs from 'fs';
-import * as path from 'path';
-import * as ejs from 'ejs';
-import * as nodemailer from 'nodemailer';
- 
-interface User {
-  email: string;
-  firstName?: string;
-  username?: string;
-}
- 
-interface LoginMetadata {
-  ip?: string;
-  device?: string;
-  time?: Date;
-}
- 
-@Injectable()
-export class MailService {
-  private readonly logger = new Logger(MailService.name);
-  private readonly templatesPath = path.join(__dirname, 'templates');
- 
-  constructor(private configService: ConfigService) {}
- 
-  async sendWelcomeEmail(user: User): Promise<void> {
-    try {
-      const templatePath = path.join(this.templatesPath, 'welcome.ejs');
-      const template = fs.readFileSync(templatePath, 'utf-8');
- 
-      const templateData = {
-        firstName: user.firstName,
-        username: user.username,
-        appName: this.configService.get<string>('APP_NAME', 'StellarAid'),
-        currentDate: new Date().toLocaleDateString(),
-        currentYear: new Date().getFullYear(),
-        loginUrl: `${this.configService.get<string>('FRONTEND_URL', 'http://localhost:3000')}/login`,
-      };
- 
-      const html = await ejs.render(template, templateData);
- 
-      const mailOptions = {
-        from: this.configService.get<string>(
-          'MAIL_FROM',
-          'noreply@stellaraid.com',
-        ),
-        to: user.email,
-        subject: `${this.configService.get<string>('MAIL_SUBJECT_PREFIX', '[StellarAid]')} Welcome to ${templateData.appName}!`,
-        html,
-      };
- 
-      await this.sendMail(mailOptions);
-      this.logger.log(
-        `Welcome email sent successfully to: ${this.maskEmail(user.email)}`,
-      );
-    } catch (error) {
-      this.logger.error(
-        `Failed to send welcome email to ${this.maskEmail(user.email)}:`,
-        error.message,
-      );
-      throw error;
-    }
-  }
- 
-  async sendLoginEmail(user: User, metadata?: LoginMetadata): Promise<void> {
-    try {
-      const templatePath = path.join(this.templatesPath, 'login.ejs');
-      const template = fs.readFileSync(templatePath, 'utf-8');
- 
-      const loginTime = metadata?.time || new Date();
-      const templateData = {
-        firstName: user.firstName,
-        username: user.username,
-        appName: this.configService.get<string>('APP_NAME', 'StellarAid'),
-        currentDate: new Date().toLocaleDateString(),
-        currentYear: new Date().getFullYear(),
-        loginDate: loginTime.toLocaleDateString(),
-        loginTime: loginTime.toLocaleTimeString(),
-        ipAddress: metadata?.ip,
-        deviceInfo: metadata?.device,
-        changePasswordUrl: `${this.configService.get<string>('FRONTEND_URL', 'http://localhost:3000')}/change-password`,
-      };
- 
-      const html = await ejs.render(template, templateData);
- 
-      const mailOptions = {
-        from: this.configService.get<string>(
-          'MAIL_FROM',
-          'noreply@stellaraid.com',
-        ),
-        to: user.email,
-        subject: `${this.configService.get<string>('MAIL_SUBJECT_PREFIX', '[StellarAid]')} New Login Notification`,
-        html,
-      };
- 
-      await this.sendMail(mailOptions);
-      this.logger.log(
-        `Login notification email sent successfully to: ${this.maskEmail(user.email)}`,
-      );
-    } catch (error) {
-      this.logger.error(
-        `Failed to send login email to ${this.maskEmail(user.email)}:`,
-        error.message,
-      );
-      throw error;
-    }
-  }
- 
-  private async sendMail(mailOptions: any): Promise<void> {
-    try {
-      // Create transporter using environment configuration
-      const transporter = nodemailer.createTransport({
-        host: this.configService.get<string>('MAIL_HOST', 'smtp.gmail.com'),
-        port: this.configService.get<number>('MAIL_PORT', 587),
-        secure: this.configService.get<boolean>('MAIL_SECURE', false),
-        auth: {
-          user: this.configService.get<string>('MAIL_USER'),
-          pass: this.configService.get<string>('MAIL_PASS'),
-        },
-      });
- 
-      this.logger.debug('Sending email with options:', {
-        from: mailOptions.from,
-        to: this.maskEmail(mailOptions.to),
-        subject: mailOptions.subject,
-      });
- 
-      await transporter.sendMail(mailOptions);
-      this.logger.debug('Email sent successfully');
-    } catch (error) {
-      this.logger.error('Failed to send email:', error.message);
-      throw error;
-    }
-  }
- 
-  private maskEmail(email: string): string {
-    if (!email) return 'unknown';
-    const [username, domain] = email.split('@');
-    if (username.length <= 2) {
-      return `${username[0]}*@${domain}`;
-    }
-    return `${username.slice(0, 2)}***@${domain}`;
-  }
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/projects/dto/analytics-query.dto.ts.html b/coverage/lcov-report/src/projects/dto/analytics-query.dto.ts.html deleted file mode 100644 index 0c1957b..0000000 --- a/coverage/lcov-report/src/projects/dto/analytics-query.dto.ts.html +++ /dev/null @@ -1,154 +0,0 @@ - - - - - - Code coverage report for src/projects/dto/analytics-query.dto.ts - - - - - - - - - -
-
-

All files / src/projects/dto analytics-query.dto.ts

-
- -
- 0% - Statements - 0/10 -
- - -
- 0% - Branches - 0/6 -
- - -
- 0% - Functions - 0/3 -
- - -
- 0% - Lines - 0/10 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { IsString, IsOptional, IsDateString } from 'class-validator';
-import { Transform, Type } from 'class-transformer';
- 
-export class AnalyticsQueryDto {
-  @IsDateString()
-  @IsOptional()
-  @Transform(({ value }) => value || new Date(Date.now() - 30 * 24 * 60 * 60 * 1000).toISOString()) // Default to 30 days ago
-  startDate?: string;
- 
-  @IsDateString()
-  @IsOptional()
-  @Transform(({ value }) => value || new Date().toISOString()) // Default to now
-  endDate?: string;
- 
-  @IsString()
-  @IsOptional()
-  @Transform(({ value }) => value || 'daily')
-  granularity?: 'daily' | 'weekly' | 'monthly';
- 
-  @IsString()
-  @IsOptional()
-  timezone?: string;
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/projects/dto/create-project.dto.ts.html b/coverage/lcov-report/src/projects/dto/create-project.dto.ts.html deleted file mode 100644 index cabdf63..0000000 --- a/coverage/lcov-report/src/projects/dto/create-project.dto.ts.html +++ /dev/null @@ -1,289 +0,0 @@ - - - - - - Code coverage report for src/projects/dto/create-project.dto.ts - - - - - - - - - -
-
-

All files / src/projects/dto create-project.dto.ts

-
- -
- 0% - Statements - 0/13 -
- - -
- 0% - Branches - 0/8 -
- - -
- 0% - Functions - 0/2 -
- - -
- 0% - Lines - 0/13 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import {
-  IsEnum,
-  IsNotEmpty,
-  IsNumber,
-  IsOptional,
-  IsString,
-  IsUrl,
-  Min,
-} from 'class-validator';
-import { Type } from 'class-transformer';
-import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
-import { ProjectCategory } from 'src/common/enums/project-category.enum';
- 
-export class CreateProjectDto {
-  @ApiProperty({
-    description: 'Project name/title',
-    example: 'Clean Water for Rural Communities',
-  })
-  @IsNotEmpty({ message: 'Project name is required' })
-  @IsString()
-  projectName: string;
- 
-  @ApiProperty({
-    description: 'Detailed project description',
-    example:
-      'A fundraising campaign to provide clean drinking water to rural communities in sub-Saharan Africa.',
-  })
-  @IsNotEmpty({ message: 'Project description is required' })
-  @IsString()
-  projectDesc: string;
- 
-  @ApiProperty({
-    description: 'URL of the project image',
-    example: 'https://example.com/images/clean-water.jpg',
-  })
-  @IsNotEmpty({ message: 'Project image URL is required' })
-  @IsUrl({}, { message: 'projectImage must be a valid URL' })
-  projectImage: string;
- 
-  @ApiProperty({
-    description: 'Funding goal amount (minimum 1000)',
-    example: 50000,
-    minimum: 1000,
-  })
-  @IsNotEmpty({ message: 'Funding goal is required' })
-  @Type(() => Number)
-  @IsNumber({}, { message: 'Funding goal must be a number' })
-  @Min(1000, { message: 'Funding goal must be at least 1000' })
-  fundingGoal: number;
- 
-  @ApiProperty({
-    description: 'Project deadline (must be a future date)',
-    example: '2026-12-31T23:59:59.000Z',
-  })
-  @IsNotEmpty({ message: 'Deadline is required' })
-  @Type(() => Date)
-  deadline: Date;
- 
-  @ApiPropertyOptional({
-    description: 'Project category',
-    enum: ProjectCategory,
-    default: ProjectCategory.OTHER,
-    example: ProjectCategory.COMMUNITY,
-  })
-  @IsOptional()
-  @IsEnum(ProjectCategory, { message: 'Invalid project category' })
-  category?: ProjectCategory;
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/projects/dto/get-projects-query.dto.ts.html b/coverage/lcov-report/src/projects/dto/get-projects-query.dto.ts.html deleted file mode 100644 index ebd3745..0000000 --- a/coverage/lcov-report/src/projects/dto/get-projects-query.dto.ts.html +++ /dev/null @@ -1,295 +0,0 @@ - - - - - - Code coverage report for src/projects/dto/get-projects-query.dto.ts - - - - - - - - - -
-
-

All files / src/projects/dto get-projects-query.dto.ts

-
- -
- 0% - Statements - 0/18 -
- - -
- 0% - Branches - 0/12 -
- - -
- 0% - Functions - 0/2 -
- - -
- 0% - Lines - 0/15 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { IsEnum, IsInt, IsOptional, IsString, Max, Min } from 'class-validator';
-import { Type } from 'class-transformer';
-import { ApiPropertyOptional } from '@nestjs/swagger';
-import { ProjectCategory } from 'src/common/enums/project-category.enum';
-import { ProjectStatus } from 'src/common/enums/project-status.enum';
-import { ProjectSortBy } from 'src/common/enums/projects-sortBy.enum';
- 
-export class GetProjectsQueryDto {
-  @ApiPropertyOptional({
-    description: 'Filter by project category',
-    enum: ProjectCategory,
-    example: ProjectCategory.HEALTH,
-  })
-  @IsOptional()
-  @IsEnum(ProjectCategory)
-  category?: ProjectCategory;
- 
-  @ApiPropertyOptional({
-    description: 'Filter by project status',
-    enum: ProjectStatus,
-    example: ProjectStatus.ACTIVE,
-  })
-  @IsOptional()
-  @IsEnum(ProjectStatus)
-  status?: ProjectStatus;
- 
-  @ApiPropertyOptional({
-    description: 'Search query for project title/description',
-    example: 'education fund',
-  })
-  @IsOptional()
-  @IsString()
-  search?: string;
- 
-  @ApiPropertyOptional({
-    description: 'Sort projects by',
-    enum: ProjectSortBy,
-    default: ProjectSortBy.NEWEST,
-    example: ProjectSortBy.MOST_FUNDED,
-  })
-  @IsOptional()
-  @IsEnum(ProjectSortBy)
-  sortBy?: ProjectSortBy = ProjectSortBy.NEWEST;
- 
-  @ApiPropertyOptional({
-    description: 'Number of results per page',
-    minimum: 1,
-    maximum: 100,
-    default: 10,
-    example: 20,
-  })
-  @IsOptional()
-  @Type(() => Number)
-  @IsInt()
-  @Min(1)
-  @Max(100)
-  limit?: number = 10;
- 
-  @ApiPropertyOptional({
-    description: 'Number of results to skip (for pagination)',
-    minimum: 0,
-    default: 0,
-    example: 0,
-  })
-  @IsOptional()
-  @Type(() => Number)
-  @IsInt()
-  @Min(0)
-  offset?: number = 0;
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/projects/dto/index.html b/coverage/lcov-report/src/projects/dto/index.html deleted file mode 100644 index c11145c..0000000 --- a/coverage/lcov-report/src/projects/dto/index.html +++ /dev/null @@ -1,191 +0,0 @@ - - - - - - Code coverage report for src/projects/dto - - - - - - - - - -
-
-

All files src/projects/dto

-
- -
- 0% - Statements - 0/80 -
- - -
- 0% - Branches - 0/42 -
- - -
- 0% - Functions - 0/11 -
- - -
- 0% - Lines - 0/75 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
analytics-query.dto.ts -
-
0%0/100%0/60%0/30%0/10
create-project.dto.ts -
-
0%0/130%0/80%0/20%0/13
get-projects-query.dto.ts -
-
0%0/180%0/120%0/20%0/15
search-projects.dto.ts -
-
0%0/230%0/120%0/30%0/21
update-project-status.dto.ts -
-
0%0/50%0/4100%0/00%0/5
upload-image.dto.ts -
-
0%0/11100%0/00%0/10%0/11
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/projects/dto/search-projects.dto.ts.html b/coverage/lcov-report/src/projects/dto/search-projects.dto.ts.html deleted file mode 100644 index 96606ba..0000000 --- a/coverage/lcov-report/src/projects/dto/search-projects.dto.ts.html +++ /dev/null @@ -1,259 +0,0 @@ - - - - - - Code coverage report for src/projects/dto/search-projects.dto.ts - - - - - - - - - -
-
-

All files / src/projects/dto search-projects.dto.ts

-
- -
- 0% - Statements - 0/23 -
- - -
- 0% - Branches - 0/12 -
- - -
- 0% - Functions - 0/3 -
- - -
- 0% - Lines - 0/21 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { IsString, IsOptional, IsArray, IsEnum } from 'class-validator';
-import { ProjectCategory } from 'src/common/enums/project-category.enum';
-import { ProjectStatus } from 'src/common/enums/project-status.enum';
-import { ProjectSortBy } from 'src/common/enums/projects-sortBy.enum';
-import { Transform, Type } from 'class-transformer';
- 
-export class SearchProjectsDto {
-  @IsString()
-  @IsOptional()
-  @Transform(({ value }) => value?.trim())
-  search?: string;
- 
-  @IsEnum(ProjectCategory)
-  @IsOptional()
-  category?: ProjectCategory;
- 
-  @IsEnum(ProjectStatus)
-  @IsOptional()
-  status?: ProjectStatus;
- 
-  @IsArray()
-  @IsEnum(ProjectCategory, { each: true })
-  @IsOptional()
-  categories?: ProjectCategory[];
- 
-  @IsArray()
-  @IsEnum(ProjectStatus, { each: true })
-  @IsOptional()
-  statuses?: ProjectStatus[];
- 
-  @IsEnum(ProjectSortBy)
-  @IsOptional()
-  sortBy?: ProjectSortBy;
- 
-  @Type(() => Number)
-  @IsOptional()
-  limit?: number = 10;
- 
-  @Type(() => Number)
-  @IsOptional()
-  offset?: number = 0;
- 
-  @IsString()
-  @IsOptional()
-  minGoal?: string;
- 
-  @IsString()
-  @IsOptional()
-  maxGoal?: string;
- 
-  @IsString()
-  @IsOptional()
-  minRaised?: string;
- 
-  @IsString()
-  @IsOptional()
-  maxRaised?: string;
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/projects/dto/update-project-status.dto.ts.html b/coverage/lcov-report/src/projects/dto/update-project-status.dto.ts.html deleted file mode 100644 index 86fbaba..0000000 --- a/coverage/lcov-report/src/projects/dto/update-project-status.dto.ts.html +++ /dev/null @@ -1,124 +0,0 @@ - - - - - - Code coverage report for src/projects/dto/update-project-status.dto.ts - - - - - - - - - -
-
-

All files / src/projects/dto update-project-status.dto.ts

-
- -
- 0% - Statements - 0/5 -
- - -
- 0% - Branches - 0/4 -
- - -
- 100% - Functions - 0/0 -
- - -
- 0% - Lines - 0/5 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { IsString, IsOptional, IsIn } from 'class-validator';
-import { ProjectStatus } from 'src/common/enums/project-status.enum';
- 
-export class UpdateProjectStatusDto {
-  @IsString()
-  @IsOptional()
-  @IsIn([ProjectStatus.PAUSED, ProjectStatus.ACTIVE, ProjectStatus.COMPLETED])
-  status: ProjectStatus;
- 
-  @IsString()
-  @IsOptional()
-  reason?: string;
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/projects/dto/upload-image.dto.ts.html b/coverage/lcov-report/src/projects/dto/upload-image.dto.ts.html deleted file mode 100644 index 853ea63..0000000 --- a/coverage/lcov-report/src/projects/dto/upload-image.dto.ts.html +++ /dev/null @@ -1,160 +0,0 @@ - - - - - - Code coverage report for src/projects/dto/upload-image.dto.ts - - - - - - - - - -
-
-

All files / src/projects/dto upload-image.dto.ts

-
- -
- 0% - Statements - 0/11 -
- - -
- 100% - Branches - 0/0 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/11 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { IsArray, IsOptional, IsString, MaxLength } from 'class-validator';
-import { Transform } from 'class-transformer';
- 
-export class UploadImageDto {
-  @IsArray()
-  files: Express.Multer.File[];
-}
- 
-export class ImageFileDto {
-  @IsString()
-  @MaxLength(255)
-  filename: string;
- 
-  @IsString()
-  @MaxLength(100)
-  mimeType: string;
- 
-  @Transform(({ value }) => parseInt(value))
-  size: number;
-}
- 
-export class DeleteImageDto {
-  @IsString()
-  imageId: string;
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/projects/dtos/get-projects-query.dto.ts.html b/coverage/lcov-report/src/projects/dtos/get-projects-query.dto.ts.html deleted file mode 100644 index 21016f5..0000000 --- a/coverage/lcov-report/src/projects/dtos/get-projects-query.dto.ts.html +++ /dev/null @@ -1,307 +0,0 @@ - - - - - - Code coverage report for src/projects/dtos/get-projects-query.dto.ts - - - - - - - - - -
-
-

All files / src/projects/dtos get-projects-query.dto.ts

-
- -
- 75% - Statements - 15/20 -
- - -
- 80% - Branches - 8/10 -
- - -
- 33.33% - Functions - 1/3 -
- - -
- 88.23% - Lines - 15/17 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -751x -1x -1x -1x -  -1x -1x -1x -1x -  -  -1x -  -  -  -  -  -  -  -1x -  -  -  -  -  -  -  -  -1x -  -  -  -  -  -  -  -1x -  -  -  -  -  -  -  -  -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -1x -  -  -  -  -  -  -  -  -  -  -  -1x -  - 
import { IsEnum, IsInt, IsOptional, IsString, Max, Min } from 'class-validator';
-import { Type } from 'class-transformer';
-import { ApiPropertyOptional } from '@nestjs/swagger';
-import { ProjectCategory, ProjectStatus } from '../entities/project.entity';
- 
-export enum ProjectSortBy {
-  NEWEST = 'newest',
-  MOST_FUNDED = 'most_funded',
-  ENDING_SOON = 'ending_soon',
-}
- 
-export class GetProjectsQueryDto {
-  @ApiPropertyOptional({
-    description: 'Filter by project category',
-    enum: ProjectCategory,
-    example: ProjectCategory.HEALTH,
-  })
-  @IsOptional()
-  @IsEnum(ProjectCategory)
-  category?: ProjectCategory;
- 
-  @ApiPropertyOptional({
-    description: 'Filter by project status',
-    enum: ProjectStatus,
-    example: ProjectStatus.ACTIVE,
-  })
-  @IsOptional()
-  @IsEnum(ProjectStatus)
-  status?: ProjectStatus;
- 
-  @ApiPropertyOptional({
-    description: 'Search query for project title/description',
-    example: 'education fund',
-  })
-  @IsOptional()
-  @IsString()
-  search?: string;
- 
-  @ApiPropertyOptional({
-    description: 'Sort projects by',
-    enum: ProjectSortBy,
-    default: ProjectSortBy.NEWEST,
-    example: ProjectSortBy.MOST_FUNDED,
-  })
-  @IsOptional()
-  @IsEnum(ProjectSortBy)
-  sortBy?: ProjectSortBy = ProjectSortBy.NEWEST;
- 
-  @ApiPropertyOptional({
-    description: 'Number of results per page',
-    minimum: 1,
-    maximum: 100,
-    default: 10,
-    example: 20,
-  })
-  @IsOptional()
-  @Type(() => Number)
-  @IsInt()
-  @Min(1)
-  @Max(100)
-  limit?: number = 10;
- 
-  @ApiPropertyOptional({
-    description: 'Number of results to skip (for pagination)',
-    minimum: 0,
-    default: 0,
-    example: 0,
-  })
-  @IsOptional()
-  @Type(() => Number)
-  @IsInt()
-  @Min(0)
-  offset?: number = 0;
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/projects/dtos/index.html b/coverage/lcov-report/src/projects/dtos/index.html deleted file mode 100644 index 103c836..0000000 --- a/coverage/lcov-report/src/projects/dtos/index.html +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - Code coverage report for src/projects/dtos - - - - - - - - - -
-
-

All files src/projects/dtos

-
- -
- 75% - Statements - 15/20 -
- - -
- 80% - Branches - 8/10 -
- - -
- 33.33% - Functions - 1/3 -
- - -
- 88.23% - Lines - 15/17 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
get-projects-query.dto.ts -
-
75%15/2080%8/1033.33%1/388.23%15/17
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/projects/entities/donation.entity.ts.html b/coverage/lcov-report/src/projects/entities/donation.entity.ts.html deleted file mode 100644 index 02194e4..0000000 --- a/coverage/lcov-report/src/projects/entities/donation.entity.ts.html +++ /dev/null @@ -1,226 +0,0 @@ - - - - - - Code coverage report for src/projects/entities/donation.entity.ts - - - - - - - - - -
-
-

All files / src/projects/entities donation.entity.ts

-
- -
- 83.33% - Statements - 15/18 -
- - -
- 62.5% - Branches - 5/8 -
- - -
- 0% - Functions - 0/3 -
- - -
- 86.66% - Lines - 13/15 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -481x -  -  -  -  -  -  -  -  -1x -1x -  -  -  -  -1x -  -1x -  -  -1x -  -  -  -  -  -1x -  -  -1x -  -  -  -1x -  -  -1x -  -  -1x -  -  -1x -  -  -1x -  - 
import {
-  Entity,
-  PrimaryGeneratedColumn,
-  Column,
-  CreateDateColumn,
-  ManyToOne,
-  JoinColumn,
-  Index,
-} from 'typeorm';
-import { User } from '../../users/entities/user.entity';
-import { Project } from './project.entity';
- 
-@Entity('donations')
-@Index('IDX_donations_project_id', ['projectId'])
-@Index('IDX_donations_donor_id', ['donorId'])
-export class Donation {
-  @PrimaryGeneratedColumn('uuid')
-  id: string;
- 
-  @Column()
-  projectId: string;
- 
-  @ManyToOne(() => Project, (project) => project.donations, {
-    onDelete: 'CASCADE',
-  })
-  @JoinColumn({ name: 'projectId' })
-  project: Project;
- 
-  @Column({ nullable: true })
-  donorId: string | null;
- 
-  @ManyToOne(() => User, { nullable: true, eager: false, onDelete: 'SET NULL' })
-  @JoinColumn({ name: 'donorId' })
-  donor: User | null;
- 
-  @Column({ type: 'decimal', precision: 18, scale: 7 })
-  amount: number;
- 
-  @Column({ nullable: true })
-  transactionHash: string | null;
- 
-  @Column({ default: false })
-  isAnonymous: boolean;
- 
-  @CreateDateColumn()
-  createdAt: Date;
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/projects/entities/index.html b/coverage/lcov-report/src/projects/entities/index.html deleted file mode 100644 index 3568ead..0000000 --- a/coverage/lcov-report/src/projects/entities/index.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - Code coverage report for src/projects/entities - - - - - - - - - -
-
-

All files src/projects/entities

-
- -
- 0% - Statements - 0/69 -
- - -
- 0% - Branches - 0/48 -
- - -
- 0% - Functions - 0/10 -
- - -
- 0% - Lines - 0/60 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
project-history.entity.ts -
-
0%0/180%0/200%0/20%0/16
project-image.entity.ts -
-
0%0/150%0/80%0/10%0/13
project.entity.ts -
-
0%0/360%0/200%0/70%0/31
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/projects/entities/project-history.entity.ts.html b/coverage/lcov-report/src/projects/entities/project-history.entity.ts.html deleted file mode 100644 index 23c4ef9..0000000 --- a/coverage/lcov-report/src/projects/entities/project-history.entity.ts.html +++ /dev/null @@ -1,214 +0,0 @@ - - - - - - Code coverage report for src/projects/entities/project-history.entity.ts - - - - - - - - - -
-
-

All files / src/projects/entities project-history.entity.ts

-
- -
- 0% - Statements - 0/18 -
- - -
- 0% - Branches - 0/20 -
- - -
- 0% - Functions - 0/2 -
- - -
- 0% - Lines - 0/16 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import {
-  Entity,
-  PrimaryGeneratedColumn,
-  Column,
-  CreateDateColumn,
-  ManyToOne,
-  JoinColumn,
-} from 'typeorm';
-import { User } from '../../users/entities/user.entity';
-import { Project } from './project.entity';
-import { ProjectStatus } from 'src/common/enums/project-status.enum';
- 
-@Entity('project_history')
-export class ProjectHistory {
-  @PrimaryGeneratedColumn('uuid')
-  id: string;
- 
-  @Column({ type: 'enum', enum: ProjectStatus })
-  previousStatus: ProjectStatus;
- 
-  @Column({ type: 'enum', enum: ProjectStatus })
-  newStatus: ProjectStatus;
- 
-  @Column({ nullable: true, type: 'text' })
-  reason: string | null;
- 
-  @Column()
-  projectId: string;
- 
-  @ManyToOne(() => Project, { onDelete: 'CASCADE' })
-  @JoinColumn({ name: 'projectId' })
-  project: Project;
- 
-  @Column()
-  changedBy: string;
- 
-  @ManyToOne(() => User, { onDelete: 'SET NULL' })
-  @JoinColumn({ name: 'changedBy' })
-  changedByUser: User;
- 
-  @CreateDateColumn()
-  changedAt: Date;
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/projects/entities/project-image.entity.ts.html b/coverage/lcov-report/src/projects/entities/project-image.entity.ts.html deleted file mode 100644 index de73448..0000000 --- a/coverage/lcov-report/src/projects/entities/project-image.entity.ts.html +++ /dev/null @@ -1,205 +0,0 @@ - - - - - - Code coverage report for src/projects/entities/project-image.entity.ts - - - - - - - - - -
-
-

All files / src/projects/entities project-image.entity.ts

-
- -
- 0% - Statements - 0/15 -
- - -
- 0% - Branches - 0/8 -
- - -
- 0% - Functions - 0/1 -
- - -
- 0% - Lines - 0/13 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import {
-  Entity,
-  PrimaryGeneratedColumn,
-  Column,
-  CreateDateColumn,
-  ManyToOne,
-  JoinColumn,
-} from 'typeorm';
-import { Project } from './project.entity';
- 
-@Entity('project_images')
-export class ProjectImage {
-  @PrimaryGeneratedColumn('uuid')
-  id: string;
- 
-  @Column()
-  url: string;
- 
-  @Column()
-  filename: string;
- 
-  @Column()
-  mimeType: string;
- 
-  @Column({ type: 'int' })
-  size: number;
- 
-  @Column({ default: 0 })
-  order: number;
- 
-  @Column()
-  projectId: string;
- 
-  @ManyToOne(() => Project, { onDelete: 'CASCADE' })
-  @JoinColumn({ name: 'projectId' })
-  project: Project;
- 
-  @CreateDateColumn()
-  createdAt: Date;
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/projects/entities/project.entity.ts.html b/coverage/lcov-report/src/projects/entities/project.entity.ts.html deleted file mode 100644 index 75d91bf..0000000 --- a/coverage/lcov-report/src/projects/entities/project.entity.ts.html +++ /dev/null @@ -1,358 +0,0 @@ - - - - - - Code coverage report for src/projects/entities/project.entity.ts - - - - - - - - - -
-
-

All files / src/projects/entities project.entity.ts

-
- -
- 0% - Statements - 0/36 -
- - -
- 0% - Branches - 0/20 -
- - -
- 0% - Functions - 0/7 -
- - -
- 0% - Lines - 0/31 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import {
-  Entity,
-  PrimaryGeneratedColumn,
-  Column,
-  CreateDateColumn,
-  UpdateDateColumn,
-  ManyToOne,
-  OneToMany,
-  JoinColumn,
-  Index,
-} from 'typeorm';
-import { User } from '../../users/entities/user.entity';
-import { Donation } from '../../donations/entities/donation.entity';
-import { ProjectImage } from './project-image.entity';
-import { ProjectHistory } from './project-history.entity';
-import { ProjectCategory } from 'src/common/enums/project-category.enum';
-import { ProjectStatus } from 'src/common/enums/project-status.enum';
- 
-@Entity('projects')
-@Index('IDX_projects_creator_id', ['creatorId'])
-@Index('IDX_projects_status', ['status'])
-@Index('IDX_projects_search', ['title'])
-@Index('IDX_projects_search', ['description'])
-export class Project {
-  @PrimaryGeneratedColumn('uuid')
-  id: string;
- 
-  @Column()
-  title: string;
- 
-  @Column({ type: 'text' })
-  description: string;
- 
-  @Column({ nullable: true })
-  imageUrl: string | null;
- 
-  @Column({
-    type: 'enum',
-    enum: ProjectCategory,
-    default: ProjectCategory.OTHER,
-  })
-  category: ProjectCategory;
- 
-  @Column({
-    type: 'enum',
-    enum: ProjectStatus,
-    default: ProjectStatus.DRAFT,
-  })
-  status: ProjectStatus;
- 
-  @Column({ type: 'decimal', precision: 18, scale: 7 })
-  goalAmount: number;
- 
-  @Column({ type: 'decimal', precision: 18, scale: 7, default: 0 })
-  fundsRaised: number;
- 
-  @Column({ type: 'decimal', precision: 5, scale: 2, default: 0 })
-  progress: number;
- 
-  @Column({ type: 'int', default: 0 })
-  donationCount: number;
- 
-  @Column({ nullable: true, type: 'timestamp' })
-  deadline: Date | null;
- 
-  @Column({ nullable: true, type: 'text' })
-  rejectionReason: string | null;
- 
-  @Index('IDX_projects_creator_id_col')
-  @Column()
-  creatorId: string;
- 
-  @ManyToOne(() => User, { eager: false, onDelete: 'CASCADE' })
-  @JoinColumn({ name: 'creatorId' })
-  creator: User;
- 
-  @OneToMany(() => ProjectImage, (image) => image.project, { cascade: true })
-  images: ProjectImage[];
- 
-  @OneToMany(() => Donation, (donation) => donation.project, { cascade: true })
-  donations: Donation[];
- 
-  @OneToMany(() => ProjectHistory, (history) => history.project, { cascade: true })
-  history: ProjectHistory[];
- 
-  @CreateDateColumn()
-  createdAt: Date;
- 
-  @UpdateDateColumn()
-  updatedAt: Date;
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/projects/index.html b/coverage/lcov-report/src/projects/index.html deleted file mode 100644 index 212e417..0000000 --- a/coverage/lcov-report/src/projects/index.html +++ /dev/null @@ -1,131 +0,0 @@ - - - - - - Code coverage report for src/projects - - - - - - - - - -
-
-

All files src/projects

-
- -
- 0% - Statements - 0/90 -
- - -
- 0% - Branches - 0/58 -
- - -
- 0% - Functions - 0/14 -
- - -
- 0% - Lines - 0/86 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
projects.controller.ts -
-
0%0/730%0/580%0/140%0/71
projects.module.ts -
-
0%0/17100%0/0100%0/00%0/15
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/projects/projects.controller.ts.html b/coverage/lcov-report/src/projects/projects.controller.ts.html deleted file mode 100644 index 9f171b3..0000000 --- a/coverage/lcov-report/src/projects/projects.controller.ts.html +++ /dev/null @@ -1,967 +0,0 @@ - - - - - - Code coverage report for src/projects/projects.controller.ts - - - - - - - - - -
-
-

All files / src/projects projects.controller.ts

-
- -
- 0% - Statements - 0/73 -
- - -
- 0% - Branches - 0/58 -
- - -
- 0% - Functions - 0/14 -
- - -
- 0% - Lines - 0/71 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174 -175 -176 -177 -178 -179 -180 -181 -182 -183 -184 -185 -186 -187 -188 -189 -190 -191 -192 -193 -194 -195 -196 -197 -198 -199 -200 -201 -202 -203 -204 -205 -206 -207 -208 -209 -210 -211 -212 -213 -214 -215 -216 -217 -218 -219 -220 -221 -222 -223 -224 -225 -226 -227 -228 -229 -230 -231 -232 -233 -234 -235 -236 -237 -238 -239 -240 -241 -242 -243 -244 -245 -246 -247 -248 -249 -250 -251 -252 -253 -254 -255 -256 -257 -258 -259 -260 -261 -262 -263 -264 -265 -266 -267 -268 -269 -270 -271 -272 -273 -274 -275 -276 -277 -278 -279 -280 -281 -282 -283 -284 -285 -286 -287 -288 -289 -290 -291 -292 -293 -294 -295  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import {
-  Controller,
-  Get,
-  Post,
-  Patch,
-  Delete,
-  Body,
-  HttpCode,
-  HttpStatus,
-  Query,
-  Param,
-  UseGuards,
-  Request,
-  UseInterceptors,
-  UploadedFiles,
-} from '@nestjs/common';
-import {
-  ApiTags,
-  ApiOperation,
-  ApiResponse,
-  ApiBearerAuth,
-  ApiOkResponse,
-  ApiCreatedResponse,
-  ApiBadRequestResponse,
-  ApiUnauthorizedResponse,
-  ApiNotFoundResponse,
-  ApiForbiddenResponse,
-  ApiConsumes,
-} from '@nestjs/swagger';
-import { FilesInterceptor } from '@nestjs/platform-express';
-import { GetProjectsQueryDto } from './dto/get-projects-query.dto';
-import { CreateProjectDto } from './dto/create-project.dto';
-import { UpdateProjectStatusDto } from './dto/update-project-status.dto';
-import { SearchProjectsDto } from './dto/search-projects.dto';
-import { AnalyticsQueryDto } from './dto/analytics-query.dto';
-import { DeleteImageDto } from './dto/upload-image.dto';
-import { Public } from '../common/decorators/public.decorator';
-import { JwtAuthGuard } from '../common/guards/jwt-auth.guard';
-import { RolesGuard } from '../common/guards/roles.guard';
-import { Roles } from '../common/decorators/roles.decorator';
-import { UserRole } from 'src/common/enums/user-role.enum';
-import { ProjectsService } from './providers/projects.service';
-import { ImageUploadService } from './services/image-upload.service';
-import { SearchService } from './services/search.service';
-import { AnalyticsService } from './services/analytics.service';
- 
-@ApiTags('projects')
-@ApiBearerAuth()
-@Controller('projects')
-export class ProjectsController {
-  constructor(
-    private readonly projectsService: ProjectsService,
-    private readonly imageUploadService: ImageUploadService,
-    private readonly searchService: SearchService,
-    private readonly analyticsService: AnalyticsService,
-  ) {}
- 
-  //______________________ Endpoint to create a new project (CREATOR role required)
-  @Get()
-  @UseGuards(JwtAuthGuard, RolesGuard)
-  @Roles(UserRole.CREATOR)
-  @HttpCode(HttpStatus.OK)
-  @ApiOperation({ summary: 'Get all projects with filtering and pagination' })
-  @ApiOkResponse({ description: 'Projects retrieved successfully' })
-  async findAll(@Query() query: GetProjectsQueryDto) {
-    const { data, total } = await this.projectsService.findAll(query);
-    return {
-      data,
-      total,
-      limit: query.limit ?? 10,
-      offset: query.offset ?? 0,
-    };
-  }
- 
-  //_____________________ Endpoint to get detailed project info by ID (public view)
-  @Get(':id')
-  @Public()
-  @HttpCode(HttpStatus.OK)
-  @ApiOperation({ summary: 'Get detailed project by ID' })
-  @ApiOkResponse({ description: 'Project details retrieved successfully' })
-  @ApiNotFoundResponse({ description: 'Project not found' })
-  async findOne(@Param('id') id: string) {
-    return this.projectsService.findOnePublic(id);
-  }
- 
-  //_____________________ Endpoint to create a new project (CREATOR role required)
-  @Post()
-  @UseGuards(JwtAuthGuard, RolesGuard)
-  @Roles(UserRole.CREATOR)
-  @HttpCode(HttpStatus.CREATED)
-  @ApiBearerAuth('JWT-auth')
-  @ApiOperation({ summary: 'Create a new project (CREATOR role required)' })
-  @ApiCreatedResponse({ description: 'Project created successfully' })
-  @ApiBadRequestResponse({ description: 'Invalid input data' })
-  @ApiUnauthorizedResponse({ description: 'Unauthorized' })
-  @ApiForbiddenResponse({
-    description: 'Forbidden – only CREATOR role allowed',
-  })
-  async create(@Body() createProjectDto: CreateProjectDto, @Request() req) {
-    const userId = req.user.sub;
-    const project = await this.projectsService.create(createProjectDto, userId);
-    return project;
-  }
- 
-  //_____________________ Endpoint to pause a project
-  @Patch(':id/pause')
-  @UseGuards(JwtAuthGuard, RolesGuard)
-  @Roles(UserRole.CREATOR, UserRole.ADMIN)
-  @HttpCode(HttpStatus.OK)
-  @ApiOperation({ summary: 'Pause a project (CREATOR or ADMIN required)' })
-  @ApiOkResponse({ description: 'Project paused successfully' })
-  @ApiNotFoundResponse({ description: 'Project not found' })
-  @ApiForbiddenResponse({ description: 'Only creator or admin can pause project' })
-  async pauseProject(
-    @Param('id') id: string,
-    @Body() updateStatusDto: UpdateProjectStatusDto,
-    @Request() req,
-  ) {
-    const userId = req.user.sub;
-    const userRole = req.user.role;
-    const project = await this.projectsService.updateStatus(
-      id,
-      { status: 'paused' as any, reason: updateStatusDto.reason },
-      userId,
-      userRole,
-    );
-    return project;
-  }
- 
-  //_____________________ Endpoint to resume a project
-  @Patch(':id/resume')
-  @UseGuards(JwtAuthGuard, RolesGuard)
-  @Roles(UserRole.CREATOR, UserRole.ADMIN)
-  @HttpCode(HttpStatus.OK)
-  @ApiOperation({ summary: 'Resume a project (CREATOR or ADMIN required)' })
-  @ApiOkResponse({ description: 'Project resumed successfully' })
-  @ApiNotFoundResponse({ description: 'Project not found' })
-  @ApiForbiddenResponse({ description: 'Only creator or admin can resume project' })
-  async resumeProject(
-    @Param('id') id: string,
-    @Body() updateStatusDto: UpdateProjectStatusDto,
-    @Request() req,
-  ) {
-    const userId = req.user.sub;
-    const userRole = req.user.role;
-    const project = await this.projectsService.updateStatus(
-      id,
-      { status: 'active' as any, reason: updateStatusDto.reason },
-      userId,
-      userRole,
-    );
-    return project;
-  }
- 
-  //_____________________ Endpoint to complete a project
-  @Post(':id/complete')
-  @UseGuards(JwtAuthGuard, RolesGuard)
-  @Roles(UserRole.CREATOR, UserRole.ADMIN)
-  @HttpCode(HttpStatus.OK)
-  @ApiOperation({ summary: 'Complete a project (CREATOR or ADMIN required)' })
-  @ApiOkResponse({ description: 'Project completed successfully' })
-  @ApiNotFoundResponse({ description: 'Project not found' })
-  @ApiForbiddenResponse({ description: 'Only creator or admin can complete project' })
-  async completeProject(
-    @Param('id') id: string,
-    @Body() updateStatusDto: UpdateProjectStatusDto,
-    @Request() req,
-  ) {
-    const userId = req.user.sub;
-    const userRole = req.user.role;
-    const project = await this.projectsService.updateStatus(
-      id,
-      { status: 'completed' as any, reason: updateStatusDto.reason },
-      userId,
-      userRole,
-    );
-    return project;
-  }
- 
-  //_____________________ Endpoint to upload project images
-  @Post(':id/images')
-  @UseGuards(JwtAuthGuard, RolesGuard)
-  @Roles(UserRole.CREATOR, UserRole.ADMIN)
-  @UseInterceptors(FilesInterceptor('images'))
-  @HttpCode(HttpStatus.CREATED)
-  @ApiConsumes('multipart/form-data')
-  @ApiOperation({ summary: 'Upload images to project (CREATOR or ADMIN required)' })
-  @ApiCreatedResponse({ description: 'Images uploaded successfully' })
-  @ApiNotFoundResponse({ description: 'Project not found' })
-  @ApiForbiddenResponse({ description: 'Only creator or admin can upload images' })
-  async uploadImages(
-    @Param('id') id: string,
-    @UploadedFiles() files: Express.Multer.File[],
-    @Request() req,
-  ) {
-    const userId = req.user.sub;
-    const userRole = req.user.role;
-    const images = await this.imageUploadService.uploadImages(id, files, userId, userRole);
-    return { images };
-  }
- 
-  //_____________________ Endpoint to get project images
-  @Get(':id/images')
-  @Public()
-  @HttpCode(HttpStatus.OK)
-  @ApiOperation({ summary: 'Get project images' })
-  @ApiOkResponse({ description: 'Images retrieved successfully' })
-  @ApiNotFoundResponse({ description: 'Project not found' })
-  async getProjectImages(@Param('id') id: string) {
-    const images = await this.imageUploadService.getProjectImages(id);
-    return { images };
-  }
- 
-  //_____________________ Endpoint to delete project image
-  @Delete(':id/images/:imageId')
-  @UseGuards(JwtAuthGuard, RolesGuard)
-  @Roles(UserRole.CREATOR, UserRole.ADMIN)
-  @HttpCode(HttpStatus.OK)
-  @ApiOperation({ summary: 'Delete project image (CREATOR or ADMIN required)' })
-  @ApiOkResponse({ description: 'Image deleted successfully' })
-  @ApiNotFoundResponse({ description: 'Image not found' })
-  @ApiForbiddenResponse({ description: 'Only creator or admin can delete images' })
-  async deleteImage(
-    @Param('id') id: string,
-    @Param('imageId') imageId: string,
-    @Request() req,
-  ) {
-    const userId = req.user.sub;
-    const userRole = req.user.role;
-    await this.imageUploadService.deleteImage(imageId, userId, userRole);
-    return { message: 'Image deleted successfully' };
-  }
- 
-  //_____________________ Endpoint for enhanced search
-  @Get('search')
-  @Public()
-  @HttpCode(HttpStatus.OK)
-  @ApiOperation({ summary: 'Search projects with full-text search and filters' })
-  @ApiOkResponse({ description: 'Search results retrieved successfully' })
-  async searchProjects(@Query() searchDto: SearchProjectsDto) {
-    const result = await this.searchService.searchProjects(searchDto);
-    return {
-      data: result.data,
-      total: result.total,
-      limit: searchDto.limit ?? 10,
-      offset: searchDto.offset ?? 0,
-      suggestions: result.suggestions || [],
-    };
-  }
- 
-  //_____________________ Endpoint for search analytics
-  @Get('search/analytics')
-  @UseGuards(JwtAuthGuard, RolesGuard)
-  @Roles(UserRole.ADMIN)
-  @HttpCode(HttpStatus.OK)
-  @ApiOperation({ summary: 'Get search analytics (ADMIN only)' })
-  @ApiOkResponse({ description: 'Search analytics retrieved successfully' })
-  @ApiForbiddenResponse({ description: 'Admin access required' })
-  async getSearchAnalytics() {
-    return await this.searchService.getSearchAnalytics();
-  }
- 
-  //_____________________ Endpoint for project analytics
-  @Get(':id/analytics')
-  @UseGuards(JwtAuthGuard, RolesGuard)
-  @Roles(UserRole.CREATOR, UserRole.ADMIN)
-  @HttpCode(HttpStatus.OK)
-  @ApiOperation({ summary: 'Get project-specific analytics (CREATOR or ADMIN required)' })
-  @ApiOkResponse({ description: 'Analytics retrieved successfully' })
-  @ApiNotFoundResponse({ description: 'Project not found' })
-  @ApiForbiddenResponse({ description: 'Only creator or admin can access analytics' })
-  async getProjectAnalytics(
-    @Param('id') id: string,
-    @Query() query: AnalyticsQueryDto,
-    @Request() req,
-  ) {
-    const userId = req.user.sub;
-    const userRole = req.user.role;
-    return await this.analyticsService.getProjectAnalytics(id, userId, userRole, query);
-  }
- 
-  //_____________________ Endpoint for creator analytics
-  @Get('creator/analytics')
-  @UseGuards(JwtAuthGuard, RolesGuard)
-  @Roles(UserRole.CREATOR)
-  @HttpCode(HttpStatus.OK)
-  @ApiOperation({ summary: 'Get creator-specific analytics (CREATOR role required)' })
-  @ApiOkResponse({ description: 'Creator analytics retrieved successfully' })
-  @ApiForbiddenResponse({ description: 'Creator role required' })
-  async getCreatorAnalytics(@Query() query: AnalyticsQueryDto, @Request() req) {
-    const userId = req.user.sub;
-    return await this.analyticsService.getCreatorAnalytics(userId, query);
-  }
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/projects/projects.module.ts.html b/coverage/lcov-report/src/projects/projects.module.ts.html deleted file mode 100644 index d53399c..0000000 --- a/coverage/lcov-report/src/projects/projects.module.ts.html +++ /dev/null @@ -1,208 +0,0 @@ - - - - - - Code coverage report for src/projects/projects.module.ts - - - - - - - - - -
-
-

All files / src/projects projects.module.ts

-
- -
- 0% - Statements - 0/17 -
- - -
- 100% - Branches - 0/0 -
- - -
- 100% - Functions - 0/0 -
- - -
- 0% - Lines - 0/15 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { Module } from '@nestjs/common';
-import { TypeOrmModule } from '@nestjs/typeorm';
-import { MulterModule } from '@nestjs/platform-express';
-import { Project } from './entities/project.entity';
-import { Donation } from '../donations/entities/donation.entity';
-import { ProjectHistory } from './entities/project-history.entity';
-import { ProjectImage } from './entities/project-image.entity';
-import { User } from '../users/entities/user.entity';
-import { ProjectsController } from './projects.controller';
-import { ProjectsService } from './providers/projects.service';
-import { ImageUploadService } from './services/image-upload.service';
-import { FileUploadService } from '../common/services/file-upload.service';
-import { SearchService } from './services/search.service';
-import { AnalyticsService } from './services/analytics.service';
- 
-@Module({
-  imports: [
-    TypeOrmModule.forFeature([Project, Donation, ProjectHistory, ProjectImage, User]),
-    MulterModule.register({
-      limits: {
-        fileSize: 5 * 1024 * 1024, // 5MB
-        files: 10, // Max 10 files per request
-      },
-    }),
-  ],
-  controllers: [ProjectsController],
-  providers: [
-    ProjectsService, 
-    ImageUploadService, 
-    FileUploadService, 
-    SearchService, 
-    AnalyticsService
-  ],
-  exports: [
-    ProjectsService, 
-    ImageUploadService, 
-    SearchService, 
-    AnalyticsService
-  ],
-})
-export class ProjectsModule {}
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/projects/projects.service.ts.html b/coverage/lcov-report/src/projects/projects.service.ts.html deleted file mode 100644 index 211b1ea..0000000 --- a/coverage/lcov-report/src/projects/projects.service.ts.html +++ /dev/null @@ -1,355 +0,0 @@ - - - - - - Code coverage report for src/projects/projects.service.ts - - - - - - - - - -
-
-

All files / src/projects projects.service.ts

-
- -
- 28.57% - Statements - 8/28 -
- - -
- 17.64% - Branches - 3/17 -
- - -
- 0% - Functions - 0/2 -
- - -
- 23.07% - Lines - 6/26 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -911x -1x -1x -1x -1x -  -  -  -  -  -1x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { Injectable } from '@nestjs/common';
-import { InjectRepository } from '@nestjs/typeorm';
-import { Repository, SelectQueryBuilder } from 'typeorm';
-import { Project, ProjectStatus } from './entities/project.entity';
-import {
-  GetProjectsQueryDto,
-  ProjectSortBy,
-} from './dtos/get-projects-query.dto';
- 
-@Injectable()
-export class ProjectsService {
-  constructor(
-    @InjectRepository(Project)
-    private readonly projectRepository: Repository<Project>,
-  ) {}
- 
-  async findAll(
-    query: GetProjectsQueryDto,
-  ): Promise<{ data: Partial<Project>[]; total: number }> {
-    const {
-      category,
-      status,
-      search,
-      sortBy = ProjectSortBy.NEWEST,
-      limit = 10,
-      offset = 0,
-    } = query;
- 
-    const qb: SelectQueryBuilder<Project> = this.projectRepository
-      .createQueryBuilder('project')
-      .leftJoin('project.creator', 'creator')
-      .select([
-        'project.id',
-        'project.title',
-        'project.description',
-        'project.category',
-        'project.status',
-        'project.goalAmount',
-        'project.fundsRaised',
-        'project.imageUrl',
-        'project.deadline',
-        'project.createdAt',
-        'project.updatedAt',
-        // creator info — sensitive fields excluded
-        'creator.id',
-        'creator.firstName',
-        'creator.lastName',
-        'creator.walletAddress',
-      ]);
- 
-    // Default: only APPROVED or ACTIVE projects unless a specific status is requested
-    if (status) {
-      qb.where('project.status = :status', { status });
-    } else {
-      qb.where('project.status IN (:...statuses)', {
-        statuses: [ProjectStatus.APPROVED, ProjectStatus.ACTIVE],
-      });
-    }
- 
-    if (category) {
-      qb.andWhere('project.category = :category', { category });
-    }
- 
-    if (search) {
-      qb.andWhere(
-        '(LOWER(project.title) LIKE :search OR LOWER(project.description) LIKE :search)',
-        { search: `%${search.toLowerCase()}%` },
-      );
-    }
- 
-    switch (sortBy) {
-      case ProjectSortBy.MOST_FUNDED:
-        qb.orderBy('project.fundsRaised', 'DESC');
-        break;
-      case ProjectSortBy.ENDING_SOON:
-        qb.orderBy('project.deadline', 'ASC');
-        break;
-      case ProjectSortBy.NEWEST:
-      default:
-        qb.orderBy('project.createdAt', 'DESC');
-        break;
-    }
- 
-    const total = await qb.getCount();
- 
-    const data = await qb.skip(offset).take(limit).getMany();
- 
-    return { data, total };
-  }
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/projects/providers/index.html b/coverage/lcov-report/src/projects/providers/index.html deleted file mode 100644 index 2d67000..0000000 --- a/coverage/lcov-report/src/projects/providers/index.html +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - Code coverage report for src/projects/providers - - - - - - - - - -
-
-

All files src/projects/providers

-
- -
- 0% - Statements - 0/74 -
- - -
- 0% - Branches - 0/61 -
- - -
- 0% - Functions - 0/9 -
- - -
- 0% - Lines - 0/72 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
projects.service.ts -
-
0%0/740%0/610%0/90%0/72
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/projects/providers/projects.service.ts.html b/coverage/lcov-report/src/projects/providers/projects.service.ts.html deleted file mode 100644 index e339729..0000000 --- a/coverage/lcov-report/src/projects/providers/projects.service.ts.html +++ /dev/null @@ -1,1069 +0,0 @@ - - - - - - Code coverage report for src/projects/providers/projects.service.ts - - - - - - - - - -
-
-

All files / src/projects/providers projects.service.ts

-
- -
- 0% - Statements - 0/74 -
- - -
- 0% - Branches - 0/61 -
- - -
- 0% - Functions - 0/9 -
- - -
- 0% - Lines - 0/72 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174 -175 -176 -177 -178 -179 -180 -181 -182 -183 -184 -185 -186 -187 -188 -189 -190 -191 -192 -193 -194 -195 -196 -197 -198 -199 -200 -201 -202 -203 -204 -205 -206 -207 -208 -209 -210 -211 -212 -213 -214 -215 -216 -217 -218 -219 -220 -221 -222 -223 -224 -225 -226 -227 -228 -229 -230 -231 -232 -233 -234 -235 -236 -237 -238 -239 -240 -241 -242 -243 -244 -245 -246 -247 -248 -249 -250 -251 -252 -253 -254 -255 -256 -257 -258 -259 -260 -261 -262 -263 -264 -265 -266 -267 -268 -269 -270 -271 -272 -273 -274 -275 -276 -277 -278 -279 -280 -281 -282 -283 -284 -285 -286 -287 -288 -289 -290 -291 -292 -293 -294 -295 -296 -297 -298 -299 -300 -301 -302 -303 -304 -305 -306 -307 -308 -309 -310 -311 -312 -313 -314 -315 -316 -317 -318 -319 -320 -321 -322 -323 -324 -325 -326 -327 -328 -329  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import {
-  Injectable,
-  NotFoundException,
-  BadRequestException,
-  ForbiddenException,
-} from '@nestjs/common';
-import { InjectRepository } from '@nestjs/typeorm';
-import { Repository, SelectQueryBuilder } from 'typeorm';
-import { ProjectStatus } from 'src/common/enums/project-status.enum';
-import { ProjectSortBy } from 'src/common/enums/projects-sortBy.enum';
-import { Project } from '../entities/project.entity';
-import { ProjectHistory } from '../entities/project-history.entity';
-import { Donation } from '../../donations/entities/donation.entity';
-import { CreateProjectDto } from '../dto/create-project.dto';
-import { GetProjectsQueryDto } from '../dto/get-projects-query.dto';
-import { UpdateProjectStatusDto } from '../dto/update-project-status.dto';
- 
-@Injectable()
-export class ProjectsService {
-  constructor(
-    @InjectRepository(Project)
-    private readonly projectRepository: Repository<Project>,
-    @InjectRepository(Donation)
-    private readonly donationRepository: Repository<Donation>,
-    @InjectRepository(ProjectHistory)
-    private readonly projectHistoryRepository: Repository<ProjectHistory>,
-  ) {}
- 
-  // create a new project
-  public async create(
-    createProjectDto: CreateProjectDto,
-    creatorId: string,
-  ): Promise<Project> {
-    const {
-      projectName,
-      projectDesc,
-      projectImage,
-      fundingGoal,
-      deadline,
-      category,
-    } = createProjectDto;
- 
-    // Validate that the deadline is in the future
-    const deadlineDate = new Date(deadline);
-    if (isNaN(deadlineDate.getTime())) {
-      throw new BadRequestException('Deadline must be a valid date');
-    }
-    if (deadlineDate <= new Date()) {
-      throw new BadRequestException('Deadline must be a future date');
-    }
- 
-    const project = this.projectRepository.create({
-      title: projectName,
-      description: projectDesc,
-      imageUrl: projectImage,
-      goalAmount: fundingGoal,
-      deadline: deadlineDate,
-      status: ProjectStatus.PENDING,
-      progress: 0,
-      donationCount: 0,
-      fundsRaised: 0,
-      creatorId,
-      ...(category && { category }),
-    });
- 
-    return this.projectRepository.save(project);
-  }
- 
-  // get all projects with filtering, sorting, and pagination
-  public async findAll(
-    query: GetProjectsQueryDto,
-  ): Promise<{ data: Partial<Project>[]; total: number }> {
-    const {
-      category,
-      status,
-      search,
-      sortBy = ProjectSortBy.NEWEST,
-      limit = 10,
-      offset = 0,
-    } = query;
- 
-    const qb: SelectQueryBuilder<Project> = this.projectRepository
-      .createQueryBuilder('project')
-      .leftJoin('project.creator', 'creator')
-      .select([
-        'project.id',
-        'project.title',
-        'project.description',
-        'project.category',
-        'project.status',
-        'project.goalAmount',
-        'project.fundsRaised',
-        'project.imageUrl',
-        'project.deadline',
-        'project.createdAt',
-        'project.updatedAt',
-        // creator info — sensitive fields excluded
-        'creator.id',
-        'creator.firstName',
-        'creator.lastName',
-        'creator.walletAddress',
-      ]);
- 
-    // Default: only APPROVED or ACTIVE projects unless a specific status is requested
-    if (status) {
-      qb.where('project.status = :status', { status });
-    } else {
-      qb.where('project.status IN (:...statuses)', {
-        statuses: [ProjectStatus.APPROVED, ProjectStatus.ACTIVE],
-      });
-    }
- 
-    if (category) {
-      qb.andWhere('project.category = :category', { category });
-    }
- 
-    if (search) {
-      qb.andWhere(
-        '(LOWER(project.title) LIKE :search OR LOWER(project.description) LIKE :search)',
-        { search: `%${search.toLowerCase()}%` },
-      );
-    }
- 
-    switch (sortBy) {
-      case ProjectSortBy.MOST_FUNDED:
-        qb.orderBy('project.fundsRaised', 'DESC');
-        break;
-      case ProjectSortBy.ENDING_SOON:
-        qb.orderBy('project.deadline', 'ASC');
-        break;
-      case ProjectSortBy.NEWEST:
-      default:
-        qb.orderBy('project.createdAt', 'DESC');
-        break;
-    }
- 
-    const total = await qb.getCount();
- 
-    const data = await qb.skip(offset).take(limit).getMany();
- 
-    return { data, total };
-  }
- 
-  // get detailed project info by ID (public view)
-  public async findOnePublic(id: string) {
-    const project = await this.projectRepository
-      .createQueryBuilder('project')
-      .leftJoinAndSelect('project.creator', 'creator')
-      .where('project.id = :id', { id })
-      .andWhere('project.status IN (:...statuses)', {
-        statuses: [ProjectStatus.APPROVED, ProjectStatus.ACTIVE],
-      })
-      .getOne();
- 
-    if (!project) {
-      throw new NotFoundException('Project not found');
-    }
- 
-    const donationStatsRaw = await this.donationRepository
-      .createQueryBuilder('donation')
-      .select('COUNT(donation.id)', 'totalDonations')
-      .addSelect('COALESCE(SUM(donation.amount), 0)', 'totalAmount')
-      .addSelect('COUNT(DISTINCT donation.donorId)', 'uniqueDonors')
-      .where('donation.projectId = :projectId', { projectId: id })
-      .getRawOne<{
-        totalDonations: string;
-        totalAmount: string;
-        uniqueDonors: string;
-      }>();
- 
-    const recentDonations = await this.donationRepository
-      .createQueryBuilder('donation')
-      .leftJoinAndSelect('donation.donor', 'donor')
-      .where('donation.projectId = :projectId', { projectId: id })
-      .orderBy('donation.createdAt', 'DESC')
-      .take(5)
-      .getMany();
- 
-    const goalAmount = Number(project.goalAmount) || 0;
-    const fundsRaised = Number(project.fundsRaised) || 0;
-    const progressPercentage =
-      goalAmount > 0 ? Math.min((fundsRaised / goalAmount) * 100, 100) : 0;
- 
-    return {
-      id: project.id,
-      title: project.title,
-      description: project.description,
-      imageUrl: project.imageUrl,
-      category: project.category,
-      status: project.status,
-      goalAmount,
-      fundsRaised,
-      deadline: project.deadline,
-      rejectionReason: project.rejectionReason,
-      createdAt: project.createdAt,
-      updatedAt: project.updatedAt,
-      creator: {
-        id: project.creator.id,
-        firstName: project.creator.firstName,
-        lastName: project.creator.lastName,
-        walletAddress: project.creator.walletAddress,
-        avatarUrl: project.creator.avatarUrl,
-        country: project.creator.country,
-      },
-      donationSummary: {
-        totalDonations: Number(donationStatsRaw?.totalDonations ?? 0),
-        totalAmount: Number(donationStatsRaw?.totalAmount ?? 0),
-        uniqueDonors: Number(donationStatsRaw?.uniqueDonors ?? 0),
-      },
-      progressPercentage: Number(progressPercentage.toFixed(2)),
-      recentDonations: recentDonations.map((donation) => ({
-        id: donation.id,
-        amount: Number(donation.amount),
-        transactionHash: donation.transactionHash,
-        isAnonymous: donation.isAnonymous,
-        createdAt: donation.createdAt,
-        donor:
-          donation.isAnonymous || !donation.donor
-            ? null
-            : {
-                id: donation.donor.id,
-                firstName: donation.donor.firstName,
-                lastName: donation.donor.lastName,
-                avatarUrl: donation.donor.avatarUrl,
-              },
-      })),
-    };
-  }
- 
-  // validate status transitions
-  private validateStatusTransition(
-    currentStatus: ProjectStatus,
-    newStatus: ProjectStatus,
-  ): boolean {
-    const validTransitions: Record<ProjectStatus, ProjectStatus[]> = {
-      [ProjectStatus.DRAFT]: [ProjectStatus.PENDING],
-      [ProjectStatus.PENDING]: [ProjectStatus.APPROVED, ProjectStatus.REJECTED],
-      [ProjectStatus.APPROVED]: [ProjectStatus.ACTIVE, ProjectStatus.REJECTED],
-      [ProjectStatus.ACTIVE]: [ProjectStatus.PAUSED, ProjectStatus.COMPLETED],
-      [ProjectStatus.PAUSED]: [ProjectStatus.ACTIVE, ProjectStatus.COMPLETED],
-      [ProjectStatus.COMPLETED]: [], // Completed projects cannot change status
-      [ProjectStatus.REJECTED]: [], // Rejected projects cannot change status
-    };
- 
-    return validTransitions[currentStatus]?.includes(newStatus) || false;
-  }
- 
-  // update project status
-  public async updateStatus(
-    id: string,
-    updateStatusDto: UpdateProjectStatusDto,
-    userId: string,
-    userRole: string,
-  ): Promise<Project> {
-    const project = await this.projectRepository.findOne({
-      where: { id },
-      relations: ['creator'],
-    });
- 
-    if (!project) {
-      throw new NotFoundException('Project not found');
-    }
- 
-    // Check if user is creator or admin
-    const isCreator = project.creatorId === userId;
-    const isAdmin = userRole === 'admin';
- 
-    if (!isCreator && !isAdmin) {
-      throw new ForbiddenException('Only creator or admin can change project status');
-    }
- 
-    const { status: newStatus, reason } = updateStatusDto;
- 
-    // Validate status transition
-    if (!this.validateStatusTransition(project.status, newStatus)) {
-      throw new BadRequestException(
-        `Invalid status transition from ${project.status} to ${newStatus}`,
-      );
-    }
- 
-    const previousStatus = project.status;
- 
-    // Update project status
-    project.status = newStatus;
-    await this.projectRepository.save(project);
- 
-    // Record status change in history
-    await this.projectHistoryRepository.save({
-      previousStatus,
-      newStatus,
-      reason: reason || null,
-      projectId: id,
-      changedBy: userId,
-    });
- 
-    return project;
-  }
- 
-  // auto-complete projects past deadline
-  public async autocompleteExpiredProjects(): Promise<void> {
-    const expiredProjects = await this.projectRepository
-      .createQueryBuilder('project')
-      .where('project.deadline < :now', { now: new Date() })
-      .andWhere('project.status IN (:...statuses)', {
-        statuses: [ProjectStatus.ACTIVE, ProjectStatus.PAUSED],
-      })
-      .getMany();
- 
-    for (const project of expiredProjects) {
-      project.status = ProjectStatus.COMPLETED;
-      await this.projectRepository.save(project);
- 
-      // Record auto-completion in history
-      await this.projectHistoryRepository.save({
-        previousStatus: project.status,
-        newStatus: ProjectStatus.COMPLETED,
-        reason: 'Auto-completed due to deadline',
-        projectId: project.id,
-        changedBy: 'system',
-      });
-    }
-  }
- 
-  // check if project accepts donations
-  public canAcceptDonations(project: Project): boolean {
-    return project.status === ProjectStatus.ACTIVE;
-  }
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/projects/services/analytics.service.ts.html b/coverage/lcov-report/src/projects/services/analytics.service.ts.html deleted file mode 100644 index 7acadf7..0000000 --- a/coverage/lcov-report/src/projects/services/analytics.service.ts.html +++ /dev/null @@ -1,1189 +0,0 @@ - - - - - - Code coverage report for src/projects/services/analytics.service.ts - - - - - - - - - -
-
-

All files / src/projects/services analytics.service.ts

-
- -
- 0% - Statements - 0/77 -
- - -
- 0% - Branches - 0/77 -
- - -
- 0% - Functions - 0/12 -
- - -
- 0% - Lines - 0/71 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174 -175 -176 -177 -178 -179 -180 -181 -182 -183 -184 -185 -186 -187 -188 -189 -190 -191 -192 -193 -194 -195 -196 -197 -198 -199 -200 -201 -202 -203 -204 -205 -206 -207 -208 -209 -210 -211 -212 -213 -214 -215 -216 -217 -218 -219 -220 -221 -222 -223 -224 -225 -226 -227 -228 -229 -230 -231 -232 -233 -234 -235 -236 -237 -238 -239 -240 -241 -242 -243 -244 -245 -246 -247 -248 -249 -250 -251 -252 -253 -254 -255 -256 -257 -258 -259 -260 -261 -262 -263 -264 -265 -266 -267 -268 -269 -270 -271 -272 -273 -274 -275 -276 -277 -278 -279 -280 -281 -282 -283 -284 -285 -286 -287 -288 -289 -290 -291 -292 -293 -294 -295 -296 -297 -298 -299 -300 -301 -302 -303 -304 -305 -306 -307 -308 -309 -310 -311 -312 -313 -314 -315 -316 -317 -318 -319 -320 -321 -322 -323 -324 -325 -326 -327 -328 -329 -330 -331 -332 -333 -334 -335 -336 -337 -338 -339 -340 -341 -342 -343 -344 -345 -346 -347 -348 -349 -350 -351 -352 -353 -354 -355 -356 -357 -358 -359 -360 -361 -362 -363 -364 -365 -366 -367 -368 -369  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { Injectable, NotFoundException, ForbiddenException, Logger } from '@nestjs/common';
-import { InjectRepository } from '@nestjs/typeorm';
-import { Repository, SelectQueryBuilder } from 'typeorm';
-import { Project } from '../entities/project.entity';
-import { Donation } from '../../donations/entities/donation.entity';
-import { User } from '../../users/entities/user.entity';
-import { AnalyticsQueryDto } from '../dto/analytics-query.dto';
- 
-@Injectable()
-export class AnalyticsService {
-  private readonly logger = new Logger(AnalyticsService.name);
- 
-  constructor(
-    @InjectRepository(Project)
-    private readonly projectRepository: Repository<Project>,
-    @InjectRepository(Donation)
-    private readonly donationRepository: Repository<Donation>,
-    @InjectRepository(User)
-    private readonly userRepository: Repository<User>,
-  ) {}
- 
-  async getProjectAnalytics(
-    projectId: string,
-    userId: string,
-    userRole: string,
-    query: AnalyticsQueryDto,
-  ) {
-    const project = await this.projectRepository.findOne({
-      where: { id: projectId },
-      relations: ['creator'],
-    });
- 
-    if (!project) {
-      throw new NotFoundException('Project not found');
-    }
- 
-    // Check if user is creator or admin
-    const isCreator = project.creatorId === userId;
-    const isAdmin = userRole === 'admin';
- 
-    if (!isCreator && !isAdmin) {
-      throw new ForbiddenException('Only creator or admin can access project analytics');
-    }
- 
-    const { startDate, endDate, granularity = 'daily', timezone = 'UTC' } = query;
- 
-    // Parse dates
-    const start = startDate ? new Date(startDate) : new Date(Date.now() - 30 * 24 * 60 * 60 * 1000);
-    const end = endDate ? new Date(endDate) : new Date();
- 
-    // Get total statistics
-    const totalStats = await this.getTotalStats(projectId, start, end);
- 
-    // Get donation trends
-    const donationTrends = await this.getDonationTrends(projectId, start, end, granularity, timezone);
- 
-    // Get top donors (anonymized option)
-    const topDonors = await this.getTopDonors(projectId, start, end, isCreator);
- 
-    // Get funding velocity
-    const fundingVelocity = await this.getFundingVelocity(projectId, start, end, granularity);
- 
-    return {
-      project: {
-        id: project.id,
-        title: project.title,
-        status: project.status,
-        goalAmount: Number(project.goalAmount),
-        fundsRaised: Number(project.fundsRaised),
-        progress: Number(project.progress),
-        deadline: project.deadline,
-      },
-      period: {
-        startDate: start.toISOString(),
-        endDate: end.toISOString(),
-        granularity,
-      },
-      totalStats,
-      donationTrends,
-      topDonors,
-      fundingVelocity,
-    };
-  }
- 
-  private async getTotalStats(projectId: string, startDate: Date, endDate: Date) {
-    const stats = await this.donationRepository
-      .createQueryBuilder('donation')
-      .select('COUNT(donation.id)', 'totalDonations')
-      .addSelect('COALESCE(SUM(donation.amount), 0)', 'totalAmount')
-      .addSelect('COUNT(DISTINCT donation.donorId)', 'uniqueDonors')
-      .addSelect('AVG(donation.amount)', 'averageDonation')
-      .addSelect('MAX(donation.amount)', 'maxDonation')
-      .addSelect('MIN(donation.amount)', 'minDonation')
-      .where('donation.projectId = :projectId', { projectId })
-      .andWhere('donation.createdAt BETWEEN :startDate AND :endDate', {
-        startDate,
-        endDate,
-      })
-      .getRawOne<{
-        totalDonations: string;
-        totalAmount: string;
-        uniqueDonors: string;
-        averageDonation: string;
-        maxDonation: string;
-        minDonation: string;
-      }>();
- 
-    return {
-      totalDonations: Number(stats?.totalDonations ?? 0),
-      totalAmount: Number(stats?.totalAmount ?? 0),
-      uniqueDonors: Number(stats?.uniqueDonors ?? 0),
-      averageDonation: Number(stats?.averageDonation ?? 0),
-      maxDonation: Number(stats?.maxDonation ?? 0),
-      minDonation: Number(stats?.minDonation ?? 0),
-    };
-  }
- 
-  private async getDonationTrends(
-    projectId: string,
-    startDate: Date,
-    endDate: Date,
-    granularity: string,
-    timezone: string,
-  ) {
-    let dateFormat: string;
-    switch (granularity) {
-      case 'weekly':
-        dateFormat = "DATE_TRUNC('week', donation.createdAt AT TIME ZONE :timezone)";
-        break;
-      case 'monthly':
-        dateFormat = "DATE_TRUNC('month', donation.createdAt AT TIME ZONE :timezone)";
-        break;
-      case 'daily':
-      default:
-        dateFormat = "DATE_TRUNC('day', donation.createdAt AT TIME ZONE :timezone)";
-        break;
-    }
- 
-    const trends = await this.donationRepository
-      .createQueryBuilder('donation')
-      .select(dateFormat, 'period')
-      .addSelect('COUNT(donation.id)', 'donationCount')
-      .addSelect('COALESCE(SUM(donation.amount), 0)', 'totalAmount')
-      .addSelect('COUNT(DISTINCT donation.donorId)', 'uniqueDonors')
-      .where('donation.projectId = :projectId', { projectId })
-      .andWhere('donation.createdAt BETWEEN :startDate AND :endDate', {
-        startDate,
-        endDate,
-      })
-      .groupBy('period')
-      .orderBy('period', 'ASC')
-      .setParameter('timezone', timezone)
-      .getRawMany<{
-        period: Date;
-        donationCount: string;
-        totalAmount: string;
-        uniqueDonors: string;
-      }>();
- 
-    return trends.map(trend => ({
-      period: trend.period.toISOString(),
-      donationCount: Number(trend.donationCount),
-      totalAmount: Number(trend.totalAmount),
-      uniqueDonors: Number(trend.uniqueDonors),
-    }));
-  }
- 
-  private async getTopDonors(projectId: string, startDate: Date, endDate: Date, isCreator: boolean) {
-    const query = this.donationRepository
-      .createQueryBuilder('donation')
-      .leftJoin('donation.donor', 'donor')
-      .select('donor.id', 'donorId')
-      .addSelect('donor.firstName', 'firstName')
-      .addSelect('donor.lastName', 'lastName')
-      .addSelect('donor.avatarUrl', 'avatarUrl')
-      .addSelect('COUNT(donation.id)', 'donationCount')
-      .addSelect('COALESCE(SUM(donation.amount), 0)', 'totalAmount')
-      .addSelect('MAX(donation.createdAt)', 'lastDonationDate')
-      .where('donation.projectId = :projectId', { projectId })
-      .andWhere('donation.createdAt BETWEEN :startDate AND :endDate', {
-        startDate,
-        endDate,
-      })
-      .andWhere('donation.isAnonymous = :isAnonymous', { isAnonymous: false })
-      .groupBy('donor.id')
-      .orderBy('totalAmount', 'DESC')
-      .limit(10);
- 
-    const donors = await query.getRawMany<{
-      donorId: string;
-      firstName: string;
-      lastName: string;
-      avatarUrl: string;
-      donationCount: string;
-      totalAmount: string;
-      lastDonationDate: Date;
-    }>();
- 
-    // If not the creator, anonymize donor information
-    return donors.map(donor => ({
-      id: isCreator ? donor.donorId : null,
-      firstName: isCreator ? donor.firstName : null,
-      lastName: isCreator ? donor.lastName : null,
-      avatarUrl: isCreator ? donor.avatarUrl : null,
-      donationCount: Number(donor.donationCount),
-      totalAmount: Number(donor.totalAmount),
-      lastDonationDate: donor.lastDonationDate.toISOString(),
-    }));
-  }
- 
-  private async getFundingVelocity(
-    projectId: string,
-    startDate: Date,
-    endDate: Date,
-    granularity: string,
-  ) {
-    let dateFormat: string;
-    let intervalDays: number;
-    
-    switch (granularity) {
-      case 'weekly':
-        dateFormat = "DATE_TRUNC('week', createdAt)";
-        intervalDays = 7;
-        break;
-      case 'monthly':
-        dateFormat = "DATE_TRUNC('month', createdAt)";
-        intervalDays = 30;
-        break;
-      case 'daily':
-      default:
-        dateFormat = "DATE_TRUNC('day', createdAt)";
-        intervalDays = 1;
-        break;
-    }
- 
-    const velocity = await this.donationRepository
-      .createQueryBuilder('donation')
-      .select(dateFormat, 'period')
-      .addSelect('COALESCE(SUM(donation.amount), 0)', 'totalAmount')
-      .addSelect('COUNT(donation.id)', 'donationCount')
-      .where('donation.projectId = :projectId', { projectId })
-      .andWhere('donation.createdAt BETWEEN :startDate AND :endDate', {
-        startDate,
-        endDate,
-      })
-      .groupBy('period')
-      .orderBy('period', 'ASC')
-      .getRawMany<{
-        period: Date;
-        totalAmount: string;
-        donationCount: string;
-      }>();
- 
-    // Calculate velocity metrics
-    const velocityData: Array<{
-      period: string;
-      totalAmount: number;
-      donationCount: number;
-      growthRate: number;
-      averagePerDonation: number;
-    }> = [];
-    
-    for (let i = 0; i < velocity.length; i++) {
-      const current = velocity[i];
-      const previous = velocity[i - 1];
-      
-      let growthRate = 0;
-      if (previous && Number(previous.totalAmount) > 0) {
-        growthRate = ((Number(current.totalAmount) - Number(previous.totalAmount)) / Number(previous.totalAmount)) * 100;
-      }
- 
-      velocityData.push({
-        period: current.period.toISOString(),
-        totalAmount: Number(current.totalAmount),
-        donationCount: Number(current.donationCount),
-        growthRate: Number(growthRate.toFixed(2)),
-        averagePerDonation: Number(current.donationCount) > 0 ? Number(current.totalAmount) / Number(current.donationCount) : 0,
-      });
-    }
- 
-    return velocityData;
-  }
- 
-  async getCreatorAnalytics(userId: string, query: AnalyticsQueryDto) {
-    const { startDate, endDate, granularity = 'daily' } = query;
-    
-    const start = startDate ? new Date(startDate) : new Date(Date.now() - 30 * 24 * 60 * 60 * 1000);
-    const end = endDate ? new Date(endDate) : new Date();
- 
-    // Get all projects for this creator
-    const projects = await this.projectRepository.find({
-      where: { creatorId: userId },
-      select: ['id', 'title', 'status', 'goalAmount', 'fundsRaised', 'progress', 'deadline', 'createdAt'],
-    });
- 
-    const projectIds = projects.map(p => p.id);
- 
-    // Get overall statistics
-    const overallStats = await this.donationRepository
-      .createQueryBuilder('donation')
-      .select('COUNT(donation.id)', 'totalDonations')
-      .addSelect('COALESCE(SUM(donation.amount), 0)', 'totalAmount')
-      .addSelect('COUNT(DISTINCT donation.donorId)', 'uniqueDonors')
-      .addSelect('COUNT(DISTINCT donation.projectId)', 'activeProjects')
-      .where('donation.projectId IN (:...projectIds)', { projectIds })
-      .andWhere('donation.createdAt BETWEEN :startDate AND :endDate', {
-        startDate: start,
-        endDate: end,
-      })
-      .getRawOne<{
-        totalDonations: string;
-        totalAmount: string;
-        uniqueDonors: string;
-        activeProjects: string;
-      }>();
- 
-    // Get project performance comparison
-    const projectPerformance = await Promise.all(
-      projects.map(async (project) => {
-        const stats = await this.donationRepository
-          .createQueryBuilder('donation')
-          .select('COUNT(donation.id)', 'donationCount')
-          .addSelect('COALESCE(SUM(donation.amount), 0)', 'totalRaised')
-          .addSelect('COUNT(DISTINCT donation.donorId)', 'uniqueDonors')
-          .where('donation.projectId = :projectId', { projectId: project.id })
-          .andWhere('donation.createdAt BETWEEN :startDate AND :endDate', {
-            startDate: start,
-            endDate: end,
-          })
-          .getRawOne<{
-            donationCount: string;
-            totalRaised: string;
-            uniqueDonors: string;
-          }>();
- 
-        return {
-          projectId: project.id,
-          title: project.title,
-          status: project.status,
-          goalAmount: Number(project.goalAmount),
-          totalRaised: Number(project.fundsRaised),
-          periodRaised: Number(stats?.totalRaised ?? 0),
-          periodDonations: Number(stats?.donationCount ?? 0),
-          periodUniqueDonors: Number(stats?.uniqueDonors ?? 0),
-          progress: Number(project.progress),
-          deadline: project.deadline,
-          createdAt: project.createdAt,
-        };
-      }),
-    );
- 
-    return {
-      period: {
-        startDate: start.toISOString(),
-        endDate: end.toISOString(),
-        granularity,
-      },
-      overallStats: {
-        totalDonations: Number(overallStats?.totalDonations ?? 0),
-        totalAmount: Number(overallStats?.totalAmount ?? 0),
-        uniqueDonors: Number(overallStats?.uniqueDonors ?? 0),
-        activeProjects: Number(overallStats?.activeProjects ?? 0),
-        totalProjects: projects.length,
-      },
-      projectPerformance: projectPerformance.sort((a, b) => b.periodRaised - a.periodRaised),
-    };
-  }
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/projects/services/image-upload.service.ts.html b/coverage/lcov-report/src/projects/services/image-upload.service.ts.html deleted file mode 100644 index 68cea0f..0000000 --- a/coverage/lcov-report/src/projects/services/image-upload.service.ts.html +++ /dev/null @@ -1,376 +0,0 @@ - - - - - - Code coverage report for src/projects/services/image-upload.service.ts - - - - - - - - - -
-
-

All files / src/projects/services image-upload.service.ts

-
- -
- 0% - Statements - 0/37 -
- - -
- 0% - Branches - 0/24 -
- - -
- 0% - Functions - 0/4 -
- - -
- 0% - Lines - 0/34 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { Injectable, NotFoundException, BadRequestException, ForbiddenException } from '@nestjs/common';
-import { InjectRepository } from '@nestjs/typeorm';
-import { Repository } from 'typeorm';
-import { Project } from '../entities/project.entity';
-import { ProjectImage } from '../entities/project-image.entity';
-import { FileUploadService } from '../../common/services/file-upload.service';
- 
-@Injectable()
-export class ImageUploadService {
-  constructor(
-    @InjectRepository(Project)
-    private readonly projectRepository: Repository<Project>,
-    @InjectRepository(ProjectImage)
-    private readonly projectImageRepository: Repository<ProjectImage>,
-    private readonly fileUploadService: FileUploadService,
-  ) {}
- 
-  async uploadImages(
-    projectId: string,
-    files: Express.Multer.File[],
-    userId: string,
-    userRole: string,
-  ): Promise<ProjectImage[]> {
-    const project = await this.projectRepository.findOne({
-      where: { id: projectId },
-      relations: ['creator'],
-    });
- 
-    if (!project) {
-      throw new NotFoundException('Project not found');
-    }
- 
-    // Check if user is creator or admin
-    const isCreator = project.creatorId === userId;
-    const isAdmin = userRole === 'admin';
- 
-    if (!isCreator && !isAdmin) {
-      throw new ForbiddenException('Only creator or admin can upload images');
-    }
- 
-    const uploadedImages: ProjectImage[] = [];
- 
-    for (let i = 0; i < files.length; i++) {
-      const file = files[i];
-      const imageUrl = await this.fileUploadService.uploadFile(file, projectId);
- 
-      const projectImage = this.projectImageRepository.create({
-        url: imageUrl,
-        filename: file.originalname,
-        mimeType: file.mimetype,
-        size: file.size,
-        order: i,
-        projectId,
-      });
- 
-      uploadedImages.push(await this.projectImageRepository.save(projectImage));
-    }
- 
-    return uploadedImages;
-  }
- 
-  async deleteImage(
-    imageId: string,
-    userId: string,
-    userRole: string,
-  ): Promise<void> {
-    const image = await this.projectImageRepository.findOne({
-      where: { id: imageId },
-      relations: ['project', 'project.creator'],
-    });
- 
-    if (!image) {
-      throw new NotFoundException('Image not found');
-    }
- 
-    // Check if user is creator or admin
-    const isCreator = image.project.creatorId === userId;
-    const isAdmin = userRole === 'admin';
- 
-    if (!isCreator && !isAdmin) {
-      throw new ForbiddenException('Only creator or admin can delete images');
-    }
- 
-    // Delete from S3
-    await this.fileUploadService.deleteFile(image.url);
- 
-    // Delete from database
-    await this.projectImageRepository.remove(image);
-  }
- 
-  async getProjectImages(projectId: string): Promise<ProjectImage[]> {
-    return this.projectImageRepository.find({
-      where: { projectId },
-      order: { order: 'ASC' },
-    });
-  }
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/projects/services/index.html b/coverage/lcov-report/src/projects/services/index.html deleted file mode 100644 index c48d9c9..0000000 --- a/coverage/lcov-report/src/projects/services/index.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - Code coverage report for src/projects/services - - - - - - - - - -
-
-

All files src/projects/services

-
- -
- 0% - Statements - 0/207 -
- - -
- 0% - Branches - 0/156 -
- - -
- 0% - Functions - 0/23 -
- - -
- 0% - Lines - 0/195 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
analytics.service.ts -
-
0%0/770%0/770%0/120%0/71
image-upload.service.ts -
-
0%0/370%0/240%0/40%0/34
search.service.ts -
-
0%0/930%0/550%0/70%0/90
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/projects/services/search.service.ts.html b/coverage/lcov-report/src/projects/services/search.service.ts.html deleted file mode 100644 index 28b9c20..0000000 --- a/coverage/lcov-report/src/projects/services/search.service.ts.html +++ /dev/null @@ -1,865 +0,0 @@ - - - - - - Code coverage report for src/projects/services/search.service.ts - - - - - - - - - -
-
-

All files / src/projects/services search.service.ts

-
- -
- 0% - Statements - 0/93 -
- - -
- 0% - Branches - 0/55 -
- - -
- 0% - Functions - 0/7 -
- - -
- 0% - Lines - 0/90 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174 -175 -176 -177 -178 -179 -180 -181 -182 -183 -184 -185 -186 -187 -188 -189 -190 -191 -192 -193 -194 -195 -196 -197 -198 -199 -200 -201 -202 -203 -204 -205 -206 -207 -208 -209 -210 -211 -212 -213 -214 -215 -216 -217 -218 -219 -220 -221 -222 -223 -224 -225 -226 -227 -228 -229 -230 -231 -232 -233 -234 -235 -236 -237 -238 -239 -240 -241 -242 -243 -244 -245 -246 -247 -248 -249 -250 -251 -252 -253 -254 -255 -256 -257 -258 -259 -260 -261  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { Injectable, Logger } from '@nestjs/common';
-import { InjectRepository } from '@nestjs/typeorm';
-import { Repository, SelectQueryBuilder } from 'typeorm';
-import { Project } from '../entities/project.entity';
-import { ProjectCategory } from 'src/common/enums/project-category.enum';
-import { ProjectStatus } from 'src/common/enums/project-status.enum';
-import { ProjectSortBy } from 'src/common/enums/projects-sortBy.enum';
-import { SearchProjectsDto } from '../dto/search-projects.dto';
- 
-@Injectable()
-export class SearchService {
-  private readonly logger = new Logger(SearchService.name);
- 
-  constructor(
-    @InjectRepository(Project)
-    private readonly projectRepository: Repository<Project>,
-  ) {}
- 
-  async searchProjects(searchDto: SearchProjectsDto): Promise<{
-    data: Partial<Project>[];
-    total: number;
-    suggestions?: string[];
-  }> {
-    const {
-      search,
-      category,
-      status,
-      categories,
-      statuses,
-      sortBy = ProjectSortBy.NEWEST,
-      limit = 10,
-      offset = 0,
-      minGoal,
-      maxGoal,
-      minRaised,
-      maxRaised,
-    } = searchDto;
- 
-    const qb: SelectQueryBuilder<Project> = this.projectRepository
-      .createQueryBuilder('project')
-      .leftJoin('project.creator', 'creator')
-      .select([
-        'project.id',
-        'project.title',
-        'project.description',
-        'project.category',
-        'project.status',
-        'project.goalAmount',
-        'project.fundsRaised',
-        'project.imageUrl',
-        'project.deadline',
-        'project.createdAt',
-        'project.updatedAt',
-        // creator info — sensitive fields excluded
-        'creator.id',
-        'creator.firstName',
-        'creator.lastName',
-        'creator.walletAddress',
-      ]);
- 
-    // Build search conditions
-    const whereConditions: string[] = [];
-    const parameters: Record<string, any> = {};
- 
-    // Default: only APPROVED or ACTIVE projects unless a specific status is requested
-    if (statuses && statuses.length > 0) {
-      whereConditions.push('project.status IN (:...statuses)');
-      parameters.statuses = statuses;
-    } else if (status) {
-      whereConditions.push('project.status = :status');
-      parameters.status = status;
-    } else {
-      whereConditions.push('project.status IN (:...defaultStatuses)');
-      parameters.defaultStatuses = [ProjectStatus.APPROVED, ProjectStatus.ACTIVE];
-    }
- 
-    // Category filters
-    if (categories && categories.length > 0) {
-      whereConditions.push('project.category IN (:...categories)');
-      parameters.categories = categories;
-    } else if (category) {
-      whereConditions.push('project.category = :category');
-      parameters.category = category;
-    }
- 
-    // Goal amount filters
-    if (minGoal) {
-      whereConditions.push('project.goalAmount >= :minGoal');
-      parameters.minGoal = parseFloat(minGoal);
-    }
-    if (maxGoal) {
-      whereConditions.push('project.goalAmount <= :maxGoal');
-      parameters.maxGoal = parseFloat(maxGoal);
-    }
- 
-    // Funds raised filters
-    if (minRaised) {
-      whereConditions.push('project.fundsRaised >= :minRaised');
-      parameters.minRaised = parseFloat(minRaised);
-    }
-    if (maxRaised) {
-      whereConditions.push('project.fundsRaised <= :maxRaised');
-      parameters.maxRaised = parseFloat(maxRaised);
-    }
- 
-    // Full-text search
-    if (search && search.trim()) {
-      const searchTerm = search.trim();
-      
-      // Enhanced search with relevance scoring
-      whereConditions.push(
-        `(LOWER(project.title) LIKE :search OR LOWER(project.description) LIKE :search)`
-      );
-      parameters.search = `%${searchTerm.toLowerCase()}%`;
-      
-      // Add relevance scoring
-      qb.addSelect(
-        `
-        CASE
-          WHEN LOWER(project.title) LIKE :exactMatch THEN 100
-          WHEN LOWER(project.title) LIKE :startsWith THEN 80
-          WHEN LOWER(project.title) LIKE :contains THEN 60
-          WHEN LOWER(project.description) LIKE :exactMatch THEN 40
-          WHEN LOWER(project.description) LIKE :startsWith THEN 30
-          WHEN LOWER(project.description) LIKE :contains THEN 20
-          ELSE 10
-        END
-        `,
-        'relevance'
-      );
-      
-      parameters.exactMatch = `${searchTerm.toLowerCase()}`;
-      parameters.startsWith = `${searchTerm.toLowerCase()}%`;
-      parameters.contains = `%${searchTerm.toLowerCase()}%`;
-    }
- 
-    // Apply where conditions
-    if (whereConditions.length > 0) {
-      qb.where(whereConditions.join(' AND '), parameters);
-    }
- 
-    // Sorting with relevance for search results
-    if (search && search.trim()) {
-      qb.orderBy('relevance', 'DESC')
-        .addOrderBy('project.createdAt', 'DESC');
-    } else {
-      switch (sortBy) {
-        case ProjectSortBy.MOST_FUNDED:
-          qb.orderBy('project.fundsRaised', 'DESC');
-          break;
-        case ProjectSortBy.ENDING_SOON:
-          qb.orderBy('project.deadline', 'ASC');
-          break;
-        case ProjectSortBy.NEWEST:
-        default:
-          qb.orderBy('project.createdAt', 'DESC');
-          break;
-      }
-    }
- 
-    const total = await qb.getCount();
-    const data = await qb.skip(offset).take(limit).getMany();
- 
-    // Generate suggestions based on search term
-    let suggestions: string[] = [];
-    if (search && search.trim()) {
-      suggestions = await this.generateSearchSuggestions(search.trim());
-    }
- 
-    return { data, total, suggestions };
-  }
- 
-  private async generateSearchSuggestions(searchTerm: string): Promise<string[]> {
-    const suggestions: string[] = [];
-    
-    // Get project titles that contain similar terms
-    const similarTitles = await this.projectRepository
-      .createQueryBuilder('project')
-      .select('project.title', 'title')
-      .where('project.status IN (:...statuses)', {
-        statuses: [ProjectStatus.APPROVED, ProjectStatus.ACTIVE],
-      })
-      .andWhere('LOWER(project.title) LIKE :search', {
-        search: `%${searchTerm.toLowerCase()}%`,
-      })
-      .andWhere('LOWER(project.title) != :exactSearch', {
-        exactSearch: searchTerm.toLowerCase(),
-      })
-      .orderBy('project.fundsRaised', 'DESC')
-      .limit(5)
-      .getRawMany();
- 
-    suggestions.push(...similarTitles.map(item => item.title));
- 
-    // Get category suggestions
-    const categories = Object.values(ProjectCategory);
-    const matchingCategories = categories.filter(cat =>
-      cat.toLowerCase().includes(searchTerm.toLowerCase())
-    );
-    suggestions.push(...matchingCategories);
- 
-    return suggestions.slice(0, 8); // Limit to 8 suggestions
-  }
- 
-  async getSearchAnalytics(): Promise<{
-    totalProjects: number;
-    categoryDistribution: Record<string, number>;
-    statusDistribution: Record<string, number>;
-    averageGoal: number;
-    averageRaised: number;
-  }> {
-    const stats = await this.projectRepository
-      .createQueryBuilder('project')
-      .select('COUNT(project.id)', 'totalProjects')
-      .addSelect('project.category', 'category')
-      .addSelect('project.status', 'status')
-      .addSelect('AVG(project.goalAmount)', 'avgGoal')
-      .addSelect('AVG(project.fundsRaised)', 'avgRaised')
-      .where('project.status IN (:...statuses)', {
-        statuses: [ProjectStatus.APPROVED, ProjectStatus.ACTIVE],
-      })
-      .groupBy('project.category, project.status')
-      .getRawMany();
- 
-    const totalProjects = await this.projectRepository
-      .createQueryBuilder('project')
-      .where('project.status IN (:...statuses)', {
-        statuses: [ProjectStatus.APPROVED, ProjectStatus.ACTIVE],
-      })
-      .getCount();
- 
-    const categoryDistribution: Record<string, number> = {};
-    const statusDistribution: Record<string, number> = {};
-    let totalGoal = 0;
-    let totalRaised = 0;
-    let count = 0;
- 
-    stats.forEach(stat => {
-      const category = stat.category;
-      const status = stat.status;
-      
-      categoryDistribution[category] = (categoryDistribution[category] || 0) + 1;
-      statusDistribution[status] = (statusDistribution[status] || 0) + 1;
-      
-      if (stat.avgGoal) {
-        totalGoal += parseFloat(stat.avgGoal);
-        totalRaised += parseFloat(stat.avgRaised);
-        count++;
-      }
-    });
- 
-    return {
-      totalProjects,
-      categoryDistribution,
-      statusDistribution,
-      averageGoal: count > 0 ? totalGoal / count : 0,
-      averageRaised: count > 0 ? totalRaised / count : 0,
-    };
-  }
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/types/index.html b/coverage/lcov-report/src/types/index.html deleted file mode 100644 index 5d26642..0000000 --- a/coverage/lcov-report/src/types/index.html +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - Code coverage report for src/types - - - - - - - - - -
-
-

All files src/types

-
- -
- 0% - Statements - 0/0 -
- - -
- 0% - Branches - 0/0 -
- - -
- 0% - Functions - 0/0 -
- - -
- 0% - Lines - 0/0 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
multer.d.ts -
-
0%0/00%0/00%0/00%0/0
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/types/multer.d.ts.html b/coverage/lcov-report/src/types/multer.d.ts.html deleted file mode 100644 index 7a35da0..0000000 --- a/coverage/lcov-report/src/types/multer.d.ts.html +++ /dev/null @@ -1,142 +0,0 @@ - - - - - - Code coverage report for src/types/multer.d.ts - - - - - - - - - -
-
-

All files / src/types multer.d.ts

-
- -
- 0% - Statements - 0/0 -
- - -
- 0% - Branches - 0/0 -
- - -
- 0% - Functions - 0/0 -
- - -
- 0% - Lines - 0/0 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
declare global {
-  namespace Express {
-    namespace Multer {
-      interface File {
-        fieldname: string;
-        originalname: string;
-        encoding: string;
-        mimetype: string;
-        size: number;
-        destination: string;
-        filename: string;
-        path: string;
-        buffer: Buffer;
-      }
-    }
-  }
-}
- 
-export {};
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/users/admin-users.controller.ts.html b/coverage/lcov-report/src/users/admin-users.controller.ts.html deleted file mode 100644 index 5d8c0f6..0000000 --- a/coverage/lcov-report/src/users/admin-users.controller.ts.html +++ /dev/null @@ -1,325 +0,0 @@ - - - - - - Code coverage report for src/users/admin-users.controller.ts - - - - - - - - - -
-
-

All files / src/users admin-users.controller.ts

-
- -
- 0% - Statements - 0/21 -
- - -
- 0% - Branches - 0/16 -
- - -
- 0% - Functions - 0/5 -
- - -
- 0% - Lines - 0/19 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import {
-  Controller,
-  Delete,
-  Get,
-  HttpCode,
-  HttpStatus,
-  Param,
-  Patch,
-  Query,
-  UseGuards,
-  Body,
-} from '@nestjs/common';
-import {
-  ApiBearerAuth,
-  ApiOperation,
-  ApiParam,
-  ApiResponse,
-  ApiTags,
-} from '@nestjs/swagger';
-import { Roles } from '../common/decorators/roles.decorator';
-import { RolesGuard } from '../common/guards/roles.guard';
-import { AdminGetUsersQueryDto } from './dto/admin-get-users-query.dto';
-import { UpdateUserRoleDto } from './dto/update-user-role.dto';
-import { UserRole } from 'src/common/enums/user-role.enum';
-import { UsersService } from './providers/users.service';
- 
-@ApiTags('Users')
-@ApiBearerAuth('JWT-auth')
-@UseGuards(RolesGuard)
-@Roles(UserRole.ADMIN)
-@Controller('admin/users')
-export class AdminUsersController {
-  constructor(private readonly usersService: UsersService) {}
- 
-  @Get()
-  @HttpCode(HttpStatus.OK)
-  @ApiOperation({
-    summary: 'Get users with pagination and filters (Admin only)',
-  })
-  @ApiResponse({ status: 200, description: 'Users retrieved successfully' })
-  async findAll(@Query() query: AdminGetUsersQueryDto) {
-    const { data, total } = await this.usersService.findAllForAdmin(query);
-    return {
-      data,
-      total,
-      limit: query.limit ?? 10,
-      offset: query.offset ?? 0,
-    };
-  }
- 
-  @Get(':id')
-  @HttpCode(HttpStatus.OK)
-  @ApiOperation({ summary: 'Get user by ID (Admin only)' })
-  @ApiParam({ name: 'id', description: 'User ID' })
-  @ApiResponse({ status: 200, description: 'User retrieved successfully' })
-  @ApiResponse({ status: 404, description: 'User not found' })
-  async findOne(@Param('id') id: string) {
-    return this.usersService.getUserByIdForAdmin(id);
-  }
- 
-  @Patch(':id/role')
-  @HttpCode(HttpStatus.OK)
-  @ApiOperation({ summary: 'Update user role (Admin only)' })
-  @ApiParam({ name: 'id', description: 'User ID' })
-  @ApiResponse({ status: 200, description: 'User role updated successfully' })
-  @ApiResponse({ status: 404, description: 'User not found' })
-  async updateRole(@Param('id') id: string, @Body() dto: UpdateUserRoleDto) {
-    return this.usersService.updateUserRole(id, dto.role);
-  }
- 
-  @Delete(':id')
-  @HttpCode(HttpStatus.OK)
-  @ApiOperation({ summary: 'Soft delete user by ID (Admin only)' })
-  @ApiParam({ name: 'id', description: 'User ID' })
-  @ApiResponse({ status: 200, description: 'User soft-deleted successfully' })
-  @ApiResponse({ status: 404, description: 'User not found' })
-  async softDelete(@Param('id') id: string) {
-    return this.usersService.softDeleteUser(id);
-  }
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/users/dto/admin-get-users-query.dto.ts.html b/coverage/lcov-report/src/users/dto/admin-get-users-query.dto.ts.html deleted file mode 100644 index d051868..0000000 --- a/coverage/lcov-report/src/users/dto/admin-get-users-query.dto.ts.html +++ /dev/null @@ -1,268 +0,0 @@ - - - - - - Code coverage report for src/users/dto/admin-get-users-query.dto.ts - - - - - - - - - -
-
-

All files / src/users/dto admin-get-users-query.dto.ts

-
- -
- 0% - Statements - 0/15 -
- - -
- 0% - Branches - 0/8 -
- - -
- 0% - Functions - 0/2 -
- - -
- 0% - Lines - 0/13 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { Type } from 'class-transformer';
-import { IsEnum, IsInt, IsOptional, Matches, Max, Min } from 'class-validator';
-import { ApiPropertyOptional } from '@nestjs/swagger';
-import { UserRole } from 'src/common/enums/user-role.enum';
-import { KYCStatus } from 'src/common/enums/kyc-status.enum';
- 
-export class AdminGetUsersQueryDto {
-  @ApiPropertyOptional({
-    description: 'Filter users by role',
-    enum: UserRole,
-    example: UserRole.USER,
-  })
-  @IsOptional()
-  @IsEnum(UserRole)
-  role?: UserRole;
- 
-  @ApiPropertyOptional({
-    name: 'kyc_status',
-    description: 'Filter users by KYC status',
-    enum: KYCStatus,
-    example: KYCStatus.PENDING,
-  })
-  @IsOptional()
-  @IsEnum(KYCStatus)
-  kyc_status?: KYCStatus;
- 
-  @ApiPropertyOptional({
-    name: 'created_date',
-    description: 'Filter users created on a specific date (YYYY-MM-DD)',
-    example: '2026-02-25',
-  })
-  @IsOptional()
-  @Matches(/^\d{4}-\d{2}-\d{2}$/)
-  created_date?: string;
- 
-  @ApiPropertyOptional({
-    description: 'Number of results per page',
-    minimum: 1,
-    maximum: 100,
-    default: 10,
-    example: 10,
-  })
-  @IsOptional()
-  @Type(() => Number)
-  @IsInt()
-  @Min(1)
-  @Max(100)
-  limit?: number = 10;
- 
-  @ApiPropertyOptional({
-    description: 'Number of results to skip (for pagination)',
-    minimum: 0,
-    default: 0,
-    example: 0,
-  })
-  @IsOptional()
-  @Type(() => Number)
-  @IsInt()
-  @Min(0)
-  offset?: number = 0;
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/users/dto/change-password.dto.ts.html b/coverage/lcov-report/src/users/dto/change-password.dto.ts.html deleted file mode 100644 index 27abccf..0000000 --- a/coverage/lcov-report/src/users/dto/change-password.dto.ts.html +++ /dev/null @@ -1,175 +0,0 @@ - - - - - - Code coverage report for src/users/dto/change-password.dto.ts - - - - - - - - - -
-
-

All files / src/users/dto change-password.dto.ts

-
- -
- 0% - Statements - 0/5 -
- - -
- 100% - Branches - 0/0 -
- - -
- 100% - Functions - 0/0 -
- - -
- 0% - Lines - 0/5 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { IsNotEmpty, IsString, MinLength, Matches } from 'class-validator';
-import { ApiProperty } from '@nestjs/swagger';
- 
-export class ChangePasswordDto {
-  @ApiProperty({
-    description: 'Current password',
-    example: 'OldPass123!',
-  })
-  @IsString()
-  @IsNotEmpty()
-  currentPassword: string;
- 
-  @ApiProperty({
-    description:
-      'New password (min 8 chars, must contain uppercase, lowercase, number, and special char)',
-    example: 'NewPass123!',
-    minLength: 8,
-  })
-  @IsString()
-  @IsNotEmpty()
-  @MinLength(8, { message: 'Password must be at least 8 characters long' })
-  @Matches(
-    /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]+$/,
-    {
-      message:
-        'Password must contain at least one uppercase letter, one lowercase letter, one number, and one special character',
-    },
-  )
-  newPassword: string;
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/users/dto/forgot-password.dto.ts.html b/coverage/lcov-report/src/users/dto/forgot-password.dto.ts.html deleted file mode 100644 index 48c5b14..0000000 --- a/coverage/lcov-report/src/users/dto/forgot-password.dto.ts.html +++ /dev/null @@ -1,124 +0,0 @@ - - - - - - Code coverage report for src/users/dto/forgot-password.dto.ts - - - - - - - - - -
-
-

All files / src/users/dto forgot-password.dto.ts

-
- -
- 0% - Statements - 0/4 -
- - -
- 100% - Branches - 0/0 -
- - -
- 100% - Functions - 0/0 -
- - -
- 0% - Lines - 0/4 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { IsEmail, IsNotEmpty } from 'class-validator';
-import { ApiProperty } from '@nestjs/swagger';
- 
-export class ForgotPasswordDto {
-  @ApiProperty({
-    description: 'User email address for password reset',
-    example: 'user@example.com',
-    format: 'email',
-  })
-  @IsEmail()
-  @IsNotEmpty()
-  email: string;
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/users/dto/index.html b/coverage/lcov-report/src/users/dto/index.html deleted file mode 100644 index 2de41a6..0000000 --- a/coverage/lcov-report/src/users/dto/index.html +++ /dev/null @@ -1,236 +0,0 @@ - - - - - - Code coverage report for src/users/dto - - - - - - - - - -
-
-

All files src/users/dto

-
- -
- 0% - Statements - 0/73 -
- - -
- 0% - Branches - 0/32 -
- - -
- 0% - Functions - 0/2 -
- - -
- 0% - Lines - 0/71 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
admin-get-users-query.dto.ts -
-
0%0/150%0/80%0/20%0/13
change-password.dto.ts -
-
0%0/5100%0/0100%0/00%0/5
forgot-password.dto.ts -
-
0%0/4100%0/0100%0/00%0/4
profile-response.dto.ts -
-
0%0/200%0/16100%0/00%0/20
reset-password.dto.ts -
-
0%0/5100%0/0100%0/00%0/5
submit-kyc.dto.ts -
-
0%0/4100%0/0100%0/00%0/4
update-kyc.dto.ts -
-
0%0/60%0/4100%0/00%0/6
update-user-role.dto.ts -
-
0%0/50%0/4100%0/00%0/5
update-user.dto.ts -
-
0%0/9100%0/0100%0/00%0/9
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/users/dto/profile-response.dto.ts.html b/coverage/lcov-report/src/users/dto/profile-response.dto.ts.html deleted file mode 100644 index b64b6cd..0000000 --- a/coverage/lcov-report/src/users/dto/profile-response.dto.ts.html +++ /dev/null @@ -1,382 +0,0 @@ - - - - - - Code coverage report for src/users/dto/profile-response.dto.ts - - - - - - - - - -
-
-

All files / src/users/dto profile-response.dto.ts

-
- -
- 0% - Statements - 0/20 -
- - -
- 0% - Branches - 0/16 -
- - -
- 100% - Functions - 0/0 -
- - -
- 0% - Lines - 0/20 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { ApiProperty } from '@nestjs/swagger';
-import { KYCStatus } from 'src/common/enums/kyc-status.enum';
-import { UserRole } from 'src/common/enums/user-role.enum';
- 
-export class ProfileResponseDto {
-  @ApiProperty({
-    description: 'User unique identifier',
-    example: '550e8400-e29b-41d4-a716-446655440000',
-  })
-  id: string;
- 
-  @ApiProperty({
-    description: 'User email address',
-    example: 'user@example.com',
-  })
-  email: string;
- 
-  @ApiProperty({ description: 'User first name', example: 'John' })
-  firstName: string;
- 
-  @ApiProperty({ description: 'User last name', example: 'Doe' })
-  lastName: string;
- 
-  @ApiProperty({
-    description: 'User role',
-    enum: UserRole,
-    example: UserRole.DONOR,
-  })
-  role: UserRole;
- 
-  @ApiProperty({
-    description: 'Stellar wallet address',
-    example: 'GAA2M7F4E3C4D4E5F6G7H8I9J0K1L2M3N4O5P6Q7R8S9T0U1V2W3X4Y5Z6',
-    nullable: true,
-  })
-  walletAddress: string | null;
- 
-  @ApiProperty({
-    description: 'User country',
-    example: 'United States',
-    nullable: true,
-  })
-  country: string | null;
- 
-  @ApiProperty({
-    description: 'User bio',
-    example: 'Passionate about social impact',
-    nullable: true,
-  })
-  bio: string | null;
- 
-  @ApiProperty({
-    description: 'Avatar URL',
-    example: 'https://example.com/avatar.jpg',
-    nullable: true,
-  })
-  avatarUrl: string | null;
- 
-  @ApiProperty({ description: 'Whether email is verified', example: true })
-  isEmailVerified: boolean;
- 
-  @ApiProperty({
-    description: 'KYC verification status',
-    enum: KYCStatus,
-    example: KYCStatus.APPROVED,
-  })
-  kycStatus: KYCStatus;
- 
-  @ApiProperty({
-    description: 'When KYC was submitted',
-    format: 'date-time',
-    nullable: true,
-  })
-  kycSubmittedAt: Date | null;
- 
-  @ApiProperty({
-    description: 'When KYC was verified',
-    format: 'date-time',
-    nullable: true,
-  })
-  kycVerifiedAt: Date | null;
- 
-  @ApiProperty({
-    description: 'Account creation timestamp',
-    format: 'date-time',
-  })
-  createdAt: Date;
- 
-  @ApiProperty({ description: 'Last update timestamp', format: 'date-time' })
-  updatedAt: Date;
- 
-  @ApiProperty({
-    description: 'Profile completion percentage',
-    example: 85,
-    minimum: 0,
-    maximum: 100,
-  })
-  profileCompletionPercentage: number;
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/users/dto/reset-password.dto.ts.html b/coverage/lcov-report/src/users/dto/reset-password.dto.ts.html deleted file mode 100644 index a88de77..0000000 --- a/coverage/lcov-report/src/users/dto/reset-password.dto.ts.html +++ /dev/null @@ -1,157 +0,0 @@ - - - - - - Code coverage report for src/users/dto/reset-password.dto.ts - - - - - - - - - -
-
-

All files / src/users/dto reset-password.dto.ts

-
- -
- 0% - Statements - 0/5 -
- - -
- 100% - Branches - 0/0 -
- - -
- 100% - Functions - 0/0 -
- - -
- 0% - Lines - 0/5 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { IsNotEmpty, IsString, MinLength, Matches } from 'class-validator';
-import { ApiProperty } from '@nestjs/swagger';
- 
-export class ResetPasswordDto {
-  @ApiProperty({
-    description: 'Password reset token',
-    example: 'abc123def456',
-  })
-  @IsString()
-  @IsNotEmpty()
-  token: string;
- 
-  @ApiProperty({
-    description:
-      'New password (min 8 chars, must contain uppercase, lowercase, number, and special char)',
-    example: 'NewPass123!',
-    minLength: 8,
-  })
-  @IsString()
-  @IsNotEmpty()
-  @MinLength(8)
-  @Matches(/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]+$/)
-  newPassword: string;
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/users/dto/submit-kyc.dto.ts.html b/coverage/lcov-report/src/users/dto/submit-kyc.dto.ts.html deleted file mode 100644 index 768041d..0000000 --- a/coverage/lcov-report/src/users/dto/submit-kyc.dto.ts.html +++ /dev/null @@ -1,124 +0,0 @@ - - - - - - Code coverage report for src/users/dto/submit-kyc.dto.ts - - - - - - - - - -
-
-

All files / src/users/dto submit-kyc.dto.ts

-
- -
- 0% - Statements - 0/4 -
- - -
- 100% - Branches - 0/0 -
- - -
- 100% - Functions - 0/0 -
- - -
- 0% - Lines - 0/4 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { IsString, IsNotEmpty } from 'class-validator';
-import { ApiProperty } from '@nestjs/swagger';
- 
-export class SubmitKYCDto {
-  @ApiProperty({
-    description: 'URL to KYC document (ID, passport, etc.)',
-    example: 'https://storage.example.com/kyc/doc123.pdf',
-    format: 'url',
-  })
-  @IsString()
-  @IsNotEmpty()
-  documentUrl: string;
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/users/dto/update-kyc.dto.ts.html b/coverage/lcov-report/src/users/dto/update-kyc.dto.ts.html deleted file mode 100644 index 1871cfb..0000000 --- a/coverage/lcov-report/src/users/dto/update-kyc.dto.ts.html +++ /dev/null @@ -1,151 +0,0 @@ - - - - - - Code coverage report for src/users/dto/update-kyc.dto.ts - - - - - - - - - -
-
-

All files / src/users/dto update-kyc.dto.ts

-
- -
- 0% - Statements - 0/6 -
- - -
- 0% - Branches - 0/4 -
- - -
- 100% - Functions - 0/0 -
- - -
- 0% - Lines - 0/6 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { IsEnum, IsNotEmpty, IsOptional, IsString } from 'class-validator';
-import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
-import { KYCStatus } from 'src/common/enums/kyc-status.enum';
- 
-export class UpdateKYCDto {
-  @ApiProperty({
-    description: 'New KYC status',
-    enum: KYCStatus,
-    example: KYCStatus.APPROVED,
-  })
-  @IsEnum(KYCStatus)
-  @IsNotEmpty()
-  status: KYCStatus;
- 
-  @ApiPropertyOptional({
-    description: 'Reason for rejection (required if status is REJECTED)',
-    example: 'Document unclear or expired',
-  })
-  @IsString()
-  @IsOptional()
-  rejectionReason?: string;
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/users/dto/update-user-role.dto.ts.html b/coverage/lcov-report/src/users/dto/update-user-role.dto.ts.html deleted file mode 100644 index 33f57a3..0000000 --- a/coverage/lcov-report/src/users/dto/update-user-role.dto.ts.html +++ /dev/null @@ -1,124 +0,0 @@ - - - - - - Code coverage report for src/users/dto/update-user-role.dto.ts - - - - - - - - - -
-
-

All files / src/users/dto update-user-role.dto.ts

-
- -
- 0% - Statements - 0/5 -
- - -
- 0% - Branches - 0/4 -
- - -
- 100% - Functions - 0/0 -
- - -
- 0% - Lines - 0/5 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { ApiProperty } from '@nestjs/swagger';
-import { IsEnum } from 'class-validator';
-import { UserRole } from 'src/common/enums/user-role.enum';
- 
-export class UpdateUserRoleDto {
-  @ApiProperty({
-    description: 'New role for the user',
-    enum: UserRole,
-    example: UserRole.CREATOR,
-  })
-  @IsEnum(UserRole)
-  role: UserRole;
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/users/dto/update-user.dto.ts.html b/coverage/lcov-report/src/users/dto/update-user.dto.ts.html deleted file mode 100644 index 6c7db53..0000000 --- a/coverage/lcov-report/src/users/dto/update-user.dto.ts.html +++ /dev/null @@ -1,298 +0,0 @@ - - - - - - Code coverage report for src/users/dto/update-user.dto.ts - - - - - - - - - -
-
-

All files / src/users/dto update-user.dto.ts

-
- -
- 0% - Statements - 0/9 -
- - -
- 100% - Branches - 0/0 -
- - -
- 100% - Functions - 0/0 -
- - -
- 0% - Lines - 0/9 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import {
-  IsString,
-  IsOptional,
-  IsUrl,
-  MaxLength,
-  Matches,
-} from 'class-validator';
-import { ApiPropertyOptional } from '@nestjs/swagger';
- 
-export class UpdateUserDto {
-  @ApiPropertyOptional({
-    description: 'User first name',
-    example: 'John',
-    maxLength: 50,
-  })
-  @IsOptional()
-  @IsString()
-  @MaxLength(50)
-  firstName?: string;
- 
-  @ApiPropertyOptional({
-    description: 'User last name',
-    example: 'Doe',
-    maxLength: 50,
-  })
-  @IsOptional()
-  @IsString()
-  @MaxLength(50)
-  lastName?: string;
- 
-  @ApiPropertyOptional({
-    description: 'User country',
-    example: 'United States',
-    maxLength: 100,
-  })
-  @IsOptional()
-  @IsString()
-  @MaxLength(100)
-  country?: string;
- 
-  @ApiPropertyOptional({
-    description: 'User bio/description',
-    example: 'Passionate about social impact projects',
-    maxLength: 500,
-  })
-  @IsOptional()
-  @IsString()
-  @MaxLength(500)
-  bio?: string;
- 
-  @ApiPropertyOptional({
-    description: 'Avatar image URL',
-    example: 'https://example.com/avatar.jpg',
-    format: 'url',
-  })
-  @IsOptional()
-  @IsUrl({}, { message: 'avatarUrl must be a valid URL' })
-  avatarUrl?: string;
- 
-  @ApiPropertyOptional({
-    description: 'Stellar wallet public key (G...)',
-    example: 'GAA2M7F4E3C4D4E5F6G7H8I9J0K1L2M3N4O5P6Q7R8S9T0U1V2W3X4Y5Z6',
-    pattern: '^G[A-Z2-7]{55}$',
-  })
-  @IsOptional()
-  @IsString()
-  @Matches(/^G[A-Z2-7]{55}$/, {
-    message: 'walletAddress must be a valid Stellar public key',
-  })
-  walletAddress?: string;
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/users/dtos/change-password.dto.ts.html b/coverage/lcov-report/src/users/dtos/change-password.dto.ts.html deleted file mode 100644 index 7a054c4..0000000 --- a/coverage/lcov-report/src/users/dtos/change-password.dto.ts.html +++ /dev/null @@ -1,175 +0,0 @@ - - - - - - Code coverage report for src/users/dtos/change-password.dto.ts - - - - - - - - - -
-
-

All files / src/users/dtos change-password.dto.ts

-
- -
- 0% - Statements - 0/5 -
- - -
- 100% - Branches - 0/0 -
- - -
- 100% - Functions - 0/0 -
- - -
- 0% - Lines - 0/5 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { IsNotEmpty, IsString, MinLength, Matches } from 'class-validator';
-import { ApiProperty } from '@nestjs/swagger';
- 
-export class ChangePasswordDto {
-  @ApiProperty({
-    description: 'Current password',
-    example: 'OldPass123!',
-  })
-  @IsString()
-  @IsNotEmpty()
-  currentPassword: string;
- 
-  @ApiProperty({
-    description:
-      'New password (min 8 chars, must contain uppercase, lowercase, number, and special char)',
-    example: 'NewPass123!',
-    minLength: 8,
-  })
-  @IsString()
-  @IsNotEmpty()
-  @MinLength(8, { message: 'Password must be at least 8 characters long' })
-  @Matches(
-    /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]+$/,
-    {
-      message:
-        'Password must contain at least one uppercase letter, one lowercase letter, one number, and one special character',
-    },
-  )
-  newPassword: string;
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/users/dtos/forgot-password.dto.ts.html b/coverage/lcov-report/src/users/dtos/forgot-password.dto.ts.html deleted file mode 100644 index 9bf449d..0000000 --- a/coverage/lcov-report/src/users/dtos/forgot-password.dto.ts.html +++ /dev/null @@ -1,124 +0,0 @@ - - - - - - Code coverage report for src/users/dtos/forgot-password.dto.ts - - - - - - - - - -
-
-

All files / src/users/dtos forgot-password.dto.ts

-
- -
- 0% - Statements - 0/4 -
- - -
- 100% - Branches - 0/0 -
- - -
- 100% - Functions - 0/0 -
- - -
- 0% - Lines - 0/4 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { IsEmail, IsNotEmpty } from 'class-validator';
-import { ApiProperty } from '@nestjs/swagger';
- 
-export class ForgotPasswordDto {
-  @ApiProperty({
-    description: 'User email address for password reset',
-    example: 'user@example.com',
-    format: 'email',
-  })
-  @IsEmail()
-  @IsNotEmpty()
-  email: string;
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/users/dtos/index.html b/coverage/lcov-report/src/users/dtos/index.html deleted file mode 100644 index a3daa9c..0000000 --- a/coverage/lcov-report/src/users/dtos/index.html +++ /dev/null @@ -1,206 +0,0 @@ - - - - - - Code coverage report for src/users/dtos - - - - - - - - - -
-
-

All files src/users/dtos

-
- -
- 0% - Statements - 0/52 -
- - -
- 0% - Branches - 0/20 -
- - -
- 100% - Functions - 0/0 -
- - -
- 0% - Lines - 0/52 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
change-password.dto.ts -
-
0%0/5100%0/0100%0/00%0/5
forgot-password.dto.ts -
-
0%0/4100%0/0100%0/00%0/4
profile-response.dto.ts -
-
0%0/190%0/16100%0/00%0/19
reset-password.dto.ts -
-
0%0/5100%0/0100%0/00%0/5
submit-kyc.dto.ts -
-
0%0/4100%0/0100%0/00%0/4
update-kyc.dto.ts -
-
0%0/60%0/4100%0/00%0/6
update-user.dto.ts -
-
0%0/9100%0/0100%0/00%0/9
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/users/dtos/profile-response.dto.ts.html b/coverage/lcov-report/src/users/dtos/profile-response.dto.ts.html deleted file mode 100644 index 2797907..0000000 --- a/coverage/lcov-report/src/users/dtos/profile-response.dto.ts.html +++ /dev/null @@ -1,379 +0,0 @@ - - - - - - Code coverage report for src/users/dtos/profile-response.dto.ts - - - - - - - - - -
-
-

All files / src/users/dtos profile-response.dto.ts

-
- -
- 0% - Statements - 0/19 -
- - -
- 0% - Branches - 0/16 -
- - -
- 100% - Functions - 0/0 -
- - -
- 0% - Lines - 0/19 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { ApiProperty } from '@nestjs/swagger';
-import { UserRole, KYCStatus } from '../entities/user.entity';
- 
-export class ProfileResponseDto {
-  @ApiProperty({
-    description: 'User unique identifier',
-    example: '550e8400-e29b-41d4-a716-446655440000',
-  })
-  id: string;
- 
-  @ApiProperty({
-    description: 'User email address',
-    example: 'user@example.com',
-  })
-  email: string;
- 
-  @ApiProperty({ description: 'User first name', example: 'John' })
-  firstName: string;
- 
-  @ApiProperty({ description: 'User last name', example: 'Doe' })
-  lastName: string;
- 
-  @ApiProperty({
-    description: 'User role',
-    enum: UserRole,
-    example: UserRole.DONOR,
-  })
-  role: UserRole;
- 
-  @ApiProperty({
-    description: 'Stellar wallet address',
-    example: 'GAA2M7F4E3C4D4E5F6G7H8I9J0K1L2M3N4O5P6Q7R8S9T0U1V2W3X4Y5Z6',
-    nullable: true,
-  })
-  walletAddress: string | null;
- 
-  @ApiProperty({
-    description: 'User country',
-    example: 'United States',
-    nullable: true,
-  })
-  country: string | null;
- 
-  @ApiProperty({
-    description: 'User bio',
-    example: 'Passionate about social impact',
-    nullable: true,
-  })
-  bio: string | null;
- 
-  @ApiProperty({
-    description: 'Avatar URL',
-    example: 'https://example.com/avatar.jpg',
-    nullable: true,
-  })
-  avatarUrl: string | null;
- 
-  @ApiProperty({ description: 'Whether email is verified', example: true })
-  isEmailVerified: boolean;
- 
-  @ApiProperty({
-    description: 'KYC verification status',
-    enum: KYCStatus,
-    example: KYCStatus.APPROVED,
-  })
-  kycStatus: KYCStatus;
- 
-  @ApiProperty({
-    description: 'When KYC was submitted',
-    format: 'date-time',
-    nullable: true,
-  })
-  kycSubmittedAt: Date | null;
- 
-  @ApiProperty({
-    description: 'When KYC was verified',
-    format: 'date-time',
-    nullable: true,
-  })
-  kycVerifiedAt: Date | null;
- 
-  @ApiProperty({
-    description: 'Account creation timestamp',
-    format: 'date-time',
-  })
-  createdAt: Date;
- 
-  @ApiProperty({ description: 'Last update timestamp', format: 'date-time' })
-  updatedAt: Date;
- 
-  @ApiProperty({
-    description: 'Profile completion percentage',
-    example: 85,
-    minimum: 0,
-    maximum: 100,
-  })
-  profileCompletionPercentage: number;
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/users/dtos/reset-password.dto.ts.html b/coverage/lcov-report/src/users/dtos/reset-password.dto.ts.html deleted file mode 100644 index a6fdc61..0000000 --- a/coverage/lcov-report/src/users/dtos/reset-password.dto.ts.html +++ /dev/null @@ -1,157 +0,0 @@ - - - - - - Code coverage report for src/users/dtos/reset-password.dto.ts - - - - - - - - - -
-
-

All files / src/users/dtos reset-password.dto.ts

-
- -
- 0% - Statements - 0/5 -
- - -
- 100% - Branches - 0/0 -
- - -
- 100% - Functions - 0/0 -
- - -
- 0% - Lines - 0/5 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { IsNotEmpty, IsString, MinLength, Matches } from 'class-validator';
-import { ApiProperty } from '@nestjs/swagger';
- 
-export class ResetPasswordDto {
-  @ApiProperty({
-    description: 'Password reset token',
-    example: 'abc123def456',
-  })
-  @IsString()
-  @IsNotEmpty()
-  token: string;
- 
-  @ApiProperty({
-    description:
-      'New password (min 8 chars, must contain uppercase, lowercase, number, and special char)',
-    example: 'NewPass123!',
-    minLength: 8,
-  })
-  @IsString()
-  @IsNotEmpty()
-  @MinLength(8)
-  @Matches(/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]+$/)
-  newPassword: string;
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/users/dtos/submit-kyc.dto.ts.html b/coverage/lcov-report/src/users/dtos/submit-kyc.dto.ts.html deleted file mode 100644 index ec56632..0000000 --- a/coverage/lcov-report/src/users/dtos/submit-kyc.dto.ts.html +++ /dev/null @@ -1,124 +0,0 @@ - - - - - - Code coverage report for src/users/dtos/submit-kyc.dto.ts - - - - - - - - - -
-
-

All files / src/users/dtos submit-kyc.dto.ts

-
- -
- 0% - Statements - 0/4 -
- - -
- 100% - Branches - 0/0 -
- - -
- 100% - Functions - 0/0 -
- - -
- 0% - Lines - 0/4 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { IsString, IsNotEmpty } from 'class-validator';
-import { ApiProperty } from '@nestjs/swagger';
- 
-export class SubmitKYCDto {
-  @ApiProperty({
-    description: 'URL to KYC document (ID, passport, etc.)',
-    example: 'https://storage.example.com/kyc/doc123.pdf',
-    format: 'url',
-  })
-  @IsString()
-  @IsNotEmpty()
-  documentUrl: string;
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/users/dtos/update-kyc.dto.ts.html b/coverage/lcov-report/src/users/dtos/update-kyc.dto.ts.html deleted file mode 100644 index 0d09fe7..0000000 --- a/coverage/lcov-report/src/users/dtos/update-kyc.dto.ts.html +++ /dev/null @@ -1,151 +0,0 @@ - - - - - - Code coverage report for src/users/dtos/update-kyc.dto.ts - - - - - - - - - -
-
-

All files / src/users/dtos update-kyc.dto.ts

-
- -
- 0% - Statements - 0/6 -
- - -
- 0% - Branches - 0/4 -
- - -
- 100% - Functions - 0/0 -
- - -
- 0% - Lines - 0/6 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { IsEnum, IsNotEmpty, IsOptional, IsString } from 'class-validator';
-import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
-import { KYCStatus } from '../entities/user.entity';
- 
-export class UpdateKYCDto {
-  @ApiProperty({
-    description: 'New KYC status',
-    enum: KYCStatus,
-    example: KYCStatus.APPROVED,
-  })
-  @IsEnum(KYCStatus)
-  @IsNotEmpty()
-  status: KYCStatus;
- 
-  @ApiPropertyOptional({
-    description: 'Reason for rejection (required if status is REJECTED)',
-    example: 'Document unclear or expired',
-  })
-  @IsString()
-  @IsOptional()
-  rejectionReason?: string;
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/users/dtos/update-user.dto.ts.html b/coverage/lcov-report/src/users/dtos/update-user.dto.ts.html deleted file mode 100644 index d0e2867..0000000 --- a/coverage/lcov-report/src/users/dtos/update-user.dto.ts.html +++ /dev/null @@ -1,298 +0,0 @@ - - - - - - Code coverage report for src/users/dtos/update-user.dto.ts - - - - - - - - - -
-
-

All files / src/users/dtos update-user.dto.ts

-
- -
- 0% - Statements - 0/9 -
- - -
- 100% - Branches - 0/0 -
- - -
- 100% - Functions - 0/0 -
- - -
- 0% - Lines - 0/9 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import {
-  IsString,
-  IsOptional,
-  IsUrl,
-  MaxLength,
-  Matches,
-} from 'class-validator';
-import { ApiPropertyOptional } from '@nestjs/swagger';
- 
-export class UpdateUserDto {
-  @ApiPropertyOptional({
-    description: 'User first name',
-    example: 'John',
-    maxLength: 50,
-  })
-  @IsOptional()
-  @IsString()
-  @MaxLength(50)
-  firstName?: string;
- 
-  @ApiPropertyOptional({
-    description: 'User last name',
-    example: 'Doe',
-    maxLength: 50,
-  })
-  @IsOptional()
-  @IsString()
-  @MaxLength(50)
-  lastName?: string;
- 
-  @ApiPropertyOptional({
-    description: 'User country',
-    example: 'United States',
-    maxLength: 100,
-  })
-  @IsOptional()
-  @IsString()
-  @MaxLength(100)
-  country?: string;
- 
-  @ApiPropertyOptional({
-    description: 'User bio/description',
-    example: 'Passionate about social impact projects',
-    maxLength: 500,
-  })
-  @IsOptional()
-  @IsString()
-  @MaxLength(500)
-  bio?: string;
- 
-  @ApiPropertyOptional({
-    description: 'Avatar image URL',
-    example: 'https://example.com/avatar.jpg',
-    format: 'url',
-  })
-  @IsOptional()
-  @IsUrl({}, { message: 'avatarUrl must be a valid URL' })
-  avatarUrl?: string;
- 
-  @ApiPropertyOptional({
-    description: 'Stellar wallet public key (G...)',
-    example: 'GAA2M7F4E3C4D4E5F6G7H8I9J0K1L2M3N4O5P6Q7R8S9T0U1V2W3X4Y5Z6',
-    pattern: '^G[A-Z2-7]{55}$',
-  })
-  @IsOptional()
-  @IsString()
-  @Matches(/^G[A-Z2-7]{55}$/, {
-    message: 'walletAddress must be a valid Stellar public key',
-  })
-  walletAddress?: string;
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/users/entities/index.html b/coverage/lcov-report/src/users/entities/index.html deleted file mode 100644 index 2e3f865..0000000 --- a/coverage/lcov-report/src/users/entities/index.html +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - Code coverage report for src/users/entities - - - - - - - - - -
-
-

All files src/users/entities

-
- -
- 100% - Statements - 31/31 -
- - -
- 75% - Branches - 12/16 -
- - -
- 100% - Functions - 0/0 -
- - -
- 100% - Lines - 29/29 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
user.entity.ts -
-
100%31/3175%12/16100%0/0100%29/29
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/users/entities/user.entity.ts.html b/coverage/lcov-report/src/users/entities/user.entity.ts.html deleted file mode 100644 index c0ae901..0000000 --- a/coverage/lcov-report/src/users/entities/user.entity.ts.html +++ /dev/null @@ -1,382 +0,0 @@ - - - - - - Code coverage report for src/users/entities/user.entity.ts - - - - - - - - - -
-
-

All files / src/users/entities user.entity.ts

-
- -
- 100% - Statements - 31/31 -
- - -
- 75% - Branches - 12/16 -
- - -
- 100% - Functions - 0/0 -
- - -
- 100% - Lines - 29/29 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -1001x -1x -1x -  -  -  -  -  -  -  -  -  -  -  -  -1x -  -1x -  -  -1x -  -  -1x -  -  -1x -  -  -1x -  -  -1x -  -  -1x -  -  -1x -  -  -1x -  -  -  -  -  -  -1x -  -  -1x -  -  -1x -  -  -1x -  -  -1x -  -  -1x -  -  -1x -  -  -1x -  -  -  -  -  -  -1x -  -  -1x -  -  -1x -  -  -1x -  -  -1x -  -  -1x -  -  -1x -  -  -1x -  - 
import { KYCStatus } from 'src/common/enums/kyc-status.enum';
-import { UserRole } from 'src/common/enums/user-role.enum';
-import {
-  Entity,
-  PrimaryGeneratedColumn,
-  Column,
-  CreateDateColumn,
-  UpdateDateColumn,
-  Index,
-  DeleteDateColumn,
-} from 'typeorm';
- 
-@Entity('users')
-@Index('IDX_users_email', ['email'])
-@Index('IDX_users_wallet_address', ['walletAddress'])
-export class User {
-  @PrimaryGeneratedColumn('uuid')
-  id: string;
- 
-  @Column({ unique: true })
-  email: string;
- 
-  @Column({ name: 'password_hash' })
-  password: string;
- 
-  @Column()
-  firstName: string;
- 
-  @Column()
-  lastName: string;
- 
-  @Column({ nullable: true, unique: true })
-  walletAddress: string | null;
- 
-  @Column({ nullable: true })
-  country: string | null;
- 
-  @Column({ nullable: true, type: 'text' })
-  bio: string | null;
- 
-  @Column({ nullable: true })
-  avatarUrl: string | null;
- 
-  @Column({
-    type: 'enum',
-    enum: UserRole,
-    default: UserRole.USER,
-  })
-  role: UserRole;
- 
-  @Column({ default: false })
-  isEmailVerified: boolean;
- 
-  @Column({ nullable: true })
-  emailVerificationToken: string | null;
- 
-  @Column({ nullable: true, type: 'timestamp' })
-  emailVerificationTokenExpiry: Date | null;
- 
-  @Column({ nullable: true })
-  resetPasswordTokenSelector: string | null;
- 
-  @Column({ nullable: true })
-  resetPasswordTokenHash: string | null;
- 
-  @Column({ nullable: true, type: 'timestamp' })
-  resetPasswordTokenExpiry: Date | null;
- 
-  @Column({ nullable: true })
-  refreshTokenHash: string | null;
- 
-  @Column({
-    type: 'enum',
-    enum: KYCStatus,
-    default: KYCStatus.NONE,
-  })
-  kycStatus: KYCStatus;
- 
-  @Column({ nullable: true, type: 'timestamp' })
-  kycSubmittedAt: Date | null;
- 
-  @Column({ nullable: true, type: 'timestamp' })
-  kycVerifiedAt: Date | null;
- 
-  @Column({ nullable: true })
-  kycDocumentUrl: string | null;
- 
-  @Column({ nullable: true })
-  kycRejectionReason: string | null;
- 
-  @CreateDateColumn()
-  createdAt: Date;
- 
-  @UpdateDateColumn()
-  updatedAt: Date;
- 
-  @DeleteDateColumn({ nullable: true })
-  deletedAt: Date | null;
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/users/index.html b/coverage/lcov-report/src/users/index.html deleted file mode 100644 index 5f5101c..0000000 --- a/coverage/lcov-report/src/users/index.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - Code coverage report for src/users - - - - - - - - - -
-
-

All files src/users

-
- -
- 0% - Statements - 0/69 -
- - -
- 0% - Branches - 0/50 -
- - -
- 0% - Functions - 0/13 -
- - -
- 0% - Lines - 0/63 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
admin-users.controller.ts -
-
0%0/210%0/160%0/50%0/19
users.controller.ts -
-
0%0/370%0/340%0/80%0/35
users.module.ts -
-
0%0/11100%0/0100%0/00%0/9
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/users/providers/index.html b/coverage/lcov-report/src/users/providers/index.html deleted file mode 100644 index 85a001b..0000000 --- a/coverage/lcov-report/src/users/providers/index.html +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - Code coverage report for src/users/providers - - - - - - - - - -
-
-

All files src/users/providers

-
- -
- 0% - Statements - 0/65 -
- - -
- 0% - Branches - 0/30 -
- - -
- 0% - Functions - 0/12 -
- - -
- 0% - Lines - 0/57 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
users.service.ts -
-
0%0/650%0/300%0/120%0/57
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/users/providers/users.service.ts.html b/coverage/lcov-report/src/users/providers/users.service.ts.html deleted file mode 100644 index 38cf6c5..0000000 --- a/coverage/lcov-report/src/users/providers/users.service.ts.html +++ /dev/null @@ -1,664 +0,0 @@ - - - - - - Code coverage report for src/users/providers/users.service.ts - - - - - - - - - -
-
-

All files / src/users/providers users.service.ts

-
- -
- 0% - Statements - 0/65 -
- - -
- 0% - Branches - 0/30 -
- - -
- 0% - Functions - 0/12 -
- - -
- 0% - Lines - 0/57 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174 -175 -176 -177 -178 -179 -180 -181 -182 -183 -184 -185 -186 -187 -188 -189 -190 -191 -192 -193 -194  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import {
-  Injectable,
-  NotFoundException,
-  ConflictException,
-} from '@nestjs/common';
-import { InjectRepository } from '@nestjs/typeorm';
-import { Repository } from 'typeorm';
-import { User } from '../entities/user.entity';
-import { ProfileResponseDto } from '../dto/profile-response.dto';
-import { UpdateUserDto } from '../dto/update-user.dto';
-import { KYCStatus } from 'src/common/enums/kyc-status.enum';
-import { AdminGetUsersQueryDto } from '../dto/admin-get-users-query.dto';
-import { UserRole } from 'src/common/enums/user-role.enum';
- 
-@Injectable()
-export class UsersService {
-  constructor(
-    @InjectRepository(User)
-    private readonly userRepository: Repository<User>,
-  ) {}
- 
-  private toAdminUserResponse(user: User) {
-    return {
-      id: user.id,
-      email: user.email,
-      firstName: user.firstName,
-      lastName: user.lastName,
-      role: user.role,
-      walletAddress: user.walletAddress,
-      country: user.country,
-      bio: user.bio,
-      avatarUrl: user.avatarUrl,
-      isEmailVerified: user.isEmailVerified,
-      kycStatus: user.kycStatus,
-      kycSubmittedAt: user.kycSubmittedAt,
-      kycVerifiedAt: user.kycVerifiedAt,
-      createdAt: user.createdAt,
-      updatedAt: user.updatedAt,
-      deletedAt: user.deletedAt,
-    };
-  }
- 
-  //  find user by ID or throw NotFoundException
-  public async findById(id: string): Promise<User> {
-    const user = await this.userRepository.findOne({ where: { id } });
-    if (!user) {
-      throw new NotFoundException('User not found');
-    }
-    return user;
-  }
- 
-  // find user by email
-  public async findByEmail(email: string): Promise<User | null> {
-    return this.userRepository.findOne({ where: { email } });
-  }
- 
-  //  find user by wallet address
-  public async updateWalletAddress(
-    userId: string,
-    walletAddress: string,
-  ): Promise<User> {
-    const user = await this.findById(userId);
-    user.walletAddress = walletAddress;
-    return this.userRepository.save(user);
-  }
- 
-  // update user profile
-  public async updateProfile(
-    userId: string,
-    dto: UpdateUserDto,
-  ): Promise<ProfileResponseDto> {
-    const user = await this.findById(userId);
- 
-    if (dto.firstName !== undefined) user.firstName = dto.firstName;
-    if (dto.lastName !== undefined) user.lastName = dto.lastName;
-    if (dto.country !== undefined) user.country = dto.country;
-    if (dto.bio !== undefined) user.bio = dto.bio;
-    if (dto.avatarUrl !== undefined) user.avatarUrl = dto.avatarUrl;
-    if (dto.walletAddress !== undefined) user.walletAddress = dto.walletAddress;
- 
-    try {
-      await this.userRepository.save(user);
-    } catch (err: any) {
-      if (err.code === '23505') {
-        throw new ConflictException(
-          'Wallet address is already linked to another account',
-        );
-      }
-      throw err;
-    }
- 
-    return this.getProfile(userId);
-  }
- 
-  // get user profile with profile completion percentage
-  public async getProfile(userId: string): Promise<ProfileResponseDto> {
-    const user = await this.findById(userId);
- 
-    // 6 checkpoints: email, firstName, lastName (always present),
-    // email verified, wallet address set, KYC approved
-    const completionChecks = [
-      true,
-      true,
-      true,
-      user.isEmailVerified,
-      user.walletAddress !== null,
-      user.kycStatus === KYCStatus.APPROVED,
-    ];
-    const completed = completionChecks.filter(Boolean).length;
-    const profileCompletionPercentage = Math.round(
-      (completed / completionChecks.length) * 100,
-    );
- 
-    return {
-      id: user.id,
-      email: user.email,
-      firstName: user.firstName,
-      lastName: user.lastName,
-      role: user.role,
-      walletAddress: user.walletAddress,
-      country: user.country,
-      bio: user.bio,
-      avatarUrl: user.avatarUrl,
-      isEmailVerified: user.isEmailVerified,
-      kycStatus: user.kycStatus,
-      kycSubmittedAt: user.kycSubmittedAt,
-      kycVerifiedAt: user.kycVerifiedAt,
-      createdAt: user.createdAt,
-      updatedAt: user.updatedAt,
-      profileCompletionPercentage,
-    };
-  }
- 
-  // Find all users with optional filtering for admin panel
-  public async findAllForAdmin(query: AdminGetUsersQueryDto) {
-    const qb = this.userRepository
-      .createQueryBuilder('user')
-      .where('user.deletedAt IS NULL');
- 
-    if (query.role) {
-      qb.andWhere('user.role = :role', { role: query.role });
-    }
- 
-    if (query.kyc_status) {
-      qb.andWhere('user.kycStatus = :kycStatus', {
-        kycStatus: query.kyc_status,
-      });
-    }
- 
-    if (query.created_date) {
-      const dayStart = new Date(query.created_date);
-      const nextDay = new Date(dayStart);
-      nextDay.setDate(nextDay.getDate() + 1);
- 
-      qb.andWhere('user.createdAt >= :dayStart AND user.createdAt < :nextDay', {
-        dayStart,
-        nextDay,
-      });
-    }
- 
-    qb.orderBy('user.createdAt', 'DESC')
-      .skip(query.offset ?? 0)
-      .take(query.limit ?? 10);
- 
-    const [users, total] = await qb.getManyAndCount();
- 
-    return {
-      data: users.map((user) => this.toAdminUserResponse(user)),
-      total,
-    };
-  }
- 
-  // get user by ID for admin view (includes sensitive info)
-  public async getUserByIdForAdmin(id: string) {
-    const user = await this.findById(id);
-    return this.toAdminUserResponse(user);
-  }
- 
-  // update user role (admin only)
-  public async updateUserRole(id: string, role: UserRole) {
-    const user = await this.findById(id);
-    user.role = role;
-    const updatedUser = await this.userRepository.save(user);
-    return this.toAdminUserResponse(updatedUser);
-  }
- 
-  // soft delete user (admin only)
-  public async softDeleteUser(id: string) {
-    const user = await this.findById(id);
-    await this.userRepository.softDelete(user.id);
-    return { message: 'User deleted successfully' };
-  }
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/users/users.controller.ts.html b/coverage/lcov-report/src/users/users.controller.ts.html deleted file mode 100644 index 357079b..0000000 --- a/coverage/lcov-report/src/users/users.controller.ts.html +++ /dev/null @@ -1,493 +0,0 @@ - - - - - - Code coverage report for src/users/users.controller.ts - - - - - - - - - -
-
-

All files / src/users users.controller.ts

-
- -
- 0% - Statements - 0/37 -
- - -
- 0% - Branches - 0/34 -
- - -
- 0% - Functions - 0/8 -
- - -
- 0% - Lines - 0/35 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import {
-  Controller,
-  Post,
-  Get,
-  Body,
-  UseGuards,
-  Request,
-  HttpCode,
-  HttpStatus,
-  Patch,
-  Param,
-  ForbiddenException,
-} from '@nestjs/common';
-import { AuthGuard } from '@nestjs/passport';
-import {
-  ApiTags,
-  ApiOperation,
-  ApiResponse,
-  ApiBearerAuth,
-  ApiParam,
-} from '@nestjs/swagger';
-import { ChangePasswordDto } from './dto/change-password.dto';
-import { ForgotPasswordDto } from './dto/forgot-password.dto';
-import { ResetPasswordDto } from './dto/reset-password.dto';
-import { SubmitKYCDto } from './dto/submit-kyc.dto';
-import { UpdateKYCDto } from './dto/update-kyc.dto';
-import { UpdateUserDto } from './dto/update-user.dto';
-import { Public } from '../common/decorators/public.decorator';
-import type { JwtPayload } from '../common/interfaces/auth.interface';
-import { CurrentUser } from 'src/common/decorators/current-user.decorator';
-import { UserRole } from 'src/common/enums/user-role.enum';
-import { AuthService } from 'src/auth/providers/auth.service';
-import { UsersService } from './providers/users.service';
- 
-@ApiTags('Users')
-@Controller('users')
-export class UsersController {
-  constructor(
-    private readonly authService: AuthService,
-    private readonly usersService: UsersService,
-  ) {}
- 
-  @UseGuards(AuthGuard('jwt'))
-  @ApiBearerAuth('JWT-auth')
-  @Get('profile')
-  @ApiOperation({ summary: 'Get current user profile' })
-  @ApiResponse({ status: 200, description: 'Profile retrieved successfully' })
-  @ApiResponse({ status: 401, description: 'Unauthorized' })
-  async getProfile(@CurrentUser() user: JwtPayload) {
-    return this.usersService.getProfile(user.sub);
-  }
- 
-  @UseGuards(AuthGuard('jwt'))
-  @ApiBearerAuth('JWT-auth')
-  @Patch('profile')
-  @ApiOperation({ summary: 'Update current user profile' })
-  @ApiResponse({ status: 200, description: 'Profile updated successfully' })
-  @ApiResponse({ status: 400, description: 'Invalid input' })
-  @ApiResponse({ status: 401, description: 'Unauthorized' })
-  async updateProfile(
-    @CurrentUser() user: JwtPayload,
-    @Body() updateUserDto: UpdateUserDto,
-  ) {
-    return this.usersService.updateProfile(user.sub, updateUserDto);
-  }
- 
-  @UseGuards(AuthGuard('jwt'))
-  @ApiBearerAuth('JWT-auth')
-  @Post('change-password')
-  @HttpCode(HttpStatus.OK)
-  @ApiOperation({ summary: 'Change user password' })
-  @ApiResponse({ status: 200, description: 'Password changed successfully' })
-  @ApiResponse({ status: 400, description: 'Invalid current password' })
-  @ApiResponse({ status: 401, description: 'Unauthorized' })
-  async changePassword(
-    @Request() req,
-    @Body() changePasswordDto: ChangePasswordDto,
-  ) {
-    const user = req.user;
-    return this.authService.changePassword(user.id, changePasswordDto);
-  }
- 
-  @Public()
-  @Post('forgot-password')
-  @HttpCode(HttpStatus.OK)
-  @ApiOperation({ summary: 'Request password reset email' })
-  @ApiResponse({ status: 200, description: 'Password reset email sent' })
-  @ApiResponse({ status: 404, description: 'User not found' })
-  async forgotPassword(@Body() forgotDto: ForgotPasswordDto) {
-    return this.authService.forgotPassword(forgotDto.email);
-  }
- 
-  @Public()
-  @Post('reset-password')
-  @HttpCode(HttpStatus.OK)
-  @ApiOperation({ summary: 'Reset password with token' })
-  @ApiResponse({ status: 200, description: 'Password reset successfully' })
-  @ApiResponse({ status: 400, description: 'Invalid or expired token' })
-  async resetPassword(@Body() resetDto: ResetPasswordDto) {
-    return this.authService.resetPassword(resetDto.token, resetDto.newPassword);
-  }
- 
-  @UseGuards(AuthGuard('jwt'))
-  @ApiBearerAuth('JWT-auth')
-  @Post('kyc/submit')
-  @HttpCode(HttpStatus.OK)
-  @ApiOperation({ summary: 'Submit KYC document for verification' })
-  @ApiResponse({ status: 200, description: 'KYC submitted successfully' })
-  @ApiResponse({ status: 401, description: 'Unauthorized' })
-  async submitKYC(@Request() req, @Body() submitKYCDto: SubmitKYCDto) {
-    const user = req.user;
-    return this.authService.submitKYC(user.id, submitKYCDto);
-  }
- 
-  // Admin endpoint to update KYC status
-  @UseGuards(AuthGuard('jwt'))
-  @ApiBearerAuth('JWT-auth')
-  @Patch('admin/kyc/:userId')
-  @HttpCode(HttpStatus.OK)
-  @ApiOperation({ summary: 'Update KYC status (Admin only)' })
-  @ApiParam({ name: 'userId', description: 'User ID to update KYC for' })
-  @ApiResponse({ status: 200, description: 'KYC status updated successfully' })
-  @ApiResponse({ status: 403, description: 'Admin access required' })
-  @ApiResponse({ status: 401, description: 'Unauthorized' })
-  async updateKYCStatus(
-    @Request() req,
-    @Param('userId') userId: string,
-    @Body() updateKYCDto: UpdateKYCDto,
-  ) {
-    // Check if requester is admin
-    if (req.user.role !== UserRole.ADMIN) {
-      throw new ForbiddenException('Admin access required');
-    }
-    return this.authService.updateKYCStatus(userId, updateKYCDto);
-  }
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/users/users.module.ts.html b/coverage/lcov-report/src/users/users.module.ts.html deleted file mode 100644 index 6bc1160..0000000 --- a/coverage/lcov-report/src/users/users.module.ts.html +++ /dev/null @@ -1,133 +0,0 @@ - - - - - - Code coverage report for src/users/users.module.ts - - - - - - - - - -
-
-

All files / src/users users.module.ts

-
- -
- 0% - Statements - 0/11 -
- - -
- 100% - Branches - 0/0 -
- - -
- 100% - Functions - 0/0 -
- - -
- 0% - Lines - 0/9 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import { Module } from '@nestjs/common';
-import { TypeOrmModule } from '@nestjs/typeorm';
-import { UsersController } from './users.controller';
-import { AuthModule } from '../auth/auth.module';
-import { User } from './entities/user.entity';
-import { AdminUsersController } from './admin-users.controller';
-import { RolesGuard } from '../common/guards/roles.guard';
-import { UsersService } from './providers/users.service';
- 
-@Module({
-  imports: [AuthModule, TypeOrmModule.forFeature([User])],
-  controllers: [UsersController, AdminUsersController],
-  providers: [UsersService, RolesGuard],
-  exports: [UsersService, TypeOrmModule],
-})
-export class UsersModule {}
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/src/users/users.service.ts.html b/coverage/lcov-report/src/users/users.service.ts.html deleted file mode 100644 index 0fc52aa..0000000 --- a/coverage/lcov-report/src/users/users.service.ts.html +++ /dev/null @@ -1,397 +0,0 @@ - - - - - - Code coverage report for src/users/users.service.ts - - - - - - - - - -
-
-

All files / src/users users.service.ts

-
- -
- 0% - Statements - 0/40 -
- - -
- 0% - Branches - 0/20 -
- - -
- 0% - Functions - 0/6 -
- - -
- 0% - Lines - 0/32 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import {
-  Injectable,
-  NotFoundException,
-  ConflictException,
-} from '@nestjs/common';
-import { InjectRepository } from '@nestjs/typeorm';
-import { Repository } from 'typeorm';
-import { User, KYCStatus } from './entities/user.entity';
-import { ProfileResponseDto } from './dtos/profile-response.dto';
-import { UpdateUserDto } from './dtos/update-user.dto';
- 
-@Injectable()
-export class UsersService {
-  constructor(
-    @InjectRepository(User)
-    private readonly userRepository: Repository<User>,
-  ) {}
- 
-  async findById(id: string): Promise<User> {
-    const user = await this.userRepository.findOne({ where: { id } });
-    if (!user) {
-      throw new NotFoundException('User not found');
-    }
-    return user;
-  }
- 
-  async findByEmail(email: string): Promise<User | null> {
-    return this.userRepository.findOne({ where: { email } });
-  }
- 
-  async updateWalletAddress(
-    userId: string,
-    walletAddress: string,
-  ): Promise<User> {
-    const user = await this.findById(userId);
-    user.walletAddress = walletAddress;
-    return this.userRepository.save(user);
-  }
- 
-  async updateProfile(
-    userId: string,
-    dto: UpdateUserDto,
-  ): Promise<ProfileResponseDto> {
-    const user = await this.findById(userId);
- 
-    if (dto.firstName !== undefined) user.firstName = dto.firstName;
-    if (dto.lastName !== undefined) user.lastName = dto.lastName;
-    if (dto.country !== undefined) user.country = dto.country;
-    if (dto.bio !== undefined) user.bio = dto.bio;
-    if (dto.avatarUrl !== undefined) user.avatarUrl = dto.avatarUrl;
-    if (dto.walletAddress !== undefined) user.walletAddress = dto.walletAddress;
- 
-    try {
-      await this.userRepository.save(user);
-    } catch (err: any) {
-      if (err.code === '23505') {
-        throw new ConflictException(
-          'Wallet address is already linked to another account',
-        );
-      }
-      throw err;
-    }
- 
-    return this.getProfile(userId);
-  }
- 
-  async getProfile(userId: string): Promise<ProfileResponseDto> {
-    const user = await this.findById(userId);
- 
-    // 6 checkpoints: email, firstName, lastName (always present),
-    // email verified, wallet address set, KYC approved
-    const completionChecks = [
-      true,
-      true,
-      true,
-      user.isEmailVerified,
-      user.walletAddress !== null,
-      user.kycStatus === KYCStatus.APPROVED,
-    ];
-    const completed = completionChecks.filter(Boolean).length;
-    const profileCompletionPercentage = Math.round(
-      (completed / completionChecks.length) * 100,
-    );
- 
-    return {
-      id: user.id,
-      email: user.email,
-      firstName: user.firstName,
-      lastName: user.lastName,
-      role: user.role,
-      walletAddress: user.walletAddress,
-      country: user.country,
-      bio: user.bio,
-      avatarUrl: user.avatarUrl,
-      isEmailVerified: user.isEmailVerified,
-      kycStatus: user.kycStatus,
-      kycSubmittedAt: user.kycSubmittedAt,
-      kycVerifiedAt: user.kycVerifiedAt,
-      createdAt: user.createdAt,
-      updatedAt: user.updatedAt,
-      profileCompletionPercentage,
-    };
-  }
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov-report/users.service.ts.html b/coverage/lcov-report/users.service.ts.html deleted file mode 100644 index a2a0afc..0000000 --- a/coverage/lcov-report/users.service.ts.html +++ /dev/null @@ -1,397 +0,0 @@ - - - - - - Code coverage report for users.service.ts - - - - - - - - - -
-
-

All files users.service.ts

-
- -
- 100% - Statements - 40/40 -
- - -
- 95% - Branches - 19/20 -
- - -
- 100% - Functions - 6/6 -
- - -
- 100% - Lines - 32/32 -
- - -
-

- Press n or j to go to the next uncovered block, b, p or k for the previous block. -

- -
-
-

-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -1051x -  -  -  -  -1x -1x -1x -  -  -  -  -1x -  -  -43x -  -  -  -44x -41x -8x -  -33x -  -  -  -7x -  -  -  -  -  -  -6x -5x -5x -  -  -  -  -  -  -12x -  -10x -10x -10x -10x -10x -10x -  -10x -10x -  -3x -2x -  -  -  -1x -  -  -7x -  -  -  -18x -  -  -  -16x -  -  -  -  -  -  -  -16x -16x -  -  -  -16x -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
import {
-  Injectable,
-  NotFoundException,
-  ConflictException,
-} from '@nestjs/common';
-import { InjectRepository } from '@nestjs/typeorm';
-import { Repository } from 'typeorm';
-import { User, KYCStatus } from './entities/user.entity';
-import { ProfileResponseDto } from './dtos/profile-response.dto';
-import { UpdateUserDto } from './dtos/update-user.dto';
- 
-@Injectable()
-export class UsersService {
-  constructor(
-    @InjectRepository(User)
-    private readonly userRepository: Repository<User>,
-  ) {}
- 
-  async findById(id: string): Promise<User> {
-    const user = await this.userRepository.findOne({ where: { id } });
-    if (!user) {
-      throw new NotFoundException('User not found');
-    }
-    return user;
-  }
- 
-  async findByEmail(email: string): Promise<User | null> {
-    return this.userRepository.findOne({ where: { email } });
-  }
- 
-  async updateWalletAddress(
-    userId: string,
-    walletAddress: string,
-  ): Promise<User> {
-    const user = await this.findById(userId);
-    user.walletAddress = walletAddress;
-    return this.userRepository.save(user);
-  }
- 
-  async updateProfile(
-    userId: string,
-    dto: UpdateUserDto,
-  ): Promise<ProfileResponseDto> {
-    const user = await this.findById(userId);
- 
-    if (dto.firstName !== undefined) user.firstName = dto.firstName;
-    if (dto.lastName !== undefined) user.lastName = dto.lastName;
-    if (dto.country !== undefined) user.country = dto.country;
-    if (dto.bio !== undefined) user.bio = dto.bio;
-    if (dto.avatarUrl !== undefined) user.avatarUrl = dto.avatarUrl;
-    if (dto.walletAddress !== undefined) user.walletAddress = dto.walletAddress;
- 
-    try {
-      await this.userRepository.save(user);
-    } catch (err: any) {
-      if (err.code === '23505') {
-        throw new ConflictException(
-          'Wallet address is already linked to another account',
-        );
-      }
-      throw err;
-    }
- 
-    return this.getProfile(userId);
-  }
- 
-  async getProfile(userId: string): Promise<ProfileResponseDto> {
-    const user = await this.findById(userId);
- 
-    // 6 checkpoints: email, firstName, lastName (always present),
-    // email verified, wallet address set, KYC approved
-    const completionChecks = [
-      true,
-      true,
-      true,
-      user.isEmailVerified,
-      user.walletAddress !== null,
-      user.kycStatus === KYCStatus.APPROVED,
-    ];
-    const completed = completionChecks.filter(Boolean).length;
-    const profileCompletionPercentage = Math.round(
-      (completed / completionChecks.length) * 100,
-    );
- 
-    return {
-      id: user.id,
-      email: user.email,
-      firstName: user.firstName,
-      lastName: user.lastName,
-      role: user.role,
-      walletAddress: user.walletAddress,
-      country: user.country,
-      bio: user.bio,
-      avatarUrl: user.avatarUrl,
-      isEmailVerified: user.isEmailVerified,
-      kycStatus: user.kycStatus,
-      kycSubmittedAt: user.kycSubmittedAt,
-      kycVerifiedAt: user.kycVerifiedAt,
-      createdAt: user.createdAt,
-      updatedAt: user.updatedAt,
-      profileCompletionPercentage,
-    };
-  }
-}
- 
- -
-
- - - - - - - - \ No newline at end of file diff --git a/coverage/lcov.info b/coverage/lcov.info deleted file mode 100644 index ed64ef4..0000000 --- a/coverage/lcov.info +++ /dev/null @@ -1,3357 +0,0 @@ -TN: -SF:src\app.controller.ts -FN:6,(anonymous_2) -FN:9,(anonymous_3) -FNF:2 -FNH:0 -FNDA:0,(anonymous_2) -FNDA:0,(anonymous_3) -DA:1,0 -DA:2,0 -DA:5,0 -DA:6,0 -DA:9,0 -DA:10,0 -LF:6 -LH:0 -BRDA:6,0,0,0 -BRDA:6,0,1,0 -BRDA:6,1,0,0 -BRDA:6,1,1,0 -BRF:4 -BRH:0 -end_of_record -TN: -SF:src\app.module.ts -FNF:0 -FNH:0 -DA:1,0 -DA:2,0 -DA:3,0 -DA:4,0 -DA:5,0 -DA:6,0 -DA:7,0 -DA:8,0 -DA:9,0 -DA:10,0 -DA:11,0 -DA:12,0 -DA:33,0 -LF:13 -LH:0 -BRF:0 -BRH:0 -end_of_record -TN: -SF:src\app.service.ts -FN:5,(anonymous_1) -FNF:1 -FNH:0 -FNDA:0,(anonymous_1) -DA:1,0 -DA:4,0 -DA:6,0 -LF:3 -LH:0 -BRF:0 -BRH:0 -end_of_record -TN: -SF:src\main.ts -FN:7,bootstrap -FN:61,(anonymous_1) -FNF:2 -FNH:0 -FNDA:0,bootstrap -FNDA:0,(anonymous_1) -DA:1,0 -DA:2,0 -DA:3,0 -DA:4,0 -DA:5,0 -DA:8,0 -DA:9,0 -DA:11,0 -DA:23,0 -DA:27,0 -DA:29,0 -DA:30,0 -DA:52,0 -DA:53,0 -DA:61,0 -DA:62,0 -DA:65,0 -DA:66,0 -DA:69,0 -DA:71,0 -DA:76,0 -DA:77,0 -DA:78,0 -DA:79,0 -DA:83,0 -DA:85,0 -DA:88,0 -LF:27 -LH:0 -BRDA:27,0,0,0 -BRDA:27,0,1,0 -BRDA:29,1,0,0 -BRDA:29,1,1,0 -BRDA:69,2,0,0 -BRDA:69,2,1,0 -BRDA:72,3,0,0 -BRDA:72,3,1,0 -BRF:8 -BRH:0 -end_of_record -TN: -SF:src\auth\auth.controller.ts -FN:35,(anonymous_4) -FN:47,(anonymous_5) -FN:61,(anonymous_6) -FN:79,(anonymous_7) -FN:93,(anonymous_8) -FN:109,(anonymous_9) -FN:126,(anonymous_10) -FNF:7 -FNH:7 -FNDA:13,(anonymous_4) -FNDA:2,(anonymous_5) -FNDA:2,(anonymous_6) -FNDA:2,(anonymous_7) -FNDA:2,(anonymous_8) -FNDA:2,(anonymous_9) -FNDA:3,(anonymous_10) -DA:1,1 -DA:11,1 -DA:12,1 -DA:23,1 -DA:24,1 -DA:25,1 -DA:26,1 -DA:27,1 -DA:28,1 -DA:29,1 -DA:34,1 -DA:35,13 -DA:47,1 -DA:48,2 -DA:61,1 -DA:65,2 -DA:79,1 -DA:80,2 -DA:93,1 -DA:96,2 -DA:109,1 -DA:112,2 -DA:126,1 -DA:129,3 -LF:24 -LH:24 -BRDA:47,0,0,1 -BRDA:47,0,1,0 -BRDA:47,1,0,1 -BRDA:47,1,1,1 -BRDA:47,2,0,1 -BRDA:47,2,1,0 -BRDA:47,3,0,1 -BRDA:47,3,1,1 -BRDA:62,4,0,1 -BRDA:62,4,1,0 -BRDA:62,5,0,1 -BRDA:62,5,1,1 -BRDA:64,6,0,1 -BRDA:64,6,1,0 -BRDA:64,7,0,1 -BRDA:64,7,1,1 -BRDA:94,8,0,1 -BRDA:94,8,1,0 -BRDA:94,9,0,1 -BRDA:94,9,1,1 -BRDA:95,10,0,1 -BRDA:95,10,1,0 -BRDA:95,11,0,1 -BRDA:95,11,1,1 -BRDA:110,12,0,1 -BRDA:110,12,1,0 -BRDA:110,13,0,1 -BRDA:110,13,1,1 -BRDA:111,14,0,1 -BRDA:111,14,1,0 -BRDA:111,15,0,1 -BRDA:111,15,1,1 -BRDA:127,16,0,1 -BRDA:127,16,1,0 -BRDA:127,17,0,1 -BRDA:127,17,1,1 -BRDA:128,18,0,1 -BRDA:128,18,1,0 -BRDA:128,19,0,1 -BRDA:128,19,1,1 -BRDA:35,20,0,1 -BRDA:35,20,1,0 -BRDA:35,21,0,1 -BRDA:35,21,1,1 -BRF:44 -BRH:33 -end_of_record -TN: -SF:src\auth\auth.module.ts -FN:44,(anonymous_1) -FN:27,(anonymous_2) -FNF:2 -FNH:0 -FNDA:0,(anonymous_1) -FNDA:0,(anonymous_2) -DA:1,0 -DA:7,0 -DA:8,0 -DA:9,0 -DA:10,0 -DA:11,0 -DA:12,0 -DA:13,0 -DA:15,0 -DA:16,0 -DA:17,0 -DA:18,0 -DA:27,0 -DA:43,0 -DA:45,0 -LF:15 -LH:0 -BRF:0 -BRH:0 -end_of_record -TN: -SF:src\auth\dto\auth-response.dto.ts -FNF:0 -FNH:0 -DA:1,1 -DA:2,1 -DA:4,1 -DA:10,1 -DA:17,1 -DA:23,1 -DA:29,1 -DA:35,1 -DA:42,1 -DA:48,1 -DA:51,1 -DA:56,1 -DA:62,1 -DA:68,1 -LF:14 -LH:14 -BRDA:42,0,0,0 -BRDA:42,0,1,1 -BRDA:42,1,0,1 -BRDA:42,1,1,1 -BRF:4 -BRH:3 -end_of_record -TN: -SF:src\auth\dto\login.dto.ts -FNF:0 -FNH:0 -DA:1,1 -DA:2,1 -DA:4,1 -DA:12,1 -DA:21,1 -LF:5 -LH:5 -BRF:0 -BRH:0 -end_of_record -TN: -SF:src\auth\dto\refresh-token.dto.ts -FNF:0 -FNH:0 -DA:1,1 -DA:2,1 -DA:4,1 -DA:11,1 -LF:4 -LH:4 -BRF:0 -BRH:0 -end_of_record -TN: -SF:src\auth\dto\register.dto.ts -FNF:0 -FNH:0 -DA:1,1 -DA:10,1 -DA:11,1 -DA:13,1 -DA:21,1 -DA:39,1 -DA:48,1 -DA:57,1 -DA:66,1 -DA:75,1 -LF:10 -LH:10 -BRDA:75,0,0,0 -BRDA:75,0,1,1 -BRDA:75,1,0,1 -BRDA:75,1,1,1 -BRF:4 -BRH:3 -end_of_record -TN: -SF:src\auth\dto\resend-verification.dto.ts -FNF:0 -FNH:0 -DA:1,1 -DA:2,1 -DA:4,1 -DA:12,1 -LF:4 -LH:4 -BRF:0 -BRH:0 -end_of_record -TN: -SF:src\auth\dto\verify-email.dto.ts -FNF:0 -FNH:0 -DA:1,1 -DA:2,1 -DA:4,1 -DA:11,1 -LF:4 -LH:4 -BRF:0 -BRH:0 -end_of_record -TN: -SF:src\auth\providers\auth.service.ts -FN:35,(anonymous_13) -FN:43,(anonymous_14) -FN:91,(anonymous_15) -FN:120,(anonymous_16) -FN:148,(anonymous_17) -FN:188,(anonymous_18) -FN:199,(anonymous_19) -FN:227,(anonymous_20) -FN:247,(anonymous_21) -FN:294,(anonymous_22) -FN:359,(anonymous_23) -FN:394,(anonymous_24) -FN:438,(anonymous_25) -FNF:13 -FNH:0 -FNDA:0,(anonymous_13) -FNDA:0,(anonymous_14) -FNDA:0,(anonymous_15) -FNDA:0,(anonymous_16) -FNDA:0,(anonymous_17) -FNDA:0,(anonymous_18) -FNDA:0,(anonymous_19) -FNDA:0,(anonymous_20) -FNDA:0,(anonymous_21) -FNDA:0,(anonymous_22) -FNDA:0,(anonymous_23) -FNDA:0,(anonymous_24) -FNDA:0,(anonymous_25) -DA:1,1 -DA:11,1 -DA:12,1 -DA:13,1 -DA:14,1 -DA:15,1 -DA:16,1 -DA:17,1 -DA:21,1 -DA:27,1 -DA:32,1 -DA:33,0 -DA:37,0 -DA:38,0 -DA:39,0 -DA:47,0 -DA:48,0 -DA:49,0 -DA:52,0 -DA:56,0 -DA:57,0 -DA:61,0 -DA:62,0 -DA:65,0 -DA:66,0 -DA:67,0 -DA:70,0 -DA:71,0 -DA:76,0 -DA:84,0 -DA:87,0 -DA:92,0 -DA:96,0 -DA:97,0 -DA:100,0 -DA:101,0 -DA:103,0 -DA:110,0 -DA:114,0 -DA:116,0 -DA:124,0 -DA:128,0 -DA:129,0 -DA:132,0 -DA:136,0 -DA:137,0 -DA:142,0 -DA:144,0 -DA:149,0 -DA:156,0 -DA:168,0 -DA:169,0 -DA:170,0 -DA:172,0 -DA:189,0 -DA:192,0 -DA:193,0 -DA:195,0 -DA:203,0 -DA:207,0 -DA:208,0 -DA:211,0 -DA:215,0 -DA:218,0 -DA:219,0 -DA:220,0 -DA:221,0 -DA:223,0 -DA:230,0 -DA:234,0 -DA:235,0 -DA:238,0 -DA:239,0 -DA:243,0 -DA:248,0 -DA:251,0 -DA:252,0 -DA:258,0 -DA:259,0 -DA:260,0 -DA:261,0 -DA:263,0 -DA:264,0 -DA:265,0 -DA:266,0 -DA:268,0 -DA:270,0 -DA:271,0 -DA:275,0 -DA:284,0 -DA:287,0 -DA:298,0 -DA:299,0 -DA:300,0 -DA:303,0 -DA:304,0 -DA:307,0 -DA:312,0 -DA:315,0 -DA:316,0 -DA:319,0 -DA:323,0 -DA:324,0 -DA:328,0 -DA:329,0 -DA:330,0 -DA:331,0 -DA:332,0 -DA:333,0 -DA:335,0 -DA:336,0 -DA:338,0 -DA:340,0 -DA:346,0 -DA:352,0 -DA:355,0 -DA:363,0 -DA:364,0 -DA:365,0 -DA:368,0 -DA:369,0 -DA:370,0 -DA:371,0 -DA:372,0 -DA:374,0 -DA:376,0 -DA:381,0 -DA:387,0 -DA:390,0 -DA:398,0 -DA:399,0 -DA:400,0 -DA:403,0 -DA:404,0 -DA:406,0 -DA:407,0 -DA:408,0 -DA:409,0 -DA:410,0 -DA:413,0 -DA:415,0 -DA:417,0 -DA:423,0 -DA:431,0 -DA:434,0 -DA:441,0 -DA:443,0 -DA:448,0 -DA:451,0 -DA:452,0 -DA:456,0 -DA:457,0 -DA:460,0 -DA:463,0 -DA:467,0 -DA:469,0 -DA:472,0 -DA:473,0 -DA:474,0 -DA:478,0 -DA:482,0 -DA:484,0 -DA:486,0 -DA:490,0 -DA:492,0 -LF:165 -LH:11 -BRDA:48,0,0,0 -BRDA:48,0,1,0 -BRDA:56,1,0,0 -BRDA:56,1,1,0 -BRDA:71,2,0,0 -BRDA:71,2,1,0 -BRDA:72,3,0,0 -BRDA:72,3,1,0 -BRDA:96,4,0,0 -BRDA:96,4,1,0 -BRDA:128,5,0,0 -BRDA:128,5,1,0 -BRDA:136,6,0,0 -BRDA:136,6,1,0 -BRDA:153,7,0,0 -BRDA:153,7,1,0 -BRDA:181,8,0,0 -BRDA:181,8,1,0 -BRDA:192,9,0,0 -BRDA:192,9,1,0 -BRDA:207,10,0,0 -BRDA:207,10,1,0 -BRDA:211,11,0,0 -BRDA:211,11,1,0 -BRDA:212,12,0,0 -BRDA:212,12,1,0 -BRDA:234,13,0,0 -BRDA:234,13,1,0 -BRDA:238,14,0,0 -BRDA:238,14,1,0 -BRDA:251,15,0,0 -BRDA:251,15,1,0 -BRDA:271,16,0,0 -BRDA:271,16,1,0 -BRDA:272,17,0,0 -BRDA:272,17,1,0 -BRDA:299,18,0,0 -BRDA:299,18,1,0 -BRDA:307,19,0,0 -BRDA:307,19,1,0 -BRDA:308,20,0,0 -BRDA:308,20,1,0 -BRDA:308,20,2,0 -BRDA:315,21,0,0 -BRDA:315,21,1,0 -BRDA:323,22,0,0 -BRDA:323,22,1,0 -BRDA:340,23,0,0 -BRDA:340,23,1,0 -BRDA:341,24,0,0 -BRDA:341,24,1,0 -BRDA:364,25,0,0 -BRDA:364,25,1,0 -BRDA:376,26,0,0 -BRDA:376,26,1,0 -BRDA:377,27,0,0 -BRDA:377,27,1,0 -BRDA:399,28,0,0 -BRDA:399,28,1,0 -BRDA:406,29,0,0 -BRDA:406,29,1,0 -BRDA:409,30,0,0 -BRDA:409,30,1,0 -BRDA:410,31,0,0 -BRDA:410,31,1,0 -BRDA:417,32,0,0 -BRDA:417,32,1,0 -BRDA:418,33,0,0 -BRDA:418,33,1,0 -BRDA:427,34,0,0 -BRDA:427,34,1,0 -BRDA:451,35,0,0 -BRDA:451,35,1,0 -BRDA:456,36,0,0 -BRDA:456,36,1,0 -BRDA:467,37,0,0 -BRDA:467,37,1,0 -BRDA:486,38,0,0 -BRDA:486,38,1,0 -BRDA:487,39,0,0 -BRDA:487,39,1,0 -BRDA:37,40,0,1 -BRDA:37,40,1,0 -BRDA:37,41,0,1 -BRDA:37,41,1,1 -BRDA:37,42,0,1 -BRDA:37,42,1,0 -BRDA:37,43,0,1 -BRDA:37,43,1,1 -BRDA:38,44,0,1 -BRDA:38,44,1,0 -BRDA:38,45,0,1 -BRDA:38,45,1,1 -BRF:93 -BRH:9 -end_of_record -TN: -SF:src\auth\strategies\jwt.strategy.ts -FN:11,(anonymous_2) -FN:19,(anonymous_3) -FNF:2 -FNH:0 -FNDA:0,(anonymous_2) -FNDA:0,(anonymous_3) -DA:1,0 -DA:2,0 -DA:3,0 -DA:4,0 -DA:7,0 -DA:10,0 -DA:11,0 -DA:12,0 -DA:20,0 -DA:21,0 -DA:23,0 -LF:11 -LH:0 -BRDA:20,0,0,0 -BRDA:20,0,1,0 -BRDA:11,1,0,0 -BRDA:11,1,1,0 -BRDA:11,2,0,0 -BRDA:11,2,1,0 -BRF:6 -BRH:0 -end_of_record -TN: -SF:src\common\decorators\current-user.decorator.ts -FN:6,(anonymous_0) -FNF:1 -FNH:0 -FNDA:0,(anonymous_0) -DA:1,0 -DA:5,0 -DA:7,0 -DA:10,0 -DA:11,0 -LF:5 -LH:0 -BRDA:11,0,0,0 -BRDA:11,0,1,0 -BRF:2 -BRH:0 -end_of_record -TN: -SF:src\common\decorators\public.decorator.ts -FN:4,(anonymous_0) -FNF:1 -FNH:0 -FNDA:0,(anonymous_0) -DA:1,0 -DA:3,0 -DA:4,0 -LF:3 -LH:0 -BRF:0 -BRH:0 -end_of_record -TN: -SF:src\common\decorators\roles.decorator.ts -FN:5,(anonymous_0) -FNF:1 -FNH:0 -FNDA:0,(anonymous_0) -DA:1,0 -DA:4,0 -DA:5,0 -LF:3 -LH:0 -BRF:0 -BRH:0 -end_of_record -TN: -SF:src\common\enums\kyc-status.enum.ts -FN:1,(anonymous_0) -FNF:1 -FNH:1 -FNDA:1,(anonymous_0) -DA:1,1 -DA:2,1 -DA:3,1 -DA:4,1 -DA:5,1 -LF:5 -LH:5 -BRDA:1,0,0,1 -BRDA:1,0,1,1 -BRF:2 -BRH:2 -end_of_record -TN: -SF:src\common\enums\project-category.enum.ts -FN:1,(anonymous_0) -FNF:1 -FNH:0 -FNDA:0,(anonymous_0) -DA:1,0 -DA:2,0 -DA:3,0 -DA:4,0 -DA:5,0 -DA:6,0 -DA:7,0 -DA:8,0 -DA:9,0 -LF:9 -LH:0 -BRDA:1,0,0,0 -BRDA:1,0,1,0 -BRF:2 -BRH:0 -end_of_record -TN: -SF:src\common\enums\project-status.enum.ts -FN:1,(anonymous_0) -FNF:1 -FNH:0 -FNDA:0,(anonymous_0) -DA:1,0 -DA:2,0 -DA:3,0 -DA:4,0 -DA:5,0 -DA:6,0 -DA:7,0 -DA:8,0 -LF:8 -LH:0 -BRDA:1,0,0,0 -BRDA:1,0,1,0 -BRF:2 -BRH:0 -end_of_record -TN: -SF:src\common\enums\projects-sortBy.enum.ts -FN:1,(anonymous_0) -FNF:1 -FNH:0 -FNDA:0,(anonymous_0) -DA:1,0 -DA:2,0 -DA:3,0 -DA:4,0 -LF:4 -LH:0 -BRDA:1,0,0,0 -BRDA:1,0,1,0 -BRF:2 -BRH:0 -end_of_record -TN: -SF:src\common\enums\user-role.enum.ts -FN:1,(anonymous_0) -FNF:1 -FNH:1 -FNDA:1,(anonymous_0) -DA:1,1 -DA:2,1 -DA:3,1 -DA:4,1 -DA:5,1 -LF:5 -LH:5 -BRDA:1,0,0,1 -BRDA:1,0,1,1 -BRF:2 -BRH:2 -end_of_record -TN: -SF:src\common\filters\http-exeption.filter.ts -FN:14,(anonymous_4) -FN:15,(anonymous_5) -FN:32,(anonymous_6) -FNF:3 -FNH:0 -FNDA:0,(anonymous_4) -FNDA:0,(anonymous_5) -FNDA:0,(anonymous_6) -DA:1,0 -DA:10,0 -DA:13,0 -DA:14,0 -DA:16,0 -DA:17,0 -DA:18,0 -DA:20,0 -DA:21,0 -DA:23,0 -DA:24,0 -DA:26,0 -DA:27,0 -DA:28,0 -DA:29,0 -DA:30,0 -DA:31,0 -DA:32,0 -DA:40,0 -DA:41,0 -DA:42,0 -DA:48,0 -LF:22 -LH:0 -BRDA:26,0,0,0 -BRDA:26,0,1,0 -BRDA:28,1,0,0 -BRDA:28,1,1,0 -BRDA:30,2,0,0 -BRDA:30,2,1,0 -BRDA:31,3,0,0 -BRDA:31,3,1,0 -BRDA:40,4,0,0 -BRDA:40,4,1,0 -BRDA:41,5,0,0 -BRDA:41,5,1,0 -BRDA:14,6,0,0 -BRDA:14,6,1,0 -BRDA:14,7,0,0 -BRDA:14,7,1,0 -BRF:16 -BRH:0 -end_of_record -TN: -SF:src\common\guards\file-upload.guard.ts -FN:5,(anonymous_1) -FNF:1 -FNH:0 -FNDA:0,(anonymous_1) -DA:1,0 -DA:4,0 -DA:6,0 -DA:7,0 -DA:9,0 -DA:10,0 -DA:14,0 -DA:15,0 -DA:16,0 -DA:22,0 -DA:23,0 -DA:24,0 -DA:29,0 -LF:13 -LH:0 -BRDA:9,0,0,0 -BRDA:9,0,1,0 -BRDA:15,1,0,0 -BRDA:15,1,1,0 -BRDA:23,2,0,0 -BRDA:23,2,1,0 -BRF:6 -BRH:0 -end_of_record -TN: -SF:src\common\guards\jwt-auth.guard.ts -FN:10,(anonymous_2) -FN:14,(anonymous_3) -FNF:2 -FNH:0 -FNDA:0,(anonymous_2) -FNDA:0,(anonymous_3) -DA:1,0 -DA:2,0 -DA:3,0 -DA:5,0 -DA:6,0 -DA:9,0 -DA:10,0 -DA:11,0 -DA:17,0 -DA:21,0 -DA:22,0 -LF:11 -LH:0 -BRDA:21,0,0,0 -BRDA:21,0,1,0 -BRDA:10,1,0,0 -BRDA:10,1,1,0 -BRDA:10,2,0,0 -BRDA:10,2,1,0 -BRF:6 -BRH:0 -end_of_record -TN: -SF:src\common\guards\roles.guard.ts -FN:8,(anonymous_2) -FN:10,(anonymous_3) -FN:25,(anonymous_4) -FNF:3 -FNH:0 -FNDA:0,(anonymous_2) -FNDA:0,(anonymous_3) -FNDA:0,(anonymous_4) -DA:1,0 -DA:2,0 -DA:3,0 -DA:7,0 -DA:8,0 -DA:11,0 -DA:16,0 -DA:17,0 -DA:20,0 -DA:21,0 -DA:22,0 -DA:25,0 -LF:12 -LH:0 -BRDA:16,0,0,0 -BRDA:16,0,1,0 -BRDA:21,1,0,0 -BRDA:21,1,1,0 -BRDA:8,2,0,0 -BRDA:8,2,1,0 -BRDA:8,3,0,0 -BRDA:8,3,1,0 -BRF:8 -BRH:0 -end_of_record -TN: -SF:src\common\interceptors\logging.interceptor.ts -FN:14,(anonymous_1) -FN:20,(anonymous_2) -FNF:2 -FNH:0 -FNDA:0,(anonymous_1) -FNDA:0,(anonymous_2) -DA:1,0 -DA:8,0 -DA:11,0 -DA:12,0 -DA:15,0 -DA:16,0 -DA:17,0 -DA:19,0 -DA:21,0 -DA:22,0 -DA:24,0 -LF:11 -LH:0 -BRF:0 -BRH:0 -end_of_record -TN: -SF:src\common\middleware\token-validation.middleware.ts -FN:10,(anonymous_1) -FNF:1 -FNH:0 -FNDA:0,(anonymous_1) -DA:1,0 -DA:9,0 -DA:11,0 -DA:13,0 -DA:15,0 -DA:16,0 -DA:21,0 -DA:22,0 -DA:23,0 -DA:28,0 -LF:10 -LH:0 -BRDA:13,0,0,0 -BRDA:13,0,1,0 -BRDA:15,1,0,0 -BRDA:15,1,1,0 -BRDA:22,2,0,0 -BRDA:22,2,1,0 -BRF:6 -BRH:0 -end_of_record -TN: -SF:src\common\services\file-upload.service.ts -FN:13,(anonymous_2) -FN:23,(anonymous_3) -FN:49,(anonymous_4) -FN:68,(anonymous_5) -FNF:4 -FNH:0 -FNDA:0,(anonymous_2) -FNDA:0,(anonymous_3) -FNDA:0,(anonymous_4) -FNDA:0,(anonymous_5) -DA:1,0 -DA:2,0 -DA:3,0 -DA:4,0 -DA:5,0 -DA:9,0 -DA:10,0 -DA:13,0 -DA:14,0 -DA:24,0 -DA:25,0 -DA:26,0 -DA:28,0 -DA:29,0 -DA:39,0 -DA:41,0 -DA:42,0 -DA:44,0 -DA:45,0 -DA:50,0 -DA:51,0 -DA:52,0 -DA:54,0 -DA:61,0 -DA:63,0 -DA:64,0 -DA:69,0 -LF:27 -LH:0 -BRDA:68,0,0,0 -BRDA:13,1,0,0 -BRDA:13,1,1,0 -BRDA:13,2,0,0 -BRDA:13,2,1,0 -BRF:5 -BRH:0 -end_of_record -TN: -SF:src\database\app-config.service.ts -FN:7,(anonymous_2) -FN:9,(anonymous_3) -FN:13,(anonymous_4) -FN:17,(anonymous_5) -FN:21,(anonymous_6) -FN:25,(anonymous_7) -FN:29,(anonymous_8) -FNF:7 -FNH:0 -FNDA:0,(anonymous_2) -FNDA:0,(anonymous_3) -FNDA:0,(anonymous_4) -FNDA:0,(anonymous_5) -FNDA:0,(anonymous_6) -FNDA:0,(anonymous_7) -FNDA:0,(anonymous_8) -DA:1,0 -DA:2,0 -DA:6,0 -DA:7,0 -DA:10,0 -DA:14,0 -DA:18,0 -DA:22,0 -DA:26,0 -DA:30,0 -LF:10 -LH:0 -BRDA:7,0,0,0 -BRDA:7,0,1,0 -BRDA:7,1,0,0 -BRDA:7,1,1,0 -BRF:4 -BRH:0 -end_of_record -TN: -SF:src\database\config.ts -FN:3,(anonymous_0) -FNF:1 -FNH:0 -FNDA:0,(anonymous_0) -DA:3,0 -LF:1 -LH:0 -BRDA:4,0,0,0 -BRDA:4,0,1,0 -BRDA:7,1,0,0 -BRDA:7,1,1,0 -BRDA:8,2,0,0 -BRDA:8,2,1,0 -BRDA:10,3,0,0 -BRDA:10,3,1,0 -BRDA:12,4,0,0 -BRDA:12,4,1,0 -BRDA:14,5,0,0 -BRDA:14,5,1,0 -BRDA:25,6,0,0 -BRDA:25,6,1,0 -BRF:14 -BRH:0 -end_of_record -TN: -SF:src\database\data-source.ts -FNF:0 -FNH:0 -DA:1,0 -DA:2,0 -DA:4,0 -DA:6,0 -LF:4 -LH:0 -BRDA:9,0,0,0 -BRDA:9,0,1,0 -BRF:2 -BRH:0 -end_of_record -TN: -SF:src\database\database.module.ts -FN:10,(anonymous_1) -FNF:1 -FNH:0 -FNDA:0,(anonymous_1) -DA:1,0 -DA:2,0 -DA:3,0 -DA:10,0 -DA:23,0 -LF:5 -LH:0 -BRF:0 -BRH:0 -end_of_record -TN: -SF:src\database\env.validation.ts -FNF:0 -FNH:0 -DA:1,0 -DA:3,0 -LF:2 -LH:0 -BRF:0 -BRH:0 -end_of_record -TN: -SF:src\database\migrations\1711382400000-CreateDonationsTable.ts -FN:4,(anonymous_0) -FN:98,(anonymous_1) -FN:103,(anonymous_2) -FN:108,(anonymous_3) -FN:114,(anonymous_4) -FN:119,(anonymous_5) -FNF:6 -FNH:0 -FNDA:0,(anonymous_0) -FNDA:0,(anonymous_1) -FNDA:0,(anonymous_2) -FNDA:0,(anonymous_3) -FNDA:0,(anonymous_4) -FNDA:0,(anonymous_5) -DA:1,0 -DA:3,0 -DA:5,0 -DA:58,0 -DA:66,0 -DA:75,0 -DA:86,0 -DA:99,0 -DA:101,0 -DA:103,0 -DA:104,0 -DA:105,0 -DA:108,0 -DA:109,0 -DA:110,0 -DA:114,0 -DA:115,0 -DA:116,0 -DA:119,0 -DA:120,0 -DA:121,0 -DA:125,0 -LF:22 -LH:0 -BRDA:101,0,0,0 -BRDA:101,0,1,0 -BRDA:104,1,0,0 -BRDA:104,1,1,0 -BRDA:109,2,0,0 -BRDA:109,2,1,0 -BRDA:115,3,0,0 -BRDA:115,3,1,0 -BRDA:120,4,0,0 -BRDA:120,4,1,0 -BRF:10 -BRH:0 -end_of_record -TN: -SF:src\donations\donations.controller.ts -FN:21,(anonymous_4) -FN:29,(anonymous_5) -FN:38,(anonymous_6) -FN:49,(anonymous_7) -FN:58,(anonymous_8) -FN:71,(anonymous_9) -FN:83,(anonymous_10) -FN:92,(anonymous_11) -FN:104,(anonymous_12) -FN:111,(anonymous_13) -FN:118,(anonymous_14) -FNF:11 -FNH:0 -FNDA:0,(anonymous_4) -FNDA:0,(anonymous_5) -FNDA:0,(anonymous_6) -FNDA:0,(anonymous_7) -FNDA:0,(anonymous_8) -FNDA:0,(anonymous_9) -FNDA:0,(anonymous_10) -FNDA:0,(anonymous_11) -FNDA:0,(anonymous_12) -FNDA:0,(anonymous_13) -FNDA:0,(anonymous_14) -DA:1,0 -DA:12,0 -DA:13,0 -DA:14,0 -DA:15,0 -DA:16,0 -DA:20,0 -DA:21,0 -DA:29,0 -DA:30,0 -DA:38,0 -DA:42,0 -DA:49,0 -DA:50,0 -DA:58,0 -DA:63,0 -DA:71,0 -DA:76,0 -DA:83,0 -DA:84,0 -DA:92,0 -DA:96,0 -DA:104,0 -DA:105,0 -DA:111,0 -DA:112,0 -DA:118,0 -DA:119,0 -LF:28 -LH:0 -BRDA:39,0,0,0 -BRDA:40,1,0,0 -BRDA:60,2,0,0 -BRDA:61,3,0,0 -BRDA:73,4,0,0 -BRDA:74,5,0,0 -BRDA:29,6,0,0 -BRDA:29,6,1,0 -BRDA:29,7,0,0 -BRDA:29,7,1,0 -BRDA:94,8,0,0 -BRDA:94,8,1,0 -BRDA:94,9,0,0 -BRDA:94,9,1,0 -BRDA:21,10,0,0 -BRDA:21,10,1,0 -BRDA:21,11,0,0 -BRDA:21,11,1,0 -BRF:18 -BRH:0 -end_of_record -TN: -SF:src\donations\donations.module.ts -FNF:0 -FNH:0 -DA:1,0 -DA:2,0 -DA:3,0 -DA:4,0 -DA:5,0 -DA:6,0 -DA:7,0 -DA:17,0 -LF:8 -LH:0 -BRF:0 -BRH:0 -end_of_record -TN: -SF:src\donations\dto\create-donation.dto.ts -FNF:0 -FNH:0 -DA:1,0 -DA:2,0 -DA:4,0 -DA:8,0 -DA:14,0 -DA:19,0 -DA:24,0 -DA:28,0 -LF:8 -LH:0 -BRF:0 -BRH:0 -end_of_record -TN: -SF:src\donations\dto\donation-response.dto.ts -FN:29,(anonymous_2) -FNF:1 -FNH:0 -FNDA:0,(anonymous_2) -DA:1,0 -DA:4,0 -DA:6,0 -DA:9,0 -DA:12,0 -DA:15,0 -DA:18,0 -DA:21,0 -DA:24,0 -DA:27,0 -DA:30,0 -LF:11 -LH:0 -BRDA:27,0,0,0 -BRDA:27,0,1,0 -BRDA:27,1,0,0 -BRDA:27,1,1,0 -BRF:4 -BRH:0 -end_of_record -TN: -SF:src\donations\dto\update-donation.dto.ts -FNF:0 -FNH:0 -DA:1,0 -DA:2,0 -DA:4,0 -LF:3 -LH:0 -BRF:0 -BRH:0 -end_of_record -TN: -SF:src\donations\entities\donation.entity.ts -FN:25,(anonymous_2) -FN:25,(anonymous_3) -FN:34,(anonymous_4) -FNF:3 -FNH:0 -FNDA:0,(anonymous_2) -FNDA:0,(anonymous_3) -FNDA:0,(anonymous_4) -DA:1,0 -DA:11,0 -DA:12,0 -DA:18,0 -DA:20,0 -DA:23,0 -DA:25,0 -DA:29,0 -DA:32,0 -DA:34,0 -DA:36,0 -DA:39,0 -DA:42,0 -DA:45,0 -DA:48,0 -DA:51,0 -LF:16 -LH:0 -BRDA:29,0,0,0 -BRDA:29,0,1,0 -BRDA:29,1,0,0 -BRDA:29,1,1,0 -BRDA:51,2,0,0 -BRDA:51,2,1,0 -BRDA:51,3,0,0 -BRDA:51,3,1,0 -BRF:8 -BRH:0 -end_of_record -TN: -SF:src\donations\providers\donations.service.ts -FN:11,(anonymous_4) -FN:16,(anonymous_5) -FN:32,(anonymous_6) -FN:41,(anonymous_7) -FN:46,(anonymous_8) -FN:59,(anonymous_9) -FN:69,(anonymous_10) -FN:74,(anonymous_11) -FN:84,(anonymous_12) -FN:89,(anonymous_13) -FN:102,(anonymous_14) -FN:118,(anonymous_15) -FN:123,(anonymous_16) -FN:133,(anonymous_17) -FNF:14 -FNH:0 -FNDA:0,(anonymous_4) -FNDA:0,(anonymous_5) -FNDA:0,(anonymous_6) -FNDA:0,(anonymous_7) -FNDA:0,(anonymous_8) -FNDA:0,(anonymous_9) -FNDA:0,(anonymous_10) -FNDA:0,(anonymous_11) -FNDA:0,(anonymous_12) -FNDA:0,(anonymous_13) -FNDA:0,(anonymous_14) -FNDA:0,(anonymous_15) -FNDA:0,(anonymous_16) -FNDA:0,(anonymous_17) -DA:1,0 -DA:2,0 -DA:3,0 -DA:4,0 -DA:7,0 -DA:10,0 -DA:13,0 -DA:17,0 -DA:18,0 -DA:22,0 -DA:23,0 -DA:25,0 -DA:26,0 -DA:28,0 -DA:33,0 -DA:40,0 -DA:41,0 -DA:47,0 -DA:52,0 -DA:53,0 -DA:56,0 -DA:60,0 -DA:68,0 -DA:69,0 -DA:75,0 -DA:83,0 -DA:84,0 -DA:90,0 -DA:95,0 -DA:96,0 -DA:99,0 -DA:103,0 -DA:105,0 -DA:107,0 -DA:108,0 -DA:109,0 -DA:111,0 -DA:112,0 -DA:114,0 -DA:119,0 -DA:120,0 -DA:124,0 -DA:130,0 -DA:134,0 -LF:44 -LH:0 -BRDA:25,0,0,0 -BRDA:25,0,1,0 -BRDA:32,1,0,0 -BRDA:32,2,0,0 -BRDA:52,3,0,0 -BRDA:52,3,1,0 -BRDA:59,4,0,0 -BRDA:59,5,0,0 -BRDA:74,6,0,0 -BRDA:74,7,0,0 -BRDA:95,8,0,0 -BRDA:95,8,1,0 -BRDA:111,9,0,0 -BRDA:111,9,1,0 -BRDA:130,10,0,0 -BRDA:130,10,1,0 -BRDA:13,11,0,0 -BRDA:13,11,1,0 -BRDA:13,12,0,0 -BRDA:13,12,1,0 -BRF:20 -BRH:0 -end_of_record -TN: -SF:src\logger\logger.middleware.ts -FN:7,(anonymous_2) -FN:9,(anonymous_3) -FN:13,(anonymous_4) -FNF:3 -FNH:0 -FNDA:0,(anonymous_2) -FNDA:0,(anonymous_3) -FNDA:0,(anonymous_4) -DA:1,0 -DA:3,0 -DA:6,0 -DA:7,0 -DA:10,0 -DA:11,0 -DA:13,0 -DA:14,0 -DA:15,0 -DA:16,0 -DA:28,0 -LF:11 -LH:0 -BRDA:7,0,0,0 -BRDA:7,0,1,0 -BRDA:7,1,0,0 -BRDA:7,1,1,0 -BRF:4 -BRH:0 -end_of_record -TN: -SF:src\logger\logger.module.ts -FN:15,(anonymous_1) -FNF:1 -FNH:0 -FNDA:0,(anonymous_1) -DA:1,0 -DA:7,0 -DA:8,0 -DA:14,0 -DA:16,0 -LF:5 -LH:0 -BRF:0 -BRH:0 -end_of_record -TN: -SF:src\logger\logger.service.ts -FN:12,(anonymous_3) -FN:34,(anonymous_4) -FN:39,(anonymous_5) -FN:56,(anonymous_6) -FN:61,(anonymous_7) -FN:67,(anonymous_8) -FN:72,(anonymous_9) -FN:77,(anonymous_10) -FNF:8 -FNH:0 -FNDA:0,(anonymous_3) -FNDA:0,(anonymous_4) -FNDA:0,(anonymous_5) -FNDA:0,(anonymous_6) -FNDA:0,(anonymous_7) -FNDA:0,(anonymous_8) -FNDA:0,(anonymous_9) -FNDA:0,(anonymous_10) -DA:1,0 -DA:2,0 -DA:3,0 -DA:4,0 -DA:7,0 -DA:13,0 -DA:15,0 -DA:16,0 -DA:18,0 -DA:19,0 -DA:21,0 -DA:22,0 -DA:24,0 -DA:31,0 -DA:35,0 -DA:36,0 -DA:40,0 -DA:41,0 -DA:42,0 -DA:43,0 -DA:44,0 -DA:48,0 -DA:49,0 -DA:50,0 -DA:51,0 -DA:52,0 -DA:57,0 -DA:58,0 -DA:62,0 -DA:63,0 -DA:64,0 -DA:68,0 -DA:69,0 -DA:73,0 -DA:74,0 -DA:78,0 -DA:79,0 -LF:37 -LH:0 -BRDA:13,0,0,0 -BRDA:13,0,1,0 -BRDA:15,1,0,0 -BRDA:15,1,1,0 -BRDA:15,2,0,0 -BRDA:15,2,1,0 -BRDA:18,3,0,0 -BRDA:18,3,1,0 -BRDA:19,4,0,0 -BRDA:19,4,1,0 -BRDA:41,5,0,0 -BRDA:41,5,1,0 -BRDA:48,6,0,0 -BRDA:48,6,1,0 -BRDA:63,7,0,0 -BRDA:63,7,1,0 -BRF:16 -BRH:0 -end_of_record -TN: -SF:src\mail\mail.module.ts -FNF:0 -FNH:0 -DA:1,0 -DA:2,0 -DA:3,0 -DA:10,0 -LF:4 -LH:0 -BRF:0 -BRH:0 -end_of_record -TN: -SF:src\mail\mail.service.ts -FN:25,(anonymous_11) -FN:27,(anonymous_12) -FN:66,(anonymous_13) -FN:110,(anonymous_14) -FN:137,(anonymous_15) -FNF:5 -FNH:0 -FNDA:0,(anonymous_11) -FNDA:0,(anonymous_12) -FNDA:0,(anonymous_13) -FNDA:0,(anonymous_14) -FNDA:0,(anonymous_15) -DA:1,0 -DA:2,0 -DA:3,0 -DA:4,0 -DA:5,0 -DA:6,0 -DA:21,0 -DA:22,0 -DA:23,0 -DA:25,0 -DA:28,0 -DA:29,0 -DA:30,0 -DA:32,0 -DA:41,0 -DA:43,0 -DA:53,0 -DA:54,0 -DA:58,0 -DA:62,0 -DA:67,0 -DA:68,0 -DA:69,0 -DA:71,0 -DA:72,0 -DA:85,0 -DA:87,0 -DA:97,0 -DA:98,0 -DA:102,0 -DA:106,0 -DA:111,0 -DA:113,0 -DA:123,0 -DA:129,0 -DA:130,0 -DA:132,0 -DA:133,0 -DA:138,0 -DA:139,0 -DA:140,0 -DA:141,0 -DA:143,0 -LF:43 -LH:0 -BRDA:71,0,0,0 -BRDA:71,0,1,0 -BRDA:138,1,0,0 -BRDA:138,1,1,0 -BRDA:140,2,0,0 -BRDA:140,2,1,0 -BRDA:25,3,0,0 -BRDA:25,3,1,0 -BRDA:25,4,0,0 -BRDA:25,4,1,0 -BRF:10 -BRH:0 -end_of_record -TN: -SF:src\projects\projects.controller.ts -FN:51,(anonymous_4) -FN:65,(anonymous_5) -FN:82,(anonymous_6) -FN:99,(anonymous_7) -FN:114,(anonymous_8) -FN:139,(anonymous_9) -FN:164,(anonymous_10) -FN:191,(anonymous_11) -FN:209,(anonymous_12) -FN:223,(anonymous_13) -FN:240,(anonymous_14) -FN:259,(anonymous_15) -FN:272,(anonymous_16) -FN:290,(anonymous_17) -FNF:14 -FNH:0 -FNDA:0,(anonymous_4) -FNDA:0,(anonymous_5) -FNDA:0,(anonymous_6) -FNDA:0,(anonymous_7) -FNDA:0,(anonymous_8) -FNDA:0,(anonymous_9) -FNDA:0,(anonymous_10) -FNDA:0,(anonymous_11) -FNDA:0,(anonymous_12) -FNDA:0,(anonymous_13) -FNDA:0,(anonymous_14) -FNDA:0,(anonymous_15) -FNDA:0,(anonymous_16) -FNDA:0,(anonymous_17) -DA:1,0 -DA:17,0 -DA:30,0 -DA:31,0 -DA:32,0 -DA:33,0 -DA:34,0 -DA:35,0 -DA:37,0 -DA:38,0 -DA:39,0 -DA:40,0 -DA:41,0 -DA:42,0 -DA:43,0 -DA:44,0 -DA:45,0 -DA:50,0 -DA:52,0 -DA:53,0 -DA:54,0 -DA:55,0 -DA:65,0 -DA:66,0 -DA:67,0 -DA:82,0 -DA:83,0 -DA:99,0 -DA:100,0 -DA:101,0 -DA:102,0 -DA:114,0 -DA:119,0 -DA:120,0 -DA:121,0 -DA:127,0 -DA:139,0 -DA:144,0 -DA:145,0 -DA:146,0 -DA:152,0 -DA:164,0 -DA:169,0 -DA:170,0 -DA:171,0 -DA:177,0 -DA:191,0 -DA:196,0 -DA:197,0 -DA:198,0 -DA:199,0 -DA:209,0 -DA:210,0 -DA:211,0 -DA:223,0 -DA:228,0 -DA:229,0 -DA:230,0 -DA:231,0 -DA:240,0 -DA:241,0 -DA:242,0 -DA:259,0 -DA:260,0 -DA:272,0 -DA:277,0 -DA:278,0 -DA:279,0 -DA:290,0 -DA:291,0 -DA:292,0 -LF:71 -LH:0 -BRDA:70,0,0,0 -BRDA:70,0,1,0 -BRDA:71,1,0,0 -BRDA:71,1,1,0 -BRDA:245,2,0,0 -BRDA:245,2,1,0 -BRDA:246,3,0,0 -BRDA:246,3,1,0 -BRDA:247,4,0,0 -BRDA:247,4,1,0 -BRDA:65,5,0,0 -BRDA:65,5,1,0 -BRDA:65,6,0,0 -BRDA:65,6,1,0 -BRDA:99,7,0,0 -BRDA:99,7,1,0 -BRDA:99,8,0,0 -BRDA:99,8,1,0 -BRDA:116,9,0,0 -BRDA:116,9,1,0 -BRDA:116,10,0,0 -BRDA:116,10,1,0 -BRDA:141,11,0,0 -BRDA:141,11,1,0 -BRDA:141,12,0,0 -BRDA:141,12,1,0 -BRDA:166,13,0,0 -BRDA:166,13,1,0 -BRDA:166,14,0,0 -BRDA:166,14,1,0 -BRDA:240,15,0,0 -BRDA:240,15,1,0 -BRDA:240,16,0,0 -BRDA:240,16,1,0 -BRDA:274,17,0,0 -BRDA:274,17,1,0 -BRDA:274,18,0,0 -BRDA:274,18,1,0 -BRDA:290,19,0,0 -BRDA:290,19,1,0 -BRDA:290,20,0,0 -BRDA:290,20,1,0 -BRDA:52,21,0,0 -BRDA:52,21,1,0 -BRDA:52,22,0,0 -BRDA:52,22,1,0 -BRDA:52,23,0,0 -BRDA:52,23,1,0 -BRDA:52,24,0,0 -BRDA:52,24,1,0 -BRDA:53,25,0,0 -BRDA:53,25,1,0 -BRDA:53,26,0,0 -BRDA:53,26,1,0 -BRDA:54,27,0,0 -BRDA:54,27,1,0 -BRDA:54,28,0,0 -BRDA:54,28,1,0 -BRF:58 -BRH:0 -end_of_record -TN: -SF:src\projects\projects.module.ts -FNF:0 -FNH:0 -DA:1,0 -DA:2,0 -DA:3,0 -DA:4,0 -DA:5,0 -DA:6,0 -DA:7,0 -DA:8,0 -DA:9,0 -DA:10,0 -DA:11,0 -DA:12,0 -DA:13,0 -DA:14,0 -DA:41,0 -LF:15 -LH:0 -BRF:0 -BRH:0 -end_of_record -TN: -SF:src\projects\dto\analytics-query.dto.ts -FN:7,(anonymous_2) -FN:12,(anonymous_3) -FN:17,(anonymous_4) -FNF:3 -FNH:0 -FNDA:0,(anonymous_2) -FNDA:0,(anonymous_3) -FNDA:0,(anonymous_4) -DA:1,0 -DA:2,0 -DA:4,0 -DA:7,0 -DA:8,0 -DA:12,0 -DA:13,0 -DA:17,0 -DA:18,0 -DA:22,0 -LF:10 -LH:0 -BRDA:7,0,0,0 -BRDA:7,0,1,0 -BRDA:12,1,0,0 -BRDA:12,1,1,0 -BRDA:17,2,0,0 -BRDA:17,2,1,0 -BRF:6 -BRH:0 -end_of_record -TN: -SF:src\projects\dto\create-project.dto.ts -FN:46,(anonymous_2) -FN:56,(anonymous_3) -FNF:2 -FNH:0 -FNDA:0,(anonymous_2) -FNDA:0,(anonymous_3) -DA:1,0 -DA:10,0 -DA:11,0 -DA:12,0 -DA:14,0 -DA:21,0 -DA:30,0 -DA:38,0 -DA:46,0 -DA:49,0 -DA:56,0 -DA:57,0 -DA:67,0 -LF:13 -LH:0 -BRDA:57,0,0,0 -BRDA:57,0,1,0 -BRDA:57,1,0,0 -BRDA:57,1,1,0 -BRDA:67,2,0,0 -BRDA:67,2,1,0 -BRDA:67,3,0,0 -BRDA:67,3,1,0 -BRF:8 -BRH:0 -end_of_record -TN: -SF:src\projects\dto\get-projects-query.dto.ts -FN:53,(anonymous_2) -FN:66,(anonymous_3) -FNF:2 -FNH:0 -FNDA:0,(anonymous_2) -FNDA:0,(anonymous_3) -DA:1,0 -DA:2,0 -DA:3,0 -DA:4,0 -DA:5,0 -DA:6,0 -DA:8,0 -DA:16,0 -DA:25,0 -DA:33,0 -DA:43,0 -DA:53,0 -DA:57,0 -DA:66,0 -DA:69,0 -LF:15 -LH:0 -BRDA:16,0,0,0 -BRDA:16,0,1,0 -BRDA:16,1,0,0 -BRDA:16,1,1,0 -BRDA:25,2,0,0 -BRDA:25,2,1,0 -BRDA:25,3,0,0 -BRDA:25,3,1,0 -BRDA:43,4,0,0 -BRDA:43,4,1,0 -BRDA:43,5,0,0 -BRDA:43,5,1,0 -BRF:12 -BRH:0 -end_of_record -TN: -SF:src\projects\dto\search-projects.dto.ts -FN:10,(anonymous_2) -FN:35,(anonymous_3) -FN:39,(anonymous_4) -FNF:3 -FNH:0 -FNDA:0,(anonymous_2) -FNDA:0,(anonymous_3) -FNDA:0,(anonymous_4) -DA:1,0 -DA:2,0 -DA:3,0 -DA:4,0 -DA:5,0 -DA:7,0 -DA:10,0 -DA:11,0 -DA:15,0 -DA:19,0 -DA:24,0 -DA:29,0 -DA:33,0 -DA:35,0 -DA:37,0 -DA:39,0 -DA:41,0 -DA:45,0 -DA:49,0 -DA:53,0 -DA:57,0 -LF:21 -LH:0 -BRDA:15,0,0,0 -BRDA:15,0,1,0 -BRDA:15,1,0,0 -BRDA:15,1,1,0 -BRDA:19,2,0,0 -BRDA:19,2,1,0 -BRDA:19,3,0,0 -BRDA:19,3,1,0 -BRDA:33,4,0,0 -BRDA:33,4,1,0 -BRDA:33,5,0,0 -BRDA:33,5,1,0 -BRF:12 -BRH:0 -end_of_record -TN: -SF:src\projects\dto\update-project-status.dto.ts -FNF:0 -FNH:0 -DA:1,0 -DA:2,0 -DA:4,0 -DA:8,0 -DA:12,0 -LF:5 -LH:0 -BRDA:8,0,0,0 -BRDA:8,0,1,0 -BRDA:8,1,0,0 -BRDA:8,1,1,0 -BRF:4 -BRH:0 -end_of_record -TN: -SF:src\projects\dto\upload-image.dto.ts -FN:18,(anonymous_2) -FNF:1 -FNH:0 -FNDA:0,(anonymous_2) -DA:1,0 -DA:2,0 -DA:4,0 -DA:6,0 -DA:9,0 -DA:12,0 -DA:16,0 -DA:18,0 -DA:19,0 -DA:22,0 -DA:24,0 -LF:11 -LH:0 -BRF:0 -BRH:0 -end_of_record -TN: -SF:src\projects\entities\project-history.entity.ts -FN:30,(anonymous_2) -FN:37,(anonymous_3) -FNF:2 -FNH:0 -FNDA:0,(anonymous_2) -FNDA:0,(anonymous_3) -DA:1,0 -DA:9,0 -DA:10,0 -DA:11,0 -DA:14,0 -DA:16,0 -DA:19,0 -DA:22,0 -DA:25,0 -DA:28,0 -DA:30,0 -DA:32,0 -DA:35,0 -DA:37,0 -DA:39,0 -DA:42,0 -LF:16 -LH:0 -BRDA:19,0,0,0 -BRDA:19,0,1,0 -BRDA:19,1,0,0 -BRDA:19,1,1,0 -BRDA:22,2,0,0 -BRDA:22,2,1,0 -BRDA:22,3,0,0 -BRDA:22,3,1,0 -BRDA:32,4,0,0 -BRDA:32,4,1,0 -BRDA:32,5,0,0 -BRDA:32,5,1,0 -BRDA:39,6,0,0 -BRDA:39,6,1,0 -BRDA:39,7,0,0 -BRDA:39,7,1,0 -BRDA:42,8,0,0 -BRDA:42,8,1,0 -BRDA:42,9,0,0 -BRDA:42,9,1,0 -BRF:20 -BRH:0 -end_of_record -TN: -SF:src\projects\entities\project-image.entity.ts -FN:34,(anonymous_2) -FNF:1 -FNH:0 -FNDA:0,(anonymous_2) -DA:1,0 -DA:9,0 -DA:12,0 -DA:14,0 -DA:17,0 -DA:20,0 -DA:23,0 -DA:26,0 -DA:29,0 -DA:32,0 -DA:34,0 -DA:36,0 -DA:39,0 -LF:13 -LH:0 -BRDA:36,0,0,0 -BRDA:36,0,1,0 -BRDA:36,1,0,0 -BRDA:36,1,1,0 -BRDA:39,2,0,0 -BRDA:39,2,1,0 -BRDA:39,3,0,0 -BRDA:39,3,1,0 -BRF:8 -BRH:0 -end_of_record -TN: -SF:src\projects\entities\project.entity.ts -FN:73,(anonymous_2) -FN:77,(anonymous_3) -FN:77,(anonymous_4) -FN:80,(anonymous_5) -FN:80,(anonymous_6) -FN:83,(anonymous_7) -FN:83,(anonymous_8) -FNF:7 -FNH:0 -FNDA:0,(anonymous_2) -FNDA:0,(anonymous_3) -FNDA:0,(anonymous_4) -FNDA:0,(anonymous_5) -FNDA:0,(anonymous_6) -FNDA:0,(anonymous_7) -FNDA:0,(anonymous_8) -DA:1,0 -DA:12,0 -DA:13,0 -DA:14,0 -DA:15,0 -DA:16,0 -DA:17,0 -DA:24,0 -DA:26,0 -DA:29,0 -DA:32,0 -DA:35,0 -DA:42,0 -DA:49,0 -DA:52,0 -DA:55,0 -DA:58,0 -DA:61,0 -DA:64,0 -DA:67,0 -DA:71,0 -DA:73,0 -DA:75,0 -DA:77,0 -DA:78,0 -DA:80,0 -DA:81,0 -DA:83,0 -DA:84,0 -DA:87,0 -DA:90,0 -LF:31 -LH:0 -BRDA:42,0,0,0 -BRDA:42,0,1,0 -BRDA:42,1,0,0 -BRDA:42,1,1,0 -BRDA:49,2,0,0 -BRDA:49,2,1,0 -BRDA:49,3,0,0 -BRDA:49,3,1,0 -BRDA:75,4,0,0 -BRDA:75,4,1,0 -BRDA:75,5,0,0 -BRDA:75,5,1,0 -BRDA:87,6,0,0 -BRDA:87,6,1,0 -BRDA:87,7,0,0 -BRDA:87,7,1,0 -BRDA:90,8,0,0 -BRDA:90,8,1,0 -BRDA:90,9,0,0 -BRDA:90,9,1,0 -BRF:20 -BRH:0 -end_of_record -TN: -SF:src\projects\providers\projects.service.ts -FN:20,(anonymous_4) -FN:30,(anonymous_5) -FN:70,(anonymous_6) -FN:145,(anonymous_7) -FN:211,(anonymous_8) -FN:231,(anonymous_9) -FN:249,(anonymous_10) -FN:300,(anonymous_11) -FN:325,(anonymous_12) -FNF:9 -FNH:0 -FNDA:0,(anonymous_4) -FNDA:0,(anonymous_5) -FNDA:0,(anonymous_6) -FNDA:0,(anonymous_7) -FNDA:0,(anonymous_8) -FNDA:0,(anonymous_9) -FNDA:0,(anonymous_10) -FNDA:0,(anonymous_11) -FNDA:0,(anonymous_12) -DA:1,0 -DA:7,0 -DA:8,0 -DA:9,0 -DA:10,0 -DA:11,0 -DA:12,0 -DA:13,0 -DA:19,0 -DA:22,0 -DA:24,0 -DA:26,0 -DA:41,0 -DA:44,0 -DA:45,0 -DA:46,0 -DA:48,0 -DA:49,0 -DA:52,0 -DA:66,0 -DA:80,0 -DA:82,0 -DA:105,0 -DA:106,0 -DA:108,0 -DA:113,0 -DA:114,0 -DA:117,0 -DA:118,0 -DA:124,0 -DA:126,0 -DA:127,0 -DA:129,0 -DA:130,0 -DA:133,0 -DA:134,0 -DA:137,0 -DA:139,0 -DA:141,0 -DA:146,0 -DA:155,0 -DA:156,0 -DA:159,0 -DA:171,0 -DA:179,0 -DA:180,0 -DA:182,0 -DA:184,0 -DA:211,0 -DA:235,0 -DA:245,0 -DA:255,0 -DA:260,0 -DA:261,0 -DA:265,0 -DA:266,0 -DA:268,0 -DA:269,0 -DA:272,0 -DA:275,0 -DA:276,0 -DA:281,0 -DA:284,0 -DA:285,0 -DA:288,0 -DA:296,0 -DA:301,0 -DA:309,0 -DA:310,0 -DA:311,0 -DA:314,0 -DA:326,0 -LF:72 -LH:0 -BRDA:45,0,0,0 -BRDA:45,0,1,0 -BRDA:48,1,0,0 -BRDA:48,1,1,0 -BRDA:63,2,0,0 -BRDA:63,2,1,0 -BRDA:77,3,0,0 -BRDA:78,4,0,0 -BRDA:79,5,0,0 -BRDA:105,6,0,0 -BRDA:105,6,1,0 -BRDA:113,7,0,0 -BRDA:113,7,1,0 -BRDA:117,8,0,0 -BRDA:117,8,1,0 -BRDA:124,9,0,0 -BRDA:124,9,1,0 -BRDA:124,9,2,0 -BRDA:124,9,3,0 -BRDA:155,10,0,0 -BRDA:155,10,1,0 -BRDA:179,11,0,0 -BRDA:179,11,1,0 -BRDA:180,12,0,0 -BRDA:180,12,1,0 -BRDA:182,13,0,0 -BRDA:182,13,1,0 -BRDA:206,14,0,0 -BRDA:206,14,1,0 -BRDA:207,15,0,0 -BRDA:207,15,1,0 -BRDA:208,16,0,0 -BRDA:208,16,1,0 -BRDA:218,17,0,0 -BRDA:218,17,1,0 -BRDA:218,18,0,0 -BRDA:218,18,1,0 -BRDA:245,19,0,0 -BRDA:245,19,1,0 -BRDA:260,20,0,0 -BRDA:260,20,1,0 -BRDA:268,21,0,0 -BRDA:268,21,1,0 -BRDA:268,22,0,0 -BRDA:268,22,1,0 -BRDA:275,23,0,0 -BRDA:275,23,1,0 -BRDA:291,24,0,0 -BRDA:291,24,1,0 -BRDA:22,25,0,0 -BRDA:22,25,1,0 -BRDA:22,26,0,0 -BRDA:22,26,1,0 -BRDA:22,27,0,0 -BRDA:22,27,1,0 -BRDA:22,28,0,0 -BRDA:22,28,1,0 -BRDA:24,29,0,0 -BRDA:24,29,1,0 -BRDA:24,30,0,0 -BRDA:24,30,1,0 -BRF:61 -BRH:0 -end_of_record -TN: -SF:src\projects\services\analytics.service.ts -FN:13,(anonymous_4) -FN:22,(anonymous_5) -FN:85,(anonymous_6) -FN:118,(anonymous_7) -FN:160,(anonymous_8) -FN:168,(anonymous_9) -FN:200,(anonymous_10) -FN:211,(anonymous_11) -FN:284,(anonymous_12) -FN:296,(anonymous_13) -FN:319,(anonymous_14) -FN:365,(anonymous_15) -FNF:12 -FNH:0 -FNDA:0,(anonymous_4) -FNDA:0,(anonymous_5) -FNDA:0,(anonymous_6) -FNDA:0,(anonymous_7) -FNDA:0,(anonymous_8) -FNDA:0,(anonymous_9) -FNDA:0,(anonymous_10) -FNDA:0,(anonymous_11) -FNDA:0,(anonymous_12) -FNDA:0,(anonymous_13) -FNDA:0,(anonymous_14) -FNDA:0,(anonymous_15) -DA:1,0 -DA:2,0 -DA:3,0 -DA:4,0 -DA:5,0 -DA:6,0 -DA:10,0 -DA:11,0 -DA:15,0 -DA:17,0 -DA:19,0 -DA:28,0 -DA:33,0 -DA:34,0 -DA:38,0 -DA:39,0 -DA:41,0 -DA:42,0 -DA:45,0 -DA:48,0 -DA:49,0 -DA:52,0 -DA:55,0 -DA:58,0 -DA:61,0 -DA:63,0 -DA:86,0 -DA:108,0 -DA:126,0 -DA:128,0 -DA:129,0 -DA:131,0 -DA:132,0 -DA:135,0 -DA:136,0 -DA:139,0 -DA:160,0 -DA:169,0 -DA:189,0 -DA:200,0 -DA:220,0 -DA:222,0 -DA:223,0 -DA:224,0 -DA:226,0 -DA:227,0 -DA:228,0 -DA:231,0 -DA:232,0 -DA:233,0 -DA:236,0 -DA:261,0 -DA:263,0 -DA:264,0 -DA:265,0 -DA:267,0 -DA:268,0 -DA:269,0 -DA:272,0 -DA:281,0 -DA:285,0 -DA:287,0 -DA:288,0 -DA:291,0 -DA:296,0 -DA:299,0 -DA:318,0 -DA:320,0 -DA:336,0 -DA:352,0 -DA:365,0 -LF:71 -LH:0 -BRDA:33,0,0,0 -BRDA:33,0,1,0 -BRDA:41,1,0,0 -BRDA:41,1,1,0 -BRDA:41,2,0,0 -BRDA:41,2,1,0 -BRDA:45,3,0,0 -BRDA:45,4,0,0 -BRDA:48,5,0,0 -BRDA:48,5,1,0 -BRDA:49,6,0,0 -BRDA:49,6,1,0 -BRDA:109,7,0,0 -BRDA:109,7,1,0 -BRDA:110,8,0,0 -BRDA:110,8,1,0 -BRDA:111,9,0,0 -BRDA:111,9,1,0 -BRDA:112,10,0,0 -BRDA:112,10,1,0 -BRDA:113,11,0,0 -BRDA:113,11,1,0 -BRDA:114,12,0,0 -BRDA:114,12,1,0 -BRDA:126,13,0,0 -BRDA:126,13,1,0 -BRDA:126,13,2,0 -BRDA:126,13,3,0 -BRDA:201,14,0,0 -BRDA:201,14,1,0 -BRDA:202,15,0,0 -BRDA:202,15,1,0 -BRDA:203,16,0,0 -BRDA:203,16,1,0 -BRDA:204,17,0,0 -BRDA:204,17,1,0 -BRDA:220,18,0,0 -BRDA:220,18,1,0 -BRDA:220,18,2,0 -BRDA:220,18,3,0 -BRDA:268,19,0,0 -BRDA:268,19,1,0 -BRDA:268,20,0,0 -BRDA:268,20,1,0 -BRDA:277,21,0,0 -BRDA:277,21,1,0 -BRDA:285,22,0,0 -BRDA:287,23,0,0 -BRDA:287,23,1,0 -BRDA:288,24,0,0 -BRDA:288,24,1,0 -BRDA:342,25,0,0 -BRDA:342,25,1,0 -BRDA:343,26,0,0 -BRDA:343,26,1,0 -BRDA:344,27,0,0 -BRDA:344,27,1,0 -BRDA:359,28,0,0 -BRDA:359,28,1,0 -BRDA:360,29,0,0 -BRDA:360,29,1,0 -BRDA:361,30,0,0 -BRDA:361,30,1,0 -BRDA:362,31,0,0 -BRDA:362,31,1,0 -BRDA:15,32,0,0 -BRDA:15,32,1,0 -BRDA:15,33,0,0 -BRDA:15,33,1,0 -BRDA:15,34,0,0 -BRDA:15,34,1,0 -BRDA:15,35,0,0 -BRDA:15,35,1,0 -BRDA:17,36,0,0 -BRDA:17,36,1,0 -BRDA:17,37,0,0 -BRDA:17,37,1,0 -BRF:77 -BRH:0 -end_of_record -TN: -SF:src\projects\services\image-upload.service.ts -FN:10,(anonymous_4) -FN:18,(anonymous_5) -FN:62,(anonymous_6) -FN:91,(anonymous_7) -FNF:4 -FNH:0 -FNDA:0,(anonymous_4) -FNDA:0,(anonymous_5) -FNDA:0,(anonymous_6) -FNDA:0,(anonymous_7) -DA:1,0 -DA:2,0 -DA:3,0 -DA:4,0 -DA:5,0 -DA:6,0 -DA:9,0 -DA:12,0 -DA:14,0 -DA:15,0 -DA:24,0 -DA:29,0 -DA:30,0 -DA:34,0 -DA:35,0 -DA:37,0 -DA:38,0 -DA:41,0 -DA:43,0 -DA:44,0 -DA:45,0 -DA:47,0 -DA:56,0 -DA:59,0 -DA:67,0 -DA:72,0 -DA:73,0 -DA:77,0 -DA:78,0 -DA:80,0 -DA:81,0 -DA:85,0 -DA:88,0 -DA:92,0 -LF:34 -LH:0 -BRDA:29,0,0,0 -BRDA:29,0,1,0 -BRDA:37,1,0,0 -BRDA:37,1,1,0 -BRDA:37,2,0,0 -BRDA:37,2,1,0 -BRDA:72,3,0,0 -BRDA:72,3,1,0 -BRDA:80,4,0,0 -BRDA:80,4,1,0 -BRDA:80,5,0,0 -BRDA:80,5,1,0 -BRDA:12,6,0,0 -BRDA:12,6,1,0 -BRDA:12,7,0,0 -BRDA:12,7,1,0 -BRDA:12,8,0,0 -BRDA:12,8,1,0 -BRDA:12,9,0,0 -BRDA:12,9,1,0 -BRDA:14,10,0,0 -BRDA:14,10,1,0 -BRDA:14,11,0,0 -BRDA:14,11,1,0 -BRF:24 -BRH:0 -end_of_record -TN: -SF:src\projects\services\search.service.ts -FN:14,(anonymous_4) -FN:19,(anonymous_5) -FN:173,(anonymous_6) -FN:193,(anonymous_7) -FN:197,(anonymous_8) -FN:205,(anonymous_9) -FN:238,(anonymous_10) -FNF:7 -FNH:0 -FNDA:0,(anonymous_4) -FNDA:0,(anonymous_5) -FNDA:0,(anonymous_6) -FNDA:0,(anonymous_7) -FNDA:0,(anonymous_8) -FNDA:0,(anonymous_9) -FNDA:0,(anonymous_10) -DA:1,0 -DA:2,0 -DA:3,0 -DA:4,0 -DA:5,0 -DA:6,0 -DA:7,0 -DA:11,0 -DA:12,0 -DA:16,0 -DA:37,0 -DA:39,0 -DA:62,0 -DA:63,0 -DA:66,0 -DA:67,0 -DA:68,0 -DA:69,0 -DA:70,0 -DA:71,0 -DA:73,0 -DA:74,0 -DA:78,0 -DA:79,0 -DA:80,0 -DA:81,0 -DA:82,0 -DA:83,0 -DA:87,0 -DA:88,0 -DA:89,0 -DA:91,0 -DA:92,0 -DA:93,0 -DA:97,0 -DA:98,0 -DA:99,0 -DA:101,0 -DA:102,0 -DA:103,0 -DA:107,0 -DA:108,0 -DA:111,0 -DA:114,0 -DA:117,0 -DA:132,0 -DA:133,0 -DA:134,0 -DA:138,0 -DA:139,0 -DA:143,0 -DA:144,0 -DA:147,0 -DA:149,0 -DA:150,0 -DA:152,0 -DA:153,0 -DA:156,0 -DA:157,0 -DA:161,0 -DA:162,0 -DA:165,0 -DA:166,0 -DA:167,0 -DA:170,0 -DA:174,0 -DA:177,0 -DA:193,0 -DA:196,0 -DA:197,0 -DA:198,0 -DA:200,0 -DA:202,0 -DA:212,0 -DA:225,0 -DA:232,0 -DA:233,0 -DA:234,0 -DA:235,0 -DA:236,0 -DA:238,0 -DA:239,0 -DA:240,0 -DA:242,0 -DA:243,0 -DA:245,0 -DA:246,0 -DA:247,0 -DA:248,0 -DA:252,0 -LF:90 -LH:0 -BRDA:30,0,0,0 -BRDA:31,1,0,0 -BRDA:32,2,0,0 -BRDA:66,3,0,0 -BRDA:66,3,1,0 -BRDA:66,4,0,0 -BRDA:66,4,1,0 -BRDA:69,5,0,0 -BRDA:69,5,1,0 -BRDA:78,6,0,0 -BRDA:78,6,1,0 -BRDA:78,7,0,0 -BRDA:78,7,1,0 -BRDA:81,8,0,0 -BRDA:81,8,1,0 -BRDA:87,9,0,0 -BRDA:87,9,1,0 -BRDA:91,10,0,0 -BRDA:91,10,1,0 -BRDA:97,11,0,0 -BRDA:97,11,1,0 -BRDA:101,12,0,0 -BRDA:101,12,1,0 -BRDA:107,13,0,0 -BRDA:107,13,1,0 -BRDA:107,14,0,0 -BRDA:107,14,1,0 -BRDA:138,15,0,0 -BRDA:138,15,1,0 -BRDA:143,16,0,0 -BRDA:143,16,1,0 -BRDA:143,17,0,0 -BRDA:143,17,1,0 -BRDA:147,18,0,0 -BRDA:147,18,1,0 -BRDA:147,18,2,0 -BRDA:147,18,3,0 -BRDA:166,19,0,0 -BRDA:166,19,1,0 -BRDA:166,20,0,0 -BRDA:166,20,1,0 -BRDA:242,21,0,0 -BRDA:242,21,1,0 -BRDA:243,22,0,0 -BRDA:243,22,1,0 -BRDA:245,23,0,0 -BRDA:245,23,1,0 -BRDA:256,24,0,0 -BRDA:256,24,1,0 -BRDA:257,25,0,0 -BRDA:257,25,1,0 -BRDA:16,26,0,0 -BRDA:16,26,1,0 -BRDA:16,27,0,0 -BRDA:16,27,1,0 -BRF:55 -BRH:0 -end_of_record -TN: -SF:src\types\multer.d.ts -FNF:0 -FNH:0 -LF:0 -LH:0 -BRF:0 -BRH:0 -end_of_record -TN: -SF:src\users\admin-users.controller.ts -FN:33,(anonymous_4) -FN:41,(anonymous_5) -FN:57,(anonymous_6) -FN:67,(anonymous_7) -FN:77,(anonymous_8) -FNF:5 -FNH:0 -FNDA:0,(anonymous_4) -FNDA:0,(anonymous_5) -FNDA:0,(anonymous_6) -FNDA:0,(anonymous_7) -FNDA:0,(anonymous_8) -DA:1,0 -DA:13,0 -DA:20,0 -DA:21,0 -DA:22,0 -DA:23,0 -DA:24,0 -DA:25,0 -DA:32,0 -DA:33,0 -DA:41,0 -DA:42,0 -DA:43,0 -DA:57,0 -DA:58,0 -DA:67,0 -DA:68,0 -DA:77,0 -DA:78,0 -LF:19 -LH:0 -BRDA:46,0,0,0 -BRDA:46,0,1,0 -BRDA:47,1,0,0 -BRDA:47,1,1,0 -BRDA:41,2,0,0 -BRDA:41,2,1,0 -BRDA:41,3,0,0 -BRDA:41,3,1,0 -BRDA:67,4,0,0 -BRDA:67,4,1,0 -BRDA:67,5,0,0 -BRDA:67,5,1,0 -BRDA:33,6,0,0 -BRDA:33,6,1,0 -BRDA:33,7,0,0 -BRDA:33,7,1,0 -BRF:16 -BRH:0 -end_of_record -TN: -SF:src\users\users.controller.ts -FN:38,(anonymous_4) -FN:49,(anonymous_5) -FN:60,(anonymous_6) -FN:75,(anonymous_7) -FN:89,(anonymous_8) -FN:99,(anonymous_9) -FN:110,(anonymous_10) -FN:125,(anonymous_11) -FNF:8 -FNH:0 -FNDA:0,(anonymous_4) -FNDA:0,(anonymous_5) -FNDA:0,(anonymous_6) -FNDA:0,(anonymous_7) -FNDA:0,(anonymous_8) -FNDA:0,(anonymous_9) -FNDA:0,(anonymous_10) -FNDA:0,(anonymous_11) -DA:1,0 -DA:14,0 -DA:15,0 -DA:22,0 -DA:23,0 -DA:24,0 -DA:25,0 -DA:26,0 -DA:27,0 -DA:28,0 -DA:30,0 -DA:31,0 -DA:32,0 -DA:33,0 -DA:37,0 -DA:39,0 -DA:40,0 -DA:49,0 -DA:50,0 -DA:60,0 -DA:64,0 -DA:75,0 -DA:79,0 -DA:80,0 -DA:89,0 -DA:90,0 -DA:99,0 -DA:100,0 -DA:110,0 -DA:111,0 -DA:112,0 -DA:125,0 -DA:131,0 -DA:132,0 -DA:134,0 -LF:35 -LH:0 -BRDA:131,0,0,0 -BRDA:131,0,1,0 -BRDA:62,1,0,0 -BRDA:62,1,1,0 -BRDA:62,2,0,0 -BRDA:62,2,1,0 -BRDA:77,3,0,0 -BRDA:77,3,1,0 -BRDA:77,4,0,0 -BRDA:77,4,1,0 -BRDA:89,5,0,0 -BRDA:89,5,1,0 -BRDA:89,6,0,0 -BRDA:89,6,1,0 -BRDA:99,7,0,0 -BRDA:99,7,1,0 -BRDA:99,8,0,0 -BRDA:99,8,1,0 -BRDA:110,9,0,0 -BRDA:110,9,1,0 -BRDA:110,10,0,0 -BRDA:110,10,1,0 -BRDA:128,11,0,0 -BRDA:128,11,1,0 -BRDA:128,12,0,0 -BRDA:128,12,1,0 -BRDA:39,13,0,0 -BRDA:39,13,1,0 -BRDA:39,14,0,0 -BRDA:39,14,1,0 -BRDA:39,15,0,0 -BRDA:39,15,1,0 -BRDA:39,16,0,0 -BRDA:39,16,1,0 -BRF:34 -BRH:0 -end_of_record -TN: -SF:src\users\users.module.ts -FNF:0 -FNH:0 -DA:1,0 -DA:2,0 -DA:3,0 -DA:4,0 -DA:5,0 -DA:6,0 -DA:7,0 -DA:8,0 -DA:16,0 -LF:9 -LH:0 -BRF:0 -BRH:0 -end_of_record -TN: -SF:src\users\dto\admin-get-users-query.dto.ts -FN:44,(anonymous_2) -FN:57,(anonymous_3) -FNF:2 -FNH:0 -FNDA:0,(anonymous_2) -FNDA:0,(anonymous_3) -DA:1,0 -DA:2,0 -DA:3,0 -DA:4,0 -DA:5,0 -DA:7,0 -DA:15,0 -DA:25,0 -DA:34,0 -DA:44,0 -DA:48,0 -DA:57,0 -DA:60,0 -LF:13 -LH:0 -BRDA:15,0,0,0 -BRDA:15,0,1,0 -BRDA:15,1,0,0 -BRDA:15,1,1,0 -BRDA:25,2,0,0 -BRDA:25,2,1,0 -BRDA:25,3,0,0 -BRDA:25,3,1,0 -BRF:8 -BRH:0 -end_of_record -TN: -SF:src\users\dto\change-password.dto.ts -FNF:0 -FNH:0 -DA:1,0 -DA:2,0 -DA:4,0 -DA:11,0 -DA:29,0 -LF:5 -LH:0 -BRF:0 -BRH:0 -end_of_record -TN: -SF:src\users\dto\forgot-password.dto.ts -FNF:0 -FNH:0 -DA:1,0 -DA:2,0 -DA:4,0 -DA:12,0 -LF:4 -LH:0 -BRF:0 -BRH:0 -end_of_record -TN: -SF:src\users\dto\profile-response.dto.ts -FNF:0 -FNH:0 -DA:1,0 -DA:2,0 -DA:3,0 -DA:5,0 -DA:10,0 -DA:16,0 -DA:19,0 -DA:22,0 -DA:29,0 -DA:36,0 -DA:43,0 -DA:50,0 -DA:57,0 -DA:60,0 -DA:67,0 -DA:74,0 -DA:81,0 -DA:87,0 -DA:90,0 -DA:98,0 -LF:20 -LH:0 -BRDA:29,0,0,0 -BRDA:29,0,1,0 -BRDA:29,1,0,0 -BRDA:29,1,1,0 -BRDA:67,2,0,0 -BRDA:67,2,1,0 -BRDA:67,3,0,0 -BRDA:67,3,1,0 -BRDA:87,4,0,0 -BRDA:87,4,1,0 -BRDA:87,5,0,0 -BRDA:87,5,1,0 -BRDA:90,6,0,0 -BRDA:90,6,1,0 -BRDA:90,7,0,0 -BRDA:90,7,1,0 -BRF:16 -BRH:0 -end_of_record -TN: -SF:src\users\dto\reset-password.dto.ts -FNF:0 -FNH:0 -DA:1,0 -DA:2,0 -DA:4,0 -DA:11,0 -DA:23,0 -LF:5 -LH:0 -BRF:0 -BRH:0 -end_of_record -TN: -SF:src\users\dto\submit-kyc.dto.ts -FNF:0 -FNH:0 -DA:1,0 -DA:2,0 -DA:4,0 -DA:12,0 -LF:4 -LH:0 -BRF:0 -BRH:0 -end_of_record -TN: -SF:src\users\dto\update-kyc.dto.ts -FNF:0 -FNH:0 -DA:1,0 -DA:2,0 -DA:3,0 -DA:5,0 -DA:13,0 -DA:21,0 -LF:6 -LH:0 -BRDA:13,0,0,0 -BRDA:13,0,1,0 -BRDA:13,1,0,0 -BRDA:13,1,1,0 -BRF:4 -BRH:0 -end_of_record -TN: -SF:src\users\dto\update-user-role.dto.ts -FNF:0 -FNH:0 -DA:1,0 -DA:2,0 -DA:3,0 -DA:5,0 -DA:12,0 -LF:5 -LH:0 -BRDA:12,0,0,0 -BRDA:12,0,1,0 -BRDA:12,1,0,0 -BRDA:12,1,1,0 -BRF:4 -BRH:0 -end_of_record -TN: -SF:src\users\dto\update-user.dto.ts -FNF:0 -FNH:0 -DA:1,0 -DA:8,0 -DA:10,0 -DA:19,0 -DA:29,0 -DA:39,0 -DA:49,0 -DA:58,0 -DA:70,0 -LF:9 -LH:0 -BRF:0 -BRH:0 -end_of_record -TN: -SF:src\users\entities\user.entity.ts -FNF:0 -FNH:0 -DA:1,1 -DA:2,1 -DA:3,1 -DA:16,1 -DA:18,1 -DA:21,1 -DA:24,1 -DA:27,1 -DA:30,1 -DA:33,1 -DA:36,1 -DA:39,1 -DA:42,1 -DA:49,1 -DA:52,1 -DA:55,1 -DA:58,1 -DA:61,1 -DA:64,1 -DA:67,1 -DA:70,1 -DA:77,1 -DA:80,1 -DA:83,1 -DA:86,1 -DA:89,1 -DA:92,1 -DA:95,1 -DA:98,1 -LF:29 -LH:29 -BRDA:49,0,0,0 -BRDA:49,0,1,1 -BRDA:49,1,0,1 -BRDA:49,1,1,1 -BRDA:77,2,0,0 -BRDA:77,2,1,1 -BRDA:77,3,0,1 -BRDA:77,3,1,1 -BRDA:92,4,0,1 -BRDA:92,4,1,0 -BRDA:92,5,0,1 -BRDA:92,5,1,1 -BRDA:95,6,0,1 -BRDA:95,6,1,0 -BRDA:95,7,0,1 -BRDA:95,7,1,1 -BRF:16 -BRH:12 -end_of_record -TN: -SF:src\users\providers\users.service.ts -FN:17,(anonymous_4) -FN:22,(anonymous_5) -FN:44,(anonymous_6) -FN:53,(anonymous_7) -FN:58,(anonymous_8) -FN:68,(anonymous_9) -FN:96,(anonymous_10) -FN:135,(anonymous_11) -FN:168,(anonymous_12) -FN:174,(anonymous_13) -FN:180,(anonymous_14) -FN:188,(anonymous_15) -FNF:12 -FNH:0 -FNDA:0,(anonymous_4) -FNDA:0,(anonymous_5) -FNDA:0,(anonymous_6) -FNDA:0,(anonymous_7) -FNDA:0,(anonymous_8) -FNDA:0,(anonymous_9) -FNDA:0,(anonymous_10) -FNDA:0,(anonymous_11) -FNDA:0,(anonymous_12) -FNDA:0,(anonymous_13) -FNDA:0,(anonymous_14) -FNDA:0,(anonymous_15) -DA:1,0 -DA:6,0 -DA:7,0 -DA:8,0 -DA:11,0 -DA:16,0 -DA:19,0 -DA:23,0 -DA:45,0 -DA:46,0 -DA:47,0 -DA:49,0 -DA:54,0 -DA:62,0 -DA:63,0 -DA:64,0 -DA:72,0 -DA:74,0 -DA:75,0 -DA:76,0 -DA:77,0 -DA:78,0 -DA:79,0 -DA:81,0 -DA:82,0 -DA:84,0 -DA:85,0 -DA:89,0 -DA:92,0 -DA:97,0 -DA:101,0 -DA:109,0 -DA:110,0 -DA:114,0 -DA:136,0 -DA:140,0 -DA:141,0 -DA:144,0 -DA:145,0 -DA:150,0 -DA:151,0 -DA:152,0 -DA:153,0 -DA:155,0 -DA:161,0 -DA:165,0 -DA:167,0 -DA:168,0 -DA:175,0 -DA:176,0 -DA:181,0 -DA:182,0 -DA:183,0 -DA:184,0 -DA:189,0 -DA:190,0 -DA:191,0 -LF:57 -LH:0 -BRDA:46,0,0,0 -BRDA:46,0,1,0 -BRDA:74,1,0,0 -BRDA:74,1,1,0 -BRDA:75,2,0,0 -BRDA:75,2,1,0 -BRDA:76,3,0,0 -BRDA:76,3,1,0 -BRDA:77,4,0,0 -BRDA:77,4,1,0 -BRDA:78,5,0,0 -BRDA:78,5,1,0 -BRDA:79,6,0,0 -BRDA:79,6,1,0 -BRDA:84,7,0,0 -BRDA:84,7,1,0 -BRDA:140,8,0,0 -BRDA:140,8,1,0 -BRDA:144,9,0,0 -BRDA:144,9,1,0 -BRDA:150,10,0,0 -BRDA:150,10,1,0 -BRDA:162,11,0,0 -BRDA:162,11,1,0 -BRDA:163,12,0,0 -BRDA:163,12,1,0 -BRDA:19,13,0,0 -BRDA:19,13,1,0 -BRDA:19,14,0,0 -BRDA:19,14,1,0 -BRF:30 -BRH:0 -end_of_record diff --git a/src/app.module.ts b/src/app.module.ts index fa5429b..43cadec 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -10,6 +10,7 @@ import { LoggerModule } from './logger/logger.module'; import { ProjectsModule } from './projects/projects.module'; import { MailModule } from './mail/mail.module'; import { DonationsModule } from './donations/donations.module'; +import { WithdrawalsModule } from './withdrawals/withdrawals.module'; @Module({ imports: [ @@ -26,6 +27,7 @@ import { DonationsModule } from './donations/donations.module'; UsersModule, ProjectsModule, DonationsModule, + WithdrawalsModule, ], controllers: [AppController], providers: [AppService], diff --git a/src/common/enums/withdrawal-status.enum.ts b/src/common/enums/withdrawal-status.enum.ts new file mode 100644 index 0000000..243cc5f --- /dev/null +++ b/src/common/enums/withdrawal-status.enum.ts @@ -0,0 +1,6 @@ +export enum WithdrawalStatus { + PENDING = 'pending', + APPROVED = 'approved', + REJECTED = 'rejected', + PAID = 'paid', +} diff --git a/src/common/services/stellar-blockchain.service.ts b/src/common/services/stellar-blockchain.service.ts index fdd5641..8301fde 100644 --- a/src/common/services/stellar-blockchain.service.ts +++ b/src/common/services/stellar-blockchain.service.ts @@ -2,7 +2,10 @@ import { Injectable, Logger, BadRequestException } from '@nestjs/common'; import { ConfigService } from '@nestjs/config'; // Cache for verification results -const verificationCache = new Map(); +const verificationCache = new Map< + string, + { result: TransactionVerificationResult; timestamp: number } +>(); const CACHE_TTL_MS = 5 * 60 * 1000; // 5 minutes // Supported asset types @@ -48,12 +51,20 @@ export class StellarBlockchainService { 'STELLAR_HORIZON_URL', 'https://horizon-testnet.stellar.org', ); - this.stellarNetwork = this.configService.get('STELLAR_NETWORK', 'TESTNET'); + this.stellarNetwork = this.configService.get( + 'STELLAR_NETWORK', + 'TESTNET', + ); // Load platform distributing addresses from config - const platformAddresses = this.configService.get('STELLAR_PLATFORM_ADDRESSES', ''); + const platformAddresses = this.configService.get( + 'STELLAR_PLATFORM_ADDRESSES', + '', + ); if (platformAddresses) { - platformAddresses.split(',').forEach((addr) => PLATFORM_DISTRIBUTING_ADDRESSES.add(addr.trim())); + platformAddresses + .split(',') + .forEach((addr) => PLATFORM_DISTRIBUTING_ADDRESSES.add(addr.trim())); } this.logger.log(`Initialized with Horizon URL: ${this.horizonUrl}`); @@ -76,7 +87,9 @@ export class StellarBlockchainService { // Check cache first const cachedResult = this.getCachedResult(transactionHash); if (cachedResult) { - this.logger.log(`Using cached verification for transaction ${transactionHash}`); + this.logger.log( + `Using cached verification for transaction ${transactionHash}`, + ); return cachedResult; } @@ -101,7 +114,9 @@ export class StellarBlockchainService { if (!response.ok) { if (response.status === 404) { - this.logger.warn(`Transaction ${transactionHash} not found on blockchain`); + this.logger.warn( + `Transaction ${transactionHash} not found on blockchain`, + ); return { isValid: false, error: 'Transaction not found on the Stellar blockchain', @@ -121,7 +136,9 @@ export class StellarBlockchainService { // Verify transaction has successful result if (!this.isSuccessfulTransaction(transaction)) { - this.logger.warn(`Transaction ${transactionHash} did not execute successfully`); + this.logger.warn( + `Transaction ${transactionHash} did not execute successfully`, + ); return { isValid: false, error: 'Transaction did not execute successfully on the blockchain', @@ -129,7 +146,8 @@ export class StellarBlockchainService { } // Parse transaction operations for detailed verification - const parsedDetails = await this.parseTransactionOperations(transactionHash); + const parsedDetails = + await this.parseTransactionOperations(transactionHash); if (!parsedDetails) { return { isValid: false, @@ -141,9 +159,11 @@ export class StellarBlockchainService { if (expectedAsset && parsedDetails.asset) { const normalizedExpected = expectedAsset.toUpperCase(); const normalizedActual = parsedDetails.asset.toUpperCase(); - + if (normalizedExpected !== normalizedActual) { - this.logger.warn(`Asset mismatch: expected ${normalizedExpected}, got ${normalizedActual}`); + this.logger.warn( + `Asset mismatch: expected ${normalizedExpected}, got ${normalizedActual}`, + ); return { isValid: false, error: `Asset type mismatch: expected ${normalizedExpected}, got ${normalizedActual}`, @@ -155,9 +175,11 @@ export class StellarBlockchainService { if (expectedAmount !== undefined && parsedDetails.amount !== undefined) { const tolerance = 0.000001; // Allow for floating point precision const amountDiff = Math.abs(parsedDetails.amount - expectedAmount); - + if (amountDiff > tolerance) { - this.logger.warn(`Amount mismatch: expected ${expectedAmount}, got ${parsedDetails.amount}`); + this.logger.warn( + `Amount mismatch: expected ${expectedAmount}, got ${parsedDetails.amount}`, + ); return { isValid: false, error: `Amount mismatch: expected ${expectedAmount}, got ${parsedDetails.amount}`, @@ -167,8 +189,13 @@ export class StellarBlockchainService { // Validate destination if expected if (expectedDestination && parsedDetails.destinationAccount) { - if (expectedDestination.toLowerCase() !== parsedDetails.destinationAccount.toLowerCase()) { - this.logger.warn(`Destination mismatch: expected ${expectedDestination}, got ${parsedDetails.destinationAccount}`); + if ( + expectedDestination.toLowerCase() !== + parsedDetails.destinationAccount.toLowerCase() + ) { + this.logger.warn( + `Destination mismatch: expected ${expectedDestination}, got ${parsedDetails.destinationAccount}`, + ); return { isValid: false, error: `Destination address mismatch`, @@ -204,9 +231,7 @@ export class StellarBlockchainService { /** * Parse transaction operations to extract payment details */ - private async parseTransactionOperations( - transactionHash: string, - ): Promise<{ + private async parseTransactionOperations(transactionHash: string): Promise<{ amount?: number; asset?: string; sourceAccount?: string; @@ -272,12 +297,15 @@ export class StellarBlockchainService { destinationAddress: string, ): Promise { const result = await this.verifyTransaction(transactionHash); - + if (!result.isValid) { return result; } - if (result.destinationAccount?.toLowerCase() !== destinationAddress.toLowerCase()) { + if ( + result.destinationAccount?.toLowerCase() !== + destinationAddress.toLowerCase() + ) { return { isValid: false, error: `Transaction is not directed to the expected destination`, @@ -298,9 +326,11 @@ export class StellarBlockchainService { /** * Get cached verification result if available and not expired */ - private getCachedResult(transactionHash: string): TransactionVerificationResult | null { + private getCachedResult( + transactionHash: string, + ): TransactionVerificationResult | null { const cached = verificationCache.get(transactionHash); - + if (cached) { const now = Date.now(); if (now - cached.timestamp < CACHE_TTL_MS) { @@ -309,14 +339,17 @@ export class StellarBlockchainService { // Remove expired cache entry verificationCache.delete(transactionHash); } - + return null; } /** * Cache verification result */ - private cacheResult(transactionHash: string, result: TransactionVerificationResult): void { + private cacheResult( + transactionHash: string, + result: TransactionVerificationResult, + ): void { verificationCache.set(transactionHash, { result, timestamp: Date.now(), @@ -360,7 +393,9 @@ export class StellarBlockchainService { * @param transactionHash - The transaction hash to retrieve * @returns Promise resolving to transaction details or null if not found */ - async getTransactionDetails(transactionHash: string): Promise { + async getTransactionDetails( + transactionHash: string, + ): Promise { try { if (!this.isValidTransactionHash(transactionHash)) { return null; diff --git a/src/common/services/webhook-signature.service.ts b/src/common/services/webhook-signature.service.ts index ab84b95..2751dbb 100644 --- a/src/common/services/webhook-signature.service.ts +++ b/src/common/services/webhook-signature.service.ts @@ -11,9 +11,11 @@ export class WebhookSignatureService { constructor(private configService: ConfigService) { this.webhookSecret = this.configService.get('WEBHOOK_SECRET', ''); - + if (!this.webhookSecret) { - this.logger.warn('WEBHOOK_SECRET is not configured. Webhook signature validation will be skipped.'); + this.logger.warn( + 'WEBHOOK_SECRET is not configured. Webhook signature validation will be skipped.', + ); } } @@ -28,7 +30,9 @@ export class WebhookSignatureService { ): boolean { // If no webhook secret configured, skip validation (development mode) if (!this.webhookSecret) { - this.logger.debug('Webhook signature validation skipped - no secret configured'); + this.logger.debug( + 'Webhook signature validation skipped - no secret configured', + ); return true; } @@ -42,8 +46,9 @@ export class WebhookSignatureService { const now = Math.floor(Date.now() / 1000); const webhookTimestamp = parseInt(timestamp, 10); const timeDiff = Math.abs(now - webhookTimestamp); - - if (timeDiff > 300) { // 5 minutes + + if (timeDiff > 300) { + // 5 minutes this.logger.warn(`Webhook timestamp too old: ${timeDiff} seconds ago`); return false; } @@ -92,7 +97,7 @@ export class WebhookSignatureService { generateSignature(payload: string, timestamp?: number): string { const ts = timestamp || Math.floor(Date.now() / 1000); const signedPayload = `${ts}.${payload}`; - + return crypto .createHmac('sha256', this.webhookSecret) .update(signedPayload) diff --git a/src/database/migrations/1743072000000-CreateWithdrawalsTable.ts b/src/database/migrations/1743072000000-CreateWithdrawalsTable.ts new file mode 100644 index 0000000..f102530 --- /dev/null +++ b/src/database/migrations/1743072000000-CreateWithdrawalsTable.ts @@ -0,0 +1,132 @@ +import { + MigrationInterface, + QueryRunner, + Table, + TableForeignKey, + TableIndex, +} from 'typeorm'; + +export class CreateWithdrawalsTable1743072000000 implements MigrationInterface { + public async up(queryRunner: QueryRunner): Promise { + // Create enum type for withdrawal status + await queryRunner.query( + `CREATE TYPE "withdrawal_status_enum" AS ENUM ('pending', 'approved', 'rejected', 'paid')`, + ); + + await queryRunner.createTable( + new Table({ + name: 'withdrawals', + columns: [ + { + name: 'id', + type: 'uuid', + isPrimary: true, + generationStrategy: 'uuid', + default: 'uuid_generate_v4()', + }, + { + name: 'projectId', + type: 'uuid', + }, + { + name: 'amount', + type: 'decimal', + precision: 18, + scale: 7, + }, + { + name: 'status', + type: 'enum', + enum: ['pending', 'approved', 'rejected', 'paid'], + enumName: 'withdrawal_status_enum', + default: "'pending'", + }, + { + name: 'transactionHash', + type: 'varchar', + isNullable: true, + }, + { + name: 'rejectionReason', + type: 'text', + isNullable: true, + }, + { + name: 'createdAt', + type: 'timestamp', + default: 'CURRENT_TIMESTAMP', + }, + { + name: 'updatedAt', + type: 'timestamp', + default: 'CURRENT_TIMESTAMP', + }, + ], + }), + true, + ); + + // Create indexes + await queryRunner.createIndex( + 'withdrawals', + new TableIndex({ + name: 'IDX_withdrawals_project_id', + columnNames: ['projectId'], + }), + ); + + await queryRunner.createIndex( + 'withdrawals', + new TableIndex({ + name: 'IDX_withdrawals_status', + columnNames: ['status'], + }), + ); + + // Create foreign key + await queryRunner.createForeignKey( + 'withdrawals', + new TableForeignKey({ + name: 'FK_withdrawals_project', + columnNames: ['projectId'], + referencedTableName: 'projects', + referencedColumnNames: ['id'], + onDelete: 'CASCADE', + }), + ); + } + + public async down(queryRunner: QueryRunner): Promise { + const table = await queryRunner.getTable('withdrawals'); + + if (table) { + // Drop foreign key + const projectForeignKey = table.foreignKeys.find( + (fk) => fk.name === 'FK_withdrawals_project', + ); + if (projectForeignKey) { + await queryRunner.dropForeignKey('withdrawals', projectForeignKey); + } + + // Drop indexes + const projectIdIndex = table.indices.find( + (idx) => idx.name === 'IDX_withdrawals_project_id', + ); + if (projectIdIndex) { + await queryRunner.dropIndex('withdrawals', projectIdIndex); + } + + const statusIndex = table.indices.find( + (idx) => idx.name === 'IDX_withdrawals_status', + ); + if (statusIndex) { + await queryRunner.dropIndex('withdrawals', statusIndex); + } + } + + await queryRunner.dropTable('withdrawals'); + + // Drop enum type + await queryRunner.query(`DROP TYPE "withdrawal_status_enum"`); + } +} diff --git a/src/donations/donations.controller.ts b/src/donations/donations.controller.ts index 992e776..ad00822 100644 --- a/src/donations/donations.controller.ts +++ b/src/donations/donations.controller.ts @@ -45,12 +45,28 @@ export class DonationsController { @UseGuards(JwtAuthGuard) @ApiBearerAuth() @HttpCode(HttpStatus.CREATED) - @ApiOperation({ summary: 'Create a new donation with Stellar blockchain verification' }) - @ApiResponse({ status: 201, type: DonationResponseDto, description: 'Donation created successfully' }) - @ApiResponse({ status: 400, description: 'Bad request - Invalid data or transaction verification failed' }) + @ApiOperation({ + summary: 'Create a new donation with Stellar blockchain verification', + }) + @ApiResponse({ + status: 201, + type: DonationResponseDto, + description: 'Donation created successfully', + }) + @ApiResponse({ + status: 400, + description: + 'Bad request - Invalid data or transaction verification failed', + }) @ApiResponse({ status: 404, description: 'Project not found' }) - @ApiResponse({ status: 409, description: 'Conflict - Transaction hash already exists' }) - @ApiResponse({ status: 401, description: 'Unauthorized - JWT token missing or invalid' }) + @ApiResponse({ + status: 409, + description: 'Conflict - Transaction hash already exists', + }) + @ApiResponse({ + status: 401, + description: 'Unauthorized - JWT token missing or invalid', + }) async create( @Body() createDonationDto: CreateDonationDto, @CurrentUser('sub') userId: string, @@ -66,10 +82,7 @@ export class DonationsController { @ApiResponse({ status: 200, description: 'List of donations' }) @ApiQuery({ name: 'page', required: false, type: Number, example: 1 }) @ApiQuery({ name: 'limit', required: false, type: Number, example: 10 }) - findAll( - @Query('page') page: number = 1, - @Query('limit') limit: number = 10, - ) { + findAll(@Query('page') page: number = 1, @Query('limit') limit: number = 10) { return this.donationsService.findAll(page, limit); } @@ -160,34 +173,50 @@ export class DonationsController { @Post('webhook') @Public() @HttpCode(HttpStatus.OK) - @ApiOperation({ summary: 'Webhook endpoint for real-time donation notifications' }) - @ApiResponse({ status: 200, type: WebhookResponseDto, description: 'Webhook processed successfully' }) - @ApiResponse({ status: 400, description: 'Bad request - Invalid payload or signature' }) - @ApiResponse({ status: 401, description: 'Unauthorized - Invalid webhook signature' }) + @ApiOperation({ + summary: 'Webhook endpoint for real-time donation notifications', + }) + @ApiResponse({ + status: 200, + type: WebhookResponseDto, + description: 'Webhook processed successfully', + }) + @ApiResponse({ + status: 400, + description: 'Bad request - Invalid payload or signature', + }) + @ApiResponse({ + status: 401, + description: 'Unauthorized - Invalid webhook signature', + }) async handleWebhook( @Body() webhookDto: WebhookDonationDto, @Headers() headers: Record, @Req() req: ExpressRequest, ): Promise { // Get raw body for signature validation - const rawBody = (req as any).rawBody as string || JSON.stringify(webhookDto); - + const rawBody = + ((req as any).rawBody as string) || JSON.stringify(webhookDto); + // Extract signature and timestamp from headers - const { signature, timestamp } = this.webhookSignatureService.extractHeaders(headers); - + const { signature, timestamp } = + this.webhookSignatureService.extractHeaders(headers); + // Validate webhook signature const isValidSignature = this.webhookSignatureService.validateSignature( rawBody, signature, timestamp, ); - + if (!isValidSignature) { - throw new HttpException('Invalid webhook signature', HttpStatus.UNAUTHORIZED); + throw new HttpException( + 'Invalid webhook signature', + HttpStatus.UNAUTHORIZED, + ); } - + // Process the webhook donation return this.donationsService.processWebhookDonation(webhookDto); } } - diff --git a/src/donations/donations.module.ts b/src/donations/donations.module.ts index d82b762..0c87ce7 100644 --- a/src/donations/donations.module.ts +++ b/src/donations/donations.module.ts @@ -16,7 +16,13 @@ import { WebhookSignatureService } from '../common/services/webhook-signature.se TypeOrmModule.forFeature([Donation, Project, User, ProjectHistory]), ], controllers: [DonationsController], - providers: [DonationsService, StellarBlockchainService, ProjectsService, MailService, WebhookSignatureService], + providers: [ + DonationsService, + StellarBlockchainService, + ProjectsService, + MailService, + WebhookSignatureService, + ], exports: [DonationsService, TypeOrmModule], }) export class DonationsModule {} diff --git a/src/donations/dto/create-donation.dto.ts b/src/donations/dto/create-donation.dto.ts index 364def1..db0a33a 100644 --- a/src/donations/dto/create-donation.dto.ts +++ b/src/donations/dto/create-donation.dto.ts @@ -1,4 +1,11 @@ -import { IsNotEmpty, IsNumber, IsString, IsOptional, Min, Matches } from 'class-validator'; +import { + IsNotEmpty, + IsNumber, + IsString, + IsOptional, + Min, + Matches, +} from 'class-validator'; import { ApiProperty } from '@nestjs/swagger'; export class CreateDonationDto { @@ -25,11 +32,15 @@ export class CreateDonationDto { @IsString() assetType?: string; - @ApiProperty({ example: 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855', description: 'Stellar blockchain transaction hash (64 hex characters)' }) + @ApiProperty({ + example: 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855', + description: 'Stellar blockchain transaction hash (64 hex characters)', + }) @IsNotEmpty() @IsString() @Matches(/^[a-f0-9]{64}$/, { - message: 'Transaction hash must be a valid Stellar transaction hash (64 hexadecimal characters)', + message: + 'Transaction hash must be a valid Stellar transaction hash (64 hexadecimal characters)', }) transactionHash: string; diff --git a/src/donations/dto/webhook.dto.ts b/src/donations/dto/webhook.dto.ts index 633067b..9669677 100644 --- a/src/donations/dto/webhook.dto.ts +++ b/src/donations/dto/webhook.dto.ts @@ -1,4 +1,12 @@ -import { IsNotEmpty, IsNumber, IsString, IsOptional, IsEnum, IsDateString, Min } from 'class-validator'; +import { + IsNotEmpty, + IsNumber, + IsString, + IsOptional, + IsEnum, + IsDateString, + Min, +} from 'class-validator'; import { ApiProperty } from '@nestjs/swagger'; /** @@ -100,10 +108,16 @@ export class WebhookDonationDto { * Response for webhook endpoint */ export class WebhookResponseDto { - @ApiProperty({ example: true, description: 'Whether the webhook was processed successfully' }) + @ApiProperty({ + example: true, + description: 'Whether the webhook was processed successfully', + }) success: boolean; - @ApiProperty({ example: 'Donation processed successfully', description: 'Message describing the result' }) + @ApiProperty({ + example: 'Donation processed successfully', + description: 'Message describing the result', + }) message: string; @ApiProperty({ diff --git a/src/donations/entities/donation.entity.ts b/src/donations/entities/donation.entity.ts index c4a7bcf..6584ecf 100644 --- a/src/donations/entities/donation.entity.ts +++ b/src/donations/entities/donation.entity.ts @@ -28,7 +28,7 @@ export class Donation { @JoinColumn({ name: 'projectId' }) project: Project; - @Column({ nullable: true }) + @Column({ nullable: true, type: 'uuid' }) donorId: string | null; @ManyToOne(() => User, { nullable: true, eager: false, onDelete: 'SET NULL' }) @@ -41,7 +41,7 @@ export class Donation { @Column({ default: 'XLM' }) assetType: string; - @Column({ nullable: true, unique: true }) + @Column({ nullable: true, unique: true, type: 'varchar' }) transactionHash: string | null; @Column({ default: false }) diff --git a/src/donations/providers/donations.service.ts b/src/donations/providers/donations.service.ts index 6130d80..6bf9273 100644 --- a/src/donations/providers/donations.service.ts +++ b/src/donations/providers/donations.service.ts @@ -28,7 +28,10 @@ import { StellarBlockchainService } from '../../common/services/stellar-blockcha import { MailService } from '../../mail/mail.service'; // In-memory store for webhook deduplication (in production, use Redis) -const processedWebhooks = new Map(); +const processedWebhooks = new Map< + string, + { donationId: string; processedAt: Date } +>(); const WEBHOOK_DEDUP_TTL_MS = 24 * 60 * 60 * 1000; // 24 hours @Injectable() @@ -45,8 +48,17 @@ export class DonationsService { private mailService: MailService, ) {} - async create(createDonationDto: CreateDonationDto, donorId?: string): Promise { - const { projectId, transactionHash, amount, assetType = 'XLM', isAnonymous = false } = createDonationDto; + async create( + createDonationDto: CreateDonationDto, + donorId?: string, + ): Promise { + const { + projectId, + transactionHash, + amount, + assetType = 'XLM', + isAnonymous = false, + } = createDonationDto; try { // 1. Check if project exists @@ -64,11 +76,14 @@ export class DonationsService { }); if (existingDonation) { - throw new ConflictException('A donation with this transaction hash already exists'); + throw new ConflictException( + 'A donation with this transaction hash already exists', + ); } // 3. Verify transaction on Stellar blockchain - const verificationResult = await this.stellarBlockchainService.verifyTransaction(transactionHash); + const verificationResult = + await this.stellarBlockchainService.verifyTransaction(transactionHash); if (!verificationResult.isValid) { throw new BadRequestException( @@ -92,7 +107,8 @@ export class DonationsService { await this.projectRepository.update( { id: projectId }, { - fundsRaised: () => `CAST(fundsRaised + ${Number(amount)} AS decimal(18,7))`, + fundsRaised: () => + `CAST(fundsRaised + ${Number(amount)} AS decimal(18,7))`, donationCount: () => 'donationCount + 1', }, ); @@ -119,7 +135,11 @@ export class DonationsService { // 7. Send confirmation email to donor (if not anonymous) if (!isAnonymous && donorId) { - this.sendDonationConfirmationEmail(donorId, savedDonation, project).catch((error) => { + this.sendDonationConfirmationEmail( + donorId, + savedDonation, + project, + ).catch((error) => { console.error('Error sending donation confirmation email:', error); // Don't throw - email failures shouldn't affect the donation success }); @@ -139,7 +159,9 @@ export class DonationsService { // Handle database-specific errors if (error.code === '23505') { // PostgreSQL unique violation - throw new ConflictException('A donation with this transaction hash already exists'); + throw new ConflictException( + 'A donation with this transaction hash already exists', + ); } if (error.code === '23503') { @@ -164,7 +186,9 @@ export class DonationsService { }); if (!donor || !donor.email) { - console.warn(`Unable to send confirmation email - donor ${donorId} not found or has no email`); + console.warn( + `Unable to send confirmation email - donor ${donorId} not found or has no email`, + ); return; } @@ -185,7 +209,10 @@ export class DonationsService { } } - async findAll(page: number = 1, limit: number = 10): Promise<{ data: DonationResponseDto[]; total: number }> { + async findAll( + page: number = 1, + limit: number = 10, + ): Promise<{ data: DonationResponseDto[]; total: number }> { const [data, total] = await this.donationsRepository.findAndCount({ relations: ['project', 'donor'], order: { createdAt: 'DESC' }, @@ -408,7 +435,11 @@ export class DonationsService { .getMany(); // Calculate summary statistics - const summary = await this.calculateUserDonationSummary(userId, startDate, endDate); + const summary = await this.calculateUserDonationSummary( + userId, + startDate, + endDate, + ); // Transform donations to DTOs const donationItems: UserDonationItemDto[] = donations.map((donation) => @@ -478,19 +509,26 @@ export class DonationsService { webhookDto: WebhookDonationDto, donorId?: string, ): Promise { - const { transactionHash, projectId, amount, assetType = 'XLM', isAnonymous = false, webhookId } = webhookDto; + const { + transactionHash, + projectId, + amount, + assetType = 'XLM', + isAnonymous = false, + webhookId, + } = webhookDto; try { // 1. Check for duplicate webhook using webhookId or transaction hash const dedupKey = webhookId || transactionHash; const existingWebhook = processedWebhooks.get(dedupKey); - + if (existingWebhook) { // Check if donation still exists const existingDonation = await this.donationsRepository.findOne({ where: { id: existingWebhook.donationId }, }); - + if (existingDonation) { this.logger.log(`Duplicate webhook detected: ${dedupKey}`); return { @@ -500,7 +538,7 @@ export class DonationsService { duplicate: true, }; } - + // Clean up stale entry processedWebhooks.delete(dedupKey); } @@ -525,7 +563,7 @@ export class DonationsService { donationId: existingDonation.id, processedAt: new Date(), }); - + return { success: true, message: 'Donation already exists with this transaction hash', @@ -535,11 +573,12 @@ export class DonationsService { } // 4. Verify transaction on Stellar blockchain with detailed validation - const verificationResult = await this.stellarBlockchainService.verifyTransaction( - transactionHash, - amount, - assetType, - ); + const verificationResult = + await this.stellarBlockchainService.verifyTransaction( + transactionHash, + amount, + assetType, + ); if (!verificationResult.isValid) { throw new BadRequestException( @@ -563,7 +602,8 @@ export class DonationsService { await this.projectRepository.update( { id: projectId }, { - fundsRaised: () => `CAST(fundsRaised + ${Number(amount)} AS decimal(18,7))`, + fundsRaised: () => + `CAST(fundsRaised + ${Number(amount)} AS decimal(18,7))`, donationCount: () => 'donationCount + 1', }, ); @@ -594,8 +634,15 @@ export class DonationsService { // 9. Send confirmation email to donor (if not anonymous and donorId available) if (!isAnonymous && donorId) { - this.sendDonationConfirmationEmail(donorId, savedDonation, project).catch((error) => { - this.logger.error('Error sending donation confirmation email:', error); + this.sendDonationConfirmationEmail( + donorId, + savedDonation, + project, + ).catch((error) => { + this.logger.error( + 'Error sending donation confirmation email:', + error, + ); }); } @@ -625,7 +672,7 @@ export class DonationsService { const existingDonation = await this.donationsRepository.findOne({ where: { transactionHash }, }); - + if (existingDonation) { // Use transactionHash as dedup key if webhookId not available const dedupKeyForCatch = webhookDto.webhookId || transactionHash; @@ -633,7 +680,7 @@ export class DonationsService { donationId: existingDonation.id, processedAt: new Date(), }); - + return { success: true, message: 'Donation already exists with this transaction hash', diff --git a/src/mail/mail.service.ts b/src/mail/mail.service.ts index dd58f58..6e8c82d 100644 --- a/src/mail/mail.service.ts +++ b/src/mail/mail.service.ts @@ -119,10 +119,16 @@ export class MailService { }, ): Promise { try { - const templatePath = path.join(this.templatesPath, 'donation-confirmation.ejs'); + const templatePath = path.join( + this.templatesPath, + 'donation-confirmation.ejs', + ); const template = fs.readFileSync(templatePath, 'utf-8'); - const frontendUrl = this.configService.get('FRONTEND_URL', 'http://localhost:3000'); + const frontendUrl = this.configService.get( + 'FRONTEND_URL', + 'http://localhost:3000', + ); const templateData = { firstName, appName: this.configService.get('APP_NAME', 'StellarAid'), diff --git a/src/projects/dto/update-project.dto.ts b/src/projects/dto/update-project.dto.ts index 9450fd9..31c0748 100644 --- a/src/projects/dto/update-project.dto.ts +++ b/src/projects/dto/update-project.dto.ts @@ -1,10 +1,4 @@ -import { - IsEnum, - IsOptional, - IsString, - IsUrl, - IsArray, -} from 'class-validator'; +import { IsEnum, IsOptional, IsString, IsUrl, IsArray } from 'class-validator'; import { ApiPropertyOptional } from '@nestjs/swagger'; import { ProjectCategory } from 'src/common/enums/project-category.enum'; diff --git a/src/projects/entities/project.entity.ts b/src/projects/entities/project.entity.ts index 9d81988..484db1c 100644 --- a/src/projects/entities/project.entity.ts +++ b/src/projects/entities/project.entity.ts @@ -15,6 +15,7 @@ import { ProjectImage } from './project-image.entity'; import { ProjectHistory } from './project-history.entity'; import { ProjectCategory } from 'src/common/enums/project-category.enum'; import { ProjectStatus } from 'src/common/enums/project-status.enum'; +import { Withdrawal } from '../../withdrawals/entities/withdrawal.entity'; @Entity('projects') @Index('IDX_projects_creator_id', ['creatorId']) @@ -31,7 +32,7 @@ export class Project { @Column({ type: 'text' }) description: string; - @Column({ nullable: true }) + @Column({ nullable: true, type: 'varchar' }) imageUrl: string | null; @Column({ @@ -85,6 +86,11 @@ export class Project { }) history: ProjectHistory[]; + @OneToMany(() => Withdrawal, (withdrawal) => withdrawal.project, { + cascade: true, + }) + withdrawals: Withdrawal[]; + @CreateDateColumn() createdAt: Date; diff --git a/src/projects/projects.controller.ts b/src/projects/projects.controller.ts index 87ddf88..9885e03 100644 --- a/src/projects/projects.controller.ts +++ b/src/projects/projects.controller.ts @@ -166,11 +166,17 @@ export class ProjectsController { @UseGuards(JwtAuthGuard, RolesGuard) @Roles(UserRole.CREATOR, UserRole.ADMIN) @HttpCode(HttpStatus.OK) - @ApiOperation({ summary: 'Update project details (CREATOR or ADMIN required)' }) + @ApiOperation({ + summary: 'Update project details (CREATOR or ADMIN required)', + }) @ApiOkResponse({ description: 'Project updated successfully' }) - @ApiBadRequestResponse({ description: 'Invalid input data or cannot update completed project' }) + @ApiBadRequestResponse({ + description: 'Invalid input data or cannot update completed project', + }) @ApiNotFoundResponse({ description: 'Project not found' }) - @ApiForbiddenResponse({ description: 'Only creator or admin can update project' }) + @ApiForbiddenResponse({ + description: 'Only creator or admin can update project', + }) @ApiUnauthorizedResponse({ description: 'Unauthorized' }) async update( @Param('id') id: string, @@ -179,7 +185,12 @@ export class ProjectsController { ) { const userId = req.user.sub; const userRole = req.user.role; - const project = await this.projectsService.update(id, updateProjectDto, userId, userRole); + const project = await this.projectsService.update( + id, + updateProjectDto, + userId, + userRole, + ); return project; } diff --git a/src/projects/providers/projects.service.ts b/src/projects/providers/projects.service.ts index 3248f7b..f7dac93 100644 --- a/src/projects/providers/projects.service.ts +++ b/src/projects/providers/projects.service.ts @@ -367,7 +367,9 @@ export class ProjectsService { const isAdmin = userRole === UserRole.ADMIN; if (!isCreator && !isAdmin) { - throw new ForbiddenException('Only project creator or admin can update project'); + throw new ForbiddenException( + 'Only project creator or admin can update project', + ); } // 3. Prevent updates to completed or rejected projects @@ -615,4 +617,3 @@ export class ProjectsService { ); } } - diff --git a/src/users/entities/user.entity.ts b/src/users/entities/user.entity.ts index 7c34772..aa723e1 100644 --- a/src/users/entities/user.entity.ts +++ b/src/users/entities/user.entity.ts @@ -29,16 +29,16 @@ export class User { @Column() lastName: string; - @Column({ nullable: true, unique: true }) + @Column({ nullable: true, unique: true, type: 'varchar' }) walletAddress: string | null; - @Column({ nullable: true }) + @Column({ nullable: true, type: 'varchar' }) country: string | null; @Column({ nullable: true, type: 'text' }) bio: string | null; - @Column({ nullable: true }) + @Column({ nullable: true, type: 'varchar' }) avatarUrl: string | null; @Column({ @@ -51,22 +51,22 @@ export class User { @Column({ default: false }) isEmailVerified: boolean; - @Column({ nullable: true }) + @Column({ nullable: true, type: 'varchar' }) emailVerificationToken: string | null; @Column({ nullable: true, type: 'timestamp' }) emailVerificationTokenExpiry: Date | null; - @Column({ nullable: true }) + @Column({ nullable: true, type: 'varchar' }) resetPasswordTokenSelector: string | null; - @Column({ nullable: true }) + @Column({ nullable: true, type: 'varchar' }) resetPasswordTokenHash: string | null; @Column({ nullable: true, type: 'timestamp' }) resetPasswordTokenExpiry: Date | null; - @Column({ nullable: true }) + @Column({ nullable: true, type: 'varchar' }) refreshTokenHash: string | null; @Column({ @@ -82,10 +82,10 @@ export class User { @Column({ nullable: true, type: 'timestamp' }) kycVerifiedAt: Date | null; - @Column({ nullable: true }) + @Column({ nullable: true, type: 'varchar' }) kycDocumentUrl: string | null; - @Column({ nullable: true }) + @Column({ nullable: true, type: 'varchar' }) kycRejectionReason: string | null; @CreateDateColumn() diff --git a/src/withdrawals/entities/withdrawal.entity.ts b/src/withdrawals/entities/withdrawal.entity.ts new file mode 100644 index 0000000..a7fbb56 --- /dev/null +++ b/src/withdrawals/entities/withdrawal.entity.ts @@ -0,0 +1,52 @@ +import { + Entity, + PrimaryGeneratedColumn, + Column, + CreateDateColumn, + UpdateDateColumn, + ManyToOne, + JoinColumn, + Index, +} from 'typeorm'; +import { Project } from '../../projects/entities/project.entity'; +import { WithdrawalStatus } from '../../common/enums/withdrawal-status.enum'; + +@Entity('withdrawals') +@Index('IDX_withdrawals_project_id', ['projectId']) +@Index('IDX_withdrawals_status', ['status']) +export class Withdrawal { + @PrimaryGeneratedColumn('uuid') + id: string; + + @Column() + projectId: string; + + @ManyToOne(() => Project, (project) => project.withdrawals, { + eager: false, + onDelete: 'CASCADE', + }) + @JoinColumn({ name: 'projectId' }) + project: Project; + + @Column({ type: 'decimal', precision: 18, scale: 7 }) + amount: number; + + @Column({ + type: 'enum', + enum: WithdrawalStatus, + default: WithdrawalStatus.PENDING, + }) + status: WithdrawalStatus; + + @Column({ nullable: true, type: 'varchar' }) + transactionHash: string | null; + + @Column({ nullable: true, type: 'text' }) + rejectionReason: string | null; + + @CreateDateColumn() + createdAt: Date; + + @UpdateDateColumn() + updatedAt: Date; +} diff --git a/src/withdrawals/withdrawals.module.ts b/src/withdrawals/withdrawals.module.ts new file mode 100644 index 0000000..6d2ed02 --- /dev/null +++ b/src/withdrawals/withdrawals.module.ts @@ -0,0 +1,9 @@ +import { Module } from '@nestjs/common'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { Withdrawal } from './entities/withdrawal.entity'; + +@Module({ + imports: [TypeOrmModule.forFeature([Withdrawal])], + exports: [TypeOrmModule], +}) +export class WithdrawalsModule {} diff --git a/test/auth/auth.controller.spec.ts b/test/auth/auth.controller.spec.ts index e558b5a..f53aa40 100644 --- a/test/auth/auth.controller.spec.ts +++ b/test/auth/auth.controller.spec.ts @@ -96,7 +96,9 @@ describe('AuthController', () => { const mockReq = {} as Request; - jest.spyOn(authService, 'login').mockResolvedValue(mockAuthResponse as any); + jest + .spyOn(authService, 'login') + .mockResolvedValue(mockAuthResponse as any); const result = await authController.login(loginDto, mockReq); @@ -112,7 +114,9 @@ describe('AuthController', () => { const mockReq = { headers: { host: 'localhost' } } as Request; - jest.spyOn(authService, 'login').mockResolvedValue(mockAuthResponse as any); + jest + .spyOn(authService, 'login') + .mockResolvedValue(mockAuthResponse as any); await authController.login(loginDto, mockReq); diff --git a/test/auth/auth.services.spec.ts b/test/auth/auth.services.spec.ts index c76b1c3..9292fda 100644 --- a/test/auth/auth.services.spec.ts +++ b/test/auth/auth.services.spec.ts @@ -15,7 +15,6 @@ import { NotFoundException, } from '@nestjs/common'; - jest.mock('bcrypt', () => ({ hash: jest.fn(), compare: jest.fn(), @@ -298,7 +297,9 @@ describe('AuthService', () => { }; userRepository.findOne.mockResolvedValue(unverifiedUser as User); - const result = await authService.resendVerification(resendVerificationDto); + const result = await authService.resendVerification( + resendVerificationDto, + ); expect(result.message).toBe('Verification email resent'); }); @@ -328,7 +329,9 @@ describe('AuthService', () => { it('should return success message even if user not found (security)', async () => { userRepository.findOne.mockResolvedValue(null); - const result = await authService.forgotPassword('nonexistent@example.com'); + const result = await authService.forgotPassword( + 'nonexistent@example.com', + ); expect(result.message).toBe( 'If an account with that email exists, a reset link has been sent', @@ -490,7 +493,10 @@ describe('AuthService', () => { userRepository.findOne.mockResolvedValue(mockUser as User); userRepository.save.mockResolvedValue(mockUser as User); - const result = await authService.updateKYCStatus(mockUser.id, updateKycDto); + const result = await authService.updateKYCStatus( + mockUser.id, + updateKycDto, + ); expect(result.message).toBe('KYC status updated to approved'); expect(userRepository.save).toHaveBeenCalled(); @@ -557,9 +563,9 @@ describe('AuthService', () => { jwtService.verify.mockReturnValue(jwtPayload); userRepository.findOne.mockResolvedValue(null); - await expect( - authService.refreshToken(refreshTokenDto), - ).rejects.toThrow(UnauthorizedException); + await expect(authService.refreshToken(refreshTokenDto)).rejects.toThrow( + UnauthorizedException, + ); }); it('should throw UnauthorizedException if no refresh token hash stored', async () => { @@ -570,9 +576,9 @@ describe('AuthService', () => { jwtService.verify.mockReturnValue(jwtPayload); userRepository.findOne.mockResolvedValue(userWithoutHash as User); - await expect( - authService.refreshToken(refreshTokenDto), - ).rejects.toThrow(UnauthorizedException); + await expect(authService.refreshToken(refreshTokenDto)).rejects.toThrow( + UnauthorizedException, + ); }); it('should throw UnauthorizedException for invalid refresh token', async () => { @@ -580,29 +586,33 @@ describe('AuthService', () => { userRepository.findOne.mockResolvedValue(mockUser as User); (bcrypt.compare as jest.Mock).mockResolvedValue(false); - await expect( - authService.refreshToken(refreshTokenDto), - ).rejects.toThrow(UnauthorizedException); + await expect(authService.refreshToken(refreshTokenDto)).rejects.toThrow( + UnauthorizedException, + ); }); it('should throw UnauthorizedException for expired JWT token', async () => { jest.spyOn(jwtService, 'verify').mockImplementation(() => { - throw Object.assign(new Error('Token expired'), { name: 'TokenExpiredError' }); + throw Object.assign(new Error('Token expired'), { + name: 'TokenExpiredError', + }); }); - await expect( - authService.refreshToken(refreshTokenDto), - ).rejects.toThrow(UnauthorizedException); + await expect(authService.refreshToken(refreshTokenDto)).rejects.toThrow( + UnauthorizedException, + ); }); it('should throw UnauthorizedException for invalid JWT token', async () => { jest.spyOn(jwtService, 'verify').mockImplementation(() => { - throw Object.assign(new Error('JsonWebTokenError'), { name: 'JsonWebTokenError' }); + throw Object.assign(new Error('JsonWebTokenError'), { + name: 'JsonWebTokenError', + }); }); - await expect( - authService.refreshToken(refreshTokenDto), - ).rejects.toThrow(UnauthorizedException); + await expect(authService.refreshToken(refreshTokenDto)).rejects.toThrow( + UnauthorizedException, + ); }); }); });