release: v1.8.0 - #150
Merged
Merged
release: v1.8.0#150
Conversation
chore(release): sync v1.7.0 version bump back to staging
New stateless POST /api/v1/candidate/parse-linkedin-export endpoint (issue #141, LinkedIn CSV path only -- PDF free-text parsing deliberately deferred per the issue's own scope recommendation). Accepts a LinkedIn "Data export" ZIP, parses Education.csv/Positions.csv (located anywhere in the zip, since LinkedIn nests them in a dated folder) into this API's own Education/Experience shapes, and returns them without persisting anything -- the frontend maps the result into its existing create forms for the user to review/edit before saving. - src/candidate/parseLinkedInExport.service.ts (new): pure parsing logic, no I/O beyond the buffer. Case-insensitive header matching, best-effort Date.parse on LinkedIn's free-text date columns ("Present"/empty -> null + isCurrent true), blank rows filtered, throws INVALID_ZIP for a corrupt buffer, returns empty arrays (never throws) when the zip is valid but has neither CSV. - src/middlewares/uploadLinkedInExport.middleware.ts (new): multer memoryStorage() (nothing written to disk) + .zip-only filter (mimetype AND extension) + 20MB cap, same error-wrapping pattern as uploadCV.middleware.ts. - src/candidate/candidate.controller.ts: new fnParseLinkedInExport -- missing file -> 400, INVALID_ZIP -> 400, any other error -> handleError (500, not swallowed). - src/routers/api/v1/candidate.route.ts: route mounted, inherits verifyToken from the existing router-level /candidate mount. - src/locales/{vi,en}.ts: new linkedinImport.* message keys. - New deps via npm install: adm-zip + csv-parse (+ @types/adm-zip dev-only). - Tests: 2 new suites -- parseLinkedInExport.service.test.ts (5 tests, real in-memory zip fixtures built with adm-zip itself) and candidate.controller.test.ts (4 tests, covers the missing-file/ invalid-zip/unexpected-error branches). npm test: 24/24 suites, 136/136 tests. npm run build: clean. Swagger spec independently confirmed to resolve the new route + full response schema. Node: add-linkedin-export-parse-endpoint, SEALED. Evidence: agent-hub/evidence/{implementer,verifier}/2026-09-20/add-linkedin-export-parse-endpoint-*.md Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…-endpoint feat(candidate): add LinkedIn export parsing endpoint for CV data import
Both docs had drifted since 1.0.0 and never mentioned Application tracker (#132), CV Profiles multi-version (#133), LinkedIn export parsing (#141), httpOnly cookie auth + CSRF (#119/#134), soft-delete +restore (#121), vanity slug public profile (#120), visit tracking, i18n (vi/en), or PDF export's json/docx formats. - README.md: version bump 1.0.0 -> 1.7.0, refreshed Features/Tech Stack/Project Structure/Endpoints/Env sections. - CLAUDE.md: refreshed middleware order, full API endpoint tables, Models table, Service Layer/Error Hierarchy/Security sections, and the __tests__ file list to match the real src/ tree. - agent-hub/: backfilled node `update-project-docs` (was missing, found via /ship's SealedOnly gate) and its evidence. npm test: 24/24 suites, 136/136 tests passed. npm run build: clean. Node: update-project-docs (SEALED). Evidence: agent-hub/evidence/implementer/2026-09-27/update-project-docs-plan.md, agent-hub/evidence/verifier/2026-09-27/update-project-docs-seal.md Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
docs: sync README.md and CLAUDE.md with current codebase (v1.7.0)
…, emailVerified) The update-project-docs/#146 doc-sync pass missed 3 real fields on src/models/candidate.model.ts, found while writing the GitHub wiki's Data-Models page: cvFile (uploaded-CV metadata), isPublic (gates the public profile), emailVerified (informational, doesn't gate login). npm test: 24/24 suites, 136/136 tests passed. npm run build: clean. Node: fix-claude-md-candidate-model-fields (SEALED). Evidence: agent-hub/evidence/implementer/2026-09-27/fix-claude-md-candidate-model-fields-plan.md, agent-hub/evidence/verifier/2026-09-27/fix-claude-md-candidate-model-fields-seal.md Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
docs(CLAUDE.md): add missing Candidate model fields (cvFile, isPublic, emailVerified)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Commits
Closes #148.
Closes #146.
Closes #141.