Skip to content

Commit

Permalink
RepositoryConnectorをContextから使用するようにした
Browse files Browse the repository at this point in the history
  • Loading branch information
Shugo Kawamura committed Aug 14, 2023
1 parent 95abfd8 commit d7ec206
Show file tree
Hide file tree
Showing 15 changed files with 154 additions and 164 deletions.
17 changes: 9 additions & 8 deletions backend/cmd/di/di.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,23 +14,24 @@ import (
)

func InitializeUserLoginController(cfg config.Config) gin_controller.UserLoginController {
uuidGenerator := uuid.NewUUIDGenerator()
mysqlConnector := mustGetWriteConnector(cfg)
mysqlUsersRepositoryConnector := mysqlconnector.NewMySQLRepositoryConnector(uuidGenerator, mysqlConnector)
jwtService := jwt.NewJWTGateway([]byte(cfg.SecretKey))
passwordHasher := hash.NewPasswordHasher(bcrypt.DefaultCost)
uc := usecase.NewUser(jwtService, passwordHasher, mysqlUsersRepositoryConnector)
uc := usecase.NewUser(jwtService, passwordHasher)
presenter := gin_presenter.NewJWTPresenter()
return gin_controller.NewUserLoginController(uc, presenter)
}

func InitializeUserRegisterController(cfg config.Config) gin_controller.UserRegisterController {
uuidGenerator := uuid.NewUUIDGenerator()
mysqlConnector := mustGetWriteConnector(cfg)
mysqlUsersRepositoryConnector := mysqlconnector.NewMySQLRepositoryConnector(uuidGenerator, mysqlConnector)
jwtService := jwt.NewJWTGateway([]byte(cfg.SecretKey))
passwordHasher := hash.NewPasswordHasher(bcrypt.DefaultCost)
uc := usecase.NewUser(jwtService, passwordHasher, mysqlUsersRepositoryConnector)
uc := usecase.NewUser(jwtService, passwordHasher)
presenter := gin_presenter.NewJWTPresenter()
return gin_controller.NewUserRegisterController(uc, presenter)
}

func InitializeDatabaseConnectionMiddleware(cfg config.Config) gin_controller.DatabaseConnectionMiddleware {
uuidGenerator := uuid.NewUUIDGenerator()
mysqlConnector := mustGetWriteConnector(cfg)
mysqlUsersRepositoryConnector := mysqlconnector.NewMySQLRepositoryConnector(uuidGenerator, mysqlConnector)
return gin_controller.NewDatabaseConnectionMiddleware(uuidGenerator, mysqlUsersRepositoryConnector)
}
19 changes: 9 additions & 10 deletions backend/cmd/di/gql.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,34 +11,33 @@ import (

config "github.com/FlowingSPDG/get5loader/backend/cfg"
"github.com/FlowingSPDG/get5loader/backend/g5ctx"
mysqlconnector "github.com/FlowingSPDG/get5loader/backend/gateway/database/mysql/connector"
"github.com/FlowingSPDG/get5loader/backend/graph"
"github.com/FlowingSPDG/get5loader/backend/service/jwt"
hash "github.com/FlowingSPDG/get5loader/backend/service/password_hash"
"github.com/FlowingSPDG/get5loader/backend/service/uuid"
"github.com/FlowingSPDG/get5loader/backend/usecase"
)

