Skip to content

Instantly share code, notes, and snippets.

@peleteiro
Created May 1, 2020 00:02
Show Gist options
  • Select an option

  • Save peleteiro/556d1f6ed9e9555f365c696d7363e1c3 to your computer and use it in GitHub Desktop.

Select an option

Save peleteiro/556d1f6ed9e9555f365c696d7363e1c3 to your computer and use it in GitHub Desktop.

Revisions

  1. peleteiro created this gist May 1, 2020.
    68 changes: 68 additions & 0 deletions x.js
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,68 @@
    const admin = require('firebase-admin')
    const {DateTime} = require('luxon')
    const _ = require('lodash')

    const fbSource = admin.initializeApp(
    {
    credential: admin.credential.cert(require(`./serviceAccountKey.production.json`)),
    databaseURL: 'https://biblebox-prod.firebaseio.com',
    },
    'source',
    )

    const fbTarget = admin.initializeApp(
    {
    name: 'target',
    credential: admin.credential.cert(require(`./serviceAccountKey.push.json`)),
    databaseURL: 'https://biblebox-push.firebaseio.com',
    },
    'target',
    )

    const fsSource = fbSource.firestore()

    const main = async () => {
    const lastOne = await (async () => {
    const q = await fsTarget.collection('notification_subscribers').orderBy('createdAt', 'desc').limit(1).get()
    if (q.size < 1) return
    const i = await fsSource.collection('notification_subscribers').doc(q.docs[0].id)
    return await i.get()
    })()

    const query = fsSource.collection('notification_subscribers').orderBy('createdAt', 'asc').limit(100)

    let s = await (lastOne ? query.startAfter(lastOne).get() : query.get())

    while (!s.empty) {
    await messaging.subscribeToTopic(s.docs.map(d => d.id), 'daily')
    const batch = fsTarget.batch()
    for (doc of s.docs) {
    await exportSubscriber(batch, doc.data())
    }
    await batch.commit()
    s = await query.startAfter(_.last(s.docs)).get()
    }
    }

    const fsTarget = fbTarget.firestore()
    const messaging = fbTarget.messaging()

    const increment = admin.firestore.FieldValue.increment(1)

    const exportSubscriber = async (batch, {uid, token, platform, createdAt, updatedAt}) => {
    const ref = fsTarget.collection('notification_subscribers').doc(token)
    // const doc = await ref.get()

    // if (doc.exists) return

    const now = DateTime.fromJSDate(createdAt.toDate())
    await batch.create(ref, {token, platform, uid, subscribed: true, createdAt, updatedAt})
    batch.set(
    fsTarget.collection('notification_subscribers__counter').doc(now.toFormat('yyyy-MM-dd')),
    {date: admin.firestore.Timestamp.fromDate(now.startOf('day').toJSDate()), created: increment},
    {merge: true},
    )
    batch.set(fsTarget.collection('notification_subscribers__counter').doc('total'), {created: increment}, {merge: true})
    }

    main()