DevByte-Community / DevByte-Community/Community-API-Backend
Implement Job Board Feature (External Applications)
- 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
Đánh giá
Issue này chưa được đánh giá.