Repository files navigation

IVOverflow

IVOverflow is a secure, production-grade developer Q&A application inspired by Stack Overflow. It was built across three logical delivery stages: authentication and questions, answers, and voting. The result is a full-stack interview assignment that demonstrates clean product iteration, typed API boundaries, server-side data ownership, accessibility, security hardening, and reviewer-friendly developer experience.

Developers can log in with seeded users, ask tagged questions, answer questions, and vote answers up or down. Votes are enforced as one vote per user per answer, answers are sorted by server-computed score, and question/answer bodies support Prism.js syntax highlighting for fenced code snippets.

Architecture & Tech Stack

IVOverflow is structured as a monorepo with clear separation between client/ and server/. This keeps frontend and backend concerns isolated while still allowing shared project-level workflows, documentation, CI, and development scripts.1

LayerStack
FrontendReact, Redux Toolkit, RTK Query, CSS Modules, Prism.js via RichBody
BackendNode.js, Express, TypeScript, Helmet, CORS hardening
ORMPrisma
DatabasePostgreSQL via Docker Compose
AuthJWT with 1-hour expiration, fail-fast JWT_SECRET, protected API routes
TestingVitest + Supertest backend integration tests

High-Level Flow

React + RTK Query
-> Express REST API + JWT middleware
-> Prisma ORM
-> PostgreSQL

Dev Experience & Quality Controls

  • Local pre-commit quality gate with Husky + lint-staged, running ESLint fixes and Prettier on staged files.1
  • GitHub Actions CI validates both packages on every push and PR: server lint/test/build and client lint/build.2
  • Backend integration coverage includes authentication, questions, answers, health, and voting behavior, with 33 passing tests.3
  • RTK Query cache invalidation keeps the UI synchronized after creating questions, posting answers, and voting.
  • Security polish includes Helmet, restricted CORS, Prisma parameterized access, JWT validation, and no hardcoded JWT fallback secret.

Prerequisites

Install these before running the app locally:

  • Node.js 18+
  • Docker Desktop

Setup & Run Instructions

From the repository root:

npm install

Create a local server environment file if it does not already exist:

cp server/.env.example server/.env

Start PostgreSQL:

docker compose up -d

Prepare the database and seed test users:

cd server && npx prisma migrate dev && npx prisma db seed
cd ..

Boot the full application from the root directory:

npm run dev

The app will be available at:

Hardcoded Testing Credentials

Seeded users are created by server/prisma/seed.ts. Use any of these credentials to log in immediately:

NameEmailPassword
Alice Cohenalice@ivtech.devpassword123
Bob Levibob@ivtech.devpassword123
Carol Mizrahicarol@ivtech.devpassword123

Feature Summary

Stage 1: Authentication & Questions

  • JWT login with hardcoded seeded users
  • SHA-512 password hashing per assignment requirements
  • Protected routes and authenticated API access
  • Ask Question modal available globally inside authenticated routes
  • Question list and detail pages

Stage 2: Answers

  • Submit answers on the question detail page
  • Display answer author and timestamp
  • Server-side answer ordering by creation time before voting is introduced

Stage 3: Voting

  • Upvote, downvote, flip vote, and cancel same-value vote
  • One vote per user per answer enforced at the database level
  • Server-computed score and myVote fields returned with answers
  • Answers sorted by score DESC, then createdAt ASC
  • Accessible voting controls with active states and double-submit protection

Useful Commands

# Root
npm run dev
npm run format:check
# Servercd server
npm run lint
npm test
npm run build
# Clientcd client
npm run lint
npm run build

Notes for Reviewers

  • The backend returns consistent JSON envelopes: { data } on success and { error } on failure.
  • All protected API calls require Authorization: Bearer <token>.
  • GET /getQuestionAnswer is the source of truth for vote score ordering; the frontend intentionally does not re-sort answers.
  • Fenced code blocks in question and answer bodies are highlighted with Prism.js, for example:
```typescript
const answer = "Use Prisma and RTK Query";
```

Footnotes

  1. See architecture.md for the full architecture, source layout, and local development model. 2

  2. See .github/workflows/ci.yml for the CI pipeline definition.

  3. The final backend suite contains 33 passing Vitest/Supertest tests across health, auth, questions, answers, and voting.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

