Skip to content

Conversation

@jeromehardaway
Copy link
Contributor

Add a complete job board integration that fetches jobs from Job Boardly's RSS feed and displays them behind authentication.

Features:

  • RSS feed parser for Job Boardly jobs (title, company, location, type, salary, etc.)
  • Protected job listing page (/jobs) - requires GitHub OAuth login
  • Job detail page with full descriptions and apply links
  • Search and filter functionality (by keyword, category, job type)
  • VWC Alumni badge for users with course enrollments
  • Links to resume translator and courses for job seekers
  • API endpoint for fetching jobs programmatically
  • Dev access bypass for local testing without OAuth setup

Navigation:

  • Added "Jobs" link to main menu (with "new" badge)
  • Added "Browse Jobs" to dashboard quick links

Technical Changes:

  • Install rss-parser and xml2js packages
  • Create jobboardly utility library in src/lib/
  • Server-side rendering with authentication checks via NextAuth
  • Fixed Next.js 15 webpack config compatibility issue (removed usedExports)
  • Dev-only bypass mode for testing without GitHub OAuth credentials

Access Control:

  • Production: Only Vets-Who-Code GitHub org members + admin
  • Job board pages redirect to /login if unauthenticated

…b board

Add a complete job board integration that fetches jobs from Job Boardly's RSS feed and displays them behind authentication.

Features:
- RSS feed parser for Job Boardly jobs (title, company, location, type, salary, etc.)
- Protected job listing page (/jobs) - requires GitHub OAuth login
- Job detail page with full descriptions and apply links
- Search and filter functionality (by keyword, category, job type)
- VWC Alumni badge for users with course enrollments
- Links to resume translator and courses for job seekers
- API endpoint for fetching jobs programmatically
- Dev access bypass for local testing without OAuth setup

Navigation:
- Added "Jobs" link to main menu (with "new" badge)
- Added "Browse Jobs" to dashboard quick links

Technical Changes:
- Install rss-parser and xml2js packages
- Create jobboardly utility library in src/lib/
- Server-side rendering with authentication checks via NextAuth
- Fixed Next.js 15 webpack config compatibility issue (removed usedExports)
- Dev-only bypass mode for testing without GitHub OAuth credentials

Access Control:
- Production: Only Vets-Who-Code GitHub org members + admin
- Development: Any GitHub user (for testing)
- Job board pages redirect to /login if unauthenticated
@jeromehardaway jeromehardaway self-assigned this Nov 29, 2025
@vercel
Copy link

vercel bot commented Nov 29, 2025

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Preview Comments Updated (UTC)
vets-who-code-app Ready Ready Preview Comment Nov 29, 2025 3:11am

Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR adds a complete job board integration that fetches and displays job listings from Job Boardly's RSS feed with GitHub OAuth authentication protection. The implementation includes job listing and detail pages with search/filter functionality, an API endpoint for programmatic access, and a development bypass mode for local testing without OAuth credentials.

Key changes:

  • Added RSS feed parser utility for Job Boardly jobs with custom field extraction
  • Created protected job listing page with search/filter capabilities and VWC Alumni badge
  • Implemented job detail page with application resources and tips sidebar
  • Added "Jobs" navigation link with "new" badge and dashboard quick link

Reviewed changes

Copilot reviewed 9 out of 12 changed files in this pull request and generated 4 comments.

Show a summary per file
File Description
src/pages/jobs/index.tsx Main job listing page with search, filtering, and alumni badge display
src/pages/jobs/[id].tsx Job detail page showing full descriptions, application resources, and share functionality
src/pages/dev-access.tsx Development-only bypass page for testing without OAuth credentials
src/pages/dashboard.tsx Added "Browse Jobs" quick link to dashboard sidebar
src/pages/api/jobs/index.ts API endpoint for fetching jobs programmatically with authentication
src/pages/api/auth/dev-session.ts Development-only endpoint for creating mock sessions
src/lib/jobboardly.ts Utility library for parsing RSS feed and managing job data
src/data/menu.ts Added "Jobs" link to main navigation menu
package.json Added rss-parser and xml2js dependencies

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

} else {
// Fallback: copy to clipboard
navigator.clipboard.writeText(window.location.href);
alert('Link copied to clipboard!');
Copy link

Copilot AI Nov 29, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[nitpick] Using alert() for user feedback is not a modern UX pattern. Consider using a toast notification component or inline message instead for better user experience.

Copilot uses AI. Check for mistakes.
</h2>
<div
className="prose tw-max-w-none tw-text-gray-700"
dangerouslySetInnerHTML={{ __html: job.description }}
Copy link

Copilot AI Nov 29, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Using dangerouslySetInnerHTML with RSS feed content without sanitization creates an XSS vulnerability. The job descriptions from the external RSS feed should be sanitized using a library like DOMPurify before rendering.

Copilot uses AI. Check for mistakes.
// Set session cookie
res.setHeader(
'Set-Cookie',
`next-auth.session-token=${session.sessionToken}; Path=/; HttpOnly; SameSite=Lax; Max-Age=2592000`
Copy link

Copilot AI Nov 29, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The dev session cookie is missing the Secure flag. While this is a development-only feature, it's better practice to include the Secure flag even in dev mode to match production behavior and avoid potential security issues if this code is accidentally exposed.

Suggested change
`next-auth.session-token=${session.sessionToken}; Path=/; HttpOnly; SameSite=Lax; Max-Age=2592000`
`next-auth.session-token=${session.sessionToken}; Path=/; HttpOnly; SameSite=Lax; Max-Age=2592000; Secure`

Copilot uses AI. Check for mistakes.
}

const jobs: Job[] = feed.items.map((item, index) => {
const anyItem = item as any;
Copy link

Copilot AI Nov 29, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Using any type defeats TypeScript's type safety. Define a proper interface for the RSS feed item structure with the custom fields instead of using type assertion to any.

Copilot uses AI. Check for mistakes.
@github-actions
Copy link

🔍 Code Quality Score Breakdown:

  • 📖 Readability: 2/10
  • 📈 Scalability: 5/10
  • 🚀 Performance: 5/10
  • 🛠️ Maintainability: 8/10
  • ✅ Overall Score: 5.0/10

💡 Recommendations:

  • 🧹 Reduce ESLint warnings to improve readability.
  • 📦 Break up complex functions or components.
  • ⚙️ Consider splitting large files or lazy-loading.
  • 🔁 Refactor to increase your overall score next cycle.

@jeromehardaway jeromehardaway merged commit e9c2075 into master Nov 29, 2025
5 checks passed
@jeromehardaway jeromehardaway deleted the feature/jobboardly-integration branch November 29, 2025 03:12
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants