118 lines
3.3 KiB
TypeScript
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
|
|
}
|