Skip to content

Commit 018b54f

Browse files
committed
🛂 add folder guard
1 parent 1b73d0c commit 018b54f

14 files changed

+129
-38
lines changed

src/app/core/components/header/header.component.scss

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ header {
3333

3434
& input.icon {
3535
background: var(--bg-sidebar);
36-
border: var(--border-input);
36+
border: 1px solid transparent;
3737
border-radius: 1rem;
3838
width: 100%;
3939
min-width: 0;
@@ -43,6 +43,13 @@ header {
4343
transition: 0.2s;
4444
box-shadow: var(--box-shadow);
4545

46+
&:focus {
47+
border: 1px solid var(--border-input);
48+
background: var(--bg-2);
49+
color: var(--fc-primary);
50+
outline: 0;
51+
}
52+
4653
& ~ i {
4754
top: 15px;
4855
left: 20px;
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import { TestBed } from '@angular/core/testing';
2+
3+
import { FolderGuard } from './folder.guard';
4+
5+
describe('FolderGuard', () => {
6+
let guard: FolderGuard;
7+
8+
beforeEach(() => {
9+
TestBed.configureTestingModule({});
10+
guard = TestBed.inject(FolderGuard);
11+
});
12+
13+
it('should be created', () => {
14+
expect(guard).toBeTruthy();
15+
});
16+
});

src/app/core/guards/folder.guard.ts

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import { Injectable } from '@angular/core';
2+
import { ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot, UrlTree } from '@angular/router';
3+
import { FolderService } from '@services/folder.service';
4+
import { isMongoId } from '@utils/mongo.util';
5+
import { Observable, tap } from 'rxjs';
6+
7+
@Injectable({
8+
providedIn: 'root'
9+
})
10+
export class FolderGuard implements CanActivate {
11+
12+
constructor(
13+
private folderService: FolderService,
14+
private router: Router
15+
) {}
16+
17+
canActivate(route: ActivatedRouteSnapshot)
18+
: Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree {
19+
const folderId = route.params['folderId'];
20+
if(!isMongoId(folderId)) return this.router.navigate(['/']);
21+
return this.folderService.getFolder(folderId).pipe(tap((hasAccess: boolean) => {
22+
if(!hasAccess) {
23+
return this.router.navigate(['/']);
24+
}
25+
}));
26+
}
27+
}

src/app/core/services/folder.service.ts

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { HttpClient } from '@angular/common/http';
22
import { EventEmitter, Injectable } from '@angular/core';
33
import { environment } from 'environments/environment';
44

5-
import { Observable, map } from 'rxjs';
5+
import { Observable, catchError, map, of } from 'rxjs';
66

77
import { Folder } from '@models/folder.model';
88

@@ -17,6 +17,7 @@ const base_url = environment.base_url;
1717
})
1818
export class FolderService {
1919
folderCreated: EventEmitter<Folder> = new EventEmitter();
20+
folderTemp: Folder;
2021

2122
get headers() {
2223
return {
@@ -39,8 +40,14 @@ export class FolderService {
3940
});
4041
}
4142

42-
getFolder(folderID: string): Observable<Folder> {
43+
getFolder(folderID: string): Observable<boolean> {
4344
const url = `${base_url}/folder/${folderID}`;
44-
return this.http.get<IFolderResponse>(url, this.headers).pipe(map(resp => resp.folder));
45+
return this.http.get<IFolderResponse>(url, this.headers)
46+
.pipe(map(resp => {
47+
const { folder } = resp;
48+
if(!folder) return false;
49+
this.folderTemp = folder;
50+
return true;
51+
}), catchError(() => of(false)));
4552
}
4653
}

src/app/features/folder/folder.component.html

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
<div class="fluid-container" *ngIf="!loading">
1+
<div class="fluid-container" *ngIf="!loading && folder">
22
<app-actions [folder]="folder"></app-actions>
3-
<div class="not-items" *ngIf="!allFiles.length && !allFiles.length">
3+
<div class="not-items" *ngIf="!allFiles.length">
44
<img src="assets/images/no-files.svg" alt="no-files-image">
55
<span class="description">Agrega tu primer archivo o carpeta</span>
66
</div>
7-
<div class="files" *ngIf="allFiles.length && allFiles.length">
7+
<div class="files" *ngIf="allFiles.length">
88
<section class="group">
99
<span class="title">Files</span>
1010
<div class="items">

src/app/features/folder/folder.component.ts

Lines changed: 5 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import { Component, OnDestroy, OnInit } from '@angular/core';
2-
import { ActivatedRoute, Router } from '@angular/router';
32

43
import { Subscription } from 'rxjs';
54

@@ -9,7 +8,6 @@ import { FolderService } from '@services/folder.service';
98
import { File } from '@models/file.model';
109
import { Folder } from '@models/folder.model';
1110

12-
import { isMongoId } from '@utils/mongo.util';
1311
@Component({
1412
selector: 'app-folder',
1513
templateUrl: './folder.component.html',
@@ -23,8 +21,6 @@ export class FolderComponent implements OnInit, OnDestroy {
2321
allFiles: (Folder | File)[];
2422

2523
constructor(
26-
private activatedRoute: ActivatedRoute,
27-
private router: Router,
2824
private folderService: FolderService,
2925
private fileService: FileService,
3026
) { }
@@ -44,21 +40,14 @@ export class FolderComponent implements OnInit, OnDestroy {
4440
this.folder.files.push(...files);
4541
this.mixFilesAndFolders();
4642
});
47-
this.activatedRoute.params.subscribe(({folderId}) => {
48-
if(!isMongoId(folderId)) return this.router.navigate(['/']);
49-
this.getFolder(folderId);
50-
});
43+
this.getFolder();
5144
}
5245

53-
getFolder(id: string): void {
46+
getFolder(): void {
5447
this.loading = true;
55-
this.folderService.getFolder(id).subscribe({
56-
next: (folder) => {
57-
this.folder = folder;
58-
this.mixFilesAndFolders();
59-
},
60-
complete: () => this.loading = false
61-
});
48+
this.folder = this.folderService.folderTemp;
49+
this.mixFilesAndFolders();
50+
this.loading = false;
6251
}
6352

6453
private orderFolders(): void {

src/app/features/folder/folder.routing.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,12 @@ import { NgModule } from "@angular/core";
22
import { RouterModule, Routes } from "@angular/router";
33

44
import { FolderComponent } from "./folder.component";
5+
import { FolderGuard } from "@guards/folder.guard";
56

67
const childRoutes: Routes = [
78
{
89
path: ':folderId',
10+
canActivate: [FolderGuard],
911
component: FolderComponent
1012
},
1113
];

src/app/features/home/components/components.module.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { DropdownsModule } from '@shared/dropdowns/dropdowns.module';
55

66
import { FileComponent } from './file/file.component';
77
import { FolderComponent } from './folder/folder.component';
8+
import { RouterModule } from '@angular/router';
89

910
@NgModule({
1011
declarations: [
@@ -13,7 +14,8 @@ import { FolderComponent } from './folder/folder.component';
1314
],
1415
imports: [
1516
CommonModule,
16-
DropdownsModule
17+
DropdownsModule,
18+
RouterModule
1719
],
1820
exports: [
1921
FileComponent,
Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1-
<div class="icon">
2-
<i class="bx " [ngClass]="getIcon"></i>
1+
<div class="file">
2+
<div class="icon">
3+
<i class="bx " [ngClass]="getIcon"></i>
4+
</div>
5+
<span class="name">{{ file.name }}</span>
36
</div>
4-
<span class="name">{{ file.name }}</span>
57
<app-dots-dropdown class="actions"></app-dots-dropdown>

src/app/features/home/components/file/file.component.scss

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,16 @@
11
@import 'settings/_colors.scss';
22
@import 'settings/_typography.scss';
33

4+
.file {
5+
display: flex;
6+
flex-direction: row;
7+
align-items: center;
8+
padding: 0.6rem 0 0.6rem 1rem;
9+
gap: 0.8rem;
10+
flex: 1;
11+
width: 80%;
12+
}
13+
414
.name {
515
@include fs-5;
616
@include fw-400;
@@ -15,3 +25,7 @@
1525
@include fs-2;
1626
color: var(--fc-primary);
1727
}
28+
29+
.actions {
30+
margin-right: 1rem;
31+
}

0 commit comments

Comments
 (0)