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")]
},
{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,
resolve: {show: ItemResolver.forResource<Show>("shows/:slug")},
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"];
let queryParams: [string, string][] = Object.entries(route.queryParams).filter(x => filter.includes(x[0]));
if (query)
queryParams.push(...query)
if (queryParams.length > 0)
endpoint = "shows";

View File

@ -7,14 +7,16 @@ import {catchError, map} from 'rxjs/operators';
import {Page} from "../../models/page";
import {IResource} from "../../models/resources/resource";
type RouteMapper = (route: ActivatedRouteSnapshot, endpoint: string) => string;
type RouteMapper = (route: ActivatedRouteSnapshot, endpoint: string, queryParams: [string, string][]) => string;
@Injectable()
export class PageResolver
{
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()
class Resolver implements Resolve<Page<T>>
@ -25,17 +27,23 @@ export class PageResolver
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;
if (typeof copyParams == "function")
uri = copyParams(route, res);
uri = copyParams(route, res, query);
else
{
let queryParams: [string, string][] = copyParams == true
let entries: [string, string][] = copyParams == true
? Object.entries(route.queryParams)
: Object.entries(route.queryParams).filter(x => copyParams && copyParams.includes(x[0]));
let params: string = queryParams.length > 0
? '?' + queryParams.map(x => `${x[0]}=${x[1]}`).join('&')
if (query)
entries.push(...query);
let params: string = entries.length > 0
? '?' + entries.map(x => `${x[0]}=${x[1]}`).join('&')
: "";
uri = `api/${res}${params}`;
}