@aws-amplify/appsync-modelgen-plugin
Version:
168 lines • 6.04 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.processConversationRoute = void 0;
const introspection_1 = require("../interfaces/introspection");
const change_case_1 = require("change-case");
const pluralize_1 = require("pluralize");
function processConversationRoute(mutationObj, generateGraphQLOperationMetadata) {
const routeName = (0, change_case_1.pascalCase)(mutationObj.name);
const conversationModelName = `Conversation${routeName}`;
const conversationMessageModelName = `ConversationMessage${routeName}`;
return {
name: mutationObj.name,
models: {
[conversationModelName]: generateConversationModel(conversationModelName, conversationMessageModelName),
[conversationMessageModelName]: generateConversationMessageModel(conversationModelName, conversationMessageModelName),
},
nonModels: {},
enums: {
ConversationParticipantRole: {
name: 'AmplifyAIConversationParticipantRole',
values: ['user', 'assistant'],
}
},
conversation: {
modelName: conversationModelName
},
message: {
modelName: conversationMessageModelName,
send: {
...generateGraphQLOperationMetadata(mutationObj),
type: { model: conversationMessageModelName }
},
subscribe: generateSubscriptionMetadata(routeName, conversationMessageModelName),
}
};
}
exports.processConversationRoute = processConversationRoute;
function generateConversationModel(modelName, messageModelName) {
return {
name: modelName,
fields: {
id: generateField('id', 'ID', { isRequired: true }),
name: generateField('name', 'String'),
metadata: generateField('metadata', 'AWSJSON'),
messages: generateMessagesField(messageModelName),
createdAt: generateTimestampField('createdAt'),
updatedAt: generateTimestampField('updatedAt'),
owner: generateField('owner', 'String'),
},
syncable: true,
pluralName: (0, pluralize_1.plural)(modelName),
attributes: [
{
type: 'model',
properties: {
subscriptions: { level: 'off' },
mutations: { update: null }
}
},
generateAuthAttribute()
],
primaryKeyInfo: generatePrimaryKeyInfo(),
};
}
function generateConversationMessageModel(conversationModelName, modelName) {
return {
name: modelName,
fields: {
id: generateField('id', 'ID', { isRequired: true }),
conversationId: generateField('conversationId', 'ID', { isRequired: true }),
conversation: generateConversationField(conversationModelName),
role: generateField('role', { enum: 'AmplifyAIConversationParticipantRole' }),
content: generateField('content', { nonModel: 'AmplifyAIContentBlock' }, { isArray: true }),
aiContext: generateField('aiContext', 'AWSJSON'),
toolConfiguration: generateField('toolConfiguration', { nonModel: 'AmplifyAIToolConfiguration' }, { isArray: true, isArrayNullable: true }),
createdAt: generateTimestampField('createdAt'),
updatedAt: generateTimestampField('updatedAt'),
},
syncable: true,
pluralName: (0, pluralize_1.plural)(modelName),
attributes: [
{
type: 'model',
properties: {
subscriptions: {}
}
},
generateAuthAttribute()
],
primaryKeyInfo: generatePrimaryKeyInfo(),
};
}
function generateField(name, type, options = {}) {
const { isRequired = false, isArray = false, isArrayNullable, isReadOnly } = options;
return {
name,
type,
attributes: [],
isArray,
isRequired,
isReadOnly,
...(isArray && { isArrayNullable }),
};
}
function generateTimestampField(name) {
return {
...generateField(name, 'AWSDateTime', { isReadOnly: true }),
isReadOnly: true,
};
}
function generateMessagesField(messageModelName) {
return {
...generateField('messages', { model: messageModelName }, { isArray: true, isArrayNullable: true }),
association: {
connectionType: introspection_1.CodeGenConnectionType.HAS_MANY,
associatedWith: ['conversationId']
}
};
}
function generateConversationField(conversationModelName) {
return {
...generateField('conversation', { model: conversationModelName }),
association: {
connectionType: introspection_1.CodeGenConnectionType.BELONGS_TO,
targetNames: ['conversationId']
}
};
}
function generateAuthAttribute() {
return {
type: 'auth',
properties: {
rules: [
{
provider: 'userPools',
ownerField: 'owner',
allow: 'owner',
identityClaim: 'cognito:username',
operations: ['create', 'update', 'delete', 'read']
}
]
}
};
}
function generatePrimaryKeyInfo() {
return {
isCustomPrimaryKey: false,
primaryKeyFieldName: 'id',
sortKeyFieldNames: []
};
}
function generateSubscriptionMetadata(routeName, modelName) {
return {
isArray: false,
isRequired: false,
name: `onCreateAssistantResponse${routeName}`,
type: { nonModel: 'AmplifyAIConversationMessageStreamPart' },
arguments: {
'conversationId': {
name: 'conversationId',
isArray: false,
isRequired: true,
type: 'ID',
},
}
};
}
//# sourceMappingURL=process-conversation.js.map