こんにちは、KOUKIです。
GolangのWebフレームワークであるfiberを使ってAPIを開発しています。
前回は、プロファイルの更新処理を実装しました。
今回は、ユーザーデータの取得処理を実装します。
尚、この記事に出てくるソースコードは、Udemyの「React, NextJS and Golang: A Rapid Guide – Advanced」コースを参考にしています。解釈は私が勝手に付けているので、本物をみたい場合は受講をお勧めします!
<目次>
前回
事前準備
フォルダ/ファイル作成
1 2 3 4 |
touch src/controllers/userController.go mkdir src/commands touch src/commands/populateUsers.go touch Makefile |
モジュール
1 |
go get -u github.com/bxcodec/faker/v3 |
作るもの
Admin機能を作りたいと思います。エンドポイントは、次の通りです。
- GET/POST /api/admin/products
- GET/PUT/DELETE /api/admin/products/{product_id}
- GET /api/admin/users/{user_id}/links
- GET /api/admin/orders
- GET /api/admin/ambassadors
今回は、「/api/admin/ambassadors」の処理を実装します。
ユーザー情報取得API
以前実装したUser構造体のテストデータを作成し、そのデータを取得するAPIを実装していきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
// models/user.go package models import "golang.org/x/crypto/bcrypt" type User struct { ID uint `json:"id"` FirstName string `json:"first_name"` LastName string `json:"last_name"` Email string `json:"email" gorm:"unique"` Password []byte `json:"-"` IsAmbassdor bool `json:"-"` <<< これ } |
テストデータの作成
bxcodec/fakerを使って、テストデータを作成しましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
// populateUsers.go package main import ( "admin/src/database" "admin/src/models" "fmt" "log" "github.com/bxcodec/faker/v3" ) func main() { // DB接続 database.Connect() log.Println("Creating Test User...") for i := 0; i < 30; i++ { ambassador := models.User{ FirstName: faker.FirstName(), LastName: faker.LastName(), Email: faker.Email(), IsAmbassador: true, } ambassador.SetPassword("1234") database.DB.Create(&ambassador) log.Println(fmt.Sprintf("Created Test User %d", i+1)) } log.Println("Finish Test User!") } |
Makefileに実行コマンドを記載します。
1 2 3 4 5 6 7 8 |
.PHONY: create-user up create-user: docker-compose run --rm backend sh -c "go run src/commands/populateUsers.go" up: docker-compose up |
このプログラムは、dockerコンテナを起動していないと動きませんので、以下の順番で実行してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
# コンテナ起動 make up # テストデータ作成 make create-user 021/06/09 21:58:06 Creating Test User... 2021/06/09 21:58:06 Created Test User 1 2021/06/09 21:58:06 Created Test User 2 2021/06/09 21:58:06 Created Test User 3 2021/06/09 21:58:07 Created Test User 4 2021/06/09 21:58:07 Created Test User 5 2021/06/09 21:58:07 Created Test User 6 2021/06/09 21:58:07 Created Test User 7 2021/06/09 21:58:08 Created Test User 8 2021/06/09 21:58:08 Created Test User 9 2021/06/09 21:58:08 Created Test User 10 2021/06/09 21:58:08 Created Test User 11 2021/06/09 21:58:09 Created Test User 12 2021/06/09 21:58:09 Created Test User 13 2021/06/09 21:58:09 Created Test User 14 2021/06/09 21:58:09 Created Test User 15 2021/06/09 21:58:10 Created Test User 16 2021/06/09 21:58:10 Created Test User 17 2021/06/09 21:58:10 Created Test User 18 2021/06/09 21:58:10 Created Test User 19 2021/06/09 21:58:11 Created Test User 20 2021/06/09 21:58:11 Created Test User 21 2021/06/09 21:58:11 Created Test User 22 2021/06/09 21:58:11 Created Test User 23 2021/06/09 21:58:12 Created Test User 24 2021/06/09 21:58:12 Created Test User 25 2021/06/09 21:58:12 Created Test User 26 2021/06/09 21:58:12 Created Test User 27 2021/06/09 21:58:13 Created Test User 28 2021/06/09 21:58:13 Created Test User 29 2021/06/09 21:58:13 Created Test User 30 2021/06/09 21:58:13 Finish Test User! |
DBを確認しましょう。

