Compare commits

..

No commits in common. "bf376e161c952463671874b86f9f35a9976c27a0" and "424546029debd07bf8f8f758948fdb16b01c4425" have entirely different histories.

17 changed files with 108 additions and 287 deletions

View File

@ -182,7 +182,7 @@
.filter-label { .filter-label {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
padding: .5rem 0 .25rem .25rem; padding: .5rem 0 .25rem .5rem;
color: var(--shadow); color: var(--shadow);
font-weight: bold; font-weight: bold;
font-size: .9rem; font-size: .9rem;
@ -209,7 +209,7 @@
height: 1.25rem; height: 1.25rem;
appearance: none; appearance: none;
border-radius: 1rem; border-radius: 1rem;
background-color: var(--shadow-weak-40); background-color: var(--shadow-weak-30);
background-image: radial-gradient(circle, var(--shadow-weak-10) .3rem, transparent calc(.3rem + 1px)); background-image: radial-gradient(circle, var(--shadow-weak-10) .3rem, transparent calc(.3rem + 1px));
cursor: pointer; cursor: pointer;

View File

@ -57,5 +57,5 @@
--enabled-background: rgba(0, 255, 0, .1); --enabled-background: rgba(0, 255, 0, .1);
--disabled: #c20; --disabled: #c20;
--disabled-background: rgba(255, 0, 0, .1); --disabled-background: rgba(255, 0, 0, .1);
--disabled-handle: var(--grey-light-10); --disabled-handle: #aaa;
} }

View File

