Removed views in favor of PostGraphile filter and sort plugins. Updated site modules to GraphQL. Added tag posters.

This commit is contained in:
ThePendulum 2020-01-04 02:51:58 +01:00
parent 70e27a6cd9
commit 72b175e9e2
46 changed files with 232 additions and 52 deletions

View File

@ -3,7 +3,7 @@
v-if="actor"
class="content actor"
>
<FilterBar :fetch-releases="fetchReleases" />
<FilterBar :fetch-releases="fetchActor" />
<div class="actor-inner">
<div class="profile">
@ -243,8 +243,8 @@ import Photos from './photos.vue';
import FilterBar from '../header/filter-bar.vue';
import Releases from '../releases/releases.vue';
async function fetchReleases() {
this.releases = await this.$store.dispatch('fetchActorReleases', this.$route.params.actorSlug);
async function fetchActor() {
this.actor = await this.$store.dispatch('fetchActors', { actorSlug: this.$route.params.actorSlug });
}
function scrollPhotos(event) {
@ -252,7 +252,7 @@ function scrollPhotos(event) {
}
async function mounted() {
this.actor = await this.$store.dispatch('fetchActors', { actorSlug: this.$route.params.actorSlug });
this.fetchActor();
if (this.actor) {
this.pageTitle = this.actor.name;
@ -275,7 +275,7 @@ export default {
},
mounted,
methods: {
fetchReleases,
fetchActor,
scrollPhotos,
},
};

View File

@ -3,7 +3,7 @@
v-if="site"
class="content site"
>
<FilterBar :fetch-releases="fetchReleases" />
<FilterBar :fetch-releases="fetchSite" />
<div class="content-inner">
<div class="header">
@ -59,15 +59,13 @@
import FilterBar from '../header/filter-bar.vue';
import Releases from '../releases/releases.vue';
async function fetchReleases() {
this.releases = await this.$store.dispatch('fetchSiteReleases', this.$route.params.siteSlug);
async function fetchSite() {
this.site = await this.$store.dispatch('fetchSites', { siteSlug: this.$route.params.siteSlug });
this.releases = this.site.releases;
}
async function mounted() {
[[this.site]] = await Promise.all([
this.$store.dispatch('fetchSites', this.$route.params.siteSlug),
this.fetchReleases(),
]);
await this.fetchSite();
this.pageTitle = this.site.name;
}
@ -86,7 +84,7 @@ export default {
},
mounted,
methods: {
fetchReleases,
fetchSite,
},
};
</script>

View File

@ -1,5 +1,15 @@
<template>
<div class="tags">
<h3>Oral Sex</h3>
<div class="tiles">
<Tag
v-for="tag in tags.oral"
:key="`tag-${tag.id}`"
:tag="tag"
/>
</div>
<h3>Ethnicity</h3>
<div class="tiles">
@ -39,6 +49,16 @@
:tag="tag"
/>
</div>
<h3>Misc</h3>
<div class="tiles">
<Tag
v-for="tag in tags.misc.concat(tags.body)"
:key="`tag-${tag.id}`"
:tag="tag"
/>
</div>
</div>
</template>
@ -50,40 +70,52 @@ async function mounted() {
slugs: [
'airtight',
'anal',
'anal-creampie',
'asian',
'ass-eating',
'ass-to-mouth',
'blowbang',
'blowjob',
'bukkake',
'caucasian',
'creampie',
'da-tp',
'deepthroat',
'double-anal',
'double-blowjob',
'double-penetration',
'double-vaginal',
'da-tp',
'dv-tp',
'triple-anal',
'blowbang',
'gangbang',
'mff',
'mfm',
'orgy',
'asian',
'caucasian',
'ebony',
'facefuck',
'facial',
'gangbang',
'gapes',
'interracial',
'latina',
'anal-creampie',
'bukkake',
'creampie',
'facial',
'mff',
'mfm',
'oral-creampie',
'orgy',
'pussy-eating',
'swallowing',
'tattoo',
'trainbang',
'triple-anal',
],
});
console.log(tags);
this.tags = tags.reduce((acc, tag) => {
if (!tag.group) {
return { ...acc, misc: [...acc.misc, tag] };
}
if (acc[tag.group.slug]) {
return { ...acc, [tag.group.slug]: [...acc[tag.group.slug], tag] };
}
return { ...acc, [tag.group.slug]: [tag] };
}, {});
}, { misc: [] });
}
export default {

View File

@ -4,14 +4,14 @@
:title="tag.name"
class="tile"
>
<span class="title">{{ tag.name }}</span>
<img
v-if="tag.poster"
:src="`/img/${tag.poster.thumbnail}`"
:alt="tag.name"
class="poster"
>
<span class="title">{{ tag.name }}</span>
</a>
</template>

View File

@ -45,9 +45,14 @@ function curateActor(actor) {
}
function initActorActions(store, _router) {
async function fetchActorBySlug(actorSlug) {
async function fetchActorBySlug(actorSlug, limit = 100) {
const { actor } = await graphql(`
query Actor($actorSlug:String!) {
query Actor(
$actorSlug: String!
$limit:Int = 1000,
$after:Date = "1900-01-01",
$before:Date = "2100-01-01",
) {
actor: actorBySlug(slug: $actorSlug) {
id
name
@ -105,7 +110,18 @@ function initActorActions(store, _router) {
name
slug
}
releases: releasesActors {
releases: releasesActors(
filter: {
release: {
date: {
lessThan: $before,
greaterThan: $after,
}
}
},
first: $limit,
orderBy: RELEASE_BY_RELEASE_ID__DATE_DESC,
) {
release {
id
url
@ -132,6 +148,9 @@ function initActorActions(store, _router) {
}
`, {
actorSlug,
limit,
after: store.getters.after,
before: store.getters.before,
});
return curateActor(actor);

View File

@ -29,7 +29,7 @@ const sitesFragment = `
`;
const releaseActorsFragment = `
actors: releasesActorsSortables(orderBy: GENDER_ASC) {
actors: releasesActors(orderBy: ACTOR_BY_ACTOR_ID__GENDER_ASC) {
actor {
id
name
@ -51,7 +51,7 @@ const releaseActorsFragment = `
`;
const releaseTagsFragment = `
tags: releasesTagsSortables(orderBy: PRIORITY_DESC) {
tags: releasesTags(orderBy: TAG_BY_TAG_ID__PRIORITY_DESC) {
tag {
name
priority

View File

@ -1,12 +1,69 @@
import { get } from '../api';
import { graphql } from '../api';
import { releasesFragment } from '../fragments';
import { curateSite } from '../curate';
function initSitesActions(store, _router) {
async function fetchSites({ _commit }, siteId) {
const sites = await get(`/sites/${siteId || ''}`);
async function fetchSiteBySlug(siteSlug, limit = 100) {
const { site } = await graphql(`
query Site(
$siteSlug: String!,
$limit:Int = 100,
$after:Date = "1900-01-01",
$before:Date = "2100-01-01",
) {
site: siteBySlug(slug: $siteSlug) {
name
slug
url
network {
id
name
slug
url
}
${releasesFragment}
}
}
`, {
siteSlug,
limit,
after: store.getters.after,
before: store.getters.before,
});
console.log(site);
return curateSite(site);
}
async function fetchSites({ _commit }, { siteSlug, limit = 100 }) {
if (siteSlug) {
return fetchSiteBySlug(siteSlug, limit);
}
const { sites } = await graphql(`
query Sites(
$actorSlug: String!
$limit:Int = 100,
$after:Date = "1900-01-01",
$before:Date = "2100-01-01",
) {
site {
name
slug
url
}
}
`, {
limit,
after: store.getters.after,
before: store.getters.before,
});
return sites;
}
/*
async function fetchSiteReleases({ _commit }, siteId) {
const releases = await get(`/sites/${siteId}/releases`, {
filter: store.state.ui.filter,
@ -16,10 +73,11 @@ function initSitesActions(store, _router) {
return releases;
}
*/
return {
fetchSites,
fetchSiteReleases,
// fetchSiteReleases,
};
}

View File

@ -431,6 +431,10 @@ exports.up = knex => Promise.resolve()
table.unique(['tag_id', 'release_id']);
}))
.then(() => knex.raw(`
COMMENT ON COLUMN actors.height IS E'@omit read,update,create,delete,all,many';
COMMENT ON COLUMN actors.weight IS E'@omit read,update,create,delete,all,many';
/*
CREATE VIEW releases_actors_sortable AS
SELECT releases_actors.*, actors.gender, actors.name, actors.birthdate FROM releases_actors
JOIN actors ON releases_actors.actor_id = actors.id;
@ -439,19 +443,22 @@ exports.up = knex => Promise.resolve()
SELECT releases_tags.*, tags.name, tags.priority FROM releases_tags
JOIN tags ON releases_tags.tag_id = tags.id;
CREATE VIEW actors_releases_sortable AS
SELECT releases_actors.*, releases.date FROM releases_actors
JOIN releases ON releases_actors.release_id = releases.id;
COMMENT ON VIEW releases_actors_sortable IS E'@foreignKey (release_id) references releases (id)\n@foreignKey (actor_id) references actors (id)';
COMMENT ON VIEW releases_tags_sortable IS E'@foreignKey (release_id) references releases (id)\n@foreignKey (tag_id) references tags (id)';
COMMENT ON VIEW actors_releases_sortable IS E'@foreignKey (release_id) references releases (id)\n@foreignKey (actor_id) references actors (id)';
/* allow conversion resolver to be added for height and weight */
COMMENT ON COLUMN actors.height IS E'@omit read,update,create,delete,all,many';
COMMENT ON COLUMN actors.weight IS E'@omit read,update,create,delete,all,many';
CREATE FUNCTION releases_by_tag_slugs(slugs text[]) RETURNS setof releases AS $$
SELECT DISTINCT ON (releases.id) releases.* FROM releases
JOIN releases_tags ON (releases_tags.release_id = releases.id)
JOIN tags ON (releases_tags.tag_id = tags.id)
WHERE tags.slug = ANY($1);
$$ LANGUAGE sql STABLE
*/
`));
exports.down = knex => knex.raw(`

5
package-lock.json generated
View File

@ -1421,6 +1421,11 @@
"to-fast-properties": "^2.0.0"
}
},
"@graphile-contrib/pg-order-by-related": {
"version": "1.0.0-beta.6",
"resolved": "https://registry.npmjs.org/@graphile-contrib/pg-order-by-related/-/pg-order-by-related-1.0.0-beta.6.tgz",
"integrity": "sha512-NDEDhkjpEmLzVMYsv9LqTNyaMXlL32yiFFk7Lj7WAloe1Dgn9/1zMQILMRC+Q9WmFE/edHtXjBRHrXs9NYr3GA=="
},
"@graphile-contrib/pg-simplify-inflector": {
"version": "5.0.0-beta.1",
"resolved": "https://registry.npmjs.org/@graphile-contrib/pg-simplify-inflector/-/pg-simplify-inflector-5.0.0-beta.1.tgz",

View File

@ -66,6 +66,7 @@
"webpack-cli": "^3.3.10"
},
"dependencies": {
"@graphile-contrib/pg-order-by-related": "^1.0.0-beta.6",
"@graphile-contrib/pg-simplify-inflector": "^5.0.0-beta.1",
"@tensorflow/tfjs-node": "^1.4.0",
"babel-polyfill": "^6.26.0",

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 124 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 99 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 112 KiB

After

Width:  |  Height:  |  Size: 845 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 110 KiB

BIN
public/img/tags/anal/0.jpeg Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 107 KiB

BIN
public/img/tags/anal/0_thumb.jpeg Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

BIN
public/img/tags/anal/poster.jpeg Executable file → Normal file

Binary file not shown.

Before

Width:  |  Height:  |  Size: 107 KiB

After

Width:  |  Height:  |  Size: 684 KiB

BIN
public/img/tags/anal/poster_thumb.jpeg Executable file → Normal file

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 102 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 64 KiB

After

Width:  |  Height:  |  Size: 800 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 107 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 494 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 107 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 100 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 99 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 113 KiB

After

Width:  |  Height:  |  Size: 391 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 115 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 78 KiB

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 137 KiB

BIN
public/img/tags/gangbang/0.jpeg Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 108 KiB

BIN
public/img/tags/gangbang/poster.jpeg Executable file → Normal file

Binary file not shown.

Before

Width:  |  Height:  |  Size: 115 KiB

After

Width:  |  Height:  |  Size: 1.0 MiB

BIN
public/img/tags/gangbang/poster_thumb.jpeg Executable file → Normal file

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 127 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 446 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 97 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 402 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 93 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 113 KiB

View File

@ -33,6 +33,10 @@ const groups = [
slug: 'location',
name: 'Location',
},
{
slug: 'oral',
name: 'Oral',
},
{
slug: 'orientation',
name: 'Orientation',
@ -136,16 +140,19 @@ function getTags(groupsMap) {
priority: 6,
description: 'Sucking off a cock right after anal, giving your own or someone else`s asshole a second hand taste.',
alias_for: null,
group_id: groupsMap.oral,
},
{
name: 'ass eating',
slug: 'ass-eating',
alias_for: null,
group_id: groupsMap.oral,
},
{
name: 'ball licking',
slug: 'ball-licking',
alias_for: null,
group_id: groupsMap.oral,
},
{
name: 'ballerina',
@ -211,6 +218,7 @@ function getTags(groupsMap) {
slug: 'blowjob',
priority: 7,
alias_for: null,
group_id: groupsMap.oral,
},
{
name: 'blowbang',
@ -319,6 +327,7 @@ function getTags(groupsMap) {
slug: 'deepthroat',
priority: 7,
alias_for: null,
group_id: groupsMap.oral,
},
{
name: 'double penetration',
@ -345,11 +354,13 @@ function getTags(groupsMap) {
name: 'double blowjob',
slug: 'double-blowjob',
alias_for: null,
group_id: groupsMap.oral,
},
{
name: 'doggy style',
slug: 'doggy-style',
alias_for: null,
group_id: groupsMap.position,
},
{
name: 'dress',
@ -379,7 +390,7 @@ function getTags(groupsMap) {
slug: 'facefuck',
priority: 9,
alias_for: null,
group_id: groupsMap.position,
group_id: groupsMap.oral,
},
{
name: 'facesitting',
@ -645,6 +656,7 @@ function getTags(groupsMap) {
name: 'pussy eating',
slug: 'pussy-eating',
alias_for: null,
group_id: groupsMap.oral,
},
{
name: 'redhead',

View File

@ -9,7 +9,17 @@ const tagPosters = [
{
path: 'tags/anal/poster.jpeg',
tagSlug: 'anal',
comment: '',
comment: 'Jynx Maze in "Anal Buffet 6" for Evil Angel',
},
{
path: 'tags/ass-to-mouth/poster.jpeg',
tagSlug: 'ass-to-mouth',
comment: 'Alysa Gap and Logan in "Anal Buffet 4" for Evil Angel',
},
{
path: 'tags/gapes/poster.jpeg',
tagSlug: 'gapes',
comment: 'Paulina in "Anal Buffet 4" for Evil Angel',
},
{
path: 'tags/da-tp/0.jpeg',
@ -24,7 +34,7 @@ const tagPosters = [
{
path: 'tags/double-anal/poster.jpeg',
tagSlug: 'double-anal',
comment: '',
comment: 'Haley Reed in "Young Hot Ass" for Evil Angel',
},
{
path: 'tags/double-vaginal/poster.jpeg',
@ -54,7 +64,7 @@ const tagPosters = [
{
path: 'tags/gangbang/poster.jpeg',
tagSlug: 'gangbang',
comment: '',
comment: 'Kristen Scott in "Interracial Gangbang!" for Jules Jordan',
},
{
path: 'tags/mff/poster.jpeg',
@ -74,7 +84,7 @@ const tagPosters = [
{
path: 'tags/asian/poster.jpeg',
tagSlug: 'asian',
comment: '',
comment: 'Vina Sky in "Young and Glamorous 10" for Jules Jordan',
},
{
path: 'tags/caucasian/poster.jpeg',
@ -101,6 +111,11 @@ const tagPosters = [
tagSlug: 'facial',
comment: '',
},
{
path: 'tags/trainbang/poster.jpeg',
tagSlug: 'trainbang',
comment: 'Nicole Black in GIO971 for LegalPorno',
},
{
path: 'tags/bukkake/poster.jpeg',
tagSlug: 'bukkake',
@ -135,6 +150,11 @@ const tagPosters = [
}));
const tagPhotos = [
{
path: 'tags/airtight/3.jpeg',
tagSlug: 'airtight',
comment: 'Anita Bellini in "Triple Dick Gangbang" for Hands On Hardcore (DDF Network)',
},
{
path: 'tags/airtight/2.jpeg',
tagSlug: 'airtight',
@ -151,6 +171,21 @@ const tagPhotos = [
tagSlug: 'airtight',
comment: 'Sheena Shaw in "Ass Worship 14" for Jules Jordan',
},
{
path: 'tags/anal/0.jpeg',
tagSlug: 'anal',
comment: '',
},
{
path: 'tags/double-anal/1.jpeg',
tagSlug: 'double-anal',
comment: 'Ria Sunn in SZ1801 for LegalPorno',
},
{
path: 'tags/double-anal/0.jpeg',
tagSlug: 'double-anal',
comment: 'Nicole Black doing double anal during a gangbang in GIO971 for LegalPorno',
},
{
path: 'tags/da-tp/3.jpeg',
tagSlug: 'da-tp',
@ -176,6 +211,11 @@ const tagPhotos = [
tagSlug: 'dv-tp',
comment: 'Luna Rival in LegalPorno SZ1490',
},
{
path: 'tags/gapes/0.jpeg',
tagSlug: 'gapes',
comment: 'McKenzee Miles in "Anal Buffet 4" for Evil Angel',
},
{
path: 'tags/triple-anal/1.jpeg',
tagSlug: 'triple-anal',
@ -191,6 +231,11 @@ const tagPhotos = [
tagSlug: 'gangbang',
comment: 'Ginger Lynn in "Gangbang Mystique", a photoset shot by Suze Randall for Puritan No. 10, 1984. This photo pushed the boundaries of pornography at the time, as depicting a woman \'fully occupied\' was unheard of.',
},
{
path: 'tags/gangbang/0.jpeg',
tagSlug: 'gangbang',
comment: '"4 On 1 Gangbangs" for Doghouse Digital',
},
{
path: 'tags/gangbang/2.jpeg',
tagSlug: 'gangbang',

View File

@ -48,7 +48,6 @@ async function createThumbnail(buffer) {
}
async function createMediaDirectory(domain, subpath) {
console.log(domain, subpath);
const filepath = path.join(config.media.path, domain, subpath);
await fs.mkdir(filepath, { recursive: true });

View File

@ -7,8 +7,9 @@ const { postgraphile } = require('postgraphile');
const Router = require('express-promise-router');
const bodyParser = require('body-parser');
const ConnectionFilterPlugin = require('postgraphile-plugin-connection-filter');
const PgConnectionFilterPlugin = require('postgraphile-plugin-connection-filter');
const PgSimplifyInflectorPlugin = require('@graphile-contrib/pg-simplify-inflector');
const PgOrderByRelatedPlugin = require('@graphile-contrib/pg-order-by-related');
const { ActorPlugins } = require('./plugins/plugins');
@ -48,9 +49,12 @@ function initServer() {
simpleCollections: 'only',
graphileBuildOptions: {
pgOmitListSuffix: true,
connectionFilterRelations: true,
},
appendPlugins: [
PgSimplifyInflectorPlugin, ConnectionFilterPlugin,
PgSimplifyInflectorPlugin,
PgConnectionFilterPlugin,
PgOrderByRelatedPlugin,
...ActorPlugins,
],
},