diff --git a/backend/cmd/main.go b/backend/cmd/main.go index 57612c0..b69e2e8 100644 --- a/backend/cmd/main.go +++ b/backend/cmd/main.go @@ -24,6 +24,7 @@ import ( "easywish/config" docs "easywish/docs" "easywish/internal/controllers" + "easywish/internal/database" "easywish/internal/logger" "easywish/internal/routes" "easywish/internal/services" @@ -43,6 +44,7 @@ func main() { logger.NewLogger, gin.Default, ), + database.Module, services.Module, controllers.Module, routes.Module, diff --git a/backend/docs/docs.go b/backend/docs/docs.go index 044b645..137d474 100644 --- a/backend/docs/docs.go +++ b/backend/docs/docs.go @@ -128,6 +128,17 @@ const docTemplate = `{ "Auth" ], "summary": "Register an account", + "parameters": [ + { + "description": "desc", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/models.RegistrationBeginRequest" + } + } + ], "responses": {} } }, @@ -310,6 +321,21 @@ const docTemplate = `{ "type": "string" } } + }, + "models.RegistrationBeginRequest": { + "type": "object", + "properties": { + "email": { + "type": "string" + }, + "password": { + "description": "TODO: password checking", + "type": "string" + }, + "username": { + "type": "string" + } + } } }, "securityDefinitions": { diff --git a/backend/docs/swagger.json b/backend/docs/swagger.json index 2133584..b1d469a 100644 --- a/backend/docs/swagger.json +++ b/backend/docs/swagger.json @@ -124,6 +124,17 @@ "Auth" ], "summary": "Register an account", + "parameters": [ + { + "description": "desc", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/models.RegistrationBeginRequest" + } + } + ], "responses": {} } }, @@ -306,6 +317,21 @@ "type": "string" } } + }, + "models.RegistrationBeginRequest": { + "type": "object", + "properties": { + "email": { + "type": "string" + }, + "password": { + "description": "TODO: password checking", + "type": "string" + }, + "username": { + "type": "string" + } + } } }, "securityDefinitions": { diff --git a/backend/docs/swagger.yaml b/backend/docs/swagger.yaml index 507b388..66a9a37 100644 --- a/backend/docs/swagger.yaml +++ b/backend/docs/swagger.yaml @@ -21,6 +21,16 @@ definitions: refresh_token: type: string type: object + models.RegistrationBeginRequest: + properties: + email: + type: string + password: + description: 'TODO: password checking' + type: string + username: + type: string + type: object info: contact: {} description: Easy and feature-rich wishlist. @@ -97,6 +107,13 @@ paths: post: consumes: - application/json + parameters: + - description: desc + in: body + name: request + required: true + schema: + $ref: '#/definitions/models.RegistrationBeginRequest' produces: - application/json responses: {} diff --git a/backend/internal/controllers/auth.go b/backend/internal/controllers/auth.go index 23edbf7..0a6cb77 100644 --- a/backend/internal/controllers/auth.go +++ b/backend/internal/controllers/auth.go @@ -1,6 +1,7 @@ package controllers import ( + "easywish/internal/models" "easywish/internal/services" "net/http" @@ -72,9 +73,25 @@ func (a *authControllerImpl) Refresh(c *gin.Context) { // @Tags Auth // @Accept json // @Produce json +// @Param request body models.RegistrationBeginRequest true "desc" // @Router /auth/registrationBegin [post] func (a *authControllerImpl) RegistrationBegin(c *gin.Context) { - c.Status(http.StatusNotImplemented) + + var request models.RegistrationBeginRequest + + if err := c.ShouldBindJSON(&request); err != nil { + c.Status(http.StatusBadRequest) + return + } + + _, err := a.authService.RegistrationBegin(request) + if err != nil { + c.JSON(http.StatusBadRequest, err.Error()) + return + } + + c.Status(http.StatusAccepted) + return } // RegistrationBegin implements AuthController. diff --git a/backend/internal/errors/auth.go b/backend/internal/errors/auth.go index a3d0959..55d13cf 100644 --- a/backend/internal/errors/auth.go +++ b/backend/internal/errors/auth.go @@ -9,4 +9,5 @@ var ( ErrUsernameTaken = errors.New("Provided username is already in use") ErrInvalidCredentials = errors.New("Invalid username, password or TOTP code") ErrInvalidToken = errors.New("Token is invalid or expired") + ErrServerError = errors.New("Internal server error") ) diff --git a/backend/internal/services/auth.go b/backend/internal/services/auth.go index 55dafef..fe50e1c 100644 --- a/backend/internal/services/auth.go +++ b/backend/internal/services/auth.go @@ -1,10 +1,14 @@ package services import ( + "context" "easywish/internal/database" errs "easywish/internal/errors" + "easywish/internal/logger" "easywish/internal/models" "easywish/internal/utils" + + "go.uber.org/zap" ) type AuthService interface { @@ -15,14 +19,29 @@ type AuthService interface { } type authServiceImpl struct { + log logger.Logger + dbctx database.DbContext } -func NewAuthService() AuthService { - return &authServiceImpl{} +func NewAuthService(_log logger.Logger, _dbctx database.DbContext) AuthService { + return &authServiceImpl{log: _log, dbctx: _dbctx} } func (a *authServiceImpl) RegistrationBegin(request models.RegistrationBeginRequest) (bool, error) { - return false, errs.ErrNotImplemented + + ctx := context.Background() + queries := database.New(a.dbctx) + user, err := queries.CreateUser(ctx, request.Username) // TODO: validation + + if err != nil { + a.log.Get().Error("Failed to add user to database", zap.Error(err)) + return false, errs.ErrServerError + } + a.log.Get().Info("Registered a new user", zap.String("username", user.Username)) + + // TODO: Send verification email + + return true, nil } func (a *authServiceImpl) RegistrationComplete(request models.RegistrationBeginRequest) (*models.RegistrationCompleteResponse, error) {