How to get current System Timestamp for Firebase? in Android Kotlin - firebase

I am using Firebase pagging and therefore i need current timestamp for queries database in firebase ? can anyone knows how to get current timestamp from system?
FirebaseFirestore.getInstance().collection("news")
.orderBy("timestamp",Query.Direction.DESCENDING)
.startAfter(timestamp) // for here i need current system timestamp..?? how can i??
.limit(4)
.get()

firebase.firestore.FieldValue.serverTimestamp()
If you want the date value of firebase.firestore.FieldValue.serverTimestamp() you can use .toDate().
See FireStore Timesteamp.
If you want the current Date as a timestamp you can use the following
For Firebase Functions
import admin = require('firebase-admin');
const todayAsTimestamp = admin.firestore.Timestamp.now()
For local projects
import { Timestamp } from '#google-cloud/firestore';
const myTimestampAsDate = Timestamp.now()

Ferin's answer led me in the right direction. This what worked for me in my current project using Kotlin when getting the timestamp value to store in firebase cloud firestore.
val createdAt = FieldValue.serverTimestamp()
If anyone is confused I can explain further. Happy coding everyone!

Related

Can not produce angular 6 timestamp, missing imports

I am trying to produce a timestamp on click (of a button) and another timestamp on click of another button. Essentially a punch clock. I understand how to create the buttons, but have no clue with packages to import that would produce the timestamp ....yes, I've search the entire web for this.
Ultimately I'd like to register that to firebase db for a each registered user, but we'll get to that later.
import * as firebase from 'firebase'
user.createdAt = firebase.firestore.FieldValue.serverTimestamp()
user.updatedAt = firebase.firestore.FieldValue.serverTimestamp()
From the docs: https://firebase.google.com/docs/reference/js/firebase.firestore.FieldValue#.serverTimestamp

Firestore moving to timestamps in Firebase functions

Yesterday, all my firebase functions started throwing the following warning:
The behavior for Date objects stored in Firestore is going to change
AND YOUR APP MAY BREAK. To hide this warning and ensure your app does
not break, you need to add the following code to your app before
calling any other Cloud Firestore methods:
const firestore = new Firestore();
const settings = {/* your settings... */ timestampsInSnapshots: true};
firestore.settings(settings);
With this change, timestamps stored in Cloud Firestore will be read
back as Firebase Timestamp objects instead of as system Date objects.
So you will also need to update code expecting a Date to instead
expect a Timestamp. For example:
// Old: const date = snapshot.get('created_at');
// New: const timestamp = snapshot.get('created_at'); const date =
timestamp.toDate();
Please audit all existing usages of Date when you enable the new
behavior. In a future release, the behavior will change to the new
behavior, so if you do not follow these steps, YOUR APP MAY BREAK.
Now I want to init my firestore correctly according to this warning. i'm using typescript.
import * as functions from 'firebase-functions';
import * as admin from 'firebase-admin';
admin.initializeApp(functions.config().firebase);
let fireStoreDB = fireStoreDB || admin.firestore()
the firestore() that return from admin doesn't have a .settings() method as described in the warning nor it gets an object in the constructor. (It gets an App Object).
so I have two questions:
How can init my firestore to get the settings object?
when I insert a date to a document or when I query a document do I also need to pass the Firestore.Timestamp object? or can i query/insert the normal JS Date object and it will get converted automatically?
Thanks.
EDIT:
i managed to solve it for http functions using :
if (!fireStoreDB){
fireStoreDB = admin.firestore();
fireStoreDB.settings(settings);
}
But it still is happening on firestore triggers.
anyone knows how to give default settings to admin on :
admin.initializeApp(functions.config().firebase);
so it will not happen on firestore triggers?
You are still receiving JS Date instead of Firestore Timestamp due to a bug... now fixed in Firebase Functions v2.0.2.
See: https://github.com/firebase/firebase-functions/releases/tag/v2.0.2.
For initialisation I've used admin.firestore().settings({timestampsInSnapshots: true}) as specified in warning message, so the warning has disappeared.
When you add a date to a Document, or use as a query parameter, you can use the normal JS Date object.
add below 2nd line code in your index.js firebase functions file
admin.initializeApp(functions.config().firebase);
admin.firestore().settings( { timestampsInSnapshots: true })
solved it the following way:
const settings = {timestampsInSnapshots: true};
if (!fireStoreDB){
fireStoreDB = admin.firestore();
fireStoreDB.settings(settings);
}
For firebase-admin version 7.0.0 or above
You should not be getting this error anymore.
In Version 7.0.0 - January 31, 2019 of firebase-admin there were some breaking changes introduced:
BREAKING: The timestampsInSnapshots default has changed to true.
The timestampsInSnapshots setting is now enabled by default so timestamp
fields read from a DocumentSnapshot will be returned as Timestamp objects
instead of Date. Any code expecting to receive a Date object must be
updated.
Note: As stated in the official docs, timestampsInSnapshots is going to be removed in a future release so make sure to remove it altogether.
For older versions of firebase-admin (6.5.1 and below)
This should do the work:
const admin = require('firebase-admin');
admin.initializeApp();
const firestore = admin.firestore();
// Add this magical line of code:
firestore.settings({ timestampsInSnapshots: true });
Then in your function use the firestore object directly:
firestore.doc(`/mycollection/${id}`).set({ it: 'works' })

