Adding a /genre route (still need polish)

This commit is contained in:
Zoe Roux 2020-09-25 00:25:18 +02:00
parent 52797d869c
commit 530338aa94
3 changed files with 24 additions and 8 deletions

View File

@ -35,6 +35,12 @@ const routes: Routes = [
canActivate: [AuthGuard.forPermissions("read")] canActivate: [AuthGuard.forPermissions("read")]
}, },
{path: "genre/:slug", component: ItemsGridComponent, pathMatch: "full",
resolve: {items: PageResolver.forResource<LibraryItem>("shows", ["genres", "studio"], "genres=ctn::slug")},
canLoad: [AuthGuard.forPermissions("read")],
canActivate: [AuthGuard.forPermissions("read")]
},
{path: "show/:slug", component: ShowDetailsComponent, {path: "show/:slug", component: ShowDetailsComponent,
resolve: {show: ItemResolver.forResource<Show>("shows/:slug")}, resolve: {show: ItemResolver.forResource<Show>("shows/:slug")},
canLoad: [AuthGuard.forPermissions("read")], canLoad: [AuthGuard.forPermissions("read")],

View File

@ -58,10 +58,12 @@ export class ItemsGridComponent implements OnInit
}); });
} }
static routeMapper(route: ActivatedRouteSnapshot, endpoint: string): string static routeMapper(route: ActivatedRouteSnapshot, endpoint: string, query: [string, string][]): string
{ {
const filter: string[] = ["genres", "studio"]; const filter: string[] = ["genres", "studio"];
let queryParams: [string, string][] = Object.entries(route.queryParams).filter(x => filter.includes(x[0])); let queryParams: [string, string][] = Object.entries(route.queryParams).filter(x => filter.includes(x[0]));
if (query)
queryParams.push(...query)
if (queryParams.length > 0) if (queryParams.length > 0)
endpoint = "shows"; endpoint = "shows";

View File

@ -7,14 +7,16 @@ import {catchError, map} from 'rxjs/operators';
import {Page} from "../../models/page"; import {Page} from "../../models/page";
import {IResource} from "../../models/resources/resource"; import {IResource} from "../../models/resources/resource";
type RouteMapper = (route: ActivatedRouteSnapshot, endpoint: string) => string; type RouteMapper = (route: ActivatedRouteSnapshot, endpoint: string, queryParams: [string, string][]) => string;
@Injectable() @Injectable()
export class PageResolver export class PageResolver
{ {
public static resolvers: any[] = []; public static resolvers: any[] = [];
static forResource<T extends IResource>(resource: string, copyParams: boolean | string[] | RouteMapper = false) static forResource<T extends IResource>(resource: string,
copyParams: boolean | string[] | RouteMapper = false,
defaultQuery: string = null)
{ {
@Injectable() @Injectable()
class Resolver implements Resolve<Page<T>> class Resolver implements Resolve<Page<T>>
@ -25,17 +27,23 @@ export class PageResolver
resolve(route: ActivatedRouteSnapshot): Page<T> | Observable<Page<T>> | Promise<Page<T>> resolve(route: ActivatedRouteSnapshot): Page<T> | Observable<Page<T>> | Promise<Page<T>>
{ {
let res: string = resource.replace(/:(.*?)(\/|$)/, (x, y) => `${route.paramMap.get(y)}/`); let res: string = resource.replace(/:([^:]*?)(\/|$|&)/, (x, y, z) => `${route.paramMap.get(y)}${z}`);
let query: [string, string][] = defaultQuery
?.replace(/:([^:]*?)(\/|$|&)/, (x, y, z) => `${route.paramMap.get(y)}${z}`)
.split('&')
.map(x => x.split('=') as [string, string]);
let uri: string; let uri: string;
if (typeof copyParams == "function") if (typeof copyParams == "function")
uri = copyParams(route, res); uri = copyParams(route, res, query);
else else
{ {
let queryParams: [string, string][] = copyParams == true let entries: [string, string][] = copyParams == true
? Object.entries(route.queryParams) ? Object.entries(route.queryParams)
: Object.entries(route.queryParams).filter(x => copyParams && copyParams.includes(x[0])); : Object.entries(route.queryParams).filter(x => copyParams && copyParams.includes(x[0]));
let params: string = queryParams.length > 0 if (query)
? '?' + queryParams.map(x => `${x[0]}=${x[1]}`).join('&') entries.push(...query);
let params: string = entries.length > 0
? '?' + entries.map(x => `${x[0]}=${x[1]}`).join('&')
: ""; : "";
uri = `api/${res}${params}`; uri = `api/${res}${params}`;
} }