diff --git a/assets/components/home/filter.vue b/assets/components/home/filter.vue
new file mode 100644
index 00000000..709b3296
--- /dev/null
+++ b/assets/components/home/filter.vue
@@ -0,0 +1,172 @@
+
+
+
+
+
+
+
diff --git a/assets/components/home/home.vue b/assets/components/home/home.vue
index 8ddbb61e..f7e98281 100644
--- a/assets/components/home/home.vue
+++ b/assets/components/home/home.vue
@@ -1,62 +1,9 @@
-
+
@@ -73,75 +20,47 @@
-
-
diff --git a/assets/components/release/release.vue b/assets/components/release/release.vue
index 11a24a43..c4e195db 100644
--- a/assets/components/release/release.vue
+++ b/assets/components/release/release.vue
@@ -168,7 +168,7 @@ function photos() {
}
async function mounted() {
- [this.release] = await this.$store.dispatch('fetchReleases', this.$route.params.releaseId);
+ [this.release] = await this.$store.dispatch('fetchReleases', { id: this.$route.params.releaseId });
}
export default {
diff --git a/assets/components/site/site.vue b/assets/components/site/site.vue
index 5a3b852a..0bf23d9e 100644
--- a/assets/components/site/site.vue
+++ b/assets/components/site/site.vue
@@ -116,7 +116,7 @@ export default {
}
.logo {
- width: 15rem;
+ width: 20rem;
max-height: 8rem;
object-fit: contain;
margin: 0 .5rem 1rem 0;
diff --git a/assets/css/_tooltip.scss b/assets/css/_tooltip.scss
new file mode 100644
index 00000000..c5df08db
--- /dev/null
+++ b/assets/css/_tooltip.scss
@@ -0,0 +1,109 @@
+.tooltip {
+ display: block !important;
+ z-index: 10000;
+
+ .tooltip-inner {
+ background: #222;
+ color: white;
+ border-radius: 16px;
+ padding: 5px 10px 4px;
+ }
+
+ .tooltip-arrow {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ position: absolute;
+ margin: 5px;
+ border-color: #222;
+ z-index: 1;
+ }
+
+ &[x-placement^="top"] {
+ margin-bottom: 5px;
+
+ .tooltip-arrow {
+ border-width: 5px 5px 0 5px;
+ border-left-color: transparent !important;
+ border-right-color: transparent !important;
+ border-bottom-color: transparent !important;
+ bottom: -5px;
+ left: calc(50% - 5px);
+ margin-top: 0;
+ margin-bottom: 0;
+ }
+ }
+
+ &[x-placement^="bottom"] {
+ margin-top: 5px;
+
+ .tooltip-arrow {
+ border-width: 0 5px 5px 5px;
+ border-left-color: transparent !important;
+ border-right-color: transparent !important;
+ border-top-color: transparent !important;
+ top: -5px;
+ left: calc(50% - 5px);
+ margin-top: 0;
+ margin-bottom: 0;
+ }
+ }
+
+ &[x-placement^="right"] {
+ margin-left: 5px;
+
+ .tooltip-arrow {
+ border-width: 5px 5px 5px 0;
+ border-left-color: transparent !important;
+ border-top-color: transparent !important;
+ border-bottom-color: transparent !important;
+ left: -5px;
+ top: calc(50% - 5px);
+ margin-left: 0;
+ margin-right: 0;
+ }
+ }
+
+ &[x-placement^="left"] {
+ margin-right: 5px;
+
+ .tooltip-arrow {
+ border-width: 5px 0 5px 5px;
+ border-top-color: transparent !important;
+ border-right-color: transparent !important;
+ border-bottom-color: transparent !important;
+ right: -5px;
+ top: calc(50% - 5px);
+ margin-left: 0;
+ margin-right: 0;
+ }
+ }
+
+ &.popover {
+ $color: #f9f9f9;
+
+ .popover-inner {
+ background: $color;
+ color: black;
+ padding: 24px;
+ border-radius: 5px;
+ box-shadow: 0 5px 30px rgba(black, .1);
+ }
+
+ .popover-arrow {
+ border-color: $color;
+ }
+ }
+
+ &[aria-hidden='true'] {
+ visibility: hidden;
+ opacity: 0;
+ /* transition: opacity .15s, visibility .15s; */
+ }
+
+ &[aria-hidden='false'] {
+ visibility: visible;
+ opacity: 1;
+ /* transition: opacity .15s; */
+ }
+}
diff --git a/assets/css/style.scss b/assets/css/style.scss
index 03f1d2dc..d4ccac2e 100644
--- a/assets/css/style.scss
+++ b/assets/css/style.scss
@@ -1,5 +1,6 @@
@import 'theme';
@import 'states';
+@import 'tooltip';
html,
body {
diff --git a/assets/js/api.js b/assets/js/api.js
index 4ca374ab..ad0a5586 100644
--- a/assets/js/api.js
+++ b/assets/js/api.js
@@ -1,9 +1,11 @@
import config from 'config';
-async function get(endpoint, query = {}) {
- const queryString = Object.entries(query).reduce((acc, [key, value], index) => `${acc}${index > 0 ? '&' : ''}${key}=${value}`, '?');
+import queryString from 'query-string';
- const res = await fetch(`${config.api.url}${endpoint}${queryString}`, {
+async function get(endpoint, query = {}) {
+ const q = queryString.stringify(query);
+
+ const res = await fetch(`${config.api.url}${endpoint}?${q}`, {
method: 'GET',
mode: 'cors',
credentials: 'same-origin',
diff --git a/assets/js/main.js b/assets/js/main.js
index f3ad6bd3..07393365 100644
--- a/assets/js/main.js
+++ b/assets/js/main.js
@@ -1,5 +1,6 @@
import Vue from 'vue';
import dayjs from 'dayjs';
+import VTooltip from 'v-tooltip';
import router from './router';
import initStore from './store';
@@ -31,6 +32,8 @@ function init() {
},
});
+ Vue.use(VTooltip);
+
new Vue({ // eslint-disable-line no-new
el: '#container',
store,
diff --git a/assets/js/releases/actions.js b/assets/js/releases/actions.js
index bb870018..c1da8aa5 100644
--- a/assets/js/releases/actions.js
+++ b/assets/js/releases/actions.js
@@ -1,8 +1,8 @@
import { get } from '../api';
function initReleasesActions(_store, _router) {
- async function fetchReleases({ _commit }, releaseId) {
- const releases = await get(`/releases/${releaseId || ''}`);
+ async function fetchReleases({ _commit }, { id, filter }) {
+ const releases = await get(`/releases/${id || ''}`, { filter });
return releases;
}
diff --git a/package-lock.json b/package-lock.json
index 41e6b7dc..c89345ec 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -7700,6 +7700,24 @@
"prepend-http": "^1.0.0",
"query-string": "^4.1.0",
"sort-keys": "^1.0.0"
+ },
+ "dependencies": {
+ "query-string": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz",
+ "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=",
+ "dev": true,
+ "requires": {
+ "object-assign": "^4.1.0",
+ "strict-uri-encode": "^1.0.0"
+ }
+ },
+ "strict-uri-encode": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz",
+ "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=",
+ "dev": true
+ }
}
},
"npm-run-path": {
@@ -8335,6 +8353,11 @@
"resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz",
"integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA=="
},
+ "popper.js": {
+ "version": "1.16.0",
+ "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.0.tgz",
+ "integrity": "sha512-+G+EkOPoE5S/zChTpmBSSDYmhXJ5PsW8eMhH8cP/CQHMFPBG/kC9Y5IIw6qNYgdJ+/COf0ddY2li28iHaZRSjw=="
+ },
"posix-character-classes": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
@@ -8709,13 +8732,13 @@
"integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA=="
},
"query-string": {
- "version": "4.3.4",
- "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz",
- "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=",
- "dev": true,
+ "version": "6.8.3",
+ "resolved": "https://registry.npmjs.org/query-string/-/query-string-6.8.3.tgz",
+ "integrity": "sha512-llcxWccnyaWlODe7A9hRjkvdCKamEKTh+wH8ITdTc3OhchaqUZteiSCX/2ablWHVrkVIe04dntnaZJ7BdyW0lQ==",
"requires": {
- "object-assign": "^4.1.0",
- "strict-uri-encode": "^1.0.0"
+ "decode-uri-component": "^0.2.0",
+ "split-on-first": "^1.0.0",
+ "strict-uri-encode": "^2.0.0"
}
},
"querystring": {
@@ -10065,6 +10088,11 @@
"through": "2"
}
},
+ "split-on-first": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz",
+ "integrity": "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw=="
+ },
"split-string": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
@@ -10210,10 +10238,9 @@
"integrity": "sha512-1q+dL790Ps0NV33rISMq9OLtfDA9KMJZdo1PHZXE85orrWsM4FAh8CVyAOTHO0rhyeM138KNPngBPrx33bFsxw=="
},
"strict-uri-encode": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz",
- "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=",
- "dev": true
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz",
+ "integrity": "sha1-ucczDHBChi9rFC3CdLvMWGbONUY="
},
"string": {
"version": "3.3.3",
@@ -10997,6 +11024,16 @@
"resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz",
"integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho="
},
+ "v-tooltip": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/v-tooltip/-/v-tooltip-2.0.2.tgz",
+ "integrity": "sha512-xQ+qzOFfywkLdjHknRPgMMupQNS8yJtf9Utd5Dxiu/0n4HtrxqsgDtN2MLZ0LKbburtSAQgyypuE/snM8bBZhw==",
+ "requires": {
+ "lodash": "^4.17.11",
+ "popper.js": "^1.15.0",
+ "vue-resize": "^0.4.5"
+ }
+ },
"v8-compile-cache": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.3.tgz",
@@ -11121,6 +11158,11 @@
"vue-style-loader": "^4.1.0"
}
},
+ "vue-resize": {
+ "version": "0.4.5",
+ "resolved": "https://registry.npmjs.org/vue-resize/-/vue-resize-0.4.5.tgz",
+ "integrity": "sha512-bhP7MlgJQ8TIkZJXAfDf78uJO+mEI3CaLABLjv0WNzr4CcGRGPIAItyWYnP6LsPA4Oq0WE+suidNs6dgpO4RHg=="
+ },
"vue-router": {
"version": "3.0.6",
"resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.0.6.tgz",
diff --git a/package.json b/package.json
index f400f50e..37a3571a 100644
--- a/package.json
+++ b/package.json
@@ -85,11 +85,13 @@
"opn": "^5.4.0",
"pg": "^7.9.0",
"prop-types": "^15.7.2",
+ "query-string": "^6.8.3",
"react": "^16.8.6",
"react-dom": "^16.8.6",
"sharp": "^0.23.2",
"tough-cookie": "^3.0.1",
"tty-table": "^2.7.0",
+ "v-tooltip": "^2.0.2",
"vue": "^2.6.10",
"vue-router": "^3.0.6",
"vuex": "^3.1.1",
diff --git a/public/css/style.css b/public/css/style.css
index 0047fc9c..71c4527a 100644
--- a/public/css/style.css
+++ b/public/css/style.css
@@ -1,3 +1,44 @@
+/* $primary: #ff886c; */
+.filters-bar[data-v-7de6ddc6] {
+ display: block;
+ background: rgba(0, 0, 0, 0.1);
+ padding: .5rem 1rem;
+ font-size: 0;
+}
+.filters-bar .icon[data-v-7de6ddc6] {
+ fill: rgba(0, 0, 0, 0.5);
+}
+.filters[data-v-7de6ddc6] {
+ display: inline-block;
+ list-style: none;
+ padding: .5rem;
+ margin: 0;
+}
+.filters[data-v-7de6ddc6]:not(:last-child) {
+ border-right: solid 1px rgba(0, 0, 0, 0.2);
+}
+.filter[data-v-7de6ddc6] {
+ display: inline-block;
+}
+.toggle[data-v-7de6ddc6] {
+ color: rgba(0, 0, 0, 0.5);
+ background: rgba(0, 0, 0, 0.1);
+ box-sizing: border-box;
+ padding: .5rem;
+ margin: 0 .25rem;
+ border-radius: .5rem;
+ font-size: .9rem;
+ font-weight: bold;
+ cursor: pointer;
+}
+.toggle .check[data-v-7de6ddc6] {
+ display: none;
+}
+.toggle.active[data-v-7de6ddc6] {
+ color: #fff;
+ background: #ff6c88;
+}
+
/* $primary: #ff886c; */
.tile[data-v-3abcf101] {
display: flex;
@@ -118,42 +159,6 @@
color: rgba(0, 0, 0, 0.7);
}
-/* $primary: #ff886c; */
-.filters-bar[data-v-5533e378] {
- display: block;
- background: rgba(0, 0, 0, 0.1);
- padding: .5rem 1rem;
-}
-.filters-bar .icon[data-v-5533e378] {
- fill: rgba(0, 0, 0, 0.5);
-}
-.filters[data-v-5533e378] {
- display: inline-block;
- list-style: none;
- padding: .5rem;
- margin: 0;
-}
-.filters .toggle[data-v-5533e378] {
- color: rgba(0, 0, 0, 0.5);
- background: rgba(0, 0, 0, 0.1);
- box-sizing: border-box;
- padding: .5rem;
- border-radius: .5rem;
- font-size: .9rem;
- font-weight: bold;
- cursor: pointer;
-}
-.filters .toggle .check[data-v-5533e378] {
- display: none;
-}
-.filters .toggle.active[data-v-5533e378] {
- color: #fff;
- background: #ff6c88;
-}
-.filter[data-v-5533e378] {
- display: inline-block;
-}
-
/* $primary: #ff886c; */
.banner[data-v-2bc41e74] {
background: #222;
@@ -246,7 +251,7 @@
align-items: flex-end;
}
.logo[data-v-3e57cf44] {
- width: 15rem;
+ width: 20rem;
max-height: 8rem;
-o-object-fit: contain;
object-fit: contain;
@@ -423,6 +428,83 @@
-ms-user-select: none;
-webkit-tap-highlight-color: transparent; }
+.tooltip {
+ display: block !important;
+ z-index: 10000; }
+ .tooltip .tooltip-inner {
+ background: #222;
+ color: white;
+ border-radius: 16px;
+ padding: 5px 10px 4px; }
+ .tooltip .tooltip-arrow {
+ width: 0;
+ height: 0;
+ border-style: solid;
+ position: absolute;
+ margin: 5px;
+ border-color: #222;
+ z-index: 1; }
+ .tooltip[x-placement^="top"] {
+ margin-bottom: 5px; }
+ .tooltip[x-placement^="top"] .tooltip-arrow {
+ border-width: 5px 5px 0 5px;
+ border-left-color: transparent !important;
+ border-right-color: transparent !important;
+ border-bottom-color: transparent !important;
+ bottom: -5px;
+ left: calc(50% - 5px);
+ margin-top: 0;
+ margin-bottom: 0; }
+ .tooltip[x-placement^="bottom"] {
+ margin-top: 5px; }
+ .tooltip[x-placement^="bottom"] .tooltip-arrow {
+ border-width: 0 5px 5px 5px;
+ border-left-color: transparent !important;
+ border-right-color: transparent !important;
+ border-top-color: transparent !important;
+ top: -5px;
+ left: calc(50% - 5px);
+ margin-top: 0;
+ margin-bottom: 0; }
+ .tooltip[x-placement^="right"] {
+ margin-left: 5px; }
+ .tooltip[x-placement^="right"] .tooltip-arrow {
+ border-width: 5px 5px 5px 0;
+ border-left-color: transparent !important;
+ border-top-color: transparent !important;
+ border-bottom-color: transparent !important;
+ left: -5px;
+ top: calc(50% - 5px);
+ margin-left: 0;
+ margin-right: 0; }
+ .tooltip[x-placement^="left"] {
+ margin-right: 5px; }
+ .tooltip[x-placement^="left"] .tooltip-arrow {
+ border-width: 5px 0 5px 5px;
+ border-top-color: transparent !important;
+ border-right-color: transparent !important;
+ border-bottom-color: transparent !important;
+ right: -5px;
+ top: calc(50% - 5px);
+ margin-left: 0;
+ margin-right: 0; }
+ .tooltip.popover .popover-inner {
+ background: #f9f9f9;
+ color: black;
+ padding: 24px;
+ border-radius: 5px;
+ box-shadow: 0 5px 30px rgba(0, 0, 0, 0.1); }
+ .tooltip.popover .popover-arrow {
+ border-color: #f9f9f9; }
+ .tooltip[aria-hidden='true'] {
+ visibility: hidden;
+ opacity: 0;
+ /* transition: opacity .15s, visibility .15s; */ }
+ .tooltip[aria-hidden='false'] {
+ visibility: visible;
+ opacity: 1;
+ /* transition: opacity .15s; */ }
+
html,
body {
height: 100%; }
diff --git a/public/img/logos/evilangel/evilangel.png b/public/img/logos/evilangel/evilangel.png
new file mode 100644
index 00000000..bc2cd903
Binary files /dev/null and b/public/img/logos/evilangel/evilangel.png differ
diff --git a/public/img/logos/evilangel/network.png b/public/img/logos/evilangel/network.png
new file mode 100644
index 00000000..d2a7833a
Binary files /dev/null and b/public/img/logos/evilangel/network.png differ
diff --git a/seeds/02_tags.js b/seeds/02_tags.js
index ab7b1317..f0943267 100644
--- a/seeds/02_tags.js
+++ b/seeds/02_tags.js
@@ -1399,6 +1399,10 @@ function getTagAliases(tagsMap) {
name: 'tittyfuck',
alias_for: tagsMap['titty-fuck'],
},
+ {
+ name: 'tp',
+ alias_for: tagsMap['triple-penetration'],
+ },
{
name: 'trans',
alias_for: tagsMap['transsexual'],
@@ -1408,8 +1412,8 @@ function getTagAliases(tagsMap) {
alias_for: tagsMap['trimmed'],
},
{
- name: 'tp',
- alias_for: tagsMap['triple-penetration'],
+ name: 'ts',
+ alias_for: tagsMap['transsexual'],
},
{
name: 'whipping',
diff --git a/src/actors.js b/src/actors.js
index df04e07b..e436c6e3 100644
--- a/src/actors.js
+++ b/src/actors.js
@@ -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);
diff --git a/src/networks.js b/src/networks.js
index 0af65db2..14d509e4 100644
--- a/src/networks.js
+++ b/src/networks.js
@@ -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);
diff --git a/src/releases.js b/src/releases.js
index 7ccd1987..f4dee5e7 100644
--- a/src/releases.js
+++ b/src/releases.js
@@ -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);
diff --git a/src/scrapers/xempire.js b/src/scrapers/xempire.js
index 2d3af903..f97e226c 100644
--- a/src/scrapers/xempire.js
+++ b/src/scrapers/xempire.js
@@ -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 {
diff --git a/src/sites.js b/src/sites.js
index 62786009..2f75bb7c 100644
--- a/src/sites.js
+++ b/src/sites.js
@@ -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',
diff --git a/src/tags.js b/src/tags.js
index 935c6090..f505de04 100644
--- a/src/tags.js
+++ b/src/tags.js
@@ -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.*',
diff --git a/src/utils/where-or.js b/src/utils/where-or.js
index ef4553bf..c4cf8c5f 100644
--- a/src/utils/where-or.js
+++ b/src/utils/where-or.js
@@ -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);
}
});
}
diff --git a/src/web/actors.js b/src/web/actors.js
index 81f32dac..daadbe15 100644
--- a/src/web/actors.js
+++ b/src/web/actors.js
@@ -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);
}
diff --git a/src/web/networks.js b/src/web/networks.js
index d77dac43..909afd18 100644
--- a/src/web/networks.js
+++ b/src/web/networks.js
@@ -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);
}
diff --git a/src/web/releases.js b/src/web/releases.js
index 5b612a70..b970e54d 100644
--- a/src/web/releases.js
+++ b/src/web/releases.js
@@ -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);
}
diff --git a/src/web/tags.js b/src/web/tags.js
index f2073b31..4a3966da 100644
--- a/src/web/tags.js
+++ b/src/web/tags.js
@@ -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);
}