Added tag filter to releases query, enabled on homepage.

This commit is contained in:
2019-11-13 03:14:24 +01:00
parent d1212725bb
commit f9f9cc7977
26 changed files with 555 additions and 192 deletions

View File

@@ -1,6 +1,7 @@
'use strict';
const knex = require('./knex');
const whereOr = require('./utils/where-or');
async function curateActor(actor) {
const aliases = await knex('actors')
@@ -26,10 +27,9 @@ function curateActors(releases) {
return Promise.all(releases.map(async release => curateActor(release)));
}
async function fetchActors(actorId, actorSlug) {
async function fetchActors(queryObject) {
const releases = await knex('actors')
.where({ id: actorId })
.orWhere({ slug: actorSlug })
.where(builder => whereOr(queryObject, 'actors', builder))
.limit(100);
return curateActors(releases);

View File

@@ -1,6 +1,7 @@
'use strict';
const knex = require('./knex');
const whereOr = require('./utils/where-or');
async function curateNetwork(network) {
const [sites, studios] = await Promise.all([
@@ -44,10 +45,9 @@ function curateNetworks(releases) {
return Promise.all(releases.map(async release => curateNetwork(release)));
}
async function fetchNetworks(networkId, networkSlug) {
async function fetchNetworks(queryObject) {
const releases = await knex('networks')
.where({ id: networkId })
.orWhere({ slug: networkSlug })
.where(builder => whereOr(queryObject, 'networks', builder))
.limit(100);
return curateNetworks(releases);

View File

@@ -66,18 +66,29 @@ function curateReleases(releases) {
return Promise.all(releases.map(async release => curateRelease(release)));
}
async function fetchReleases(releaseId) {
async function fetchReleases(releaseId, filter = []) {
// const straightFilter = filter.includes('straight') ? ['gay', 'lesbian'] : [];
const releases = await knex('releases')
.where(releaseId ? { 'releases.id': releaseId } : {})
.leftJoin('sites', 'releases.site_id', 'sites.id')
.leftJoin('studios', 'releases.studio_id', 'studios.id')
.leftJoin('networks', 'sites.network_id', 'networks.id')
.select(
'releases.*',
'sites.name as site_name', 'sites.slug as site_slug', 'sites.url as site_url', 'sites.network_id',
'studios.name as studio_name', 'sites.slug as site_slug', 'studios.url as studio_url',
'networks.name as network_name', 'networks.slug as network_slug', 'networks.url as network_url',
)
.leftJoin('sites', 'releases.site_id', 'sites.id')
.leftJoin('studios', 'releases.studio_id', 'studios.id')
.leftJoin('networks', 'sites.network_id', 'networks.id')
.whereNotExists((builder) => {
// apply filters
builder
.select('*')
.from('tags_associated')
.leftJoin('tags', 'tags_associated.tag_id', 'tags.id')
.whereIn('tags.slug', filter)
.andWhereRaw('tags_associated.release_id = releases.id');
})
.andWhere(releaseId ? { 'releases.id': releaseId } : {})
.orderBy([{ column: 'date', order: 'desc' }, { column: 'created_at', order: 'desc' }])
.limit(100);

View File

@@ -8,6 +8,13 @@ const moment = require('moment');
const { matchTags } = require('../tags');
const defaultTags = {
hardx: [],
darkx: ['interracial'],
eroticax: [],
lesbianx: ['lesbian'],
};
async function fetchPhotos(url) {
const res = await bhttp.get(url);
@@ -144,7 +151,7 @@ async function scrapeScene(html, url, site) {
.orWhere({ slug: siteId })
.first()
: site,
matchTags(rawTags),
matchTags([...defaultTags[siteId], ...rawTags]),
]);
return {

View File

@@ -23,9 +23,9 @@ function curateSites(sites) {
return Promise.all(sites.map(async site => curateSite(site)));
}
async function fetchSites(query) {
async function fetchSites(queryObject) {
const sites = await knex('sites')
.where(builder => whereOr(query, builder))
.where(builder => whereOr(queryObject, 'sites', builder))
.select(
'sites.*',
'networks.name as network_name', 'networks.slug as network_slug', 'networks.url as network_url',

View File

@@ -1,6 +1,7 @@
'use strict';
const knex = require('./knex');
const whereOr = require('./utils/where-or');
async function curateTag(tag) {
const aliases = await knex('tags').where({ alias_for: tag.id });
@@ -30,10 +31,9 @@ async function storeTags(release, releaseEntry) {
})));
}
async function fetchTags(tagId, tagSlug) {
async function fetchTags(queryObject) {
const tags = await knex('tags')
.where({ 'tags.id': tagId })
.orWhere({ 'tags.slug': tagSlug })
.where(builder => whereOr(queryObject, 'tags', builder))
.andWhere({ 'tags.alias_for': null })
.select(
'tags.*',

View File

@@ -1,9 +1,9 @@
'use strict';
function whereOr(query, builder) {
function whereOr(query, table, builder) {
Object.entries(query).forEach(([key, value]) => {
if (value !== undefined) {
builder.orWhere(`sites.${key}`, value);
builder.orWhere(`${table}.${key}`, value);
}
});
}

View File

@@ -6,7 +6,10 @@ async function fetchActorsApi(req, res) {
const actorId = typeof req.params.actorId === 'number' ? req.params.actorId : null;
const actorSlug = typeof req.params.actorId === 'string' ? req.params.actorId : null;
const actors = await fetchActors(actorId, actorSlug);
const actors = await fetchActors({
id: actorId,
slug: actorSlug,
});
res.send(actors);
}

View File

@@ -3,10 +3,13 @@
const { fetchNetworks, fetchNetworksFromReleases } = require('../networks');
async function fetchNetworksApi(req, res) {
const networkId = typeof req.params.networkId === 'number' ? req.params.networkId : null;
const networkSlug = typeof req.params.networkId === 'string' ? req.params.networkId : null;
const networkId = typeof req.params.networkId === 'number' ? req.params.networkId : undefined; // null will literally include NULL results
const networkSlug = typeof req.params.networkId === 'string' ? req.params.networkId : undefined;
const networks = await fetchNetworks(networkId, networkSlug);
const networks = await fetchNetworks({
id: networkId,
slug: networkSlug,
});
res.send(networks);
}

View File

@@ -9,7 +9,7 @@ const {
} = require('../releases');
async function fetchReleasesApi(req, res) {
const releases = await fetchReleases(req.params.releaseId);
const releases = await fetchReleases(req.params.releaseId, req.query.filter ? [].concat(req.query.filter) : []);
res.send(releases);
}

View File

@@ -3,10 +3,13 @@
const { fetchTags } = require('../tags');
async function fetchTagsApi(req, res) {
const tagId = typeof req.params.tagId === 'number' ? req.params.tagId : null;
const tagSlug = typeof req.params.tagId === 'string' ? req.params.tagId : null;
const tagId = typeof req.params.tagId === 'number' ? req.params.tagId : undefined; // null will literally include NULL results
const tagSlug = typeof req.params.tagId === 'string' ? req.params.tagId : undefined;
const tags = await fetchTags(tagId, tagSlug);
const tags = await fetchTags({
id: tagId,
slug: tagSlug,
});
res.send(tags);
}