Skip to content

Commit b426de2

Browse files
author
David Hasani
committed
part 1 of dms
1 parent c35cdcc commit b426de2

File tree

9 files changed

+414
-138
lines changed

9 files changed

+414
-138
lines changed

packages/core/src/amazonqGumby/chat/controller/controller.ts

Lines changed: 202 additions & 95 deletions
Large diffs are not rendered by default.

packages/core/src/amazonqGumby/chat/controller/messenger/messenger.ts

Lines changed: 112 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,12 @@
99
*/
1010

1111
import { AuthFollowUpType, AuthMessageDataMap } from '../../../../amazonq/auth/model'
12-
import { JDKVersion, TransformationCandidateProject, transformByQState } from '../../../../codewhisperer/models/model'
12+
import {
13+
DB,
14+
JDKVersion,
15+
TransformationCandidateProject,
16+
transformByQState,
17+
} from '../../../../codewhisperer/models/model'
1318
import { FeatureAuthState } from '../../../../codewhisperer/util/authUtil'
1419
import * as CodeWhispererConstants from '../../../../codewhisperer/models/constants'
1520
import {
@@ -48,6 +53,7 @@ export type UnrecoverableErrorType =
4853
| 'unsupported-source-jdk-version'
4954
| 'upload-to-s3-failed'
5055
| 'job-start-failed'
56+
| 'unsupported-source-db-version'
5157

5258
export enum GumbyNamedMessages {
5359
COMPILATION_PROGRESS_MESSAGE = 'gumbyProjectCompilationMessage',
@@ -151,7 +157,7 @@ export class Messenger {
151157
)
152158
}
153159

154-
public async sendProjectPrompt(projects: TransformationCandidateProject[], tabID: string) {
160+
public async sendLanguageUpgradeProjectPrompt(projects: TransformationCandidateProject[], tabID: string) {
155161
const projectFormOptions: { value: any; label: string }[] = []
156162
const detectedJavaVersions = new Array<JDKVersion | undefined>()
157163

@@ -165,7 +171,7 @@ export class Messenger {
165171

166172
const formItems: ChatItemFormItem[] = []
167173
formItems.push({
168-
id: 'GumbyTransformProjectForm',
174+
id: 'GumbyTransformLanguageUpgradeProjectForm',
169175
type: 'select',
170176
title: CodeWhispererConstants.chooseProjectFormTitle,
171177
mandatory: true,
@@ -181,11 +187,11 @@ export class Messenger {
181187
options: [
182188
{
183189
value: JDKVersion.JDK8,
184-
label: JDKVersion.JDK8.toString(),
190+
label: JDKVersion.JDK8,
185191
},
186192
{
187193
value: JDKVersion.JDK11,
188-
label: JDKVersion.JDK11.toString(),
194+
label: JDKVersion.JDK11,
189195
},
190196
{
191197
value: JDKVersion.UNSUPPORTED,
@@ -210,7 +216,88 @@ export class Messenger {
210216
this.dispatcher.sendAsyncEventProgress(
211217
new AsyncEventProgressMessage(tabID, {
212218
inProgress: true,
213-
message: MessengerUtils.createTransformationConfirmationPrompt(detectedJavaVersions),
219+
message: MessengerUtils.createLanguageUpgradeTransformationConfirmationPrompt(detectedJavaVersions),
220+
})
221+
)
222+
223+
this.dispatcher.sendAsyncEventProgress(
224+
new AsyncEventProgressMessage(tabID, {
225+
inProgress: false,
226+
message: undefined,
227+
})
228+
)
229+
230+
this.dispatcher.sendChatPrompt(
231+
new ChatPrompt(
232+
{
233+
message: 'Q Code Transformation',
234+
formItems: formItems,
235+
},
236+
'LanguageUpgradeTransformForm',
237+
tabID,
238+
false
239+
)
240+
)
241+
}
242+
243+
public async sendSQLConversionProjectPrompt(projects: TransformationCandidateProject[], tabID: string) {
244+
const projectFormOptions: { value: any; label: string }[] = []
245+
246+
projects.forEach((candidateProject) => {
247+
projectFormOptions.push({
248+
value: candidateProject.path,
249+
label: candidateProject.name,
250+
})
251+
})
252+
253+
const formItems: ChatItemFormItem[] = []
254+
formItems.push({
255+
id: 'GumbyTransformSQLConversionProjectForm',
256+
type: 'select',
257+
title: 'Choose a project to transform',
258+
mandatory: true,
259+
260+
options: projectFormOptions,
261+
})
262+
263+
formItems.push({
264+
id: 'GumbyTransformDBFromForm',
265+
type: 'select',
266+
title: 'Choose the source database',
267+
mandatory: true,
268+
options: [
269+
{
270+
value: 'Oracle',
271+
label: 'Oracle',
272+
},
273+
{
274+
value: 'Other',
275+
label: 'Other',
276+
},
277+
],
278+
})
279+
280+
formItems.push({
281+
id: 'GumbyTransformDBToForm',
282+
type: 'select',
283+
title: 'Choose the target database',
284+
mandatory: true,
285+
options: [
286+
{
287+
value: 'Amazon RDS for PostgreSQL',
288+
label: 'Amazon RDS for PostgreSQL',
289+
},
290+
{
291+
value: 'Amazon Aurora PostgreSQL',
292+
label: 'Amazon Aurora PostgreSQL',
293+
},
294+
],
295+
})
296+
297+
this.dispatcher.sendAsyncEventProgress(
298+
new AsyncEventProgressMessage(tabID, {
299+
inProgress: true,
300+
message: 'I can convert your embedded SQL, but I need some more info from you first.',
214301
})
215302
)
216303

@@ -227,7 +314,7 @@ export class Messenger {
227314
message: 'Q Code Transformation',
228315
formItems: formItems,
229316
},
230-
'TransformForm',
317+
'SQLConversionTransformForm',
231318
tabID,
232319
false
233320
)
@@ -318,7 +405,7 @@ export class Messenger {
318405
)
319406
}
320407

321-
public sendStaticTextResponse(messageType: StaticTextResponseType, itemType: ChatItemType, tabID: string) {
408+
public sendStaticTextResponse(messageType: StaticTextResponseType, tabID: string) {
322409
let message = '...'
323410

324411
switch (messageType) {
@@ -331,16 +418,13 @@ export class Messenger {
331418
case 'choose-transformation-objective':
332419
message = 'Choose your transformation objective.'
333420
break
334-
case 'language-upgrade-selected':
335-
message = 'Got it! I can upgrade your Java 8 or 11 project to Java 17.'
336-
break
337421
}
338422

339423
this.dispatcher.sendChatMessage(
340424
new ChatMessage(
341425
{
342426
message,
343-
messageType: itemType,
427+
messageType: 'ai-prompt',
344428
},
345429
tabID
346430
)
@@ -375,6 +459,9 @@ export class Messenger {
375459
case 'unsupported-source-jdk-version':
376460
message = CodeWhispererConstants.unsupportedJavaVersionChatMessage
377461
break
462+
case 'unsupported-source-db-version':
463+
message = CodeWhispererConstants.unsupportedDatabaseChatMessage
464+
break
378465
}
379466

380467
const buttons: ChatItemButton[] = []
@@ -451,7 +538,7 @@ export class Messenger {
451538
)
452539
}
453540

454-
public sendProjectSelectionMessage(
541+
public sendLanguageUpgradeProjectSelectionMessage(
455542
projectName: string,
456543
fromJDKVersion: JDKVersion,
457544
toJDKVersion: JDKVersion,
@@ -469,6 +556,18 @@ export class Messenger {
469556
this.dispatcher.sendChatMessage(new ChatMessage({ message, messageType: 'prompt' }, tabID))
470557
}
471558

559+
public sendSQLConversionProjectSelectionMessage(projectName: string, fromDB: DB, toDB: DB, tabID: string) {
560+
const message = `### Transformation details
561+
-------------
562+
| | |
563+
| :------------------- | -------: |
564+
| **Project** | ${projectName} |
565+
| **Source DB** | ${fromDB} |
566+
| **Target DB** | ${toDB} |
567+
`
568+
this.dispatcher.sendChatMessage(new ChatMessage({ message, messageType: 'prompt' }, tabID))
569+
}
570+
472571
public sendSkipTestsSelectionMessage(skipTestsSelection: string, tabID: string) {
473572
const message = `Okay, I will ${skipTestsSelection.toLowerCase()} when building your project.`
474573
this.dispatcher.sendChatMessage(new ChatMessage({ message, messageType: 'ai-prompt' }, tabID))

packages/core/src/amazonqGumby/chat/controller/messenger/messengerUtils.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,10 @@ import DependencyVersions from '../../../models/dependencies'
1313
export enum ButtonActions {
1414
STOP_TRANSFORMATION_JOB = 'gumbyStopTransformationJob',
1515
VIEW_TRANSFORMATION_HUB = 'gumbyViewTransformationHub',
16-
CONFIRM_TRANSFORMATION_FORM = 'gumbyTransformFormConfirm',
16+
CONFIRM_LANGUAGE_UPGRADE_TRANSFORMATION_FORM = 'gumbyLanguageUpgradeTransformFormConfirm',
17+
CONFIRM_SQL_CONVERSION_TRANSFORMATION_FORM = 'gumbySQLConversionTransformFormConfirm',
18+
CANCEL_TRANSFORMATION_FORM = 'gumbyTransformFormCancel', // shared between Language Upgrade & SQL Conversion
1719
CONFIRM_SKIP_TESTS_FORM = 'gumbyTransformSkipTestsFormConfirm',
18-
CANCEL_TRANSFORMATION_FORM = 'gumbyTransformFormCancel',
1920
CANCEL_SKIP_TESTS_FORM = 'gumbyTransformSkipTestsFormCancel',
2021
CONFIRM_DEPENDENCY_FORM = 'gumbyTransformDependencyFormConfirm',
2122
CANCEL_DEPENDENCY_FORM = 'gumbyTransformDependencyFormCancel',
@@ -63,7 +64,9 @@ export default class MessengerUtils {
6364
}
6465
}
6566

66-
static createTransformationConfirmationPrompt = (detectedJavaVersions: Array<JDKVersion | undefined>): string => {
67+
static createLanguageUpgradeTransformationConfirmationPrompt = (
68+
detectedJavaVersions: Array<JDKVersion | undefined>
69+
): string => {
6770
let javaVersionString = 'Java project'
6871
const uniqueJavaOptions = new Set(detectedJavaVersions)
6972

packages/core/src/amazonqGumby/chat/views/connector/connector.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,8 @@ export class ChatPrompt extends UiMessage {
117117
keepCardAfterClick: false,
118118
waitMandatoryFormItems: false,
119119
text: 'Cancel',
120-
id: `gumby${promptIDPrefix}Cancel`,
120+
// makes the Cancel button shared in all forms, which is fine since we respond the same exact way each time
121+
id: 'gumbyTransformFormCancel',
121122
})
122123
}
123124
}

packages/core/src/amazonqGumby/errors.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,12 @@ export class JavaHomeNotSetError extends ToolkitError {
1212
}
1313
}
1414

15+
export class NoAuthError extends ToolkitError {
16+
constructor() {
17+
super('Not authenticated', { code: 'AuthFailed' })
18+
}
19+
}
20+
1521
export class NoOpenProjectsError extends ToolkitError {
1622
constructor() {
1723
super('No Java projects found since no projects are open', { code: 'NoOpenProjects' })

packages/core/src/codewhisperer/commands/startTransformByQ.ts

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,9 @@ import {
1515
JDKVersion,
1616
jobPlanProgress,
1717
FolderInfo,
18-
TransformationCandidateProject,
1918
ZipManifest,
2019
TransformByQStatus,
20+
DB,
2121
} from '../models/model'
2222
import { convertDateToTimestamp } from '../../shared/utilities/textUtilities'
2323
import {
@@ -37,7 +37,11 @@ import {
3737
uploadPayload,
3838
zipCode,
3939
} from '../service/transformByQ/transformApiHandler'
40-
import { getOpenProjects, validateOpenProjects } from '../service/transformByQ/transformProjectValidationHandler'
40+
import {
41+
getJavaProjects,
42+
getOpenProjects,
43+
validateOpenProjects,
44+
} from '../service/transformByQ/transformProjectValidationHandler'
4145
import {
4246
getVersionData,
4347
prepareProjectDependencies,
@@ -81,7 +85,7 @@ function getFeedbackCommentData() {
8185
return s
8286
}
8387

84-
export async function processTransformFormInput(
88+
export async function processLanguageUpgradeTransformFormInput(
8589
pathToProject: string,
8690
fromJDKVersion: JDKVersion,
8791
toJDKVersion: JDKVersion
@@ -92,6 +96,13 @@ export async function processTransformFormInput(
9296
transformByQState.setTargetJDKVersion(toJDKVersion)
9397
}
9498

99+
export async function processSQLConversionTransformFormInput(pathToProject: string, fromDB: DB, toDB: DB) {
100+
transformByQState.setProjectName(path.basename(pathToProject))
101+
transformByQState.setProjectPath(pathToProject)
102+
transformByQState.setSourceDB(fromDB)
103+
transformByQState.setTargetDB(toDB)
104+
}
105+
95106
export async function setMaven() {
96107
let mavenWrapperExecutableName = os.platform() === 'win32' ? 'mvnw.cmd' : 'mvnw'
97108
const mavenWrapperExecutablePath = path.join(transformByQState.getProjectPath(), mavenWrapperExecutableName)
@@ -663,9 +674,16 @@ export async function finalizeTransformationJob(status: string) {
663674
jobPlanProgress['transformCode'] = StepProgress.Succeeded
664675
}
665676

666-
export async function getValidCandidateProjects(): Promise<TransformationCandidateProject[]> {
677+
export async function getValidLanguageUpgradeCandidateProjects() {
678+
const openProjects = await getOpenProjects()
679+
const javaMavenProjects = await validateOpenProjects(openProjects)
680+
return javaMavenProjects
681+
}
682+
683+
export async function getValidSQLConversionCandidateProjects() {
667684
const openProjects = await getOpenProjects()
668-
return validateOpenProjects(openProjects)
685+
const javaProjects = await getJavaProjects(openProjects)
686+
return javaProjects
669687
}
670688

671689
export async function setTransformationToRunningState() {

packages/core/src/codewhisperer/models/constants.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -498,6 +498,20 @@ export const absolutePathDetectedMessage = (numPaths: number, buildFile: string,
498498

499499
export const unsupportedJavaVersionChatMessage = `Sorry, currently I can only upgrade Java 8 or Java 11 projects. For more information, see the [Amazon Q documentation](${codeTransformPrereqDoc}).`
500500

501+
export const unsupportedDatabaseChatMessage = `Sorry, currently I can only convert SQL built on Oracle. For more information, see the [Amazon Q documentation](${codeTransformPrereqDoc}).`
502+
503+
export const invalidMetadataFileNoRulesJson =
504+
"Sorry, your metadata ZIP appears to be invalid; it does not contain an 'sct-rules.json' file."
505+
506+
export const invalidMetadataFileUnsupportedSourceVendor = (vendor: string) =>
507+
`Sorry, your metadata ZIP appears to be invalid; the source vendor is '${vendor}', but only Oracle is supported.`
508+
509+
export const invalidMetadataFileUnsupportedTargetVendor = (vendor: string) =>
510+
`Sorry, your metadata ZIP appears to be invalid; the target vendor is '${vendor}', but only Amazon Aurora PostgreSQL and Amazon RDS for PostgreSQL are supported.`
511+
512+
export const invalidMetadataFileUnknownIssueParsing =
513+
'Sorry, I had an issue parsing the metadata ZIP you provided; please make sure it is valid'
514+
501515
export const failedToStartJobChatMessage =
502516
"Sorry, I couldn't begin the transformation. Please try starting the transformation again."
503517

0 commit comments

Comments
 (0)