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

Implement Job Board Feature (External Applications)

Đang mở
#76 0 bình luận 0 reaction 0 người được giao Xem trên GitHub
Ngôn ngữ chính
JavaScript
Star
2
Fork
11
Chỉ số merge pull request
Không có pull request nào được merge trong 30 ngày

Mô tả

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

Hướng dẫn đóng góp

Mở hướng dẫn đóng góp

Đánh giá

Issue này chưa được đánh giá.

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.