60 lines
1.4 KiB
TypeScript
60 lines
1.4 KiB
TypeScript
import { IJSONObject } from '@automatisch/types';
|
|
import App from '../../models/app';
|
|
import AppConfig from '../../models/app-config';
|
|
import Context from '../../types/express/context';
|
|
|
|
type Params = {
|
|
input: {
|
|
key: string;
|
|
appAuthClientId: string;
|
|
formattedData: IJSONObject;
|
|
};
|
|
};
|
|
|
|
const createConnection = async (
|
|
_parent: unknown,
|
|
params: Params,
|
|
context: Context
|
|
) => {
|
|
context.currentUser.can('create', 'Connection');
|
|
|
|
const { key, appAuthClientId } = params.input;
|
|
|
|
const app = await App.findOneByKey(key);
|
|
|
|
const appConfig = await AppConfig.query().findOne({ key });
|
|
|
|
let formattedData = params.input.formattedData;
|
|
if (appConfig) {
|
|
if (appConfig.disabled) throw new Error('This application has been disabled for new connections!');
|
|
|
|
if (!appConfig.allowCustomConnection && formattedData) throw new Error(`Custom connections cannot be created for ${app.name}!`);
|
|
|
|
if (appConfig.shared && !formattedData) {
|
|
const authClient = await appConfig
|
|
.$relatedQuery('appAuthClients')
|
|
.findById(appAuthClientId)
|
|
.where({
|
|
active: true
|
|
})
|
|
.throwIfNotFound();
|
|
|
|
formattedData = authClient.formattedAuthDefaults;
|
|
}
|
|
}
|
|
|
|
const createdConnection = await context
|
|
.currentUser
|
|
.$relatedQuery('connections')
|
|
.insert({
|
|
key,
|
|
appAuthClientId,
|
|
formattedData,
|
|
verified: false,
|
|
});
|
|
|
|
return createdConnection;
|
|
};
|
|
|
|
export default createConnection;
|