(ctx context.Context, logger slog.Logger, cfg *devConfig, apiURL string)
| 881 | } |
| 882 | |
| 883 | func setupFirstUser(ctx context.Context, logger slog.Logger, cfg *devConfig, apiURL string) (*codersdk.Client, error) { |
| 884 | serverURL, _ := url.Parse(apiURL) |
| 885 | client := codersdk.New(serverURL) |
| 886 | cfgRoot := config.Root(cfg.configDir) |
| 887 | |
| 888 | // Try reusing an existing session. |
| 889 | loggedIn := false |
| 890 | if token, err := cfgRoot.Session().Read(); err == nil && token != "" { |
| 891 | client.SetSessionToken(token) |
| 892 | if _, err := client.User(ctx, codersdk.Me); err == nil { |
| 893 | loggedIn = true |
| 894 | } else { |
| 895 | client.SetSessionToken("") |
| 896 | } |
| 897 | } |
| 898 | |
| 899 | if !loggedIn { |
| 900 | hasUser, err := client.HasFirstUser(ctx) |
| 901 | if err != nil { |
| 902 | return nil, xerrors.Errorf("checking first user: %w", err) |
| 903 | } |
| 904 | if !hasUser { |
| 905 | logger.Info(ctx, "creating first user", |
| 906 | slog.F("email", "admin@coder.com"), |
| 907 | slog.F("password", cfg.password)) |
| 908 | _, err := client.CreateFirstUser(ctx, codersdk.CreateFirstUserRequest{ |
| 909 | Email: "admin@coder.com", |
| 910 | Username: "admin", |
| 911 | Name: "Admin User", |
| 912 | Password: cfg.password, |
| 913 | }) |
| 914 | if err != nil { |
| 915 | return nil, xerrors.Errorf("creating first user: %w", err) |
| 916 | } |
| 917 | } |
| 918 | |
| 919 | loginResp, err := client.LoginWithPassword(ctx, codersdk.LoginWithPasswordRequest{ |
| 920 | Email: "admin@coder.com", |
| 921 | Password: cfg.password, |
| 922 | }) |
| 923 | if err != nil { |
| 924 | return nil, xerrors.Errorf("login: %w", err) |
| 925 | } |
| 926 | client.SetSessionToken(loginResp.SessionToken) |
| 927 | |
| 928 | if err := cfgRoot.Session().Write(loginResp.SessionToken); err != nil { |
| 929 | return nil, xerrors.Errorf("writing session: %w", err) |
| 930 | } |
| 931 | if err := cfgRoot.URL().Write(apiURL); err != nil { |
| 932 | return nil, xerrors.Errorf("writing url: %w", err) |
| 933 | } |
| 934 | } |
| 935 | logger.Info(ctx, "authenticated as admin user", slog.F("email", "admin@coder.com")) |
| 936 | |
| 937 | // Look up the default org for member creation. |
| 938 | defaultOrg, err := client.OrganizationByName(ctx, codersdk.DefaultOrganization) |
| 939 | if err != nil { |
| 940 | return nil, xerrors.Errorf("looking up default org: %w", err) |
no test coverage detected