Skip to content

Commit e9bf979

Browse files
committed
fix: refactor code to get event role by discord and event id
1 parent b88cc37 commit e9bf979

7 files changed

Lines changed: 98 additions & 86 deletions

File tree

apps/api/cmd/api/main.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ func main() {
9292
applicationService := services.NewApplicationService(applicationRepo, eventService, emailService, txm, r2Client, &cfg.CoreBuckets, logger)
9393
teamService := services.NewTeamService(teamRepo, teamMemberRepo, teamJoinRequestRepo, eventRepo, txm, logger)
9494
batService := services.NewBatService(applicationRepo, eventRepo, userRepo, batRunsRepo, emailService, txm, taskQueueClient, logger)
95-
discordService := services.NewDiscordService(accountRepo, eventRepo, logger)
95+
discordService := services.NewDiscordService(eventRepo, logger)
9696

9797
// Injections into handlers
9898
apiHandlers := handlers.NewHandlers(authService, userService, eventInterestService, eventService, emailService, applicationService, teamService, batService, discordService, cfg, logger)

apps/api/internal/api/api.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,6 @@ func (api *API) setupRoutes(mw *mw.Middleware) {
123123
// --- Discord routes (for Discord bot) ---
124124
api.Router.Route("/discord", func(r chi.Router) {
125125
r.Use(mw.Auth.RequireAuth)
126-
r.Get("/user/{discord_id}/role", api.Handlers.Discord.GetUserEventRoleByDiscordID)
127126
r.Get("/event/{event_id}/attendees", api.Handlers.Discord.GetEventAttendeesWithDiscord)
128127
})
129128

@@ -146,6 +145,7 @@ func (api *API) setupRoutes(mw *mw.Middleware) {
146145

147146
r.Get("/", api.Handlers.Event.GetEventByID)
148147
r.Get("/role", api.Handlers.Event.GetEventRole)
148+
r.Get("/discord/{discordId}", api.Handlers.Discord.GetUserEventRoleByDiscordIDAndEventId)
149149

150150
r.With(ensureEventStaff).Get("/overview", api.Handlers.Event.GetEventOverview)
151151

apps/api/internal/api/handlers/discord.go

Lines changed: 50 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -22,44 +22,6 @@ func NewDiscordHandler(discordService *services.DiscordService, logger zerolog.L
2222
}
2323
}
2424

25-
// GetUserEventRoleByDiscordID
26-
//
27-
// @Summary Get user event role by Discord ID
28-
// @Description Get the event role for a user based on their Discord account ID
29-
// @Tags Discord
30-
// @Param discord_id path string true "Discord account ID"
31-
// @Success 200 {object} map[string]interface{} "event_id and role"
32-
// @Failure 404 {object} response.ErrorResponse "User or role not found"
33-
// @Failure 500 {object} response.ErrorResponse "Internal server error"
34-
// @Router /discord/user/{discord_id}/role [get]
35-
36-
func (h *DiscordHandler) GetUserEventRoleByDiscordID(w http.ResponseWriter, r *http.Request) {
37-
discordID := chi.URLParam(r, "discord_id")
38-
if discordID == "" {
39-
res.SendError(w, http.StatusBadRequest, res.NewError("bad_request", "discord_id is required"))
40-
return
41-
}
42-
43-
eventID, role, err := h.discordService.GetUserEventRoleByDiscordID(r.Context(), discordID)
44-
if err != nil {
45-
if err == services.ErrDiscordAccountNotFound || err == services.ErrNoEventRole {
46-
res.SendError(w, http.StatusNotFound, res.NewError("not_found", err.Error()))
47-
return
48-
}
49-
h.logger.Err(err).Msg("failed to get user event role")
50-
res.SendError(w, http.StatusInternalServerError, res.NewError("internal_error", "Failed to get user role"))
51-
return
52-
}
53-
54-
response := map[string]interface{}{
55-
"event_id": eventID,
56-
"role": role,
57-
}
58-
59-
w.Header().Set("Content-Type", "application/json")
60-
json.NewEncoder(w).Encode(response)
61-
}
62-
6325
// GetEventAttendeesWithDiscord
6426
//
6527
// @Summary Get event attendees with Discord IDs
@@ -96,4 +58,54 @@ func (h *DiscordHandler) GetEventAttendeesWithDiscord(w http.ResponseWriter, r *
9658
res.SendError(w, http.StatusInternalServerError, res.NewError("internal_error", "Failed to encode response"))
9759
return
9860
}
61+
}
62+
63+
// GetUserEventRoleByDiscordIDAndEventId
64+
//
65+
// @Summary Get user event role by Discord ID and Event ID
66+
// @Description Get the event role for a user based on their Discord account ID and a specific event ID
67+
// @Tags Discord
68+
// @Param eventId path string true "Event ID (UUID)"
69+
// @Param discordId path string true "Discord account ID"
70+
// @Success 200 {object} map[string]interface{} "role"
71+
// @Failure 400 {object} response.ErrorResponse "Invalid event ID or discord ID"
72+
// @Failure 404 {object} response.ErrorResponse "User or role not found"
73+
// @Failure 500 {object} response.ErrorResponse "Internal server error"
74+
// @Router /events/{eventId}/discord/{discordId} [get]
75+
func (h *DiscordHandler) GetUserEventRoleByDiscordIDAndEventId(w http.ResponseWriter, r *http.Request) {
76+
eventIDStr := chi.URLParam(r, "eventId")
77+
if eventIDStr == "" {
78+
res.SendError(w, http.StatusBadRequest, res.NewError("bad_request", "eventId is required"))
79+
return
80+
}
81+
82+
eventID, err := uuid.Parse(eventIDStr)
83+
if err != nil {
84+
res.SendError(w, http.StatusBadRequest, res.NewError("bad_request", "invalid event ID format"))
85+
return
86+
}
87+
88+
discordID := chi.URLParam(r, "discordId")
89+
if discordID == "" {
90+
res.SendError(w, http.StatusBadRequest, res.NewError("bad_request", "discordId is required"))
91+
return
92+
}
93+
94+
role, err := h.discordService.GetUserEventRoleByDiscordIDAndEventId(r.Context(), discordID, eventID)
95+
if err != nil {
96+
if err == services.ErrNoEventRole {
97+
res.SendError(w, http.StatusNotFound, res.NewError("not_found", err.Error()))
98+
return
99+
}
100+
h.logger.Err(err).Msg("failed to get user event role")
101+
res.SendError(w, http.StatusInternalServerError, res.NewError("internal_error", "Failed to get user role"))
102+
return
103+
}
104+
105+
response := map[string]interface{}{
106+
"role": role,
107+
}
108+
109+
w.Header().Set("Content-Type", "application/json")
110+
json.NewEncoder(w).Encode(response)
99111
}

apps/api/internal/db/queries/event_roles.sql

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,6 @@ UPDATE event_roles
2626
SET role = $3
2727
WHERE event_id = $1 AND user_id = $2;
2828

29-
-- name: GetEventRoleByUserID :one
30-
SELECT event_id, role
31-
FROM event_roles
32-
WHERE user_id = $1
33-
ORDER BY assigned_at DESC
34-
LIMIT 1;
35-
3629
-- name: GetEventAttendeesWithDiscord :many
3730
SELECT
3831
a.account_id as discord_id,
@@ -44,4 +37,12 @@ JOIN event_roles er ON u.id = er.user_id
4437
JOIN auth.accounts a ON u.id = a.user_id
4538
WHERE er.event_id = $1
4639
AND er.role = 'attendee'
47-
AND a.provider_id = 'discord';
40+
AND a.provider_id = 'discord';
41+
42+
-- name: GetEventRoleByDiscordIDAndEventId :one
43+
SELECT er.event_id, er.role
44+
FROM event_roles er
45+
JOIN auth.accounts a ON er.user_id = a.user_id
46+
WHERE a.provider_id = 'discord'
47+
AND a.account_id = $1
48+
AND er.event_id = $2;

apps/api/internal/db/repository/events.go

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -160,21 +160,27 @@ func (r *EventRepository) GetSubmissionTimes(ctx context.Context, eventId uuid.U
160160
return r.db.Query.GetSubmissionTimes(ctx, eventId)
161161
}
162162

163-
func (r *EventRepository) GetEventRoleByUserID(ctx context.Context, userID uuid.UUID) (*sqlc.GetEventRoleByUserIDRow, error) {
164-
eventRole, err := r.db.Query.GetEventRoleByUserID(ctx, userID)
163+
func (r *EventRepository) GetEventAttendeesWithDiscord(ctx context.Context, eventId uuid.UUID) (*[]sqlc.GetEventAttendeesWithDiscordRow, error) {
164+
attendees, err := r.db.Query.GetEventAttendeesWithDiscord(ctx, eventId)
165165
if err != nil {
166-
if errors.Is(err, pgx.ErrNoRows) {
167-
return nil, ErrEventRoleNotFound
168-
}
169166
return nil, err
170167
}
171-
return &eventRole, nil
168+
return &attendees, nil
172169
}
173170

174-
func (r *EventRepository) GetEventAttendeesWithDiscord(ctx context.Context, eventId uuid.UUID) (*[]sqlc.GetEventAttendeesWithDiscordRow, error) {
175-
attendees, err := r.db.Query.GetEventAttendeesWithDiscord(ctx, eventId)
171+
func (r *EventRepository) GetEventRoleByDiscordIDAndEventId(ctx context.Context, discordID string, eventID uuid.UUID) (*sqlc.GetEventRoleByDiscordIDAndEventIdRow, error) {
172+
params := sqlc.GetEventRoleByDiscordIDAndEventIdParams{
173+
AccountID: discordID,
174+
EventID: eventID,
175+
}
176+
177+
eventRole, err := r.db.Query.GetEventRoleByDiscordIDAndEventId(ctx, params)
176178
if err != nil {
179+
if errors.Is(err, pgx.ErrNoRows) {
180+
return nil, ErrEventRoleNotFound
181+
}
177182
return nil, err
178183
}
179-
return &attendees, nil
184+
185+
return &eventRole, nil
180186
}

apps/api/internal/db/sqlc/event_roles.sql.go

Lines changed: 16 additions & 10 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

apps/api/internal/services/discord.go

Lines changed: 6 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -11,48 +11,35 @@ import (
1111
)
1212

1313
var (
14-
ErrDiscordAccountNotFound = errors.New("discord account not found")
1514
ErrNoEventRole = errors.New("user has no event role")
1615
)
1716

1817
type DiscordService struct {
19-
accountRepo *repository.AccountRepository
2018
eventRepo *repository.EventRepository
2119
logger zerolog.Logger
2220
}
2321

2422
func NewDiscordService(
25-
accountRepo *repository.AccountRepository,
2623
eventRepo *repository.EventRepository,
2724
logger zerolog.Logger,
2825
) *DiscordService {
2926
return &DiscordService{
30-
accountRepo: accountRepo,
3127
eventRepo: eventRepo,
3228
logger: logger.With().Str("service", "DiscordService").Str("component", "discord").Logger(),
3329
}
3430
}
3531

36-
func (s *DiscordService) GetUserEventRoleByDiscordID(ctx context.Context, discordID string) (*uuid.UUID, *sqlc.EventRoleType, error) {
37-
userID, err := s.accountRepo.GetUserIDByDiscordAccountID(ctx, discordID)
38-
if err != nil {
39-
if err == repository.ErrAccountNotFound {
40-
return nil, nil, ErrDiscordAccountNotFound
41-
}
42-
s.logger.Err(err).Msg("failed to get user ID from discord account")
43-
return nil, nil, err
44-
}
45-
46-
eventRole, err := s.eventRepo.GetEventRoleByUserID(ctx, *userID)
32+
func (s *DiscordService) GetUserEventRoleByDiscordIDAndEventId(ctx context.Context, discordID string, eventID uuid.UUID) (*sqlc.EventRoleType, error) {
33+
eventRole, err := s.eventRepo.GetEventRoleByDiscordIDAndEventId(ctx, discordID, eventID)
4734
if err != nil {
4835
if err == repository.ErrEventRoleNotFound {
49-
return nil, nil, ErrNoEventRole
36+
return nil, ErrNoEventRole
5037
}
51-
s.logger.Err(err).Msg("failed to get event role")
52-
return nil, nil, err
38+
s.logger.Err(err).Msg("failed to get event role by discord ID and event ID")
39+
return nil, err
5340
}
5441

55-
return &eventRole.EventID, &eventRole.Role, nil
42+
return &eventRole.Role, nil
5643
}
5744

5845
func (s *DiscordService) GetEventAttendeesWithDiscord(ctx context.Context, eventID uuid.UUID) (*[]sqlc.GetEventAttendeesWithDiscordRow, error) {

0 commit comments

Comments
 (0)