How to update a document value with firebase cloud function

How can i update the value of a document on changing the value of another document.
I have raw-material document and finished-product document.
What i want to do is on changing the price of raw-material i want to update the price of finished-material
How can i do so ???
My code is like this so far
export const rawMaterialPriceChange = functions.database.ref('/raw-materials/{key}').onUpdate((snapshot)=>{
console.log('My key',snapshot.after.key);
var priceDiff = parseFloat(snapshot.after.val().price)-parseFloat(snapshot.before.val().price);
<HERE I WANT TO REFER ANOTHER DOCUMENT WITH SAME KEY AND UPDATE ITS VALUE
return true;
});
My firebase structure is like this:
Can anyone please help me ? Thank you
Found the solution from the following threads
Firebase HTTP Cloud Functions - Read database once
How to run query from inside of Cloud function?

Firebase Full-Text Search using Algolia

I configured different firebase functions by following this
. Now in this, there is firebase full-text search. I tried to follow it but it seems to be incomplete. I have searched and somehow got success in deploying. But it is still not creating index in Algolia. Can someone tell me the steps to correctly perform this?
I created the blog-posts and search nodes in my firebase project but problem is still there.
CODE:
'use strict';
const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);
// Authenticate to Algolia Database.
// TODO: Make sure you configure the `algolia.app_id` and `algolia.api_key` Google Cloud environment variables.
const algoliasearch = require('algoliasearch');
const client = algoliasearch(functions.config().algolia.app_id, functions.config().algolia.api_key);
// Name fo the algolia index for Blog posts content.
const ALGOLIA_POSTS_INDEX_NAME = 'blogposts';
// Updates the search index when new blog entries are created or updated.
exports.indexentry = functions.database.ref('/blog-posts/{blogid}/text').onWrite(event => {
const index = client.initIndex(ALGOLIA_POSTS_INDEX_NAME);
const firebaseObject = {
text: event.data.val(),
objectID: event.params.blogid
};
return index.saveObject(firebaseObject).then(
() => event.data.adminRef.parent.child('last_index_timestamp').set(
Date.parse(event.timestamp)));
});
// Starts a search query whenever a query is requested (by adding one to the `/search/queries`
// element. Search results are then written under `/search/results`.
exports.searchentry = functions.database.ref('/search/queries/{queryid}').onWrite(event => {
const index = client.initIndex(ALGOLIA_POSTS_INDEX_NAME);
const query = event.data.val().query;
const key = event.data.key;
return index.search(query).then(content => {
const updates = {
'/search/last_query_timestamp': Date.parse(event.timestamp)
};
updates[`/search/results/${key}`] = content;
return admin.database().ref().update(updates);
});
});
SEE IMAGE OF FIREBASE NODE
Open Image
Your help will be appreciated. Thanks
So I used the sample code provided here and placed it into a Firebase cloud function. Writing to '/blog-posts/{blogid}/text' inside the database should index whatever value is under text to Algolia.
There are a few things that might be going wrong here:
Check that your function is correctly placed into Firebase. You can do this from the console by clicking functions on the left side. You should see two functions named indexentry and searchentry. If you do not see those functions then you haven't correctly pushed your code to the Firebase cloud.
If you code is in Firebase cloud then I recommend adding console.log("write on blog-posts fired"); to your searchentry function. Then write some more data to your database under '/blog-posts/{blogid}/text'. You can check the function log in the Firebase console. I have noticed a slight delay in log records displaying some times, so be patient if you don't see it right away. I'd write a few pieces of data to '/blog-posts/{blogid}/text' then after a couple minutes I'd check the log. If the log has "write on blog-posts fired" in it then you know the function is being activated when you write to the database.
If all the above is operating correctly and you still don't have any data in Algolia then make sure you set your API keys. You can do this using the code firebase functions:config:set algolia.app_id="myAlgoliaAppId" algolia.api_key="myAlgoliaApiKey". You run this command in a terminal window inside the directory where you have your Firebase cloud functions. You can get you API keys by signing into your account. Remember not to share your API key with anyone.

Get Time in firebase database using angularfire2

I am using Angularfire2 and I'm tesing to build a chat app that pushes messages in the database. I want to get the time when the data is pushed. Your help is really appreciated. Thanks a lot!
Firebase uses a constant value which is replaced with a numeric timestamp when it is written to the database. This removes the need to track and synchronize the time across clients.
firebase.database.ServerValue.TIMESTAMP
You can then read the value of the reference that was just written to see the exact time.
var sessionsRef = firebase.database().ref('sessions');
var mySessionRef = sessionsRef.push();
mySessionRef.update({ startedAt: firebase.database.ServerValue.TIMESTAMP });
mySessionRef.once('value').then(function(dataSnapshot) {
var time = dataSnapshot.child('startedAt'); // the time when the data was written
});
firebase.database['ServerValue']['TIMESTAMP']

Resources