IVOverflow

IVOverflow is a secure, production-grade developer Q&A application inspired by Stack Overflow. It was built across three logical delivery stages: authentication and questions, answers, and voting. The result is a full-stack interview assignment that demonstrates clean product iteration, typed API boundaries, server-side data ownership, accessibility, security hardening, and reviewer-friendly developer experience.

Developers can log in with seeded users, ask tagged questions, answer questions, and vote answers up or down. Votes are enforced as one vote per user per answer, answers are sorted by server-computed score, and question/answer bodies support Prism.js syntax highlighting for fenced code snippets.

Architecture & Tech Stack

IVOverflow is structured as a monorepo with clear separation between client/ and server/. This keeps frontend and backend concerns isolated while still allowing shared project-level workflows, documentation, CI, and development scripts.1

LayerStack
FrontendReact, Redux Toolkit, RTK Query, CSS Modules, Prism.js via RichBody
BackendNode.js, Express, TypeScript, Helmet, CORS hardening
ORMPrisma
DatabasePostgreSQL via Docker Compose
AuthJWT with 1-hour expiration, fail-fast JWT_SECRET, protected API routes
TestingVitest + Supertest backend integration tests

High-Level Flow

React + RTK Query
-> Express REST API + JWT middleware
-> Prisma ORM
-> PostgreSQL

Dev Experience & Quality Controls

  • Local pre-commit quality gate with Husky + lint-staged, running ESLint fixes and Prettier on staged files.1
  • GitHub Actions CI validates both packages on every push and PR: server lint/test/build and client lint/build.2
  • Backend integration coverage includes authentication, questions, answers, health, and voting behavior, with 33 passing tests.3
  • RTK Query cache invalidation keeps the UI synchronized after creating questions, posting answers, and voting.
  • Security polish includes Helmet, restricted CORS, Prisma parameterized access, JWT validation, and no hardcoded JWT fallback secret.

Prerequisites

Install these before running the app locally:

  • Node.js 18+
  • Docker Desktop

Setup & Run Instructions

From the repository root:

npm install

Create a local server environment file if it does not already exist:

cp server/.env.example server/.env

Start PostgreSQL:

docker compose up -d

Prepare the database and seed test users:

cd server && npx prisma migrate dev && npx prisma db seed
cd ..

Boot the full application from the root directory:

npm run dev

The app will be available at:

Hardcoded Testing Credentials

Seeded users are created by server/prisma/seed.ts. Use any of these credentials to log in immediately:

NameEmailPassword
Alice Cohenalice@ivtech.devpassword123
Bob Levibob@ivtech.devpassword123
Carol Mizrahicarol@ivtech.devpassword123

Feature Summary

Stage 1: Authentication & Questions

  • JWT login with hardcoded seeded users
  • SHA-512 password hashing per assignment requirements
  • Protected routes and authenticated API access
  • Ask Question modal available globally inside authenticated routes
  • Question list and detail pages

Stage 2: Answers

  • Submit answers on the question detail page
  • Display answer author and timestamp
  • Server-side answer ordering by creation time before voting is introduced

Stage 3: Voting

  • Upvote, downvote, flip vote, and cancel same-value vote
  • One vote per user per answer enforced at the database level
  • Server-computed score and myVote fields returned with answers
  • Answers sorted by score DESC, then createdAt ASC
  • Accessible voting controls with active states and double-submit protection

Useful Commands

# Root
npm run dev
npm run format:check
# Servercd server
npm run lint
npm test
npm run build
# Clientcd client
npm run lint
npm run build

Notes for Reviewers

  • The backend returns consistent JSON envelopes: { data } on success and { error } on failure.
  • All protected API calls require Authorization: Bearer <token>.
  • GET /getQuestionAnswer is the source of truth for vote score ordering; the frontend intentionally does not re-sort answers.
  • Fenced code blocks in question and answer bodies are highlighted with Prism.js, for example:
```typescript
const answer = "Use Prisma and RTK Query";
```

Footnotes

  1. See architecture.md for the full architecture, source layout, and local development model. 2

  2. See .github/workflows/ci.yml for the CI pipeline definition.

  3. The final backend suite contains 33 passing Vitest/Supertest tests across health, auth, questions, answers, and voting.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

