added customer wallet

This commit is contained in:
Samuel Tariku 2025-04-04 23:29:08 +03:00
parent 675597c093
commit ddc4f8bc54
6 changed files with 328 additions and 7 deletions

View File

@ -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": {

View File

@ -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": {

View File

@ -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:

View File

@ -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)
}

View File

@ -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)
}
}

View File

@ -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())