Skip to content

Commit

Permalink
refactor: spwan transaction from service
Browse files Browse the repository at this point in the history
  • Loading branch information
litsynp committed Feb 4, 2024
1 parent 76751d4 commit 8b8976e
Show file tree
Hide file tree
Showing 33 changed files with 1,848 additions and 1,613 deletions.
50 changes: 30 additions & 20 deletions cmd/import_breeds/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import (
"flag"
"log"

pnd "github.com/pet-sitter/pets-next-door-api/api"
"github.com/pet-sitter/pets-next-door-api/cmd/import_breeds/breeds_importer_service"
"github.com/pet-sitter/pets-next-door-api/internal/configs"
"github.com/pet-sitter/pets-next-door-api/internal/domain/pet"
Expand All @@ -25,8 +26,6 @@ func main() {
log.Fatalf("error opening database: %v\n", err)
}

breedStore := postgres.NewBreedPostgresStore(db)

ctx := context.Background()
client, err := breeds_importer_service.NewBreedsImporterService(ctx, configs.GoogleSheetsAPIKey)

Expand All @@ -42,16 +41,16 @@ func main() {
switch flags.petTypeToImport {
case Cat:
var catRows = client.GetCatNames(spreadsheet)
importBreeds(ctx, breedStore, pet.PetTypeCat, &catRows)
importBreeds(ctx, db, pet.PetTypeCat, &catRows)
case Dog:
var dogRows = client.GetDogNames(spreadsheet)
importBreeds(ctx, breedStore, pet.PetTypeDog, &dogRows)
importBreeds(ctx, db, pet.PetTypeDog, &dogRows)
case All:
var catRows = client.GetCatNames(spreadsheet)
var dogRows = client.GetDogNames(spreadsheet)

importBreeds(ctx, breedStore, pet.PetTypeCat, &catRows)
importBreeds(ctx, breedStore, pet.PetTypeDog, &dogRows)
importBreeds(ctx, db, pet.PetTypeCat, &catRows)
importBreeds(ctx, db, pet.PetTypeDog, &dogRows)
}

log.Println("Completed importing pet types to database")
Expand Down Expand Up @@ -91,31 +90,42 @@ func parseFlags() Flags {
return Flags{petTypeToImport: petTypeToImport}
}

func importBreed(ctx context.Context, breedStore pet.BreedStore, petType pet.PetType, row breeds_importer_service.Row) (*pet.Breed, error) {
func importBreed(ctx context.Context, conn *database.DB, petType pet.PetType, row breeds_importer_service.Row) (*pet.Breed, error) {
log.Printf("Importing breed with pet_type: %s, name: %s to database", petType, row.Breed)

existing, err := breedStore.FindBreedByPetTypeAndName(ctx, petType, row.Breed)
if err != nil && !errors.Is(err, sql.ErrNoRows) {
return nil, err
}
var breed *pet.Breed
err := database.Transaction(ctx, conn, func(tx *database.Tx) *pnd.AppError {
breedStore := postgres.NewBreedPostgresStore(tx)

if existing != nil {
log.Printf("Breed with id: %d, pet_type: %s, name: %s already exists in database", existing.ID, existing.PetType, existing.Name)
return existing, nil
}
existing, err := breedStore.FindBreedByPetTypeAndName(ctx, petType, row.Breed)
if err != nil && !errors.Is(err, sql.ErrNoRows) {
return err
}

breed, err := breedStore.CreateBreed(ctx, &pet.Breed{PetType: petType, Name: row.Breed})
if existing != nil {
log.Printf("Breed with id: %d, pet_type: %s, name: %s already exists in database", existing.ID, existing.PetType, existing.Name)
breed = existing
return nil
}

breed, err = breedStore.CreateBreed(ctx, &pet.Breed{PetType: petType, Name: row.Breed})
if err != nil {
return err
}

log.Printf("Succeeded to import breed with id: %d, pet_type: %s, name: %s to database", breed.ID, breed.PetType, breed.Name)
return nil
})
if err != nil {
return breed, err
return nil, err
}

log.Printf("Succeeded to import breed with id: %d, pet_type: %s, name: %s to database", breed.ID, breed.PetType, breed.Name)
return breed, nil
}

func importBreeds(ctx context.Context, breedStore pet.BreedStore, petType pet.PetType, rows *[]breeds_importer_service.Row) {
func importBreeds(ctx context.Context, conn *database.DB, petType pet.PetType, rows *[]breeds_importer_service.Row) {
for _, row := range *rows {
breed, err := importBreed(ctx, breedStore, petType, row)
breed, err := importBreed(ctx, conn, petType, row)
if err != nil {
log.Printf("Failed to import breed with pet_type: %s, name: %s to database", breed.PetType, breed.Name)
}
Expand Down
16 changes: 14 additions & 2 deletions cmd/import_conditions/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"context"
"log"

pnd "github.com/pet-sitter/pets-next-door-api/api"
"github.com/pet-sitter/pets-next-door-api/internal/configs"
"github.com/pet-sitter/pets-next-door-api/internal/domain/sos_post"
"github.com/pet-sitter/pets-next-door-api/internal/infra/database"
Expand All @@ -18,10 +19,21 @@ func main() {
log.Fatalf("error opening database: %v\n", err)
}

conditionStore := postgres.NewConditionPostgresStore(db)
var result string
var err2 *pnd.AppError

ctx := context.Background()
result, err2 := conditionStore.InitConditions(ctx, sos_post.ConditionName)
err2 = database.Transaction(ctx, db, func(tx *database.Tx) *pnd.AppError {
conditionStore := postgres.NewConditionPostgresStore(tx)

result, err2 = conditionStore.InitConditions(ctx, sos_post.ConditionName)
if err2 != nil {
return err2
}

return nil
})

if err2 != nil {
log.Fatalf("error initializing condition: %v\n", err2)
}
Expand Down
5 changes: 3 additions & 2 deletions cmd/server/handler/auth_handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,14 +10,15 @@ import (
"github.com/pet-sitter/pets-next-door-api/internal/domain/auth"
"github.com/pet-sitter/pets-next-door-api/internal/domain/user"
kakaoinfra "github.com/pet-sitter/pets-next-door-api/internal/infra/kakao"
"github.com/pet-sitter/pets-next-door-api/internal/service"
)

type authHandler struct {
authService auth.AuthService
authService service.AuthService
kakaoClient kakaoinfra.KakaoClient
}

func NewAuthHandler(authService auth.AuthService, kakaoClient kakaoinfra.KakaoClient) *authHandler {
func NewAuthHandler(authService service.AuthService, kakaoClient kakaoinfra.KakaoClient) *authHandler {
return &authHandler{
authService: authService,
kakaoClient: kakaoClient,
Expand Down
6 changes: 3 additions & 3 deletions cmd/server/handler/breed_handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,14 @@ import (

"github.com/go-chi/render"
pnd "github.com/pet-sitter/pets-next-door-api/api"
"github.com/pet-sitter/pets-next-door-api/internal/domain/pet"
"github.com/pet-sitter/pets-next-door-api/internal/service"
)

type BreedHandler struct {
breedService pet.BreedService
breedService service.BreedService
}

func NewBreedHandler(breedService pet.BreedService) *BreedHandler {
func NewBreedHandler(breedService service.BreedService) *BreedHandler {
return &BreedHandler{breedService: breedService}
}

Expand Down
6 changes: 3 additions & 3 deletions cmd/server/handler/condition_handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,14 @@ import (

"github.com/go-chi/render"
pnd "github.com/pet-sitter/pets-next-door-api/api"
"github.com/pet-sitter/pets-next-door-api/internal/domain/sos_post"
"github.com/pet-sitter/pets-next-door-api/internal/service"
)

type ConditionHandler struct {
conditionService sos_post.ConditionService
conditionService service.ConditionService
}

func NewConditionHandler(conditionService sos_post.ConditionService) *ConditionHandler {
func NewConditionHandler(conditionService service.ConditionService) *ConditionHandler {
return &ConditionHandler{conditionService: conditionService}
}

Expand Down
5 changes: 3 additions & 2 deletions cmd/server/handler/media_handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,14 @@ import (
"github.com/go-chi/render"
pnd "github.com/pet-sitter/pets-next-door-api/api"
"github.com/pet-sitter/pets-next-door-api/internal/domain/media"
"github.com/pet-sitter/pets-next-door-api/internal/service"
)

type mediaHandler struct {
mediaService media.MediaService
mediaService service.MediaService
}

func NewMediaHandler(mediaService media.MediaService) *mediaHandler {
func NewMediaHandler(mediaService service.MediaService) *mediaHandler {
return &mediaHandler{
mediaService: mediaService,
}
Expand Down
8 changes: 4 additions & 4 deletions cmd/server/handler/sos_post_handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,16 +6,16 @@ import (

"github.com/go-chi/render"
pnd "github.com/pet-sitter/pets-next-door-api/api"
"github.com/pet-sitter/pets-next-door-api/internal/domain/auth"
"github.com/pet-sitter/pets-next-door-api/internal/domain/sos_post"
"github.com/pet-sitter/pets-next-door-api/internal/service"
)

type SosPostHandler struct {
sosPostService sos_post.SosPostService
authService auth.AuthService
sosPostService service.SosPostService
authService service.AuthService
}

func NewSosPostHandler(sosPostService sos_post.SosPostService, authService auth.AuthService) *SosPostHandler {
func NewSosPostHandler(sosPostService service.SosPostService, authService service.AuthService) *SosPostHandler {
return &SosPostHandler{
sosPostService: sosPostService,
authService: authService,
Expand Down
8 changes: 4 additions & 4 deletions cmd/server/handler/user_handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,17 +5,17 @@ import (

"github.com/go-chi/render"
pnd "github.com/pet-sitter/pets-next-door-api/api"
"github.com/pet-sitter/pets-next-door-api/internal/domain/auth"
"github.com/pet-sitter/pets-next-door-api/internal/domain/pet"
"github.com/pet-sitter/pets-next-door-api/internal/domain/user"
"github.com/pet-sitter/pets-next-door-api/internal/service"
)

type UserHandler struct {
userService user.UserService
authService auth.AuthService
userService service.UserService
authService service.AuthService
}

func NewUserHandler(userService user.UserService, authService auth.AuthService) *UserHandler {
func NewUserHandler(userService service.UserService, authService service.AuthService) *UserHandler {
return &UserHandler{
userService: userService,
authService: authService,
Expand Down
50 changes: 14 additions & 36 deletions cmd/server/router.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,22 +5,18 @@ import (
"log"
"net/http"

"github.com/pet-sitter/pets-next-door-api/internal/domain/pet"
"github.com/pet-sitter/pets-next-door-api/internal/domain/sos_post"
"github.com/pet-sitter/pets-next-door-api/internal/service"

"github.com/go-chi/chi/v5"
"github.com/go-chi/chi/v5/middleware"
"github.com/go-chi/render"
"github.com/pet-sitter/pets-next-door-api/cmd/server/handler"
"github.com/pet-sitter/pets-next-door-api/internal/configs"
"github.com/pet-sitter/pets-next-door-api/internal/domain/auth"
"github.com/pet-sitter/pets-next-door-api/internal/domain/media"
"github.com/pet-sitter/pets-next-door-api/internal/domain/user"
"github.com/pet-sitter/pets-next-door-api/internal/infra/database"
firebaseinfra "github.com/pet-sitter/pets-next-door-api/internal/infra/firebase"
kakaoinfra "github.com/pet-sitter/pets-next-door-api/internal/infra/kakao"
s3infra "github.com/pet-sitter/pets-next-door-api/internal/infra/s3"
"github.com/pet-sitter/pets-next-door-api/internal/postgres"
pndMiddleware "github.com/pet-sitter/pets-next-door-api/lib/middleware"
httpSwagger "github.com/swaggo/http-swagger/v2"
)
Expand All @@ -34,43 +30,25 @@ func NewRouter(app *firebaseinfra.FirebaseApp) *chi.Mux {
}

authClient, err := app.Auth(context.Background())

// Initialize services
mediaService := media.NewMediaService(
postgres.NewMediaPostgresStore(db),
s3infra.NewS3Client(
configs.B2KeyID,
configs.B2Key,
configs.B2Endpoint,
configs.B2Region,
configs.B2BucketName,
),
)

userService := user.NewUserService(
postgres.NewUserPostgresStore(db),
postgres.NewPetPostgresStore(db),
*mediaService,
)

authService := auth.NewFirebaseBearerAuthService(authClient, *userService)
if err != nil {
log.Fatalf("error initializing app: %v\n", err)
}

breedService := pet.NewBreedService(
postgres.NewBreedPostgresStore(db),
)

sosPostService := sos_post.NewSosPostService(
postgres.NewSosPostPostgresStore(db),
postgres.NewResourceMediaPostgresStore(db),
postgres.NewUserPostgresStore(db),
// Initialize services
s3Client := s3infra.NewS3Client(
configs.B2KeyID,
configs.B2Key,
configs.B2Endpoint,
configs.B2Region,
configs.B2BucketName,
)

conditionService := sos_post.NewConditionService(
postgres.NewConditionPostgresStore(db),
)
mediaService := service.NewMediaService(db, s3Client)
userService := service.NewUserService(db, s3Client)
authService := service.NewFirebaseBearerAuthService(db, authClient, s3Client)
breedService := service.NewBreedService(db)
sosPostService := service.NewSosPostService(db)
conditionService := service.NewConditionService(db)

// Initialize handlers
authHandler := handler.NewAuthHandler(authService, kakaoinfra.NewKakaoDefaultClient())
Expand Down
77 changes: 0 additions & 77 deletions internal/domain/media/service.go

This file was deleted.

Loading

0 comments on commit 8b8976e

Please sign in to comment.