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 @@
/>
-
+
+
+
-
+
+ stashScene(stashId)"
+ @unstash="(stashId) => unstashScene(stashId)"
+ />
+
+ stashScene(stashId)"
+ @unstash="(stashId) => unstashScene(stashId)"
+ />
+
+
+
+ unstashScene()"
+ />
+
+ stashScene()"
+ />
+
@@ -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
+
+
+
- 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 = {