Feature: Added Login / Register Feature #3

Merged
igorpropisnov merged 26 commits from feature/register-view into main 2024-05-21 21:24:11 +02:00
8 changed files with 66 additions and 6 deletions
Showing only changes of commit 0be5c36194 - Show all commits

View File

@ -7,7 +7,7 @@ export class CorsMiddleware implements NestMiddleware {
constructor(private readonly configService: ConfigService) {} constructor(private readonly configService: ConfigService) {}
public use(req: Request, res: Response, next: NextFunction): void { public use(req: Request, res: Response, next: NextFunction): void {
if (this.configService.get<string>('NODE_ENV') === 'production') { if (this.configService.get<string>('NODE_ENV') === 'development') {
const allowedOrigin = this.configService.get<string>('CORS_ALLOW_ORIGIN'); const allowedOrigin = this.configService.get<string>('CORS_ALLOW_ORIGIN');
if (req.headers.origin === allowedOrigin) { if (req.headers.origin === allowedOrigin) {

View File

@ -1,4 +1,5 @@
import { CommonModule } from '@angular/common'; import { CommonModule } from '@angular/common';
import { HttpClientModule } from '@angular/common/http';
import { import {
ChangeDetectionStrategy, ChangeDetectionStrategy,
Component, Component,
@ -21,6 +22,8 @@ import { CheckboxModule } from 'primeng/checkbox';
import { InputTextModule } from 'primeng/inputtext'; import { InputTextModule } from 'primeng/inputtext';
import { PasswordModule } from 'primeng/password'; import { PasswordModule } from 'primeng/password';
import { AuthService } from '../../shared/service';
import { LoginCredentials } from '../../shared/types';
import { import {
customEmailValidator, customEmailValidator,
customPasswordValidator, customPasswordValidator,
@ -39,7 +42,9 @@ type AuthAction = 'register' | 'signup';
ButtonModule, ButtonModule,
CheckboxModule, CheckboxModule,
PasswordModule, PasswordModule,
HttpClientModule,
], ],
providers: [AuthService],
templateUrl: './register-root.component.html', templateUrl: './register-root.component.html',
styleUrl: './register-root.component.scss', styleUrl: './register-root.component.scss',
changeDetection: ChangeDetectionStrategy.OnPush, changeDetection: ChangeDetectionStrategy.OnPush,
@ -53,7 +58,10 @@ export class RegisterRootComponent implements OnInit {
public passwordInvalid: WritableSignal<string | null> = signal(null); public passwordInvalid: WritableSignal<string | null> = signal(null);
public termsInvalid: WritableSignal<string | null> = signal(null); public termsInvalid: WritableSignal<string | null> = signal(null);
public constructor(private readonly formBuilder: FormBuilder) { public constructor(
private readonly formBuilder: FormBuilder,
private readonly authService: AuthService
) {
effect(() => { effect(() => {
if (this.form) { if (this.form) {
if (this.isRegisterSignal()) { if (this.isRegisterSignal()) {
@ -197,11 +205,11 @@ export class RegisterRootComponent implements OnInit {
} }
} }
private signin(data: unknown): void { private signin(logiCredentials: LoginCredentials): void {
console.log(data); this.authService.signin(logiCredentials);
} }
private register(data: unknown): void { private register(logiCredentials: LoginCredentials): void {
console.log(data); this.authService.signup(logiCredentials);
} }
} }

View File

@ -0,0 +1,38 @@
import { HttpClient } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { Router } from '@angular/router';
import { environment } from '../../../environments/environment';
import { LoginCredentials, Tokens } from '../types';
@Injectable({
providedIn: 'root',
})
export class AuthService {
private isAuthenticated: boolean = false;
private access_token: string | null = null;
private refresh_token: string | null = null;
public constructor(
private readonly httpClient: HttpClient,
private readonly router: Router
) {}
public signin(credentials: LoginCredentials): void {
this.httpClient
.post<Tokens>(environment.api.base + '/api/auth/signin', credentials)
.subscribe((response: Tokens) => {
this.access_token = response.access_token;
this.refresh_token = response.refresh_token;
});
}
public signup(credentials: LoginCredentials): void {
this.httpClient
.post<Tokens>(environment.api.base + '/api/auth/signup', credentials)
.subscribe((response: Tokens) => {
this.access_token = response.access_token;
this.refresh_token = response.refresh_token;
});
}
}

View File

@ -0,0 +1 @@
export * from './auth.service';

View File

@ -0,0 +1,2 @@
export * from './login-credentials';
export * from './tokens';

View File

@ -0,0 +1,4 @@
export type LoginCredentials = {
email: string;
password: string;
};

View File

@ -0,0 +1,4 @@
export type Tokens = {
access_token: string;
refresh_token: string;
};

View File

@ -1,5 +1,8 @@
export const environment = { export const environment = {
production: false, production: false,
api: {
base: 'http://localhost:3000',
},
oauth: { oauth: {
clinetId: 'app_FLXnxSBnnaKkXoYCgk3J62iA', clinetId: 'app_FLXnxSBnnaKkXoYCgk3J62iA',
redirectUri: 'https://commonly-hot-airedale.ngrok-free.app/oauth', redirectUri: 'https://commonly-hot-airedale.ngrok-free.app/oauth',