RunProjectNew executes the project creation logic
(ctx context.Context, config ProjectConfig)
| 111 | |
| 112 | // RunProjectNew executes the project creation logic |
| 113 | func RunProjectNew(ctx context.Context, config ProjectConfig) error { |
| 114 | projectLog.Printf("Creating project: title=%s, owner=%s, repo=%s", config.Title, config.Owner, config.Repo) |
| 115 | |
| 116 | // Resolve owner type |
| 117 | ownerType := "org" |
| 118 | ownerLogin := config.Owner |
| 119 | if config.Owner == "@me" { |
| 120 | ownerType = "user" |
| 121 | // Get current user |
| 122 | currentUser, err := getCurrentUser(ctx) |
| 123 | if err != nil { |
| 124 | return fmt.Errorf("failed to get current user: %w", err) |
| 125 | } |
| 126 | ownerLogin = currentUser |
| 127 | console.LogVerbose(config.Verbose, "Resolved @me to user: "+ownerLogin) |
| 128 | } |
| 129 | |
| 130 | config.OwnerType = ownerType |
| 131 | config.Owner = ownerLogin |
| 132 | |
| 133 | // Validate owner exists |
| 134 | if err := validateOwner(ctx, config.OwnerType, config.Owner, config.Verbose); err != nil { |
| 135 | return fmt.Errorf("owner validation failed: %w", err) |
| 136 | } |
| 137 | |
| 138 | // Get owner ID |
| 139 | ownerId, err := getOwnerNodeId(ctx, config.OwnerType, config.Owner, config.Verbose) |
| 140 | if err != nil { |
| 141 | return fmt.Errorf("failed to get owner ID: %w", err) |
| 142 | } |
| 143 | |
| 144 | // Create project |
| 145 | fmt.Fprintln(os.Stderr, console.FormatInfoMessage(fmt.Sprintf("Creating project '%s' for %s %s...", config.Title, config.OwnerType, config.Owner))) |
| 146 | |
| 147 | project, err := createProject(ctx, ownerId, config.Title, config.Verbose) |
| 148 | if err != nil { |
| 149 | return fmt.Errorf("failed to create project: %w", err) |
| 150 | } |
| 151 | |
| 152 | projectID, ok := project["id"].(string) |
| 153 | if !ok || projectID == "" { |
| 154 | return errors.New("failed to get project ID from response") |
| 155 | } |
| 156 | |
| 157 | // Link to repository if specified |
| 158 | if config.Repo != "" { |
| 159 | fmt.Fprintln(os.Stderr, console.FormatInfoMessage(fmt.Sprintf("Linking project to repository %s...", config.Repo))) |
| 160 | if err := linkProjectToRepo(ctx, projectID, config.Repo, config.Verbose); err != nil { |
| 161 | fmt.Fprintln(os.Stderr, console.FormatWarningMessage(fmt.Sprintf("Warning: Failed to link project to repository: %v", err))) |
| 162 | } else { |
| 163 | fmt.Fprintln(os.Stderr, console.FormatSuccessMessage("✓ Project linked to repository")) |
| 164 | } |
| 165 | } |
| 166 | |
| 167 | // Create views and fields if requested |
| 168 | projectURL, ok := project["url"].(string) |
| 169 | if !ok || projectURL == "" { |
| 170 | return errors.New("failed to get project URL from response") |
no test coverage detected