Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 21 additions & 1 deletion functions/firebase/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ const firestore = new Firestore({
});

// Converts strings added to /messages/{pushId}/original to uppercase
exports.makeUpperCase = (event, callback) => {
exports.makeUpperCase = (event) => {
const resource = event.resource;
const affectedDoc = firestore.doc(resource.split('/documents/')[1]);

Expand All @@ -106,3 +106,23 @@ exports.makeUpperCase = (event, callback) => {
});
};
// [END functions_firebase_reactive]

// [START functions_firebase_analytics]
/**
* Triggered by a Google Analytics for Firebase log event.
*
* @param {!Object} event The Cloud Functions event.
*/
exports.helloAnalytics = (event) => {
const resource = event.resource;
console.log(`Function triggered by the following event: ${resource}`);

const analyticsEvent = event.data.eventDim[0];
console.log(`Name: ${analyticsEvent.name}`);
console.log(`Timestamp: ${new Date(analyticsEvent.timestampMicros / 1000)}`);

const userObj = event.data.userDim;
console.log(`Device Model: ${userObj.deviceInfo.deviceModel}`);
console.log(`Location: ${userObj.geoInfo.city}, ${userObj.geoInfo.country}`);
};
// [END functions_firebase_analytics]
33 changes: 31 additions & 2 deletions functions/firebase/test/index.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,36 @@ test(`should listen to Auth events`, t => {
t.true(cb.calledOnce);
});

test.serial('should monitor Analytics', t => {
const date = new Date();
const event = {
data: {
eventDim: [{
name: 'my-event',
timestampMicros: `${date.valueOf()}000`
}],
userDim: {
deviceInfo: {
deviceModel: 'Pixel'
},
geoInfo: {
city: 'London',
country: 'UK'
}
}
},
resource: 'my-resource'
};

const sample = getSample();
sample.program.helloAnalytics(event);
t.is(console.log.args[0][0], `Function triggered by the following event: my-resource`);
t.is(console.log.args[1][0], `Name: my-event`);
t.is(console.log.args[2][0], `Timestamp: ${date}`);
t.is(console.log.args[3][0], `Device Model: Pixel`);
t.is(console.log.args[4][0], `Location: London, UK`);
});

test(`should update data in response to Firestore events`, t => {
const sample = getSample();

Expand All @@ -133,9 +163,8 @@ test(`should update data in response to Firestore events`, t => {
}
}
};
const cb = sinon.stub();

sample.program.makeUpperCase(event, cb);
sample.program.makeUpperCase(event);

t.true(sample.mocks.firestore.doc.calledWith('some/path'));
t.true(console.log.calledWith(`Replacing value: foobar --> FOOBAR`));
Expand Down
21 changes: 21 additions & 0 deletions functions/node8/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -186,3 +186,24 @@ exports.helloAuth = (data, context) => {
}
};
// [END functions_firebase_auth_node8]

// [START functions_firebase_analytics]
/**
* Triggered by a Google Analytics for Firebase log event.
*
* @param {object} data The event payload.
* @param {object} context The event metadata.
*/
exports.helloAnalytics = (data, context) => {
const resource = context.resource;
console.log(`Function triggered by the following event: ${resource}`);

const analyticsEvent = data.eventDim[0];
console.log(`Name: ${analyticsEvent.name}`);
console.log(`Timestamp: ${new Date(analyticsEvent.timestampMicros / 1000)}`);

const userObj = data.userDim;
console.log(`Device Model: ${userObj.deviceInfo.deviceModel}`);
console.log(`Location: ${userObj.geoInfo.city}, ${userObj.geoInfo.country}`);
};
// [END functions_firebase_analytics]
30 changes: 30 additions & 0 deletions functions/node8/test/index.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -82,3 +82,33 @@ test.serial('should monitor Auth', t => {
t.true(console.log.secondCall.args[0].includes(dateString));
t.true(console.log.thirdCall.args[0].includes(emailString));
});

test.serial('should monitor Analytics', t => {
const date = new Date();
const data = {
eventDim: [{
name: 'my-event',
timestampMicros: `${date.valueOf()}000`
}],
userDim: {
deviceInfo: {
deviceModel: 'Pixel'
},
geoInfo: {
city: 'London',
country: 'UK'
}
}
};

const context = {
resource: 'my-resource'
};

program.helloAnalytics(data, context);
t.is(console.log.args[0][0], `Function triggered by the following event: my-resource`);
t.is(console.log.args[1][0], `Name: my-event`);
t.is(console.log.args[2][0], `Timestamp: ${date}`);
t.is(console.log.args[3][0], `Device Model: Pixel`);
t.is(console.log.args[4][0], `Location: London, UK`);
});