diff --git a/api/resolvers/upload.js b/api/resolvers/upload.js index 34e86c17..ed19b8a0 100644 --- a/api/resolvers/upload.js +++ b/api/resolvers/upload.js @@ -4,7 +4,7 @@ import { createPresignedPost } from '../s3' export default { Mutation: { - getSignedPOST: async (parent, { type, size, width, height }, { models, me }) => { + getSignedPOST: async (parent, { type, size, width, height, avatar }, { models, me }) => { if (!me) { throw new GraphQLError('you must be logged in to get a signed url', { extensions: { code: 'FORBIDDEN' } }) } @@ -21,19 +21,30 @@ export default { throw new GraphQLError(`image must be less than ${IMAGE_PIXELS_MAX} pixels`, { extensions: { code: 'BAD_INPUT' } }) } - // create upload record - const upload = await models.upload.create({ - data: { - type, - size, - width, - height, - userId: me.id - } - }) + const data = { + type, + size, + width, + height, + userId: me.id + } + + let uploadId + if (avatar) { + const { photoId } = await models.user.findUnique({ where: { id: me.id } }) + if (photoId) uploadId = photoId + } + if (uploadId) { + // update upload record + await models.upload.update({ data, where: { id: uploadId } }) + } else { + // create upload record + const upload = await models.upload.create({ data }) + uploadId = upload.id + } // get presigned POST url - return createPresignedPost({ key: String(upload.id), type, size }) + return createPresignedPost({ key: String(uploadId), type, size }) } } } diff --git a/api/typeDefs/upload.js b/api/typeDefs/upload.js index 07a2e9db..05a90e93 100644 --- a/api/typeDefs/upload.js +++ b/api/typeDefs/upload.js @@ -2,7 +2,7 @@ import { gql } from 'graphql-tag' export default gql` extend type Mutation { - getSignedPOST(type: String!, size: Int!, width: Int!, height: Int!): SignedPost! + getSignedPOST(type: String!, size: Int!, width: Int!, height: Int!, avatar: Boolean): SignedPost! } type SignedPost { diff --git a/components/upload.js b/components/upload.js index 24a784b3..122a26cb 100644 --- a/components/upload.js +++ b/components/upload.js @@ -5,8 +5,8 @@ import { UPLOAD_TYPES_ALLOW } from '../lib/constants' export default function Upload ({ as: Component, onSelect, onStarted, onError, onSuccess }) { const [getSignedPOST] = useMutation( gql` - mutation getSignedPOST($type: String!, $size: Int!, $width: Int!, $height: Int!) { - getSignedPOST(type: $type, size: $size, width: $width, height: $height) { + mutation getSignedPOST($type: String!, $size: Int!, $width: Int!, $height: Int!, $avatar: Boolean!) { + getSignedPOST(type: $type, size: $size, width: $width, height: $height, avatar: $avatar) { url fields } @@ -23,6 +23,7 @@ export default function Upload ({ as: Component, onSelect, onStarted, onError, o try { ({ data } = await getSignedPOST({ variables: { + avatar: true, type: file.type, size: file.size, width: img.width,