Creator API client for frontend
cgen-528cee3da0d54ede8ff0b6e11d55e101
This commit is contained in:
parent
09cdafd36d
commit
198530a475
1 changed files with 164 additions and 0 deletions
164
client/api/creators.ts
Normal file
164
client/api/creators.ts
Normal file
|
|
@ -0,0 +1,164 @@
|
||||||
|
export interface Creator {
|
||||||
|
id: string;
|
||||||
|
username: string;
|
||||||
|
bio: string;
|
||||||
|
skills: string[];
|
||||||
|
avatar_url: string;
|
||||||
|
experience_level: string;
|
||||||
|
arm_affiliations: string[];
|
||||||
|
primary_arm: string;
|
||||||
|
created_at: string;
|
||||||
|
is_discoverable: boolean;
|
||||||
|
allow_recommendations: boolean;
|
||||||
|
devconnect_linked: boolean;
|
||||||
|
aethex_projects?: Project[];
|
||||||
|
aethex_skill_endorsements?: SkillEndorsement[];
|
||||||
|
devconnect_link?: DevConnectLink;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface Project {
|
||||||
|
id: string;
|
||||||
|
creator_id: string;
|
||||||
|
title: string;
|
||||||
|
description: string;
|
||||||
|
url: string;
|
||||||
|
image_url: string;
|
||||||
|
tags: string[];
|
||||||
|
is_featured: boolean;
|
||||||
|
created_at: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface SkillEndorsement {
|
||||||
|
skill: string;
|
||||||
|
count: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface DevConnectLink {
|
||||||
|
id: string;
|
||||||
|
devconnect_username: string;
|
||||||
|
devconnect_profile_url: string;
|
||||||
|
verified: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface CreatorsResponse {
|
||||||
|
data: Creator[];
|
||||||
|
pagination: {
|
||||||
|
page: number;
|
||||||
|
limit: number;
|
||||||
|
total: number;
|
||||||
|
pages: number;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
const API_BASE = process.env.VITE_API_BASE || "";
|
||||||
|
|
||||||
|
export async function getCreators(filters?: {
|
||||||
|
arm?: string;
|
||||||
|
search?: string;
|
||||||
|
page?: number;
|
||||||
|
limit?: number;
|
||||||
|
}): Promise<CreatorsResponse> {
|
||||||
|
const params = new URLSearchParams();
|
||||||
|
if (filters?.arm) params.append("arm", filters.arm);
|
||||||
|
if (filters?.search) params.append("search", filters.search);
|
||||||
|
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/creators?${params}`);
|
||||||
|
if (!response.ok) throw new Error("Failed to fetch creators");
|
||||||
|
return response.json();
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function getCreatorByUsername(username: string): Promise<Creator> {
|
||||||
|
const response = await fetch(`${API_BASE}/api/creators/${username}`);
|
||||||
|
if (!response.ok) throw new Error("Creator not found");
|
||||||
|
return response.json();
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function createCreatorProfile(data: {
|
||||||
|
username: string;
|
||||||
|
bio: string;
|
||||||
|
skills: string[];
|
||||||
|
avatar_url: string;
|
||||||
|
experience_level: string;
|
||||||
|
primary_arm: string;
|
||||||
|
arm_affiliations: string[];
|
||||||
|
}): Promise<Creator> {
|
||||||
|
const response = await fetch(`${API_BASE}/api/creators`, {
|
||||||
|
method: "POST",
|
||||||
|
headers: { "Content-Type": "application/json" },
|
||||||
|
body: JSON.stringify(data),
|
||||||
|
});
|
||||||
|
if (!response.ok) throw new Error("Failed to create creator profile");
|
||||||
|
return response.json();
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function updateCreatorProfile(data: {
|
||||||
|
username?: string;
|
||||||
|
bio?: string;
|
||||||
|
skills?: string[];
|
||||||
|
avatar_url?: string;
|
||||||
|
experience_level?: string;
|
||||||
|
primary_arm?: string;
|
||||||
|
arm_affiliations?: string[];
|
||||||
|
is_discoverable?: boolean;
|
||||||
|
allow_recommendations?: boolean;
|
||||||
|
}): Promise<Creator> {
|
||||||
|
const response = await fetch(`${API_BASE}/api/creators/me`, {
|
||||||
|
method: "PUT",
|
||||||
|
headers: { "Content-Type": "application/json" },
|
||||||
|
body: JSON.stringify(data),
|
||||||
|
});
|
||||||
|
if (!response.ok) throw new Error("Failed to update creator profile");
|
||||||
|
return response.json();
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function addProject(data: {
|
||||||
|
title: string;
|
||||||
|
description: string;
|
||||||
|
url: string;
|
||||||
|
image_url: string;
|
||||||
|
tags: string[];
|
||||||
|
is_featured?: boolean;
|
||||||
|
}): Promise<Project> {
|
||||||
|
const response = await fetch(`${API_BASE}/api/creators/me/projects`, {
|
||||||
|
method: "POST",
|
||||||
|
headers: { "Content-Type": "application/json" },
|
||||||
|
body: JSON.stringify(data),
|
||||||
|
});
|
||||||
|
if (!response.ok) throw new Error("Failed to add project");
|
||||||
|
return response.json();
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function updateProject(projectId: string, data: {
|
||||||
|
title?: string;
|
||||||
|
description?: string;
|
||||||
|
url?: string;
|
||||||
|
image_url?: string;
|
||||||
|
tags?: string[];
|
||||||
|
is_featured?: boolean;
|
||||||
|
}): Promise<Project> {
|
||||||
|
const response = await fetch(`${API_BASE}/api/creators/me/projects/${projectId}`, {
|
||||||
|
method: "PUT",
|
||||||
|
headers: { "Content-Type": "application/json" },
|
||||||
|
body: JSON.stringify(data),
|
||||||
|
});
|
||||||
|
if (!response.ok) throw new Error("Failed to update project");
|
||||||
|
return response.json();
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function deleteProject(projectId: string): Promise<void> {
|
||||||
|
const response = await fetch(`${API_BASE}/api/creators/me/projects/${projectId}`, {
|
||||||
|
method: "DELETE",
|
||||||
|
});
|
||||||
|
if (!response.ok) throw new Error("Failed to delete project");
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function endorseSkill(creatorId: string, skill: string): Promise<void> {
|
||||||
|
const response = await fetch(`${API_BASE}/api/creators/${creatorId}/endorse`, {
|
||||||
|
method: "POST",
|
||||||
|
headers: { "Content-Type": "application/json" },
|
||||||
|
body: JSON.stringify({ skill }),
|
||||||
|
});
|
||||||
|
if (!response.ok) throw new Error("Failed to endorse skill");
|
||||||
|
}
|
||||||
Loading…
Reference in a new issue