230 lines
7.5 KiB
Go
230 lines
7.5 KiB
Go
package handlers
|
|
|
|
import (
|
|
"log/slog"
|
|
"strconv"
|
|
|
|
"github.com/SamuelTariku/FortuneBet-Backend/internal/domain"
|
|
"github.com/SamuelTariku/FortuneBet-Backend/internal/services/company"
|
|
"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"
|
|
"github.com/gofiber/fiber/v2"
|
|
)
|
|
|
|
type CreateCompanyReq struct {
|
|
Name string `json:"name" example:"CompanyName"`
|
|
AdminID int64 `json:"admin_id" example:"1"`
|
|
}
|
|
|
|
type CompanyRes struct {
|
|
ID int64 `json:"id" example:"1"`
|
|
Name string `json:"name" example:"CompanyName"`
|
|
AdminID int64 `json:"admin_id" example:"1"`
|
|
WalletID int64 `json:"wallet_id" example:"1"`
|
|
}
|
|
|
|
func convertCompany(company domain.Company) CompanyRes {
|
|
return CompanyRes{
|
|
ID: company.ID,
|
|
Name: company.Name,
|
|
AdminID: company.AdminID,
|
|
WalletID: company.WalletID,
|
|
}
|
|
}
|
|
|
|
// CreateCompany godoc
|
|
// @Summary Create a company
|
|
// @Description Creates a company
|
|
// @Tags company
|
|
// @Accept json
|
|
// @Produce json
|
|
// @Param createCompany body CreateCompanyReq true "Creates company"
|
|
// @Success 200 {object} CompanyRes
|
|
// @Failure 400 {object} response.APIResponse
|
|
// @Failure 500 {object} response.APIResponse
|
|
// @Router /company [post]
|
|
func CreateCompany(logger *slog.Logger, companySvc *company.Service, walletSvc *wallet.Service, validator *customvalidator.CustomValidator) fiber.Handler {
|
|
return func(c *fiber.Ctx) error {
|
|
var req CreateCompanyReq
|
|
if err := c.BodyParser(&req); err != nil {
|
|
logger.Error("CreateCompanyReq failed", "error", err)
|
|
return response.WriteJSON(c, fiber.StatusBadRequest, "Invalid request", err, nil)
|
|
}
|
|
|
|
valErrs, ok := validator.Validate(c, req)
|
|
if !ok {
|
|
return response.WriteJSON(c, fiber.StatusBadRequest, "Invalid request", valErrs, nil)
|
|
}
|
|
// Create Branch Wallet
|
|
newWallet, err := walletSvc.CreateWallet(c.Context(), domain.CreateWallet{
|
|
IsWithdraw: false,
|
|
IsBettable: true,
|
|
IsTransferable: true,
|
|
UserID: req.AdminID,
|
|
})
|
|
|
|
if err != nil {
|
|
logger.Error("Create Company Wallet failed", "error", err)
|
|
return response.WriteJSON(c, fiber.StatusInternalServerError, "Failed to create company wallet", err, nil)
|
|
}
|
|
|
|
company, err := companySvc.CreateCompany(c.Context(), domain.CreateCompany{
|
|
Name: req.Name,
|
|
AdminID: req.AdminID,
|
|
WalletID: newWallet.ID,
|
|
})
|
|
|
|
if err != nil {
|
|
logger.Error("CreateCompanyReq failed", "error", err)
|
|
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
|
|
"error": "Internal server error",
|
|
})
|
|
}
|
|
|
|
res := convertCompany(company)
|
|
|
|
return response.WriteJSON(c, fiber.StatusCreated, "Company Created", res, nil)
|
|
|
|
}
|
|
}
|
|
|
|
// GetAllCompanies godoc
|
|
// @Summary Gets all companies
|
|
// @Description Gets all companies
|
|
// @Tags company
|
|
// @Accept json
|
|
// @Produce json
|
|
// @Success 200 {array} CompanyRes
|
|
// @Failure 400 {object} response.APIResponse
|
|
// @Failure 500 {object} response.APIResponse
|
|
// @Router /company [get]
|
|
func GetAllCompanies(logger *slog.Logger, companySvc *company.Service, validator *customvalidator.CustomValidator) fiber.Handler {
|
|
return func(c *fiber.Ctx) error {
|
|
companies, err := companySvc.GetAllCompanies(c.Context())
|
|
if err != nil {
|
|
logger.Error("Failed to get companies", "error", err)
|
|
return response.WriteJSON(c, fiber.StatusInternalServerError, "Failed to get companies", err, nil)
|
|
}
|
|
|
|
var result []CompanyRes = make([]CompanyRes, 0, len(companies))
|
|
|
|
for _, company := range companies {
|
|
result = append(result, convertCompany(company))
|
|
}
|
|
|
|
return response.WriteJSON(c, fiber.StatusOK, "All Companies retrieved", result, nil)
|
|
}
|
|
}
|
|
|
|
// GetCompanyByID godoc
|
|
// @Summary Gets company by id
|
|
// @Description Gets a single company by id
|
|
// @Tags company
|
|
// @Accept json
|
|
// @Produce json
|
|
// @Param id path int true "Company ID"
|
|
// @Success 200 {object} CompanyRes
|
|
// @Failure 400 {object} response.APIResponse
|
|
// @Failure 500 {object} response.APIResponse
|
|
// @Router /company/{id} [get]
|
|
func GetCompanyByID(logger *slog.Logger, companySvc *company.Service, validator *customvalidator.CustomValidator) fiber.Handler {
|
|
return func(c *fiber.Ctx) error {
|
|
companyID := c.Params("id")
|
|
id, err := strconv.ParseInt(companyID, 10, 64)
|
|
if err != nil {
|
|
logger.Error("Invalid company ID", "companyID", companyID, "error", err)
|
|
return response.WriteJSON(c, fiber.StatusBadRequest, "Invalid company ID", err, nil)
|
|
}
|
|
|
|
company, err := companySvc.GetCompanyByID(c.Context(), id)
|
|
|
|
if err != nil {
|
|
logger.Error("Failed to get company by ID", "companyID", id, "error", err)
|
|
return response.WriteJSON(c, fiber.StatusInternalServerError, "Failed to company branch", err, nil)
|
|
}
|
|
|
|
res := convertCompany(company)
|
|
|
|
return response.WriteJSON(c, fiber.StatusOK, "Company retrieved successfully", res, nil)
|
|
}
|
|
}
|
|
|
|
// UpdateCompany godoc
|
|
// @Summary Updates a company
|
|
// @Description Updates a company
|
|
// @Tags company
|
|
// @Accept json
|
|
// @Produce json
|
|
// @Param id path int true "Company ID"
|
|
// @Param updateCompany body CreateCompanyReq true "Update Company"
|
|
// @Success 200 {object} CompanyRes
|
|
// @Failure 400 {object} response.APIResponse
|
|
// @Failure 500 {object} response.APIResponse
|
|
// @Router /company/{id} [put]
|
|
func UpdateCompany(logger *slog.Logger, companySvc *company.Service, validator *customvalidator.CustomValidator) fiber.Handler {
|
|
return func(c *fiber.Ctx) error {
|
|
companyID := c.Params("id")
|
|
id, err := strconv.ParseInt(companyID, 10, 64)
|
|
if err != nil {
|
|
logger.Error("Invalid company ID", "companyID", companyID, "error", err)
|
|
return response.WriteJSON(c, fiber.StatusBadRequest, "Invalid company ID", err, nil)
|
|
}
|
|
|
|
var req CreateCompanyReq
|
|
if err := c.BodyParser(&req); err != nil {
|
|
logger.Error("CreateCompanyReq failed", "error", err)
|
|
return response.WriteJSON(c, fiber.StatusBadRequest, "Invalid request", err, nil)
|
|
}
|
|
valErrs, ok := validator.Validate(c, req)
|
|
if !ok {
|
|
return response.WriteJSON(c, fiber.StatusBadRequest, "Invalid request", valErrs, nil)
|
|
}
|
|
|
|
company, err := companySvc.UpdateCompany(c.Context(), id, domain.UpdateCompany{
|
|
Name: req.Name,
|
|
AdminID: req.AdminID,
|
|
})
|
|
|
|
if err != nil {
|
|
logger.Error("Failed to update company", "companyID", id, "error", err)
|
|
return response.WriteJSON(c, fiber.StatusInternalServerError, "Failed to update company", err, nil)
|
|
}
|
|
|
|
res := convertCompany(company)
|
|
|
|
return response.WriteJSON(c, fiber.StatusOK, "Company Updated", res, nil)
|
|
}
|
|
}
|
|
|
|
// DeleteCompany godoc
|
|
// @Summary Delete the company
|
|
// @Description Delete the company
|
|
// @Tags company
|
|
// @Accept json
|
|
// @Produce json
|
|
// @Param id path int true "Company ID""
|
|
// @Success 200 {object} response.APIResponse
|
|
// @Failure 400 {object} response.APIResponse
|
|
// @Failure 500 {object} response.APIResponse
|
|
// @Router /company/{id} [delete]
|
|
func DeleteCompany(logger *slog.Logger, companySvc *company.Service, validator *customvalidator.CustomValidator) fiber.Handler {
|
|
return func(c *fiber.Ctx) error {
|
|
companyID := c.Params("id")
|
|
id, err := strconv.ParseInt(companyID, 10, 64)
|
|
|
|
if err != nil {
|
|
logger.Error("Invalid Company ID", "companyID", companyID, "error", err)
|
|
return response.WriteJSON(c, fiber.StatusBadRequest, "Invalid Company ID", err, nil)
|
|
}
|
|
|
|
err = companySvc.DeleteCompany(c.Context(), id)
|
|
if err != nil {
|
|
logger.Error("Failed to delete by ID", "Company ID", id, "error", err)
|
|
return response.WriteJSON(c, fiber.StatusInternalServerError, "Failed to Delete Company", err, nil)
|
|
}
|
|
|
|
return response.WriteJSON(c, fiber.StatusOK, "Company removed successfully", nil, nil)
|
|
}
|
|
}
|