package services import ( "easywish/internal/database" errs "easywish/internal/errors" "easywish/internal/models" "easywish/internal/utils" "go.uber.org/zap" ) type AuthService interface { RegistrationBegin(request models.RegistrationBeginRequest) (bool, error) RegistrationComplete(request models.RegistrationBeginRequest) (*models.RegistrationCompleteResponse, error) Login(request models.LoginRequest) (*models.LoginResponse, error) Refresh(request models.RefreshRequest) (*models.RefreshResponse, error) } type authServiceImpl struct { log *zap.Logger dbctx database.DbContext } func NewAuthService(_log *zap.Logger, _dbctx database.DbContext) AuthService { return &authServiceImpl{log: _log, dbctx: _dbctx} } func (a *authServiceImpl) RegistrationBegin(request models.RegistrationBeginRequest) (bool, error) { helper, db, _ := database.NewDbHelperTransaction(a.dbctx) user, err := db.TXQueries.CreateUser(db.CTX, request.Username) // TODO: validation if err != nil { a.log.Error("Failed to add user to database", zap.Error(err)) return false, errs.ErrServerError } a.log.Info("Registered a new user", zap.String("username", user.Username)) helper.Commit() // TODO: Send verification email return true, nil } func (a *authServiceImpl) RegistrationComplete(request models.RegistrationBeginRequest) (*models.RegistrationCompleteResponse, error) { return nil, errs.ErrNotImplemented } func (a *authServiceImpl) Login(request models.LoginRequest) (*models.LoginResponse, error) { conn, ctx, err := utils.GetDbConn() if err != nil { return nil, err } defer conn.Close(ctx) queries := database.New(conn) user, err := queries.GetUserByLoginCredentials(ctx, database.GetUserByLoginCredentialsParams{ Username: request.Username, Password: request.Password, }) if err != nil { return nil, errs.ErrUnauthorized } accessToken, refreshToken, err := utils.GenerateTokens(user.Username) return &models.LoginResponse{Tokens: models.Tokens{AccessToken: accessToken, RefreshToken: refreshToken}}, nil } func (a *authServiceImpl) Refresh(request models.RefreshRequest) (*models.RefreshResponse, error) { return nil, errs.ErrNotImplemented }