selectProjectId static method

Future<void> selectProjectId(
  1. Client cloudApiClient,
  2. CommandLogger logger,
  3. ProjectLaunch projectSetup
)

Implementation

static Future<void> selectProjectId(
  final Client cloudApiClient,
  final CommandLogger logger,
  final ProjectLaunch projectSetup,
) async {
  const invalidProjectIdMessage =
      'Invalid project ID. Must be 6-32 characters long '
      'and contain only lowercase letters, numbers, and hyphens.';

  final existingProjects = await cloudApiClient.projects.listProjectsInfo(
    includeLatestDeployAttemptTime: true,
  );

  final specifiedProjectId = projectSetup.projectId;
  if (specifiedProjectId != null) {
    if (existingProjects.any(
      (final p) => p.project.cloudProjectId == specifiedProjectId,
    )) {
      projectSetup.preexistingProject = true;
      return;
    }

    if (isValidProjectIdFormat(specifiedProjectId)) {
      final confirm = await logger.confirm(
        'Open the browser and create a new Serverpod Cloud project?',
        defaultValue: true,
      );
      if (!confirm) {
        logger.info('Setup cancelled.');
        throw UserAbortException();
      }
      return;
    }

    throw FailureException(error: invalidProjectIdMessage);
  }

  final selectedId = await _selectExistingProject(
    cloudApiClient,
    existingProjects,
    logger,
  );
  if (selectedId != null) {
    projectSetup.projectId = selectedId;
    projectSetup.preexistingProject = true;
    return;
  }

  projectSetup.projectId = _getDefaultProjectId(projectSetup);
  return;
}