diff --git a/backend/docs/docs.go b/backend/docs/docs.go index 9f7df14..b5d96e5 100644 --- a/backend/docs/docs.go +++ b/backend/docs/docs.go @@ -729,6 +729,88 @@ const docTemplate = `{ } } }, + "/auth/register": { + "post": { + "description": "Register a new user and get a JWT token", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "auth" + ], + "summary": "Register", + "parameters": [ + { + "description": "User data", + "name": "user", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.UserCreateDto" + } + } + ], + "responses": { + "201": { + "description": "Created", + "schema": { + "allOf": [ + { + "$ref": "#/definitions/utils.Response" + }, + { + "type": "object", + "properties": { + "data": { + "$ref": "#/definitions/dto.TokenDto" + } + } + } + ] + } + }, + "400": { + "description": "Bad Request", + "schema": { + "allOf": [ + { + "$ref": "#/definitions/utils.Response" + }, + { + "type": "object", + "properties": { + "error": { + "$ref": "#/definitions/utils.ErrorInfo" + } + } + } + ] + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "allOf": [ + { + "$ref": "#/definitions/utils.Response" + }, + { + "type": "object", + "properties": { + "error": { + "$ref": "#/definitions/utils.ErrorInfo" + } + } + } + ] + } + } + } + } + }, "/companies": { "get": { "security": [ diff --git a/backend/docs/swagger.json b/backend/docs/swagger.json index 158d343..d03493b 100644 --- a/backend/docs/swagger.json +++ b/backend/docs/swagger.json @@ -723,6 +723,88 @@ } } }, + "/auth/register": { + "post": { + "description": "Register a new user and get a JWT token", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "auth" + ], + "summary": "Register", + "parameters": [ + { + "description": "User data", + "name": "user", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/dto.UserCreateDto" + } + } + ], + "responses": { + "201": { + "description": "Created", + "schema": { + "allOf": [ + { + "$ref": "#/definitions/utils.Response" + }, + { + "type": "object", + "properties": { + "data": { + "$ref": "#/definitions/dto.TokenDto" + } + } + } + ] + } + }, + "400": { + "description": "Bad Request", + "schema": { + "allOf": [ + { + "$ref": "#/definitions/utils.Response" + }, + { + "type": "object", + "properties": { + "error": { + "$ref": "#/definitions/utils.ErrorInfo" + } + } + } + ] + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "allOf": [ + { + "$ref": "#/definitions/utils.Response" + }, + { + "type": "object", + "properties": { + "error": { + "$ref": "#/definitions/utils.ErrorInfo" + } + } + } + ] + } + } + } + } + }, "/companies": { "get": { "security": [ diff --git a/backend/docs/swagger.yaml b/backend/docs/swagger.yaml index 374f3ee..b51f240 100644 --- a/backend/docs/swagger.yaml +++ b/backend/docs/swagger.yaml @@ -686,6 +686,51 @@ paths: summary: Get current user tags: - auth + /auth/register: + post: + consumes: + - application/json + description: Register a new user and get a JWT token + parameters: + - description: User data + in: body + name: user + required: true + schema: + $ref: '#/definitions/dto.UserCreateDto' + produces: + - application/json + responses: + "201": + description: Created + schema: + allOf: + - $ref: '#/definitions/utils.Response' + - properties: + data: + $ref: '#/definitions/dto.TokenDto' + type: object + "400": + description: Bad Request + schema: + allOf: + - $ref: '#/definitions/utils.Response' + - properties: + error: + $ref: '#/definitions/utils.ErrorInfo' + type: object + "500": + description: Internal Server Error + schema: + allOf: + - $ref: '#/definitions/utils.Response' + - properties: + error: + $ref: '#/definitions/utils.ErrorInfo' + type: object + summary: Register + tags: + - auth /companies: get: consumes: diff --git a/backend/internal/api/handlers/user_handler.go b/backend/internal/api/handlers/user_handler.go index 2647543..71817c6 100644 --- a/backend/internal/api/handlers/user_handler.go +++ b/backend/internal/api/handlers/user_handler.go @@ -261,6 +261,52 @@ func (h *UserHandler) Login(c *gin.Context) { utils.SuccessResponse(c, http.StatusOK, tokenDTO) } +// Register handles POST /auth/register +// +// @Summary Register +// @Description Register a new user and get a JWT token +// @Tags auth +// @Accept json +// @Produce json +// @Param user body dto.UserCreateDto true "User data" +// @Success 201 {object} utils.Response{data=dto.TokenDto} +// @Failure 400 {object} utils.Response{error=utils.ErrorInfo} +// @Failure 500 {object} utils.Response{error=utils.ErrorInfo} +// @Router /auth/register [post] +func (h *UserHandler) Register(c *gin.Context) { + // Parse request body + var userCreateDTO dto.UserCreateDto + if err := c.ShouldBindJSON(&userCreateDTO); err != nil { + utils.BadRequestResponse(c, "Invalid request body: "+err.Error()) + return + } + + // Convert DTO to model + userCreate := convertCreateDTOToModel(userCreateDTO) + + // Create user in the database + user, err := models.CreateUser(c.Request.Context(), userCreate) + if err != nil { + utils.InternalErrorResponse(c, "Error creating user: "+err.Error()) + return + } + + // Generate JWT token + token, err := middleware.GenerateToken(user) + if err != nil { + utils.InternalErrorResponse(c, "Error generating token: "+err.Error()) + return + } + + // Return token + tokenDTO := dto.TokenDto{ + Token: token, + User: convertUserToDTO(user), + } + + utils.SuccessResponse(c, http.StatusCreated, tokenDTO) +} + // GetCurrentUser handles GET /auth/me // // @Summary Get current user diff --git a/backend/internal/api/routes/router.go b/backend/internal/api/routes/router.go index 8c0ce8a..006b3bd 100644 --- a/backend/internal/api/routes/router.go +++ b/backend/internal/api/routes/router.go @@ -18,6 +18,7 @@ func SetupRouter(r *gin.Engine) { // Public routes r.POST("/auth/login", userHandler.Login) + r.POST("/auth/register", userHandler.Register) // API routes (protected) api := r.Group("/api")