【学習記録】ユーザー新規登録APIコーディング

今日はユーザー新規登録のAPIをコーディングしました。
昨日はログインを実装したので、似た処理の新規登録も間を置かないで実装した方が効率が良いかなと考えました。

APIの入力パラメータと出力パラメータは以下のように書きました。

// RequestParam リクエストパラメータ
type RequestParam struct {
    UserName     *string `json:"user_name"`
    Password     *string `json:"password"`
    EmailAddress *string `json:"email_address"`
    Note         *string `note`
}

// User ユーザー情報格納用の構造体
type User struct {
    UserID       *int    `json:"user_id", gorm:"primary_key"`
    UserName     *string `json:"user_name"`
    UserPassword *string `json:"user_password"`
    EmailAddress *string `json:"mail_address"`
    Note         *string `json:"note"`
    IconImage    *string `json:"icon_image"`
}

// ResponseParam レスポンスデータ
type ResponseParam struct {
    UserID    *int    `json:"user_id"`
    UserName  *string `json:"user_name"`
    Note      *string `json:"note"`
    IconImage *string `json:"icon_image"`
}

入力でユーザー名、パスワード、Eメールアドレス、備考を受け取りそれをDBに格納して、Auto Increment設定のユーザーIDをレスポンス用の構造体に格納して返す流れです。
(アイコン画像も後から追加する予定ですが、ちょっと時間かかりそうなので今は省略してます)

APISQLを発行する処理は以下のように書きました。

// AddNewUser ユーザー新規登録API
func AddNewUser(param domain.RequestParam) (domain.ResponseParam, error) {
    db := db.CreateDBConnection()
    defer db.Close()

    data := domain.User{
        UserName:     param.UserName,
        UserPassword: param.Password,
        EmailAddress: param.EmailAddress,
        Note:         param.Note,
        // IconImageは未実装
        IconImage: nil,
    }

    err := db.Table("users").
        Create(&data).Error

    if err != nil {
        return domain.ResponseParam{}, err
    }

    res := domain.ResponseParam{
        UserID:    data.UserID,
        UserName:  data.UserName,
        Note:      data.Note,
        IconImage: data.IconImage,
    }

    return res, nil
}

// GetUserID ユーザーIDを取得する
func GetUserID(userName *string, password *string) (int, error) {

    db := db.CreateDBConnection()
    defer db.Close()

    data := domain.ResponseParam{}

    err := db.Table("users").
        Select("user_id").
        Where(`user_name = ? AND user_password = ?`,
            userName, password).
        Find(&data).Error

    return *data.UserID, err

}

SQLを二つ発行しており、一つ目で入力パラメータの値をDBに格納し、二つ目でDBから新しいユーザーのID(Auto Increment設定)を取得してます。 リファクタリングできそうな箇所はあるかと思いますが、まずは実装を進めていって一通りアプリができた後にリファクタリングしていこうと考えてます。

一応上記のコードで想定通りの処理はできてはいるのですが、現場では一つ目のSQLでAuto IncrementのユーザーIDも取得できていたはずなのに自宅環境ではうまくいかなかったのが謎です。
一通り調べて見たものの解決できず。

gorm.io

blog.eviry.com

あんまり時間をかけたくもなかったので、止むを得ず二つ目のユーザーIDのみ取得するも書いて一応解決はしました。
たぶんちょっとした設定の問題な気がするので後から一つのSQLにまとめたいですね。

あとはフロントエンドの新規登録部分の実装はできていないので、そっちを進めていきます。