IVOverflow

IVOverflow is a secure, production-grade developer Q&A application inspired by Stack Overflow. It was built across three logical delivery stages: authentication and questions, answers, and voting. The result is a full-stack interview assignment that demonstrates clean product iteration, typed API boundaries, server-side data ownership, accessibility, security hardening, and reviewer-friendly developer experience.

Developers can log in with seeded users, ask tagged questions, answer questions, and vote answers up or down. Votes are enforced as one vote per user per answer, answers are sorted by server-computed score, and question/answer bodies support Prism.js syntax highlighting for fenced code snippets.

Architecture & Tech Stack

IVOverflow is structured as a monorepo with clear separation between client/ and server/. This keeps frontend and backend concerns isolated while still allowing shared project-level workflows, documentation, CI, and development scripts.1

LayerStack
FrontendReact, Redux Toolkit, RTK Query, CSS Modules, Prism.js via RichBody
BackendNode.js, Express, TypeScript, Helmet, CORS hardening
ORMPrisma
DatabasePostgreSQL via Docker Compose
AuthJWT with 1-hour expiration, fail-fast JWT_SECRET, protected API routes
TestingVitest + Supertest backend integration tests

High-Level Flow

React + RTK Query
-> Express REST API + JWT middleware
-> Prisma ORM
-> PostgreSQL

Dev Experience & Quality Controls

  • Local pre-commit quality gate with Husky + lint-staged, running ESLint fixes and Prettier on staged files.1
  • GitHub Actions CI validates both packages on every push and PR: server lint/test/build and client lint/build.2
  • Backend integration coverage includes authentication, questions, answers, health, and voting behavior, with 33 passing tests.3
  • RTK Query cache invalidation keeps the UI synchronized after creating questions, posting answers, and voting.
  • Security polish includes Helmet, restricted CORS, Prisma parameterized access, JWT validation, and no hardcoded JWT fallback secret.

Prerequisites

Install these before running the app locally:

  • Node.js 18+
  • Docker Desktop

Setup & Run Instructions

From the repository root:

npm install

Create a local server environment file if it does not already exist:

cp server/.env.example server/.env

Start PostgreSQL:

docker compose up -d

Prepare the database and seed test users:

cd server && npx prisma migrate dev && npx prisma db seed
cd ..

Boot the full application from the root directory:

npm run dev

The app will be available at:

Hardcoded Testing Credentials

Seeded users are created by server/prisma/seed.ts. Use any of these credentials to log in immediately:

NameEmailPassword
Alice Cohenalice@ivtech.devpassword123
Bob Levibob@ivtech.devpassword123
Carol Mizrahicarol@ivtech.devpassword123

Feature Summary

Stage 1: Authentication & Questions

  • JWT login with hardcoded seeded users
  • SHA-512 password hashing per assignment requirements
  • Protected routes and authenticated API access
  • Ask Question modal available globally inside authenticated routes
  • Question list and detail pages

Stage 2: Answers

  • Submit answers on the question detail page
  • Display answer author and timestamp
  • Server-side answer ordering by creation time before voting is introduced

Stage 3: Voting

  • Upvote, downvote, flip vote, and cancel same-value vote
  • One vote per user per answer enforced at the database level
  • Server-computed score and myVote fields returned with answers
  • Answers sorted by score DESC, then createdAt ASC
  • Accessible voting controls with active states and double-submit protection

Useful Commands

# Root
npm run dev
npm run format:check
# Servercd server
npm run lint
npm test
npm run build
# Clientcd client
npm run lint
npm run build

Notes for Reviewers

  • The backend returns consistent JSON envelopes: { data } on success and { error } on failure.
  • All protected API calls require Authorization: Bearer <token>.
  • GET /getQuestionAnswer is the source of truth for vote score ordering; the frontend intentionally does not re-sort answers.
  • Fenced code blocks in question and answer bodies are highlighted with Prism.js, for example:
```typescript
const answer = "Use Prisma and RTK Query";
```

Footnotes

  1. See architecture.md for the full architecture, source layout, and local development model. 2

  2. See .github/workflows/ci.yml for the CI pipeline definition.

  3. The final backend suite contains 33 passing Vitest/Supertest tests across health, auth, questions, answers, and voting.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

