@@ -107,21 +107,58 @@ func runAttach(ctx context.Context) error {
107107 return fmt .Errorf ("failed to list users: %w" , err )
108108 }
109109
110- if len (usersResponse .Data ) > 0 {
111- var userOptions []string
112- for _ , user := range usersResponse .Data {
113- userOptions = append (userOptions , fmt .Sprintf ("%s [%s]" , user .Name , user .Role ))
110+ var userOptions []string
111+ for _ , user := range usersResponse .Data {
112+ userOptions = append (userOptions , fmt .Sprintf ("%s [%s]" , user .Name , user .Role ))
113+ }
114+ // Add option to create new user
115+ userOptions = append (userOptions , "Create new user..." )
116+
117+ var userIndex int
118+ err = prompt .Select (ctx , & userIndex , "Select user:" , "" , userOptions ... )
119+ if err != nil {
120+ return err
121+ }
122+
123+ if userIndex == len (userOptions )- 1 {
124+ // Create new user option selected
125+ var userName string
126+ err = prompt .String (ctx , & userName , "Enter username:" , "" , true )
127+ if err != nil {
128+ return err
129+ }
130+ if userName == "" {
131+ return fmt .Errorf ("username cannot be empty" )
114132 }
115133
116- var userIndex int
117- err = prompt .Select (ctx , & userIndex , "Select user:" , "" , userOptions ... )
134+ // Prompt for role selection
135+ var roleIndex int
136+ roleOptions := []string {"schema_admin" , "writer" , "reader" }
137+ err = prompt .Select (ctx , & roleIndex , "Select user role:" , "" , roleOptions ... )
118138 if err != nil {
119139 return err
120140 }
141+ userRole := roleOptions [roleIndex ]
142+
143+ fmt .Fprintf (io .Out , "Creating user %s with role %s...\n " , userName , userRole )
144+
145+ input := uiex.CreateUserWithRoleInput {
146+ UserName : userName ,
147+ Role : userRole ,
148+ }
149+
150+ createResponse , err := uiexClient .CreateUserWithRole (ctx , cluster .Id , input )
151+ if err != nil {
152+ return fmt .Errorf ("failed to create user: %w" , err )
153+ }
121154
155+ fmt .Fprintf (io .Out , "User created successfully!\n " )
156+ username = createResponse .Data .Name
157+ } else if len (usersResponse .Data ) > 0 {
122158 username = usersResponse .Data [userIndex ].Name
123159 }
124- // If no users found, username remains empty and will use default credentials
160+ // If no users found and create wasn't selected, username remains empty and will use default credentials.
161+ // This shouldn't be hit as fly-db and fly-user always exist and can't be deleted.
125162 }
126163
127164 // Database selection priority: flag > prompt result (if interactive) > credentials.DBName
@@ -135,18 +172,44 @@ func runAttach(ctx context.Context) error {
135172 return fmt .Errorf ("failed to list databases: %w" , err )
136173 }
137174
138- if len (databasesResponse .Data ) > 0 {
139- var dbOptions []string
140- for _ , database := range databasesResponse .Data {
141- dbOptions = append (dbOptions , database .Name )
142- }
175+ var dbOptions []string
176+ for _ , database := range databasesResponse .Data {
177+ dbOptions = append (dbOptions , database .Name )
178+ }
179+ // Add option to create new database
180+ dbOptions = append (dbOptions , "Create new database..." )
143181
144- var dbIndex int
145- err = prompt .Select (ctx , & dbIndex , "Select database:" , "" , dbOptions ... )
182+ var dbIndex int
183+ err = prompt .Select (ctx , & dbIndex , "Select database:" , "" , dbOptions ... )
184+ if err != nil {
185+ return err
186+ }
187+
188+ if dbIndex == len (dbOptions )- 1 {
189+ // Create new database option selected
190+ var dbName string
191+ err = prompt .String (ctx , & dbName , "Enter database name:" , "" , true )
146192 if err != nil {
147193 return err
148194 }
195+ if dbName == "" {
196+ return fmt .Errorf ("database name cannot be empty" )
197+ }
198+
199+ fmt .Fprintf (io .Out , "Creating database %s...\n " , dbName )
200+
201+ input := uiex.CreateDatabaseInput {
202+ Name : dbName ,
203+ }
204+
205+ createResponse , err := uiexClient .CreateDatabase (ctx , cluster .Id , input )
206+ if err != nil {
207+ return fmt .Errorf ("failed to create database: %w" , err )
208+ }
149209
210+ fmt .Fprintf (io .Out , "Database created successfully!\n " )
211+ db = createResponse .Data .Name
212+ } else if len (databasesResponse .Data ) > 0 {
150213 db = databasesResponse .Data [dbIndex ].Name
151214 }
152215 }
0 commit comments