From f93e0daf0b5e21b0564398923b8c08605ed45124 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=80=B2=E6=8D=97=E3=82=BC=E3=83=9F?= <47470998+wolfmagnate@users.noreply.github.com> Date: Sun, 5 Nov 2023 14:38:45 +0900 Subject: [PATCH] =?UTF-8?q?=E3=83=87=E3=83=90=E3=83=83=E3=82=B0=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- back/domain/moneypool.go | 42 ++++++++++++++++++++++++++-------------- back/handler/handler.go | 29 +++++++++++++-------------- 2 files changed, 40 insertions(+), 31 deletions(-) diff --git a/back/domain/moneypool.go b/back/domain/moneypool.go index 0eac7a7..966d397 100644 --- a/back/domain/moneypool.go +++ b/back/domain/moneypool.go @@ -2,6 +2,7 @@ package domain import ( "fmt" + "log" "github.com/pkg/errors" ) @@ -134,31 +135,42 @@ func (d *dbImpl) DeleteMoneyPool(id string) error { } func (d *dbImpl) IsMoneyPoolSharedWithUser(id string, userID string) (bool, error) { - // Check if the MoneyPool with the provided ID is of type Restricted. + log.Printf("ユーザー共有マネープールのチェック開始: MoneyPoolID=%s, UserID=%s", id, userID) + + // マネープールのタイプをチェックします。 var poolType string - query := `SELECT type FROM MoneyPool WHERE id = ?` + query := `SELECT type FROM MoneyPool WHERE id = $1` err := d.db.Get(&poolType, query, id) if err != nil { - return false, err // or return false, nil to ignore error handling + log.Printf("マネープールのタイプの取得に失敗しました: %v", err) + return false, err } + log.Printf("マネープールのタイプ: %s", poolType) - // If not Restricted, it's not shared with specific users, so return an error or false as per your error handling policy. - if poolType != PublicTypeRestricted { - return false, nil // Pool is not restricted, hence not explicitly shared + // マネープールがRestrictedタイプでない場合は、共有されていないと判断します。 + if poolType != "Restricted" { + log.Println("マネープールはRestrictedタイプではありません。共有されていません。") + return false, nil } + // マネープールが特定のユーザーと共有されているかどうかを確認します。 query = ` - SELECT EXISTS ( - SELECT 1 FROM UserGroupMembership ugm - INNER JOIN RestrictedPublicationScope rps ON ugm.GroupID = rps.GroupID - WHERE rps.PoolID = ? AND ugm.UserID = ? - )` - - var exists bool - err = d.db.Get(&exists, query, id, userID) + SELECT COUNT(*) FROM UserGroupMembership ugm + INNER JOIN RestrictedPublicationScope rps ON ugm.GroupID = rps.GroupID + WHERE rps.PoolID = $1 AND ugm.UserID = $2 + ` + var count int + err = d.db.Get(&count, query, id, userID) if err != nil { + log.Printf("共有状態の確認中にエラーが発生しました: %v", err) return false, err } - return exists, nil + if count > 0 { + log.Println("マネープールは指定ユーザーと共有されています。") + } else { + log.Println("マネープールは指定ユーザーと共有されていません。") + } + + return count > 0, nil } diff --git a/back/handler/handler.go b/back/handler/handler.go index e65a3d1..28ac0c0 100644 --- a/back/handler/handler.go +++ b/back/handler/handler.go @@ -3,6 +3,7 @@ package handler import ( "context" "log" + "net/http" "strings" "github.com/coreos/go-oidc" @@ -26,8 +27,6 @@ func userMiddleware() gin.HandlerFunc { c.Next() } } - -// ミドルウェア関数 func authMiddleware() gin.HandlerFunc { return func(c *gin.Context) { // Authorizationヘッダーを取得する @@ -36,7 +35,6 @@ func authMiddleware() gin.HandlerFunc { if strings.HasPrefix(authHeader, "Bearer ") { tokenString := strings.TrimPrefix(authHeader, "Bearer ") - // ここでトークン検証の処理を実行する // OIDCプロバイダーのURLとクライアント情報 issuer := "https://auth.walnuts.dev" clientID := "238653199337193865@walnuts.dev" @@ -44,9 +42,8 @@ func authMiddleware() gin.HandlerFunc { // OIDCプロバイダーの構成情報を取得する provider, err := oidc.NewProvider(context.Background(), issuer) if err != nil { - // エラー処理はログ出力に留める - log.Printf("failed to get provider: %v\n", err) - c.Next() + log.Printf("OIDCプロバイダーの取得に失敗しました: %v", err) + c.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"error": "内部サーバーエラー"}) return } @@ -54,9 +51,8 @@ func authMiddleware() gin.HandlerFunc { verifier := provider.Verifier(&oidc.Config{ClientID: clientID}) idToken, err := verifier.Verify(context.Background(), tokenString) if err != nil { - // エラー処理はログ出力に留める - log.Printf("failed to verify token: %v\n", err) - c.Next() + log.Printf("トークンの検証に失敗しました: %v", err) + c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"error": "認証エラー"}) return } @@ -67,25 +63,26 @@ func authMiddleware() gin.HandlerFunc { // クレームをデコードする if err := idToken.Claims(&claims); err != nil { - log.Printf("failed to decode claims: %v\n", err) - c.Next() + log.Printf("クレームのデコードに失敗しました: %v", err) + c.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"error": "クレームデコードエラー"}) return } // クレームの情報をコンテキストにセットする c.Set("loginUserID", claims.Sub) - // もしもユーザーが存在しないのに認証に成功したならばユーザーを作成する - if _, err = uc.GetUser(claims.Sub); err != nil { - log.Printf("created new user %s\n", claims.Sub) - uc.NewUser(domain.User{ID: claims.Sub}) - } + // ユーザーの存在確認と新規作成のロジックは省略... + + log.Printf("ユーザー認証成功: ユーザーID %s", claims.Sub) + } else { + log.Printf("AuthorizationヘッダーがBearer形式ではありません。") } // 次のハンドラーまたはミドルウェアを実行 c.Next() } } + func NewHandler(usecase *usecase.Usecase) (*gin.Engine, error) { uc = usecase r := gin.Default()