IVOverflow

IVOverflow is a secure, production-grade developer Q&A application inspired by Stack Overflow. It was built across three logical delivery stages: authentication and questions, answers, and voting. The result is a full-stack interview assignment that demonstrates clean product iteration, typed API boundaries, server-side data ownership, accessibility, security hardening, and reviewer-friendly developer experience.

Developers can log in with seeded users, ask tagged questions, answer questions, and vote answers up or down. Votes are enforced as one vote per user per answer, answers are sorted by server-computed score, and question/answer bodies support Prism.js syntax highlighting for fenced code snippets.

Architecture & Tech Stack

IVOverflow is structured as a monorepo with clear separation between client/ and server/. This keeps frontend and backend concerns isolated while still allowing shared project-level workflows, documentation, CI, and development scripts.1

LayerStack
FrontendReact, Redux Toolkit, RTK Query, CSS Modules, Prism.js via RichBody
BackendNode.js, Express, TypeScript, Helmet, CORS hardening
ORMPrisma
DatabasePostgreSQL via Docker Compose
AuthJWT with 1-hour expiration, fail-fast JWT_SECRET, protected API routes
TestingVitest + Supertest backend integration tests

High-Level Flow

React + RTK Query
-> Express REST API + JWT middleware
-> Prisma ORM
-> PostgreSQL

Dev Experience & Quality Controls

  • Local pre-commit quality gate with Husky + lint-staged, running ESLint fixes and Prettier on staged files.1
  • GitHub Actions CI validates both packages on every push and PR: server lint/test/build and client lint/build.2
  • Backend integration coverage includes authentication, questions, answers, health, and voting behavior, with 33 passing tests.3
  • RTK Query cache invalidation keeps the UI synchronized after creating questions, posting answers, and voting.
  • Security polish includes Helmet, restricted CORS, Prisma parameterized access, JWT validation, and no hardcoded JWT fallback secret.

Prerequisites

Install these before running the app locally:

  • Node.js 18+
  • Docker Desktop

Setup & Run Instructions

From the repository root:

npm install

Create a local server environment file if it does not already exist:

cp server/.env.example server/.env

Start PostgreSQL:

docker compose up -d

Prepare the database and seed test users:

cd server && npx prisma migrate dev && npx prisma db seed
cd ..

Boot the full application from the root directory:

npm run dev

The app will be available at:

Hardcoded Testing Credentials

Seeded users are created by server/prisma/seed.ts. Use any of these credentials to log in immediately:

NameEmailPassword
Alice Cohenalice@ivtech.devpassword123
Bob Levibob@ivtech.devpassword123
Carol Mizrahicarol@ivtech.devpassword123

Feature Summary

Stage 1: Authentication & Questions

  • JWT login with hardcoded seeded users
  • SHA-512 password hashing per assignment requirements
  • Protected routes and authenticated API access
  • Ask Question modal available globally inside authenticated routes
  • Question list and detail pages

Stage 2: Answers

  • Submit answers on the question detail page
  • Display answer author and timestamp
  • Server-side answer ordering by creation time before voting is introduced

Stage 3: Voting

  • Upvote, downvote, flip vote, and cancel same-value vote
  • One vote per user per answer enforced at the database level
  • Server-computed score and myVote fields returned with answers
  • Answers sorted by score DESC, then createdAt ASC
  • Accessible voting controls with active states and double-submit protection

Useful Commands

# Root
npm run dev
npm run format:check
# Servercd server
npm run lint
npm test
npm run build
# Clientcd client
npm run lint
npm run build

Notes for Reviewers

  • The backend returns consistent JSON envelopes: { data } on success and { error } on failure.
  • All protected API calls require Authorization: Bearer <token>.
  • GET /getQuestionAnswer is the source of truth for vote score ordering; the frontend intentionally does not re-sort answers.
  • Fenced code blocks in question and answer bodies are highlighted with Prism.js, for example:
```typescript
const answer = "Use Prisma and RTK Query";
```

Footnotes

  1. See architecture.md for the full architecture, source layout, and local development model. 2

  2. See .github/workflows/ci.yml for the CI pipeline definition.

  3. The final backend suite contains 33 passing Vitest/Supertest tests across health, auth, questions, answers, and voting.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

