Skip to content

Commit

Permalink
feat: finalize
Browse files Browse the repository at this point in the history
  • Loading branch information
Haze272 committed Dec 25, 2024
1 parent 875816d commit ba054b2
Show file tree
Hide file tree
Showing 14 changed files with 218 additions and 52 deletions.
6 changes: 4 additions & 2 deletions backend/src/iam/authentication/authentication.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,10 @@ export class AuthenticationController {
constructor(private readonly authService: AuthenticationService) {}

@Post('sign-up')
signUp(@Body() signUpDto: SignUpDto) {
return this.authService.signUp(signUpDto);
async signUp(@Body() signUpDto: SignUpDto) {
await this.authService.signUp(signUpDto);

return {};
}

// Cookies realization
Expand Down
4 changes: 4 additions & 0 deletions backend/src/iam/authentication/authentication.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,10 @@ export class AuthenticationService {
user.email = signUpDto.email;
user.password = await this.hashingService.hash(signUpDto.password);
user.roles = [await this.rolesRepository.findOneBy({ name: 'user' })];
user.name = signUpDto.name;
user.surname = signUpDto.surname;
user.patronymic = signUpDto.patronymic;
user.phone = signUpDto.phone;

await this.usersRepository.save(user);
} catch (err) {
Expand Down
5 changes: 5 additions & 0 deletions backend/src/iam/authentication/dto/sign-up.dto.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,9 @@ export class SignUpDto {

@MinLength(10)
password: string;

name: string;
surname: string;
patronymic: string;
phone: string;
}
Original file line number Diff line number Diff line change
@@ -1,3 +1,18 @@
<section class="page">
<h1 class="aurora">Дашборд</h1>

<div class="dashboard">
<p-card header="Бронирования">
<p>Всего бронирований: <span class="aurora">{{ (books$ | async)?.length }}</span></p>
</p-card>
<p-card header="Пользователей">
<p>Всего пользователей: <span class="aurora">{{ (users$ | async)?.length }}</span></p>
</p-card>
<p-card header="Номера">
<p>Всего номеров: <span class="aurora">{{ (rooms$ | async)?.length }}</span></p>
<p>Номера "Стандарт": <span class="aurora">{{ (roomsStandart$ | async)?.length }}</span></p>
<p>Номера "Комфорт": <span class="aurora">{{ (roomsComfort$ | async)?.length }}</span></p>
<p>Номер "Люкс": <span class="aurora">{{ (roomsLux$ | async)?.length }}</span></p>
</p-card>
</div>
</section>
Original file line number Diff line number Diff line change
@@ -1,16 +1,6 @@
.dialog {
display: flex;
flex-direction: column;
gap: var(--spacing-04);

&__form {
display: flex;
flex-direction: column;
gap: var(--spacing-03);
}

&__actions {
display: flex;
gap: var(--spacing-03);
}
.dashboard {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(200px, 350px));
justify-content: space-between;
gap: var(--spacing-06);
}
Original file line number Diff line number Diff line change
@@ -1,14 +1,53 @@
import {ChangeDetectionStrategy, Component, inject} from '@angular/core';
import {ChangeDetectionStrategy, Component, inject, OnInit} from '@angular/core';
import {AdminService} from '../../services/admin.service';
import {Card} from 'primeng/card';
import {Booking} from '../../../booking/models/booking.model';
import {User} from '../../../iam/models/user.model';
import {Room} from '../../../booking/models/room.model';
import {map, Observable} from 'rxjs';
import {AsyncPipe} from '@angular/common';

@Component({
selector: 'app-admin-home-page',
imports: [],
imports: [
Card,
AsyncPipe
],
templateUrl: './admin-home-page.component.html',
styleUrl: './admin-home-page.component.scss',
changeDetection: ChangeDetectionStrategy.OnPush
})
export class AdminHomePageComponent {
export class AdminHomePageComponent implements OnInit {
private readonly adminService = inject(AdminService);

private destroy$ = new Observable<void>();

books$ = new Observable<Booking[]>();

users$ = new Observable<User[]>();

rooms$ = new Observable<Room[]>();
roomsStandart$ = new Observable<Room[]>();
roomsComfort$ = new Observable<Room[]>();
roomsLux$ = new Observable<Room[]>();

ngOnInit() {
this.books$ = this.adminService.getAllBookings();

this.users$ = this.adminService.getAllUsers();

this.rooms$ = this.adminService.getAllRooms();

this.roomsStandart$ = this.rooms$.pipe(map(rooms => {
return rooms.filter(room => room.roomType.id === 1);
}));

this.roomsComfort$ = this.rooms$.pipe(map(rooms => {
return rooms.filter(room => room.roomType.id === 2);
}));

this.roomsLux$ = this.rooms$.pipe(map(rooms => {
return rooms.filter(room => room.roomType.id === 3);
}));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ <h3>Бронирование #{{ booking.id }}</h3>
<p>
<a [routerLink]="['/book/room/', booking.room.id]" class="booking__link">Комната</a>
</p>
<h4>Действия:</h4>
<p-button (click)="cancelBooking(booking.id)" label="Отменить"></p-button>
</div>
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,14 @@ <h1>Авторизация</h1>
</p-iftalabel>

<p-iftalabel>
<p-password inputId="password" formControlName="password" />
<p-password [feedback]="false" inputId="password" formControlName="password" />
<label for="password">Пароль</label>
</p-iftalabel>

<p class="link">
Нет аккаунта? <a [routerLink]="['/auth/sign-up']">Зарегистрироваться</a>
</p>

<p-button label="Войти" type="submit" />
</form>
</div>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,13 @@
gap: var(--spacing-04);
align-items: center;
}

.link {
a {
text-decoration: underline;
color: var(--primary-color)
}
}
}
}

Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import {ChangeDetectionStrategy, Component, inject, OnDestroy, OnInit} from '@angular/core';
import {AuthService} from '../../services/auth.service';
import {ActivatedRoute, Router} from '@angular/router';
import {ActivatedRoute, Router, RouterLink} from '@angular/router';
import {FormControl, FormGroup, ReactiveFormsModule, Validators} from '@angular/forms';
import {Subject, switchMap, takeUntil} from 'rxjs';
import {Button} from 'primeng/button';
Expand All @@ -15,7 +15,8 @@ import {Password} from 'primeng/password';
Button,
IftaLabel,
InputText,
Password
Password,
RouterLink
],
templateUrl: './sign-in-page.component.html',
styleUrl: './sign-in-page.component.scss',
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,54 @@
<form [formGroup]="signUpForm" (ngSubmit)="signUp()">
<input formControlName="username" type="text" placeholder="Имя пользователя">
<section class="page page-auth">
<div class="auth-form">
<h1>Регистрация</h1>

<input formControlName="email" type="email" placeholder="Электронная почта">
<form [formGroup]="signUpForm" (ngSubmit)="signUp()">
<p-iftalabel>
<input pInputText formControlName="surname" id="surname" autocomplete="off" />

<input formControlName="password" type="password" placeholder="Пароль">
<label for="surname">Фамилия</label>
</p-iftalabel>

<button>Войти</button>
</form>
<p-iftalabel>
<input pInputText formControlName="name" id="name" autocomplete="off" />

<label for="name">Имя</label>
</p-iftalabel>

<p-iftalabel>
<input pInputText formControlName="patronymic" id="patronymic" autocomplete="off" />

<label for="patronymic">Отчество</label>
</p-iftalabel>

<p-iftalabel>
<input pInputText formControlName="phone" id="phone" autocomplete="off" />

<label for="phone">Номер телефона</label>
</p-iftalabel>

<p-iftalabel>
<input pInputText formControlName="username" id="username" autocomplete="off" />

<label for="username">Логин</label>
</p-iftalabel>

<p-iftalabel>
<input pInputText formControlName="email" id="email" autocomplete="off" />

<label for="email">Электронная почта</label>
</p-iftalabel>

<p-iftalabel>
<p-password inputId="password" formControlName="password" />
<label for="password">Пароль</label>
</p-iftalabel>

<p class="link">
Уже есть аккаунт? <a [routerLink]="['/auth/log-in']">Войти</a>
</p>

<p-button label="Зарегистрироваться" type="submit" />
</form>
</div>
</section>
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
.page-auth {
justify-content: center;
align-items: center;

.auth-form {
background-color: var(--overlay-background);
border-radius: 8px;
padding: var(--spacing-06);

display: flex;
flex-direction: column;
gap: var(--spacing-05);

max-width: 500px;

h1 {
font-size: 1.75rem;
text-align: center;
}

form {
display: flex;
flex-direction: column;
gap: var(--spacing-04);
align-items: center;
}

.link {
a {
text-decoration: underline;
color: var(--primary-color)
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,54 +2,78 @@ import {ChangeDetectionStrategy, Component, inject, OnDestroy, OnInit} from '@an
import {AuthService} from '../../services/auth.service';
import {FormControl, FormGroup, ReactiveFormsModule, Validators} from "@angular/forms";
import {Subject, switchMap, takeUntil} from 'rxjs';
import {Button} from 'primeng/button';
import {IftaLabel} from 'primeng/iftalabel';
import {InputText} from 'primeng/inputtext';
import {Password} from 'primeng/password';
import {Router, RouterLink} from '@angular/router';
import {MessageService} from 'primeng/api';

@Component({
selector: 'app-sign-up-page',
imports: [
ReactiveFormsModule
],
imports: [
ReactiveFormsModule,
Button,
IftaLabel,
InputText,
Password,
RouterLink
],
templateUrl: './sign-up-page.component.html',
styleUrl: './sign-up-page.component.scss',
changeDetection: ChangeDetectionStrategy.OnPush
})
export class SignUpPageComponent implements OnInit, OnDestroy {
private readonly router = inject(Router);
private readonly messageService = inject(MessageService);
private readonly authService = inject(AuthService);

#destroy$ = new Subject<void>()

signUpForm!: FormGroup;
signUpProcess$ = new Subject<{ username: string, email: string, password: string }>();
signUpProcess$ = new Subject<void>();

ngOnInit() {
this.signUpForm = new FormGroup({
username: new FormControl<string | null>(null, Validators.required),
email: new FormControl<string | null>(null, {validators: [Validators.required, Validators.email]}),
password: new FormControl<string | null>(null, Validators.required),
surname: new FormControl<string | null>(null, Validators.required),
name: new FormControl<string | null>(null, Validators.required),
patronymic: new FormControl<string | null>(null, Validators.required),
phone: new FormControl<string | null>(null, Validators.required),
});

this.signUpProcess$
.pipe(
takeUntil(this.#destroy$),
switchMap(({email, username, password}) => {
return this.authService.signUp(username, email, password)
switchMap(() => {
return this.authService.signUp(this.signUpForm.value)
}),
)
.subscribe({
next: () => {
console.log("Reg success")
},
error: (err) => {
console.error("Auth error")
next: (v => {
this.messageService.add({
severity: 'success',
summary: 'Успех',
detail: 'Аккаунт успешно зарегистрирован! Войдите с введенными данными',
life: 5000
});
this.router.navigateByUrl('/auth/log-in');
}),
error: err => {
this.messageService.add({
severity: 'error',
summary: 'Ошибка',
detail: 'Произошла ошибка! Обратитесь в поддержку',
life: 3000
});
}
});
}

signUp() {
this.signUpProcess$.next({
username: this.signUpForm.controls['username'].value,
email: this.signUpForm.controls['email'].value,
password: this.signUpForm.controls['password'].value
});
this.signUpProcess$.next();
}

ngOnDestroy() {
Expand Down
8 changes: 2 additions & 6 deletions frontend/src/app/features/iam/services/auth.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -44,14 +44,10 @@ export class AuthService {
}

// TODO протестировать регистрацию и диалог
signUp(username: string, email: string, password: string) {
signUp(userCred: Partial<User>) {
return this.http.post(
this.configService.config.auth.url + '/authentication/sign-up',
{
username: username,
email: email,
password: password
},
userCred,
{
withCredentials: true
}
Expand Down

0 comments on commit ba054b2

Please sign in to comment.