Skip to content

Commit 76deac0

Browse files
authored
Add pagination (#452)
* Start pagination on books * Update README * Improve book pagination * Refactor components with a base class * Fix header menu * Update test paths
1 parent 939853a commit 76deac0

27 files changed

Lines changed: 253 additions & 319 deletions

README.md

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,23 @@
1-
# Keep track
1+
# Keeptrack
22

33
[![Build Status](https://dev.azure.com/devprofr/open-source/_apis/build/status/keeptrack-ci?branchName=master)](https://dev.azure.com/devprofr/open-source/_build/latest?definitionId=26&branchName=master)
44
[![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=devpro.keep-track&metric=alert_status)](https://sonarcloud.io/dashboard?id=devpro.keep-track)
55
[![Coverage](https://sonarcloud.io/api/project_badges/measure?project=devpro.keep-track&metric=coverage)](https://sonarcloud.io/dashboard?id=devpro.keep-track)
66

7-
KeepTrack is a free open source application to save a memory of what we do: reading a book, watching a movie or a serie, playing a video game.
7+
Keeptrack is a an open source application that let you save everything you read, watch, listen or play.
8+
9+
## Instances
10+
11+
This code is Cloud Native, it can be deployed to any kind of infrastructure.
12+
13+
A SaaS free version is currently available for early adopters (contact the repository owner to get an access).
814

915
## Software design
1016

11-
* [Angular 13 with Bootstrap](angular-bootstrap/README.md): Web app #1 (frontend #1)
12-
* [.NET 7.0](dotnet/README.md): ASP.NET REST API (backend) & Blazor web app (frontend #2)
17+
Application frontend is a [web application](angular-bootstrap/README.md) (Single Page Application) written in TypeScript (Angular 16+).
18+
19+
Application backend is a [web API](dotnet/README.md) (REST) written in C# (.NET 7+).
20+
21+
Application data is persisted in a MongoDB (7.0) database.
22+
23+
Application authentication is federated with Firebase Authentication and can be done from multiple providers (Google, GitHub, etc.).

angular-bootstrap/karma.conf.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,14 @@ module.exports = function (config) {
2121
'src/**/*.js': ['coverage']
2222
},
2323
coverageReporter: {
24-
dir: require('path').join(__dirname, '../coverage'),
24+
dir: require('path').join(__dirname, '/coverage'),
2525
reporters: [
2626
{ type: 'html', subdir: 'html' },
2727
{ type: 'lcovonly', subdir: '.', file: 'lcov.info' }
2828
]
2929
},
3030
junitReporter: {
31-
outputDir: require('path').join(__dirname, '..'),
31+
outputDir: require('path').join(__dirname, '.'),
3232
},
3333
reporters: ['progress', 'kjhtml', 'junit', 'coverage'],
3434
port: 9876,

angular-bootstrap/src/app/backend/services/book.service.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
import { TestBed } from '@angular/core/testing';
22
import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing';
3+
34
import { BookService } from './book.service';
45
import { Book } from '../types/book';
56
import { environment } from 'src/environments/environment.dev';
67

78
describe('BookService', () => {
8-
99
let bookService: BookService;
1010
let http: HttpTestingController;
1111

angular-bootstrap/src/app/backend/services/book.service.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,28 +4,29 @@ import { Observable } from 'rxjs';
44

55
import { environment } from 'src/environments/environment';
66
import { Book } from '../types/book';
7+
import { DataService } from './data.interface';
78

89
@Injectable({
910
providedIn: 'root'
1011
})
11-
export class BookService {
12-
12+
export class BookService implements DataService<Book> {
1313
constructor(private httpClient: HttpClient) {
1414
}
1515

1616
get(id: string): Observable<Book> {
1717
return this.httpClient.get<Book>(`${environment.keepTrackApiUrl}/api/books/${id}`);
1818
}
1919

20-
list(search?: string): Observable<Array<Book>> {
21-
return this.httpClient.get<Array<Book>>(`${environment.keepTrackApiUrl}/api/books?search=${search ?? ''}&page=0&pageSize=50`);
20+
list(search?: string, currentPage?: number, pageSize?: number): Observable<Array<Book>> {
21+
return this.httpClient.get<Array<Book>>(`${environment.keepTrackApiUrl}/api/books?search=${search ?? ''}&page=${currentPage ?? 0}&pageSize=${pageSize ?? 50}`);
2222
}
2323

2424
create(input: Book): Observable<Book> {
2525
return this.httpClient.post<Book>(`${environment.keepTrackApiUrl}/api/books`, input);
2626
}
2727

2828
update(input: Book): Observable<number> {
29+
delete input.isEditable;
2930
if (!input.finishedAt) {
3031
delete input.finishedAt;
3132
}
@@ -35,5 +36,4 @@ export class BookService {
3536
delete(input: Book): Observable<number> {
3637
return this.httpClient.delete<number>(`${environment.keepTrackApiUrl}/api/books/${input.id}`);
3738
}
38-
3939
}

angular-bootstrap/src/app/backend/services/car-history.service.ts

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,4 @@ import { Injectable } from '@angular/core';
44
providedIn: 'root'
55
})
66
export class CarHistoryService {
7-
8-
constructor() { }
9-
107
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import { Observable } from "rxjs";
2+
3+
export interface DataService<T> {
4+
get(id: string): Observable<T>;
5+
list(search?: string, currentPage?: number, pageSize?: number, filter?: T): Observable<Array<T>>;
6+
create(input: T): Observable<T>;
7+
update(input: T): Observable<number>;
8+
delete(input: T): Observable<number>;
9+
}

angular-bootstrap/src/app/backend/services/movie.service.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
import { TestBed } from '@angular/core/testing';
22
import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing';
3+
34
import { environment } from 'src/environments/environment.dev';
45
import { MovieService } from './movie.service';
56
import { Movie } from '../types/movie';
67

78
describe('MovieService', () => {
8-
99
let movieService: MovieService;
1010
let http: HttpTestingController;
1111

angular-bootstrap/src/app/backend/services/movie.service.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,29 +3,30 @@ import { HttpClient } from '@angular/common/http';
33
import { Observable } from 'rxjs';
44

55
import { environment } from 'src/environments/environment';
6+
import { DataService } from './data.interface';
67
import { Movie } from '../types/movie';
78

89
@Injectable({
910
providedIn: 'root'
1011
})
11-
export class MovieService {
12-
12+
export class MovieService implements DataService<Movie> {
1313
constructor(private httpClient: HttpClient) {
1414
}
1515

1616
get(id: string): Observable<Movie> {
1717
return this.httpClient.get<Movie>(`${environment.keepTrackApiUrl}/api/movies/${id}`);
1818
}
1919

20-
list(search?: string): Observable<Array<Movie>> {
21-
return this.httpClient.get<Array<Movie>>(`${environment.keepTrackApiUrl}/api/movies?search=${search ?? ''}&page=0&pageSize=50`);
20+
list(search?: string, currentPage?: number, pageSize?: number): Observable<Array<Movie>> {
21+
return this.httpClient.get<Array<Movie>>(`${environment.keepTrackApiUrl}/api/movies?search=${search ?? ''}&page=${currentPage ?? 0}&pageSize=${pageSize ?? 50}`);
2222
}
2323

2424
create(input: Movie): Observable<Movie> {
2525
return this.httpClient.post<Movie>(`${environment.keepTrackApiUrl}/api/movies`, input);
2626
}
2727

2828
update(input: Movie): Observable<number> {
29+
delete input.isEditable;
2930
if (!input.year) {
3031
delete input.year;
3132
}
@@ -36,5 +37,4 @@ export class MovieService {
3637
delete(input: Movie): Observable<number> {
3738
return this.httpClient.delete<number>(`${environment.keepTrackApiUrl}/api/movies/${input.id}`);
3839
}
39-
4040
}

angular-bootstrap/src/app/backend/services/tv-show.service.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
import { TestBed } from '@angular/core/testing';
22
import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing';
3+
34
import { environment } from 'src/environments/environment.dev';
45
import { TvShow } from '../types/tv-show';
56
import { TvShowService } from './tv-show.service';
67

78
describe('TvShowService', () => {
8-
99
let service: TvShowService;
1010
let http: HttpTestingController;
1111

angular-bootstrap/src/app/backend/services/tv-show.service.ts

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,25 +4,33 @@ import { Observable } from 'rxjs';
44

55
import { environment } from 'src/environments/environment';
66
import { TvShow } from '../types/tv-show';
7+
import { DataService } from './data.interface';
78

89
@Injectable({
910
providedIn: 'root'
1011
})
11-
export class TvShowService {
12-
12+
export class TvShowService implements DataService<TvShow> {
1313
constructor(private httpClient: HttpClient) {
1414
}
1515

16-
list(search?: string): Observable<Array<TvShow>> {
17-
return this.httpClient.get<Array<TvShow>>(`${environment.keepTrackApiUrl}/api/tv-shows?search=${search ?? ''}&page=0&pageSize=50`);
16+
get(id: string): Observable<TvShow> {
17+
return this.httpClient.get<TvShow>(`${environment.keepTrackApiUrl}/api/tv-shows/${id}`);
18+
}
19+
20+
list(search?: string, currentPage?: number, pageSize?: number): Observable<Array<TvShow>> {
21+
return this.httpClient.get<Array<TvShow>>(`${environment.keepTrackApiUrl}/api/tv-shows?search=${search ?? ''}&page=${currentPage ?? 0}&pageSize=${pageSize ?? 50}`);
1822
}
1923

2024
create(input: TvShow): Observable<TvShow> {
2125
return this.httpClient.post<TvShow>(`${environment.keepTrackApiUrl}/api/tv-shows`, input);
2226
}
2327

28+
update(input: TvShow): Observable<number> {
29+
delete input.isEditable;
30+
return this.httpClient.put<number>(`${environment.keepTrackApiUrl}/api/tv-shows/${input.id}`, input);
31+
}
32+
2433
delete(input: TvShow): Observable<number> {
2534
return this.httpClient.delete<number>(`${environment.keepTrackApiUrl}/api/tv-shows/${input.id}`);
2635
}
27-
2836
}

0 commit comments

Comments
 (0)