IVOverflow

IVOverflow is a secure, production-grade developer Q&A application inspired by Stack Overflow. It was built across three logical delivery stages: authentication and questions, answers, and voting. The result is a full-stack interview assignment that demonstrates clean product iteration, typed API boundaries, server-side data ownership, accessibility, security hardening, and reviewer-friendly developer experience.

Developers can log in with seeded users, ask tagged questions, answer questions, and vote answers up or down. Votes are enforced as one vote per user per answer, answers are sorted by server-computed score, and question/answer bodies support Prism.js syntax highlighting for fenced code snippets.

Architecture & Tech Stack

IVOverflow is structured as a monorepo with clear separation between client/ and server/. This keeps frontend and backend concerns isolated while still allowing shared project-level workflows, documentation, CI, and development scripts.1

LayerStack
FrontendReact, Redux Toolkit, RTK Query, CSS Modules, Prism.js via RichBody
BackendNode.js, Express, TypeScript, Helmet, CORS hardening
ORMPrisma
DatabasePostgreSQL via Docker Compose
AuthJWT with 1-hour expiration, fail-fast JWT_SECRET, protected API routes
TestingVitest + Supertest backend integration tests

High-Level Flow

React + RTK Query
-> Express REST API + JWT middleware
-> Prisma ORM
-> PostgreSQL

Dev Experience & Quality Controls

  • Local pre-commit quality gate with Husky + lint-staged, running ESLint fixes and Prettier on staged files.1
  • GitHub Actions CI validates both packages on every push and PR: server lint/test/build and client lint/build.2
  • Backend integration coverage includes authentication, questions, answers, health, and voting behavior, with 33 passing tests.3
  • RTK Query cache invalidation keeps the UI synchronized after creating questions, posting answers, and voting.
  • Security polish includes Helmet, restricted CORS, Prisma parameterized access, JWT validation, and no hardcoded JWT fallback secret.

Prerequisites

Install these before running the app locally:

  • Node.js 18+
  • Docker Desktop

Setup & Run Instructions

From the repository root:

npm install

Create a local server environment file if it does not already exist:

cp server/.env.example server/.env

Start PostgreSQL:

docker compose up -d

Prepare the database and seed test users:

cd server && npx prisma migrate dev && npx prisma db seed
cd ..

Boot the full application from the root directory:

npm run dev

The app will be available at:

Hardcoded Testing Credentials

Seeded users are created by server/prisma/seed.ts. Use any of these credentials to log in immediately:

NameEmailPassword
Alice Cohenalice@ivtech.devpassword123
Bob Levibob@ivtech.devpassword123
Carol Mizrahicarol@ivtech.devpassword123

Feature Summary

Stage 1: Authentication & Questions

  • JWT login with hardcoded seeded users
  • SHA-512 password hashing per assignment requirements
  • Protected routes and authenticated API access
  • Ask Question modal available globally inside authenticated routes
  • Question list and detail pages

Stage 2: Answers

  • Submit answers on the question detail page
  • Display answer author and timestamp
  • Server-side answer ordering by creation time before voting is introduced

Stage 3: Voting

  • Upvote, downvote, flip vote, and cancel same-value vote
  • One vote per user per answer enforced at the database level
  • Server-computed score and myVote fields returned with answers
  • Answers sorted by score DESC, then createdAt ASC
  • Accessible voting controls with active states and double-submit protection

Useful Commands

# Root
npm run dev
npm run format:check
# Servercd server
npm run lint
npm test
npm run build
# Clientcd client
npm run lint
npm run build

Notes for Reviewers

  • The backend returns consistent JSON envelopes: { data } on success and { error } on failure.
  • All protected API calls require Authorization: Bearer <token>.
  • GET /getQuestionAnswer is the source of truth for vote score ordering; the frontend intentionally does not re-sort answers.
  • Fenced code blocks in question and answer bodies are highlighted with Prism.js, for example:
```typescript
const answer = "Use Prisma and RTK Query";
```

Footnotes

  1. See architecture.md for the full architecture, source layout, and local development model. 2

  2. See .github/workflows/ci.yml for the CI pipeline definition.

  3. The final backend suite contains 33 passing Vitest/Supertest tests across health, auth, questions, answers, and voting.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