@ -62,13 +62,12 @@ defineProps({
.actor { .actor {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
width: 100%; width: 10rem;
aspect-ratio: 2/3; height: 15rem;
position: relative; position: relative;
border-radius: .25rem; border-radius: .25rem;
margin: .25rem; margin: .25rem;
box-shadow: 0 0 3px var(--shadow-weak-30); box-shadow: 0 0 3px var(--shadow-weak-30);
overflow: hidden;
&:hover { &:hover {
box-shadow: 0 0 3px var(--shadow-weak-20); box-shadow: 0 0 3px var(--shadow-weak-20);
@ -83,9 +82,6 @@ defineProps({
padding: .25rem .5rem; padding: .25rem .5rem;
font-weight: bold; font-weight: bold;
font-size: .9rem; font-size: .9rem;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
user-select: all; user-select: all;
} }

View File

@ -161,8 +161,8 @@ async function setRange(prop, value) {
border-radius: .625rem; border-radius: .625rem;
&.disabled { &.disabled {
--slider-range: var(--shadow-weak-40); --slider-range: var(--shadow-weak-30);
--slider-thumb: var(--disabled-handle); --slider-thumb: var(--grey-dark-10);
} }
} }

View File

@ -3,19 +3,17 @@
<ul class="pages nolist"> <ul class="pages nolist">
<li> <li>
<Link <Link
:href="getPath(1)" :href="`/updates/${routeParams?.scope}/1`"
:class="{ disabled: !hasPrevPage }" :class="{ disabled: !hasPrevPage }"
class="page first nolink" class="page first nolink"
@click="(event) => go(1, event)"
><Icon icon="first2" /></Link> ><Icon icon="first2" /></Link>
</li> </li>
<li> <li>
<Link <Link
:href="hasPrevPage ? getPath(currentPage - 1) : null" :href="hasPrevPage ? `/updates/${routeParams?.scope}/${currentPage - 1}` : null"
:class="{ disabled: !hasPrevPage }" :class="{ disabled: !hasPrevPage }"
class="page prev nolink" class="page prev nolink"
@click="(event) => hasPrevPage && go(currentPage - 1, event)"
><Icon icon="arrow-left" /></Link> ><Icon icon="arrow-left" /></Link>
</li> </li>
</ul> </ul>
@ -23,15 +21,14 @@
<div class="index"> <div class="index">
<ul class="pages before wrap nolist"> <ul class="pages before wrap nolist">
<li <li
v-for="prevPage in prevPages" v-for="page in prevPages"
:key="`page-${prevPage}`" :key="`page-${page}`"
> >
<Link <Link
:href="getPath(prevPage)" :href="`/updates/${routeParams?.scope}/${page}`"
:class="{ active: prevPage === currentPage }"
class="page nolink" class="page nolink"
@click="(event) => go(prevPage, event)" :class="{ active: page === currentPage }"
>{{ prevPage }}</Link> >{{ page }}</Link>
</li> </li>
</ul> </ul>
@ -43,15 +40,14 @@
<ul class="pages after wrap nolist"> <ul class="pages after wrap nolist">
<li <li
v-for="nextPage in nextPages" v-for="page in nextPages"
:key="`page-${nextPage}`" :key="`page-${page}`"
> >
<Link <Link
:href="getPath(nextPage)" :href="`/updates/${routeParams?.scope}/${page}`"
:class="{ active: nextPage === currentPage }"
class="page nolink" class="page nolink"
@click="(event) => go(nextPage, event)" :class="{ active: page === currentPage }"
>{{ nextPage }}</Link> >{{ page }}</Link>
</li> </li>
</ul> </ul>
</div> </div>
@ -59,19 +55,17 @@
<ul class="pages nolist"> <ul class="pages nolist">
<li> <li>
<Link <Link
:href="hasNextPage ? getPath(currentPage + 1) : null" :href="hasNextPage ? `/updates/${routeParams?.scope}/${currentPage + 1}` : null"
:class="{ disabled: !hasNextPage }" :class="{ disabled: !hasNextPage }"
class="page next nolink" class="page next nolink"
@click="(event) => hasNextPage && go(currentPage + 1, event)"
><Icon icon="arrow-right" /></Link> ><Icon icon="arrow-right" /></Link>
</li> </li>
<li> <li>
<Link <Link
:href="getPath(pageTotal)" :href="`/updates/${routeParams?.scope}/${pageTotal}`"
:class="{ disabled: !hasNextPage }" :class="{ disabled: !hasNextPage }"
class="page last nolink" class="page last nolink"
@click="(event) => go(pageTotal, event)"
><Icon icon="last2" /></Link> ><Icon icon="last2" /></Link>
</li> </li>
</ul> </ul>
@ -79,87 +73,41 @@
</template> </template>
<script setup> <script setup>
import { computed, inject } from 'vue'; import { inject } from 'vue';
import { parse } from 'path-to-regexp';
const props = defineProps({ const { routeParams, pageProps } = inject('pageContext');
page: { const currentPage = Number(routeParams?.page);
type: Number, const limit = Number(pageProps.limit) || 30;
default: null, const total = Number(pageProps.total);
}, const pageTotal = Math.ceil(total / limit);
total: { const hasNextPage = currentPage + 1 <= pageTotal;
type: Number, const hasPrevPage = currentPage - 1 >= 1;
default: null,
},
redirect: {
type: Boolean,
default: true,
},
includeQuery: {
type: Boolean,
default: true,
},
});
const emit = defineEmits(['navigation']); console.log(routeParams);
const pageContext = inject('pageContext'); const prevPages = Array.from({ length: 4 }, (value, index) => {
const { routeParams, urlParsed, pageProps } = pageContext; const page = currentPage - index - 1;
const currentPage = computed(() => props.page || Number(routeParams?.page));
const limit = computed(() => props.limit || Number(pageProps.limit) || 30);
const total = computed(() => props.total || Number(pageProps.total));
const pageTotal = computed(() => Math.ceil(total.value / limit.value));
const hasNextPage = computed(() => currentPage.value + 1 <= pageTotal.value);
const hasPrevPage = computed(() => currentPage.value - 1 >= 1);
const prevPages = computed(() => Array.from({ length: 4 }, (value, index) => {
const page = currentPage.value - index - 1;
if (page < 1) { if (page < 1) {
return null; return null;
} }
return page; return page;
}).filter(Boolean)); }).filter(Boolean);
const nextPages = computed(() => Array.from({ length: 4 }, (value, index) => { const nextPages = Array.from({ length: 4 }, (value, index) => {
const page = currentPage.value + index + 1; const page = currentPage + index + 1;
if (page > pageTotal.value) { if (page > pageTotal) {
return null; return null;
} }
return page; return page;
}).filter(Boolean)); }).filter(Boolean);
function go(page, event) { console.log(total, limit, currentPage);
if (!props.redirect) { console.log(prevPages);
event.preventDefault(); console.log(nextPages);
history.pushState({}, '', event.target.href); // eslint-disable-line no-restricted-globals
currentPage.value = page;
}
emit('navigation', {
href: event.target.href,
page,
});
}
function getPath(page) {
const path = parse(routeParams.path)
.map((segment) => (segment.name === 'page' ? String(page) : routeParams[segment.name] || segment))
.join('/');
if (props.includeQuery && urlParsed.searchOriginal) {
return `${path}${urlParsed.searchOriginal}`;
}
return path;
}
</script> </script>
<style scoped> <style scoped>
@ -167,7 +115,6 @@ function getPath(page) {
height: 5rem; height: 5rem;
display: flex; display: flex;
justify-content: center; justify-content: center;
box-sizing: border-box;
padding: 1rem; padding: 1rem;
font-size: 0; font-size: 0;
overflow: hidden; overflow: hidden;

View File

@ -34,7 +34,7 @@
</template> </template>
<script setup> <script setup>
import { inject } from 'vue'; import { defineProps, inject } from 'vue';
import Scene from './tile.vue'; import Scene from './tile.vue';
import Pagination from '../pagination/pagination.vue'; import Pagination from '../pagination/pagination.vue';

27
package-lock.json generated
View File

@ -1,11 +1,11 @@
{ {
"name": "traxxx-web", "name": "traxxx-web",
"version": "0.4.1", "version": "0.4.0",
"lockfileVersion": 2, "lockfileVersion": 2,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"version": "0.4.1", "version": "0.4.0",
"dependencies": { "dependencies": {
"@floating-ui/dom": "^1.5.3", "@floating-ui/dom": "^1.5.3",
"@floating-ui/vue": "^1.0.2", "@floating-ui/vue": "^1.0.2",
@ -23,7 +23,6 @@
"manticoresearch": "^4.0.0", "manticoresearch": "^4.0.0",
"mitt": "^3.0.1", "mitt": "^3.0.1",
"nanoid": "^5.0.4", "nanoid": "^5.0.4",
"path-to-regexp": "^6.2.1",
"pg": "^8.11.3", "pg": "^8.11.3",
"sirv": "^2.0.3", "sirv": "^2.0.3",
"vike": "^0.4.150", "vike": "^0.4.150",
@ -4382,11 +4381,6 @@
"resolved": "https://registry.npmjs.org/express-query-boolean/-/express-query-boolean-2.0.0.tgz", "resolved": "https://registry.npmjs.org/express-query-boolean/-/express-query-boolean-2.0.0.tgz",
"integrity": "sha512-4dU/1HPm8lkTPR12+HFUXqCarcsC19OKOkb4otLOuADfPYrQMaugPJkSmxNsqwmWYjozvT6vdTiqkgeBHkzOow==" "integrity": "sha512-4dU/1HPm8lkTPR12+HFUXqCarcsC19OKOkb4otLOuADfPYrQMaugPJkSmxNsqwmWYjozvT6vdTiqkgeBHkzOow=="
}, },
"node_modules/express/node_modules/path-to-regexp": {
"version": "0.1.7",
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
"integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ=="
},
"node_modules/express/node_modules/safe-buffer": { "node_modules/express/node_modules/safe-buffer": {
"version": "5.2.1", "version": "5.2.1",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
@ -5846,9 +5840,9 @@
"integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
}, },
"node_modules/path-to-regexp": { "node_modules/path-to-regexp": {
"version": "6.2.1", "version": "0.1.7",
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.1.tgz", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
"integrity": "sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==" "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ=="
}, },
"node_modules/pg": { "node_modules/pg": {
"version": "8.11.3", "version": "8.11.3",
@ -10764,11 +10758,6 @@
"vary": "~1.1.2" "vary": "~1.1.2"
}, },
"dependencies": { "dependencies": {
"path-to-regexp": {
"version": "0.1.7",
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
"integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ=="
},
"safe-buffer": { "safe-buffer": {
"version": "5.2.1", "version": "5.2.1",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
@ -11817,9 +11806,9 @@
"integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
}, },
"path-to-regexp": { "path-to-regexp": {
"version": "6.2.1", "version": "0.1.7",
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.1.tgz", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
"integrity": "sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==" "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ=="
}, },
"pg": { "pg": {
"version": "8.11.3", "version": "8.11.3",

View File

@ -23,7 +23,6 @@
"manticoresearch": "^4.0.0", "manticoresearch": "^4.0.0",
"mitt": "^3.0.1", "mitt": "^3.0.1",
"nanoid": "^5.0.4", "nanoid": "^5.0.4",
"path-to-regexp": "^6.2.1",
"pg": "^8.11.3", "pg": "^8.11.3",
"sirv": "^2.0.3", "sirv": "^2.0.3",
"vike": "^0.4.150", "vike": "^0.4.150",
@ -45,5 +44,5 @@
"postcss-custom-media": "^10.0.2", "postcss-custom-media": "^10.0.2",
"postcss-nesting": "^12.0.2" "postcss-nesting": "^12.0.2"
}, },
"version": "0.4.1" "version": "0.4.0"
} }

View File

@ -1,7 +1,6 @@
<template> <template>
<div class="page"> <div class="page">
<form <form
v-show="showFilters"
class="filters" class="filters"
@submit.prevent @submit.prevent
> >
@ -193,7 +192,7 @@
v-if="!filters.country" v-if="!filters.country"
v-model="countryQuery" v-model="countryQuery"
type="search" type="search"
placeholder="Filter country" placeholder="Search country"
class="input input-inline countries-search" class="input input-inline countries-search"
> >
@ -222,45 +221,16 @@
</div> </div>
</form> </form>
<div class="actors-anchor"> <ul class="actors nolist">
<div <li
class="sidebar-toggle" v-for="actor in actors"
@click="toggleFilters" :key="`actor-${actor.id}`"
> >
<Icon <ActorTile
v-show="showFilters" :actor="actor"
icon="arrow-left3"
/> />
</li>
<Icon </ul>
v-show="!showFilters"
icon="arrow-right3"
/>
</div>
<div
ref="container"
class="actors-container"
>
<ul class="actors nolist">
<li
v-for="actor in actors"
:key="`actor-${actor.id}`"
>
<ActorTile
:actor="actor"
/>
</li>
</ul>
<Pagination
:page="currentPage"
:total="total"
:redirect="false"
@navigation="paginate"
/>
</div>
</div>
</div> </div>
</template> </template>
@ -272,21 +242,16 @@ import navigate from '#/src/navigate.js';
import { get } from '#/src/api.js'; import { get } from '#/src/api.js';
import ActorTile from '#/components/actors/tile.vue'; import ActorTile from '#/components/actors/tile.vue';
import Pagination from '#/components/pagination/pagination.vue';
import Gender from '#/components/actors/gender.vue'; import Gender from '#/components/actors/gender.vue';
import Checkbox from '#/components/form/checkbox.vue'; import Checkbox from '#/components/form/checkbox.vue';
import RangeFilter from '#/components/filters/range.vue'; import RangeFilter from '#/components/filters/range.vue';
import Countries from '#/components/filters/countries.vue'; import Countries from '#/components/filters/countries.vue';
const pageContext = inject('pageContext'); const { pageProps, urlParsed } = inject('pageContext');
const { pageProps, urlParsed, routeParams } = pageContext;
const q = ref(urlParsed.search.q); const q = ref(urlParsed.search.q);
const actors = ref([]); const actors = ref([]);
const container = ref(null);
const showFilters = ref(true);
const countries = ref(pageProps.countries); const countries = ref(pageProps.countries);
const countryQuery = ref(''); const countryQuery = ref('');
@ -301,9 +266,6 @@ actors.value = pageProps.actors;
const braSizes = 'ABCDEFGHIJKZ'.split(''); const braSizes = 'ABCDEFGHIJKZ'.split('');
const naturalBoobsValues = [true, undefined, false]; const naturalBoobsValues = [true, undefined, false];
const currentPage = ref(Number(routeParams.page));
const total = ref(Number(pageProps.total));
const filters = ref({ const filters = ref({
gender: urlParsed.search.gender, gender: urlParsed.search.gender,
ageRequired: !!urlParsed.search.age, ageRequired: !!urlParsed.search.age,
@ -322,11 +284,9 @@ const filters = ref({
avatarRequired: !!urlParsed.search.avatar, avatarRequired: !!urlParsed.search.avatar,
}); });
async function search(resetPage = true) { console.log(filters.value.dobType);
if (resetPage) {
currentPage.value = 1;
}
async function search() {
const query = { const query = {
q: q.value || undefined, q: q.value || undefined,
gender: filters.value.gender || undefined, gender: filters.value.gender || undefined,
@ -341,21 +301,12 @@ async function search(resetPage = true) {
avatar: filters.value.avatarRequired || undefined, avatar: filters.value.avatarRequired || undefined,
}; };
const res = await get('/actors', { ...query, page: currentPage.value }); // client uses param rather than query pagination navigate('/actors', query, { redirect: false });
const res = await get('/actors', query);
actors.value = res.actors; actors.value = res.actors;
total.value = res.total;
countries.value = res.countries; countries.value = res.countries;
container.value.scrollTop = 0;
navigate(`/actors/${currentPage.value}`, query, { redirect: false });
}
function paginate({ page }) {
currentPage.value = page;
search(false);
} }
function updateFilter(prop, value, reload = true) { function updateFilter(prop, value, reload = true) {
@ -365,10 +316,6 @@ function updateFilter(prop, value, reload = true) {
search(); search();
} }
} }
function toggleFilters() {
showFilters.value = !showFilters.value;
}
</script> </script>
<style> <style>
@ -408,7 +355,6 @@ function toggleFilters() {
.filters { .filters {
width: 17rem; width: 17rem;
position: relative;
flex-shrink: 0; flex-shrink: 0;
border-right: solid 1px var(--shadow-weak-30); border-right: solid 1px var(--shadow-weak-30);
overflow-y: auto; overflow-y: auto;
@ -419,57 +365,17 @@ function toggleFilters() {
} }
.filter { .filter {
padding: .5rem; padding: .5rem .25rem;
border-bottom: solid 1px var(--shadow-weak-30);
&:not(:last-child) {
border-bottom: solid 1px var(--shadow-weak-30);
}
}
.actors-anchor {
flex-grow: 1;
position: relative;
}
.sidebar-toggle {
width: 1.5rem;
height: 2rem;
display: flex;
justify-content: center;
align-items: center;
position: absolute;
bottom: .5rem;
left: 0;
z-index: 10;
border-radius: 0 .25rem .25rem 0;
background: var(--background);
box-shadow: 0 0 3px var(--shadow-weak-30);
.icon {
fill: var(--shadow);
}
&:hover {
cursor: pointer;
.icon {
fill: var(--primary);
}
}
}
.actors-container {
height: 100%;
box-sizing: border-box;
padding: 1rem;
overflow-y: auto;
} }
.actors { .actors {
display: grid; display: grid;
flex-grow: 1; flex-grow: 1;
grid-template-columns: repeat(auto-fill, minmax(10rem, 1fr)); grid-template-columns: repeat(auto-fill, 10rem);
gap: .25rem; gap: .25rem;
padding: 1rem;
overflow-y: auto;
} }
.genders { .genders {
@ -524,17 +430,10 @@ function toggleFilters() {
.select { .select {
flex-grow: 1; flex-grow: 1;
color: var(--shadow-strong-10);
option {
color: var(--text);
}
} }
.countries-container { .countries-container {
border-bottom: solid 1px var(--shadow-weak-30); border-bottom: solid 1px var(--shadow-weak-30);
padding: .25rem 0;
margin-bottom: .5rem;
} }
.countries-search { .countries-search {

View File

@ -9,7 +9,7 @@ export async function onBeforeRender(pageContext) {
total, total,
} = await fetchActors(curateActorsQuery(pageContext.urlQuery), { } = await fetchActors(curateActorsQuery(pageContext.urlQuery), {
page: Number(pageContext.routeParams.page) || 1, page: Number(pageContext.routeParams.page) || 1,
limit: Number(pageContext.urlParsed.search.limit) || 120, limit: Number(pageContext.urlParsed.search.limit) || 50,
}); });
return { return {

View File

@ -1,20 +0,0 @@
import { match } from 'path-to-regexp';
// import { resolveRoute } from 'vike/routing'; // eslint-disable-line import/extensions
const path = '/actors/:page?';
const urlMatch = match(path, { decode: decodeURIComponent });
export default (pageContext) => {
const matched = urlMatch(pageContext.urlPathname);
if (matched) {
return {
routeParams: {
page: matched.params.page || '1',
path,
},
};
}
return false;
};

View File

@ -1 +1 @@
export default '/actor/@actorId/*'; export default '/actors/@actorId/*';

View File

@ -1,4 +1,4 @@
import { fetchLatest, fetchUpcoming, fetchNew } from '#/src/scenes.js'; import { fetchLatest, fetchUpcoming, fetchNew } from '../../src/scenes';
async function fetchScenes(scope, page, limit) { async function fetchScenes(scope, page, limit) {
if (scope === 'new') { if (scope === 'new') {

View File

@ -1,20 +1,33 @@
import { match } from 'path-to-regexp'; import { resolveRoute } from 'vike/routing';
// import { resolveRoute } from 'vike/routing'; // eslint-disable-line import/extensions
const path = '/updates/:scope?/:page?';
const urlMatch = match(path, { decode: decodeURIComponent });
export default (pageContext) => { export default (pageContext) => {
const matched = urlMatch(pageContext.urlPathname); {
const result = resolveRoute('/updates/@scope/@page', pageContext.urlPathname);
if (matched) { if (result.match) {
return { return result;
routeParams: { }
scope: matched.params.scope || 'latest', }
page: matched.params.page || '1',
path, {
}, const result = resolveRoute('/updates/@scope', pageContext.urlPathname);
};
if (result.match) {
result.routeParams.page = '1';
return result;
}
}
{
const result = resolveRoute('/updates', pageContext.urlPathname);
if (result.match) {
result.routeParams.scope = 'latest';
result.routeParams.page = '1';
return result;
}
} }
return false; return false;

View File

@ -62,23 +62,20 @@ export async function fetchActorsById(actorIds) {
.groupBy('actors.id', 'avatars.id'), .groupBy('actors.id', 'avatars.id'),
]); ]);
const curatedActors = actorIds.map((actorId) => { return actorIds.map((actorId) => {
const actor = actors.find((actorEntry) => actorEntry.id === actorId); const actor = actors.find((actorEntry) => actorEntry.id === actorId);
if (!actor) { if (!actor) {
console.warn(`Can't find ${actorId}`);
return null; return null;
} }
return curateActor(actor); return curateActor(actor);
}).filter(Boolean); }).filter(Boolean);
return curatedActors;
} }
function curateOptions(options) { function curateOptions(options) {
if (options?.limit > 120) { if (options?.limit > 100) {
throw new HttpError('Limit must be <= 120', 400); throw new HttpError('Limit must be <= 100', 400);
} }
return { return {
@ -111,6 +108,8 @@ function buildQuery(filters) {
['gender', 'country'].forEach((attribute) => { ['gender', 'country'].forEach((attribute) => {
if (filters[attribute]) { if (filters[attribute]) {
console.log(attribute, filters[attribute]);
query.bool.must.push({ query.bool.must.push({
equals: { equals: {
[attribute]: filters[attribute], [attribute]: filters[attribute],
@ -198,9 +197,6 @@ export async function fetchActors(filters, rawOptions) {
const options = curateOptions(rawOptions); const options = curateOptions(rawOptions);
const { query, expressions } = buildQuery(filters); const { query, expressions } = buildQuery(filters);
console.log(options);
console.log('offset', (options.page - 1) * options.limit);
const result = await searchApi.search({ const result = await searchApi.search({
index: 'actors', index: 'actors',
query, query,

View File

@ -24,6 +24,8 @@ function curateScene(rawScene, assets) {
return null; return null;
} }
console.log(assets.channel);
return { return {
id: rawScene.id, id: rawScene.id,
title: rawScene.title, title: rawScene.title,

View File

@ -26,7 +26,7 @@ export async function fetchActorsApi(req, res) {
total, total,
} = await fetchActors(curateActorsQuery(req.query), { } = await fetchActors(curateActorsQuery(req.query), {
page: Number(req.query.page) || 1, page: Number(req.query.page) || 1,
limit: Number(req.query.limit) || 120, limit: Number(req.query.limit) || 50,
}); });
res.send({ res.send({