Angular 10/9 Firebase/Firestore Database CRUD

Angular 10/9 Firebase/Firestore Database CRUD

In this tutorial, you'll be using Angular 10/9 with Firebase and Firestore database to create an app that implements the common CRUD operations.

You can also read how to use your own self-hosted database with Node and TypeORM.

We'll see step by step how to set up Firebase in our Angular 10 project, and create a service for implementing Firebase CRUD operations using the Firestore realtime database.

Angular 10 CRUD with Firebase and Firestore Database

These are the steps of our Angular 10 Firebase CRUD tutorial:

  • Step 1 - Creating your Angular 10 Project
  • Step 2 - Creating a Firebase Project and a Firestore Database
  • Step 3 - Installing and Adding Firebase to your Angular 10 Project.
  • Step 4 - Create an Angular 10 Model
  • Step 5 - Creating an Angular 10 Service
  • Step 6 - Creating a Component for Making CRUD Operations

What is CRUD?

CRUD stands for Create, Read, Update and Delete and refer to the operations that we run against a database to create, retrieve, update and delete data. In this example, the database is a Firestore database that exists on the cloud.

Note: This tutorial works with Angular 9.

Prerequisites

Before starting this tutorial, you first need to make sure, you have:

  • A recent version of Node.js (v10+) and NPM installed on your system,
  • The latest Angular CLI 10 installed on your system.

If you have the prerequisites, you are ready to start creating your project!

Step 1 - Creating your Angular 10 Project

The first step in this tutorial is creating a new Angular 10 project using the CLI.

Head over to your terminal and run the following command:

$ ng new angular-firebase-crud

The CLI will ask if you want to add routing to your project (you can choose any option you want) and which style sheet format you want to use (You can select CSS).

After that, your project files will be generated and your project's dependencies will be installed.

Step 2 - Creating a Firebase Project and a Firestore Database

Now that your project is generated, you need to proceed with creating a Firebase project and a Firestore database. For this matter, you simply need to go to the Firebase Console and create a new Firebase project.

Next head to the Project Overview >Develop >Database page and create a new Firestore database. For now, make sure you enable test mode so you don't need any permissions to access the database.

Step 3 - Installing and Adding Firebase to your Angular 10 Project.

After creating your Firebase project and your Firestore database you next need to install the firebase and @angular/fire packages as follows:

$ cd ./angular-firebase-crud
$ npm install --save firebase @angular/fire

Next go to your Firebase project overview then click on web and copy the config data.

Next, open the environments/environment.ts file in your Angular 10 project and add the firebaseConfig object inside the environment object.

export const environment = {
  production: false,
  firebaseConfig : {
    apiKey: "YOUR_API_KEY",
    authDomain: "YOUR_AUTH_DOMAIN",
    databaseURL: "YOUR_DATABASE_URL",
    projectId: "YOUR_PROJECT_ID",
    storageBucket: "YOUR_STORAGE_BUCKET",
    messagingSenderId: "YOUR_MESSAGING_SENDER_ID"
  }
};

Finally, you have to set up Firebase in your project. Open the src/app/app.module.ts file and update it accordingly:

import { AngularFireModule } from '@angular/fire';
import { AngularFireDatabaseModule } from '@angular/fire/database';
import { environment } from '../environments/environment';

