iworks-core-api
Version:
iwroks server api module
540 lines (501 loc) • 13.4 kB
text/typescript
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 };
},
},
};