From 1fbfa77b6e685e16accf4c11b11eaf9aa1c7f761 Mon Sep 17 00:00:00 2001 From: Garrett Ladley <92384606+garrettladley@users.noreply.github.com> Date: Tue, 11 Jun 2024 20:38:00 -0400 Subject: [PATCH 1/3] =?UTF-8?q?=F0=9F=93=9D=20feat:=20split=20event=20prev?= =?UTF-8?q?iew=20endpoint=20(#1010)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/entities/events/base/controller.go | 23 ++---- backend/entities/events/base/models.go | 60 --------------- backend/entities/events/base/routes.go | 4 +- backend/entities/events/base/service.go | 47 +++++------- backend/entities/events/base/transactions.go | 75 +------------------ .../entities/events/previews/controller.go | 35 +++++++++ backend/entities/events/previews/models.go | 43 +++++++++++ backend/entities/events/previews/routes.go | 16 ++++ backend/entities/events/previews/service.go | 43 +++++++++++ .../entities/events/previews/transactions.go | 61 +++++++++++++++ backend/entities/events/transactions.go | 11 +++ 11 files changed, 240 insertions(+), 178 deletions(-) delete mode 100644 backend/entities/events/base/models.go create mode 100644 backend/entities/events/previews/controller.go create mode 100644 backend/entities/events/previews/models.go create mode 100644 backend/entities/events/previews/routes.go create mode 100644 backend/entities/events/previews/service.go create mode 100644 backend/entities/events/previews/transactions.go diff --git a/backend/entities/events/base/controller.go b/backend/entities/events/base/controller.go index f144be5b8..76971f52c 100644 --- a/backend/entities/events/base/controller.go +++ b/backend/entities/events/base/controller.go @@ -17,7 +17,7 @@ func NewEventController(eventService EventServiceInterface) *EventController { return &EventController{eventService: eventService} } -// GetAllEvents godoc +// GetEvents godoc // // @Summary Retrieve all events // @Description Retrieves all events @@ -31,7 +31,7 @@ func NewEventController(eventService EventServiceInterface) *EventController { // @Failure 404 {object} error // @Failure 500 {object} error // @Router /events/ [get] -func (e *EventController) GetAllEvents(c *fiber.Ctx) error { +func (e *EventController) GetEvents(c *fiber.Ctx) error { pageInfo, ok := fiberpaginate.FromContext(c) if !ok { return utilities.ErrExpectedPageInfo @@ -42,22 +42,11 @@ func (e *EventController) GetAllEvents(c *fiber.Ctx) error { pageInfo = nil } - start := c.Query("start") - end := c.Query("end") - - if c.QueryBool("preview", false) { - events, err := e.eventService.GetEventsPreview(*pageInfo, start, end) - if err != nil { - return err - } - return c.Status(http.StatusOK).JSON(events) - } else { - events, err := e.eventService.GetEvents(*pageInfo, start, end) - if err != nil { - return err - } - return c.Status(http.StatusOK).JSON(events) + events, err := e.eventService.GetEvents(*pageInfo, c.Query("start"), c.Query("end")) + if err != nil { + return err } + return c.Status(http.StatusOK).JSON(events) } // GetEvent godoc diff --git a/backend/entities/events/base/models.go b/backend/entities/events/base/models.go deleted file mode 100644 index d57e3219a..000000000 --- a/backend/entities/events/base/models.go +++ /dev/null @@ -1,60 +0,0 @@ -package base - -import ( - "time" - - "github.com/GenerateNU/sac/backend/entities/models" - "github.com/google/uuid" -) - -type EventStub struct { - ID uuid.UUID `json:"id"` - - Title string `json:"title"` - - EventType models.EventType `json:"event_type"` - Location string `json:"location"` - Link string `json:"link"` - - StartTime time.Time `json:"start_time"` - EndTime time.Time `json:"end_time"` - - Host uuid.UUID `json:"host"` -} - -func (es *EventStub) Into(tags []models.Tag, hostName string, hostLogo string) *EventPreview { - return &EventPreview{ - ID: es.ID, - Title: es.Title, - EventType: es.EventType, - Location: es.Location, - Link: es.Link, - StartTime: es.StartTime, - EndTime: es.EndTime, - Tags: tags, - HostName: hostName, - HostLogo: hostLogo, - } -} - -func (es EventStub) TableName() string { - return "events" -} - -type EventPreview struct { - ID uuid.UUID `json:"id"` - - Title string `json:"title"` - - EventType models.EventType `json:"event_type"` - Location string `json:"location"` - Link string `json:"link"` - - StartTime time.Time `json:"start_time"` - EndTime time.Time `json:"end_time"` - - Tags []models.Tag `json:"tags"` - - HostName string `json:"host_name"` - HostLogo string `json:"host_logo"` -} diff --git a/backend/entities/events/base/routes.go b/backend/entities/events/base/routes.go index c0be2cb84..874ce72ab 100644 --- a/backend/entities/events/base/routes.go +++ b/backend/entities/events/base/routes.go @@ -1,6 +1,7 @@ package base import ( + "github.com/GenerateNU/sac/backend/entities/events/previews" "github.com/GenerateNU/sac/backend/entities/events/series" "github.com/GenerateNU/sac/backend/entities/events/tags" "github.com/gofiber/fiber/v2" @@ -12,6 +13,7 @@ import ( func EventRoutes(eventParams types.RouteParams) { eventParams.Router = EventRouter(eventParams) + previews.EventPreviews(eventParams) series.EventSeries(eventParams) tags.EventTags(eventParams) } @@ -22,7 +24,7 @@ func EventRouter(eventParams types.RouteParams) fiber.Router { // api/v1/events/* events := eventParams.Router.Group("/events") - events.Get("/", eventParams.UtilityMiddleware.Paginator, eventController.GetAllEvents) + events.Get("/", eventParams.UtilityMiddleware.Paginator, eventController.GetEvents) events.Post( "/", authMiddleware.AttachExtractor(eventParams.AuthMiddleware.ClubAuthorizeById, authMiddleware.ExtractFromParams("clubID")), diff --git a/backend/entities/events/base/service.go b/backend/entities/events/base/service.go index 72c7126f5..41ad3d996 100644 --- a/backend/entities/events/base/service.go +++ b/backend/entities/events/base/service.go @@ -2,11 +2,9 @@ package base import ( "errors" - "time" "github.com/GenerateNU/sac/backend/entities/events" "github.com/GenerateNU/sac/backend/entities/models" - "gorm.io/gorm" "github.com/GenerateNU/sac/backend/types" "github.com/GenerateNU/sac/backend/utilities" @@ -16,7 +14,6 @@ import ( type EventServiceInterface interface { // getters GetEvents(pageInfo fiberpaginate.PageInfo, start string, end string) ([]models.Event, error) - GetEventsPreview(pageInfo fiberpaginate.PageInfo, start string, end string) ([]EventPreview, error) GetEvent(eventID string) (*models.Event, error) // event cud CreateEvent(body events.CreateEventRequestBody) (*models.Event, error) @@ -33,11 +30,25 @@ func NewEventService(serviceParams types.ServiceParams) EventServiceInterface { } func (e *EventService) GetEvents(pageInfo fiberpaginate.PageInfo, start string, end string) ([]models.Event, error) { - return serviceGetEvents(e.DB, pageInfo, start, end, GetEvents, GetEventsByTime) -} + if start == "" || end == "" { + return events.GetEvents(e.DB, pageInfo) + } + + startTime, err := utilities.ParseTime(start, utilities.YYYY_dash_MM_dash_DD) + if err != nil { + return nil, utilities.BadRequest(err) + } + + endTime, err := utilities.ParseTime(end, utilities.YYYY_dash_MM_dash_DD) + if err != nil { + return nil, utilities.BadRequest(err) + } -func (e *EventService) GetEventsPreview(pageInfo fiberpaginate.PageInfo, start string, end string) ([]EventPreview, error) { - return serviceGetEvents(e.DB, pageInfo, start, end, GetEventsPreview, GetEventsPreviewByTime) + if startTime.After(*endTime) { + return nil, utilities.BadRequest(errors.New("start time must be before end time")) + } + + return GetEventsByTime(e.DB, pageInfo, *startTime, *endTime) } func (e *EventService) GetEvent(eventID string) (*models.Event, error) { @@ -83,25 +94,3 @@ func (e *EventService) DeleteEvent(eventID string) error { return DeleteEvent(e.DB, *idAsUUID) } - -func serviceGetEvents[E any](db *gorm.DB, pageInfo fiberpaginate.PageInfo, start string, end string, getEFunc func(*gorm.DB, fiberpaginate.PageInfo) ([]E, error), getEByTimeFunc func(*gorm.DB, fiberpaginate.PageInfo, time.Time, time.Time) ([]E, error)) ([]E, error) { - if start == "" || end == "" { - return getEFunc(db, pageInfo) - } - - startTime, err := utilities.ParseTime(start, utilities.YYYY_dash_MM_dash_DD) - if err != nil { - return nil, utilities.BadRequest(err) - } - - endTime, err := utilities.ParseTime(end, utilities.YYYY_dash_MM_dash_DD) - if err != nil { - return nil, utilities.BadRequest(err) - } - - if startTime.After(*endTime) { - return nil, utilities.BadRequest(errors.New("start time must be before end time")) - } - - return getEByTimeFunc(db, pageInfo, *startTime, *endTime) -} diff --git a/backend/entities/events/base/transactions.go b/backend/entities/events/base/transactions.go index 036bdbe92..4c975bb8f 100644 --- a/backend/entities/events/base/transactions.go +++ b/backend/entities/events/base/transactions.go @@ -6,9 +6,7 @@ import ( "time" "github.com/GenerateNU/sac/backend/constants" - "github.com/GenerateNU/sac/backend/entities/clubs" "github.com/GenerateNU/sac/backend/entities/events" - "github.com/GenerateNU/sac/backend/entities/events/tags" "github.com/GenerateNU/sac/backend/entities/models" "github.com/garrettladley/fiberpaginate" @@ -21,63 +19,17 @@ import ( ) func GetEvents(db *gorm.DB, pageInfo fiberpaginate.PageInfo) ([]models.Event, error) { - return transactionsGetEvents[models.Event](db, &pageInfo, nil, nil) -} - -func GetEventsPreview(db *gorm.DB, pageInfo fiberpaginate.PageInfo) ([]EventPreview, error) { - events, err := transactionsGetEvents[EventStub](db, &pageInfo, nil, nil) - if err != nil { - return nil, err - } - - eventPreviews := make([]EventPreview, len(events)) - for index, event := range events { - tags, err := tags.GetEventTags(db, event.ID) - if err != nil { - return nil, err - } - - eventPreviews[index].Tags = tags - - host, err := clubs.GetClub(db, event.Host) - if err != nil { - return nil, err - } - - eventPreviews[index] = *event.Into(tags, host.Name, host.Logo) - } - - return eventPreviews, nil + return events.GetEvents(db, pageInfo) } func GetEventsByTime(db *gorm.DB, pageInfo fiberpaginate.PageInfo, startTime time.Time, endTime time.Time) ([]models.Event, error) { - return transactionsGetEvents[models.Event](db, &pageInfo, &startTime, &endTime) -} + var events []models.Event -func GetEventsPreviewByTime(db *gorm.DB, pageInfo fiberpaginate.PageInfo, startTime time.Time, endTime time.Time) ([]EventPreview, error) { - events, err := transactionsGetEvents[EventStub](db, &pageInfo, &startTime, &endTime) - if err != nil { + if err := db.Model(&events).Where("start_time >= ? AND end_time <= ?", startTime, endTime).Scopes(utilities.IntoScope(pageInfo, db)).Find(&events).Error; err != nil { return nil, err } - eventPreviews := make([]EventPreview, len(events)) - for index, event := range events { - tags, err := tags.GetEventTags(db, event.ID) - if err != nil { - return nil, err - } - - eventPreviews[index].Tags = tags - - host, err := clubs.GetClub(db, event.Host) - if err != nil { - return nil, err - } - - eventPreviews[index] = *event.Into(tags, host.Name, host.Logo) - } - - return eventPreviews, nil + return events, nil } func CreateEvent(db *gorm.DB, event models.Event) (*models.Event, error) { @@ -155,22 +107,3 @@ func DeleteEvent(db *gorm.DB, id uuid.UUID) error { return nil } - -func transactionsGetEvents[E any](db *gorm.DB, pageInfo *fiberpaginate.PageInfo, startTime *time.Time, endTime *time.Time) ([]E, error) { - var events []E - query := db.Model(&events) - - if startTime != nil && endTime != nil { - query = query.Where("start_time >= ? AND end_time <= ?", *startTime, *endTime) - } - - if pageInfo != nil { - query = query.Scopes(utilities.IntoScope(*pageInfo, db)) - } - - if err := query.Find(&events).Error; err != nil { - return nil, err - } - - return events, nil -} diff --git a/backend/entities/events/previews/controller.go b/backend/entities/events/previews/controller.go new file mode 100644 index 000000000..810d10574 --- /dev/null +++ b/backend/entities/events/previews/controller.go @@ -0,0 +1,35 @@ +package previews + +import ( + "net/http" + + "github.com/GenerateNU/sac/backend/utilities" + "github.com/garrettladley/fiberpaginate" + "github.com/gofiber/fiber/v2" +) + +type EventPreviewController struct { + service Service +} + +func NewEventController(service Service) *EventPreviewController { + return &EventPreviewController{service: service} +} + +func (e *EventPreviewController) GetEventPreviews(c *fiber.Ctx) error { + pageInfo, ok := fiberpaginate.FromContext(c) + if !ok { + return utilities.ErrExpectedPageInfo + } + + usePagination := c.QueryBool("pagination", true) + if !usePagination { + pageInfo = nil + } + + events, err := e.service.GetEventPreviews(pageInfo, c.Query("start"), c.Query("end")) + if err != nil { + return err + } + return c.Status(http.StatusOK).JSON(events) +} diff --git a/backend/entities/events/previews/models.go b/backend/entities/events/previews/models.go new file mode 100644 index 000000000..5d18ac113 --- /dev/null +++ b/backend/entities/events/previews/models.go @@ -0,0 +1,43 @@ +package previews + +import ( + "time" + + "github.com/GenerateNU/sac/backend/entities/models" + "github.com/google/uuid" +) + +type common struct { + ID uuid.UUID `json:"id"` + Title string `json:"title"` + EventType models.EventType `json:"event_type"` + Location string `json:"location"` + Link string `json:"link"` + StartTime time.Time `json:"start_time"` + EndTime time.Time `json:"end_time"` +} + +type EventStub struct { + common + Host uuid.UUID `json:"host"` +} + +func (es *EventStub) Into(tags []models.Tag, hostName string, hostLogo string) *EventPreview { + return &EventPreview{ + common: es.common, + Tags: tags, + HostName: hostName, + HostLogo: hostLogo, + } +} + +func (es EventStub) TableName() string { + return "events" +} + +type EventPreview struct { + common + Tags []models.Tag `json:"tags"` + HostName string `json:"host_name"` + HostLogo string `json:"host_logo"` +} diff --git a/backend/entities/events/previews/routes.go b/backend/entities/events/previews/routes.go new file mode 100644 index 000000000..9c7912ac0 --- /dev/null +++ b/backend/entities/events/previews/routes.go @@ -0,0 +1,16 @@ +package previews + +import ( + "github.com/gofiber/fiber/v2" + + "github.com/GenerateNU/sac/backend/types" +) + +func EventPreviews(eventParams types.RouteParams) { + eventController := NewEventController(NewService(eventParams.ServiceParams)) + + // api/v1/events/previews/ + eventParams.Router.Route("/previews", func(events fiber.Router) { + events.Get("/", eventParams.UtilityMiddleware.Paginator, eventController.GetEventPreviews) + }) +} diff --git a/backend/entities/events/previews/service.go b/backend/entities/events/previews/service.go new file mode 100644 index 000000000..b3eba712b --- /dev/null +++ b/backend/entities/events/previews/service.go @@ -0,0 +1,43 @@ +package previews + +import ( + "errors" + + "github.com/GenerateNU/sac/backend/types" + "github.com/GenerateNU/sac/backend/utilities" + "github.com/garrettladley/fiberpaginate" +) + +type Service interface { + GetEventPreviews(pageInfo *fiberpaginate.PageInfo, start string, end string) ([]EventPreview, error) +} + +type Handler struct { + types.ServiceParams +} + +func NewService(serviceParams types.ServiceParams) Service { + return &Handler{serviceParams} +} + +func (h *Handler) GetEventPreviews(pageInfo *fiberpaginate.PageInfo, start string, end string) ([]EventPreview, error) { + if start == "" || end == "" { + return GetEventPreivews(h.DB, pageInfo) + } + + startTime, err := utilities.ParseTime(start, utilities.YYYY_dash_MM_dash_DD) + if err != nil { + return nil, utilities.BadRequest(err) + } + + endTime, err := utilities.ParseTime(end, utilities.YYYY_dash_MM_dash_DD) + if err != nil { + return nil, utilities.BadRequest(err) + } + + if startTime.After(*endTime) { + return nil, utilities.BadRequest(errors.New("start time must be before end time")) + } + + return GetEventPreviewsByTime(h.DB, pageInfo, startTime, endTime) +} diff --git a/backend/entities/events/previews/transactions.go b/backend/entities/events/previews/transactions.go new file mode 100644 index 000000000..599d34566 --- /dev/null +++ b/backend/entities/events/previews/transactions.go @@ -0,0 +1,61 @@ +package previews + +import ( + "time" + + "github.com/garrettladley/fiberpaginate" + + "github.com/GenerateNU/sac/backend/entities/clubs" + "github.com/GenerateNU/sac/backend/entities/events/tags" + "github.com/GenerateNU/sac/backend/utilities" + + "gorm.io/gorm" +) + +func GetEventPreivews(db *gorm.DB, pageInfo *fiberpaginate.PageInfo) ([]EventPreview, error) { + var events []EventStub + + if err := db.Scopes(utilities.IntoScope(*pageInfo, db)).Find(&events).Error; err != nil { + return nil, err + } + + return processEventStubs(db, events) +} + +func GetEventPreviewsByTime(db *gorm.DB, pageInfo *fiberpaginate.PageInfo, startTime *time.Time, endTime *time.Time) ([]EventPreview, error) { + var events []EventStub + + query := db.Model(&events) + + if startTime != nil && endTime != nil { + query = query.Where("start_time >= ? AND end_time <= ?", *startTime, *endTime) + } + + if pageInfo != nil { + query = query.Scopes(utilities.IntoScope(*pageInfo, db)) + } + + if err := query.Find(&events).Error; err != nil { + return nil, err + } + + return processEventStubs(db, events) +} + +func processEventStubs(db *gorm.DB, events []EventStub) ([]EventPreview, error) { + eventPreviews := make([]EventPreview, len(events)) + for index, event := range events { + eventTags, err := tags.GetEventTags(db, event.ID) + if err != nil { + return nil, err + } + + host, err := clubs.GetClub(db, event.Host) + if err != nil { + return nil, err + } + + eventPreviews[index] = *event.Into(eventTags, host.Name, host.Logo) + } + return eventPreviews, nil +} diff --git a/backend/entities/events/transactions.go b/backend/entities/events/transactions.go index 1a4b3ca7a..9b9daf833 100644 --- a/backend/entities/events/transactions.go +++ b/backend/entities/events/transactions.go @@ -7,10 +7,21 @@ import ( "github.com/GenerateNU/sac/backend/entities/models" "github.com/GenerateNU/sac/backend/transactions" "github.com/GenerateNU/sac/backend/utilities" + "github.com/garrettladley/fiberpaginate" "github.com/google/uuid" "gorm.io/gorm" ) +func GetEvents(db *gorm.DB, pageInfo fiberpaginate.PageInfo) ([]models.Event, error) { + var events []models.Event + + if err := db.Scopes(utilities.IntoScope(pageInfo, db)).Find(&events).Error; err != nil { + return nil, err + } + + return events, nil +} + func GetEvent(db *gorm.DB, eventID uuid.UUID, preloads ...transactions.OptionalQuery) (*models.Event, error) { var event models.Event From 899e24581d497d3be6f0b891b091bb7cdcf88f76 Mon Sep 17 00:00:00 2001 From: Garrett Ladley <92384606+garrettladley@users.noreply.github.com> Date: Tue, 11 Jun 2024 22:01:50 -0400 Subject: [PATCH 2/3] =?UTF-8?q?=E2=98=A2=EF=B8=8F=20bug:=20preview=20routi?= =?UTF-8?q?ng=20fix=20(#1012)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/database/store/storer.go | 3 --- backend/entities/events/base/routes.go | 20 +++++++++---------- .../entities/events/previews/controller.go | 12 +++++------ backend/entities/events/previews/routes.go | 8 ++++---- .../integrations/oauth/soth/sothic/sothic.go | 2 +- 5 files changed, 20 insertions(+), 25 deletions(-) diff --git a/backend/database/store/storer.go b/backend/database/store/storer.go index e16dd116d..683732a7c 100644 --- a/backend/database/store/storer.go +++ b/backend/database/store/storer.go @@ -2,7 +2,6 @@ package store import ( "context" - "log/slog" "time" "github.com/GenerateNU/sac/backend/config" @@ -29,12 +28,10 @@ func NewRedisClient(settings config.RedisSettings) *RedisClient { } func (r *RedisClient) Get(key string) ([]byte, error) { - slog.Info("getting", "key", key) return r.client.Get(context.Background(), key).Bytes() } func (r *RedisClient) Set(key string, val []byte, exp time.Duration) error { - slog.Info("setting", "key", key, "val", string(val), "exp", exp) return r.client.Set(context.Background(), key, val, exp).Err() } diff --git a/backend/entities/events/base/routes.go b/backend/entities/events/base/routes.go index 874ce72ab..c50fd75e7 100644 --- a/backend/entities/events/base/routes.go +++ b/backend/entities/events/base/routes.go @@ -4,39 +4,37 @@ import ( "github.com/GenerateNU/sac/backend/entities/events/previews" "github.com/GenerateNU/sac/backend/entities/events/series" "github.com/GenerateNU/sac/backend/entities/events/tags" - "github.com/gofiber/fiber/v2" authMiddleware "github.com/GenerateNU/sac/backend/middleware/auth" "github.com/GenerateNU/sac/backend/types" ) func EventRoutes(eventParams types.RouteParams) { - eventParams.Router = EventRouter(eventParams) + // api/v1/events/* + events := eventParams.Router.Group("/events") + eventParams.Router = events + // MARK: must be called first to avoid conflict between api/v1/events/preview and api/v1/events/:eventID previews.EventPreviews(eventParams) + EventRouter(eventParams) series.EventSeries(eventParams) tags.EventTags(eventParams) } -func EventRouter(eventParams types.RouteParams) fiber.Router { +func EventRouter(eventParams types.RouteParams) { eventController := NewEventController(NewEventService(eventParams.ServiceParams)) - // api/v1/events/* - events := eventParams.Router.Group("/events") - - events.Get("/", eventParams.UtilityMiddleware.Paginator, eventController.GetEvents) - events.Post( + eventParams.Router.Get("/", eventParams.UtilityMiddleware.Paginator, eventController.GetEvents) + eventParams.Router.Post( "/", authMiddleware.AttachExtractor(eventParams.AuthMiddleware.ClubAuthorizeById, authMiddleware.ExtractFromParams("clubID")), eventController.CreateEvent, ) // api/v1/events/:eventID/* - eventID := events.Group("/:eventID") + eventID := eventParams.Router.Group("/:eventID") eventID.Get("/", eventController.GetEvent) eventID.Patch("/", eventController.UpdateEvent) eventID.Delete("/", eventController.DeleteEvent) - - return events } diff --git a/backend/entities/events/previews/controller.go b/backend/entities/events/previews/controller.go index 810d10574..b49cae98a 100644 --- a/backend/entities/events/previews/controller.go +++ b/backend/entities/events/previews/controller.go @@ -8,15 +8,15 @@ import ( "github.com/gofiber/fiber/v2" ) -type EventPreviewController struct { +type Controller struct { service Service } -func NewEventController(service Service) *EventPreviewController { - return &EventPreviewController{service: service} +func NewController(service Service) *Controller { + return &Controller{service: service} } -func (e *EventPreviewController) GetEventPreviews(c *fiber.Ctx) error { +func (e *Controller) GetEventPreviews(c *fiber.Ctx) error { pageInfo, ok := fiberpaginate.FromContext(c) if !ok { return utilities.ErrExpectedPageInfo @@ -27,9 +27,9 @@ func (e *EventPreviewController) GetEventPreviews(c *fiber.Ctx) error { pageInfo = nil } - events, err := e.service.GetEventPreviews(pageInfo, c.Query("start"), c.Query("end")) + previews, err := e.service.GetEventPreviews(pageInfo, c.Query("start"), c.Query("end")) if err != nil { return err } - return c.Status(http.StatusOK).JSON(events) + return c.Status(http.StatusOK).JSON(previews) } diff --git a/backend/entities/events/previews/routes.go b/backend/entities/events/previews/routes.go index 9c7912ac0..7f6ffd783 100644 --- a/backend/entities/events/previews/routes.go +++ b/backend/entities/events/previews/routes.go @@ -7,10 +7,10 @@ import ( ) func EventPreviews(eventParams types.RouteParams) { - eventController := NewEventController(NewService(eventParams.ServiceParams)) + controller := NewController(NewService(eventParams.ServiceParams)) - // api/v1/events/previews/ - eventParams.Router.Route("/previews", func(events fiber.Router) { - events.Get("/", eventParams.UtilityMiddleware.Paginator, eventController.GetEventPreviews) + // api/v1/events/previews/* + eventParams.Router.Route("/previews", func(r fiber.Router) { + r.Get("/", eventParams.UtilityMiddleware.Paginator, controller.GetEventPreviews) }) } diff --git a/backend/integrations/oauth/soth/sothic/sothic.go b/backend/integrations/oauth/soth/sothic/sothic.go index 1cb340909..92a03d219 100644 --- a/backend/integrations/oauth/soth/sothic/sothic.go +++ b/backend/integrations/oauth/soth/sothic/sothic.go @@ -290,7 +290,7 @@ func SetProvider(c *fiber.Ctx, provider string) { func StoreInSession(key string, value string, c *fiber.Ctx) error { session, err := SessionStore.Get(c) if err != nil { - slog.Info("error getting session", "error", err) + slog.Error("error getting session", "error", err) return err } From 53cc07080dff9f13ca6440c7343ccb1afd670ec1 Mon Sep 17 00:00:00 2001 From: Alder Whiteford Date: Wed, 12 Jun 2024 07:22:45 -0400 Subject: [PATCH 3/3] Integrate event preview (#1013) --- backend/entities/events/previews/models.go | 10 +- frontend/lib/package.json | 2 +- frontend/lib/src/api/eventApi.ts | 16 ++ frontend/lib/src/types/club.ts | 2 +- frontend/lib/src/types/event.ts | 20 +- .../components/Editor/editor.tsx | 207 ------------------ .../(design-system)/components/Editor/font.ts | 80 ------- .../components/Editor/toolbar.tsx | 137 ------------ .../components/Editor/tools.tsx | 163 -------------- frontend/mobile/package.json | 2 +- .../mobile/src/app/(app)/(tabs)/calendar.tsx | 3 +- .../components/Calendar/DayTimeSection.tsx | 15 +- .../Calendar/parser/calendarParser.ts | 110 ++++++---- .../EventCard/Variants/EventCardCalendar.tsx | 10 +- frontend/mobile/src/app/_layout.tsx | 2 +- frontend/mobile/yarn.lock | 8 +- 16 files changed, 130 insertions(+), 657 deletions(-) delete mode 100644 frontend/mobile/app/(design-system)/components/Editor/editor.tsx delete mode 100644 frontend/mobile/app/(design-system)/components/Editor/font.ts delete mode 100644 frontend/mobile/app/(design-system)/components/Editor/toolbar.tsx delete mode 100644 frontend/mobile/app/(design-system)/components/Editor/tools.tsx diff --git a/backend/entities/events/previews/models.go b/backend/entities/events/previews/models.go index 5d18ac113..6f6e9a44d 100644 --- a/backend/entities/events/previews/models.go +++ b/backend/entities/events/previews/models.go @@ -7,9 +7,9 @@ import ( "github.com/google/uuid" ) -type common struct { +type Common struct { ID uuid.UUID `json:"id"` - Title string `json:"title"` + Name string `json:"name"` EventType models.EventType `json:"event_type"` Location string `json:"location"` Link string `json:"link"` @@ -18,13 +18,13 @@ type common struct { } type EventStub struct { - common + Common Host uuid.UUID `json:"host"` } func (es *EventStub) Into(tags []models.Tag, hostName string, hostLogo string) *EventPreview { return &EventPreview{ - common: es.common, + Common: es.Common, Tags: tags, HostName: hostName, HostLogo: hostLogo, @@ -36,7 +36,7 @@ func (es EventStub) TableName() string { } type EventPreview struct { - common + Common Tags []models.Tag `json:"tags"` HostName string `json:"host_name"` HostLogo string `json:"host_logo"` diff --git a/frontend/lib/package.json b/frontend/lib/package.json index 67131b9cc..9731443b6 100644 --- a/frontend/lib/package.json +++ b/frontend/lib/package.json @@ -1,6 +1,6 @@ { "name": "@generatesac/lib", - "version": "0.0.13", + "version": "0.0.164", "type": "module", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/frontend/lib/src/api/eventApi.ts b/frontend/lib/src/api/eventApi.ts index 8fdab1986..854ee9767 100644 --- a/frontend/lib/src/api/eventApi.ts +++ b/frontend/lib/src/api/eventApi.ts @@ -4,7 +4,9 @@ import { Club, clubSchema } from "../types/club"; import { CreateEventRequestBody, Event, + EventPreview, UpdateEventRequestBody, + eventPreviewSchema, eventSchema, } from "../types/event"; import { PaginationQueryParams } from "../types/root"; @@ -25,9 +27,23 @@ export const eventApi = baseApi.injectEndpoints({ ? result.map((event) => ({ type: "Event", id: event.id })) : ["Event"], transformResponse: (response) => { + console.log('here!!!!') return z.array(eventSchema).parse(response); }, }), + eventsPreview: builder.query({ + query: (queryParams) => ({ + url: handleQueryParams(`${EVENT_API_BASE_URL}/previews`, queryParams), + method: "GET", + }), + providesTags: (result) => + result + ? result.map((event) => ({ type: "Event", id: event.id })) + : ["Event"], + transformResponse: (response) => { + return z.array(eventPreviewSchema).parse(response); + }, + }), event: builder.query({ query: (id) => ({ url: `${EVENT_API_BASE_URL}/${id}/`, diff --git a/frontend/lib/src/types/club.ts b/frontend/lib/src/types/club.ts index a19289ee0..d19b0062d 100644 --- a/frontend/lib/src/types/club.ts +++ b/frontend/lib/src/types/club.ts @@ -33,7 +33,7 @@ export const createClubTagsRequestBodySchema = z.object({ const clubSchemaIntermediate = z.object({ name: z.string().max(255), preview: z.string().max(255), - description: z.string().max(255), + description: z.string(), num_members: z.number(), is_recruiting: z.boolean(), application_link: z.string().max(255), diff --git a/frontend/lib/src/types/event.ts b/frontend/lib/src/types/event.ts index 8af148c73..9b7933e15 100644 --- a/frontend/lib/src/types/event.ts +++ b/frontend/lib/src/types/event.ts @@ -1,6 +1,7 @@ import { z } from "zod"; import { rootModelSchema } from "./root"; +import { tagSchema } from "./tag"; /** * TODO: Re-Write After BE Fixes @@ -35,7 +36,7 @@ const updateEventRequestBodySchema = z.object({ const eventSchemaIntermediate = z.object({ name: z.string().max(255), preview: z.string().max(255), - description: z.string().max(255), + description: z.string(), start_time: z.string(), end_time: z.string(), location: z.string().max(255), @@ -48,7 +49,23 @@ const eventSchemaIntermediate = z.object({ host: z.string().uuid(), }); +const eventPreviewSchemaIntermediate = z.object({ + id: z.string().uuid(), + name: z.string().max(255), + event_type: eventTypeEnum, + location: z.string().max(255), + link: z.string().max(255).optional(), + + start_time: z.string(), + end_time: z.string(), + + tags: tagSchema.array(), + host_name: z.string().max(255), + host_logo: z.string().max(255).optional(), +}); + export const eventSchema = eventSchemaIntermediate.merge(rootModelSchema); +export const eventPreviewSchema = eventPreviewSchemaIntermediate // Types: export type CreateEventRequestBody = z.infer< @@ -58,3 +75,4 @@ export type UpdateEventRequestBody = z.infer< typeof updateEventRequestBodySchema >; export type Event = z.infer; +export type EventPreview = z.infer; diff --git a/frontend/mobile/app/(design-system)/components/Editor/editor.tsx b/frontend/mobile/app/(design-system)/components/Editor/editor.tsx deleted file mode 100644 index 10f7f8c64..000000000 --- a/frontend/mobile/app/(design-system)/components/Editor/editor.tsx +++ /dev/null @@ -1,207 +0,0 @@ -import React, { useState } from 'react'; -import { KeyboardAvoidingView, Platform, View } from 'react-native'; -import { StyleSheet } from 'react-native'; -import { Button } from 'react-native'; -import { Dimensions } from 'react-native'; -import { WebView } from 'react-native-webview'; - -import { - CoreBridge, - RichText, - TenTapStartKit, - useEditorBridge, - useEditorContent -} from '@10play/tentap-editor'; - -import { JsonContent, parseJsonToHtml } from '../../../../utils/jsonToHTML'; -import { Inter } from './font'; -import { Toolbar } from './toolbar'; -import { CUSTOM_TOOLBAR } from './tools'; - -const json: JsonContent[] = [ - { - type: 'doc', - content: [ - { - type: 'heading', - attrs: { level: 1 }, - content: [{ type: 'text', text: 'Hello World' }] - }, - { - type: 'heading', - attrs: { level: 2 }, - content: [ - { - type: 'text', - marks: [ - { type: 'bold' }, - { type: 'italic' }, - { type: 'strike' }, - { type: 'underline' } - ], - text: 'This is generate' - } - ] - }, - { - type: 'bulletList', - content: [ - { - type: 'listItem', - content: [ - { - type: 'paragraph', - content: [{ type: 'text', text: 'Task 1' }] - } - ] - }, - { - type: 'listItem', - content: [ - { - type: 'paragraph', - content: [{ type: 'text', text: 'Task 2' }] - } - ] - } - ] - }, - { type: 'paragraph' }, - { - type: 'orderedList', - attrs: { start: 1 }, - content: [ - { - type: 'listItem', - content: [ - { - type: 'paragraph', - content: [{ type: 'text', text: 'Task 3' }] - } - ] - }, - { - type: 'listItem', - content: [ - { - type: 'paragraph', - content: [{ type: 'text', text: 'Task 4' }] - } - ] - } - ] - }, - { - type: 'paragraph', - content: [ - { - type: 'text', - marks: [ - { - type: 'link', - attrs: { - href: 'https://generatenu.com', - target: '_blank', - rel: 'noopener noreferrer nofollow', - class: null - } - } - ], - text: 'link' - } - ] - } - ] - } -]; -const initialContent = parseJsonToHtml(json); - -const windowHeight = Dimensions.get('window').height; -const customFont = `${Inter} - * { - font-family: 'Inter'; - }`; - -const offset = () => { - return windowHeight > 700 ? 60 : 40; -}; - -export const Editor = () => { - const editor = useEditorBridge({ - autofocus: true, - avoidIosKeyboard: true, - initialContent: initialContent, - bridgeExtensions: [ - ...TenTapStartKit, - CoreBridge.configureCSS(customFont) - ] - }); - - const jsonOutput = useEditorContent(editor, { type: 'json' }); - const [editable, setEditable] = useState(true); - const htmlOutput = useEditorContent(editor, { type: 'html' }); - - return ( - - - -