package handlers import ( "net/http" db "zardzul/music-index/sqlc" "zardzul/music-index/repository" "github.com/gin-gonic/gin" "github.com/google/uuid" "github.com/jackc/pgx/v5/pgtype" "golang.org/x/crypto/bcrypt" ) type UserHandler struct { repo repository.UserRepository } func NewUserHandler(repo repository.UserRepository) *UserHandler { return &UserHandler{repo: repo} } type CreateUserRequest struct { UserName string `json:"user_name" binding:"required"` UserMail string `json:"user_mail" binding:"required,email"` Password string `json:"password" binding:"required,min=12"` } type MessageResponse struct { Message string `json:"message"` } type CreateUserResponse struct { Message string `json:"message"` ID string `json:"id"` } type UsernameResponse struct { UserName string `json:"user_name"` } type ErrorResponse struct { Error string `json:"error"` } // CreateUser godoc // @Summary Create a user // @Tags user // @Accept json // @Produce json // @Param payload body CreateUserRequest true "User payload" // @Success 201 {object} CreateUserResponse // @Failure 400 {object} ErrorResponse // @Failure 500 {object} ErrorResponse // @Router /users/create [post] func (h *UserHandler) CreateUser(c *gin.Context) { var req CreateUserRequest if err := c.ShouldBindJSON(&req); err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } var pgID pgtype.UUID if err := pgID.Scan(uuid.New().String()); err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": "failed to generate user id"}) return } hashedPassword, err := bcrypt.GenerateFromPassword([]byte(req.Password), bcrypt.DefaultCost) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": "failed to hash password"}) return } id, err := h.repo.CreateUser(c.Request.Context(), db.CreateUserParams{ ID: pgID, UserName: req.UserName, UserMail: req.UserMail, Password: string(hashedPassword), }) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return } c.JSON(http.StatusCreated, gin.H{ "message": "user created", "id": id.String(), }) } // GetUsernameByID godoc // @Summary Get username by user ID // @Tags user // @Produce json // @Param id path string true "User ID (UUID)" // @Success 200 {object} UsernameResponse // @Failure 400 {object} ErrorResponse // @Failure 500 {object} ErrorResponse // @Router /users/{id} [get] func (h *UserHandler) GetUsernameByID(c *gin.Context) { idParam := c.Param("id") var pgID pgtype.UUID if err := pgID.Scan(idParam); err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": "invalid user id"}) return } username, err := h.repo.GetUsernameByID(c.Request.Context(), pgID) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return } c.JSON(http.StatusOK, gin.H{ "user_name": username, }) }