Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
83 changes: 83 additions & 0 deletions mocks/data.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
{
"courses": [
{
"id": "1",
"title": "Video about Denmark",
"createdAtDate": "1/1/2019",
"durationTime": 120,
"topRated": true,
"authors": [],
"description": "Lorem, ipsum dolor sit amet consectetur adipisicing elit. Fuga at magni dignissimos accusamus asperiores enim corrupti nobis dolorem ducimus nostrum dolor, consequuntur, quia laudantium tempore? Neque doloremque eos rerum nulla. Fuga at magni dignissimos accusamus asperiores enim corrupti nobis dolorem ducimus nostrum dolor, consequuntur, quia laudantium tempore? Neque doloremque eos rerum nulla."
},
{
"id": "2",
"title": "Video about Canada",
"createdAtDate": "5/20/2020",
"durationTime": 180,
"authors": [
"me",
"me"
],
"description": "Lorem, ipsum dolor sit amet consectetur adipisicing elit. Fuga at magni dignissimos accusamus asperiores enim corrupti nobis dolorem ducimus nostrum dolor, consequuntur, quia laudantium tempore? Neque doloremque eos rerum nulla. Fuga at magni dignissimos accusamus asperiores enim corrupti nobis dolorem ducimus nostrum dolor, consequuntur, quia laudantium tempore? Neque doloremque eos rerum nulla."
},
{
"id": "3",
"title": "Video about Brazil",
"createdAtDate": "12/14/2021",
"durationTime": 180,
"topRated": false,
"authors": [
"me",
"me",
"id3"
],
"description": "Lorem, ipsum dolor sit amet consectetur adipisicing elit. Fuga at magni dignissimos accusamus asperiores enim corrupti nobis dolorem ducimus nostrum dolor, consequuntur, quia laudantium tempore? Neque doloremque eos rerum nulla. Fuga at magni dignissimos accusamus asperiores enim corrupti nobis dolorem ducimus nostrum dolor, consequuntur, quia laudantium tempore? Neque doloremque eos rerum nulla."
},
{
"id": "4",
"title": "Video about Australia",
"createdAtDate": "10/20/2020",
"durationTime": 132,
"topRated": false,
"authors": [
"me",
"me",
"id4"
],
"description": "Lorem, ipsum dolor sit amet consectetur adipisicing elit. Fuga at magni dignissimos accusamus asperiores enim corrupti nobis dolorem ducimus nostrum dolor, consequuntur, quia laudantium tempore? Neque doloremque eos rerum nulla. Fuga at magni dignissimos accusamus asperiores enim corrupti nobis dolorem ducimus nostrum dolor, consequuntur, quia laudantium tempore? Neque doloremque eos rerum nulla."
},
{
"id": "6",
"title": "Video about Sweden",
"createdAtDate": "1/1/2021",
"durationTime": 119,
"topRated": true,
"authors": [
"me",
"me",
"id6"
],
"description": "Lorem, ipsum dolor sit amet consectetur adipisicing elit. Fuga at magni dignissimos accusamus asperiores enim corrupti nobis dolorem ducimus nostrum dolor, consequuntur, quia laudantium tempore? Neque doloremque eos rerum nulla. Fuga at magni dignissimos accusamus asperiores enim corrupti nobis dolorem ducimus nostrum dolor, consequuntur, quia laudantium tempore? Neque doloremque eos rerum nulla."
},
{
"title": "New fantastic course !",
"createdAtDate": "2020-05-22T21:00:00.000Z",
"durationTime": "123",
"description": "Asd asd description ",
"authors": [
"me"
],
"id": "951abhdfm"
}
],
"users": [
{
"id": 1,
"firstName": "Vasya",
"lastName": "Pupkin",
"login": "vasya",
"password": "12345",
"token": "randomtoken_1234556789$"
}
]
}
5 changes: 5 additions & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 3 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@
"build": "ng build",
"test": "ng test",
"lint": "ng lint",
"e2e": "ng e2e"
"e2e": "ng e2e",
"mock:server": "json-server --watch mocks/data.json"
},
"private": true,
"dependencies": {
Expand All @@ -25,6 +26,7 @@
"@fortawesome/angular-fontawesome": "^0.6.1",
"@fortawesome/fontawesome-svg-core": "^1.2.28",
"@fortawesome/free-solid-svg-icons": "^5.13.0",
"ngx-pagination": "^5.0.0",
"rxjs": "~6.5.4",
"tslib": "^1.10.0",
"zone.js": "~0.10.2"
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

json-server было бы здорово установить локально)

Expand Down
12 changes: 7 additions & 5 deletions src/app/add-course-page/add-course-page.component.html
Original file line number Diff line number Diff line change
Expand Up @@ -37,11 +37,13 @@
</mat-form-field>
<mat-form-field class="add-course-form-date">
<mat-label>Date: </mat-label>
<input matInput [matDatepicker]="datapicker">
<mat-datepicker-toggle matSuffix [for]="datapicker">
<mat-icon matDatepickerToggleIcon>keyboard_arrow_down</mat-icon>
</mat-datepicker-toggle>
<mat-datepicker #datapicker></mat-datepicker>
<input
matInput
[matDatepicker]="picker"
(dateInput)="addEvent($event)"
>
<mat-datepicker-toggle matSuffix [for]="picker"></mat-datepicker-toggle>
<mat-datepicker #picker></mat-datepicker>
</mat-form-field>
<mat-form-field class="add-course-form-authors">
<mat-label>Authors: </mat-label>
Expand Down
24 changes: 16 additions & 8 deletions src/app/add-course-page/add-course-page.component.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import { Component, OnInit } from '@angular/core';
import { Component } from '@angular/core';
import { Router } from '@angular/router';
import { HomePageService } from '../core/services/home-page.service';
import { CourseItemInfo } from '../core/models';
import { MatDatepickerInputEvent } from '@angular/material/datepicker';

