Skip to content

Commit 3fe11dc

Browse files
feat(faculty): move toward db role over jwt role
1 parent f782b7d commit 3fe11dc

2 files changed

Lines changed: 46 additions & 1 deletion

File tree

internal/handler/auth.go

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -641,7 +641,19 @@ func (h *Handler) requireFacultyClaims(w http.ResponseWriter, r *http.Request) (
641641
return nil, false
642642
}
643643

644-
if claims.Role != string(database.UserRoleFaculty) {
644+
uid, err := uuid.Parse(claims.UserID)
645+
if err != nil {
646+
h.respondError(w, http.StatusUnauthorized, "Invalid user ID in token")
647+
return nil, false
648+
}
649+
650+
user, err := h.queries.GetUserByID(r.Context(), uid)
651+
if err != nil {
652+
h.handleDBError(w, err)
653+
return nil, false
654+
}
655+
656+
if !user.Role.Valid || user.Role.UserRole != database.UserRoleFaculty {
645657
h.respondError(w, http.StatusForbidden, "Faculty role required")
646658
return nil, false
647659
}

internal/router/router_auth_test.go

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,12 @@ func TestBotTokenLifecycle(t *testing.T) {
3131
facultyID := uuid.New()
3232
tokenID := uuid.New()
3333
var storedHash string
34+
facultyUser := database.User{
35+
Uid: facultyID,
36+
Role: database.NullUserRole{UserRole: database.UserRoleFaculty, Valid: true},
37+
}
38+
39+
mockQueries.On("GetUserByID", mock.Anything, facultyID).Return(facultyUser, nil).Times(3)
3440

3541
mockQueries.On("CreateBotToken", mock.Anything, mock.MatchedBy(func(arg database.CreateBotTokenParams) bool {
3642
storedHash = arg.TokenHash
@@ -212,6 +218,12 @@ func TestBotTokenManagementRequiresFaculty(t *testing.T) {
212218

213219
userID := uuid.New()
214220
tokenID := uuid.New()
221+
studentUser := database.User{
222+
Uid: userID,
223+
Role: database.NullUserRole{UserRole: database.UserRoleStudent, Valid: true},
224+
}
225+
226+
mockQueries.On("GetUserByID", mock.Anything, userID).Return(studentUser, nil).Times(3)
215227

216228
createReq := httptest.NewRequest(http.MethodPost, "/api/v1/bot/tokens", bytes.NewBufferString(`{"name":"deploy-bot"}`))
217229
createReq.Header.Set("Authorization", "Bearer "+makeJWT(t, userID, string(database.UserRoleStudent)))
@@ -232,6 +244,27 @@ func TestBotTokenManagementRequiresFaculty(t *testing.T) {
232244
assert.Equal(t, http.StatusForbidden, revokeRes.Code)
233245
}
234246

247+
func TestBotTokenManagementUsesDatabaseRole(t *testing.T) {
248+
mockQueries := mocks.NewQuerier(t)
249+
routerUnderTest := newTestRouter(mockQueries)
250+
251+
facultyID := uuid.New()
252+
facultyUser := database.User{
253+
Uid: facultyID,
254+
Role: database.NullUserRole{UserRole: database.UserRoleFaculty, Valid: true},
255+
}
256+
257+
mockQueries.On("GetUserByID", mock.Anything, facultyID).Return(facultyUser, nil).Once()
258+
mockQueries.On("ListBotTokens", mock.Anything).Return([]database.ListBotTokensRow{}, nil).Once()
259+
260+
req := httptest.NewRequest(http.MethodGet, "/api/v1/bot/tokens", nil)
261+
req.Header.Set("Authorization", "Bearer "+makeJWT(t, facultyID, string(database.UserRoleStudent)))
262+
res := httptest.NewRecorder()
263+
routerUnderTest.ServeHTTP(res, req)
264+
265+
assert.Equal(t, http.StatusOK, res.Code)
266+
}
267+
235268
func newTestRouter(queries database.Querier) http.Handler {
236269
cfg := &config.Config{
237270
Env: "test",

0 commit comments

Comments
 (0)