Files
Superalgos/server/src/schema/mutations/AddCloneMutation.js
T

94 lines
2.7 KiB
JavaScript

import { CloneInputType } from '../types/input';
import { CloneType } from '../types';
import { Clone } from '../../models';
import { CloneModeEnum } from '../../enums/CloneMode';
import { BotTypesEnum } from '../../enums/BotTypes';
import teams_FbByTeamMember from '../../graphQLCalls/teams_FbByTeamMember';
import cloneDetails from '../cloneDetails'
import {
AuthentificationError,
WrongArgumentsError,
OperationsError
} from '../../errors'
import logger from '../../config/logger'
import createKubernetesClone from '../../kubernetes/createClone'
import { isDefined, getSelectedBot } from '../../config/utils'
const args = {
clone: {type: CloneInputType }
}
const resolve = async(parent, { clone }, context) => {
logger.debug('addClone -> Entering Fuction.')
if (!context.userId) {
throw new AuthentificationError()
}
if(!Object.values(CloneModeEnum).includes(clone.mode)){
throw new WrongArgumentsError('The mode selected is not valid.')
}
if(!Object.values(BotTypesEnum).includes(clone.botType)){
throw new WrongArgumentsError('The bot type selected is not valid.')
}
let existingClone = await Clone.find(
{
authId: context.userId,
mode: clone.mode,
botId: clone.botId,
active: true
})
logger.debug('addClone -> Checking existing clone.')
if(existingClone.length > 0){
throw new OperationsError('You can only have one active clone by mode. Remove the'
+ ' existing clone of type: ' + clone.mode + ' and try again.')
}
try{
// Authorization is handled by the teams module
let botsByUser = await teams_FbByTeamMember(context.authorization)
clone = await cloneDetails(context.authorization, botsByUser, clone)
let selectedBot = getSelectedBot(botsByUser.data.data.teams_FbByTeamMember, clone.botId)
clone.createDatetime = new Date().valueOf() / 1000|0
clone.active = true
logger.debug('addClone -> Creating a new clone.')
let newClone = new Clone(clone)
newClone.authId = context.userId
clone.id = newClone._id
await createKubernetesClone(clone)
return new Promise((resolve, reject) => {
newClone.save((err) => {
if (err){
logger.error('addClone -> Error: %s', err.stack)
reject('There has been an error storing the clone.')
}
else {
//TODO transaction on database
logger.debug('addClone -> Save clone sucessful.')
resolve(newClone)
}
})
})
} catch(err) {
logger.error('addClone -> Error: %s', err.stack)
throw new OperationsError('There has been an error creating the clone.')
}
}
const mutation = {
addClone: {
type: CloneType,
args,
resolve
}
}
export default mutation