問題なくデータが作成されました。fakerは便利です。
ルートの追加
「/api/admin/ambassadors」へのルートを追加します。
1 2 3 4 5 6 7 8 |
// routes/routes.go ... func Setup(app *fiber.App) { ... // Middleware ... adminAuthenticated.Get("ambassadors", controllers.Ambassadors) } |
コントローラーの追加
Ambassadorデータを取得する処理を実装しましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
// userController.go package controllers import ( "admin/src/database" "admin/src/models" "github.com/gofiber/fiber/v2" ) func Ambassadors(ctx *fiber.Ctx) error { var users []models.User database.DB.Where("is_ambassador = true").Find(&users) return ctx.JSON(users) } |
検証
APIへ以下のパラメータでリクエストを送り、Ambassadorsが取得できるか確認しましょう。※ログインしていない場合は、ログインしてください
- URL: http://localhost:8000/api/admin/ambassadors
- 形式: GET


問題なくデータが取得できました。
次回
次回は、プロダクト系のAPIを実装しましょう。
Go言語まとめ
ソースコード
ここまでのソースコードを以下に記載します。
Makefile
1 2 3 4 5 6 7 8 9 |
.PHONY: create-user up # テストデータ作成 create-user: docker-compose run --rm backend sh -c "go run src/commands/populateUsers.go" # コンテナ起動 up: docker-compose up |
user.go
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
// models/user.go package models import "golang.org/x/crypto/bcrypt" type User struct { ID uint `json:"id"` FirstName string `json:"first_name"` LastName string `json:"last_name"` Email string `json:"email" gorm:"unique"` Password []byte `json:"-"` IsAmbassador bool `json:"-"` } func (u *User) SetPassword(pwd string) { // ハッシュパスワードを作成 hashPwd, _ := bcrypt.GenerateFromPassword([]byte(pwd), 12) u.Password = hashPwd } func (u *User) ComparePassword(pwd string) error { return bcrypt.CompareHashAndPassword(u.Password, []byte(pwd)) } |
userController.go
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
// userController.go package controllers import ( "admin/src/database" "admin/src/models" "github.com/gofiber/fiber/v2" ) func Ambassadors(ctx *fiber.Ctx) error { var users []models.User database.DB.Where("is_ambassador = true").Find(&users) return ctx.JSON(users) } |
routes.go
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
// routes/routes.go package routes import ( "admin/src/controllers" "admin/src/middleware" "github.com/gofiber/fiber/v2" ) func Setup(app *fiber.App) { // GROUP api := app.Group("api") admin := api.Group("admin") // No Middleware admin.Post("register", controllers.Register) admin.Post("login", controllers.Login) // Middleware adminAuthenticated := admin.Use(middleware.IsAuthenticate) adminAuthenticated.Get("user", controllers.User) adminAuthenticated.Post("logout", controllers.Logout) adminAuthenticated.Put("info", controllers.UpdateInfo) adminAuthenticated.Put("password", controllers.UpdatePassword) adminAuthenticated.Get("ambassadors", controllers.Ambassadors) } |
populateUsers.go
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
// populateUsers.go package main import ( "admin/src/database" "admin/src/models" "fmt" "log" "github.com/bxcodec/faker/v3" ) func main() { // DB接続 database.Connect() log.Println("Creating Test User...") for i := 0; i < 30; i++ { ambassador := models.User{ FirstName: faker.FirstName(), LastName: faker.LastName(), Email: faker.Email(), IsAmbassador: true, } ambassador.SetPassword("1234") database.DB.Create(&ambassador) log.Println(fmt.Sprintf("Created Test User %d", i+1)) } log.Println("Finish Test User!") } |
コメントを残す
コメントを投稿するにはログインしてください。