@coko/server
Version:
Reusable server for use by Coko's projects
309 lines (277 loc) • 7.96 kB
JavaScript
const { withFilter } = require('graphql-subscriptions')
const logger = require('../../logger')
const subscriptionManager = require('../../graphql/pubsub')
const {
labels: { USER_RESOLVER },
subscriptions: { USER_UPDATED },
} = require('./constants')
const {
getUser,
getUsers,
activateUser,
activateUsers,
deleteUser,
deleteUsers,
deactivateUser,
deactivateUsers,
updateUser,
login,
signUp,
setDefaultIdentity,
verifyEmail,
resendVerificationEmail,
resendVerificationEmailAfterLogin,
updatePassword,
sendPasswordResetEmail,
resetPassword,
getDisplayName,
getUserTeams,
} = require('./user.controller')
const {
getUserIdentities,
getDefaultIdentity,
} = require('../identity/identity.controller')
const userResolver = async (_, { id }) => {
try {
logger.info(`${USER_RESOLVER} user`)
return getUser(id)
} catch (e) {
logger.error(`${USER_RESOLVER} user: ${e.message}`)
throw new Error(e)
}
}
const usersResolver = async (_, { filter, pagination }, ctx) => {
try {
logger.info(`${USER_RESOLVER} users`)
return getUsers(filter, pagination)
} catch (e) {
logger.error(`${USER_RESOLVER} users: ${e.message}`)
throw new Error(e)
}
}
const currentUserResolver = async (_, __, ctx) => {
try {
logger.info(`${USER_RESOLVER} currentUser`)
if (!ctx.userId) return null
return getUser(ctx.userId)
} catch (e) {
logger.error(`${USER_RESOLVER} currentUser: ${e.message}`)
throw new Error(e)
}
}
const activateUserResolver = async (_, { id }) => {
try {
logger.info(`${USER_RESOLVER} activateUser`)
return activateUser(id)
} catch (e) {
logger.error(`${USER_RESOLVER} activateUser: ${e.message}`)
throw new Error(e)
}
}
const activateUsersResolver = async (_, { ids }) => {
try {
logger.info(`${USER_RESOLVER} activateUsers`)
return activateUsers(ids)
} catch (e) {
logger.error(`${USER_RESOLVER} activateUsers: ${e.message}`)
throw new Error(e)
}
}
const deleteUserResolver = async (_, { id }) => {
try {
logger.info(`${USER_RESOLVER} deleteUser`)
return deleteUser(id)
} catch (e) {
logger.error(`${USER_RESOLVER} deleteUser: ${e.message}`)
throw new Error(e)
}
}
const deleteUsersResolver = async (_, { ids }) => {
try {
logger.info(`${USER_RESOLVER} deleteUsers`)
return deleteUsers(ids)
} catch (e) {
logger.error(`${USER_RESOLVER} deleteUsers: ${e.message}`)
throw new Error(e)
}
}
const deactivateUserResolver = async (_, { id }) => {
try {
logger.info(`${USER_RESOLVER} deactivateUser`)
return deactivateUser(id)
} catch (e) {
logger.error(`${USER_RESOLVER} deactivateUser: ${e.message}`)
throw new Error(e)
}
}
const deactivateUsersResolver = async (_, { ids }) => {
try {
logger.info(`${USER_RESOLVER} deactivateUsers`)
return deactivateUsers(ids)
} catch (e) {
logger.error(`${USER_RESOLVER} deactivateUsers: ${e.message}`)
throw new Error(e)
}
}
const updateUserResolver = async (_, { id, input }) => {
try {
logger.info(`${USER_RESOLVER} updateUser`)
const updatedUser = await updateUser(id, input)
subscriptionManager.publish(USER_UPDATED, {
userUpdated: updatedUser,
})
return updatedUser
} catch (e) {
logger.error(`${USER_RESOLVER} updateUser: ${e.message}`)
throw e
}
}
const loginResolver = async (_, { input }) => {
try {
logger.info(`${USER_RESOLVER} login`)
return login(input)
} catch (e) {
logger.error(`${USER_RESOLVER} login: ${e.message}`)
throw new Error(e)
}
}
const signUpResolver = async (_, { input }) => {
try {
logger.info(`${USER_RESOLVER} signUp`)
return signUp(input)
} catch (e) {
logger.error(`${USER_RESOLVER} signUp: ${e.message}`)
throw new Error(e)
}
}
const setDefaultIdentityResolver = async (_, { userId, identityId }) => {
try {
logger.info(`${USER_RESOLVER} setDefaultIdentity`)
return setDefaultIdentity(userId, identityId)
} catch (e) {
logger.error(`${USER_RESOLVER} setDefaultIdentity: ${e.message}`)
throw new Error(e)
}
}
const verifyEmailResolver = async (_, { token }) => {
try {
logger.info(`${USER_RESOLVER} verifyEmail`)
return verifyEmail(token)
} catch (e) {
logger.error(`${USER_RESOLVER} verifyEmail: ${e.message}`)
throw new Error(e)
}
}
const resendVerificationEmailResolver = async (_, { token }) => {
try {
logger.info(`${USER_RESOLVER} resendVerificationEmail`)
return resendVerificationEmail(token)
} catch (e) {
logger.error(`${USER_RESOLVER} resendVerificationEmail: ${e.message}`)
throw new Error(e)
}
}
const resendVerificationEmailAfterLoginResolver = async (_, __, ctx) => {
try {
logger.info(`${USER_RESOLVER} resendVerificationEmailAfterLogin`)
return resendVerificationEmailAfterLogin(ctx.userId)
} catch (e) {
logger.error(
`${USER_RESOLVER} resendVerificationEmailAfterLogin: ${e.message}`,
)
throw new Error(e)
}
}
const updatePasswordResolver = async (_, { input }) => {
try {
logger.info(`${USER_RESOLVER} updatePassword`)
const { id, currentPassword, newPassword } = input
return updatePassword(id, currentPassword, newPassword)
} catch (e) {
logger.error(`${USER_RESOLVER} updatePassword: ${e.message}`)
throw new Error(e)
}
}
const sendPasswordResetEmailResolver = async (_, { email }) => {
try {
logger.info(`${USER_RESOLVER} sendPasswordResetEmail`)
return sendPasswordResetEmail(email)
} catch (e) {
logger.error(`${USER_RESOLVER} sendPasswordResetEmail: ${e.message}`)
throw new Error(e)
}
}
const resetPasswordResolver = async (_, { token, password }) => {
try {
logger.info(`${USER_RESOLVER} resetPassword`)
return resetPassword(token, password)
} catch (e) {
logger.error(`${USER_RESOLVER} resetPassword: ${e.message}`)
throw new Error(e)
}
}
const identitiesResolver = async (user, _) => {
const identities = await getUserIdentities(user.id)
return identities.result
// return ctx.loaders.Identity.identitiesBasedOnUserIdsLoader.load(user.id)
}
const defaultIdentityResolver = async user => {
return getDefaultIdentity(user.id)
// return ctx.loaders.Identity.defaultIdentityBasedOnUserIdsLoader.load(user.id)
}
const displayNameResolver = async user => {
return getDisplayName(user)
}
// TODO loader
const teamsResolver = async user => {
return getUserTeams(user)
}
module.exports = {
Query: {
user: userResolver,
users: usersResolver,
currentUser: currentUserResolver,
},
Mutation: {
activateUser: activateUserResolver,
activateUsers: activateUsersResolver,
deleteUser: deleteUserResolver,
deleteUsers: deleteUsersResolver,
deactivateUser: deactivateUserResolver,
deactivateUsers: deactivateUsersResolver,
updateUser: updateUserResolver,
login: loginResolver,
signUp: signUpResolver,
setDefaultIdentity: setDefaultIdentityResolver,
verifyEmail: verifyEmailResolver,
resendVerificationEmail: resendVerificationEmailResolver,
resendVerificationEmailAfterLogin:
resendVerificationEmailAfterLoginResolver,
updatePassword: updatePasswordResolver,
sendPasswordResetEmail: sendPasswordResetEmailResolver,
resetPassword: resetPasswordResolver,
},
User: {
identities: identitiesResolver,
defaultIdentity: defaultIdentityResolver,
displayName: displayNameResolver,
teams: teamsResolver,
},
Subscription: {
userUpdated: {
subscribe: async (...args) => {
return withFilter(
() => {
return subscriptionManager.asyncIterator(USER_UPDATED)
},
(payload, variables) => {
const { userId } = variables
const { userUpdated } = payload
const { id } = userUpdated
return userId === id
},
)(...args)
},
},
},
}