94 lines
2.7 KiB
JavaScript
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
|