diff --git a/assets/components/releases/release.vue b/assets/components/releases/release.vue index 6b06cfd8..d5f424fa 100644 --- a/assets/components/releases/release.vue +++ b/assets/components/releases/release.vue @@ -51,19 +51,52 @@ /> - + + + - + + + + + + +
@@ -230,6 +263,7 @@ + + diff --git a/assets/components/stashes/stash.vue b/assets/components/stashes/stash.vue index b4119437..488e0f2f 100644 --- a/assets/components/stashes/stash.vue +++ b/assets/components/stashes/stash.vue @@ -40,7 +40,7 @@ -

Stashes

+
+

Stashes

-
    + +
+ +
  • curateStash(stash.stash || stash)); // eslint-disable-line no-use-before-define + } + curatedActor.stashes = actor.stashes?.map(stash => stash.stash || stash) || []; return curatedActor; @@ -80,6 +84,7 @@ function curateRelease(release) { if (release.directors) curatedRelease.directors = release.directors.filter(Boolean).map(director => curateActor(director.director || director, curatedRelease)); if (release.movieTags && release.movieTags.length > 0) curatedRelease.tags = release.movieTags.filter(Boolean).map(({ tag }) => tag); if (release.movieActors && release.movieActors.length > 0) curatedRelease.actors = release.movieActors.filter(Boolean).map(({ actor }) => curateActor(actor, curatedRelease)); + if (release.stashes) curatedRelease.stashes = release.stashes.filter(Boolean).map(stash => curateStash(stash.stash || stash)); // eslint-disable-line no-use-before-define if (release.productionLocation) { curatedRelease.productionLocation = { @@ -155,7 +160,7 @@ function curateUser(user) { const curatedUser = user; if (user.stashes) { - curatedUser.stashes = user.stashes.map(stash => curateStash(stash)); + curatedUser.stashes = user.stashes.map(stash => curateStash(stash.stash || stash)); } return curatedUser; diff --git a/assets/js/fragments.js b/assets/js/fragments.js index 0b5024ca..a4f3e031 100644 --- a/assets/js/fragments.js +++ b/assets/js/fragments.js @@ -228,7 +228,8 @@ const releaseFields = ` url } isNew - isStashed + isFavorited + isStashed(includeFavorites: false) stashes: stashesScenesBySceneId( filter: { stash: { @@ -242,6 +243,7 @@ const releaseFields = ` id name slug + primary } } `; @@ -368,7 +370,8 @@ const releaseFragment = ` } } } - isStashed + isFavorited + isStashed(includeFavorites: false) stashes: stashesScenesBySceneId( filter: { stash: { @@ -382,6 +385,7 @@ const releaseFragment = ` id name slug + primary } } } diff --git a/assets/js/stashes/actions.js b/assets/js/stashes/actions.js index 49e1dbc3..290c58e5 100644 --- a/assets/js/stashes/actions.js +++ b/assets/js/stashes/actions.js @@ -21,7 +21,7 @@ function initStashesActions(store, _router) { name slug public - deletable + primary user { id username @@ -69,15 +69,11 @@ function initStashesActions(store, _router) { } async function createStash(context, stash) { - const newStash = await post('/stashes', stash); - - return newStash; + return post('/stashes', stash); } async function updateStash(context, { stashId, stash }) { - const newStash = await patch(`/stashes/${stashId}`, stash); - - return newStash; + return patch(`/stashes/${stashId}`, stash); } async function removeStash(context, stashId) { @@ -85,27 +81,27 @@ function initStashesActions(store, _router) { } async function stashActor(context, { actorId, stashId }) { - await post(`/stashes/${stashId}/actors`, { actorId }); + return post(`/stashes/${stashId}/actors`, { actorId }); } async function unstashActor(context, { actorId, stashId }) { - await del(`/stashes/${stashId}/actors/${actorId}`); + return del(`/stashes/${stashId}/actors/${actorId}`); } async function stashScene(context, { sceneId, stashId }) { - await post(`/stashes/${stashId}/scenes`, { sceneId }); + return post(`/stashes/${stashId}/scenes`, { sceneId }); } async function unstashScene(context, { sceneId, stashId }) { - await del(`/stashes/${stashId}/scenes/${sceneId}`); + return del(`/stashes/${stashId}/scenes/${sceneId}`); } async function stashMovie(context, { movieId, stashId }) { - await post(`/stashes/${stashId}/movies`, { movieId }); + return post(`/stashes/${stashId}/movies`, { movieId }); } async function unstashMovie(context, { movieId, stashId }) { - await del(`/stashes/${stashId}/movies/${movieId}`); + return del(`/stashes/${stashId}/movies/${movieId}`); } return { diff --git a/assets/js/users/actions.js b/assets/js/users/actions.js index e390d76e..d435aec0 100644 --- a/assets/js/users/actions.js +++ b/assets/js/users/actions.js @@ -19,7 +19,7 @@ function initUsersActions(store, _router) { name slug public - deletable + primary actors: stashesActors { comment actor { diff --git a/migrations/20190325001339_releases.js b/migrations/20190325001339_releases.js index 062c635f..53b45d39 100644 --- a/migrations/20190325001339_releases.js +++ b/migrations/20190325001339_releases.js @@ -1067,9 +1067,9 @@ exports.up = knex => Promise.resolve() .notNullable() .defaultTo(false); - table.boolean('deletable') + table.boolean('primary') .notNullable() - .defaultTo(true); + .defaultTo(false); table.datetime('created_at') .notNullable() diff --git a/src/auth.js b/src/auth.js index 49259d75..dc08d6d8 100644 --- a/src/auth.js +++ b/src/auth.js @@ -80,7 +80,7 @@ async function signup(credentials) { name: 'Favorites', slug: 'favorites', public: false, - deletable: false, + primary: true, }); return fetchUser(userId); diff --git a/src/stashes.js b/src/stashes.js index 9cd1f849..c2b5a393 100644 --- a/src/stashes.js +++ b/src/stashes.js @@ -13,6 +13,7 @@ function curateStash(stash) { id: stash.id, name: stash.name, slug: stash.slug, + primary: stash.primary, }; return curatedStash; @@ -48,6 +49,18 @@ async function fetchStash(stashId, sessionUser) { return curateStash(stash); } +async function fetchStashes(domain, itemId, sessionUser) { + const stashes = await knex(`stashes_${domain}s`) + .select('stashes.*') + .where({ + [`${domain}_id`]: itemId, + user_id: sessionUser.id, + }) + .leftJoin('stashes', 'stashes.id', `stashes_${domain}s.stash_id`); + + return stashes.map(stash => curateStash(stash)); +} + async function createStash(newStash, sessionUser) { if (!sessionUser) { throw new HttpError('You are not authenthicated', 401); @@ -89,7 +102,7 @@ async function removeStash(stashId, sessionUser) { .where({ id: stashId, user_id: sessionUser.id, - deletable: true, + primary: false, }) .delete(); @@ -106,6 +119,8 @@ async function stashActor(actorId, stashId, sessionUser) { stash_id: stash.id, actor_id: actorId, }); + + return fetchStashes('actor', actorId, sessionUser); } async function stashScene(sceneId, stashId, sessionUser) { @@ -116,6 +131,8 @@ async function stashScene(sceneId, stashId, sessionUser) { stash_id: stash.id, scene_id: sceneId, }); + + return fetchStashes('scene', sceneId, sessionUser); } async function stashMovie(movieId, stashId, sessionUser) { @@ -126,6 +143,8 @@ async function stashMovie(movieId, stashId, sessionUser) { stash_id: stash.id, movie_id: movieId, }); + + return fetchStashes('movie', movieId, sessionUser); } async function unstashActor(actorId, stashId, sessionUser) { @@ -138,6 +157,8 @@ async function unstashActor(actorId, stashId, sessionUser) { .where('stashes_actors.stash_id', knex.raw('deletable.stash_id')) .where('stashes.user_id', sessionUser.id)) .delete(); + + return fetchStashes('actor', actorId, sessionUser); } async function unstashScene(sceneId, stashId, sessionUser) { @@ -150,6 +171,8 @@ async function unstashScene(sceneId, stashId, sessionUser) { .where('stashes_scenes.stash_id', knex.raw('deletable.stash_id')) .where('stashes.user_id', sessionUser.id)) .delete(); + + return fetchStashes('scene', sceneId, sessionUser); } async function unstashMovie(movieId, stashId, sessionUser) { @@ -162,6 +185,8 @@ async function unstashMovie(movieId, stashId, sessionUser) { .where('stashes_movies.stash_id', knex.raw('deletable.stash_id')) .where('stashes.user_id', sessionUser.id)) .delete(); + + return fetchStashes('movie', movieId, sessionUser); } module.exports = { diff --git a/src/web/auth.js b/src/web/auth.js index 176f9544..4894c9c8 100644 --- a/src/web/auth.js +++ b/src/web/auth.js @@ -22,7 +22,7 @@ async function logoutApi(req, res) { async function fetchMeApi(req, res) { if (req.session.user) { - req.session.user = await fetchUser(req.session.user.id, req.session.user); + req.session.user = await fetchUser(req.session.user.id, false, req.session.user); res.send(req.session.user); return; diff --git a/src/web/plugins/actors.js b/src/web/plugins/actors.js index d3e3e0b1..e2e616b4 100644 --- a/src/web/plugins/actors.js +++ b/src/web/plugins/actors.js @@ -12,23 +12,35 @@ const schemaExtender = makeExtendSchemaPlugin(_build => ({ } extend type Actor { - isStashed: Boolean @requires(columns: ["stashesActors"]) + isFavorited: Boolean @requires(columns: ["stashesActors"]) + isStashed(includeFavorites: Boolean = false): Boolean @requires(columns: ["stashesActors"]) ageFromBirth: Int @requires(columns: ["dateOfBirth"]) ageAtDeath: Int @requires(columns: ["dateOfBirth", "dateOfDeath"]) - height(units:Units): String @requires(columns: ["height"]) - weight(units:Units): String @requires(columns: ["weight"]) - penisLength(units:Units): String @requires(columns: ["penis_length"]) - penisGirth(units:Units): String @requires(columns: ["penis_girth"]) + height(units: Units): String @requires(columns: ["height"]) + weight(units: Units): String @requires(columns: ["weight"]) + penisLength(units: Units): String @requires(columns: ["penis_length"]) + penisGirth(units: Units): String @requires(columns: ["penis_girth"]) } `, resolvers: { Actor: { - isStashed(parent) { - if (!parent['@stashes']) { + isFavorited(parent) { + if (!parent['@stashes'] || typeof parent['@stashes'][0]['@stash'].primary === 'undefined') { return null; } - return parent['@stashes'].length > 0; + return parent['@stashes'].some(({ '@stash': stash }) => stash.primary); + }, + isStashed(parent, args) { + if (!parent['@stashes'] || typeof parent['@stashes'][0]['@stash'].primary === 'undefined') { + return null; + } + + if (args.includeFavorites) { + return parent['@stashes'].length > 0; + } + + return parent['@stashes'].some(({ '@stash': stash }) => !stash.primary); }, ageFromBirth(parent, _args, _context, _info) { if (!parent.dateOfBirth) return null; diff --git a/src/web/plugins/releases.js b/src/web/plugins/releases.js index ef5f77c1..235074c6 100644 --- a/src/web/plugins/releases.js +++ b/src/web/plugins/releases.js @@ -5,17 +5,29 @@ const { makeExtendSchemaPlugin, gql } = require('graphile-utils'); const schemaExtender = makeExtendSchemaPlugin(_build => ({ typeDefs: gql` extend type Release { - isStashed: Boolean @requires(columns: ["stashesScenesBySceneId"]) + isFavorited: Boolean @requires(columns: ["stashesScenesBySceneId"]) + isStashed(includeFavorites: Boolean = false): Boolean @requires(columns: ["stashesScenesBySceneId"]) } `, resolvers: { Release: { - isStashed(parent) { - if (!parent['@stashes']) { + isFavorited(parent) { + if (!parent['@stashes'] || typeof parent['@stashes'][0]['@stash'].primary === 'undefined') { return null; } - return parent['@stashes'].length > 0; + return parent['@stashes'].some(({ '@stash': stash }) => stash.primary); + }, + isStashed(parent, args) { + if (!parent['@stashes'] || typeof parent['@stashes'][0]['@stash'].primary === 'undefined') { + return null; + } + + if (args.includeFavorites) { + return parent['@stashes'].length > 0; + } + + return parent['@stashes'].some(({ '@stash': stash }) => !stash.primary); }, }, }, diff --git a/src/web/stashes.js b/src/web/stashes.js index bd8783b0..ce2e90be 100644 --- a/src/web/stashes.js +++ b/src/web/stashes.js @@ -31,39 +31,39 @@ async function removeStashApi(req, res) { } async function stashActorApi(req, res) { - await stashActor(req.body.actorId, req.params.stashId, req.session.user); + const stashes = await stashActor(req.body.actorId, req.params.stashId, req.session.user); - res.status(201).send(); + res.send(stashes); } async function stashSceneApi(req, res) { - await stashScene(req.body.sceneId, req.params.stashId, req.session.user); + const stashes = await stashScene(req.body.sceneId, req.params.stashId, req.session.user); - res.status(201).send(); + res.send(stashes); } async function stashMovieApi(req, res) { - await stashMovie(req.body.movieId, req.params.stashId, req.session.user); + const stashes = await stashMovie(req.body.movieId, req.params.stashId, req.session.user); - res.status(201).send(); + res.send(stashes); } async function unstashActorApi(req, res) { - await unstashActor(req.params.actorId, req.params.stashId, req.session.user); + const stashes = await unstashActor(req.params.actorId, req.params.stashId, req.session.user); - res.status(204).send(); + res.send(stashes); } async function unstashSceneApi(req, res) { - await unstashScene(req.params.sceneId, req.params.stashId, req.session.user); + const stashes = await unstashScene(req.params.sceneId, req.params.stashId, req.session.user); - res.status(204).send(); + res.send(stashes); } async function unstashMovieApi(req, res) { - await unstashMovie(req.params.movieId, req.params.stashId, req.session.user); + const stashes = await unstashMovie(req.params.movieId, req.params.stashId, req.session.user); - res.status(204).send(); + res.send(stashes); } module.exports = {