Can save outfits with items

This commit is contained in:
Emi Matchu 2021-04-20 02:12:07 -07:00
parent f504808e12
commit 6640a2d8ca
2 changed files with 43 additions and 16 deletions

View file

@ -263,10 +263,7 @@ function useOutfitSaving(outfitState) {
isLoggedIn && isLoggedIn &&
(!isSaved || outfitState.creator?.id === currentUserId) && (!isSaved || outfitState.creator?.id === currentUserId) &&
// TODO: Add support for updating outfits // TODO: Add support for updating outfits
!isSaved && !isSaved;
// TODO: Add support for outfits with items
outfitState.wornItemIds.length === 0 &&
outfitState.closetedItemIds.length === 0;
const [sendSaveOutfitMutation, { loading: isSaving }] = useMutation( const [sendSaveOutfitMutation, { loading: isSaving }] = useMutation(
gql` gql`

View file

@ -131,10 +131,6 @@ const resolvers = {
throw new Error("TODO: Add support for updating existing outfits"); throw new Error("TODO: Add support for updating existing outfits");
} }
if (wornItemIds.length > 0 || closetedItemIds.length > 0) {
throw new Error("TODO: Add support for outfits with items");
}
// Get the base name of the provided name: trim it, and strip any "(1)" // Get the base name of the provided name: trim it, and strip any "(1)"
// suffixes. // suffixes.
const baseName = (rawName || "Untitled outfit").replace( const baseName = (rawName || "Untitled outfit").replace(
@ -182,15 +178,49 @@ const resolvers = {
); );
} }
// Save the outfit, and its item_outfit_relationships rows, in a
// transaction.
await db.beginTransaction();
let newOutfitId;
try {
const [result] = await db.execute( const [result] = await db.execute(
` `
INSERT INTO outfits (name, pet_state_id, user_id, created_at, updated_at) INSERT INTO outfits
(name, pet_state_id, user_id, created_at, updated_at)
VALUES (?, ?, ?, CURRENT_TIMESTAMP(), CURRENT_TIMESTAMP()); VALUES (?, ?, ?, CURRENT_TIMESTAMP(), CURRENT_TIMESTAMP());
`, `,
[name, petState.id, currentUserId] [name, petState.id, currentUserId]
); );
newOutfitId = String(result.insertId);
if (wornItemIds.length > 0 || closetedItemIds.length > 0) {
const itemRowPlaceholders = [
[...wornItemIds, ...closetedItemIds].map(
(_) => `(?, ?, ?, CURRENT_TIMESTAMP(), CURRENT_TIMESTAMP())`
),
].join(", ");
const itemRowValues = [
...wornItemIds.map((itemId) => [newOutfitId, itemId, true]),
...closetedItemIds.map((itemId) => [newOutfitId, itemId, false]),
].flat();
await db.execute(
// TODO: When we start saving existing outfits, we'll need a delete
// here too, or some other sync mechanism.
`
INSERT INTO item_outfit_relationships
(outfit_id, item_id, is_worn, created_at, updated_at)
VALUES ${itemRowPlaceholders};
`,
itemRowValues
);
}
await db.commit();
} catch (e) {
await db.rollback();
throw e;
}
const newOutfitId = String(result.insertId);
console.log(`Saved outfit ${newOutfitId}`); console.log(`Saved outfit ${newOutfitId}`);
return { id: newOutfitId }; return { id: newOutfitId };