Skip to content

Commit

Permalink
chore: run webhook cleanup
Browse files Browse the repository at this point in the history
  • Loading branch information
dackers86 committed Aug 30, 2023
1 parent 2f91d8d commit eb030ab
Show file tree
Hide file tree
Showing 5 changed files with 51 additions and 18 deletions.
40 changes: 27 additions & 13 deletions firestore-stripe-payments/functions/__tests__/helpers/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ export const waitForDocumentUpdate = (
document: DocumentData,
field: string | number,
value: any,
timeout: number = 10_000
timeout: number = 300000 // 5 minutes
): Promise<FirebaseFirestore.DocumentData> => {
return new Promise((resolve, reject) => {
let timedOut = false;
Expand All @@ -78,34 +78,48 @@ export const waitForDocumentUpdate = (

export const waitForDocumentToExistInCollection = (
query: Query,
field: string | number,
field: string,
value: any,
timeout: number = 20_000
timeout: number = 300000 // 5 minutes
): Promise<DocumentData> => {
return new Promise((resolve, reject) => {
let timedOut = false;

let unsubscribe: () => void; // Declare unsubscribe here

const timer = setTimeout(() => {
timedOut = true;
reject(
new Error(
`Timeout waiting for firestore document to exist with field ${field} in collection`
)
);
if (unsubscribe) {
unsubscribe(); // Unsubscribe when timed out
}
}, timeout);

const unsubscribe = query.onSnapshot(async (snapshot) => {
const docs = snapshot.docChanges();
unsubscribe = query.onSnapshot(async (snapshot) => {
try {
const docs = snapshot.docChanges();

const record: DocumentData = docs.filter(
($) => $.doc.data()[field] === value
)[0];
const record: DocumentData = docs.filter(
($) => $.doc.data()[field] === value
)[0];

if (record) {
unsubscribe();
if (!timedOut) {
clearTimeout(timer);
resolve(record);
if (record) {
unsubscribe();
if (!timedOut) {
clearTimeout(timer);
resolve(record);
}
}
} catch (error) {
if (unsubscribe) {
unsubscribe(); // Unsubscribe on error
}
console.log('Error: ', error);
reject(error);
}
});
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,14 +39,20 @@ export const clearWebhooks = async (id) => {
};

export const clearAllWebhooks = async () => {
console.log('Step 1 >>>>>');
const stripe = require('stripe')(process.env.STRIPE_API_KEY);

console.log('Step 2 >>>>>');
const webhooks = await stripe.webhookEndpoints.list();

console.log('Step 3 >>>>>');

/** Log how weekbhooks have been found */
console.log('Found webhooks: ', webhooks.data.length);

for await (const webhook of webhooks.data) {
if (webhook.url.includes('ngrok.io')) {
await stripe.webhookEndpoints.del(webhook.id);
}
console.log('Deleting webhook: ', webhook.id);
await stripe.webhookEndpoints.del(webhook.id);
}

return Promise.resolve();
Expand Down
3 changes: 3 additions & 0 deletions firestore-stripe-payments/functions/__tests__/run-script.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,12 @@ import {
} from './helpers/setupProxy';

(async () => {
console.log('Starting tests...');

/** Clear all webhooks with ngrok.io,
* useful for clearing any failed ci testing
*/
console.log('Clearing webhooks...');
await cleanupAllWebhooks();

const proxyId = await setupProxy();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ describe('webhook events', () => {
product = await createRandomProduct();
});
test('successfully creates a new product', async () => {
console.log('Checking product >>>>>>', product.name);
const collection = firestore.collection('products');
const productDoc: DocumentData = await waitForDocumentToExistInCollection(
collection,
Expand All @@ -33,7 +34,7 @@ describe('webhook events', () => {
);

expect(productDoc.doc.data().name).toBe(product.name);
});
}, 300000);

test('successfully updates an existing product', async () => {
const updatedProduct: Product = await updateProduct(product.id, {
Expand All @@ -49,6 +50,6 @@ describe('webhook events', () => {
);

expect(updated.data().name).toBe(updatedProduct.name);
});
}, 300000);
});
});
9 changes: 9 additions & 0 deletions firestore-stripe-payments/functions/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -393,6 +393,7 @@ const prefixMetadata = (metadata: object) =>
* Create a Product record in Firestore based on a Stripe Product object.
*/
const createProductRecord = async (product: Stripe.Product): Promise<void> => {
console.log('Creating product record >>>>> ', product.id, product.name);
const { firebaseRole, ...rawMetadata } = product.metadata;

const productData: Product = {
Expand All @@ -405,6 +406,14 @@ const createProductRecord = async (product: Stripe.Product): Promise<void> => {
tax_code: product.tax_code ?? null,
...prefixMetadata(rawMetadata),
};

console.log(
'Setting product record >>>>> ',
product.id,
product.name,
config.productsCollectionPath
);

await admin
.firestore()
.collection(config.productsCollectionPath)
Expand Down

0 comments on commit eb030ab

Please sign in to comment.