aethex-forge/client/api/applications.ts
2025-11-08 03:49:51 +00:00

115 lines
3 KiB
TypeScript

export interface Application {
id: string;
creator_id: string;
opportunity_id: string;
status: "submitted" | "reviewing" | "accepted" | "rejected" | "withdrawn";
cover_letter: string;
response_message?: string;
applied_at: string;
updated_at: string;
aethex_opportunities?: {
id: string;
title: string;
arm_affiliation: string;
job_type: string;
posted_by_id: string;
aethex_creators: {
username: string;
avatar_url: string;
};
};
}
export interface ApplicationsResponse {
data: Application[];
pagination: {
page: number;
limit: number;
total: number;
pages: number;
};
}
export interface ApplicationWithCreator {
id: string;
creator_id: string;
status: string;
cover_letter: string;
applied_at: string;
aethex_creators: {
username: string;
avatar_url: string;
bio: string;
skills: string[];
};
}
const API_BASE = import.meta.env.VITE_API_BASE || "";
export async function getMyApplications(filters?: {
status?: string;
page?: number;
limit?: number;
}): Promise<ApplicationsResponse> {
const params = new URLSearchParams();
if (filters?.status) params.append("status", filters.status);
if (filters?.page) params.append("page", String(filters.page));
if (filters?.limit) params.append("limit", String(filters.limit));
const response = await fetch(`${API_BASE}/api/applications/me?${params}`);
if (!response.ok) throw new Error("Failed to fetch applications");
return response.json();
}
export async function getApplicationsForOpportunity(opportunityId: string) {
const response = await fetch(
`${API_BASE}/api/opportunities/${opportunityId}/applications`,
);
if (!response.ok) throw new Error("Failed to fetch applications");
const data = await response.json();
return data.data as ApplicationWithCreator[];
}
export async function submitApplication(data: {
opportunity_id: string;
cover_letter: string;
}): Promise<Application> {
const response = await fetch(`${API_BASE}/api/applications`, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(data),
});
if (!response.ok) throw new Error("Failed to submit application");
return response.json();
}
export async function updateApplicationStatus(
applicationId: string,
data: {
status: "reviewing" | "accepted" | "rejected";
response_message?: string;
},
): Promise<Application> {
const response = await fetch(
`${API_BASE}/api/applications/${applicationId}/status`,
{
method: "PUT",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(data),
},
);
if (!response.ok) throw new Error("Failed to update application");
return response.json();
}
export async function withdrawApplication(
applicationId: string,
): Promise<void> {
const response = await fetch(
`${API_BASE}/api/applications/${applicationId}`,
{
method: "DELETE",
},
);
if (!response.ok) throw new Error("Failed to withdraw application");
}