selectCustomPasswords static method
Future<void>
selectCustomPasswords(
- Client cloudApiClient,
- CommandLogger logger,
- String baseCommand,
- ProjectLaunch projectSetup,
Implementation
static Future<void> selectCustomPasswords(
Client cloudApiClient,
CommandLogger logger,
String baseCommand,
ProjectLaunch projectSetup,
) async {
final ignoredSecretNames = {
...PasswordDefinitions.platformManagedNames,
_templatePlaceholderPassword,
};
final allPasswords = _readAllPasswords(projectSetup.projectDir);
if (allPasswords.isEmpty) return;
List<String> alreadySetSecretNames;
final projectId = projectSetup.projectId;
if (projectSetup.preexistingProject == true && projectId != null) {
alreadySetSecretNames = await PasswordOperations.fetchPasswords(
cloudApiClient,
projectId: projectId,
).then((passwords) => passwords.map((p) => p.name).toList());
} else {
alreadySetSecretNames = [];
}
final filteredPasswords = allPasswords.where(
(p) =>
!ignoredSecretNames.contains(p.name) &&
!alreadySetSecretNames.contains(p.name),
);
if (filteredPasswords.isEmpty) return;
final sortedPasswords = filteredPasswords.toList()
..sort((a, b) => a.section.index.compareTo(b.section.index));
final longestPasswordNameLength = sortedPasswords
.map((p) => p.name.length)
.reduce((a, b) => math.max(a, b));
String padAfterName(String name) {
return ''.padRight(longestPasswordNameLength - name.length);
}
final options = sortedPasswords
.map(
(p) =>
'${p.name}: ${padAfterName(p.name)}${_hidePassword(p.value)}'
' (from section "${p.section.name}")',
)
.toList();
final initiallySelected = options.where(
(s) => s.endsWith('"production")') || s.endsWith('"shared")'),
);
final selected = await SelectList.chooseMultiple<String>(
prompt:
'Custom passwords were found in config/passwords.yaml.\n'
'You can select which of them to copy securely to Serverpod Cloud now.\n'
'${logger.wrapStyle('Set them later with `$baseCommand password set`.', cli.AnsiStyle.darkGray)}',
options: options,
initiallySelected: initiallySelected,
terminal: logger.inlineTerminal,
style: SelectListStyle(highlightStyle: _projectFactStyle.ansiCode),
);
if (selected == null) {
logger.info('Setup cancelled.');
throw UserAbortException();
}
final selectedNames = selected
.map((option) => option.split(':').first)
.toSet();
final selectedPasswords = sortedPasswords.where(
(p) => selectedNames.contains(p.name),
);
projectSetup.selectedPasswords = {
for (final p in selectedPasswords) p.name: p.value,
};
}