Closed29

写経:Go言語でつくるREST API開発 2024年版

shinobe179shinobe179

はまってる 本質ではなさそうなのでTODOということで、次へ

$ swag init -g api/cmd/main.go
2024/10/31 21:36:06 Generate swagger docs....
2024/10/31 21:36:06 Generate general API Info, search dir:./
2024/10/31 21:36:07 ParseComment error in file /home/ubuntu/work/golang-rest-api/internal/controller/system/handler.go :cannot find type definition: Response
shinobe179shinobe179

omitemptyって何?

  • フィールドが空値のとき、フィールドを省略する
  • 空値 is
    • false
    • 0
    • nil
    • 空配列
    • 空map
    • 空文字(?)

https://pkg.go.dev/encoding/json

The "omitempty" option specifies that the field should be omitted from the encoding if the field has an empty value, defined as false, 0, a nil pointer, a nil interface value, and any empty array, slice, map, or string.

shinobe179shinobe179

repository.goにUserServiceRepositoryインターフェイスを書いている。これらのメソッドを持ってないといけない。

type UserServiceRepository interface {
	FindUser(ctx context.Context) ([]*User, error)
	FindUserById(ctx context.Context, id string) (*User, error)
	Save(ctx context.Context, param *User) error
	Delete(ctx context.Context, id string) error
}
shinobe179shinobe179

domain/user/domain_service.goを書いている。

repoどっから出てきた?

type UserDomainService struct {
	repo UserServiceRepository
}

func NewUserDomainService(repo UserServiceRepository) *UserDomainService {
	return &UserDomainService{repo: repo}
}
shinobe179shinobe179

内容に関係のないZennへの文句だけど、左ペイン畳みたいな

shinobe179shinobe179

ドメインの実装終わったけどドメインサービスもドメインロジックもリポジトリのなんのことかわからん

shinobe179shinobe179

なんとなく、1つのユースケースが1つのDBクエリに対応していそうということは分かった
以下わからないこと

  • context.Contextとは
  • AdminDomainServiceとは
shinobe179shinobe179

なんか不安になってサンプルコード見たら、2章の段階で特段の解説なく実装されているコードがあったので追加
https://github.com/o-ga09/GO_TEMPLATE_RESTAPI/blob/chapter-3/api/internal/controller/system/response.go

これ(swagでドキュメント生成するやつ)がうまくいかなかった原因なのでは?
https://zenn.dev/link/comments/8fc01263432180

shinobe179shinobe179

コードブロックに設定されているパスも、必ずしもプロジェクトのルートからのものではなかったようなので修正

shinobe179shinobe179

バッククォートで囲った文字列は生の文字列リテラル
Pythonの r'foobar' みたいなことだと思う

shinobe179shinobe179

その下に値オブジェクトのメソッドが続く。
Goのメソッドの書き方は不思議

// 構造体を使った型定義
type user struct {
    ID userUUID `json:"id,omitempty"`
    ...
}

// userUUIDの型定義
type userUUID struct { value string }

// userUUID.valid()の定義
func(v *usreUUID) valid() error {
    r := regexp.MustCompile(USER_ID_PATTERN)
    matched, _ := r.MatchString(v.value)
    if !match {
        return INVALID_USER_ID
    }
    return nil
}
shinobe179shinobe179

今気がついたけど、user型の定義がZennとGItHubで違う。。。

Zenn

type User struct {
	ID               UserUUID         `json:"id,omitempty"`
	Email            UserEmail        `json:"email,omitempty"`
	Password         UserPassWord     `json:"password,omitempty"`
	User_ID          UserID           `json:"user_id,omitempty"`
	FirstName        UserFirstName    `json:"first_name,omitempty"`
	LastName         UserLastName     `json:"last_name,omitempty"`
	Gender           UserGender       `json:"gender,omitempty"`
	BirthDay         UserBirthDay     `json:"birth_day,omitempty"`
	PhoneNumber      UserPhoneNumber  `json:"phone_number,omitempty"`
	PostOfficeNumber PostOfficeNumber `json:"post_office_number,omitempty"`
	Pref             Pref             `json:"pref,omitempty"`
	City             City             `json:"city,omitempty"`
	Extra            Extra            `json:"extra,omitempty"`
}

GitHub
https://github.com/o-ga09/GO_TEMPLATE_RESTAPI/blob/fb5ac599e93fe7a14b002b31cf0a7d0691f41e46/api/internal/domain/entity.go#L35-L49

このスクラップは24日前にクローズされました