Compare commits
4
Commits
b35dc4841f
...
b4ab9eaba1
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b4ab9eaba1 | ||
|
|
173d56d399 | ||
|
|
d3aa9523dc | ||
|
|
26aa0c2a94 |
@@ -1,6 +1,7 @@
|
|||||||
package handler
|
package handler
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
"log/slog"
|
"log/slog"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
|
||||||
@@ -27,6 +28,8 @@ func NewAuthHandler(authService *domain.AuthService) *AuthHandler {
|
|||||||
// @Param payload body request.LoginPayload true "Login payload"
|
// @Param payload body request.LoginPayload true "Login payload"
|
||||||
// @Success 200 {object} domain.TokenPair
|
// @Success 200 {object} domain.TokenPair
|
||||||
// @Error 400 {object} response.ErrorResponse "failed to decode request body"
|
// @Error 400 {object} response.ErrorResponse "failed to decode request body"
|
||||||
|
// @Error 401 {object} response.ErrorResponse "email not found"
|
||||||
|
// @Error 401 {object} response.ErrorResponse "password is wrong"
|
||||||
// @Error 500 {object} response.ErrorResponse "failed to login"
|
// @Error 500 {object} response.ErrorResponse "failed to login"
|
||||||
// @Router /login [post]
|
// @Router /login [post]
|
||||||
func (h *AuthHandler) Login(w http.ResponseWriter, r *http.Request) {
|
func (h *AuthHandler) Login(w http.ResponseWriter, r *http.Request) {
|
||||||
@@ -41,8 +44,15 @@ func (h *AuthHandler) Login(w http.ResponseWriter, r *http.Request) {
|
|||||||
|
|
||||||
tokens, err := h.AuthService.Login(ctx, payload.Email, payload.Password)
|
tokens, err := h.AuthService.Login(ctx, payload.Email, payload.Password)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
if errors.Is(err, domain.ErrEmailNotFound) {
|
||||||
|
response.Error(ctx, w, http.StatusUnauthorized, "email not found")
|
||||||
|
} else if errors.Is(err, domain.ErrPasswordWrong) {
|
||||||
|
response.Error(ctx, w, http.StatusUnauthorized, "password is wrong")
|
||||||
|
} else {
|
||||||
|
response.Error(ctx, w, http.StatusInternalServerError, "failed to login")
|
||||||
|
}
|
||||||
|
|
||||||
slog.ErrorContext(ctx, "failed to login", slog.Any("error", err))
|
slog.ErrorContext(ctx, "failed to login", slog.Any("error", err))
|
||||||
response.Error(ctx, w, http.StatusInternalServerError, "failed to login")
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -243,7 +243,7 @@ func (h *ListHandler) RemoveUserFromList(w http.ResponseWriter, r *http.Request)
|
|||||||
// @Success 204 {object} nil
|
// @Success 204 {object} nil
|
||||||
// @Error 400 {object} response.ErrorResponse "failed to decode request body"
|
// @Error 400 {object} response.ErrorResponse "failed to decode request body"
|
||||||
// @Error 500 {object} response.ErrorResponse "failed to create list item"
|
// @Error 500 {object} response.ErrorResponse "failed to create list item"
|
||||||
// @Router /lists/item [post]
|
// @Router /lists/items [post]
|
||||||
func (h *ListHandler) CreateListItem(w http.ResponseWriter, r *http.Request) {
|
func (h *ListHandler) CreateListItem(w http.ResponseWriter, r *http.Request) {
|
||||||
ctx := r.Context()
|
ctx := r.Context()
|
||||||
|
|
||||||
@@ -283,7 +283,7 @@ func (h *ListHandler) CreateListItem(w http.ResponseWriter, r *http.Request) {
|
|||||||
// @Success 204
|
// @Success 204
|
||||||
// @Error 400 {object} response.ErrorResponse "failed to decode request url"
|
// @Error 400 {object} response.ErrorResponse "failed to decode request url"
|
||||||
// @Error 500 {object} response.ErrorResponse "failed to delete list item"
|
// @Error 500 {object} response.ErrorResponse "failed to delete list item"
|
||||||
// @Router /lists/item/{id} [delete]
|
// @Router /lists/items/{id} [delete]
|
||||||
func (h *ListHandler) DeleteListItem(w http.ResponseWriter, r *http.Request) {
|
func (h *ListHandler) DeleteListItem(w http.ResponseWriter, r *http.Request) {
|
||||||
ctx := r.Context()
|
ctx := r.Context()
|
||||||
|
|
||||||
@@ -324,7 +324,7 @@ func (h *ListHandler) DeleteListItem(w http.ResponseWriter, r *http.Request) {
|
|||||||
// @Error 400 {object} response.ErrorResponse "failed to decode request body"
|
// @Error 400 {object} response.ErrorResponse "failed to decode request body"
|
||||||
// @Error 401 {object} response.ErrorResponse "not authorized"
|
// @Error 401 {object} response.ErrorResponse "not authorized"
|
||||||
// @Error 500 {object} response.ErrorResponse "failed to update list item"
|
// @Error 500 {object} response.ErrorResponse "failed to update list item"
|
||||||
// @Router /lists/item [put]
|
// @Router /lists/items [put]
|
||||||
func (h *ListHandler) UpdateListItem(w http.ResponseWriter, r *http.Request) {
|
func (h *ListHandler) UpdateListItem(w http.ResponseWriter, r *http.Request) {
|
||||||
ctx := r.Context()
|
ctx := r.Context()
|
||||||
|
|
||||||
|
|||||||
@@ -57,9 +57,9 @@ func NewMux(cfg Config) http.Handler {
|
|||||||
apiMux.Handle("GET /lists", protected(listHandler.GetLists))
|
apiMux.Handle("GET /lists", protected(listHandler.GetLists))
|
||||||
apiMux.Handle("POST /lists/user", protected(listHandler.AddUserToList))
|
apiMux.Handle("POST /lists/user", protected(listHandler.AddUserToList))
|
||||||
apiMux.Handle("DELETE /lists/user", protected(listHandler.RemoveUserFromList))
|
apiMux.Handle("DELETE /lists/user", protected(listHandler.RemoveUserFromList))
|
||||||
apiMux.Handle("POST /lists/item", protected(listHandler.CreateListItem))
|
apiMux.Handle("POST /lists/items", protected(listHandler.CreateListItem))
|
||||||
apiMux.Handle("DELETE /lists/item/{id}", protected(listHandler.DeleteListItem))
|
apiMux.Handle("DELETE /lists/items/{id}", protected(listHandler.DeleteListItem))
|
||||||
apiMux.Handle("PUT /lists/item", protected(listHandler.UpdateListItem))
|
apiMux.Handle("PUT /lists/items", protected(listHandler.UpdateListItem))
|
||||||
apiMux.Handle("POST /lists/items/{id}", protected(listHandler.SetListItemCompleted))
|
apiMux.Handle("POST /lists/items/{id}", protected(listHandler.SetListItemCompleted))
|
||||||
apiMux.Handle("GET /lists/{id}", protected(listHandler.GetListItems))
|
apiMux.Handle("GET /lists/{id}", protected(listHandler.GetListItems))
|
||||||
|
|
||||||
|
|||||||
@@ -14,6 +14,11 @@ import (
|
|||||||
"golang.org/x/crypto/bcrypt"
|
"golang.org/x/crypto/bcrypt"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
ErrEmailNotFound = errors.New("email not found")
|
||||||
|
ErrPasswordWrong = errors.New("password is wrong")
|
||||||
|
)
|
||||||
|
|
||||||
type AuthRepository interface {
|
type AuthRepository interface {
|
||||||
GetUserById(ctx context.Context, id string) (*AuthUser, error)
|
GetUserById(ctx context.Context, id string) (*AuthUser, error)
|
||||||
GetUserByEmail(ctx context.Context, email string) (*AuthUser, error)
|
GetUserByEmail(ctx context.Context, email string) (*AuthUser, error)
|
||||||
@@ -71,7 +76,7 @@ func (s *AuthService) Authenticate(ctx context.Context, email string, password s
|
|||||||
err = bcrypt.CompareHashAndPassword([]byte(user.PasswordHash), []byte(password))
|
err = bcrypt.CompareHashAndPassword([]byte(user.PasswordHash), []byte(password))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if errors.Is(err, bcrypt.ErrMismatchedHashAndPassword) {
|
if errors.Is(err, bcrypt.ErrMismatchedHashAndPassword) {
|
||||||
return user, errors.New("invalid email or password")
|
return user, ErrPasswordWrong
|
||||||
}
|
}
|
||||||
return user, err
|
return user, err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -36,6 +36,9 @@ func (r *AuthRepo) GetUserByEmail(ctx context.Context, email string) (*domain.Au
|
|||||||
email,
|
email,
|
||||||
).Scan(&user.ID, &user.Email, &user.Name, &user.PasswordHash)
|
).Scan(&user.ID, &user.Email, &user.Name, &user.PasswordHash)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
if errors.Is(err, sql.ErrNoRows) {
|
||||||
|
return nil, domain.ErrEmailNotFound
|
||||||
|
}
|
||||||
return nil, fmt.Errorf("failed to get user: %w", err)
|
return nil, fmt.Errorf("failed to get user: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -126,6 +126,7 @@ func (r *ListRepo) CreateListItem(ctx context.Context, listID string, title stri
|
|||||||
return nil, fmt.Errorf("failed to insert list item: %w", err)
|
return nil, fmt.Errorf("failed to insert list item: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
l.ListID = listID
|
||||||
return l, nil
|
return l, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user