func InitializeGraphQLHandler(cfg config.Config) gin.HandlerFunc {
// dependencies
uuidGenerator := uuid.NewUUIDGenerator()
jwtService := jwt.NewJWTGateway([]byte(cfg.SecretKey))
passwordHasher := hash.NewPasswordHasher(bcrypt.DefaultCost)
mysqlConnector := mustGetWriteConnector(cfg)
mysqlUsersRepositoryConnector := mysqlconnector.NewMySQLRepositoryConnector(uuidGenerator, mysqlConnector)

// usecases
gameServerUc := usecase.NewGameServer(mysqlUsersRepositoryConnector)
matchUc := usecase.NewMatch(mysqlUsersRepositoryConnector)
userUc := usecase.NewUser(jwtService, passwordHasher, mysqlUsersRepositoryConnector)
teamUc := usecase.NewTeam(mysqlUsersRepositoryConnector)
gameServerUc := usecase.NewGameServer()
userUc := usecase.NewUser(jwtService, passwordHasher)
matchUc := usecase.NewMatch()
mapStatUc := usecase.NewMapStats()
teamUc := usecase.NewTeam()
playerUc := usecase.NewPlayer()

// handler
h := handler.NewDefaultServer(graph.NewExecutableSchema(graph.Config{Resolvers: &graph.Resolver{
GameServerUsecase: gameServerUc,
MatchUsecase: matchUc,
UserUsecase: userUc,
MatchUsecase: matchUc,
MapstatUsecase: mapStatUc,
TeamUsecase: teamUc,
PlayerUsecase: playerUc,
}}))

// middleware
Expand Down
1 change: 1 addition & 0 deletions backend/cmd/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ func main() {
cfg := config.GetConfig()

v1 := r.Group("/api/v1")
v1.Use(di.InitializeDatabaseConnectionMiddleware(cfg).Handle)
v1.POST("/login", di.InitializeUserLoginController(cfg).Handle)
v1.POST("/register", di.InitializeUserRegisterController(cfg).Handle)

Expand Down
2 changes: 1 addition & 1 deletion backend/controller/get5/loader.go
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ func (m *match) ToG5Format() got5.Match {

// Load implements got5.MatchLoader.
func (ml *matchLoader) Load(ctx context.Context, mid string) (got5.G5Match, error) {
uc := usecase.NewGet5(ml.repositoryConnector)
uc := usecase.NewGet5()
m, err := uc.GetMatch(ctx, entity.MatchID(mid))
if err != nil {
return nil, err
Expand Down
43 changes: 43 additions & 0 deletions backend/controller/gin/db.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package gin_controller

import (
"net/http"

"github.com/gin-gonic/gin"

"github.com/FlowingSPDG/get5loader/backend/gateway/database"
"github.com/FlowingSPDG/get5loader/backend/service/uuid"
)

type DatabaseConnectionMiddleware interface {
Handle(c *gin.Context)
}

type databaseConnectionMiddleware struct {
uuidGenerator uuid.UUIDGenerator
connector database.RepositoryConnector
}

func NewDatabaseConnectionMiddleware(
uuidGenerator uuid.UUIDGenerator,
connector database.RepositoryConnector,
) DatabaseConnectionMiddleware {
return &databaseConnectionMiddleware{
uuidGenerator: uuidGenerator,
connector: connector,
}
}

func (d *databaseConnectionMiddleware) Handle(c *gin.Context) {
if err := d.connector.Open(); err != nil {
c.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{
"error": "internal server error",
})
return
}
defer d.connector.Close()

database.SetConnectionForGinContext(c, d.connector)

c.Next()
}
30 changes: 30 additions & 0 deletions backend/gateway/database/context.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package database

import (
"context"

"github.com/gin-gonic/gin"
)

var (
// RepositoryConnectorKey is a key to store repositoryConnector in gin.Context.
RepositoryConnectorKey = "repositoryConnector"
)

// GetConnectionFromGinContext gin.ContextからRepositoryConnectorを取得する
func GetConnectionFromGinContext(c *gin.Context) RepositoryConnector {
return c.MustGet(RepositoryConnectorKey).(RepositoryConnector)
}

// SetConnectionForGinContext gin.ContextにRepositoryConnectorを設定する
func SetConnectionForGinContext(c *gin.Context, repositoryConnector RepositoryConnector) {
c.Set(RepositoryConnectorKey, repositoryConnector)
}

func SetConnection(ctx context.Context, repositoryConnector RepositoryConnector) context.Context {
return context.WithValue(ctx, RepositoryConnectorKey, repositoryConnector)
}

func GetConnection(ctx context.Context) RepositoryConnector {
return ctx.Value(RepositoryConnectorKey).(RepositoryConnector)
}
3 changes: 0 additions & 3 deletions backend/gateway/database/mysql/matches/matches.go
Original file line number Diff line number Diff line change
Expand Up @@ -93,9 +93,6 @@ func (mr *matchRepository) GetMatch(ctx context.Context, id entity.MatchID) (*da
func (mr *matchRepository) GetMatchesByUser(ctx context.Context, userID entity.UserID) ([]*database.Match, error) {
matches, err := mr.queries.GetMatchesByUser(ctx, string(userID))
if err != nil {
if errors.Is(err, sql.ErrNoRows) {
return nil, database.NewNotFoundError(err)
}
return nil, database.NewInternalError(err)
}

Expand Down
34 changes: 8 additions & 26 deletions backend/usecase/gameserver.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,25 +21,16 @@ type GameServer interface {
}

type gameServer struct {
repositoryConnector database.RepositoryConnector
}

func NewGameServer(
repositoryConnector database.RepositoryConnector,
) GameServer {
return &gameServer{
repositoryConnector: repositoryConnector,
}
func NewGameServer() GameServer {
return &gameServer{}
}

// GetPublicServers implements GameServer.
func (gs *gameServer) GetPublicServers(ctx context.Context) ([]*entity.GameServer, error) {
if err := gs.repositoryConnector.Open(); err != nil {
return nil, err
}
defer gs.repositoryConnector.Close()

repository := gs.repositoryConnector.GetGameServersRepository()
repositoryConnector := database.GetConnection(ctx)
repository := repositoryConnector.GetGameServersRepository()

gameServers, err := repository.GetPublicGameServers(ctx)
if err != nil {
Expand All @@ -51,14 +42,8 @@ func (gs *gameServer) GetPublicServers(ctx context.Context) ([]*entity.GameServe

// AddGameServer implements GameServer.
func (gs *gameServer) AddGameServer(ctx context.Context, userID entity.UserID, ip string, port uint32, rconPassword string, name string, isPublic bool) (*entity.GameServer, error) {
// TODO: Query SRCDS
// TODO: Check RCON Password
if err := gs.repositoryConnector.Open(); err != nil {
return nil, err
}
defer gs.repositoryConnector.Close()

repository := gs.repositoryConnector.GetGameServersRepository()
repositoryConnector := database.GetConnection(ctx)
repository := repositoryConnector.GetGameServersRepository()

gameServerID, err := repository.AddGameServer(ctx, userID, ip, port, rconPassword, name, isPublic)
if err != nil {
Expand All @@ -85,12 +70,9 @@ func (gs *gameServer) GetGameServer(ctx context.Context, id entity.GameServerID)

// GetGameServersByUser implements GameServer.
func (gs *gameServer) GetGameServersByUser(ctx context.Context, userID entity.UserID) ([]*entity.GameServer, error) {
if err := gs.repositoryConnector.Open(); err != nil {
return nil, err
}
defer gs.repositoryConnector.Close()
repositoryConnector := database.GetConnection(ctx)

repository := gs.repositoryConnector.GetGameServersRepository()
repository := repositoryConnector.GetGameServersRepository()

gss, err := repository.GetGameServersByUser(ctx, userID)
if err != nil {
Expand Down
20 changes: 6 additions & 14 deletions backend/usecase/get5.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,27 +12,19 @@ type Get5 interface {
}

type get5 struct {
repositoryConnector database.RepositoryConnector
}

func NewGet5(
repositoryConnector database.RepositoryConnector,
) Get5 {
return &get5{
repositoryConnector: repositoryConnector,
}
func NewGet5() Get5 {
return &get5{}
}

// GetMatch implements Get5.
func (g *get5) GetMatch(ctx context.Context, matchID entity.MatchID) (*entity.Get5Match, error) {
if err := g.repositoryConnector.Open(); err != nil {
return nil, err
}
defer g.repositoryConnector.Close()
repositoryConnector := database.GetConnection(ctx)

matchRepository := g.repositoryConnector.GetMatchesRepository()
teamRepository := g.repositoryConnector.GetTeamsRepository()
playerRepository := g.repositoryConnector.GetPlayersRepository()
matchRepository := repositoryConnector.GetMatchesRepository()
teamRepository := repositoryConnector.GetTeamsRepository()
playerRepository := repositoryConnector.GetPlayersRepository()

match, err := matchRepository.GetMatch(ctx, matchID)
if err != nil {
Expand Down
25 changes: 8 additions & 17 deletions backend/usecase/mapstats.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,24 +14,18 @@ type Mapstat interface {
}

type mapstat struct {
repositoryConnector database.RepositoryConnector
}

func NewMapStats(repositoryConnector database.RepositoryConnector) Mapstat {
return &mapstat{
repositoryConnector: repositoryConnector,
}
func NewMapStats() Mapstat {
return &mapstat{}
}

// GetMapStats implements Mapstats.
func (m *mapstat) GetMapStat(ctx context.Context, id entity.MapStatsID) (*entity.MapStat, error) {
if err := m.repositoryConnector.Open(); err != nil {
return nil, err
}
defer m.repositoryConnector.Close()
repositoryConnector := database.GetConnection(ctx)

MapStatRepository := m.repositoryConnector.GetMapStatRepository()
PlayerStatRepository := m.repositoryConnector.GetPlayerStatRepository()
MapStatRepository := repositoryConnector.GetMapStatRepository()
PlayerStatRepository := repositoryConnector.GetPlayerStatRepository()

mapstats, err := MapStatRepository.GetMapStats(ctx, id)
if err != nil {
Expand All @@ -48,13 +42,10 @@ func (m *mapstat) GetMapStat(ctx context.Context, id entity.MapStatsID) (*entity

// GetMapStatsByMatch implements Mapstats.
func (m *mapstat) GetMapStatsByMatch(ctx context.Context, matchID entity.MatchID) ([]*entity.MapStat, error) {
if err := m.repositoryConnector.Open(); err != nil {
return nil, err
}
defer m.repositoryConnector.Close()
repositoryConnector := database.GetConnection(ctx)

MapStatRepository := m.repositoryConnector.GetMapStatRepository()
PlayerStatRepository := m.repositoryConnector.GetPlayerStatRepository()
MapStatRepository := repositoryConnector.GetMapStatRepository()
PlayerStatRepository := repositoryConnector.GetPlayerStatRepository()

mapstats, err := MapStatRepository.GetMapStatsByMatch(ctx, matchID)
if err != nil {
Expand Down
32 changes: 9 additions & 23 deletions backend/usecase/match.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,25 +14,18 @@ type Match interface {
}

type match struct {
repositoryConnector database.RepositoryConnector
}

func NewMatch(
repositoryConnector database.RepositoryConnector,
) Match {
return &match{
repositoryConnector: repositoryConnector,
}
func NewMatch() Match {
return &match{}
}

func (gm *match) GetMatch(ctx context.Context, matchID entity.MatchID) (*entity.Match, error) {
// TODO: publicでない場合の認証処理の追加
if err := gm.repositoryConnector.Open(); err != nil {
return nil, err
}
defer gm.repositoryConnector.Close()
repositoryConnector := database.GetConnection(ctx)

matchRepository := repositoryConnector.GetMatchesRepository()

matchRepository := gm.repositoryConnector.GetMatchesRepository()
match, err := matchRepository.GetMatch(ctx, matchID)
if err != nil {
return nil, err
Expand All @@ -43,13 +36,9 @@ func (gm *match) GetMatch(ctx context.Context, matchID entity.MatchID) (*entity.

// CreateMatch implements Match.
func (gm *match) CreateMatch(ctx context.Context, userID entity.UserID, serverID entity.GameServerID, team1ID entity.TeamID, team2ID entity.TeamID, maxMaps int, title string) (*entity.Match, error) {
// TODO: teamが存在しない場合のエラーハンドリング
if err := gm.repositoryConnector.Open(); err != nil {
return nil, err
}
defer gm.repositoryConnector.Close()
repositoryConnector := database.GetConnection(ctx)

matchRepository := gm.repositoryConnector.GetMatchesRepository()
matchRepository := repositoryConnector.GetMatchesRepository()

mID, err := matchRepository.AddMatch(ctx, userID, serverID, team1ID, team2ID, int32(maxMaps), title, false, "")
if err != nil {
Expand All @@ -69,12 +58,9 @@ func (gm *match) CreateMatch(ctx context.Context, userID entity.UserID, serverID
// GetMatchesByUser implements Match.
func (gm *match) GetMatchesByUser(ctx context.Context, userID entity.UserID) ([]*entity.Match, error) {
// TODO: publicでない場合の認証処理の追加
if err := gm.repositoryConnector.Open(); err != nil {
return nil, err
}
defer gm.repositoryConnector.Close()
repositoryConnector := database.GetConnection(ctx)

matchRepository := gm.repositoryConnector.GetMatchesRepository()
matchRepository := repositoryConnector.GetMatchesRepository()

matches, err := matchRepository.GetMatchesByUser(ctx, userID)
if err != nil {
Expand Down
Loading

0 comments on commit d7ec206

Please sign in to comment.