This commit is contained in:
Iliyan Angelov
2025-10-13 01:49:06 +03:00
parent 76c857b4f5
commit 5ad9cbe3a6
97 changed files with 5752 additions and 2376 deletions

View File

@@ -54,13 +54,14 @@ export interface JobApplication {
class CareerService {
private baseUrl = `${API_BASE_URL}/api/career`;
/**
* Get all active job positions
*/
async getAllJobs(): Promise<JobPosition[]> {
try {
const response = await fetch(`${this.baseUrl}/jobs/`, {
const response = await fetch(`${this.baseUrl}/jobs`, {
method: 'GET',
headers: {
'Content-Type': 'application/json',
@@ -75,7 +76,6 @@ class CareerService {
// Handle paginated response - extract results array
return data.results || data;
} catch (error) {
console.error('Error fetching jobs:', error);
throw error;
}
}
@@ -85,7 +85,7 @@ class CareerService {
*/
async getJobBySlug(slug: string): Promise<JobPosition> {
try {
const response = await fetch(`${this.baseUrl}/jobs/${slug}/`, {
const response = await fetch(`${this.baseUrl}/jobs/${slug}`, {
method: 'GET',
headers: {
'Content-Type': 'application/json',
@@ -99,7 +99,6 @@ class CareerService {
const data = await response.json();
return data;
} catch (error) {
console.error('Error fetching job:', error);
throw error;
}
}
@@ -109,7 +108,7 @@ class CareerService {
*/
async getFeaturedJobs(): Promise<JobPosition[]> {
try {
const response = await fetch(`${this.baseUrl}/jobs/featured/`, {
const response = await fetch(`${this.baseUrl}/jobs/featured`, {
method: 'GET',
headers: {
'Content-Type': 'application/json',
@@ -124,7 +123,6 @@ class CareerService {
// Handle paginated response - extract results array
return data.results || data;
} catch (error) {
console.error('Error fetching featured jobs:', error);
throw error;
}
}
@@ -136,19 +134,15 @@ class CareerService {
try {
const formData = new FormData();
// Append all fields to FormData
// Required fields
formData.append('job', applicationData.job.toString());
formData.append('first_name', applicationData.first_name);
formData.append('last_name', applicationData.last_name);
formData.append('email', applicationData.email);
formData.append('consent', applicationData.consent.toString());
formData.append('resume', applicationData.resume);
// Append resume file
if (applicationData.resume) {
formData.append('resume', applicationData.resume);
}
// Append optional fields
// Optional fields (only append if they exist)
if (applicationData.phone) formData.append('phone', applicationData.phone);
if (applicationData.current_position) formData.append('current_position', applicationData.current_position);
if (applicationData.current_company) formData.append('current_company', applicationData.current_company);
@@ -160,24 +154,24 @@ class CareerService {
if (applicationData.website_url) formData.append('website_url', applicationData.website_url);
if (applicationData.available_from) formData.append('available_from', applicationData.available_from);
if (applicationData.notice_period) formData.append('notice_period', applicationData.notice_period);
if (applicationData.expected_salary) formData.append('expected_salary', applicationData.expected_salary.toString());
if (applicationData.expected_salary !== undefined) formData.append('expected_salary', applicationData.expected_salary.toString());
if (applicationData.salary_currency) formData.append('salary_currency', applicationData.salary_currency);
const response = await fetch(`${this.baseUrl}/applications/`, {
const response = await fetch(`${this.baseUrl}/applications`, {
method: 'POST',
body: formData,
// Don't set Content-Type header - browser will set it with boundary for multipart/form-data
});
if (!response.ok) {
const errorData = await response.json();
throw new Error(errorData.error || `Failed to submit application: ${response.statusText}`);
const errorData = await response.json().catch(() => ({}));
const errorMessage = errorData.error || errorData.message || errorData.detail || `HTTP ${response.status}: ${response.statusText}`;
throw new Error(errorMessage);
}
const data = await response.json();
return data;
} catch (error) {
console.error('Error submitting application:', error);
throw error;
}
}
@@ -187,7 +181,7 @@ class CareerService {
*/
async getJobsByDepartment(department: string): Promise<JobPosition[]> {
try {
const response = await fetch(`${this.baseUrl}/jobs/?department=${department}`, {
const response = await fetch(`${this.baseUrl}/jobs?department=${department}`, {
method: 'GET',
headers: {
'Content-Type': 'application/json',
@@ -202,7 +196,6 @@ class CareerService {
// Handle paginated response - extract results array
return data.results || data;
} catch (error) {
console.error('Error fetching jobs by department:', error);
throw error;
}
}
@@ -212,7 +205,7 @@ class CareerService {
*/
async getJobsByEmploymentType(employmentType: string): Promise<JobPosition[]> {
try {
const response = await fetch(`${this.baseUrl}/jobs/?employment_type=${employmentType}`, {
const response = await fetch(`${this.baseUrl}/jobs?employment_type=${employmentType}`, {
method: 'GET',
headers: {
'Content-Type': 'application/json',
@@ -227,7 +220,6 @@ class CareerService {
// Handle paginated response - extract results array
return data.results || data;
} catch (error) {
console.error('Error fetching jobs by employment type:', error);
throw error;
}
}