IVOverflow

IVOverflow is a secure, production-grade developer Q&A application inspired by Stack Overflow. It was built across three logical delivery stages: authentication and questions, answers, and voting. The result is a full-stack interview assignment that demonstrates clean product iteration, typed API boundaries, server-side data ownership, accessibility, security hardening, and reviewer-friendly developer experience.

Developers can log in with seeded users, ask tagged questions, answer questions, and vote answers up or down. Votes are enforced as one vote per user per answer, answers are sorted by server-computed score, and question/answer bodies support Prism.js syntax highlighting for fenced code snippets.

Architecture & Tech Stack

IVOverflow is structured as a monorepo with clear separation between client/ and server/. This keeps frontend and backend concerns isolated while still allowing shared project-level workflows, documentation, CI, and development scripts.1

LayerStack
FrontendReact, Redux Toolkit, RTK Query, CSS Modules, Prism.js via RichBody
BackendNode.js, Express, TypeScript, Helmet, CORS hardening
ORMPrisma
DatabasePostgreSQL via Docker Compose
AuthJWT with 1-hour expiration, fail-fast JWT_SECRET, protected API routes
TestingVitest + Supertest backend integration tests

High-Level Flow

React + RTK Query
-> Express REST API + JWT middleware
-> Prisma ORM
-> PostgreSQL

Dev Experience & Quality Controls

  • Local pre-commit quality gate with Husky + lint-staged, running ESLint fixes and Prettier on staged files.1
  • GitHub Actions CI validates both packages on every push and PR: server lint/test/build and client lint/build.2
  • Backend integration coverage includes authentication, questions, answers, health, and voting behavior, with 33 passing tests.3
  • RTK Query cache invalidation keeps the UI synchronized after creating questions, posting answers, and voting.
  • Security polish includes Helmet, restricted CORS, Prisma parameterized access, JWT validation, and no hardcoded JWT fallback secret.

Prerequisites

Install these before running the app locally:

  • Node.js 18+
  • Docker Desktop

Setup & Run Instructions

From the repository root:

npm install

Create a local server environment file if it does not already exist:

cp server/.env.example server/.env

Start PostgreSQL:

docker compose up -d

Prepare the database and seed test users:

cd server && npx prisma migrate dev && npx prisma db seed
cd ..

Boot the full application from the root directory:

npm run dev

The app will be available at:

Hardcoded Testing Credentials

Seeded users are created by server/prisma/seed.ts. Use any of these credentials to log in immediately:

NameEmailPassword
Alice Cohenalice@ivtech.devpassword123
Bob Levibob@ivtech.devpassword123
Carol Mizrahicarol@ivtech.devpassword123

Feature Summary

Stage 1: Authentication & Questions

  • JWT login with hardcoded seeded users
  • SHA-512 password hashing per assignment requirements
  • Protected routes and authenticated API access
  • Ask Question modal available globally inside authenticated routes
  • Question list and detail pages

Stage 2: Answers

  • Submit answers on the question detail page
  • Display answer author and timestamp
  • Server-side answer ordering by creation time before voting is introduced

Stage 3: Voting

  • Upvote, downvote, flip vote, and cancel same-value vote
  • One vote per user per answer enforced at the database level
  • Server-computed score and myVote fields returned with answers
  • Answers sorted by score DESC, then createdAt ASC
  • Accessible voting controls with active states and double-submit protection

Useful Commands

# Root
npm run dev
npm run format:check
# Servercd server
npm run lint
npm test
npm run build
# Clientcd client
npm run lint
npm run build

Notes for Reviewers

  • The backend returns consistent JSON envelopes: { data } on success and { error } on failure.
  • All protected API calls require Authorization: Bearer <token>.
  • GET /getQuestionAnswer is the source of truth for vote score ordering; the frontend intentionally does not re-sort answers.
  • Fenced code blocks in question and answer bodies are highlighted with Prism.js, for example:
```typescript
const answer = "Use Prisma and RTK Query";
```

Footnotes

  1. See architecture.md for the full architecture, source layout, and local development model. 2

  2. See .github/workflows/ci.yml for the CI pipeline definition.

  3. The final backend suite contains 33 passing Vitest/Supertest tests across health, auth, questions, answers, and voting.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