const coursesURL: string = '/courses';
@Component({
Expand All @@ -10,7 +11,6 @@ const coursesURL: string = '/courses';
styleUrls: ['./add-course-page.component.less']
})
export class AddCoursePageComponent {

public title: string;
public description: string;
public duration: number;
Expand All @@ -19,23 +19,31 @@ export class AddCoursePageComponent {

constructor (
private router: Router,
private homePageService: HomePageService
private homePageService: HomePageService,
) { }

public cancelClick(): void {
this.router.navigate([coursesURL]);
}

public addNewCourse(): void {
const sentDataCourse: CourseItemInfo[] = [{
const authorsArr: string[] = this.authors.split(', ');
const sentDataCourse: CourseItemInfo = {
title: this.title,
createdAtDate: this.datapicker,
durationTime: this.duration,
description: this.description,
authors: this.authors
}];
authors: authorsArr
};

this.homePageService.createCourse(sentDataCourse);
this.router.navigate([coursesURL]);
this.homePageService.createCourse(sentDataCourse).subscribe (
data => {
this.router.navigate([coursesURL]);
}
);
}

public addEvent(event: MatDatepickerInputEvent<Date>): void {
this.datapicker = event.value;
}
}
2 changes: 1 addition & 1 deletion src/app/breadcrumb/breadcrumb.module.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { BreadcrumbComponent } from './breadcrumb.component';
import { CreateBreadcrumbStringPipe } from '../core/pipes/createBreadcrumbString.pipe';
import { CreateBreadcrumbStringPipe } from '../core/pipes/create-breadcrumb-string.pipe';

@NgModule({
declarations: [
Expand Down
15 changes: 12 additions & 3 deletions src/app/core/core.module.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,20 @@
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { HTTP_INTERCEPTORS } from '@angular/common/http';
import { AuthInterceptor } from './services/auth-interceptors.service';

@NgModule({
declarations: [],
exports: [],
imports: [
CommonModule
]
providers: [
[
{
provide: HTTP_INTERCEPTORS,
useClass: AuthInterceptor,
multi: true
}
]
],
imports: [ CommonModule ]
})
export class CoreModule { }
4 changes: 2 additions & 2 deletions src/app/core/models/course-item.interface.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@

export interface CourseItemInfo {
id?: number;
id?: string;
title: string;
createdAtDate: Date;
durationTime: number;
description: string;
topRated?: boolean;
authors?: string;
authors?: string[];
}
31 changes: 31 additions & 0 deletions src/app/core/services/auth-interceptors.service.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import { Injectable } from '@angular/core';
import { HttpEvent, HttpHandler, HttpInterceptor, HttpSentEvent } from '@angular/common/http';
import { HttpRequest } from '@angular/common/http';
import { Observable } from 'rxjs';
import { AuthService } from './auth.service';
import { CourseItemInfo, UserInfo } from '../models';

@Injectable()
export class AuthInterceptor implements HttpInterceptor {
constructor(private authService: AuthService) {
}

public intercept(
req: HttpRequest<CourseItemInfo | UserInfo>,
next: HttpHandler
): Observable<HttpEvent<HttpSentEvent>> {
if (req.headers.get('SkipInterceptor')) {
return next.handle(req);
}

if (this.authService.isAuthentificated()) {
const clonedRequest: HttpRequest<CourseItemInfo | UserInfo> = req.clone({
headers: req.headers.set(
'X-CustomAuthHeader',
this.authService.getToken()
)
});
return next.handle(clonedRequest);
}
}
}
52 changes: 31 additions & 21 deletions src/app/core/services/auth.service.ts
Original file line number Diff line number Diff line change
@@ -1,35 +1,40 @@
import { Injectable } from '@angular/core';
import { fakeUserInfo } from '../mocks/mocked-user';
import { UserInfo } from '../models';
import { Observable, of } from 'rxjs';
import { Observable } from 'rxjs';
import { HttpClient } from '@angular/common/http';
import { map } from 'rxjs/operators';

@Injectable({
providedIn: 'root'
})
export class AuthService {
private userInfo: UserInfo;
private userUrl: string = 'http://localhost:3000/users';
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

лучше бы в константу


constructor() {
this.userInfo = fakeUserInfo;
}
constructor(
private http: HttpClient,
) { }

public getUserInfo(): UserInfo {
return this.userInfo;
public getUserInfo(): Observable<UserInfo> {
return this.http.get<UserInfo>(this.userUrl);
}

public userLogin(sentLogin: string, sentPassword: string): boolean {
const {
login,
password,
firstName,
lastName,
token
} = this.userInfo;

if (sentLogin === login && sentPassword === password && token) {
localStorage.setItem('userData', JSON.stringify({ firstName, lastName, token }));
}
return this.isAuthentificated();
public userLogin(sentLogin: string, sentPassword: string): Observable<boolean> {
return this.http.get<UserInfo>(this.userUrl, { headers: { SkipInterceptor: 'true' }})
.pipe(
map(data => {
const {
login,
password,
firstName,
lastName,
token
} = data[0];
if ((sentLogin === login) && (sentPassword === password) && token) {
localStorage.setItem('userData', JSON.stringify({ firstName, lastName, token }));
}
return this.isAuthentificated();
})
);
}

public userLogout(): boolean {
Expand All @@ -41,4 +46,9 @@ export class AuthService {
const userDataFromLS: UserInfo = JSON.parse(localStorage.getItem('userData'));
return userDataFromLS && !!userDataFromLS.token;
}

public getToken(): string {
const userDataFromLS: UserInfo = JSON.parse(localStorage.getItem('userData'));
return userDataFromLS.token;
}
}
Loading