Aunty-Sparkles-Website/lib/square-client.ts

118 lines
3.3 KiB
TypeScript

let squareClient: any = null
let clientError: string | null = null
let isInitializing = false
// Dynamic import function for Square SDK
const importSquareSDK = async () => {
try {
// Use dynamic import instead of require
const squareModule = await import("squareup")
return squareModule
} catch (error) {
console.error("Failed to import Square SDK:", error)
throw new Error(`Square SDK import failed: ${error instanceof Error ? error.message : 'Unknown error'}`)
}
}
// Initialize Square client with proper error handling
export const getSquareClient = async () => {
if (clientError) {
throw new Error(clientError)
}
if (squareClient) {
return squareClient
}
if (isInitializing) {
// Wait for initialization to complete
while (isInitializing) {
await new Promise(resolve => setTimeout(resolve, 100))
}
if (squareClient) return squareClient
if (clientError) throw new Error(clientError)
}
isInitializing = true
try {
// Validate environment variables first
if (!process.env.SQUARE_ACCESS_TOKEN) {
throw new Error("SQUARE_ACCESS_TOKEN environment variable is required")
}
if (!process.env.SQUARE_LOCATION_ID) {
throw new Error("SQUARE_LOCATION_ID environment variable is required")
}
console.log("Importing Square SDK...")
// Dynamic import of Square SDK
const { Client, Environment } = await importSquareSDK()
console.log("Creating Square client...")
squareClient = new Client({
accessToken: process.env.SQUARE_ACCESS_TOKEN,
environment: process.env.SQUARE_ENVIRONMENT === "production"
? Environment.Production
: Environment.Sandbox,
})
console.log("Square client created successfully")
return squareClient
} catch (error) {
clientError = error instanceof Error ? error.message : "Failed to initialize Square client"
console.error("Square client initialization failed:", clientError)
throw new Error(clientError)
} finally {
isInitializing = false
}
}
// Export location ID with validation
export const getSquareLocationId = () => {
if (!process.env.SQUARE_LOCATION_ID) {
throw new Error("SQUARE_LOCATION_ID environment variable is required")
}
return process.env.SQUARE_LOCATION_ID
}
// Health check function
export const checkSquareConnection = async () => {
try {
console.log("Starting Square connection check...")
const client = await getSquareClient()
const locationId = getSquareLocationId()
console.log("Testing Square API connection...")
// Try a simple API call to verify connection
const locationsApi = client.locationsApi
const response = await locationsApi.retrieveLocation(locationId)
console.log("Square API connection successful")
return {
success: true,
message: "Square connection verified",
locationName: response.result.location?.name || "Unknown"
}
} catch (error) {
console.error("Square connection check failed:", error)
return {
success: false,
error: error instanceof Error ? error.message : "Connection failed"
}
}
}
// Reset client (useful for testing)
export const resetSquareClient = () => {
squareClient = null
clientError = null
isInitializing = false
}