IVOverflow

IVOverflow is a secure, production-grade developer Q&A application inspired by Stack Overflow. It was built across three logical delivery stages: authentication and questions, answers, and voting. The result is a full-stack interview assignment that demonstrates clean product iteration, typed API boundaries, server-side data ownership, accessibility, security hardening, and reviewer-friendly developer experience.

Developers can log in with seeded users, ask tagged questions, answer questions, and vote answers up or down. Votes are enforced as one vote per user per answer, answers are sorted by server-computed score, and question/answer bodies support Prism.js syntax highlighting for fenced code snippets.

Architecture & Tech Stack

IVOverflow is structured as a monorepo with clear separation between client/ and server/. This keeps frontend and backend concerns isolated while still allowing shared project-level workflows, documentation, CI, and development scripts.1

LayerStack
FrontendReact, Redux Toolkit, RTK Query, CSS Modules, Prism.js via RichBody
BackendNode.js, Express, TypeScript, Helmet, CORS hardening
ORMPrisma
DatabasePostgreSQL via Docker Compose
AuthJWT with 1-hour expiration, fail-fast JWT_SECRET, protected API routes
TestingVitest + Supertest backend integration tests

High-Level Flow

React + RTK Query
-> Express REST API + JWT middleware
-> Prisma ORM
-> PostgreSQL

Dev Experience & Quality Controls

  • Local pre-commit quality gate with Husky + lint-staged, running ESLint fixes and Prettier on staged files.1
  • GitHub Actions CI validates both packages on every push and PR: server lint/test/build and client lint/build.2
  • Backend integration coverage includes authentication, questions, answers, health, and voting behavior, with 33 passing tests.3
  • RTK Query cache invalidation keeps the UI synchronized after creating questions, posting answers, and voting.
  • Security polish includes Helmet, restricted CORS, Prisma parameterized access, JWT validation, and no hardcoded JWT fallback secret.

Prerequisites

Install these before running the app locally:

  • Node.js 18+
  • Docker Desktop

Setup & Run Instructions

From the repository root:

npm install

Create a local server environment file if it does not already exist:

cp server/.env.example server/.env

Start PostgreSQL:

docker compose up -d

Prepare the database and seed test users:

cd server && npx prisma migrate dev && npx prisma db seed
cd ..

Boot the full application from the root directory:

npm run dev

The app will be available at:

Hardcoded Testing Credentials

Seeded users are created by server/prisma/seed.ts. Use any of these credentials to log in immediately:

NameEmailPassword
Alice Cohenalice@ivtech.devpassword123
Bob Levibob@ivtech.devpassword123
Carol Mizrahicarol@ivtech.devpassword123

Feature Summary

Stage 1: Authentication & Questions

  • JWT login with hardcoded seeded users
  • SHA-512 password hashing per assignment requirements
  • Protected routes and authenticated API access
  • Ask Question modal available globally inside authenticated routes
  • Question list and detail pages

Stage 2: Answers

  • Submit answers on the question detail page
  • Display answer author and timestamp
  • Server-side answer ordering by creation time before voting is introduced

Stage 3: Voting

  • Upvote, downvote, flip vote, and cancel same-value vote
  • One vote per user per answer enforced at the database level
  • Server-computed score and myVote fields returned with answers
  • Answers sorted by score DESC, then createdAt ASC
  • Accessible voting controls with active states and double-submit protection

Useful Commands

# Root
npm run dev
npm run format:check
# Servercd server
npm run lint
npm test
npm run build
# Clientcd client
npm run lint
npm run build

Notes for Reviewers

  • The backend returns consistent JSON envelopes: { data } on success and { error } on failure.
  • All protected API calls require Authorization: Bearer <token>.
  • GET /getQuestionAnswer is the source of truth for vote score ordering; the frontend intentionally does not re-sort answers.
  • Fenced code blocks in question and answer bodies are highlighted with Prism.js, for example:
```typescript
const answer = "Use Prisma and RTK Query";
```

Footnotes

  1. See architecture.md for the full architecture, source layout, and local development model. 2

  2. See .github/workflows/ci.yml for the CI pipeline definition.

  3. The final backend suite contains 33 passing Vitest/Supertest tests across health, auth, questions, answers, and voting.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

