diff --git a/docs/docs.go b/docs/docs.go index f8d47cd..36464a6 100644 --- a/docs/docs.go +++ b/docs/docs.go @@ -972,6 +972,55 @@ const docTemplate = `{ } } }, + "/user/wallet": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "description": "Retrieve customer wallet details", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "wallet" + ], + "summary": "Get customer wallet", + "parameters": [ + { + "type": "integer", + "description": "Company ID", + "name": "company_id", + "in": "header", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/handlers.CustomerWalletRes" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/response.APIResponse" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/response.APIResponse" + } + } + } + } + }, "/wallet": { "get": { "description": "Retrieve all wallets", @@ -1352,6 +1401,48 @@ const docTemplate = `{ } } }, + "handlers.CustomerWalletRes": { + "type": "object", + "properties": { + "company_id": { + "type": "integer", + "example": 1 + }, + "created_at": { + "type": "string" + }, + "customer_id": { + "type": "integer", + "example": 1 + }, + "id": { + "type": "integer", + "example": 1 + }, + "regular_balance": { + "type": "number", + "example": 100 + }, + "regular_id": { + "type": "integer", + "example": 1 + }, + "regular_updated_at": { + "type": "string" + }, + "static_balance": { + "type": "number", + "example": 100 + }, + "static_id": { + "type": "integer", + "example": 1 + }, + "static_updated_at": { + "type": "string" + } + } + }, "handlers.RegisterCodeReq": { "type": "object", "properties": { diff --git a/docs/swagger.json b/docs/swagger.json index 3a34879..cc51adb 100644 --- a/docs/swagger.json +++ b/docs/swagger.json @@ -964,6 +964,55 @@ } } }, + "/user/wallet": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "description": "Retrieve customer wallet details", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "wallet" + ], + "summary": "Get customer wallet", + "parameters": [ + { + "type": "integer", + "description": "Company ID", + "name": "company_id", + "in": "header", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/handlers.CustomerWalletRes" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/response.APIResponse" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/response.APIResponse" + } + } + } + } + }, "/wallet": { "get": { "description": "Retrieve all wallets", @@ -1344,6 +1393,48 @@ } } }, + "handlers.CustomerWalletRes": { + "type": "object", + "properties": { + "company_id": { + "type": "integer", + "example": 1 + }, + "created_at": { + "type": "string" + }, + "customer_id": { + "type": "integer", + "example": 1 + }, + "id": { + "type": "integer", + "example": 1 + }, + "regular_balance": { + "type": "number", + "example": 100 + }, + "regular_id": { + "type": "integer", + "example": 1 + }, + "regular_updated_at": { + "type": "string" + }, + "static_balance": { + "type": "number", + "example": 100 + }, + "static_id": { + "type": "integer", + "example": 1 + }, + "static_updated_at": { + "type": "string" + } + } + }, "handlers.RegisterCodeReq": { "type": "object", "properties": { diff --git a/docs/swagger.yaml b/docs/swagger.yaml index d9d0d27..9b8b3d4 100644 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -171,6 +171,36 @@ definitions: reference_number: type: string type: object + handlers.CustomerWalletRes: + properties: + company_id: + example: 1 + type: integer + created_at: + type: string + customer_id: + example: 1 + type: integer + id: + example: 1 + type: integer + regular_balance: + example: 100 + type: number + regular_id: + example: 1 + type: integer + regular_updated_at: + type: string + static_balance: + example: 100 + type: number + static_id: + example: 1 + type: integer + static_updated_at: + type: string + type: object handlers.RegisterCodeReq: properties: email: @@ -1034,6 +1064,37 @@ paths: summary: Send reset code tags: - user + /user/wallet: + get: + consumes: + - application/json + description: Retrieve customer wallet details + parameters: + - description: Company ID + in: header + name: company_id + required: true + type: integer + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/handlers.CustomerWalletRes' + "400": + description: Bad Request + schema: + $ref: '#/definitions/response.APIResponse' + "500": + description: Internal Server Error + schema: + $ref: '#/definitions/response.APIResponse' + security: + - Bearer: [] + summary: Get customer wallet + tags: + - wallet /wallet: get: consumes: diff --git a/internal/web_server/handlers/user.go b/internal/web_server/handlers/user.go index 20e971b..665a1ee 100644 --- a/internal/web_server/handlers/user.go +++ b/internal/web_server/handlers/user.go @@ -195,7 +195,7 @@ func RegisterUser(logger *slog.Logger, userSvc *user.Service, walletSvc *wallet. _, err = walletSvc.CreateCustomerWallet(c.Context(), newUser.ID, 0) if err != nil { - logger.Error("RegisterUser failed", "error", err) + logger.Error("CreateCustomerWallet failed", "error", err) return response.WriteJSON(c, fiber.StatusInternalServerError, "Failed to create customer wallet for user", err, nil) } diff --git a/internal/web_server/handlers/wallet_handler.go b/internal/web_server/handlers/wallet_handler.go index 4f9c16b..3f6cb67 100644 --- a/internal/web_server/handlers/wallet_handler.go +++ b/internal/web_server/handlers/wallet_handler.go @@ -5,6 +5,7 @@ import ( "strconv" "time" + "github.com/SamuelTariku/FortuneBet-Backend/internal/domain" "github.com/SamuelTariku/FortuneBet-Backend/internal/services/wallet" "github.com/SamuelTariku/FortuneBet-Backend/internal/web_server/response" customvalidator "github.com/SamuelTariku/FortuneBet-Backend/internal/web_server/validator" @@ -146,3 +147,66 @@ func UpdateWalletActive(logger *slog.Logger, walletSvc *wallet.Service, validato return response.WriteJSON(c, fiber.StatusOK, "Wallet successfully updated", nil, nil) } } + +type CustomerWalletRes struct { + ID int64 `json:"id" example:"1"` + RegularID int64 `json:"regular_id" example:"1"` + RegularBalance float32 `json:"regular_balance" example:"100.0"` + StaticID int64 `json:"static_id" example:"1"` + StaticBalance float32 `json:"static_balance" example:"100.0"` + CustomerID int64 `json:"customer_id" example:"1"` + CompanyID int64 `json:"company_id" example:"1"` + RegularUpdatedAt time.Time `json:"regular_updated_at"` + StaticUpdatedAt time.Time `json:"static_updated_at"` + CreatedAt time.Time `json:"created_at"` +} + +// GetCustomerWallet godoc +// @Summary Get customer wallet +// @Description Retrieve customer wallet details +// @Tags wallet +// @Accept json +// @Produce json +// @Param company_id header int true "Company ID" +// @Security Bearer +// @Success 200 {object} CustomerWalletRes +// @Failure 400 {object} response.APIResponse +// @Failure 500 {object} response.APIResponse +// @Router /user/wallet [get] +func GetCustomerWallet(logger *slog.Logger, walletSvc *wallet.Service, validator *customvalidator.CustomValidator) fiber.Handler { + return func(c *fiber.Ctx) error { + + userId := c.Locals("user_id").(int64) + role := string(c.Locals("role").(domain.Role)) + + companyID, err := strconv.ParseInt(c.Get("company_id"), 10, 64) + if err != nil { + return c.Status(fiber.StatusBadRequest).SendString("Invalid company_id") + } + logger.Info("Company ID: " + strconv.FormatInt(companyID, 10)) + + if role != string(domain.RoleCustomer) { + logger.Error("Unauthorized access", "userId", userId, "role", role) + return response.WriteJSON(c, fiber.StatusUnauthorized, "Unauthorized access", nil, nil) + } + wallet, err := walletSvc.GetCustomerWallet(c.Context(), userId, companyID) + if err != nil { + logger.Error("Failed to get customer wallet", "userId", userId, "error", err) + return response.WriteJSON(c, fiber.StatusInternalServerError, "Failed to retrieve wallet", err, nil) + } + res := CustomerWalletRes{ + ID: wallet.ID, + RegularID: wallet.RegularID, + RegularBalance: wallet.RegularBalance.Float64(), + StaticID: wallet.StaticID, + StaticBalance: wallet.StaticBalance.Float64(), + CustomerID: wallet.CustomerID, + CompanyID: wallet.CompanyID, + RegularUpdatedAt: wallet.RegularUpdatedAt, + StaticUpdatedAt: wallet.StaticUpdatedAt, + CreatedAt: wallet.CreatedAt, + } + return response.WriteJSON(c, fiber.StatusOK, "Wallet retrieved successfully", res, nil) + + } +} diff --git a/internal/web_server/routes.go b/internal/web_server/routes.go index 05d3fa3..3f31fd9 100644 --- a/internal/web_server/routes.go +++ b/internal/web_server/routes.go @@ -1,7 +1,11 @@ package httpserver import ( + "fmt" + "strconv" + _ "github.com/SamuelTariku/FortuneBet-Backend/docs" + "github.com/SamuelTariku/FortuneBet-Backend/internal/domain" "github.com/SamuelTariku/FortuneBet-Backend/internal/web_server/handlers" "github.com/gofiber/fiber/v2" fiberSwagger "github.com/swaggo/fiber-swagger" @@ -12,12 +16,19 @@ func (a *App) initAppRoutes() { a.fiber.Post("/auth/refresh", a.authMiddleware, handlers.RefreshToken(a.logger, a.authSvc, a.validator, a.JwtConfig)) a.fiber.Post("/auth/logout", a.authMiddleware, handlers.LogOutCustomer(a.logger, a.authSvc, a.validator)) a.fiber.Get("/auth/test", a.authMiddleware, func(c *fiber.Ctx) error { - userId := c.Locals("user_id") - role := c.Locals("role") - refreshToken := c.Locals("refresh_token") - a.logger.Info("User ID: " + userId.(string)) - a.logger.Info("Role: " + role.(string)) - a.logger.Info("Refresh Token: " + refreshToken.(string)) + userId := c.Locals("user_id").(int64) + role := string(c.Locals("role").(domain.Role)) + refreshToken := (c.Locals("refresh_token").(string)) + companyID, err := strconv.ParseInt(c.Get("company_id"), 10, 64) + if err != nil { + return c.Status(fiber.StatusBadRequest).SendString("Invalid company_id") + } + // a.logger.Info("User ID: " + string(userId.(string))) //panic: interface conversion: interface {} is int64, not string + a.logger.Info("User ID: " + strconv.FormatInt(userId, 10)) + fmt.Printf("User ID: %d\n", userId) + a.logger.Info("Role: " + role) + a.logger.Info("Refresh Token: " + refreshToken) + a.logger.Info("Company ID: " + strconv.FormatInt(companyID, 10)) return c.SendString("Test endpoint") }) a.fiber.Post("/user/resetPassword", handlers.ResetPassword(a.logger, a.userSvc, a.validator)) @@ -26,6 +37,9 @@ func (a *App) initAppRoutes() { a.fiber.Post("/user/sendRegisterCode", handlers.SendRegisterCode(a.logger, a.userSvc, a.validator)) a.fiber.Post("/user/checkPhoneEmailExist", handlers.CheckPhoneEmailExist(a.logger, a.userSvc, a.validator)) a.fiber.Get("/user/profile", a.authMiddleware, handlers.UserProfile(a.logger, a.userSvc)) + + a.fiber.Get("/user/wallet", a.authMiddleware, handlers.GetCustomerWallet(a.logger, a.walletSvc, a.validator)) + // Swagger a.fiber.Get("/swagger/*", fiberSwagger.FiberWrapHandler())