UNPKG

iworks-core-api

Version:

iwroks server api module

540 lines (501 loc) 13.4 kB
import * as uuid from 'node-uuid'; import { GraphQLObjectType, GraphQLString, GraphQLInputObjectType, GraphQLBoolean, GraphQLInt, GraphQLList, GraphQLFloat, GraphQLNonNull, } from 'graphql'; import { authenticated } from '../auth'; import { omit } from 'lodash'; import { createUser, updateUser, loginUser, updateUserPwd, } from './userRepository'; import { IUser, IUserUpdatePwd, } from '../model/user'; import config from '../config'; const { FUNC_APP_URL, SAVE_BASE64_IMAGE_FUNC_CODE, USER_PIC_STORAGE_URL } = config; interface InputUser { input: IUser; } interface InputUpdateUserPwd { input: IUserUpdatePwd; } interface InputUploadUserPic { input: { image: string, fileName: string; }; } const userDescription = { id: 'An id of the user', firstName: 'First name of the user', middleName: 'Middle name of the user', lastName: 'Last name of the user', login: 'User login', email: 'User email', pic: 'User pic ref', phone: 'User phone number', status: 'User status', created: 'User profile creation date', updated: 'User data update date', lastLogin: 'User last login date', pwd: 'User password', oldPwd: 'Current password before change', newPwd: 'New password of user', newPwdRepeat: 'New password of user repeated', avgScore: 'User average score', votes: 'User votes number', personalData: 'Personal data', age: 'User age', registration: 'Does user have a registration', nationality: 'User nationality', city: 'User city', roles: 'User roles', skills: 'User skills', jwt: 'JSON web token with auth info', }; const userSkillDescription = { id: 'User skill id', skillId: 'Related skill id', avgScore: 'Average user score for this skill', votes: 'Number of votes', }; // export const jwtTokenType = new GraphQLObjectType({ // name: 'JwtTokenType', // description: 'Jwt Token Type', // fields: () => ({ // token // }), // }); export const personalDataType = new GraphQLObjectType({ name: 'PersonalDataType', description: 'User Personal Data Type', fields: () => ({ age: { type: GraphQLInt, description: userDescription.age, }, registration: { type: GraphQLBoolean, description: userDescription.registration, }, nationality: { type: GraphQLString, description: userDescription.nationality, }, city: { type: GraphQLString, description: userDescription.city, }, }), }); const userSkillInputType = new GraphQLInputObjectType({ name: 'UserSkillInputType', description: 'User Skill Input Type', fields: () => ({ id: { type: GraphQLInt, description: userSkillDescription.id, }, skillId: { type: new GraphQLNonNull(GraphQLInt), description: userSkillDescription.skillId, }, avgScore: { type: GraphQLFloat, description: userSkillDescription.avgScore, }, votes: { type: GraphQLInt, description: userSkillDescription.votes, }, }), }); export const userType = new GraphQLObjectType({ name: 'UserType', description: 'User Type', fields: () => ({ id: { type: new GraphQLNonNull(GraphQLString), description: userDescription.id, }, firstName: { type: new GraphQLNonNull(GraphQLString), description: userDescription.firstName, }, middleName: { type: GraphQLString, description: userDescription.middleName, }, lastName: { type: new GraphQLNonNull(GraphQLString), description: userDescription.lastName, }, login: { type: new GraphQLNonNull(GraphQLString), description: userDescription.login, }, email: { type: new GraphQLNonNull(GraphQLString), description: userDescription.email, }, pic: { type: GraphQLString, description: userDescription.pic, }, phone: { type: GraphQLString, description: userDescription.phone, }, status: { type: new GraphQLNonNull(GraphQLString), description: userDescription.status, }, created: { type: new GraphQLNonNull(GraphQLString), description: userDescription.created, }, updated: { type: new GraphQLNonNull(GraphQLString), description: userDescription.updated, }, lastLogin: { type: GraphQLString, description: userDescription.lastLogin, }, pwd: { type: new GraphQLNonNull(GraphQLString), description: userDescription.pwd, }, avgScore: { type: new GraphQLNonNull(GraphQLFloat), description: userDescription.avgScore, }, votes: { type: new GraphQLNonNull(GraphQLInt), description: userDescription.votes, }, personalData: { type: personalDataType, description: userDescription.personalData, }, }), }); export const personalDataInputType = new GraphQLInputObjectType({ name: 'PersonalDataInputType', description: 'User Personal Data Input Type', fields: () => ({ age: { type: GraphQLInt, description: userDescription.age, }, registration: { type: GraphQLBoolean, description: userDescription.registration, }, nationality: { type: GraphQLString, description: userDescription.nationality, }, city: { type: GraphQLString, description: userDescription.city, }, }), }); export const loginUserInputType = new GraphQLInputObjectType({ name: 'LoginUserInputType', description: 'User this object to login and get auth token', fields: () => ({ login: { type: GraphQLString, description: userDescription.login, }, phone: { type: GraphQLString, description: userDescription.login, }, pwd: { type: new GraphQLNonNull(GraphQLString), description: userDescription.pwd, }, }), }); export const createUserInputType = new GraphQLInputObjectType({ name: 'CreateUserInputType', description: 'User this object to create new user', fields: () => ({ firstName: { type: new GraphQLNonNull(GraphQLString), description: userDescription.firstName, }, middleName: { type: GraphQLString, description: userDescription.middleName, }, lastName: { type: new GraphQLNonNull(GraphQLString), description: userDescription.lastName, }, login: { type: new GraphQLNonNull(GraphQLString), description: userDescription.login, }, email: { type: new GraphQLNonNull(GraphQLString), description: userDescription.email, }, status: { type: new GraphQLNonNull(GraphQLString), description: userDescription.status, }, pic: { type: GraphQLString, description: userDescription.pic, }, phone: { type: new GraphQLNonNull(GraphQLString), description: userDescription.phone, }, pwd: { type: new GraphQLNonNull(GraphQLString), description: userDescription.pwd, }, personalData: { type: personalDataInputType, description: userDescription.personalData, }, roles: { type: new GraphQLList(GraphQLInt), description: userDescription.roles, }, userSkills: { type: new GraphQLList(userSkillInputType), description: userDescription.skills, }, }), }); export const updateUserPwdInputType = new GraphQLInputObjectType({ name: 'UpdateUserPwdInputType', description: 'User this object to update password of user', fields: () => ({ id: { type: new GraphQLNonNull(GraphQLString), description: userDescription.id, }, oldPwd: { type: GraphQLString, description: userDescription.oldPwd, }, newPwd: { type: new GraphQLNonNull(GraphQLString), description: userDescription.newPwd, }, newPwdRepeat: { type: new GraphQLNonNull(GraphQLString), description: userDescription.newPwdRepeat, }, }), }); export const loggedUserType = new GraphQLObjectType({ name: 'LoggedUserType', description: 'Logged user type', fields: () => ({ id: { type: new GraphQLNonNull(GraphQLString), description: userDescription.id, }, firstName: { type: new GraphQLNonNull(GraphQLString), description: userDescription.firstName, }, lastName: { type: new GraphQLNonNull(GraphQLString), description: userDescription.lastName, }, login: { type: new GraphQLNonNull(GraphQLString), description: userDescription.login, }, roles: { type: new GraphQLList(GraphQLInt), description: userDescription.roles, }, jwt: { type: new GraphQLNonNull(GraphQLString), description: userDescription.jwt, }, }), }); export const updateUserInputType = new GraphQLInputObjectType({ name: 'UpdateUserInputType', description: 'Use this object to update user', fields: () => ({ id: { type: new GraphQLNonNull(GraphQLString), description: userDescription.id, }, firstName: { type: GraphQLString, description: userDescription.firstName, }, middleName: { type: GraphQLString, description: userDescription.middleName, }, lastName: { type: GraphQLString, description: userDescription.lastName, }, login: { type: new GraphQLNonNull(GraphQLString), description: userDescription.login, }, email: { type: new GraphQLNonNull(GraphQLString), description: userDescription.email, }, status: { type: new GraphQLNonNull(GraphQLString), description: userDescription.status, }, pic: { type: GraphQLString, description: userDescription.pic, }, phone: { type: GraphQLString, description: userDescription.phone, }, oldPwd: { type: GraphQLString, description: userDescription.pwd, }, newPwd: { type: GraphQLString, description: userDescription.pwd, }, newPwdRepeat: { type: GraphQLString, description: userDescription.pwd, }, personalData: { type: personalDataInputType, description: userDescription.personalData, }, roles: { type: new GraphQLList(GraphQLInt), description: userDescription.roles, }, userSkills: { type: new GraphQLList(userSkillInputType), description: userDescription.skills, }, }), }); const uploadUserPicInputType = new GraphQLInputObjectType({ name: 'UploadUserPicInputType', fields: () => ({ image: { type: new GraphQLNonNull(GraphQLString), description: 'Base64 encoded string', }, fileName: { type: new GraphQLNonNull(GraphQLString), description: 'Name of image', }, }), }); export const uploadUserPicType = new GraphQLObjectType({ name: 'UploadUserPicType', description: 'Link to saved pic', fields: () => ({ thumbnailUrl: { type: new GraphQLNonNull(GraphQLString), description: 'Saved small image url', }, }), }); export default { createUser: { description: 'Creates new user', type: userType, args: { input: { type: new GraphQLNonNull(createUserInputType) }, }, resolve: (_: any, inputUser: InputUser) => { const input = inputUser.input; return createUser(input); }, }, updateUser: { description: 'Updates user', type: userType, args: { input: { type: new GraphQLNonNull(updateUserInputType) }, }, resolve: authenticated(['AM'], (_: any, inputUser: InputUser, context: any) => { const input = inputUser.input; return updateUser(input); }), }, updateUserPwd : { description: 'Updates password', type: userType, args: { input: { type: new GraphQLNonNull(updateUserPwdInputType) }, }, resolve: authenticated(['AM'],(_: any, inputUser: InputUpdateUserPwd, context: any) => { const input = inputUser.input; return updateUserPwd(input); }), }, loginUser: { description: 'Authorization endpoint', type: loggedUserType, args: { input: { type: new GraphQLNonNull(loginUserInputType) }, }, resolve: (_: any, inputUser: InputUser, context: any) => { const input = inputUser.input; return loginUser(input); }, }, uploadUserPic: { description: 'Upload users picture', type: uploadUserPicType, args: { input: { type: new GraphQLNonNull(uploadUserPicInputType) }, }, resolve: async (_: any, inputUserPic:InputUploadUserPic): Promise<object> => { const { image } = inputUserPic.input; const fileName = `${inputUserPic.input.fileName}_${uuid.v4()}`; const body = JSON.stringify({ data: image, }); const thumbnailFuncUrl = `${FUNC_APP_URL}/api/img/user/${fileName}_thumbnail/small?code=${SAVE_BASE64_IMAGE_FUNC_CODE}`; // tslint:disable-line const thumbnailUrl = `${USER_PIC_STORAGE_URL}/${fileName}_thumbnail.jpg`; const originalFuncUrl = `${FUNC_APP_URL}/api/img/user/${fileName}/original?code=${SAVE_BASE64_IMAGE_FUNC_CODE}`; // tslint:disable-line await Promise.all([ fetch(thumbnailFuncUrl, { body, method: 'POST', }), fetch(originalFuncUrl, { body, method: 'POST', }), ]); return { thumbnailUrl }; }, }, };