Update get User & Refresh Token

This commit is contained in:
ahmadafriadi 2025-06-27 21:58:51 +07:00
parent 8873095102
commit 64b1771e2f
7 changed files with 127 additions and 10 deletions

View File

@ -35,7 +35,8 @@ func JWTProtected() fiber.Handler {
})
}
c.Locals("user", claims)
c.Locals("user_id", uint(claims["user_id"].(float64)))
c.Locals("role", claims["role"].(string))
return c.Next()
}
}

View File

@ -1,12 +1,14 @@
package handler
import (
"BE-MiniERP/config"
"BE-MiniERP/database"
"BE-MiniERP/modules/auth/models"
"BE-MiniERP/modules/auth/repository"
"BE-MiniERP/modules/auth/service"
"github.com/gofiber/fiber/v2"
"github.com/golang-jwt/jwt/v4"
)
type AuthHandler struct {
@ -68,5 +70,62 @@ func (h *AuthHandler) Login(c *fiber.Ctx) error {
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": "failed to generate token"})
}
return c.JSON(fiber.Map{"token": token, "role": user.Role})
refreshToken, err := service.GenerateRefreshToken(user.ID)
if err != nil {
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": "failed to generate refresh token"})
}
return c.JSON(fiber.Map{"token": token, "refresh_token": refreshToken, "role": user.Role})
}
func (h *AuthHandler) GetUser(c *fiber.Ctx) error {
userID := c.Locals("user_id") // diset dari middleware
if userID == nil {
return c.Status(fiber.StatusUnauthorized).JSON(fiber.Map{"error": "unauthorized"})
}
user, err := h.Repo.FindByID(userID.(uint))
if err != nil {
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": "failed to fetch user"})
}
return c.JSON(user)
}
func (h *AuthHandler) RefreshToken(c *fiber.Ctx) error {
var input struct {
RefreshToken string `json:"refresh_token"`
}
if err := c.BodyParser(&input); err != nil {
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "invalid input"})
}
token, err := jwt.Parse(input.RefreshToken, func(token *jwt.Token) (interface{}, error) {
return []byte(config.GetConfig().JWTSecret), nil
})
if err != nil || !token.Valid {
return c.Status(fiber.StatusUnauthorized).JSON(fiber.Map{"error": "invalid or expired refresh token"})
}
claims, ok := token.Claims.(jwt.MapClaims)
if !ok || claims["user_id"] == nil {
return c.Status(fiber.StatusUnauthorized).JSON(fiber.Map{"error": "invalid claims"})
}
userID := uint(claims["user_id"].(float64))
user, err := h.Repo.FindByID(userID)
if err != nil {
return c.Status(fiber.StatusUnauthorized).JSON(fiber.Map{"error": "user not found"})
}
newAccessToken, err := service.GenerateJWT(user.ID, user.Role)
if err != nil {
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": "failed to generate new token"})
}
return c.JSON(fiber.Map{
"token": newAccessToken,
})
}

View File

@ -23,3 +23,9 @@ func (r *UserRepository) FindByUsername(username string) (*models.User, error) {
result := r.DB.Where("username = ?", username).First(&user)
return &user, result.Error
}
func (r *UserRepository) FindByID(id uint) (*models.User, error) {
var user models.User
result := r.DB.First(&user, id)
return &user, result.Error
}

View File

@ -1,6 +1,7 @@
package auth
import (
"BE-MiniERP/middlewares"
"BE-MiniERP/modules/auth/handler"
"github.com/gofiber/fiber/v2"
@ -10,4 +11,9 @@ func RegisterRoutes(r fiber.Router) {
h := handler.NewAuthHandler()
r.Post("/register", h.Register)
r.Post("/login", h.Login)
protected := r.Group("", middlewares.JWTProtected())
protected.Get("/me", middlewares.JWTProtected(), h.GetUser)
protected.Post("/refresh", h.RefreshToken)
}

View File

@ -19,3 +19,13 @@ func GenerateJWT(userID uint, role string) (string, error) {
// INI PALING PENTING ⬇️
return token.SignedString([]byte(config.GetConfig().JWTSecret))
}
func GenerateRefreshToken(userID uint) (string, error) {
claims := jwt.MapClaims{
"user_id": userID,
"exp": time.Now().Add(time.Hour * 24).Unix(),
}
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
return token.SignedString([]byte(config.GetConfig().JWTSecret))
}

View File

@ -6,6 +6,7 @@ import (
"BE-MiniERP/modules/inventory/repository"
"BE-MiniERP/modules/inventory/service"
"strconv"
"strings"
"github.com/gofiber/fiber/v2"
)
@ -39,27 +40,61 @@ func (h *ProductHandler) GetAll(c *fiber.Ctx) error {
func (h *ProductHandler) Create(c *fiber.Ctx) error {
var input models.Product
if err := c.BodyParser(&input); err != nil {
return c.Status(400).JSON(fiber.Map{"error": "Invalid input"})
return c.Status(400).JSON(fiber.Map{"error": "Invalid input format"})
}
if input.Name == "" {
return c.Status(400).JSON(fiber.Map{"error": "Product name is required"})
}
if input.Price <= 0 {
return c.Status(400).JSON(fiber.Map{"error": "Price must be greater than 0"})
}
if input.Hpp <= 0 {
return c.Status(400).JSON(fiber.Map{"error": "HPP must be greater than 0"})
}
if input.CategoryID == 0 {
return c.Status(400).JSON(fiber.Map{"error": "Category ID is required"})
}
if input.CollectionID == 0 {
return c.Status(400).JSON(fiber.Map{"error": "Collection ID is required"})
}
if input.ColourID == 0 {
return c.Status(400).JSON(fiber.Map{"error": "Colour ID is required"})
}
if input.SizeID == 0 {
return c.Status(400).JSON(fiber.Map{"error": "Size ID is required"})
}
if input.UnitOfMeasure == "" {
return c.Status(400).JSON(fiber.Map{"error": "Unit of measure is required"})
}
// Jika hanya terima ID, lakukan preload relasi
if err := h.Repo.PreloadRelations(&input); err != nil {
return c.Status(400).JSON(fiber.Map{"error": "Failed to preload relations"})
return c.Status(400).JSON(fiber.Map{
"error": "Failed to preload relations: " + err.Error(),
})
}
// Generate SKU
sku, err := service.GenerateSKU(&input)
if err != nil {
return c.Status(400).JSON(fiber.Map{"error": "Failed to generate SKU: " + err.Error()})
return c.Status(400).JSON(fiber.Map{
"error": "Failed to generate SKU: " + err.Error(),
})
}
input.SKU = sku
if err := h.Repo.Create(&input); err != nil {
return c.Status(500).JSON(fiber.Map{"error": "Failed to create product"})
if strings.Contains(err.Error(), "duplicate key value") && strings.Contains(err.Error(), "sku") {
return c.Status(400).JSON(fiber.Map{"error": "SKU already exists"})
}
return c.Status(500).JSON(fiber.Map{
"error": "Failed to create product: " + err.Error(),
})
}
return c.JSON(input)
return c.Status(201).JSON(input)
}
func (h *ProductHandler) Update(c *fiber.Ctx) error {

View File

@ -28,7 +28,7 @@ func (h *ProductionOrderHandler) GetAll(c *fiber.Ctx) error {
productID := c.QueryInt("product_id", 0)
startDateStr := c.Query("start_date", "")
endDateStr := c.Query("end_date", "")
warehouseID := c.QueryInt("origin_id", 0)
warehouseID := c.QueryInt("warehouse_id", 0)
var startDate, endDate time.Time
var err error