Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 0 additions & 2 deletions apps/api/go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -56,8 +56,6 @@ github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovk
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA=
github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
github.com/oapi-codegen/nullable v1.1.0 h1:eAh8JVc5430VtYVnq00Hrbpag9PFRGWLjxR1/3KntMs=
github.com/oapi-codegen/nullable v1.1.0/go.mod h1:KUZ3vUzkmEKY90ksAmit2+5juDIhIZhfDl+0PwOQlFY=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
Expand Down
2 changes: 1 addition & 1 deletion apps/api/internal/api/api.go
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ func (api *API) setupRoutes(mw *mw.Middleware) {
// Event routes
api.Router.Route("/events", func(r chi.Router) {
r.With(mw.Auth.RequireAuth, ensureSuperuser).Post("/", api.Handlers.Event.CreateEvent)
r.With(mw.Auth.RequireAuth).Get("/", api.Handlers.Event.GetAllEvents)
r.With(mw.Auth.RequireAuth).Get("/", api.Handlers.Event.GetEvents)
r.Route("/{eventId}", func(r chi.Router) {
r.With(mw.Auth.RequireAuth, ensureEventAdmin).Patch("/", api.Handlers.Event.UpdateEventById)
r.With(mw.Auth.RequireAuth, ensureSuperuser).Delete("/", api.Handlers.Event.DeleteEventById)
Expand Down
26 changes: 23 additions & 3 deletions apps/api/internal/api/handlers/events.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,9 @@ import (
"github.com/swamphacks/core/apps/api/internal/db/sqlc"
"github.com/swamphacks/core/apps/api/internal/email"
"github.com/swamphacks/core/apps/api/internal/parse"
"github.com/swamphacks/core/apps/api/internal/ptr"
"github.com/swamphacks/core/apps/api/internal/services"
"github.com/swamphacks/core/apps/api/internal/web"
)

type EventHandler struct {
Expand Down Expand Up @@ -220,13 +222,31 @@ func (h *EventHandler) DeleteEventById(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusNoContent)
}

func (h *EventHandler) GetAllEvents(w http.ResponseWriter, r *http.Request) {
events, err := h.eventService.GetAllEvents(r.Context())
func (h *EventHandler) GetEvents(w http.ResponseWriter, r *http.Request) {
// Parse query params
// include_unpublished="true,false", default: false
queryParams := r.URL.Query()
includeUnpublished, err := web.ParseParamBoolean(queryParams, "include_unpublished", ptr.BoolToPtr(false))
if err != nil {
res.SendError(w, http.StatusInternalServerError, res.NewError("internal_err", "Something went wrong fetching events"))
res.SendError(w, http.StatusBadRequest, res.NewError("missing_fields", "Missing/malformed query. Available parameters: include_unpublished=true,false"))
return
}

events, err := h.eventService.GetEvents(r.Context(), *includeUnpublished)
if err == services.ErrMissingFields {
res.SendError(w, http.StatusBadRequest, res.NewError("missing_fields", "Missing/malformed query. Available parameteres: status=all,published"))
return
}

if err == services.ErrMissingPerms {
res.SendError(w, http.StatusForbidden, res.NewError("forbidden", "You are forbidden from this resource."))
return
}

if err != nil {
res.SendError(w, http.StatusInternalServerError, res.NewError("internal_err", "Something went wrong encoding response"))
}

w.Header().Set("Content-Type", "application/json")
w.WriteHeader(http.StatusOK)
if err := json.NewEncoder(w).Encode(events); err != nil {
Expand Down
39 changes: 39 additions & 0 deletions apps/api/internal/ctxutils/user.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package ctxutils

import (
"context"

"github.com/google/uuid"
mw "github.com/swamphacks/core/apps/api/internal/api/middleware"
"github.com/swamphacks/core/apps/api/internal/db/sqlc"
)

// Takes in a context and returns whether the user has the superuser role
func IsSuperuser(ctx context.Context) bool {
userCtx, ok := ctx.Value(mw.UserContextKey).(*mw.UserContext)
if !ok {
return false
}

return userCtx.Role == sqlc.AuthUserRoleSuperuser
}

// Takes in a context and returns whether the user has the user role
func IsUser(ctx context.Context) bool {
userCtx, ok := ctx.Value(mw.UserContextKey).(*mw.UserContext)
if !ok {
return false
}

return userCtx.Role == sqlc.AuthUserRoleUser
}

// Takes in the request context and returns the userID or nil if not retrievable
func GetUserIdFromCtx(ctx context.Context) *uuid.UUID {
userCtx, ok := ctx.Value(mw.UserContextKey).(*mw.UserContext)
if !ok {
return nil
}

return &userCtx.UserID
}
35 changes: 32 additions & 3 deletions apps/api/internal/db/queries/events.sql
Original file line number Diff line number Diff line change
Expand Up @@ -56,8 +56,37 @@ SELECT * FROM event_roles
WHERE user_id = @user_id::uuid AND event_id = @event_id::uuid;

-- name: GetPublishedEvents :many
SELECT * FROM events
WHERE is_published = TRUE;
SELECT
e.*,
er.role AS event_role
FROM events e
LEFT JOIN event_roles AS er
ON er.event_id = e.id
AND er.user_id = $1
WHERE e.is_published = TRUE
ORDER BY e.start_time ASC;

-- name: GetAllEvents :many
SELECT * FROM events;
SELECT
e.*,
er.role AS event_role
FROM events e
LEFT JOIN event_roles AS er
ON er.event_id = e.id
AND er.user_id = $1
ORDER BY e.start_time ASC;

-- name: GetEventsWithUserInfo :many
SELECT
e.*,
er.role AS event_role,
a.status AS application_status
FROM events e
LEFT JOIN event_roles er
ON er.event_id = e.id
AND er.user_id = sqlc.narg(user_id)
LEFT JOIN applications a
ON a.event_id = e.id
AND a.user_id = sqlc.narg(user_id)
WHERE (sqlc.arg(include_unpublished)::boolean IS TRUE OR e.is_published = TRUE)
ORDER BY e.start_time ASC;
16 changes: 12 additions & 4 deletions apps/api/internal/db/repository/events.go
Original file line number Diff line number Diff line change
Expand Up @@ -74,13 +74,21 @@ func (r *EventRepository) DeleteEventById(ctx context.Context, id uuid.UUID) err
return err
}

func (r *EventRepository) GetAllEvents(ctx context.Context) (*[]sqlc.Event, error) {
events, err := r.db.Query.GetAllEvents(ctx)
func (r *EventRepository) GetAllEvents(ctx context.Context, userId uuid.UUID) (*[]sqlc.GetAllEventsRow, error) {
events, err := r.db.Query.GetAllEvents(ctx, userId)
return &events, err
}

func (r *EventRepository) GetPublishedEvents(ctx context.Context) (*[]sqlc.Event, error) {
events, err := r.db.Query.GetPublishedEvents(ctx)
func (r *EventRepository) GetPublishedEvents(ctx context.Context, userId uuid.UUID) (*[]sqlc.GetPublishedEventsRow, error) {
events, err := r.db.Query.GetPublishedEvents(ctx, userId)
return &events, err
}

func (r *EventRepository) GetEventsWithRoles(ctx context.Context, userId *uuid.UUID, includeUnpublished bool) (*[]sqlc.GetEventsWithUserInfoRow, error) {
events, err := r.db.Query.GetEventsWithUserInfo(ctx, sqlc.GetEventsWithUserInfoParams{
UserID: userId,
IncludeUnpublished: includeUnpublished,
})
return &events, err
}

Expand Down
159 changes: 148 additions & 11 deletions apps/api/internal/db/sqlc/events.sql.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 3 additions & 2 deletions apps/api/internal/db/sqlc/querier.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions apps/api/internal/ptr/bool.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package ptr

// Takes a boolean and returns a pointer to that boolean
func BoolToPtr(b bool) *bool {
return &b
}
Loading