DevByte-Community / DevByte-Community/Community-API-Backend

Implement Job Board Feature (External Applications)

Offen
#76 0 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen
Vorherrschende Sprache
JavaScript
Sterne
2
Forks
11
PR-Merge-Kennzahlen
Keine gemergten PRs in 30 T.

Beschreibung

Ticket ID: JOBS-BOARD-001
Priority: High

**Feature Description**

Implement a job board system for posting and browsing external job opportunities. All applications are redirected to external platforms (company career pages, LinkedIn, etc.). No local application tracking or resume handling.

**Acceptance Criteria**
1. Database Schema(camelCase)
```
sql

CREATE TABLE jobs (
id UUID PRIMARY KEY DEFAULT uuid_generate_v7(),
title VARCHAR(200) NOT NULL,
description TEXT NOT NULL,
body TEXT, -- Detailed job description (optional)
techs UUID[] DEFAULT ARRAY[]::UUID[], -- Technologies required
created_by UUID REFERENCES users(id) ON DELETE SET NULL,
cover_image VARCHAR(500),
external_link VARCHAR(500) NOT NULL, -- REQUIRED: External application URL
recruiter VARCHAR(200) NOT NULL, -- Company/organization name
rate NUMERIC(10,2), -- Hourly/daily rate (optional)
salary_range VARCHAR(100), -- e.g., "$50k - $70k" (optional)
location VARCHAR(200) NOT NULL,
department VARCHAR(100), -- e.g., "Engineering", "Design"
type VARCHAR(20) NOT NULL CHECK (type IN ('FULLTIME', 'PARTTIME', 'INTERNSHIP', 'CONTRACT', 'FREELANCE')),
experience_level VARCHAR(50) NOT NULL CHECH (type IN ('ENTRY', 'MID', 'SENIOR', 'LEAD')),
is_remote BOOLEAN DEFAULT false,
is_active BOOLEAN DEFAULT true,
is_verified BOOLEAN DEFAULT false, -- Admin verified posts
view_count INTEGER DEFAULT 0, -- Track views only
featured BOOLEAN DEFAULT false,
expires_at TIMESTAMP, -- Optional expiration date
created_at TIMESTAMP DEFAULT NOW(),
updated_at TIMESTAMP DEFAULT NOW()
);

-- Indexes for performance
CREATE INDEX idx_jobs_type ON jobs(type);
CREATE INDEX idx_jobs_location ON jobs(location);
CREATE INDEX idx_jobs_created_at ON jobs(created_at DESC);
CREATE INDEX idx_jobs_active ON jobs(is_active) WHERE is_active = true;
CREATE INDEX idx_jobs_tecks ON jobs USING gin(tecks);
CREATE INDEX idx_jobs_verified ON jobs(is_verified) WHERE is_verified = true;
```

2. Core Endpoints ✅
- Public Endpoints (No Auth Required):
```
text

GET /api/v1/jobs # List jobs with filters & pagination
GET /api/v1/jobs/:id # Get job details
```

- Authenticated User Endpoints:
```
text

POST /api/v1/jobs # Create job listing
PUT /api/v1/jobs/:id # Update job (creator or admin)
DELETE /api/v1/jobs/:id # Archive/deactivate job
GET /api/v1/jobs/my-jobs # Get jobs created by user
```

- Admin Endpoints:
```
text

GET /api/v1/admin/jobs/pending # Get pending job verifications
PUT /api/v1/admin/jobs/:id/verify # Verify/unverify job posting
DELETE /api/v1/admin/jobs/:id # Permanently delete job
```

3. Filtering & Search

Query Parameters for `/api/v1/jobs`:
```
type: FULLTIME, PARTTIME, INTERNSHIP, etc.

location: City, country, or "remote"

department: Engineering, Design, Marketing, etc.

techs: Technology IDs (comma-separated)

experience: ENTRY, MID, SENIOR, LEAD

search: Keyword search in title/description

verified: true/false (admin only)

page, pageSize: Pagination (default: 1, 10)

```

4. Caching Strategy

- Redis Cache Implementation:
```
javascript

// Cache keys
const CACHE_KEYS = {
JOBS_LIST: 'jobs:list:v1:', // + filters hash
JOB_DETAIL: 'job:detail:', // + jobId
JOBS_STATS: 'jobs:stats:v1',
FEATURED_JOBS: 'jobs:featured:v1',
VERIFIED_JOBS: 'jobs:verified:v1'
};

// TTL Configuration (seconds)
const CACHE_TTL = {
JOBS_LIST: 300, // 5 minutes
JOB_DETAIL: 600, // 10 minutes
JOBS_STATS: 900, // 15 minutes
FEATURED_JOBS: 1800, // 30 minutes
VERIFIED_JOBS: 1800 // 30 minutes
};

// Cache invalidation triggers:
// - New job created
// - Job updated/deleted
// - Job verified/unverified by admin
// - Job featured/unfeatured
// - Job expires or becomes inactive
```

5. Response Formats ✅

- Job Listing Response:
```
json

{
"success": true,
"data": [
{
"id": "uuidv7",
"title": "Frontend Developer (React)",
"description": "Looking for a skilled React developer...",
"recruiter": "DevByte",
"rate": 50.00,
"salaryRange": "$50k - $70k",
"location": "Lagos, Nigeria",
"type": "FULLTIME",
"department": "Engineering",
"experienceLevel": "MID",
"isRemote": false,
"isVerified": true,
"tecks": [
{ "id": "react-uuid", "name": "React", "icon": "url" },
{ "id": "js-uuid", "name": "JavaScript", "icon": "url" }
],
"coverImage": "url",
"externalLink": "https://company.com/careers/frontend-dev",
"featured": true,
"viewCount": 245,
"createdAt": "2024-01-15T10:30:00Z",
"timeAgo": "2024-01-15T10:30:00Z",
"expiresIn": "2024-01-15T10:30:00Z"
}
],
"pagination": {
"page": 1,
"pageSize": 10,
"total": 45,
"totalPages": 5
}
}
```

6. Validation Rules ✅

- [ ] Title: Required, 5-200 characters, no special characters(sql injection attack)

- [ ] Description: Required, 50-500 characters, no special characters(sql injection attack)

- [ ] External Link: REQUIRED, valid URL, must be external (not localhost/our domain)

- [ ] Recruiter: Required, 2-200 characters

- [ ] Location: Required, 2-200 characters

- [ ] Type: Required, from enum values

- [ ] Rate/Salary: Optional, if provided must be positive

- [ ] Cover Image: Optional, valid URL

- [ ] Techs: Optional, array of valid tech IDs

- [ ] Contact Email: Optional, valid email format

7. Job Expiry & Cleanup ✅

- Optional expires_at field

- Cron job to deactivate expired jobs (daily)

- Admin can manually extend expiry

- Users can renew their own jobs (within limits)

8. Verification System ✅

- All new jobs start as is_verified: false

- Admin must verify legitimate job postings

- Only verified jobs appear in main listings (admin override available)

- Email notification to admins on new job submission

9. Testing

- [ ] Unit tests for job creation/validation(controller/service)

- [ ] Integration tests for filtering/search...

10. Documentation

- [ ] Complete Swagger/OpenAPI documentation

- [ ] Filter parameter documentation

- [ ] Cache behavior documentation

Beitragsleitfaden

Beitragsleitfaden öffnen

Bewertung

Dieses Issue wurde noch nicht bewertet.

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.