domain

package
v0.3.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 29, 2024 License: MIT Imports: 7 Imported by: 0

README

ドメイン層

  • ドメイン及びそのドメインに関するロジックを記述
  • サービス間を跨って利用するロジックはドメイン層に記述
  • リポジトリのインターフェースはドメインが持つ
  • サービス層、ハンドラーに依存するのは禁止、つまりimportは禁止

例えば、パスワード自身はドメインになり、オブジェクト(値オブジェクト)として扱うことができ、パスワードにまつわるロジックはオブジェクトに紐づける。 この時、構造体にメソッドを紐づけるが、構造体のプロパティが各メソッドで必ず利用することで凝縮度が高いオブジェクトになる。 なるべく凝縮度の高いオブジェクトを作ることで可読性、堅牢性、信頼性が高くなる

ファイル・ディレクトリ

model/
  • 値オブジェクト、エンティティ
  • システム固有ドメインに対するビジネスロジックなどを記述する
service/
  • サービスドメイン
  • 値オブジェクトやエンティティに記述するとドメイン的に不自然になる場合はドメインサービスに記述
  • なるべく利用しないようにする
  • ファイル名は{ドメイン名}_service.goとする

不自然な振る舞いの例

  1. ユーザの重複を確認することを考える
  2. ユーザの重複をエンティティに記述すると、ユーザー自身に自身の重複を確認するという現実世界ではおかしな振る舞いになる
  3. その場合、ユーザサービスドメインに記述する
interface.go
  • サービス層またはドメイン層と、リポジトリ層を繋げるインターフェースを記述する(依存関係の逆転)
  • より上位レベルにインターフェースを持たせる必要があるためドメイン層に配置
  • サービス層またはドメイン層は必ずインターフェースを利用してリポジトリを操作すること

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type Cache

type Cache interface {
	Save(ctx context.Context, key, value string, minute time.Duration) error
	Load(ctx context.Context, key string) (string, error)
	Delete(ctx context.Context, key string) error
	Expire(ctx context.Context, key string, minitue time.Duration) error
	Publish(ctx context.Context, channel, palyload string) error
	Subscribe(ctx *gin.Context, channel string) (<-chan string, error)
}

キャッシュに対するインターフェース

type NotificationRepo

type NotificationRepo interface {
	CreateNotification(ctx context.Context, db repository.Execer, notification customentities.Notification) (customentities.Notification, error)
	GetByToUserByStartIdOrderByLatest(ctx context.Context, db repository.Queryer, uid model.UserID, startID model.NotificationID, size int, columns ...string) ([]*customentities.Notification, error)
	GetByToUserOrderByLatest(ctx context.Context, db repository.Queryer, uid model.UserID, size int, columns ...string) ([]*customentities.Notification, error)
	GetNotificationByID(ctx context.Context, db repository.Queryer, uid model.UserID, nid model.NotificationID) (customentities.Notification, error)
	GetUncheckedNotificationCount(ctx context.Context, db repository.Queryer, uid model.UserID) (int, error)
	CheckNotification(ctx context.Context, db repository.Execer, uid model.UserID, nid model.NotificationID) error
}

お知らせに対するリポジトリインターフェース

type PointRepo

type PointRepo interface {
	RegisterPointTransaction(ctx context.Context, db repository.Execer, fromUserID, toUserId model.UserID, sendPoint int) error
	UpdateSendablePoint(ctx context.Context, db repository.Execer, fromUserID model.UserID, sendPoint int) error
	UpdateAllSendablePoint(ctx context.Context, db repository.Execer, point int) error
}

ポイントに対するリポジトリインターフェース

type TokenGenerator

type TokenGenerator interface {
	GenerateToken(ctx context.Context, u entities.User) ([]byte, error)
}

トークンに対するインターフェース

type TransactionRepo

type TransactionRepo interface {
	GetAquistionPoint(ctx context.Context, db repository.Queryer, userIDs []model.UserID) (map[model.UserID]int, error)
}

取引に対するインターフェース

type UserRepo

type UserRepo interface {
	FindUserByEmail(ctx context.Context, db repository.Queryer, e string, columns ...string) (entities.User, error)
	GetUserByID(ctx context.Context, db repository.Queryer, ID model.UserID) (entities.User, error)
	DeleteUserByID(ctx context.Context, db repository.Execer, ID model.UserID) (int64, error)
	RegisterUser(ctx context.Context, db repository.Execer, u *entities.User) error
	UpdatePassword(ctx context.Context, db repository.Execer, email, pass *string) error
	UpdateEmail(ctx context.Context, db repository.Execer, userID model.UserID, newEmail string) error
	UpdateAccount(ctx context.Context, db repository.Execer, email, familyName, familyNameKana, firstName, firstNameKana *string) error
	GetAll(ctx context.Context, db repository.Queryer, columns ...string) ([]*entities.User, error)
	GetAllWithCursor(ctx context.Context, db repository.Queryer, param repository.GetAllWithCursorParam) ([]*entities.User, error)
	GetUsers(ctx context.Context, db repository.Queryer, param repository.GetUsersParam) ([]*entities.User, error)
}

Userに対するインターフェース

Directories

Path Synopsis
Package mock_domain is a generated GoMock package.
Package mock_domain is a generated GoMock package.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL