|
|
@@ -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
|
|
|
}
|
|
|
|