diff --git a/backend/package.json b/backend/package.json index d940937a8..be20a4a6d 100644 --- a/backend/package.json +++ b/backend/package.json @@ -106,4 +106,4 @@ "nodemon": "~1.19.0", "supertest": "~4.0.2" } -} \ No newline at end of file +} diff --git a/backend/src/graphql-schema.js b/backend/src/graphql-schema.js index bad277721..bae4b7833 100644 --- a/backend/src/graphql-schema.js +++ b/backend/src/graphql-schema.js @@ -12,6 +12,7 @@ import rewards from './resolvers/rewards.js' import socialMedia from './resolvers/socialMedia.js' import notifications from './resolvers/notifications' import comments from './resolvers/comments' +import users from './resolvers/users' export const typeDefs = fs .readFileSync( @@ -36,6 +37,7 @@ export const resolvers = { ...rewards.Mutation, ...socialMedia.Mutation, ...notifications.Mutation, - ...comments.Mutation + ...comments.Mutation, + ...users.Mutation } } diff --git a/backend/src/middleware/validation/index.js b/backend/src/middleware/validation/index.js index de9be72e9..ded509b44 100644 --- a/backend/src/middleware/validation/index.js +++ b/backend/src/middleware/validation/index.js @@ -3,7 +3,7 @@ import { UserInputError } from 'apollo-server' const USERNAME_MIN_LENGTH = 3 const validateUsername = async (resolve, root, args, context, info) => { - if (args.name && args.name.length >= USERNAME_MIN_LENGTH) { + if (!('name' in args) || args.name && args.name.length >= USERNAME_MIN_LENGTH) { /* eslint-disable-next-line no-return-await */ return await resolve(root, args, context, info) } else { diff --git a/backend/src/resolvers/users.js b/backend/src/resolvers/users.js new file mode 100644 index 000000000..33ba8c36b --- /dev/null +++ b/backend/src/resolvers/users.js @@ -0,0 +1,29 @@ +import { neo4jgraphql } from 'neo4j-graphql-js' +import { createWriteStream } from 'fs' + + +const storeUpload = ({ stream, fileLocation}) => + new Promise((resolve, reject) => + stream + .pipe(createWriteStream(`public${fileLocation}`)) + .on("finish", () => resolve()) + .on("error", reject) + ); + +export default { + Mutation: { + UpdateUser: async (object, params, context, resolveInfo) => { + const { avatarUpload } = params + + if (avatarUpload) { + const { stream, filename } = await avatarUpload ; + const fileLocation = `/uploads/${filename}` + await storeUpload({ stream, fileLocation }); + delete params.avatarUpload + + params.avatar = fileLocation + } + return await neo4jgraphql(object, params, context, resolveInfo, false) + } + }, +}; diff --git a/backend/src/schema.graphql b/backend/src/schema.graphql index 902a7abf9..d364ba4b3 100644 --- a/backend/src/schema.graphql +++ b/backend/src/schema.graphql @@ -1,3 +1,5 @@ +scalar Upload + type Query { isLoggedIn: Boolean! # Get the currently logged in User based on the given JWT Token @@ -18,6 +20,7 @@ type Query { ) CommentByPost(postId: ID!): [Comment]! } + type Mutation { # Get a JWT Token for the given Email and password login(email: String!, password: String!): String! @@ -99,6 +102,7 @@ type User { slug: String password: String! avatar: String + avatarUpload: Upload deleted: Boolean disabled: Boolean disabledBy: User @relation(name: "DISABLED", direction: "IN")