Просмотр исходного кода

fix: use token_expires_at column instead of alt_data for ShopRenter token expiration #79

Claude 5 месяцев назад
Родитель
Сommit
40f1eb8e2d
1 измененных файлов с 16 добавлено и 10 удалено
  1. 16 10
      supabase/functions/_shared/shoprenter-client.ts

+ 16 - 10
supabase/functions/_shared/shoprenter-client.ts

@@ -282,7 +282,7 @@ export async function getValidAccessToken(storeId: string): Promise<string> {
   // Fetch store data
   const { data: store, error: storeError } = await supabase
     .from('stores')
-    .select('store_name, api_key, api_secret, alt_data')
+    .select('store_name, api_key, api_secret, alt_data, token_expires_at')
     .eq('id', storeId)
     .eq('platform_name', 'shoprenter')
     .single()
@@ -301,28 +301,30 @@ export async function getValidAccessToken(storeId: string): Promise<string> {
     // Use client_credentials flow to get access token
     const tokenData = await getTokenWithClientCredentials(store.store_name, store.api_key, store.api_secret)
 
-    // Update store with the new access token
+    const expiresAt = new Date(Date.now() + (tokenData.expires_in * 1000)).toISOString()
+
+    // Update store with the new access token (use token_expires_at column, not alt_data)
     await supabase
       .from('stores')
       .update({
         api_key: tokenData.access_token,
         api_secret: tokenData.refresh_token || store.api_secret,
+        token_expires_at: expiresAt,
         alt_data: {
           ...store.alt_data,
-          expires_at: new Date(Date.now() + (tokenData.expires_in * 1000)).toISOString(),
           client_id: store.api_key, // Store original client_id for reference
           client_secret: store.api_secret // Store original client_secret for reference
         }
       })
       .eq('id', storeId)
 
-    console.log('[ShopRenter] Access token obtained and stored successfully')
+    console.log('[ShopRenter] Access token obtained and stored successfully, expires at:', expiresAt)
     return tokenData.access_token
   }
 
   // Check if we have tokens in api_key/api_secret (legacy)
   if (store.api_key) {
-    const expiresAt = store.alt_data?.expires_at
+    const expiresAt = store.token_expires_at // Use dedicated column instead of alt_data
     if (expiresAt) {
       const expiryTime = new Date(expiresAt).getTime()
       const now = Date.now()
@@ -330,30 +332,34 @@ export async function getValidAccessToken(storeId: string): Promise<string> {
 
       // Token is still valid
       if (expiryTime - now > bufferTime) {
+        console.log('[ShopRenter] Using existing valid token, expires at:', expiresAt)
         return store.api_key
       }
 
       // Token needs refresh
+      console.log('[ShopRenter] Token expired or expiring soon, refreshing...')
       if (store.api_secret) {
         const newTokenData = await refreshAccessToken(store.store_name, store.api_secret)
 
-        // Update store with new tokens
+        const newExpiresAt = new Date(Date.now() + (newTokenData.expires_in * 1000)).toISOString()
+
+        // Update store with new tokens (use token_expires_at column, not alt_data)
         await supabase
           .from('stores')
           .update({
             api_key: newTokenData.access_token,
             api_secret: newTokenData.refresh_token || store.api_secret,
-            alt_data: {
-              ...store.alt_data,
-              expires_at: new Date(Date.now() + (newTokenData.expires_in * 1000)).toISOString()
-            }
+            token_expires_at: newExpiresAt
           })
           .eq('id', storeId)
 
+        console.log('[ShopRenter] Token refreshed successfully, expires at:', newExpiresAt)
         return newTokenData.access_token
       }
     }
 
+    // No expiration info, just return the token
+    console.log('[ShopRenter] No expiration info found, using token as-is')
     return store.api_key
   }