Skip to content

Commit 24192ec

Browse files
authored
Merge pull request #11 from hammercode-dev/be-02/login-logout
[BE-02] - Login and Logout
2 parents 234568f + 0106fcf commit 24192ec

File tree

16 files changed

+163
-64
lines changed

16 files changed

+163
-64
lines changed

app/middlewares/auth_middleware.go

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -31,15 +31,24 @@ func (m *Middleware) AuthMiddleware(allowedRole string) domain.MiddlewareFunc {
3131
return
3232
}
3333

34-
// tokenLogoutErr := m.UserRepo.ExpiredToken(request.Context(), *token)
35-
// if tokenLogoutErr == nil {
36-
// utils.Response(domain.HttpResponse{
37-
// Code: 401,
38-
// Message: "Token expired",
39-
// Data: nil,
40-
// }, writer)
41-
// return
42-
// }
34+
logoutToken, err := m.UserRepo.GetToken(request.Context(), *token)
35+
if err != nil {
36+
utils.Response(domain.HttpResponse{
37+
Code: 401,
38+
Message: "Unauthorized",
39+
Data: nil,
40+
}, writer)
41+
return
42+
}
43+
if logoutToken.Status == 0 {
44+
utils.Response(domain.HttpResponse{
45+
Code: 401,
46+
Message: "Unauthorized",
47+
Data: nil,
48+
}, writer)
49+
return
50+
}
51+
4352

4453
user, err := m.UserRepo.FindByEmail(request.Context(), verifyToken.Email)
4554
if err != nil {

app/users/delivery/http/logout_users.go

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,8 @@ func (h Handler) Logout(w http.ResponseWriter, r *http.Request) {
2222

2323
err := h.usecase.Logout(r.Context(), *token)
2424
if err != nil {
25-
utils.Response(domain.HttpResponse{
26-
Code: 500,
27-
Message: err.Error(),
28-
Data: nil,
29-
}, w)
25+
resp := utils.CostumErr(err.Error())
26+
utils.Response(resp, w)
3027
return
3128
}
3229

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package repository
2+
3+
import (
4+
"context"
5+
"time"
6+
7+
"github.com/hammer-code/lms-be/domain"
8+
)
9+
10+
func (repo *repository) CleanupLogoutToken(ctx context.Context) error {
11+
token := &domain.LogoutToken{}
12+
if err := repo.db.DB(ctx).Delete(token, "expired_at < ?", time.Now()).Error; err != nil {
13+
return err
14+
}
15+
16+
return nil
17+
}

app/users/repository/expired_token.go

Lines changed: 0 additions & 22 deletions
This file was deleted.

app/users/repository/get_token.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package repository
2+
3+
import (
4+
"context"
5+
6+
"github.com/hammer-code/lms-be/domain"
7+
)
8+
9+
func (repo *repository) GetToken(ctx context.Context, token string) (logoutToken domain.LogoutToken, err error) {
10+
if err = repo.db.DB(ctx).Find(&logoutToken, "token = ?", token).Error; err != nil {
11+
return
12+
}
13+
return
14+
}

app/users/repository/logout_users.go

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,13 @@ package repository
22

33
import (
44
"context"
5-
"github.com/hammer-code/lms-be/domain"
65
"time"
6+
7+
"github.com/hammer-code/lms-be/domain"
78
)
89

910
func (repo *repository) LogoutUser(ctx context.Context, token string, expiredAt time.Time) error {
10-
err := repo.db.DB(ctx).Create(&domain.LogoutToken{
11-
Token: token,
12-
ExpiredAt: expiredAt,
13-
CreatedAt: time.Now(),
14-
}).Error
15-
16-
if err != nil {
11+
if err := repo.db.DB(ctx).Model(&domain.LogoutToken{}).Where("token = ?", token).Update("status", 0).Error; err != nil {
1712
return err
1813
}
1914

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package repository
2+
3+
import (
4+
"context"
5+
"time"
6+
7+
"github.com/hammer-code/lms-be/domain"
8+
)
9+
10+
func (repo *repository) StoreToken(ctx context.Context, token string, expiredAt time.Time, uid int) error {
11+
err := repo.db.DB(ctx).Create(&domain.LogoutToken{
12+
Token: token,
13+
ExpiredAt: expiredAt,
14+
CreatedAt: time.Now(),
15+
UserId: uid,
16+
Status: 1,
17+
}).Error
18+
19+
if err != nil {
20+
return err
21+
}
22+
23+
return nil
24+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package repository
2+
3+
import (
4+
"context"
5+
6+
"github.com/hammer-code/lms-be/domain"
7+
)
8+
9+
func (repo *repository) UnactivateTokenByUser(ctx context.Context, uid int) error {
10+
if err := repo.db.DB(ctx).Model(&domain.LogoutToken{}).Where("user_id = ? AND status = 1", uid).Update("status", 0).Error; err != nil {
11+
return err
12+
}
13+
14+
return nil
15+
}

app/users/usecase/forgot_password.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ func (us *usecase) ForgotPassword(ctx context.Context, emailForgot domain.Forgot
2828
return
2929
}
3030

31-
resetToken, err := us.jwt.GenerateAccessToken(ctx, &user, 30)
31+
resetToken, _, err := us.jwt.GenerateAccessToken(ctx, &user, 30)
3232
if err != nil {
3333
logrus.Error("us.ForgotPassword: failed to generate token", err)
3434
return

app/users/usecase/login_users.go

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package usecase
22

33
import (
44
"context"
5+
56
"github.com/hammer-code/lms-be/domain"
67
"github.com/sirupsen/logrus"
78
"golang.org/x/crypto/bcrypt"
@@ -14,24 +15,37 @@ func (us *usecase) Login(ctx context.Context, userReq domain.Login) (user domain
1415
logrus.Error("us.LoginUser: failed to login", err)
1516
return err
1617
}
17-
return nil
18-
})
18+
19+
if err = bcrypt.CompareHashAndPassword([]byte(user.Password), []byte(userReq.Password)); err != nil {
20+
logrus.Error("us.Login: invalid password")
21+
return err
22+
}
23+
24+
25+
tokenPtr, expiredTime, err := us.jwt.GenerateAccessToken(ctx, &user, 60)
26+
token = *tokenPtr
27+
28+
if err != nil {
29+
logrus.Error("us.Login: failed to login. ", err)
30+
return err
31+
}
1932

20-
if err = bcrypt.CompareHashAndPassword([]byte(user.Password), []byte(userReq.Password)); err != nil {
21-
logrus.Error("us.Login: invalid password")
22-
return
23-
}
33+
if err = us.userRepo.UnactivateTokenByUser(ctx, user.ID); err != nil {
34+
logrus.Error("us.Login: failed to login. ", err)
35+
return err
36+
}
37+
if err = us.userRepo.StoreToken(ctx, token, expiredTime, user.ID); err != nil {
38+
logrus.Error("us.Login: failed to login. ", err)
39+
return err
40+
}
2441

25-
if err != nil {
26-
logrus.Error("us.Login: failed to login. ", err)
27-
return
28-
}
42+
return nil
43+
})
2944

30-
signToken, err := us.jwt.GenerateAccessToken(ctx, &user, 60)
3145
if err != nil {
3246
logrus.Error("us.Login: failed to login. ", err)
3347
return
3448
}
3549

36-
return user, *signToken, nil
50+
return user, token, nil
3751
}

0 commit comments

Comments
 (0)