apifiber/controllers/authController.go

193 lines
4.0 KiB
Go

package controllers
import (
"api/config"
"api/database"
"api/models"
"api/utils"
"log"
"strconv"
"strings"
"time"
"github.com/gofiber/fiber/v2"
"github.com/golang-jwt/jwt/v5"
"golang.org/x/crypto/bcrypt"
)
// Login - Login. Returns a JWT token on the response body
func Login(c *fiber.Ctx) error {
var data map[string]string
if err := c.BodyParser(&data); err != nil {
log.Printf("Bad Request on parse: %v\n", err)
return fiber.ErrBadRequest
}
var user models.User
database.DB.Where("email = ?", data["email"]).First(&user)
if user.ID == 0 {
return c.JSON(fiber.Map{
"message": "Usuário não encontrado",
"token": ""})
}
if user.Password == nil {
return c.JSON(fiber.Map{
"message": "Usuário com cadastro imcompleto",
"token": ""})
}
if err := bcrypt.CompareHashAndPassword(user.Password, []byte(data["password"])); err != nil {
return c.JSON(fiber.Map{
"message": "Senha inválida",
"token": ""})
}
if user.Blocked == "S" {
return c.JSON(fiber.Map{
"message": "Usuário bloqueado",
"token": ""})
}
claims := &jwt.RegisteredClaims{
ExpiresAt: &jwt.NumericDate{Time: time.Now().Add(12 * time.Hour)}, // Token expiration time
Issuer: strconv.Itoa(int(user.ID)), // User that creates the token
}
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
tk, err := token.SignedString([]byte(config.Conf.ApiSecret))
if err != nil {
return fiber.ErrInternalServerError
}
return c.JSON(fiber.Map{
"message": "",
"uid": user.ID,
"token": tk})
}
// Register/AdUser - Adds or register a user to the database
func AddUser(c *fiber.Ctx) error {
var data map[string]string
if err := c.BodyParser(&data); err != nil {
return c.JSON(fiber.Map{
"message": "Dados inválidos"})
}
if data["name"] == "" || data["email"] == "" || data["url"] == "" || data["cpfcnpj"] == "" || data["password"] == "" || data["channel"] == "" || data["usertype"] == "" || data["companyname"] == "" {
return c.JSON(fiber.Map{
"message": "Dados inválidos"})
}
passwd, _ := utils.HashPassword(data["password"])
var user models.User
database.DB.Where("email = ?", data["email"]).First(&user)
if user.ID != 0 {
return c.JSON(fiber.Map{
"message": "Usuário já cadastrado"})
}
database.DB.Where("channel = ?", strings.ToLower(data["channel"])).First(&user)
if user.ID != 0 {
return c.JSON(fiber.Map{
"message": "Canal já em uso"})
}
user = models.User{
Name: data["name"],
Email: data["email"],
CompanyName: data["companyname"],
Url: data["url"],
Password: passwd,
Channel: strings.ToLower(data["channel"]),
CpfCnpj: data["cpfcnpj"],
UserType: data["usertype"],
Blocked: "N",
Cancelled: "N",
}
database.DB.Create(&user)
if user.ID == 0 {
return c.JSON(fiber.Map{
"message": "Erro ao criar usuário"})
}
return c.JSON(user)
}
// GetOwnUser - Returns the current user
func GetOwnUser(c *fiber.Ctx) error {
user := c.Locals("user").(models.User)
return c.JSON(user)
}
// GetAllUsers - Returns all users
func GetAllUsers(c *fiber.Ctx) error {
var users []models.User
user := c.Locals("user").(models.User)
if user.UserType != "A" {
return fiber.ErrUnauthorized
}
database.DB.Find(&users)
if len(users) == 0 {
return fiber.ErrNotFound
}
return c.JSON(users)
}
func GetUserByEmail(c *fiber.Ctx) error {
user := c.Locals("user").(models.User)
if user.UserType != "A" {
return fiber.ErrUnauthorized
}
email := c.Params("email")
database.DB.Where("email = ?", email).First(&user)
if user.ID == 0 {
return fiber.ErrNotFound
}
return c.JSON(user)
}
func Checkuser(c *fiber.Ctx) error {
var user models.User
email := c.Params("email")
database.DB.Where("email = ?", email).First(&user)
if user.ID == 0 {
return fiber.ErrNotFound
}
return c.JSON(user)
}