interface GoAffProAffiliate { id: number; email: string; ref_code: string; status: string; created_at: string; updated_at: string; } interface CreateAffiliateRequest { email: string; first_name?: string; last_name?: string; name: string; password: string; } interface CreateAffiliateResponse { success: boolean; affiliate: GoAffProAffiliate | null; message?: string; errors?: Record; } /** * Helper function to update an affiliate via PATCH */ async function updateGoAffProAffiliate( id: number, body: Record, ): Promise<{ success: boolean; data?: unknown; error?: string }> { try { const response = await fetch( `${serverConfig.goaffproApiUrl}/admin/affiliates/${id}`, { method: "PATCH", headers: { "Content-Type": "application/json", "x-goaffpro-access-token": serverConfig.goaffproApiKey, }, body: JSON.stringify(body), }, ); const responseData = await response.json(); if (!response.ok) { return { success: false, error: responseData.error || responseData.message || "Failed to update affiliate", }; } return { success: true, data: responseData, }; } catch (error) { console.error("Error updating GoAffPro affiliate:", error); return { success: false, error: "Internal server error", }; } } /** * Create a new affiliate in GoAffPro */ export async function createGoAffProAffiliate( affiliateData: CreateAffiliateRequest, ): Promise { console.log("affiliateData", affiliateData); try { const response = await fetch( `${serverConfig.goaffproApiUrl}/admin/affiliates`, { method: "POST", headers: { "Content-Type": "application/json", "x-goaffpro-access-token": serverConfig.goaffproApiKey, }, body: JSON.stringify({ email: affiliateData.email, name: affiliateData.name, password: affiliateData.password, password_expired: true, status: "pending", first_name: affiliateData.first_name, last_name: affiliateData.last_name, }), }, ); const responseData = await response.json(); if (!response.ok) { console.error("Error creating GoAffPro affiliate:", responseData); return { success: false, affiliate: null, message: responseData.error || "Failed to create affiliate", errors: responseData.errors, }; } // Get the affiliate ID from the response const createdAffiliateId = responseData.affiliate_id; // Update name fields immediately after creation // This is necessary because the creation endpoint doesn't always persist these fields if ( createdAffiliateId && (affiliateData.name || affiliateData.first_name || affiliateData.last_name) ) { const updateResult = await updateGoAffProAffiliate( createdAffiliateId, { ...(affiliateData.name && { name: affiliateData.name }), ...(affiliateData.first_name && { first_name: affiliateData.first_name }), ...(affiliateData.last_name && { last_name: affiliateData.last_name }), }, ); if (!updateResult.success) { console.warn( "Failed to update affiliate name fields:", updateResult.error, ); // Don't fail the entire creation if update fails } } const affiliate = await getGoAffProAffiliateByEmail( affiliateData.email, ); return { success: true, affiliate: affiliate, message: "Affiliate created successfully", }; } catch (error) { console.error("Error creating GoAffPro affiliate:", error); return { success: false, affiliate: null, message: "Internal server error", }; } } /** * Approve affiliate by id from GoAffPro */ export async function approveGoAffProAffiliate( id: number, ): Promise< { success: boolean; message?: string; error?: string; id?: number } > { try { const updateResult = await updateGoAffProAffiliate(id, { status: "approved", first_name: "David", last_name: "Baker", }); if (!updateResult.success) { return { success: false, message: updateResult.error || "Failed to approve affiliate in GoAffPro", }; } const responseData = updateResult.data as { affiliate?: string | Record; updated?: boolean; id?: number; }; // Parse affiliate if it's a JSON string const affiliate = typeof responseData.affiliate === "string" ? JSON.parse(responseData.affiliate) : responseData.affiliate; const success = affiliate?.status === "approved" && responseData.updated === true && responseData.id != null; console.log("success", success); console.log("responseData", responseData); console.log("parsed affiliate", affiliate); if (!success) { return { success: false, message: "Failed to approve affiliate in GoAffPro", }; } return { success: true, message: "Affiliate approved successfully", id: responseData.id, }; } catch (error) { console.error("Error approving GoAffPro affiliate:", error); return { success: false, message: "Internal server error" }; } }