@NgModule({
        // [...]
    imports: [
        // [...]
        AngularFireModule.initializeApp(environment.firebaseConfig),
        AngularFireDatabaseModule
    ],

You simply import AngularFireModule and AngularFireDatabaseModule and you add them to the imports array of the main application module.

You also call the initializeApp() method of AngularFireModule to pass the configuration object that you added earlier to the environments/environment.ts file.

That's it, you now have added Firebase and Firestore to your Angular 10 project.

Step 4 - Create an Angular 10 Model

After setting up Firestore in your project, you can proceed with creating a model class. In the simple example, we suppose that you are creating an insurance app where we need to manage a set of policies.

An insurance application will often contain more that one type of data like clients, employees and policies etc. In this example, we'll just focus on the policy entity.

Let's create a model for our insurance policy entity as follows:

$ ng g class policy --type=model

Next, open the src/policy.model.ts file and update it as follows:

export class Policy {
    id: string;
    policyNumber: string;
    creationDate: Date;
    effectiveDate: Date;
    expireDate: Date;
    paymentOption: string;
    policyAmount: number;
    extraInfo: string;
}

This is an example of an insurance policy with many fields and relationships with other entities omitted for the sake of simplicity.

Step 5 - Creating an Angular 10 Service

An Angular service allows you to encapsulate the code that could be repeated in many places in your project. Using the Angular CLI, run the following command to generate a service:

$ ng g service policy

Next, open the src/policy.service.ts file and update it accordingly.

First, import AngularFirestore and the Policy model as follows:

import { AngularFirestore } from '@angular/fire/firestore';
import { Policy } from 'src/app/policy.model';

Next, inject AngularFirestore in your service via its constructor:

export class PolicyService {
  constructor(private firestore: AngularFirestore) { }
}

Next, add the getPolicies() method to retrieve the available policies from the Firestore collection:

getPolicies() {
    return this.firestore.collection('policies').snapshotChanges();
}

You also need to add the createPolicy() method to persist an insurance policy in the Firestore database:

createPolicy(policy: Policy){
    return this.firestore.collection('policies').add(policy);
}

Next, you need to add the updatePolicy() method to update an insurance policy by its identifier:

updatePolicy(policy: Policy){
    delete policy.id;
    this.firestore.doc('policies/' + policy.id).update(policy);
}

Finally, you can add the deletePolicy() method to delete an insurance policy by its identifier:

deletePolicy(policyId: string){
    this.firestore.doc('policies/' + policyId).delete();
}

Step 6 - Creating a Component for Making CRUD Operations

After creating the model and service for creating, reading, updating and deleting insurance policies, you now need to create the component for testing our methods:

Using Angular CLI 10 run the following command to generate a component:

$ ng g c policy-list

Now, open the src/app/policy-list/policy-list.component.ts file and update it accordingly:

import { Component, OnInit } from '@angular/core';
import { PolicyService } from 'src/app/policy.service';
import { Policy } from 'src/app/policy.model';

@Component({
  selector: 'policy-list',
  templateUrl: './policy-list.component.html',
  styleUrls: ['./policy-list.component.css']
})
export class PolicyListComponent implements OnInit {

  policies: Policy[];
  constructor(private policyService: PolicyService) { }

  ngOnInit() {
    this.policyService.getPolicies().subscribe(data => {
      this.policies = data.map(e => {
        return {
          id: e.payload.doc.id,
          ...e.payload.doc.data()
        } as Policy;
      })
    });
  }

  create(policy: Policy){
      this.policyService.createPolicy(policy);
  }

  update(policy: Policy) {
    this.policyService.updatePolicy(policy);
  }

  delete(id: string) {
    this.policyService.deletePolicy(id);
  }
}

Updating the Component Template

Now let's update the component's template to display the insurance policies and also display buttons that can be used to create, update and delete policies:

Open the src/app/policy-list.component.html file and add the following HTML markup:

<table>
  <thead>
    <th>Number</th>
    <th>Created At</th>
    <th>Expire At</th>
    <th>Amount</th>
  </thead>
  <tbody>
    <tr *ngFor="let policy of policies">

      <td>{{policy.policyNumber}}</td>
      <td>{{policy.creationDate}}</td>
      <td>{{policy.expireDate}}</td>
      <td>{{policy.policyAmount}}</td>
      <td>
          <button (click)="delete(policy.id)">Delete</button>
      </td>
    </tr>
  </tbody>
</table>

Below the <table> markup, you can also add a form to create an insurance policy.

Conclusion

In this tutorial, we've seen by example how to add Firebase CRUD operations to your Angular 10 project that allow you to create, read, update and delete data from a Firestore database.


  • Date: