add extractors for userid and token

This commit is contained in:
Pavel 2024-05-20 17:29:45 +03:00
parent 15087a0f99
commit e7db450e8c
7 changed files with 111 additions and 88 deletions

@ -4,21 +4,21 @@ JWT_AUDIENCE="pena"
JWT_PUBLIC_KEY="-----BEGIN PUBLIC KEY-----\nMIGeMA0GCSqGSIb3DQEBAQUAA4GMADCBiAKBgHgnvr7O2tiApjJfid1orFnIGm69\n80fZp+Lpbjo+NC/0whMFga2Biw5b1G2Q/B2u0tpO1Fs/E8z7Lv1nYfr5jx2S8x6B\ndA4TS2kB9Kf0wn0+7wSlyikHoKhbtzwXHZl17GsyEi6wHnsqNBSauyIWhpha8i+Y\n+3GyaOY536H47qyXAgMBAAE=\n-----END PUBLIC KEY-----"
HTTP_HOST=0.0.0.0
HTTP_PORT=8003
HTTP_PORT=8082
GRPC_HOST=0.0.0.0
GRPC_PORT=9000
GRPC_DOMEN=customer-service:9000
MONGO_HOST=localhost
MONGO_PORT=27024
MONGO_PORT=27020
MONGO_USER=test
MONGO_PASSWORD=test
MONGO_DB_NAME=admin
MONGO_AUTH=admin
KAFKA_BROKERS=localhost:9092
KAFKA_TOPIC_TARIFF=tariffs
KAFKA_TOPIC_TARIFF=test-topic
AUTH_MICROSERVICE_USER_URL=http://localhost:8000/user
HUBADMIN_MICROSERVICE_TARIFF_URL=http://localhost:8001/tariff
@ -27,9 +27,11 @@ DISCOUNT_MICROSERVICE_GRPC_HOST=localhost:9040
PAYMENT_MICROSERVICE_GRPC_HOST=treasurer-service:9085
VERIFICATION_MICROSERVICE_USER_URL=http://10.8.0.8:7035/verification
TEMPLATEGEN_MICROSERVICE_URL=10.6.0.17
CODEWORD_MICROSERVICE_GRPC_HOST = http://localhost:8000/user
API_URL=https://api.smtp.bz/v1/smtp/send
MAIL_SENDER=noreply@mailing.pena.digital
MAIL_API_KEY=P0YsjUB137upXrr1NiJefHmXVKW1hmBWlpev
MAIL_AUTH_USERNAME=kotilion.95@gmail.com
MAIL_AUTH_PASSWORD=vWwbCSg4bf0p
MAIL_AUTH_PASSWORD=vWwbCSg4bf0p
MAIL_ADDRESS = mail@mail.com

2
go.mod

@ -19,7 +19,7 @@ require (
google.golang.org/genproto/googleapis/api v0.0.0-20240221002015-b0ce06bbee7c
google.golang.org/grpc v1.62.0
google.golang.org/protobuf v1.32.0
penahub.gitlab.yandexcloud.net/backend/penahub_common v0.0.0-20240220080149-ae9c991d3ece
penahub.gitlab.yandexcloud.net/backend/penahub_common v0.0.0-20240223054633-6cb3d5ce45b6
penahub.gitlab.yandexcloud.net/backend/quiz/common.git v0.0.0-20240412164014-6ce70d76fedc
)

4
go.sum

@ -264,7 +264,7 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
penahub.gitlab.yandexcloud.net/backend/penahub_common v0.0.0-20240220080149-ae9c991d3ece h1:CsjgNNqssfa05B7iDNMyK2wWR7SZ/kglLTMAVrhGLtY=
penahub.gitlab.yandexcloud.net/backend/penahub_common v0.0.0-20240220080149-ae9c991d3ece/go.mod h1:lTmpjry+8evVkXWbEC+WMOELcFkRD1lFMc7J09mOndM=
penahub.gitlab.yandexcloud.net/backend/penahub_common v0.0.0-20240223054633-6cb3d5ce45b6 h1:oV+/HNX+JPoQ3/GUx08hio7d45WpY0AMGrFs7j70QlA=
penahub.gitlab.yandexcloud.net/backend/penahub_common v0.0.0-20240223054633-6cb3d5ce45b6/go.mod h1:lTmpjry+8evVkXWbEC+WMOELcFkRD1lFMc7J09mOndM=
penahub.gitlab.yandexcloud.net/backend/quiz/common.git v0.0.0-20240412164014-6ce70d76fedc h1:B9X8pOrqWPGbWZNXSJEUk/8GWeBDGQmMKgQ0F+PSliQ=
penahub.gitlab.yandexcloud.net/backend/quiz/common.git v0.0.0-20240412164014-6ce70d76fedc/go.mod h1:/DcyAjBh41IbomuDu5QzhL9flZW6lWO3ZAEbUXKobk0=

@ -110,6 +110,16 @@ func (api *API2) noauth(ctx *fiber.Ctx) error {
return api.error(ctx, fiber.StatusUnauthorized, "failed to get jwt payload")
}
func (api *API2) extractUserID(ctx *fiber.Ctx) (string, bool) {
id, ok := ctx.Context().UserValue(models.AuthJWTDecodedUserIDKey).(string)
return id, ok
}
func (api *API2) extractToken(ctx *fiber.Ctx) (string, bool) {
token, ok := ctx.Context().UserValue(models.AuthJWTDecodedAccessTokenKey).(string)
return token, ok
}
// Health
func (api *API2) GetHealth(ctx *fiber.Ctx) error {
@ -119,8 +129,8 @@ func (api *API2) GetHealth(ctx *fiber.Ctx) error {
// Account
func (api *API2) DeleteAccount(ctx *fiber.Ctx) error {
userID := ctx.Get(models.AuthJWTDecodedUserIDKey)
if userID == "" {
userID, ok := api.extractUserID(ctx)
if !ok || userID == "" {
return api.noauth(ctx)
}
@ -133,8 +143,8 @@ func (api *API2) DeleteAccount(ctx *fiber.Ctx) error {
}
func (api *API2) ChangeAccount(ctx *fiber.Ctx) error {
userID := ctx.Get(models.AuthJWTDecodedUserIDKey)
if userID == "" {
userID, ok := api.extractUserID(ctx)
if !ok || userID == "" {
return api.noauth(ctx)
}
@ -156,6 +166,7 @@ func (api *API2) SetAccountVerificationStatus(ctx *fiber.Ctx) error {
if userID == "" {
return api.error(ctx, fiber.StatusBadRequest, "invalid format for parameter userId")
}
var request models.SetAccountStatus
if err := ctx.BodyParser(&request); err != nil {
return api.error(ctx, fiber.StatusBadRequest, "failed to bind json", err)
@ -171,8 +182,8 @@ func (api *API2) SetAccountVerificationStatus(ctx *fiber.Ctx) error {
}
func (api *API2) GetAccount(ctx *fiber.Ctx) error {
userID := ctx.Get(models.AuthJWTDecodedUserIDKey)
if userID == "" {
userID, ok := api.extractUserID(ctx)
if !ok || userID == "" {
return api.noauth(ctx)
}
@ -185,8 +196,8 @@ func (api *API2) GetAccount(ctx *fiber.Ctx) error {
}
func (api *API2) AddAccount(ctx *fiber.Ctx) error {
userID := ctx.Get(models.AuthJWTDecodedUserIDKey)
if userID == "" {
userID, ok := api.extractUserID(ctx)
if !ok || userID == "" {
return api.noauth(ctx)
}
@ -295,8 +306,8 @@ func (api *API2) PaginationAccounts(ctx *fiber.Ctx) error {
// Cart
func (api *API2) RemoveFromCart(ctx *fiber.Ctx) error {
userID := ctx.Get(models.AuthJWTDecodedUserIDKey)
if userID == "" {
userID, ok := api.extractUserID(ctx)
if !ok || userID == "" {
return api.noauth(ctx)
}
@ -314,13 +325,13 @@ func (api *API2) RemoveFromCart(ctx *fiber.Ctx) error {
}
func (api *API2) Add2cart(ctx *fiber.Ctx) error {
userID := ctx.Get(models.AuthJWTDecodedUserIDKey)
if userID == "" {
userID, ok := api.extractUserID(ctx)
if !ok || userID == "" {
return api.noauth(ctx)
}
token := ctx.Get(models.AuthJWTDecodedAccessTokenKey)
if token == "" {
token, ok := api.extractToken(ctx)
if !ok || token == "" {
return api.noauth(ctx)
}
@ -347,13 +358,13 @@ func (api *API2) Add2cart(ctx *fiber.Ctx) error {
}
func (api *API2) PayCart(ctx *fiber.Ctx) error {
userID := ctx.Get(models.AuthJWTDecodedUserIDKey)
if userID == "" {
userID, ok := api.extractUserID(ctx)
if !ok || userID == "" {
return api.noauth(ctx)
}
accessToken := ctx.Get(models.AuthJWTDecodedAccessTokenKey)
if accessToken == "" {
accessToken, ok := api.extractToken(ctx)
if !ok || accessToken == "" {
return api.noauth(ctx)
}
@ -573,7 +584,11 @@ func (api *API2) GetHistory(ctx *fiber.Ctx) error {
if accountID != "" {
userID = accountID
} else {
userID = ctx.Get(models.AuthJWTDecodedUserIDKey)
id, ok := api.extractUserID(ctx)
if !ok || id == "" {
return api.noauth(ctx)
}
}
limit, err := strconv.ParseInt(limitStr, 10, 64)
@ -623,8 +638,8 @@ func (api *API2) GetHistory(ctx *fiber.Ctx) error {
// Wallet
func (api *API2) RequestMoney(ctx *fiber.Ctx) error {
userID := ctx.Get(models.AuthJWTDecodedUserIDKey)
if userID == "" {
userID, ok := api.extractUserID(ctx)
if !ok || userID == "" {
return api.noauth(ctx)
}
@ -650,8 +665,8 @@ func (api *API2) RequestMoney(ctx *fiber.Ctx) error {
}
func (api *API2) ChangeCurrency(ctx *fiber.Ctx) error {
userID := ctx.Get(models.AuthJWTDecodedUserIDKey)
if userID == "" {
userID, ok := api.extractUserID(ctx)
if !ok || userID == "" {
return api.noauth(ctx)
}
@ -723,8 +738,8 @@ func (api *API2) CalculateLTV(ctx *fiber.Ctx) error {
}
func (api *API2) GetRecentTariffs(ctx *fiber.Ctx) error {
userID := ctx.Get(models.AuthJWTDecodedUserIDKey)
if userID == "" {
userID, ok := api.extractUserID(ctx)
if !ok || userID == "" {
return api.noauth(ctx)
}
@ -860,8 +875,8 @@ func (api *API2) SendReport(ctx *fiber.Ctx) error {
}
func (api *API2) PostWalletRspay(ctx *fiber.Ctx) error {
userID := ctx.Get(models.AuthJWTDecodedUserIDKey)
if userID == "" {
userID, ok := api.extractUserID(ctx)
if !ok || userID == "" {
return api.noauth(ctx)
}

@ -10,13 +10,19 @@ import (
"testing"
)
func TestGetAccount(t *testing.T) {
func TestPostWalletRspay(t *testing.T) {
jwtUtil := helpers.InitializeJWT()
t.Run("rspay", func(t *testing.T) {
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
req := struct {
Money float32
}{
Money: 100,
}
assert.NotPanics(t, func() {
token, tokenErr := jwtUtil.Create("6597babdd1ba7e2dbd32d7e3")
if isNoError := assert.NoError(t, tokenErr); !isNoError {
@ -26,6 +32,7 @@ func TestGetAccount(t *testing.T) {
response, err := client.Post[interface{}, models.ResponseErrorHTTP](ctx, &client.RequestSettings{
URL: "http://localhost:8082/wallet/rspay",
Headers: map[string]string{"Authorization": fmt.Sprintf("Bearer %s", token)},
Body: req,
})
if isNoError := assert.NoError(t, err); !isNoError {
return

@ -7,17 +7,24 @@ import (
"net/http"
"penahub.gitlab.yandexcloud.net/pena-services/customer/internal/models"
"penahub.gitlab.yandexcloud.net/pena-services/customer/pkg/client"
"penahub.gitlab.yandexcloud.net/pena-services/customer/tests/helpers"
"testing"
)
func TestCurrencies(t *testing.T) {
jwtUtil := helpers.InitializeJWT()
t.Run("Получение текущих доступных курсов", func(t *testing.T) {
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
assert.NotPanics(t, func() {
token, tokenErr := jwtUtil.Create("6597babdd1ba7e2dbd32d7e3")
if isNoError := assert.NoError(t, tokenErr); !isNoError {
return
}
responseGetCurrencies, errCurrencies := client.Get[[]models.CurrencyList, models.ResponseErrorHTTP](ctx, &client.RequestSettings{
URL: "http://localhost:8082/currencies",
URL: "http://localhost:8082/currencies",
Headers: map[string]string{"Authorization": fmt.Sprintf("Bearer %s", token)},
})
if isNoError := assert.NoError(t, errCurrencies); !isNoError {
return

@ -2,65 +2,57 @@ package integration
import (
"context"
"github.com/gofiber/fiber/v2"
"github.com/pioz/faker"
"go.uber.org/zap"
"log"
"net/http"
"net/http/httptest"
"penahub.gitlab.yandexcloud.net/backend/penahub_common/mongo"
http2 "penahub.gitlab.yandexcloud.net/pena-services/customer/internal/interface/controller/http"
"penahub.gitlab.yandexcloud.net/pena-services/customer/internal/interface/repository"
"penahub.gitlab.yandexcloud.net/pena-services/customer/internal/models"
"strconv"
"testing"
"time"
)
func TestLogostat(t *testing.T) {
logger, err := zap.NewProduction(zap.AddStacktrace(zap.DPanicLevel))
if err != nil {
log.Fatalf("failed to init zap logger: %v", err)
}
ctx := context.Background()
mongoDB, err := mongo.Connect(ctx, &mongo.ConnectDeps{
Configuration: &mongo.Configuration{
Host: "localhost",
Port: "27020",
User: "test",
Password: "test",
Auth: "admin",
DatabaseName: "admin",
},
Timeout: 10 * time.Second,
})
repoAc := repository.NewAccountRepository2(logger, mongoDB.Collection("accounts"))
repoHi := repository.NewHistoryRepository2(logger, mongoDB.Collection("histories"))
InsertToDB(ctx, repoAc, repoHi)
api := http2.NewAPI2(logger, mongoDB, nil, nil, nil, nil)
app := fiber.New()
req := httptest.NewRequest(http.MethodGet, "/", nil)
req.Header.Set("Content-Type", "application/json")
requestBody := struct {
From int
Limit int
Page int
To int
}{
From: 1713087258,
Limit: 10,
Page: 1,
To: 1713260058,
}
req = req.WithContext(context.WithValue(req.Context(), "requestBody", requestBody))
resp := httptest.NewRecorder()
}
//func TestLogostat(t *testing.T) {
// logger, err := zap.NewProduction(zap.AddStacktrace(zap.DPanicLevel))
// if err != nil {
// log.Fatalf("failed to init zap logger: %v", err)
// }
// ctx := context.Background()
// mongoDB, err := mongo.Connect(ctx, &mongo.ConnectDeps{
// Configuration: &mongo.Configuration{
// Host: "localhost",
// Port: "27020",
// User: "test",
// Password: "test",
// Auth: "admin",
// DatabaseName: "admin",
// },
// Timeout: 10 * time.Second,
// })
//
// repoAc := repository.NewAccountRepository2(logger, mongoDB.Collection("accounts"))
// repoHi := repository.NewHistoryRepository2(logger, mongoDB.Collection("histories"))
// InsertToDB(ctx, repoAc, repoHi)
//
// api := http2.NewAPI2(logger, mongoDB, nil, nil, nil, nil)
//
// app := fiber.New()
// req := httptest.NewRequest(http.MethodGet, "/", nil)
// req.Header.Set("Content-Type", "application/json")
//
// requestBody := struct {
// From int
// Limit int
// Page int
// To int
// }{
// From: 1713087258,
// Limit: 10,
// Page: 1,
// To: 1713260058,
// }
//
// req = req.WithContext(context.WithValue(req.Context(), "requestBody", requestBody))
// resp := httptest.NewRecorder()
//
//}
func InsertToDB(ctx context.Context, acc repository.AccountRepository, history repository.HistoryRepository) {
partner1 := "partner1"