Slide 1

Slide 1 text

GETTING STARTED WITH FIREBASE

Slide 2

Slide 2 text

HELLO! I am Wojtek Sznapka 2

Slide 3

Slide 3 text

Let’s talk about Typical* Single Page Application architecture *modern

Slide 4

Slide 4 text

DATA FLOW ⊗ REST API which queries database by some parameters ⊗ Returns data in JSON format (via Observable) ⊗ Displays it on frontend ⊗ Polls every second or so to get latest data* ⊗ *or use Websockets...

Slide 5

Slide 5 text

SAVING DATA INPUTTED BY USER ⊗ Handle form input ⊗ Send data to REST API ⊗ Check authorization ⊗ Save in database ⊗ Get back to the list (make sure to display new content if was created in the meantime)

Slide 6

Slide 6 text

THAT’S A LOT OF BORING WORK

Slide 7

Slide 7 text

⊗ Providing REST API (which has quite repetitive methods) ⊗ … or Websockets server to ensure better experience ⊗ Maintaining database ⊗ Managing users’ sessions and authorization

Slide 8

Slide 8 text

WHAT IF WE GET RID OF BACKEND? … and backend developers?

Slide 9

Slide 9 text

GOOGLE FIREBASE PLATFORM ⊗ Realtime database ⊗ Auth service ⊗ Hosting ⊗ Cloud functions ⊗ … and many more

Slide 10

Slide 10 text

FIRESTORE - realtime database ⊗ Cloud hosted ⊗ NoSQL database ⊗ Client libraries for Android, iOS, Javascript (Angular, React etc.) ⊗ Oriented around documents and collections (like MongoDB) ⊗ Realtime

Slide 11

Slide 11 text

FIRESTORE INSTALLATION ⊗ npm install firebase @angular/fire --save ⊗ Copy credentials to environment.ts ⊗ Import in module: @NgModule({ imports: [ AngularFireModule.initializeApp(environment.firebase), AngularFirestoreModule, // … ],

Slide 12

Slide 12 text

THE SIMPLEST COMPONENT export class AppComponent implements OnInit { meetupers$: Observable; constructor(private db: AngularFirestore) {} ngOnInit(): void { this.meetupers$ = this.db .collection('meetupers') .valueChanges(); } }

Slide 13

Slide 13 text

EVEN SIMPLER TEMPLATE

Welcome to Firebase meetupers opinion collector!

How would you rate Firebase's ease of use:

  • {{m.name}} {{m.score}} / 5

Slide 14

Slide 14 text

No content

Slide 15

Slide 15 text

SAVING DATA TEMPLATE {{opt}} Save

Slide 16

Slide 16 text

SAVING DATA METHOD export class AppComponent implements OnInit { name = new FormControl(''); score = new FormControl(''); save() { this.db.collection('meetupers').add({ name: this.name.value, score: parseInt(this.score.value), }).then(() => { this.name.setValue(null); this.score.setValue(null); console.log('Yass!'); });

Slide 17

Slide 17 text

BUT I NEED TO FILTER DATA!

Slide 18

Slide 18 text

LET’S TRIGGER FILTERING

Welcome to Firebase meetupers opinion collector!

Show only good reviews

Slide 19

Slide 19 text

HANDLING FILTERS propagandaMode() { this.meetupers$ = this.db.collection( 'meetupers', ref => ref.where('score', '>', 3) ).valueChanges(); } ⊗ Query options: where, orderBy, limit, startAt, startAfter, endAt, endBefore

Slide 20

Slide 20 text

FIRESTORE IS PUBLICLY AVAILABLE how’s that secure?

Slide 21

Slide 21 text

FIREBASE AUTH + DATABASE ⊗ Couple lines of code to setup authentication ⊚ Federated identity providers (FB, Google, Twitter, Github) ⊚ Email and password based protection ⊚ Custom auth system integration ⊗ Wide range of possibilities of protecting collections based on auth state ⊗ FirebaseUI handles sign-in flow

Slide 22

Slide 22 text

No content

Slide 23

Slide 23 text

USE AngularFireAuth authState: Observable; constructor(public auth: AngularFireAuth) {} ngOnInit() { this.authState = this.auth.authState; } login() { this.auth.auth.signInWithPopup( new auth.GoogleAuthProvider() ); }

Slide 24

Slide 24 text

HOW ABOUT LOGIC RELATED TO DATA? For example: send an email when new opinion is created

Slide 25

Slide 25 text

SERVERLESS! Here: Cloud Functions

Slide 26

Slide 26 text

CLOUD FUNCTIONS ⊗ JS/TS function being invoked on certain trigger ⊗ Trigger can be HTTP or related to Firestore document (change, create, delete) ⊗ Ability to run any JS/TS code with any dependencies based on event data firebase deploy --only functions

Slide 27

Slide 27 text

No content

Slide 28

Slide 28 text

CLOUD FUNCTIONS - PREPARE import * as functions from 'firebase-functions'; import * as nodemailer from 'nodemailer'; const mailTransport = nodemailer.createTransport({ service: 'gmail', auth: { user: '***', pass: '*** }, // better: use ENV vars });

Slide 29

Slide 29 text

CLOUD FUNCTIONS - FIRESTORE ONWRITE exports.sendEmail = functions.firestore.document('/meetupers/{uid}').onWrite(async (change) => { const meetuper = change.after; await mailTransport.sendMail({ from: '[email protected]', to: '[email protected]', subject: `${meetuper.get('name')}: ${meetuper.get('score')} / 5`, text: 'Yass!', }); return null; });

Slide 30

Slide 30 text

THANKS! Any questions? You can find me at: twitter: @sznapka email: [email protected]