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');