diff --git a/assets/components/tags/tag.vue b/assets/components/tags/tag.vue
index e070a712..d7f4020d 100644
--- a/assets/components/tags/tag.vue
+++ b/assets/components/tags/tag.vue
@@ -50,7 +50,7 @@
-
+
@@ -68,17 +68,13 @@ import Releases from '../releases/releases.vue';
const converter = new Converter();
async function fetchReleases() {
- this.releases = await this.$store.dispatch('fetchTagReleases', this.$route.params.tagSlug);
+ this.tag = await this.$store.dispatch('fetchTags', { tagSlug: this.$route.params.tagSlug });
}
async function mounted() {
- [this.tag] = await Promise.all([
- this.$store.dispatch('fetchTags', { tagId: this.$route.params.tagSlug }),
- this.fetchReleases(),
- ]);
-
- this.description = converter.makeHtml(escapeHtml(this.tag.description));
+ this.tag = await this.$store.dispatch('fetchTags', { tagSlug: this.$route.params.tagSlug });
+ this.description = this.tag.description && converter.makeHtml(escapeHtml(this.tag.description));
this.pageTitle = this.tag.name;
}
@@ -90,6 +86,7 @@ export default {
data() {
return {
tag: null,
+ description: null,
releases: null,
pageTitle: null,
};
diff --git a/assets/components/tags/tags.vue b/assets/components/tags/tags.vue
index 547e3cbf..e719c2b0 100644
--- a/assets/components/tags/tags.vue
+++ b/assets/components/tags/tags.vue
@@ -47,7 +47,7 @@ import Tag from '../tile/tag.vue';
async function mounted() {
const tags = await this.$store.dispatch('fetchTags', {
- slug: [
+ slugs: [
'airtight',
'anal',
'double-anal',
diff --git a/assets/js/curate.js b/assets/js/curate.js
new file mode 100644
index 00000000..61ad51d4
--- /dev/null
+++ b/assets/js/curate.js
@@ -0,0 +1,30 @@
+function curateActor(actor) {
+ const curatedActor = {
+ ...actor,
+ avatar: actor.avatar[0],
+ origin: actor.originCountry && {
+ country: actor.originCountry,
+ },
+ };
+
+ return curatedActor;
+}
+
+function curateRelease(release) {
+ const curatedRelease = {
+ ...release,
+ actors: release.actors.map(({ actor }) => curateActor(actor)),
+ poster: release.poster[0],
+ network: release.site.network,
+ tags: release.tags.map(({ tag }) => tag),
+ };
+
+ if (release.trailer) [curatedRelease.trailer] = release.trailer;
+
+ return curatedRelease;
+}
+
+export {
+ curateActor,
+ curateRelease,
+};
diff --git a/assets/js/fragments.js b/assets/js/fragments.js
new file mode 100644
index 00000000..7af033c4
--- /dev/null
+++ b/assets/js/fragments.js
@@ -0,0 +1,119 @@
+const siteFragment = `
+ site {
+ id
+ name
+ slug
+ url
+ network {
+ id
+ name
+ slug
+ url
+ }
+ }
+`;
+
+const releaseActorsFragment = `
+ actors: releasesActors(orderBy: GENDER_ASC) {
+ actor: releaseActor {
+ id
+ name
+ slug
+ birthdate
+ age
+ originCountry: countryByBirthCountryAlpha2 {
+ alpha2
+ name
+ alias
+ }
+ avatar: actorsMediasByTargetId(condition: { role: "avatar" }) {
+ thumbnail
+ }
+ }
+ }
+`;
+
+const releaseTagsFragment = `
+ tags: releasesTagsByTargetId {
+ tag: releaseTag {
+ name
+ priority
+ slug
+ id
+ }
+ }
+`;
+
+const releasePosterFragment = `
+ poster: releasesMediasByTargetId(condition: { role: "poster" }) {
+ index
+ path
+ thumbnail
+ }
+`;
+
+const releasePhotosFragment = `
+ photos: releasesMediasByTargetId(condition: { role: "photo" }) {
+ index
+ path
+ thumbnail
+ }
+`;
+
+const releaseTrailerFragment = `
+ trailer: releasesMediasByTargetId(condition: { role: "trailer" }) {
+ index
+ path
+ thumbnail
+ }
+`;
+
+const releasesFragment = `
+ releases(first:$limit, orderBy: DATE_DESC) {
+ id
+ title
+ date
+ createdAt
+ url
+ ${releaseActorsFragment}
+ ${releaseTagsFragment}
+ ${releasePosterFragment}
+ ${siteFragment}
+ }
+`;
+
+const releaseFragment = `
+ release(id: $releaseId) {
+ id
+ title
+ description
+ date
+ duration
+ createdAt
+ shootId
+ url
+ ${releaseActorsFragment}
+ ${releaseTagsFragment}
+ ${releasePosterFragment}
+ ${releasePhotosFragment}
+ ${releaseTrailerFragment}
+ ${siteFragment}
+ studio {
+ id
+ name
+ slug
+ url
+ }
+ }
+`;
+
+export {
+ releaseActorsFragment,
+ releaseTagsFragment,
+ releasePosterFragment,
+ releasePhotosFragment,
+ releaseTrailerFragment,
+ releasesFragment,
+ releaseFragment,
+ siteFragment,
+};
diff --git a/assets/js/releases/actions.js b/assets/js/releases/actions.js
index e6dc8912..39116d10 100644
--- a/assets/js/releases/actions.js
+++ b/assets/js/releases/actions.js
@@ -1,24 +1,6 @@
import { graphql } from '../api';
-
-function curateRelease(release) {
- const curatedRelease = {
- ...release,
- actors: release.actors.map(({ actor }) => ({
- ...actor,
- avatar: actor.avatar[0],
- origin: actor.originCountry && {
- country: actor.originCountry,
- },
- })),
- poster: release.poster[0],
- network: release.site.network,
- tags: release.tags.map(({ tag }) => tag),
- };
-
- if (release.trailer) [curatedRelease.trailer] = release.trailer;
-
- return curatedRelease;
-}
+import { releasesFragment, releaseFragment } from '../fragments';
+import { curateRelease } from '../curate';
function initReleasesActions(_store, _router) {
async function fetchReleases({ _commit }, { limit = 100 }) {
@@ -32,58 +14,7 @@ function initReleasesActions(_store, _router) {
const { releases } = await graphql(`
query Releases($limit:Int!) {
- releases(first:$limit, orderBy: DATE_DESC) {
- id
- title
- description
- date
- duration
- createdAt
- shootId
- url
- actors: actorsAssociateds {
- actor {
- id
- name
- slug
- birthdate
- age
- originCountry: countryByBirthCountryAlpha2 {
- alpha2
- name
- alias
- }
- avatar: actorsMediasByTargetId(condition: { role: "avatar" }) {
- thumbnail
- }
- }
- }
- poster: releasesMediasByTargetId(condition: { role: "poster" }) {
- index
- path
- thumbnail
- }
- tags: releasesTagsByTargetId {
- tag: releaseTag {
- name
- priority
- slug
- id
- }
- }
- site {
- id
- name
- slug
- url
- network {
- id
- name
- slug
- url
- }
- }
- }
+ ${releasesFragment}
}
`, {
limit,
@@ -97,68 +28,7 @@ function initReleasesActions(_store, _router) {
const { release } = await graphql(`
query Release($releaseId:Int!) {
- release(id: $releaseId) {
- id
- title
- description
- date
- duration
- createdAt
- shootId
- url
- actors: actorsAssociateds {
- actor {
- id
- name
- slug
- birthdate
- age
- originCountry: countryByBirthCountryAlpha2 {
- alpha2
- name
- alias
- }
- avatar: actorsMediasByTargetId(condition: { role: "avatar" }) {
- thumbnail
- }
- }
- }
- poster: releasesMediasByTargetId(condition: { role: "poster" }) {
- index
- path
- thumbnail
- }
- photos: releasesMediasByTargetId(condition: { role: "photo" }) {
- index
- path
- thumbnail
- }
- trailer: releasesMediasByTargetId(condition: { role: "trailer" }) {
- index
- path
- thumbnail
- }
- tags: releasesTagsByTargetId {
- tag: releaseTag {
- name
- priority
- slug
- id
- }
- }
- site {
- id
- name
- slug
- url
- network {
- id
- name
- slug
- url
- }
- }
- }
+ ${releaseFragment}
}
`, {
releaseId: Number(releaseId),
diff --git a/assets/js/tags/actions.js b/assets/js/tags/actions.js
index 8da5bc78..9fcdcaa4 100644
--- a/assets/js/tags/actions.js
+++ b/assets/js/tags/actions.js
@@ -1,23 +1,100 @@
-import { get } from '../api';
+import { graphql, get } from '../api';
+import {
+ releasePosterFragment,
+ releaseActorsFragment,
+ releaseTagsFragment,
+ siteFragment,
+} from '../fragments';
+import { curateRelease } from '../curate';
+
+function curateTag(tag) {
+ const curatedTag = {
+ ...tag,
+ };
+
+ if (tag.releases) curatedTag.releases = tag.releases.map(({ tagRelease }) => curateRelease(tagRelease));
+ if (tag.poster) [curatedTag.poster] = tag.poster;
+
+ return curatedTag;
+}
function initTagsActions(store, _router) {
+ async function fetchTagBySlug(tagSlug) {
+ const { tagBySlug } = await graphql(`
+ query Tag($tagSlug:String!) {
+ tagBySlug(slug:$tagSlug) {
+ id
+ name
+ slug
+ description
+ group {
+ name
+ slug
+ }
+ poster: tagsMediasByTargetId(condition: { role: "poster" }) {
+ id
+ thumbnail
+ path
+ }
+ photos: tagsMediasByTargetId(condition: { role: "photo" }) {
+ id
+ thumbnail
+ path
+ }
+ releases: releasesTags {
+ tagRelease {
+ id
+ title
+ date
+ createdAt
+ url
+ ${releaseActorsFragment}
+ ${releaseTagsFragment}
+ ${releasePosterFragment}
+ ${siteFragment}
+ }
+ }
+ }
+ }
+ `, {
+ tagSlug,
+ });
+
+ return curateTag(tagBySlug);
+ }
+
async function fetchTags({ _commit }, {
- tagId,
+ tagSlug,
limit = 100,
- slug,
- group,
- priority,
+ slugs = [],
+ _group,
+ _priority,
}) {
- if (tagId) {
- return get(`/tags/${tagId}`);
+ if (tagSlug) {
+ return fetchTagBySlug(tagSlug);
}
- return get('/tags', {
+ const { tags } = await graphql(`
+ query Tags($slugs: [String!] = [], $limit: Int = 100) {
+ tags(filter: {slug: {in: $slugs}}, first: $limit) {
+ id
+ name
+ slug
+ poster: tagsMediasByTargetId(condition: { role: "poster" }) {
+ thumbnail
+ }
+ group {
+ name
+ slug
+ }
+ }
+ }
+ `, {
+ slugs,
limit,
- slug,
- priority,
- group,
});
+
+ return tags.map(tag => curateTag(tag));
}
async function fetchTagReleases({ _commit }, tagId) {
@@ -33,6 +110,7 @@ function initTagsActions(store, _router) {
return {
fetchTags,
fetchTagReleases,
+ fetchTagBySlug,
};
}
diff --git a/migrations/20190325001339_releases.js b/migrations/20190325001339_releases.js
index 41b53eaa..c159f0f6 100644
--- a/migrations/20190325001339_releases.js
+++ b/migrations/20190325001339_releases.js
@@ -249,7 +249,7 @@ exports.up = knex => Promise.resolve()
.defaultTo(knex.fn.now());
}))
.then(() => knex.schema.createTable('actors_associated', (table) => {
- table.increments('id', 16);
+ // table.increments('id', 16);
table.integer('release_id', 16)
.notNullable()
@@ -292,9 +292,11 @@ exports.up = knex => Promise.resolve()
.then(() => knex.raw(`
CREATE VIEW releases_media AS SELECT * FROM media WHERE domain = 'releases';
CREATE VIEW actors_media AS SELECT * FROM media WHERE domain = 'actors';
- CREATE VIEW tags_media AS SELECT * FROM media WHERE domain = 'media';
+ CREATE VIEW tags_media AS SELECT * FROM media WHERE domain = 'tags';
CREATE VIEW releases_tags AS SELECT * FROM tags_associated WHERE domain = 'releases';
+ /* used for sorting release actors and tags */
+ CREATE VIEW releases_actors AS SELECT actors_associated.*,actors.gender,actors.birthdate FROM actors_associated LEFT JOIN actors ON actors_associated.actor_id = actors.id;
CREATE VIEW actors_social AS SELECT * FROM social WHERE domain = 'actors';
@@ -306,6 +308,9 @@ exports.up = knex => Promise.resolve()
COMMENT ON VIEW releases_tags IS E'@foreignKey (target_id) references releases (id)|@fieldName tagRelease\n@foreignKey (tag_id) references tags (id)|@fieldName releaseTag';
+ /* restore foreign keys in view, used for sorting release actors */
+ COMMENT ON VIEW releases_actors IS E'@foreignKey (release_id) references releases (id)|@fieldName actorRelease\n@foreignKey (actor_id) references actors (id)|@fieldName releaseActor';
+
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';
`));
@@ -317,6 +322,7 @@ exports.down = knex => Promise.resolve()
DROP VIEW tags_media;
DROP VIEW releases_tags;
+ DROP VIEW releases_actors;
DROP VIEW actors_social;
`))
diff --git a/seeds/04_media.js b/seeds/04_media.js
index 4b328b10..9868dc9e 100644
--- a/seeds/04_media.js
+++ b/seeds/04_media.js
@@ -19,7 +19,7 @@ function getMedia(tagsMap) {
comment: 'Chloe Amour in "DP Masters 4" for Jules Jordan',
},
{
- path: 'tags/airtight/0/poster.jpeg',
+ path: 'tags/airtight/0.jpeg',
domain: 'tags',
target_id: tagsMap.airtight,
comment: 'Sheena Shaw in "Ass Worship 14" for Jules Jordan',
diff --git a/src/scrape-sites.js b/src/scrape-sites.js
index d323b7d5..0859dbf7 100644
--- a/src/scrape-sites.js
+++ b/src/scrape-sites.js
@@ -143,8 +143,7 @@ async function scrapeReleases() {
});
if (argv.save) {
- const { movies } = await storeReleases(scrapedNetworks.flat(2));
- console.log(movies);
+ await storeReleases(scrapedNetworks.flat(2));
}
}
diff --git a/src/web/plugins/actors.js b/src/web/plugins/actors.js
index 9899dce5..4e073cdd 100644
--- a/src/web/plugins/actors.js
+++ b/src/web/plugins/actors.js
@@ -20,6 +20,8 @@ const schemaExtender = makeExtendSchemaPlugin(_build => ({
resolvers: {
Actor: {
age(parent, _args, _context, _info) {
+ console.log(parent);
+
if (!parent.birthdate) return null;
return moment().diff(parent.birthdate, 'years');