=========================
Part I - First Component
=========================
First Step – Adding login
=========================
The first step on this tutorial will be to add a login component to learn how to interact with the Bexstream backend API.
1 – Creating the login component
--------------------------------
``ng generate component login``
This command creates 3 files:
login.component.ts
login.component.html
login.component.less
2 – Adding the login form
--------------------------
.. highlight:: ts
Firstly the *User* model must be added to our application.
Create a folder called *“models”* under *“src/app/login”* and add a new file called *“user.ts”*.
Add the following code:
.. code-block::
:linenos:
:caption: user.ts
export class User {
id: string;
username: string;
email: string;
profileImage: string;
password: string;
hash: string;
description: string;
createdDate: Date;
token: string;
roles: any[];
organization: any;
constructor() {
this.id = '';
this.username = '';
this.email = '';
this.profileImage = '';
this.password = '';
this.hash = '';
this.description = '';
this.createdDate = new Date();
this.token = '';
this.roles = [];
}
}
Secondly add to the *login.component.ts* file the following code:
.. code-block::
:linenos:
:caption: login.component.ts
import { Component, OnInit } from '@angular/core';
import { FormBuilder } from '@angular/forms';
import { User } from './models/user';
@Component({
selector: 'app-login',
templateUrl: './login.component.html',
styleUrls: ['./login.component.less']
})
export class LoginComponent implements OnInit {
user: User = new User();
loginForm = this.formBuilder.group({
username: '',
password: ''
});
constructor(private formBuilder: FormBuilder) { }
ngOnInit(): void {
}
/**
* User authentication method
*/
public authenticate(): void {
}
}
Since we will be using ReactiveForms we need to add this module to our app module, located in *app.module.ts*.
.. code-block::
:linenos:
:caption: app.module.ts
:emphasize-lines: 3, 17
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { ReactiveFormsModule } from '@angular/forms';
import { AppRoutingModule } from './app-routing.module';
import { AppComponent } from './app.component';
import { LoginComponent } from './login/login.component';
@NgModule({
declarations: [
AppComponent,
LoginComponent
],
imports: [
BrowserModule,
AppRoutingModule,
ReactiveFormsModule,
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule { }
.. ATTENTION::
After adding a new module, we must restart our angular app. Stop the running ng serve and run it again.
Edit login.component.html with the following code:
.. code-block:: html+ng2
:linenos:
:caption: login.component.html
Login Form
3 – Adding the component to the app
-----------------------------------
First, clear *app.component.html* file and add the following line:
.. code-block:: html
:linenos:
:caption: app.component.html
The router-outlet turns our application into a single page application where to a certain route (ex. http://localhost:4200/drones) matches with a Component (ex. DroneListComponent).
Second, lets add a route and the corresponding component to the “routes” variable:
.. code-block:: TS
:linenos:
:caption: app-routing.module.ts
:emphasize-lines: 3, 6
import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
import { LoginComponent } from './login/login.component';
const routes: Routes = [
{ path: '', component: LoginComponent },
];
@NgModule({
imports: [RouterModule.forRoot(routes)],
exports: [RouterModule]
})
export class AppRoutingModule { }
In our case the root url (“/”) will show our LoginComponent.
4 – Invoking bexstream backend API
----------------------------------
We will use HTTP, to communicate with the bexstream API. So the first step is to import it to our App module in *app.module.ts*:
.. code-block::
:linenos:
:caption: app.module.ts
:emphasize-lines: 4, 18, 19
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { ReactiveFormsModule } from '@angular/forms';
import { HttpClientModule } from '@angular/common/http';
import { AppRoutingModule } from './app-routing.module';
import { AppComponent } from './app.component';
import { LoginComponent } from './login/login.component';
@NgModule({
declarations: [
AppComponent,
LoginComponent
],
imports: [
BrowserModule,
AppRoutingModule,
ReactiveFormsModule,
HttpClientModule
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule { }
Restart your angular app.
Afterwards, we will add the communication code to the authenticate method on *login.component.ts*:
.. code-block::
:linenos:
:caption: login.component.ts
:emphasize-lines: 3, 29-40
import { Component, OnInit } from '@angular/core';
import { FormBuilder } from '@angular/forms';
import { HttpClient } from '@angular/common/http';
import { User } from './models/user';
@Component({
selector: 'app-login',
templateUrl: './login.component.html',
styleUrls: ['./login.component.less']
})
export class LoginComponent implements OnInit {
user: User = new User();
loginForm = this.formBuilder.group({
username: '',
password: ''
});
constructor(private formBuilder: FormBuilder,
private http: HttpClient) { }
ngOnInit(): void {
}
/**
* User authentication method
*/
public authenticate(): void {
const loginFormValues = this.loginForm.value
this.user.username = loginFormValues.username;
this.user.password = loginFormValues.password;
this.http.post('https://bexstream-preprod.beyond-vision.com/api/v1/auth/user', this.user)
.subscribe((result) => {
if (result.user) {
alert(`${result.user.username} has been successfully logged in!`)
}
});
}
}
Finally, to test that you've complete the PART I, try to login with:
``user: drone-pilot-tutorial``
``pass: drone-pilot-tutorial``
If everything was done correctly, you should have an alert pop-up with the login result.
.. image:: ../../_static/images/bexstream/tutorial/login.webp
:align: center