IVOverflow

IVOverflow is a secure, production-grade developer Q&A application inspired by Stack Overflow. It was built across three logical delivery stages: authentication and questions, answers, and voting. The result is a full-stack interview assignment that demonstrates clean product iteration, typed API boundaries, server-side data ownership, accessibility, security hardening, and reviewer-friendly developer experience.

Developers can log in with seeded users, ask tagged questions, answer questions, and vote answers up or down. Votes are enforced as one vote per user per answer, answers are sorted by server-computed score, and question/answer bodies support Prism.js syntax highlighting for fenced code snippets.

Architecture & Tech Stack

IVOverflow is structured as a monorepo with clear separation between client/ and server/. This keeps frontend and backend concerns isolated while still allowing shared project-level workflows, documentation, CI, and development scripts.1

LayerStack
FrontendReact, Redux Toolkit, RTK Query, CSS Modules, Prism.js via RichBody
BackendNode.js, Express, TypeScript, Helmet, CORS hardening
ORMPrisma
DatabasePostgreSQL via Docker Compose
AuthJWT with 1-hour expiration, fail-fast JWT_SECRET, protected API routes
TestingVitest + Supertest backend integration tests

High-Level Flow

React + RTK Query
-> Express REST API + JWT middleware
-> Prisma ORM
-> PostgreSQL

Dev Experience & Quality Controls

  • Local pre-commit quality gate with Husky + lint-staged, running ESLint fixes and Prettier on staged files.1
  • GitHub Actions CI validates both packages on every push and PR: server lint/test/build and client lint/build.2
  • Backend integration coverage includes authentication, questions, answers, health, and voting behavior, with 33 passing tests.3
  • RTK Query cache invalidation keeps the UI synchronized after creating questions, posting answers, and voting.
  • Security polish includes Helmet, restricted CORS, Prisma parameterized access, JWT validation, and no hardcoded JWT fallback secret.

Prerequisites

Install these before running the app locally:

  • Node.js 18+
  • Docker Desktop

Setup & Run Instructions

From the repository root:

npm install

Create a local server environment file if it does not already exist:

cp server/.env.example server/.env

Start PostgreSQL:

docker compose up -d

Prepare the database and seed test users:

cd server && npx prisma migrate dev && npx prisma db seed
cd ..

Boot the full application from the root directory:

npm run dev

The app will be available at:

Hardcoded Testing Credentials

Seeded users are created by server/prisma/seed.ts. Use any of these credentials to log in immediately:

NameEmailPassword
Alice Cohenalice@ivtech.devpassword123
Bob Levibob@ivtech.devpassword123
Carol Mizrahicarol@ivtech.devpassword123

Feature Summary

Stage 1: Authentication & Questions

  • JWT login with hardcoded seeded users
  • SHA-512 password hashing per assignment requirements
  • Protected routes and authenticated API access
  • Ask Question modal available globally inside authenticated routes
  • Question list and detail pages

Stage 2: Answers

  • Submit answers on the question detail page
  • Display answer author and timestamp
  • Server-side answer ordering by creation time before voting is introduced

Stage 3: Voting

  • Upvote, downvote, flip vote, and cancel same-value vote
  • One vote per user per answer enforced at the database level
  • Server-computed score and myVote fields returned with answers
  • Answers sorted by score DESC, then createdAt ASC
  • Accessible voting controls with active states and double-submit protection

Useful Commands

# Root
npm run dev
npm run format:check
# Servercd server
npm run lint
npm test
npm run build
# Clientcd client
npm run lint
npm run build

Notes for Reviewers

  • The backend returns consistent JSON envelopes: { data } on success and { error } on failure.
  • All protected API calls require Authorization: Bearer <token>.
  • GET /getQuestionAnswer is the source of truth for vote score ordering; the frontend intentionally does not re-sort answers.
  • Fenced code blocks in question and answer bodies are highlighted with Prism.js, for example:
```typescript
const answer = "Use Prisma and RTK Query";
```

Footnotes

  1. See architecture.md for the full architecture, source layout, and local development model. 2

  2. See .github/workflows/ci.yml for the CI pipeline definition.

  3. The final backend suite contains 33 passing Vitest/Supertest tests across health, auth, questions, answers, and voting.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages