Skip to content

Commit 73db5e5

Browse files
committed
feat(event): add JWT-based user filtering for registration
- Refactor event registration and listing to require JWT token. - Filter registration list by user email extracted from JWT. - Move registration creation to protected route and use JWT user data for name and email fields. - Update repository, usecase, and handler signatures to pass token. - Add utility for extracting Bearer token from HTTP headers. - Improve error handling for unauthorized access.
1 parent 31e065a commit 73db5e5

File tree

12 files changed

+76
-24
lines changed

12 files changed

+76
-24
lines changed

app/app.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ func InitApp(
4949
// usecase
5050
userUsecase := users.InitUsecase(cfg, userRepo, dbTx, jwtInstance)
5151
newsletterUC := newsletters.InitUsecase(cfg, newsletterRepo, dbTx, jwt.NewJwt(cfg.JWT_SECRET_KEY))
52-
eventUC := events.InitUsecase(cfg, eventRepo, imgRepo, dbTx)
52+
eventUC := events.InitUsecase(cfg, eventRepo, imgRepo, dbTx, jwtInstance)
5353
imgUc := images.InitUsecase(imgRepo, dbTx)
5454
blogPostUc := blogPost.InitUseCase(blogPostRepo, jwtInstance)
5555

app/events/delivery/http/list_registration.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ func (h Handler) ListRegistration(w http.ResponseWriter, r *http.Request) {
3434
}, w)
3535
return
3636
}
37+
token := utils.ExtractBearerToken(r)
3738

3839
startDate, _ := utils.ParseDate(r.URL.Query().Get("start_date"))
3940
endDate, _ := utils.ParseDate(r.URL.Query().Get("end_date"))
@@ -43,7 +44,7 @@ func (h Handler) ListRegistration(w http.ResponseWriter, r *http.Request) {
4344
StartDate: startDate,
4445
EndDate: endDate,
4546
FilterPagination: flterPagination,
46-
})
47+
}, *token)
4748

4849
if err != nil {
4950
ngelog.Error(r.Context(), "failed to list registration event", err)

app/events/delivery/http/register_event.go

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,17 @@ func (h Handler) RegisterEvent(w http.ResponseWriter, r *http.Request) {
3232
return
3333
}
3434

35+
token := utils.ExtractBearerToken(r)
36+
37+
if err != nil {
38+
ngelog.Error(r.Context(), "failed to verify token", err)
39+
utils.Response(domain.HttpResponse{
40+
Code: http.StatusUnauthorized,
41+
Message: "Unauthorized",
42+
}, w)
43+
return
44+
}
45+
3546
var payload domain.RegisterEventPayload
3647
if err := json.Unmarshal(bodyBytes, &payload); err != nil {
3748
ngelog.Error(r.Context(), "failed to unmarshal payload", err)
@@ -41,7 +52,7 @@ func (h Handler) RegisterEvent(w http.ResponseWriter, r *http.Request) {
4152
}, w)
4253
return
4354
}
44-
data, err := h.usecase.CreateRegistrationEvent(r.Context(), payload)
55+
data, err := h.usecase.CreateRegistrationEvent(r.Context(), payload, *token)
4556
if err != nil {
4657
ngelog.Error(r.Context(), "failed to create registration event", err)
4758
resp := utils.CustomErrorResponse(err)

app/events/events.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,15 @@ import (
88
"github.com/hammer-code/lms-be/config"
99
"github.com/hammer-code/lms-be/domain"
1010
"github.com/hammer-code/lms-be/pkg/db"
11+
"github.com/hammer-code/lms-be/pkg/jwt"
1112
)
1213

1314
func InitRepository(db db.DatabaseTransaction) domain.EventRepository {
1415
return repository.NewRepository(db)
1516
}
1617

17-
func InitUsecase(cfg config.Config, repository domain.EventRepository, imageRepository domain.ImageRepository, dbTX db.DatabaseTransaction) domain.EventUsecase {
18-
return usecase.NewUsecase(cfg, repository, imageRepository, dbTX)
18+
func InitUsecase(cfg config.Config, repository domain.EventRepository, imageRepository domain.ImageRepository, dbTX db.DatabaseTransaction, jwt jwt.JWT) domain.EventUsecase {
19+
return usecase.NewUsecase(cfg, repository, imageRepository, dbTX, jwt)
1920
}
2021

2122
func InitHandler(uc domain.EventUsecase) domain.EventHandler {

app/events/repository/list_registration.go

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,9 @@ import (
66
"github.com/hammer-code/lms-be/domain"
77
)
88

9-
func (repo *repository) ListRegistration(ctx context.Context, filter domain.EventFilter) (tData int, data []domain.RegistrationEvent, err error) {
9+
func (repo *repository) ListRegistration(ctx context.Context, filter domain.EventFilter, email string) (tData int, data []domain.RegistrationEvent, err error) {
1010
db := repo.db.DB(ctx).Model(&domain.RegistrationEvent{})
1111

12-
var totalData int64
13-
1412
if filter.Status != "" {
1513
db = db.Where("status = ?", filter.Status)
1614
}
@@ -19,17 +17,24 @@ func (repo *repository) ListRegistration(ctx context.Context, filter domain.Even
1917
db = db.Where("start_date > ?", filter.StartDate)
2018
}
2119

22-
if filter.StartDate.Valid {
20+
if filter.EndDate.Valid {
2321
db = db.Where("end_date < ?", filter.EndDate)
2422
}
2523

24+
if email != "" {
25+
db = db.Where("email = ?", email)
26+
}
27+
28+
var totalData int64
2629
db.Count(&totalData)
2730

2831
err = db.Limit(filter.FilterPagination.GetLimit()).
29-
Offset(filter.FilterPagination.GetOffset()).Find(&data).Error
32+
Offset(filter.FilterPagination.GetOffset()).
33+
Find(&data).Error
3034
if err != nil {
3135
return
3236
}
3337

3438
return int(totalData), data, err
35-
}
39+
}
40+

app/events/usecase/create_registration_event.go

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import (
1515
"github.com/sirupsen/logrus"
1616
)
1717

18-
func (uc usecase) CreateRegistrationEvent(ctx context.Context, payload domain.RegisterEventPayload) (domain.RegisterEventResponse, error) {
18+
func (uc usecase) CreateRegistrationEvent(ctx context.Context, payload domain.RegisterEventPayload, token string) (domain.RegisterEventResponse, error) {
1919
event, err := uc.repository.GetEvent(ctx, payload.EventID)
2020
if err != nil {
2121
err = utils.NewInternalServerError(ctx, err)
@@ -41,6 +41,11 @@ func (uc usecase) CreateRegistrationEvent(ctx context.Context, payload domain.Re
4141
}
4242
}
4343

44+
userData, err := uc.jwt.VerifyToken(token)
45+
if err != nil {
46+
return domain.RegisterEventResponse{}, fmt.Errorf("failed to verify token: %w", err)
47+
}
48+
4449
hash := hash.GenerateHash(time.Now().Format("2006-01-02 15:04:05"))
4550

4651
orderNo := fmt.Sprintf("TXE-%d-%s%s%s%s", event.ID, time.Now().Format("06"), time.Now().Format("01"), time.Now().Format("02"), hash[0:4])
@@ -84,12 +89,12 @@ func (uc usecase) CreateRegistrationEvent(ctx context.Context, payload domain.Re
8489
if err := emailPayload.AddReceiver(
8590
ctx,
8691
email.Receiver{
87-
Email: payload.Email,
92+
Email: userData.Email,
8893
Data: map[string]interface{}{
89-
"name": payload.Name,
94+
"name": userData.UserName,
9095
"title": event.Title,
9196
"price": event.Price,
92-
"email": payload.Email,
97+
"email": userData.Email,
9398
"order_no": orderNo,
9499
"year": time.Now().Format("2006"),
95100
"date": formattedDate,
@@ -131,8 +136,8 @@ func (uc usecase) CreateRegistrationEvent(ctx context.Context, payload domain.Re
131136
rId, err := uc.repository.CreateRegistrationEvent(txCtx, domain.RegistrationEvent{
132137
OrderNo: orderNo,
133138
EventID: event.ID,
134-
Name: payload.Name,
135-
Email: payload.Email,
139+
Name: userData.UserName,
140+
Email: userData.Email,
136141
PhoneNumber: payload.PhoneNumber,
137142
Status: status,
138143
UpToYou: upToYou,

app/events/usecase/list_registration_event.go

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,14 @@ import (
77
"github.com/hammer-code/lms-be/utils"
88
)
99

10-
func (uc usecase) ListRegistration(ctx context.Context, filter domain.EventFilter) (resp []domain.RegistrationEvent, pagination domain.Pagination, err error) {
11-
tData, datas, err := uc.repository.ListRegistration(ctx, filter)
10+
func (uc usecase) ListRegistration(ctx context.Context, filter domain.EventFilter, token string) (resp []domain.RegistrationEvent, pagination domain.Pagination, err error) {
11+
12+
userData, err := uc.jwt.VerifyToken(token)
13+
if err != nil {
14+
return nil, domain.Pagination{}, utils.NewUnauthorizedError(ctx, "unauthorized", err)
15+
}
16+
17+
tData, datas, err := uc.repository.ListRegistration(ctx, filter, userData.Email)
1218
if err != nil {
1319
err = utils.NewInternalServerError(ctx, err)
1420
return

app/events/usecase/usecase.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,26 +4,29 @@ import (
44
"github.com/hammer-code/lms-be/config"
55
"github.com/hammer-code/lms-be/domain"
66
"github.com/hammer-code/lms-be/pkg/db"
7+
"github.com/hammer-code/lms-be/pkg/jwt"
78
)
89

910
type usecase struct {
1011
repository domain.EventRepository
1112
imageRepository domain.ImageRepository
1213
cfg config.Config
1314
dbTX db.DatabaseTransaction
15+
jwt jwt.JWT
1416
}
1517

1618
var (
1719
uc *usecase
1820
)
1921

20-
func NewUsecase(cfg config.Config, repository domain.EventRepository, imageRepository domain.ImageRepository, dbTX db.DatabaseTransaction) domain.EventUsecase {
22+
func NewUsecase(cfg config.Config, repository domain.EventRepository, imageRepository domain.ImageRepository, dbTX db.DatabaseTransaction, jwt jwt.JWT) domain.EventUsecase {
2123
if uc == nil {
2224
uc = &usecase{
2325
repository: repository,
2426
imageRepository: imageRepository,
2527
dbTX: dbTX,
2628
cfg: cfg,
29+
jwt: jwt,
2730
}
2831
}
2932

cmd/serve_http.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,6 @@ func registerHandler(app app.App) *mux.Router {
151151
public.HandleFunc("/events", app.EventHandler.List).Methods(http.MethodGet)
152152
public.HandleFunc("/events/{id}", app.EventHandler.GetEventByID).Methods(http.MethodGet)
153153
public.HandleFunc("/images", app.ImageHandler.UploadImage).Methods(http.MethodPost)
154-
public.HandleFunc("/events/registrations", app.EventHandler.RegisterEvent).Methods(http.MethodPost)
155154
public.HandleFunc("/events/registrations/{order_no}", app.EventHandler.RegistrationStatus).Methods(http.MethodGet)
156155
public.HandleFunc("/events/pay", app.EventHandler.PayEvent).Methods(http.MethodPost)
157156
public.HandleFunc("/blogs", app.BlogPostHandler.GetAllBlogPosts).Methods(http.MethodGet)
@@ -176,6 +175,8 @@ func registerHandler(app app.App) *mux.Router {
176175
protectedV1Route.HandleFunc("/events/pays", app.EventHandler.ListEventPay).Methods(http.MethodGet)
177176
protectedV1Route.HandleFunc("/events/pays", app.EventHandler.PayProcess).Methods(http.MethodPost)
178177
protectedV1Route.HandleFunc("/events/{id}", app.EventHandler.GetEventByID).Methods(http.MethodGet)
178+
protectedV1Route.HandleFunc("/events/registrations", app.EventHandler.RegisterEvent).Methods(http.MethodPost)
179+
179180
protectedV1Route.HandleFunc("/images", app.ImageHandler.UploadImage).Methods(http.MethodPost)
180181

181182
protectedV1Route.HandleFunc("/blogs", app.BlogPostHandler.CreateBlogPost).Methods(http.MethodPost)

domain/event.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ type EventRepository interface {
2222
GetEvent(ctx context.Context, eventID uint) (data Event, err error)
2323
DeleteEvent(ctx context.Context, eventID uint) (err error)
2424
GetRegistrationEvent(ctx context.Context, orderNo string) (data RegistrationEvent, err error)
25-
ListRegistration(ctx context.Context, filter EventFilter) (tData int, data []RegistrationEvent, err error)
25+
ListRegistration(ctx context.Context, filter EventFilter, email string) (tData int, data []RegistrationEvent, err error)
2626
ListEventPay(ctx context.Context, filter EventFilter) (tData int, data []EventPay, err error)
2727
UpdateEventPay(ctx context.Context, event EventPay) error
2828
GetEventPay(ctx context.Context, orderNo string) (data EventPay, err error)
@@ -34,12 +34,12 @@ type EventUsecase interface {
3434
CreateEvent(ctx context.Context, payload CreateEventPayload) error
3535
UpdateEvent(ctx context.Context, id uint, payload UpdateEventPayload) error
3636
GetEvents(ctx context.Context, filter EventFilter) (data []Event, pagination Pagination, err error)
37-
CreateRegistrationEvent(ctx context.Context, payload RegisterEventPayload) (RegisterEventResponse, error)
37+
CreateRegistrationEvent(ctx context.Context, payload RegisterEventPayload, token string) (RegisterEventResponse, error)
3838
CreateEventPay(ctx context.Context, payload EventPayPayload) error
3939
GetEventByID(ctx context.Context, id uint) (resp Event, err error)
4040
DeleteEvent(ctx context.Context, id uint) (err error)
4141
RegistrationStatus(ctx context.Context, orderNo string) (resp RegisterStatusResponse, err error)
42-
ListRegistration(ctx context.Context, filter EventFilter) (resp []RegistrationEvent, pagination Pagination, err error)
42+
ListRegistration(ctx context.Context, filter EventFilter, token string) (resp []RegistrationEvent, pagination Pagination, err error)
4343
ListEventPay(ctx context.Context, filter EventFilter) (data []EventPay, pagination Pagination, err error)
4444
PayProcess(ctx context.Context, payload PayProcessPayload) error
4545
}

0 commit comments

Comments
 (0)