Applications API client for frontend
cgen-e701070237354072bef3baa5d267e4bd
This commit is contained in:
parent
140629ec06
commit
a207f95338
1 changed files with 107 additions and 0 deletions
107
client/api/applications.ts
Normal file
107
client/api/applications.ts
Normal file
|
|
@ -0,0 +1,107 @@
|
|||
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 = process.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");
|
||||
}
|
||||
Loading…
Reference in a new issue