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 1/4] =?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 e16dd116..683732a7 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 874ce72a..c50fd75e 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 810d1057..b49cae98 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 9c7912ac..7f6ffd78 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 1cb34090..92a03d21 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 2/4] 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 5d18ac11..6f6e9a44 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 67131b9c..9731443b 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 8fdab198..854ee976 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 a19289ee..d19b0062 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 8af148c7..9b7933e1 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 10f7f8c6..00000000 --- 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 ( - - - -